mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-29 21:58:20 +00:00
auth: initial implementation + some filesystem checks
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <kernel/timekeeper.h>
|
||||
#include <kernel/pmm.h>
|
||||
#include <kernel/vmmcache.h>
|
||||
#include <kernel/auth.h>
|
||||
|
||||
static devnode_t *devfsroot;
|
||||
|
||||
@@ -188,9 +189,8 @@ int devfs_munmap(vnode_t *node, void *addr, uintmax_t offset, int flags, cred_t
|
||||
return devnode->devops->munmap(devnode->attr.rdevminor, addr, offset, flags);
|
||||
}
|
||||
|
||||
int devfs_access(vnode_t *node, mode_t mode, cred_t *cred) {
|
||||
// TODO permission checks
|
||||
return 0;
|
||||
int devfs_access(vnode_t *vnode, mode_t mode, cred_t *cred) {
|
||||
return auth_filesystem_check(cred, auth_filesystem_convertaccess(mode), vnode) ? EACCES : 0;
|
||||
}
|
||||
|
||||
int devfs_isatty(vnode_t *node) {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <util.h>
|
||||
#include <kernel/vmmcache.h>
|
||||
#include <kernel/pipefs.h>
|
||||
#include <kernel/auth.h>
|
||||
|
||||
#define INODE_ROOT 2
|
||||
|
||||
@@ -1246,8 +1247,7 @@ static int ext2_getdents(vnode_t *vnode, dent_t *buffer, size_t count, uintmax_t
|
||||
}
|
||||
|
||||
static int ext2_access(vnode_t *vnode, mode_t mode, cred_t *cred) {
|
||||
// TODO permission checks
|
||||
return 0;
|
||||
return auth_filesystem_check(cred, auth_filesystem_convertaccess(mode), vnode) ? EACCES : 0;
|
||||
}
|
||||
|
||||
static int ext2_readlink(vnode_t *vnode, char **link, cred_t *cred) {
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <string.h>
|
||||
#include <kernel/vmmcache.h>
|
||||
#include <kernel/pipefs.h>
|
||||
#include <kernel/auth.h>
|
||||
|
||||
static scache_t *nodecache;
|
||||
static tmpfsnode_t *newnode(vfs_t *vfs, int type);
|
||||
@@ -234,9 +235,8 @@ static int tmpfs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offse
|
||||
__assert(!"tmpfs_read is handled by the page cache");
|
||||
}
|
||||
|
||||
static int tmpfs_access(vnode_t *node, mode_t mode, cred_t *cred) {
|
||||
// TODO permission checks
|
||||
return 0;
|
||||
static int tmpfs_access(vnode_t *vnode, mode_t mode, cred_t *cred) {
|
||||
return auth_filesystem_check(cred, auth_filesystem_convertaccess(mode), vnode) ? EACCES : 0;
|
||||
}
|
||||
|
||||
static int tmpfs_unlink(vnode_t *node, char *name, cred_t *cred) {
|
||||
|
||||
+7
-6
@@ -10,6 +10,7 @@
|
||||
#include <kernel/vmmcache.h>
|
||||
#include <kernel/block.h>
|
||||
#include <kernel/pipefs.h>
|
||||
#include <kernel/auth.h>
|
||||
|
||||
#define PATHNAME_MAX 512
|
||||
#define MAXLINKDEPTH 64
|
||||
@@ -20,14 +21,9 @@ vnode_t *vfsroot;
|
||||
static spinlock_t listlock;
|
||||
static vfs_t *vfslist;
|
||||
|
||||
static cred_t kernelcred = {
|
||||
.gid = 0,
|
||||
.uid = 0
|
||||
};
|
||||
|
||||
static cred_t *getcred() {
|
||||
if (_cpu()->thread == NULL || _cpu()->thread->proc == NULL)
|
||||
return &kernelcred;
|
||||
return NULL;
|
||||
else
|
||||
return &_cpu()->thread->proc->cred;
|
||||
}
|
||||
@@ -111,6 +107,10 @@ int vfs_open(vnode_t *ref, char *path, int flags, vnode_t **res) {
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = VOP_ACCESS(tmp, ((flags & V_FFLAGS_READ) ? V_ACCESS_READ : 0) | ((flags & V_FFLAGS_WRITE) ? V_ACCESS_WRITE : 0), getcred());
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = VOP_OPEN(&tmp, flags, getcred());
|
||||
if (err) {
|
||||
VOP_RELEASE(tmp);
|
||||
@@ -189,6 +189,7 @@ int vfs_write(vnode_t *node, void *buffer, size_t size, uintmax_t offset, size_t
|
||||
}
|
||||
|
||||
MUTEX_ACQUIRE(&node->sizelock, false);
|
||||
|
||||
vattr_t attr;
|
||||
err = VOP_GETATTR(node, &attr, getcred());
|
||||
if (err)
|
||||
|
||||
Reference in New Issue
Block a user