s4-dsdb: added parse functions for DRS linked attribute blobs
authorAndrew Tridgell <tridge@samba.org>
Mon, 28 Dec 2009 06:18:14 +0000 (17:18 +1100)
committerAndrew Tridgell <tridge@samba.org>
Fri, 1 Jan 2010 21:16:54 +0000 (08:16 +1100)
source4/dsdb/common/dsdb_dn.c

index 660eaf7d40da757dc6fae99a267e77afff969552..9023b0347a94925997146e9d61640eb1ec91e99a 100644 (file)
@@ -325,3 +325,72 @@ int dsdb_dn_string_comparison(struct ldb_context *ldb, void *mem_ctx,
 {
        return ldb_any_comparison(ldb, mem_ctx, dsdb_dn_string_canonicalise, v1, v2);
 }
+
+
+/*
+   convert a dsdb_dn to a linked attribute data blob
+*/
+WERROR dsdb_dn_la_to_blob(struct ldb_context *sam_ctx,
+                         const struct dsdb_attribute *schema_attrib,
+                         const struct dsdb_schema *schema,
+                         TALLOC_CTX *mem_ctx,
+                         struct dsdb_dn *dsdb_dn, DATA_BLOB **blob)
+{
+       struct ldb_val v;
+       WERROR werr;
+       struct ldb_message_element val_el;
+       struct drsuapi_DsReplicaAttribute drs;
+
+       /* we need a message_element with just one value in it */
+       v = data_blob_string_const(dsdb_dn_get_extended_linearized(mem_ctx, dsdb_dn, 1));
+
+       val_el.name = schema_attrib->lDAPDisplayName;
+       val_el.values = &v;
+       val_el.num_values = 1;
+
+       werr = schema_attrib->syntax->ldb_to_drsuapi(sam_ctx, schema, schema_attrib, &val_el, mem_ctx, &drs);
+       W_ERROR_NOT_OK_RETURN(werr);
+
+       if (drs.value_ctr.num_values != 1) {
+               DEBUG(1,(__location__ ": Failed to build DRS blob for linked attribute %s\n",
+                        schema_attrib->lDAPDisplayName));
+               return WERR_DS_DRA_INTERNAL_ERROR;
+       }
+
+       *blob = drs.value_ctr.values[0].blob;
+       return WERR_OK;
+}
+
+/*
+  convert a data blob to a dsdb_dn
+ */
+WERROR dsdb_dn_la_from_blob(struct ldb_context *sam_ctx,
+                           const struct dsdb_attribute *schema_attrib,
+                           const struct dsdb_schema *schema,
+                           TALLOC_CTX *mem_ctx,
+                           DATA_BLOB *blob,
+                           struct dsdb_dn **dsdb_dn)
+{
+       WERROR werr;
+       struct ldb_message_element new_el;
+       struct drsuapi_DsReplicaAttribute drs;
+       struct drsuapi_DsAttributeValue val;
+
+       drs.value_ctr.num_values = 1;
+       drs.value_ctr.values = &val;
+       val.blob = blob;
+
+       werr = schema_attrib->syntax->drsuapi_to_ldb(sam_ctx, schema, schema_attrib, &drs, mem_ctx, &new_el);
+       W_ERROR_NOT_OK_RETURN(werr);
+
+       if (new_el.num_values != 1) {
+               return WERR_INTERNAL_ERROR;
+       }
+
+       *dsdb_dn = dsdb_dn_parse(mem_ctx, sam_ctx, &new_el.values[0], schema_attrib->syntax->ldap_oid);
+       if (!*dsdb_dn) {
+               return WERR_INTERNAL_ERROR;
+       }
+
+       return WERR_OK;
+}