2 Unix SMB/CIFS mplementation.
5 Copyright (C) Stefan Metzmacher 2006
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "dsdb/samdb/samdb.h"
24 #include "librpc/gen_ndr/drsuapi.h"
25 #include "lib/ldb/include/ldb.h"
26 #include "system/time.h"
28 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema,
29 const struct dsdb_attribute *attr,
30 const struct drsuapi_DsReplicaAttribute *in,
32 struct ldb_message_element *out)
37 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
38 W_ERROR_HAVE_NO_MEMORY(out->name);
40 out->num_values = in->value_ctr.data_blob.num_values;
41 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
42 W_ERROR_HAVE_NO_MEMORY(out->values);
44 for (i=0; i < out->num_values; i++) {
47 if (in->value_ctr.data_blob.values[i].data == NULL) {
51 str = talloc_asprintf(out->values, "%s: not implemented",
53 W_ERROR_HAVE_NO_MEMORY(str);
55 out->values[i] = data_blob_string_const(str);
61 static WERROR dsdb_syntax_FOOBAR_ldb_to_drsuapi(const struct dsdb_schema *schema,
62 const struct dsdb_attribute *attr,
63 const struct ldb_message_element *in,
65 struct drsuapi_DsReplicaAttribute *out)
70 static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(const struct dsdb_schema *schema,
71 const struct dsdb_attribute *attr,
72 const struct drsuapi_DsReplicaAttribute *in,
74 struct ldb_message_element *out)
78 switch (attr->attributeID_id) {
79 case DRSUAPI_ATTRIBUTE_isSingleValued:
80 case DRSUAPI_ATTRIBUTE_showInAdvancedViewOnly:
81 case DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet:
82 return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
86 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
87 W_ERROR_HAVE_NO_MEMORY(out->name);
89 out->num_values = in->value_ctr.data_blob.num_values;
90 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
91 W_ERROR_HAVE_NO_MEMORY(out->values);
93 for (i=0; i < out->num_values; i++) {
97 if (in->value_ctr.data_blob.values[i].data == NULL) {
101 if (in->value_ctr.data_blob.values[i].data->length != 4) {
105 v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
108 str = talloc_strdup(out->values, "TRUE");
109 W_ERROR_HAVE_NO_MEMORY(str);
111 str = talloc_strdup(out->values, "FALSE");
112 W_ERROR_HAVE_NO_MEMORY(str);
115 out->values[i] = data_blob_string_const(str);
121 static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_schema *schema,
122 const struct dsdb_attribute *attr,
123 const struct ldb_message_element *in,
125 struct drsuapi_DsReplicaAttribute *out)
130 if (attr->attributeID_id == 0xFFFFFFFF) {
134 out->attid = attr->attributeID_id;
135 out->value_ctr.data_blob.num_values = in->num_values;
136 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
137 struct drsuapi_DsAttributeValueDataBlob,
139 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
141 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
142 W_ERROR_HAVE_NO_MEMORY(blobs);
144 for (i=0; i < in->num_values; i++) {
145 out->value_ctr.data_blob.values[i].data = &blobs[i];
147 blobs[i] = data_blob_talloc(blobs, NULL, 4);
148 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
150 if (strcmp("TRUE", (const char *)in->values[i].data) == 0) {
151 SIVAL(blobs[i].data, 0, 0x00000001);
152 } else if (strcmp("FALSE", (const char *)in->values[i].data) == 0) {
153 SIVAL(blobs[i].data, 0, 0x00000000);
162 static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
163 const struct dsdb_attribute *attr,
164 const struct drsuapi_DsReplicaAttribute *in,
166 struct ldb_message_element *out)
170 switch (attr->attributeID_id) {
171 case DRSUAPI_ATTRIBUTE_instanceType:
172 case DRSUAPI_ATTRIBUTE_rangeLower:
173 case DRSUAPI_ATTRIBUTE_rangeUpper:
174 case DRSUAPI_ATTRIBUTE_objectVersion:
175 case DRSUAPI_ATTRIBUTE_oMSyntax:
176 case DRSUAPI_ATTRIBUTE_searchFlags:
177 case DRSUAPI_ATTRIBUTE_systemFlags:
178 case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
179 return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
183 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
184 W_ERROR_HAVE_NO_MEMORY(out->name);
186 out->num_values = in->value_ctr.data_blob.num_values;
187 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
188 W_ERROR_HAVE_NO_MEMORY(out->values);
190 for (i=0; i < out->num_values; i++) {
194 if (in->value_ctr.data_blob.values[i].data == NULL) {
198 if (in->value_ctr.data_blob.values[i].data->length != 4) {
202 v = IVALS(in->value_ctr.data_blob.values[i].data->data, 0);
204 str = talloc_asprintf(out->values, "%d", v);
205 W_ERROR_HAVE_NO_MEMORY(str);
207 out->values[i] = data_blob_string_const(str);
213 static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
214 const struct dsdb_attribute *attr,
215 const struct ldb_message_element *in,
217 struct drsuapi_DsReplicaAttribute *out)
222 if (attr->attributeID_id == 0xFFFFFFFF) {
226 out->attid = attr->attributeID_id;
227 out->value_ctr.data_blob.num_values = in->num_values;
228 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
229 struct drsuapi_DsAttributeValueDataBlob,
231 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
233 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
234 W_ERROR_HAVE_NO_MEMORY(blobs);
236 for (i=0; i < in->num_values; i++) {
239 out->value_ctr.data_blob.values[i].data = &blobs[i];
241 blobs[i] = data_blob_talloc(blobs, NULL, 4);
242 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
244 v = strtol((const char *)in->values[i].data, NULL, 10);
246 SIVALS(blobs[i].data, 0, v);
252 static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
253 const struct dsdb_attribute *attr,
254 const struct drsuapi_DsReplicaAttribute *in,
256 struct ldb_message_element *out)
261 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
262 W_ERROR_HAVE_NO_MEMORY(out->name);
264 out->num_values = in->value_ctr.data_blob.num_values;
265 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
266 W_ERROR_HAVE_NO_MEMORY(out->values);
268 for (i=0; i < out->num_values; i++) {
272 if (in->value_ctr.data_blob.values[i].data == NULL) {
276 if (in->value_ctr.data_blob.values[i].data->length != 8) {
280 v = BVALS(in->value_ctr.data_blob.values[i].data->data, 0);
282 str = talloc_asprintf(out->values, "%lld", v);
283 W_ERROR_HAVE_NO_MEMORY(str);
285 out->values[i] = data_blob_string_const(str);
291 static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
292 const struct dsdb_attribute *attr,
293 const struct ldb_message_element *in,
295 struct drsuapi_DsReplicaAttribute *out)
300 if (attr->attributeID_id == 0xFFFFFFFF) {
304 out->attid = attr->attributeID_id;
305 out->value_ctr.data_blob.num_values = in->num_values;
306 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
307 struct drsuapi_DsAttributeValueDataBlob,
309 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
311 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
312 W_ERROR_HAVE_NO_MEMORY(blobs);
314 for (i=0; i < in->num_values; i++) {
317 out->value_ctr.data_blob.values[i].data = &blobs[i];
319 blobs[i] = data_blob_talloc(blobs, NULL, 8);
320 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
322 v = strtoll((const char *)in->values[i].data, NULL, 10);
324 SBVALS(blobs[i].data, 0, v);
330 static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema,
331 const struct dsdb_attribute *attr,
332 const struct drsuapi_DsReplicaAttribute *in,
334 struct ldb_message_element *out)
339 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
340 W_ERROR_HAVE_NO_MEMORY(out->name);
342 out->num_values = in->value_ctr.data_blob.num_values;
343 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
344 W_ERROR_HAVE_NO_MEMORY(out->values);
346 for (i=0; i < out->num_values; i++) {
351 if (in->value_ctr.data_blob.values[i].data == NULL) {
355 if (in->value_ctr.data_blob.values[i].data->length != 8) {
359 v = BVAL(in->value_ctr.data_blob.values[i].data->data, 0);
361 t = nt_time_to_unix(v);
363 str = ldb_timestring(out->values, t);
364 W_ERROR_HAVE_NO_MEMORY(str);
366 out->values[i] = data_blob_string_const(str);
372 static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema,
373 const struct dsdb_attribute *attr,
374 const struct ldb_message_element *in,
376 struct drsuapi_DsReplicaAttribute *out)
381 if (attr->attributeID_id == 0xFFFFFFFF) {
385 out->attid = attr->attributeID_id;
386 out->value_ctr.data_blob.num_values = in->num_values;
387 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
388 struct drsuapi_DsAttributeValueDataBlob,
390 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
392 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
393 W_ERROR_HAVE_NO_MEMORY(blobs);
395 for (i=0; i < in->num_values; i++) {
399 out->value_ctr.data_blob.values[i].data = &blobs[i];
401 blobs[i] = data_blob_talloc(blobs, NULL, 8);
402 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
404 t = ldb_string_to_time((const char *)in->values[i].data);
405 unix_to_nt_time(&v, t);
407 SBVAL(blobs[i].data, 0, v);
413 static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_schema *schema,
414 const struct dsdb_attribute *attr,
415 const struct drsuapi_DsReplicaAttribute *in,
417 struct ldb_message_element *out)
421 switch (attr->attributeID_id) {
422 case DRSUAPI_ATTRIBUTE_invocationId:
423 case DRSUAPI_ATTRIBUTE_schemaIDGUID:
424 return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
428 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
429 W_ERROR_HAVE_NO_MEMORY(out->name);
431 out->num_values = in->value_ctr.data_blob.num_values;
432 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
433 W_ERROR_HAVE_NO_MEMORY(out->values);
435 for (i=0; i < out->num_values; i++) {
436 if (in->value_ctr.data_blob.values[i].data == NULL) {
440 if (in->value_ctr.data_blob.values[i].data->length == 0) {
444 out->values[i] = data_blob_dup_talloc(out->values,
445 in->value_ctr.data_blob.values[i].data);
446 W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
452 static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_schema *schema,
453 const struct dsdb_attribute *attr,
454 const struct ldb_message_element *in,
456 struct drsuapi_DsReplicaAttribute *out)
461 if (attr->attributeID_id == 0xFFFFFFFF) {
465 out->attid = attr->attributeID_id;
466 out->value_ctr.data_blob.num_values = in->num_values;
467 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
468 struct drsuapi_DsAttributeValueDataBlob,
470 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
472 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
473 W_ERROR_HAVE_NO_MEMORY(blobs);
475 for (i=0; i < in->num_values; i++) {
476 out->value_ctr.data_blob.values[i].data = &blobs[i];
478 blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
479 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
485 static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *schema,
486 const struct dsdb_attribute *attr,
487 const struct drsuapi_DsReplicaAttribute *in,
489 struct ldb_message_element *out)
494 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
495 W_ERROR_HAVE_NO_MEMORY(out->name);
497 out->num_values = in->value_ctr.data_blob.num_values;
498 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
499 W_ERROR_HAVE_NO_MEMORY(out->values);
501 for (i=0; i < out->num_values; i++) {
503 const struct dsdb_class *c;
506 if (in->value_ctr.object_class_id.values[i].objectClassId == NULL) {
510 v = *in->value_ctr.object_class_id.values[i].objectClassId;
512 c = dsdb_class_by_governsID_id(schema, v);
517 str = talloc_strdup(out->values, c->lDAPDisplayName);
518 W_ERROR_HAVE_NO_MEMORY(str);
520 /* the values need to be reversed */
521 out->values[out->num_values - (i + 1)] = data_blob_string_const(str);
527 static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *schema,
528 const struct dsdb_attribute *attr,
529 const struct drsuapi_DsReplicaAttribute *in,
531 struct ldb_message_element *out)
536 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
537 W_ERROR_HAVE_NO_MEMORY(out->name);
539 out->num_values = in->value_ctr.data_blob.num_values;
540 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
541 W_ERROR_HAVE_NO_MEMORY(out->values);
543 for (i=0; i < out->num_values; i++) {
548 if (in->value_ctr.oid.values[i].value == NULL) {
552 v = *in->value_ctr.oid.values[i].value;
554 status = dsdb_map_int2oid(schema, v, out->values, &str);
555 W_ERROR_NOT_OK_RETURN(status);
557 out->values[i] = data_blob_string_const(str);
563 static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
564 const struct dsdb_attribute *attr,
565 const struct drsuapi_DsReplicaAttribute *in,
567 struct ldb_message_element *out)
571 switch (attr->attributeID_id) {
572 case DRSUAPI_ATTRIBUTE_objectClass:
573 return _dsdb_syntax_OID_obj_drsuapi_to_ldb(schema, attr, in, mem_ctx, out);
574 case DRSUAPI_ATTRIBUTE_governsID:
575 case DRSUAPI_ATTRIBUTE_attributeID:
576 case DRSUAPI_ATTRIBUTE_attributeSyntax:
577 return _dsdb_syntax_OID_oid_drsuapi_to_ldb(schema, attr, in, mem_ctx, out);
581 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
582 W_ERROR_HAVE_NO_MEMORY(out->name);
584 out->num_values = in->value_ctr.data_blob.num_values;
585 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
586 W_ERROR_HAVE_NO_MEMORY(out->values);
588 for (i=0; i < out->num_values; i++) {
593 if (in->value_ctr.data_blob.values[i].data == NULL) {
597 if (in->value_ctr.data_blob.values[i].data->length != 4) {
601 v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
603 name = dsdb_lDAPDisplayName_by_id(schema, v);
608 str = talloc_strdup(out->values, name);
609 W_ERROR_HAVE_NO_MEMORY(str);
611 out->values[i] = data_blob_string_const(str);
617 static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
618 const struct dsdb_attribute *attr,
619 const struct ldb_message_element *in,
621 struct drsuapi_DsReplicaAttribute *out)
626 if (attr->attributeID_id == 0xFFFFFFFF) {
630 switch (attr->attributeID_id) {
631 case DRSUAPI_ATTRIBUTE_objectClass:
632 case DRSUAPI_ATTRIBUTE_governsID:
633 case DRSUAPI_ATTRIBUTE_attributeID:
634 case DRSUAPI_ATTRIBUTE_attributeSyntax:
635 return dsdb_syntax_FOOBAR_ldb_to_drsuapi(schema, attr, in, mem_ctx, out);
638 out->attid = attr->attributeID_id;
639 out->value_ctr.data_blob.num_values = in->num_values;
640 out->value_ctr.data_blob.values = talloc_array(mem_ctx,
641 struct drsuapi_DsAttributeValueDataBlob,
643 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
645 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
646 W_ERROR_HAVE_NO_MEMORY(blobs);
648 for (i=0; i < in->num_values; i++) {
651 out->value_ctr.data_blob.values[i].data = &blobs[i];
653 blobs[i] = data_blob_talloc(blobs, NULL, 4);
654 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
656 v = strtol((const char *)in->values[i].data, NULL, 10);
658 SIVAL(blobs[i].data, 0, v);
664 #define OMOBJECTCLASS(val) { .length = sizeof(val) - 1, .data = discard_const_p(uint8_t, val) }
666 static const struct dsdb_syntax dsdb_syntaxes[] = {
669 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.7",
671 .attributeSyntax_oid = "2.5.5.8",
672 .drsuapi_to_ldb = dsdb_syntax_BOOL_drsuapi_to_ldb,
673 .ldb_to_drsuapi = dsdb_syntax_BOOL_ldb_to_drsuapi,
676 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.27",
678 .attributeSyntax_oid = "2.5.5.9",
679 .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb,
680 .ldb_to_drsuapi = dsdb_syntax_INT32_ldb_to_drsuapi,
682 .name = "String(Octet)",
683 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.40",
685 .attributeSyntax_oid = "2.5.5.10",
686 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
687 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
689 .name = "String(Sid)",
690 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.40",
692 .attributeSyntax_oid = "2.5.5.17",
693 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
694 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
696 .name = "String(Object-Identifier)",
697 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.38",
699 .attributeSyntax_oid = "2.5.5.2",
700 .drsuapi_to_ldb = dsdb_syntax_OID_drsuapi_to_ldb,
701 .ldb_to_drsuapi = dsdb_syntax_OID_ldb_to_drsuapi,
703 .name = "Enumeration",
704 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.27",
706 .attributeSyntax_oid = "2.5.5.9",
707 .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb,
708 .ldb_to_drsuapi = dsdb_syntax_INT32_ldb_to_drsuapi,
710 /* not used in w2k3 forest */
711 .name = "String(Numeric)",
712 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.36",
714 .attributeSyntax_oid = "2.5.5.6",
715 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
716 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
718 /* not used in w2k3 forest */
719 .name = "String(Printable)",
720 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.44",
722 .attributeSyntax_oid = "2.5.5.5",
723 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
724 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
726 /* not used in w2k3 forest */
727 .name = "String(Teletex)",
728 .ldap_oid = "1.2.840.113556.1.4.905",
730 .attributeSyntax_oid = "2.5.5.4",
731 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
732 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
734 /* not used in w2k3 forest */
735 .name = "String(IA5)",
736 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.26",
738 .attributeSyntax_oid = "2.5.5.5",
739 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
740 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
742 /* not used in w2k3 forest */
743 .name = "String(UTC-Time)",
744 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.53",
746 .attributeSyntax_oid = "2.5.5.11",
747 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
748 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
750 .name = "String(Generalized-Time)",
751 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.24",
753 .attributeSyntax_oid = "2.5.5.11",
754 .drsuapi_to_ldb = dsdb_syntax_NTTIME_drsuapi_to_ldb,
755 .ldb_to_drsuapi = dsdb_syntax_NTTIME_ldb_to_drsuapi,
757 /* not used in w2k3 forest */
758 .name = "String(Case Sensitive)",
759 .ldap_oid = "1.2.840.113556.1.4.1362",
761 .attributeSyntax_oid = "2.5.5.3",
762 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
763 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
765 .name = "String(Unicode)",
766 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.15",
768 .attributeSyntax_oid = "2.5.5.12",
769 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
770 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
772 .name = "Interval/LargeInteger",
773 .ldap_oid = "1.2.840.113556.1.4.906",
775 .attributeSyntax_oid = "2.5.5.16",
776 .drsuapi_to_ldb = dsdb_syntax_INT64_drsuapi_to_ldb,
777 .ldb_to_drsuapi = dsdb_syntax_INT64_ldb_to_drsuapi,
779 .name = "String(NT-Sec-Desc)",
780 .ldap_oid = "1.2.840.113556.1.4.907",
782 .attributeSyntax_oid = "2.5.5.15",
783 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
784 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
786 .name = "Object(DS-DN)",
787 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.12",
789 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x4a"),
790 .attributeSyntax_oid = "2.5.5.1",
791 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
792 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
794 .name = "Object(DN-Binary)",
795 .ldap_oid = "1.2.840.113556.1.4.903",
797 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x0b"),
798 .attributeSyntax_oid = "2.5.5.7",
799 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
800 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
802 /* not used in w2k3 forest */
803 .name = "Object(OR-Name)",
804 .ldap_oid = "1.2.840.113556.1.4.1221",
806 .oMObjectClass = OMOBJECTCLASS("\x56\x06\x01\x02\x05\x0b\x1D"),
807 .attributeSyntax_oid = "2.5.5.7",
808 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
809 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
811 .name = "Object(Replica-Link)",
812 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.40",
814 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x06"),
815 .attributeSyntax_oid = "2.5.5.10",
816 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
817 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
819 /* not used in w2k3 forest */
820 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.43",
822 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x5c"),
823 .attributeSyntax_oid = "2.5.5.13",
824 .name = "Object(Presentation-Address)",
825 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
826 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
828 /* not used in w2k3 forest */
829 .name = "Object(Access-Point)",
830 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.2",
832 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x3e"),
833 .attributeSyntax_oid = "2.5.5.14",
834 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
835 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
837 /* not used in w2k3 forest */
838 .name = "Object(DN-String)",
839 .ldap_oid = "1.2.840.113556.1.4.904",
841 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x0c"),
842 .attributeSyntax_oid = "2.5.5.14",
843 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
844 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
848 const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute *attr)
852 for (i=0; i < ARRAY_SIZE(dsdb_syntaxes); i++) {
853 if (attr->oMSyntax != dsdb_syntaxes[i].oMSyntax) continue;
855 if (attr->oMObjectClass.length != dsdb_syntaxes[i].oMObjectClass.length) continue;
857 if (attr->oMObjectClass.length) {
859 ret = memcmp(attr->oMObjectClass.data,
860 dsdb_syntaxes[i].oMObjectClass.data,
861 attr->oMObjectClass.length);
862 if (ret != 0) continue;
865 if (strcmp(attr->attributeSyntax_oid, dsdb_syntaxes[i].attributeSyntax_oid) != 0) continue;
867 return &dsdb_syntaxes[i];
873 WERROR dsdb_attribute_drsuapi_to_ldb(const struct dsdb_schema *schema,
874 const struct drsuapi_DsReplicaAttribute *in,
876 struct ldb_message_element *out)
878 const struct dsdb_attribute *sa;
880 sa = dsdb_attribute_by_attributeID_id(schema, in->attid);
885 return sa->syntax->drsuapi_to_ldb(schema, sa, in, mem_ctx, out);
888 WERROR dsdb_attribute_ldb_to_drsuapi(const struct dsdb_schema *schema,
889 const struct ldb_message_element *in,
891 struct drsuapi_DsReplicaAttribute *out)
893 const struct dsdb_attribute *sa;
895 sa = dsdb_attribute_by_lDAPDisplayName(schema, in->name);
900 return sa->syntax->ldb_to_drsuapi(schema, sa, in, mem_ctx, out);