/* Unix SMB/CIFS implementation. ads (active directory) utility library Copyright (C) Guenther Deschner 2005-2007 Copyright (C) Gerald (Jerry) Carter 2006 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "includes.h" #include "ads.h" #include "libads/ldap_schema.h" #include "libads/ldap_schema_oids.h" #include "../libcli/ldap/ldap_ndr.h" #ifdef HAVE_LDAP static ADS_STATUS ads_get_attrnames_by_oids(ADS_STRUCT *ads, TALLOC_CTX *mem_ctx, const char *schema_path, const char **OIDs, size_t num_OIDs, char ***OIDs_out, char ***names, size_t *count) { ADS_STATUS status; LDAPMessage *res = NULL; LDAPMessage *msg; char *expr = NULL; const char *attrs[] = { "lDAPDisplayName", "attributeId", NULL }; int i = 0, p = 0; if (!ads || !mem_ctx || !names || !count || !OIDs || !OIDs_out) { return ADS_ERROR(LDAP_PARAM_ERROR); } if (num_OIDs == 0 || OIDs[0] == NULL) { return ADS_ERROR_NT(NT_STATUS_NONE_MAPPED); } expr = talloc_asprintf(mem_ctx, "(|"); for (i=0; iposix_uidnumber_attr = talloc_strdup(schema, names_out[i]); continue; } if (strequal(ADS_ATTR_RFC2307_GIDNUMBER_OID, oids_out[i]) || strequal(ADS_ATTR_SFU_GIDNUMBER_OID, oids_out[i]) || strequal(ADS_ATTR_SFU20_GIDNUMBER_OID, oids_out[i])) { schema->posix_gidnumber_attr = talloc_strdup(schema, names_out[i]); continue; } if (strequal(ADS_ATTR_RFC2307_HOMEDIR_OID, oids_out[i]) || strequal(ADS_ATTR_SFU_HOMEDIR_OID, oids_out[i]) || strequal(ADS_ATTR_SFU20_HOMEDIR_OID, oids_out[i])) { schema->posix_homedir_attr = talloc_strdup(schema, names_out[i]); continue; } if (strequal(ADS_ATTR_RFC2307_SHELL_OID, oids_out[i]) || strequal(ADS_ATTR_SFU_SHELL_OID, oids_out[i]) || strequal(ADS_ATTR_SFU20_SHELL_OID, oids_out[i])) { schema->posix_shell_attr = talloc_strdup(schema, names_out[i]); continue; } if (strequal(ADS_ATTR_RFC2307_GECOS_OID, oids_out[i]) || strequal(ADS_ATTR_SFU_GECOS_OID, oids_out[i]) || strequal(ADS_ATTR_SFU20_GECOS_OID, oids_out[i])) { schema->posix_gecos_attr = talloc_strdup(schema, names_out[i]); } if (strequal(ADS_ATTR_RFC2307_UID_OID, oids_out[i]) || strequal(ADS_ATTR_SFU_UID_OID, oids_out[i]) || strequal(ADS_ATTR_SFU20_UID_OID, oids_out[i])) { schema->posix_uid_attr = talloc_strdup(schema, names_out[i]); } } if (!schema->posix_uidnumber_attr || !schema->posix_gidnumber_attr || !schema->posix_homedir_attr || !schema->posix_shell_attr || !schema->posix_gecos_attr) { status = ADS_ERROR(LDAP_NO_MEMORY); TALLOC_FREE( schema ); goto done; } *s = schema; status = ADS_ERROR(LDAP_SUCCESS); done: TALLOC_FREE(ctx); return status; } #endif