handling upn name
authorBo Yang <boyang@samba.org>
Sat, 18 Jul 2009 05:15:36 +0000 (13:15 +0800)
committerKarolin Seeger <kseeger@samba.org>
Mon, 27 Jul 2009 10:05:21 +0000 (12:05 +0200)
lookupname failed, cannot find domain when attempt
to change password.

This addresses bug #6560.

Signed-off-by: Bo Yang <boyang@samba.org>
source/nsswitch/pam_winbind.c
source/winbindd/winbindd_sid.c
source/winbindd/winbindd_util.c

index ad063c308d41e2153c035b9fa74f87a801d26bf2..a816572c3202389898e7566e998779700b3a533b 100644 (file)
@@ -1910,6 +1910,9 @@ static char* winbind_upn_to_username(struct pwb_context *ctx,
        char *account_name;
        int account_name_len;
        char sep;
+       char *p;
+       char *name;
+       char *domain;
 
        /* This cannot work when the winbind separator = @ */
 
@@ -1918,14 +1921,23 @@ static char* winbind_upn_to_username(struct pwb_context *ctx,
                return NULL;
        }
 
+       name = strdup(upn);
+       if (!name) {
+               return NULL;
+       }
+       if ((p = strchr(name, '@')) != NULL) {
+               *p = 0;
+               domain = p + 1;
+       }
+
        /* Convert the UPN to a SID */
 
        ZERO_STRUCT(req);
        ZERO_STRUCT(resp);
 
-       strncpy(req.data.name.dom_name, "",
+       strncpy(req.data.name.dom_name, domain,
                sizeof(req.data.name.dom_name) - 1);
-       strncpy(req.data.name.name, upn,
+       strncpy(req.data.name.name, name,
                sizeof(req.data.name.name) - 1);
        retval = pam_winbind_request_log(ctx, WINBINDD_LOOKUPNAME,
                                         &req, &resp, upn);
@@ -1947,6 +1959,7 @@ static char* winbind_upn_to_username(struct pwb_context *ctx,
        account_name_len = asprintf(&account_name, "%s\\%s",
                                    resp.data.name.dom_name,
                                    resp.data.name.name);
+       SAFE_FREE(name);
 
        return account_name;
 }
index 0e8e6ca00bf9ffa50df770543fc205928a6f9827..0471a2c52f8f3823dfe4b901de66041ef0125d81 100644 (file)
@@ -93,6 +93,10 @@ 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) {
+               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;
index 624d68e04bf1f639ead7f6e8cc91ba2e23b579bb..8046d36ace13d90a67225abd6aded1c0c0454f17 100644 (file)
@@ -1102,7 +1102,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;
                }