winfsp-tests: posix_map_sid_test

This commit is contained in:
Bill Zissimopoulos 2016-06-05 11:00:58 -07:00
parent 229c3f81fa
commit 7fbaa8d37c
2 changed files with 51 additions and 15 deletions

View File

@ -7,10 +7,10 @@
* *
* [PERM] * [PERM]
* https://technet.microsoft.com/en-us/library/bb463216.aspx * https://technet.microsoft.com/en-us/library/bb463216.aspx
* [IDMAP]
* https://cygwin.com/cygwin-ug-net/ntsec.html
* [WKSID] * [WKSID]
* https://support.microsoft.com/en-us/kb/243330 * https://support.microsoft.com/en-us/kb/243330
* [IDMAP]
* https://cygwin.com/cygwin-ug-net/ntsec.html
* [NAME] * [NAME]
* https://www.cygwin.com/cygwin-ug-net/using-specialnames.html * https://www.cygwin.com/cygwin-ug-net/using-specialnames.html
* *
@ -255,7 +255,7 @@ FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
* LogonSid is converted to the fixed uid 0xffe == 4094 and named * LogonSid is converted to the fixed uid 0xffe == 4094 and named
* "OtherSession". * "OtherSession".
*/ */
else if (3 <= Count && 5 == SubAuthority0) else if (2 <= Count && 5 == SubAuthority0)
{ {
/* /*
* Actually we do not support Logon SID's for translation. * Actually we do not support Logon SID's for translation.
@ -273,7 +273,7 @@ FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
* Accounts from a trusted domain of the machine's primary domain: * Accounts from a trusted domain of the machine's primary domain:
* S-1-5-21-X-Y-Z-RID <=> uid/gid: trustPosixOffset(domain) + RID * S-1-5-21-X-Y-Z-RID <=> uid/gid: trustPosixOffset(domain) + RID
*/ */
else if (3 <= Count && 21 == SubAuthority0) else if (5 <= Count && 21 == SubAuthority0)
{ {
InitOnceExecuteOnce(&FspPosixInitOnceV, FspPosixInitOnceF, 0, 0); InitOnceExecuteOnce(&FspPosixInitOnceV, FspPosixInitOnceF, 0, 0);
@ -300,7 +300,7 @@ FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
* Other well-known SIDs in the NT_AUTHORITY domain (S-1-5-X-RID): * Other well-known SIDs in the NT_AUTHORITY domain (S-1-5-X-RID):
* S-1-5-X-RID <=> uid/gid: 0x1000 * X + RID * S-1-5-X-RID <=> uid/gid: 0x1000 * X + RID
*/ */
else if (3 == Count) else if (2 == Count)
{ {
*PUid = 0x1000 * SubAuthority0 + Rid; *PUid = 0x1000 * SubAuthority0 + Rid;
} }

View File

@ -14,27 +14,63 @@ void posix_map_sid_test(void)
{ L"S-1-1-0", 0x10100 }, { L"S-1-1-0", 0x10100 },
{ L"S-1-2-0", 0x10200 }, { L"S-1-2-0", 0x10200 },
{ L"S-1-2-1", 0x10201 }, { L"S-1-2-1", 0x10201 },
{ L"S-1-3-0", 0x10300 },
{ L"S-1-3-1", 0x10301 },
{ L"S-1-3-2", 0x10302 },
{ L"S-1-3-3", 0x10303 },
{ L"S-1-3-4", 0x10304 },
{ L"S-1-5-80-0", 0x50000 },
{ 0, 0 },
}; };
NTSTATUS Result; NTSTATUS Result;
BOOL Success; BOOL Success;
PSID Sid; HANDLE Token;
PWSTR SidStr; PTOKEN_USER UserInfo;
DWORD UserInfoSize;
PSID Sid0, Sid1;
UINT32 Uid;
Success = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token);
ASSERT(Success);
Success = GetTokenInformation(Token, TokenUser, 0, 0, &UserInfoSize);
ASSERT(!Success);
ASSERT(ERROR_INSUFFICIENT_BUFFER == GetLastError());
UserInfo = malloc(UserInfoSize);
ASSERT(0 != UserInfo);
Success = GetTokenInformation(Token, TokenUser, UserInfo, UserInfoSize, &UserInfoSize);
ASSERT(Success);
Success = ConvertSidToStringSidW(UserInfo->User.Sid, &map[sizeof map / sizeof map[0] - 1].SidStr);
ASSERT(Success);
free(UserInfo);
CloseHandle(Token);
for (size_t i = 0; sizeof map / sizeof map[0] > i; i++) for (size_t i = 0; sizeof map / sizeof map[0] > i; i++)
{ {
Result = FspPosixMapUidToSid(map[i].Uid, &Sid); Success = ConvertStringSidToSidW(map[i].SidStr, &Sid0);
ASSERT(NT_SUCCESS(Result));
Success = ConvertSidToStringSidW(Sid, &SidStr);
ASSERT(Success); ASSERT(Success);
ASSERT(0 == wcscmp(map[i].SidStr, SidStr));
LocalFree(SidStr);
Result = FspPosixMapSidToUid(Sid, &map[i].Uid); Result = FspPosixMapSidToUid(Sid0, &Uid);
ASSERT(NT_SUCCESS(Result)); ASSERT(NT_SUCCESS(Result));
FspDeleteSid(Sid, FspPosixMapUidToSid); if (0 != map[i].Uid)
ASSERT(Uid == map[i].Uid);
Result = FspPosixMapUidToSid(Uid, &Sid1);
ASSERT(NT_SUCCESS(Result));
ASSERT(EqualSid(Sid0, Sid1));
FspDeleteSid(Sid1, FspPosixMapUidToSid);
LocalFree(Sid0);
} }
LocalFree(map[sizeof map / sizeof map[0] - 1].SidStr);
} }
void posix_tests(void) void posix_tests(void)