1
0
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:
Jacob Nevins 2010-03-24 20:12:25 +00:00
parent 4a8c45f9f7
commit c18b150623
3 changed files with 61 additions and 15 deletions

View File

@ -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),

View File

@ -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';
} }

View File

@ -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)