X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fafpd%2Ffiledir.c;h=fba0eacf768a5ef1a4a003c4deccb9c6c7174cbc;hb=b0bcb8f6b0571592a50ce039882c9319e012a270;hp=1a0bd550b8f954bb9de0719a9afd66f4661366e7;hpb=2562a562c1cb2ba237dc4bf714ef77b9c816adeb;p=netatalk.git diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 1a0bd550..fba0eacf 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -9,24 +9,7 @@ #include #include -/* STDC check */ -#if STDC_HEADERS #include -#else /* STDC_HEADERS */ -#ifndef HAVE_STRCHR -#define strchr index -#define strrchr index -#endif /* HAVE_STRCHR */ -char *strchr (), *strrchr (); -#ifndef HAVE_MEMCPY -#define memcpy(d,s,n) bcopy ((s), (d), (n)) -#define memmove(d,s,n) bcopy ((s), (d), (n)) -#endif /* ! HAVE_MEMCPY */ -#endif /* STDC_HEADERS */ - -#ifdef HAVE_STRINGS_H -#include -#endif #include #include @@ -40,6 +23,8 @@ char *strchr (), *strrchr (); #include #include #include +#include +#include #include "directory.h" #include "dircache.h" @@ -47,91 +32,9 @@ char *strchr (), *strrchr (); #include "volume.h" #include "fork.h" #include "file.h" -#include "globals.h" #include "filedir.h" #include "unix.h" -#ifdef DROPKLUDGE -int matchfile2dirperms( -/* Since it's kinda' big; I decided against an - inline function */ - char *upath, - struct vol *vol, - int did) -/* The below code changes the way file ownership is determined in the name of - fixing dropboxes. It has known security problem. See the netatalk FAQ for - more information */ -{ - struct stat st, sb; - struct dir *dir; - char *adpath; - uid_t uid; - int ret = AFP_OK; -#ifdef DEBUG - LOG(log_debug9, logtype_afpd, "begin matchfile2dirperms:"); -#endif - - if (stat(upath, &st ) < 0) { - LOG(log_error, logtype_afpd, "Could not stat %s: %s", upath, strerror(errno)); - return AFPERR_NOOBJ ; - } - - adpath = vol->vfs->ad_path( upath, ADFLAGS_HF ); - /* FIXME dirsearch doesn't move cwd to did ! */ - if (( dir = dirlookup( vol, did )) == NULL ) { - LOG(log_error, logtype_afpd, "matchfile2dirperms: Unable to get directory info."); - ret = AFPERR_NOOBJ; - } - else if (stat(".", &sb) < 0) { - LOG(log_error, logtype_afpd, - "matchfile2dirperms: Error checking directory \"%s\": %s", - dir->d_m_name, strerror(errno)); - ret = AFPERR_NOOBJ; - } - else { - uid=geteuid(); - if ( uid != sb.st_uid ) - { - seteuid(0); - if (lchown(upath, sb.st_uid, sb.st_gid) < 0) - { - LOG(log_error, logtype_afpd, - "matchfile2dirperms(%s): Error changing owner/gid: %s", - upath, strerror(errno)); - ret = AFPERR_ACCESS; - } - else if ((!S_ISLNK(st->st_mode)) && (chmod(upath,(st.st_mode&~default_options.umask)| S_IRGRP| S_IROTH) < 0)) - { - LOG(log_error, logtype_afpd, - "matchfile2dirperms(%s): Error adding file read permissions: %s", - upath, strerror(errno)); - ret = AFPERR_ACCESS; - } - else if (lchown(adpath, sb.st_uid, sb.st_gid) < 0) - { - LOG(log_error, logtype_afpd, - "matchfile2dirperms(%s): Error changing AppleDouble owner/gid: %s", - adpath, strerror(errno)); - ret = AFPERR_ACCESS; - } - else if (chmod(adpath, (st.st_mode&~default_options.umask)| S_IRGRP| S_IROTH) < 0) - { - LOG(log_error, logtype_afpd, - "matchfile2dirperms(%s): Error adding AD file read permissions: %s", - adpath, strerror(errno)); - ret = AFPERR_ACCESS; - } - seteuid(uid); - } - } /* end else if stat success */ - -#ifdef DEBUG - LOG(log_debug9, logtype_afpd, "end matchfile2dirperms:"); -#endif - return ret; -} -#endif - int afp_getfildirparams(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, size_t *rbuflen) { struct stat *st; @@ -401,6 +304,7 @@ static int moveandrename(const struct vol *vol, u_int16_t bshort; ad_getattr(adp, &bshort); + ad_close_metadata( adp); if ((bshort & htons(ATTRBIT_NORENAME))) { rc = AFPERR_OLOCK; @@ -601,10 +505,18 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size upath = s_path->u_name; if ( path_isadir( s_path) ) { - if (*s_path->m_name != '\0' || curdir->d_did == DIRDID_ROOT) + if (*s_path->m_name != '\0' || curdir->d_did == DIRDID_ROOT) { rc = AFPERR_ACCESS; - else - rc = deletecurdir( vol); + } else { + /* we have to cache this, the structs are lost in deletcurdir*/ + /* but we need the positive returncode to send our event */ + bstring dname; + if ((dname = bstrcpy(curdir->d_u_name)) == NULL) + return AFPERR_MISC; + if ((rc = deletecurdir(vol)) == AFP_OK) + fce_register_delete_dir(cfrombstr(dname)); + bdestroy(dname); + } } else if (of_findname(s_path)) { rc = AFPERR_BUSY; } else { @@ -614,10 +526,14 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size */ if (s_path->st_valid && s_path->st_errno == ENOENT) { rc = AFPERR_NOOBJ; - } - else { - rc = deletefile(vol, -1, upath, 1); - + } else { + if ((rc = deletefile(vol, -1, upath, 1)) == AFP_OK) { + fce_register_delete_file( s_path ); + if (vol->v_tm_used < s_path->st.st_size) + vol->v_tm_used = 0; + else + vol->v_tm_used -= s_path->st.st_size; + } struct dir *cachedfile; if ((cachedfile = dircache_search_by_name(vol, dir, upath, strlen(upath)))) { dircache_remove(vol, cachedfile, DIRCACHE | DIDNAME_INDEX | QUEUE_INDEX); @@ -626,7 +542,7 @@ int afp_delete(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size } } if ( rc == AFP_OK ) { - curdir->offcnt--; + curdir->d_offcnt--; setvoltime(obj, vol ); } @@ -678,9 +594,6 @@ int afp_moveandrename(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U int plen; u_int16_t vid; int rc; -#ifdef DROPKLUDGE - int retvalue; -#endif /* DROPKLUDGE */ int sdir_fd = -1; @@ -769,23 +682,13 @@ int afp_moveandrename(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U } curdir->offcnt++; sdir->offcnt--; -#ifdef DROPKLUDGE - if (vol->v_flags & AFPVOL_DROPBOX) { - /* FIXME did is not always the source id */ - if ((retvalue=matchfile2dirperms (upath, vol, did)) != AFP_OK) { - rc = retvalue; - goto exit; - } + /* if unix priv don't try to match perm with dest folder */ + if (!isdir && !vol_unix_priv(vol)) { + int admode = ad_mode("", 0777) | vol->v_fperm; + + setfilmode(upath, admode, NULL, vol->v_umask); + vol->vfs->vfs_setfilmode(vol, upath, admode, NULL); } - else -#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) | vol->v_fperm; - - setfilmode(upath, admode, NULL, vol->v_umask); - vol->vfs->vfs_setfilmode(vol, upath, admode, NULL); - } setvoltime(obj, vol ); }