summaryrefslogtreecommitdiff
path: root/source3/passdb
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2008-08-17 19:54:41 -0400
committerSimo Sorce <idra@samba.org>2008-08-17 19:54:41 -0400
commit5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4 (patch)
treefea9e40e62f5ce034b3f346dad1d9ed2c9cdd743 /source3/passdb
parentee6c02f7c8bc92190b9f5474057f5885f29c2f8a (diff)
downloadsamba-5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4.tar.gz
samba-5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4.tar.bz2
samba-5e7655fa27f7b2c9c54edfc25f86974dbdb23ea4.zip
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.c171
1 files changed, 93 insertions, 78 deletions
diff --git a/source3/passdb/lookup_sid.c b/source3/passdb/lookup_sid.c
index a7175b9647..57152c34b5 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,