X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Facl%2Fuuid.c;h=ff58c3dd2202f562f3b757bca7053a85cbfdf4ca;hb=939eb9da6116bd502cdae97f84541993848071b4;hp=397d3b8483be09a318dd344c68a812690f27d34f;hpb=6e0331e3e0c420bb508fe5322a5aaf86447173ff;p=netatalk.git diff --git a/libatalk/acl/uuid.c b/libatalk/acl/uuid.c index 397d3b84..ff58c3dd 100644 --- a/libatalk/acl/uuid.c +++ b/libatalk/acl/uuid.c @@ -24,16 +24,18 @@ #include #include #include +#include #include #include #include +#include #include #include "aclldap.h" #include "cache.h" -char *uuidtype[] = {"USER", "GROUP", "LOCAL"}; +char *uuidtype[] = {"", "USER", "GROUP", "LOCAL"}; /******************************************************** * Public helper function @@ -71,12 +73,12 @@ void localuuid_from_id(unsigned char *buf, uuidtype_t type, unsigned int id) * convert ascii string that can include dashes to binary uuid. * caller must provide a buffer. */ -void uuid_string2bin( const char *uuidstring, uuidp_t uuid) { +void uuid_string2bin( const char *uuidstring, unsigned char *uuid) { int nibble = 1; int i = 0; unsigned char c, val = 0; - - while (*uuidstring) { + + while (*uuidstring && i < UUID_BINSIZE) { c = *uuidstring; if (c == '-') { uuidstring++; @@ -102,21 +104,30 @@ void uuid_string2bin( const char *uuidstring, uuidp_t uuid) { /*! * Convert 16 byte binary uuid to neat ascii represantation including dashes. - * + * Use defined or default ascii mask for dash placement * Returns pointer to static buffer. */ -const char *uuid_bin2string(unsigned char *uuid) { - static char uuidstring[UUID_STRINGSIZE + 1]; - +const char *uuid_bin2string(const unsigned char *uuid) { + static char uuidstring[64]; + const char *uuidmask; int i = 0; unsigned char c; - while (i < UUID_STRINGSIZE) { +#ifdef HAVE_LDAP + if (ldap_uuid_string) + uuidmask = ldap_uuid_string; + else +#endif + uuidmask = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; + + LOG(log_debug, logtype_afpd, "uuid_bin2string{uuid}: mask: %s", uuidmask); + + while (i < strlen(uuidmask)) { c = *uuid; uuid++; sprintf(uuidstring + i, "%02X", c); i += 2; - if (i==8 || i==13 || i==18 || i==23) + if (uuidmask[i] == '-') uuidstring[i++] = '-'; } uuidstring[i] = 0; @@ -133,7 +144,7 @@ const char *uuid_bin2string(unsigned char *uuid) { * uuid: pointer to uuid_t storage that the caller must provide * returns 0 on success !=0 on errror */ -int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) { +int getuuidfromname( const char *name, uuidtype_t type, unsigned char *uuid) { int ret = 0; uuidtype_t mytype = type; char nulluuid[16] = {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; @@ -158,7 +169,7 @@ int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) { #ifdef HAVE_LDAP if ((ret = ldap_getuuidfromname( name, type, &uuid_string)) == 0) { uuid_string2bin( uuid_string, uuid); - LOG(log_debug, logtype_afpd, "getuuidfromname{local}: name: %s, type: %s -> UUID: %s", + LOG(log_debug, logtype_afpd, "getuuidfromname{LDAP}: name: %s, type: %s -> UUID: %s", name, uuidtype[type & UUIDTYPESTR_MASK], uuid_bin2string(uuid)); } else { LOG(log_debug, logtype_afpd, "getuuidfromname(\"%s\",t:%u): no result from ldap search", @@ -198,7 +209,6 @@ int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) { add_cachebyname(name, uuid, mytype, 0); } -cleanup: #ifdef HAVE_LDAP if (uuid_string) free(uuid_string); #endif @@ -215,9 +225,10 @@ cleanup: * Caller must free name appropiately. */ int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) { - int ret = 0; + int ret; uid_t uid; gid_t gid; + uint32_t tmp; struct passwd *pwd; struct group *grp; @@ -239,43 +250,50 @@ int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) { /* Check if UUID is a client local one */ if (memcmp(uuidp, local_user_uuid, 12) == 0) { *type = UUID_USER; - uid = ntohl(*(uint32_t *)(uuidp + 12)); + memcpy(&tmp, uuidp + 12, sizeof(uint32_t)); + uid = ntohl(tmp); if ((pwd = getpwuid(uid)) == NULL) { /* not found, add negative entry to cache */ - *type |= UUID_ENOENT; - *name = "UUID_ENOENT"; + *name = NULL; + add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0); + ret = -1; + } else { + *name = strdup(pwd->pw_name); add_cachebyuuid(uuidp, *name, *type, 0); - return -1; + ret = 0; } - *name = pwd->pw_name; - add_cachebyuuid(uuidp, *name, *type, 0); - return 0; + LOG(log_debug, logtype_afpd, + "getnamefromuuid{local}: UUID: %s -> name: %s, type:%s", + uuid_bin2string(uuidp), *name ? *name : "-", uuidtype[(*type) & UUIDTYPESTR_MASK]); + return ret; } else if (memcmp(uuidp, local_group_uuid, 12) == 0) { *type = UUID_GROUP; - gid = ntohl(*(uint32_t *)(uuidp + 12)); + memcpy(&tmp, uuidp + 12, sizeof(uint32_t)); + gid = ntohl(tmp); if ((grp = getgrgid(gid)) == NULL) { /* not found, add negative entry to cache */ - *type |= UUID_ENOENT; - *name = "UUID_ENOENT"; + add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0); + ret = -1; + } else { + *name = strdup(grp->gr_name); add_cachebyuuid(uuidp, *name, *type, 0); - return -1; + ret = 0; } - *name = grp->gr_name; - add_cachebyuuid(uuidp, *name, *type, 0); - return 0; + return ret; } #ifdef HAVE_LDAP ret = ldap_getnamefromuuid(uuid_bin2string(uuidp), name, type); +#else + ret = -1; +#endif + if (ret != 0) { - LOG(log_warning, logtype_afpd, "getnamefromuuid(%s): no result from ldap_getnamefromuuid", + LOG(log_debug, logtype_afpd, "getnamefromuuid(%s): not found", uuid_bin2string(uuidp)); - *type |= UUID_ENOENT; - *name = "UUID_ENOENT"; - add_cachebyuuid(uuidp, *name, *type, 0); + add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0); return -1; } -#endif add_cachebyuuid(uuidp, *name, *type, 0);