Revision: 8595 https://osdn.net/projects/ttssh2/scm/svn/commits/8595 Author: zmatsuo Date: 2020-03-13 00:52:09 +0900 (Fri, 13 Mar 2020) Log Message: ----------- パスフレーズの伏せ字を再設定したときデフォルトに戻るようにした - CallWindowProcA() を使用していると ANSI として扱われるようだ - _CallWindowProcW() を使用するようにした - 伏せ字を取得して再設定する - Unicodeのときデフォルトは U+25CF (BLACK CIRCLE) - ANSIのときデフォルトは 0x2A "*" (ASTERISK) - 環境によって異なるかもしない Modified Paths: -------------- trunk/ttssh2/ttxssh/auth.c -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/auth.c =================================================================== --- trunk/ttssh2/ttxssh/auth.c 2020-03-12 15:51:55 UTC (rev 8594) +++ trunk/ttssh2/ttxssh/auth.c 2020-03-12 15:52:09 UTC (rev 8595) @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 1998-2001, Robert O'Callahan * (c) 2004-2020 TeraTerm Project * All rights reserved. @@ -105,11 +105,11 @@ case WM_CHAR: if ((data->UseControlChar == NULL || *data->UseControlChar == TRUE) && (GetKeyState(VK_CONTROL) & 0x8000) != 0) - { // \x90\xA7\x8C䕶\x8E\x9A\x82\xF0\x8Eg\x97p\x82\xB7\x82\xE9 && CTRL\x83L\x81[\x82\xAA\x89\x9F\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9 - TCHAR chars[] = { (TCHAR) wParam, 0 }; + { // 制御文字を使用する && CTRLキーが押されている + char chars[] = { (char) wParam, 0 }; - SendMessage(control, EM_REPLACESEL, (WPARAM) TRUE, - (LPARAM) (TCHAR *) chars); + SendMessageA(control, EM_REPLACESEL, (WPARAM) TRUE, + (LPARAM) (TCHAR *) chars); if (data->tipwin == NULL) { TCHAR uimsg[MAX_UIMSG]; @@ -137,8 +137,7 @@ break; } - result = CallWindowProc((WNDPROC)data->ProcOrg, - control, msg, wParam, lParam); + result = _CallWindowProcW(data->ProcOrg, control, msg, wParam, lParam); if (msg == WM_NCDESTROY) { SetWindowLongPtr(control, GWLP_WNDPROC, (LONG_PTR)data->ProcOrg); @@ -157,8 +156,8 @@ data->pvar = pvar; data->tipwin = NULL; data->UseControlChar = UseControlChar; - SetWindowLongPtr(passwordControl, GWLP_WNDPROC, (LONG_PTR)password_wnd_proc); - SetWindowLongPtr(passwordControl, GWLP_USERDATA, (LONG_PTR)data); + _SetWindowLongPtrW(passwordControl, GWLP_WNDPROC, (LONG_PTR)password_wnd_proc); + _SetWindowLongPtrW(passwordControl, GWLP_USERDATA, (LONG_PTR)data); SetFocus(passwordControl); } @@ -278,7 +277,7 @@ init_auth_machine_banner(pvar, dlg); init_password_control(pvar, dlg, IDC_SSHPASSWORD, UseControlChar); - // \x94F\x8F؎\xB8\x94s\x8C\xE3\x82̓\x89\x83x\x83\x8B\x82\xF0\x8F\x91\x82\xAB\x8A\xB7\x82\xA6 + // 認証失敗後はラベルを書き換え if (pvar->auth_state.failed_method != SSH_AUTH_NONE) { /* must be retrying a failed attempt */ wchar_t uimsg[MAX_UIMSG]; @@ -289,7 +288,7 @@ default_method = pvar->auth_state.failed_method; } - // \x83p\x83X\x83\x8F\x81[\x83h\x82\xF0\x8Ao\x82\xA6\x82Ă\xA8\x82\xAD\x83`\x83F\x83b\x83N\x83{\x83b\x83N\x83X\x82ɂ̓f\x83t\x83H\x83\x8B\x83g\x82ŗL\x8C\xF8\x82Ƃ\xB7\x82\xE9 (2006.8.3 yutaka) + // パスワードを覚えておくチェックボックスにはデフォルトで有効とする (2006.8.3 yutaka) if (pvar->ts_SSH->remember_password) { SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_CHECKED, 0); } else { @@ -296,10 +295,10 @@ SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_UNCHECKED, 0); } - // ForwardAgent \x82̐ݒ\xE8\x82f\x82\xB7\x82\xE9 (2008.12.4 maya) + // ForwardAgent の設定を反映する (2008.12.4 maya) CheckDlgButton(dlg, IDC_FORWARD_AGENT, pvar->settings.ForwardAgent); - // SSH \x83o\x81[\x83W\x83\x87\x83\x93\x82ɂ\xE6\x82\xC1\x82\xC4 TIS \x82̃\x89\x83x\x83\x8B\x82\xF0\x8F\x91\x82\xAB\x8A\xB7\x82\xA6 + // SSH バージョンによって TIS のラベルを書き換え if (pvar->settings.ssh_protocol_version == 1) { UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar, "Use challenge/response(&TIS) to log in"); @@ -327,12 +326,12 @@ else { switch(pvar->session_settings.DefaultUserType) { case 0: - // \x93\xFC\x97͂\xB5\x82Ȃ\xA2 + // 入力しない break; case 1: // use DefaultUserName if (pvar->session_settings.DefaultUserName[0] == 0) { - // \x81u\x93\xFC\x97͂\xB5\x82Ȃ\xA2\x81v\x82ɂ\xB5\x82Ă\xA8\x82\xAD + // 「入力しない」にしておく pvar->session_settings.DefaultUserType = 0; } else { SetDlgItemText(dlg, IDC_SSHUSERNAME, @@ -349,7 +348,7 @@ break; } default: - // \x93\xFC\x97͂\xB5\x82Ȃ\xA2\x82ɂ\xB5\x82Ă\xA8\x82\xAD + // 入力しないにしておく pvar->session_settings.DefaultUserType = 0; } } @@ -382,7 +381,7 @@ EnableWindow(GetDlgItem(dlg, IDC_RSAFILENAME), FALSE); } - // /auth=challenge \x82\xF0\x92lj\xC1 (2007.10.5 maya) + // /auth=challenge を追加 (2007.10.5 maya) } else if (pvar->ssh2_authmethod == SSH_AUTH_TIS) { CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSETIS); EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE); @@ -389,7 +388,7 @@ EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD_OPTION), FALSE); SetDlgItemText(dlg, IDC_SSHPASSWORD, ""); - // /auth=pageant \x82\xF0\x92lj\xC1 + // /auth=pageant を追加 } else if (pvar->ssh2_authmethod == SSH_AUTH_PAGEANT) { CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPAGEANT); EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE); @@ -397,14 +396,14 @@ SetDlgItemText(dlg, IDC_SSHPASSWORD, ""); } else { - // \x83f\x83t\x83H\x83\x8B\x83g\x82̔F\x8F\x81\x83\\x83b\x83h\x82\xF0\x83_\x83C\x83A\x83\x8D\x83O\x82ɔ\xBD\x89f + // デフォルトの認証メソッドをダイアログに反映 set_auth_options_status(dlg, auth_types_to_control_IDs[default_method]); update_server_supported_types(pvar, dlg); - // \x83z\x83X\x83g\x8Am\x94F\x83_\x83C\x83A\x83\x8D\x83O\x82\xA9\x82甲\x82\xAF\x82\xBD\x82Ƃ\xAB=\x83E\x83B\x83\x93\x83h\x83E\x82\xAA\x83A\x83N\x83e\x83B\x83u\x82ɂȂ\xC1\x82\xBD\x82Ƃ\xAB - // \x82\xC9 SetFocus \x82\xAA\x8E\xC0\x8Ds\x82\xB3\x82\xEA\x81A\x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x82œn\x82\xB3\x82ꂽ\x94F\x8Fؕ\x{33AE0AA}\x8F㏑\x82\xAB\x82\xB3\x82\xEA\x82\xC4 - // \x82\xB5\x82܂\xA4\x82̂ŁA\x8E\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x97L\x8C\xF8\x8E\x9E\x82\xCD SetFocus \x82\xB5\x82Ȃ\xA2 (2009.1.31 maya) + // ホスト確認ダイアログから抜けたとき=ウィンドウがアクティブになったとき + // に SetFocus が実行され、コマンドラインで渡された認証方式が上書きされて + // しまうので、自動ログイン有効時は SetFocus しない (2009.1.31 maya) if (default_method == SSH_AUTH_TIS) { /* we disabled the password control, so fix the focus */ SetFocus(GetDlgItem(dlg, IDC_SSHUSETIS)); @@ -422,11 +421,11 @@ SetFocus(GetDlgItem(dlg, IDC_SSHPASSWORD)); } - // '/I' \x8Ew\x92肪\x82\xA0\x82\xE9\x82Ƃ\xAB\x82̂ݍŏ\xAC\x89\xBB\x82\xB7\x82\xE9 (2005.9.5 yutaka) + // '/I' 指定があるときのみ最小化する (2005.9.5 yutaka) if (pvar->ts->Minimize) { - //20050822\x92lj\xC1 start T.Takahashi + //20050822追加 start T.Takahashi ShowWindow(dlg,SW_MINIMIZE); - //20050822\x92lj\xC1 end T.Takahashi + //20050822追加 end T.Takahashi } } @@ -452,8 +451,8 @@ ZeroMemory(¶ms, sizeof(params)); params.lStructSize = get_OPENFILENAME_SIZE(); params.hwndOwner = parent; - // \x83t\x83B\x83\x8B\x83^\x82̒lj\xC1 (2004.12.19 yutaka) - // 3\x83t\x83@\x83C\x83\x8B\x83t\x83B\x83\x8B\x83^\x82̒lj\xC1 (2005.4.26 yutaka) + // フィルタの追加 (2004.12.19 yutaka) + // 3ファイルフィルタの追加 (2005.4.26 yutaka) UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar, "identity files\\0identity;id_rsa;id_dsa;id_ecdsa;id_ed25519;*.ppk;*.pem\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0id_ecdsa(SSH2)\\0id_ecdsa\\0id_ed25519(SSH2)\\0id_ed25519\\0PuTTY(*.ppk)\\0*.ppk\\0PEM files(*.pem)\\0*.pem\\0all(*.*)\\0*.*\\0\\0"); memcpy(filter, pvar->ts->UIMsg, sizeof(filter)); @@ -598,7 +597,7 @@ { char buf[1024]; - // \x83t\x83@\x83C\x83\x8B\x82\xAA\x8AJ\x82\xAF\x82\xBD\x8Fꍇ\x82̓t\x83@\x83C\x83\x8B\x8C`\x8E\xAE\x82\xAA\x95s\x96\xBE\x82ł\xE0\x93ǂݍ\x9E\x82\xF1\x82ł݂\xE9 + // ファイルが開けた場合はファイル形式が不明でも読み込んでみる if (fp != NULL) { key_pair = read_SSH2_private_key(pvar, fp, password, &invalid_passphrase, @@ -613,8 +612,8 @@ "read error SSH2 private key file\r\n%s"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg); notify_nonfatal_error(pvar, buf); - // \x82\xB1\x82\xB1\x82ɗ\x88\x82\xBD\x82Ƃ\xA2\x82\xA4\x82\xB1\x82Ƃ\xCD SSH2 \x94閧\x8C\xAE\x83t\x83@\x83C\x83\x8B\x82\xAA\x8AJ\x82\xAF\x82Ȃ\xA2\x82̂\xC5 - // \x8C\xAE\x83t\x83@\x83C\x83\x8B\x82̑I\x91\xF0\x83{\x83^\x83\x93\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x88ڂ\xB7 + // ここに来たということは SSH2 秘密鍵ファイルが開けないので + // 鍵ファイルの選択ボタンにフォーカスを移す SetFocus(GetDlgItem(dlg, IDC_CHOOSERSAFILE)); destroy_malloced_string(&password); return FALSE; @@ -627,7 +626,7 @@ "read error SSH2 private key file\r\n%s"); _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg); notify_nonfatal_error(pvar, buf); - // \x83p\x83X\x83t\x83\x8C\x81[\x83Y\x82\xAA\x8C\xAE\x82ƈ\xEA\x92v\x82\xB5\x82Ȃ\xA9\x82\xC1\x82\xBD\x8Fꍇ\x82\xCDIDC_SSHPASSWORD\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x88ڂ\xB7 (2006.10.29 yasuhide) + // パスフレーズが鍵と一致しなかった場合はIDC_SSHPASSWORDにフォーカスを移す (2006.10.29 yasuhide) if (invalid_passphrase) { HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD); @@ -651,7 +650,7 @@ pvar->pageant_keycurrent = 0; pvar->pageant_keyfinal=FALSE; - // Pageant \x82ƒʐM + // Pageant と通信 if (SSHv1(pvar)) { pvar->pageant_keylistlen = putty_get_ssh1_keylist(&pvar->pageant_key); } @@ -667,7 +666,7 @@ } pvar->pageant_curkey = pvar->pageant_key; - // \x8C\xAE\x82̐\x94 + // 鍵の数 pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey); if (pvar->pageant_keycount == 0) { UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar, @@ -689,16 +688,16 @@ alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); } - // \x83p\x83X\x83\x8F\x81[\x83h\x82̕ۑ\xB6\x82\xF0\x82\xB7\x82邩\x82ǂ\xA4\x82\xA9\x82\xF0\x8C\x88\x82߂\xE9 (2006.8.3 yutaka) + // パスワードの保存をするかどうかを決める (2006.8.3 yutaka) if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) { - pvar->settings.remember_password = 1; // \x8Ao\x82\xA6\x82Ă\xA8\x82\xAD + pvar->settings.remember_password = 1; // 覚えておく pvar->ts_SSH->remember_password = 1; } else { - pvar->settings.remember_password = 0; // \x82\xB1\x82\xB1\x82ł\xB7\x82\xC1\x82\xA9\x82\xE8\x96Y\x82\xEA\x82\xE9 + pvar->settings.remember_password = 0; // ここですっかり忘れる pvar->ts_SSH->remember_password = 0; } - // \x8C\xF6\x8AJ\x8C\xAE\x94F\x8F̏ꍇ\x81A\x83Z\x83b\x83V\x83\x87\x83\x93\x95\xA1\x90\xBB\x8E\x9E\x82Ƀp\x83X\x83\x8F\x81[\x83h\x82\xF0\x8Eg\x82\xA2\x89\xBD\x82\xA2\x82̂ʼn\xF0\x95\xFA\x82\xB5\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9\x81B + // 公開鍵認証の場合、セッション複製時にパスワードを使い回したいので解放しないようにする。 // (2005.4.8 yutaka) if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) { pvar->auth_state.cur_cred.password = password; @@ -749,12 +748,12 @@ } /** - * \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xA9\x82\xE7ANSI\x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9 - * \x95\xB6\x8E\x9A\x97\xAA\x95K\x97v\x82ȂƂ\xAB\x82\xCDstrlen()\x82\xB7\x82邱\x82\xC6 + * クリップボードからANSI文字列を取得する + * 文字列長が必要なときはstrlen()すること * @param hWnd - * @param emtpy TRUE\x82̂Ƃ\xAB\x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xF0\x8B\xF3\x82ɂ\xB7\x82\xE9 - * @retval \x95\xB6\x8E\x9A\x97\xF1\x82ւ̃|\x83C\x83\x93\x83^ \x8Eg\x97p\x8C\xE3free()\x82\xB7\x82邱\x82\xC6 - * \x95\xB6\x8E\x9A\x82\xAA\x82Ȃ\xA2(\x82܂\xBD\x82̓G\x83\x89\x81[\x8E\x9E)\x82\xCDNULL + * @param emtpy TRUEのときクリップボードを空にする + * @retval 文字列へのポインタ 使用後free()すること + * 文字がない(またはエラー時)はNULL */ char *GetClipboardTextA(HWND hWnd, BOOL empty) { @@ -791,10 +790,10 @@ static INT_PTR CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { - const int IDC_TIMER1 = 300; // \x8E\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x82\xAA\x97L\x8C\xF8\x82ȂƂ\xAB - const int IDC_TIMER2 = 301; // \x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82Ă\xA2\x82郁\x83\\x83b\x83h\x82\xF0\x8E\xA9\x93\xAE\x83`\x83F\x83b\x83N(CheckAuthListFirst) - const int IDC_TIMER3 = 302; // challenge \x82\xC5 ask4passwd \x82\xC5CheckAuthListFirst \x82\xAA FALSE \x82̂Ƃ\xAB - const int autologin_timeout = 10; // \x83~\x83\x8A\x95b + const int IDC_TIMER1 = 300; // 自動ログインが有効なとき + const int IDC_TIMER2 = 301; // サポートされているメソッドを自動チェック(CheckAuthListFirst) + const int IDC_TIMER3 = 302; // challenge で ask4passwd でCheckAuthListFirst が FALSE のとき + const int autologin_timeout = 10; // ミリ秒 PTInstVar pvar; static BOOL autologin_sent_none; static BOOL UseControlChar; @@ -801,6 +800,7 @@ static BOOL ShowPassPhrase; static HICON hIconDropdown; static size_t username_str_len; + static wchar_t password_char; // 伏せ字キャラクタ TCHAR uimsg[MAX_UIMSG]; switch (msg) { @@ -812,29 +812,30 @@ UseControlChar = TRUE; ShowPassPhrase = FALSE; username_str_len = 0; + password_char = 0; init_auth_dlg(pvar, dlg, &UseControlChar); - // "\x81\xA5"\x89摜\x82\xF0\x83Z\x83b\x83g\x82\xB7\x82\xE9 + // "▼"画像をセットする hIconDropdown = LoadImage(hInst, MAKEINTRESOURCE(IDI_DROPDOWN), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); SendMessage(GetDlgItem(dlg, IDC_USERNAME_OPTION), BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIconDropdown); SendMessage(GetDlgItem(dlg, IDC_SSHPASSWORD_OPTION), BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIconDropdown); - // SSH2 autologin\x82\xAA\x97L\x8C\xF8\x82̏ꍇ\x82́A\x83^\x83C\x83}\x82\xF0\x8Ed\x8A|\x82\xAF\x82\xE9\x81B (2004.12.1 yutaka) + // SSH2 autologinが有効の場合は、タイマを仕掛ける。 (2004.12.1 yutaka) if (pvar->ssh2_autologin == 1) { autologin_sent_none = FALSE; SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0); } else { - // \x83T\x83|\x81[\x83g\x82\xB3\x82\xEA\x82Ă\xA2\x82郁\x83\\x83b\x83h\x82\xF0\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9\x81B(2007.9.24 maya) - // \x90ݒ肪\x97L\x8C\xF8\x82ŁA\x82܂\xBE\x8E\xE6\x82\xE8\x82ɍs\x82\xC1\x82Ă\xA8\x82炸\x81A\x83\x86\x81[\x83U\x96\xBC\x82\xAA\x8Am\x92肵\x82Ă\xA2\x82\xE9 + // サポートされているメソッドをチェックする。(2007.9.24 maya) + // 設定が有効で、まだ取りに行っておらず、ユーザ名が確定している if (pvar->session_settings.CheckAuthListFirst && !pvar->tryed_ssh2_authlist && GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) { SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0); } - // /auth=challenge \x82\xC6 /ask4passwd \x82\xAA\x8Ew\x92肳\x82\xEA\x82Ă\xA2\x82ă\x86\x81[\x83U\x96\xBC\x82\xAA\x8Am\x92肵\x82Ă\xA2\x82\xE9 - // \x8Fꍇ\x82́AOK \x83{\x83^\x83\x93\x82\xF0\x89\x9F\x82\xB5\x82\xC4 TIS auth \x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8Fo\x82\xB7 + // /auth=challenge と /ask4passwd が指定されていてユーザ名が確定している + // 場合は、OK ボタンを押して TIS auth ダイアログを出す else if (pvar->ssh2_authmethod == SSH_AUTH_TIS && pvar->ask4passwd && GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) { @@ -846,9 +847,9 @@ case WM_TIMER: pvar = (PTInstVar) GetWindowLongPtr(dlg, DWLP_USER); - // \x94F\x8F؏\x80\x94\x{142A82}ł\xAB\x82Ă\xA9\x82\xE7\x81A\x94F\x8Ff\x81[\x83^\x82𑗐M\x82\xB7\x82\xE9\x81B\x91\x81\x82\xB7\x82\xAC\x82\xE9\x82ƁA\x97\x8E\x82\xBF\x82\xE9\x81B(2004.12.16 yutaka) + // 認証準備ができてから、認証データを送信する。早すぎると、落ちる。(2004.12.16 yutaka) if (wParam == IDC_TIMER1) { - // \x8E\xA9\x93\xAE\x83\x8D\x83O\x83C\x83\x93\x82̂\xBD\x82\xDF + // 自動ログインのため if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) && (pvar->ssh_state.status_flags & STATUS_HOST_OK)) { if (SSHv2(pvar) && @@ -857,27 +858,27 @@ if (!autologin_sent_none) { autologin_sent_none = TRUE; - // \x83_\x83C\x83A\x83\x8D\x83O\x82̃\x86\x81[\x83U\x96\xBC\x82\xF0\x8E擾\x82\xB7\x82\xE9 + // ダイアログのユーザ名を取得する if (pvar->auth_state.user == NULL) { pvar->auth_state.user = alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); } - // CheckAuthListFirst \x82\xAA TRUE \x82̂Ƃ\xAB\x82\xCD AuthList \x82\xAA\x8BA\x82\xC1\x82Ă\xAB\x82Ă\xA2\x82Ȃ\xA2\x82\xC6 - // IDOK \x82\xF0\x89\x9F\x82\xB5\x82Ă\xE0\x90i\x82܂Ȃ\xA2\x82̂ŁA\x94F\x8F\x81\x83\\x83b\x83h none \x82𑗂\xE9 (2008.10.12 maya) + // CheckAuthListFirst が TRUE のときは AuthList が帰ってきていないと + // IDOK を押しても進まないので、認証メソッド none を送る (2008.10.12 maya) do_SSH2_userauth(pvar); } //else { - // none \x82𑗂\xC1\x82Ă\xA9\x82\xE7\x8BA\x82\xC1\x82Ă\xAD\x82\xE9\x82܂ő҂\xC2 + // none を送ってから帰ってくるまで待つ //} } else { - // SSH1 \x82̂Ƃ\xAB - // \x82܂\xBD\x82\xCD CheckAuthListFirst \x82\xAA FALSE \x82̂Ƃ\xAB - // \x82܂\xBD\x82\xCD CheckAuthListFirst TRUE \x82ŁAauthlist \x82\xAA\x8BA\x82\xC1\x82Ă\xAB\x82\xBD\x82\xA0\x82\xC6 + // SSH1 のとき + // または CheckAuthListFirst が FALSE のとき + // または CheckAuthListFirst TRUE で、authlist が帰ってきたあと KillTimer(dlg, IDC_TIMER1); - // \x83_\x83C\x83A\x83\x8D\x83O\x82̃\x86\x81[\x83U\x96\xBC\x82\xF0\x8E擾\x82\xB7\x82\xE9 + // ダイアログのユーザ名を取得する if (pvar->auth_state.user == NULL) { pvar->auth_state.user = alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); @@ -888,38 +889,38 @@ } } else if (wParam == IDC_TIMER2) { - // authlist \x82邽\x82\xDF + // authlist を得るため if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) && (pvar->ssh_state.status_flags & STATUS_HOST_OK)) { if (SSHv2(pvar)) { KillTimer(dlg, IDC_TIMER2); - // \x83_\x83C\x83A\x83\x8D\x83O\x82̃\x86\x81[\x83U\x96\xBC\x82\xF0\x8E擾\x82\xB7\x82\xE9 + // ダイアログのユーザ名を取得する if (pvar->auth_state.user == NULL) { pvar->auth_state.user = alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); } - // \x83\x86\x81[\x83U\x96\xBC\x82\xF0\x95ύX\x82\xB3\x82\xB9\x82Ȃ\xA2 + // ユーザ名を変更させない EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); EnableWindow(GetDlgItem(dlg, IDC_USERNAME_OPTION), FALSE); - // \x94F\x8F\x81\x83\\x83b\x83h none \x82𑗂\xE9 + // 認証メソッド none を送る do_SSH2_userauth(pvar); - // TIS \x97p\x82\xC9 OK \x82\xF0\x89\x9F\x82\xB7\x82͔̂F\x8FɎ\xB8\x94s\x82\xB5\x82\xBD\x82\xA0\x82Ƃɂ\xB5\x82Ȃ\xA2\x82\xC6 - // Unexpected SSH2 message \x82ɂȂ\xE9\x81B + // TIS 用に OK を押すのは認証に失敗したあとにしないと + // Unexpected SSH2 message になる。 } else if (SSHv1(pvar)) { KillTimer(dlg, IDC_TIMER2); - // TIS \x97p\x82\xC9 OK \x82\xF0\x89\x9F\x82\xB7 + // TIS 用に OK を押す if (pvar->ssh2_authmethod == SSH_AUTH_TIS) { SendMessage(dlg, WM_COMMAND, IDOK, 0); } - // SSH1 \x82ł͔F\x8F\x81\x83\\x83b\x83h none \x82𑗂\xE7\x82Ȃ\xA2 + // SSH1 では認証メソッド none を送らない } - // \x83v\x83\x8D\x83g\x83R\x83\x8B\x83o\x81[\x83W\x83\x87\x83\x93\x8Am\x92\xE8\x91O\x82͉\xBD\x82\xE0\x82\xB5\x82Ȃ\xA2 + // プロトコルバージョン確定前は何もしない } } else if (wParam == IDC_TIMER3) { @@ -928,10 +929,10 @@ if (SSHv2(pvar) || SSHv1(pvar)) { KillTimer(dlg, IDC_TIMER3); - // TIS \x97p\x82\xC9 OK \x82\xF0\x89\x9F\x82\xB7 + // TIS 用に OK を押す SendMessage(dlg, WM_COMMAND, IDOK, 0); } - // \x83v\x83\x8D\x83g\x83R\x83\x8B\x83o\x81[\x83W\x83\x87\x83\x93\x8Am\x92\xE8\x91O\x82͉\xBD\x82\xE0\x82\xB5\x82Ȃ\xA2 + // プロトコルバージョン確定前は何もしない } } return FALSE; @@ -941,12 +942,12 @@ switch (LOWORD(wParam)) { case IDOK: - // \x94F\x8Fؒ\x86\x82ɃT\x81[\x83o\x82\xA9\x82\xE7\x90ؒf\x82\xB3\x82ꂽ\x8Fꍇ\x82́A\x83L\x83\x83\x83\x93\x83Z\x83\x8B\x88\xB5\x82\xA2\x82Ƃ\xB7\x82\xE9\x81B(2014.3.31 yutaka) + // 認証中にサーバから切断された場合は、キャンセル扱いとする。(2014.3.31 yutaka) if (!pvar->cv->Ready) { goto canceled; } - // \x94F\x8F؏\x80\x94\x{142A82}ł\xAB\x82Ă\xA9\x82\xE7\x81A\x94F\x8Ff\x81[\x83^\x82𑗐M\x82\xB7\x82\xE9\x81B\x91\x81\x82\xB7\x82\xAC\x82\xE9\x82ƁA\x97\x8E\x82\xBF\x82\xE9\x81B(2001.1.25 yutaka) + // 認証準備ができてから、認証データを送信する。早すぎると、落ちる。(2001.1.25 yutaka) if (pvar->userauth_retry_count == 0 && ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) || !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) { @@ -955,8 +956,8 @@ else if (SSHv2(pvar) && pvar->session_settings.CheckAuthListFirst && !pvar->tryed_ssh2_authlist) { - // CheckAuthListFirst \x82\xAA\x97L\x8C\xF8\x82ŔF\x8Fؕ\x{33AE0AA}\x97\x88\x82Ă\xA2\x82Ȃ\xA2\x82Ƃ\xAB\x82\xCD - // OK \x82\xF0\x89\x9F\x82\xB9\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9 (2008.10.4 maya) + // CheckAuthListFirst が有効で認証方式が来ていないときは + // OK を押せないようにする (2008.10.4 maya) return FALSE; } @@ -970,7 +971,7 @@ return TRUE; case IDCLOSE: - // \x94F\x8Fؒ\x86\x82Ƀl\x83b\x83g\x83\x8F\x81[\x83N\x90ؒf\x82\xB3\x82ꂽ\x8Fꍇ\x81A\x93\x96\x8AY\x83\x81\x83b\x83Z\x81[\x83W\x82Ń_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\xB6\x82\xE9\x81B + // 認証中にネットワーク切断された場合、当該メッセージでダイアログを閉じる。 pvar->auth_state.auth_dialog = NULL; EndDialog(dlg, 0); return TRUE; @@ -978,29 +979,29 @@ case IDC_SSHUSERNAME: switch (HIWORD(wParam)) { case EN_KILLFOCUS: { - // \x83\x86\x81[\x83U\x96\xBC\x82\xAA\x83t\x83H\x81[\x83J\x83X\x82\xF0\x8E\xB8\x82\xC1\x82\xBD\x82Ƃ\xAB (2007.9.29 maya) + // ユーザ名がフォーカスを失ったとき (2007.9.29 maya) if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) && (pvar->ssh_state.status_flags & STATUS_HOST_OK)) { - // \x90ݒ肪\x97L\x8C\xF8\x82ł܂\xBE\x8E\xE6\x82\xE8\x82ɍs\x82\xC1\x82Ă\xA2\x82Ȃ\xA2\x82Ȃ\xE7 + // 設定が有効でまだ取りに行っていないなら if (SSHv2(pvar) && pvar->session_settings.CheckAuthListFirst && !pvar->tryed_ssh2_authlist) { - // \x83_\x83C\x83A\x83\x8D\x83O\x82̃\x86\x81[\x83U\x96\xBC\x82f + // ダイアログのユーザ名を反映 if (pvar->auth_state.user == NULL) { pvar->auth_state.user = alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME)); } - // \x83\x86\x81[\x83U\x96\xBC\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82邩\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9 + // ユーザ名が入力されているかチェックする if (strlen(pvar->auth_state.user) == 0) { return FALSE; } - // \x83\x86\x81[\x83U\x96\xBC\x82\xF0\x95ύX\x82\xB3\x82\xB9\x82Ȃ\xA2 + // ユーザ名を変更させない EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE); EnableWindow(GetDlgItem(dlg, IDC_USERNAME_OPTION), FALSE); - // \x94F\x8F\x81\x83\\x83b\x83h none \x82𑗂\xE9 + // 認証メソッド none を送る do_SSH2_userauth(pvar); return TRUE; } @@ -1008,23 +1009,23 @@ return FALSE; } case EN_CHANGE: { - // \x83\x86\x81[\x83U\x81[\x96\xBC\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x8Fꍇ\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x82\xF0\x8Eg\x82\xA4\x82\xB1\x82Ƃ͂Ȃ\xA2\x82̂ŁA - // tab\x82ł̃t\x83H\x81[\x83J\x83X\x88ړ\xAE\x8E\x9E\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x83{\x83^\x83\x93\x82\xF0\x83p\x83X\x82\xB7\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9 - // \x8F]\x97\x88\x82Ɠ\xAF\x82\xB6\x83L\x81[\x91\x80\x8D\xEC\x82Ń\x86\x81[\x83U\x81[\x96\xBC\x82ƃp\x83X\x83t\x83\x8C\x81[\x83Y\x82\xF0\x93\xFC\x97͉\\x82Ƃ\xB7\x82\xE9 + // ユーザー名が入力されていた場合、オプションを使うことはないので、 + // tabでのフォーカス移動時、オプションボタンをパスするようにする + // 従来と同じキー操作でユーザー名とパスフレーズを入力可能とする HWND hWnd = (HWND)lParam; const int len = GetWindowTextLength(hWnd); if ((username_str_len == 0 && len != 0) || (username_str_len != 0 && len == 0)) { - // \x83\x86\x81[\x83U\x81[\x96\xBC\x82̕\xB6\x8E\x9A\x92\xB7\x82\xAA 0\x82ɂȂ\xE9 or 0\x82ł͂Ȃ\xAD\x82Ȃ\xE9 \x8E\x9E\x82̂ݏ\x88\x97\x9D + // ユーザー名の文字長が 0になる or 0ではなくなる 時のみ処理 const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); if (len > 0) { - // \x95s\x97vtabstop + // 不要tabstop style = style & (~(LONG_PTR)WS_TABSTOP); } else { - // \x97vtabstop + // 要tabstop style = style | WS_TABSTOP; } SetWindowLongPtr(hWndOption, GWL_STYLE, style); @@ -1052,7 +1053,7 @@ return TRUE; case IDC_FORWARD_AGENT: - // \x82\xB1\x82̃Z\x83b\x83V\x83\x87\x83\x93\x82ɂ̂ݔ\xBD\x89f\x82\xB3\x82\xEA\x82\xE9 (2008.12.4 maya) + // このセッションにのみ反映される (2008.12.4 maya) pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT); return TRUE; @@ -1092,7 +1093,7 @@ switch(result) { case 1: case 2: { - // \x83N\x83\x8A\x83b\x83v\x83{\x81[\x83h\x82\xA9\x82\xE7\x83y\x81[\x83X\x83g + // クリップボードからペースト BOOL clear_clipboard = result == 2; clipboard = GetClipboardTextA(dlg, clear_clipboard); if (clipboard != NULL) { @@ -1105,36 +1106,23 @@ return TRUE; } case 3: - // \x90\xA7\x8C\xE4\x83R\x81[\x83h\x8Eg\x97p/\x96\xA2\x8Eg\x97p + // 制御コード使用/未使用 UseControlChar = !UseControlChar; break; case 4: - // \x83p\x83X\x83t\x83\x8C\x81[\x83Y\x95\\x8E\xA6/\x94\xF1\x95\\x8E\xA6 + // パスフレーズ表示/非表示 ShowPassPhrase = !ShowPassPhrase; { - // \x95\x9A\x82\xB9\x8E\x9A on/off \x82\xF0\x90\xE8\x91ւ\xA6\x82\xE9 + // 伏せ字 on/off を切り替える HWND hWnd = GetDlgItem(dlg, IDC_SSHPASSWORD); - static wchar_t password_char; if (password_char == 0) { - wchar_t c = (wchar_t)SendMessage(hWnd, EM_GETPASSWORDCHAR, 0, 0); - password_char = c; + password_char = (wchar_t)_SendMessageW(hWnd, EM_GETPASSWORDCHAR, 0, 0); } if (ShowPassPhrase) { - SendMessage(hWnd, EM_SETPASSWORDCHAR, 0, 0); + _SendMessageW(hWnd, EM_SETPASSWORDCHAR, 0, 0); } else { -#if !defined(UNICODE) - if (password_char < 0x100) { - SendMessageA(hWnd, EM_SETPASSWORDCHAR, (WPARAM)password_char, 0); - } else { - // TODO W\x8Cn\x92\xBC\x8CĂ\xD1 \x81\xAB\x82\xA4\x82܂\xAD\x82\xA2\x82\xA9\x82Ȃ\xA2 - //SendMessageW(hWnd, EM_SETPASSWORDCHAR, (WPARAM)password_char, 0); - SendMessageA(hWnd, EM_SETPASSWORDCHAR, (WPARAM)'*', 0); - } -#else - SendMessageW(hWnd, EM_SETPASSWORDCHAR, (WPARAM)password_char, 0); -#endif + _SendMessageW(hWnd, EM_SETPASSWORDCHAR, (WPARAM)password_char, 0); } - //InvalidateRect(hWnd, NULL, TRUE); SendDlgItemMessage(dlg, IDC_SSHPASSWORD, EM_SETSEL, 0, -1); SendMessage(dlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(dlg, IDC_SSHPASSWORD), TRUE); return TRUE; @@ -1217,8 +1205,8 @@ } else { // for SSH2(yutaka) // types &= (1 << SSH_AUTH_PASSWORD); - // \x8C\xF6\x8AJ\x8C\xAE\x94F\x8F\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9 (2004.12.18 yutaka) - // TIS\x82\xF0\x92lj\xC1\x81BSSH2\x82ł\xCDkeyboard-interactive\x82Ƃ\xB5\x82Ĉ\xB5\x82\xA4\x81B(2005.3.12 yutaka) + // 公開鍵認証を有効にする (2004.12.18 yutaka) + // TISを追加。SSH2ではkeyboard-interactiveとして扱う。(2005.3.12 yutaka) types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA) | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT); } @@ -1241,7 +1229,7 @@ static void start_user_auth(PTInstVar pvar) { - // \x94F\x8F_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\\x8E\xA6\x82\xB3\x82\xB9\x82\xE9 (2004.12.1 yutaka) + // 認証ダイアログを表示させる (2004.12.1 yutaka) PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH, (LPARAM) NULL); pvar->auth_state.cur_cred.method = SSH_AUTH_NONE; @@ -1337,14 +1325,14 @@ pvar->auth_state.flags |= AUTH_START_USER_AUTH_ON_ERROR_END; } else { - // \x82\xB1\x82\xB1\x82ŔF\x8F_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8Fo\x8C\xBB\x82\xB3\x82\xB9\x82\xE9 (2004.12.1 yutaka) - // \x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x8Ew\x92\xE8\x82Ȃ\xB5\x82̏ꍇ + // ここで認証ダイアログを出現させる (2004.12.1 yutaka) + // コマンドライン指定なしの場合 start_user_auth(pvar); } } } else { - // \x82\xB1\x82\xB1\x82ŔF\x8F_\x83C\x83A\x83\x8D\x83O\x82\xF0\x8Fo\x8C\xBB\x82\xB3\x82\xB9\x82\xE9 (2004.12.1 yutaka) - // \x83R\x83}\x83\x93\x83h\x83\x89\x83C\x83\x93\x8Ew\x92肠\x82\xE8(/auth=xxxx)\x82̏ꍇ + // ここで認証ダイアログを出現させる (2004.12.1 yutaka) + // コマンドライン指定あり(/auth=xxxx)の場合 start_user_auth(pvar); } } @@ -1410,7 +1398,7 @@ init_TIS_dlg(pvar, dlg); - // /auth=challenge \x82\xF0\x92lj\xC1 (2007.10.5 maya) + // /auth=challenge を追加 (2007.10.5 maya) if (pvar->ssh2_autologin == 1) { SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password); SendMessage(dlg, WM_COMMAND, IDOK, 0); @@ -1433,7 +1421,7 @@ return TRUE; case IDCLOSE: - // \x94F\x8Fؒ\x86\x82Ƀl\x83b\x83g\x83\x8F\x81[\x83N\x90ؒf\x82\xB3\x82ꂽ\x8Fꍇ\x81A\x93\x96\x8AY\x83\x81\x83b\x83Z\x81[\x83W\x82Ń_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\xB6\x82\xE9\x81B + // 認証中にネットワーク切断された場合、当該メッセージでダイアログを閉じる。 pvar->auth_state.auth_dialog = NULL; EndDialog(dlg, 0); return TRUE; @@ -1549,7 +1537,7 @@ if (pvar->settings.DefaultUserType == 1 && pvar->session_settings.DefaultUserName[0] == 0) { - // \x8B\xF3\x82Ȃ̂Łu\x93\xFC\x97͂\xB5\x82Ȃ\xA2\x81v\x82ɂ\xB5\x82Ă\xA8\x82\xAD + // 空なので「入力しない」にしておく pvar->settings.DefaultUserType = 0; } id = pvar->settings.DefaultUserType == 1 ? IDC_SSH_DEFAULTUSERNAME : @@ -1763,11 +1751,11 @@ strncat_s(dest, len, buf, _TRUNCATE); } } else { - // SSH2:\x94F\x8F\x81\x83\\x83b\x83h\x82̔\xBB\x95\xCA (2004.12.23 yutaka) - // keyboard-interactive\x83\x81\x83\\x83b\x83h\x82\xF0\x92lj\xC1 (2005.3.12 yutaka) + // SSH2:認証メソッドの判別 (2004.12.23 yutaka) + // keyboard-interactiveメソッドを追加 (2005.3.12 yutaka) if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD || pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { - // keyboard-interactive\x83\x81\x83\\x83b\x83h\x82\xF0\x92lj\xC1 (2005.1.24 yutaka) + // keyboard-interactiveメソッドを追加 (2005.1.24 yutaka) if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { method = "keyboard-interactive"; } else { @@ -1828,9 +1816,9 @@ } } -// TCP\x83Z\x83b\x83V\x83\x87\x83\x93\x82\xAA\x83N\x83\x8D\x81[\x83Y\x82\xB3\x82ꂽ\x8Fꍇ\x81A\x94F\x8F_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\xB6\x82\xE9\x82悤\x82Ɏw\x8E\xA6\x82\xF0\x8Fo\x82\xB7\x81B -// AUTH_notify_disconnecting()\x82Ƃ͈قȂ\xE8\x81A\x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x95\xB6\x82\xE9\x82݂̂ŁA -// SSH\x83T\x81[\x83o\x82ɒʒm\x82͏o\x82\xB3\x82Ȃ\xA2\x81B +// TCPセッションがクローズされた場合、認証ダイアログを閉じるように指示を出す。 +// AUTH_notify_disconnecting()とは異なり、ダイアログを閉じるのみで、 +// SSHサーバに通知は出さない。 void AUTH_notify_closing_on_exit(PTInstVar pvar) { if (pvar->auth_state.auth_dialog != NULL) {