s4:dsdb - Store SID as string in FDS.
authorEndi S. Dewata <edewata@redhat.com>
Sat, 24 Oct 2009 03:59:48 +0000 (22:59 -0500)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 2 Nov 2009 05:36:54 +0000 (16:36 +1100)
source4/dsdb/samdb/ldb_modules/extended_dn_out.c
source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
source4/lib/ldb-samba/ldif_handlers.c
source4/setup/schema-map-fedora-ds-1.0

index 6fbd0559db7f67236c45c8fc409fea14f0b8fd7e..cbbf8c60781129524082a615c511e589c88fabc1 100644 (file)
@@ -35,7 +35,9 @@
 #include "ldb/include/ldb.h"
 #include "ldb/include/ldb_errors.h"
 #include "ldb/include/ldb_module.h"
+#include "libcli/security/dom_sid.h"
 #include "librpc/gen_ndr/ndr_misc.h"
+#include "librpc/gen_ndr/ndr_security.h"
 #include "librpc/ndr/libndr.h"
 #include "dsdb/samdb/samdb.h"
 
@@ -278,9 +280,27 @@ static int handle_dereference_fds(struct ldb_dn *dn,
        
        /* Look for the objectSID */
 
-       sidBlob = ldb_msg_find_ldb_val(&fake_msg, "objectSID");
+       sidBlob = ldb_msg_find_ldb_val(&fake_msg, "sambaSID");
        if (sidBlob) {
-               ldb_dn_set_extended_component(dn, "SID", sidBlob);
+               enum ndr_err_code ndr_err;
+
+               struct ldb_val sid_blob;
+               struct dom_sid *sid;
+
+               sid = dom_sid_parse_length(NULL, sidBlob);
+
+               if (sid == NULL) {
+                       return LDB_ERR_INVALID_DN_SYNTAX;
+               }
+
+               ndr_err = ndr_push_struct_blob(&sid_blob, NULL, NULL, sid,
+                                               (ndr_push_flags_fn_t)ndr_push_dom_sid);
+               talloc_free(sid);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       return LDB_ERR_INVALID_DN_SYNTAX;
+               }
+
+               ldb_dn_set_extended_component(dn, "SID", &sid_blob);
        }
        return LDB_SUCCESS;
 }
index d923e55484a11ca0080e0b317f812b4c81505ab1..36104e7e3c175fa5dcf9ef5d32f2ecb9cda1d075 100644 (file)
@@ -33,6 +33,7 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "librpc/ndr/libndr.h"
 #include "dsdb/samdb/samdb.h"
+#include "../../../lib/ldb/include/ldb_handlers.h"
 
 struct entryuuid_private {
        struct ldb_context *ldb;
@@ -122,6 +123,25 @@ static struct ldb_val sid_always_binary(struct ldb_module *module, TALLOC_CTX *c
        return out;
 }
 
+/* Ensure we always convert sids into string, so the backend doesn't have to know about both forms */
+static struct ldb_val sid_always_string(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
+{
+       struct ldb_context *ldb = ldb_module_get_ctx(module);
+       struct ldb_val out = data_blob(NULL, 0);
+
+       if (ldif_comparision_objectSid_isString(val)) {
+               if (ldb_handler_copy(ldb, ctx, val, &out) != LDB_SUCCESS) {
+                       return data_blob(NULL, 0);
+               }
+
+       } else {
+               if (ldif_write_objectSid(ldb, ctx, val, &out) != LDB_SUCCESS) {
+                       return data_blob(NULL, 0);
+               }
+       }
+       return out;
+}
+
 /* Ensure we always convert objectCategory into a DN */
 static struct ldb_val objectCategory_always_dn(struct ldb_module *module, TALLOC_CTX *ctx, const struct ldb_val *val)
 {
@@ -470,9 +490,9 @@ static const struct ldb_map_attribute nsuniqueid_attributes[] =
                .type = LDB_MAP_CONVERT,
                .u = {
                        .convert = {
-                               .remote_name = "objectSid", 
-                               .convert_local = sid_always_binary,
-                               .convert_remote = val_copy,
+                               .remote_name = "sambaSID", 
+                               .convert_local = sid_always_string,
+                               .convert_remote = sid_always_binary,
                        }
                }
        },
index 59f8622a376a1d452a45dac0cecab1feb6f80b2e..9467bef87351217ab97d6f41d7551efd17c6c34f 100644 (file)
@@ -92,7 +92,7 @@ static int ldif_read_objectSid(struct ldb_context *ldb, void *mem_ctx,
 /*
   convert a NDR formatted blob to a ldif formatted objectSid
 */
-static int ldif_write_objectSid(struct ldb_context *ldb, void *mem_ctx,
+int ldif_write_objectSid(struct ldb_context *ldb, void *mem_ctx,
                                const struct ldb_val *in, struct ldb_val *out)
 {
        struct dom_sid *sid;
@@ -116,7 +116,7 @@ static int ldif_write_objectSid(struct ldb_context *ldb, void *mem_ctx,
        return 0;
 }
 
-static bool ldif_comparision_objectSid_isString(const struct ldb_val *v)
+bool ldif_comparision_objectSid_isString(const struct ldb_val *v)
 {
        if (v->length < 3) {
                return false;
index 9298f382cbec5e013061f0be35a5b0b0f3ea2599..7bb3da3300fd889526f4499e2fa102c757dc6e26 100644 (file)
@@ -75,6 +75,8 @@ nextRid
 nextRid:sambaNextRid
 privilegeDisplayName
 privilegeDisplayName:sambaPrivName
+objectSid
+objectSid:sambaSID
 
 #Resolve conflicting attributes
 1.2.840.113556.1.4.484:fRSDirectoryFilter-oid