diff --git a/openvpn.c b/openvpn.c index 1eebf6a..b7c5202 100644 --- a/openvpn.c +++ b/openvpn.c @@ -880,6 +880,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) SetWindowPos(hwndDlg, NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE); PrintDebug(L"Window resized to = %d %d", rect.right, rect.bottom); } + ShowWindow(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), SW_HIDE); } else if (param->flags & FLAG_PASS_TOKEN) { @@ -887,11 +888,71 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) SetDlgItemText(hwndDlg, ID_TXT_DESCRIPTION, LoadLocalizedString(IDS_NFO_TOKEN_PASSWORD_REQUEST, param->id)); + + if (param->c->flags & FLAG_DISABLE_SAVE_PASS) + { + ShowWindow(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), SW_HIDE); + } + else + { + if (RecallSmartCardPin(param->c->config_name, password)) + { + if (password[0] != L'\0' && param->c->failed_auth_attempts == 0) + { + SetDlgItemTextW(hwndDlg, ID_EDT_RESPONSE, password); + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); + + const char * template = "password \"%s\" \"%%s\""; + char* fmt = malloc(strlen(template) + strlen(param->id)); + if (fmt) + { + sprintf(fmt, template, param->id); + PrintDebug(L"Send passwd to mgmt with format: '%hs'", fmt); + ManagementCommandFromInput(param->c, fmt, hwndDlg, ID_EDT_RESPONSE); + free(fmt); + + EndDialog(hwndDlg, IDOK); + return TRUE; + } + else /* no memory? send stop signal */ + { + WriteStatusLog(param->c, + L"GUI> ", + L"Out of memory in password dialog: sending stop signal", + false); + StopOpenVPN(param->c); + } + } + else if (param->c->failed_auth_attempts > 0) + { + SendMessage( + GetDlgItem(hwndDlg, ID_EDT_RESPONSE), EM_SETSEL, 0, MAKELONG(0, -1)); + + SetDlgItemTextW( + hwndDlg, ID_TXT_WARNING, LoadLocalizedString(IDS_NFO_KEY_PASS_RETRY)); + + // Extend window size for Warning + RECT rect = { 0 }; + GetWindowRect(hwndDlg, &rect); + rect.right -= rect.left; + rect.bottom -= rect.top; + + HWND warningText = GetDlgItem(hwndDlg, ID_TXT_WARNING); + RECT warningRect = { 0 }; + GetWindowRect(warningText, &warningRect); + + SetWindowPos(hwndDlg, NULL, 0, 0, rect.right, rect.bottom + warningRect.bottom - warningRect.top + DPI_SCALE(4), SWP_NOMOVE); + } + + SecureZeroMemory(password, sizeof(password)); + } + } } else { WriteStatusLog(param->c, L"GUI> ", L"Unknown password request", false); SetDlgItemText(hwndDlg, ID_TXT_DESCRIPTION, wstr); + ShowWindow(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), SW_HIDE); } free(wstr); @@ -931,7 +992,7 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { case ID_EDT_RESPONSE: - if (!(param->flags & FLAG_CR_ECHO)) + if (!(param->flags & FLAG_CR_ECHO) && HIWORD(wParam) != EN_KILLFOCUS) { ResetPasswordReveal(GetDlgItem(hwndDlg, ID_EDT_RESPONSE), GetDlgItem(hwndDlg, ID_PASSWORD_REVEAL), @@ -945,6 +1006,19 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) } break; + case ID_CHK_SAVE_PASS: + param->c->flags ^= FLAG_SAVE_KEY_PASS; + if (param->c->flags & FLAG_SAVE_KEY_PASS) + { + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_CHECKED); + } + else + { + DeleteSavedSmartCardPin(param->c->config_name); + Button_SetCheck(GetDlgItem(hwndDlg, ID_CHK_SAVE_PASS), BST_UNCHECKED); + } + break; + case IDOK: if (GetDlgItemTextW(hwndDlg, ID_EDT_RESPONSE, password, _countof(password)) && !validate_input(password, L"\n")) @@ -1001,6 +1075,11 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) PrintDebug(L"Send passwd to mgmt with format: '%hs'", fmt); ManagementCommandFromInput(param->c, fmt, hwndDlg, ID_EDT_RESPONSE); free(fmt); + + if (param->flags & FLAG_PASS_TOKEN && param->c->flags & FLAG_SAVE_KEY_PASS) + { + SaveSmartCardPin(param->c->config_name, password); + } } else /* no memory? send stop signal */ { diff --git a/plap/stub.c b/plap/stub.c index 02f425d..e45123b 100644 --- a/plap/stub.c +++ b/plap/stub.c @@ -129,6 +129,13 @@ SaveAuthPass(UNUSED const WCHAR *config_name, UNUSED const WCHAR *password) { return 1; } + +int +SaveSmartCardPin(UNUSED const WCHAR *config_name, UNUSED const WCHAR *username) +{ + return 1; +} + int SaveUsername(UNUSED const WCHAR *config_name, UNUSED const WCHAR *username) { @@ -151,12 +158,24 @@ RecallUsername(UNUSED const WCHAR *config_name, UNUSED WCHAR *username) return 0; } +int +RecallSmartCardPin(UNUSED const WCHAR *config_name, UNUSED WCHAR *pin) +{ + return 0; +} + void DeleteSavedAuthPass(UNUSED const WCHAR *config_name) { return; } +void +DeleteSavedSmartCardPin(const WCHAR *config_name) +{ + return; +} + void DeleteSavedKeyPass(UNUSED const WCHAR *config_name) { diff --git a/res/openvpn-gui-res-cs.rc b/res/openvpn-gui-res-cs.rc index 88d59b2..f6885c3 100644 --- a/res/openvpn-gui-res-cs.rc +++ b/res/openvpn-gui-res-cs.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Odpověď na výzvu" @@ -89,8 +89,10 @@ BEGIN LTEXT "Odpověď:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Zrušit", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Uložit heslo", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Zrušit", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-de.rc b/res/openvpn-gui-res-de.rc index c14b04a..f1fc7eb 100644 --- a/res/openvpn-gui-res-de.rc +++ b/res/openvpn-gui-res-de.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -89,8 +89,10 @@ BEGIN LTEXT "&Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Abbrechen", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Passwort &speichern", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Abbrechen", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-dk.rc b/res/openvpn-gui-res-dk.rc index 363b7e7..d220c35 100644 --- a/res/openvpn-gui-res-dk.rc +++ b/res/openvpn-gui-res-dk.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -90,8 +90,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuller", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Husk kodeord", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuller", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-en.rc b/res/openvpn-gui-res-en.rc index dd9ee1b..cb8d0b4 100644 --- a/res/openvpn-gui-res-en.rc +++ b/res/openvpn-gui-res-en.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -89,8 +89,10 @@ BEGIN LTEXT "&Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Cancel", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Cancel", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-es.rc b/res/openvpn-gui-res-es.rc index 524da42..559a768 100644 --- a/res/openvpn-gui-res-es.rc +++ b/res/openvpn-gui-res-es.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Cancelar", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fa.rc b/res/openvpn-gui-res-fa.rc index 0a10684..4779945 100644 --- a/res/openvpn-gui-res-fa.rc +++ b/res/openvpn-gui-res-fa.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST | WS_EX_RTLREADING | WS_EX_LAYOUTRTL CAPTION "OpenVPN – پاسخ چالش" @@ -91,8 +91,10 @@ BEGIN LTEXT "پاسخ :", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "بسیار خوب", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "لغو", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "نگه داشتن رمز عبور", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "بسیار خوب", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "لغو", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fi.rc b/res/openvpn-gui-res-fi.rc index 196a14c..3d61830 100644 --- a/res/openvpn-gui-res-fi.rc +++ b/res/openvpn-gui-res-fi.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Haastemenetelmä" @@ -89,8 +89,10 @@ BEGIN LTEXT "Vastaus:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Peruuta", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Tallenna salasana", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Peruuta", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-fr.rc b/res/openvpn-gui-res-fr.rc index cfd8253..777b646 100644 --- a/res/openvpn-gui-res-fr.rc +++ b/res/openvpn-gui-res-fr.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Réponse de défi" @@ -88,8 +88,10 @@ BEGIN LTEXT "Réponse:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuler", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Enregistrer mot de passe", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-it.rc b/res/openvpn-gui-res-it.rc index 5467459..40c54d9 100644 --- a/res/openvpn-gui-res-it.rc +++ b/res/openvpn-gui-res-it.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,10 @@ BEGIN LTEXT "&Risposta:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "&OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "&Annulla", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "&Ricorda password", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "&OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "&Annulla", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-jp.rc b/res/openvpn-gui-res-jp.rc index d3c73ac..ba66a74 100644 --- a/res/openvpn-gui-res-jp.rc +++ b/res/openvpn-gui-res-jp.rc @@ -79,7 +79,7 @@ BEGIN LTEXT "", ID_TXT_WARNING, 6, 108, 150, 10 END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - チャレンジ/レスポンス" @@ -90,8 +90,10 @@ BEGIN LTEXT "レスポンス(&R):", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK(&O)", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "キャンセル(&C)", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "パスワードを保存(&S)", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK(&O)", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "キャンセル(&C)", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-kr.rc b/res/openvpn-gui-res-kr.rc index debe5c0..35ca348 100644 --- a/res/openvpn-gui-res-kr.rc +++ b/res/openvpn-gui-res-kr.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 자격증명" @@ -90,8 +90,10 @@ BEGIN LTEXT "요청값:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "확인", IDOK, 25, 58, 50, 14, BS_PUSHBUTTON | WS_TABSTOP | WS_DISABLED - PUSHBUTTON "취소", IDCANCEL, 85, 58, 52, 14 + CHECKBOX "암호 저장", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "확인", IDOK, 25, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP | WS_DISABLED + PUSHBUTTON "취소", IDCANCEL, 85, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-nl.rc b/res/openvpn-gui-res-nl.rc index 8067db8..48d6306 100644 --- a/res/openvpn-gui-res-nl.rc +++ b/res/openvpn-gui-res-nl.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Annuleren", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Wachtwoord opslaan", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Annuleren", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-no.rc b/res/openvpn-gui-res-no.rc index cc35475..136a817 100644 --- a/res/openvpn-gui-res-no.rc +++ b/res/openvpn-gui-res-no.rc @@ -78,7 +78,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -89,8 +89,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Avbryt", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Husk passord", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-pl.rc b/res/openvpn-gui-res-pl.rc index eead00a..9ad886e 100644 --- a/res/openvpn-gui-res-pl.rc +++ b/res/openvpn-gui-res-pl.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Odpowiedź" @@ -90,8 +90,10 @@ BEGIN LTEXT "Odpowiedź:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Anuluj", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Zapisz hasło", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Anuluj", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-pt.rc b/res/openvpn-gui-res-pt.rc index 9889f01..ae514fe 100644 --- a/res/openvpn-gui-res-pt.rc +++ b/res/openvpn-gui-res-pt.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Resposta do Desafio" @@ -88,8 +88,10 @@ BEGIN LTEXT "Resposta:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Cancelar", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Salvar senha", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-ru.rc b/res/openvpn-gui-res-ru.rc index 1146264..ede7473 100644 --- a/res/openvpn-gui-res-ru.rc +++ b/res/openvpn-gui-res-ru.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN – Challenge Response" @@ -90,8 +90,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Отмена", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Запомнить", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Отмена", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-se.rc b/res/openvpn-gui-res-se.rc index e881d8a..8d3b777 100644 --- a/res/openvpn-gui-res-se.rc +++ b/res/openvpn-gui-res-se.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Avbryt", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-tr.rc b/res/openvpn-gui-res-tr.rc index a50ff64..aba48f9 100644 --- a/res/openvpn-gui-res-tr.rc +++ b/res/openvpn-gui-res-tr.rc @@ -79,7 +79,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -90,8 +90,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "Tamam", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Çıkış", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Save", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "Tamam", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Çıkış", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-ua.rc b/res/openvpn-gui-res-ua.rc index 8a47c21..baf4993 100644 --- a/res/openvpn-gui-res-ua.rc +++ b/res/openvpn-gui-res-ua.rc @@ -77,7 +77,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - Challenge Response" @@ -88,8 +88,10 @@ BEGIN LTEXT "Response:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "OK", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "Скасувати", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "Запам'ятати", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "OK", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "Скасувати", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-zh-hans.rc b/res/openvpn-gui-res-zh-hans.rc index 48645fb..d4f2003 100644 --- a/res/openvpn-gui-res-zh-hans.rc +++ b/res/openvpn-gui-res-zh-hans.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 质询响应" @@ -91,8 +91,10 @@ BEGIN LTEXT "响应:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "确定", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "取消", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "保存密码", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "确定", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/res/openvpn-gui-res-zh-hant.rc b/res/openvpn-gui-res-zh-hant.rc index e91c210..9833d1a 100644 --- a/res/openvpn-gui-res-zh-hant.rc +++ b/res/openvpn-gui-res-zh-hant.rc @@ -80,7 +80,7 @@ BEGIN END /* Challenge Response Dialog */ -ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 72 +ID_DLG_CHALLENGE_RESPONSE DIALOGEX 6, 18, 212, 90 STYLE WS_SIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_CENTER | DS_SETFOREGROUND EXSTYLE WS_EX_TOPMOST CAPTION "OpenVPN - 挑戰回應" @@ -91,8 +91,10 @@ BEGIN LTEXT "回應:", ID_LTEXT_RESPONSE, 6, 30, 50, 10 EDITTEXT ID_EDT_RESPONSE, 60, 27, 94, 12, ES_PASSWORD | ES_AUTOHSCROLL ICON ID_ICO_EYE, ID_PASSWORD_REVEAL, 156, 28, 14, 14, SS_ICON|SS_NOTIFY|SS_REALSIZEIMAGE - PUSHBUTTON "確認", IDOK, 20, 51, 50, 14, BS_PUSHBUTTON | WS_TABSTOP - PUSHBUTTON "取消", IDCANCEL, 90, 51, 52, 14 + CHECKBOX "儲存密碼", ID_CHK_SAVE_PASS, 60, 45, 100, 10 + PUSHBUTTON "確認", IDOK, 20, 65, 50, 14, BS_PUSHBUTTON | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 90, 65, 52, 14 + LTEXT "", ID_TXT_WARNING, 6, 86, 400, 10 END /* Status Dialog */ diff --git a/save_pass.c b/save_pass.c index cde660c..d2468ad 100644 --- a/save_pass.c +++ b/save_pass.c @@ -35,6 +35,7 @@ #define AUTH_PASS_DATA L"auth-data" #define ENTROPY_DATA L"entropy" #define AUTH_USER_DATA L"username" +#define AUTH_SMARTCARD_DATA L"auth-smartcard-pin" #define ENTROPY_LEN 16 static DWORD @@ -162,6 +163,12 @@ SaveAuthPass(const WCHAR *config_name, const WCHAR *password) return save_encrypted(config_name, password, AUTH_PASS_DATA); } +int +SaveSmartCardPin(const WCHAR *config_name, const WCHAR *pin) +{ + return save_encrypted(config_name, pin, AUTH_SMARTCARD_DATA); +} + /* * Returns 1 on success, 0 on failure. password should have space * for up to capacity wide chars incluing nul termination @@ -230,6 +237,12 @@ RecallAuthPass(const WCHAR *config_name, WCHAR *password) return recall_encrypted(config_name, password, USER_PASS_LEN, AUTH_PASS_DATA); } +int +RecallSmartCardPin(const WCHAR *config_name, WCHAR *pin) +{ + return recall_encrypted(config_name, pin, USER_PASS_LEN, AUTH_SMARTCARD_DATA); +} + int SaveUsername(const WCHAR *config_name, const WCHAR *username) { @@ -237,6 +250,7 @@ SaveUsername(const WCHAR *config_name, const WCHAR *username) SetConfigRegistryValueBinary(config_name, AUTH_USER_DATA, (BYTE *)username, len); return 1; } + /* * The buffer username should be have space for up to USER_PASS_LEN * WCHARs including nul. @@ -268,6 +282,12 @@ DeleteSavedAuthPass(const WCHAR *config_name) DeleteConfigRegistryValue(config_name, AUTH_PASS_DATA); } +void +DeleteSavedSmartCardPin(const WCHAR *config_name) +{ + DeleteConfigRegistryValue(config_name, AUTH_SMARTCARD_DATA); +} + /* delete saved config-specific auth password and private key passphrase */ void DeleteSavedPasswords(const WCHAR *config_name) @@ -275,6 +295,7 @@ DeleteSavedPasswords(const WCHAR *config_name) DeleteConfigRegistryValue(config_name, KEY_PASS_DATA); DeleteConfigRegistryValue(config_name, AUTH_PASS_DATA); DeleteConfigRegistryValue(config_name, ENTROPY_DATA); + DeleteConfigRegistryValue(config_name, AUTH_SMARTCARD_DATA); } /* check if auth password is saved */ diff --git a/save_pass.h b/save_pass.h index 3f895d2..25f27a0 100644 --- a/save_pass.h +++ b/save_pass.h @@ -31,16 +31,22 @@ int SaveKeyPass(const WCHAR *config_name, const WCHAR *password); int SaveAuthPass(const WCHAR *config_name, const WCHAR *password); +int SaveSmartCardPin(const WCHAR *config_name, const WCHAR *pin); + int SaveUsername(const WCHAR *config_name, const WCHAR *username); int RecallKeyPass(const WCHAR *config_name, WCHAR *password); int RecallAuthPass(const WCHAR *config_name, WCHAR *password); +int RecallSmartCardPin(const WCHAR *config_name, WCHAR *pin); + int RecallUsername(const WCHAR *config_name, WCHAR *username); void DeleteSavedAuthPass(const WCHAR *config_name); +void DeleteSavedSmartCardPin(const WCHAR *config_name); + void DeleteSavedKeyPass(const WCHAR *config_name); void DeleteSavedPasswords(const WCHAR *config_name);