Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/hosts.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 7896 by zmatsuo, Mon Jul 29 15:04:08 2019 UTC revision 8093 by yutakapon, Sun Sep 8 10:16:41 2019 UTC
# Line 66  See LICENSE.TXT for the license. Line 66  See LICENSE.TXT for the license.
66  static char base64[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  static char base64[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
67    
68    
69    BOOL HOSTS_resume_session_after_known_hosts(PTInstVar pvar);
70    void HOSTS_cancel_session_after_known_hosts(PTInstVar pvar);
71    
72    
73  static char **parse_multi_path(char *buf)  static char **parse_multi_path(char *buf)
74  {  {
75          int i;          int i;
# Line 108  void HOSTS_init(PTInstVar pvar) Line 112  void HOSTS_init(PTInstVar pvar)
112          key_init(&pvar->hosts_state.hostkey);          key_init(&pvar->hosts_state.hostkey);
113          pvar->hosts_state.hosts_dialog = NULL;          pvar->hosts_state.hosts_dialog = NULL;
114          pvar->hosts_state.file_names = NULL;          pvar->hosts_state.file_names = NULL;
115    
116            /*
117             * 前回のオプション指定(/nosecuritywarning)が残らないように初期化しておく。
118             */
119            pvar->nocheck_known_hosts = FALSE;
120  }  }
121    
122  void HOSTS_open(PTInstVar pvar)  void HOSTS_open(PTInstVar pvar)
# Line 1811  static INT_PTR CALLBACK hosts_add_dlg_pr Line 1820  static INT_PTR CALLBACK hosts_add_dlg_pr
1820                                  add_host_key(pvar);                                  add_host_key(pvar);
1821                          }                          }
1822    
1823                          if (SSHv1(pvar)) {                          /*
1824                                  SSH_notify_host_OK(pvar);                           * known_hostsダイアログのために一時停止していた
1825                          } else { // SSH2                           * SSHサーバとのネゴシエーションを再開させる。
1826                                  // SSH2ではあとで SSH_notify_host_OK() を呼ぶ。                           */
1827                          }                          HOSTS_resume_session_after_known_hosts(pvar);
1828    
1829                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
1830    
# Line 1824  static INT_PTR CALLBACK hosts_add_dlg_pr Line 1833  static INT_PTR CALLBACK hosts_add_dlg_pr
1833    
1834                  case IDCANCEL:                  /* kill the connection */                  case IDCANCEL:                  /* kill the connection */
1835  canceled:  canceled:
1836                            /*
1837                             * known_hostsをキャンセルするため、再開用のリソースを破棄しておく。
1838                             */
1839                            HOSTS_cancel_session_after_known_hosts(pvar);
1840    
1841                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
1842                          notify_closed_connection(pvar, "authentication cancelled");                          notify_closed_connection(pvar, "authentication cancelled");
1843                          EndDialog(dlg, 0);                          EndDialog(dlg, 0);
1844                          return TRUE;                          return TRUE;
1845    
1846                    case IDCLOSE:
1847                            /*
1848                             * known_hosts中にサーバ側からネットワーク切断された場合、
1849                             * ダイアログのみを閉じる。
1850                             */
1851                            HOSTS_cancel_session_after_known_hosts(pvar);
1852    
1853                            pvar->hosts_state.hosts_dialog = NULL;
1854                            EndDialog(dlg, 0);
1855                            return TRUE;
1856    
1857                  case IDC_FP_HASH_ALG_MD5:                  case IDC_FP_HASH_ALG_MD5:
1858                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);
1859                          return TRUE;                          return TRUE;
# Line 1964  static INT_PTR CALLBACK hosts_replace_dl Line 1989  static INT_PTR CALLBACK hosts_replace_dl
1989                                  delete_different_key(pvar);                                  delete_different_key(pvar);
1990                          }                          }
1991    
1992                          if (SSHv1(pvar)) {                          /*
1993                                  SSH_notify_host_OK(pvar);                           * known_hostsダイアログのために一時停止していた
1994                          } else { // SSH2                           * SSHサーバとのネゴシエーションを再開させる。
1995                                  // SSH2ではあとで SSH_notify_host_OK() を呼ぶ。                           */
1996                          }                          HOSTS_resume_session_after_known_hosts(pvar);
1997    
1998                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
1999    
# Line 1977  static INT_PTR CALLBACK hosts_replace_dl Line 2002  static INT_PTR CALLBACK hosts_replace_dl
2002    
2003                  case IDCANCEL:                  /* kill the connection */                  case IDCANCEL:                  /* kill the connection */
2004  canceled:  canceled:
2005                            /*
2006                             * known_hostsをキャンセルするため、再開用のリソースを破棄しておく。
2007                             */
2008                            HOSTS_cancel_session_after_known_hosts(pvar);
2009    
2010                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
2011                          notify_closed_connection(pvar, "authentication cancelled");                          notify_closed_connection(pvar, "authentication cancelled");
2012                          EndDialog(dlg, 0);                          EndDialog(dlg, 0);
2013                          return TRUE;                          return TRUE;
2014    
2015                    case IDCLOSE:
2016                            /*
2017                             * known_hosts中にサーバ側からネットワーク切断された場合、
2018                             * ダイアログのみを閉じる。
2019                             */
2020                            HOSTS_cancel_session_after_known_hosts(pvar);
2021    
2022                            pvar->hosts_state.hosts_dialog = NULL;
2023                            EndDialog(dlg, 0);
2024                            return TRUE;
2025    
2026                  case IDC_FP_HASH_ALG_MD5:                  case IDC_FP_HASH_ALG_MD5:
2027                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);
2028                          return TRUE;                          return TRUE;
# Line 2118  static INT_PTR CALLBACK hosts_add2_dlg_p Line 2159  static INT_PTR CALLBACK hosts_add2_dlg_p
2159                                  add_host_key(pvar);                                  add_host_key(pvar);
2160                          }                          }
2161    
2162                          if (SSHv1(pvar)) {                          /*
2163                                  SSH_notify_host_OK(pvar);                           * known_hostsダイアログのために一時停止していた
2164                          } else { // SSH2                           * SSHサーバとのネゴシエーションを再開させる。
2165                                  // SSH2ではあとで SSH_notify_host_OK() を呼ぶ。                           */
2166                          }                          HOSTS_resume_session_after_known_hosts(pvar);
2167    
2168                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
2169    
# Line 2131  static INT_PTR CALLBACK hosts_add2_dlg_p Line 2172  static INT_PTR CALLBACK hosts_add2_dlg_p
2172    
2173                  case IDCANCEL:                  /* kill the connection */                  case IDCANCEL:                  /* kill the connection */
2174  canceled:  canceled:
2175                            /*
2176                             * known_hostsをキャンセルするため、再開用のリソースを破棄しておく。
2177                             */
2178                            HOSTS_cancel_session_after_known_hosts(pvar);
2179    
2180                          pvar->hosts_state.hosts_dialog = NULL;                          pvar->hosts_state.hosts_dialog = NULL;
2181                          notify_closed_connection(pvar, "authentication cancelled");                          notify_closed_connection(pvar, "authentication cancelled");
2182                          EndDialog(dlg, 0);                          EndDialog(dlg, 0);
2183                          return TRUE;                          return TRUE;
2184    
2185                    case IDCLOSE:
2186                            /*
2187                             * known_hosts中にサーバ側からネットワーク切断された場合、
2188                             * ダイアログのみを閉じる。
2189                             */
2190                            HOSTS_cancel_session_after_known_hosts(pvar);
2191    
2192                            pvar->hosts_state.hosts_dialog = NULL;
2193                            EndDialog(dlg, 0);
2194                            return TRUE;
2195    
2196                  case IDC_FP_HASH_ALG_MD5:                  case IDC_FP_HASH_ALG_MD5:
2197                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);                          hosts_dlg_set_fingerprint(pvar, dlg, SSH_DIGEST_MD5);
2198                          return TRUE;                          return TRUE;
# Line 2176  canceled: Line 2233  canceled:
2233  void HOSTS_do_unknown_host_dialog(HWND wnd, PTInstVar pvar)  void HOSTS_do_unknown_host_dialog(HWND wnd, PTInstVar pvar)
2234  {  {
2235          if (pvar->hosts_state.hosts_dialog == NULL) {          if (pvar->hosts_state.hosts_dialog == NULL) {
2236                  HWND cur_active = GetActiveWindow();                  /* known_hostsの読み込み時、ID_SSHASYNCMESSAGEBOX を使った
2237                     * MessageBox が表示される場合、オーナーなし(no owner)になるため、
2238                     * MessageBox がTera Termの裏に隠れることがある。
2239                     * その状態で GetActiveWindow() を呼び出すと、known_hostsダイアログの
2240                     * オーナーが MessageBox となって、Tera Termの裏に隠れてしまう。
2241                     * そこで、known_hostsダイアログのオーナーは常に Tera Term を指し示す
2242                     * ようにする。
2243                     */
2244                    HWND cur_active = NULL;
2245    
2246                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHUNKNOWNHOST),                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHUNKNOWNHOST),
2247                                 cur_active != NULL ? cur_active : wnd,                                 cur_active != NULL ? cur_active : wnd,
# Line 2187  void HOSTS_do_unknown_host_dialog(HWND w Line 2252  void HOSTS_do_unknown_host_dialog(HWND w
2252  void HOSTS_do_different_key_dialog(HWND wnd, PTInstVar pvar)  void HOSTS_do_different_key_dialog(HWND wnd, PTInstVar pvar)
2253  {  {
2254          if (pvar->hosts_state.hosts_dialog == NULL) {          if (pvar->hosts_state.hosts_dialog == NULL) {
2255                  HWND cur_active = GetActiveWindow();                  /* known_hostsの読み込み時、ID_SSHASYNCMESSAGEBOX を使った
2256                     * MessageBox が表示される場合、オーナーなし(no owner)になるため、
2257                     * MessageBox がTera Termの裏に隠れることがある。
2258                     * その状態で GetActiveWindow() を呼び出すと、known_hostsダイアログの
2259                     * オーナーが MessageBox となって、Tera Termの裏に隠れてしまう。
2260                     * そこで、known_hostsダイアログのオーナーは常に Tera Term を指し示す
2261                     * ようにする。
2262                     */
2263                    HWND cur_active = NULL;
2264    
2265                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHDIFFERENTKEY),                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHDIFFERENTKEY),
2266                                 cur_active != NULL ? cur_active : wnd,                                 cur_active != NULL ? cur_active : wnd,
# Line 2198  void HOSTS_do_different_key_dialog(HWND Line 2271  void HOSTS_do_different_key_dialog(HWND
2271  void HOSTS_do_different_type_key_dialog(HWND wnd, PTInstVar pvar)  void HOSTS_do_different_type_key_dialog(HWND wnd, PTInstVar pvar)
2272  {  {
2273          if (pvar->hosts_state.hosts_dialog == NULL) {          if (pvar->hosts_state.hosts_dialog == NULL) {
2274                  HWND cur_active = GetActiveWindow();                  /* known_hostsの読み込み時、ID_SSHASYNCMESSAGEBOX を使った
2275                     * MessageBox が表示される場合、オーナーなし(no owner)になるため、
2276                     * MessageBox がTera Termの裏に隠れることがある。
2277                     * その状態で GetActiveWindow() を呼び出すと、known_hostsダイアログの
2278                     * オーナーが MessageBox となって、Tera Termの裏に隠れてしまう。
2279                     * そこで、known_hostsダイアログのオーナーは常に Tera Term を指し示す
2280                     * ようにする。
2281                     */
2282                    HWND cur_active = NULL;
2283    
2284                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHDIFFERENTTYPEKEY),                  DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHDIFFERENTTYPEKEY),
2285                                 cur_active != NULL ? cur_active : wnd,                                 cur_active != NULL ? cur_active : wnd,
# Line 2206  void HOSTS_do_different_type_key_dialog( Line 2287  void HOSTS_do_different_type_key_dialog(
2287          }          }
2288  }  }
2289    
2290  //  /*
2291  // サーバから送られてきたホスト公開鍵の妥当性をチェックする   * サーバから送られてきたホスト公開鍵の妥当性をチェックし、
2292  //   key: サーバからの公開鍵   * 必要に応じて known_hosts ダイアログを呼び出す。
2293  //   *
2294  // SSH2対応を追加 (2006.3.24 yutaka)   *   hostname: 接続先のホスト名
2295  //   *   tcpport: 接続先ポート番号
2296     *   key: サーバからの公開鍵
2297     *
2298     * return:
2299     *    TRUE:  known_hostsダイアログの呼び出しは不要
2300     *    FALSE: known_hostsダイアログを呼び出した
2301     *
2302     */
2303  BOOL HOSTS_check_host_key(PTInstVar pvar, char *hostname, unsigned short tcpport, Key *key)  BOOL HOSTS_check_host_key(PTInstVar pvar, char *hostname, unsigned short tcpport, Key *key)
2304  {  {
2305          int found_different_key = 0, found_different_type_key = 0;          int found_different_key = 0, found_different_type_key = 0;
2306          Key key2; // known_hostsに登録されている鍵          Key key2; // known_hostsに登録されている鍵
2307            DWORD id;
2308    
2309          pvar->dns_key_check = DNS_VERIFY_NONE;          pvar->dns_key_check = DNS_VERIFY_NONE;
2310    
# Line 2224  BOOL HOSTS_check_host_key(PTInstVar pvar Line 2313  BOOL HOSTS_check_host_key(PTInstVar pvar
2313           && _stricmp(pvar->hosts_state.prefetched_hostname, hostname) == 0           && _stricmp(pvar->hosts_state.prefetched_hostname, hostname) == 0
2314           && HOSTS_compare_public_key(&pvar->hosts_state.hostkey, key) == 1) {           && HOSTS_compare_public_key(&pvar->hosts_state.hostkey, key) == 1) {
2315    
2316                  if (SSHv1(pvar)) {                   // 何もせずに戻る。            
2317                          SSH_notify_host_OK(pvar);                   return TRUE;
                 } else {  
                         // SSH2ではあとで SSH_notify_host_OK() を呼ぶ。  
                 }  
                 return TRUE;  
2318          }          }
2319    
2320          // 先読みされていない場合は、この時点でファイルから読み込む          // 先読みされていない場合は、この時点でファイルから読み込む
# Line 2245  BOOL HOSTS_check_host_key(PTInstVar pvar Line 2330  BOOL HOSTS_check_host_key(PTInstVar pvar
2330                                  if (match == 1) {                                  if (match == 1) {
2331                                          finish_read_host_files(pvar, 0);                                          finish_read_host_files(pvar, 0);
2332                                          // すべてのエントリを参照して、合致するキーが見つかったら戻る。                                          // すべてのエントリを参照して、合致するキーが見つかったら戻る。
                                         // SSH2の場合はここでは何もしない。(2006.3.29 yutaka)  
                                         if (SSHv1(pvar)) {  
                                                 SSH_notify_host_OK(pvar);  
                                         } else {  
                                                 // SSH2ではあとで SSH_notify_host_OK() を呼ぶ。  
                                         }  
   
2333                                          // About TTSSH ダイアログでの表示のために、ここで保存しておく。                                          // About TTSSH ダイアログでの表示のために、ここで保存しておく。
2334                                          key_copy(&pvar->hosts_state.hostkey, key);                                          key_copy(&pvar->hosts_state.hostkey, key);
2335    
# Line 2280  BOOL HOSTS_check_host_key(PTInstVar pvar Line 2358  BOOL HOSTS_check_host_key(PTInstVar pvar
2358    
2359          // "/nosecuritywarning"が指定されている場合、ダイアログを表示させずに return success する。          // "/nosecuritywarning"が指定されている場合、ダイアログを表示させずに return success する。
2360          if (pvar->nocheck_known_hosts == TRUE) {          if (pvar->nocheck_known_hosts == TRUE) {
2361                     // 何もせずに戻る。            
2362                  return TRUE;                  return TRUE;
2363          }          }
2364    
# Line 2291  BOOL HOSTS_check_host_key(PTInstVar pvar Line 2370  BOOL HOSTS_check_host_key(PTInstVar pvar
2370          // させる必要があるため、直接コールに変更する。          // させる必要があるため、直接コールに変更する。
2371          // これによりknown_hostsの確認を待たずに、サーバへユーザ情報を送ってしまう問題を回避する。          // これによりknown_hostsの確認を待たずに、サーバへユーザ情報を送ってしまう問題を回避する。
2372          // (2007.10.1 yutaka)          // (2007.10.1 yutaka)
2373            /*
2374             * known_hostsダイアログは非同期で表示させるのが正しかった。
2375             * known_hostsダイアログが表示されている状態で、サーバから切断を行うと、
2376             * TTXCloseTCPが呼び出され、TTSSHのリソースが解放されてしまう。
2377             * SSHハンドラの延長でknown_hostsダイアログを出して止まっているため、
2378             * 処理再開後に不正アクセスで落ちる。
2379             * (2019.9.3 yutaka)
2380             */
2381          if (found_different_key) {          if (found_different_key) {
2382                  HOSTS_do_different_key_dialog(pvar->NotificationWindow, pvar);                  // TTXProcessCommand から HOSTS_do_different_key_dialog() を呼び出す。
2383                    id = ID_SSHDIFFERENTKEY;
2384          }          }
2385          else if (found_different_type_key) {          else if (found_different_type_key) {
2386                  HOSTS_do_different_type_key_dialog(pvar->NotificationWindow, pvar);                  // TTXProcessCommand から HOSTS_do_different_type_key_dialog() を呼び出す。
2387                    id = ID_SSHDIFFERENT_TYPE_KEY;
2388          }          }
2389          else {          else {
2390                  HOSTS_do_unknown_host_dialog(pvar->NotificationWindow, pvar);                  // TTXProcessCommand から HOSTS_do_unknown_host_dialog() を呼び出す。
2391                    id = ID_SSHUNKNOWNHOST;
2392          }          }
2393    
2394          return TRUE;          PostMessage(pvar->NotificationWindow, WM_COMMAND, id, 0);
2395    
2396            logprintf(LOG_LEVEL_INFO, "Calling known_hosts dialog...(%s)",
2397                    id == ID_SSHDIFFERENTKEY ? "SSHDIFFERENTKEY" :
2398                    id == ID_SSHDIFFERENT_TYPE_KEY ? "SSHDIFFERENT_TYPE_KEY" : "SSHUNKNOWNHOST"
2399                    );
2400    
2401            return FALSE;
2402  }  }
2403    
2404    /*
2405     * known_hostsダイアログでユーザ承認後、SSHサーバとのネゴシエーションを再開する。
2406     */
2407    BOOL HOSTS_resume_session_after_known_hosts(PTInstVar pvar)
2408    {
2409            enum ssh_kex_known_hosts type;
2410            int ret = FALSE;
2411    
2412            type = pvar->contents_after_known_hosts.kex_type;
2413            if (type == SSH1_PUBLIC_KEY_KNOWN_HOSTS) {
2414                    ret = handle_server_public_key_after_known_hosts(pvar);
2415    
2416            } else if (type == SSH2_DH_KEX_REPLY_KNOWN_HOSTS) {
2417                    ret = handle_SSH2_dh_kex_reply_after_known_hosts(pvar);
2418    
2419            } else if (type == SSH2_DH_GEX_REPLY_KNOWN_HOSTS) {
2420                    ret = handle_SSH2_dh_gex_reply_after_known_hosts(pvar);
2421    
2422            } else if (type == SSH2_ECDH_KEX_REPLY_KNOWN_HOSTS) {
2423                    ret = handle_SSH2_ecdh_kex_reply_after_known_hosts(pvar);
2424    
2425            }
2426    
2427            return (ret);
2428    }
2429    
2430    /*
2431     * known_hostsダイアログのSSHごとのキャンセル処理
2432     */
2433    void HOSTS_cancel_session_after_known_hosts(PTInstVar pvar)
2434    {
2435            enum ssh_kex_known_hosts type;
2436    
2437            type = pvar->contents_after_known_hosts.kex_type;
2438            if (type != NONE_KNOWN_HOSTS) {
2439                    handle_SSH2_canel_reply_after_known_hosts(pvar);
2440            }
2441    
2442            return;
2443    }
2444    
2445    
2446  void HOSTS_notify_disconnecting(PTInstVar pvar)  void HOSTS_notify_disconnecting(PTInstVar pvar)
2447  {  {
2448          if (pvar->hosts_state.hosts_dialog != NULL) {          if (pvar->hosts_state.hosts_dialog != NULL) {
# Line 2313  void HOSTS_notify_disconnecting(PTInstVa Line 2452  void HOSTS_notify_disconnecting(PTInstVa
2452          }          }
2453  }  }
2454    
2455    // TCPセッションがクローズされた場合、known_hostsダイアログを閉じるように指示を出す。
2456    // HOSTS_notify_disconnecting()とは異なり、ダイアログを閉じるのみで、
2457    // SSHサーバに通知は出さない。
2458    void HOSTS_notify_closing_on_exit(PTInstVar pvar)
2459    {
2460            if (pvar->hosts_state.hosts_dialog != NULL) {
2461                    logprintf(LOG_LEVEL_INFO, "%s: Notify closing message to the known_hosts dialog.", __FUNCTION__);
2462                    PostMessage(pvar->hosts_state.hosts_dialog, WM_COMMAND, IDCLOSE, 0);
2463            }
2464    }
2465    
2466  void HOSTS_end(PTInstVar pvar)  void HOSTS_end(PTInstVar pvar)
2467  {  {
2468          int i;          int i;

Legend:
Removed from v.7896  
changed lines
  Added in v.8093

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26