| 243 |
} |
} |
| 244 |
} |
} |
| 245 |
|
|
|
typedef struct { |
|
|
int tab_focus_entered; |
|
|
WNDPROC proc_org; |
|
|
size_t str_len; |
|
|
} username_proc_data_t; |
|
|
|
|
|
static LRESULT CALLBACK username_proc(HWND hWnd, UINT msg, |
|
|
WPARAM wParam, LPARAM lParam) |
|
|
{ |
|
|
username_proc_data_t *data = (username_proc_data_t *)GetWindowLongPtr(hWnd, GWLP_USERDATA); |
|
|
const WNDPROC ProcOrg = data->proc_org; |
|
|
const LRESULT result = CallWindowProc(ProcOrg, hWnd, msg, wParam, lParam); |
|
|
|
|
|
|
|
|
switch (msg) { |
|
|
case WM_CHAR: |
|
|
case WM_SETTEXT: |
|
|
if (data->tab_focus_entered == 0) { |
|
|
// ユーザー名が入力されていた場合、オプションを使うことはないので、 |
|
|
// tabでのフォーカス移動時、オプションボタンをパスするようにする |
|
|
// 従来と同じキー操作でユーザー名とパスフレーズを入力可能とする |
|
|
const int len = GetWindowTextLength(hWnd); |
|
|
#if 0 |
|
|
if (len > 0) { |
|
|
// ユーザー名を入力して、TABを押したときに引っかかった感じがする場合がある |
|
|
// そこで一度でも文字入力があったら、TABストップ不要に倒す |
|
|
data->tab_focus_entered = 1; |
|
|
} |
|
|
#endif |
|
|
if ((data->str_len == 0 && len != 0) || |
|
|
(data->str_len != 0 && len == 0)) { |
|
|
// ユーザー名の文字長が 0になる or 0ではなくなる 時のみ処理 |
|
|
const HWND dlg = GetParent(hWnd); |
|
|
const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); |
|
|
LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); |
|
|
|
|
|
if (len > 0) { |
|
|
// 不要tabstop |
|
|
style = style & (~(LONG_PTR)WS_TABSTOP); |
|
|
} |
|
|
else { |
|
|
// 要tabstop |
|
|
style = style | WS_TABSTOP; |
|
|
} |
|
|
SetWindowLongPtr(hWndOption, GWL_STYLE, style); |
|
|
data->str_len = len; |
|
|
} |
|
|
} |
|
|
break; |
|
|
case WM_NCDESTROY: |
|
|
free(data); |
|
|
break; |
|
|
} |
|
|
return result; |
|
|
} |
|
|
|
|
| 246 |
static void init_auth_dlg(PTInstVar pvar, HWND dlg, BOOL *UseControlChar) |
static void init_auth_dlg(PTInstVar pvar, HWND dlg, BOOL *UseControlChar) |
| 247 |
{ |
{ |
| 248 |
const static DlgTextInfo text_info[] = { |
const static DlgTextInfo text_info[] = { |
| 302 |
SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg); |
SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg); |
| 303 |
} |
} |
| 304 |
|
|
|
// usernameのサブクラス化 |
|
|
{ |
|
|
HWND hWndUserName = GetDlgItem(dlg, IDC_SSHUSERNAME); |
|
|
username_proc_data_t *data = (username_proc_data_t *)malloc(sizeof(username_proc_data_t)); |
|
|
if (data != NULL) { |
|
|
SetWindowLongPtr(hWndUserName, GWLP_USERDATA, (LONG_PTR)data); |
|
|
data->tab_focus_entered = 0; |
|
|
data->str_len = 0; |
|
|
data->proc_org = |
|
|
(WNDPROC)SetWindowLongPtr(hWndUserName, GWLP_WNDPROC, (LONG_PTR)username_proc); |
|
|
} |
|
|
} |
|
|
|
|
| 305 |
if (pvar->auth_state.user != NULL) { |
if (pvar->auth_state.user != NULL) { |
| 306 |
SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->auth_state.user); |
SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->auth_state.user); |
| 307 |
EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); |
EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); |
| 780 |
} |
} |
| 781 |
|
|
| 782 |
|
|
|
BOOL autologin_sent_none; |
|
| 783 |
static INT_PTR CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam, |
static INT_PTR CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam, |
| 784 |
LPARAM lParam) |
LPARAM lParam) |
| 785 |
{ |
{ |
| 788 |
const int IDC_TIMER3 = 302; // challenge で ask4passwd でCheckAuthListFirst が FALSE のとき |
const int IDC_TIMER3 = 302; // challenge で ask4passwd でCheckAuthListFirst が FALSE のとき |
| 789 |
const int autologin_timeout = 10; // ミリ秒 |
const int autologin_timeout = 10; // ミリ秒 |
| 790 |
PTInstVar pvar; |
PTInstVar pvar; |
| 791 |
|
static BOOL autologin_sent_none; |
| 792 |
static BOOL UseControlChar; |
static BOOL UseControlChar; |
| 793 |
static BOOL ShowPassPhrase; |
static BOOL ShowPassPhrase; |
| 794 |
static HICON hIconDropdown; |
static HICON hIconDropdown; |
| 795 |
|
static size_t username_str_len; |
| 796 |
TCHAR uimsg[MAX_UIMSG]; |
TCHAR uimsg[MAX_UIMSG]; |
| 797 |
|
|
| 798 |
switch (msg) { |
switch (msg) { |
| 803 |
|
|
| 804 |
UseControlChar = TRUE; |
UseControlChar = TRUE; |
| 805 |
ShowPassPhrase = FALSE; |
ShowPassPhrase = FALSE; |
| 806 |
|
username_str_len = 0; |
| 807 |
init_auth_dlg(pvar, dlg, &UseControlChar); |
init_auth_dlg(pvar, dlg, &UseControlChar); |
| 808 |
|
|
| 809 |
// "▼"画像をセットする |
// "▼"画像をセットする |
| 968 |
return TRUE; |
return TRUE; |
| 969 |
|
|
| 970 |
case IDC_SSHUSERNAME: |
case IDC_SSHUSERNAME: |
| 971 |
// ユーザ名がフォーカスを失ったとき (2007.9.29 maya) |
switch (HIWORD(wParam)) { |
| 972 |
if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) && |
case EN_KILLFOCUS: { |
| 973 |
(pvar->ssh_state.status_flags & STATUS_HOST_OK) && |
// ユーザ名がフォーカスを失ったとき (2007.9.29 maya) |
| 974 |
HIWORD(wParam) == EN_KILLFOCUS) { |
if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) && |
| 975 |
// 設定が有効でまだ取りに行っていないなら |
(pvar->ssh_state.status_flags & STATUS_HOST_OK)) { |
| 976 |
if (SSHv2(pvar) && |
// 設定が有効でまだ取りに行っていないなら |
| 977 |
pvar->session_settings.CheckAuthListFirst && |
if (SSHv2(pvar) && |
| 978 |
!pvar->tryed_ssh2_authlist) { |
pvar->session_settings.CheckAuthListFirst && |
| 979 |
// ダイアログのユーザ名を反映 |
!pvar->tryed_ssh2_authlist) { |
| 980 |
if (pvar->auth_state.user == NULL) { |
// ダイアログのユーザ名を反映 |
| 981 |
pvar->auth_state.user = |
if (pvar->auth_state.user == NULL) { |
| 982 |
alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); |
pvar->auth_state.user = |
| 983 |
} |
alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); |
| 984 |
|
} |
| 985 |
|
|
| 986 |
// ユーザ名が入力されているかチェックする |
// ユーザ名が入力されているかチェックする |
| 987 |
if (strlen(pvar->auth_state.user) == 0) { |
if (strlen(pvar->auth_state.user) == 0) { |
| 988 |
return FALSE; |
return FALSE; |
| 989 |
} |
} |
| 990 |
|
|
| 991 |
// ユーザ名を変更させない |
// ユーザ名を変更させない |
| 992 |
EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); |
EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); |
| 993 |
EnableWindow(GetDlgItem(dlg, IDC_USERNAME_OPTION), FALSE); |
EnableWindow(GetDlgItem(dlg, IDC_USERNAME_OPTION), FALSE); |
| 994 |
|
|
| 995 |
// 認証メソッド none を送る |
// 認証メソッド none を送る |
| 996 |
do_SSH2_userauth(pvar); |
do_SSH2_userauth(pvar); |
| 997 |
return TRUE; |
return TRUE; |
| 998 |
|
} |
| 999 |
} |
} |
| 1000 |
|
return FALSE; |
| 1001 |
|
} |
| 1002 |
|
case EN_CHANGE: { |
| 1003 |
|
// ユーザー名が入力されていた場合、オプションを使うことはないので、 |
| 1004 |
|
// tabでのフォーカス移動時、オプションボタンをパスするようにする |
| 1005 |
|
// 従来と同じキー操作でユーザー名とパスフレーズを入力可能とする |
| 1006 |
|
HWND hWnd = (HWND)lParam; |
| 1007 |
|
const int len = GetWindowTextLength(hWnd); |
| 1008 |
|
if ((username_str_len == 0 && len != 0) || |
| 1009 |
|
(username_str_len != 0 && len == 0)) { |
| 1010 |
|
// ユーザー名の文字長が 0になる or 0ではなくなる 時のみ処理 |
| 1011 |
|
const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); |
| 1012 |
|
LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); |
| 1013 |
|
|
| 1014 |
|
if (len > 0) { |
| 1015 |
|
// 不要tabstop |
| 1016 |
|
style = style & (~(LONG_PTR)WS_TABSTOP); |
| 1017 |
|
} |
| 1018 |
|
else { |
| 1019 |
|
// 要tabstop |
| 1020 |
|
style = style | WS_TABSTOP; |
| 1021 |
|
} |
| 1022 |
|
SetWindowLongPtr(hWndOption, GWL_STYLE, style); |
| 1023 |
|
} |
| 1024 |
|
username_str_len = len; |
| 1025 |
|
return FALSE; |
| 1026 |
|
} |
| 1027 |
} |
} |
|
|
|
| 1028 |
return FALSE; |
return FALSE; |
| 1029 |
|
|
| 1030 |
case IDC_SSHUSEPASSWORD: |
case IDC_SSHUSEPASSWORD: |