From: Frank Lahm Date: Mon, 30 Apr 2012 06:39:51 +0000 (+0200) Subject: Fixes for moved .AppleDesktop dir X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=commitdiff_plain;h=c5dd04aaa5761ec04fc89e73b27c608c90ec14f0 Fixes for moved .AppleDesktop dir --- diff --git a/etc/afpd/desktop.c b/etc/afpd/desktop.c index 873cc0b1..c437b7e6 100644 --- a/etc/afpd/desktop.c +++ b/etc/afpd/desktop.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "volume.h" #include "directory.h" @@ -38,6 +39,158 @@ #include "desktop.h" #include "mangle.h" +#define EXEC_MODE (S_IXGRP | S_IXUSR | S_IXOTH) + +int setdeskmode(const struct vol *vol, const mode_t mode) +{ + EC_INIT; + char wd[ MAXPATHLEN + 1]; + struct stat st; + char modbuf[ 12 + 1], *m; + struct dirent *deskp, *subp; + DIR *desk, *sub; + + if (!dir_rx_set(mode)) { + /* want to remove read and search access to owner it will screw the volume */ + return -1 ; + } + if ( getcwd( wd , MAXPATHLEN) == NULL ) { + return( -1 ); + } + + bstring dtpath = bfromcstr(vol->v_dbpath); + bcatcstr(dtpath, "/" APPLEDESKTOP); + + EC_NEG1( chdir(bdata(dtpath)) ); + + if (( desk = opendir( "." )) == NULL ) { + if ( chdir( wd ) < 0 ) { + LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) ); + } + EC_FAIL; + } + for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) { + if ( strcmp( deskp->d_name, "." ) == 0 || + strcmp( deskp->d_name, ".." ) == 0 || strlen( deskp->d_name ) > 2 ) { + continue; + } + strcpy( modbuf, deskp->d_name ); + strcat( modbuf, "/" ); + m = strchr( modbuf, '\0' ); + if (( sub = opendir( deskp->d_name )) == NULL ) { + continue; + } + for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) { + if ( strcmp( subp->d_name, "." ) == 0 || + strcmp( subp->d_name, ".." ) == 0 ) { + continue; + } + *m = '\0'; + strcat( modbuf, subp->d_name ); + /* XXX: need to preserve special modes */ + if (lstat(modbuf, &st) < 0) { + LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",fullpathname(modbuf), strerror(errno) ); + continue; + } + + if (S_ISDIR(st.st_mode)) { + if ( chmod_acl( modbuf, (DIRBITS | mode)) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) ); + } + } else if ( chmod_acl( modbuf, mode & ~EXEC_MODE ) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) ); + } + + } + closedir( sub ); + /* XXX: need to preserve special modes */ + if ( chmod_acl( deskp->d_name, (DIRBITS | mode)) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(deskp->d_name), strerror(errno) ); + } + } + closedir( desk ); + if ( chdir( wd ) < 0 ) { + LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) ); + EC_FAIL; + } + /* XXX: need to preserve special modes */ + if ( chmod_acl(bdata(dtpath), (DIRBITS | mode)) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s", bdata(dtpath), strerror(errno)); + } + +EC_CLEANUP: + bdestroy(dtpath); + EC_EXIT; +} + +int setdeskowner(const struct vol *vol, uid_t uid, gid_t gid) +{ + EC_INIT; + char wd[ MAXPATHLEN + 1]; + char modbuf[12 + 1], *m; + struct dirent *deskp, *subp; + DIR *desk, *sub; + + if ( getcwd( wd, MAXPATHLEN ) == NULL ) { + return( -1 ); + } + + bstring dtpath = bfromcstr(vol->v_dbpath); + bcatcstr(dtpath, "/" APPLEDESKTOP); + + EC_NEG1( chdir(bdata(dtpath)) ); + + if (( desk = opendir( "." )) == NULL ) { + if ( chdir( wd ) < 0 ) { + LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) ); + } + EC_FAIL; + } + for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) { + if ( strcmp( deskp->d_name, "." ) == 0 || + strcmp( deskp->d_name, ".." ) == 0 || + strlen( deskp->d_name ) > 2 ) { + continue; + } + strcpy( modbuf, deskp->d_name ); + strcat( modbuf, "/" ); + m = strchr( modbuf, '\0' ); + if (( sub = opendir( deskp->d_name )) == NULL ) { + continue; + } + for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) { + if ( strcmp( subp->d_name, "." ) == 0 || + strcmp( subp->d_name, ".." ) == 0 ) { + continue; + } + *m = '\0'; + strcat( modbuf, subp->d_name ); + /* XXX: add special any uid, ignore group bits */ + if ( chown( modbuf, uid, gid ) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskown: chown %s: %s", fullpathname(modbuf), strerror(errno) ); + } + } + closedir( sub ); + /* XXX: add special any uid, ignore group bits */ + if ( chown( deskp->d_name, uid, gid ) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", + deskp->d_name, strerror(errno) ); + } + } + closedir( desk ); + if ( chdir( wd ) < 0 ) { + LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) ); + EC_FAIL; + } + if (chown(bdata(dtpath), uid, gid ) < 0 && errno != EPERM ) { + LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", fullpathname(".AppleDouble"), strerror(errno) ); + } + +EC_CLEANUP: + bdestroy(dtpath); + EC_EXIT; +} + static void create_appledesktop_folder(const struct vol * vol) { bstring olddtpath = NULL, dtpath = NULL; diff --git a/etc/afpd/desktop.h b/etc/afpd/desktop.h index aa6a4b0f..5f824243 100644 --- a/etc/afpd/desktop.h +++ b/etc/afpd/desktop.h @@ -43,6 +43,9 @@ extern char *dtfile (const struct vol *, u_char [], char *); extern char *mtoupath (const struct vol *, char *, cnid_t, int utf8); extern char *utompath (const struct vol *, char *, cnid_t, int utf8); +extern int setdeskmode(const struct vol *vol, const mode_t mode); +extern int setdeskowner(const struct vol *vol, uid_t uid, gid_t gid); + /* FP functions */ int afp_opendt (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen); int afp_addcomment (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen); diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 0c7f6272..7539d3ba 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1902,7 +1902,7 @@ int setdirparams(struct vol *vol, struct path *path, uint16_t d_bitmap, char *bu break; case DIRPBIT_UID : /* What kind of loser mounts as root? */ if ( (dir->d_did == DIRDID_ROOT) && - (setdeskowner( ntohl(owner), -1 ) < 0)) { + (setdeskowner(vol, ntohl(owner), -1 ) < 0)) { err = set_dir_errors(path, "setdeskowner", errno); if (isad && err == AFPERR_PARAM) { err = AFP_OK; /* ???*/ @@ -1918,7 +1918,7 @@ int setdirparams(struct vol *vol, struct path *path, uint16_t d_bitmap, char *bu break; case DIRPBIT_GID : if (dir->d_did == DIRDID_ROOT) - setdeskowner( -1, ntohl(group) ); + setdeskowner(vol, -1, ntohl(group) ); if ( setdirowner(vol, upath, -1, ntohl(group) ) < 0 ) { err = set_dir_errors(path, "setdirowner", errno); goto setdirparam_done; @@ -1982,7 +1982,7 @@ setdirparam_done: if (err == AFP_OK) { if (set_maccess == true) { if (dir->d_did == DIRDID_ROOT) { - setdeskmode(mpriv); + setdeskmode(vol, mpriv); if (!dir_rx_set(mpriv)) { /* we can't remove read and search for owner on volume root */ err = AFPERR_ACCESS; @@ -2002,8 +2002,8 @@ setdirparam_done: err = AFPERR_ACCESS; goto setprivdone; } - setdeskowner(-1, ntohl(group)); - setdeskmode(upriv); + setdeskowner(vol, -1, ntohl(group)); + setdeskmode(vol, upriv); } if (setdirowner(vol, upath, -1, ntohl(group)) < 0) { diff --git a/etc/afpd/unix.c b/etc/afpd/unix.c index 397b99fb..16562f3b 100644 --- a/etc/afpd/unix.c +++ b/etc/afpd/unix.c @@ -203,83 +203,6 @@ mode_t mtoumode(struct maccess *ma) return( mode ); } -#define EXEC_MODE (S_IXGRP | S_IXUSR | S_IXOTH) - -int setdeskmode(const mode_t mode) -{ - char wd[ MAXPATHLEN + 1]; - struct stat st; - char modbuf[ 12 + 1], *m; - struct dirent *deskp, *subp; - DIR *desk, *sub; - - if (!dir_rx_set(mode)) { - /* want to remove read and search access to owner it will screw the volume */ - return -1 ; - } - if ( getcwd( wd , MAXPATHLEN) == NULL ) { - return( -1 ); - } - if ( chdir( ".AppleDesktop" ) < 0 ) { - return( -1 ); - } - if (( desk = opendir( "." )) == NULL ) { - if ( chdir( wd ) < 0 ) { - LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) ); - } - return( -1 ); - } - for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) { - if ( strcmp( deskp->d_name, "." ) == 0 || - strcmp( deskp->d_name, ".." ) == 0 || strlen( deskp->d_name ) > 2 ) { - continue; - } - strcpy( modbuf, deskp->d_name ); - strcat( modbuf, "/" ); - m = strchr( modbuf, '\0' ); - if (( sub = opendir( deskp->d_name )) == NULL ) { - continue; - } - for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) { - if ( strcmp( subp->d_name, "." ) == 0 || - strcmp( subp->d_name, ".." ) == 0 ) { - continue; - } - *m = '\0'; - strcat( modbuf, subp->d_name ); - /* XXX: need to preserve special modes */ - if (lstat(modbuf, &st) < 0) { - LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",fullpathname(modbuf), strerror(errno) ); - continue; - } - - if (S_ISDIR(st.st_mode)) { - if ( chmod_acl( modbuf, (DIRBITS | mode)) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) ); - } - } else if ( chmod_acl( modbuf, mode & ~EXEC_MODE ) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) ); - } - - } - closedir( sub ); - /* XXX: need to preserve special modes */ - if ( chmod_acl( deskp->d_name, (DIRBITS | mode)) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(deskp->d_name), strerror(errno) ); - } - } - closedir( desk ); - if ( chdir( wd ) < 0 ) { - LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) ); - return -1; - } - /* XXX: need to preserve special modes */ - if ( chmod_acl( ".AppleDesktop", (DIRBITS | mode)) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s", fullpathname(".AppleDesktop"),strerror(errno) ); - } - return( 0 ); -} - /* --------------------- */ int setfilunixmode (const struct vol *vol, struct path* path, mode_t mode) { @@ -323,68 +246,6 @@ int setdirunixmode(const struct vol *vol, const char *name, mode_t mode) return 0; } -/* ----------------------------- */ -int setdeskowner(const uid_t uid, const gid_t gid) -{ - char wd[ MAXPATHLEN + 1]; - char modbuf[12 + 1], *m; - struct dirent *deskp, *subp; - DIR *desk, *sub; - - if ( getcwd( wd, MAXPATHLEN ) == NULL ) { - return( -1 ); - } - if ( chdir( ".AppleDesktop" ) < 0 ) { - return( -1 ); - } - if (( desk = opendir( "." )) == NULL ) { - if ( chdir( wd ) < 0 ) { - LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) ); - } - return( -1 ); - } - for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) { - if ( strcmp( deskp->d_name, "." ) == 0 || - strcmp( deskp->d_name, ".." ) == 0 || - strlen( deskp->d_name ) > 2 ) { - continue; - } - strcpy( modbuf, deskp->d_name ); - strcat( modbuf, "/" ); - m = strchr( modbuf, '\0' ); - if (( sub = opendir( deskp->d_name )) == NULL ) { - continue; - } - for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) { - if ( strcmp( subp->d_name, "." ) == 0 || - strcmp( subp->d_name, ".." ) == 0 ) { - continue; - } - *m = '\0'; - strcat( modbuf, subp->d_name ); - /* XXX: add special any uid, ignore group bits */ - if ( chown( modbuf, uid, gid ) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskown: chown %s: %s", fullpathname(modbuf), strerror(errno) ); - } - } - closedir( sub ); - /* XXX: add special any uid, ignore group bits */ - if ( chown( deskp->d_name, uid, gid ) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", - deskp->d_name, strerror(errno) ); - } - } - closedir( desk ); - if ( chdir( wd ) < 0 ) { - LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) ); - return -1; - } - if ( chown( ".AppleDesktop", uid, gid ) < 0 && errno != EPERM ) { - LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", fullpathname(".AppleDouble"), strerror(errno) ); - } - return( 0 ); -} - /* ----------------------------- */ int setfilowner(const struct vol *vol, const uid_t uid, const gid_t gid, struct path* path) { diff --git a/etc/afpd/unix.h b/etc/afpd/unix.h index a81391b5..73a515b2 100644 --- a/etc/afpd/unix.h +++ b/etc/afpd/unix.h @@ -213,10 +213,8 @@ extern int uquota_getvolspace (const AFPObj *obj, struct vol *, VolSpace *, VolS extern struct afp_options default_options; -extern int setdeskmode (const mode_t); extern int setdirunixmode (const struct vol *, const char *, mode_t); extern int setdirmode (const struct vol *, const char *, mode_t); -extern int setdeskowner (const uid_t, const gid_t); extern int setdirowner (const struct vol *, const char *, const uid_t, const gid_t); extern int setfilunixmode (const struct vol *, struct path*, const mode_t); extern int setfilowner (const struct vol *, const uid_t, const gid_t, struct path*);