dsdb: Convert the full string from UTF16 to UTF8, including embedded NULLs
[mat/samba.git] / source4 / dsdb / schema / schema_syntax.c
index 501ab3adedbb28446900daecf4848f37e9a2de58..c2e020825826855e3a40b0af1b860586953dbf37 100644 (file)
@@ -209,7 +209,7 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx,
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -229,9 +229,11 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx,
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
-               if (strcmp("TRUE", (const char *)in->values[i].data) == 0) {
+               if (in->values[i].length >= 4 &&
+                   strncmp("TRUE", (const char *)in->values[i].data, in->values[i].length) == 0) {
                        SIVAL(blobs[i].data, 0, 0x00000001);
-               } else if (strcmp("FALSE", (const char *)in->values[i].data) == 0) {
+               } else if (in->values[i].length >= 5 &&
+                          strncmp("FALSE", (const char *)in->values[i].data, in->values[i].length) == 0) {
                        SIVAL(blobs[i].data, 0, 0x00000000);
                } else {
                        return WERR_FOOBAR;
@@ -248,26 +250,27 @@ static WERROR dsdb_syntax_BOOL_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
-               int t, f;
-
                if (in->values[i].length == 0) {
                        return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
                }
 
-               t = strncmp("TRUE",
+               if (in->values[i].length >= 4 &&
+                   strncmp("TRUE",
                            (const char *)in->values[i].data,
-                           in->values[i].length);
-               f = strncmp("FALSE",
+                           in->values[i].length) == 0) {
+                       continue;
+               }
+               if (in->values[i].length >= 5 &&
+                   strncmp("FALSE",
                            (const char *)in->values[i].data,
-                           in->values[i].length);
-
-               if (t != 0 && f != 0) {
-                       return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
+                           in->values[i].length) == 0) {
+                       continue;
                }
+               return WERR_DS_INVALID_ATTRIBUTE_SYNTAX;
        }
 
        return WERR_OK;
@@ -322,7 +325,7 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -361,7 +364,7 @@ static WERROR dsdb_syntax_INT32_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -449,7 +452,7 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -486,7 +489,7 @@ static WERROR dsdb_syntax_INT64_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -589,7 +592,7 @@ static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_syntax_ctx
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -612,7 +615,7 @@ static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_syntax_ctx
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
-               if (ldb_val_string_cmp("16010101000000.0Z", &in->values[i]) == 0) {
+               if (ldb_val_string_cmp(&in->values[i], "16010101000000.0Z") == 0) {
                        SBVALS(blobs[i].data, 0, 0);
                        continue;
                }
@@ -634,7 +637,7 @@ static WERROR dsdb_syntax_NTTIME_UTC_validate_ldb(const struct dsdb_syntax_ctx *
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -730,7 +733,7 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ct
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -754,7 +757,7 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ct
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
-               if (ldb_val_string_cmp("16010101000000.0Z", &in->values[i]) == 0) {
+               if (ldb_val_string_cmp(&in->values[i], "16010101000000.0Z") == 0) {
                        SBVALS(blobs[i].data, 0, 0);
                        continue;
                }
@@ -779,7 +782,7 @@ static WERROR dsdb_syntax_NTTIME_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -833,7 +836,7 @@ static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_syntax_ctx
                }
 
                out->values[i] = data_blob_dup_talloc(out->values,
-                                                     in->value_ctr.values[i].blob);
+                                                     *in->value_ctr.values[i].blob);
                W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
        }
 
@@ -850,7 +853,7 @@ static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_syntax_ctx
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -867,7 +870,7 @@ static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_syntax_ctx
        for (i=0; i < in->num_values; i++) {
                out->value_ctr.values[i].blob   = &blobs[i];
 
-               blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
+               blobs[i] = data_blob_dup_talloc(blobs, in->values[i]);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
        }
 
@@ -879,7 +882,7 @@ static WERROR dsdb_syntax_DATA_BLOB_validate_one_val(const struct dsdb_syntax_ct
                                                     const struct ldb_val *val)
 {
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        if (attr->rangeLower) {
@@ -905,7 +908,7 @@ static WERROR dsdb_syntax_DATA_BLOB_validate_ldb(const struct dsdb_syntax_ctx *c
        WERROR status;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -1051,10 +1054,12 @@ static WERROR _dsdb_syntax_OID_attr_drsuapi_to_ldb(const struct dsdb_syntax_ctx
                const char *str;
 
                if (in->value_ctr.values[i].blob == NULL) {
+                       DEBUG(0, ("Attribute has no value\n"));
                        return WERR_FOOBAR;
                }
 
                if (in->value_ctr.values[i].blob->length != 4) {
+                       DEBUG(0, ("Attribute has a value with 0 length\n"));
                        return WERR_FOOBAR;
                }
 
@@ -1261,6 +1266,7 @@ static WERROR _dsdb_syntax_OID_attr_ldb_to_drsuapi(const struct dsdb_syntax_ctx
 
                obj_attr = dsdb_attribute_by_lDAPDisplayName(ctx->schema, (const char *)in->values[i].data);
                if (!obj_attr) {
+                       DEBUG(0, ("Unable to find attribute %s in the schema\n", (const char *)in->values[i].data));
                        return WERR_FOOBAR;
                }
                SIVAL(blobs[i].data, 0, obj_attr->attributeID_id);
@@ -1363,7 +1369,7 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx,
                                             struct drsuapi_DsReplicaAttribute *out)
 {
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        switch (attr->attributeID_id) {
@@ -1446,7 +1452,7 @@ static WERROR dsdb_syntax_OID_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        TALLOC_CTX *tmp_ctx;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        switch (attr->attributeID_id) {
@@ -1523,7 +1529,7 @@ static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_syntax_ctx *c
                        return WERR_FOOBAR;
                }
 
-               out->values[i] = data_blob_string_const(str);
+               out->values[i] = data_blob_const(str, converted_size);
        }
 
        return WERR_OK;
@@ -1539,7 +1545,7 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_syntax_ctx *c
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -1576,7 +1582,7 @@ static WERROR dsdb_syntax_UNICODE_validate_one_val(const struct dsdb_syntax_ctx
        bool ok;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        ok = convert_string_talloc(ctx->ldb,
@@ -1613,7 +1619,7 @@ static WERROR dsdb_syntax_UNICODE_validate_ldb(const struct dsdb_syntax_ctx *ctx
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -1752,7 +1758,7 @@ static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_syntax_ctx *ctx,
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -1834,7 +1840,7 @@ static WERROR dsdb_syntax_DN_validate_one_val(const struct dsdb_syntax_ctx *ctx,
        W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        dsdb_dn = dsdb_dn_parse(tmp_ctx, ctx->ldb, val,
@@ -1917,7 +1923,7 @@ static WERROR dsdb_syntax_DN_validate_ldb(const struct dsdb_syntax_ctx *ctx,
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -2059,7 +2065,7 @@ static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(const struct dsdb_syntax_ctx
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -2138,7 +2144,7 @@ static WERROR dsdb_syntax_DN_BINARY_validate_ldb(const struct dsdb_syntax_ctx *c
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -2208,7 +2214,7 @@ static WERROR dsdb_syntax_DN_STRING_validate_ldb(const struct dsdb_syntax_ctx *c
        unsigned int i;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        for (i=0; i < in->num_values; i++) {
@@ -2303,7 +2309,7 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_
        DATA_BLOB *blobs;
 
        if (attr->attributeID_id == DRSUAPI_ATTID_INVALID) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        out->attid                      = dsdb_attribute_get_attid(attr,
@@ -2487,7 +2493,6 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .validate_ldb           = dsdb_syntax_NTTIME_validate_ldb,
                .equality               = "generalizedTimeMatch",
                .comment                = "Generalized Time",
-               .ldb_syntax             = LDB_SYNTAX_UTC_TIME,
                .auto_normalise         = true
        },{
        /* not used in w2k3 schema */
@@ -2701,7 +2706,7 @@ WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
                if (!dsdb_syntax_attid_from_remote_attid(&syntax_ctx, mem_ctx, in->attid, &attid_local)) {
                        DEBUG(0,(__location__ ": Can't find local ATTID for 0x%08X\n",
                                 in->attid));
-                       return WERR_FOOBAR;
+                       return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
                }
                break;
        case DSDB_ATTID_TYPE_INTID:
@@ -2718,7 +2723,7 @@ WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb,
        sa = dsdb_attribute_by_attributeID_id(schema, attid_local);
        if (!sa) {
                DEBUG(1,(__location__ ": Unknown attributeID_id 0x%08X\n", in->attid));
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        return sa->syntax->drsuapi_to_ldb(&syntax_ctx, sa, in, mem_ctx, out);
@@ -2735,7 +2740,7 @@ WERROR dsdb_attribute_ldb_to_drsuapi(struct ldb_context *ldb,
 
        sa = dsdb_attribute_by_lDAPDisplayName(schema, in->name);
        if (!sa) {
-               return WERR_FOOBAR;
+               return WERR_DS_ATT_NOT_DEF_IN_SCHEMA;
        }
 
        /* use default syntax conversion context */