コード例 #1
0
ファイル: openvpn.c プロジェクト: selvanair/openvpn-gui
/*
 * 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;
}
コード例 #2
0
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;
}