From 36a1a69178cf1667f7ddd31ee00274f9e7709139 Mon Sep 17 00:00:00 2001 From: fvogel Date: Wed, 23 May 2018 21:08:01 +0000 Subject: Add support for ~domain\user style user names, with new test test filesystem-1.30.3. Warning: does not yet work. --- tests/fileSystem.test | 3 +++ win/tclWinFile.c | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/fileSystem.test b/tests/fileSystem.test index f778112..277fcd3 100644 --- a/tests/fileSystem.test +++ b/tests/fileSystem.test @@ -270,6 +270,9 @@ test filesystem-1.30.1 {normalisation of existing user} -body { test filesystem-1.30.2 {normalisation of nonexistent user specified as user@domain} -body { file normalize ~nonexistentuser@nonexistentdomain } -returnCodes error -result {user "nonexistentuser@nonexistentdomain" doesn't exist} +test filesystem-1.30.3 {normalisation of nonexistent user specified as domain\user} -body { + file normalize ~nonexistentdomain\\nonexistentuser +} -returnCodes error -result {user "nonexistentdomain\nonexistentuser" doesn't exist} test filesystem-1.31 {link normalisation: link near filesystem root} {testsetplatform} { testsetplatform unix file normalize /foo/../bar diff --git a/win/tclWinFile.c b/win/tclWinFile.c index beab147..b8fb046 100644 --- a/win/tclWinFile.c +++ b/win/tclWinFile.c @@ -1441,11 +1441,13 @@ TclpGetUserHome( Tcl_DString ds; int nameLen = -1; int badDomain = 0; - char *domain; + char *domain, *user; + const char *nameStart; WCHAR *wName, *wHomeDir, *wDomain, **wDomainPtr = &wDomain; WCHAR buf[MAX_PATH]; LPCWSTR wServername = NULL; + nameStart = name; Tcl_DStringInit(bufferPtr); wDomain = NULL; domain = strchr(name, '@'); @@ -1455,10 +1457,20 @@ TclpGetUserHome( badDomain = NetGetDCName(NULL, wName, (LPBYTE *) wDomainPtr); Tcl_DStringFree(&ds); nameLen = domain - name; + } else { + user = strchr(name, '\\'); + if (user != NULL) { + Tcl_DStringInit(&ds); + wName = Tcl_UtfToUniCharDString(name, user - name, &ds); + badDomain = NetGetDCName(NULL, wName, (LPBYTE *) wDomainPtr); + Tcl_DStringFree(&ds); + nameStart = user + 1; + nameLen = name + strlen(name) - 1 - user; + } } if (badDomain == 0) { Tcl_DStringInit(&ds); - wName = Tcl_UtfToUniCharDString(name, nameLen, &ds); + wName = Tcl_UtfToUniCharDString(nameStart, nameLen, &ds); NetGetDCName(NULL, wDomain, (LPBYTE *) &wServername); if (NetUserGetInfo(wServername, wName, 1, (LPBYTE *) uiPtrPtr) == 0) { wHomeDir = uiPtr->usri1_home_dir; @@ -1477,7 +1489,7 @@ TclpGetUserHome( } Tcl_UniCharToUtfDString(buf, size-1, bufferPtr); Tcl_DStringAppend(bufferPtr, "/", -1); - Tcl_DStringAppend(bufferPtr, name, -1); + Tcl_DStringAppend(bufferPtr, nameStart, nameLen); } result = Tcl_DStringValue(bufferPtr); NetApiBufferFree((void *) uiPtr); -- cgit v0.12