struct passwd *Get_Pwnam(char *user,BOOL allow_change) { fstring user2; int last_char; int usernamelevel = lp_usernamelevel(); struct passwd *ret; if (!user || !(*user)) return(NULL); StrnCpy(user2,user,sizeof(user2)-1); if (!allow_change) { user = &user2[0]; } ret = _Get_Pwnam(user); if (ret) return(ret); strlower(user); ret = _Get_Pwnam(user); if (ret) return(ret); strupper(user); ret = _Get_Pwnam(user); if (ret) return(ret); /* Try with first letter capitalised. */ if (strlen(user) > 1) strlower(user+1); ret = _Get_Pwnam(user); if (ret) return(ret); /* try with last letter capitalised */ strlower(user); last_char = strlen(user)-1; user[last_char] = toupper(user[last_char]); ret = _Get_Pwnam(user); if (ret) return(ret); /* Try all combinations up to usernamelevel. */ strlower(user); ret = uname_string_combinations(user, _Get_Pwnam, usernamelevel); if (ret) return(ret); if (allow_change) fstrcpy(user,user2); return(NULL); }
static struct passwd *Get_Pwnam_internals(TALLOC_CTX *mem_ctx, const char *user, char *user2) { struct passwd *ret = NULL; if (!user2 || !(*user2)) return(NULL); if (!user || !(*user)) return(NULL); /* Try in all lower case first as this is the most common case on UNIX systems */ strlower_m(user2); DEBUG(5,("Trying _Get_Pwnam(), username as lowercase is %s\n",user2)); ret = getpwnam_alloc_cached(mem_ctx, user2); if(ret) goto done; /* Try as given, if username wasn't originally lowercase */ if(strcmp(user, user2) != 0) { DEBUG(5,("Trying _Get_Pwnam(), username as given is %s\n", user)); ret = getpwnam_alloc_cached(mem_ctx, user); if(ret) goto done; } /* Try as uppercase, if username wasn't originally uppercase */ strupper_m(user2); if(strcmp(user, user2) != 0) { DEBUG(5,("Trying _Get_Pwnam(), username as uppercase is %s\n", user2)); ret = getpwnam_alloc_cached(mem_ctx, user2); if(ret) goto done; } /* Try all combinations up to usernamelevel */ strlower_m(user2); DEBUG(5,("Checking combinations of %d uppercase letters in %s\n", lp_usernamelevel(), user2)); ret = uname_string_combinations(user2, mem_ctx, getpwnam_alloc_cached, lp_usernamelevel()); done: DEBUG(5,("Get_Pwnam_internals %s find user [%s]!\n",ret ? "did":"didn't", user)); return ret; }
/**************************************************************************** a wrapper for getpwnam() that tries with all lower and all upper case if the initial name fails. Also tried with first letter capitalised ****************************************************************************/ struct passwd * Get_Pwnam (const char *a_user) { fstring user; int last_char; int usernamelevel = lp_usernamelevel (); struct passwd *ret; if (!a_user || !(*a_user)) return (NULL); StrnCpy (user, a_user, sizeof (user) - 1); ret = _Get_Pwnam (user); if (ret) return (ret); strlower (user); ret = _Get_Pwnam (user); if (ret) return (ret); strupper (user); ret = _Get_Pwnam (user); if (ret) return (ret); /* try with first letter capitalised */ if (strlen (user) > 1) strlower (user + 1); ret = _Get_Pwnam (user); if (ret) return (ret); /* try with last letter capitalised */ strlower (user); last_char = strlen (user) - 1; user[last_char] = toupper (user[last_char]); ret = _Get_Pwnam (user); if (ret) return (ret); /* try all combinations up to usernamelevel */ strlower (user); ret = uname_string_combinations (user, _Get_Pwnam, usernamelevel); if (ret) return (ret); return (NULL); }