* PROJECT: Local Security Authority Server DLL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/win32/lsasrv/authpackage.c
- * PURPOSE: Authenticaton package management routines
+ * PURPOSE: Authentication package management routines
* COPYRIGHT: Copyright 2013 Eric Kohl
*/
#include "lsasrv.h"
+#include <ndk/sefuncs.h>
+#include <ndk/umfuncs.h>
+
typedef enum _LSA_TOKEN_INFORMATION_TYPE
{
LsaTokenInformationNull,
typedef NTSTATUS (NTAPI *PLSA_CREATE_LOGON_SESSION)(PLUID);
typedef NTSTATUS (NTAPI *PLSA_DELETE_LOGON_SESSION)(PLUID);
-
+typedef NTSTATUS (NTAPI *PLSA_ADD_CREDENTIAL)(PLUID, ULONG, PLSA_STRING, PLSA_STRING);
+typedef NTSTATUS (NTAPI *PLSA_GET_CREDENTIALS)(PLUID, ULONG, PULONG, BOOLEAN, PLSA_STRING, PULONG, PLSA_STRING);
+typedef NTSTATUS (NTAPI *PLSA_DELETE_CREDENTIAL)(PLUID, ULONG, PLSA_STRING);
typedef PVOID (NTAPI *PLSA_ALLOCATE_LSA_HEAP)(ULONG);
typedef VOID (NTAPI *PLSA_FREE_LSA_HEAP)(PVOID);
typedef NTSTATUS (NTAPI *PLSA_ALLOCATE_CLIENT_BUFFER)(PLSA_CLIENT_REQUEST, ULONG, PVOID*);
{
PLSA_CREATE_LOGON_SESSION CreateLogonSession;
PLSA_DELETE_LOGON_SESSION DeleteLogonSession;
- PVOID /*PLSA_ADD_CREDENTIAL */ AddCredential;
- PVOID /*PLSA_GET_CREDENTIALS */ GetCredentials;
- PVOID /*PLSA_DELETE_CREDENTIAL */ DeleteCredential;
+ PLSA_ADD_CREDENTIAL AddCredential;
+ PLSA_GET_CREDENTIALS GetCredentials;
+ PLSA_DELETE_CREDENTIAL DeleteCredential;
PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap;
PLSA_FREE_LSA_HEAP FreeLsaHeap;
PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer;
typedef wchar_t *PSAMPR_SERVER_NAME;
typedef void *SAMPR_HANDLE;
-typedef struct _SAMPR_ULONG_ARRAY
-{
- unsigned long Count;
- unsigned long *Element;
-} SAMPR_ULONG_ARRAY, *PSAMPR_ULONG_ARRAY;
-
typedef struct _SAMPR_SID_INFORMATION
{
PRPC_SID SidPointer;
}
-static
PVOID
NTAPI
LsapAllocateHeap(IN ULONG Length)
{
- return RtlAllocateHeap(RtlGetProcessHeap(),
- HEAP_ZERO_MEMORY,
- Length);
+ return RtlAllocateHeap(RtlGetProcessHeap(), 0, Length);
+}
+
+
+PVOID
+NTAPI
+LsapAllocateHeapZero(IN ULONG Length)
+{
+ return RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, Length);
}
-static
VOID
NTAPI
LsapFreeHeap(IN PVOID Base)
{
- RtlFreeHeap(RtlGetProcessHeap(),
- 0,
- Base);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Base);
}
OUT PVOID *ClientBaseAddress)
{
PLSAP_LOGON_CONTEXT LogonContext;
- ULONG Length;
+ SIZE_T Length;
*ClientBaseAddress = NULL;
IN PVOID ClientBaseAddress)
{
PLSAP_LOGON_CONTEXT LogonContext;
- ULONG Length;
+ SIZE_T Length;
if (ClientBaseAddress == NULL)
return STATUS_SUCCESS;
/* Initialize the dispatch table */
DispatchTable.CreateLogonSession = &LsapCreateLogonSession;
DispatchTable.DeleteLogonSession = &LsapDeleteLogonSession;
- DispatchTable.AddCredential = NULL;
- DispatchTable.GetCredentials = NULL;
- DispatchTable.DeleteCredential = NULL;
- DispatchTable.AllocateLsaHeap = &LsapAllocateHeap;
+ DispatchTable.AddCredential = &LsapAddCredential;
+ DispatchTable.GetCredentials = &LsapGetCredentials;
+ DispatchTable.DeleteCredential = &LsapDeleteCredential;
+ DispatchTable.AllocateLsaHeap = &LsapAllocateHeapZero;
DispatchTable.FreeLsaHeap = &LsapFreeHeap;
DispatchTable.AllocateClientBuffer = &LsapAllocateClientBuffer;
DispatchTable.FreeClientBuffer = &LsapFreeClientBuffer;
Groups->GroupCount = 1;
Groups->Groups[0].Sid = Sid;
- Groups->Groups[0].Attributes =
+ Groups->Groups[0].Attributes =
SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY;
*TokenGroups = Groups;
}
Groups->Groups[Groups->GroupCount].Sid = Sid;
- Groups->Groups[Groups->GroupCount].Attributes =
+ Groups->Groups[Groups->GroupCount].Attributes =
SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_MANDATORY;
Groups->GroupCount++;
for (i = 0; i < TokenInfo1->Groups->GroupCount; i++)
SidArray.Sids[i + 1].SidPointer = TokenInfo1->Groups->Groups[i].Sid;
+ BuiltinMembership.Element = NULL;
+ AccountMembership.Element = NULL;
+
Status = SamIConnect(NULL,
&ServerHandle,
SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
goto done;
}
- BuiltinMembership.Element = NULL;
Status = SamrGetAliasMembership(BuiltinDomainHandle,
&SidArray,
&BuiltinMembership);
goto done;
}
- AccountMembership.Element = NULL;
Status = SamrGetAliasMembership(AccountDomainHandle,
&SidArray,
&AccountMembership);
IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType)
{
PLSA_TOKEN_INFORMATION_V1 TokenInfo1;
- PSID OwnerSid = NULL;
+ PSID_AND_ATTRIBUTES OwnerSid = NULL;
ULONG i, Length;
if (TokenInformationType == LsaTokenInformationV1)
if (TokenInfo1->Owner.Owner != NULL)
return STATUS_SUCCESS;
- OwnerSid = TokenInfo1->User.User.Sid;
+ OwnerSid = &TokenInfo1->User.User;
for (i = 0; i < TokenInfo1->Groups->GroupCount; i++)
{
if (EqualSid(TokenInfo1->Groups->Groups[i].Sid, LsapAdministratorsSid))
{
- OwnerSid = LsapAdministratorsSid;
+ OwnerSid = &TokenInfo1->Groups->Groups[i];
break;
}
}
- Length = RtlLengthSid(OwnerSid);
+ Length = RtlLengthSid(OwnerSid->Sid);
TokenInfo1->Owner.Owner = DispatchTable.AllocateLsaHeap(Length);
if (TokenInfo1->Owner.Owner == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
RtlCopyMemory(TokenInfo1->Owner.Owner,
- OwnerSid,
+ OwnerSid->Sid,
Length);
+ OwnerSid->Attributes |= SE_GROUP_OWNER;
}
return STATUS_SUCCESS;
TokenInfo1->Groups->Groups[i].Sid,
ACCOUNT_VIEW,
&AccountHandle);
+ if (!NT_SUCCESS(Status))
+ continue;
+
+ Status = LsarEnumeratePrivilegesAccount(AccountHandle,
+ &Privileges);
if (NT_SUCCESS(Status))
{
- Status = LsarEnumeratePrivilegesAccount(AccountHandle,
- &Privileges);
- if (NT_SUCCESS(Status))
+ for (j = 0; j < Privileges->PrivilegeCount; j++)
{
- for (j = 0; j < Privileges->PrivilegeCount; j++)
+ Status = LsapAddPrivilegeToTokenPrivileges(&TokenInfo1->Privileges,
+ &(Privileges->Privilege[j]));
+ if (!NT_SUCCESS(Status))
{
- Status = LsapAddPrivilegeToTokenPrivileges(&TokenInfo1->Privileges,
- &(Privileges->Privilege[j]));
- if (!NT_SUCCESS(Status))
- return Status;
- }
+ /* We failed, clean everything and return */
+ LsaIFree_LSAPR_PRIVILEGE_SET(Privileges);
+ LsarClose(&AccountHandle);
+ LsarClose(&PolicyHandle);
- LsaIFree_LSAPR_PRIVILEGE_SET(Privileges);
- Privileges = NULL;
+ return Status;
+ }
}
+
+ LsaIFree_LSAPR_PRIVILEGE_SET(Privileges);
+ Privileges = NULL;
}
LsarClose(&AccountHandle);
SECURITY_LOGON_TYPE LogonType;
NTSTATUS Status;
- TRACE("(%p %p)\n", RequestMsg, LogonContext);
+ PUNICODE_STRING UserName = NULL;
+ PUNICODE_STRING LogonDomainName = NULL;
+// UNICODE_STRING LogonServer;
+
+
+ TRACE("LsapLogonUser(%p %p)\n", RequestMsg, LogonContext);
PackageId = RequestMsg->LogonUser.Request.AuthenticationPackage;
LogonType = RequestMsg->LogonUser.Request.LogonType;
return STATUS_INSUFFICIENT_RESOURCES;
}
- /* Read the authentication info from the callers adress space */
+ /* Read the authentication info from the callers address space */
Status = NtReadVirtualMemory(LogonContext->ClientProcessHandle,
RequestMsg->LogonUser.Request.AuthenticationInformation,
LocalAuthInfo,
if (TokenInformationType == LsaTokenInformationV1)
{
+ TOKEN_PRIVILEGES NoPrivilege = {0};
TokenInfo1 = (PLSA_TOKEN_INFORMATION_V1)TokenInformation;
Qos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
Status = NtCreateToken(&TokenHandle,
TOKEN_ALL_ACCESS,
&ObjectAttributes,
- TokenPrimary,
+ (RequestMsg->LogonUser.Request.LogonType == Network) ? TokenImpersonation : TokenPrimary,
&RequestMsg->LogonUser.Reply.LogonId,
&TokenInfo1->ExpirationTime,
&TokenInfo1->User,
TokenInfo1->Groups,
- TokenInfo1->Privileges,
+ TokenInfo1->Privileges ? TokenInfo1->Privileges
+ : &NoPrivilege,
&TokenInfo1->Owner,
&TokenInfo1->PrimaryGroup,
&TokenInfo1->DefaultDacl,
goto done;
}
- TokenHandle = NULL;
+// TokenHandle = NULL;
- Status = LsapSetLogonSessionData(&RequestMsg->LogonUser.Reply.LogonId);
+ if (LogonType == Interactive ||
+ LogonType == Batch ||
+ LogonType == Service)
+ {
+ UserName = &((PMSV1_0_INTERACTIVE_LOGON)LocalAuthInfo)->UserName;
+ LogonDomainName = &((PMSV1_0_INTERACTIVE_LOGON)LocalAuthInfo)->LogonDomainName;
+ }
+ else
+ {
+ FIXME("LogonType %lu is not supported yet!\n", LogonType);
+ }
+
+ Status = LsapSetLogonSessionData(&RequestMsg->LogonUser.Reply.LogonId,
+ LogonType,
+ UserName,
+ LogonDomainName,
+ TokenInfo1->User.User.Sid);
if (!NT_SUCCESS(Status))
{
ERR("LsapSetLogonSessionData failed (Status 0x%08lx)\n", Status);
}
done:
- if (!NT_SUCCESS(Status))
- {
+// if (!NT_SUCCESS(Status))
+// {
if (TokenHandle != NULL)
NtClose(TokenHandle);
- }
+// }
/* Free the local groups */
if (LocalGroups != NULL)