/* * DialogProc for OpenVPN username/password/challenge auth dialog windows */ INT_PTR CALLBACK UserAuthDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { auth_param_t *param; WCHAR username[USER_PASS_LEN]; WCHAR password[USER_PASS_LEN]; switch (msg) { case WM_INITDIALOG: /* Set connection for this dialog and show it */ param = (auth_param_t *) lParam; SetProp(hwndDlg, cfgProp, (HANDLE) param); if (param->challenge_str) { int wchars_num = MultiByteToWideChar(CP_UTF8, 0, param->challenge_str, -1, NULL, 0); LPWSTR wstr = (LPWSTR)malloc(sizeof(WCHAR) * wchars_num); HWND wnd_challenge = GetDlgItem(hwndDlg, ID_EDT_AUTH_CHALLENGE); MultiByteToWideChar(CP_UTF8, 0, param->challenge_str, -1, wstr, wchars_num); SetDlgItemTextW(hwndDlg, ID_TXT_AUTH_CHALLENGE, wstr); free(wstr); /* Set/Remove style ES_PASSWORD by SetWindowLong(GWL_STYLE) does nothing, send EM_SETPASSWORDCHAR just works. */ if(param->challenge_echo) SendMessage(wnd_challenge, EM_SETPASSWORDCHAR, 0, 0); } if (RecallUsername(param->c->config_name, username)) SetDlgItemTextW(hwndDlg, ID_EDT_AUTH_USER, username); if (RecallAuthPass(param->c->config_name, password)) { SetDlgItemTextW(hwndDlg, ID_EDT_AUTH_PASS, password); SecureZeroMemory(password, sizeof(password)); } if (param->c->flags & FLAG_SAVE_AUTH_PASS) Button_SetCheck(GetDlgItem (hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); if (param->c->state == resuming) ForceForegroundWindow(hwndDlg); else SetForegroundWindow(hwndDlg); break; case WM_COMMAND: param = (auth_param_t *) GetProp(hwndDlg, cfgProp); switch (LOWORD(wParam)) { case ID_EDT_AUTH_USER: if (HIWORD(wParam) == EN_UPDATE) { int len = Edit_GetTextLength((HWND) lParam); EnableWindow(GetDlgItem(hwndDlg, IDOK), (len ? TRUE : FALSE)); } break; case ID_CHK_SAVE_PASS: param->c->flags ^= FLAG_SAVE_AUTH_PASS; if (param->c->flags & FLAG_SAVE_AUTH_PASS) Button_SetCheck(GetDlgItem (hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); else { DeleteSavedAuthPass(param->c->config_name); Button_SetCheck(GetDlgItem (hwndDlg, ID_CHK_SAVE_PASS), BST_UNCHECKED); } break; case IDOK: if (GetDlgItemTextW(hwndDlg, ID_EDT_AUTH_USER, username, _countof(username))) { SaveUsername(param->c->config_name, username); } if ( param->c->flags & FLAG_SAVE_AUTH_PASS && GetDlgItemTextW(hwndDlg, ID_EDT_AUTH_PASS, password, _countof(password)) && wcslen(password) ) { SaveAuthPass(param->c->config_name, password); SecureZeroMemory(password, sizeof(password)); } ManagementCommandFromInput(param->c, "username \"Auth\" \"%s\"", hwndDlg, ID_EDT_AUTH_USER); if (param->challenge_str) ManagementCommandFromInputBase64(param->c, "password \"Auth\" \"SCRV1:%s:%s\"", hwndDlg, ID_EDT_AUTH_PASS, ID_EDT_AUTH_CHALLENGE); else ManagementCommandFromInput(param->c, "password \"Auth\" \"%s\"", hwndDlg, ID_EDT_AUTH_PASS); EndDialog(hwndDlg, LOWORD(wParam)); return TRUE; case IDCANCEL: EndDialog(hwndDlg, LOWORD(wParam)); StopOpenVPN(param->c); return TRUE; } break; case WM_CLOSE: EndDialog(hwndDlg, LOWORD(wParam)); return TRUE; case WM_NCDESTROY: param = (auth_param_t *) GetProp(hwndDlg, cfgProp); if (param->challenge_str) free(param->challenge_str); free(param); RemoveProp(hwndDlg, cfgProp); break; } return FALSE; }
static BOOL CheckUsername (HWND hWnd) { STRING szTmp; STRING szDir; STRING szGuest; char *src; char *dst; int idx, iErr; if (fButtonHidden) { clr ((LPTR)Control.CurrentUser, sizeof(Control.CurrentUser)); LoadString (hInstAstral, IDS_YOUR_NAME, szTmp, sizeof(szTmp)); clr ((LPTR)szNewUser, sizeof(STRING)); GetDlgItemText (hWnd, IDC_WHO_EDIT, szNewUser, sizeof(szNewUser)); if ( (szNewUser[0] != 0) && (lstrcmp (szNewUser, szTmp))) { // create a directory name by using the first 8 // alnum characters clr ((LPTR)szDir, sizeof(STRING)); src = szNewUser; dst = szDir; idx = 0; while (idx < 8) { if ( isalnum (*src)) { *dst = *src; dst++; src++; idx++; } else { src++; // if two non-alnum char's together, break; if (! isalnum (*src)) break; } } // save this new entry in the INI file SaveUsername (szNewUser, szDir); // create this directory if it doesn't exist lstrcpy (szTmp, Control.WorkPath); lstrcat (szTmp, szDir); if ( (iErr = _mkdir (szTmp)) ) { // no error message, dir could already exist } // save this directory name in the control structure lstrcpy (Control.CurrentUser, szDir); } else { LoadString (hInstAstral, IDS_GUEST, szGuest, sizeof(szGuest)); lstrcpy (szTmp, Control.WorkPath); lstrcat (szTmp, szGuest); _mkdir (szTmp); lstrcpy (Control.CurrentUser, szGuest); SaveUsername (szGuest, szGuest); } } else if (szNewUser[0] != 0) { // make sure the directory exists in case some idiot deletes it if (GetUserDir (szNewUser, szDir)) { lstrcpy (szTmp, Control.WorkPath); lstrcat (szTmp, szDir); _mkdir (szTmp); } return TRUE; } // sign them in as Guest else { LoadString (hInstAstral, IDS_GUEST, szGuest, sizeof(szGuest)); lstrcpy (szTmp, Control.WorkPath); lstrcat (szTmp, szGuest); _mkdir (szTmp); lstrcpy (Control.CurrentUser, szGuest); SaveUsername (szGuest, szGuest); } return TRUE; }