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; }
