[PATCH v4 0/2] MR907: secur32: Implement basic functionality for LsaGetLogonSessionData.
This basic implementation is sufficient to fix .NET applications that use System.Security.Principal.WindowsIdentity.AuthenticationType. -- v4: secur32: Implement basic functionality for LsaGetLogonSessionData. secur32/tests: Add tests for LsaGetLogonSessionData. https://gitlab.winehq.org/wine/wine/-/merge_requests/907
From: Owen Rudge <orudge(a)codeweavers.com> --- dlls/secur32/tests/main.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/dlls/secur32/tests/main.c b/dlls/secur32/tests/main.c index 36ed02ab467..9b148a5368f 100644 --- a/dlls/secur32/tests/main.c +++ b/dlls/secur32/tests/main.c @@ -26,6 +26,7 @@ #include <windef.h> #include <winbase.h> #include <sspi.h> +#include <ntsecapi.h> #include "wine/test.h" @@ -244,6 +245,42 @@ static void testQuerySecurityPackageInfo(void) ok(pkg_info == (void *)0xdeadbeef, "wrong pkg_info address %p\n", pkg_info); } +static void test_get_logon_session_data(void) +{ + SECURITY_LOGON_SESSION_DATA *data = NULL; + TOKEN_STATISTICS ts; + HANDLE thread_hdl; + NTSTATUS status; + DWORD ret_len; + BOOL ret; + + ret = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &thread_hdl); + ok(ret, "got %ld\n", GetLastError()); + + if (!ret) return; + + ret_len = sizeof(TOKEN_STATISTICS); + ret = GetTokenInformation(thread_hdl, TokenStatistics, &ts, sizeof(TOKEN_STATISTICS), &ret_len); + ok(ret, "got %ld\n", GetLastError()); + + if (!ret) goto cleanup; + + status = LsaGetLogonSessionData(&ts.AuthenticationId, &data); + todo_wine ok(!status, "got %08lx\n", status); + + if (status) goto cleanup; + + ok(data->Size >= sizeof(SECURITY_LOGON_SESSION_DATA), "Size == %ld\n", data->Size); + ok(!memcmp(&data->LogonId, &ts.AuthenticationId, sizeof(LUID)), "LogonId mismatch\n"); + + /* We can't easily verify the content of the various logon parameters, so just ensure data is present */ + ok(data->AuthenticationPackage.Length > 0, "AuthenticationPackage missing\n"); + +cleanup: + CloseHandle(thread_hdl); + if (data != NULL) LsaFreeReturnBuffer(data); +} + START_TEST(main) { InitFunctionPtrs(); @@ -260,4 +297,6 @@ START_TEST(main) } if(secdll) FreeLibrary(secdll); + + test_get_logon_session_data(); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/907
From: Owen Rudge <orudge(a)codeweavers.com> --- dlls/secur32/lsa.c | 28 +++++++++++++++++++++++++--- dlls/secur32/tests/main.c | 2 +- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/dlls/secur32/lsa.c b/dlls/secur32/lsa.c index 9368d3728e4..12ddb1b4d03 100644 --- a/dlls/secur32/lsa.c +++ b/dlls/secur32/lsa.c @@ -43,6 +43,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(secur32); #define LSA_MAGIC_CREDENTIALS ('L' << 24 | 'S' << 16 | 'A' << 8 | '1') #define LSA_MAGIC_CONTEXT ('L' << 24 | 'S' << 16 | 'A' << 8 | '2') +static const WCHAR *default_authentication_package = L"Negotiate"; + struct lsa_package { ULONG package_id; @@ -157,9 +159,29 @@ NTSTATUS WINAPI LsaFreeReturnBuffer(PVOID buffer) NTSTATUS WINAPI LsaGetLogonSessionData(PLUID LogonId, PSECURITY_LOGON_SESSION_DATA* ppLogonSessionData) { - FIXME("%p %p stub\n", LogonId, ppLogonSessionData); - *ppLogonSessionData = NULL; - return STATUS_NOT_IMPLEMENTED; + SECURITY_LOGON_SESSION_DATA *data; + int authpkg_len; + WCHAR *end; + + FIXME("%p %p semi-stub\n", LogonId, ppLogonSessionData); + + authpkg_len = wcslen(default_authentication_package) * sizeof(WCHAR); + + data = calloc(1, sizeof(SECURITY_LOGON_SESSION_DATA) + authpkg_len + sizeof(WCHAR)); + + data->Size = sizeof(SECURITY_LOGON_SESSION_DATA); + data->LogonId = *LogonId; + + end = (WCHAR *)(data + 1); + wcscpy(end, default_authentication_package); + + data->AuthenticationPackage.Length = authpkg_len; + data->AuthenticationPackage.MaximumLength = authpkg_len + sizeof(WCHAR); + data->AuthenticationPackage.Buffer = end; + + *ppLogonSessionData = data; + + return STATUS_SUCCESS; } NTSTATUS WINAPI LsaLogonUser(HANDLE LsaHandle, PLSA_STRING OriginName, diff --git a/dlls/secur32/tests/main.c b/dlls/secur32/tests/main.c index 9b148a5368f..46a62c8ea02 100644 --- a/dlls/secur32/tests/main.c +++ b/dlls/secur32/tests/main.c @@ -266,7 +266,7 @@ static void test_get_logon_session_data(void) if (!ret) goto cleanup; status = LsaGetLogonSessionData(&ts.AuthenticationId, &data); - todo_wine ok(!status, "got %08lx\n", status); + ok(!status, "got %08lx\n", status); if (status) goto cleanup; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/907
On Thu Sep 22 08:58:20 2022 +0000, Owen Rudge wrote:
changed this line in [version 4 of the diff](/wine/wine/-/merge_requests/907/diffs?diff_id=11856&start_sha=f784500a2e20e1440257c3361e61cd164f1083dc#48a41560d4418abf4582252fdfc8bcbdf980e5c7_5_5) Thanks, I've not any plans to add more tests just now, so I've moved this to main.c as suggested.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/907#note_9042
On Thu Sep 22 08:42:37 2022 +0000, Owen Rudge wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/907/diffs?diff_id=11853&start_sha=4653a739608aeb0a90884683e267d6ea626a4160#60daaa93dcfa008e12b12bad94263cac3567b021_171_170) Thanks for the review, Huw - these changes are all now implemented.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/907#note_9043
On Thu Sep 22 08:59:34 2022 +0000, Owen Rudge wrote:
Thanks for the review, Huw - these changes are all now implemented. I'll let @hans review properly - I just happened to notice these in passing.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/907#note_9045
Hans Leidekker (@hans) commented about dlls/secur32/lsa.c:
PSECURITY_LOGON_SESSION_DATA* ppLogonSessionData) { - FIXME("%p %p stub\n", LogonId, ppLogonSessionData); - *ppLogonSessionData = NULL; - return STATUS_NOT_IMPLEMENTED; + SECURITY_LOGON_SESSION_DATA *data; + int authpkg_len; + WCHAR *end; + + FIXME("%p %p semi-stub\n", LogonId, ppLogonSessionData); + + authpkg_len = wcslen(default_authentication_package) * sizeof(WCHAR); + + data = calloc(1, sizeof(SECURITY_LOGON_SESSION_DATA) + authpkg_len + sizeof(WCHAR)); + + data->Size = sizeof(SECURITY_LOGON_SESSION_DATA);
Checking for allocation failure would be nice. I prefer sizeof(*data) over sizeof(SECURITY_LOGON_SESSION_DATA) but it's not a big deal. Otherwise it looks good. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/907#note_9046
participants (4)
-
Hans Leidekker (@hans) -
Huw Davies (@huw) -
Owen Rudge -
Owen Rudge (@orudge)