summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Yang <boyang@samba.org>2009-07-18 14:23:24 +0800
committerKarolin Seeger <kseeger@samba.org>2009-07-27 15:55:11 +0200
commitce5f39750eb15dc9aaa2d9def66e449ae146c0c1 (patch)
treebae839eed7bbed35f3dcae4e18bae76453370643
parent3328bbb927231f527c55236f1bee2b5d98b034f7 (diff)
downloadsamba-ce5f39750eb15dc9aaa2d9def66e449ae146c0c1.tar.gz
handling upn
lookupname failed, cannot find domain when attempt to change password. This addresses bug #6560. Signed-off-by: Bo Yang <boyang@samba.org> (cherry picked from commit 830c4da460bcad919421acf9d537cf577b231de7)
-rw-r--r--source/nsswitch/pam_winbind.c13
-rw-r--r--source/winbindd/winbindd_sid.c5
-rw-r--r--source/winbindd/winbindd_util.c3
3 files changed, 19 insertions, 2 deletions
diff --git a/source/nsswitch/pam_winbind.c b/source/nsswitch/pam_winbind.c
index 1211ffd44de..73be3e03f90 100644
--- a/source/nsswitch/pam_winbind.c
+++ b/source/nsswitch/pam_winbind.c
@@ -2284,6 +2284,7 @@ static char* winbind_upn_to_username(struct pwb_context *ctx,
enum wbcSidType type;
char *domain;
char *name;
+ char *p;
/* This cannot work when the winbind separator = @ */
@@ -2292,9 +2293,19 @@ static char* winbind_upn_to_username(struct pwb_context *ctx,
return NULL;
}
+ name = talloc_strdup(ctx, upn);
+ if (!name) {
+ return NULL;
+ }
+
+ if ((p = strchr(name, '@')) != NULL) {
+ *p = 0;
+ domain = p + 1;
+ }
+
/* Convert the UPN to a SID */
- wbc_status = wbcLookupName("", upn, &sid, &type);
+ wbc_status = wbcLookupName(domain, name, &sid, &type);
if (!WBC_ERROR_IS_OK(wbc_status)) {
return NULL;
}
diff --git a/source/winbindd/winbindd_sid.c b/source/winbindd/winbindd_sid.c
index 641b18ebbd8..b0f2c72ae1e 100644
--- a/source/winbindd/winbindd_sid.c
+++ b/source/winbindd/winbindd_sid.c
@@ -93,6 +93,11 @@ void winbindd_lookupname(struct winbindd_cli_state *state)
*p = 0;
name_domain = state->request.data.name.name;
name_user = p+1;
+ } else if ((p = strchr(state->request.data.name.name, '@')) != NULL) {
+ /* upn */
+ name_domain = p + 1;
+ *p = 0;
+ name_user = state->request.data.name.name;
} else {
name_domain = state->request.data.name.dom_name;
name_user = state->request.data.name.name;
diff --git a/source/winbindd/winbindd_util.c b/source/winbindd/winbindd_util.c
index 2d87015fec0..efa85fa81e0 100644
--- a/source/winbindd/winbindd_util.c
+++ b/source/winbindd/winbindd_util.c
@@ -1144,7 +1144,8 @@ bool parse_domain_user(const char *domuser, fstring domain, fstring user)
if ( assume_domain(lp_workgroup())) {
fstrcpy(domain, lp_workgroup());
} else if ((p = strchr(domuser, '@')) != NULL) {
- fstrcpy(domain, "");
+ fstrcpy(domain, p + 1);
+ user[PTR_DIFF(p, domuser)] = 0;
} else {
return False;
}