| 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; |
| 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) |
| 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 |
|
|
| 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; |
| 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 |
|
|
| 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; |
| 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 |
|
|
| 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; |
| 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, |
| 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, |
| 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, |
| 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 |
|
|
| 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 |
// 先読みされていない場合は、この時点でファイルから読み込む |
// 先読みされていない場合は、この時点でファイルから読み込む |
| 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 |
|
|
| 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 |
|
|
| 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) { |
| 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; |