* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / NM.c
1 // SoftEther UT-VPN SourceCode\r
2 // \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
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \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
13 // \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
18 // \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
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \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
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // NM.c\r
79 // Win32 用 SoftEther UT-VPN User-mode Router Manager\r
80 \r
81 \r
82 #ifdef  WIN32\r
83 \r
84 #define SM_C\r
85 #define CM_C\r
86 #define NM_C\r
87 \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
94 #include <shlobj.h>\r
95 #include <commctrl.h>\r
96 #include <Dbghelp.h>\r
97 #include <stdio.h>\r
98 #include <stdlib.h>\r
99 #include <string.h>\r
100 #include <wchar.h>\r
101 #include <stdarg.h>\r
102 #include <time.h>\r
103 #include <errno.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
110 \r
111 // グローバル変数\r
112 static NM *nm = NULL;\r
113 \r
114 \r
115 // パスワード変更ダイアログ\r
116 UINT NmChangePasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
117 {\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
122         // 引数チェック\r
123         if (hWnd == NULL)\r
124         {\r
125                 return 0;\r
126         }\r
127 \r
128         switch (msg)\r
129         {\r
130         case WM_INITDIALOG:\r
131                 FormatText(hWnd, 0, r->Sock->RemoteHostname);\r
132                 FormatText(hWnd, S_TITLE, r->Sock->RemoteHostname);\r
133                 break;\r
134 \r
135         case WM_COMMAND:\r
136                 GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));\r
137                 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));\r
138                 switch (LOWORD(wParam))\r
139                 {\r
140                 case E_PASSWORD1:\r
141                 case E_PASSWORD2:\r
142                         SetEnable(hWnd, IDOK, StrCmp(tmp1, tmp2) == 0);\r
143                         break;\r
144                 }\r
145 \r
146                 switch (wParam)\r
147                 {\r
148                 case IDOK:\r
149                         Zero(&t, sizeof(t));\r
150                         Hash(t.HashedPassword, tmp1, StrLen(tmp1), true);\r
151 \r
152                         if (CALL(hWnd, NcSetPassword(r, &t)))\r
153                         {\r
154                                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("NM_PASSWORD_MSG"));\r
155                                 EndDialog(hWnd, true);\r
156                         }\r
157                         break;\r
158 \r
159                 case IDCANCEL:\r
160                         Close(hWnd);\r
161                         break;\r
162                 }\r
163                 break;\r
164 \r
165         case WM_CLOSE:\r
166                 EndDialog(hWnd, false);\r
167                 break;\r
168         }\r
169 \r
170         return 0;\r
171 }\r
172 \r
173 // パスワードの変更\r
174 void NmChangePassword(HWND hWnd, RPC *r)\r
175 {\r
176         // 引数チェック\r
177         if (hWnd == NULL || r == NULL)\r
178         {\r
179                 return;\r
180         }\r
181 \r
182         Dialog(hWnd, D_NM_CHANGE_PASSWORD, NmChangePasswordProc, r);\r
183 }\r
184 \r
185 // DHCP 列挙初期化\r
186 void NmDhcpInit(HWND hWnd, SM_HUB *r)\r
187 {\r
188         // 引数チェック\r
189         if (hWnd == NULL || r == NULL)\r
190         {\r
191                 return;\r
192         }\r
193 \r
194         SetIcon(hWnd, 0, ICO_INTERNET);\r
195 \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
203 \r
204         NmDhcpRefresh(hWnd, r);\r
205 }\r
206 \r
207 // DHCP 列挙\r
208 void NmDhcpRefresh(HWND hWnd, SM_HUB *r)\r
209 {\r
210         LVB *b;\r
211         RPC_ENUM_DHCP t;\r
212         UINT i;\r
213         // 引数チェック\r
214         if (hWnd == NULL || r == NULL)\r
215         {\r
216                 Close(hWnd);\r
217                 return;\r
218         }\r
219 \r
220         Zero(&t, sizeof(t));\r
221 \r
222         StrCpy(t.HubName, sizeof(t.HubName), r->HubName);\r
223 \r
224         if (CALL(hWnd, ScEnumDHCP(r->Rpc, &t)) == false)\r
225         {\r
226                 return;\r
227         }\r
228 \r
229         b = LvInsertStart();\r
230         \r
231         for (i = 0;i < t.NumItem;i++)\r
232         {\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
241 \r
242                 // ID\r
243                 UniToStru(tmp0, e->Id);\r
244 \r
245                 // 時刻\r
246                 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);\r
247                 GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);\r
248 \r
249                 MacToStr(str, sizeof(str), e->MacAddress);\r
250                 StrToUni(tmp3, sizeof(tmp3), str);\r
251 \r
252                 IPToStr32(str, sizeof(str), e->IpAddress);\r
253                 StrToUni(tmp4, sizeof(tmp4), str);\r
254 \r
255                 StrToUni(tmp5, sizeof(tmp5), e->Hostname);\r
256 \r
257                 LvInsertAdd(b, ICO_INTERNET, NULL, 6,\r
258                         tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);\r
259         }\r
260 \r
261         LvInsertEnd(b, hWnd, L_TABLE);\r
262 \r
263         FreeRpcEnumDhcp(&t);\r
264 }\r
265 \r
266 // DHCP 列挙プロシージャ\r
267 UINT NmDhcpProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
268 {\r
269         SM_HUB *r = (SM_HUB *)param;\r
270         // 引数チェック\r
271         if (hWnd == NULL)\r
272         {\r
273                 return 0;\r
274         }\r
275 \r
276         switch (msg)\r
277         {\r
278         case WM_INITDIALOG:\r
279                 NmDhcpInit(hWnd, r);\r
280                 SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);\r
281                 break;\r
282 \r
283         case WM_COMMAND:\r
284                 switch (wParam)\r
285                 {\r
286                 case IDCANCEL:\r
287                         Close(hWnd);\r
288                         break;\r
289 \r
290                 case B_REFRESH:\r
291                         NmDhcpRefresh(hWnd, r);\r
292                         break;\r
293                 }\r
294                 break;\r
295 \r
296         case WM_TIMER:\r
297                 switch (wParam)\r
298                 {\r
299                 case 1:\r
300                         KillTimer(hWnd, 1);\r
301                         NmDhcpRefresh(hWnd, r);\r
302                         SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);\r
303                         break;\r
304                 }\r
305                 break;\r
306 \r
307         case WM_CLOSE:\r
308                 EndDialog(hWnd, false);\r
309                 break;\r
310         }\r
311 \r
312         LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);\r
313 \r
314         return 0;\r
315 }\r
316 \r
317 // DHCP 列挙\r
318 void NmDhcp(HWND hWnd, SM_HUB *r)\r
319 {\r
320         // 引数チェック\r
321         if (hWnd == NULL || r == NULL)\r
322         {\r
323                 return;\r
324         }\r
325 \r
326         Dialog(hWnd, D_NM_DHCP, NmDhcpProc, r);\r
327 }\r
328 \r
329 \r
330 // NAT 列挙初期化\r
331 void NmNatInit(HWND hWnd, SM_HUB *r)\r
332 {\r
333         // 引数チェック\r
334         if (hWnd == NULL || r == NULL)\r
335         {\r
336                 return;\r
337         }\r
338 \r
339         SetIcon(hWnd, 0, ICO_PROTOCOL);\r
340 \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
352 \r
353         NmNatRefresh(hWnd, r);\r
354 }\r
355 \r
356 // NAT 列挙\r
357 void NmNatRefresh(HWND hWnd, SM_HUB *r)\r
358 {\r
359         LVB *b;\r
360         RPC_ENUM_NAT t;\r
361         UINT i;\r
362         // 引数チェック\r
363         if (hWnd == NULL || r == NULL)\r
364         {\r
365                 return;\r
366         }\r
367 \r
368         Zero(&t, sizeof(t));\r
369 \r
370         StrCpy(t.HubName, sizeof(t.HubName), r->HubName);\r
371 \r
372         if (CALL(hWnd, ScEnumNAT(r->Rpc, &t)) == false)\r
373         {\r
374                 Close(hWnd);\r
375                 return;\r
376         }\r
377 \r
378         b = LvInsertStart();\r
379         \r
380         for (i = 0;i < t.NumItem;i++)\r
381         {\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
394 \r
395                 // ID\r
396                 UniToStru(tmp0, e->Id);\r
397 \r
398                 // プロトコル\r
399                 switch (e->Protocol)\r
400                 {\r
401                 case NAT_TCP:\r
402                         tmp1 = _UU("NM_NAT_PROTO_TCP");\r
403                         break;\r
404                 case NAT_UDP:\r
405                         tmp1 = _UU("NM_NAT_PROTO_UDP");\r
406                         break;\r
407                 case NAT_DNS:\r
408                         tmp1 = _UU("NM_NAT_PROTO_DNS");\r
409                         break;\r
410                 }\r
411 \r
412                 // 接続元ホスト\r
413                 StrToUni(tmp2, sizeof(tmp2), e->SrcHost);\r
414 \r
415                 // 接続元ポート\r
416                 UniToStru(tmp3, e->SrcPort);\r
417 \r
418                 // 接続先ホスト\r
419                 StrToUni(tmp4, sizeof(tmp4), e->DestHost);\r
420 \r
421                 // 接続先ポート\r
422                 UniToStru(tmp5, e->DestPort);\r
423 \r
424                 // セッション作成日時\r
425                 GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);\r
426 \r
427                 // 最終通信日時\r
428                 GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);\r
429 \r
430                 // 通信量\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
434 \r
435                 // TCP 状態\r
436                 if (e->Protocol == NAT_TCP)\r
437                 {\r
438                         switch (e->TcpStatus)\r
439                         {\r
440                         case NAT_TCP_CONNECTING:\r
441                                 tmp9 = _UU("NAT_TCP_CONNECTING");\r
442                                 break;\r
443                         case NAT_TCP_SEND_RESET:\r
444                                 tmp9 = _UU("NAT_TCP_SEND_RESET");\r
445                                 break;\r
446                         case NAT_TCP_CONNECTED:\r
447                                 tmp9 = _UU("NAT_TCP_CONNECTED");\r
448                                 break;\r
449                         case NAT_TCP_ESTABLISHED:\r
450                                 tmp9 = _UU("NAT_TCP_ESTABLISHED");\r
451                                 break;\r
452                         case NAT_TCP_WAIT_DISCONNECT:\r
453                                 tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");\r
454                                 break;\r
455                         }\r
456                 }\r
457 \r
458                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 10,\r
459                         tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);\r
460         }\r
461 \r
462         LvInsertEnd(b, hWnd, L_TABLE);\r
463 \r
464         FreeRpcEnumNat(&t);\r
465 }\r
466 \r
467 // NAT 列挙プロシージャ\r
468 UINT NmNatProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
469 {\r
470         SM_HUB *r = (SM_HUB *)param;\r
471         // 引数チェック\r
472         if (hWnd == NULL)\r
473         {\r
474                 return 0;\r
475         }\r
476 \r
477         switch (msg)\r
478         {\r
479         case WM_INITDIALOG:\r
480                 NmNatInit(hWnd, r);\r
481                 SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);\r
482                 break;\r
483 \r
484         case WM_COMMAND:\r
485                 switch (wParam)\r
486                 {\r
487                 case IDCANCEL:\r
488                         Close(hWnd);\r
489                         break;\r
490 \r
491                 case B_REFRESH:\r
492                         NmNatRefresh(hWnd, r);\r
493                         break;\r
494                 }\r
495                 break;\r
496 \r
497         case WM_TIMER:\r
498                 switch (wParam)\r
499                 {\r
500                 case 1:\r
501                         KillTimer(hWnd, 1);\r
502                         NmNatRefresh(hWnd, r);\r
503                         SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);\r
504                         break;\r
505                 }\r
506                 break;\r
507 \r
508         case WM_CLOSE:\r
509                 EndDialog(hWnd, false);\r
510                 break;\r
511         }\r
512 \r
513         LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);\r
514 \r
515         return 0;\r
516 }\r
517 \r
518 // NAT 列挙\r
519 void NmNat(HWND hWnd, SM_HUB *r)\r
520 {\r
521         // 引数チェック\r
522         if (hWnd == NULL || r == NULL)\r
523         {\r
524                 return;\r
525         }\r
526 \r
527         Dialog(hWnd, D_NM_NAT, NmNatProc, r);\r
528 }\r
529 \r
530 // ルーターの情報の表示\r
531 bool NmInfo(HWND hWnd, SM_SERVER *s, void *param)\r
532 {\r
533         LVB *b;\r
534         RPC_NAT_INFO t;\r
535         wchar_t tmp[MAX_SIZE];\r
536         // 引数チェック\r
537         if (hWnd == NULL || s == NULL)\r
538         {\r
539                 return false;\r
540         }\r
541 \r
542         Zero(&t, sizeof(t));\r
543 \r
544         if (CALL(hWnd, NcGetInfo(s->Rpc, &t)) == false)\r
545         {\r
546                 return false;\r
547         }\r
548 \r
549         b = LvInsertStart();\r
550 \r
551         StrToUni(tmp, sizeof(tmp), t.NatProductName);\r
552         LvInsertAdd(b, ICO_ROUTER, NULL, 2, _UU("NM_INFO_PRODUCT_NAME"), tmp);\r
553 \r
554         StrToUni(tmp, sizeof(tmp), t.NatVersionString);\r
555         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_VERSION_STR"), tmp);\r
556 \r
557         StrToUni(tmp, sizeof(tmp), t.NatBuildInfoString);\r
558         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_BUILD_INFO"), tmp);\r
559 \r
560         StrToUni(tmp, sizeof(tmp), t.NatHostName);\r
561         LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("NM_INFO_HOSTNAME"), tmp);\r
562 \r
563         // OS\r
564         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);\r
565         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SYSTEM_NAME"), tmp);\r
566 \r
567         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);\r
568         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_PRODUCT_NAME"), tmp);\r
569 \r
570         if (t.OsInfo.OsServicePack != 0)\r
571         {\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
574         }\r
575 \r
576         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);\r
577         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VENDER_NAME"), tmp);\r
578 \r
579         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);\r
580         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VERSION"), tmp);\r
581 \r
582         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);\r
583         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_NAME"), tmp);\r
584 \r
585         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);\r
586         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_VERSION"), tmp);\r
587 \r
588         // メモリ情報\r
589         if (t.MemInfo.TotalMemory != 0)\r
590         {\r
591                 char vv[128];\r
592 \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
596 \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
600 \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
604 \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
608 \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
612 \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
616         }\r
617 \r
618         LvInsertEnd(b, hWnd, L_STATUS);\r
619 \r
620         FreeRpcNatInfo(&t);\r
621 \r
622         return true;\r
623 }\r
624 \r
625 // ルータの状況の表示\r
626 bool NmStatus(HWND hWnd, SM_SERVER *s, void *param)\r
627 {\r
628         LVB *b;\r
629         RPC_NAT_STATUS t;\r
630         wchar_t tmp[MAX_SIZE];\r
631         SM_HUB *h = (SM_HUB *)param;\r
632         // 引数チェック\r
633         if (hWnd == NULL || s == NULL)\r
634         {\r
635                 return false;\r
636         }\r
637 \r
638         Zero(&t, sizeof(t));\r
639 \r
640         StrCpy(t.HubName, sizeof(t.HubName), h->HubName);\r
641 \r
642         if (CALL(hWnd, ScGetSecureNATStatus(s->Rpc, &t)) == false)\r
643         {\r
644                 return false;\r
645         }\r
646 \r
647         b = LvInsertStart();\r
648 \r
649         StrToUni(tmp, sizeof(tmp), h->HubName);\r
650         LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_HUB_COLUMN_1"), tmp);\r
651 \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
654 \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
657 \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
660 \r
661         LvInsertEnd(b, hWnd, L_STATUS);\r
662 \r
663         FreeRpcNatStatus(&t);\r
664 \r
665         return true;\r
666 }\r
667 \r
668 // フォームの内容を VH_OPTION に変換\r
669 void NmEditVhOptionFormToVH(HWND hWnd, VH_OPTION *t)\r
670 {\r
671         char tmp[MAX_SIZE];\r
672         BUF *b;\r
673         // 引数チェック\r
674         if (hWnd == NULL || t == NULL)\r
675         {\r
676                 return;\r
677         }\r
678 \r
679         Zero(t, sizeof(VH_OPTION));\r
680 \r
681         GetTxtA(hWnd, E_MAC, tmp, sizeof(tmp));\r
682         b = StrToBin(tmp);\r
683         if (b != NULL)\r
684         {\r
685                 if (b->Size == 6)\r
686                 {\r
687                         Copy(t->MacAddress, b->Buf, 6);\r
688                 }\r
689                 FreeBuf(b);\r
690         }\r
691 \r
692         UINTToIP(&t->Ip, IpGet(hWnd, E_IP));\r
693         UINTToIP(&t->Mask, IpGet(hWnd, E_MASK));\r
694 \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
699 \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
709 }\r
710 \r
711 // 初期化\r
712 void NmEditVhOptionInit(HWND hWnd, SM_HUB *r)\r
713 {\r
714         char tmp[MAX_SIZE];\r
715         VH_OPTION t;\r
716         // 引数チェック\r
717         if (hWnd == NULL || r == NULL)\r
718         {\r
719                 return;\r
720         }\r
721 \r
722         FormatText(hWnd, S_TITLE, r->HubName);\r
723 \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
727         {\r
728                 EndDialog(hWnd, false);\r
729                 return;\r
730         }\r
731 \r
732         if (GetCapsBool(r->p->CapsList, "b_virtual_nat_disabled"))\r
733         {\r
734                 SetEnable(hWnd, R_USE_NAT, false);\r
735                 Check(hWnd, R_USE_NAT, false);\r
736         }\r
737 \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
742 \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
747 \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
753 \r
754         if (IPToUINT(&t.DhcpGatewayAddress) != 0)\r
755         {\r
756                 IpSet(hWnd, E_GATEWAY, IPToUINT(&t.DhcpGatewayAddress));\r
757         }\r
758 \r
759         if (IPToUINT(&t.DhcpDnsServerAddress) != 0)\r
760         {\r
761                 IpSet(hWnd, E_DNS, IPToUINT(&t.DhcpDnsServerAddress));\r
762         }\r
763 \r
764         SetTextA(hWnd, E_DOMAIN, t.DhcpDomainName);\r
765         Check(hWnd, R_SAVE_LOG, t.SaveLog);\r
766 \r
767         NmEditVhOptionUpdate(hWnd, r);\r
768 \r
769 }\r
770 \r
771 void NmEditVhOptionUpdate(HWND hWnd, SM_HUB *r)\r
772 {\r
773         VH_OPTION t;\r
774         bool ok = true;\r
775         // 引数チェック\r
776         if (hWnd == NULL || r == NULL)\r
777         {\r
778                 return;\r
779         }\r
780 \r
781         NmEditVhOptionFormToVH(hWnd, &t);\r
782 \r
783         if (IsZero(t.MacAddress, 6))\r
784         {\r
785                 ok = false;\r
786         }\r
787 \r
788         if (IPToUINT(&t.Ip) == 0 || IPToUINT(&t.Mask) == 0)\r
789         {\r
790                 ok = false;\r
791         }\r
792 \r
793         if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)\r
794         {\r
795                 ok = false;\r
796         }\r
797 \r
798         if (IsHostIPAddress4(&t.Ip) == false || IsSubnetMask4(&t.Mask) == false)\r
799         {\r
800                 ok = false;\r
801         }\r
802 \r
803         if (t.UseNat)\r
804         {\r
805                 if (t.Mtu < 64 || t.Mtu > 1500)\r
806                 {\r
807                         ok = false;\r
808                 }\r
809 \r
810                 if (t.NatTcpTimeout < (NAT_TCP_MIN_TIMEOUT / 1000) || t.NatTcpTimeout > (NAT_TCP_MAX_TIMEOUT / 1000))\r
811                 {\r
812                         ok = false;\r
813                 }\r
814 \r
815                 if (t.NatUdpTimeout < (NAT_UDP_MIN_TIMEOUT / 1000) || t.NatUdpTimeout > (NAT_UDP_MAX_TIMEOUT / 1000))\r
816                 {\r
817                         ok = false;\r
818                 }\r
819         }\r
820 \r
821         if (t.UseDhcp)\r
822         {\r
823                 if (IpIsFilled(hWnd, E_DHCP_START) == false || IpIsFilled(hWnd, E_DHCP_END) == false ||\r
824                         IpIsFilled(hWnd, E_DHCP_MASK) == false)\r
825                 {\r
826                         ok = false;\r
827                 }\r
828 \r
829                 if (IpGetFilledNum(hWnd, E_GATEWAY) != 0 && IpGetFilledNum(hWnd, E_GATEWAY) != 4)\r
830                 {\r
831                         ok = false;\r
832                 }\r
833 \r
834                 if (IpGetFilledNum(hWnd, E_DNS) != 0 && IpGetFilledNum(hWnd, E_DNS) != 4)\r
835                 {\r
836                         ok = false;\r
837                 }\r
838 \r
839                 if (IPToUINT(&t.DhcpLeaseIPStart) == 0 || IPToUINT(&t.DhcpLeaseIPEnd) == 0 ||\r
840                         IPToUINT(&t.DhcpSubnetMask) == 0)\r
841                 {\r
842                         ok = false;\r
843                 }\r
844 \r
845                 if (t.DhcpExpireTimeSpan < 15)\r
846                 {\r
847                         ok = false;\r
848                 }\r
849 \r
850                 if (Endian32(IPToUINT(&t.DhcpLeaseIPStart)) > Endian32(IPToUINT(&t.DhcpLeaseIPEnd)))\r
851                 {\r
852                         ok = false;\r
853                 }\r
854 \r
855                 if (IsHostIPAddress4(&t.DhcpLeaseIPStart) == false ||\r
856                         IsHostIPAddress4(&t.DhcpLeaseIPEnd) == false)\r
857                 {\r
858                         ok = false;\r
859                 }\r
860 \r
861                 if (IsSubnetMask4(&t.DhcpSubnetMask) == false)\r
862                 {\r
863                         ok = false;\r
864                 }\r
865         }\r
866 \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
870 \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
878 \r
879         SetEnable(hWnd, IDOK, ok);\r
880 }\r
881 \r
882 // OK ボタン\r
883 void NmEditVhOptionOnOk(HWND hWnd, SM_HUB *r)\r
884 {\r
885         VH_OPTION t;\r
886         // 引数チェック\r
887         if (hWnd == NULL || r == NULL)\r
888         {\r
889                 return;\r
890         }\r
891 \r
892         NmEditVhOptionFormToVH(hWnd, &t);\r
893         StrCpy(t.HubName, sizeof(t.HubName), r->HubName);\r
894 \r
895         if (CALL(hWnd, ScSetSecureNATOption(r->Rpc, &t)))\r
896         {\r
897                 EndDialog(hWnd, true);\r
898         }\r
899 }\r
900 \r
901 // 仮想ホストオプション編集ダイアログ\r
902 UINT NmEditVhOptionProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
903 {\r
904         SM_HUB *r = (SM_HUB *)param;\r
905         // 引数チェック\r
906         if (hWnd == NULL)\r
907         {\r
908                 return 0;\r
909         }\r
910 \r
911         switch (msg)\r
912         {\r
913         case WM_INITDIALOG:\r
914                 NmEditVhOptionInit(hWnd, r);\r
915                 break;\r
916 \r
917         case WM_COMMAND:\r
918                 switch (LOWORD(wParam))\r
919                 {\r
920                 case E_MAC:\r
921                 case E_IP:\r
922                 case E_MASK:\r
923                 case R_USE_NAT:\r
924                 case E_MTU:\r
925                 case E_TCP:\r
926                 case E_UDP:\r
927                 case R_SAVE_LOG:\r
928                 case R_USE_DHCP:\r
929                 case E_DHCP_START:\r
930                 case E_DHCP_END:\r
931                 case E_DHCP_MASK:\r
932                 case E_EXPIRES:\r
933                 case E_GATEWAY:\r
934                 case E_DNS:\r
935                 case E_DOMAIN:\r
936                         NmEditVhOptionUpdate(hWnd, r);\r
937                         break;\r
938                 }\r
939 \r
940                 switch (wParam)\r
941                 {\r
942                 case IDOK:\r
943                         NmEditVhOptionOnOk(hWnd, r);\r
944                         break;\r
945 \r
946                 case IDCANCEL:\r
947                         EndDialog(hWnd, false);\r
948                         break;\r
949 \r
950                 case R_USE_NAT:\r
951                         if (IsChecked(hWnd, R_USE_NAT))\r
952                         {\r
953                                 FocusEx(hWnd, E_MTU);\r
954                         }\r
955 \r
956                         if (IsChecked(hWnd, R_USE_DHCP))\r
957                         {\r
958                                 Focus(hWnd, E_DHCP_START);\r
959                         }\r
960                         break;\r
961                 }\r
962 \r
963                 break;\r
964         }\r
965 \r
966         return 0;\r
967 }\r
968 \r
969 // 仮想ホストオプションの編集\r
970 void NmEditVhOption(HWND hWnd, SM_HUB *r)\r
971 {\r
972         // 引数チェック\r
973         if (hWnd == NULL || r == NULL)\r
974         {\r
975                 return;\r
976         }\r
977 \r
978         Dialog(hWnd, D_NM_OPTION, NmEditVhOptionProc, r);\r
979 }\r
980 \r
981 // クライアント設定の編集\r
982 void NmEditClientConfig(HWND hWnd, RPC *r)\r
983 {\r
984         CM_ACCOUNT a;\r
985         RPC_CREATE_LINK t;\r
986         bool ret = false;\r
987         // 引数チェック\r
988         if (hWnd == NULL || r == NULL)\r
989         {\r
990                 return;\r
991         }\r
992 \r
993         Zero(&a, sizeof(a));\r
994         Zero(&t, sizeof(t));\r
995 \r
996         a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
997         a.NatMode = true;\r
998         a.Rpc = r;\r
999 \r
1000         if (CALLEX(hWnd, NcGetClientConfig(r, &t)) != ERR_NO_ERROR)\r
1001         {\r
1002                 // 新規作成\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
1011         }\r
1012         else\r
1013         {\r
1014                 // 編集\r
1015                 a.EditMode = true;\r
1016                 Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION));\r
1017                 a.ClientAuth = CopyClientAuth(t.ClientAuth);\r
1018 \r
1019                 FreeRpcCreateLink(&t);\r
1020         }\r
1021 \r
1022         ret = CmEditAccountDlg(hWnd, &a);\r
1023 \r
1024         Free(a.ServerCert);\r
1025         Free(a.ClientOption);\r
1026         CiFreeClientAuth(a.ClientAuth);\r
1027 }\r
1028 \r
1029 // 初期化\r
1030 void NmMainDlgInit(HWND hWnd, RPC *r)\r
1031 {\r
1032         // 引数チェック\r
1033         if (r == NULL || hWnd == NULL)\r
1034         {\r
1035                 return;\r
1036         }\r
1037 \r
1038         SetIcon(hWnd, 0, ICO_ROUTER);\r
1039         FormatText(hWnd, 0, r->Sock->RemoteHostname);\r
1040         DlgFont(hWnd, S_STATUS, 11, true);\r
1041 \r
1042         NmMainDlgRefresh(hWnd, r);\r
1043 }\r
1044 \r
1045 // 更新\r
1046 void NmMainDlgRefresh(HWND hWnd, RPC *r)\r
1047 {\r
1048 #if     0\r
1049         RPC_NAT_STATUS t;\r
1050         wchar_t tmp[MAX_SIZE];\r
1051         wchar_t tmp2[MAX_SIZE];\r
1052         // 引数チェック\r
1053         if (r == NULL || hWnd == NULL)\r
1054         {\r
1055                 return;\r
1056         }\r
1057 \r
1058         Zero(&t, sizeof(RPC_NAT_STATUS));\r
1059 \r
1060         CALL(hWnd, NcGetStatus(r, &t));\r
1061 \r
1062         if (t.Online == false)\r
1063         {\r
1064                 UniStrCpy(tmp, sizeof(tmp), _UU("NM_OFFLINE"));\r
1065 \r
1066                 Enable(hWnd, B_CONNECT);\r
1067                 Disable(hWnd, B_DISCONNECT);\r
1068         }\r
1069         else\r
1070         {\r
1071                 if (t.Connected)\r
1072                 {\r
1073                         UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECTED"), t.Status.ServerName);\r
1074                 }\r
1075                 else\r
1076                 {\r
1077                         if (t.LastError == ERR_NO_ERROR)\r
1078                         {\r
1079                                 UniStrCpy(tmp, sizeof(tmp), _UU("NM_CONNECTING"));\r
1080                         }\r
1081                         else\r
1082                         {\r
1083                                 UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECT_ERROR"), t.LastError, _E(t.LastError));\r
1084                         }\r
1085                 }\r
1086                 Disable(hWnd, B_CONNECT);\r
1087                 Enable(hWnd, B_DISCONNECT);\r
1088         }\r
1089 \r
1090         UniFormat(tmp2, sizeof(tmp2), _UU("NM_STATUS_TAG"), tmp);\r
1091 \r
1092         SetText(hWnd, S_STATUS, tmp2);\r
1093 \r
1094         FreeRpcNatStatus(&t);\r
1095 #endif\r
1096 }\r
1097 \r
1098 // メインダイアログプロシージャ\r
1099 UINT NmMainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1100 {\r
1101 #if     0\r
1102         SM_HUB *r = (SM_HUB *)param;\r
1103         RPC_DUMMY dummy;\r
1104         SM_SERVER sm;\r
1105         // 引数チェック\r
1106         if (hWnd == NULL)\r
1107         {\r
1108                 return 0;\r
1109         }\r
1110 \r
1111         switch (msg)\r
1112         {\r
1113         case WM_INITDIALOG:\r
1114                 NmMainDlgInit(hWnd, r);\r
1115 \r
1116                 SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);\r
1117 \r
1118                 break;\r
1119 \r
1120         case WM_COMMAND:\r
1121                 switch (wParam)\r
1122                 {\r
1123                 case B_SETTING:\r
1124                         // 接続設定\r
1125                         NmEditClientConfig(hWnd, r);\r
1126                         break;\r
1127 \r
1128                 case B_CONNECT:\r
1129                         // 接続\r
1130                         Zero(&dummy, sizeof(dummy));\r
1131                         CALL(hWnd, NcOnline(r, &dummy));\r
1132                         NmMainDlgRefresh(hWnd, r);\r
1133                         break;\r
1134 \r
1135                 case B_DISCONNECT:\r
1136                         // 切断\r
1137                         Zero(&dummy, sizeof(dummy));\r
1138                         CALL(hWnd, NcOffline(r, &dummy));\r
1139                         NmMainDlgRefresh(hWnd, r);\r
1140                         break;\r
1141 \r
1142                 case B_OPTION:\r
1143                         // 動作設定\r
1144                         NmEditVhOption(hWnd, r->Rpc);\r
1145                         break;\r
1146 \r
1147                 case B_NAT:\r
1148                         // NAT\r
1149                         NmNat(hWnd, r);\r
1150                         break;\r
1151 \r
1152                 case B_DHCP:\r
1153                         // DHCP\r
1154                         NmDhcp(hWnd, r);\r
1155                         break;\r
1156 \r
1157                 case B_STATUS:\r
1158                         // 状況\r
1159                         Zero(&sm, sizeof(sm));\r
1160                         sm.Rpc = r;\r
1161                         SmStatusDlg(hWnd, &sm, NULL, true, true, _UU("NM_STATUS"), ICO_ROUTER,\r
1162                                 NULL, NmStatus);\r
1163                         break;\r
1164 \r
1165                 case B_INFO:\r
1166                         // 情報\r
1167                         Zero(&sm, sizeof(sm));\r
1168                         sm.Rpc = r;\r
1169                         SmStatusDlg(hWnd, &sm, NULL, false, true, _UU("NM_INFO"), ICO_ROUTER,\r
1170                                 NULL, NmInfo);\r
1171                         break;\r
1172 \r
1173                 case B_REFRESH:\r
1174                         // 更新\r
1175                         NmMainDlgRefresh(hWnd, r);\r
1176                         break;\r
1177 \r
1178                 case B_PASSWORD:\r
1179                         // パスワード変更\r
1180                         NmChangePassword(hWnd, r);\r
1181                         break;\r
1182 \r
1183                 case B_ABOUT:\r
1184                         // バージョン情報\r
1185                         About(hWnd, nm->Cedar, CEDAR_ROUTER_STR, BMP_SPLASH_ROUTER);\r
1186                         break;\r
1187 \r
1188                 case IDCANCEL:\r
1189                         Close(hWnd);\r
1190                         break;\r
1191                 }\r
1192                 break;\r
1193 \r
1194         case WM_TIMER:\r
1195                 switch (wParam)\r
1196                 {\r
1197                 case 1:\r
1198                         KillTimer(hWnd, 1);\r
1199 \r
1200                         if (IsEnable(hWnd, 0))\r
1201                         {\r
1202                                 NmMainDlgRefresh(hWnd, r);\r
1203                         }\r
1204 \r
1205                         SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);\r
1206                         break;\r
1207                 }\r
1208                 break;\r
1209 \r
1210         case WM_CLOSE:\r
1211                 EndDialog(hWnd, false);\r
1212                 break;\r
1213         }\r
1214 \r
1215 #endif\r
1216 \r
1217         return 0;\r
1218 }\r
1219 \r
1220 // メインダイアログ\r
1221 void NmMainDlg(RPC *r)\r
1222 {\r
1223         // 引数チェック\r
1224         if (r == NULL)\r
1225         {\r
1226                 return;\r
1227         }\r
1228 \r
1229         Dialog(NULL, D_NM_MAIN, NmMainDlgProc, r);\r
1230 }\r
1231 \r
1232 // ログインダイアログ\r
1233 UINT NmLogin(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1234 {\r
1235         NM_LOGIN *login = (NM_LOGIN *)param;\r
1236         char tmp[MAX_SIZE];\r
1237         // 引数チェック\r
1238         if (hWnd == NULL)\r
1239         {\r
1240                 return 0;\r
1241         }\r
1242 \r
1243         switch (msg)\r
1244         {\r
1245         case WM_INITDIALOG:\r
1246                 FormatText(hWnd, S_TITLE, login->Hostname);\r
1247                 break;\r
1248 \r
1249         case WM_COMMAND:\r
1250                 switch (wParam)\r
1251                 {\r
1252                 case IDOK:\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
1256                         break;\r
1257 \r
1258                 case IDCANCEL:\r
1259                         Close(hWnd);\r
1260                         break;\r
1261                 }\r
1262                 break;\r
1263 \r
1264         case WM_CLOSE:\r
1265                 EndDialog(hWnd, false);\r
1266                 break;\r
1267         }\r
1268 \r
1269         return 0;\r
1270 }\r
1271 \r
1272 // 接続ダイアログ\r
1273 UINT NmConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1274 {\r
1275         NM_CONNECT *t = (NM_CONNECT *)param;\r
1276         RPC *rpc;\r
1277         NM_LOGIN login;\r
1278         UINT err;\r
1279         // 引数チェック\r
1280         if (hWnd == NULL)\r
1281         {\r
1282                 return 0;\r
1283         }\r
1284 \r
1285         switch (msg)\r
1286         {\r
1287         case WM_INITDIALOG:\r
1288                 FormatText(hWnd, S_TITLE, t->Hostname);\r
1289                 SetTimer(hWnd, 1, 50, NULL);\r
1290                 break;\r
1291 \r
1292         case WM_TIMER:\r
1293                 switch (wParam)\r
1294                 {\r
1295                 case 1:\r
1296                         KillTimer(hWnd, 1);\r
1297 \r
1298                         while (true)\r
1299                         {\r
1300                                 bool flag = false;\r
1301 RETRY_PASSWORD:\r
1302                                 // パスワード入力ダイアログ\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
1307 \r
1308                                 if (flag)\r
1309                                 {\r
1310                                         if (Dialog(hWnd, D_NM_LOGIN, NmLogin, &login) == false)\r
1311                                         {\r
1312                                                 EndDialog(hWnd, false);\r
1313                                                 break;\r
1314                                         }\r
1315                                 }\r
1316 \r
1317 RETRY_CONNECT:\r
1318                                 Refresh(DlgItem(hWnd, S_TITLE));\r
1319                                 Refresh(hWnd);\r
1320                                 // 接続\r
1321                                 rpc = NatAdminConnect(nm->Cedar, t->Hostname, t->Port, login.hashed_password, &err);\r
1322                                 if (rpc != NULL)\r
1323                                 {\r
1324                                         t->Rpc = rpc;\r
1325                                         EndDialog(hWnd, true);\r
1326                                         break;\r
1327                                 }\r
1328 \r
1329                                 // エラー\r
1330                                 if (err == ERR_ACCESS_DENIED || err == ERR_AUTH_FAILED)\r
1331                                 {\r
1332                                         if (flag)\r
1333                                         {\r
1334                                                 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,\r
1335                                                         _E(err)) == IDCANCEL)\r
1336                                                 {\r
1337                                                         EndDialog(hWnd, false);\r
1338                                                         break;\r
1339                                                 }\r
1340                                         }\r
1341                                         flag = true;\r
1342                                         goto RETRY_PASSWORD;\r
1343                                 }\r
1344                                 else\r
1345                                 {\r
1346                                         if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,\r
1347                                                 _E(err)) == IDCANCEL)\r
1348                                         {\r
1349                                                 EndDialog(hWnd, false);\r
1350                                                 break;\r
1351                                         }\r
1352                                         goto RETRY_CONNECT;\r
1353                                 }\r
1354                         }\r
1355                         break;\r
1356                 }\r
1357                 break;\r
1358         }\r
1359 \r
1360         return 0;\r
1361 }\r
1362 \r
1363 // User-mode NAT プログラムに接続する\r
1364 RPC *NmConnect(char *hostname, UINT port)\r
1365 {\r
1366         NM_CONNECT t;\r
1367         // 引数チェック\r
1368         if (hostname == NULL || port == 0)\r
1369         {\r
1370                 return NULL;\r
1371         }\r
1372 \r
1373         Zero(&t, sizeof(t));\r
1374         t.Hostname = hostname;\r
1375         t.Port = port;\r
1376 \r
1377         Dialog(NULL, D_NM_CONNECT, NmConnectDlgProc, &t);\r
1378 \r
1379         return t.Rpc;\r
1380 }\r
1381 \r
1382 // メイン処理\r
1383 void MainNM()\r
1384 {\r
1385         UINT port;\r
1386         char hostname[MAX_HOST_NAME_LEN + 1];\r
1387         char *tmp =\r
1388                 RemoteDlg(NULL, NM_SETTING_REG_KEY, ICO_ROUTER,\r
1389                 _UU("NM_TITLE"), _UU("NM_CONNECT_TITLE"), NULL);\r
1390         TOKEN_LIST *t;\r
1391 \r
1392         Zero(hostname, sizeof(hostname));\r
1393 \r
1394         if (tmp == NULL)\r
1395         {\r
1396                 return;\r
1397         }\r
1398 \r
1399         t = ParseToken(tmp, ":");\r
1400         port = DEFAULT_NAT_ADMIN_PORT;\r
1401 \r
1402         if (t->NumTokens >= 2)\r
1403         {\r
1404                 UINT i = ToInt(t->Token[1]);\r
1405                 if (i != 0)\r
1406                 {\r
1407                         port = i;\r
1408                 }\r
1409         }\r
1410         if (t->NumTokens >= 1)\r
1411         {\r
1412                 RPC *rpc;\r
1413                 StrCpy(hostname, sizeof(hostname), t->Token[0]);\r
1414 \r
1415                 // 接続\r
1416                 Trim(hostname);\r
1417 \r
1418                 if (StrLen(hostname) != 0)\r
1419                 {\r
1420                         rpc = NmConnect(hostname, port);\r
1421                         if (rpc != NULL)\r
1422                         {\r
1423                                 // 接続した\r
1424                                 NmMainDlg(rpc);\r
1425                                 NatAdminDisconnect(rpc);\r
1426                         }\r
1427                 }\r
1428         }\r
1429 \r
1430         FreeToken(t);\r
1431 \r
1432         Free(tmp);\r
1433 }\r
1434 \r
1435 // 初期化\r
1436 void InitNM()\r
1437 {\r
1438         if (nm != NULL)\r
1439         {\r
1440                 // すでに初期化されている\r
1441                 return;\r
1442         }\r
1443 \r
1444         nm = ZeroMalloc(sizeof(NM));\r
1445 \r
1446         InitWinUi(_UU("NM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));\r
1447 \r
1448         nm->Cedar = NewCedar(NULL, NULL);\r
1449 \r
1450         InitCM();\r
1451         InitSM();\r
1452 }\r
1453 \r
1454 // 解放\r
1455 void FreeNM()\r
1456 {\r
1457         if (nm == NULL)\r
1458         {\r
1459                 // 初期化されていない\r
1460                 return;\r
1461         }\r
1462 \r
1463         FreeSM();\r
1464         FreeCM();\r
1465 \r
1466         ReleaseCedar(nm->Cedar);\r
1467 \r
1468         FreeWinUi();\r
1469 \r
1470         Free(nm);\r
1471         nm = NULL;\r
1472 }\r
1473 \r
1474 // NM の実行\r
1475 void NMExec()\r
1476 {\r
1477         InitNM();\r
1478         MainNM();\r
1479         FreeNM();\r
1480 }\r
1481 \r
1482 #endif\r
1483 \r