ldb-samba: let LDB_FLG_SHOW_BINARY show a hexdump for OCTET string values
authorStefan Metzmacher <metze@samba.org>
Thu, 19 Jan 2017 03:30:55 +0000 (04:30 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 29 Oct 2019 13:33:03 +0000 (14:33 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/ldb-samba/ldif_handlers.c

index e74a7182ecf0e55c90dc1e5427392bedb699e29c..e8759e82ab845e1f3f7aa0622d30fb4d890621b6 100644 (file)
 #include "param/param.h"
 #include "../lib/util/asn1.h"
 
+struct ldif_write_HEXDUMP_state {
+       bool error;
+       char *value;
+};
+
+static void ldif_write_HEXDUMP_cb(const char *buf, void *private_data)
+{
+       struct ldif_write_HEXDUMP_state *state =
+               (struct ldif_write_HEXDUMP_state *)private_data;
+       char *v = NULL;
+
+       if (state->error) {
+               return;
+       }
+
+       v = talloc_strdup_append_buffer(state->value, buf);
+       if (v == NULL) {
+               state->error = true;
+               TALLOC_FREE(state->value);
+               return;
+       }
+       state->value = v;
+}
+
+static int ldif_write_HEXDUMP(struct ldb_context *ldb, void *mem_ctx,
+                             const struct ldb_val *in, struct ldb_val *out)
+{
+       struct ldif_write_HEXDUMP_state state = {
+               .error = false,
+       };
+
+       if (!(ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY)) {
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+       if (in->length == 0) {
+               return ldb_handler_copy(ldb, mem_ctx, in, out);
+       }
+
+       state.value = talloc_asprintf(mem_ctx, "HEXDUMP length[%zu]\n", in->length);
+       if (state.value == NULL) {
+               ldb_oom(ldb);
+               return -1;
+       }
+
+       dump_data_cb(in->data, in->length,
+                    true, /* omit_zero_bytes */
+                    ldif_write_HEXDUMP_cb,
+                    &state);
+
+       if (state.error) {
+               ldb_oom(ldb);
+               return -1;
+       }
+
+       *out = data_blob_string_const(state.value);
+       return 0;
+}
+
 /*
   use ndr_print_* to convert a NDR formatted blob to a ldif formatted blob
 
@@ -1594,7 +1652,7 @@ static const struct ldb_schema_syntax samba_syntaxes[] = {
        },{
                .name             = LDB_SYNTAX_SAMBA_OCTET_STRING,
                .ldif_read_fn     = ldb_handler_copy,
-               .ldif_write_fn    = ldb_handler_copy,
+               .ldif_write_fn    = ldif_write_HEXDUMP,
                .canonicalise_fn  = ldb_handler_copy,
                .comparison_fn    = samba_ldb_comparison_binary,
                .operator_fn      = samba_syntax_binary_operator_fn