1 // SoftEther UT-VPN SourceCode
\r
3 // Copyright (C) 2004-2010 SoftEther Corporation.
\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.
\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.
\r
6 // All Rights Reserved.
\r
8 // http://utvpn.tsukuba.ac.jp/
\r
10 // This program is free software; you can redistribute it and/or
\r
11 // modify it under the terms of the GNU General Public License
\r
12 // version 2 as published by the Free Software Foundation.
\r
14 // This program is distributed in the hope that it will be useful,
\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 // GNU General Public License for more details.
\r
19 // You should have received a copy of the GNU General Public License version 2
\r
20 // along with this program; if not, write to the Free Software
\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
79 // Win32 用 SoftEther UT-VPN User-mode Router Manager
\r
88 #define _WIN32_WINNT 0x0502
\r
89 #define WINVER 0x0502
\r
90 #include <winsock2.h>
\r
91 #include <windows.h>
\r
92 #include <wincrypt.h>
\r
93 #include <wininet.h>
\r
95 #include <commctrl.h>
\r
96 #include <Dbghelp.h>
\r
101 #include <stdarg.h>
\r
104 #include <Mayaqua/Mayaqua.h>
\r
105 #include <Cedar/Cedar.h>
\r
106 #include "CMInner.h"
\r
107 #include "SMInner.h"
\r
108 #include "NMInner.h"
\r
109 #include "../PenCore/resource.h"
\r
112 static NM *nm = NULL;
\r
116 UINT NmChangePasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
118 RPC *r = (RPC *)param;
\r
119 char tmp1[MAX_SIZE];
\r
120 char tmp2[MAX_SIZE];
\r
121 RPC_SET_PASSWORD t;
\r
130 case WM_INITDIALOG:
\r
131 FormatText(hWnd, 0, r->Sock->RemoteHostname);
\r
132 FormatText(hWnd, S_TITLE, r->Sock->RemoteHostname);
\r
136 GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));
\r
137 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
\r
138 switch (LOWORD(wParam))
\r
142 SetEnable(hWnd, IDOK, StrCmp(tmp1, tmp2) == 0);
\r
149 Zero(&t, sizeof(t));
\r
150 Hash(t.HashedPassword, tmp1, StrLen(tmp1), true);
\r
152 if (CALL(hWnd, NcSetPassword(r, &t)))
\r
154 MsgBox(hWnd, MB_ICONINFORMATION, _UU("NM_PASSWORD_MSG"));
\r
155 EndDialog(hWnd, true);
\r
166 EndDialog(hWnd, false);
\r
174 void NmChangePassword(HWND hWnd, RPC *r)
\r
177 if (hWnd == NULL || r == NULL)
\r
182 Dialog(hWnd, D_NM_CHANGE_PASSWORD, NmChangePasswordProc, r);
\r
186 void NmDhcpInit(HWND hWnd, SM_HUB *r)
\r
189 if (hWnd == NULL || r == NULL)
\r
194 SetIcon(hWnd, 0, ICO_INTERNET);
\r
196 LvInit(hWnd, L_TABLE);
\r
197 LvInsertColumn(hWnd, L_TABLE, 0, _UU("DHCP_DHCP_ID"), 50);
\r
198 LvInsertColumn(hWnd, L_TABLE, 1, _UU("DHCP_LEASED_TIME"), 200);
\r
199 LvInsertColumn(hWnd, L_TABLE, 2, _UU("DHCP_EXPIRE_TIME"), 200);
\r
200 LvInsertColumn(hWnd, L_TABLE, 3, _UU("DHCP_MAC_ADDRESS"), 130);
\r
201 LvInsertColumn(hWnd, L_TABLE, 4, _UU("DHCP_IP_ADDRESS"), 100);
\r
202 LvInsertColumn(hWnd, L_TABLE, 5, _UU("DHCP_HOSTNAME"), 150);
\r
204 NmDhcpRefresh(hWnd, r);
\r
208 void NmDhcpRefresh(HWND hWnd, SM_HUB *r)
\r
214 if (hWnd == NULL || r == NULL)
\r
220 Zero(&t, sizeof(t));
\r
222 StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
\r
224 if (CALL(hWnd, ScEnumDHCP(r->Rpc, &t)) == false)
\r
229 b = LvInsertStart();
\r
231 for (i = 0;i < t.NumItem;i++)
\r
233 RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
\r
234 wchar_t tmp0[MAX_SIZE];
\r
235 wchar_t tmp1[MAX_SIZE];
\r
236 wchar_t tmp2[MAX_SIZE];
\r
237 wchar_t tmp3[MAX_SIZE];
\r
238 wchar_t tmp4[MAX_SIZE];
\r
239 wchar_t tmp5[MAX_SIZE];
\r
240 char str[MAX_SIZE];
\r
243 UniToStru(tmp0, e->Id);
\r
246 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
\r
247 GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
\r
249 MacToStr(str, sizeof(str), e->MacAddress);
\r
250 StrToUni(tmp3, sizeof(tmp3), str);
\r
252 IPToStr32(str, sizeof(str), e->IpAddress);
\r
253 StrToUni(tmp4, sizeof(tmp4), str);
\r
255 StrToUni(tmp5, sizeof(tmp5), e->Hostname);
\r
257 LvInsertAdd(b, ICO_INTERNET, NULL, 6,
\r
258 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
\r
261 LvInsertEnd(b, hWnd, L_TABLE);
\r
263 FreeRpcEnumDhcp(&t);
\r
267 UINT NmDhcpProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
269 SM_HUB *r = (SM_HUB *)param;
\r
278 case WM_INITDIALOG:
\r
279 NmDhcpInit(hWnd, r);
\r
280 SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
\r
291 NmDhcpRefresh(hWnd, r);
\r
300 KillTimer(hWnd, 1);
\r
301 NmDhcpRefresh(hWnd, r);
\r
302 SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
\r
308 EndDialog(hWnd, false);
\r
312 LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
\r
318 void NmDhcp(HWND hWnd, SM_HUB *r)
\r
321 if (hWnd == NULL || r == NULL)
\r
326 Dialog(hWnd, D_NM_DHCP, NmDhcpProc, r);
\r
331 void NmNatInit(HWND hWnd, SM_HUB *r)
\r
334 if (hWnd == NULL || r == NULL)
\r
339 SetIcon(hWnd, 0, ICO_PROTOCOL);
\r
341 LvInit(hWnd, L_TABLE);
\r
342 LvInsertColumn(hWnd, L_TABLE, 0, _UU("NM_NAT_ID"), 50);
\r
343 LvInsertColumn(hWnd, L_TABLE, 1, _UU("NM_NAT_PROTOCOL"), 80);
\r
344 LvInsertColumn(hWnd, L_TABLE, 2, _UU("NM_NAT_SRC_HOST"), 100);
\r
345 LvInsertColumn(hWnd, L_TABLE, 3, _UU("NM_NAT_SRC_PORT"), 80);
\r
346 LvInsertColumn(hWnd, L_TABLE, 4, _UU("NM_NAT_DST_HOST"), 150);
\r
347 LvInsertColumn(hWnd, L_TABLE, 5, _UU("NM_NAT_DST_PORT"), 80);
\r
348 LvInsertColumn(hWnd, L_TABLE, 6, _UU("NM_NAT_CREATED"), 200);
\r
349 LvInsertColumn(hWnd, L_TABLE, 7, _UU("NM_NAT_LAST_COMM"), 200);
\r
350 LvInsertColumn(hWnd, L_TABLE, 8, _UU("NM_NAT_SIZE"), 120);
\r
351 LvInsertColumn(hWnd, L_TABLE, 9, _UU("NM_NAT_TCP_STATUS"), 120);
\r
353 NmNatRefresh(hWnd, r);
\r
357 void NmNatRefresh(HWND hWnd, SM_HUB *r)
\r
363 if (hWnd == NULL || r == NULL)
\r
368 Zero(&t, sizeof(t));
\r
370 StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
\r
372 if (CALL(hWnd, ScEnumNAT(r->Rpc, &t)) == false)
\r
378 b = LvInsertStart();
\r
380 for (i = 0;i < t.NumItem;i++)
\r
382 RPC_ENUM_NAT_ITEM *e = &t.Items[i];
\r
383 wchar_t tmp0[MAX_SIZE];
\r
384 wchar_t *tmp1 = L"";
\r
385 wchar_t tmp2[MAX_SIZE];
\r
386 wchar_t tmp3[MAX_SIZE];
\r
387 wchar_t tmp4[MAX_SIZE];
\r
388 wchar_t tmp5[MAX_SIZE];
\r
389 wchar_t tmp6[MAX_SIZE];
\r
390 wchar_t tmp7[MAX_SIZE];
\r
391 wchar_t tmp8[MAX_SIZE];
\r
392 wchar_t *tmp9 = L"";
\r
393 char v1[128], v2[128];
\r
396 UniToStru(tmp0, e->Id);
\r
399 switch (e->Protocol)
\r
402 tmp1 = _UU("NM_NAT_PROTO_TCP");
\r
405 tmp1 = _UU("NM_NAT_PROTO_UDP");
\r
408 tmp1 = _UU("NM_NAT_PROTO_DNS");
\r
413 StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
\r
416 UniToStru(tmp3, e->SrcPort);
\r
419 StrToUni(tmp4, sizeof(tmp4), e->DestHost);
\r
422 UniToStru(tmp5, e->DestPort);
\r
425 GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
\r
428 GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
\r
431 ToStr3(v1, sizeof(v1), e->RecvSize);
\r
432 ToStr3(v2, sizeof(v2), e->SendSize);
\r
433 UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
\r
436 if (e->Protocol == NAT_TCP)
\r
438 switch (e->TcpStatus)
\r
440 case NAT_TCP_CONNECTING:
\r
441 tmp9 = _UU("NAT_TCP_CONNECTING");
\r
443 case NAT_TCP_SEND_RESET:
\r
444 tmp9 = _UU("NAT_TCP_SEND_RESET");
\r
446 case NAT_TCP_CONNECTED:
\r
447 tmp9 = _UU("NAT_TCP_CONNECTED");
\r
449 case NAT_TCP_ESTABLISHED:
\r
450 tmp9 = _UU("NAT_TCP_ESTABLISHED");
\r
452 case NAT_TCP_WAIT_DISCONNECT:
\r
453 tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
\r
458 LvInsertAdd(b, ICO_PROTOCOL, NULL, 10,
\r
459 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
\r
462 LvInsertEnd(b, hWnd, L_TABLE);
\r
464 FreeRpcEnumNat(&t);
\r
468 UINT NmNatProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
470 SM_HUB *r = (SM_HUB *)param;
\r
479 case WM_INITDIALOG:
\r
480 NmNatInit(hWnd, r);
\r
481 SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
\r
492 NmNatRefresh(hWnd, r);
\r
501 KillTimer(hWnd, 1);
\r
502 NmNatRefresh(hWnd, r);
\r
503 SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
\r
509 EndDialog(hWnd, false);
\r
513 LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
\r
519 void NmNat(HWND hWnd, SM_HUB *r)
\r
522 if (hWnd == NULL || r == NULL)
\r
527 Dialog(hWnd, D_NM_NAT, NmNatProc, r);
\r
531 bool NmInfo(HWND hWnd, SM_SERVER *s, void *param)
\r
535 wchar_t tmp[MAX_SIZE];
\r
537 if (hWnd == NULL || s == NULL)
\r
542 Zero(&t, sizeof(t));
\r
544 if (CALL(hWnd, NcGetInfo(s->Rpc, &t)) == false)
\r
549 b = LvInsertStart();
\r
551 StrToUni(tmp, sizeof(tmp), t.NatProductName);
\r
552 LvInsertAdd(b, ICO_ROUTER, NULL, 2, _UU("NM_INFO_PRODUCT_NAME"), tmp);
\r
554 StrToUni(tmp, sizeof(tmp), t.NatVersionString);
\r
555 LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_VERSION_STR"), tmp);
\r
557 StrToUni(tmp, sizeof(tmp), t.NatBuildInfoString);
\r
558 LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_BUILD_INFO"), tmp);
\r
560 StrToUni(tmp, sizeof(tmp), t.NatHostName);
\r
561 LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("NM_INFO_HOSTNAME"), tmp);
\r
564 StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
\r
565 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SYSTEM_NAME"), tmp);
\r
567 StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
\r
568 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_PRODUCT_NAME"), tmp);
\r
570 if (t.OsInfo.OsServicePack != 0)
\r
572 UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
\r
573 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SERVICE_PACK"), tmp);
\r
576 StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
\r
577 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VENDER_NAME"), tmp);
\r
579 StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
\r
580 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VERSION"), tmp);
\r
582 StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
\r
583 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_NAME"), tmp);
\r
585 StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
\r
586 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_VERSION"), tmp);
\r
589 if (t.MemInfo.TotalMemory != 0)
\r
593 ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
\r
594 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
595 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_MEMORY"), tmp);
\r
597 ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
\r
598 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
599 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_MEMORY"), tmp);
\r
601 ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
\r
602 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
603 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_MEMORY"), tmp);
\r
605 ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
\r
606 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
607 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_PHYS"), tmp);
\r
609 ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
\r
610 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
611 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_PHYS"), tmp);
\r
613 ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
\r
614 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
\r
615 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_PHYS"), tmp);
\r
618 LvInsertEnd(b, hWnd, L_STATUS);
\r
620 FreeRpcNatInfo(&t);
\r
626 bool NmStatus(HWND hWnd, SM_SERVER *s, void *param)
\r
630 wchar_t tmp[MAX_SIZE];
\r
631 SM_HUB *h = (SM_HUB *)param;
\r
633 if (hWnd == NULL || s == NULL)
\r
638 Zero(&t, sizeof(t));
\r
640 StrCpy(t.HubName, sizeof(t.HubName), h->HubName);
\r
642 if (CALL(hWnd, ScGetSecureNATStatus(s->Rpc, &t)) == false)
\r
647 b = LvInsertStart();
\r
649 StrToUni(tmp, sizeof(tmp), h->HubName);
\r
650 LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_HUB_COLUMN_1"), tmp);
\r
652 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
\r
653 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_TCP"), tmp);
\r
655 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
\r
656 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_UDP"), tmp);
\r
658 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
\r
659 LvInsertAdd(b, ICO_PROTOCOL_DHCP, NULL, 2, _UU("NM_STATUS_DHCP"), tmp);
\r
661 LvInsertEnd(b, hWnd, L_STATUS);
\r
663 FreeRpcNatStatus(&t);
\r
668 // フォームの内容を VH_OPTION に変換
\r
669 void NmEditVhOptionFormToVH(HWND hWnd, VH_OPTION *t)
\r
671 char tmp[MAX_SIZE];
\r
674 if (hWnd == NULL || t == NULL)
\r
679 Zero(t, sizeof(VH_OPTION));
\r
681 GetTxtA(hWnd, E_MAC, tmp, sizeof(tmp));
\r
687 Copy(t->MacAddress, b->Buf, 6);
\r
692 UINTToIP(&t->Ip, IpGet(hWnd, E_IP));
\r
693 UINTToIP(&t->Mask, IpGet(hWnd, E_MASK));
\r
695 t->UseNat = IsChecked(hWnd, R_USE_NAT);
\r
696 t->Mtu = GetInt(hWnd, E_MTU);
\r
697 t->NatTcpTimeout = GetInt(hWnd, E_TCP);
\r
698 t->NatUdpTimeout = GetInt(hWnd, E_UDP);
\r
700 t->UseDhcp = IsChecked(hWnd, R_USE_DHCP);
\r
701 UINTToIP(&t->DhcpLeaseIPStart, IpGet(hWnd, E_DHCP_START));
\r
702 UINTToIP(&t->DhcpLeaseIPEnd, IpGet(hWnd, E_DHCP_END));
\r
703 UINTToIP(&t->DhcpSubnetMask, IpGet(hWnd, E_DHCP_MASK));
\r
704 t->DhcpExpireTimeSpan = GetInt(hWnd, E_EXPIRES);
\r
705 UINTToIP(&t->DhcpGatewayAddress, IpGet(hWnd, E_GATEWAY));
\r
706 UINTToIP(&t->DhcpDnsServerAddress, IpGet(hWnd, E_DNS));
\r
707 GetTxtA(hWnd, E_DOMAIN, t->DhcpDomainName, sizeof(t->DhcpDomainName));
\r
708 t->SaveLog = IsChecked(hWnd, R_SAVE_LOG);
\r
712 void NmEditVhOptionInit(HWND hWnd, SM_HUB *r)
\r
714 char tmp[MAX_SIZE];
\r
717 if (hWnd == NULL || r == NULL)
\r
722 FormatText(hWnd, S_TITLE, r->HubName);
\r
724 Zero(&t, sizeof(VH_OPTION));
\r
725 StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
\r
726 if (CALL(hWnd, ScGetSecureNATOption(r->Rpc, &t)) == false)
\r
728 EndDialog(hWnd, false);
\r
732 if (GetCapsBool(r->p->CapsList, "b_virtual_nat_disabled"))
\r
734 SetEnable(hWnd, R_USE_NAT, false);
\r
735 Check(hWnd, R_USE_NAT, false);
\r
738 MacToStr(tmp, sizeof(tmp), t.MacAddress);
\r
739 SetTextA(hWnd, E_MAC, tmp);
\r
740 IpSet(hWnd, E_IP, IPToUINT(&t.Ip));
\r
741 IpSet(hWnd, E_MASK, IPToUINT(&t.Mask));
\r
743 Check(hWnd, R_USE_NAT, t.UseNat);
\r
744 SetIntEx(hWnd, E_MTU, t.Mtu);
\r
745 SetIntEx(hWnd, E_TCP, t.NatTcpTimeout);
\r
746 SetIntEx(hWnd, E_UDP, t.NatUdpTimeout);
\r
748 Check(hWnd, R_USE_DHCP, t.UseDhcp);
\r
749 IpSet(hWnd, E_DHCP_START, IPToUINT(&t.DhcpLeaseIPStart));
\r
750 IpSet(hWnd, E_DHCP_END, IPToUINT(&t.DhcpLeaseIPEnd));
\r
751 IpSet(hWnd, E_DHCP_MASK, IPToUINT(&t.DhcpSubnetMask));
\r
752 SetIntEx(hWnd, E_EXPIRES, t.DhcpExpireTimeSpan);
\r
754 if (IPToUINT(&t.DhcpGatewayAddress) != 0)
\r
756 IpSet(hWnd, E_GATEWAY, IPToUINT(&t.DhcpGatewayAddress));
\r
759 if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
\r
761 IpSet(hWnd, E_DNS, IPToUINT(&t.DhcpDnsServerAddress));
\r
764 SetTextA(hWnd, E_DOMAIN, t.DhcpDomainName);
\r
765 Check(hWnd, R_SAVE_LOG, t.SaveLog);
\r
767 NmEditVhOptionUpdate(hWnd, r);
\r
771 void NmEditVhOptionUpdate(HWND hWnd, SM_HUB *r)
\r
776 if (hWnd == NULL || r == NULL)
\r
781 NmEditVhOptionFormToVH(hWnd, &t);
\r
783 if (IsZero(t.MacAddress, 6))
\r
788 if (IPToUINT(&t.Ip) == 0 || IPToUINT(&t.Mask) == 0)
\r
793 if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)
\r
798 if (IsHostIPAddress4(&t.Ip) == false || IsSubnetMask4(&t.Mask) == false)
\r
805 if (t.Mtu < 64 || t.Mtu > 1500)
\r
810 if (t.NatTcpTimeout < (NAT_TCP_MIN_TIMEOUT / 1000) || t.NatTcpTimeout > (NAT_TCP_MAX_TIMEOUT / 1000))
\r
815 if (t.NatUdpTimeout < (NAT_UDP_MIN_TIMEOUT / 1000) || t.NatUdpTimeout > (NAT_UDP_MAX_TIMEOUT / 1000))
\r
823 if (IpIsFilled(hWnd, E_DHCP_START) == false || IpIsFilled(hWnd, E_DHCP_END) == false ||
\r
824 IpIsFilled(hWnd, E_DHCP_MASK) == false)
\r
829 if (IpGetFilledNum(hWnd, E_GATEWAY) != 0 && IpGetFilledNum(hWnd, E_GATEWAY) != 4)
\r
834 if (IpGetFilledNum(hWnd, E_DNS) != 0 && IpGetFilledNum(hWnd, E_DNS) != 4)
\r
839 if (IPToUINT(&t.DhcpLeaseIPStart) == 0 || IPToUINT(&t.DhcpLeaseIPEnd) == 0 ||
\r
840 IPToUINT(&t.DhcpSubnetMask) == 0)
\r
845 if (t.DhcpExpireTimeSpan < 15)
\r
850 if (Endian32(IPToUINT(&t.DhcpLeaseIPStart)) > Endian32(IPToUINT(&t.DhcpLeaseIPEnd)))
\r
855 if (IsHostIPAddress4(&t.DhcpLeaseIPStart) == false ||
\r
856 IsHostIPAddress4(&t.DhcpLeaseIPEnd) == false)
\r
861 if (IsSubnetMask4(&t.DhcpSubnetMask) == false)
\r
867 SetEnable(hWnd, E_MTU, t.UseNat);
\r
868 SetEnable(hWnd, E_TCP, t.UseNat);
\r
869 SetEnable(hWnd, E_UDP, t.UseNat);
\r
871 SetEnable(hWnd, E_DHCP_START, t.UseDhcp);
\r
872 SetEnable(hWnd, E_DHCP_END, t.UseDhcp);
\r
873 SetEnable(hWnd, E_DHCP_MASK, t.UseDhcp);
\r
874 SetEnable(hWnd, E_EXPIRES, t.UseDhcp);
\r
875 SetEnable(hWnd, E_GATEWAY, t.UseDhcp);
\r
876 SetEnable(hWnd, E_DNS, t.UseDhcp);
\r
877 SetEnable(hWnd, E_DOMAIN, t.UseDhcp);
\r
879 SetEnable(hWnd, IDOK, ok);
\r
883 void NmEditVhOptionOnOk(HWND hWnd, SM_HUB *r)
\r
887 if (hWnd == NULL || r == NULL)
\r
892 NmEditVhOptionFormToVH(hWnd, &t);
\r
893 StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
\r
895 if (CALL(hWnd, ScSetSecureNATOption(r->Rpc, &t)))
\r
897 EndDialog(hWnd, true);
\r
901 // 仮想ホストオプション編集ダイアログ
\r
902 UINT NmEditVhOptionProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
904 SM_HUB *r = (SM_HUB *)param;
\r
913 case WM_INITDIALOG:
\r
914 NmEditVhOptionInit(hWnd, r);
\r
918 switch (LOWORD(wParam))
\r
936 NmEditVhOptionUpdate(hWnd, r);
\r
943 NmEditVhOptionOnOk(hWnd, r);
\r
947 EndDialog(hWnd, false);
\r
951 if (IsChecked(hWnd, R_USE_NAT))
\r
953 FocusEx(hWnd, E_MTU);
\r
956 if (IsChecked(hWnd, R_USE_DHCP))
\r
958 Focus(hWnd, E_DHCP_START);
\r
970 void NmEditVhOption(HWND hWnd, SM_HUB *r)
\r
973 if (hWnd == NULL || r == NULL)
\r
978 Dialog(hWnd, D_NM_OPTION, NmEditVhOptionProc, r);
\r
982 void NmEditClientConfig(HWND hWnd, RPC *r)
\r
988 if (hWnd == NULL || r == NULL)
\r
993 Zero(&a, sizeof(a));
\r
994 Zero(&t, sizeof(t));
\r
996 a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
1000 if (CALLEX(hWnd, NcGetClientConfig(r, &t)) != ERR_NO_ERROR)
\r
1003 a.ClientOption->Port = 443;
\r
1004 a.ClientOption->RetryInterval = 15;
\r
1005 a.ClientOption->NumRetry = INFINITE;
\r
1006 a.ClientOption->AdditionalConnectionInterval = 1;
\r
1007 a.ClientOption->UseEncrypt = true;
\r
1008 a.ClientOption->NoRoutingTracking = true;
\r
1009 a.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
\r
1010 a.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
\r
1015 a.EditMode = true;
\r
1016 Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION));
\r
1017 a.ClientAuth = CopyClientAuth(t.ClientAuth);
\r
1019 FreeRpcCreateLink(&t);
\r
1022 ret = CmEditAccountDlg(hWnd, &a);
\r
1024 Free(a.ServerCert);
\r
1025 Free(a.ClientOption);
\r
1026 CiFreeClientAuth(a.ClientAuth);
\r
1030 void NmMainDlgInit(HWND hWnd, RPC *r)
\r
1033 if (r == NULL || hWnd == NULL)
\r
1038 SetIcon(hWnd, 0, ICO_ROUTER);
\r
1039 FormatText(hWnd, 0, r->Sock->RemoteHostname);
\r
1040 DlgFont(hWnd, S_STATUS, 11, true);
\r
1042 NmMainDlgRefresh(hWnd, r);
\r
1046 void NmMainDlgRefresh(HWND hWnd, RPC *r)
\r
1050 wchar_t tmp[MAX_SIZE];
\r
1051 wchar_t tmp2[MAX_SIZE];
\r
1053 if (r == NULL || hWnd == NULL)
\r
1058 Zero(&t, sizeof(RPC_NAT_STATUS));
\r
1060 CALL(hWnd, NcGetStatus(r, &t));
\r
1062 if (t.Online == false)
\r
1064 UniStrCpy(tmp, sizeof(tmp), _UU("NM_OFFLINE"));
\r
1066 Enable(hWnd, B_CONNECT);
\r
1067 Disable(hWnd, B_DISCONNECT);
\r
1073 UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECTED"), t.Status.ServerName);
\r
1077 if (t.LastError == ERR_NO_ERROR)
\r
1079 UniStrCpy(tmp, sizeof(tmp), _UU("NM_CONNECTING"));
\r
1083 UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECT_ERROR"), t.LastError, _E(t.LastError));
\r
1086 Disable(hWnd, B_CONNECT);
\r
1087 Enable(hWnd, B_DISCONNECT);
\r
1090 UniFormat(tmp2, sizeof(tmp2), _UU("NM_STATUS_TAG"), tmp);
\r
1092 SetText(hWnd, S_STATUS, tmp2);
\r
1094 FreeRpcNatStatus(&t);
\r
1099 UINT NmMainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1102 SM_HUB *r = (SM_HUB *)param;
\r
1113 case WM_INITDIALOG:
\r
1114 NmMainDlgInit(hWnd, r);
\r
1116 SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
\r
1125 NmEditClientConfig(hWnd, r);
\r
1130 Zero(&dummy, sizeof(dummy));
\r
1131 CALL(hWnd, NcOnline(r, &dummy));
\r
1132 NmMainDlgRefresh(hWnd, r);
\r
1135 case B_DISCONNECT:
\r
1137 Zero(&dummy, sizeof(dummy));
\r
1138 CALL(hWnd, NcOffline(r, &dummy));
\r
1139 NmMainDlgRefresh(hWnd, r);
\r
1144 NmEditVhOption(hWnd, r->Rpc);
\r
1159 Zero(&sm, sizeof(sm));
\r
1161 SmStatusDlg(hWnd, &sm, NULL, true, true, _UU("NM_STATUS"), ICO_ROUTER,
\r
1167 Zero(&sm, sizeof(sm));
\r
1169 SmStatusDlg(hWnd, &sm, NULL, false, true, _UU("NM_INFO"), ICO_ROUTER,
\r
1175 NmMainDlgRefresh(hWnd, r);
\r
1180 NmChangePassword(hWnd, r);
\r
1185 About(hWnd, nm->Cedar, CEDAR_ROUTER_STR, BMP_SPLASH_ROUTER);
\r
1198 KillTimer(hWnd, 1);
\r
1200 if (IsEnable(hWnd, 0))
\r
1202 NmMainDlgRefresh(hWnd, r);
\r
1205 SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
\r
1211 EndDialog(hWnd, false);
\r
1221 void NmMainDlg(RPC *r)
\r
1229 Dialog(NULL, D_NM_MAIN, NmMainDlgProc, r);
\r
1233 UINT NmLogin(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1235 NM_LOGIN *login = (NM_LOGIN *)param;
\r
1236 char tmp[MAX_SIZE];
\r
1245 case WM_INITDIALOG:
\r
1246 FormatText(hWnd, S_TITLE, login->Hostname);
\r
1253 GetTxtA(hWnd, E_PASSWORD, tmp, sizeof(tmp));
\r
1254 Hash(login->hashed_password, tmp, StrLen(tmp), true);
\r
1255 EndDialog(hWnd, true);
\r
1265 EndDialog(hWnd, false);
\r
1273 UINT NmConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
\r
1275 NM_CONNECT *t = (NM_CONNECT *)param;
\r
1287 case WM_INITDIALOG:
\r
1288 FormatText(hWnd, S_TITLE, t->Hostname);
\r
1289 SetTimer(hWnd, 1, 50, NULL);
\r
1296 KillTimer(hWnd, 1);
\r
1300 bool flag = false;
\r
1303 Zero(&login, sizeof(login));
\r
1304 login.Hostname = t->Hostname;
\r
1305 login.Port = t->Port;
\r
1306 Hash(login.hashed_password, "", 0, true);
\r
1310 if (Dialog(hWnd, D_NM_LOGIN, NmLogin, &login) == false)
\r
1312 EndDialog(hWnd, false);
\r
1318 Refresh(DlgItem(hWnd, S_TITLE));
\r
1321 rpc = NatAdminConnect(nm->Cedar, t->Hostname, t->Port, login.hashed_password, &err);
\r
1325 EndDialog(hWnd, true);
\r
1330 if (err == ERR_ACCESS_DENIED || err == ERR_AUTH_FAILED)
\r
1334 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
\r
1335 _E(err)) == IDCANCEL)
\r
1337 EndDialog(hWnd, false);
\r
1342 goto RETRY_PASSWORD;
\r
1346 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
\r
1347 _E(err)) == IDCANCEL)
\r
1349 EndDialog(hWnd, false);
\r
1352 goto RETRY_CONNECT;
\r
1363 // User-mode NAT プログラムに接続する
\r
1364 RPC *NmConnect(char *hostname, UINT port)
\r
1368 if (hostname == NULL || port == 0)
\r
1373 Zero(&t, sizeof(t));
\r
1374 t.Hostname = hostname;
\r
1377 Dialog(NULL, D_NM_CONNECT, NmConnectDlgProc, &t);
\r
1386 char hostname[MAX_HOST_NAME_LEN + 1];
\r
1388 RemoteDlg(NULL, NM_SETTING_REG_KEY, ICO_ROUTER,
\r
1389 _UU("NM_TITLE"), _UU("NM_CONNECT_TITLE"), NULL);
\r
1392 Zero(hostname, sizeof(hostname));
\r
1399 t = ParseToken(tmp, ":");
\r
1400 port = DEFAULT_NAT_ADMIN_PORT;
\r
1402 if (t->NumTokens >= 2)
\r
1404 UINT i = ToInt(t->Token[1]);
\r
1410 if (t->NumTokens >= 1)
\r
1413 StrCpy(hostname, sizeof(hostname), t->Token[0]);
\r
1418 if (StrLen(hostname) != 0)
\r
1420 rpc = NmConnect(hostname, port);
\r
1425 NatAdminDisconnect(rpc);
\r
1444 nm = ZeroMalloc(sizeof(NM));
\r
1446 InitWinUi(_UU("NM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
\r
1448 nm->Cedar = NewCedar(NULL, NULL);
\r
1466 ReleaseCedar(nm->Cedar);
\r