diff options
-rw-r--r-- | source4/dsdb/schema/schema_init.c | 31 | ||||
-rw-r--r-- | source4/dsdb/schema/schema_syntax.c | 14 | ||||
-rw-r--r-- | source4/libnet/libnet_become_dc.c | 153 | ||||
-rw-r--r-- | source4/librpc/idl/drsuapi.idl | 11 |
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; |