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.
From: Owen Rudge orudge@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(); }
From: Owen Rudge orudge@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;
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.
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.
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.
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.