Author: mkhl
Date: 2006-08-05 17:16:10 +0000 (Sat, 05 Aug 2006)
New Revision: 17423

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17423

Log:
Merge from mainline, r17422
Modified:
   branches/SOC/mkhl/ldb-map/common/ldb_modules.c
   branches/SOC/mkhl/ldb-map/include/ldb.h
   branches/SOC/mkhl/ldb-map/samba/ldif_handlers.c
   branches/SOC/mkhl/ldb-map/tools/cmdline.c


Changeset:
Modified: branches/SOC/mkhl/ldb-map/common/ldb_modules.c
===================================================================
--- branches/SOC/mkhl/ldb-map/common/ldb_modules.c      2006-08-05 12:50:41 UTC 
(rev 17422)
+++ branches/SOC/mkhl/ldb-map/common/ldb_modules.c      2006-08-05 17:16:10 UTC 
(rev 17423)
@@ -73,19 +73,20 @@
 /* modules are called in inverse order on the stack.
    Lets place them as an admin would think the right order is.
    Modules order is important */
-static char **ldb_modules_list_from_string(struct ldb_context *ldb, const char 
*string)
+static const char **ldb_modules_list_from_string(struct ldb_context *ldb, 
TALLOC_CTX *mem_ctx, const char *string)
 {
        char **modules = NULL;
+       const char **m;
        char *modstr, *p;
        int i;
 
        /* spaces not admitted */
-       modstr = talloc_strdup_no_spaces(ldb, string);
+       modstr = talloc_strdup_no_spaces(mem_ctx, string);
        if ( ! modstr) {
                return NULL;
        }
 
-       modules = talloc_realloc(ldb, modules, char *, 2);
+       modules = talloc_realloc(mem_ctx, modules, char *, 2);
        if ( ! modules ) {
                ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in 
ldb_modules_list_from_string()\n");
                talloc_free(modstr);
@@ -100,7 +101,7 @@
                modules[i] = p;
 
                i++;
-               modules = talloc_realloc(ldb, modules, char *, i + 2);
+               modules = talloc_realloc(mem_ctx, modules, char *, i + 2);
                if ( ! modules ) {
                        ldb_debug(ldb, LDB_DEBUG_FATAL, "Out of Memory in 
ldb_modules_list_from_string()\n");
                        return NULL;
@@ -111,7 +112,9 @@
 
        modules[i + 1] = NULL;
 
-       return modules;
+       m = (const char **)modules;
+
+       return m;
 }
 
 static struct ops_list_entry {
@@ -235,16 +238,21 @@
 
 int ldb_load_modules(struct ldb_context *ldb, const char *options[])
 {
-       char **modules = NULL;
+       const char **modules = NULL;
        struct ldb_module *module;
        int i;
+       TALLOC_CTX *mem_ctx = talloc_new(ldb);
+       if (!mem_ctx) {
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+
        /* find out which modules we are requested to activate */
 
        /* check if we have a custom module list passd as ldb option */
        if (options) {
                for (i = 0; options[i] != NULL; i++) {
                        if (strncmp(options[i], LDB_MODULE_PREFIX, 
LDB_MODULE_PREFIX_LEN) == 0) {
-                               modules = ldb_modules_list_from_string(ldb, 
&options[i][LDB_MODULE_PREFIX_LEN]);
+                               modules = ldb_modules_list_from_string(ldb, 
mem_ctx, &options[i][LDB_MODULE_PREFIX_LEN]);
                        }
                }
        }
@@ -254,34 +262,36 @@
                int ret;
                const char * const attrs[] = { "@LIST" , NULL};
                struct ldb_result *res = NULL;
-               struct ldb_dn *mods;
+               struct ldb_dn *mods_dn;
 
-               mods = ldb_dn_explode(ldb, "@MODULES");
-               if (mods == NULL) {
+               mods_dn = ldb_dn_explode(mem_ctx, "@MODULES");
+               if (mods_dn == NULL) {
+                       talloc_free(mem_ctx);
                        return -1;
                }
 
-               ret = ldb_search(ldb, mods, LDB_SCOPE_BASE, "", attrs, &res);
-               talloc_free(mods);
+               ret = ldb_search(ldb, mods_dn, LDB_SCOPE_BASE, "", attrs, &res);
+               if (res) talloc_steal(mods_dn, res);
                if (ret == LDB_SUCCESS && (res->count == 0 || 
res->msgs[0]->num_elements == 0)) {
                        ldb_debug(ldb, LDB_DEBUG_TRACE, "no modules required by 
the db\n");
                } else {
                        if (ret != LDB_SUCCESS) {
                                ldb_debug(ldb, LDB_DEBUG_FATAL, "ldb error (%s) 
occurred searching for modules, bailing out\n", ldb_errstring(ldb));
+                               talloc_free(mem_ctx);
                                return -1;
                        }
                        if (res->count > 1) {
                                ldb_debug(ldb, LDB_DEBUG_FATAL, "Too many 
records found (%d), bailing out\n", res->count);
-                               talloc_free(res);
+                               talloc_free(mem_ctx);
                                return -1;
                        }
 
-                       modules = ldb_modules_list_from_string(ldb, 
+                       modules = ldb_modules_list_from_string(ldb, mem_ctx,
                                                               (const char 
*)res->msgs[0]->elements[0].values[0].data);
 
                }
 
-               talloc_free(res);
+               talloc_free(mods_dn);
        }
 
        if (modules != NULL) {

Modified: branches/SOC/mkhl/ldb-map/include/ldb.h
===================================================================
--- branches/SOC/mkhl/ldb-map/include/ldb.h     2006-08-05 12:50:41 UTC (rev 
17422)
+++ branches/SOC/mkhl/ldb-map/include/ldb.h     2006-08-05 17:16:10 UTC (rev 
17423)
@@ -423,6 +423,27 @@
 #define LDB_CONTROL_PAGED_RESULTS_OID  "1.2.840.113556.1.4.319"
 
 /**
+   OID for specifying the returned elements of the ntSecurityDescriptor
+
+   \sa <a 
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_sd_flags_oid.asp";>Microsoft
 documentation of this OID</a>
+*/
+#define LDB_CONTROL_SD_FLAGS_OID       "1.2.840.113556.1.4.801"
+
+/**
+   OID for specifying an advanced scope for the search (one partition)
+
+   \sa <a 
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_domain_scope_oid.asp";>Microsoft
 documentation of this OID</a>
+*/
+#define LDB_CONTROL_DOMAIN_SCOPE_OID   "1.2.840.113556.1.4.1339"
+
+/**
+   OID for specifying an advanced scope for a search
+
+   \sa <a 
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_search_options_oid.asp";>Microsoft
 documentation of this OID</a>
+*/
+#define LDB_CONTROL_SEARCH_OPTIONS_OID "1.2.840.113556.1.4.1340"
+
+/**
    OID for notification
 
    \sa <a 
href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ldap/ldap/ldap_server_notification_oid.asp";>Microsoft
 documentation of this OID</a>
@@ -518,6 +539,33 @@
 */
 #define LDB_EXTENDED_FAST_BIND_OID     "1.2.840.113556.1.4.1781"
 
+struct ldb_sd_flags_control {
+       /*
+        * request the owner    0x00000001
+        * request the group    0x00000002
+        * request the DACL     0x00000004
+        * request the SACL     0x00000008
+        */
+       unsigned secinfo_flags;
+};
+
+struct ldb_search_options_control {
+       /*
+        * DOMAIN_SCOPE         0x00000001
+        * this limits the search to one partition,
+        * and no referrals will be returned.
+        * (Note this doesn't limit the entries by there
+        *  objectSid belonging to a domain! Builtin and Foreign Sids
+        *  are still returned)
+        *
+        * PHANTOM_ROOT         0x00000002
+        * this search on the whole tree on a domain controller
+        * over multiple partitions without referrals.
+        * (This is the default behavior on the Global Catalog Port)
+        */
+       unsigned search_options;
+};
+
 struct ldb_paged_control {
        int size;
        int cookie_len;

Modified: branches/SOC/mkhl/ldb-map/samba/ldif_handlers.c
===================================================================
--- branches/SOC/mkhl/ldb-map/samba/ldif_handlers.c     2006-08-05 12:50:41 UTC 
(rev 17422)
+++ branches/SOC/mkhl/ldb-map/samba/ldif_handlers.c     2006-08-05 17:16:10 UTC 
(rev 17423)
@@ -245,11 +245,8 @@
 {
        struct security_descriptor *sd;
        NTSTATUS status;
-       const struct dom_sid *domain_sid = samdb_domain_sid(ldb);
-       if (domain_sid == NULL) {
-               return ldb_handler_copy(ldb, mem_ctx, in, out);
-       }
-       sd = sddl_decode(mem_ctx, (const char *)in->data, domain_sid);
+
+       sd = sddl_decode(mem_ctx, (const char *)in->data, NULL);
        if (sd == NULL) {
                return -1;
        }
@@ -270,12 +267,7 @@
 {
        struct security_descriptor *sd;
        NTSTATUS status;
-       const struct dom_sid *domain_sid = samdb_domain_sid(ldb);
 
-       if (domain_sid == NULL) {
-               return ldb_handler_copy(ldb, mem_ctx, in, out);
-       }
-
        sd = talloc(mem_ctx, struct security_descriptor);
        if (sd == NULL) {
                return -1;
@@ -286,7 +278,7 @@
                talloc_free(sd);
                return -1;
        }
-       out->data = (uint8_t *)sddl_encode(mem_ctx, sd, domain_sid);
+       out->data = (uint8_t *)sddl_encode(mem_ctx, sd, NULL);
        talloc_free(sd);
        if (out->data == NULL) {
                return -1;
@@ -414,6 +406,14 @@
                .comparison_fn   = ldb_comparison_objectGUID
        },
        { 
+               .attr            = "attributeSecurityGUID",
+               .flags           = 0,
+               .ldif_read_fn    = ldif_read_objectGUID,
+               .ldif_write_fn   = ldif_write_objectGUID,
+               .canonicalise_fn = ldb_canonicalise_objectGUID,
+               .comparison_fn   = ldb_comparison_objectGUID
+       },
+       { 
                .attr            = "objectCategory",
                .flags           = 0,
                .ldif_read_fn    = ldb_handler_copy,

Modified: branches/SOC/mkhl/ldb-map/tools/cmdline.c
===================================================================
--- branches/SOC/mkhl/ldb-map/tools/cmdline.c   2006-08-05 12:50:41 UTC (rev 
17422)
+++ branches/SOC/mkhl/ldb-map/tools/cmdline.c   2006-08-05 17:16:10 UTC (rev 
17423)
@@ -381,6 +381,77 @@
                        continue;
                }
 
+               if (strncmp(control_strings[i], "sd_flags:", 9) == 0) {
+                       struct ldb_sd_flags_control *control;
+                       const char *p;
+                       int crit, ret;
+                       unsigned secinfo_flags;
+
+                       p = &(control_strings[i][9]);
+                       ret = sscanf(p, "%d:%u", &crit, &secinfo_flags);
+                       if ((ret != 2) || (crit < 0) || (crit > 1) || 
(secinfo_flags < 0) || (secinfo_flags > 0xF)) {
+                               fprintf(stderr, "invalid sd_flags control 
syntax\n");
+                               fprintf(stderr, " syntax: 
crit(b):secinfo_flags(n)\n");
+                               fprintf(stderr, "   note: b = boolean, n = 
number\n");
+                               return NULL;
+                       }
+
+                       ctrl[i] = talloc(ctrl, struct ldb_control);
+                       ctrl[i]->oid = LDB_CONTROL_SD_FLAGS_OID;
+                       ctrl[i]->critical = crit;
+                       control = talloc(ctrl[i], struct ldb_sd_flags_control);
+                       control->secinfo_flags = secinfo_flags;
+                       ctrl[i]->data = control;
+
+                       continue;
+               }
+
+               if (strncmp(control_strings[i], "search_options:", 15) == 0) {
+                       struct ldb_search_options_control *control;
+                       const char *p;
+                       int crit, ret;
+                       unsigned search_options;
+
+                       p = &(control_strings[i][15]);
+                       ret = sscanf(p, "%d:%u", &crit, &search_options);
+                       if ((ret != 2) || (crit < 0) || (crit > 1) || 
(search_options < 0) || (search_options > 0xF)) {
+                               fprintf(stderr, "invalid search_options control 
syntax\n");
+                               fprintf(stderr, " syntax: 
crit(b):search_options(n)\n");
+                               fprintf(stderr, "   note: b = boolean, n = 
number\n");
+                               return NULL;
+                       }
+
+                       ctrl[i] = talloc(ctrl, struct ldb_control);
+                       ctrl[i]->oid = LDB_CONTROL_SEARCH_OPTIONS_OID;
+                       ctrl[i]->critical = crit;
+                       control = talloc(ctrl[i], struct 
ldb_search_options_control);
+                       control->search_options = search_options;
+                       ctrl[i]->data = control;
+
+                       continue;
+               }
+
+               if (strncmp(control_strings[i], "domain_scope:", 13) == 0) {
+                       const char *p;
+                       int crit, ret;
+
+                       p = &(control_strings[i][13]);
+                       ret = sscanf(p, "%d", &crit);
+                       if ((ret != 1) || (crit < 0) || (crit > 1)) {
+                               fprintf(stderr, "invalid domain_scope control 
syntax\n");
+                               fprintf(stderr, " syntax: crit(b)\n");
+                               fprintf(stderr, "   note: b = boolean\n");
+                               return NULL;
+                       }
+
+                       ctrl[i] = talloc(ctrl, struct ldb_control);
+                       ctrl[i]->oid = LDB_CONTROL_DOMAIN_SCOPE_OID;
+                       ctrl[i]->critical = crit;
+                       ctrl[i]->data = NULL;
+
+                       continue;
+               }
+
                if (strncmp(control_strings[i], "paged_results:", 14) == 0) {
                        struct ldb_paged_control *control;
                        const char *p;
@@ -464,7 +535,7 @@
                }
 
                /* no controls matched, throw an error */
-               fprintf(stderr, "Invalid control name\n");
+               fprintf(stderr, "Invalid control name: '%s'\n", 
control_strings[i]);
                return NULL;
        }
 

Reply via email to