r20484: get rid of the special case for DN strings
authorStefan Metzmacher <metze@samba.org>
Tue, 2 Jan 2007 19:29:32 +0000 (19:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:35:59 +0000 (14:35 -0500)
metze

source/dsdb/schema/schema_init.c
source/dsdb/schema/schema_syntax.c
source/libnet/libnet_become_dc.c
source/librpc/idl/drsuapi.idl

index 6de87708c7f970d80c573468a7d88dd642e5ea57..c85988d938cae98225e6ac771eb05f3c4b06b102 100644 (file)
@@ -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 { \
index 5a96f11d6b7bead8c8e7d91e5637a82b92adfddf..37f85ba527c50f82510f5d30b1e0eb662cecafd8 100644 (file)
@@ -830,20 +830,6 @@ static WERROR dsdb_syntax_DN_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_member:
-case DRSUAPI_ATTRIBUTE_objectCategory:
-case DRSUAPI_ATTRIBUTE_hasMasterNCs:
-case DRSUAPI_ATTRIBUTE_dMDLocation:
-case DRSUAPI_ATTRIBUTE_fSMORoleOwner:
-case DRSUAPI_ATTRIBUTE_wellKnownObjects:
-case DRSUAPI_ATTRIBUTE_serverReference:
-case DRSUAPI_ATTRIBUTE_serverReferenceBL:
-case DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs:
-case DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
index 954b886b129b4acb7097773ba2bf1883acd3d334..f6eeb470f3ff79108f5420fe8c8e50d969e174e4 100644 (file)
@@ -31,6 +31,7 @@
 #include "libcli/security/security.h"
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "librpc/gen_ndr/ndr_security.h"
+#include "librpc/gen_ndr/ndr_drsuapi.h"
 
 struct libnet_BecomeDC_state {
        struct composite_context *creq;
@@ -1154,26 +1155,31 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
 
        /* objectCategory: CN=NTDS-DSA,CN=Schema,... */
        {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[1];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 1);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 1);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 1);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
-               v[0].dn                 = talloc_asprintf(v, "CN=NTDS-DSA,%s",
+               v[0].dn                 = talloc_asprintf(vd, "CN=NTDS-DSA,%s",
                                                          s->forest.schema_dn_str);
                if (composite_nomem(v->dn, c)) return;
 
-               vs[0].object            = &v[0];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_objectCategory;
-               attrs[i].value_ctr.dn_string.num_values         = 1;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 1;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
@@ -1206,14 +1212,15 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
 
        /* hasMasterNCs: ... */
        {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[3];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 3);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 3);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 3);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 3);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
@@ -1227,27 +1234,40 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
                v[2].sid                = s->zero_sid;
                v[2].dn                 = s->forest.schema_dn_str;
 
-               vs[0].object            = &v[0];
-               vs[1].object            = &v[1];
-               vs[2].object            = &v[2];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               c->status = ndr_push_struct_blob(&vd[1], vd, &v[1],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               c->status = ndr_push_struct_blob(&vd[2], vd, &v[2],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
+               vs[1].data              = &vd[1];
+               vs[2].data              = &vd[2];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_hasMasterNCs;
-               attrs[i].value_ctr.dn_string.num_values         = 3;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 3;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
 
        /* msDS-hasMasterNCs: ... */
        if (w2k3) {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[3];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 3);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 3);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 3);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 3);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
@@ -1261,61 +1281,83 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
                v[2].sid                = s->zero_sid;
                v[2].dn                 = s->forest.schema_dn_str;
 
-               vs[0].object            = &v[0];
-               vs[1].object            = &v[1];
-               vs[2].object            = &v[2];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               c->status = ndr_push_struct_blob(&vd[1], vd, &v[1],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               c->status = ndr_push_struct_blob(&vd[2], vd, &v[2],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
+               vs[1].data              = &vd[1];
+               vs[2].data              = &vd[2];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs;
-               attrs[i].value_ctr.dn_string.num_values         = 3;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 3;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
 
        /* dMDLocation: CN=Schema,... */
        {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[1];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 1);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 1);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 1);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
                v[0].dn                 = s->forest.schema_dn_str;
 
-               vs[0].object            = &v[0];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_dMDLocation;
-               attrs[i].value_ctr.dn_string.num_values         = 1;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 1;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
 
        /* msDS-HasDomainNCs: <domain_partition> */
        if (w2k3) {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[1];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 1);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 1);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 1);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
                v[0].dn                 = s->domain.dn_str;
 
-               vs[0].object            = &v[0];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs;
-               attrs[i].value_ctr.dn_string.num_values         = 1;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 1;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
@@ -1372,24 +1414,29 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
 
        /* serverReference: ... */
        {
-               struct drsuapi_DsAttributeValueDNString *vs;
-               struct drsuapi_DsReplicaObjectIdentifier3 *v;
+               struct drsuapi_DsAttributeValueDataBlob *vs;
+               DATA_BLOB *vd;
+               struct drsuapi_DsReplicaObjectIdentifier3 v[1];
 
-               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDNString, 1);
+               vs = talloc_array(attrs, struct drsuapi_DsAttributeValueDataBlob, 1);
                if (composite_nomem(vs, c)) return;
 
-               v = talloc_array(vs, struct drsuapi_DsReplicaObjectIdentifier3, 1);
-               if (composite_nomem(v, c)) return;
+               vd = talloc_array(vs, DATA_BLOB, 1);
+               if (composite_nomem(vd, c)) return;
 
                v[0].guid               = GUID_zero();
                v[0].sid                = s->zero_sid;
                v[0].dn                 = s->dest_dsa.computer_dn_str;
 
-               vs[0].object            = &v[0];
+               c->status = ndr_push_struct_blob(&vd[0], vd, &v[0],
+                                                (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!composite_is_ok(c)) return;
+
+               vs[0].data              = &vd[0];
 
                attrs[i].attid                                  = DRSUAPI_ATTRIBUTE_serverReference;
-               attrs[i].value_ctr.dn_string.num_values         = 1;
-               attrs[i].value_ctr.dn_string.values             = vs;
+               attrs[i].value_ctr.data_blob.num_values         = 1;
+               attrs[i].value_ctr.data_blob.values             = vs;
 
                i++;
        }
index 79f6e6928a52b32bbbd728a01dd4ba2e3a398fe3..46fa90509be3fd079fbfd91f1169eb1d3d8d30d4 100644 (file)
@@ -519,17 +519,6 @@ interface drsuapi
        } drsuapi_DsAttributeValueCtrGUID;
 
        typedef [nodiscriminant] union {
-               /* DN String */
-               [case(DRSUAPI_ATTRIBUTE_member)]                drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_objectCategory)]        drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_hasMasterNCs)]          drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_dMDLocation)]           drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_fSMORoleOwner)]         drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_serverReference)]       drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_serverReferenceBL)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-
                /* the default is the DATA_BLOB */
                [default] drsuapi_DsAttributeValueCtrDataBlob data_blob;
        } drsuapi_DsReplicaAttributeValueCtr;