X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/939395a800652e2164a5426d3ba2ba3322eb8526..3982a765c4ae798e61bcb5ed7415e509718dc445:/windows/winmisc.c diff --git a/windows/winmisc.c b/windows/winmisc.c index b9214043..c7ac8357 100644 --- a/windows/winmisc.c +++ b/windows/winmisc.c @@ -5,17 +5,10 @@ #include #include #include "putty.h" +#include OSVERSIONINFO osVersion; -void platform_get_x11_auth(char *display, int *proto, - unsigned char *data, int *datalen) -{ - /* We don't support this at all under Windows. */ -} - -const char platform_x11_best_transport[] = "localhost"; - char *platform_get_x_display(void) { /* We may as well check for DISPLAY in case it's useful. */ return dupstr(getenv("DISPLAY")); @@ -48,21 +41,61 @@ char *get_username(void) { DWORD namelen; char *user; + int got_username = FALSE; + DECL_WINDOWS_FUNCTION(static, BOOLEAN, GetUserNameExA, + (EXTENDED_NAME_FORMAT, LPSTR, PULONG)); + + { + static int tried_usernameex = FALSE; + if (!tried_usernameex) { + /* Not available on Win9x, so load dynamically */ + HMODULE secur32 = LoadLibrary("SECUR32.DLL"); + GET_WINDOWS_FUNCTION(secur32, GetUserNameExA); + tried_usernameex = TRUE; + } + } - namelen = 0; - if (GetUserName(NULL, &namelen) == FALSE) { + if (p_GetUserNameExA) { /* - * 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. + * If available, use the principal -- this avoids the problem + * that the local username is case-insensitive but Kerberos + * usernames are case-sensitive. */ - namelen = 256; + + /* 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); + } } - user = snewn(namelen, char); - GetUserName(user, &namelen); + 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 user; + return got_username ? user : NULL; } BOOL init_winver(void)