From e671cdc26165d0f87a24c382dbed1a3c19230caf Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Tue, 8 Feb 2011 17:03:46 +0100 Subject: [PATCH] Fix for not shown ACLs for when filesyem uid or gid couldn't be resolved because (eg deleted users/groups) --- NEWS | 2 ++ etc/afpd/acls.c | 26 ++++++++++++++++---------- include/atalk/uuid.h | 1 + libatalk/acl/uuid.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index a03e5dca..13dac554 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ Changes in 2.1.6 ================ * FIX: afpd: Fix for LDAP user cache corruption +* FIX: afpd: Fix for not shown ACLs for when filesyem uid or gid + couldn't be resolved because (eg deleted users/groups) * FIX: gentoo: cannot set $CNID_CONFIG * FIX: ubuntu: servername was empty * FIX: Solaris: configure script failed to enable DDP module diff --git a/etc/afpd/acls.c b/etc/afpd/acls.c index e7ee37ff..bca61c49 100644 --- a/etc/afpd/acls.c +++ b/etc/afpd/acls.c @@ -728,11 +728,14 @@ int afp_getacl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size /* Shall we return owner UUID ? */ if (bitmap & kFileSec_UUID) { LOG(log_debug, logtype_afpd, "afp_getacl: client requested files owner user UUID"); - if (NULL == (pw = getpwuid(s_path->st.st_uid))) - return AFPERR_MISC; - LOG(log_debug, logtype_afpd, "afp_getacl: got uid: %d, name: %s", s_path->st.st_uid, pw->pw_name); - if ((ret = getuuidfromname(pw->pw_name, UUID_USER, rbuf)) != 0) - return AFPERR_MISC; + if (NULL == (pw = getpwuid(s_path->st.st_uid))) { + LOG(log_debug, logtype_afpd, "afp_getacl: local uid: %u", s_path->st.st_uid); + localuuid_from_id(rbuf, UUID_USER, s_path->st.st_uid); + } else { + LOG(log_debug, logtype_afpd, "afp_getacl: got uid: %d, name: %s", s_path->st.st_uid, pw->pw_name); + if ((ret = getuuidfromname(pw->pw_name, UUID_USER, rbuf)) != 0) + return AFPERR_MISC; + } rbuf += UUID_BINSIZE; *rbuflen += UUID_BINSIZE; } @@ -740,11 +743,14 @@ int afp_getacl(AFPObj *obj, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size /* Shall we return group UUID ? */ if (bitmap & kFileSec_GRPUUID) { LOG(log_debug, logtype_afpd, "afp_getacl: client requested files owner group UUID"); - if (NULL == (gr = getgrgid(s_path->st.st_gid))) - return AFPERR_MISC; - LOG(log_debug, logtype_afpd, "afp_getacl: got gid: %d, name: %s", s_path->st.st_gid, gr->gr_name); - if ((ret = getuuidfromname(gr->gr_name, UUID_GROUP, rbuf)) != 0) - return AFPERR_MISC; + if (NULL == (gr = getgrgid(s_path->st.st_gid))) { + LOG(log_debug, logtype_afpd, "afp_getacl: local gid: %u", s_path->st.st_gid); + localuuid_from_id(rbuf, UUID_GROUP, s_path->st.st_gid); + } else { + LOG(log_debug, logtype_afpd, "afp_getacl: got gid: %d, name: %s", s_path->st.st_gid, gr->gr_name); + if ((ret = getuuidfromname(gr->gr_name, UUID_GROUP, rbuf)) != 0) + return AFPERR_MISC; + } rbuf += UUID_BINSIZE; *rbuflen += UUID_BINSIZE; } diff --git a/include/atalk/uuid.h b/include/atalk/uuid.h index 25db56ec..3103c1d1 100644 --- a/include/atalk/uuid.h +++ b/include/atalk/uuid.h @@ -43,6 +43,7 @@ extern char *ldap_uid_attr; extern int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid); extern int getnamefromuuid( uuidp_t uuidp, char **name, uuidtype_t *type); +extern void localuuid_from_id(unsigned char *buf, uuidtype_t type, unsigned int id); extern int uuid_bin2string( uuidp_t uuidp, char **uuidstring); extern void uuid_string2bin( const char *uuidstring, uuidp_t uuid); diff --git a/libatalk/acl/uuid.c b/libatalk/acl/uuid.c index e8b96504..8943fd82 100644 --- a/libatalk/acl/uuid.c +++ b/libatalk/acl/uuid.c @@ -35,6 +35,34 @@ char *uuidtype[] = {"NULL","USER", "GROUP"}; * Public helper function ********************************************************/ +static unsigned char local_group_uuid[] = {0xab, 0xcd, 0xef, + 0xab, 0xcd, 0xef, + 0xab, 0xcd, 0xef, + 0xab, 0xcd, 0xef}; + +static unsigned char local_user_uuid[] = {0xff, 0xff, 0xee, 0xee, 0xdd, 0xdd, + 0xcc, 0xcc, 0xbb, 0xbb, 0xaa, 0xaa}; + +void localuuid_from_id(unsigned char *buf, uuidtype_t type, unsigned int id) +{ + uint32_t tmp; + + switch (type) { + case UUID_GROUP: + memcpy(buf, local_group_uuid, 12); + break; + case UUID_USER: + default: + memcpy(buf, local_user_uuid, 12); + break; + } + + tmp = htonl(id); + memcpy(buf + 12, &tmp, 4); + + return; +} + /* * convert ascii string that can include dashes to binary uuid. * caller must provide a buffer. -- 2.39.2