From c5571c7c3964975d5c1f1c347b8629577d2e86c6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 02:19:56 +0000 Subject: r20221: - move the dsdb_schema, dsdb_attribute, dsdb_class structs into a generic location - this struct should be also used by the dsdb/samdb/ldb_modules/schema.c module later - add functions to map from LDAP OID values to uint32_t values - add torture test for the OID => uint32 mapping code metze (This used to be commit 58ba6ec195ce3a5e2352866809f6cb57f8d8260a) --- source4/dsdb/schema/schema_init.c | 294 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 source4/dsdb/schema/schema_init.c (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c new file mode 100644 index 0000000000..ab7d5b1706 --- /dev/null +++ b/source4/dsdb/schema/schema_init.c @@ -0,0 +1,294 @@ +/* + Unix SMB/CIFS mplementation. + DSDB schema header + + Copyright (C) Stefan Metzmacher 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "includes.h" +#include "dsdb/samdb/samdb.h" +#include "lib/util/dlinklist.h" + +#define _PREFIX(uint32, oid) {uint32,oid,sizeof(oid)} +static const struct { + uint32_t uint32; + const char *oid; + size_t oid_len; +} prefix_mappings[] = { + _PREFIX(0x00000000, "2.5.4."), + _PREFIX(0x00010000, "2.5.6."), + _PREFIX(0x00020000, "1.2.840.113556.1.2."), + _PREFIX(0x00030000, "1.2.840.113556.1.3."), + _PREFIX(0x00080000, "2.5.5."), + _PREFIX(0x00090000, "1.2.840.113556.1.4."), + _PREFIX(0x000A0000, "1.2.840.113556.1.5."), + _PREFIX(0x00140000, "2.16.840.1.113730.3."), + _PREFIX(0x00150000, "0.9.2342.19200300.100.1."), + _PREFIX(0x00160000, "2.16.840.1.113730.3.1."), + _PREFIX(0x00170000, "1.2.840.113556.1.5.7000."), + _PREFIX(0x001A0000, "2.5.20."), + _PREFIX(0x001C0000, "2.16.840.1.113730.3.2."), + _PREFIX(0x001D0000, "1.3.6.1.4.1.250.1."), + _PREFIX(0x001F0000, "0.9.2342.19200300.100.4."), +}; + +WERROR dsdb_map_oid2int(const char *in, uint32_t *out) +{ + uint32_t i; + + for (i=0; i < ARRAY_SIZE(prefix_mappings); i++) { + const char *val_str; + char *end_str; + unsigned val; + + if (strncmp(prefix_mappings[i].oid, in, prefix_mappings[i].oid_len - 1) != 0) { + continue; + } + + val_str = in + prefix_mappings[i].oid_len - 1; + end_str = NULL; + errno = 0; + + if (val_str[0] == '\0') { + return WERR_INVALID_PARAM; + } + + val = strtoul(val_str, &end_str, 10); + if (end_str[0] != '\0') { + return WERR_INVALID_PARAM; + } else if (val > 0xFFFF) { + return WERR_INVALID_PARAM; + } + + *out = prefix_mappings[i].uint32 | val; + return WERR_OK; + } + + return WERR_DS_NO_MSDS_INTID; +} + +WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) +{ + uint32_t i; + + for (i=0; i < ARRAY_SIZE(prefix_mappings); i++) { + const char *val; + if (prefix_mappings[i].uint32 != (in & 0xFFFF0000)) { + continue; + } + + val = talloc_asprintf(mem_ctx, "%s%u", + prefix_mappings[i].oid, + in & 0xFFFF); + W_ERROR_HAVE_NO_MEMORY(val); + + *out = val; + return WERR_OK; + } + + return WERR_DS_NO_MSDS_INTID; +} + +bool dsdb_map_test(void) +{ + bool ret = true; + WERROR status; + const char *oid; + uint32_t id; + + oid = "1.2.840.113556.1.4.1716"; + status = dsdb_map_oid2int(oid, &id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s => %s\n", oid, win_errstr(status))); + ret = false; + } else { + DEBUG(0,("%s => 0x%08X\n", oid, id)); + } + + status = dsdb_map_int2oid(id, NULL, &oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("0x%08X => %s\n", id, win_errstr(status))); + ret = false; + } else { + DEBUG(0,("0x%08X => %s\n", id, oid)); + } + + oid = "1.2.840.113556.1.4.1716."; + status = dsdb_map_oid2int(oid, &id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s => %s\n", oid, win_errstr(status))); + ret = false; + } else { + DEBUG(0,("%s => 0x%08X\n", oid, id)); + } + + oid = "5435.1.2.840.113556.1.4.1716."; + status = dsdb_map_oid2int(oid, &id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s => %s\n", oid, win_errstr(status))); + ret = false; + } else { + DEBUG(0,("%s => 0x%08X\n", oid, id)); + } + + id = 0xEF001234; + status = dsdb_map_int2oid(id, NULL, &oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("0x%08X => %s\n", id, win_errstr(status))); + ret = false; + } else { + DEBUG(0,("0x%08X => %s\n", id, oid)); + } + + return ret; +} + +#define GET_STRING(p, elem, strict) do { \ + (p)->elem = samdb_result_string(msg, #elem, NULL);\ + if (strict && (p)->elem == NULL) { \ + d_printf("%s: %s == NULL\n", __location__, #elem); \ + return WERR_INVALID_PARAM; \ + } \ + (void)talloc_steal(p, (p)->elem); \ +} while (0) + +#define GET_BOOL(p, elem, strict) do { \ + const char *str; \ + str = samdb_result_string(msg, #elem, NULL);\ + if (str == NULL) { \ + if (strict) { \ + d_printf("%s: %s == NULL\n", __location__, #elem); \ + return WERR_INVALID_PARAM; \ + } else { \ + (p)->elem = False; \ + } \ + } else if (strcasecmp("TRUE", str) == 0) { \ + (p)->elem = True; \ + } else if (strcasecmp("FALSE", str) == 0) { \ + (p)->elem = False; \ + } else { \ + d_printf("%s: %s == %s\n", __location__, #elem, str); \ + return WERR_INVALID_PARAM; \ + } \ +} while (0) + +#define GET_UINT32(p, elem) do { \ + (p)->elem = samdb_result_uint(msg, #elem, 0);\ +} while (0) + +#define GET_GUID(p, elem) do { \ + (p)->elem = samdb_result_guid(msg, #elem);\ +} while (0) + +#define GET_BLOB(p, elem) do { \ + const struct ldb_val *_val;\ + _val = ldb_msg_find_ldb_val(msg, #elem);\ + if (_val) {\ + (p)->elem = *_val;\ + (void)talloc_steal(p, (p)->elem.data);\ + } else {\ + ZERO_STRUCT((p)->elem);\ + }\ +} while (0) + +WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_attribute *attr) +{ + WERROR status; + + GET_STRING(attr, cn, True); + GET_STRING(attr, lDAPDisplayName, True); + GET_STRING(attr, attributeID_oid, True); + status = dsdb_map_oid2int(attr->attributeID_oid, &attr->attributeID_id); + W_ERROR_NOT_OK_RETURN(status); + GET_GUID(attr, schemaIDGUID); + GET_UINT32(attr, mAPIID); + + GET_GUID(attr, attributeSecurityGUID); + + GET_UINT32(attr, searchFlags); + GET_UINT32(attr, systemFlags); + GET_BOOL(attr, isMemberOfPartialAttributeSet, False); + GET_UINT32(attr, linkID); + + GET_STRING(attr, attributeSyntax_oid, True); + status = dsdb_map_oid2int(attr->attributeSyntax_oid, &attr->attributeSyntax_id); + W_ERROR_NOT_OK_RETURN(status); + GET_UINT32(attr, oMSyntax); + GET_BLOB(attr, oMObjectClass); + + GET_BOOL(attr, isSingleValued, True); + GET_UINT32(attr, rangeLower); + GET_UINT32(attr, rangeUpper); + GET_BOOL(attr, extendedCharsAllowed, False); + + GET_UINT32(attr, schemaFlagsEx); + GET_BLOB(attr, msDs_Schema_Extensions); + + GET_BOOL(attr, showInAdvancedViewOnly, False); + GET_STRING(attr, adminDisplayName, True); + GET_STRING(attr, adminDescription, True); + GET_STRING(attr, classDisplayName, True); + GET_BOOL(attr, isEphemeral, False); + GET_BOOL(attr, isDefunct, False); + GET_BOOL(attr, systemOnly, False); + + return WERR_OK; +} + +WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) +{ + WERROR status; + + GET_STRING(obj, cn, True); + GET_STRING(obj, lDAPDisplayName, True); + GET_STRING(obj, governsID_oid, True); + status = dsdb_map_oid2int(obj->governsID_oid, &obj->governsID_id); + W_ERROR_NOT_OK_RETURN(status); + GET_GUID(obj, schemaIDGUID); + + GET_UINT32(obj, objectClassCategory); + GET_STRING(obj, rDNAttID, True); + GET_STRING(obj, defaultObjectCategory, True); + + GET_STRING(obj, subClassOf, True); + + GET_STRING(obj, systemAuxiliaryClass, False); + obj->systemPossSuperiors= NULL; + obj->systemMustContain = NULL; + obj->systemMayContain = NULL; + + GET_STRING(obj, auxiliaryClass, False); + obj->possSuperiors = NULL; + obj->mustContain = NULL; + obj->mayContain = NULL; + + GET_STRING(obj, defaultSecurityDescriptor, False); + + GET_UINT32(obj, schemaFlagsEx); + GET_BLOB(obj, msDs_Schema_Extensions); + + GET_BOOL(obj, showInAdvancedViewOnly, False); + GET_STRING(obj, adminDisplayName, True); + GET_STRING(obj, adminDescription, True); + GET_STRING(obj, classDisplayName, True); + GET_BOOL(obj, defaultHidingValue, True); + GET_BOOL(obj, isDefunct, False); + GET_BOOL(obj, systemOnly, False); + + return WERR_OK; +} -- cgit From 1fc9c6bf2cf9ac3872114b087dde0cdc9550c438 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 13:05:34 +0000 Subject: r20223: this function is in the torture test now metze (This used to be commit 66c4b42f5f4c48e9c288781208ecdd4849c2f939) --- source4/dsdb/schema/schema_init.c | 54 --------------------------------------- 1 file changed, 54 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index ab7d5b1706..02f2a18517 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -104,60 +104,6 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) return WERR_DS_NO_MSDS_INTID; } -bool dsdb_map_test(void) -{ - bool ret = true; - WERROR status; - const char *oid; - uint32_t id; - - oid = "1.2.840.113556.1.4.1716"; - status = dsdb_map_oid2int(oid, &id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s => %s\n", oid, win_errstr(status))); - ret = false; - } else { - DEBUG(0,("%s => 0x%08X\n", oid, id)); - } - - status = dsdb_map_int2oid(id, NULL, &oid); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("0x%08X => %s\n", id, win_errstr(status))); - ret = false; - } else { - DEBUG(0,("0x%08X => %s\n", id, oid)); - } - - oid = "1.2.840.113556.1.4.1716."; - status = dsdb_map_oid2int(oid, &id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s => %s\n", oid, win_errstr(status))); - ret = false; - } else { - DEBUG(0,("%s => 0x%08X\n", oid, id)); - } - - oid = "5435.1.2.840.113556.1.4.1716."; - status = dsdb_map_oid2int(oid, &id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s => %s\n", oid, win_errstr(status))); - ret = false; - } else { - DEBUG(0,("%s => 0x%08X\n", oid, id)); - } - - id = 0xEF001234; - status = dsdb_map_int2oid(id, NULL, &oid); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("0x%08X => %s\n", id, win_errstr(status))); - ret = false; - } else { - DEBUG(0,("0x%08X => %s\n", id, oid)); - } - - return ret; -} - #define GET_STRING(p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, #elem, NULL);\ if (strict && (p)->elem == NULL) { \ -- cgit From 836202f6008de333f22635b3badef328629fab88 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 13:20:57 +0000 Subject: r20224: the struct element msDs_Schema_Extensions and the attribute name "msDs-Schema-Extensions" doesn't match so we need to pass 2 parameters to the GET_BLOB() macro metze (This used to be commit e50cf96fea1318853a8cfc0061afcad9cbad7e2c) --- source4/dsdb/schema/schema_init.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 02f2a18517..228b48907a 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -141,9 +141,9 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) (p)->elem = samdb_result_guid(msg, #elem);\ } while (0) -#define GET_BLOB(p, elem) do { \ +#define GET_BLOB(p, elem, attr) do { \ const struct ldb_val *_val;\ - _val = ldb_msg_find_ldb_val(msg, #elem);\ + _val = ldb_msg_find_ldb_val(msg, attr);\ if (_val) {\ (p)->elem = *_val;\ (void)talloc_steal(p, (p)->elem.data);\ @@ -175,7 +175,7 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str status = dsdb_map_oid2int(attr->attributeSyntax_oid, &attr->attributeSyntax_id); W_ERROR_NOT_OK_RETURN(status); GET_UINT32(attr, oMSyntax); - GET_BLOB(attr, oMObjectClass); + GET_BLOB(attr, oMObjectClass, "oMObjectClass"); GET_BOOL(attr, isSingleValued, True); GET_UINT32(attr, rangeLower); @@ -183,7 +183,7 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str GET_BOOL(attr, extendedCharsAllowed, False); GET_UINT32(attr, schemaFlagsEx); - GET_BLOB(attr, msDs_Schema_Extensions); + GET_BLOB(attr, msDs_Schema_Extensions, "msDs-Schema-Extensions"); GET_BOOL(attr, showInAdvancedViewOnly, False); GET_STRING(attr, adminDisplayName, True); @@ -226,7 +226,7 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct GET_STRING(obj, defaultSecurityDescriptor, False); GET_UINT32(obj, schemaFlagsEx); - GET_BLOB(obj, msDs_Schema_Extensions); + GET_BLOB(obj, msDs_Schema_Extensions, "msDs-Schema-Extensions"); GET_BOOL(obj, showInAdvancedViewOnly, False); GET_STRING(obj, adminDisplayName, True); -- cgit From 7aa96e9960dc1717f47c14f6f0d6d4b8e8e7173d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 13:34:56 +0000 Subject: r20226: rename macros with a _LDB at the end, because I'll add macros with _DS soon metze (This used to be commit e5b67046c255c7dec07acf3ddc158278997502e3) --- source4/dsdb/schema/schema_init.c | 104 +++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 52 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 228b48907a..9dc87e31a9 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -104,7 +104,7 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) return WERR_DS_NO_MSDS_INTID; } -#define GET_STRING(p, elem, strict) do { \ +#define GET_STRING_LDB(msg, p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, #elem, NULL);\ if (strict && (p)->elem == NULL) { \ d_printf("%s: %s == NULL\n", __location__, #elem); \ @@ -113,7 +113,7 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) (void)talloc_steal(p, (p)->elem); \ } while (0) -#define GET_BOOL(p, elem, strict) do { \ +#define GET_BOOL_LDB(msg, p, elem, strict) do { \ const char *str; \ str = samdb_result_string(msg, #elem, NULL);\ if (str == NULL) { \ @@ -133,15 +133,15 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) } \ } while (0) -#define GET_UINT32(p, elem) do { \ +#define GET_UINT32_LDB(msg, p, elem) do { \ (p)->elem = samdb_result_uint(msg, #elem, 0);\ } while (0) -#define GET_GUID(p, elem) do { \ +#define GET_GUID_LDB(msg, p, elem) do { \ (p)->elem = samdb_result_guid(msg, #elem);\ } while (0) -#define GET_BLOB(p, elem, attr) do { \ +#define GET_BLOB_LDB(msg, p, elem, attr) do { \ const struct ldb_val *_val;\ _val = ldb_msg_find_ldb_val(msg, attr);\ if (_val) {\ @@ -156,42 +156,42 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str { WERROR status; - GET_STRING(attr, cn, True); - GET_STRING(attr, lDAPDisplayName, True); - GET_STRING(attr, attributeID_oid, True); + GET_STRING_LDB(msg, attr, cn, True); + GET_STRING_LDB(msg, attr, lDAPDisplayName, True); + GET_STRING_LDB(msg, attr, attributeID_oid, True); status = dsdb_map_oid2int(attr->attributeID_oid, &attr->attributeID_id); W_ERROR_NOT_OK_RETURN(status); - GET_GUID(attr, schemaIDGUID); - GET_UINT32(attr, mAPIID); + GET_GUID_LDB(msg, attr, schemaIDGUID); + GET_UINT32_LDB(msg, attr, mAPIID); - GET_GUID(attr, attributeSecurityGUID); + GET_GUID_LDB(msg, attr, attributeSecurityGUID); - GET_UINT32(attr, searchFlags); - GET_UINT32(attr, systemFlags); - GET_BOOL(attr, isMemberOfPartialAttributeSet, False); - GET_UINT32(attr, linkID); + GET_UINT32_LDB(msg, attr, searchFlags); + GET_UINT32_LDB(msg, attr, systemFlags); + GET_BOOL_LDB(msg, attr, isMemberOfPartialAttributeSet, False); + GET_UINT32_LDB(msg, attr, linkID); - GET_STRING(attr, attributeSyntax_oid, True); + GET_STRING_LDB(msg, attr, attributeSyntax_oid, True); status = dsdb_map_oid2int(attr->attributeSyntax_oid, &attr->attributeSyntax_id); W_ERROR_NOT_OK_RETURN(status); - GET_UINT32(attr, oMSyntax); - GET_BLOB(attr, oMObjectClass, "oMObjectClass"); + GET_UINT32_LDB(msg, attr, oMSyntax); + GET_BLOB_LDB(msg, attr, oMObjectClass, "oMObjectClass"); - GET_BOOL(attr, isSingleValued, True); - GET_UINT32(attr, rangeLower); - GET_UINT32(attr, rangeUpper); - GET_BOOL(attr, extendedCharsAllowed, False); + GET_BOOL_LDB(msg, attr, isSingleValued, True); + GET_UINT32_LDB(msg, attr, rangeLower); + GET_UINT32_LDB(msg, attr, rangeUpper); + GET_BOOL_LDB(msg, attr, extendedCharsAllowed, False); - GET_UINT32(attr, schemaFlagsEx); - GET_BLOB(attr, msDs_Schema_Extensions, "msDs-Schema-Extensions"); + GET_UINT32_LDB(msg, attr, schemaFlagsEx); + GET_BLOB_LDB(msg, attr, msDs_Schema_Extensions, "msDs-Schema-Extensions"); - GET_BOOL(attr, showInAdvancedViewOnly, False); - GET_STRING(attr, adminDisplayName, True); - GET_STRING(attr, adminDescription, True); - GET_STRING(attr, classDisplayName, True); - GET_BOOL(attr, isEphemeral, False); - GET_BOOL(attr, isDefunct, False); - GET_BOOL(attr, systemOnly, False); + GET_BOOL_LDB(msg, attr, showInAdvancedViewOnly, False); + GET_STRING_LDB(msg, attr, adminDisplayName, True); + GET_STRING_LDB(msg, attr, adminDescription, True); + GET_STRING_LDB(msg, attr, classDisplayName, True); + GET_BOOL_LDB(msg, attr, isEphemeral, False); + GET_BOOL_LDB(msg, attr, isDefunct, False); + GET_BOOL_LDB(msg, attr, systemOnly, False); return WERR_OK; } @@ -200,41 +200,41 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct { WERROR status; - GET_STRING(obj, cn, True); - GET_STRING(obj, lDAPDisplayName, True); - GET_STRING(obj, governsID_oid, True); + GET_STRING_LDB(msg, obj, cn, True); + GET_STRING_LDB(msg, obj, lDAPDisplayName, True); + GET_STRING_LDB(msg, obj, governsID_oid, True); status = dsdb_map_oid2int(obj->governsID_oid, &obj->governsID_id); W_ERROR_NOT_OK_RETURN(status); - GET_GUID(obj, schemaIDGUID); + GET_GUID_LDB(msg, obj, schemaIDGUID); - GET_UINT32(obj, objectClassCategory); - GET_STRING(obj, rDNAttID, True); - GET_STRING(obj, defaultObjectCategory, True); + GET_UINT32_LDB(msg, obj, objectClassCategory); + GET_STRING_LDB(msg, obj, rDNAttID, True); + GET_STRING_LDB(msg, obj, defaultObjectCategory, True); + + GET_STRING_LDB(msg, obj, subClassOf, True); - GET_STRING(obj, subClassOf, True); - - GET_STRING(obj, systemAuxiliaryClass, False); + GET_STRING_LDB(msg, obj, systemAuxiliaryClass, False); obj->systemPossSuperiors= NULL; obj->systemMustContain = NULL; obj->systemMayContain = NULL; - GET_STRING(obj, auxiliaryClass, False); + GET_STRING_LDB(msg, obj, auxiliaryClass, False); obj->possSuperiors = NULL; obj->mustContain = NULL; obj->mayContain = NULL; - GET_STRING(obj, defaultSecurityDescriptor, False); + GET_STRING_LDB(msg, obj, defaultSecurityDescriptor, False); - GET_UINT32(obj, schemaFlagsEx); - GET_BLOB(obj, msDs_Schema_Extensions, "msDs-Schema-Extensions"); + GET_UINT32_LDB(msg, obj, schemaFlagsEx); + GET_BLOB_LDB(msg, obj, msDs_Schema_Extensions, "msDs-Schema-Extensions"); - GET_BOOL(obj, showInAdvancedViewOnly, False); - GET_STRING(obj, adminDisplayName, True); - GET_STRING(obj, adminDescription, True); - GET_STRING(obj, classDisplayName, True); - GET_BOOL(obj, defaultHidingValue, True); - GET_BOOL(obj, isDefunct, False); - GET_BOOL(obj, systemOnly, False); + GET_BOOL_LDB(msg, obj, showInAdvancedViewOnly, False); + GET_STRING_LDB(msg, obj, adminDisplayName, True); + GET_STRING_LDB(msg, obj, adminDescription, True); + GET_STRING_LDB(msg, obj, classDisplayName, True); + GET_BOOL_LDB(msg, obj, defaultHidingValue, True); + GET_BOOL_LDB(msg, obj, isDefunct, False); + GET_BOOL_LDB(msg, obj, systemOnly, False); return WERR_OK; } -- cgit From 549b56b89d36103e6596945fe5d42351a354ab94 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 20:11:40 +0000 Subject: r20231: - add more oid => uint32 id mappings - handle the case where mappings for 1.2.3.4. and 1.2.3.4.5. prefixes exist - extend test suite for the mappings metze (This used to be commit 3af0a9b2c490ed1e4cd0af7faf814823bc60c264) --- source4/dsdb/schema/schema_init.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 9dc87e31a9..05669f6171 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -41,9 +41,13 @@ static const struct { _PREFIX(0x00150000, "0.9.2342.19200300.100.1."), _PREFIX(0x00160000, "2.16.840.1.113730.3.1."), _PREFIX(0x00170000, "1.2.840.113556.1.5.7000."), + _PREFIX(0x00180000, "2.5.21."), + _PREFIX(0x00190000, "2.5.18."), _PREFIX(0x001A0000, "2.5.20."), + _PREFIX(0x001B0000, "1.3.6.1.4.1.1466.101.119."), _PREFIX(0x001C0000, "2.16.840.1.113730.3.2."), _PREFIX(0x001D0000, "1.3.6.1.4.1.250.1."), + _PREFIX(0x001E0000, "1.2.840.113549.1.9."), _PREFIX(0x001F0000, "0.9.2342.19200300.100.4."), }; @@ -68,8 +72,19 @@ WERROR dsdb_map_oid2int(const char *in, uint32_t *out) return WERR_INVALID_PARAM; } + /* two '.' chars are invalid */ + if (val_str[0] == '.') { + return WERR_INVALID_PARAM; + } + val = strtoul(val_str, &end_str, 10); - if (end_str[0] != '\0') { + if (end_str[0] == '.' && end_str[1] != '\0') { + /* + * if it's a '.' and not the last char + * then maybe an other mapping apply + */ + continue; + } else if (end_str[0] != '\0') { return WERR_INVALID_PARAM; } else if (val > 0xFFFF) { return WERR_INVALID_PARAM; -- cgit From e666389c36707cde98620c0bac56c0279606fd87 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 20:19:06 +0000 Subject: r20232: specify attribute name and structure element name always together there're a view elements where both values doesn't match LDAP-SCHEMA now successful loads the schema metze (This used to be commit 5d7827f45ec05acaca28c94fd6a5d25f148d011c) --- source4/dsdb/schema/schema_init.c | 147 +++++++++++++++++++++----------------- 1 file changed, 81 insertions(+), 66 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 05669f6171..2b0d1e5ee0 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -119,21 +119,21 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) return WERR_DS_NO_MSDS_INTID; } -#define GET_STRING_LDB(msg, p, elem, strict) do { \ - (p)->elem = samdb_result_string(msg, #elem, NULL);\ +#define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ + (p)->elem = samdb_result_string(msg, attr, NULL);\ if (strict && (p)->elem == NULL) { \ - d_printf("%s: %s == NULL\n", __location__, #elem); \ + d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - (void)talloc_steal(p, (p)->elem); \ + talloc_steal(mem_ctx, (p)->elem); \ } while (0) -#define GET_BOOL_LDB(msg, p, elem, strict) do { \ +#define GET_BOOL_LDB(msg, attr, p, elem, strict) do { \ const char *str; \ - str = samdb_result_string(msg, #elem, NULL);\ + str = samdb_result_string(msg, attr, NULL);\ if (str == NULL) { \ if (strict) { \ - d_printf("%s: %s == NULL\n", __location__, #elem); \ + d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } else { \ (p)->elem = False; \ @@ -143,25 +143,25 @@ WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) } else if (strcasecmp("FALSE", str) == 0) { \ (p)->elem = False; \ } else { \ - d_printf("%s: %s == %s\n", __location__, #elem, str); \ + d_printf("%s: %s == %s\n", __location__, attr, str); \ return WERR_INVALID_PARAM; \ } \ } while (0) -#define GET_UINT32_LDB(msg, p, elem) do { \ - (p)->elem = samdb_result_uint(msg, #elem, 0);\ +#define GET_UINT32_LDB(msg, attr, p, elem) do { \ + (p)->elem = samdb_result_uint(msg, attr, 0);\ } while (0) -#define GET_GUID_LDB(msg, p, elem) do { \ - (p)->elem = samdb_result_guid(msg, #elem);\ +#define GET_GUID_LDB(msg, attr, p, elem) do { \ + (p)->elem = samdb_result_guid(msg, attr);\ } while (0) -#define GET_BLOB_LDB(msg, p, elem, attr) do { \ +#define GET_BLOB_LDB(msg, attr, mem_ctx, p, elem) do { \ const struct ldb_val *_val;\ _val = ldb_msg_find_ldb_val(msg, attr);\ if (_val) {\ (p)->elem = *_val;\ - (void)talloc_steal(p, (p)->elem.data);\ + talloc_steal(mem_ctx, (p)->elem.data);\ } else {\ ZERO_STRUCT((p)->elem);\ }\ @@ -171,42 +171,52 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str { WERROR status; - GET_STRING_LDB(msg, attr, cn, True); - GET_STRING_LDB(msg, attr, lDAPDisplayName, True); - GET_STRING_LDB(msg, attr, attributeID_oid, True); + GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, True); + GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); + GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); status = dsdb_map_oid2int(attr->attributeID_oid, &attr->attributeID_id); - W_ERROR_NOT_OK_RETURN(status); - GET_GUID_LDB(msg, attr, schemaIDGUID); - GET_UINT32_LDB(msg, attr, mAPIID); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeID '%s': %s\n", + __location__, attr->lDAPDisplayName, attr->attributeID_oid, + win_errstr(status))); + return status; + } + GET_GUID_LDB(msg, "schemaIDGUID", attr, schemaIDGUID); + GET_UINT32_LDB(msg, "mAPIID", attr, mAPIID); - GET_GUID_LDB(msg, attr, attributeSecurityGUID); + GET_GUID_LDB(msg, "attributeSecurityGUID", attr, attributeSecurityGUID); - GET_UINT32_LDB(msg, attr, searchFlags); - GET_UINT32_LDB(msg, attr, systemFlags); - GET_BOOL_LDB(msg, attr, isMemberOfPartialAttributeSet, False); - GET_UINT32_LDB(msg, attr, linkID); + GET_UINT32_LDB(msg, "searchFlags", attr, searchFlags); + GET_UINT32_LDB(msg, "systemFlags", attr, systemFlags); + GET_BOOL_LDB(msg, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); + GET_UINT32_LDB(msg, "linkID", attr, linkID); - GET_STRING_LDB(msg, attr, attributeSyntax_oid, True); + GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, True); status = dsdb_map_oid2int(attr->attributeSyntax_oid, &attr->attributeSyntax_id); - W_ERROR_NOT_OK_RETURN(status); - GET_UINT32_LDB(msg, attr, oMSyntax); - GET_BLOB_LDB(msg, attr, oMObjectClass, "oMObjectClass"); - - GET_BOOL_LDB(msg, attr, isSingleValued, True); - GET_UINT32_LDB(msg, attr, rangeLower); - GET_UINT32_LDB(msg, attr, rangeUpper); - GET_BOOL_LDB(msg, attr, extendedCharsAllowed, False); - - GET_UINT32_LDB(msg, attr, schemaFlagsEx); - GET_BLOB_LDB(msg, attr, msDs_Schema_Extensions, "msDs-Schema-Extensions"); - - GET_BOOL_LDB(msg, attr, showInAdvancedViewOnly, False); - GET_STRING_LDB(msg, attr, adminDisplayName, True); - GET_STRING_LDB(msg, attr, adminDescription, True); - GET_STRING_LDB(msg, attr, classDisplayName, True); - GET_BOOL_LDB(msg, attr, isEphemeral, False); - GET_BOOL_LDB(msg, attr, isDefunct, False); - GET_BOOL_LDB(msg, attr, systemOnly, False); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeSyntax '%s': %s\n", + __location__, attr->lDAPDisplayName, attr->attributeSyntax_oid, + win_errstr(status))); + return status; + } + GET_UINT32_LDB(msg, "oMSyntax", attr, oMSyntax); + GET_BLOB_LDB(msg, "oMObjectClass", mem_ctx, attr, oMObjectClass); + + GET_BOOL_LDB(msg, "isSingleValued", attr, isSingleValued, True); + GET_UINT32_LDB(msg, "rangeLower", attr, rangeLower); + GET_UINT32_LDB(msg, "rangeUpper", attr, rangeUpper); + GET_BOOL_LDB(msg, "extendedCharsAllowed", attr, extendedCharsAllowed, False); + + GET_UINT32_LDB(msg, "schemaFlagsEx", attr, schemaFlagsEx); + GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); + + GET_BOOL_LDB(msg, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); + GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); + GET_STRING_LDB(msg, "adminDescription", mem_ctx, attr, adminDescription, False); + GET_STRING_LDB(msg, "classDisplayName", mem_ctx, attr, classDisplayName, False); + GET_BOOL_LDB(msg, "isEphemeral", attr, isEphemeral, False); + GET_BOOL_LDB(msg, "isDefunct", attr, isDefunct, False); + GET_BOOL_LDB(msg, "systemOnly", attr, systemOnly, False); return WERR_OK; } @@ -215,41 +225,46 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct { WERROR status; - GET_STRING_LDB(msg, obj, cn, True); - GET_STRING_LDB(msg, obj, lDAPDisplayName, True); - GET_STRING_LDB(msg, obj, governsID_oid, True); + GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, True); + GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); + GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); status = dsdb_map_oid2int(obj->governsID_oid, &obj->governsID_id); - W_ERROR_NOT_OK_RETURN(status); - GET_GUID_LDB(msg, obj, schemaIDGUID); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map governsID '%s': %s\n", + __location__, obj->lDAPDisplayName, obj->governsID_oid, + win_errstr(status))); + return status; + } + GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID); - GET_UINT32_LDB(msg, obj, objectClassCategory); - GET_STRING_LDB(msg, obj, rDNAttID, True); - GET_STRING_LDB(msg, obj, defaultObjectCategory, True); + GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory); + GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, True); + GET_STRING_LDB(msg, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); - GET_STRING_LDB(msg, obj, subClassOf, True); + GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, True); - GET_STRING_LDB(msg, obj, systemAuxiliaryClass, False); + GET_STRING_LDB(msg, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); obj->systemPossSuperiors= NULL; obj->systemMustContain = NULL; obj->systemMayContain = NULL; - GET_STRING_LDB(msg, obj, auxiliaryClass, False); + GET_STRING_LDB(msg, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); obj->possSuperiors = NULL; obj->mustContain = NULL; obj->mayContain = NULL; - GET_STRING_LDB(msg, obj, defaultSecurityDescriptor, False); + GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); - GET_UINT32_LDB(msg, obj, schemaFlagsEx); - GET_BLOB_LDB(msg, obj, msDs_Schema_Extensions, "msDs-Schema-Extensions"); + GET_UINT32_LDB(msg, "schemaFlagsEx", obj, schemaFlagsEx); + GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); - GET_BOOL_LDB(msg, obj, showInAdvancedViewOnly, False); - GET_STRING_LDB(msg, obj, adminDisplayName, True); - GET_STRING_LDB(msg, obj, adminDescription, True); - GET_STRING_LDB(msg, obj, classDisplayName, True); - GET_BOOL_LDB(msg, obj, defaultHidingValue, True); - GET_BOOL_LDB(msg, obj, isDefunct, False); - GET_BOOL_LDB(msg, obj, systemOnly, False); + GET_BOOL_LDB(msg, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); + GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); + GET_STRING_LDB(msg, "adminDescription", mem_ctx, obj, adminDescription, False); + GET_STRING_LDB(msg, "classDisplayName", mem_ctx, obj, classDisplayName, False); + GET_BOOL_LDB(msg, "defaultHidingValue", obj, defaultHidingValue, False); + GET_BOOL_LDB(msg, "isDefunct", obj, isDefunct, False); + GET_BOOL_LDB(msg, "systemOnly", obj, systemOnly, False); return WERR_OK; } -- cgit From 291271f226057a6aed692e34fc52f0565caa55dc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 17 Dec 2006 21:58:49 +0000 Subject: r20233: add functions to create a dsdb_attribute and dsdb_class from a drsuapi_DsReplicaObject metze (This used to be commit 9168236ddd3d8ed9daa1e47be1e6b12d2bc348b6) --- source4/dsdb/schema/schema_init.c | 264 +++++++++++++++++++++++++++++++++++++- 1 file changed, 263 insertions(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 2b0d1e5ee0..c5304824a9 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -23,6 +23,7 @@ #include "includes.h" #include "dsdb/samdb/samdb.h" #include "lib/util/dlinklist.h" +#include "librpc/gen_ndr/drsuapi.h" #define _PREFIX(uint32, oid) {uint32,oid,sizeof(oid)} static const struct { @@ -238,7 +239,7 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID); GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory); - GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, True); + GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, False); GET_STRING_LDB(msg, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, True); @@ -268,3 +269,264 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct return WERR_OK; } + +static const struct { + const char *name; + const char *oid; +} name_mappings[] = { + { "cn", "2.5.4.3" }, + { "name", "1.2.840.113556.1.4.1" }, + { "lDAPDisplayName", "1.2.840.113556.1.2.460" }, + { "attributeID", "1.2.840.113556.1.2.30" }, + { "schemaIDGUID", "1.2.840.113556.1.4.148" }, + { "mAPIID", "1.2.840.113556.1.2.49" }, + { "attributeSecurityGUID", "1.2.840.113556.1.4.149" }, + { "searchFlags", "1.2.840.113556.1.2.334" }, + { "systemFlags", "1.2.840.113556.1.4.375" }, + { "isMemberOfPartialAttributeSet", "1.2.840.113556.1.4.639" }, + { "linkID", "1.2.840.113556.1.2.50" }, + { "attributeSyntax", "1.2.840.113556.1.2.30" }, + { "oMSyntax", "1.2.840.113556.1.2.231" }, + { "oMObjectClass", "1.2.840.113556.1.2.218" }, + { "isSingleValued", "1.2.840.113556.1.2.33" }, + { "rangeLower", "1.2.840.113556.1.2.34" }, + { "rangeUpper", "1.2.840.113556.1.2.35" }, + { "extendedCharsAllowed", "1.2.840.113556.1.2.380" }, + { "schemaFlagsEx", "1.2.840.113556.1.4.120" }, + { "msDs-Schema-Extensions", "1.2.840.113556.1.4.1440" }, + { "showInAdvancedViewOnly", "1.2.840.113556.1.2.169" }, + { "adminDisplayName", "1.2.840.113556.1.2.194" }, + { "adminDescription", "1.2.840.113556.1.2.226" }, + { "classDisplayName", "1.2.840.113556.1.4.610" }, + { "isEphemeral", "1.2.840.113556.1.4.1212" }, + { "isDefunct", "1.2.840.113556.1.4.661" }, + { "systemOnly", "1.2.840.113556.1.4.170" }, + { "governsID", "1.2.840.113556.1.2.22" }, + { "objectClassCategory", "1.2.840.113556.1.2.370" }, + { "rDNAttID", "1.2.840.113556.1.2.26" }, + { "defaultObjectCategory", "1.2.840.113556.1.4.783" }, + { "subClassOf", "1.2.840.113556.1.2.21" }, + { "systemAuxiliaryClass", "1.2.840.113556.1.4.198" }, + { "systemPossSuperiors", "1.2.840.113556.1.4.195" }, + { "systemMustContain", "1.2.840.113556.1.4.197" }, + { "systemMayContain", "1.2.840.113556.1.4.196" }, + { "auxiliaryClass", "1.2.840.113556.1.2.351" }, + { "possSuperiors", "1.2.840.113556.1.2.8" }, + { "mustContain", "1.2.840.113556.1.2.24" }, + { "mayContain", "1.2.840.113556.1.2.25" }, + { "defaultSecurityDescriptor", "1.2.840.113556.1.4.224" }, + { "defaultHidingValue", "1.2.840.113556.1.4.518" }, +}; + +static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsuapi_DsReplicaObject *obj, + const char *name, + uint32_t *idx) +{ + WERROR status; + uint32_t i, id; + const char *oid = NULL; + + for(i=0; i < ARRAY_SIZE(name_mappings); i++) { + if (strcmp(name_mappings[i].name, name) != 0) continue; + + oid = name_mappings[i].oid; + break; + } + + if (!oid) { + return NULL; + } + + status = dsdb_map_oid2int(oid, &id); + if (!W_ERROR_IS_OK(status)) { + return NULL; + } + + for (i=0; i < obj->attribute_ctr.num_attributes; i++) { + if (obj->attribute_ctr.attributes[i].attid != id) continue; + + if (idx) *idx = i; + return &obj->attribute_ctr.attributes[i]; + } + + return NULL; +} + +#define GET_STRING_DS(r, attr, mem_ctx, p, elem, strict) do { \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(r, attr, NULL); \ + if (strict && !_a) { \ + d_printf("%s: %s == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } \ + if (strict && _a->value_ctr.unicode_string.num_values != 1) { \ + d_printf("%s: %s num_values == %u\n", __location__, attr, \ + _a->value_ctr.unicode_string.num_values); \ + return WERR_INVALID_PARAM; \ + } \ + if (_a && _a->value_ctr.unicode_string.num_values >= 1) { \ + (p)->elem = talloc_steal(mem_ctx, _a->value_ctr.unicode_string.values[0].string);\ + } else { \ + (p)->elem = NULL; \ + } \ +} while (0) + +#define GET_BOOL_DS(r, attr, p, elem, strict) do { \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(r, attr, NULL); \ + if (strict && !_a) { \ + d_printf("%s: %s == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } \ + if (strict && _a->value_ctr.uint32.num_values != 1) { \ + d_printf("%s: %s num_values == %u\n", __location__, attr, \ + _a->value_ctr.uint32.num_values); \ + return WERR_INVALID_PARAM; \ + } \ + if (strict && !_a->value_ctr.uint32.values[0].value) { \ + d_printf("%s: %s value == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } \ + if (_a && _a->value_ctr.uint32.num_values >= 1 \ + && _a->value_ctr.uint32.values[0].value) { \ + (p)->elem = (*_a->value_ctr.uint32.values[0].value?True:False);\ + } else { \ + (p)->elem = False; \ + } \ +} while (0) + +#define GET_UINT32_DS(r, attr, p, elem) do { \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(r, attr, NULL); \ + if (_a && _a->value_ctr.uint32.num_values >= 1 \ + && _a->value_ctr.uint32.values[0].value) { \ + (p)->elem = *_a->value_ctr.uint32.values[0].value;\ + } else { \ + (p)->elem = 0; \ + } \ +} while (0) + +#define GET_GUID_DS(r, attr, p, elem) do { \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(r, attr, NULL); \ + if (_a && _a->value_ctr.guid.num_values >= 1 \ + && _a->value_ctr.guid.values[0].guid) { \ + (p)->elem = *_a->value_ctr.guid.values[0].guid;\ + } else { \ + ZERO_STRUCT((p)->elem);\ + } \ +} while (0) + +#define GET_BLOB_DS(r, attr, mem_ctx, p, elem) do { \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(r, attr, NULL); \ + if (_a && _a->value_ctr.data_blob.num_values >= 1 \ + && _a->value_ctr.data_blob.values[0].data) { \ + (p)->elem = *_a->value_ctr.data_blob.values[0].data;\ + talloc_steal(mem_ctx, (p)->elem.data); \ + } else { \ + ZERO_STRUCT((p)->elem);\ + }\ +} while (0) + +WERROR dsdb_attribute_from_drsuapi(struct drsuapi_DsReplicaObject *r, TALLOC_CTX *mem_ctx, struct dsdb_attribute *attr) +{ + WERROR status; + + GET_STRING_DS(r, "name", mem_ctx, attr, cn, True); + GET_STRING_DS(r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); + GET_UINT32_DS(r, "attributeID", attr, attributeID_id); + status = dsdb_map_int2oid(attr->attributeID_id, mem_ctx, &attr->attributeID_oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeID 0x%08X: %s\n", + __location__, attr->lDAPDisplayName, attr->attributeID_id, + win_errstr(status))); + return status; + } + GET_GUID_DS(r, "schemaIDGUID", attr, schemaIDGUID); + GET_UINT32_DS(r, "mAPIID", attr, mAPIID); + + GET_GUID_DS(r, "attributeSecurityGUID", attr, attributeSecurityGUID); + + GET_UINT32_DS(r, "searchFlags", attr, searchFlags); + GET_UINT32_DS(r, "systemFlags", attr, systemFlags); + GET_BOOL_DS(r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); + GET_UINT32_DS(r, "linkID", attr, linkID); + + GET_UINT32_DS(r, "attributeSyntax", attr, attributeSyntax_id); + status = dsdb_map_int2oid(attr->attributeSyntax_id, mem_ctx, &attr->attributeSyntax_oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeSyntax 0x%08X: %s\n", + __location__, attr->lDAPDisplayName, attr->attributeSyntax_id, + win_errstr(status))); + return status; + } + GET_UINT32_DS(r, "oMSyntax", attr, oMSyntax); + GET_BLOB_DS(r, "oMObjectClass", mem_ctx, attr, oMObjectClass); + + GET_BOOL_DS(r, "isSingleValued", attr, isSingleValued, True); + GET_UINT32_DS(r, "rangeLower", attr, rangeLower); + GET_UINT32_DS(r, "rangeUpper", attr, rangeUpper); + GET_BOOL_DS(r, "extendedCharsAllowed", attr, extendedCharsAllowed, False); + + GET_UINT32_DS(r, "schemaFlagsEx", attr, schemaFlagsEx); + GET_BLOB_DS(r, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); + + GET_BOOL_DS(r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); + GET_STRING_DS(r, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); + GET_STRING_DS(r, "adminDescription", mem_ctx, attr, adminDescription, False); + GET_STRING_DS(r, "classDisplayName", mem_ctx, attr, classDisplayName, False); + GET_BOOL_DS(r, "isEphemeral", attr, isEphemeral, False); + GET_BOOL_DS(r, "isDefunct", attr, isDefunct, False); + GET_BOOL_DS(r, "systemOnly", attr, systemOnly, False); + + return WERR_OK; +} + +WERROR dsdb_class_from_drsuapi(struct drsuapi_DsReplicaObject *r, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) +{ + WERROR status; + + GET_STRING_DS(r, "name", mem_ctx, obj, cn, True); + GET_STRING_DS(r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); + GET_UINT32_DS(r, "governsID", obj, governsID_id); + status = dsdb_map_int2oid(obj->governsID_id, mem_ctx, &obj->governsID_oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map governsID 0x%08X: %s\n", + __location__, obj->lDAPDisplayName, obj->governsID_id, + win_errstr(status))); + return status; + } + GET_GUID_DS(r, "schemaIDGUID", obj, schemaIDGUID); + + GET_UINT32_DS(r, "objectClassCategory", obj, objectClassCategory); + GET_STRING_DS(r, "rDNAttID", mem_ctx, obj, rDNAttID, False); + GET_STRING_DS(r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); + + GET_STRING_DS(r, "subClassOf", mem_ctx, obj, subClassOf, True); + + GET_STRING_DS(r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); + obj->systemPossSuperiors= NULL; + obj->systemMustContain = NULL; + obj->systemMayContain = NULL; + + GET_STRING_DS(r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); + obj->possSuperiors = NULL; + obj->mustContain = NULL; + obj->mayContain = NULL; + + GET_STRING_DS(r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); + + GET_UINT32_DS(r, "schemaFlagsEx", obj, schemaFlagsEx); + GET_BLOB_DS(r, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); + + GET_BOOL_DS(r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); + GET_STRING_DS(r, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); + GET_STRING_DS(r, "adminDescription", mem_ctx, obj, adminDescription, False); + GET_STRING_DS(r, "classDisplayName", mem_ctx, obj, classDisplayName, False); + GET_BOOL_DS(r, "defaultHidingValue", obj, defaultHidingValue, False); + GET_BOOL_DS(r, "isDefunct", obj, isDefunct, False); + GET_BOOL_DS(r, "systemOnly", obj, systemOnly, False); + + return WERR_OK; +} -- cgit From 97d066464b68f0414c658693d3b768279906bf97 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 21 Dec 2006 20:51:50 +0000 Subject: r20306: remove the static oid mapping table and attach the table to the dsdb_schema metze (This used to be commit df63995ec5f322d17145664c1f174783861e1723) --- source4/dsdb/schema/schema_init.c | 246 ++++++++++++++++++++------------------ 1 file changed, 127 insertions(+), 119 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c5304824a9..b5e0a8e1c9 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -25,47 +25,63 @@ #include "lib/util/dlinklist.h" #include "librpc/gen_ndr/drsuapi.h" -#define _PREFIX(uint32, oid) {uint32,oid,sizeof(oid)} -static const struct { - uint32_t uint32; - const char *oid; - size_t oid_len; -} prefix_mappings[] = { - _PREFIX(0x00000000, "2.5.4."), - _PREFIX(0x00010000, "2.5.6."), - _PREFIX(0x00020000, "1.2.840.113556.1.2."), - _PREFIX(0x00030000, "1.2.840.113556.1.3."), - _PREFIX(0x00080000, "2.5.5."), - _PREFIX(0x00090000, "1.2.840.113556.1.4."), - _PREFIX(0x000A0000, "1.2.840.113556.1.5."), - _PREFIX(0x00140000, "2.16.840.1.113730.3."), - _PREFIX(0x00150000, "0.9.2342.19200300.100.1."), - _PREFIX(0x00160000, "2.16.840.1.113730.3.1."), - _PREFIX(0x00170000, "1.2.840.113556.1.5.7000."), - _PREFIX(0x00180000, "2.5.21."), - _PREFIX(0x00190000, "2.5.18."), - _PREFIX(0x001A0000, "2.5.20."), - _PREFIX(0x001B0000, "1.3.6.1.4.1.1466.101.119."), - _PREFIX(0x001C0000, "2.16.840.1.113730.3.2."), - _PREFIX(0x001D0000, "1.3.6.1.4.1.250.1."), - _PREFIX(0x001E0000, "1.2.840.113549.1.9."), - _PREFIX(0x001F0000, "0.9.2342.19200300.100.4."), -}; +WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) +{ + uint32_t i,j; + + schema->prefixes = talloc_array(schema, struct dsdb_schema_oid_prefix, ctr->num_mappings); + W_ERROR_HAVE_NO_MEMORY(schema->prefixes); + + for (i=0, j=0; i < ctr->num_mappings; i++) { + if (ctr->mappings[i].oid.oid == NULL) { + return WERR_INVALID_PARAM; + } + + if (strncasecmp(ctr->mappings[i].oid.oid, "ff", 2) == 0) { + if (ctr->mappings[i].id_prefix != 0) { + return WERR_INVALID_PARAM; + } + + /* the magic value should be in the last array member */ + if (i != (ctr->num_mappings - 1)) { + return WERR_INVALID_PARAM; + } + + schema->unknown_magic = talloc_strdup(schema, ctr->mappings[i].oid.oid); + W_ERROR_HAVE_NO_MEMORY(schema->unknown_magic); + } else { + /* the last array member should contain the magic value not a oid */ + if (i == (ctr->num_mappings - 1)) { + return WERR_INVALID_PARAM; + } + + schema->prefixes[j].id = ctr->mappings[i].id_prefix<<16; + schema->prefixes[j].oid = talloc_asprintf(schema->prefixes, "%s.", + ctr->mappings[i].oid.oid); + W_ERROR_HAVE_NO_MEMORY(schema->prefixes[j].oid); + schema->prefixes[j].oid_len = strlen(schema->prefixes[j].oid); + j++; + } + } + + schema->num_prefixes = j; + return WERR_OK; +} -WERROR dsdb_map_oid2int(const char *in, uint32_t *out) +WERROR dsdb_map_oid2int(struct dsdb_schema *schema, const char *in, uint32_t *out) { uint32_t i; - for (i=0; i < ARRAY_SIZE(prefix_mappings); i++) { + for (i=0; i < schema->num_prefixes; i++) { const char *val_str; char *end_str; unsigned val; - if (strncmp(prefix_mappings[i].oid, in, prefix_mappings[i].oid_len - 1) != 0) { + if (strncmp(schema->prefixes[i].oid, in, schema->prefixes[i].oid_len) != 0) { continue; } - val_str = in + prefix_mappings[i].oid_len - 1; + val_str = in + schema->prefixes[i].oid_len; end_str = NULL; errno = 0; @@ -91,25 +107,25 @@ WERROR dsdb_map_oid2int(const char *in, uint32_t *out) return WERR_INVALID_PARAM; } - *out = prefix_mappings[i].uint32 | val; + *out = schema->prefixes[i].id | val; return WERR_OK; } return WERR_DS_NO_MSDS_INTID; } -WERROR dsdb_map_int2oid(uint32_t in, TALLOC_CTX *mem_ctx, const char **out) +WERROR dsdb_map_int2oid(struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out) { uint32_t i; - for (i=0; i < ARRAY_SIZE(prefix_mappings); i++) { + for (i=0; i < schema->num_prefixes; i++) { const char *val; - if (prefix_mappings[i].uint32 != (in & 0xFFFF0000)) { + if (schema->prefixes[i].id != (in & 0xFFFF0000)) { continue; } val = talloc_asprintf(mem_ctx, "%s%u", - prefix_mappings[i].oid, + schema->prefixes[i].oid, in & 0xFFFF); W_ERROR_HAVE_NO_MEMORY(val); @@ -175,13 +191,8 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); - status = dsdb_map_oid2int(attr->attributeID_oid, &attr->attributeID_id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s: '%s': unable to map attributeID '%s': %s\n", - __location__, attr->lDAPDisplayName, attr->attributeID_oid, - win_errstr(status))); - return status; - } + /* set an invalid value */ + attr->attributeID_id = 0xFFFFFFFF; GET_GUID_LDB(msg, "schemaIDGUID", attr, schemaIDGUID); GET_UINT32_LDB(msg, "mAPIID", attr, mAPIID); @@ -193,13 +204,8 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str GET_UINT32_LDB(msg, "linkID", attr, linkID); GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, True); - status = dsdb_map_oid2int(attr->attributeSyntax_oid, &attr->attributeSyntax_id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s: '%s': unable to map attributeSyntax '%s': %s\n", - __location__, attr->lDAPDisplayName, attr->attributeSyntax_oid, - win_errstr(status))); - return status; - } + /* set an invalid value */ + attr->attributeSyntax_id = 0xFFFFFFFF; GET_UINT32_LDB(msg, "oMSyntax", attr, oMSyntax); GET_BLOB_LDB(msg, "oMObjectClass", mem_ctx, attr, oMObjectClass); @@ -229,13 +235,8 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); - status = dsdb_map_oid2int(obj->governsID_oid, &obj->governsID_id); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("%s: '%s': unable to map governsID '%s': %s\n", - __location__, obj->lDAPDisplayName, obj->governsID_oid, - win_errstr(status))); - return status; - } + /* set an invalid value */ + obj->governsID_id = 0xFFFFFFFF; GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID); GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory); @@ -318,7 +319,8 @@ static const struct { { "defaultHidingValue", "1.2.840.113556.1.4.518" }, }; -static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsuapi_DsReplicaObject *obj, +static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb_schema *schema, + struct drsuapi_DsReplicaObject *obj, const char *name, uint32_t *idx) { @@ -337,7 +339,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu return NULL; } - status = dsdb_map_oid2int(oid, &id); + status = dsdb_map_oid2int(schema, oid, &id); if (!W_ERROR_IS_OK(status)) { return NULL; } @@ -352,9 +354,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu return NULL; } -#define GET_STRING_DS(r, attr, mem_ctx, p, elem, strict) do { \ +#define GET_STRING_DS(s, r, attr, mem_ctx, p, elem, strict) do { \ struct drsuapi_DsReplicaAttribute *_a; \ - _a = dsdb_find_object_attr_name(r, attr, NULL); \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ if (strict && !_a) { \ d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ @@ -371,9 +373,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu } \ } while (0) -#define GET_BOOL_DS(r, attr, p, elem, strict) do { \ +#define GET_BOOL_DS(s, r, attr, p, elem, strict) do { \ struct drsuapi_DsReplicaAttribute *_a; \ - _a = dsdb_find_object_attr_name(r, attr, NULL); \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ if (strict && !_a) { \ d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ @@ -395,9 +397,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu } \ } while (0) -#define GET_UINT32_DS(r, attr, p, elem) do { \ +#define GET_UINT32_DS(s, r, attr, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ - _a = dsdb_find_object_attr_name(r, attr, NULL); \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ if (_a && _a->value_ctr.uint32.num_values >= 1 \ && _a->value_ctr.uint32.values[0].value) { \ (p)->elem = *_a->value_ctr.uint32.values[0].value;\ @@ -406,9 +408,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu } \ } while (0) -#define GET_GUID_DS(r, attr, p, elem) do { \ +#define GET_GUID_DS(s, r, attr, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ - _a = dsdb_find_object_attr_name(r, attr, NULL); \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ if (_a && _a->value_ctr.guid.num_values >= 1 \ && _a->value_ctr.guid.values[0].guid) { \ (p)->elem = *_a->value_ctr.guid.values[0].guid;\ @@ -417,9 +419,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu } \ } while (0) -#define GET_BLOB_DS(r, attr, mem_ctx, p, elem) do { \ +#define GET_BLOB_DS(s, r, attr, mem_ctx, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ - _a = dsdb_find_object_attr_name(r, attr, NULL); \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ if (_a && _a->value_ctr.data_blob.num_values >= 1 \ && _a->value_ctr.data_blob.values[0].data) { \ (p)->elem = *_a->value_ctr.data_blob.values[0].data;\ @@ -429,104 +431,110 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct drsu }\ } while (0) -WERROR dsdb_attribute_from_drsuapi(struct drsuapi_DsReplicaObject *r, TALLOC_CTX *mem_ctx, struct dsdb_attribute *attr) +WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, + struct drsuapi_DsReplicaObject *r, + TALLOC_CTX *mem_ctx, + struct dsdb_attribute *attr) { WERROR status; - GET_STRING_DS(r, "name", mem_ctx, attr, cn, True); - GET_STRING_DS(r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); - GET_UINT32_DS(r, "attributeID", attr, attributeID_id); - status = dsdb_map_int2oid(attr->attributeID_id, mem_ctx, &attr->attributeID_oid); + GET_STRING_DS(schema, r, "name", mem_ctx, attr, cn, True); + GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); + GET_UINT32_DS(schema, r, "attributeID", attr, attributeID_id); + status = dsdb_map_int2oid(schema, attr->attributeID_id, mem_ctx, &attr->attributeID_oid); if (!W_ERROR_IS_OK(status)) { DEBUG(0,("%s: '%s': unable to map attributeID 0x%08X: %s\n", __location__, attr->lDAPDisplayName, attr->attributeID_id, win_errstr(status))); return status; } - GET_GUID_DS(r, "schemaIDGUID", attr, schemaIDGUID); - GET_UINT32_DS(r, "mAPIID", attr, mAPIID); + GET_GUID_DS(schema, r, "schemaIDGUID", attr, schemaIDGUID); + GET_UINT32_DS(schema, r, "mAPIID", attr, mAPIID); - GET_GUID_DS(r, "attributeSecurityGUID", attr, attributeSecurityGUID); + GET_GUID_DS(schema, r, "attributeSecurityGUID", attr, attributeSecurityGUID); - GET_UINT32_DS(r, "searchFlags", attr, searchFlags); - GET_UINT32_DS(r, "systemFlags", attr, systemFlags); - GET_BOOL_DS(r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); - GET_UINT32_DS(r, "linkID", attr, linkID); + GET_UINT32_DS(schema, r, "searchFlags", attr, searchFlags); + GET_UINT32_DS(schema, r, "systemFlags", attr, systemFlags); + GET_BOOL_DS(schema, r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); + GET_UINT32_DS(schema, r, "linkID", attr, linkID); - GET_UINT32_DS(r, "attributeSyntax", attr, attributeSyntax_id); - status = dsdb_map_int2oid(attr->attributeSyntax_id, mem_ctx, &attr->attributeSyntax_oid); + GET_UINT32_DS(schema, r, "attributeSyntax", attr, attributeSyntax_id); + status = dsdb_map_int2oid(schema, attr->attributeSyntax_id, mem_ctx, &attr->attributeSyntax_oid); if (!W_ERROR_IS_OK(status)) { DEBUG(0,("%s: '%s': unable to map attributeSyntax 0x%08X: %s\n", __location__, attr->lDAPDisplayName, attr->attributeSyntax_id, win_errstr(status))); return status; } - GET_UINT32_DS(r, "oMSyntax", attr, oMSyntax); - GET_BLOB_DS(r, "oMObjectClass", mem_ctx, attr, oMObjectClass); + GET_UINT32_DS(schema, r, "oMSyntax", attr, oMSyntax); + GET_BLOB_DS(schema, r, "oMObjectClass", mem_ctx, attr, oMObjectClass); - GET_BOOL_DS(r, "isSingleValued", attr, isSingleValued, True); - GET_UINT32_DS(r, "rangeLower", attr, rangeLower); - GET_UINT32_DS(r, "rangeUpper", attr, rangeUpper); - GET_BOOL_DS(r, "extendedCharsAllowed", attr, extendedCharsAllowed, False); + GET_BOOL_DS(schema, r, "isSingleValued", attr, isSingleValued, True); + GET_UINT32_DS(schema, r, "rangeLower", attr, rangeLower); + GET_UINT32_DS(schema, r, "rangeUpper", attr, rangeUpper); + GET_BOOL_DS(schema, r, "extendedCharsAllowed", attr, extendedCharsAllowed, False); - GET_UINT32_DS(r, "schemaFlagsEx", attr, schemaFlagsEx); - GET_BLOB_DS(r, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); + GET_UINT32_DS(schema, r, "schemaFlagsEx", attr, schemaFlagsEx); + GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); - GET_BOOL_DS(r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); - GET_STRING_DS(r, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); - GET_STRING_DS(r, "adminDescription", mem_ctx, attr, adminDescription, False); - GET_STRING_DS(r, "classDisplayName", mem_ctx, attr, classDisplayName, False); - GET_BOOL_DS(r, "isEphemeral", attr, isEphemeral, False); - GET_BOOL_DS(r, "isDefunct", attr, isDefunct, False); - GET_BOOL_DS(r, "systemOnly", attr, systemOnly, False); + GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); + GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); + GET_STRING_DS(schema, r, "adminDescription", mem_ctx, attr, adminDescription, False); + GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, attr, classDisplayName, False); + GET_BOOL_DS(schema, r, "isEphemeral", attr, isEphemeral, False); + GET_BOOL_DS(schema, r, "isDefunct", attr, isDefunct, False); + GET_BOOL_DS(schema, r, "systemOnly", attr, systemOnly, False); return WERR_OK; } -WERROR dsdb_class_from_drsuapi(struct drsuapi_DsReplicaObject *r, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) +WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, + struct drsuapi_DsReplicaObject *r, + TALLOC_CTX *mem_ctx, + struct dsdb_class *obj) { WERROR status; - GET_STRING_DS(r, "name", mem_ctx, obj, cn, True); - GET_STRING_DS(r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); - GET_UINT32_DS(r, "governsID", obj, governsID_id); - status = dsdb_map_int2oid(obj->governsID_id, mem_ctx, &obj->governsID_oid); + GET_STRING_DS(schema, r, "name", mem_ctx, obj, cn, True); + GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); + GET_UINT32_DS(schema, r, "governsID", obj, governsID_id); + status = dsdb_map_int2oid(schema, obj->governsID_id, mem_ctx, &obj->governsID_oid); if (!W_ERROR_IS_OK(status)) { DEBUG(0,("%s: '%s': unable to map governsID 0x%08X: %s\n", __location__, obj->lDAPDisplayName, obj->governsID_id, win_errstr(status))); return status; } - GET_GUID_DS(r, "schemaIDGUID", obj, schemaIDGUID); + GET_GUID_DS(schema, r, "schemaIDGUID", obj, schemaIDGUID); - GET_UINT32_DS(r, "objectClassCategory", obj, objectClassCategory); - GET_STRING_DS(r, "rDNAttID", mem_ctx, obj, rDNAttID, False); - GET_STRING_DS(r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); + GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory); + GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, False); + GET_STRING_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); - GET_STRING_DS(r, "subClassOf", mem_ctx, obj, subClassOf, True); + GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, True); - GET_STRING_DS(r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); + GET_STRING_DS(schema, r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); obj->systemPossSuperiors= NULL; obj->systemMustContain = NULL; obj->systemMayContain = NULL; - GET_STRING_DS(r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); + GET_STRING_DS(schema, r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); obj->possSuperiors = NULL; obj->mustContain = NULL; obj->mayContain = NULL; - GET_STRING_DS(r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); + GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); - GET_UINT32_DS(r, "schemaFlagsEx", obj, schemaFlagsEx); - GET_BLOB_DS(r, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); + GET_UINT32_DS(schema, r, "schemaFlagsEx", obj, schemaFlagsEx); + GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); - GET_BOOL_DS(r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); - GET_STRING_DS(r, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); - GET_STRING_DS(r, "adminDescription", mem_ctx, obj, adminDescription, False); - GET_STRING_DS(r, "classDisplayName", mem_ctx, obj, classDisplayName, False); - GET_BOOL_DS(r, "defaultHidingValue", obj, defaultHidingValue, False); - GET_BOOL_DS(r, "isDefunct", obj, isDefunct, False); - GET_BOOL_DS(r, "systemOnly", obj, systemOnly, False); + GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); + GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); + GET_STRING_DS(schema, r, "adminDescription", mem_ctx, obj, adminDescription, False); + GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, obj, classDisplayName, False); + GET_BOOL_DS(schema, r, "defaultHidingValue", obj, defaultHidingValue, False); + GET_BOOL_DS(schema, r, "isDefunct", obj, isDefunct, False); + GET_BOOL_DS(schema, r, "systemOnly", obj, systemOnly, False); return WERR_OK; } -- cgit From a624503418f6517e016e7f2f9a70729b4fad08b4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 21 Dec 2006 20:52:31 +0000 Subject: r20307: remove unused vars metze (This used to be commit 0352b7bbc659f3683355b793630fe44e9fd5b8cb) --- source4/dsdb/schema/schema_init.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index b5e0a8e1c9..a721718a06 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -186,8 +186,6 @@ WERROR dsdb_map_int2oid(struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_attribute *attr) { - WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); @@ -230,8 +228,6 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) { - WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); -- cgit From 3710a7ae991696dca71d0d8b173d9bd533f072cd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 23 Dec 2006 10:39:26 +0000 Subject: r20331: the last entry in the oid mapping array which starts with 0xFF is the content of the schemaInfo attribute of the schema head object metze (This used to be commit bfb7756bb0f1bbd9a7a17c9689cf2ea351247116) --- source4/dsdb/schema/schema_init.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index a721718a06..59ab62eb92 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -46,9 +46,9 @@ WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_D if (i != (ctr->num_mappings - 1)) { return WERR_INVALID_PARAM; } - - schema->unknown_magic = talloc_strdup(schema, ctr->mappings[i].oid.oid); - W_ERROR_HAVE_NO_MEMORY(schema->unknown_magic); + + schema->schema_info = talloc_strdup(schema, ctr->mappings[i].oid.oid); + W_ERROR_HAVE_NO_MEMORY(schema->schema_info); } else { /* the last array member should contain the magic value not a oid */ if (i == (ctr->num_mappings - 1)) { -- cgit From 58388f70907be71280e712f271c7596474efeacf Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 28 Dec 2006 12:49:53 +0000 Subject: r20379: - make sure the schema info blob is 21 bytes long - add a function to verify the incoming mapping and schema info metze (This used to be commit 5f0da4a3ae4eae8a6f14f813a65583cef78e73e4) --- source4/dsdb/schema/schema_init.c | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 59ab62eb92..eff7a3c185 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -47,6 +47,10 @@ WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_D return WERR_INVALID_PARAM; } + if (ctr->mappings[i].oid.__ndr_size != 21) { + return WERR_INVALID_PARAM; + } + schema->schema_info = talloc_strdup(schema, ctr->mappings[i].oid.oid); W_ERROR_HAVE_NO_MEMORY(schema->schema_info); } else { @@ -68,6 +72,66 @@ WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_D return WERR_OK; } +WERROR dsdb_verify_oid_mappings(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) +{ + uint32_t i,j; + + for (i=0; i < ctr->num_mappings; i++) { + if (ctr->mappings[i].oid.oid == NULL) { + return WERR_INVALID_PARAM; + } + + if (strncasecmp(ctr->mappings[i].oid.oid, "ff", 2) == 0) { + if (ctr->mappings[i].id_prefix != 0) { + return WERR_INVALID_PARAM; + } + + /* the magic value should be in the last array member */ + if (i != (ctr->num_mappings - 1)) { + return WERR_INVALID_PARAM; + } + + if (ctr->mappings[i].oid.__ndr_size != 21) { + return WERR_INVALID_PARAM; + } + + if (strcasecmp(schema->schema_info, ctr->mappings[i].oid.oid) != 0) { + return WERR_DS_DRA_SCHEMA_MISMATCH; + } + } else { + /* the last array member should contain the magic value not a oid */ + if (i == (ctr->num_mappings - 1)) { + return WERR_INVALID_PARAM; + } + + for (j=0; j < schema->num_prefixes; j++) { + size_t oid_len; + if (schema->prefixes[j].id != (ctr->mappings[i].id_prefix<<16)) { + continue; + } + + oid_len = strlen(ctr->mappings[i].oid.oid); + + if (oid_len != (schema->prefixes[j].oid_len - 1)) { + return WERR_DS_DRA_SCHEMA_MISMATCH; + } + + if (strncmp(ctr->mappings[i].oid.oid, schema->prefixes[j].oid, oid_len) != 0) { + return WERR_DS_DRA_SCHEMA_MISMATCH; + } + + break; + } + + if (j == schema->num_prefixes) { + return WERR_DS_DRA_SCHEMA_MISMATCH; + } + } + } + + return WERR_OK; +} + WERROR dsdb_map_oid2int(struct dsdb_schema *schema, const char *in, uint32_t *out) { uint32_t i; -- cgit From 40e7f362126407361dbaa56977e6e2463038dbcc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 28 Dec 2006 13:06:29 +0000 Subject: r20382: systemAuxiliaryClass and auxiliaryClass are also multivalued attributes metze (This used to be commit 5440c0a99fd8dced9020a47af4dbee74df504219) --- source4/dsdb/schema/schema_init.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index eff7a3c185..a2843385b8 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -305,15 +305,15 @@ WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, True); - GET_STRING_LDB(msg, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); - obj->systemPossSuperiors= NULL; - obj->systemMustContain = NULL; - obj->systemMayContain = NULL; + obj->systemAuxiliaryClass = NULL; + obj->systemPossSuperiors = NULL; + obj->systemMustContain = NULL; + obj->systemMayContain = NULL; - GET_STRING_LDB(msg, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); - obj->possSuperiors = NULL; - obj->mustContain = NULL; - obj->mayContain = NULL; + obj->auxiliaryClass = NULL; + obj->possSuperiors = NULL; + obj->mustContain = NULL; + obj->mayContain = NULL; GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); @@ -573,15 +573,15 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, True); - GET_STRING_DS(schema, r, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, False); - obj->systemPossSuperiors= NULL; - obj->systemMustContain = NULL; - obj->systemMayContain = NULL; + obj->systemAuxiliaryClass = NULL; + obj->systemPossSuperiors = NULL; + obj->systemMustContain = NULL; + obj->systemMayContain = NULL; - GET_STRING_DS(schema, r, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, False); - obj->possSuperiors = NULL; - obj->mustContain = NULL; - obj->mayContain = NULL; + obj->auxiliaryClass = NULL; + obj->possSuperiors = NULL; + obj->mustContain = NULL; + obj->mayContain = NULL; GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); -- cgit From 91837a908fd10899772ff6ceca43958b14cc86f3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 29 Dec 2006 11:48:15 +0000 Subject: r20408: fix cut'n'paste error metze (This used to be commit af78a86d2cf0f05a048c5dfd86ea21c92a9d75b0) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index a2843385b8..5d28e97271 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -346,7 +346,7 @@ static const struct { { "systemFlags", "1.2.840.113556.1.4.375" }, { "isMemberOfPartialAttributeSet", "1.2.840.113556.1.4.639" }, { "linkID", "1.2.840.113556.1.2.50" }, - { "attributeSyntax", "1.2.840.113556.1.2.30" }, + { "attributeSyntax", "1.2.840.113556.1.2.32" }, { "oMSyntax", "1.2.840.113556.1.2.231" }, { "oMObjectClass", "1.2.840.113556.1.2.218" }, { "isSingleValued", "1.2.840.113556.1.2.33" }, -- cgit From 124cd6fb237c887ff9d645dfc053a2ffb178c73b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 29 Dec 2006 11:50:33 +0000 Subject: r20409: load the attribute syntax for the attribute metze (This used to be commit d042aac3f72ab2022479bee48e49a0ab289315f5) --- source4/dsdb/schema/schema_init.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5d28e97271..5b0e2f1465 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -287,6 +287,11 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str GET_BOOL_LDB(msg, "isDefunct", attr, isDefunct, False); GET_BOOL_LDB(msg, "systemOnly", attr, systemOnly, False); + attr->syntax = dsdb_syntax_for_attribute(attr); + if (!attr->syntax) { + return WERR_DS_ATT_SCHEMA_REQ_SYNTAX; + } + return WERR_OK; } @@ -545,6 +550,11 @@ WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, GET_BOOL_DS(schema, r, "isDefunct", attr, isDefunct, False); GET_BOOL_DS(schema, r, "systemOnly", attr, systemOnly, False); + attr->syntax = dsdb_syntax_for_attribute(attr); + if (!attr->syntax) { + return WERR_DS_ATT_SCHEMA_REQ_SYNTAX; + } + return WERR_OK; } -- cgit From 23ccdca41670085da4486841b0d4900b4c8b02f3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 29 Dec 2006 12:36:41 +0000 Subject: r20410: add functions to access dsdb_attributes and dsdb_classes by oid, uint32_id or ldap name they will be optimized uing binary searches later... metze (This used to be commit e6a24c2172009b0225fa189b7107217838d286d3) --- source4/dsdb/schema/schema_init.c | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5b0e2f1465..0d1f51881a 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -608,3 +608,113 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, return WERR_OK; } + +const struct dsdb_attribute *dsdb_attribute_by_attributeID_id(const struct dsdb_schema *schema, + uint32_t id) +{ + struct dsdb_attribute *cur; + + /* + * 0xFFFFFFFF is used as value when no mapping table is available, + * so don't try to match with it + */ + if (id == 0xFFFFFFFF) return NULL; + + /* TODO: add binary search */ + for (cur = schema->attributes; cur; cur = cur->next) { + if (cur->attributeID_id != id) continue; + + return cur; + } + + return NULL; +} + +const struct dsdb_attribute *dsdb_attribute_by_attributeID_oid(const struct dsdb_schema *schema, + const char *oid) +{ + struct dsdb_attribute *cur; + + if (!oid) return NULL; + + /* TODO: add binary search */ + for (cur = schema->attributes; cur; cur = cur->next) { + if (strcmp(cur->attributeID_oid, oid) != 0) continue; + + return cur; + } + + return NULL; +} + +const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName(const struct dsdb_schema *schema, + const char *name) +{ + struct dsdb_attribute *cur; + + if (!name) return NULL; + + /* TODO: add binary search */ + for (cur = schema->attributes; cur; cur = cur->next) { + if (strcmp(cur->lDAPDisplayName, name) != 0) continue; + + return cur; + } + + return NULL; +} + +const struct dsdb_class *dsdb_class_by_governsID_id(const struct dsdb_schema *schema, + uint32_t id) +{ + struct dsdb_class *cur; + + /* + * 0xFFFFFFFF is used as value when no mapping table is available, + * so don't try to match with it + */ + if (id == 0xFFFFFFFF) return NULL; + + /* TODO: add binary search */ + for (cur = schema->classes; cur; cur = cur->next) { + if (cur->governsID_id != id) continue; + + return cur; + } + + return NULL; +} + +const struct dsdb_class *dsdb_class_by_governsID_oid(const struct dsdb_schema *schema, + const char *oid) +{ + struct dsdb_class *cur; + + if (!oid) return NULL; + + /* TODO: add binary search */ + for (cur = schema->classes; cur; cur = cur->next) { + if (strcmp(cur->governsID_oid, oid) != 0) continue; + + return cur; + } + + return NULL; +} + +const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema *schema, + const char *name) +{ + struct dsdb_class *cur; + + if (!name) return NULL; + + /* TODO: add binary search */ + for (cur = schema->classes; cur; cur = cur->next) { + if (strcmp(cur->lDAPDisplayName, name) != 0) continue; + + return cur; + } + + return NULL; +} -- cgit From b29d129ce75dc4d1fd0faf457558fbd3a4084b29 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 30 Dec 2006 09:48:05 +0000 Subject: r20415: add a function to get the lDAPDisplayName for an objectClass or attribute metze (This used to be commit 437db390795be8d6a375f2d44240b66d4406e148) --- source4/dsdb/schema/schema_init.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 0d1f51881a..2ab4c956be 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -718,3 +718,23 @@ const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema return NULL; } + +const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, + uint32_t id) +{ + struct dsdb_class *a; + struct dsdb_class *c; + + /* TODO: add binary search */ + a = dsdb_attribute_by_attributeID_id(schema, id); + if (a) { + return a->lDAPDisplayName; + } + + c = dsdb_class_by_governsID_id(schema, id); + if (c) { + return c->lDAPDisplayName; + } + + return NULL; +} -- cgit From 9c3d5c611860fdb730cc6a9759a5536ccaa7b8e4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 30 Dec 2006 10:15:54 +0000 Subject: r20416: fix compiler warnings metze (This used to be commit bfb0c04dffdff62a6535aa31b888db636ac2f8d5) --- source4/dsdb/schema/schema_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 2ab4c956be..1f8c87f851 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -722,8 +722,8 @@ const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, uint32_t id) { - struct dsdb_class *a; - struct dsdb_class *c; + const struct dsdb_attribute *a; + const struct dsdb_class *c; /* TODO: add binary search */ a = dsdb_attribute_by_attributeID_id(schema, id); -- cgit From ab56d5ebb87543592eea9528d51fce76cb8d88f0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 31 Dec 2006 12:55:28 +0000 Subject: r20439: this should be const pointers metze (This used to be commit 1313b4774542fe5a0013d501225d5b4e8d585128) --- source4/dsdb/schema/schema_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 1f8c87f851..6e903ab52f 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -132,7 +132,7 @@ WERROR dsdb_verify_oid_mappings(const struct dsdb_schema *schema, const struct d return WERR_OK; } -WERROR dsdb_map_oid2int(struct dsdb_schema *schema, const char *in, uint32_t *out) +WERROR dsdb_map_oid2int(const struct dsdb_schema *schema, const char *in, uint32_t *out) { uint32_t i; @@ -178,7 +178,7 @@ WERROR dsdb_map_oid2int(struct dsdb_schema *schema, const char *in, uint32_t *ou return WERR_DS_NO_MSDS_INTID; } -WERROR dsdb_map_int2oid(struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out) +WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out) { uint32_t i; -- cgit From 391d97168fdd2ef920b4084e5d1e8fbd4c43f178 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 2 Jan 2007 13:18:09 +0000 Subject: r20473: remove special case for boolean values metze (This used to be commit 8d80629c5dde44a06b597e1247ec96ef1cd3f2e1) --- source4/dsdb/schema/schema_init.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 6e903ab52f..4c781946e2 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -445,18 +445,24 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.uint32.num_values != 1) { \ + if (strict && _a->value_ctr.data_blob.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.uint32.num_values); \ + _a->value_ctr.data_blob.num_values); \ return WERR_INVALID_PARAM; \ } \ - if (strict && !_a->value_ctr.uint32.values[0].value) { \ - d_printf("%s: %s value == NULL\n", __location__, attr); \ + if (strict && !_a->value_ctr.data_blob.values[0].data) { \ + d_printf("%s: %s data == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (_a && _a->value_ctr.uint32.num_values >= 1 \ - && _a->value_ctr.uint32.values[0].value) { \ - (p)->elem = (*_a->value_ctr.uint32.values[0].value?True:False);\ + if (strict && _a->value_ctr.data_blob.values[0].data->length != 4) { \ + d_printf("%s: %s length == %u\n", __location__, attr, \ + _a->value_ctr.data_blob.values[0].data->length); \ + return WERR_INVALID_PARAM; \ + } \ + if (_a && _a->value_ctr.data_blob.num_values >= 1 \ + && _a->value_ctr.data_blob.values[0].data \ + && _a->value_ctr.data_blob.values[0].data->length == 4) { \ + (p)->elem = (IVAL(_a->value_ctr.data_blob.values[0].data->data,0)?True:False);\ } else { \ (p)->elem = False; \ } \ -- cgit From 2754a73d221d13095a4228fede25ffc64134beb5 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 2 Jan 2007 13:54:37 +0000 Subject: r20475: remove special case for GUID values metze (This used to be commit b7ab1c0039cd8000861cd89ca072d9d2b0bbf9de) --- source4/dsdb/schema/schema_init.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 4c781946e2..23b5fd9dcc 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -23,7 +23,8 @@ #include "includes.h" #include "dsdb/samdb/samdb.h" #include "lib/util/dlinklist.h" -#include "librpc/gen_ndr/drsuapi.h" +#include "librpc/gen_ndr/ndr_misc.h" +#include "librpc/gen_ndr/ndr_drsuapi.h" WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { @@ -479,12 +480,19 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ } while (0) -#define GET_GUID_DS(s, r, attr, p, elem) do { \ +#define GET_GUID_DS(s, r, attr, mem_ctx, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (_a && _a->value_ctr.guid.num_values >= 1 \ - && _a->value_ctr.guid.values[0].guid) { \ - (p)->elem = *_a->value_ctr.guid.values[0].guid;\ + if (_a && _a->value_ctr.data_blob.num_values >= 1 \ + && _a->value_ctr.data_blob.values[0].data \ + && _a->value_ctr.data_blob.values[0].data->length == 16) { \ + NTSTATUS _nt_status; \ + _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.data_blob.values[0].data, \ + mem_ctx, &(p)->elem, \ + (ndr_pull_flags_fn_t)ndr_pull_GUID); \ + if (!NT_STATUS_IS_OK(_nt_status)) { \ + return ntstatus_to_werror(_nt_status); \ + } \ } else { \ ZERO_STRUCT((p)->elem);\ } \ @@ -519,10 +527,10 @@ WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, win_errstr(status))); return status; } - GET_GUID_DS(schema, r, "schemaIDGUID", attr, schemaIDGUID); + GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, attr, schemaIDGUID); GET_UINT32_DS(schema, r, "mAPIID", attr, mAPIID); - GET_GUID_DS(schema, r, "attributeSecurityGUID", attr, attributeSecurityGUID); + GET_GUID_DS(schema, r, "attributeSecurityGUID", mem_ctx, attr, attributeSecurityGUID); GET_UINT32_DS(schema, r, "searchFlags", attr, searchFlags); GET_UINT32_DS(schema, r, "systemFlags", attr, systemFlags); @@ -581,7 +589,7 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, win_errstr(status))); return status; } - GET_GUID_DS(schema, r, "schemaIDGUID", obj, schemaIDGUID); + GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, obj, schemaIDGUID); GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory); GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, False); -- cgit From d70852659b4dbef9979be81f5d42e5587fc94c75 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 2 Jan 2007 14:14:35 +0000 Subject: r20476: get rid of extra case for uint32 values metze (This used to be commit 13ccd405b5dbb595e5ab67879260462e5a767a8b) --- source4/dsdb/schema/schema_init.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 23b5fd9dcc..41998a16db 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -472,9 +472,10 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb #define GET_UINT32_DS(s, r, attr, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (_a && _a->value_ctr.uint32.num_values >= 1 \ - && _a->value_ctr.uint32.values[0].value) { \ - (p)->elem = *_a->value_ctr.uint32.values[0].value;\ + if (_a && _a->value_ctr.data_blob.num_values >= 1 \ + && _a->value_ctr.data_blob.values[0].data \ + && _a->value_ctr.data_blob.values[0].data->length == 4) { \ + (p)->elem = IVAL(_a->value_ctr.data_blob.values[0].data->data,0);\ } else { \ (p)->elem = 0; \ } \ -- cgit From b885bc4a20e99a77d433b46c7af68cb0b5914208 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 2 Jan 2007 14:53:45 +0000 Subject: r20477: get rid of the spcial case for unicode strings metze (This used to be commit ececda44c74ae4ccbaa0492acb67a88aa5c05126) --- source4/dsdb/schema/schema_init.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 41998a16db..6de87708c7 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -427,18 +427,34 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.unicode_string.num_values != 1) { \ + if (strict && _a->value_ctr.data_blob.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.unicode_string.num_values); \ + _a->value_ctr.data_blob.num_values); \ return WERR_INVALID_PARAM; \ } \ - if (_a && _a->value_ctr.unicode_string.num_values >= 1) { \ - (p)->elem = talloc_steal(mem_ctx, _a->value_ctr.unicode_string.values[0].string);\ + if (_a && _a->value_ctr.data_blob.num_values >= 1) { \ + ssize_t _ret; \ + _ret = convert_string_talloc(mem_ctx, CH_UTF16, CH_UNIX, \ + _a->value_ctr.data_blob.values[0].data->data, \ + _a->value_ctr.data_blob.values[0].data->length, \ + (void **)discard_const(&(p)->elem)); \ + if (_ret == -1) { \ + DEBUG(0,("%s: invalid data!\n", attr)); \ + dump_data(0, \ + _a->value_ctr.data_blob.values[0].data->data, \ + _a->value_ctr.data_blob.values[0].data->length); \ + return WERR_FOOBAR; \ + } \ } else { \ (p)->elem = NULL; \ } \ } while (0) +#define GET_DN_DS(s, r, attr, mem_ctx, p, elem, strict) do { \ + /* TODO: ! */ \ + (p)->elem = NULL; \ +} while (0) + #define GET_BOOL_DS(s, r, attr, p, elem, strict) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ @@ -594,8 +610,8 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory); GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, False); - GET_STRING_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); - + GET_DN_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); + GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, True); obj->systemAuxiliaryClass = NULL; -- cgit From 16d6d8d4c5d0d6e0b3aa6b94e20c2ed3317d1fbd Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 2 Jan 2007 19:29:32 +0000 Subject: r20484: get rid of the special case for DN strings metze (This used to be commit 4c2addf2dd5b74fa0026249ce373ff4becaaef40) --- source4/dsdb/schema/schema_init.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 6de87708c7..c85988d938 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -451,8 +451,35 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } while (0) #define GET_DN_DS(s, r, attr, mem_ctx, p, elem, strict) do { \ - /* TODO: ! */ \ - (p)->elem = NULL; \ + struct drsuapi_DsReplicaAttribute *_a; \ + _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ + if (strict && !_a) { \ + d_printf("%s: %s == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } \ + if (strict && _a->value_ctr.data_blob.num_values != 1) { \ + d_printf("%s: %s num_values == %u\n", __location__, attr, \ + _a->value_ctr.data_blob.num_values); \ + return WERR_INVALID_PARAM; \ + } \ + if (strict && !_a->value_ctr.data_blob.values[0].data) { \ + d_printf("%s: %s data == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } \ + if (_a && _a->value_ctr.data_blob.num_values >= 1 \ + && _a->value_ctr.data_blob.values[0].data) { \ + struct drsuapi_DsReplicaObjectIdentifier3 _id3; \ + NTSTATUS _nt_status; \ + _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.data_blob.values[0].data, \ + mem_ctx, &_id3,\ + (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\ + if (!NT_STATUS_IS_OK(_nt_status)) { \ + return ntstatus_to_werror(_nt_status); \ + } \ + (p)->elem = _id3.dn; \ + } else { \ + (p)->elem = NULL; \ + } \ } while (0) #define GET_BOOL_DS(s, r, attr, p, elem, strict) do { \ -- cgit From 536ca21c55643a06e53053c2576697bf6abef2b0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 3 Jan 2007 09:58:14 +0000 Subject: r20504: we handle the attribute values always as DATA_BLOB's and don't need the union with the attribute id as switch anymore metze (This used to be commit d47c81923d0731edd314215c6f0b2eb3d1ee252d) --- source4/dsdb/schema/schema_init.c | 66 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c85988d938..6caefef9a7 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -427,22 +427,22 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.data_blob.num_values != 1) { \ + if (strict && _a->value_ctr.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.data_blob.num_values); \ + _a->value_ctr.num_values); \ return WERR_INVALID_PARAM; \ } \ - if (_a && _a->value_ctr.data_blob.num_values >= 1) { \ + if (_a && _a->value_ctr.num_values >= 1) { \ ssize_t _ret; \ _ret = convert_string_talloc(mem_ctx, CH_UTF16, CH_UNIX, \ - _a->value_ctr.data_blob.values[0].data->data, \ - _a->value_ctr.data_blob.values[0].data->length, \ + _a->value_ctr.values[0].blob->data, \ + _a->value_ctr.values[0].blob->length, \ (void **)discard_const(&(p)->elem)); \ if (_ret == -1) { \ DEBUG(0,("%s: invalid data!\n", attr)); \ dump_data(0, \ - _a->value_ctr.data_blob.values[0].data->data, \ - _a->value_ctr.data_blob.values[0].data->length); \ + _a->value_ctr.values[0].blob->data, \ + _a->value_ctr.values[0].blob->length); \ return WERR_FOOBAR; \ } \ } else { \ @@ -457,20 +457,20 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.data_blob.num_values != 1) { \ + if (strict && _a->value_ctr.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.data_blob.num_values); \ + _a->value_ctr.num_values); \ return WERR_INVALID_PARAM; \ } \ - if (strict && !_a->value_ctr.data_blob.values[0].data) { \ + if (strict && !_a->value_ctr.values[0].blob) { \ d_printf("%s: %s data == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (_a && _a->value_ctr.data_blob.num_values >= 1 \ - && _a->value_ctr.data_blob.values[0].data) { \ + if (_a && _a->value_ctr.num_values >= 1 \ + && _a->value_ctr.values[0].blob) { \ struct drsuapi_DsReplicaObjectIdentifier3 _id3; \ NTSTATUS _nt_status; \ - _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.data_blob.values[0].data, \ + _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ mem_ctx, &_id3,\ (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\ if (!NT_STATUS_IS_OK(_nt_status)) { \ @@ -489,24 +489,24 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.data_blob.num_values != 1) { \ + if (strict && _a->value_ctr.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.data_blob.num_values); \ + _a->value_ctr.num_values); \ return WERR_INVALID_PARAM; \ } \ - if (strict && !_a->value_ctr.data_blob.values[0].data) { \ + if (strict && !_a->value_ctr.values[0].blob) { \ d_printf("%s: %s data == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } \ - if (strict && _a->value_ctr.data_blob.values[0].data->length != 4) { \ + if (strict && _a->value_ctr.values[0].blob->length != 4) { \ d_printf("%s: %s length == %u\n", __location__, attr, \ - _a->value_ctr.data_blob.values[0].data->length); \ + _a->value_ctr.values[0].blob->length); \ return WERR_INVALID_PARAM; \ } \ - if (_a && _a->value_ctr.data_blob.num_values >= 1 \ - && _a->value_ctr.data_blob.values[0].data \ - && _a->value_ctr.data_blob.values[0].data->length == 4) { \ - (p)->elem = (IVAL(_a->value_ctr.data_blob.values[0].data->data,0)?True:False);\ + if (_a && _a->value_ctr.num_values >= 1 \ + && _a->value_ctr.values[0].blob \ + && _a->value_ctr.values[0].blob->length == 4) { \ + (p)->elem = (IVAL(_a->value_ctr.values[0].blob->data,0)?True:False);\ } else { \ (p)->elem = False; \ } \ @@ -515,10 +515,10 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb #define GET_UINT32_DS(s, r, attr, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (_a && _a->value_ctr.data_blob.num_values >= 1 \ - && _a->value_ctr.data_blob.values[0].data \ - && _a->value_ctr.data_blob.values[0].data->length == 4) { \ - (p)->elem = IVAL(_a->value_ctr.data_blob.values[0].data->data,0);\ + if (_a && _a->value_ctr.num_values >= 1 \ + && _a->value_ctr.values[0].blob \ + && _a->value_ctr.values[0].blob->length == 4) { \ + (p)->elem = IVAL(_a->value_ctr.values[0].blob->data,0);\ } else { \ (p)->elem = 0; \ } \ @@ -527,11 +527,11 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb #define GET_GUID_DS(s, r, attr, mem_ctx, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (_a && _a->value_ctr.data_blob.num_values >= 1 \ - && _a->value_ctr.data_blob.values[0].data \ - && _a->value_ctr.data_blob.values[0].data->length == 16) { \ + if (_a && _a->value_ctr.num_values >= 1 \ + && _a->value_ctr.values[0].blob \ + && _a->value_ctr.values[0].blob->length == 16) { \ NTSTATUS _nt_status; \ - _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.data_blob.values[0].data, \ + _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ mem_ctx, &(p)->elem, \ (ndr_pull_flags_fn_t)ndr_pull_GUID); \ if (!NT_STATUS_IS_OK(_nt_status)) { \ @@ -545,9 +545,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb #define GET_BLOB_DS(s, r, attr, mem_ctx, p, elem) do { \ struct drsuapi_DsReplicaAttribute *_a; \ _a = dsdb_find_object_attr_name(s, r, attr, NULL); \ - if (_a && _a->value_ctr.data_blob.num_values >= 1 \ - && _a->value_ctr.data_blob.values[0].data) { \ - (p)->elem = *_a->value_ctr.data_blob.values[0].data;\ + if (_a && _a->value_ctr.num_values >= 1 \ + && _a->value_ctr.values[0].blob) { \ + (p)->elem = *_a->value_ctr.values[0].blob;\ talloc_steal(mem_ctx, (p)->elem.data); \ } else { \ ZERO_STRUCT((p)->elem);\ -- cgit From 35c5e2d3183843cde2c702c0e76a7ac9f5f17d37 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 4 Jan 2007 14:42:13 +0000 Subject: r20523: match the lDAPDisplayName case insensitive metze (This used to be commit c32ec0a10041dba50be23611f25e4aae8c45830c) --- source4/dsdb/schema/schema_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 6caefef9a7..bed4e78525 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -714,7 +714,7 @@ const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName(const struct dsdb /* TODO: add binary search */ for (cur = schema->attributes; cur; cur = cur->next) { - if (strcmp(cur->lDAPDisplayName, name) != 0) continue; + if (strcasecmp(cur->lDAPDisplayName, name) != 0) continue; return cur; } @@ -769,7 +769,7 @@ const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema /* TODO: add binary search */ for (cur = schema->classes; cur; cur = cur->next) { - if (strcmp(cur->lDAPDisplayName, name) != 0) continue; + if (strcasecmp(cur->lDAPDisplayName, name) != 0) continue; return cur; } -- cgit From 6bffcc6d45c496678bd3f8ab2f9fb88e94a17d0a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 6 Jan 2007 01:04:12 +0000 Subject: r20576: add functions to get and set dsdb_schema on the ldb context metze (This used to be commit 2e054be8e023e23420e7ddd8cd73497400a875f9) --- source4/dsdb/schema/schema_init.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index bed4e78525..22d366d4f3 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -22,6 +22,7 @@ #include "includes.h" #include "dsdb/samdb/samdb.h" +#include "lib/ldb/include/ldb_errors.h" #include "lib/util/dlinklist.h" #include "librpc/gen_ndr/ndr_misc.h" #include "librpc/gen_ndr/ndr_drsuapi.h" @@ -796,3 +797,36 @@ const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, return NULL; } + +int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) +{ + int ret; + + ret = ldb_set_opaque(ldb, "dsdb_schema", schema); + if (ret != LDB_SUCCESS) { + return ret; + } + + talloc_steal(ldb, schema); + + return LDB_SUCCESS; +} + +const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) +{ + const void *p; + const struct dsdb_schema *schema; + + /* see if we have a cached copy */ + p = ldb_get_opaque(ldb, "dsdb_schema"); + if (!p) { + return NULL; + } + + schema = talloc_get_type(p, struct dsdb_schema); + if (!schema) { + return NULL; + } + + return schema; +} -- cgit From 43063d5b14d4142ce1088a255107677462622fcb Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 13 Jan 2007 15:29:47 +0000 Subject: r20733: add a function to load the oid mappings from ldb_val's metze (This used to be commit b7f681a8a144907fa8e0a6503345da7c391dd156) --- source4/dsdb/schema/schema_init.c | 49 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 22d366d4f3..5785594ada 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -26,8 +26,9 @@ #include "lib/util/dlinklist.h" #include "librpc/gen_ndr/ndr_misc.h" #include "librpc/gen_ndr/ndr_drsuapi.h" +#include "librpc/gen_ndr/ndr_drsblobs.h" -WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) +WERROR dsdb_load_oid_mappings_drsuapi(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { uint32_t i,j; @@ -74,7 +75,51 @@ WERROR dsdb_load_oid_mappings(struct dsdb_schema *schema, const struct drsuapi_D return WERR_OK; } -WERROR dsdb_verify_oid_mappings(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) +WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, + const struct ldb_val *prefixMap, + const struct ldb_val *schemaInfo) +{ + WERROR status; + NTSTATUS nt_status; + struct prefixMapBlob pfm; + char *schema_info; + + nt_status = ndr_pull_struct_blob(prefixMap, schema, &pfm, + (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); + if (!NT_STATUS_IS_OK(nt_status)) { + return ntstatus_to_werror(nt_status); + } + + if (pfm.version != PREFIX_MAP_VERSION_DSDB) { + return WERR_FOOBAR; + } + + if (schemaInfo->length != 21 && schemaInfo->data[0] == 0xFF) { + return WERR_FOOBAR; + } + + /* append the schema info as last element */ + pfm.ctr.dsdb.num_mappings++; + pfm.ctr.dsdb.mappings = talloc_realloc(schema, pfm.ctr.dsdb.mappings, + struct drsuapi_DsReplicaOIDMapping, + pfm.ctr.dsdb.num_mappings); + W_ERROR_HAVE_NO_MEMORY(pfm.ctr.dsdb.mappings); + + schema_info = data_blob_hex_string(pfm.ctr.dsdb.mappings, schemaInfo); + W_ERROR_HAVE_NO_MEMORY(schema_info); + + pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].id_prefix = 0; + pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.oid = schema_info; + + /* call the drsuapi version */ + status = dsdb_load_oid_mappings_drsuapi(schema, &pfm.ctr.dsdb); + talloc_free(pfm.ctr.dsdb.mappings); + W_ERROR_NOT_OK_RETURN(status); + + return WERR_OK; +} + +WERROR dsdb_verify_oid_mappings_drsuapi(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { uint32_t i,j; -- cgit From b93d6b41cbf45829d34f0d2704beb5ee04cbdc84 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 14 Jan 2007 13:49:19 +0000 Subject: r20763: add function to get the oid mappings in drsuapi or ldb form metze (This used to be commit cab3acb9bbb617bd6450134399f5bd7ad2770454) --- source4/dsdb/schema/schema_init.c | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5785594ada..5803741e58 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -119,6 +119,71 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, return WERR_OK; } +WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema, + bool include_schema_info, + TALLOC_CTX *mem_ctx, + struct drsuapi_DsReplicaOIDMapping_Ctr **_ctr) +{ + struct drsuapi_DsReplicaOIDMapping_Ctr *ctr; + uint32_t i,j; + + ctr = talloc(mem_ctx, struct drsuapi_DsReplicaOIDMapping_Ctr); + W_ERROR_HAVE_NO_MEMORY(ctr); + + ctr->num_mappings = schema->num_prefixes; + if (include_schema_info) ctr->num_mappings++; + ctr->mappings = talloc_array(schema, struct drsuapi_DsReplicaOIDMapping, ctr->num_mappings); + W_ERROR_HAVE_NO_MEMORY(ctr->mappings); + + for (i=0; i < schema->num_prefixes; i++) { + ctr->mappings[i].id_prefix = schema->prefixes[i].id>>16; + ctr->mappings[i].oid.oid = talloc_strndup(ctr->mappings, + schema->prefixes[j].oid, + schema->prefixes[i].oid_len - 1); + W_ERROR_HAVE_NO_MEMORY(ctr->mappings[i].oid.oid); + } + + if (include_schema_info) { + ctr->mappings[i].id_prefix = 0; + ctr->mappings[i].oid.oid = talloc_strdup(ctr->mappings, + schema->schema_info); + W_ERROR_HAVE_NO_MEMORY(ctr->mappings[i].oid.oid); + } + + *_ctr = ctr; + return WERR_OK; +} + +WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, + TALLOC_CTX *mem_ctx, + struct ldb_val *prefixMap, + struct ldb_val *schemaInfo) +{ + WERROR status; + NTSTATUS nt_status; + struct drsuapi_DsReplicaOIDMapping_Ctr *ctr; + struct prefixMapBlob pfm; + + status = dsdb_get_oid_mappings_drsuapi(schema, false, mem_ctx, &ctr); + W_ERROR_NOT_OK_RETURN(status); + + pfm.version = PREFIX_MAP_VERSION_DSDB; + pfm.ctr.dsdb = *ctr; + + nt_status = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm, + (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + talloc_free(ctr); + if (!NT_STATUS_IS_OK(nt_status)) { + return ntstatus_to_werror(nt_status); + } + + *schemaInfo = strhex_to_data_blob(schema->schema_info); + W_ERROR_HAVE_NO_MEMORY(schemaInfo->data); + talloc_steal(mem_ctx, schemaInfo->data); + + return WERR_OK; +} + WERROR dsdb_verify_oid_mappings_drsuapi(const struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { uint32_t i,j; -- cgit From e8d9ccd57403910e1e1072bb46b4db63307884f8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 14 Jan 2007 14:24:05 +0000 Subject: r20764: fix some little bugs metze (This used to be commit 1c3d1723e9a386038aaf34a5df7c279afa7d48a2) --- source4/dsdb/schema/schema_init.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5803741e58..ba2db95ae1 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -108,8 +108,9 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, schema_info = data_blob_hex_string(pfm.ctr.dsdb.mappings, schemaInfo); W_ERROR_HAVE_NO_MEMORY(schema_info); - pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].id_prefix = 0; - pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.oid = schema_info; + pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].id_prefix = 0; + pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.__ndr_size = schemaInfo->length; + pfm.ctr.dsdb.mappings[pfm.ctr.dsdb.num_mappings - 1].oid.oid = schema_info; /* call the drsuapi version */ status = dsdb_load_oid_mappings_drsuapi(schema, &pfm.ctr.dsdb); @@ -125,7 +126,7 @@ WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema, struct drsuapi_DsReplicaOIDMapping_Ctr **_ctr) { struct drsuapi_DsReplicaOIDMapping_Ctr *ctr; - uint32_t i,j; + uint32_t i; ctr = talloc(mem_ctx, struct drsuapi_DsReplicaOIDMapping_Ctr); W_ERROR_HAVE_NO_MEMORY(ctr); @@ -138,7 +139,7 @@ WERROR dsdb_get_oid_mappings_drsuapi(const struct dsdb_schema *schema, for (i=0; i < schema->num_prefixes; i++) { ctr->mappings[i].id_prefix = schema->prefixes[i].id>>16; ctr->mappings[i].oid.oid = talloc_strndup(ctr->mappings, - schema->prefixes[j].oid, + schema->prefixes[i].oid, schema->prefixes[i].oid_len - 1); W_ERROR_HAVE_NO_MEMORY(ctr->mappings[i].oid.oid); } -- cgit From 9f876c9fae1078b71138f6b5bc8b2152b0c64d7b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 14 Jan 2007 15:22:12 +0000 Subject: r20766: when creating dsdb_attribute or dsdb_class structs from ldb, try the oid mapping if the dsdb_schema has mappings attached metze (This used to be commit 6ecd1342ded63b99b51250714127344a5304c47f) --- source4/dsdb/schema/schema_init.c | 56 +++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index ba2db95ae1..4662f5fe79 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -361,13 +361,28 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT }\ } while (0) -WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_attribute *attr) +WERROR dsdb_attribute_from_ldb(const struct dsdb_schema *schema, + struct ldb_message *msg, + TALLOC_CTX *mem_ctx, + struct dsdb_attribute *attr) { + WERROR status; + GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); - /* set an invalid value */ - attr->attributeID_id = 0xFFFFFFFF; + if (schema->num_prefixes == 0) { + /* set an invalid value */ + attr->attributeID_id = 0xFFFFFFFF; + } else { + status = dsdb_map_oid2int(schema, attr->attributeID_oid, &attr->attributeID_id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeID %s: %s\n", + __location__, attr->lDAPDisplayName, attr->attributeID_oid, + win_errstr(status))); + return status; + } + } GET_GUID_LDB(msg, "schemaIDGUID", attr, schemaIDGUID); GET_UINT32_LDB(msg, "mAPIID", attr, mAPIID); @@ -379,8 +394,18 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str GET_UINT32_LDB(msg, "linkID", attr, linkID); GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, True); - /* set an invalid value */ - attr->attributeSyntax_id = 0xFFFFFFFF; + if (schema->num_prefixes == 0) { + /* set an invalid value */ + attr->attributeSyntax_id = 0xFFFFFFFF; + } else { + status = dsdb_map_oid2int(schema, attr->attributeSyntax_oid, &attr->attributeSyntax_id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map attributeSyntax_ %s: %s\n", + __location__, attr->lDAPDisplayName, attr->attributeSyntax_oid, + win_errstr(status))); + return status; + } + } GET_UINT32_LDB(msg, "oMSyntax", attr, oMSyntax); GET_BLOB_LDB(msg, "oMObjectClass", mem_ctx, attr, oMObjectClass); @@ -408,13 +433,28 @@ WERROR dsdb_attribute_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, str return WERR_OK; } -WERROR dsdb_class_from_ldb(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct dsdb_class *obj) +WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, + struct ldb_message *msg, + TALLOC_CTX *mem_ctx, + struct dsdb_class *obj) { + WERROR status; + GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, True); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); - /* set an invalid value */ - obj->governsID_id = 0xFFFFFFFF; + if (schema->num_prefixes == 0) { + /* set an invalid value */ + obj->governsID_id = 0xFFFFFFFF; + } else { + status = dsdb_map_oid2int(schema, obj->governsID_oid, &obj->governsID_id); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("%s: '%s': unable to map governsID %s: %s\n", + __location__, obj->lDAPDisplayName, obj->governsID_oid, + win_errstr(status))); + return status; + } + } GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID); GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory); -- cgit From 41c545350748f79fd543e2ac914f63139cf0b9e7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 14 Mar 2007 19:10:21 +0000 Subject: r21839: add my email address metze (This used to be commit e3be33c1d9f9e44ef37e6ef72a23576474f6e725) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 4662f5fe79..18f64bb0a9 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -2,7 +2,7 @@ Unix SMB/CIFS mplementation. DSDB schema header - Copyright (C) Stefan Metzmacher 2006 + Copyright (C) Stefan Metzmacher 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 -- cgit From d7e913d1931ddaa1f908b849b7f29629e1ddcee0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 18 May 2007 08:13:06 +0000 Subject: r22992: add a function to attach the dsdb_schema to a ldb_context loaded from ldif files. The first file should contain the info's about the 'prefixMap' attribute in the first ldif chunk. The 2nd file should contain all attributes and classes. metze (This used to be commit 587f70e153f17bcb6695bed831d9cadf93522690) --- source4/dsdb/schema/schema_init.c | 126 +++++++++++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 18f64bb0a9..5ed7c6dd1a 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -368,7 +368,7 @@ WERROR dsdb_attribute_from_ldb(const struct dsdb_schema *schema, { WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, True); + GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, False); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); if (schema->num_prefixes == 0) { @@ -440,7 +440,7 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, { WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, True); + GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, False); GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); if (schema->num_prefixes == 0) { @@ -981,3 +981,125 @@ const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) return schema; } + +WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) +{ + struct ldb_ldif *ldif; + struct ldb_message *msg; + TALLOC_CTX *mem_ctx; + WERROR status; + int ret; + struct dsdb_schema *schema; + const struct ldb_val *prefix_val; + const struct ldb_val *info_val; + struct ldb_val info_val_default; + + mem_ctx = talloc_new(ldb); + if (!mem_ctx) { + goto nomem; + } + + schema = talloc_zero(mem_ctx, struct dsdb_schema); + if (!schema) { + goto nomem; + } + + /* + * load the prefixMap attribute from pf + */ + ldif = ldb_ldif_read_string(ldb, &pf); + if (!ldif) { + status = WERR_INVALID_PARAM; + goto failed; + } + talloc_steal(mem_ctx, ldif); + + msg = ldb_msg_canonicalize(ldb, ldif->msg); + if (!msg) { + goto nomem; + } + + prefix_val = ldb_msg_find_ldb_val(msg, "prefixMap"); + if (!prefix_val) { + status = WERR_INVALID_PARAM; + goto failed; + } + + info_val = ldb_msg_find_ldb_val(msg, "schemaInfo"); + if (!info_val) { + info_val_default = strhex_to_data_blob("FF0000000000000000000000000000000000000000"); + if (!info_val_default.data) { + goto nomem; + } + talloc_steal(mem_ctx, info_val_default.data); + info_val = &info_val_default; + } + + status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); + if (!W_ERROR_IS_OK(status)) { + goto failed; + } + + /* + * load the attribute and class definitions outof df + */ + while ((ldif = ldb_ldif_read_string(ldb, &df))) { + bool is_sa; + bool is_sc; + + talloc_steal(mem_ctx, ldif); + + msg = ldb_msg_canonicalize(ldb, ldif->msg); + if (!msg) { + goto nomem; + } + + is_sa = ldb_msg_check_string_attribute(msg, "objectClass", "attributeSchema"); + is_sc = ldb_msg_check_string_attribute(msg, "objectClass", "classSchema"); + + if (is_sa) { + struct dsdb_attribute *sa; + + sa = talloc_zero(schema, struct dsdb_attribute); + if (!sa) { + goto nomem; + } + + status = dsdb_attribute_from_ldb(schema, msg, sa, sa); + if (!W_ERROR_IS_OK(status)) { + goto failed; + } + + DLIST_ADD_END(schema->attributes, sa, struct dsdb_attribute *); + } else if (is_sc) { + struct dsdb_class *sc; + + sc = talloc_zero(schema, struct dsdb_class); + if (!sc) { + goto nomem; + } + + status = dsdb_class_from_ldb(schema, msg, sc, sc); + if (!W_ERROR_IS_OK(status)) { + goto failed; + } + + DLIST_ADD_END(schema->classes, sc, struct dsdb_class *); + } + } + + ret = dsdb_set_schema(ldb, schema); + if (ret != LDB_SUCCESS) { + status = WERR_FOOBAR; + goto failed; + } + + goto done; + +nomem: + status = WERR_NOMEM; +failed: +done: + talloc_free(mem_ctx); + return status; +} -- cgit From 64b985bc168a8247b086832fdb65932428b95958 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 11 Jun 2007 14:40:23 +0000 Subject: r23419: initialize variable... metze (This used to be commit d19293982bb534c9c4ebfe82f72224813e14bec9) --- source4/dsdb/schema/schema_init.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5ed7c6dd1a..b609478f94 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -169,6 +169,7 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, W_ERROR_NOT_OK_RETURN(status); pfm.version = PREFIX_MAP_VERSION_DSDB; + pfm.reserved = 0; pfm.ctr.dsdb = *ctr; nt_status = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm, -- cgit From e9d19477e43b65f91bd152f5249b684dbefa5cc6 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 21 Jun 2007 10:18:20 +0000 Subject: r23560: - Activate metze's schema modules (from metze's schema-loading-13 patch). - samba3sam.js: rework the samba3sam test to not use objectCategory, as it's has special rules (dnsName a simple match) - ldap.js: Test the ordering of the objectClass attributes for the baseDN - schema_init.c: Load the mayContain and mustContain (and system...) attributes when reading the schema from ldb - To make the schema load not suck in terms of performance, write the schema into a static global variable - ldif_handlers.c: Match objectCategory for equality and canonicolisation based on the loaded schema, not simple tring manipuation - ldb_msg.c: don't duplicate attributes when adding attributes to a list - kludge_acl.c: return allowedAttributesEffective based on schema results and privilages Andrew Bartlett (This used to be commit dcff83ebe463bc7391841f55856d7915c204d000) --- source4/dsdb/schema/schema_init.c | 90 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 4 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index b609478f94..c7a7b59754 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -323,6 +323,34 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT talloc_steal(mem_ctx, (p)->elem); \ } while (0) +#define GET_STRING_LIST_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ + int get_string_list_counter; \ + struct ldb_message_element *get_string_list_el = ldb_msg_find_element(msg, attr); \ + if (get_string_list_el == NULL) { \ + if (strict) { \ + d_printf("%s: %s == NULL\n", __location__, attr); \ + return WERR_INVALID_PARAM; \ + } else { \ + (p)->elem = NULL; \ + break; \ + } \ + } \ + (p)->elem = talloc_array(mem_ctx, const char *, get_string_list_el->num_values + 1); \ + for (get_string_list_counter=0; \ + get_string_list_counter < get_string_list_el->num_values; \ + get_string_list_counter++) { \ + (p)->elem[get_string_list_counter] = talloc_strndup((p)->elem, \ + (const char *)get_string_list_el->values[get_string_list_counter].data, \ + get_string_list_el->values[get_string_list_counter].length); \ + if (!(p)->elem[get_string_list_counter]) { \ + d_printf("%s: talloc_strndup failed for %s\n", __location__, attr); \ + return WERR_NOMEM; \ + } \ + (p)->elem[get_string_list_counter+1] = NULL; \ + } \ + talloc_steal(mem_ctx, (p)->elem); \ +} while (0) + #define GET_BOOL_LDB(msg, attr, p, elem, strict) do { \ const char *str; \ str = samdb_result_string(msg, attr, NULL);\ @@ -466,13 +494,14 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, obj->systemAuxiliaryClass = NULL; obj->systemPossSuperiors = NULL; - obj->systemMustContain = NULL; - obj->systemMayContain = NULL; obj->auxiliaryClass = NULL; obj->possSuperiors = NULL; - obj->mustContain = NULL; - obj->mayContain = NULL; + + GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, False); + GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, False); + GET_STRING_LIST_LDB(msg, "mustContain", mem_ctx, obj, mustContain, False); + GET_STRING_LIST_LDB(msg, "mayContain", mem_ctx, obj, mayContain, False); GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); @@ -930,6 +959,23 @@ const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema return NULL; } +const struct dsdb_class *dsdb_class_by_cn(const struct dsdb_schema *schema, + const char *cn) +{ + struct dsdb_class *cur; + + if (!cn) return NULL; + + /* TODO: add binary search */ + for (cur = schema->classes; cur; cur = cur->next) { + if (strcasecmp(cur->cn, cn) != 0) continue; + + return cur; + } + + return NULL; +} + const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, uint32_t id) { @@ -964,6 +1010,22 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) return LDB_SUCCESS; } +static struct dsdb_schema *global_schema; + +int dsdb_set_global_schema(struct ldb_context *ldb) +{ + int ret; + if (!global_schema) { + return LDB_SUCCESS; + } + ret = ldb_set_opaque(ldb, "dsdb_schema", global_schema); + if (ret != LDB_SUCCESS) { + return ret; + } + + return LDB_SUCCESS; +} + const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) { const void *p; @@ -983,6 +1045,26 @@ const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) return schema; } +void dsdb_make_schema_global(struct ldb_context *ldb) +{ + const void *p; + const struct dsdb_schema *schema; + + /* see if we have a cached copy */ + p = ldb_get_opaque(ldb, "dsdb_schema"); + if (!p) { + return; + } + + schema = talloc_get_type(p, struct dsdb_schema); + if (!schema) { + return; + } + + talloc_steal(NULL, schema); + global_schema = schema; +} + WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) { struct ldb_ldif *ldif; -- cgit From 80ae1c2a2aeace891d24390f2f639a3c3d18739a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 4 Jul 2007 03:25:44 +0000 Subject: r23695: By not using the NULL context for these large structures, we don't falsely report them as leaked. Andrew Bartlett (This used to be commit e3eb6c2cf63edf50d93a87f656df3ae5aa6efc00) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c7a7b59754..bf82b0b189 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1061,7 +1061,7 @@ void dsdb_make_schema_global(struct ldb_context *ldb) return; } - talloc_steal(NULL, schema); + talloc_steal(talloc_autofree_context(), schema); global_schema = schema; } -- cgit From b4d9778a805e22676a951266c1e0cd18a81162d6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 4 Jul 2007 05:15:06 +0000 Subject: r23699: when we create the global schema, remember to set the ldb opaque so we can find it again (This used to be commit 968e70b2aa478cfd49321e3386b505fd00a81527) --- source4/dsdb/schema/schema_init.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index bf82b0b189..a9ddbe69be 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1016,7 +1016,7 @@ int dsdb_set_global_schema(struct ldb_context *ldb) { int ret; if (!global_schema) { - return LDB_SUCCESS; + return LDB_SUCCESS; } ret = ldb_set_opaque(ldb, "dsdb_schema", global_schema); if (ret != LDB_SUCCESS) { @@ -1063,6 +1063,8 @@ void dsdb_make_schema_global(struct ldb_context *ldb) talloc_steal(talloc_autofree_context(), schema); global_schema = schema; + + dsdb_set_global_schema(ldb); } WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/dsdb/schema/schema_init.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index a9ddbe69be..fbc4ff0727 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -6,7 +6,7 @@ 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 2 of the License, or + 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, @@ -15,8 +15,7 @@ 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, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ -- cgit From 4e697b288be11a195d493f2d6800ea8c1e251fee Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 27 Jul 2007 03:08:15 +0000 Subject: r24060: Fix bug #4806 by Matthias Wallnöfer : We need to include the attribute allowedChildClassesEffective for MMC to allow the creation of containers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This may need further refinement, but it seems to work for now. Andrew Bartlett (This used to be commit d053b8e218767cb12e20a00fb18995e30869db11) --- source4/dsdb/schema/schema_init.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index fbc4ff0727..ce7645c454 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -492,16 +492,18 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, True); obj->systemAuxiliaryClass = NULL; - obj->systemPossSuperiors = NULL; obj->auxiliaryClass = NULL; - obj->possSuperiors = NULL; GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, False); GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, False); GET_STRING_LIST_LDB(msg, "mustContain", mem_ctx, obj, mustContain, False); GET_STRING_LIST_LDB(msg, "mayContain", mem_ctx, obj, mayContain, False); + GET_STRING_LIST_LDB(msg, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors, False); + GET_STRING_LIST_LDB(msg, "possSuperiors", mem_ctx, obj, possSuperiors, False); + GET_STRING_LIST_LDB(msg, "possibleInferiors", mem_ctx, obj, possibleInferiors, False); + GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); GET_UINT32_LDB(msg, "schemaFlagsEx", obj, schemaFlagsEx); @@ -832,6 +834,8 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, obj->mustContain = NULL; obj->mayContain = NULL; + obj->possibleInferiors = NULL; + GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); GET_UINT32_DS(schema, r, "schemaFlagsEx", obj, schemaFlagsEx); -- cgit From dfa4e5f78440e375a9c47eab913c5980c1aa640b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 23 Aug 2007 02:10:17 +0000 Subject: r24631: Fix up format warnings, found on my Fedora 7 x86_64 workstation. Andrew Bartlett (This used to be commit 3d74d178bfd89127ff387939e848b240e638cc35) --- source4/dsdb/schema/schema_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index ce7645c454..41b53be977 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -674,7 +674,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (strict && _a->value_ctr.num_values != 1) { \ d_printf("%s: %s num_values == %u\n", __location__, attr, \ - _a->value_ctr.num_values); \ + (unsigned int)_a->value_ctr.num_values); \ return WERR_INVALID_PARAM; \ } \ if (strict && !_a->value_ctr.values[0].blob) { \ @@ -683,7 +683,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (strict && _a->value_ctr.values[0].blob->length != 4) { \ d_printf("%s: %s length == %u\n", __location__, attr, \ - _a->value_ctr.values[0].blob->length); \ + (unsigned int)_a->value_ctr.values[0].blob->length); \ return WERR_INVALID_PARAM; \ } \ if (_a && _a->value_ctr.num_values >= 1 \ -- cgit From 05e7c481465e3065effaf21b43636d6605d7c313 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 22:25:41 +0000 Subject: r25553: Convert to standard bool type. (This used to be commit b7371f1a191fb86834c0d586d094f39f0b04544b) --- source4/dsdb/schema/schema_init.c | 130 +++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 65 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 41b53be977..e8c8d49f5e 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -358,12 +358,12 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT d_printf("%s: %s == NULL\n", __location__, attr); \ return WERR_INVALID_PARAM; \ } else { \ - (p)->elem = False; \ + (p)->elem = false; \ } \ } else if (strcasecmp("TRUE", str) == 0) { \ - (p)->elem = True; \ + (p)->elem = true; \ } else if (strcasecmp("FALSE", str) == 0) { \ - (p)->elem = False; \ + (p)->elem = false; \ } else { \ d_printf("%s: %s == %s\n", __location__, attr, str); \ return WERR_INVALID_PARAM; \ @@ -396,9 +396,9 @@ WERROR dsdb_attribute_from_ldb(const struct dsdb_schema *schema, { WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, False); - GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); - GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, True); + GET_STRING_LDB(msg, "cn", mem_ctx, attr, cn, false); + GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, true); + GET_STRING_LDB(msg, "attributeID", mem_ctx, attr, attributeID_oid, true); if (schema->num_prefixes == 0) { /* set an invalid value */ attr->attributeID_id = 0xFFFFFFFF; @@ -418,10 +418,10 @@ WERROR dsdb_attribute_from_ldb(const struct dsdb_schema *schema, GET_UINT32_LDB(msg, "searchFlags", attr, searchFlags); GET_UINT32_LDB(msg, "systemFlags", attr, systemFlags); - GET_BOOL_LDB(msg, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); + GET_BOOL_LDB(msg, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, false); GET_UINT32_LDB(msg, "linkID", attr, linkID); - GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, True); + GET_STRING_LDB(msg, "attributeSyntax", mem_ctx, attr, attributeSyntax_oid, true); if (schema->num_prefixes == 0) { /* set an invalid value */ attr->attributeSyntax_id = 0xFFFFFFFF; @@ -437,21 +437,21 @@ WERROR dsdb_attribute_from_ldb(const struct dsdb_schema *schema, GET_UINT32_LDB(msg, "oMSyntax", attr, oMSyntax); GET_BLOB_LDB(msg, "oMObjectClass", mem_ctx, attr, oMObjectClass); - GET_BOOL_LDB(msg, "isSingleValued", attr, isSingleValued, True); + GET_BOOL_LDB(msg, "isSingleValued", attr, isSingleValued, true); GET_UINT32_LDB(msg, "rangeLower", attr, rangeLower); GET_UINT32_LDB(msg, "rangeUpper", attr, rangeUpper); - GET_BOOL_LDB(msg, "extendedCharsAllowed", attr, extendedCharsAllowed, False); + GET_BOOL_LDB(msg, "extendedCharsAllowed", attr, extendedCharsAllowed, false); GET_UINT32_LDB(msg, "schemaFlagsEx", attr, schemaFlagsEx); GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); - GET_BOOL_LDB(msg, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); - GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); - GET_STRING_LDB(msg, "adminDescription", mem_ctx, attr, adminDescription, False); - GET_STRING_LDB(msg, "classDisplayName", mem_ctx, attr, classDisplayName, False); - GET_BOOL_LDB(msg, "isEphemeral", attr, isEphemeral, False); - GET_BOOL_LDB(msg, "isDefunct", attr, isDefunct, False); - GET_BOOL_LDB(msg, "systemOnly", attr, systemOnly, False); + GET_BOOL_LDB(msg, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, false); + GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, attr, adminDisplayName, false); + GET_STRING_LDB(msg, "adminDescription", mem_ctx, attr, adminDescription, false); + GET_STRING_LDB(msg, "classDisplayName", mem_ctx, attr, classDisplayName, false); + GET_BOOL_LDB(msg, "isEphemeral", attr, isEphemeral, false); + GET_BOOL_LDB(msg, "isDefunct", attr, isDefunct, false); + GET_BOOL_LDB(msg, "systemOnly", attr, systemOnly, false); attr->syntax = dsdb_syntax_for_attribute(attr); if (!attr->syntax) { @@ -468,9 +468,9 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, { WERROR status; - GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, False); - GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); - GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, True); + GET_STRING_LDB(msg, "cn", mem_ctx, obj, cn, false); + GET_STRING_LDB(msg, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, true); + GET_STRING_LDB(msg, "governsID", mem_ctx, obj, governsID_oid, true); if (schema->num_prefixes == 0) { /* set an invalid value */ obj->governsID_id = 0xFFFFFFFF; @@ -486,36 +486,36 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, GET_GUID_LDB(msg, "schemaIDGUID", obj, schemaIDGUID); GET_UINT32_LDB(msg, "objectClassCategory", obj, objectClassCategory); - GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, False); - GET_STRING_LDB(msg, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); + GET_STRING_LDB(msg, "rDNAttID", mem_ctx, obj, rDNAttID, false); + GET_STRING_LDB(msg, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, true); - GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, True); + GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, true); obj->systemAuxiliaryClass = NULL; obj->auxiliaryClass = NULL; - GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, False); - GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, False); - GET_STRING_LIST_LDB(msg, "mustContain", mem_ctx, obj, mustContain, False); - GET_STRING_LIST_LDB(msg, "mayContain", mem_ctx, obj, mayContain, False); + GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, false); + GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, false); + GET_STRING_LIST_LDB(msg, "mustContain", mem_ctx, obj, mustContain, false); + GET_STRING_LIST_LDB(msg, "mayContain", mem_ctx, obj, mayContain, false); - GET_STRING_LIST_LDB(msg, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors, False); - GET_STRING_LIST_LDB(msg, "possSuperiors", mem_ctx, obj, possSuperiors, False); - GET_STRING_LIST_LDB(msg, "possibleInferiors", mem_ctx, obj, possibleInferiors, False); + GET_STRING_LIST_LDB(msg, "systemPossSuperiors", mem_ctx, obj, systemPossSuperiors, false); + GET_STRING_LIST_LDB(msg, "possSuperiors", mem_ctx, obj, possSuperiors, false); + GET_STRING_LIST_LDB(msg, "possibleInferiors", mem_ctx, obj, possibleInferiors, false); - GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); + GET_STRING_LDB(msg, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, false); GET_UINT32_LDB(msg, "schemaFlagsEx", obj, schemaFlagsEx); GET_BLOB_LDB(msg, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); - GET_BOOL_LDB(msg, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); - GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); - GET_STRING_LDB(msg, "adminDescription", mem_ctx, obj, adminDescription, False); - GET_STRING_LDB(msg, "classDisplayName", mem_ctx, obj, classDisplayName, False); - GET_BOOL_LDB(msg, "defaultHidingValue", obj, defaultHidingValue, False); - GET_BOOL_LDB(msg, "isDefunct", obj, isDefunct, False); - GET_BOOL_LDB(msg, "systemOnly", obj, systemOnly, False); + GET_BOOL_LDB(msg, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, false); + GET_STRING_LDB(msg, "adminDisplayName", mem_ctx, obj, adminDisplayName, false); + GET_STRING_LDB(msg, "adminDescription", mem_ctx, obj, adminDescription, false); + GET_STRING_LDB(msg, "classDisplayName", mem_ctx, obj, classDisplayName, false); + GET_BOOL_LDB(msg, "defaultHidingValue", obj, defaultHidingValue, false); + GET_BOOL_LDB(msg, "isDefunct", obj, isDefunct, false); + GET_BOOL_LDB(msg, "systemOnly", obj, systemOnly, false); return WERR_OK; } @@ -689,9 +689,9 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb if (_a && _a->value_ctr.num_values >= 1 \ && _a->value_ctr.values[0].blob \ && _a->value_ctr.values[0].blob->length == 4) { \ - (p)->elem = (IVAL(_a->value_ctr.values[0].blob->data,0)?True:False);\ + (p)->elem = (IVAL(_a->value_ctr.values[0].blob->data,0)?true:false);\ } else { \ - (p)->elem = False; \ + (p)->elem = false; \ } \ } while (0) @@ -744,8 +744,8 @@ WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, { WERROR status; - GET_STRING_DS(schema, r, "name", mem_ctx, attr, cn, True); - GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, True); + GET_STRING_DS(schema, r, "name", mem_ctx, attr, cn, true); + GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, attr, lDAPDisplayName, true); GET_UINT32_DS(schema, r, "attributeID", attr, attributeID_id); status = dsdb_map_int2oid(schema, attr->attributeID_id, mem_ctx, &attr->attributeID_oid); if (!W_ERROR_IS_OK(status)) { @@ -761,7 +761,7 @@ WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, GET_UINT32_DS(schema, r, "searchFlags", attr, searchFlags); GET_UINT32_DS(schema, r, "systemFlags", attr, systemFlags); - GET_BOOL_DS(schema, r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, False); + GET_BOOL_DS(schema, r, "isMemberOfPartialAttributeSet", attr, isMemberOfPartialAttributeSet, false); GET_UINT32_DS(schema, r, "linkID", attr, linkID); GET_UINT32_DS(schema, r, "attributeSyntax", attr, attributeSyntax_id); @@ -775,21 +775,21 @@ WERROR dsdb_attribute_from_drsuapi(struct dsdb_schema *schema, GET_UINT32_DS(schema, r, "oMSyntax", attr, oMSyntax); GET_BLOB_DS(schema, r, "oMObjectClass", mem_ctx, attr, oMObjectClass); - GET_BOOL_DS(schema, r, "isSingleValued", attr, isSingleValued, True); + GET_BOOL_DS(schema, r, "isSingleValued", attr, isSingleValued, true); GET_UINT32_DS(schema, r, "rangeLower", attr, rangeLower); GET_UINT32_DS(schema, r, "rangeUpper", attr, rangeUpper); - GET_BOOL_DS(schema, r, "extendedCharsAllowed", attr, extendedCharsAllowed, False); + GET_BOOL_DS(schema, r, "extendedCharsAllowed", attr, extendedCharsAllowed, false); GET_UINT32_DS(schema, r, "schemaFlagsEx", attr, schemaFlagsEx); GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, attr, msDs_Schema_Extensions); - GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, False); - GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, attr, adminDisplayName, False); - GET_STRING_DS(schema, r, "adminDescription", mem_ctx, attr, adminDescription, False); - GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, attr, classDisplayName, False); - GET_BOOL_DS(schema, r, "isEphemeral", attr, isEphemeral, False); - GET_BOOL_DS(schema, r, "isDefunct", attr, isDefunct, False); - GET_BOOL_DS(schema, r, "systemOnly", attr, systemOnly, False); + GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", attr, showInAdvancedViewOnly, false); + GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, attr, adminDisplayName, false); + GET_STRING_DS(schema, r, "adminDescription", mem_ctx, attr, adminDescription, false); + GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, attr, classDisplayName, false); + GET_BOOL_DS(schema, r, "isEphemeral", attr, isEphemeral, false); + GET_BOOL_DS(schema, r, "isDefunct", attr, isDefunct, false); + GET_BOOL_DS(schema, r, "systemOnly", attr, systemOnly, false); attr->syntax = dsdb_syntax_for_attribute(attr); if (!attr->syntax) { @@ -806,8 +806,8 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, { WERROR status; - GET_STRING_DS(schema, r, "name", mem_ctx, obj, cn, True); - GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, True); + GET_STRING_DS(schema, r, "name", mem_ctx, obj, cn, true); + GET_STRING_DS(schema, r, "lDAPDisplayName", mem_ctx, obj, lDAPDisplayName, true); GET_UINT32_DS(schema, r, "governsID", obj, governsID_id); status = dsdb_map_int2oid(schema, obj->governsID_id, mem_ctx, &obj->governsID_oid); if (!W_ERROR_IS_OK(status)) { @@ -819,10 +819,10 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, GET_GUID_DS(schema, r, "schemaIDGUID", mem_ctx, obj, schemaIDGUID); GET_UINT32_DS(schema, r, "objectClassCategory", obj, objectClassCategory); - GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, False); - GET_DN_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, True); + GET_STRING_DS(schema, r, "rDNAttID", mem_ctx, obj, rDNAttID, false); + GET_DN_DS(schema, r, "defaultObjectCategory", mem_ctx, obj, defaultObjectCategory, true); - GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, True); + GET_STRING_DS(schema, r, "subClassOf", mem_ctx, obj, subClassOf, true); obj->systemAuxiliaryClass = NULL; obj->systemPossSuperiors = NULL; @@ -836,18 +836,18 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, obj->possibleInferiors = NULL; - GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, False); + GET_STRING_DS(schema, r, "defaultSecurityDescriptor", mem_ctx, obj, defaultSecurityDescriptor, false); GET_UINT32_DS(schema, r, "schemaFlagsEx", obj, schemaFlagsEx); GET_BLOB_DS(schema, r, "msDs-Schema-Extensions", mem_ctx, obj, msDs_Schema_Extensions); - GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, False); - GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, obj, adminDisplayName, False); - GET_STRING_DS(schema, r, "adminDescription", mem_ctx, obj, adminDescription, False); - GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, obj, classDisplayName, False); - GET_BOOL_DS(schema, r, "defaultHidingValue", obj, defaultHidingValue, False); - GET_BOOL_DS(schema, r, "isDefunct", obj, isDefunct, False); - GET_BOOL_DS(schema, r, "systemOnly", obj, systemOnly, False); + GET_BOOL_DS(schema, r, "showInAdvancedViewOnly", obj, showInAdvancedViewOnly, false); + GET_STRING_DS(schema, r, "adminDisplayName", mem_ctx, obj, adminDisplayName, false); + GET_STRING_DS(schema, r, "adminDescription", mem_ctx, obj, adminDescription, false); + GET_STRING_DS(schema, r, "classDisplayName", mem_ctx, obj, classDisplayName, false); + GET_BOOL_DS(schema, r, "defaultHidingValue", obj, defaultHidingValue, false); + GET_BOOL_DS(schema, r, "isDefunct", obj, isDefunct, false); + GET_BOOL_DS(schema, r, "systemOnly", obj, systemOnly, false); return WERR_OK; } -- cgit From bb96624d68b3b947b1555bce97e479b72cb545d4 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 29 Oct 2007 11:11:36 +0100 Subject: r25749: Add function required by linked_attributes module. Andrew Bartlett (This used to be commit cd6409478744b9755c3a048d8d411dbe99f977f0) --- source4/dsdb/schema/schema_init.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index e8c8d49f5e..5ca0e6d47e 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -907,6 +907,21 @@ const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName(const struct dsdb return NULL; } +const struct dsdb_attribute *dsdb_attribute_by_linkID(const struct dsdb_schema *schema, + int linkID) +{ + struct dsdb_attribute *cur; + + /* TODO: add binary search */ + for (cur = schema->attributes; cur; cur = cur->next) { + if (cur->linkID != linkID) continue; + + return cur; + } + + return NULL; +} + const struct dsdb_class *dsdb_class_by_governsID_id(const struct dsdb_schema *schema, uint32_t id) { -- cgit From 605032d9978c6d44f6570418c8d66af0fe705a35 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 1 Nov 2007 22:01:48 +0100 Subject: r25786: Add function required by linked_attributes module (We need a list of all linked attributes in the schema, so we can try and find them). Andrew Bartlett (This used to be commit 9cc706e06079899e58d4806ec27f86ae019cff60) --- source4/dsdb/schema/schema_init.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 5ca0e6d47e..ff853018a2 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1014,6 +1014,26 @@ const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, return NULL; } +WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *schema, TALLOC_CTX *mem_ctx, const char ***attr_list_ret) +{ + const char **attr_list = NULL; + struct dsdb_attribute *cur; + int i = 0; + for (cur = schema->attributes; cur; cur = cur->next) { + if (cur->linkID == 0) continue; + + attr_list = talloc_realloc(mem_ctx, attr_list, const char *, i+2); + if (!attr_list) { + return WERR_NOMEM; + } + attr_list[i] = cur->lDAPDisplayName; + i++; + } + attr_list[i] = NULL; + *attr_list_ret = attr_list; + return WERR_OK; +} + int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) { int ret; -- cgit From 529763a9aa192a6785ba878aceeb1683c2510913 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 9 Nov 2007 19:24:51 +0100 Subject: r25920: ndr: change NTSTAUS into enum ndr_err_code (samba4 callers) lib/messaging/ lib/registry/ lib/ldb-samba/ librpc/rpc/ auth/auth_winbind.c auth/gensec/ auth/kerberos/ dsdb/repl/ dsdb/samdb/ dsdb/schema/ torture/ cluster/ctdb/ kdc/ ntvfs/ipc/ torture/rap/ ntvfs/ utils/getntacl.c ntptr/ smb_server/ libcli/wrepl/ wrepl_server/ libcli/cldap/ libcli/dgram/ libcli/ldap/ libcli/raw/ libcli/nbt/ libnet/ winbind/ rpc_server/ metze (This used to be commit 6223c7fddc972687eb577e04fc1c8e0604c35435) --- source4/dsdb/schema/schema_init.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index ff853018a2..c592bf8de0 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -79,13 +79,14 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, const struct ldb_val *schemaInfo) { WERROR status; - NTSTATUS nt_status; + enum ndr_err_code ndr_err; struct prefixMapBlob pfm; char *schema_info; - nt_status = ndr_pull_struct_blob(prefixMap, schema, &pfm, - (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); - if (!NT_STATUS_IS_OK(nt_status)) { + ndr_err = ndr_pull_struct_blob(prefixMap, schema, &pfm, + (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); return ntstatus_to_werror(nt_status); } @@ -160,7 +161,7 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, struct ldb_val *schemaInfo) { WERROR status; - NTSTATUS nt_status; + enum ndr_err_code ndr_err; struct drsuapi_DsReplicaOIDMapping_Ctr *ctr; struct prefixMapBlob pfm; @@ -171,10 +172,11 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, pfm.reserved = 0; pfm.ctr.dsdb = *ctr; - nt_status = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm, - (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm, + (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); talloc_free(ctr); - if (!NT_STATUS_IS_OK(nt_status)) { + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); return ntstatus_to_werror(nt_status); } @@ -652,11 +654,12 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb if (_a && _a->value_ctr.num_values >= 1 \ && _a->value_ctr.values[0].blob) { \ struct drsuapi_DsReplicaObjectIdentifier3 _id3; \ - NTSTATUS _nt_status; \ - _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ + enum ndr_err_code _ndr_err; \ + _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ mem_ctx, &_id3,\ (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\ - if (!NT_STATUS_IS_OK(_nt_status)) { \ + if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ + NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ return ntstatus_to_werror(_nt_status); \ } \ (p)->elem = _id3.dn; \ @@ -713,11 +716,12 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb if (_a && _a->value_ctr.num_values >= 1 \ && _a->value_ctr.values[0].blob \ && _a->value_ctr.values[0].blob->length == 16) { \ - NTSTATUS _nt_status; \ - _nt_status = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ + enum ndr_err_code _ndr_err; \ + _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ mem_ctx, &(p)->elem, \ (ndr_pull_flags_fn_t)ndr_pull_GUID); \ - if (!NT_STATUS_IS_OK(_nt_status)) { \ + if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ + NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ return ntstatus_to_werror(_nt_status); \ } \ } else { \ -- cgit From 39ee38d9c1aabf4db065b433d067d0da053d7d61 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 6 Dec 2007 17:52:23 +0100 Subject: r26316: Use contexts for conversion functions. (This used to be commit f6420d933b5b011d428974f3a2a57edf19e6f482) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c592bf8de0..278f18cf0d 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -619,7 +619,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (_a && _a->value_ctr.num_values >= 1) { \ ssize_t _ret; \ - _ret = convert_string_talloc(mem_ctx, CH_UTF16, CH_UNIX, \ + _ret = convert_string_talloc(mem_ctx, global_smb_iconv_convenience, CH_UTF16, CH_UNIX, \ _a->value_ctr.values[0].blob->data, \ _a->value_ctr.values[0].blob->length, \ (void **)discard_const(&(p)->elem)); \ -- cgit From a7f008a9398247b9bb08e040ee5c3510bc0f7b5f Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 12 Dec 2007 07:02:07 +0100 Subject: r26412: Add comments and refactor to reuse common code. Andrew Bartlett (This used to be commit a8b0f5af9afcc19bd869ff19e1456dbe9d2713b6) --- source4/dsdb/schema/schema_init.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 278f18cf0d..c301766c9d 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -3,7 +3,8 @@ DSDB schema header Copyright (C) Stefan Metzmacher 2006 - + Copyright (C) Andrew Bartlett 2007 + 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 @@ -1038,6 +1039,11 @@ WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *sche return WERR_OK; } +/** + * Attach the schema to an opaque pointer on the ldb, so ldb modules + * can find it + */ + int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) { int ret; @@ -1052,8 +1058,14 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) return LDB_SUCCESS; } +/** + * Global variable to hold one copy of the schema, used to avoid memory bloat + */ static struct dsdb_schema *global_schema; +/** + * Make this ldb use the 'global' schema, setup to avoid having multiple copies in this process + */ int dsdb_set_global_schema(struct ldb_context *ldb) { int ret; @@ -1068,6 +1080,10 @@ int dsdb_set_global_schema(struct ldb_context *ldb) return LDB_SUCCESS; } +/** + * Find the schema object for this ldb + */ + const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) { const void *p; @@ -1087,18 +1103,14 @@ const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) return schema; } +/** + * Make the schema found on this ldb the 'global' schema + */ + void dsdb_make_schema_global(struct ldb_context *ldb) { const void *p; - const struct dsdb_schema *schema; - - /* see if we have a cached copy */ - p = ldb_get_opaque(ldb, "dsdb_schema"); - if (!p) { - return; - } - - schema = talloc_get_type(p, struct dsdb_schema); + const struct dsdb_schema *schema = dsdb_get_schema(ldb); if (!schema) { return; } @@ -1109,6 +1121,13 @@ void dsdb_make_schema_global(struct ldb_context *ldb) dsdb_set_global_schema(ldb); } + +/** + * Rather than read a schema from the LDB itself, read it from an ldif + * file. This allows schema to be loaded and used while adding the + * schema itself to the directory. + */ + WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) { struct ldb_ldif *ldif; -- cgit From d891c0c74a03d797aed1c5ac0329fd9d1d78da63 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:09 +0100 Subject: r26429: Avoid use of global_smb_iconv_convenience. (This used to be commit d37136b7abfbba75ef2e5ab855eb3382b9648b8c) --- source4/dsdb/schema/schema_init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c301766c9d..24ef91777b 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -27,6 +27,7 @@ #include "librpc/gen_ndr/ndr_misc.h" #include "librpc/gen_ndr/ndr_drsuapi.h" #include "librpc/gen_ndr/ndr_drsblobs.h" +#include "param/param.h" WERROR dsdb_load_oid_mappings_drsuapi(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { @@ -620,7 +621,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (_a && _a->value_ctr.num_values >= 1) { \ ssize_t _ret; \ - _ret = convert_string_talloc(mem_ctx, global_smb_iconv_convenience, CH_UTF16, CH_UNIX, \ + _ret = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, \ _a->value_ctr.values[0].blob->data, \ _a->value_ctr.values[0].blob->length, \ (void **)discard_const(&(p)->elem)); \ -- cgit From 1cd5cc6e6599260b41023e5b83b8d169c3cad246 Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Tue, 18 Dec 2007 22:50:49 +0100 Subject: r26528: dsdb: Fix a warning. (This used to be commit 41a1f59850345c5a2944818a9a00bc6118d05c8a) --- source4/dsdb/schema/schema_init.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 24ef91777b..f15b03c9b4 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1085,10 +1085,10 @@ int dsdb_set_global_schema(struct ldb_context *ldb) * Find the schema object for this ldb */ -const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) +struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) { const void *p; - const struct dsdb_schema *schema; + struct dsdb_schema *schema; /* see if we have a cached copy */ p = ldb_get_opaque(ldb, "dsdb_schema"); @@ -1110,8 +1110,7 @@ const struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) void dsdb_make_schema_global(struct ldb_context *ldb) { - const void *p; - const struct dsdb_schema *schema = dsdb_get_schema(ldb); + struct dsdb_schema *schema = dsdb_get_schema(ldb); if (!schema) { return; } -- cgit From 3e75f222bcdf114238cc4f2bcc61332dc059135f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 19 Dec 2007 23:27:42 +0100 Subject: r26539: Remove unnecessary statics. (This used to be commit e53e79eebef3ece6978f0a2b4a1ee0a0814bb5d2) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index f15b03c9b4..3d17d2746e 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1062,7 +1062,7 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) /** * Global variable to hold one copy of the schema, used to avoid memory bloat */ -static struct dsdb_schema *global_schema; +static const struct dsdb_schema *global_schema; /** * Make this ldb use the 'global' schema, setup to avoid having multiple copies in this process -- cgit From 0500b87092540d300b4e021a0fb95ce16a44fbd2 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 20 Dec 2007 00:02:15 +0100 Subject: r26540: Revert my previous commit after concerns raised by Andrew. (This used to be commit 6ac86f8be7d9a8c5ab396a93e6d1e6819e11f173) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 3d17d2746e..f15b03c9b4 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1062,7 +1062,7 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) /** * Global variable to hold one copy of the schema, used to avoid memory bloat */ -static const struct dsdb_schema *global_schema; +static struct dsdb_schema *global_schema; /** * Make this ldb use the 'global' schema, setup to avoid having multiple copies in this process -- cgit From 86dc05e99f124db47f2743d1fc23117a7f5145ab Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 1 Jan 2008 22:05:05 -0600 Subject: r26638: libndr: Require explicitly specifying iconv_convenience for ndr_struct_push_blob(). (This used to be commit 61ad78ac98937ef7a9aa32075a91a1c95b7606b3) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index f15b03c9b4..80cd8040e4 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -174,7 +174,7 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, pfm.reserved = 0; pfm.ctr.dsdb = *ctr; - ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, &pfm, + ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm, (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); talloc_free(ctr); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { -- cgit From 7d5f0e0893d42b56145a3ffa34e3b4b9906cbd91 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 1 Jan 2008 22:05:13 -0600 Subject: r26639: librpc: Pass iconv convenience on from RPC connection to NDR library, so it can be overridden by OpenChange. (This used to be commit 2f29f80e07adef1f020173f2cd6d947d0ef505ce) --- source4/dsdb/schema/schema_init.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 80cd8040e4..3dd81fb822 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -85,7 +85,7 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, struct prefixMapBlob pfm; char *schema_info; - ndr_err = ndr_pull_struct_blob(prefixMap, schema, &pfm, + ndr_err = ndr_pull_struct_blob(prefixMap, schema, lp_iconv_convenience(global_loadparm), &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); @@ -658,7 +658,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb struct drsuapi_DsReplicaObjectIdentifier3 _id3; \ enum ndr_err_code _ndr_err; \ _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ - mem_ctx, &_id3,\ + mem_ctx, lp_iconv_convenience(global_loadparm), &_id3,\ (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\ if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ @@ -720,7 +720,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb && _a->value_ctr.values[0].blob->length == 16) { \ enum ndr_err_code _ndr_err; \ _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ - mem_ctx, &(p)->elem, \ + mem_ctx, lp_iconv_convenience(global_loadparm), &(p)->elem, \ (ndr_pull_flags_fn_t)ndr_pull_GUID); \ if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ -- cgit From 4d58fc88cbba394faa83b493ec79344935a497f8 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 9 Jan 2008 05:36:02 -0600 Subject: r26697: Leak less memory into the ldb context. (Trying to chase down memory leaks in provision) Andrew Bartlett (This used to be commit a0cf47c3359ca5dfab90c1a5831a73b89ff9f027) --- source4/dsdb/schema/schema_init.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 3dd81fb822..6a7463951e 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -85,24 +85,30 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, struct prefixMapBlob pfm; char *schema_info; - ndr_err = ndr_pull_struct_blob(prefixMap, schema, lp_iconv_convenience(global_loadparm), &pfm, + TALLOC_CTX *mem_ctx = talloc_new(schema); + W_ERROR_HAVE_NO_MEMORY(mem_ctx); + + ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); + talloc_free(mem_ctx); return ntstatus_to_werror(nt_status); } if (pfm.version != PREFIX_MAP_VERSION_DSDB) { + talloc_free(mem_ctx); return WERR_FOOBAR; } if (schemaInfo->length != 21 && schemaInfo->data[0] == 0xFF) { + talloc_free(mem_ctx); return WERR_FOOBAR; } /* append the schema info as last element */ pfm.ctr.dsdb.num_mappings++; - pfm.ctr.dsdb.mappings = talloc_realloc(schema, pfm.ctr.dsdb.mappings, + pfm.ctr.dsdb.mappings = talloc_realloc(mem_ctx, pfm.ctr.dsdb.mappings, struct drsuapi_DsReplicaOIDMapping, pfm.ctr.dsdb.num_mappings); W_ERROR_HAVE_NO_MEMORY(pfm.ctr.dsdb.mappings); @@ -116,7 +122,8 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, /* call the drsuapi version */ status = dsdb_load_oid_mappings_drsuapi(schema, &pfm.ctr.dsdb); - talloc_free(pfm.ctr.dsdb.mappings); + talloc_free(mem_ctx); + W_ERROR_NOT_OK_RETURN(status); return WERR_OK; @@ -1164,6 +1171,8 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf if (!msg) { goto nomem; } + talloc_steal(mem_ctx, msg); + talloc_free(ldif); prefix_val = ldb_msg_find_ldb_val(msg, "prefixMap"); if (!prefix_val) { @@ -1200,6 +1209,9 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf goto nomem; } + talloc_steal(mem_ctx, msg); + talloc_free(ldif); + is_sa = ldb_msg_check_string_attribute(msg, "objectClass", "attributeSchema"); is_sc = ldb_msg_check_string_attribute(msg, "objectClass", "classSchema"); -- cgit From 7d5987c2e035d1661f25294c26e3d81ba44def90 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 19 Feb 2008 13:39:27 +0100 Subject: Remove uses of global_loadparm. (This used to be commit 138aaef0781e0754cc17b3ffdaa6062ba70c0c6a) --- source4/dsdb/schema/schema_init.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 6a7463951e..bec6d5d9ef 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -88,8 +88,7 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema, TALLOC_CTX *mem_ctx = talloc_new(schema); W_ERROR_HAVE_NO_MEMORY(mem_ctx); - ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm, - (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); + ndr_err = ndr_pull_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); talloc_free(mem_ctx); @@ -181,8 +180,7 @@ WERROR dsdb_get_oid_mappings_ldb(const struct dsdb_schema *schema, pfm.reserved = 0; pfm.ctr.dsdb = *ctr; - ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, lp_iconv_convenience(global_loadparm), &pfm, - (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + ndr_err = ndr_push_struct_blob(prefixMap, mem_ctx, schema->iconv_convenience, &pfm, (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); talloc_free(ctr); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { NTSTATUS nt_status = ndr_map_error2ntstatus(ndr_err); @@ -628,7 +626,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb } \ if (_a && _a->value_ctr.num_values >= 1) { \ ssize_t _ret; \ - _ret = convert_string_talloc(mem_ctx, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX, \ + _ret = convert_string_talloc(mem_ctx, s->iconv_convenience, CH_UTF16, CH_UNIX, \ _a->value_ctr.values[0].blob->data, \ _a->value_ctr.values[0].blob->length, \ (void **)discard_const(&(p)->elem)); \ @@ -665,7 +663,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb struct drsuapi_DsReplicaObjectIdentifier3 _id3; \ enum ndr_err_code _ndr_err; \ _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ - mem_ctx, lp_iconv_convenience(global_loadparm), &_id3,\ + mem_ctx, s->iconv_convenience, &_id3,\ (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);\ if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ @@ -727,7 +725,7 @@ static struct drsuapi_DsReplicaAttribute *dsdb_find_object_attr_name(struct dsdb && _a->value_ctr.values[0].blob->length == 16) { \ enum ndr_err_code _ndr_err; \ _ndr_err = ndr_pull_struct_blob_all(_a->value_ctr.values[0].blob, \ - mem_ctx, lp_iconv_convenience(global_loadparm), &(p)->elem, \ + mem_ctx, s->iconv_convenience, &(p)->elem, \ (ndr_pull_flags_fn_t)ndr_pull_GUID); \ if (!NDR_ERR_CODE_IS_SUCCESS(_ndr_err)) { \ NTSTATUS _nt_status = ndr_map_error2ntstatus(_ndr_err); \ @@ -1157,6 +1155,8 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf goto nomem; } + schema->iconv_convenience = ldb_get_opaque(ldb, "loadparm"); + /* * load the prefixMap attribute from pf */ -- cgit From b617f58cc39ffb5e7f775b88887bcf9112b1ded1 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 19 Feb 2008 14:25:20 +0100 Subject: Fix accidently introduced bug - thanks metze. (This used to be commit d0dfdab85ac751c62b0a6d6e6b1ff128940098ed) --- source4/dsdb/schema/schema_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index bec6d5d9ef..30d0adeda7 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1155,7 +1155,7 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf goto nomem; } - schema->iconv_convenience = ldb_get_opaque(ldb, "loadparm"); + schema->iconv_convenience = lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")); /* * load the prefixMap attribute from pf -- cgit From 7e0ef3fd0ef4dba827f331cbe43fa0524be91130 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 6 Mar 2008 21:55:26 +1100 Subject: Make Samba4 pass the NET-API-BECOMEDC test against Win2k3 (again). To make Samba4, using the python provision system, pass this test required some major rework. Untested code is broken code, and some of the refactoring for a seperate provision test (which also now passes) broke things. Similarly, the iconv work has compiled, but these codepaths have never been run (NULL pointer de-reference). In working to use a local, rather than global, loadparm context, and to support using a target directory, a few things needed to be reworked, particularly around path handling. Andrew Bartlett (This used to be commit 1169e8d7bee20477b0efbfea3534ac63c83fb3d6) --- source4/dsdb/schema/schema_init.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 30d0adeda7..c046cb597f 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -29,6 +29,18 @@ #include "librpc/gen_ndr/ndr_drsblobs.h" #include "param/param.h" +struct dsdb_schema *dsdb_new_schema(TALLOC_CTX *mem_ctx, struct smb_iconv_convenience *iconv_convenience) +{ + struct dsdb_schema *schema = talloc_zero(mem_ctx, struct dsdb_schema); + if (!schema) { + return NULL; + } + + schema->iconv_convenience = iconv_convenience; + return schema; +} + + WERROR dsdb_load_oid_mappings_drsuapi(struct dsdb_schema *schema, const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr) { uint32_t i,j; @@ -1150,12 +1162,7 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf goto nomem; } - schema = talloc_zero(mem_ctx, struct dsdb_schema); - if (!schema) { - goto nomem; - } - - schema->iconv_convenience = lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")); + schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm"))); /* * load the prefixMap attribute from pf -- cgit From db0a105aae2ba32be4aa5658fc8963ba28933a6b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 1 Jul 2008 16:35:13 +0200 Subject: schema_fsmo: move fsmo info into struct dsdb_schema metze (This used to be commit 8538d305c803268c712a90879f29a2a74ba0ef03) --- source4/dsdb/schema/schema_init.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index c046cb597f..6f8958dab8 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1164,6 +1164,12 @@ WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm"))); + schema->fsmo.we_are_master = true; + schema->fsmo.master_dn = ldb_dn_new_fmt(schema, ldb, "@PROVISION_SCHEMA_MASTER"); + if (!schema->fsmo.master_dn) { + goto nomem; + } + /* * load the prefixMap attribute from pf */ -- cgit From 2a918a353f3d0e5dc64ac89ad3e32a564aa094c9 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 30 Jun 2008 17:17:24 +0200 Subject: schema_fsmo: prepare auto allocation of schema oid prefixes This implements the logic in the schema_fsmo_add() function, but it only calls a dummy dsdb_create_prefix_mapping() yet. metze (This used to be commit 9018b85e834de6714a78304ba1c7018838e30a61) --- source4/dsdb/schema/schema_init.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 6f8958dab8..9c70e9b7c8 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -334,6 +334,29 @@ WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CT return WERR_DS_NO_MSDS_INTID; } +/* + * this function is called from within a ldb transaction from the schema_fsmo module + */ +WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *schema, const char *full_oid) +{ + /* + * TODO: + * - (maybe) read the old prefixMap attribute and parse it + * + * - recheck the prefix doesn't exist (because the ldb + * has maybe a more uptodate value than schem->prefixes + * + * - calculate a new mapping for the oid prefix of full_oid + * - store the new prefixMap attribute + * + * - (maybe) update schema->prefixes + * or + * - better find a way to indicate a schema reload, + * so that other processes also notice the schema change + */ + return WERR_NOT_SUPPORTED; +} + #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, attr, NULL);\ if (strict && (p)->elem == NULL) { \ -- cgit From fe174cc1415d5c55e7d8d2bb861a66f2203e68fe Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 2 Jul 2008 15:19:49 +1000 Subject: Fill in the auxiliary classes into the dsdb_schema. Andrew Bartlett (This used to be commit 615564b3daec0ffe17d05599b7ec8688619f5c65) --- source4/dsdb/schema/schema_init.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 9c70e9b7c8..f71c14a95d 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -535,9 +535,8 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, GET_STRING_LDB(msg, "subClassOf", mem_ctx, obj, subClassOf, true); - obj->systemAuxiliaryClass = NULL; - - obj->auxiliaryClass = NULL; + GET_STRING_LIST_LDB(msg, "systemAuxiliaryClass", mem_ctx, obj, systemAuxiliaryClass, false); + GET_STRING_LIST_LDB(msg, "auxiliaryClass", mem_ctx, obj, auxiliaryClass, false); GET_STRING_LIST_LDB(msg, "systemMustContain", mem_ctx, obj, systemMustContain, false); GET_STRING_LIST_LDB(msg, "systemMayContain", mem_ctx, obj, systemMayContain, false); -- cgit From 7e851ada55bcdbd1ad19587e5dd6779c74c361e1 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 2 Jul 2008 21:30:08 +1000 Subject: Move ad2oLschema and oLschema2ldif into Samba4, out of LDB LDB does not know about nor process the AD schema, so it makes no sense to have this tool there. I've been changing it anyway, to use a common schema manipulation library, and will enhance these links in the future. Andrew Bartlett (This used to be commit c7704805b9a3541e4c8768278c8289b0aa6ed5e3) --- source4/dsdb/schema/schema_init.c | 108 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index f71c14a95d..826f91b5f0 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -563,6 +563,114 @@ WERROR dsdb_class_from_ldb(const struct dsdb_schema *schema, return WERR_OK; } +#define dsdb_oom(error_string, mem_ctx) *error_string = talloc_asprintf(mem_ctx, "dsdb out of memory at %s:%d\n", __FILE__, __LINE__) + +int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, + struct smb_iconv_convenience *iconv_convenience, + struct ldb_result *schema_res, + struct ldb_result *attrs_res, struct ldb_result *objectclass_res, + struct dsdb_schema **schema_out, + char **error_string) +{ + WERROR status; + uint32_t i; + const struct ldb_val *prefix_val; + const struct ldb_val *info_val; + struct ldb_val info_val_default; + struct dsdb_schema *schema; + + schema = dsdb_new_schema(mem_ctx, iconv_convenience); + if (!schema) { + dsdb_oom(error_string, mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + + prefix_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "prefixMap"); + if (!prefix_val) { + *error_string = talloc_asprintf(mem_ctx, + "schema_fsmo_init: no prefixMap attribute found"); + talloc_free(mem_ctx); + return LDB_ERR_CONSTRAINT_VIOLATION; + } + info_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "schemaInfo"); + if (!info_val) { + info_val_default = strhex_to_data_blob("FF0000000000000000000000000000000000000000"); + if (!info_val_default.data) { + dsdb_oom(error_string, mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + talloc_steal(mem_ctx, info_val_default.data); + info_val = &info_val_default; + } + + status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); + if (!W_ERROR_IS_OK(status)) { + *error_string = talloc_asprintf(mem_ctx, + "schema_fsmo_init: failed to load oid mappings: %s", + win_errstr(status)); + talloc_free(mem_ctx); + return LDB_ERR_CONSTRAINT_VIOLATION; + } + + for (i=0; i < attrs_res->count; i++) { + struct dsdb_attribute *sa; + + sa = talloc_zero(schema, struct dsdb_attribute); + if (!sa) { + dsdb_oom(error_string, mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + + status = dsdb_attribute_from_ldb(schema, attrs_res->msgs[i], sa, sa); + if (!W_ERROR_IS_OK(status)) { + *error_string = talloc_asprintf(mem_ctx, + "schema_fsmo_init: failed to load attriute definition: %s:%s", + ldb_dn_get_linearized(attrs_res->msgs[i]->dn), + win_errstr(status)); + talloc_free(mem_ctx); + return LDB_ERR_CONSTRAINT_VIOLATION; + } + + DLIST_ADD_END(schema->attributes, sa, struct dsdb_attribute *); + } + + for (i=0; i < objectclass_res->count; i++) { + struct dsdb_class *sc; + + sc = talloc_zero(schema, struct dsdb_class); + if (!sc) { + dsdb_oom(error_string, mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + + status = dsdb_class_from_ldb(schema, objectclass_res->msgs[i], sc, sc); + if (!W_ERROR_IS_OK(status)) { + *error_string = talloc_asprintf(mem_ctx, + "schema_fsmo_init: failed to load class definition: %s:%s", + ldb_dn_get_linearized(objectclass_res->msgs[i]->dn), + win_errstr(status)); + talloc_free(mem_ctx); + return LDB_ERR_CONSTRAINT_VIOLATION; + } + + DLIST_ADD_END(schema->classes, sc, struct dsdb_class *); + } + + schema->fsmo.master_dn = ldb_msg_find_attr_as_dn(ldb, schema, schema_res->msgs[0], "fSMORoleOwner"); + if (ldb_dn_compare(samdb_ntds_settings_dn(ldb), schema->fsmo.master_dn) == 0) { + schema->fsmo.we_are_master = true; + } else { + schema->fsmo.we_are_master = false; + } + + DEBUG(5, ("schema_fsmo_init: we are master: %s\n", + (schema->fsmo.we_are_master?"yes":"no"))); + + *schema_out = schema; + return LDB_SUCCESS; +} + + static const struct { const char *name; const char *oid; -- cgit From 83d90d6cd6029446f836774d7c68bc13ce9cd360 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 10 Jul 2008 15:52:44 +1000 Subject: Make ad2oLschema even simpler, by moving the heavy work into dsdb. This will allow the kludge_acl and schema code to leverage the same work. (We might even get schema validation soon! :-) Andrew Bartlett (This used to be commit cecd04ce1f8ce2af2fb654b3abc1499092405d60) --- source4/dsdb/schema/schema_init.c | 306 +++++++++++++++++++++++++++++++++++++- 1 file changed, 303 insertions(+), 3 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 826f91b5f0..3a6a8f5553 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -2,8 +2,8 @@ Unix SMB/CIFS mplementation. DSDB schema header - Copyright (C) Stefan Metzmacher 2006 - Copyright (C) Andrew Bartlett 2007 + Copyright (C) Stefan Metzmacher 2006-2007 + Copyright (C) Andrew Bartlett 2006-2008 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 @@ -624,7 +624,7 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, status = dsdb_attribute_from_ldb(schema, attrs_res->msgs[i], sa, sa); if (!W_ERROR_IS_OK(status)) { *error_string = talloc_asprintf(mem_ctx, - "schema_fsmo_init: failed to load attriute definition: %s:%s", + "schema_fsmo_init: failed to load attribute definition: %s:%s", ldb_dn_get_linearized(attrs_res->msgs[i]->dn), win_errstr(status)); talloc_free(mem_ctx); @@ -670,6 +670,191 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, return LDB_SUCCESS; } +/* This recursive load of the objectClasses presumes that they + * everything is in a strict subClassOf hirarchy. + * + * We load this in order so we produce certain outputs (such as the + * exported schema for openldap, and sorted objectClass attribute) 'in + * order' */ + +static int fetch_oc_recursive(struct ldb_context *ldb, struct ldb_dn *schemadn, + TALLOC_CTX *mem_ctx, + struct ldb_result *search_from, + struct ldb_result *res_list) +{ + int i; + int ret = 0; + for (i=0; i < search_from->count; i++) { + struct ldb_result *res; + const char *name = ldb_msg_find_attr_as_string(search_from->msgs[i], + "lDAPDisplayname", NULL); + + ret = ldb_search_exp_fmt(ldb, mem_ctx, &res, + schemadn, LDB_SCOPE_SUBTREE, NULL, + "(&(&(objectClass=classSchema)(subClassOf=%s))(!(lDAPDisplayName=%s)))", + name, name); + if (ret != LDB_SUCCESS) { + printf("Search failed: %s\n", ldb_errstring(ldb)); + return ret; + } + + res_list->msgs = talloc_realloc(res_list, res_list->msgs, + struct ldb_message *, res_list->count + 2); + if (!res_list->msgs) { + return LDB_ERR_OPERATIONS_ERROR; + } + res_list->msgs[res_list->count] = talloc_move(res_list, + &search_from->msgs[i]); + res_list->count++; + res_list->msgs[res_list->count] = NULL; + + if (res->count > 0) { + ret = fetch_oc_recursive(ldb, schemadn, mem_ctx, res, res_list); + } + if (ret != LDB_SUCCESS) { + return ret; + } + } + return ret; +} + +static int fetch_objectclass_schema(struct ldb_context *ldb, struct ldb_dn *schemadn, + TALLOC_CTX *mem_ctx, + struct ldb_result **objectclasses_res) +{ + TALLOC_CTX *local_ctx = talloc_new(mem_ctx); + struct ldb_result *top_res, *ret_res; + int ret; + if (!local_ctx) { + return LDB_ERR_OPERATIONS_ERROR; + } + + /* Downlaod 'top' */ + ret = ldb_search(ldb, schemadn, LDB_SCOPE_SUBTREE, + "(&(objectClass=classSchema)(lDAPDisplayName=top))", + NULL, &top_res); + if (ret != LDB_SUCCESS) { + printf("Search failed: %s\n", ldb_errstring(ldb)); + return LDB_ERR_OPERATIONS_ERROR; + } + + talloc_steal(local_ctx, top_res); + + if (top_res->count != 1) { + return LDB_ERR_OPERATIONS_ERROR; + } + + ret_res = talloc_zero(local_ctx, struct ldb_result); + if (!ret_res) { + return LDB_ERR_OPERATIONS_ERROR; + } + + ret = fetch_oc_recursive(ldb, schemadn, local_ctx, top_res, ret_res); + + if (ret != LDB_SUCCESS) { + printf("Search failed: %s\n", ldb_errstring(ldb)); + return LDB_ERR_OPERATIONS_ERROR; + } + + *objectclasses_res = talloc_move(mem_ctx, &ret_res); + return ret; +} + +int dsdb_schema_from_schema_dn(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, + struct smb_iconv_convenience *iconv_convenience, + struct ldb_dn *schema_dn, + struct dsdb_schema **schema, + char **error_string_out) +{ + TALLOC_CTX *tmp_ctx; + char *error_string; + int ret; + + struct ldb_result *schema_res; + struct ldb_result *a_res; + struct ldb_result *c_res; + static const char *schema_attrs[] = { + "prefixMap", + "schemaInfo", + "fSMORoleOwner", + NULL + }; + + tmp_ctx = talloc_new(mem_ctx); + if (!tmp_ctx) { + dsdb_oom(error_string_out, mem_ctx); + return LDB_ERR_OPERATIONS_ERROR; + } + + /* + * setup the prefix mappings and schema info + */ + ret = ldb_search(ldb, schema_dn, + LDB_SCOPE_BASE, + NULL, schema_attrs, + &schema_res); + if (ret == LDB_ERR_NO_SUCH_OBJECT) { + talloc_free(tmp_ctx); + return ret; + } else if (ret != LDB_SUCCESS) { + *error_string_out = talloc_asprintf(mem_ctx, + "dsdb_schema: failed to search the schema head: %s", + ldb_errstring(ldb)); + talloc_free(tmp_ctx); + return ret; + } + talloc_steal(tmp_ctx, schema_res); + if (schema_res->count != 1) { + *error_string_out = talloc_asprintf(mem_ctx, + "dsdb_schema: [%u] schema heads found on a base search", + schema_res->count); + talloc_free(tmp_ctx); + return LDB_ERR_CONSTRAINT_VIOLATION; + } + + /* + * load the attribute definitions + */ + ret = ldb_search(ldb, schema_dn, + LDB_SCOPE_ONELEVEL, + "(objectClass=attributeSchema)", NULL, + &a_res); + if (ret != LDB_SUCCESS) { + *error_string_out = talloc_asprintf(mem_ctx, + "dsdb_schema: failed to search attributeSchema objects: %s", + ldb_errstring(ldb)); + talloc_free(tmp_ctx); + return ret; + } + talloc_steal(tmp_ctx, a_res); + + /* + * load the objectClass definitions + */ + ret = fetch_objectclass_schema(ldb, schema_dn, tmp_ctx, &c_res); + if (ret != LDB_SUCCESS) { + *error_string_out = talloc_asprintf(mem_ctx, + "Failed to fetch objectClass schema elements: %s\n", ldb_errstring(ldb)); + talloc_free(tmp_ctx); + return ret; + } + + ret = dsdb_schema_from_ldb_results(tmp_ctx, ldb, + lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), + schema_res, a_res, c_res, schema, &error_string); + if (ret != LDB_SUCCESS) { + *error_string_out = talloc_asprintf(mem_ctx, + "dsdb_schema load failed: %s", + error_string); + talloc_free(tmp_ctx); + return ret; + } + talloc_steal(mem_ctx, *schema); + talloc_free(tmp_ctx); + + return LDB_SUCCESS; +} + static const struct { const char *name; @@ -1167,6 +1352,13 @@ const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, return NULL; } +/** + Return a list of linked attributes, in lDAPDisplayName format. + + This may be used to determine if a modification would require + backlinks to be updated, for example +*/ + WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *schema, TALLOC_CTX *mem_ctx, const char ***attr_list_ret) { const char **attr_list = NULL; @@ -1187,6 +1379,114 @@ WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *sche return WERR_OK; } +static char **merge_attr_list(TALLOC_CTX *mem_ctx, + char **attrs, const char **new_attrs) +{ + char **ret_attrs; + int i; + size_t new_len, orig_len = str_list_length((const char **)attrs); + if (!new_attrs) { + return attrs; + } + + ret_attrs = talloc_realloc(mem_ctx, + attrs, char *, orig_len + str_list_length(new_attrs) + 1); + if (ret_attrs) { + for (i=0; i < str_list_length(new_attrs); i++) { + ret_attrs[orig_len + i] = new_attrs[i]; + } + new_len = orig_len + str_list_length(new_attrs); + + ret_attrs[new_len] = NULL; + + } + + return ret_attrs; +} + +char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, + const char **class_list, + enum dsdb_attr_list_query query) +{ + int i; + const struct dsdb_class *class; + + char **attr_list = NULL; + char **recursive_list; + + for (i=0; class_list && class_list[i]; i++) { + class = dsdb_class_by_lDAPDisplayName(schema, class_list[i]); + + switch (query) { + case DSDB_SCHEMA_ALL_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + break; + + case DSDB_SCHEMA_ALL_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; + + case DSDB_SCHEMA_SYS_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + break; + + case DSDB_SCHEMA_SYS_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; + + case DSDB_SCHEMA_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + break; + + case DSDB_SCHEMA_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + break; + } + + recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, + class->systemAuxiliaryClass, + query); + + attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)recursive_list); + + recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, + class->auxiliaryClass, + query); + + attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)recursive_list); + + } + return attr_list; +} + +char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, + const char **class_list, + enum dsdb_attr_list_query query) +{ + char **attr_list = dsdb_full_attribute_list_internal(mem_ctx, schema, class_list, query); + size_t new_len = str_list_length((const char **)attr_list); + + /* Remove duplicates */ + if (new_len > 1) { + int i; + qsort(attr_list, new_len, + sizeof(*attr_list), + (comparison_fn_t)strcasecmp); + + for (i=1 ; i < new_len; i++) { + char **val1 = &attr_list[i-1]; + char **val2 = &attr_list[i]; + if (ldb_attr_cmp(*val1, *val2) == 0) { + memmove(val1, val2, (new_len - i) * sizeof( *attr_list)); + new_len--; + i--; + } + } + } + return attr_list; +} /** * Attach the schema to an opaque pointer on the ldb, so ldb modules * can find it -- cgit From b4691ad5601a9d3e3f8ff8b42314d5e2cb462cd2 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 11 Jul 2008 15:11:32 +1000 Subject: Use common code to fill in allowedAttributes in kludge_acl. This code is now in common with ad2oLschema. Andrew Bartlett (This used to be commit 0a797388ca442c3ad4809888897b1c63b65a7fdf) --- source4/dsdb/schema/schema_init.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 3a6a8f5553..71d952b944 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1404,7 +1404,8 @@ static char **merge_attr_list(TALLOC_CTX *mem_ctx, return ret_attrs; } -char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, +char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, + const struct dsdb_schema *schema, const char **class_list, enum dsdb_attr_list_query query) { @@ -1443,6 +1444,13 @@ char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema case DSDB_SCHEMA_MUST: attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); break; + + case DSDB_SCHEMA_ALL: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; } recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, @@ -1461,7 +1469,8 @@ char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, struct dsdb_schema return attr_list; } -char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, struct dsdb_schema *schema, +char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, + const struct dsdb_schema *schema, const char **class_list, enum dsdb_attr_list_query query) { -- cgit From 05583308fe8278f1bc0c815e23cf5e470a81e12f Mon Sep 17 00:00:00 2001 From: Anatoliy Atanasov Date: Mon, 21 Jul 2008 17:04:49 +0300 Subject: dsdb_create_prefix_mapping() implementation checks for existing prefix maping in ldb. if one not found it creates a mapping for it and updates the prefixMap schema attribute in ldb. (This used to be commit bbe895db7144b192981fad9ab6bbd3ebacb8d299) --- source4/dsdb/schema/schema_init.c | 293 +++++++++++++++++++++++++++++++++----- 1 file changed, 257 insertions(+), 36 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 71d952b944..2ec5ad34b1 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -267,19 +267,146 @@ WERROR dsdb_verify_oid_mappings_drsuapi(const struct dsdb_schema *schema, const } WERROR dsdb_map_oid2int(const struct dsdb_schema *schema, const char *in, uint32_t *out) +{ + return dsdb_find_prefix_for_oid(schema->num_prefixes, schema->prefixes, in, out); +} + + +WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out) { uint32_t i; for (i=0; i < schema->num_prefixes; i++) { + const char *val; + if (schema->prefixes[i].id != (in & 0xFFFF0000)) { + continue; + } + + val = talloc_asprintf(mem_ctx, "%s%u", + schema->prefixes[i].oid, + in & 0xFFFF); + W_ERROR_HAVE_NO_MEMORY(val); + + *out = val; + return WERR_OK; + } + + return WERR_DS_NO_MSDS_INTID; +} + +/* + * this function is called from within a ldb transaction from the schema_fsmo module + */ +WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *schema, const char *full_oid) +{ + WERROR status; + uint32_t num_prefixes; + struct dsdb_schema_oid_prefix *prefixes; + struct ldb_val ndr_blob; + TALLOC_CTX *mem_ctx; + uint32_t out; + + mem_ctx = talloc_new(ldb); + W_ERROR_HAVE_NO_MEMORY(mem_ctx); + + /* Read prefixes from disk*/ + status = dsdb_read_prefixes_from_ldb( mem_ctx, ldb, &num_prefixes, &prefixes ); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb failed\n")); + talloc_free(mem_ctx); + return status; + } + + /* Check if there is a prefix for the oid in the prefixes array*/ + status = dsdb_find_prefix_for_oid( num_prefixes, prefixes, full_oid, &out ); + if (W_ERROR_IS_OK(status)) { + /* prefix found*/ + talloc_free(mem_ctx); + return status; + } + /* Update prefix map in ldb*/ + /* Update the prefixes */ + status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update failed\n")); + talloc_free(mem_ctx); + return status; + } + /* Convert prefixes in ndr blob*/ + status = dsdb_write_prefixes_to_ndr( mem_ctx, ldb, num_prefixes, prefixes, &ndr_blob ); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ndr failed\n")); + talloc_free(mem_ctx); + return status; + } + + /* Update prefixMap in ldb*/ + status = dsdb_write_prefixes_to_ldb( mem_ctx, ldb, &ndr_blob ); + if (!W_ERROR_IS_OK(status)) { + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ldb failed\n")); + talloc_free(mem_ctx); + return status; + } + + talloc_free(mem_ctx); + return status; +} + +WERROR dsdb_prefix_map_update(TALLOC_CTX *mem_ctx, uint32_t *num_prefixes, struct dsdb_schema_oid_prefix **prefixes, const char *oid) +{ + uint32_t new_num_prefixes, index_new_prefix, new_entry_id; + const char* lastDotOffset; + size_t size; + + new_num_prefixes = *num_prefixes + 1; + index_new_prefix = *num_prefixes; + new_entry_id = (*num_prefixes)<<16; + + /* Extract the prefix from the oid*/ + lastDotOffset = strrchr(oid, '.'); + if (lastDotOffset == NULL) { + DEBUG(0,("dsdb_prefix_map_update: failed to find the last dot\n")); + return WERR_NOT_FOUND; + } + + /* Calculate the size of the remainig string that should be the prefix of it */ + size = strlen(oid) - strlen(lastDotOffset); + if (size <= 0) { + DEBUG(0,("dsdb_prefix_map_update: size of the remaining string invalid\n")); + return WERR_FOOBAR; + } + /* Add one because we need to copy the dot */ + size += 1; + + /* Create a spot in the prefixMap for one more prefix*/ + (*prefixes) = talloc_realloc(mem_ctx, *prefixes, struct dsdb_schema_oid_prefix, new_num_prefixes); + W_ERROR_HAVE_NO_MEMORY(*prefixes); + + /* Add the new prefix entry*/ + (*prefixes)[index_new_prefix].id = new_entry_id; + (*prefixes)[index_new_prefix].oid = talloc_strndup(mem_ctx, oid, size); + (*prefixes)[index_new_prefix].oid_len = strlen((*prefixes)[index_new_prefix].oid); + + /* Increase num_prefixes because new prefix has been added */ + ++(*num_prefixes); + + return WERR_OK; +} + +WERROR dsdb_find_prefix_for_oid(uint32_t num_prefixes, const struct dsdb_schema_oid_prefix *prefixes, const char *in, uint32_t *out) +{ + uint32_t i; + + for (i=0; i < num_prefixes; i++) { const char *val_str; char *end_str; unsigned val; - if (strncmp(schema->prefixes[i].oid, in, schema->prefixes[i].oid_len) != 0) { + if (strncmp(prefixes[i].oid, in, prefixes[i].oid_len) != 0) { continue; } - val_str = in + schema->prefixes[i].oid_len; + val_str = in + prefixes[i].oid_len; end_str = NULL; errno = 0; @@ -305,58 +432,152 @@ WERROR dsdb_map_oid2int(const struct dsdb_schema *schema, const char *in, uint32 return WERR_INVALID_PARAM; } - *out = schema->prefixes[i].id | val; + *out = prefixes[i].id | val; return WERR_OK; } return WERR_DS_NO_MSDS_INTID; } -WERROR dsdb_map_int2oid(const struct dsdb_schema *schema, uint32_t in, TALLOC_CTX *mem_ctx, const char **out) +WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, struct ldb_val *ndr_blob) { + struct ldb_message msg; + struct ldb_dn *schema_dn; + struct ldb_message_element el; + int ret; + + schema_dn = samdb_schema_dn(ldb); + if (!schema_dn) { + DEBUG(0,("dsdb_write_prefixes_to_ldb: no schema dn present\n")); + return WERR_FOOBAR; + } + + el.num_values = 1; + el.values = ndr_blob; + el.flags = LDB_FLAG_MOD_REPLACE; + el.name = talloc_strdup(mem_ctx, "prefixMap"); + + msg.dn = ldb_dn_copy(mem_ctx, schema_dn); + msg.num_elements = 1; + msg.elements = ⪙ + + ret = ldb_modify( ldb, &msg ); + if (ret != 0) { + DEBUG(0,("dsdb_write_prefixes_to_ldb: ldb_modify failed\n")); + return WERR_FOOBAR; + } + + return WERR_OK; +} + +WERROR dsdb_read_prefixes_from_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, uint32_t* num_prefixes, struct dsdb_schema_oid_prefix **prefixes) +{ + struct prefixMapBlob *blob; + enum ndr_err_code ndr_err; uint32_t i; + const struct ldb_val *prefix_val; + struct ldb_dn *schema_dn; + struct ldb_result *schema_res; + int ret; + static const char *schema_attrs[] = { + "prefixMap", + NULL + }; - for (i=0; i < schema->num_prefixes; i++) { - const char *val; - if (schema->prefixes[i].id != (in & 0xFFFF0000)) { - continue; - } + schema_dn = samdb_schema_dn(ldb); + if (!schema_dn) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: no schema dn present\n")); + return WERR_FOOBAR; + } - val = talloc_asprintf(mem_ctx, "%s%u", - schema->prefixes[i].oid, - in & 0xFFFF); - W_ERROR_HAVE_NO_MEMORY(val); + ret = ldb_search(ldb, schema_dn, LDB_SCOPE_BASE,NULL, schema_attrs,&schema_res); + if (ret == LDB_ERR_NO_SUCH_OBJECT) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: no prefix map present\n")); + return WERR_FOOBAR; + } else if (ret != LDB_SUCCESS) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: failed to search the schema head\n")); + return WERR_FOOBAR; + } - *out = val; - return WERR_OK; + prefix_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "prefixMap"); + if (!prefix_val) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: no prefixMap attribute found\n")); + return WERR_FOOBAR; } - return WERR_DS_NO_MSDS_INTID; + blob = talloc(mem_ctx, struct prefixMapBlob); + W_ERROR_HAVE_NO_MEMORY(blob); + + ndr_err = ndr_pull_struct_blob(prefix_val, blob, + lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), + blob, + (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: ndr_pull_struct_blob failed\n")); + talloc_free(blob); + return WERR_FOOBAR; + } + + if (blob->version != PREFIX_MAP_VERSION_DSDB) { + DEBUG(0,("dsdb_read_prefixes_from_ldb: blob->version incorect\n")); + talloc_free(blob); + return WERR_FOOBAR; + } + + *num_prefixes = blob->ctr.dsdb.num_mappings; + *prefixes = talloc_array(mem_ctx, struct dsdb_schema_oid_prefix, *num_prefixes); + if(!(*prefixes)) { + talloc_free(blob); + return WERR_NOMEM; + } + for (i=0; i < blob->ctr.dsdb.num_mappings; i++) { + (*prefixes)[i].id = blob->ctr.dsdb.mappings[i].id_prefix<<16; + (*prefixes)[i].oid = talloc_strdup(mem_ctx, blob->ctr.dsdb.mappings[i].oid.oid); + (*prefixes)[i].oid = talloc_asprintf_append((*prefixes)[i].oid, "."); + (*prefixes)[i].oid_len = strlen(blob->ctr.dsdb.mappings[i].oid.oid); + } + + talloc_free(blob); + return WERR_OK; } -/* - * this function is called from within a ldb transaction from the schema_fsmo module - */ -WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *schema, const char *full_oid) + +WERROR dsdb_write_prefixes_to_ndr(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, uint32_t num_prefixes, const struct dsdb_schema_oid_prefix *prefixes, struct ldb_val *out) { - /* - * TODO: - * - (maybe) read the old prefixMap attribute and parse it - * - * - recheck the prefix doesn't exist (because the ldb - * has maybe a more uptodate value than schem->prefixes - * - * - calculate a new mapping for the oid prefix of full_oid - * - store the new prefixMap attribute - * - * - (maybe) update schema->prefixes - * or - * - better find a way to indicate a schema reload, - * so that other processes also notice the schema change - */ - return WERR_NOT_SUPPORTED; + struct prefixMapBlob *blob; + enum ndr_err_code ndr_err; + uint32_t i; + + blob = talloc_zero(mem_ctx, struct prefixMapBlob); + W_ERROR_HAVE_NO_MEMORY(blob); + + blob->version = PREFIX_MAP_VERSION_DSDB; + blob->ctr.dsdb.num_mappings = num_prefixes; + blob->ctr.dsdb.mappings = talloc_realloc(blob, + blob->ctr.dsdb.mappings, + struct drsuapi_DsReplicaOIDMapping, + blob->ctr.dsdb.num_mappings); + if (!blob->ctr.dsdb.mappings) { + return WERR_NOMEM; + } + + for (i=0; i < num_prefixes; i++) { + blob->ctr.dsdb.mappings[i].id_prefix = prefixes[i].id>>16; + blob->ctr.dsdb.mappings[i].oid.oid = talloc_strdup(blob->ctr.dsdb.mappings, prefixes[i].oid); + } + + ndr_err = ndr_push_struct_blob(out, ldb, + lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), + blob, + (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return WERR_FOOBAR; + } + + return WERR_OK; } + #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, attr, NULL);\ if (strict && (p)->elem == NULL) { \ -- cgit From 404846d8871d3d420e83a3e48625bb051faf893e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 25 Jul 2008 11:58:24 +1000 Subject: Try to avoid a memory leak if we re-set the global schema However, try also not to pull a schema out from under a running ldb session. Andrew Bartlett (This used to be commit 7cf9b9dd0bb35835a7c6e9897ea99951a33c63c7) --- source4/dsdb/schema/schema_init.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 71d952b944..75457b4bea 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1534,6 +1534,11 @@ int dsdb_set_global_schema(struct ldb_context *ldb) return ret; } + /* Keep a reference to this schema, just incase the global copy is replaced */ + if (talloc_reference(ldb, global_schema) == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + return LDB_SUCCESS; } @@ -1571,6 +1576,10 @@ void dsdb_make_schema_global(struct ldb_context *ldb) return; } + if (global_schema) { + talloc_unlink(talloc_autofree_context(), schema); + } + talloc_steal(talloc_autofree_context(), schema); global_schema = schema; -- cgit From 118ecc54ba19330b30d207e51611ff5f85b2cdca Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 24 Jul 2008 09:53:29 +0200 Subject: dsdb/schema: dsdb_write_prefixes_to_ldb() should do the reverse of dsdb_read_prefixes_to_ldb() metze (This used to be commit 34ea9d4a0b1270a27412bf939d7e897a5d68d0a6) --- source4/dsdb/schema/schema_init.c | 96 ++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 52 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 706c8e24d2..2385f224e8 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -302,7 +302,6 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s WERROR status; uint32_t num_prefixes; struct dsdb_schema_oid_prefix *prefixes; - struct ldb_val ndr_blob; TALLOC_CTX *mem_ctx; uint32_t out; @@ -312,7 +311,8 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s /* Read prefixes from disk*/ status = dsdb_read_prefixes_from_ldb( mem_ctx, ldb, &num_prefixes, &prefixes ); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_read_prefixes_from_ldb: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } @@ -323,27 +323,28 @@ WERROR dsdb_create_prefix_mapping(struct ldb_context *ldb, struct dsdb_schema *s /* prefix found*/ talloc_free(mem_ctx); return status; - } - /* Update prefix map in ldb*/ - /* Update the prefixes */ - status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update failed\n")); + } else if (!W_ERROR_EQUAL(WERR_DS_NO_MSDS_INTID, status)) { + /* error */ + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_find_prefix_for_oid: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } - /* Convert prefixes in ndr blob*/ - status = dsdb_write_prefixes_to_ndr( mem_ctx, ldb, num_prefixes, prefixes, &ndr_blob ); + + /* Create the new mapping for the prefix of full_oid */ + status = dsdb_prefix_map_update(mem_ctx, &num_prefixes, &prefixes, full_oid); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ndr failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_prefix_map_update: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } /* Update prefixMap in ldb*/ - status = dsdb_write_prefixes_to_ldb( mem_ctx, ldb, &ndr_blob ); + status = dsdb_write_prefixes_to_ldb(mem_ctx, ldb, num_prefixes, prefixes); if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ldb failed\n")); + DEBUG(0,("dsdb_create_prefix_mapping: dsdb_write_prefixes_to_ldb: %s\n", + win_errstr(status))); talloc_free(mem_ctx); return status; } @@ -439,11 +440,17 @@ WERROR dsdb_find_prefix_for_oid(uint32_t num_prefixes, const struct dsdb_schema_ return WERR_DS_NO_MSDS_INTID; } -WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, struct ldb_val *ndr_blob) +WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, + uint32_t num_prefixes, + const struct dsdb_schema_oid_prefix *prefixes) { struct ldb_message msg; struct ldb_dn *schema_dn; struct ldb_message_element el; + struct prefixMapBlob pm; + struct ldb_val ndr_blob; + enum ndr_err_code ndr_err; + uint32_t i; int ret; schema_dn = samdb_schema_dn(ldb); @@ -451,9 +458,31 @@ WERROR dsdb_write_prefixes_to_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, DEBUG(0,("dsdb_write_prefixes_to_ldb: no schema dn present\n")); return WERR_FOOBAR; } + + pm.version = PREFIX_MAP_VERSION_DSDB; + pm.ctr.dsdb.num_mappings = num_prefixes; + pm.ctr.dsdb.mappings = talloc_array(mem_ctx, + struct drsuapi_DsReplicaOIDMapping, + pm.ctr.dsdb.num_mappings); + if (!pm.ctr.dsdb.mappings) { + return WERR_NOMEM; + } + + for (i=0; i < num_prefixes; i++) { + pm.ctr.dsdb.mappings[i].id_prefix = prefixes[i].id>>16; + pm.ctr.dsdb.mappings[i].oid.oid = talloc_strdup(pm.ctr.dsdb.mappings, prefixes[i].oid); + } + + ndr_err = ndr_push_struct_blob(&ndr_blob, ldb, + lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), + &pm, + (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { + return WERR_FOOBAR; + } el.num_values = 1; - el.values = ndr_blob; + el.values = &ndr_blob; el.flags = LDB_FLAG_MOD_REPLACE; el.name = talloc_strdup(mem_ctx, "prefixMap"); @@ -541,43 +570,6 @@ WERROR dsdb_read_prefixes_from_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, return WERR_OK; } - -WERROR dsdb_write_prefixes_to_ndr(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, uint32_t num_prefixes, const struct dsdb_schema_oid_prefix *prefixes, struct ldb_val *out) -{ - struct prefixMapBlob *blob; - enum ndr_err_code ndr_err; - uint32_t i; - - blob = talloc_zero(mem_ctx, struct prefixMapBlob); - W_ERROR_HAVE_NO_MEMORY(blob); - - blob->version = PREFIX_MAP_VERSION_DSDB; - blob->ctr.dsdb.num_mappings = num_prefixes; - blob->ctr.dsdb.mappings = talloc_realloc(blob, - blob->ctr.dsdb.mappings, - struct drsuapi_DsReplicaOIDMapping, - blob->ctr.dsdb.num_mappings); - if (!blob->ctr.dsdb.mappings) { - return WERR_NOMEM; - } - - for (i=0; i < num_prefixes; i++) { - blob->ctr.dsdb.mappings[i].id_prefix = prefixes[i].id>>16; - blob->ctr.dsdb.mappings[i].oid.oid = talloc_strdup(blob->ctr.dsdb.mappings, prefixes[i].oid); - } - - ndr_err = ndr_push_struct_blob(out, ldb, - lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), - blob, - (ndr_push_flags_fn_t)ndr_push_prefixMapBlob); - if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { - return WERR_FOOBAR; - } - - return WERR_OK; -} - - #define GET_STRING_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ (p)->elem = samdb_result_string(msg, attr, NULL);\ if (strict && (p)->elem == NULL) { \ -- cgit From 2385e33095bbf01076b1e591f95e20eba7a7df37 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 24 Jul 2008 09:55:53 +0200 Subject: dsdb/schema: make more clear where we create the value for the new prefix mapping metze (This used to be commit c92eb8b776c17f12622837daeb1786862f380269) --- source4/dsdb/schema/schema_init.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 2385f224e8..9b8959466d 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -361,6 +361,12 @@ WERROR dsdb_prefix_map_update(TALLOC_CTX *mem_ctx, uint32_t *num_prefixes, struc new_num_prefixes = *num_prefixes + 1; index_new_prefix = *num_prefixes; + + /* + * this is the algorithm we use to create new mappings for now + * + * TODO: find what algorithm windows use + */ new_entry_id = (*num_prefixes)<<16; /* Extract the prefix from the oid*/ -- cgit From 5971fd6b9c7520456c30d8989c346d97b28c801d Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 28 Jul 2008 08:02:18 +1000 Subject: Fix warnings in new prefixMap code (This used to be commit b8770a4fd8408473593fa4c6600bce056183958d) --- source4/dsdb/schema/schema_init.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 9b8959466d..85fdbe9e87 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -566,9 +566,10 @@ WERROR dsdb_read_prefixes_from_ldb(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, return WERR_NOMEM; } for (i=0; i < blob->ctr.dsdb.num_mappings; i++) { + char *oid; (*prefixes)[i].id = blob->ctr.dsdb.mappings[i].id_prefix<<16; - (*prefixes)[i].oid = talloc_strdup(mem_ctx, blob->ctr.dsdb.mappings[i].oid.oid); - (*prefixes)[i].oid = talloc_asprintf_append((*prefixes)[i].oid, "."); + oid = talloc_strdup(mem_ctx, blob->ctr.dsdb.mappings[i].oid.oid); + (*prefixes)[i].oid = talloc_asprintf_append(oid, "."); (*prefixes)[i].oid_len = strlen(blob->ctr.dsdb.mappings[i].oid.oid); } -- cgit From 16112762e70879b50f1dfc49452d6d278bd256cf Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 15 Aug 2008 20:40:57 +1000 Subject: Generate the subSchema in cn=Aggregate This reads the schema from the in-memory structure, when the magic attributes are requested. The code is a modified version of that used in the ad2oLschema tool (now shared). The schema_fsmo module handles the insertion of the generated result. As such, this commit also removes these entries from the setup/schema.ldif Metze's previous stub of this functionality is also removed. Andrew Bartlett (This used to be commit c7c32ec7b42bdf0f7b669644516438c71b364e60) --- source4/dsdb/schema/schema_init.c | 97 ++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 42 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 85fdbe9e87..65df25ca3f 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1599,8 +1599,8 @@ WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *sche return WERR_OK; } -static char **merge_attr_list(TALLOC_CTX *mem_ctx, - char **attrs, const char **new_attrs) +char **merge_attr_list(TALLOC_CTX *mem_ctx, + char **attrs, const char **new_attrs) { char **ret_attrs; int i; @@ -1618,60 +1618,73 @@ static char **merge_attr_list(TALLOC_CTX *mem_ctx, new_len = orig_len + str_list_length(new_attrs); ret_attrs[new_len] = NULL; - } return ret_attrs; } -char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, - const struct dsdb_schema *schema, - const char **class_list, - enum dsdb_attr_list_query query) +/* + Return a merged list of the attributes of exactly one class (not + considering subclasses, auxillary classes etc) +*/ + +char **dsdb_attribute_list(TALLOC_CTX *mem_ctx, const struct dsdb_class *class, enum dsdb_attr_list_query query) +{ + char **attr_list = NULL; + switch (query) { + case DSDB_SCHEMA_ALL_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + break; + + case DSDB_SCHEMA_ALL_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; + + case DSDB_SCHEMA_SYS_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + break; + + case DSDB_SCHEMA_SYS_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; + + case DSDB_SCHEMA_MAY: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + break; + + case DSDB_SCHEMA_MUST: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + break; + + case DSDB_SCHEMA_ALL: + attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); + attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); + break; + } + return attr_list; +} + +static char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, + const struct dsdb_schema *schema, + const char **class_list, + enum dsdb_attr_list_query query) { int i; const struct dsdb_class *class; char **attr_list = NULL; + char **this_class_list; char **recursive_list; for (i=0; class_list && class_list[i]; i++) { class = dsdb_class_by_lDAPDisplayName(schema, class_list[i]); - switch (query) { - case DSDB_SCHEMA_ALL_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - break; - - case DSDB_SCHEMA_ALL_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - - case DSDB_SCHEMA_SYS_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - break; - - case DSDB_SCHEMA_SYS_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - - case DSDB_SCHEMA_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - break; - - case DSDB_SCHEMA_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - break; - - case DSDB_SCHEMA_ALL: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - } + this_class_list = dsdb_attribute_list(mem_ctx, class, query); + attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)this_class_list); recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, class->systemAuxiliaryClass, @@ -1682,7 +1695,7 @@ char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, class->auxiliaryClass, query); - + attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)recursive_list); } -- cgit From dbde9cbea0a1d767c88b6cb3390c9fa1d949efe2 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 18 Aug 2008 20:20:24 +1000 Subject: Fix segfaults when loading the schema fails. (This used to be commit 9643db1a011edc95aa903908cec708b3a3566e71) --- source4/dsdb/schema/schema_init.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 65df25ca3f..73be580347 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -809,7 +809,6 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, if (!prefix_val) { *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: no prefixMap attribute found"); - talloc_free(mem_ctx); return LDB_ERR_CONSTRAINT_VIOLATION; } info_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "schemaInfo"); @@ -828,7 +827,6 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, *error_string = talloc_asprintf(mem_ctx, "schema_fsmo_init: failed to load oid mappings: %s", win_errstr(status)); - talloc_free(mem_ctx); return LDB_ERR_CONSTRAINT_VIOLATION; } @@ -847,7 +845,6 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, "schema_fsmo_init: failed to load attribute definition: %s:%s", ldb_dn_get_linearized(attrs_res->msgs[i]->dn), win_errstr(status)); - talloc_free(mem_ctx); return LDB_ERR_CONSTRAINT_VIOLATION; } @@ -869,7 +866,6 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, "schema_fsmo_init: failed to load class definition: %s:%s", ldb_dn_get_linearized(objectclass_res->msgs[i]->dn), win_errstr(status)); - talloc_free(mem_ctx); return LDB_ERR_CONSTRAINT_VIOLATION; } @@ -914,7 +910,6 @@ static int fetch_oc_recursive(struct ldb_context *ldb, struct ldb_dn *schemadn, "(&(&(objectClass=classSchema)(subClassOf=%s))(!(lDAPDisplayName=%s)))", name, name); if (ret != LDB_SUCCESS) { - printf("Search failed: %s\n", ldb_errstring(ldb)); return ret; } @@ -940,7 +935,8 @@ static int fetch_oc_recursive(struct ldb_context *ldb, struct ldb_dn *schemadn, static int fetch_objectclass_schema(struct ldb_context *ldb, struct ldb_dn *schemadn, TALLOC_CTX *mem_ctx, - struct ldb_result **objectclasses_res) + struct ldb_result **objectclasses_res, + char **error_string) { TALLOC_CTX *local_ctx = talloc_new(mem_ctx); struct ldb_result *top_res, *ret_res; @@ -949,19 +945,23 @@ static int fetch_objectclass_schema(struct ldb_context *ldb, struct ldb_dn *sche return LDB_ERR_OPERATIONS_ERROR; } - /* Downlaod 'top' */ + /* Download 'top' */ ret = ldb_search(ldb, schemadn, LDB_SCOPE_SUBTREE, "(&(objectClass=classSchema)(lDAPDisplayName=top))", NULL, &top_res); if (ret != LDB_SUCCESS) { - printf("Search failed: %s\n", ldb_errstring(ldb)); - return LDB_ERR_OPERATIONS_ERROR; + *error_string = talloc_asprintf(mem_ctx, + "dsdb_schema: failed to search for top classSchema object: %s", + ldb_errstring(ldb)); + return ret; } talloc_steal(local_ctx, top_res); if (top_res->count != 1) { - return LDB_ERR_OPERATIONS_ERROR; + *error_string = talloc_asprintf(mem_ctx, + "dsdb_schema: failed to find top classSchema object"); + return LDB_ERR_NO_SUCH_OBJECT; } ret_res = talloc_zero(local_ctx, struct ldb_result); @@ -972,8 +972,7 @@ static int fetch_objectclass_schema(struct ldb_context *ldb, struct ldb_dn *sche ret = fetch_oc_recursive(ldb, schemadn, local_ctx, top_res, ret_res); if (ret != LDB_SUCCESS) { - printf("Search failed: %s\n", ldb_errstring(ldb)); - return LDB_ERR_OPERATIONS_ERROR; + return ret; } *objectclasses_res = talloc_move(mem_ctx, &ret_res); @@ -1051,10 +1050,10 @@ int dsdb_schema_from_schema_dn(TALLOC_CTX *mem_ctx, struct ldb_context *ldb, /* * load the objectClass definitions */ - ret = fetch_objectclass_schema(ldb, schema_dn, tmp_ctx, &c_res); + ret = fetch_objectclass_schema(ldb, schema_dn, tmp_ctx, &c_res, &error_string); if (ret != LDB_SUCCESS) { *error_string_out = talloc_asprintf(mem_ctx, - "Failed to fetch objectClass schema elements: %s\n", ldb_errstring(ldb)); + "Failed to fetch objectClass schema elements: %s", error_string); talloc_free(tmp_ctx); return ret; } -- cgit From 18e86ccf86946a7582a11485f9369bf59988c17b Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 20 Aug 2008 13:22:16 +1000 Subject: Split schema_init.c into smaller bits. This should make schema manipulation a little easier to follow. Andrew Bartlett (This used to be commit 300ed83526e75d834bd23ddd1c1c26ebe2555e0f) --- source4/dsdb/schema/schema_init.c | 545 -------------------------------------- 1 file changed, 545 deletions(-) (limited to 'source4/dsdb/schema/schema_init.c') diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 73be580347..3ed7daee59 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -1409,548 +1409,3 @@ WERROR dsdb_class_from_drsuapi(struct dsdb_schema *schema, return WERR_OK; } -const struct dsdb_attribute *dsdb_attribute_by_attributeID_id(const struct dsdb_schema *schema, - uint32_t id) -{ - struct dsdb_attribute *cur; - - /* - * 0xFFFFFFFF is used as value when no mapping table is available, - * so don't try to match with it - */ - if (id == 0xFFFFFFFF) return NULL; - - /* TODO: add binary search */ - for (cur = schema->attributes; cur; cur = cur->next) { - if (cur->attributeID_id != id) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_attribute *dsdb_attribute_by_attributeID_oid(const struct dsdb_schema *schema, - const char *oid) -{ - struct dsdb_attribute *cur; - - if (!oid) return NULL; - - /* TODO: add binary search */ - for (cur = schema->attributes; cur; cur = cur->next) { - if (strcmp(cur->attributeID_oid, oid) != 0) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_attribute *dsdb_attribute_by_lDAPDisplayName(const struct dsdb_schema *schema, - const char *name) -{ - struct dsdb_attribute *cur; - - if (!name) return NULL; - - /* TODO: add binary search */ - for (cur = schema->attributes; cur; cur = cur->next) { - if (strcasecmp(cur->lDAPDisplayName, name) != 0) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_attribute *dsdb_attribute_by_linkID(const struct dsdb_schema *schema, - int linkID) -{ - struct dsdb_attribute *cur; - - /* TODO: add binary search */ - for (cur = schema->attributes; cur; cur = cur->next) { - if (cur->linkID != linkID) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_class *dsdb_class_by_governsID_id(const struct dsdb_schema *schema, - uint32_t id) -{ - struct dsdb_class *cur; - - /* - * 0xFFFFFFFF is used as value when no mapping table is available, - * so don't try to match with it - */ - if (id == 0xFFFFFFFF) return NULL; - - /* TODO: add binary search */ - for (cur = schema->classes; cur; cur = cur->next) { - if (cur->governsID_id != id) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_class *dsdb_class_by_governsID_oid(const struct dsdb_schema *schema, - const char *oid) -{ - struct dsdb_class *cur; - - if (!oid) return NULL; - - /* TODO: add binary search */ - for (cur = schema->classes; cur; cur = cur->next) { - if (strcmp(cur->governsID_oid, oid) != 0) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_class *dsdb_class_by_lDAPDisplayName(const struct dsdb_schema *schema, - const char *name) -{ - struct dsdb_class *cur; - - if (!name) return NULL; - - /* TODO: add binary search */ - for (cur = schema->classes; cur; cur = cur->next) { - if (strcasecmp(cur->lDAPDisplayName, name) != 0) continue; - - return cur; - } - - return NULL; -} - -const struct dsdb_class *dsdb_class_by_cn(const struct dsdb_schema *schema, - const char *cn) -{ - struct dsdb_class *cur; - - if (!cn) return NULL; - - /* TODO: add binary search */ - for (cur = schema->classes; cur; cur = cur->next) { - if (strcasecmp(cur->cn, cn) != 0) continue; - - return cur; - } - - return NULL; -} - -const char *dsdb_lDAPDisplayName_by_id(const struct dsdb_schema *schema, - uint32_t id) -{ - const struct dsdb_attribute *a; - const struct dsdb_class *c; - - /* TODO: add binary search */ - a = dsdb_attribute_by_attributeID_id(schema, id); - if (a) { - return a->lDAPDisplayName; - } - - c = dsdb_class_by_governsID_id(schema, id); - if (c) { - return c->lDAPDisplayName; - } - - return NULL; -} - -/** - Return a list of linked attributes, in lDAPDisplayName format. - - This may be used to determine if a modification would require - backlinks to be updated, for example -*/ - -WERROR dsdb_linked_attribute_lDAPDisplayName_list(const struct dsdb_schema *schema, TALLOC_CTX *mem_ctx, const char ***attr_list_ret) -{ - const char **attr_list = NULL; - struct dsdb_attribute *cur; - int i = 0; - for (cur = schema->attributes; cur; cur = cur->next) { - if (cur->linkID == 0) continue; - - attr_list = talloc_realloc(mem_ctx, attr_list, const char *, i+2); - if (!attr_list) { - return WERR_NOMEM; - } - attr_list[i] = cur->lDAPDisplayName; - i++; - } - attr_list[i] = NULL; - *attr_list_ret = attr_list; - return WERR_OK; -} - -char **merge_attr_list(TALLOC_CTX *mem_ctx, - char **attrs, const char **new_attrs) -{ - char **ret_attrs; - int i; - size_t new_len, orig_len = str_list_length((const char **)attrs); - if (!new_attrs) { - return attrs; - } - - ret_attrs = talloc_realloc(mem_ctx, - attrs, char *, orig_len + str_list_length(new_attrs) + 1); - if (ret_attrs) { - for (i=0; i < str_list_length(new_attrs); i++) { - ret_attrs[orig_len + i] = new_attrs[i]; - } - new_len = orig_len + str_list_length(new_attrs); - - ret_attrs[new_len] = NULL; - } - - return ret_attrs; -} - -/* - Return a merged list of the attributes of exactly one class (not - considering subclasses, auxillary classes etc) -*/ - -char **dsdb_attribute_list(TALLOC_CTX *mem_ctx, const struct dsdb_class *class, enum dsdb_attr_list_query query) -{ - char **attr_list = NULL; - switch (query) { - case DSDB_SCHEMA_ALL_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - break; - - case DSDB_SCHEMA_ALL_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - - case DSDB_SCHEMA_SYS_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - break; - - case DSDB_SCHEMA_SYS_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - - case DSDB_SCHEMA_MAY: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - break; - - case DSDB_SCHEMA_MUST: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - break; - - case DSDB_SCHEMA_ALL: - attr_list = merge_attr_list(mem_ctx, attr_list, class->mayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMayContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->mustContain); - attr_list = merge_attr_list(mem_ctx, attr_list, class->systemMustContain); - break; - } - return attr_list; -} - -static char **dsdb_full_attribute_list_internal(TALLOC_CTX *mem_ctx, - const struct dsdb_schema *schema, - const char **class_list, - enum dsdb_attr_list_query query) -{ - int i; - const struct dsdb_class *class; - - char **attr_list = NULL; - char **this_class_list; - char **recursive_list; - - for (i=0; class_list && class_list[i]; i++) { - class = dsdb_class_by_lDAPDisplayName(schema, class_list[i]); - - this_class_list = dsdb_attribute_list(mem_ctx, class, query); - attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)this_class_list); - - recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, - class->systemAuxiliaryClass, - query); - - attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)recursive_list); - - recursive_list = dsdb_full_attribute_list_internal(mem_ctx, schema, - class->auxiliaryClass, - query); - - attr_list = merge_attr_list(mem_ctx, attr_list, (const char **)recursive_list); - - } - return attr_list; -} - -char **dsdb_full_attribute_list(TALLOC_CTX *mem_ctx, - const struct dsdb_schema *schema, - const char **class_list, - enum dsdb_attr_list_query query) -{ - char **attr_list = dsdb_full_attribute_list_internal(mem_ctx, schema, class_list, query); - size_t new_len = str_list_length((const char **)attr_list); - - /* Remove duplicates */ - if (new_len > 1) { - int i; - qsort(attr_list, new_len, - sizeof(*attr_list), - (comparison_fn_t)strcasecmp); - - for (i=1 ; i < new_len; i++) { - char **val1 = &attr_list[i-1]; - char **val2 = &attr_list[i]; - if (ldb_attr_cmp(*val1, *val2) == 0) { - memmove(val1, val2, (new_len - i) * sizeof( *attr_list)); - new_len--; - i--; - } - } - } - return attr_list; -} -/** - * Attach the schema to an opaque pointer on the ldb, so ldb modules - * can find it - */ - -int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema) -{ - int ret; - - ret = ldb_set_opaque(ldb, "dsdb_schema", schema); - if (ret != LDB_SUCCESS) { - return ret; - } - - talloc_steal(ldb, schema); - - return LDB_SUCCESS; -} - -/** - * Global variable to hold one copy of the schema, used to avoid memory bloat - */ -static struct dsdb_schema *global_schema; - -/** - * Make this ldb use the 'global' schema, setup to avoid having multiple copies in this process - */ -int dsdb_set_global_schema(struct ldb_context *ldb) -{ - int ret; - if (!global_schema) { - return LDB_SUCCESS; - } - ret = ldb_set_opaque(ldb, "dsdb_schema", global_schema); - if (ret != LDB_SUCCESS) { - return ret; - } - - /* Keep a reference to this schema, just incase the global copy is replaced */ - if (talloc_reference(ldb, global_schema) == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - return LDB_SUCCESS; -} - -/** - * Find the schema object for this ldb - */ - -struct dsdb_schema *dsdb_get_schema(struct ldb_context *ldb) -{ - const void *p; - struct dsdb_schema *schema; - - /* see if we have a cached copy */ - p = ldb_get_opaque(ldb, "dsdb_schema"); - if (!p) { - return NULL; - } - - schema = talloc_get_type(p, struct dsdb_schema); - if (!schema) { - return NULL; - } - - return schema; -} - -/** - * Make the schema found on this ldb the 'global' schema - */ - -void dsdb_make_schema_global(struct ldb_context *ldb) -{ - struct dsdb_schema *schema = dsdb_get_schema(ldb); - if (!schema) { - return; - } - - if (global_schema) { - talloc_unlink(talloc_autofree_context(), schema); - } - - talloc_steal(talloc_autofree_context(), schema); - global_schema = schema; - - dsdb_set_global_schema(ldb); -} - - -/** - * Rather than read a schema from the LDB itself, read it from an ldif - * file. This allows schema to be loaded and used while adding the - * schema itself to the directory. - */ - -WERROR dsdb_attach_schema_from_ldif_file(struct ldb_context *ldb, const char *pf, const char *df) -{ - struct ldb_ldif *ldif; - struct ldb_message *msg; - TALLOC_CTX *mem_ctx; - WERROR status; - int ret; - struct dsdb_schema *schema; - const struct ldb_val *prefix_val; - const struct ldb_val *info_val; - struct ldb_val info_val_default; - - mem_ctx = talloc_new(ldb); - if (!mem_ctx) { - goto nomem; - } - - schema = dsdb_new_schema(mem_ctx, lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm"))); - - schema->fsmo.we_are_master = true; - schema->fsmo.master_dn = ldb_dn_new_fmt(schema, ldb, "@PROVISION_SCHEMA_MASTER"); - if (!schema->fsmo.master_dn) { - goto nomem; - } - - /* - * load the prefixMap attribute from pf - */ - ldif = ldb_ldif_read_string(ldb, &pf); - if (!ldif) { - status = WERR_INVALID_PARAM; - goto failed; - } - talloc_steal(mem_ctx, ldif); - - msg = ldb_msg_canonicalize(ldb, ldif->msg); - if (!msg) { - goto nomem; - } - talloc_steal(mem_ctx, msg); - talloc_free(ldif); - - prefix_val = ldb_msg_find_ldb_val(msg, "prefixMap"); - if (!prefix_val) { - status = WERR_INVALID_PARAM; - goto failed; - } - - info_val = ldb_msg_find_ldb_val(msg, "schemaInfo"); - if (!info_val) { - info_val_default = strhex_to_data_blob("FF0000000000000000000000000000000000000000"); - if (!info_val_default.data) { - goto nomem; - } - talloc_steal(mem_ctx, info_val_default.data); - info_val = &info_val_default; - } - - status = dsdb_load_oid_mappings_ldb(schema, prefix_val, info_val); - if (!W_ERROR_IS_OK(status)) { - goto failed; - } - - /* - * load the attribute and class definitions outof df - */ - while ((ldif = ldb_ldif_read_string(ldb, &df))) { - bool is_sa; - bool is_sc; - - talloc_steal(mem_ctx, ldif); - - msg = ldb_msg_canonicalize(ldb, ldif->msg); - if (!msg) { - goto nomem; - } - - talloc_steal(mem_ctx, msg); - talloc_free(ldif); - - is_sa = ldb_msg_check_string_attribute(msg, "objectClass", "attributeSchema"); - is_sc = ldb_msg_check_string_attribute(msg, "objectClass", "classSchema"); - - if (is_sa) { - struct dsdb_attribute *sa; - - sa = talloc_zero(schema, struct dsdb_attribute); - if (!sa) { - goto nomem; - } - - status = dsdb_attribute_from_ldb(schema, msg, sa, sa); - if (!W_ERROR_IS_OK(status)) { - goto failed; - } - - DLIST_ADD_END(schema->attributes, sa, struct dsdb_attribute *); - } else if (is_sc) { - struct dsdb_class *sc; - - sc = talloc_zero(schema, struct dsdb_class); - if (!sc) { - goto nomem; - } - - status = dsdb_class_from_ldb(schema, msg, sc, sc); - if (!W_ERROR_IS_OK(status)) { - goto failed; - } - - DLIST_ADD_END(schema->classes, sc, struct dsdb_class *); - } - } - - ret = dsdb_set_schema(ldb, schema); - if (ret != LDB_SUCCESS) { - status = WERR_FOOBAR; - goto failed; - } - - goto done; - -nomem: - status = WERR_NOMEM; -failed: -done: - talloc_free(mem_ctx); - return status; -} -- cgit