]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:dsdb/schema: Add dsdb_attribute_by_cn_ldb_val()
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Thu, 30 Mar 2023 03:00:59 +0000 (16:00 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 31 Mar 2023 08:29:32 +0000 (08:29 +0000)
This looks up a schema attribute by its CN, similar to
dsdb_class_by_cn_ldb_val().

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/schema/schema.h
source4/dsdb/schema/schema_query.c
source4/dsdb/schema/schema_set.c

index aaa2a9f9275e53eb187d80d2b0bc3216707444a5..700f40414c8d013555195c938808a6362dffdaf5 100644 (file)
@@ -243,6 +243,7 @@ struct dsdb_schema {
        struct dsdb_attribute **attributes_by_attributeID_id;
        struct dsdb_attribute **attributes_by_attributeID_oid;
        struct dsdb_attribute **attributes_by_linkID;
+       struct dsdb_attribute **attributes_by_cn;
        uint32_t num_int_id_attr;
        struct dsdb_attribute **attributes_by_msDS_IntId;
 
index fc34764881c476492ee64ce1ed22840b4983c3b8..96c53927f230e1ba4b258ba3a3b37c82c2929f9a 100644 (file)
@@ -126,6 +126,16 @@ const struct dsdb_attribute *dsdb_attribute_by_linkID(const struct dsdb_schema *
        return c;
 }
 
+const struct dsdb_attribute *dsdb_attribute_by_cn_ldb_val(const struct dsdb_schema *schema,
+                                                         const struct ldb_val *cn)
+{
+       struct dsdb_attribute *c;
+
+       BINARY_ARRAY_SEARCH_P(schema->attributes_by_cn,
+                             schema->num_attributes, cn, cn, strcasecmp_with_ldb_val, c);
+       return c;
+}
+
 const struct dsdb_class *dsdb_class_by_governsID_id(const struct dsdb_schema *schema,
                                                    uint32_t id)
 {
index 090f54684169a48750e1251a01d6fb86a7a4bab5..d388fecc8c8fa63be81321fd4b5d909b0b08d3bb 100644 (file)
@@ -514,6 +514,10 @@ static int dsdb_compare_attribute_by_linkID(struct dsdb_attribute **a1, struct d
 {
        return uint32_cmp((*a1)->linkID, (*a2)->linkID);
 }
+static int dsdb_compare_attribute_by_cn(struct dsdb_attribute **a1, struct dsdb_attribute **a2)
+{
+       return strcasecmp((*a1)->cn, (*a2)->cn);
+}
 
 /**
  * Clean up Classes and Attributes accessor arrays
@@ -531,6 +535,7 @@ static void dsdb_sorted_accessors_free(struct dsdb_schema *schema)
        TALLOC_FREE(schema->attributes_by_msDS_IntId);
        TALLOC_FREE(schema->attributes_by_attributeID_oid);
        TALLOC_FREE(schema->attributes_by_linkID);
+       TALLOC_FREE(schema->attributes_by_cn);
 }
 
 /*
@@ -611,11 +616,13 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb,
                                                               struct dsdb_attribute *, num_int_id);
        schema->attributes_by_attributeID_oid   = talloc_array(schema, struct dsdb_attribute *, i);
        schema->attributes_by_linkID              = talloc_array(schema, struct dsdb_attribute *, i);
+       schema->attributes_by_cn                  = talloc_array(schema, struct dsdb_attribute *, i);
        if (schema->attributes_by_lDAPDisplayName == NULL ||
            schema->attributes_by_attributeID_id == NULL ||
            schema->attributes_by_msDS_IntId == NULL ||
            schema->attributes_by_attributeID_oid == NULL ||
-           schema->attributes_by_linkID == NULL) {
+           schema->attributes_by_linkID == NULL ||
+           schema->attributes_by_cn == NULL) {
                goto failed;
        }
 
@@ -625,6 +632,7 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb,
                schema->attributes_by_attributeID_id[i]    = a;
                schema->attributes_by_attributeID_oid[i]   = a;
                schema->attributes_by_linkID[i]          = a;
+               schema->attributes_by_cn[i]              = a;
                /* append attr-by-msDS-IntId values */
                if (a->msDS_IntId != 0) {
                        schema->attributes_by_msDS_IntId[num_int_id] = a;
@@ -639,6 +647,7 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb,
        TYPESAFE_QSORT(schema->attributes_by_msDS_IntId, schema->num_int_id_attr, dsdb_compare_attribute_by_msDS_IntId);
        TYPESAFE_QSORT(schema->attributes_by_attributeID_oid, schema->num_attributes, dsdb_compare_attribute_by_attributeID_oid);
        TYPESAFE_QSORT(schema->attributes_by_linkID, schema->num_attributes, dsdb_compare_attribute_by_linkID);
+       TYPESAFE_QSORT(schema->attributes_by_cn, schema->num_attributes, dsdb_compare_attribute_by_cn);
 
        dsdb_setup_attribute_shortcuts(ldb, schema);