- Split DoLoginTasks into DoLoginTasks and CreateProfile, and fix all callers of DoLoginTasks accordingly.
- Make DoLoginTasks pass the SubStatus from MyLogonUser to its caller.
- Move the logon code from LoggedOutWindowProc to a new function DoLogon and add some experimental code to report logon errors to the user (still WIP).

svn path=/trunk/; revision=62464
This commit is contained in:
Eric Kohl 2014-03-08 22:13:19 +00:00
parent e4fbb93e96
commit 88a9cdffba
4 changed files with 153 additions and 60 deletions

View file

@ -920,6 +920,90 @@ GUILoggedOnSAS(
return result; return result;
} }
static
INT
DoLogon(
IN HWND hwndDlg,
IN OUT PGINA_CONTEXT pgContext)
{
LPWSTR UserName = NULL;
LPWSTR Password = NULL;
LPWSTR Domain = NULL;
INT result = WLX_SAS_ACTION_NONE;
NTSTATUS Status, SubStatus = STATUS_SUCCESS;
if (GetTextboxText(hwndDlg, IDC_USERNAME, &UserName) && *UserName == '\0')
goto done;
if (GetTextboxText(hwndDlg, IDC_LOGON_TO, &Domain) && *Domain == '\0')
goto done;
if (!GetTextboxText(hwndDlg, IDC_PASSWORD, &Password))
goto done;
Status = DoLoginTasks(pgContext, UserName, Domain, Password, &SubStatus);
if (!NT_SUCCESS(Status))
{
TRACE("DoLoginTasks failed! Status 0x%08lx SubStatus 0x%08lx\n", Status, SubStatus);
if (SubStatus == STATUS_ACCOUNT_DISABLED)
{
TRACE("Account disabled!\n");
pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx,
hwndDlg,
L"Account disabled!",
L"Logon error",
MB_OK | MB_ICONERROR);
goto done;
}
else if (SubStatus == STATUS_ACCOUNT_LOCKED_OUT)
{
TRACE("Account locked!\n");
pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx,
hwndDlg,
L"Account locked!",
L"Logon error",
MB_OK | MB_ICONERROR);
goto done;
}
else
{
TRACE("Other error!\n");
pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx,
hwndDlg,
L"Other error!",
L"Logon error",
MB_OK | MB_ICONERROR);
goto done;
}
}
if (!CreateProfile(pgContext, UserName, Domain, Password))
{
ERR("Failed to create the profile!\n");
goto done;
}
ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR));
wcscpy(pgContext->Password, Password);
result = WLX_SAS_ACTION_LOGON;
done:
if (UserName != NULL)
HeapFree(GetProcessHeap(), 0, UserName);
if (Password != NULL)
HeapFree(GetProcessHeap(), 0, Password);
if (Domain != NULL)
HeapFree(GetProcessHeap(), 0, Domain);
return result;
}
static INT_PTR CALLBACK static INT_PTR CALLBACK
LoggedOutWindowProc( LoggedOutWindowProc(
IN HWND hwndDlg, IN HWND hwndDlg,
@ -934,7 +1018,6 @@ LoggedOutWindowProc(
switch (uMsg) switch (uMsg)
{ {
case WM_INITDIALOG: case WM_INITDIALOG:
{
/* FIXME: take care of NoDomainUI */ /* FIXME: take care of NoDomainUI */
pgContext = (PGINA_CONTEXT)lParam; pgContext = (PGINA_CONTEXT)lParam;
SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)pgContext); SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)pgContext);
@ -955,7 +1038,7 @@ LoggedOutWindowProc(
pgContext->hBitmap = LoadImage(hDllInstance, MAKEINTRESOURCE(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); pgContext->hBitmap = LoadImage(hDllInstance, MAKEINTRESOURCE(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
return TRUE; return TRUE;
}
case WM_PAINT: case WM_PAINT:
{ {
PAINTSTRUCT ps; PAINTSTRUCT ps;
@ -968,51 +1051,27 @@ LoggedOutWindowProc(
} }
return TRUE; return TRUE;
} }
case WM_DESTROY: case WM_DESTROY:
{
DeleteObject(pgContext->hBitmap); DeleteObject(pgContext->hBitmap);
return TRUE; return TRUE;
}
case WM_COMMAND: case WM_COMMAND:
{
switch (LOWORD(wParam)) switch (LOWORD(wParam))
{ {
case IDOK: case IDOK:
{ EndDialog(hwndDlg, DoLogon(hwndDlg, pgContext));
LPWSTR UserName = NULL, Password = NULL, Domain = NULL;
INT result = WLX_SAS_ACTION_NONE;
if (GetTextboxText(hwndDlg, IDC_USERNAME, &UserName) && *UserName == '\0')
break;
if (GetTextboxText(hwndDlg, IDC_LOGON_TO, &Domain) && *Domain == '\0')
break;
if (GetTextboxText(hwndDlg, IDC_PASSWORD, &Password) &&
DoLoginTasks(pgContext, UserName, Domain, Password))
{
ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR));
wcscpy(pgContext->Password, Password);
result = WLX_SAS_ACTION_LOGON;
}
HeapFree(GetProcessHeap(), 0, UserName);
HeapFree(GetProcessHeap(), 0, Password);
HeapFree(GetProcessHeap(), 0, Domain);
EndDialog(hwndDlg, result);
return TRUE; return TRUE;
}
case IDCANCEL: case IDCANCEL:
{
EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); EndDialog(hwndDlg, WLX_SAS_ACTION_NONE);
return TRUE; return TRUE;
}
case IDC_SHUTDOWN: case IDC_SHUTDOWN:
{
EndDialog(hwndDlg, WLX_SAS_ACTION_SHUTDOWN); EndDialog(hwndDlg, WLX_SAS_ACTION_SHUTDOWN);
return TRUE; return TRUE;
}
} }
break; break;
}
} }
return FALSE; return FALSE;

View file

@ -686,8 +686,41 @@ done:
} }
BOOL NTSTATUS
DoLoginTasks( DoLoginTasks(
IN OUT PGINA_CONTEXT pgContext,
IN PWSTR UserName,
IN PWSTR Domain,
IN PWSTR Password,
OUT PNTSTATUS SubStatus)
{
NTSTATUS Status;
Status = ConnectToLsa(pgContext);
if (!NT_SUCCESS(Status))
{
WARN("ConnectToLsa() failed (Status 0x%08lx)\n", Status);
return Status;
}
Status = MyLogonUser(pgContext->LsaHandle,
pgContext->AuthenticationPackage,
UserName,
Domain,
Password,
&pgContext->UserToken,
SubStatus);
if (!NT_SUCCESS(Status))
{
WARN("MyLogonUser() failed (Status 0x%08lx)\n", Status);
}
return Status;
}
BOOL
CreateProfile(
IN OUT PGINA_CONTEXT pgContext, IN OUT PGINA_CONTEXT pgContext,
IN PWSTR UserName, IN PWSTR UserName,
IN PWSTR Domain, IN PWSTR Domain,
@ -700,28 +733,6 @@ DoLoginTasks(
DWORD cbStats, cbSize; DWORD cbStats, cbSize;
DWORD dwLength; DWORD dwLength;
BOOL bResult; BOOL bResult;
NTSTATUS SubStatus;
NTSTATUS Status;
Status = ConnectToLsa(pgContext);
if (!NT_SUCCESS(Status))
{
WARN("ConnectToLsa() failed\n");
return FALSE;
}
Status = MyLogonUser(pgContext->LsaHandle,
pgContext->AuthenticationPackage,
UserName,
Domain,
Password,
&pgContext->UserToken,
&SubStatus);
if (!NT_SUCCESS(Status))
{
WARN("MyLogonUser() failed\n");
goto cleanup;
}
/* Store the logon time in the context */ /* Store the logon time in the context */
GetLocalTime(&pgContext->LogonTime); GetLocalTime(&pgContext->LogonTime);
@ -822,6 +833,8 @@ DoAutoLogon(
LPWSTR Password = NULL; LPWSTR Password = NULL;
BOOL result = FALSE; BOOL result = FALSE;
LONG rc; LONG rc;
NTSTATUS Status;
NTSTATUS SubStatus = STATUS_SUCCESS;
TRACE("DoAutoLogon(): AutoLogonState = %lu\n", TRACE("DoAutoLogon(): AutoLogonState = %lu\n",
pgContext->AutoLogonState); pgContext->AutoLogonState);
@ -884,8 +897,15 @@ DoAutoLogon(
if (rc != ERROR_SUCCESS) if (rc != ERROR_SUCCESS)
goto cleanup; goto cleanup;
result = DoLoginTasks(pgContext, UserName, Domain, Password); Status = DoLoginTasks(pgContext, UserName, Domain, Password, &SubStatus);
if (!NT_SUCCESS(Status))
{
/* FIXME: Handle errors!!! */
result = FALSE;
goto cleanup;
}
result = CreateProfile(pgContext, UserName, Domain, Password);
if (result == TRUE) if (result == TRUE)
{ {
ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR)); ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR));

View file

@ -104,8 +104,16 @@ DoAdminUnlock(
IN PWSTR Domain, IN PWSTR Domain,
IN PWSTR Password); IN PWSTR Password);
BOOL NTSTATUS
DoLoginTasks( DoLoginTasks(
IN OUT PGINA_CONTEXT pgContext,
IN PWSTR UserName,
IN PWSTR Domain,
IN PWSTR Password,
OUT PNTSTATUS SubStatus);
BOOL
CreateProfile(
IN OUT PGINA_CONTEXT pgContext, IN OUT PGINA_CONTEXT pgContext,
IN PWSTR UserName, IN PWSTR UserName,
IN PWSTR Domain, IN PWSTR Domain,

View file

@ -199,6 +199,8 @@ TUILoggedOutSAS(
{ {
WCHAR UserName[256]; WCHAR UserName[256];
WCHAR Password[256]; WCHAR Password[256];
NTSTATUS Status;
NTSTATUS SubStatus = STATUS_SUCCESS;
TRACE("TUILoggedOutSAS()\n"); TRACE("TUILoggedOutSAS()\n");
@ -208,10 +210,14 @@ TUILoggedOutSAS(
if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE)) if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE))
return WLX_SAS_ACTION_NONE; return WLX_SAS_ACTION_NONE;
if (DoLoginTasks(pgContext, UserName, NULL, Password)) Status = DoLoginTasks(pgContext, UserName, NULL, Password, &SubStatus);
return WLX_SAS_ACTION_LOGON; if (Status == STATUS_SUCCESS)
else {
return WLX_SAS_ACTION_NONE; if (CreateProfile(pgContext, UserName, NULL, Password))
return WLX_SAS_ACTION_LOGON;
}
return WLX_SAS_ACTION_NONE;
} }
static INT static INT