Exemple #1
0
/*
 * uuidp: pointer to a uuid
 * name: returns allocated buffer from ldap_getnamefromuuid
 * type: returns USER, GROUP or LOCAL
 * return 0 on success !=0 on errror
 *
 * Caller must free name appropiately.
 */
int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) {
    int ret;

    ret = search_cachebyuuid( uuidp, name, type);
    if (ret == 0) {
        /* found in cache */
        LOG(log_debug9, logtype_afpd, "getnamefromuuid{cache}: UUID: %s -> name: %s, type:%s",
            uuid_bin2string(uuidp), *name, uuidtype[*type]);
    } else {
        /* not found in cache */

        /* Check if UUID is a client local one */
        if (memcmp(uuidp, local_user_uuid, 12) == 0
            || memcmp(uuidp, local_group_uuid, 12) == 0) {
            LOG(log_debug, logtype_afpd, "getnamefromuuid: local UUID: %" PRIu32 "",
                ntohl(*(uint32_t *)(uuidp + 12)));
            *type = UUID_LOCAL;
            *name = strdup("UUID_LOCAL");
            return 0;
        }

#ifdef HAVE_LDAP
        ret = ldap_getnamefromuuid(uuid_bin2string(uuidp), name, type);
        if (ret != 0) {
            LOG(log_warning, logtype_afpd, "getnamefromuuid(%s): no result from ldap_getnamefromuuid",
                uuid_bin2string(uuidp));
            goto cleanup;
        }
        add_cachebyuuid( uuidp, *name, *type, 0);
        LOG(log_debug, logtype_afpd, "getnamefromuuid{LDAP}: UUID: %s -> name: %s, type:%s",
            uuid_bin2string(uuidp), *name, uuidtype[*type]);
#endif
    }

cleanup:
    return ret;
}
Exemple #2
0
/*
 * uuidp: pointer to a uuid
 * name: returns allocated buffer from ldap_getnamefromuuid
 * type: returns USER, GROUP or LOCAL
 * return 0 on success !=0 on errror
 *
 * Caller must free name appropiately.
 */
int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) {
    int ret;
    uid_t uid;
    gid_t gid;
    struct passwd *pwd;
    struct group *grp;

    if (search_cachebyuuid(uuidp, name, type) == 0) {
        /* found in cache */
        LOG(log_debug, logtype_afpd,
            "getnamefromuuid{cache}: UUID: %s -> name: %s, type%s: %s",
            uuid_bin2string(uuidp),
            *name,
            (*type & UUID_ENOENT) == UUID_ENOENT ? "[negative]" : "",
            uuidtype[(*type) & UUIDTYPESTR_MASK]);
        if ((*type & UUID_ENOENT) == UUID_ENOENT)
            return -1;
        return 0;
    }

    /* not found in cache */

    /* 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));
        if ((pwd = getpwuid(uid)) == NULL) {
            /* not found, add negative entry to cache */
            add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
            ret = -1;
        } else {
            *name = strdup(pwd->pw_name);
            add_cachebyuuid(uuidp, *name, *type, 0);
            ret = 0;
        }
        LOG(log_debug, logtype_afpd,
            "getnamefromuuid{local}: UUID: %s -> name: %s, type:%s",
            uuid_bin2string(uuidp), *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));
        if ((grp = getgrgid(gid)) == NULL) {
            /* not found, add negative entry to cache */
            add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
            ret = -1;
        } else {
            *name = strdup(grp->gr_name);
            add_cachebyuuid(uuidp, *name, *type, 0);
            ret = 0;
        }
        return ret;
    }

#ifdef HAVE_LDAP
    ret = ldap_getnamefromuuid(uuid_bin2string(uuidp), name, type);
#else
    ret = -1;
#endif

    if (ret != 0) {
        LOG(log_debug, logtype_afpd, "getnamefromuuid(%s): not found",
            uuid_bin2string(uuidp));
        add_cachebyuuid(uuidp, "UUID_ENOENT", UUID_ENOENT, 0);
        return -1;
    }

    add_cachebyuuid(uuidp, *name, *type, 0);

    LOG(log_debug, logtype_afpd, "getnamefromuuid{LDAP}: UUID: %s -> name: %s, type:%s",
        uuid_bin2string(uuidp), *name, uuidtype[(*type) & UUIDTYPESTR_MASK]);

    return 0;
}