mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
new version of Get_Pwnam()
o check the username in all lowercase
o check the username as transmitted if this would be a different case
o check the username in all upper case if this is a new version
-- jerry
(This used to be commit 059f4fee5d
)
This commit is contained in:
parent
4d56f4f310
commit
ea4a0d509e
@ -169,67 +169,65 @@ static struct passwd *_Get_Pwnam(char *s)
|
|||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
A wrapper for getpwnam() that tries with all lower and all upper case
|
A wrapper for getpwnam(). The following variations are tried...
|
||||||
if the initial name fails. Also tried with first letter capitalised
|
- in all lower case
|
||||||
|
- as transmitted IF a different case
|
||||||
|
- in all upper case IF that is different from the transmitted username
|
||||||
|
- using the lp_usernamelevel() for permutations
|
||||||
Note that this can change user!
|
Note that this can change user!
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
struct passwd *Get_Pwnam(char *user,BOOL allow_change)
|
struct passwd *Get_Pwnam(char *user,BOOL allow_change)
|
||||||
{
|
{
|
||||||
fstring user2;
|
fstring user2, orig_username;
|
||||||
int last_char;
|
int usernamelevel = lp_usernamelevel();
|
||||||
int usernamelevel = lp_usernamelevel();
|
struct passwd *ret;
|
||||||
|
|
||||||
struct passwd *ret;
|
if (!user || !(*user))
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
if (!user || !(*user))
|
/* make a few copies to work with */
|
||||||
return(NULL);
|
fstrcpy(orig_username, user);
|
||||||
|
if (!allow_change)
|
||||||
|
{
|
||||||
|
/* allow_change was False, so make a copy and temporarily
|
||||||
|
assign the char* user to the temp copy */
|
||||||
|
fstrcpy(user2,user);
|
||||||
|
user = &user2[0];
|
||||||
|
}
|
||||||
|
|
||||||
StrnCpy(user2,user,sizeof(user2)-1);
|
/* try in all lower case first as this is the most
|
||||||
|
common case on UNIX systems */
|
||||||
|
strlower(user);
|
||||||
|
ret = _Get_Pwnam(user);
|
||||||
|
if (ret)
|
||||||
|
return(ret);
|
||||||
|
|
||||||
|
/* try as transmitted, but only if the original username
|
||||||
|
gives us a different case */
|
||||||
|
if (strcmp(user, orig_username) != 0)
|
||||||
|
{
|
||||||
|
ret = _Get_Pwnam(orig_username);
|
||||||
|
if (ret)
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
if (!allow_change) {
|
/* finally, try in all caps if that is a new case */
|
||||||
user = &user2[0];
|
strupper(user);
|
||||||
}
|
if (strcmp(user, orig_username) != 0)
|
||||||
|
{
|
||||||
|
ret = _Get_Pwnam(user);
|
||||||
|
if (ret)
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
ret = _Get_Pwnam(user);
|
/* Try all combinations up to usernamelevel. */
|
||||||
if (ret)
|
strlower(user);
|
||||||
return(ret);
|
ret = uname_string_combinations(user, _Get_Pwnam, usernamelevel);
|
||||||
|
if (ret)
|
||||||
|
return(ret);
|
||||||
|
|
||||||
strlower(user);
|
return(NULL);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user