From 36943ffdcc8b26901d0daff88f490608ee34d4c8 Mon Sep 17 00:00:00 2001 From: didg Date: Thu, 2 Jun 2005 12:32:17 +0000 Subject: [PATCH] add a default permission to volume options, from Exanet; slightly modified. --- config/AppleVolumes.default.tmpl | 1 + etc/afpd/directory.c | 12 ++++++------ etc/afpd/filedir.c | 4 ++-- etc/afpd/unix.c | 14 ++++++++++---- etc/afpd/unix.h | 6 +++--- etc/afpd/volume.c | 13 ++++++++++--- etc/afpd/volume.h | 3 ++- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/config/AppleVolumes.default.tmpl b/config/AppleVolumes.default.tmpl index 6c073045..11aad114 100644 --- a/config/AppleVolumes.default.tmpl +++ b/config/AppleVolumes.default.tmpl @@ -90,6 +90,7 @@ # volume being mounted. # nostat -> don't stat volume path when enumerating volumes list # upriv -> use unix privilege. +# perm -> default permission value OR with the client requested perm # # # dbpath:path -> store the database stuff in the following path. diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 3211c4b3..2eccf90c 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1,5 +1,5 @@ /* - * $Id: directory.c,v 1.80 2005-05-14 12:54:50 didg Exp $ + * $Id: directory.c,v 1.81 2005-06-02 12:32:17 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -1961,7 +1961,7 @@ int setdirparams(const struct vol *vol, u_int16_t bitmap = d_bitmap; u_char finder_buf[32]; u_int32_t upriv; - mode_t mpriv; /* uninitialized, OK 310105 */ + mode_t mpriv = 0; u_int16_t upriv_bit = 0; bit = 0; @@ -2015,7 +2015,7 @@ int setdirparams(const struct vol *vol, ma.ma_world = *buf++; ma.ma_group = *buf++; ma.ma_owner = *buf++; - mpriv = mtoumode( &ma ); + mpriv = mtoumode( &ma ) | vol->v_perm; if (dir_rx_set(mpriv) && setdirmode( vol, upath, mpriv) < 0 ) { err = set_dir_errors(path, "setdirmode", errno); bitmap = 0; @@ -2043,12 +2043,12 @@ int setdirparams(const struct vol *vol, change_parent_mdate = 1; memcpy( &upriv, buf, sizeof( upriv )); buf += sizeof( upriv ); - upriv = ntohl (upriv); + upriv = ntohl (upriv) | vol->v_perm; if (dir_rx_set(upriv)) { /* maybe we are trying to set perms back */ if ( setdirunixmode(vol, upath, upriv) < 0 ) { bitmap = 0; - err = set_dir_errors(path, "setdirmode", errno); + err = set_dir_errors(path, "setdirunixmode", errno); } } else { @@ -2219,7 +2219,7 @@ int setdirparams(const struct vol *vol, } if ( upriv_bit && setdirunixmode(vol, upath, upriv) < 0 ) { - err = set_dir_errors(path, "setdirmode", errno); + err = set_dir_errors(path, "setdirunixmode", errno); goto setdirparam_done; } break; diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 98e3f2cb..8e03cbcc 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -1,5 +1,5 @@ /* - * $Id: filedir.c,v 1.49 2005-05-14 12:54:53 didg Exp $ + * $Id: filedir.c,v 1.50 2005-06-02 12:32:17 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -751,7 +751,7 @@ int ibuflen _U_, *rbuflen; #endif /* DROPKLUDGE */ /* if unix priv don't try to match perm with dest folder */ if (!isdir && !vol_unix_priv(vol)) { - int admode = ad_mode("", 0777); + int admode = ad_mode("", 0777) | vol->v_perm; setfilmode(upath, admode, NULL); vol->vfs->rf_setfilmode(vol, upath, admode, NULL); diff --git a/etc/afpd/unix.c b/etc/afpd/unix.c index 8f2b4cd4..03be7703 100644 --- a/etc/afpd/unix.c +++ b/etc/afpd/unix.c @@ -1,5 +1,5 @@ /* - * $Id: unix.c,v 1.47 2005-05-25 18:19:33 didg Exp $ + * $Id: unix.c,v 1.48 2005-06-02 12:32:18 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -403,6 +403,8 @@ mode_t mode; return -1; } + mode |= vol->v_perm; + if (setfilmode( path->u_name, mode, &path->st) < 0) return -1; /* we need to set write perm if read set for resource fork */ @@ -435,10 +437,11 @@ mode_t mask = S_IRWXU | S_IRWXG | S_IRWXO; /* rwx for owner group and other, by int setdirunixmode( vol, name, mode ) const struct vol *vol; const char *name; -const mode_t mode; +mode_t mode; { int dropbox = (vol->v_flags & AFPVOL_DROPBOX); + mode |= vol->v_perm; if (dir_rx_set(mode)) { /* extending right? dir first then .AppleDouble in rf_setdirmode */ @@ -459,15 +462,18 @@ const mode_t mode; int setdirmode( vol, name, mode ) const struct vol *vol; const char *name; -const mode_t mode; +mode_t mode; { struct stat st; struct dirent *dirp; DIR *dir; + mode_t hf_mode; int osx = vol->v_adouble == AD_VERSION2_OSX; - mode_t hf_mode = ad_hf_mode(mode); int dropbox = (vol->v_flags & AFPVOL_DROPBOX); + mode |= vol->v_perm; + hf_mode = ad_hf_mode(mode); + if (dir_rx_set(mode)) { /* extending right? dir first */ if ( stickydirmode(name, DIRBITS | mode, dropbox) < 0 ) diff --git a/etc/afpd/unix.h b/etc/afpd/unix.h index 63e19e80..d2e0a6fe 100644 --- a/etc/afpd/unix.h +++ b/etc/afpd/unix.h @@ -1,5 +1,5 @@ /* - * $Id: unix.h,v 1.19 2005-06-01 13:03:29 didg Exp $ + * $Id: unix.h,v 1.20 2005-06-02 12:32:18 didg Exp $ */ #ifndef AFPD_UNIX_H @@ -217,8 +217,8 @@ extern struct afp_options default_options; extern int gmem __P((const gid_t)); extern int setdeskmode __P((const mode_t)); -extern int setdirunixmode __P((const struct vol *, const char *, const mode_t)); -extern int setdirmode __P((const struct vol *, const char *, const mode_t)); +extern int setdirunixmode __P((const struct vol *, const char *, mode_t)); +extern int setdirmode __P((const struct vol *, const char *, mode_t)); extern int setdeskowner __P((const uid_t, const gid_t)); extern int setdirowner __P((const struct vol *, const char *, const uid_t, const gid_t)); extern int setfilmode __P((const char *, mode_t , struct stat *)); diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 61238c77..bb12ff19 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -1,5 +1,5 @@ /* - * $Id: volume.c,v 1.61 2005-05-25 18:30:50 didg Exp $ + * $Id: volume.c,v 1.62 2005-06-02 12:32:18 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -116,11 +116,13 @@ m=u -> map both ways #define VOLOPT_FORCEUID 19 /* force uid for username x */ #define VOLOPT_FORCEGID 20 /* force gid for group x */ #define VOLOPT_UMASK 21 +#define VOLOPT_DFLTPERM 22 #else #define VOLOPT_UMASK 19 +#define VOLOPT_DFLTPERM 20 #endif /* FORCE_UIDGID */ -#define VOLOPT_MAX (VOLOPT_UMASK +1) +#define VOLOPT_MAX (VOLOPT_DFLTPERM +1) #define VOLOPT_NUM (VOLOPT_MAX + 1) @@ -489,7 +491,9 @@ static void volset(struct vol_option *options, struct vol_option *save, setoption(options, save, VOLOPT_DBPATH, val); } else if (optionok(tmp, "umask:", val)) { - options[VOLOPT_UMASK].i_value = (int)strtol(val +1, (char **)NULL, 8); + options[VOLOPT_UMASK].i_value = (int)strtol(val +1, NULL, 8); + } else if (optionok(tmp, "perm:", val)) { + options[VOLOPT_DFLTPERM].i_value = (int)strtol(val+1, NULL, 8); } else if (optionok(tmp, "mapchars:",val)) { setoption(options, save, VOLOPT_MAPCHARS, val); @@ -642,6 +646,9 @@ static int creatvol(AFPObj *obj, struct passwd *pwd, if (options[VOLOPT_UMASK].i_value) volume->v_umask = (mode_t)options[VOLOPT_UMASK].i_value; + if (options[VOLOPT_DFLTPERM].i_value) + volume->v_perm = (mode_t)options[VOLOPT_DFLTPERM].i_value; + if (options[VOLOPT_ADOUBLE].i_value) volume->v_adouble = options[VOLOPT_ADOUBLE].i_value; else diff --git a/etc/afpd/volume.h b/etc/afpd/volume.h index ecca0b8e..1d0d742f 100644 --- a/etc/afpd/volume.h +++ b/etc/afpd/volume.h @@ -1,5 +1,5 @@ /* - * $Id: volume.h,v 1.22 2005-04-30 21:33:41 didg Exp $ + * $Id: volume.h,v 1.23 2005-06-02 12:32:18 didg Exp $ * * Copyright (c) 1990,1994 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -52,6 +52,7 @@ struct vol { struct _cnid_db *v_cdb; char v_stamp[ADEDLEN_PRIVSYN]; mode_t v_umask; + mode_t v_perm; /* default permission value OR with requested perm*/ #ifdef FORCE_UIDGID char *v_forceuid; -- 2.39.2