/* register the samba ldif handlers */ int ldb_register_samba_handlers(struct ldb_context *ldb) { unsigned int i; int ret; if (ldb_get_opaque(ldb, "SAMBA_HANDLERS_REGISTERED") != NULL) { return LDB_SUCCESS; } ret = ldb_set_opaque(ldb, LDB_SECRET_ATTRIBUTE_LIST_OPAQUE, discard_const_p(char *, secret_attributes)); if (ret != LDB_SUCCESS) { return ret; } for (i=0; i < ARRAY_SIZE(samba_attributes); i++) { const struct ldb_schema_syntax *s = NULL; s = ldb_samba_syntax_by_name(ldb, samba_attributes[i].syntax); if (!s) { s = ldb_standard_syntax_by_name(ldb, samba_attributes[i].syntax); } if (!s) { return LDB_ERR_OPERATIONS_ERROR; } ret = ldb_schema_attribute_add_with_syntax(ldb, samba_attributes[i].name, LDB_ATTR_FLAG_FIXED, s); if (ret != LDB_SUCCESS) { return ret; } } for (i=0; i < ARRAY_SIZE(samba_dn_syntax); i++) { ret = ldb_dn_extended_add_syntax(ldb, LDB_ATTR_FLAG_FIXED, &samba_dn_syntax[i]); if (ret != LDB_SUCCESS) { return ret; } } ret = ldb_register_samba_matching_rules(ldb); if (ret != LDB_SUCCESS) { talloc_free(ldb); return LDB_SUCCESS; } ret = ldb_set_opaque(ldb, "SAMBA_HANDLERS_REGISTERED", (void*)1); if (ret != LDB_SUCCESS) { return ret; } return LDB_SUCCESS; }
/* setup the ldb_schema_attribute field for a dsdb_attribute */ static int dsdb_schema_setup_ldb_schema_attribute(struct ldb_context *ldb, struct dsdb_attribute *attr) { const char *syntax = attr->syntax->ldb_syntax; const struct ldb_schema_syntax *s; struct ldb_schema_attribute *a; if (!syntax) { syntax = attr->syntax->ldap_oid; } s = ldb_samba_syntax_by_lDAPDisplayName(ldb, attr->lDAPDisplayName); if (s == NULL) { s = ldb_samba_syntax_by_name(ldb, syntax); } if (s == NULL) { s = ldb_standard_syntax_by_name(ldb, syntax); } if (s == NULL) { return LDB_ERR_OPERATIONS_ERROR; } attr->ldb_schema_attribute = a = talloc(attr, struct ldb_schema_attribute); if (attr->ldb_schema_attribute == NULL) { ldb_oom(ldb); return LDB_ERR_OPERATIONS_ERROR; } a->name = attr->lDAPDisplayName; a->flags = 0; a->syntax = s; if (dsdb_schema_unique_attribute(a->name)) { a->flags |= LDB_ATTR_FLAG_UNIQUE_INDEX; } if (attr->isSingleValued) { a->flags |= LDB_ATTR_FLAG_SINGLE_VALUE; } return LDB_SUCCESS; }
/* register any special handlers from @ATTRIBUTES */ static int ltdb_attributes_load(struct ldb_module *module) { struct ldb_context *ldb; void *data = ldb_module_get_private(module); struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private); struct ldb_message *msg = ltdb->cache->attributes; struct ldb_dn *dn; unsigned int i; int r; ldb = ldb_module_get_ctx(module); if (ldb->schema.attribute_handler_override) { /* we skip loading the @ATTRIBUTES record when a module is supplying its own attribute handling */ return 0; } dn = ldb_dn_new(module, ldb, LTDB_ATTRIBUTES); if (dn == NULL) goto failed; r = ltdb_search_dn1(module, dn, msg); talloc_free(dn); if (r != LDB_SUCCESS && r != LDB_ERR_NO_SUCH_OBJECT) { goto failed; } if (r == LDB_ERR_NO_SUCH_OBJECT) { return 0; } /* mapping these flags onto ldap 'syntaxes' isn't strictly correct, but its close enough for now */ for (i=0;i<msg->num_elements;i++) { unsigned flags; const char *syntax; const struct ldb_schema_syntax *s; if (ltdb_attributes_flags(&msg->elements[i], &flags) != 0) { ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid @ATTRIBUTES element for '%s'", msg->elements[i].name); goto failed; } switch (flags & ~LTDB_FLAG_HIDDEN) { case 0: syntax = LDB_SYNTAX_OCTET_STRING; break; case LTDB_FLAG_CASE_INSENSITIVE: syntax = LDB_SYNTAX_DIRECTORY_STRING; break; case LTDB_FLAG_INTEGER: syntax = LDB_SYNTAX_INTEGER; break; default: ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid flag combination 0x%x for '%s' in @ATTRIBUTES", flags, msg->elements[i].name); goto failed; } s = ldb_standard_syntax_by_name(ldb, syntax); if (s == NULL) { ldb_debug(ldb, LDB_DEBUG_ERROR, "Invalid attribute syntax '%s' for '%s' in @ATTRIBUTES", syntax, msg->elements[i].name); goto failed; } flags |= LDB_ATTR_FLAG_ALLOCATED; if (ldb_schema_attribute_add_with_syntax(ldb, msg->elements[i].name, flags, s) != 0) { goto failed; } } return 0; failed: return -1; }