Implemented an option to designate a user mapping file

N2009_11_14_FIXES
jpandre 2008-01-15 17:41:46 +00:00
parent d5fc330628
commit 31d414ca1d
3 changed files with 60 additions and 23 deletions

View File

@ -4,6 +4,7 @@
*
* Copyright (c) 2004 Anton Altaparmakov
* Copyright (c) 2005-2006 Szabolcs Szakacsits
* Copyright (c) 2007-2008 Jean-Pierre Andre
*
* This program/include file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
@ -150,7 +151,7 @@ extern int ntfs_sd_add_everyone(ntfs_inode *ni);
extern le32 ntfs_security_hash(const SECURITY_DESCRIPTOR_RELATIVE *sd,
const u32 len);
int ntfs_build_mapping(struct SECURITY_CONTEXT *scx);
int ntfs_build_mapping(struct SECURITY_CONTEXT *scx, const char *usermap_path);
int ntfs_get_owner_mode(struct SECURITY_CONTEXT *scx,
const char *path, ntfs_inode *ni, struct stat*);
int ntfs_set_mode(struct SECURITY_CONTEXT *scx,

View File

@ -4,7 +4,7 @@
* Copyright (c) 2004 Anton Altaparmakov
* Copyright (c) 2005-2006 Szabolcs Szakacsits
* Copyright (c) 2006 Yura Pakhuchiy
* Copyright (c) 2007 Jean-Pierre Andre
* Copyright (c) 2007-2008 Jean-Pierre Andre
*
* This program/include file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
@ -30,7 +30,7 @@
#define FORCE_FORMAT_v1x 0 /* Insert security data as in NTFS v1.x */
#define OWNERFROMACL 1 /* Get the owner from ACL (not Windows owner) */
#define BUFSZ 1024 /* buffer size to read mapping file */
#define MAPPINGFILE "/NTFS-3G/UserMapping" /* name of mapping file */
#define MAPPINGFILE "NTFS-3G/UserMapping" /* default mapping file */
#define LINESZ 120 /* maximum useful size of a mapping line */
#define CACHE_PERMISSIONS_BITS 6 /* log2 of unitary allocation of permissions */
#define CACHE_PERMISSIONS_SIZE 262144 /* max cacheable permissions */
@ -200,7 +200,6 @@ struct MAPLIST {
static ntfschar sii_stream[] = { '$', 'S', 'I', 'I', 0 };
static ntfschar sdh_stream[] = { '$', 'S', 'D', 'H', 0 };
static const char mapping_name[] = MAPPINGFILE;
/*
* The zero GUID.
@ -3059,6 +3058,7 @@ int ntfs_get_owner_mode(struct SECURITY_CONTEXT *scx,
le32 ntfs_alloc_securid(struct SECURITY_CONTEXT *scx,
uid_t uid, gid_t gid, mode_t mode, BOOL isdir)
{
#if !FORCE_FORMAT_v1x
const struct CACHED_SECURID *cached;
struct CACHED_SECURID wanted;
char *newattr;
@ -3066,6 +3066,7 @@ le32 ntfs_alloc_securid(struct SECURITY_CONTEXT *scx,
const SID *usid;
const SID *gsid;
le32 securid;
#endif
securid = cpu_to_le32(0);
@ -3794,7 +3795,7 @@ le32 ntfs_inherited_id(struct SECURITY_CONTEXT *scx,
*/
static struct MAPLIST *getmappingitem(
ntfs_inode *ni, off_t *poffs, char *buf,
ntfs_inode *ni, int fd, off_t *poffs, char *buf,
int *psrc, s64 *psize)
{
int src;
@ -3820,9 +3821,12 @@ static struct MAPLIST *getmappingitem(
}
if (buf[src] != '\n') {
*poffs += *psize;
*psize = ntfs_local_read(ni,
AT_UNNAMED, 0,
buf, (size_t)BUFSZ, *poffs);
if (ni)
*psize = ntfs_local_read(ni,
AT_UNNAMED, 0,
buf, (size_t)BUFSZ, *poffs);
else
*psize = read(fd, buf, (size_t)BUFSZ);
src = 0;
} else {
gotend = 1;
@ -3866,17 +3870,24 @@ static struct MAPLIST *getmappingitem(
* are converted to uid.
* Returns the head of list, if any
*
* Basic IO routines are called since we are still mounting
* and we have not entered the fuse loop yet.
* If an absolute path is provided, the mapping file is assumed
* to be located in another mounted file system, and plain read()
* are used to get its contents.
* If a relative path is provided, the mapping file is assumed
* to be located on the current file system, and internal IO
* have to be used since we are still mounting and we have not
* entered the fuse loop yet.
*/
static struct MAPLIST *readmapping(struct SECURITY_CONTEXT *scx)
static struct MAPLIST *readmapping(struct SECURITY_CONTEXT *scx,
const char *usermap_path)
{
char buf[BUFSZ];
struct MAPLIST *item;
struct MAPLIST *firstitem;
struct MAPLIST *lastitem;
ntfs_inode *ni;
int fd;
int src;
off_t offs;
s64 size;
@ -3884,15 +3895,24 @@ static struct MAPLIST *readmapping(struct SECURITY_CONTEXT *scx)
firstitem = (struct MAPLIST*)NULL;
lastitem = (struct MAPLIST*)NULL;
offs = 0;
ni = ntfs_pathname_to_inode(scx->vol, NULL, mapping_name);
if (ni) {
size = ntfs_local_read(ni, AT_UNNAMED, 0,
ni = (ntfs_inode*)NULL;
fd = 0;
if (!usermap_path) usermap_path = MAPPINGFILE;
if (usermap_path[0] == '/')
fd = open(usermap_path,O_RDONLY);
else
ni = ntfs_pathname_to_inode(scx->vol, NULL, usermap_path);
if (ni || (fd > 0)) {
if (ni)
size = ntfs_local_read(ni, AT_UNNAMED, 0,
buf, (size_t)BUFSZ, offs);
else
size = read(fd, buf, (size_t)BUFSZ);
if (size > 0) {
src = 0;
do {
item = getmappingitem(ni,&offs,
buf,&src,&size);
item = getmappingitem(ni, fd, &offs,
buf, &src, &size);
if (item) {
item->next = (struct MAPLIST*)NULL;
if (lastitem)
@ -3903,7 +3923,8 @@ static struct MAPLIST *readmapping(struct SECURITY_CONTEXT *scx)
}
} while (item);
}
ntfs_inode_close(ni);
if (ni) ntfs_inode_close(ni);
else close(fd);
}
return (firstitem);
}
@ -4256,7 +4277,7 @@ static int ntfs_default_mapping(struct SECURITY_CONTEXT *scx)
/*
* Build the user mapping
* - according to $Mapping file if present,
* - according to a mapping file if defined (or default present),
* - or try default single user mapping if possible
*
* The mapping is specific to a mounted device
@ -4266,7 +4287,7 @@ static int ntfs_default_mapping(struct SECURITY_CONTEXT *scx)
* (failure should not be interpreted as an error)
*/
int ntfs_build_mapping(struct SECURITY_CONTEXT *scx)
int ntfs_build_mapping(struct SECURITY_CONTEXT *scx, const char *usermap_path)
{
struct MAPLIST *item;
struct MAPLIST *firstitem;
@ -4276,7 +4297,7 @@ int ntfs_build_mapping(struct SECURITY_CONTEXT *scx)
/* be sure not to map anything until done */
scx->usermapping = (struct MAPPING*)NULL;
scx->groupmapping = (struct MAPPING*)NULL;
firstitem = readmapping(scx);
firstitem = readmapping(scx, usermap_path);
if (firstitem) {
usermapping = ntfs_do_user_mapping(firstitem);
groupmapping = ntfs_do_group_mapping(firstitem);
@ -4885,7 +4906,7 @@ struct SECURITY_API *ntfs_initialize_file_security(const char *device,
scx->gid = getgid();
scx->pseccache = &scapi->seccache;
scx->vol->secure_flags = 0;
if (ntfs_build_mapping(scx)
if (ntfs_build_mapping(scx,(const char*)NULL)
|| ntfs_open_secure(vol)) {
free(scapi);
scapi = (struct SECURITY_API*)NULL;

View File

@ -4,7 +4,7 @@
* Copyright (c) 2005-2006 Yura Pakhuchiy
* Copyright (c) 2005 Yuval Fledel
* Copyright (c) 2006-2007 Szabolcs Szakacsits
* Copyright (c) 2007 Jean-Pierre Andre
* Copyright (c) 2007-2008 Jean-Pierre Andre
*
* This file is originated from the Linux-NTFS project.
*
@ -131,6 +131,7 @@ typedef struct {
struct fuse_chan *fc;
BOOL inherit;
BOOL addsecurids;
char *usermap_path;
struct PERMISSIONS_CACHE *seccache;
struct SECURITY_CONTEXT security;
} ntfs_fuse_context_t;
@ -2168,6 +2169,18 @@ static char *parse_mount_options(const char *orig_opts)
* with an individual security attribute
*/
ctx->addsecurids = TRUE;
} else if (!strcmp(opt, "usermapping")) {
if (!val) {
ntfs_log_error("'usermapping' option should have "
"a value.\n");
goto err_exit;
}
ctx->usermap_path = strdup(val);
if (!ctx->usermap_path) {
ntfs_log_error("no more memory to store "
"'usermapping' option.\n");
goto err_exit;
}
} else { /* Probably FUSE option. */
strcat(ret, opt);
if (val) {
@ -2644,10 +2657,12 @@ int main(int argc, char *argv[])
/* JPA open $Secure and build user mapping (right place ?) */
if (ntfs_open_secure(ctx->vol))
ntfs_log_info("Could not open file $Secure\n");
if (!ntfs_build_mapping(&ctx->security))
if (!ntfs_build_mapping(&ctx->security,ctx->usermap_path))
ntfs_log_info("User mapping built\n");
else
ntfs_log_info("Failed to build user mapping\n");
if (ctx->usermap_path)
free (ctx->usermap_path);
fuse_loop(fh);