ldb-samba: implement --show-binary for msDS-RevealedUsers
authorStefan Metzmacher <metze@samba.org>
Fri, 6 Mar 2015 17:07:15 +0000 (18:07 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 12 Mar 2015 16:13:43 +0000 (17:13 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
lib/ldb-samba/ldif_handlers.c
lib/ldb-samba/ldif_handlers.h

index ea62bf9ff43acab75de4edeae31566b5900b5d6a..3b84084047d57255e4f95a1832f66d25d07dc83d 100644 (file)
@@ -906,6 +906,69 @@ static int ldif_write_replUpToDateVector(struct ldb_context *ldb, void *mem_ctx,
                              true);
 }
 
+static int ldif_write_dn_binary_NDR(struct ldb_context *ldb, void *mem_ctx,
+                                   const struct ldb_val *in, struct ldb_val *out,
+                                   size_t struct_size,
+                                   ndr_pull_flags_fn_t pull_fn,
+                                   ndr_print_fn_t print_fn,
+                                   bool mask_errors)
+{
+       uint8_t *p = NULL;
+       enum ndr_err_code err;
+       struct dsdb_dn *dsdb_dn = NULL;
+       char *dn_str = NULL;
+       char *str = NULL;
+
+       if (!(ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY)) {
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       dsdb_dn = dsdb_dn_parse(mem_ctx, ldb, in, DSDB_SYNTAX_BINARY_DN);
+       if (dsdb_dn == NULL) {
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       p = talloc_size(dsdb_dn, struct_size);
+       if (p == NULL) {
+               TALLOC_FREE(dsdb_dn);
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       err = ndr_pull_struct_blob(&dsdb_dn->extra_part, p, p, pull_fn);
+       if (err != NDR_ERR_SUCCESS) {
+               /* fail in not in mask_error mode */
+               if (!mask_errors) {
+                       return -1;
+               }
+               TALLOC_FREE(dsdb_dn);
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       dn_str = ldb_dn_get_extended_linearized(dsdb_dn, dsdb_dn->dn, 1);
+       if (dn_str == NULL) {
+               TALLOC_FREE(dsdb_dn);
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       str = ndr_print_struct_string(mem_ctx, print_fn, dn_str, p);
+       TALLOC_FREE(dsdb_dn);
+       if (str == NULL) {
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       *out = data_blob_string_const(str);
+       return 0;
+}
+
+static int ldif_write_msDS_RevealedUsers(struct ldb_context *ldb, void *mem_ctx,
+                                        const struct ldb_val *in, struct ldb_val *out)
+{
+       return ldif_write_dn_binary_NDR(ldb, mem_ctx, in, out,
+                             sizeof(struct replPropertyMetaData1),
+                             (ndr_pull_flags_fn_t)ndr_pull_replPropertyMetaData1,
+                             (ndr_print_fn_t)ndr_print_replPropertyMetaData1,
+                             true);
+}
 
 /*
   convert a NDR formatted blob to a ldif formatted dnsRecord
@@ -1336,6 +1399,13 @@ static const struct ldb_schema_syntax samba_syntaxes[] = {
                .canonicalise_fn  = ldb_handler_copy,
                .comparison_fn    = ldb_comparison_binary,
                .operator_fn      = samba_syntax_operator_fn
+       },{
+               .name             = LDB_SYNTAX_SAMBA_REVEALEDUSERS,
+               .ldif_read_fn     = ldb_handler_copy,
+               .ldif_write_fn    = ldif_write_msDS_RevealedUsers,
+               .canonicalise_fn  = dsdb_dn_binary_canonicalise,
+               .comparison_fn    = dsdb_dn_binary_comparison,
+               .operator_fn      = samba_syntax_operator_fn
        },{
                .name             = LDB_SYNTAX_SAMBA_TRUSTAUTHINOUTBLOB,
                .ldif_read_fn     = ldb_handler_copy,
@@ -1477,6 +1547,7 @@ static const struct {
        { "repsTo",                     LDB_SYNTAX_SAMBA_REPSFROMTO },
        { "replPropertyMetaData",       LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA },
        { "replUpToDateVector",         LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR },
+       { "msDS-RevealedUsers",         LDB_SYNTAX_SAMBA_REVEALEDUSERS },
        { "trustAuthIncoming",          LDB_SYNTAX_SAMBA_TRUSTAUTHINOUTBLOB },
        { "trustAuthOutgoing",          LDB_SYNTAX_SAMBA_TRUSTAUTHINOUTBLOB },
        { "msDS-TrustForestTrustInfo",  LDB_SYNTAX_SAMBA_FORESTTRUSTINFO },
index 4e12293448748fbbe76e5bb291465757991875b9..5ba6f12709b3b518c2d1d88869f6dd378104416e 100644 (file)
@@ -11,6 +11,7 @@
 #define LDB_SYNTAX_SAMBA_REPSFROMTO            "LDB_SYNTAX_SAMBA_REPSFROMTO"
 #define LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA   "LDB_SYNTAX_SAMBA_REPLPROPERTYMETADATA"
 #define LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR     "LDB_SYNTAX_SAMBA_REPLUPTODATEVECTOR"
+#define LDB_SYNTAX_SAMBA_REVEALEDUSERS          "LDB_SYNTAX_SAMBA_REVEALEDUSERS"
 #define LDB_SYNTAX_SAMBA_RANGE64               "LDB_SYNTAX_SAMBA_RANGE64"
 #define LDB_SYNTAX_SAMBA_DNSRECORD             "LDB_SYNTAX_SAMBA_DNSRECORD"
 #define LDB_SYNTAX_SAMBA_DNSPROPERTY           "LDB_SYNTAX_SAMBA_DNSPROPERTY"