[PATCH] s3: To correctly handle upn

Bo Yang boyang at samba.org
Wed Jul 22 20:23:21 MDT 2009


Signed-off-by: Bo Yang <boyang at samba.org>
---
 nsswitch/pam_winbind.c           |   13 ++++++++++++-
 source3/winbindd/winbindd_sid.c  |    5 +++++
 source3/winbindd/winbindd_util.c |    3 ++-
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/nsswitch/pam_winbind.c b/nsswitch/pam_winbind.c
index e90f1b7..4a44248 100644
--- a/nsswitch/pam_winbind.c
+++ b/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/source3/winbindd/winbindd_sid.c b/source3/winbindd/winbindd_sid.c
index 641b18e..b0f2c72 100644
--- a/source3/winbindd/winbindd_sid.c
+++ b/source3/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/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c
index a2c1c85..3070c62 100644
--- a/source3/winbindd/winbindd_util.c
+++ b/source3/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;
 		}
-- 
1.5.3


--------------050903080803070300010301--


More information about the samba-technical mailing list