Ejemplo n.º 1
0
/*
 *   name: give me his name
 *   type: and type (UUID_USER or UUID_GROUP)
 *   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 ret = 0;
#ifdef HAVE_LDAP
    char *uuid_string = NULL;
#endif
    ret = search_cachebyname( name, type, uuid);
    if (ret == 0) {
        /* found in cache */
        LOG(log_debug, logtype_afpd, "getuuidfromname{cache}: name: %s, type: %s -> UUID: %s",
            name, uuidtype[type], uuid_bin2string(uuid));
    } else  {
        /* if not found in cache */
#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",
                name, uuidtype[type], uuid_bin2string(uuid));
        } else {
            LOG(log_debug, logtype_afpd, "getuuidfromname(\"%s\",t:%u): no result from ldap search",
                name, type);
        }
#endif
        if (ret != 0) {
            /* Build a local UUID */
            if (type == UUID_USER) {
                struct passwd *pwd;
                if ((pwd = getpwnam(name)) == NULL) {
                    LOG(log_error, logtype_afpd, "getuuidfromname(\"%s\",t:%u): unknown user",
                        name, uuidtype[type]);
                    goto cleanup;
                }
                localuuid_from_id(uuid, UUID_USER, pwd->pw_uid);
            } else {
                struct group *grp;
                if ((grp = getgrnam(name)) == NULL) {
                    LOG(log_error, logtype_afpd, "getuuidfromname(\"%s\",t:%u): unknown user",
                        name, uuidtype[type]);
                    goto cleanup;
                }
                localuuid_from_id(uuid, UUID_GROUP, grp->gr_gid);
            }
            LOG(log_debug, logtype_afpd, "getuuidfromname{local}: name: %s, type: %s -> UUID: %s",
                name, uuidtype[type], uuid_bin2string(uuid));
        }
        ret = 0;
        add_cachebyname( name, uuid, type, 0);
    }

cleanup:
#ifdef HAVE_LDAP
    if (uuid_string) free(uuid_string);
#endif
    return ret;
}
Ejemplo n.º 2
0
/*
 *   name: give me his name
 *   type: and type (UUID_USER or UUID_GROUP)
 *   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 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};
#ifdef HAVE_LDAP
    char *uuid_string = NULL;
#endif

    ret = search_cachebyname(name, &mytype, uuid);

    if (ret == 0) {
        /* found in cache */
        LOG(log_debug, logtype_afpd,
            "getuuidfromname{cache}: name: %s, type%s: %s -> UUID: %s",
            name,
            (mytype & UUID_ENOENT) == UUID_ENOENT ? "[negative]" : "",
            uuidtype[type & UUIDTYPESTR_MASK],
            uuid_bin2string(uuid));
        if ((mytype & UUID_ENOENT) == UUID_ENOENT)
            return -1;
    } else  {
        /* if not found in cache */
#ifdef HAVE_LDAP
        if ((ret = ldap_getuuidfromname( name, type, &uuid_string)) == 0) {
            uuid_string2bin( uuid_string, uuid);
            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",
                name, type);
        }
#endif
        if (ret != 0) {
            /* Build a local UUID */
            if (type == UUID_USER) {
                struct passwd *pwd;
                if ((pwd = getpwnam(name)) == NULL) {
                    LOG(log_error, logtype_afpd, "getuuidfromname(\"%s\",t:%u): unknown user",
                        name, uuidtype[type & UUIDTYPESTR_MASK]);
                    mytype |= UUID_ENOENT;
                    memcpy(uuid, nulluuid, 16);
                } else {
                    localuuid_from_id(uuid, UUID_USER, pwd->pw_uid);
                    ret = 0;
                    LOG(log_debug, logtype_afpd, "getuuidfromname{local}: name: %s, type: %s -> UUID: %s",
                        name, uuidtype[type & UUIDTYPESTR_MASK], uuid_bin2string(uuid));
                }
            } else {
                struct group *grp;
                if ((grp = getgrnam(name)) == NULL) {
                    LOG(log_error, logtype_afpd, "getuuidfromname(\"%s\",t:%u): unknown user",
                        name, uuidtype[type & UUIDTYPESTR_MASK]);
                    mytype |= UUID_ENOENT;
                    memcpy(uuid, nulluuid, 16);
                } else {
                    localuuid_from_id(uuid, UUID_GROUP, grp->gr_gid);
                    ret = 0;
                    LOG(log_debug, logtype_afpd, "getuuidfromname{local}: name: %s, type: %s -> UUID: %s",
                        name, uuidtype[type & UUIDTYPESTR_MASK], uuid_bin2string(uuid));
                }
            }
        }
        add_cachebyname(name, uuid, mytype, 0);
    }

cleanup:
#ifdef HAVE_LDAP
    if (uuid_string) free(uuid_string);
#endif
    return ret;
}