mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-18 03:28:07 -05:00
When looking for a local username on Windows, if we can get hold of the
NameUserPrincipal, use that; this avoids an issue with SSPI/GSSAPI where the user logged in to the local machine with a different case of username to the (case-sensitive) Kerberos username. Falls back to GetUserName as before if that doesn't work (for machines not on a domain, and Win9x). Based on a patch by SebastianUnger. [originally from svn r8909]
This commit is contained in:
parent
4a8c45f9f7
commit
c18b150623
3
config.c
3
config.c
@ -1765,7 +1765,8 @@ void setup_config_box(struct controlbox *b, int midsession,
|
|||||||
/* We assume the local username is sufficiently stable
|
/* We assume the local username is sufficiently stable
|
||||||
* to include on the dialog box. */
|
* to include on the dialog box. */
|
||||||
char *user = get_username();
|
char *user = get_username();
|
||||||
char *userlabel = dupprintf("Use system username (%s)", user);
|
char *userlabel = dupprintf("Use system username (%s)",
|
||||||
|
user ? user : "");
|
||||||
sfree(user);
|
sfree(user);
|
||||||
ctrl_radiobuttons(s, "When username is not specified:", 'n', 4,
|
ctrl_radiobuttons(s, "When username is not specified:", 'n', 4,
|
||||||
HELPCTX(connection_username_from_env),
|
HELPCTX(connection_username_from_env),
|
||||||
|
10
settings.c
10
settings.c
@ -84,9 +84,13 @@ int get_remote_username(Config *cfg, char *user, size_t len)
|
|||||||
if (cfg->username_from_env) {
|
if (cfg->username_from_env) {
|
||||||
/* Use local username. */
|
/* Use local username. */
|
||||||
char *luser = get_username();
|
char *luser = get_username();
|
||||||
strncpy(user, luser, len);
|
if (luser) {
|
||||||
user[len-1] = '\0';
|
strncpy(user, luser, len);
|
||||||
sfree(luser);
|
user[len-1] = '\0';
|
||||||
|
sfree(luser);
|
||||||
|
} else {
|
||||||
|
*user = '\0';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
*user = '\0';
|
*user = '\0';
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "putty.h"
|
#include "putty.h"
|
||||||
|
#include <security.h>
|
||||||
|
|
||||||
OSVERSIONINFO osVersion;
|
OSVERSIONINFO osVersion;
|
||||||
|
|
||||||
@ -40,21 +41,61 @@ char *get_username(void)
|
|||||||
{
|
{
|
||||||
DWORD namelen;
|
DWORD namelen;
|
||||||
char *user;
|
char *user;
|
||||||
|
int got_username = FALSE;
|
||||||
|
DECL_WINDOWS_FUNCTION(static, BOOLEAN, GetUserNameExA,
|
||||||
|
(EXTENDED_NAME_FORMAT, LPSTR, PULONG));
|
||||||
|
|
||||||
namelen = 0;
|
{
|
||||||
if (GetUserName(NULL, &namelen) == FALSE) {
|
static int tried_usernameex = FALSE;
|
||||||
/*
|
if (!tried_usernameex) {
|
||||||
* Apparently this doesn't work at least on Windows XP SP2.
|
/* Not available on Win9x, so load dynamically */
|
||||||
* Thus assume a maximum of 256. It will fail again if it
|
HMODULE secur32 = LoadLibrary("SECUR32.DLL");
|
||||||
* doesn't fit.
|
GET_WINDOWS_FUNCTION(secur32, GetUserNameExA);
|
||||||
*/
|
tried_usernameex = TRUE;
|
||||||
namelen = 256;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
user = snewn(namelen, char);
|
if (p_GetUserNameExA) {
|
||||||
GetUserName(user, &namelen);
|
/*
|
||||||
|
* If available, use the principal -- this avoids the problem
|
||||||
|
* that the local username is case-insensitive but Kerberos
|
||||||
|
* usernames are case-sensitive.
|
||||||
|
*/
|
||||||
|
|
||||||
return user;
|
/* Get the length */
|
||||||
|
namelen = 0;
|
||||||
|
(void) p_GetUserNameExA(NameUserPrincipal, NULL, &namelen);
|
||||||
|
|
||||||
|
user = snewn(namelen, char);
|
||||||
|
got_username = p_GetUserNameExA(NameUserPrincipal, user, &namelen);
|
||||||
|
if (got_username) {
|
||||||
|
char *p = strchr(user, '@');
|
||||||
|
if (p) *p = 0;
|
||||||
|
} else {
|
||||||
|
sfree(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!got_username) {
|
||||||
|
/* Fall back to local user name */
|
||||||
|
namelen = 0;
|
||||||
|
if (GetUserName(NULL, &namelen) == FALSE) {
|
||||||
|
/*
|
||||||
|
* Apparently this doesn't work at least on Windows XP SP2.
|
||||||
|
* Thus assume a maximum of 256. It will fail again if it
|
||||||
|
* doesn't fit.
|
||||||
|
*/
|
||||||
|
namelen = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
user = snewn(namelen, char);
|
||||||
|
got_username = GetUserName(user, &namelen);
|
||||||
|
if (!got_username) {
|
||||||
|
sfree(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return got_username ? user : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL init_winver(void)
|
BOOL init_winver(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user