summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/schema/schema_init.c31
-rw-r--r--source4/dsdb/schema/schema_syntax.c14
-rw-r--r--source4/libnet/libnet_become_dc.c153
-rw-r--r--source4/librpc/idl/drsuapi.idl11
4 files changed, 129 insertions, 80 deletions
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 { \
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index 5a96f11d6b..37f85ba527 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -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);
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 954b886b12..f6eeb470f3 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -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++;
}
diff --git a/source4/librpc/idl/drsuapi.idl b/source4/librpc/idl/drsuapi.idl
index 79f6e6928a..46fa90509b 100644
--- a/source4/librpc/idl/drsuapi.idl
+++ b/source4/librpc/idl/drsuapi.idl
@@ -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;