2 Unix SMB/CIFS mplementation.
5 Copyright (C) Stefan Metzmacher <metze@samba.org> 2006
6 Copyright (C) Simo Sorce 2005
7 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "dsdb/samdb/samdb.h"
25 #include "librpc/gen_ndr/ndr_drsuapi.h"
26 #include "librpc/gen_ndr/ndr_security.h"
27 #include "librpc/gen_ndr/ndr_misc.h"
28 #include "lib/ldb/include/ldb.h"
29 #include "lib/ldb/include/ldb_errors.h"
30 #include "system/time.h"
31 #include "../lib/util/charset/charset.h"
32 #include "librpc/ndr/libndr.h"
34 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(struct ldb_context *ldb,
35 const struct dsdb_schema *schema,
36 const struct dsdb_attribute *attr,
37 const struct drsuapi_DsReplicaAttribute *in,
39 struct ldb_message_element *out)
44 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
45 W_ERROR_HAVE_NO_MEMORY(out->name);
47 out->num_values = in->value_ctr.num_values;
48 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
49 W_ERROR_HAVE_NO_MEMORY(out->values);
51 for (i=0; i < out->num_values; i++) {
54 if (in->value_ctr.values[i].blob == NULL) {
58 str = talloc_asprintf(out->values, "%s: not implemented",
60 W_ERROR_HAVE_NO_MEMORY(str);
62 out->values[i] = data_blob_string_const(str);
68 static WERROR dsdb_syntax_FOOBAR_ldb_to_drsuapi(struct ldb_context *ldb,
69 const struct dsdb_schema *schema,
70 const struct dsdb_attribute *attr,
71 const struct ldb_message_element *in,
73 struct drsuapi_DsReplicaAttribute *out)
78 static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(struct ldb_context *ldb,
79 const struct dsdb_schema *schema,
80 const struct dsdb_attribute *attr,
81 const struct drsuapi_DsReplicaAttribute *in,
83 struct ldb_message_element *out)
88 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
89 W_ERROR_HAVE_NO_MEMORY(out->name);
91 out->num_values = in->value_ctr.num_values;
92 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
93 W_ERROR_HAVE_NO_MEMORY(out->values);
95 for (i=0; i < out->num_values; i++) {
99 if (in->value_ctr.values[i].blob == NULL) {
103 if (in->value_ctr.values[i].blob->length != 4) {
107 v = IVAL(in->value_ctr.values[i].blob->data, 0);
110 str = talloc_strdup(out->values, "TRUE");
111 W_ERROR_HAVE_NO_MEMORY(str);
113 str = talloc_strdup(out->values, "FALSE");
114 W_ERROR_HAVE_NO_MEMORY(str);
117 out->values[i] = data_blob_string_const(str);
123 static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(struct ldb_context *ldb,
124 const struct dsdb_schema *schema,
125 const struct dsdb_attribute *attr,
126 const struct ldb_message_element *in,
128 struct drsuapi_DsReplicaAttribute *out)
133 if (attr->attributeID_id == 0xFFFFFFFF) {
137 out->attid = attr->attributeID_id;
138 out->value_ctr.num_values = in->num_values;
139 out->value_ctr.values = talloc_array(mem_ctx,
140 struct drsuapi_DsAttributeValue,
142 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
144 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
145 W_ERROR_HAVE_NO_MEMORY(blobs);
147 for (i=0; i < in->num_values; i++) {
148 out->value_ctr.values[i].blob = &blobs[i];
150 blobs[i] = data_blob_talloc(blobs, NULL, 4);
151 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
153 if (strcmp("TRUE", (const char *)in->values[i].data) == 0) {
154 SIVAL(blobs[i].data, 0, 0x00000001);
155 } else if (strcmp("FALSE", (const char *)in->values[i].data) == 0) {
156 SIVAL(blobs[i].data, 0, 0x00000000);
165 static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(struct ldb_context *ldb,
166 const struct dsdb_schema *schema,
167 const struct dsdb_attribute *attr,
168 const struct drsuapi_DsReplicaAttribute *in,
170 struct ldb_message_element *out)
175 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
176 W_ERROR_HAVE_NO_MEMORY(out->name);
178 out->num_values = in->value_ctr.num_values;
179 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
180 W_ERROR_HAVE_NO_MEMORY(out->values);
182 for (i=0; i < out->num_values; i++) {
186 if (in->value_ctr.values[i].blob == NULL) {
190 if (in->value_ctr.values[i].blob->length != 4) {
194 v = IVALS(in->value_ctr.values[i].blob->data, 0);
196 str = talloc_asprintf(out->values, "%d", v);
197 W_ERROR_HAVE_NO_MEMORY(str);
199 out->values[i] = data_blob_string_const(str);
205 static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(struct ldb_context *ldb,
206 const struct dsdb_schema *schema,
207 const struct dsdb_attribute *attr,
208 const struct ldb_message_element *in,
210 struct drsuapi_DsReplicaAttribute *out)
215 if (attr->attributeID_id == 0xFFFFFFFF) {
219 out->attid = attr->attributeID_id;
220 out->value_ctr.num_values = in->num_values;
221 out->value_ctr.values = talloc_array(mem_ctx,
222 struct drsuapi_DsAttributeValue,
224 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
226 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
227 W_ERROR_HAVE_NO_MEMORY(blobs);
229 for (i=0; i < in->num_values; i++) {
232 out->value_ctr.values[i].blob = &blobs[i];
234 blobs[i] = data_blob_talloc(blobs, NULL, 4);
235 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
237 v = strtol((const char *)in->values[i].data, NULL, 10);
239 SIVALS(blobs[i].data, 0, v);
245 static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(struct ldb_context *ldb,
246 const struct dsdb_schema *schema,
247 const struct dsdb_attribute *attr,
248 const struct drsuapi_DsReplicaAttribute *in,
250 struct ldb_message_element *out)
255 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
256 W_ERROR_HAVE_NO_MEMORY(out->name);
258 out->num_values = in->value_ctr.num_values;
259 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
260 W_ERROR_HAVE_NO_MEMORY(out->values);
262 for (i=0; i < out->num_values; i++) {
266 if (in->value_ctr.values[i].blob == NULL) {
270 if (in->value_ctr.values[i].blob->length != 8) {
274 v = BVALS(in->value_ctr.values[i].blob->data, 0);
276 str = talloc_asprintf(out->values, "%lld", (long long int)v);
277 W_ERROR_HAVE_NO_MEMORY(str);
279 out->values[i] = data_blob_string_const(str);
285 static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(struct ldb_context *ldb,
286 const struct dsdb_schema *schema,
287 const struct dsdb_attribute *attr,
288 const struct ldb_message_element *in,
290 struct drsuapi_DsReplicaAttribute *out)
295 if (attr->attributeID_id == 0xFFFFFFFF) {
299 out->attid = attr->attributeID_id;
300 out->value_ctr.num_values = in->num_values;
301 out->value_ctr.values = talloc_array(mem_ctx,
302 struct drsuapi_DsAttributeValue,
304 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
306 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
307 W_ERROR_HAVE_NO_MEMORY(blobs);
309 for (i=0; i < in->num_values; i++) {
312 out->value_ctr.values[i].blob = &blobs[i];
314 blobs[i] = data_blob_talloc(blobs, NULL, 8);
315 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
317 v = strtoll((const char *)in->values[i].data, NULL, 10);
319 SBVALS(blobs[i].data, 0, v);
325 static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(struct ldb_context *ldb,
326 const struct dsdb_schema *schema,
327 const struct dsdb_attribute *attr,
328 const struct drsuapi_DsReplicaAttribute *in,
330 struct ldb_message_element *out)
335 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
336 W_ERROR_HAVE_NO_MEMORY(out->name);
338 out->num_values = in->value_ctr.num_values;
339 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
340 W_ERROR_HAVE_NO_MEMORY(out->values);
342 for (i=0; i < out->num_values; i++) {
347 if (in->value_ctr.values[i].blob == NULL) {
351 if (in->value_ctr.values[i].blob->length != 8) {
355 v = BVAL(in->value_ctr.values[i].blob->data, 0);
357 t = nt_time_to_unix(v);
360 * NOTE: On a w2k3 server you can set a GeneralizedTime string
361 * via LDAP, but you get back an UTCTime string,
362 * but via DRSUAPI you get back the NTTIME_1sec value
363 * that represents the GeneralizedTime value!
365 * So if we store the UTCTime string in our ldb
366 * we'll loose information!
368 str = ldb_timestring_utc(out->values, t);
369 W_ERROR_HAVE_NO_MEMORY(str);
370 out->values[i] = data_blob_string_const(str);
376 static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(struct ldb_context *ldb,
377 const struct dsdb_schema *schema,
378 const struct dsdb_attribute *attr,
379 const struct ldb_message_element *in,
381 struct drsuapi_DsReplicaAttribute *out)
386 if (attr->attributeID_id == 0xFFFFFFFF) {
390 out->attid = attr->attributeID_id;
391 out->value_ctr.num_values = in->num_values;
392 out->value_ctr.values = talloc_array(mem_ctx,
393 struct drsuapi_DsAttributeValue,
395 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
397 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
398 W_ERROR_HAVE_NO_MEMORY(blobs);
400 for (i=0; i < in->num_values; i++) {
404 out->value_ctr.values[i].blob = &blobs[i];
406 blobs[i] = data_blob_talloc(blobs, NULL, 8);
407 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
409 t = ldb_string_utc_to_time((const char *)in->values[i].data);
410 unix_to_nt_time(&v, t);
413 SBVAL(blobs[i].data, 0, v);
419 static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(struct ldb_context *ldb,
420 const struct dsdb_schema *schema,
421 const struct dsdb_attribute *attr,
422 const struct drsuapi_DsReplicaAttribute *in,
424 struct ldb_message_element *out)
429 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
430 W_ERROR_HAVE_NO_MEMORY(out->name);
432 out->num_values = in->value_ctr.num_values;
433 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
434 W_ERROR_HAVE_NO_MEMORY(out->values);
436 for (i=0; i < out->num_values; i++) {
441 if (in->value_ctr.values[i].blob == NULL) {
445 if (in->value_ctr.values[i].blob->length != 8) {
449 v = BVAL(in->value_ctr.values[i].blob->data, 0);
451 t = nt_time_to_unix(v);
453 str = ldb_timestring(out->values, t);
454 W_ERROR_HAVE_NO_MEMORY(str);
456 out->values[i] = data_blob_string_const(str);
462 static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(struct ldb_context *ldb,
463 const struct dsdb_schema *schema,
464 const struct dsdb_attribute *attr,
465 const struct ldb_message_element *in,
467 struct drsuapi_DsReplicaAttribute *out)
472 if (attr->attributeID_id == 0xFFFFFFFF) {
476 out->attid = attr->attributeID_id;
477 out->value_ctr.num_values = in->num_values;
478 out->value_ctr.values = talloc_array(mem_ctx,
479 struct drsuapi_DsAttributeValue,
481 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
483 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
484 W_ERROR_HAVE_NO_MEMORY(blobs);
486 for (i=0; i < in->num_values; i++) {
490 out->value_ctr.values[i].blob = &blobs[i];
492 blobs[i] = data_blob_talloc(blobs, NULL, 8);
493 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
495 t = ldb_string_to_time((const char *)in->values[i].data);
496 unix_to_nt_time(&v, t);
499 SBVAL(blobs[i].data, 0, v);
505 static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(struct ldb_context *ldb,
506 const struct dsdb_schema *schema,
507 const struct dsdb_attribute *attr,
508 const struct drsuapi_DsReplicaAttribute *in,
510 struct ldb_message_element *out)
515 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
516 W_ERROR_HAVE_NO_MEMORY(out->name);
518 out->num_values = in->value_ctr.num_values;
519 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
520 W_ERROR_HAVE_NO_MEMORY(out->values);
522 for (i=0; i < out->num_values; i++) {
523 if (in->value_ctr.values[i].blob == NULL) {
527 if (in->value_ctr.values[i].blob->length == 0) {
531 out->values[i] = data_blob_dup_talloc(out->values,
532 in->value_ctr.values[i].blob);
533 W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
539 static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(struct ldb_context *ldb,
540 const struct dsdb_schema *schema,
541 const struct dsdb_attribute *attr,
542 const struct ldb_message_element *in,
544 struct drsuapi_DsReplicaAttribute *out)
549 if (attr->attributeID_id == 0xFFFFFFFF) {
553 out->attid = attr->attributeID_id;
554 out->value_ctr.num_values = in->num_values;
555 out->value_ctr.values = talloc_array(mem_ctx,
556 struct drsuapi_DsAttributeValue,
558 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
560 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
561 W_ERROR_HAVE_NO_MEMORY(blobs);
563 for (i=0; i < in->num_values; i++) {
564 out->value_ctr.values[i].blob = &blobs[i];
566 blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
567 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
573 static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(struct ldb_context *ldb,
574 const struct dsdb_schema *schema,
575 const struct dsdb_attribute *attr,
576 const struct drsuapi_DsReplicaAttribute *in,
578 struct ldb_message_element *out)
583 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
584 W_ERROR_HAVE_NO_MEMORY(out->name);
586 out->num_values = in->value_ctr.num_values;
587 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
588 W_ERROR_HAVE_NO_MEMORY(out->values);
590 for (i=0; i < out->num_values; i++) {
592 const struct dsdb_class *c;
595 if (in->value_ctr.values[i].blob == NULL) {
599 if (in->value_ctr.values[i].blob->length != 4) {
603 v = IVAL(in->value_ctr.values[i].blob->data, 0);
605 c = dsdb_class_by_governsID_id(schema, v);
610 str = talloc_strdup(out->values, c->lDAPDisplayName);
611 W_ERROR_HAVE_NO_MEMORY(str);
613 /* the values need to be reversed */
614 out->values[out->num_values - (i + 1)] = data_blob_string_const(str);
620 static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(struct ldb_context *ldb,
621 const struct dsdb_schema *schema,
622 const struct dsdb_attribute *attr,
623 const struct drsuapi_DsReplicaAttribute *in,
625 struct ldb_message_element *out)
630 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
631 W_ERROR_HAVE_NO_MEMORY(out->name);
633 out->num_values = in->value_ctr.num_values;
634 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
635 W_ERROR_HAVE_NO_MEMORY(out->values);
637 for (i=0; i < out->num_values; i++) {
642 if (in->value_ctr.values[i].blob == NULL) {
646 if (in->value_ctr.values[i].blob->length != 4) {
650 v = IVAL(in->value_ctr.values[i].blob->data, 0);
652 status = dsdb_map_int2oid(schema, v, out->values, &str);
653 W_ERROR_NOT_OK_RETURN(status);
655 out->values[i] = data_blob_string_const(str);
661 static WERROR dsdb_syntax_OID_drsuapi_to_ldb(struct ldb_context *ldb,
662 const struct dsdb_schema *schema,
663 const struct dsdb_attribute *attr,
664 const struct drsuapi_DsReplicaAttribute *in,
666 struct ldb_message_element *out)
670 switch (attr->attributeID_id) {
671 case DRSUAPI_ATTRIBUTE_objectClass:
672 return _dsdb_syntax_OID_obj_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
673 case DRSUAPI_ATTRIBUTE_governsID:
674 case DRSUAPI_ATTRIBUTE_attributeID:
675 case DRSUAPI_ATTRIBUTE_attributeSyntax:
676 return _dsdb_syntax_OID_oid_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
680 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
681 W_ERROR_HAVE_NO_MEMORY(out->name);
683 out->num_values = in->value_ctr.num_values;
684 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
685 W_ERROR_HAVE_NO_MEMORY(out->values);
687 for (i=0; i < out->num_values; i++) {
692 if (in->value_ctr.values[i].blob == NULL) {
696 if (in->value_ctr.values[i].blob->length != 4) {
700 v = IVAL(in->value_ctr.values[i].blob->data, 0);
702 name = dsdb_lDAPDisplayName_by_id(schema, v);
707 str = talloc_strdup(out->values, name);
708 W_ERROR_HAVE_NO_MEMORY(str);
710 out->values[i] = data_blob_string_const(str);
716 static WERROR dsdb_syntax_OID_ldb_to_drsuapi(struct ldb_context *ldb,
717 const struct dsdb_schema *schema,
718 const struct dsdb_attribute *attr,
719 const struct ldb_message_element *in,
721 struct drsuapi_DsReplicaAttribute *out)
726 if (attr->attributeID_id == 0xFFFFFFFF) {
730 switch (attr->attributeID_id) {
731 case DRSUAPI_ATTRIBUTE_objectClass:
732 case DRSUAPI_ATTRIBUTE_governsID:
733 case DRSUAPI_ATTRIBUTE_attributeID:
734 case DRSUAPI_ATTRIBUTE_attributeSyntax:
735 return dsdb_syntax_FOOBAR_ldb_to_drsuapi(ldb, schema, attr, in, mem_ctx, out);
738 out->attid = attr->attributeID_id;
739 out->value_ctr.num_values = in->num_values;
740 out->value_ctr.values = talloc_array(mem_ctx,
741 struct drsuapi_DsAttributeValue,
743 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
745 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
746 W_ERROR_HAVE_NO_MEMORY(blobs);
748 for (i=0; i < in->num_values; i++) {
751 out->value_ctr.values[i].blob = &blobs[i];
753 blobs[i] = data_blob_talloc(blobs, NULL, 4);
754 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
756 v = strtol((const char *)in->values[i].data, NULL, 10);
758 SIVAL(blobs[i].data, 0, v);
764 static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(struct ldb_context *ldb,
765 const struct dsdb_schema *schema,
766 const struct dsdb_attribute *attr,
767 const struct drsuapi_DsReplicaAttribute *in,
769 struct ldb_message_element *out)
774 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
775 W_ERROR_HAVE_NO_MEMORY(out->name);
777 out->num_values = in->value_ctr.num_values;
778 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
779 W_ERROR_HAVE_NO_MEMORY(out->values);
781 for (i=0; i < out->num_values; i++) {
785 if (in->value_ctr.values[i].blob == NULL) {
789 if (in->value_ctr.values[i].blob->length == 0) {
793 ret = convert_string_talloc_convenience(out->values,
794 schema->iconv_convenience,
796 in->value_ctr.values[i].blob->data,
797 in->value_ctr.values[i].blob->length,
803 out->values[i] = data_blob_string_const(str);
809 static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(struct ldb_context *ldb,
810 const struct dsdb_schema *schema,
811 const struct dsdb_attribute *attr,
812 const struct ldb_message_element *in,
814 struct drsuapi_DsReplicaAttribute *out)
819 if (attr->attributeID_id == 0xFFFFFFFF) {
823 out->attid = attr->attributeID_id;
824 out->value_ctr.num_values = in->num_values;
825 out->value_ctr.values = talloc_array(mem_ctx,
826 struct drsuapi_DsAttributeValue,
828 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
830 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
831 W_ERROR_HAVE_NO_MEMORY(blobs);
833 for (i=0; i < in->num_values; i++) {
836 out->value_ctr.values[i].blob = &blobs[i];
838 ret = convert_string_talloc_convenience(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
840 in->values[i].length,
841 (void **)&blobs[i].data);
845 blobs[i].length = ret;
851 static WERROR dsdb_syntax_DN_drsuapi_to_ldb(struct ldb_context *ldb,
852 const struct dsdb_schema *schema,
853 const struct dsdb_attribute *attr,
854 const struct drsuapi_DsReplicaAttribute *in,
856 struct ldb_message_element *out)
862 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
863 W_ERROR_HAVE_NO_MEMORY(out->name);
865 out->num_values = in->value_ctr.num_values;
866 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
867 W_ERROR_HAVE_NO_MEMORY(out->values);
869 for (i=0; i < out->num_values; i++) {
870 struct drsuapi_DsReplicaObjectIdentifier3 id3;
871 enum ndr_err_code ndr_err;
874 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
876 W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
879 if (in->value_ctr.values[i].blob == NULL) {
880 talloc_free(tmp_ctx);
884 if (in->value_ctr.values[i].blob->length == 0) {
885 talloc_free(tmp_ctx);
891 ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
892 tmp_ctx, schema->iconv_convenience, &id3,
893 (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
894 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
895 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
896 talloc_free(tmp_ctx);
897 return ntstatus_to_werror(status);
900 dn = ldb_dn_new(tmp_ctx, ldb, id3.dn);
902 talloc_free(tmp_ctx);
903 /* If this fails, it must be out of memory, as it does not do much parsing */
904 W_ERROR_HAVE_NO_MEMORY(dn);
907 ndr_err = ndr_push_struct_blob(&guid_blob, tmp_ctx, schema->iconv_convenience, &id3.guid,
908 (ndr_push_flags_fn_t)ndr_push_GUID);
909 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
910 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
911 talloc_free(tmp_ctx);
912 return ntstatus_to_werror(status);
915 ret = ldb_dn_set_extended_component(dn, "GUID", &guid_blob);
916 if (ret != LDB_SUCCESS) {
917 talloc_free(tmp_ctx);
921 talloc_free(guid_blob.data);
923 if (id3.__ndr_size_sid) {
925 ndr_err = ndr_push_struct_blob(&sid_blob, tmp_ctx, schema->iconv_convenience, &id3.sid,
926 (ndr_push_flags_fn_t)ndr_push_dom_sid);
927 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
928 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
929 talloc_free(tmp_ctx);
930 return ntstatus_to_werror(status);
933 ret = ldb_dn_set_extended_component(dn, "SID", &sid_blob);
934 if (ret != LDB_SUCCESS) {
935 talloc_free(tmp_ctx);
940 out->values[i] = data_blob_string_const(ldb_dn_get_extended_linearized(out->values, dn, 1));
941 talloc_free(tmp_ctx);
947 static WERROR dsdb_syntax_DN_ldb_to_drsuapi(struct ldb_context *ldb,
948 const struct dsdb_schema *schema,
949 const struct dsdb_attribute *attr,
950 const struct ldb_message_element *in,
952 struct drsuapi_DsReplicaAttribute *out)
957 if (attr->attributeID_id == 0xFFFFFFFF) {
961 out->attid = attr->attributeID_id;
962 out->value_ctr.num_values = in->num_values;
963 out->value_ctr.values = talloc_array(mem_ctx,
964 struct drsuapi_DsAttributeValue,
966 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
968 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
969 W_ERROR_HAVE_NO_MEMORY(blobs);
971 for (i=0; i < in->num_values; i++) {
972 struct drsuapi_DsReplicaObjectIdentifier3 id3;
973 enum ndr_err_code ndr_err;
974 const DATA_BLOB *guid_blob, *sid_blob;
976 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
977 W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
979 out->value_ctr.values[i].blob = &blobs[i];
981 dn = ldb_dn_from_ldb_val(tmp_ctx, ldb, &in->values[i]);
983 W_ERROR_HAVE_NO_MEMORY(dn);
985 guid_blob = ldb_dn_get_extended_component(dn, "GUID");
990 ndr_err = ndr_pull_struct_blob_all(guid_blob,
991 tmp_ctx, schema->iconv_convenience, &id3.guid,
992 (ndr_pull_flags_fn_t)ndr_pull_GUID);
993 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
994 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
995 talloc_free(tmp_ctx);
996 return ntstatus_to_werror(status);
1000 sid_blob = ldb_dn_get_extended_component(dn, "SID");
1003 ndr_err = ndr_pull_struct_blob_all(sid_blob,
1004 tmp_ctx, schema->iconv_convenience, &id3.sid,
1005 (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
1006 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1007 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
1008 talloc_free(tmp_ctx);
1009 return ntstatus_to_werror(status);
1013 id3.dn = ldb_dn_get_linearized(dn);
1015 ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3, (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
1016 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1017 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
1018 talloc_free(tmp_ctx);
1019 return ntstatus_to_werror(status);
1021 talloc_free(tmp_ctx);
1027 static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(struct ldb_context *ldb,
1028 const struct dsdb_schema *schema,
1029 const struct dsdb_attribute *attr,
1030 const struct drsuapi_DsReplicaAttribute *in,
1031 TALLOC_CTX *mem_ctx,
1032 struct ldb_message_element *out)
1037 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
1038 W_ERROR_HAVE_NO_MEMORY(out->name);
1040 out->num_values = in->value_ctr.num_values;
1041 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
1042 W_ERROR_HAVE_NO_MEMORY(out->values);
1044 for (i=0; i < out->num_values; i++) {
1045 struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
1048 enum ndr_err_code ndr_err;
1050 if (in->value_ctr.values[i].blob == NULL) {
1054 if (in->value_ctr.values[i].blob->length == 0) {
1058 ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
1059 out->values, schema->iconv_convenience, &id3b,
1060 (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
1061 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1062 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
1063 return ntstatus_to_werror(status);
1066 /* TODO: handle id3.guid and id3.sid */
1067 binary = data_blob_hex_string(out->values, &id3b.binary);
1068 W_ERROR_HAVE_NO_MEMORY(binary);
1070 str = talloc_asprintf(out->values, "B:%u:%s:%s",
1071 (unsigned int)(id3b.binary.length * 2), /* because of 2 hex chars per byte */
1074 W_ERROR_HAVE_NO_MEMORY(str);
1076 /* TODO: handle id3.guid and id3.sid */
1077 out->values[i] = data_blob_string_const(str);
1083 static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(struct ldb_context *ldb,
1084 const struct dsdb_schema *schema,
1085 const struct dsdb_attribute *attr,
1086 const struct ldb_message_element *in,
1087 TALLOC_CTX *mem_ctx,
1088 struct drsuapi_DsReplicaAttribute *out)
1093 if (attr->attributeID_id == 0xFFFFFFFF) {
1097 out->attid = attr->attributeID_id;
1098 out->value_ctr.num_values = in->num_values;
1099 out->value_ctr.values = talloc_array(mem_ctx,
1100 struct drsuapi_DsAttributeValue,
1102 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
1104 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
1105 W_ERROR_HAVE_NO_MEMORY(blobs);
1107 for (i=0; i < in->num_values; i++) {
1108 struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
1109 enum ndr_err_code ndr_err;
1111 out->value_ctr.values[i].blob = &blobs[i];
1113 /* TODO: handle id3b.guid and id3b.sid, id3.binary */
1115 id3b.dn = (const char *)in->values[i].data;
1116 id3b.binary = data_blob(NULL, 0);
1118 ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3b,
1119 (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
1120 if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
1121 NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
1122 return ntstatus_to_werror(status);
1129 static WERROR dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb(struct ldb_context *ldb,
1130 const struct dsdb_schema *schema,
1131 const struct dsdb_attribute *attr,
1132 const struct drsuapi_DsReplicaAttribute *in,
1133 TALLOC_CTX *mem_ctx,
1134 struct ldb_message_element *out)
1139 out->name = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
1140 W_ERROR_HAVE_NO_MEMORY(out->name);
1142 out->num_values = in->value_ctr.num_values;
1143 out->values = talloc_array(mem_ctx, struct ldb_val, out->num_values);
1144 W_ERROR_HAVE_NO_MEMORY(out->values);
1146 for (i=0; i < out->num_values; i++) {
1151 if (in->value_ctr.values[i].blob == NULL) {
1155 if (in->value_ctr.values[i].blob->length < 4) {
1159 len = IVAL(in->value_ctr.values[i].blob->data, 0);
1161 if (len != in->value_ctr.values[i].blob->length) {
1165 ret = convert_string_talloc_convenience(out->values, schema->iconv_convenience, CH_UTF16, CH_UNIX,
1166 in->value_ctr.values[i].blob->data+4,
1167 in->value_ctr.values[i].blob->length-4,
1173 out->values[i] = data_blob_string_const(str);
1179 static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(struct ldb_context *ldb,
1180 const struct dsdb_schema *schema,
1181 const struct dsdb_attribute *attr,
1182 const struct ldb_message_element *in,
1183 TALLOC_CTX *mem_ctx,
1184 struct drsuapi_DsReplicaAttribute *out)
1189 if (attr->attributeID_id == 0xFFFFFFFF) {
1193 out->attid = attr->attributeID_id;
1194 out->value_ctr.num_values = in->num_values;
1195 out->value_ctr.values = talloc_array(mem_ctx,
1196 struct drsuapi_DsAttributeValue,
1198 W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
1200 blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
1201 W_ERROR_HAVE_NO_MEMORY(blobs);
1203 for (i=0; i < in->num_values; i++) {
1207 out->value_ctr.values[i].blob = &blobs[i];
1209 ret = convert_string_talloc_convenience(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
1211 in->values[i].length,
1217 blobs[i] = data_blob_talloc(blobs, NULL, 4 + ret);
1218 W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
1220 SIVAL(blobs[i].data, 0, 4 + ret);
1223 memcpy(blobs[i].data + 4, data, ret);
1231 #define OMOBJECTCLASS(val) { .length = sizeof(val) - 1, .data = discard_const_p(uint8_t, val) }
1233 static const struct dsdb_syntax dsdb_syntaxes[] = {
1236 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.7",
1238 .attributeSyntax_oid = "2.5.5.8",
1239 .drsuapi_to_ldb = dsdb_syntax_BOOL_drsuapi_to_ldb,
1240 .ldb_to_drsuapi = dsdb_syntax_BOOL_ldb_to_drsuapi,
1241 .equality = "booleanMatch",
1242 .comment = "Boolean"
1245 .ldap_oid = LDB_SYNTAX_INTEGER,
1247 .attributeSyntax_oid = "2.5.5.9",
1248 .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb,
1249 .ldb_to_drsuapi = dsdb_syntax_INT32_ldb_to_drsuapi,
1250 .equality = "integerMatch",
1251 .comment = "Integer",
1253 .name = "String(Octet)",
1254 .ldap_oid = LDB_SYNTAX_OCTET_STRING,
1256 .attributeSyntax_oid = "2.5.5.10",
1257 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1258 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1259 .equality = "octetStringMatch",
1260 .comment = "Octet String",
1262 .name = "String(Sid)",
1263 .ldap_oid = LDB_SYNTAX_OCTET_STRING,
1265 .attributeSyntax_oid = "2.5.5.17",
1266 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1267 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1268 .equality = "octetStringMatch",
1269 .comment = "Octet String - Security Identifier (SID)",
1270 .ldb_syntax = LDB_SYNTAX_SAMBA_SID
1272 .name = "String(Object-Identifier)",
1273 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.38",
1275 .attributeSyntax_oid = "2.5.5.2",
1276 .drsuapi_to_ldb = dsdb_syntax_OID_drsuapi_to_ldb,
1277 .ldb_to_drsuapi = dsdb_syntax_OID_ldb_to_drsuapi,
1278 .equality = "caseIgnoreMatch", /* Would use "objectIdentifierMatch" but most are ldap attribute/class names */
1279 .comment = "OID String",
1280 .ldb_syntax = LDB_SYNTAX_DIRECTORY_STRING
1282 .name = "Enumeration",
1283 .ldap_oid = LDB_SYNTAX_INTEGER,
1285 .attributeSyntax_oid = "2.5.5.9",
1286 .drsuapi_to_ldb = dsdb_syntax_INT32_drsuapi_to_ldb,
1287 .ldb_to_drsuapi = dsdb_syntax_INT32_ldb_to_drsuapi,
1289 /* not used in w2k3 forest */
1290 .name = "String(Numeric)",
1291 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.36",
1293 .attributeSyntax_oid = "2.5.5.6",
1294 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1295 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1296 .equality = "numericStringMatch",
1297 .substring = "numericStringSubstringsMatch",
1298 .comment = "Numeric String"
1300 .name = "String(Printable)",
1301 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.44",
1303 .attributeSyntax_oid = "2.5.5.5",
1304 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1305 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1307 .name = "String(Teletex)",
1308 .ldap_oid = "1.2.840.113556.1.4.905",
1310 .attributeSyntax_oid = "2.5.5.4",
1311 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1312 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1313 .equality = "caseIgnoreMatch",
1314 .substring = "caseIgnoreSubstringsMatch",
1315 .comment = "Case Insensitive String",
1316 .ldb_syntax = LDB_SYNTAX_DIRECTORY_STRING,
1318 .name = "String(IA5)",
1319 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.26",
1321 .attributeSyntax_oid = "2.5.5.5",
1322 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1323 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1324 .equality = "caseExactIA5Match",
1325 .comment = "Printable String"
1327 .name = "String(UTC-Time)",
1328 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.53",
1330 .attributeSyntax_oid = "2.5.5.11",
1331 .drsuapi_to_ldb = dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb,
1332 .ldb_to_drsuapi = dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi,
1333 .equality = "generalizedTimeMatch",
1334 .comment = "UTC Time",
1336 .name = "String(Generalized-Time)",
1337 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.24",
1339 .attributeSyntax_oid = "2.5.5.11",
1340 .drsuapi_to_ldb = dsdb_syntax_NTTIME_drsuapi_to_ldb,
1341 .ldb_to_drsuapi = dsdb_syntax_NTTIME_ldb_to_drsuapi,
1342 .equality = "generalizedTimeMatch",
1343 .comment = "Generalized Time",
1344 .ldb_syntax = LDB_SYNTAX_UTC_TIME,
1346 /* not used in w2k3 schema */
1347 .name = "String(Case Sensitive)",
1348 .ldap_oid = "1.2.840.113556.1.4.1362",
1350 .attributeSyntax_oid = "2.5.5.3",
1351 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
1352 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
1354 .name = "String(Unicode)",
1355 .ldap_oid = LDB_SYNTAX_DIRECTORY_STRING,
1357 .attributeSyntax_oid = "2.5.5.12",
1358 .drsuapi_to_ldb = dsdb_syntax_UNICODE_drsuapi_to_ldb,
1359 .ldb_to_drsuapi = dsdb_syntax_UNICODE_ldb_to_drsuapi,
1360 .equality = "caseIgnoreMatch",
1361 .substring = "caseIgnoreSubstringsMatch",
1362 .comment = "Directory String",
1364 .name = "Interval/LargeInteger",
1365 .ldap_oid = "1.2.840.113556.1.4.906",
1367 .attributeSyntax_oid = "2.5.5.16",
1368 .drsuapi_to_ldb = dsdb_syntax_INT64_drsuapi_to_ldb,
1369 .ldb_to_drsuapi = dsdb_syntax_INT64_ldb_to_drsuapi,
1370 .equality = "integerMatch",
1371 .comment = "Large Integer",
1372 .ldb_syntax = LDB_SYNTAX_INTEGER,
1374 .name = "String(NT-Sec-Desc)",
1375 .ldap_oid = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR,
1377 .attributeSyntax_oid = "2.5.5.15",
1378 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1379 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1381 .name = "Object(DS-DN)",
1382 .ldap_oid = LDB_SYNTAX_DN,
1384 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x4a"),
1385 .attributeSyntax_oid = "2.5.5.1",
1386 .drsuapi_to_ldb = dsdb_syntax_DN_drsuapi_to_ldb,
1387 .ldb_to_drsuapi = dsdb_syntax_DN_ldb_to_drsuapi,
1388 .equality = "distinguishedNameMatch",
1389 .comment = "Object(DS-DN) == a DN",
1391 .name = "Object(DN-Binary)",
1392 .ldap_oid = "1.2.840.113556.1.4.903",
1394 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x0b"),
1395 .attributeSyntax_oid = "2.5.5.7",
1396 .drsuapi_to_ldb = dsdb_syntax_DN_BINARY_drsuapi_to_ldb,
1397 .ldb_to_drsuapi = dsdb_syntax_DN_BINARY_ldb_to_drsuapi,
1398 .equality = "octetStringMatch",
1399 .comment = "OctetString: Binary+DN",
1400 .ldb_syntax = LDB_SYNTAX_OCTET_STRING,
1402 /* not used in w2k3 schema */
1403 .name = "Object(OR-Name)",
1404 .ldap_oid = "1.2.840.113556.1.4.1221",
1406 .oMObjectClass = OMOBJECTCLASS("\x56\x06\x01\x02\x05\x0b\x1D"),
1407 .attributeSyntax_oid = "2.5.5.7",
1408 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
1409 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
1412 * TODO: verify if DATA_BLOB is correct here...!
1414 * repsFrom and repsTo are the only attributes using
1415 * this attribute syntax, but they're not replicated...
1417 .name = "Object(Replica-Link)",
1418 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.40",
1420 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x06"),
1421 .attributeSyntax_oid = "2.5.5.10",
1422 .drsuapi_to_ldb = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
1423 .ldb_to_drsuapi = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
1425 .name = "Object(Presentation-Address)",
1426 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.43",
1428 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x5c"),
1429 .attributeSyntax_oid = "2.5.5.13",
1430 .drsuapi_to_ldb = dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb,
1431 .ldb_to_drsuapi = dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi,
1432 .comment = "Presentation Address"
1434 /* not used in w2k3 schema */
1435 .name = "Object(Access-Point)",
1436 .ldap_oid = "1.3.6.1.4.1.1466.115.121.1.2",
1438 .oMObjectClass = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x3e"),
1439 .attributeSyntax_oid = "2.5.5.14",
1440 .drsuapi_to_ldb = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
1441 .ldb_to_drsuapi = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
1443 /* not used in w2k3 schema */
1444 .name = "Object(DN-String)",
1445 .ldap_oid = "1.2.840.113556.1.4.904",
1447 .oMObjectClass = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x0c"),
1448 .attributeSyntax_oid = "2.5.5.14",
1449 .drsuapi_to_ldb = dsdb_syntax_DN_BINARY_drsuapi_to_ldb,
1450 .ldb_to_drsuapi = dsdb_syntax_DN_BINARY_ldb_to_drsuapi,
1451 .equality = "octetStringMatch",
1452 .comment = "OctetString: String+DN",
1453 .ldb_syntax = LDB_SYNTAX_OCTET_STRING,
1457 const struct dsdb_syntax *find_syntax_map_by_ad_oid(const char *ad_oid)
1460 for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
1461 if (strcasecmp(ad_oid, dsdb_syntaxes[i].attributeSyntax_oid) == 0) {
1462 return &dsdb_syntaxes[i];
1468 const struct dsdb_syntax *find_syntax_map_by_ad_syntax(int oMSyntax)
1471 for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
1472 if (oMSyntax == dsdb_syntaxes[i].oMSyntax) {
1473 return &dsdb_syntaxes[i];
1479 const struct dsdb_syntax *find_syntax_map_by_standard_oid(const char *standard_oid)
1482 for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
1483 if (strcasecmp(standard_oid, dsdb_syntaxes[i].ldap_oid) == 0) {
1484 return &dsdb_syntaxes[i];
1489 const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute *attr)
1493 for (i=0; i < ARRAY_SIZE(dsdb_syntaxes); i++) {
1494 if (attr->oMSyntax != dsdb_syntaxes[i].oMSyntax) continue;
1496 if (attr->oMObjectClass.length != dsdb_syntaxes[i].oMObjectClass.length) continue;
1498 if (attr->oMObjectClass.length) {
1500 ret = memcmp(attr->oMObjectClass.data,
1501 dsdb_syntaxes[i].oMObjectClass.data,
1502 attr->oMObjectClass.length);
1503 if (ret != 0) continue;
1506 if (strcmp(attr->attributeSyntax_oid, dsdb_syntaxes[i].attributeSyntax_oid) != 0) continue;
1508 return &dsdb_syntaxes[i];
1514 WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
1515 const struct dsdb_schema *schema,
1516 const struct drsuapi_DsReplicaAttribute *in,
1517 TALLOC_CTX *mem_ctx,
1518 struct ldb_message_element *out)
1520 const struct dsdb_attribute *sa;
1522 sa = dsdb_attribute_by_attributeID_id(schema, in->attid);
1527 return sa->syntax->drsuapi_to_ldb(ldb, schema, sa, in, mem_ctx, out);
1530 WERROR dsdb_attribute_ldb_to_drsuapi(struct ldb_context *ldb,
1531 const struct dsdb_schema *schema,
1532 const struct ldb_message_element *in,
1533 TALLOC_CTX *mem_ctx,
1534 struct drsuapi_DsReplicaAttribute *out)
1536 const struct dsdb_attribute *sa;
1538 sa = dsdb_attribute_by_lDAPDisplayName(schema, in->name);
1543 return sa->syntax->ldb_to_drsuapi(ldb, schema, sa, in, mem_ctx, out);