]> git.samba.org - ira/wip.git/blobdiff - source4/dsdb/schema/schema_syntax.c
r26429: Avoid use of global_smb_iconv_convenience.
[ira/wip.git] / source4 / dsdb / schema / schema_syntax.c
index 69b99261ee55a5ef6089c4b0ae27d649ec50e74c..a8fe4a3b9db881dffafdf07bbf385fa25512f366 100644 (file)
@@ -2,11 +2,11 @@
    Unix SMB/CIFS mplementation.
    DSDB schema syntaxes
    
-   Copyright (C) Stefan Metzmacher 2006
+   Copyright (C) Stefan Metzmacher <metze@samba.org> 2006
     
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -15,8 +15,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
 */
 #include "includes.h"
@@ -26,6 +25,7 @@
 #include "system/time.h"
 #include "lib/charset/charset.h"
 #include "librpc/ndr/libndr.h"
+#include "param/param.h"
 
 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema,
                                                const struct dsdb_attribute *attr,
@@ -39,14 +39,14 @@ static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
@@ -77,18 +77,11 @@ static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_isSingleValued:
-case DRSUAPI_ATTRIBUTE_showInAdvancedViewOnly:
-case DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet:
-       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);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -96,15 +89,15 @@ case DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet:
                uint32_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
-               v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                if (v != 0) {
                        str = talloc_strdup(out->values, "TRUE");
@@ -133,18 +126,18 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -169,23 +162,11 @@ static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_instanceType:
-case DRSUAPI_ATTRIBUTE_rangeLower:
-case DRSUAPI_ATTRIBUTE_rangeUpper:
-case DRSUAPI_ATTRIBUTE_objectVersion:
-case DRSUAPI_ATTRIBUTE_oMSyntax:
-case DRSUAPI_ATTRIBUTE_searchFlags:
-case DRSUAPI_ATTRIBUTE_systemFlags:
-case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
-       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);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -193,15 +174,15 @@ case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
                int32_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
-               v = IVALS(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVALS(in->value_ctr.values[i].blob->data, 0);
 
                str = talloc_asprintf(out->values, "%d", v);
                W_ERROR_HAVE_NO_MEMORY(str);
@@ -225,12 +206,12 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -238,7 +219,7 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                int32_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -263,7 +244,7 @@ static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -271,17 +252,17 @@ static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
                int64_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 8) {
+               if (in->value_ctr.values[i].blob->length != 8) {
                        return WERR_FOOBAR;
                }
 
-               v = BVALS(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = BVALS(in->value_ctr.values[i].blob->data, 0);
 
-               str = talloc_asprintf(out->values, "%lld", v);
+               str = talloc_asprintf(out->values, "%lld", (long long int)v);
                W_ERROR_HAVE_NO_MEMORY(str);
 
                out->values[i] = data_blob_string_const(str);
@@ -303,12 +284,12 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -316,7 +297,7 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                int64_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -329,6 +310,98 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
        return WERR_OK;
 }
 
+static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(const struct dsdb_schema *schema,
+                                                   const struct dsdb_attribute *attr,
+                                                   const struct drsuapi_DsReplicaAttribute *in,
+                                                   TALLOC_CTX *mem_ctx,
+                                                   struct ldb_message_element *out)
+{
+       uint32_t i;
+
+       out->flags      = 0;
+       out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
+       W_ERROR_HAVE_NO_MEMORY(out->name);
+
+       out->num_values = in->value_ctr.num_values;
+       out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->values);
+
+       for (i=0; i < out->num_values; i++) {
+               NTTIME v;
+               time_t t;
+               char *str;
+
+               if (in->value_ctr.values[i].blob == NULL) {
+                       return WERR_FOOBAR;
+               }
+
+               if (in->value_ctr.values[i].blob->length != 8) {
+                       return WERR_FOOBAR;
+               }
+
+               v = BVAL(in->value_ctr.values[i].blob->data, 0);
+               v *= 10000000;
+               t = nt_time_to_unix(v);
+
+               /* 
+                * NOTE: On a w2k3 server you can set a GeneralizedTime string
+                *       via LDAP, but you get back an UTCTime string,
+                *       but via DRSUAPI you get back the NTTIME_1sec value
+                *       that represents the GeneralizedTime value!
+                *
+                *       So if we store the UTCTime string in our ldb
+                *       we'll loose information!
+                */
+               str = ldb_timestring_utc(out->values, t); 
+               W_ERROR_HAVE_NO_MEMORY(str);
+               out->values[i] = data_blob_string_const(str);
+       }
+
+       return WERR_OK;
+}
+
+static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_schema *schema,
+                                                   const struct dsdb_attribute *attr,
+                                                   const struct ldb_message_element *in,
+                                                   TALLOC_CTX *mem_ctx,
+                                                   struct drsuapi_DsReplicaAttribute *out)
+{
+       uint32_t i;
+       DATA_BLOB *blobs;
+
+       if (attr->attributeID_id == 0xFFFFFFFF) {
+               return WERR_FOOBAR;
+       }
+
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
+
+       blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(blobs);
+
+       for (i=0; i < in->num_values; i++) {
+               NTTIME v;
+               time_t t;
+
+               out->value_ctr.values[i].blob   = &blobs[i];
+
+               blobs[i] = data_blob_talloc(blobs, NULL, 8);
+               W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
+
+               t = ldb_string_utc_to_time((const char *)in->values[i].data);
+               unix_to_nt_time(&v, t);
+               v /= 10000000;
+
+               SBVAL(blobs[i].data, 0, v);
+       }
+
+       return WERR_OK;
+}
+
 static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema,
                                                const struct dsdb_attribute *attr,
                                                const struct drsuapi_DsReplicaAttribute *in,
@@ -341,7 +414,7 @@ static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -350,15 +423,15 @@ static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema
                time_t t;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 8) {
+               if (in->value_ctr.values[i].blob->length != 8) {
                        return WERR_FOOBAR;
                }
 
-               v = BVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = BVAL(in->value_ctr.values[i].blob->data, 0);
                v *= 10000000;
                t = nt_time_to_unix(v);
 
@@ -384,12 +457,12 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -398,13 +471,14 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema
                NTTIME v;
                time_t t;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                t = ldb_string_to_time((const char *)in->values[i].data);
                unix_to_nt_time(&v, t);
+               v /= 10000000;
 
                SBVAL(blobs[i].data, 0, v);
        }
@@ -420,31 +494,25 @@ static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_schema *sch
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_invocationId:
-case DRSUAPI_ATTRIBUTE_schemaIDGUID:
-       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);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
                out->values[i] = data_blob_dup_talloc(out->values,
-                                                     in->value_ctr.data_blob.values[i].data);
+                                                     in->value_ctr.values[i].blob);
                W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
        }
 
@@ -464,18 +532,18 @@ static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_schema *sch
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -496,7 +564,7 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -505,11 +573,15 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
                const struct dsdb_class *c;
                const char *str;
 
-               if (in->value_ctr.object_class_id.values[i].objectClassId == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
+                       return WERR_FOOBAR;
+               }
+
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
-               v = *in->value_ctr.object_class_id.values[i].objectClassId;
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                c = dsdb_class_by_governsID_id(schema, v);
                if (!c) {
@@ -538,7 +610,7 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -547,11 +619,15 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
                WERROR status;
                const char *str;
 
-               if (in->value_ctr.oid.values[i].value == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               v = *in->value_ctr.oid.values[i].value;
+               if (in->value_ctr.values[i].blob->length != 4) {
+                       return WERR_FOOBAR;
+               }
+
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                status = dsdb_map_int2oid(schema, v, out->values, &str);
                W_ERROR_NOT_OK_RETURN(status);
@@ -583,7 +659,7 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -592,15 +668,15 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
                const char *name;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
-               v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                name = dsdb_lDAPDisplayName_by_id(schema, v);
                if (!name) {
@@ -637,12 +713,12 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return dsdb_syntax_FOOBAR_ldb_to_drsuapi(schema, attr, in, mem_ctx, out);
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -650,7 +726,7 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                uint32_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -671,22 +747,11 @@ static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_schema *schem
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_description:
-case DRSUAPI_ATTRIBUTE_adminDisplayName:
-case DRSUAPI_ATTRIBUTE_adminDescription:
-case DRSUAPI_ATTRIBUTE_lDAPDisplayName:
-case DRSUAPI_ATTRIBUTE_name:
-case DRSUAPI_ATTRIBUTE_sAMAccountName:
-case DRSUAPI_ATTRIBUTE_gPLink:
-       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);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -694,17 +759,17 @@ case DRSUAPI_ATTRIBUTE_gPLink:
                ssize_t ret;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
-               ret = convert_string_talloc(out->values, CH_UTF16, CH_UNIX,
-                                           in->value_ctr.data_blob.values[i].data->data,
-                                           in->value_ctr.data_blob.values[i].data->length,
+               ret = convert_string_talloc(out->values, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX,
+                                           in->value_ctr.values[i].blob->data,
+                                           in->value_ctr.values[i].blob->length,
                                            (void **)&str);
                if (ret == -1) {
                        return WERR_FOOBAR;
@@ -729,12 +794,12 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -742,9 +807,9 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
        for (i=0; i < in->num_values; i++) {
                ssize_t ret;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
-               ret = convert_string_talloc(blobs, CH_UNIX, CH_UTF16,
+               ret = convert_string_talloc(blobs, lp_iconv_convenience(global_loadparm), CH_UNIX, CH_UTF16,
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&blobs[i].data);
@@ -765,44 +830,31 @@ 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);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
-               NTSTATUS status;
+               enum ndr_err_code ndr_err;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
-               status = ndr_pull_struct_blob_all(in->value_ctr.data_blob.values[i].data,
-                                                 out->values, &id3,
-                                                 (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
+                                                  out->values, &id3,
+                                                  (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
 
@@ -826,36 +878,238 @@ static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               NTSTATUS status;
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
+               enum ndr_err_code ndr_err;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                /* TODO: handle id3.guid and id3.sid */
                ZERO_STRUCT(id3);
                id3.dn = (const char *)in->values[i].data;
 
-               status = ndr_push_struct_blob(&blobs[i], blobs, &id3,
-                                             (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, &id3,
+                                              (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+                       return ntstatus_to_werror(status);
+               }
+       }
+
+       return WERR_OK;
+}
+
+static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const struct dsdb_schema *schema,
+                                                  const struct dsdb_attribute *attr,
+                                                  const struct drsuapi_DsReplicaAttribute *in,
+                                                  TALLOC_CTX *mem_ctx,
+                                                  struct ldb_message_element *out)
+{
+       uint32_t i;
+
+       out->flags      = 0;
+       out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
+       W_ERROR_HAVE_NO_MEMORY(out->name);
+
+       out->num_values = in->value_ctr.num_values;
+       out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->values);
+
+       for (i=0; i < out->num_values; i++) {
+               struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
+               char *binary;
+               char *str;
+               enum ndr_err_code ndr_err;
+
+               if (in->value_ctr.values[i].blob == NULL) {
+                       return WERR_FOOBAR;
+               }
+
+               if (in->value_ctr.values[i].blob->length == 0) {
+                       return WERR_FOOBAR;
+               }
+
+               ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
+                                                  out->values, &id3b,
+                                                  (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
+
+               /* TODO: handle id3.guid and id3.sid */
+               binary = data_blob_hex_string(out->values, &id3b.binary);
+               W_ERROR_HAVE_NO_MEMORY(binary);
+
+               str = talloc_asprintf(out->values, "B:%u:%s:%s",
+                                     (unsigned int)(id3b.binary.length * 2), /* because of 2 hex chars per byte */
+                                     binary,
+                                     id3b.dn);
+               W_ERROR_HAVE_NO_MEMORY(str);
+
+               /* TODO: handle id3.guid and id3.sid */
+               out->values[i] = data_blob_string_const(str);
        }
 
        return WERR_OK;
 }
 
+static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(const struct dsdb_schema *schema,
+                                                  const struct dsdb_attribute *attr,
+                                                  const struct ldb_message_element *in,
+                                                  TALLOC_CTX *mem_ctx,
+                                                  struct drsuapi_DsReplicaAttribute *out)
+{
+       uint32_t i;
+       DATA_BLOB *blobs;
+
+       if (attr->attributeID_id == 0xFFFFFFFF) {
+               return WERR_FOOBAR;
+       }
+
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
+
+       blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(blobs);
+
+       for (i=0; i < in->num_values; i++) {
+               struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
+               enum ndr_err_code ndr_err;
+
+               out->value_ctr.values[i].blob   = &blobs[i];
+
+               /* TODO: handle id3b.guid and id3b.sid, id3.binary */
+               ZERO_STRUCT(id3b);
+               id3b.dn         = (const char *)in->values[i].data;
+               id3b.binary     = data_blob(NULL, 0);
+
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, &id3b,
+                                              (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+                       return ntstatus_to_werror(status);
+               }
+       }
+
+       return WERR_OK;
+}
+
+static WERROR dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb(const struct dsdb_schema *schema,
+                                                             const struct dsdb_attribute *attr,
+                                                             const struct drsuapi_DsReplicaAttribute *in,
+                                                             TALLOC_CTX *mem_ctx,
+                                                             struct ldb_message_element *out)
+{
+       uint32_t i;
+
+       out->flags      = 0;
+       out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
+       W_ERROR_HAVE_NO_MEMORY(out->name);
+
+       out->num_values = in->value_ctr.num_values;
+       out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->values);
+
+       for (i=0; i < out->num_values; i++) {
+               uint32_t len;
+               ssize_t ret;
+               char *str;
+
+               if (in->value_ctr.values[i].blob == NULL) {
+                       return WERR_FOOBAR;
+               }
+
+               if (in->value_ctr.values[i].blob->length < 4) {
+                       return WERR_FOOBAR;
+               }
+
+               len = IVAL(in->value_ctr.values[i].blob->data, 0);
+
+               if (len != in->value_ctr.values[i].blob->length) {
+                       return WERR_FOOBAR;
+               }
+
+               ret = convert_string_talloc(out->values, lp_iconv_convenience(global_loadparm), CH_UTF16, CH_UNIX,
+                                           in->value_ctr.values[i].blob->data+4,
+                                           in->value_ctr.values[i].blob->length-4,
+                                           (void **)&str);
+               if (ret == -1) {
+                       return WERR_FOOBAR;
+               }
+
+               out->values[i] = data_blob_string_const(str);
+       }
+
+       return WERR_OK;
+}
+
+static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_schema *schema,
+                                                             const struct dsdb_attribute *attr,
+                                                             const struct ldb_message_element *in,
+                                                             TALLOC_CTX *mem_ctx,
+                                                             struct drsuapi_DsReplicaAttribute *out)
+{
+       uint32_t i;
+       DATA_BLOB *blobs;
+
+       if (attr->attributeID_id == 0xFFFFFFFF) {
+               return WERR_FOOBAR;
+       }
+
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
+
+       blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(blobs);
+
+       for (i=0; i < in->num_values; i++) {
+               uint8_t *data;
+               ssize_t ret;
+
+               out->value_ctr.values[i].blob   = &blobs[i];
+
+               ret = convert_string_talloc(blobs, lp_iconv_convenience(global_loadparm), CH_UNIX, CH_UTF16,
+                                           in->values[i].data,
+                                           in->values[i].length,
+                                           (void **)&data);
+               if (ret == -1) {
+                       return WERR_FOOBAR;
+               }
+
+               blobs[i] = data_blob_talloc(blobs, NULL, 4 + ret);
+               W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
+
+               SIVAL(blobs[i].data, 0, 4 + ret);
+
+               if (ret > 0) {
+                       memcpy(blobs[i].data + 4, data, ret);
+                       talloc_free(data);
+               }
+       }
+
+       return WERR_OK;
+}
+
+
 #define OMOBJECTCLASS(val) { .length = sizeof(val) - 1, .data = discard_const_p(uint8_t, val) }
 
 static const struct dsdb_syntax dsdb_syntaxes[] = {
@@ -907,40 +1161,36 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.36",
                .oMSyntax               = 18,
                .attributeSyntax_oid    = "2.5.5.6",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
                .name                   = "String(Printable)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.44",
                .oMSyntax               = 19,
                .attributeSyntax_oid    = "2.5.5.5",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
                .name                   = "String(Teletex)",
                .ldap_oid               = "1.2.840.113556.1.4.905",
                .oMSyntax               = 20,
                .attributeSyntax_oid    = "2.5.5.4",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
                .name                   = "String(IA5)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.26",
                .oMSyntax               = 22,
                .attributeSyntax_oid    = "2.5.5.5",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
                .name                   = "String(UTC-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.53",
                .oMSyntax               = 23,
                .attributeSyntax_oid    = "2.5.5.11",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi,
        },{
                .name                   = "String(Generalized-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.24",
@@ -949,7 +1199,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .drsuapi_to_ldb         = dsdb_syntax_NTTIME_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_NTTIME_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
+       /* not used in w2k3 schema */
                .name                   = "String(Case Sensitive)",
                .ldap_oid               = "1.2.840.113556.1.4.1362",
                .oMSyntax               = 27,
@@ -991,10 +1241,10 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .oMSyntax               = 127,
                .oMObjectClass          = OMOBJECTCLASS("\x2a\x86\x48\x86\xf7\x14\x01\x01\x01\x0b"),
                .attributeSyntax_oid    = "2.5.5.7",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_DN_BINARY_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_DN_BINARY_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
+       /* not used in w2k3 schema */
                .name                   = "Object(OR-Name)",
                .ldap_oid               = "1.2.840.113556.1.4.1221",
                .oMSyntax               = 127,
@@ -1003,6 +1253,12 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
+       /* 
+        * TODO: verify if DATA_BLOB is correct here...!
+        *
+        *       repsFrom and repsTo are the only attributes using
+        *       this attribute syntax, but they're not replicated... 
+        */
                .name                   = "Object(Replica-Link)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.40",
                .oMSyntax               = 127,
@@ -1011,16 +1267,15 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
+               .name                   = "Object(Presentation-Address)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.43",
                .oMSyntax               = 127,
                .oMObjectClass          = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x5c"),
                .attributeSyntax_oid    = "2.5.5.13",
-               .name                   = "Object(Presentation-Address)",
-               .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
-               .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .drsuapi_to_ldb         = dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb,
+               .ldb_to_drsuapi         = dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
+       /* not used in w2k3 schema */
                .name                   = "Object(Access-Point)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.2",
                .oMSyntax               = 127,
@@ -1029,7 +1284,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
-       /* not used in w2k3 forest */
+       /* not used in w2k3 schema */
                .name                   = "Object(DN-String)",
                .ldap_oid               = "1.2.840.113556.1.4.904",
                .oMSyntax               = 127,