| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							- /*
 
-  * Implementation of get_username() for Windows.
 
-  */
 
- #include "putty.h"
 
- #ifndef SECURITY_WIN32
 
- #define SECURITY_WIN32
 
- #endif
 
- #include <security.h>
 
- char *get_username(void)
 
- {
 
-     DWORD namelen;
 
-     char *user;
 
-     bool got_username = false;
 
-     DECL_WINDOWS_FUNCTION(static, BOOLEAN, GetUserNameExA,
 
-                           (EXTENDED_NAME_FORMAT, LPSTR, PULONG));
 
-     {
 
-         static bool tried_usernameex = false;
 
-         if (!tried_usernameex) {
 
-             /* Not available on Win9x, so load dynamically */
 
-             HMODULE secur32 = load_system32_dll("secur32.dll");
 
-             /* If MIT Kerberos is installed, the following call to
 
-                GET_WINDOWS_FUNCTION makes Windows implicitly load
 
-                sspicli.dll WITHOUT proper path sanitizing, so better
 
-                load it properly before */
 
-             HMODULE sspicli = load_system32_dll("sspicli.dll");
 
-             (void)sspicli; /* squash compiler warning about unused variable */
 
-             GET_WINDOWS_FUNCTION(secur32, GetUserNameExA);
 
-             tried_usernameex = true;
 
-         }
 
-     }
 
-     if (p_GetUserNameExA) {
 
-         /*
 
-          * If available, use the principal -- this avoids the problem
 
-          * that the local username is case-insensitive but Kerberos
 
-          * usernames are case-sensitive.
 
-          */
 
-         /* 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)) {
 
-             /*
 
-              * 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;
 
- }
 
 
  |