diff options
author | Simo Sorce <idra@samba.org> | 2008-08-17 19:54:41 -0400 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2008-08-17 19:54:41 -0400 |
commit | 5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4 (patch) | |
tree | fea9e40e62f5ce034b3f346dad1d9ed2c9cdd743 /source3/passdb | |
parent | ee6c02f7c8bc92190b9f5474057f5885f29c2f8a (diff) | |
download | samba-5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4.tar.gz |
Split lookup_name() and create a new functiong called
lookup_domain_name(). This new function accept separated
strings for domain and name.
(This used to be commit 8594edf666c29fd4ddf1780da842683dd81483b6)
Diffstat (limited to 'source3/passdb')
-rw-r--r-- | source3/passdb/lookup_sid.c | 171 |
1 files changed, 93 insertions, 78 deletions
diff --git a/source3/passdb/lookup_sid.c b/source3/passdb/lookup_sid.c index a7175b9647f..57152c34b54 100644 --- a/source3/passdb/lookup_sid.c +++ b/source3/passdb/lookup_sid.c @@ -29,44 +29,72 @@ to do guesswork. *****************************************************************/ +#define LN_CHECK_TALLOC(var, memctx) do { \ + if (var == NULL) { \ + DEBUG(0, ("talloc failed\n")); \ + TALLOC_FREE(memctx); \ + return false; \ + } \ +} while(0) + bool lookup_name(TALLOC_CTX *mem_ctx, const char *full_name, int flags, const char **ret_domain, const char **ret_name, DOM_SID *ret_sid, enum lsa_SidType *ret_type) { + char *domain, *name; + bool res; char *p; - const char *tmp; - const char *domain = NULL; - const char *name = NULL; - uint32 rid; - DOM_SID sid; - enum lsa_SidType type; - TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx); - - if (tmp_ctx == NULL) { - DEBUG(0, ("talloc_new failed\n")); - return false; - } p = strchr_m(full_name, '\\'); if (p != NULL) { - domain = talloc_strndup(tmp_ctx, full_name, + domain = talloc_strndup(mem_ctx, full_name, PTR_DIFF(p, full_name)); - name = talloc_strdup(tmp_ctx, p+1); + name = talloc_strdup(mem_ctx, p+1); } else { - domain = talloc_strdup(tmp_ctx, ""); - name = talloc_strdup(tmp_ctx, full_name); + domain = NULL; + name = talloc_strdup(mem_ctx, full_name); } - if ((domain == NULL) || (name == NULL)) { + if (((p != NULL) && (domain == NULL)) || (name == NULL)) { DEBUG(0, ("talloc failed\n")); - TALLOC_FREE(tmp_ctx); return false; } - DEBUG(10,("lookup_name: %s => %s (domain), %s (name)\n", - full_name, domain, name)); + DEBUG(10,("lookup_domain_name: %s => %s (domain), %s (name)\n", + full_name, domain, name)); + + res = lookup_domain_name(mem_ctx, domain, name, flags, + ret_domain, ret_name, ret_sid, ret_type); + + talloc_free(domain); + talloc_free(name); + + return res; +} + +bool lookup_domain_name(TALLOC_CTX *mem_ctx, + const char *domain, const char *name, int flags, + const char **ret_domain, const char **ret_name, + DOM_SID *ret_sid, enum lsa_SidType *ret_type) +{ + const char *tmp; + const char *domain_new = NULL; + uint32 rid; + DOM_SID sid; + enum lsa_SidType type; + TALLOC_CTX *tmp_ctx; + + tmp_ctx = talloc_new(mem_ctx); + if (tmp_ctx == NULL) { + DEBUG(0, ("talloc_new failed\n")); + return false; + } + + if (!domain) domain = talloc_strdup(tmp_ctx, ""); + LN_CHECK_TALLOC(domain, tmp_ctx); + DEBUG(10, ("lookup_name: flags = 0x0%x\n", flags)); if ((flags & LOOKUP_NAME_DOMAIN) && @@ -98,7 +126,7 @@ bool lookup_name(TALLOC_CTX *mem_ctx, } /* Try the explicit winbind lookup first, don't let it guess the - * domain yet at this point yet. This comes later. */ + * domain at this point yet. This comes later. */ if ((domain[0] != '\0') && (flags & ~(LOOKUP_NAME_DOMAIN|LOOKUP_NAME_ISOLATED)) && @@ -137,9 +165,10 @@ bool lookup_name(TALLOC_CTX *mem_ctx, /* 1. well-known names */ if ((flags & LOOKUP_NAME_WKN) && - lookup_wellknown_name(tmp_ctx, name, &sid, &domain)) + lookup_wellknown_name(tmp_ctx, name, &sid, &domain_new)) { type = SID_NAME_WKN_GRP; + LN_CHECK_TALLOC(domain_new, tmp_ctx); goto ok; } @@ -199,12 +228,13 @@ bool lookup_name(TALLOC_CTX *mem_ctx, goto ok; } - /* 6. Builtin aliases */ + /* 6. Builtin aliases */ if ((flags & LOOKUP_NAME_BUILTIN) && lookup_builtin_name(name, &rid)) { - domain = talloc_strdup(tmp_ctx, builtin_domain_name()); + domain_new = talloc_strdup(tmp_ctx, builtin_domain_name()); + LN_CHECK_TALLOC(domain_new, tmp_ctx); sid_copy(&sid, &global_sid_Builtin); sid_append_rid(&sid, rid); type = SID_NAME_ALIAS; @@ -219,7 +249,8 @@ bool lookup_name(TALLOC_CTX *mem_ctx, if ((flags & LOOKUP_NAME_DOMAIN) && lookup_global_sam_name(name, flags, &rid, &type)) { - domain = talloc_strdup(tmp_ctx, get_global_sam_name()); + domain_new = talloc_strdup(tmp_ctx, get_global_sam_name()); + LN_CHECK_TALLOC(domain_new, tmp_ctx); sid_copy(&sid, get_global_sam_sid()); sid_append_rid(&sid, rid); goto ok; @@ -237,7 +268,8 @@ bool lookup_name(TALLOC_CTX *mem_ctx, if (!IS_DC && (winbind_lookup_name(lp_workgroup(), name, &sid, &type))) { - domain = talloc_strdup(tmp_ctx, lp_workgroup()); + domain_new = talloc_strdup(tmp_ctx, lp_workgroup()); + LN_CHECK_TALLOC(domain_new, tmp_ctx); goto ok; } @@ -250,7 +282,7 @@ bool lookup_name(TALLOC_CTX *mem_ctx, DOM_SID dom_sid; uint32 tmp_rid; enum lsa_SidType domain_type; - + if (type == SID_NAME_DOMAIN) { /* Swap name and type */ tmp = name; name = domain; domain = tmp; @@ -272,6 +304,7 @@ bool lookup_name(TALLOC_CTX *mem_ctx, TALLOC_FREE(tmp_ctx); return false; } + LN_CHECK_TALLOC(domain_new, tmp_ctx); goto ok; } @@ -281,13 +314,15 @@ bool lookup_name(TALLOC_CTX *mem_ctx, Unmapped users and unmapped groups */ if (!(flags & LOOKUP_NAME_EXPLICIT) && lookup_unix_user_name(name, &sid)) { - domain = talloc_strdup(tmp_ctx, unix_users_domain_name()); + domain_new = talloc_strdup(tmp_ctx, unix_users_domain_name()); + LN_CHECK_TALLOC(domain_new, tmp_ctx); type = SID_NAME_USER; goto ok; } if (!(flags & LOOKUP_NAME_EXPLICIT) && lookup_unix_group_name(name, &sid)) { - domain = talloc_strdup(tmp_ctx, unix_groups_domain_name()); + domain_new = talloc_strdup(tmp_ctx, unix_groups_domain_name()); + LN_CHECK_TALLOC(domain_new, tmp_ctx); type = SID_NAME_DOM_GRP; goto ok; } @@ -300,12 +335,6 @@ bool lookup_name(TALLOC_CTX *mem_ctx, return false; ok: - if ((domain == NULL) || (name == NULL)) { - DEBUG(0, ("talloc failed\n")); - TALLOC_FREE(tmp_ctx); - return false; - } - /* * Hand over the results to the talloc context we've been given. */ @@ -319,11 +348,14 @@ bool lookup_name(TALLOC_CTX *mem_ctx, if (ret_domain != NULL) { char *tmp_dom; - if (!(tmp_dom = talloc_strdup(mem_ctx, domain))) { - DEBUG(0, ("talloc failed\n")); - TALLOC_FREE(tmp_ctx); - return false; + + if (domain_new) { + tmp_dom = talloc_steal(mem_ctx, (char *)domain_new); + } else { + tmp_dom = talloc_strdup(mem_ctx, domain); } + LN_CHECK_TALLOC(tmp_dom, tmp_ctx); + strupper_m(tmp_dom); *ret_domain = tmp_dom; } @@ -351,59 +383,42 @@ bool lookup_name_smbconf(TALLOC_CTX *mem_ctx, const char **ret_domain, const char **ret_name, DOM_SID *ret_sid, enum lsa_SidType *ret_type) { - char *qualified_name; - const char *p; - - /* NB. No winbindd_separator here as lookup_name needs \\' */ - if ((p = strchr_m(full_name, *lp_winbind_separator())) != NULL) { - - /* The name is already qualified with a domain. */ - - if (*lp_winbind_separator() != '\\') { - char *tmp; + char *p; - /* lookup_name() needs '\\' as a separator */ + p = strchr_m(full_name, *lp_winbind_separator()); + if (p != NULL) { + char *name; + bool res; - tmp = talloc_strdup(mem_ctx, full_name); - if (!tmp) { - return false; - } - tmp[p - full_name] = '\\'; - full_name = tmp; + name = talloc_strdup(mem_ctx, full_name); + if (!name) { + DEBUG(0, ("Out of memory!\n")); + return false; } + name[PTR_DIFF(p, full_name)] = '\\'; - return lookup_name(mem_ctx, full_name, flags, - ret_domain, ret_name, - ret_sid, ret_type); + res = lookup_name(mem_ctx, name, flags, + ret_domain, ret_name, + ret_sid, ret_type); + talloc_free(name); + return res; } /* Try with our own SAM name. */ - qualified_name = talloc_asprintf(mem_ctx, "%s\\%s", - get_global_sam_name(), - full_name ); - if (!qualified_name) { - return false; - } - - if (lookup_name(mem_ctx, qualified_name, flags, - ret_domain, ret_name, - ret_sid, ret_type)) { + if (lookup_domain_name(mem_ctx, + get_global_sam_name(), full_name, flags, + ret_domain, ret_name, ret_sid, ret_type)) { return true; } - + /* Finally try with "Unix Users" or "Unix Group" */ - qualified_name = talloc_asprintf(mem_ctx, "%s\\%s", + return lookup_domain_name(mem_ctx, flags & LOOKUP_NAME_GROUP ? unix_groups_domain_name() : unix_users_domain_name(), - full_name ); - if (!qualified_name) { - return false; - } + full_name, flags, + ret_domain, ret_name, ret_sid, ret_type); - return lookup_name(mem_ctx, qualified_name, flags, - ret_domain, ret_name, - ret_sid, ret_type); } static bool wb_lookup_rids(TALLOC_CTX *mem_ctx, |