* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / SM.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 // SM.c\r
79 // Win32 用 SoftEther UT-VPN Server 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 SM *sm = NULL;\r
113 static bool link_create_now = false;\r
114 \r
115 // メッセージ設定\r
116 void SmHubMsg(HWND hWnd, SM_EDIT_HUB *s)\r
117 {\r
118         // 引数チェック\r
119         if (s == NULL)\r
120         {\r
121                 return;\r
122         }\r
123 \r
124         Dialog(hWnd, D_SM_MSG, SmHubMsgDlg, s);\r
125 }\r
126 \r
127 // メッセージダイアログプロシージャ\r
128 UINT SmHubMsgDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
129 {\r
130         SM_EDIT_HUB *s = (SM_EDIT_HUB *)param;\r
131         // 引数チェック\r
132         if (hWnd == NULL)\r
133         {\r
134                 return 0;\r
135         }\r
136 \r
137         switch (msg)\r
138         {\r
139         case WM_INITDIALOG:\r
140                 SmHubMsgDlgInit(hWnd, s);\r
141                 break;\r
142 \r
143         case WM_COMMAND:\r
144                 switch (LOWORD(wParam))\r
145                 {\r
146                 case E_TEXT:\r
147                         SmHubMsgDlgUpdate(hWnd, s);\r
148                         break;\r
149                 }\r
150 \r
151                 switch (wParam)\r
152                 {\r
153                 case IDOK:\r
154                         SmHubMsgDlgOnOk(hWnd, s);\r
155                         break;\r
156 \r
157                 case IDCANCEL:\r
158                         Close(hWnd);\r
159                         break;\r
160 \r
161                 case C_USEMSG:\r
162                         SmHubMsgDlgUpdate(hWnd, s);\r
163 \r
164                         if (IsChecked(hWnd, C_USEMSG))\r
165                         {\r
166                                 FocusEx(hWnd, E_TEXT);\r
167                         }\r
168                         break;\r
169                 }\r
170 \r
171                 break;\r
172 \r
173         case WM_CLOSE:\r
174                 EndDialog(hWnd, 0);\r
175                 break;\r
176         }\r
177 \r
178         return 0;\r
179 }\r
180 \r
181 // メッセージダイアログ初期化\r
182 void SmHubMsgDlgInit(HWND hWnd, SM_EDIT_HUB *s)\r
183 {\r
184         RPC_MSG t;\r
185         // 引数チェック\r
186         if (hWnd == NULL || s == NULL)\r
187         {\r
188                 return;\r
189         }\r
190 \r
191         if (MsIsVista())\r
192         {\r
193                 SetFont(hWnd, E_TEXT, GetMeiryoFont());\r
194         }\r
195         else\r
196         {\r
197                 DlgFont(hWnd, E_TEXT, 11, false);\r
198         }\r
199 \r
200         FormatText(hWnd, S_MSG_2, s->HubName);\r
201 \r
202         LimitText(hWnd, E_TEXT, HUB_MAXMSG_LEN);\r
203 \r
204         Zero(&t, sizeof(t));\r
205 \r
206         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
207 \r
208         if (CALL(hWnd, ScGetHubMsg(s->p->Rpc, &t)) == false)\r
209         {\r
210                 Close(hWnd);\r
211                 return;\r
212         }\r
213 \r
214         if (UniIsEmptyStr(t.Msg) == false)\r
215         {\r
216                 SetText(hWnd, E_TEXT, t.Msg);\r
217 \r
218                 Check(hWnd, C_USEMSG, true);\r
219         }\r
220         else\r
221         {\r
222                 Check(hWnd, C_USEMSG, false);\r
223         }\r
224 \r
225         FreeRpcMsg(&t);\r
226 \r
227         SmHubMsgDlgUpdate(hWnd, s);\r
228 }\r
229 \r
230 // OK ボタン\r
231 void SmHubMsgDlgOnOk(HWND hWnd, SM_EDIT_HUB *s)\r
232 {\r
233         RPC_MSG t;\r
234         // 引数チェック\r
235         if (hWnd == NULL || s == NULL)\r
236         {\r
237                 return;\r
238         }\r
239 \r
240         Zero(&t, sizeof(t));\r
241 \r
242         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
243 \r
244         if (IsChecked(hWnd, C_USEMSG) == false)\r
245         {\r
246                 t.Msg = CopyUniStr(L"");\r
247         }\r
248         else\r
249         {\r
250                 t.Msg = GetText(hWnd, E_TEXT);\r
251         }\r
252 \r
253         if (CALL(hWnd, ScSetHubMsg(s->p->Rpc, &t)) == false)\r
254         {\r
255                 return;\r
256         }\r
257 \r
258         FreeRpcMsg(&t);\r
259 \r
260         EndDialog(hWnd, 1);\r
261 }\r
262 \r
263 // メッセージダイアログ更新\r
264 void SmHubMsgDlgUpdate(HWND hWnd, SM_EDIT_HUB *s)\r
265 {\r
266         bool b = true;\r
267         // 引数チェック\r
268         if (hWnd == NULL || s == NULL)\r
269         {\r
270                 return;\r
271         }\r
272 \r
273         SetEnable(hWnd, E_TEXT, IsChecked(hWnd, C_USEMSG));\r
274 \r
275         if (IsChecked(hWnd, C_USEMSG))\r
276         {\r
277                 wchar_t *s = GetText(hWnd, E_TEXT);\r
278 \r
279                 b = !IsEmptyUniStr(s);\r
280 \r
281                 Free(s);\r
282         }\r
283 \r
284         SetEnable(hWnd, IDOK, b);\r
285 }\r
286 \r
287 // VLAN ユーティリティ\r
288 void SmVLan(HWND hWnd, SM_SERVER *s)\r
289 {\r
290         // 引数チェック\r
291         if (s == NULL)\r
292         {\r
293                 return;\r
294         }\r
295 \r
296         Dialog(hWnd, D_SM_VLAN, SmVLanDlg, s);\r
297 }\r
298 \r
299 // VLAN ダイアログ\r
300 UINT SmVLanDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
301 {\r
302         SM_SERVER *s = (SM_SERVER *)param;\r
303         NMHDR *n;\r
304 \r
305         // 引数チェック\r
306         if (hWnd == NULL)\r
307         {\r
308                 return 0;\r
309         }\r
310 \r
311         switch (msg)\r
312         {\r
313         case WM_INITDIALOG:\r
314                 SmVLanDlgInit(hWnd, s);\r
315 \r
316                 if (LvNum(hWnd, L_LIST) == 0)\r
317                 {\r
318                         Disable(hWnd, L_LIST);\r
319                         SetTimer(hWnd, 1, 100, NULL);\r
320                 }\r
321                 break;\r
322 \r
323         case WM_TIMER:\r
324                 switch (wParam)\r
325                 {\r
326                 case 1:\r
327                         KillTimer(hWnd, 1);\r
328 \r
329                         MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("SM_VLAN_NOTHING"),\r
330                                 s->CurrentSetting->ClientOption.Hostname);\r
331                         break;\r
332                 }\r
333                 break;\r
334 \r
335         case WM_COMMAND:\r
336                 switch (wParam)\r
337                 {\r
338                 case IDOK:\r
339                 case IDCANCEL:\r
340                         Close(hWnd);\r
341                         break;\r
342 \r
343                 case B_ENABLE:\r
344                 case B_DISABLE:\r
345                         {\r
346                                 UINT i = LvGetSelected(hWnd, L_LIST);\r
347                                 if (i != INFINITE)\r
348                                 {\r
349                                         char *name = LvGetStrA(hWnd, L_LIST, i, 0);\r
350 \r
351                                         if (IsEmptyStr(name) == false)\r
352                                         {\r
353                                                 RPC_TEST t;\r
354 \r
355                                                 Zero(&t, sizeof(t));\r
356 \r
357                                                 StrCpy(t.StrValue, sizeof(t.StrValue), name);\r
358                                                 t.IntValue = BOOL_TO_INT(wParam == B_ENABLE);\r
359 \r
360                                                 if (CALL(hWnd, ScSetEnableEthVLan(s->Rpc, &t)))\r
361                                                 {\r
362                                                         SmVLanDlgRefresh(hWnd, s);\r
363 \r
364                                                         if (wParam == B_ENABLE)\r
365                                                         {\r
366                                                                 MsgBoxEx(hWnd, MB_ICONINFORMATION,\r
367                                                                         _UU("SM_VLAN_MSG_1"),\r
368                                                                         name, name, name);\r
369                                                         }\r
370                                                         else\r
371                                                         {\r
372                                                                 MsgBoxEx(hWnd, MB_ICONINFORMATION,\r
373                                                                         _UU("SM_VLAN_MSG_2"),\r
374                                                                         name);\r
375                                                         }\r
376                                                 }\r
377                                         }\r
378 \r
379                                         Free(name);\r
380                                 }\r
381                                 break;\r
382                         }\r
383                 }\r
384                 break;\r
385 \r
386         case WM_NOTIFY:\r
387                 n = (NMHDR *)lParam;\r
388                 switch (n->idFrom)\r
389                 {\r
390                 case L_LIST:\r
391                         switch (n->code)\r
392                         {\r
393                         case LVN_ITEMCHANGED:\r
394                                 SmVLanDlgUpdate(hWnd, s);\r
395                                 break;\r
396                         }\r
397                         break;\r
398                 }\r
399                 break;\r
400 \r
401         case WM_CLOSE:\r
402                 EndDialog(hWnd, 0);\r
403                 break;\r
404         }\r
405 \r
406         return 0;\r
407 }\r
408 \r
409 // VLAN ダイアログ初期化\r
410 void SmVLanDlgInit(HWND hWnd, SM_SERVER *s)\r
411 {\r
412         // 引数チェック\r
413         if (hWnd == NULL || s == NULL)\r
414         {\r
415                 return;\r
416         }\r
417 \r
418         LvInit(hWnd, L_LIST);\r
419         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_VLAN_COLUMN_0"), 245);\r
420         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_VLAN_COLUMN_1"), 75);\r
421         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_VLAN_COLUMN_2"), 100);\r
422         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_VLAN_COLUMN_3"), 100);\r
423         LvInsertColumn(hWnd, L_LIST, 4, _UU("SM_VLAN_COLUMN_4"), 290);\r
424         LvInsertColumn(hWnd, L_LIST, 5, _UU("SM_VLAN_COLUMN_5"), 430);\r
425 \r
426         SmVLanDlgRefresh(hWnd, s);\r
427 }\r
428 \r
429 // VLAN ダイアログ内容更新\r
430 void SmVLanDlgRefresh(HWND hWnd, SM_SERVER *s)\r
431 {\r
432         LVB *b;\r
433         RPC_ENUM_ETH_VLAN t;\r
434         UINT i;\r
435         // 引数チェック\r
436         if (hWnd == NULL || s == NULL)\r
437         {\r
438                 return;\r
439         }\r
440 \r
441         Zero(&t, sizeof(t));\r
442         if (CALL(hWnd, ScEnumEthVLan(s->Rpc, &t)) == false)\r
443         {\r
444                 Close(hWnd);\r
445                 return;\r
446         }\r
447 \r
448         b = LvInsertStart();\r
449 \r
450         for (i = 0;i < t.NumItem;i++)\r
451         {\r
452                 RPC_ENUM_ETH_VLAN_ITEM *e = &t.Items[i];\r
453 \r
454                 if (e->Support)\r
455                 {\r
456                         wchar_t tmp0[MAX_SIZE];\r
457                         wchar_t tmp1[MAX_SIZE];\r
458                         wchar_t tmp2[MAX_SIZE];\r
459                         wchar_t *tmp3;\r
460                         wchar_t tmp4[MAX_SIZE];\r
461                         wchar_t tmp5[MAX_SIZE];\r
462 \r
463                         StrToUni(tmp0, sizeof(tmp0), e->DeviceName);\r
464                         StrToUni(tmp1, sizeof(tmp1), e->DriverType);\r
465                         StrToUni(tmp2, sizeof(tmp2), e->DriverName);\r
466                         tmp3 = (e->Enabled ? _UU("SM_VLAN_YES") : _UU("SM_VLAN_NO"));\r
467                         StrToUni(tmp4, sizeof(tmp4), e->Guid);\r
468                         StrToUni(tmp5, sizeof(tmp5), e->DeviceInstanceId);\r
469 \r
470                         LvInsertAdd(b,\r
471                                 e->Enabled ? ICO_NIC_ONLINE : ICO_NIC_OFFLINE, 0, 6,\r
472                                 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);\r
473                 }\r
474         }\r
475 \r
476         LvInsertEnd(b, hWnd, L_LIST);\r
477 \r
478         FreeRpcEnumEthVLan(&t);\r
479 \r
480         SmVLanDlgUpdate(hWnd, s);\r
481 }\r
482 \r
483 // VLAN ダイアログコントロール更新\r
484 void SmVLanDlgUpdate(HWND hWnd, SM_SERVER *s)\r
485 {\r
486         // 引数チェック\r
487         if (hWnd == NULL || s == NULL)\r
488         {\r
489                 return;\r
490         }\r
491 \r
492         if (LvIsSingleSelected(hWnd, L_LIST) == false)\r
493         {\r
494                 Disable(hWnd, B_ENABLE);\r
495                 Disable(hWnd, B_DISABLE);\r
496         }\r
497         else\r
498         {\r
499                 UINT i = LvGetSelected(hWnd, L_LIST);\r
500                 if (i != INFINITE)\r
501                 {\r
502                         wchar_t *s = LvGetStr(hWnd, L_LIST, i, 3);\r
503 \r
504                         if (UniStrCmpi(s, _UU("SM_VLAN_YES")) != 0)\r
505                         {\r
506                                 Enable(hWnd, B_ENABLE);\r
507                                 Disable(hWnd, B_DISABLE);\r
508                         }\r
509                         else\r
510                         {\r
511                                 Enable(hWnd, B_DISABLE);\r
512                                 Disable(hWnd, B_ENABLE);\r
513                         }\r
514 \r
515                         Free(s);\r
516                 }\r
517         }\r
518 }\r
519 \r
520 // 現在の VPN Server / VPN Bridge の状態が初期状態かどうか調べる\r
521 bool SmSetupIsNew(SM_SERVER *s)\r
522 {\r
523         RPC *rpc;\r
524         bool is_bridge;\r
525         char hubname[MAX_HUBNAME_LEN + 1];\r
526         bool check_hub = false;\r
527         // 引数チェック\r
528         if (s == NULL)\r
529         {\r
530                 return false;\r
531         }\r
532 \r
533         if (s->ServerAdminMode == false)\r
534         {\r
535                 return false;\r
536         }\r
537 \r
538         rpc = s->Rpc;\r
539         is_bridge =s->Bridge;\r
540 \r
541         // ローカルブリッジのサポート\r
542         if (true)\r
543         {\r
544                 RPC_BRIDGE_SUPPORT t;\r
545 \r
546                 Zero(&t, sizeof(t));\r
547 \r
548                 if (ScGetBridgeSupport(rpc, &t) == ERR_NO_ERROR)\r
549                 {\r
550                         if (t.IsBridgeSupportedOs == false ||\r
551                                 t.IsWinPcapNeeded)\r
552                         {\r
553                                 return false;\r
554                         }\r
555                 }\r
556                 else\r
557                 {\r
558                         return false;\r
559                 }\r
560         }\r
561 \r
562         // サーバー種類\r
563         if (is_bridge == false)\r
564         {\r
565                 bool b = false;\r
566                 RPC_SERVER_INFO t;\r
567 \r
568                 Zero(&t, sizeof(t));\r
569                 if (ScGetServerInfo(rpc, &t) == ERR_NO_ERROR)\r
570                 {\r
571                         if (t.ServerType != SERVER_TYPE_STANDALONE)\r
572                         {\r
573                                 b = true;\r
574                         }\r
575 \r
576                         FreeRpcServerInfo(&t);\r
577                 }\r
578                 else\r
579                 {\r
580                         return false;\r
581                 }\r
582 \r
583                 if (b)\r
584                 {\r
585                         return false;\r
586                 }\r
587         }\r
588 \r
589         // ローカルブリッジ\r
590         if (true)\r
591         {\r
592                 RPC_ENUM_LOCALBRIDGE t;\r
593                 bool b = false;\r
594 \r
595                 Zero(&t, sizeof(t));\r
596                 if (ScEnumLocalBridge(rpc, &t) == ERR_NO_ERROR)\r
597                 {\r
598                         if (t.NumItem != 0)\r
599                         {\r
600                                 b = true;\r
601                         }\r
602                         FreeRpcEnumLocalBridge(&t);\r
603                 }\r
604 \r
605                 if (b)\r
606                 {\r
607                         return false;\r
608                 }\r
609         }\r
610 \r
611         // 仮想 HUB\r
612 \r
613         check_hub = false;\r
614 \r
615         if (is_bridge == false)\r
616         {\r
617                 RPC_ENUM_HUB t;\r
618                 bool b = false;\r
619 \r
620                 Zero(&t, sizeof(t));\r
621                 if (ScEnumHub(rpc, &t) == ERR_NO_ERROR)\r
622                 {\r
623                         if (t.NumHub >= 2)\r
624                         {\r
625                                 b = true;\r
626                         }\r
627                         else if (t.NumHub == 1)\r
628                         {\r
629                                 if (StrCmpi(t.Hubs[0].HubName, SERVER_DEFAULT_HUB_NAME) != 0)\r
630                                 {\r
631                                         b = true;\r
632                                 }\r
633                                 else\r
634                                 {\r
635                                         check_hub = true;\r
636                                 }\r
637                         }\r
638 \r
639                         FreeRpcEnumHub(&t);\r
640                 }\r
641 \r
642                 if (b)\r
643                 {\r
644                         return false;\r
645                 }\r
646         }\r
647         else\r
648         {\r
649                 check_hub = true;\r
650         }\r
651 \r
652         // 仮想 HUB の状態\r
653         if (is_bridge == false)\r
654         {\r
655                 StrCpy(hubname, sizeof(hubname), SERVER_DEFAULT_HUB_NAME);\r
656         }\r
657         else\r
658         {\r
659                 StrCpy(hubname, sizeof(hubname), SERVER_DEFAULT_BRIDGE_NAME);\r
660         }\r
661 \r
662         if (check_hub)\r
663         {\r
664                 if (true)\r
665                 {\r
666                         // 仮想 HUB 内のオブジェクト数\r
667                         RPC_HUB_STATUS t;\r
668 \r
669                         Zero(&t, sizeof(t));\r
670                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
671 \r
672                         if (ScGetHubStatus(rpc, &t) == ERR_NO_ERROR)\r
673                         {\r
674                                 if (t.NumSessions != 0 || t.NumAccessLists != 0 ||\r
675                                         t.NumUsers != 0 || t.NumGroups != 0 ||\r
676                                         t.NumMacTables != 0 || t.NumIpTables != 0 ||\r
677                                         t.SecureNATEnabled)\r
678                                 {\r
679                                         return false;\r
680                                 }\r
681                         }\r
682                         else\r
683                         {\r
684                                 return false;\r
685                         }\r
686                 }\r
687 \r
688                 if (true)\r
689                 {\r
690                         // カスケード接続\r
691                         RPC_ENUM_LINK t;\r
692 \r
693                         Zero(&t, sizeof(t));\r
694                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
695 \r
696                         if (ScEnumLink(rpc, &t) == ERR_NO_ERROR)\r
697                         {\r
698                                 bool b = false;\r
699 \r
700                                 if (t.NumLink != 0)\r
701                                 {\r
702                                         b = true;\r
703                                 }\r
704 \r
705                                 FreeRpcEnumLink(&t);\r
706 \r
707                                 if (b)\r
708                                 {\r
709                                         return false;\r
710                                 }\r
711                         }\r
712                         else\r
713                         {\r
714                                 return false;\r
715                         }\r
716                 }\r
717 \r
718                 if (is_bridge == false)\r
719                 {\r
720                         // 信頼する証明書一覧\r
721                         RPC_HUB_ENUM_CA t;\r
722 \r
723                         Zero(&t, sizeof(t));\r
724                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
725 \r
726                         if (ScEnumCa(rpc, &t) == ERR_NO_ERROR)\r
727                         {\r
728                                 bool b = false;\r
729 \r
730                                 if (t.NumCa != 0)\r
731                                 {\r
732                                         b = true;\r
733                                 }\r
734 \r
735                                 FreeRpcHubEnumCa(&t);\r
736 \r
737                                 if (b)\r
738                                 {\r
739                                         return false;\r
740                                 }\r
741                         }\r
742                         else\r
743                         {\r
744                                 return false;\r
745                         }\r
746                 }\r
747 \r
748                 if (is_bridge == false)\r
749                 {\r
750                         // 無効な証明書一覧\r
751                         RPC_ENUM_CRL t;\r
752 \r
753                         Zero(&t, sizeof(t));\r
754                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
755 \r
756                         if (ScEnumCrl(rpc, &t) == ERR_NO_ERROR)\r
757                         {\r
758                                 bool b = false;\r
759 \r
760                                 if (t.NumItem != 0)\r
761                                 {\r
762                                         b = true;\r
763                                 }\r
764 \r
765                                 FreeRpcEnumCrl(&t);\r
766 \r
767                                 if (b)\r
768                                 {\r
769                                         return false;\r
770                                 }\r
771                         }\r
772                         else\r
773                         {\r
774                                 return false;\r
775                         }\r
776                 }\r
777 \r
778                 if (is_bridge == false)\r
779                 {\r
780                         // 認証サーバーの設定\r
781                         RPC_RADIUS t;\r
782 \r
783                         Zero(&t, sizeof(t));\r
784                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
785 \r
786                         if (ScGetHubRadius(rpc, &t) == ERR_NO_ERROR)\r
787                         {\r
788                                 if (IsEmptyStr(t.RadiusServerName) == false)\r
789                                 {\r
790                                         return false;\r
791                                 }\r
792                         }\r
793                         else\r
794                         {\r
795                                 return false;\r
796                         }\r
797                 }\r
798 \r
799                 if (is_bridge == false)\r
800                 {\r
801                         // 仮想 HUB の設定\r
802                         RPC_CREATE_HUB t;\r
803 \r
804                         Zero(&t, sizeof(t));\r
805                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
806 \r
807                         if (ScGetHub(rpc, &t) == ERR_NO_ERROR)\r
808                         {\r
809                                 if (t.HubOption.NoEnum || t.HubOption.MaxSession != 0 ||\r
810                                         t.Online == false)\r
811                                 {\r
812                                         return false;\r
813                                 }\r
814                         }\r
815                         else\r
816                         {\r
817                                 return false;\r
818                         }\r
819                 }\r
820 \r
821                 if (is_bridge == false)\r
822                 {\r
823                         // IP アクセス制御リスト\r
824                         RPC_AC_LIST t;\r
825 \r
826                         Zero(&t, sizeof(t));\r
827                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
828 \r
829                         if (ScGetAcList(rpc, &t) == ERR_NO_ERROR)\r
830                         {\r
831                                 bool b = false;\r
832                                 if (LIST_NUM(t.o) != 0)\r
833                                 {\r
834                                         b = true;\r
835                                 }\r
836                                 FreeRpcAcList(&t);\r
837 \r
838                                 if (b)\r
839                                 {\r
840                                         return false;\r
841                                 }\r
842                         }\r
843                         else\r
844                         {\r
845                                 return false;\r
846                         }\r
847                 }\r
848 \r
849                 if (is_bridge == false)\r
850                 {\r
851                         // AO\r
852                         RPC_ADMIN_OPTION t;\r
853 \r
854                         Zero(&t, sizeof(t));\r
855                         StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
856 \r
857                         if (ScGetHubAdminOptions(rpc, &t) == ERR_NO_ERROR)\r
858                         {\r
859                                 bool b = false;\r
860                                 UINT i;\r
861 \r
862                                 for (i = 0;i < t.NumItem;i++)\r
863                                 {\r
864                                         if (t.Items[i].Value != 0)\r
865                                         {\r
866                                                 b = true;\r
867                                         }\r
868                                 }\r
869 \r
870                                 FreeRpcAdminOption(&t);\r
871 \r
872                                 if (b)\r
873                                 {\r
874                                         return false;\r
875                                 }\r
876                         }\r
877                         else\r
878                         {\r
879                                 return false;\r
880                         }\r
881                 }\r
882         }\r
883 \r
884         // 仮想レイヤ 3 スイッチ\r
885         if (is_bridge == false)\r
886         {\r
887                 RPC_ENUM_L3SW t;\r
888                 bool b = false;\r
889 \r
890                 Zero(&t, sizeof(t));\r
891                 if (ScEnumL3Switch(rpc, &t) == ERR_NO_ERROR)\r
892                 {\r
893                         if (t.NumItem != 0)\r
894                         {\r
895                                 b = true;\r
896                         }\r
897 \r
898                         FreeRpcEnumL3Sw(&t);\r
899                 }\r
900                 else\r
901                 {\r
902                         return false;\r
903                 }\r
904 \r
905                 if (b)\r
906                 {\r
907                         return false;\r
908                 }\r
909         }\r
910 \r
911         return true;\r
912 }\r
913 \r
914 // セットアップ手順ダイアログ初期化\r
915 void SmSetupStepDlgInit(HWND hWnd, SM_SETUP *s)\r
916 {\r
917         bool b;\r
918         RPC_ENUM_ETH t;\r
919         UINT i;\r
920         // 引数チェック\r
921         if (hWnd == NULL || s == NULL)\r
922         {\r
923                 return;\r
924         }\r
925 \r
926         SetIcon(hWnd, 0, ICO_SETUP);\r
927 \r
928         DlgFont(hWnd, S_1_1, 0, true);\r
929         DlgFont(hWnd, S_2_1, 0, true);\r
930         DlgFont(hWnd, S_3_1, 0, true);\r
931 \r
932         b = false;\r
933         if (s->UseRemote)\r
934         {\r
935                 b = true;\r
936         }\r
937         if (s->UseSite && s->UseSiteEdge == false)\r
938         {\r
939                 b = true;\r
940         }\r
941 \r
942         SetEnable(hWnd, S_1_1, b);\r
943         SetEnable(hWnd, S_1_2, b);\r
944         SetEnable(hWnd, B_USER, b);\r
945 \r
946         b = false;\r
947         if (s->UseSiteEdge)\r
948         {\r
949                 b = true;\r
950         }\r
951 \r
952         SetEnable(hWnd, S_2_1, b);\r
953         SetEnable(hWnd, S_2_2, b);\r
954         SetEnable(hWnd, B_CASCADE, b);\r
955 \r
956         CbReset(hWnd, C_DEVICE);\r
957         CbSetHeight(hWnd, C_DEVICE, 18);\r
958 \r
959         Zero(&t, sizeof(t));\r
960 \r
961         CbAddStr(hWnd, C_DEVICE, _UU("SM_SETUP_SELECT"), 0);\r
962 \r
963         if (CALL(hWnd, ScEnumEthernet(s->Rpc, &t)) == false)\r
964         {\r
965                 return;\r
966         }\r
967 \r
968         for (i = 0;i < t.NumItem;i++)\r
969         {\r
970                 wchar_t tmp[MAX_PATH];\r
971                 RPC_ENUM_ETH_ITEM *e = &t.Items[i];\r
972 \r
973                 StrToUni(tmp, sizeof(tmp), e->DeviceName);\r
974 \r
975                 CbAddStr(hWnd, C_DEVICE, tmp, 1);\r
976         }\r
977 \r
978         FreeRpcEnumEth(&t);\r
979 \r
980         s->Flag1 = false;\r
981         s->Flag2 = false;\r
982 }\r
983 \r
984 // 閉じる\r
985 void SmSetupOnClose(HWND hWnd, SM_SETUP *s)\r
986 {\r
987         wchar_t *tmp;\r
988         char name[MAX_PATH];\r
989         // 引数チェック\r
990         if (hWnd == NULL || s == NULL)\r
991         {\r
992                 return;\r
993         }\r
994 \r
995         tmp = CbGetStr(hWnd, C_DEVICE);\r
996 \r
997         if (tmp != NULL)\r
998         {\r
999                 UniToStr(name, sizeof(name), tmp);\r
1000 \r
1001                 if (CbGetSelect(hWnd, C_DEVICE) != 0)\r
1002                 {\r
1003                         RPC_LOCALBRIDGE t;\r
1004 \r
1005                         Zero(&t, sizeof(t));\r
1006                         t.Active = true;\r
1007                         StrCpy(t.DeviceName, sizeof(t.DeviceName), name);\r
1008                         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
1009                         t.Online = true;\r
1010                         t.TapMode = false;\r
1011 \r
1012                         if (CALL(hWnd, ScAddLocalBridge(s->Rpc, &t)) == false)\r
1013                         {\r
1014                                 Free(tmp);\r
1015                                 return;\r
1016                         }\r
1017                 }\r
1018                 Free(tmp);\r
1019         }\r
1020 \r
1021         EndDialog(hWnd, 0);\r
1022 }\r
1023 \r
1024 // セットアップ手順ダイアログプロシージャ\r
1025 UINT SmSetupStepDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1026 {\r
1027         SM_SETUP *s = (SM_SETUP *)param;\r
1028         // 引数チェック\r
1029         if (hWnd == NULL)\r
1030         {\r
1031                 return 0;\r
1032         }\r
1033 \r
1034         switch (msg)\r
1035         {\r
1036         case WM_INITDIALOG:\r
1037                 // 初期化\r
1038                 SmSetupStepDlgInit(hWnd, s);\r
1039                 break;\r
1040 \r
1041         case WM_COMMAND:\r
1042                 switch (wParam)\r
1043                 {\r
1044                 case B_USER:\r
1045                         // ユーザー作成\r
1046                         if (true)\r
1047                         {\r
1048                                 SM_HUB h;\r
1049 \r
1050                                 Zero(&h, sizeof(h));\r
1051                                 h.HubName = s->HubName;\r
1052                                 h.p = s->s;\r
1053                                 h.Rpc = s->Rpc;\r
1054 \r
1055                                 SmUserListDlgEx(hWnd, &h, NULL, s->Flag1 ? false : true);\r
1056 \r
1057                                 s->Flag1 = true;\r
1058                         }\r
1059                         break;\r
1060 \r
1061                 case B_CASCADE:\r
1062                         // カスケード接続作成\r
1063                         if (true)\r
1064                         {\r
1065                                 SM_HUB h;\r
1066 \r
1067                                 Zero(&h, sizeof(h));\r
1068                                 h.HubName = s->HubName;\r
1069                                 h.p = s->s;\r
1070                                 h.Rpc = s->Rpc;\r
1071 \r
1072                                 SmLinkDlgEx(hWnd, &h, s->Flag2 ? false : true);\r
1073                                 s->Flag2 = true;\r
1074                         }\r
1075                         break;\r
1076 \r
1077                 case IDCANCEL:\r
1078                         // 閉じるボタン\r
1079                         Close(hWnd);\r
1080                         break;\r
1081                 }\r
1082                 break;\r
1083 \r
1084         case WM_CLOSE:\r
1085                 // 終了\r
1086                 SmSetupOnClose(hWnd, s);\r
1087                 break;\r
1088         }\r
1089 \r
1090         return 0;\r
1091 }\r
1092 \r
1093 // セットアップ手順ダイアログ\r
1094 void SmSetupStep(HWND hWnd, SM_SETUP *s)\r
1095 {\r
1096         // 引数チェック\r
1097         if (s == NULL)\r
1098         {\r
1099                 return;\r
1100         }\r
1101 \r
1102         Dialog(hWnd, D_SM_SETUP_STEP, SmSetupStepDlg, s);\r
1103 }\r
1104 \r
1105 // セットアップによる初期化を行う\r
1106 bool SmSetupInit(HWND hWnd, SM_SETUP *s)\r
1107 {\r
1108         // 引数チェック\r
1109         if (s == NULL)\r
1110         {\r
1111                 return false;\r
1112         }\r
1113 \r
1114         if (s->IsBridge == false)\r
1115         {\r
1116                 if (SmSetupDeleteAllLayer3(hWnd, s) == false)\r
1117                 {\r
1118                         return false;\r
1119                 }\r
1120 \r
1121                 if (SmSetupDeleteAllHub(hWnd, s) == false)\r
1122                 {\r
1123                         return false;\r
1124                 }\r
1125         }\r
1126         else\r
1127         {\r
1128                 if (SmSetupDeleteAllObjectInBridgeHub(hWnd, s) == false)\r
1129                 {\r
1130                         return false;\r
1131                 }\r
1132         }\r
1133 \r
1134         if (SmSetupDeleteAllLocalBridge(hWnd, s) == false)\r
1135         {\r
1136                 return false;\r
1137         }\r
1138 \r
1139         if (s->IsBridge == false)\r
1140         {\r
1141                 // 仮想 HUB の作成\r
1142                 RPC_CREATE_HUB t;\r
1143                 char *password = "";\r
1144 \r
1145                 Zero(&t, sizeof(t));\r
1146                 Hash(t.HashedPassword, password, StrLen(password), true);\r
1147                 HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, password);\r
1148                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
1149                 t.HubType = HUB_TYPE_STANDALONE;\r
1150                 t.Online = true;\r
1151 \r
1152                 if (CALL(hWnd, ScCreateHub(s->Rpc, &t)) == false)\r
1153                 {\r
1154                         return false;\r
1155                 }\r
1156         }\r
1157 \r
1158         return true;\r
1159 }\r
1160 \r
1161 // すべての VPN Bridge 用の仮想 HUB 内のオブジェクトを削除\r
1162 bool SmSetupDeleteAllObjectInBridgeHub(HWND hWnd, SM_SETUP *s)\r
1163 {\r
1164         char *hubname = SERVER_DEFAULT_BRIDGE_NAME;\r
1165         // 引数チェック\r
1166         if (hWnd == NULL || s == NULL)\r
1167         {\r
1168                 return false;\r
1169         }\r
1170 \r
1171         if (true)\r
1172         {\r
1173                 RPC_ENUM_LINK t;\r
1174                 UINT i;\r
1175 \r
1176                 Zero(&t, sizeof(t));\r
1177                 StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
1178 \r
1179                 if (CALL(hWnd, ScEnumLink(s->Rpc, &t)) == false)\r
1180                 {\r
1181                         return false;\r
1182                 }\r
1183 \r
1184                 for (i = 0;i < t.NumLink;i++)\r
1185                 {\r
1186                         RPC_ENUM_LINK_ITEM *e = &t.Links[i];\r
1187                         RPC_LINK a;\r
1188 \r
1189                         Zero(&a, sizeof(a));\r
1190                         StrCpy(a.HubName, sizeof(a.HubName), hubname);\r
1191                         UniStrCpy(a.AccountName, sizeof(a.AccountName), e->AccountName);\r
1192 \r
1193                         if (CALL(hWnd, ScDeleteLink(s->Rpc, &a)) == false)\r
1194                         {\r
1195                                 FreeRpcEnumLink(&t);\r
1196                                 return false;\r
1197                         }\r
1198                 }\r
1199 \r
1200                 FreeRpcEnumLink(&t);\r
1201         }\r
1202 \r
1203         if (true)\r
1204         {\r
1205                 RPC_HUB t;\r
1206 \r
1207                 Zero(&t, sizeof(t));\r
1208                 StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
1209 \r
1210                 if (CALL(hWnd, ScDisableSecureNAT(s->Rpc, &t)) == false)\r
1211                 {\r
1212                         return false;\r
1213                 }\r
1214         }\r
1215 \r
1216         return true;\r
1217 }\r
1218 \r
1219 // すべての仮想レイヤ 3 スイッチの削除\r
1220 bool SmSetupDeleteAllLayer3(HWND hWnd, SM_SETUP *s)\r
1221 {\r
1222         RPC_ENUM_L3SW t;\r
1223         UINT i;\r
1224         // 引数チェック\r
1225         if (hWnd == NULL || s == NULL)\r
1226         {\r
1227                 return false;\r
1228         }\r
1229 \r
1230         Zero(&t, sizeof(t));\r
1231         if(CALL(hWnd, ScEnumL3Switch(s->Rpc, &t)) == false)\r
1232         {\r
1233                 return false;\r
1234         }\r
1235 \r
1236         for (i = 0;i < t.NumItem;i++)\r
1237         {\r
1238                 RPC_ENUM_L3SW_ITEM *e = &t.Items[i];\r
1239                 RPC_L3SW tt;\r
1240 \r
1241                 Zero(&tt, sizeof(tt));\r
1242                 StrCpy(tt.Name, sizeof(tt.Name), e->Name);\r
1243 \r
1244                 if (CALL(hWnd, ScDelL3Switch(s->Rpc, &tt)) == false)\r
1245                 {\r
1246                         FreeRpcEnumL3Sw(&t);\r
1247                         return false;\r
1248                 }\r
1249         }\r
1250 \r
1251         FreeRpcEnumL3Sw(&t);\r
1252 \r
1253         return true;\r
1254 }\r
1255 \r
1256 // すべてのローカルブリッジの削除\r
1257 bool SmSetupDeleteAllLocalBridge(HWND hWnd, SM_SETUP *s)\r
1258 {\r
1259         RPC_ENUM_LOCALBRIDGE t;\r
1260         UINT i;\r
1261         // 引数チェック\r
1262         if (hWnd == NULL || s == NULL)\r
1263         {\r
1264                 return false;\r
1265         }\r
1266 \r
1267         Zero(&t, sizeof(t));\r
1268         if (CALL(hWnd, ScEnumLocalBridge(s->Rpc, &t)) == false)\r
1269         {\r
1270                 return false;\r
1271         }\r
1272 \r
1273         for (i = 0;i < t.NumItem;i++)\r
1274         {\r
1275                 RPC_LOCALBRIDGE *e = &t.Items[i];\r
1276 \r
1277                 if (CALL(hWnd, ScDeleteLocalBridge(s->Rpc, e)) == false)\r
1278                 {\r
1279                         FreeRpcEnumLocalBridge(&t);\r
1280                         return false;\r
1281                 }\r
1282         }\r
1283 \r
1284         FreeRpcEnumLocalBridge(&t);\r
1285 \r
1286         return true;\r
1287 }\r
1288 \r
1289 // すべての仮想 HUB の削除\r
1290 bool SmSetupDeleteAllHub(HWND hWnd, SM_SETUP *s)\r
1291 {\r
1292         RPC_ENUM_HUB t;\r
1293         UINT i;\r
1294         // 引数チェック\r
1295         if (hWnd == NULL || s == NULL)\r
1296         {\r
1297                 return false;\r
1298         }\r
1299 \r
1300         Zero(&t, sizeof(t));\r
1301         if (CALL(hWnd, ScEnumHub(s->Rpc, &t)) == false)\r
1302         {\r
1303                 return false;\r
1304         }\r
1305 \r
1306         for (i = 0;i < t.NumHub;i++)\r
1307         {\r
1308                 RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];\r
1309                 RPC_DELETE_HUB tt;\r
1310 \r
1311                 Zero(&tt, sizeof(tt));\r
1312                 StrCpy(tt.HubName, sizeof(tt.HubName), e->HubName);\r
1313 \r
1314                 if (CALL(hWnd, ScDeleteHub(s->Rpc, &tt)) == false)\r
1315                 {\r
1316                         FreeRpcEnumHub(&t);\r
1317                         return false;\r
1318                 }\r
1319         }\r
1320 \r
1321         FreeRpcEnumHub(&t);\r
1322 \r
1323         return true;\r
1324 }\r
1325 \r
1326 // 仮想 HUB のコントロール更新\r
1327 void SmSetupHubDlgUpdate(HWND hWnd, SM_SETUP *s)\r
1328 {\r
1329         bool ok = true;\r
1330         char tmp[MAX_HUBNAME_LEN + 1];\r
1331         // 引数チェック\r
1332         if (hWnd == NULL || s == NULL)\r
1333         {\r
1334                 return;\r
1335         }\r
1336 \r
1337         GetTxtA(hWnd, E_HUBNAME, tmp, sizeof(tmp));\r
1338 \r
1339         if (IsEmptyStr(tmp) || IsSafeStr(tmp) == false)\r
1340         {\r
1341                 ok = false;\r
1342         }\r
1343 \r
1344         SetEnable(hWnd, IDOK, ok);\r
1345 }\r
1346 \r
1347 // 仮想 HUB 作成ダイアログ\r
1348 UINT SmSetupHubDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1349 {\r
1350         SM_SETUP *s = (SM_SETUP *)param;\r
1351         // 引数チェック\r
1352         if (hWnd == NULL)\r
1353         {\r
1354                 return 0;\r
1355         }\r
1356 \r
1357         switch (msg)\r
1358         {\r
1359         case WM_INITDIALOG:\r
1360                 SetTextA(hWnd, E_HUBNAME, "VPN");\r
1361                 FocusEx(hWnd, E_HUBNAME);\r
1362                 SmSetupHubDlgUpdate(hWnd, s);\r
1363                 break;\r
1364 \r
1365         case WM_COMMAND:\r
1366                 SmSetupHubDlgUpdate(hWnd, s);\r
1367 \r
1368                 switch (wParam)\r
1369                 {\r
1370                 case IDOK:\r
1371                         GetTxtA(hWnd, E_HUBNAME, s->HubName, sizeof(s->HubName));\r
1372                         EndDialog(hWnd, true);\r
1373                         break;\r
1374 \r
1375                 case IDCANCEL:\r
1376                         Close(hWnd);\r
1377                         break;\r
1378                 }\r
1379                 break;\r
1380 \r
1381         case WM_CLOSE:\r
1382                 EndDialog(hWnd, 0);\r
1383                 break;\r
1384         }\r
1385 \r
1386         return 0;\r
1387 }\r
1388 \r
1389 // セットアップダイアログの [次へ] ボタン\r
1390 void SmSetupDlgOnOk(HWND hWnd, SM_SETUP *s)\r
1391 {\r
1392         // 引数チェック\r
1393         if (hWnd == NULL || s == NULL)\r
1394         {\r
1395                 return;\r
1396         }\r
1397 \r
1398         if (MsgBox(hWnd, MB_YESNO | MB_ICONEXCLAMATION, _UU("SM_SETUP_WARNING")) == IDNO)\r
1399         {\r
1400                 return;\r
1401         }\r
1402 \r
1403         s->UseRemote = IsChecked(hWnd, C_REMOTE);\r
1404         s->UseSite = IsChecked(hWnd, C_SITE);\r
1405         s->UseSiteEdge = IsChecked(hWnd, C_EDGE);\r
1406 \r
1407         if (s->IsBridge)\r
1408         {\r
1409                 StrCpy(s->HubName, sizeof(s->HubName), SERVER_DEFAULT_BRIDGE_NAME);\r
1410         }\r
1411         else\r
1412         {\r
1413                 if (Dialog(hWnd, D_SM_SETUP_HUB, SmSetupHubDlg, s) == false)\r
1414                 {\r
1415                         return;\r
1416                 }\r
1417         }\r
1418 \r
1419         // 初期化 (既存オブジェクトの抹消)\r
1420         if (SmSetupInit(hWnd, s) == false)\r
1421         {\r
1422                 return;\r
1423         }\r
1424 \r
1425         // 手順の実行\r
1426         SmSetupStep(hWnd, s);\r
1427 \r
1428         // ダイアログを閉じる\r
1429         EndDialog(hWnd, true);\r
1430 }\r
1431 \r
1432 // セットアップダイアログ初期化\r
1433 void SmSetupDlgInit(HWND hWnd, SM_SETUP *s)\r
1434 {\r
1435         // 引数チェック\r
1436         if (hWnd == NULL || s == NULL)\r
1437         {\r
1438                 return;\r
1439         }\r
1440 \r
1441         SetIcon(hWnd, 0, ICO_SETUP);\r
1442         DlgFont(hWnd, S_TITLE, 14, true);\r
1443         DlgFont(hWnd, C_REMOTE, 0, true);\r
1444         DlgFont(hWnd, C_SITE, 0, true);\r
1445         DlgFont(hWnd, C_OTHER, 0, true);\r
1446 \r
1447         if (s->IsBridge)\r
1448         {\r
1449                 SetText(hWnd, B_BOLD, _UU("SM_SETUP_BRIDGE_ONLY"));\r
1450                 SetText(hWnd, C_EDGE, _UU("SM_SETUP_BRIDGE_EDGE"));\r
1451 \r
1452                 Check(hWnd, C_SITE, true);\r
1453                 Check(hWnd, C_EDGE, true);\r
1454                 Focus(hWnd, C_SITE);\r
1455         }\r
1456 \r
1457         SmSetupDlgUpdate(hWnd, s);\r
1458 }\r
1459 \r
1460 // セットアップダイアログ更新\r
1461 void SmSetupDlgUpdate(HWND hWnd, SM_SETUP *s)\r
1462 {\r
1463         bool enable_remote = true;\r
1464         bool enable_site = true;\r
1465         bool enable_site_center = true;\r
1466         bool enable_detail = true;\r
1467         bool ok = true;\r
1468         // 引数チェック\r
1469         if (hWnd == NULL || s == NULL)\r
1470         {\r
1471                 return;\r
1472         }\r
1473 \r
1474         if (s->IsBridge)\r
1475         {\r
1476                 enable_remote = false;\r
1477                 enable_site_center = false;\r
1478                 enable_detail = false;\r
1479         }\r
1480 \r
1481         if (IsChecked(hWnd, C_OTHER))\r
1482         {\r
1483                 ok = false;\r
1484         }\r
1485 \r
1486         SetEnable(hWnd, C_REMOTE, enable_remote && IsChecked(hWnd, C_OTHER) == false);\r
1487         SetEnable(hWnd, S_REMOTE_1, enable_remote && IsChecked(hWnd, C_OTHER) == false);\r
1488 \r
1489         SetEnable(hWnd, C_SITE, enable_site && IsChecked(hWnd, C_OTHER) == false);\r
1490         SetEnable(hWnd, S_SITE_1, enable_site && IsChecked(hWnd, C_OTHER) == false);\r
1491         SetEnable(hWnd, S_SITE_2, enable_site && IsChecked(hWnd, C_SITE) && IsChecked(hWnd, C_OTHER) == false);\r
1492         SetEnable(hWnd, C_CENTER, enable_site && enable_site_center && IsChecked(hWnd, C_SITE) && IsChecked(hWnd, C_OTHER) == false);\r
1493         SetEnable(hWnd, C_EDGE, enable_site && IsChecked(hWnd, C_SITE) && IsChecked(hWnd, C_OTHER) == false);\r
1494 \r
1495         SetEnable(hWnd, C_OTHER, enable_detail);\r
1496         SetEnable(hWnd, S_OTHER, enable_detail);\r
1497 \r
1498         if (IsChecked(hWnd, C_REMOTE) == false && IsChecked(hWnd, C_SITE) == false)\r
1499         {\r
1500                 ok = false;\r
1501         }\r
1502 \r
1503         if (IsChecked(hWnd, C_SITE))\r
1504         {\r
1505                 if (IsChecked(hWnd, C_CENTER) == false && IsChecked(hWnd, C_EDGE) == false)\r
1506                 {\r
1507                         ok = false;\r
1508                 }\r
1509         }\r
1510 \r
1511         SetEnable(hWnd, IDOK, ok);\r
1512 \r
1513         SetText(hWnd, S_INFO,\r
1514                 IsChecked(hWnd, C_OTHER) ? _UU("SM_SETUP_INFO_2") : _UU("SM_SETUP_INFO_1"));\r
1515 }\r
1516 \r
1517 // セットアップダイアログ\r
1518 UINT SmSetupDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1519 {\r
1520         SM_SETUP *s = (SM_SETUP *)param;\r
1521         // 引数チェック\r
1522         if (hWnd == NULL)\r
1523         {\r
1524                 return 0;\r
1525         }\r
1526 \r
1527         switch (msg)\r
1528         {\r
1529         case WM_INITDIALOG:\r
1530                 SmSetupDlgInit(hWnd, s);\r
1531                 break;\r
1532 \r
1533         case WM_COMMAND:\r
1534                 SmSetupDlgUpdate(hWnd, s);\r
1535 \r
1536                 switch (wParam)\r
1537                 {\r
1538                 case IDOK:\r
1539                         SmSetupDlgOnOk(hWnd, s);\r
1540                         break;\r
1541 \r
1542                 case IDCANCEL:\r
1543                         Close(hWnd);\r
1544                         break;\r
1545                 }\r
1546                 break;\r
1547 \r
1548         case WM_CLOSE:\r
1549                 EndDialog(hWnd, 0);\r
1550                 break;\r
1551         }\r
1552 \r
1553         return 0;\r
1554 }\r
1555 \r
1556 // セットアップ\r
1557 bool SmSetup(HWND hWnd, SM_SERVER *s)\r
1558 {\r
1559         SM_SETUP ss;\r
1560         // 引数チェック\r
1561         if (s == NULL)\r
1562         {\r
1563                 return false;\r
1564         }\r
1565 \r
1566         Zero(&ss, sizeof(ss));\r
1567         ss.s = s;\r
1568         ss.IsBridge = ss.s->Bridge;\r
1569         ss.Rpc = s->Rpc;\r
1570 \r
1571         if (Dialog(hWnd, D_SM_SETUP, SmSetupDlg, &ss) == false)\r
1572         {\r
1573                 return false;\r
1574         }\r
1575 \r
1576         return true;\r
1577 }\r
1578 \r
1579 // ライセンス登録処理\r
1580 void SmLicenseAddDlgOnOk(HWND hWnd, SM_SERVER *s)\r
1581 {\r
1582         char tmp[MAX_SIZE];\r
1583         // 引数チェック\r
1584         if (hWnd == NULL || s == NULL)\r
1585         {\r
1586                 return;\r
1587         }\r
1588 \r
1589         SmLicenseAddDlgGetText(hWnd, tmp, sizeof(tmp));\r
1590 \r
1591         if (true)\r
1592         {\r
1593                 RPC_TEST t;\r
1594 \r
1595                 Disable(hWnd, IDOK);\r
1596                 Disable(hWnd, IDCANCEL);\r
1597 \r
1598                 Zero(&t, sizeof(t));\r
1599                 StrCpy(t.StrValue, sizeof(t.StrValue), tmp);\r
1600 \r
1601                 if (CALL(hWnd, ScAddLicenseKey(s->Rpc, &t)) == false)\r
1602                 {\r
1603                         FocusEx(hWnd, B_KEY6);\r
1604                 }\r
1605                 else\r
1606                 {\r
1607                         EndDialog(hWnd, true);\r
1608                 }\r
1609 \r
1610                 Enable(hWnd, IDOK);\r
1611                 Enable(hWnd, IDCANCEL);\r
1612         }\r
1613 }\r
1614 \r
1615 // テキスト入力のシフト処理\r
1616 void SmLicenseAddDlgShiftTextItem(HWND hWnd, UINT id1, UINT id2, UINT *next_focus)\r
1617 {\r
1618         char *s;\r
1619         // 引数チェック\r
1620         if (hWnd == NULL || next_focus == NULL)\r
1621         {\r
1622                 return;\r
1623         }\r
1624 \r
1625         s = GetTextA(hWnd, id1);\r
1626         if (StrLen(s) >= 6)\r
1627         {\r
1628                 char *s2 = CopyStr(s);\r
1629                 char tmp[MAX_SIZE];\r
1630                 s2[6] = 0;\r
1631                 SetTextA(hWnd, id1, s2);\r
1632                 Free(s2);\r
1633 \r
1634                 if (id2 != 0)\r
1635                 {\r
1636                         GetTxtA(hWnd, id2, tmp, sizeof(tmp));\r
1637 \r
1638                         StrCat(tmp, sizeof(tmp), s + 6);\r
1639                         ReplaceStrEx(tmp, sizeof(tmp), tmp, "-", "", false);\r
1640 \r
1641                         SetTextA(hWnd, id2, tmp);\r
1642 \r
1643                         *next_focus = id2;\r
1644                 }\r
1645                 else\r
1646                 {\r
1647                         *next_focus = IDOK;\r
1648                 }\r
1649         }\r
1650 \r
1651         Free(s);\r
1652 }\r
1653 \r
1654 // 入力データをテキスト化\r
1655 void SmLicenseAddDlgGetText(HWND hWnd, char *str, UINT size)\r
1656 {\r
1657         char *k1, *k2, *k3, *k4, *k5, *k6;\r
1658         // 引数チェック\r
1659         if (hWnd == NULL || str == NULL)\r
1660         {\r
1661                 return;\r
1662         }\r
1663 \r
1664         k1 = GetTextA(hWnd, B_KEY1);\r
1665         k2 = GetTextA(hWnd, B_KEY2);\r
1666         k3 = GetTextA(hWnd, B_KEY3);\r
1667         k4 = GetTextA(hWnd, B_KEY4);\r
1668         k5 = GetTextA(hWnd, B_KEY5);\r
1669         k6 = GetTextA(hWnd, B_KEY6);\r
1670 \r
1671         Format(str, size, "%s-%s-%s-%s-%s-%s", k1, k2, k3, k4, k5, k6);\r
1672 \r
1673         Free(k1);\r
1674         Free(k2);\r
1675         Free(k3);\r
1676         Free(k4);\r
1677         Free(k5);\r
1678         Free(k6);\r
1679 }\r
1680 \r
1681 // ライセンス追加ダイアログ更新\r
1682 void SmLicenseAddDlgUpdate(HWND hWnd, SM_SERVER *s)\r
1683 {\r
1684         UINT next_focus = 0;\r
1685         char tmp[MAX_SIZE];\r
1686         // 引数チェック\r
1687         if (s == NULL || hWnd == NULL)\r
1688         {\r
1689                 return;\r
1690         }\r
1691 \r
1692         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY1, B_KEY2, &next_focus);\r
1693         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY2, B_KEY3, &next_focus);\r
1694         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY3, B_KEY4, &next_focus);\r
1695         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY4, B_KEY5, &next_focus);\r
1696         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY5, B_KEY6, &next_focus);\r
1697         SmLicenseAddDlgShiftTextItem(hWnd, B_KEY6, 0, &next_focus);\r
1698 \r
1699         if ((IsFocus(hWnd, B_KEY1) && GetTextLen(hWnd, B_KEY1, true) <= 5) ||\r
1700                 (IsFocus(hWnd, B_KEY2) && GetTextLen(hWnd, B_KEY2, true) <= 5) ||\r
1701                 (IsFocus(hWnd, B_KEY3) && GetTextLen(hWnd, B_KEY3, true) <= 5) ||\r
1702                 (IsFocus(hWnd, B_KEY4) && GetTextLen(hWnd, B_KEY4, true) <= 5) ||\r
1703                 (IsFocus(hWnd, B_KEY5) && GetTextLen(hWnd, B_KEY5, true) <= 5) ||\r
1704                 (IsFocus(hWnd, B_KEY6) && GetTextLen(hWnd, B_KEY6, true) <= 5))\r
1705         {\r
1706                 next_focus = 0;\r
1707         }\r
1708 \r
1709         if (next_focus != 0)\r
1710         {\r
1711                 Focus(hWnd, next_focus);\r
1712         }\r
1713 \r
1714         SmLicenseAddDlgGetText(hWnd, tmp, sizeof(tmp));\r
1715 \r
1716         SetEnable(hWnd, IDOK, true);\r
1717 }\r
1718 \r
1719 // ライセンス追加ダイアログ初期化\r
1720 void SmLicenseAddDlgInit(HWND hWnd, SM_SERVER *s)\r
1721 {\r
1722         HFONT h;\r
1723         // 引数チェック\r
1724         if (hWnd == NULL || s == NULL)\r
1725         {\r
1726                 return;\r
1727         }\r
1728 \r
1729         h = GetFont("Arial", 10, true, false, false, false);\r
1730         SetFont(hWnd, B_KEY1, h);\r
1731         SetFont(hWnd, B_KEY2, h);\r
1732         SetFont(hWnd, B_KEY3, h);\r
1733         SetFont(hWnd, B_KEY4, h);\r
1734         SetFont(hWnd, B_KEY5, h);\r
1735         SetFont(hWnd, B_KEY6, h);\r
1736 \r
1737         DlgFont(hWnd, S_INFO, 10, true);\r
1738 \r
1739         SmLicenseAddDlgUpdate(hWnd, s);\r
1740 }\r
1741 \r
1742 // ライセンスの追加ダイアログ\r
1743 UINT SmLicenseAddDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
1744 {\r
1745         SM_SERVER *s = (SM_SERVER *)param;\r
1746         // 引数チェック\r
1747         if (hWnd == NULL)\r
1748         {\r
1749                 return 0;\r
1750         }\r
1751 \r
1752         switch (msg)\r
1753         {\r
1754         case WM_INITDIALOG:\r
1755                 SmLicenseAddDlgInit(hWnd, s);\r
1756                 break;\r
1757 \r
1758         case WM_COMMAND:\r
1759                 switch (LOWORD(wParam))\r
1760                 {\r
1761                 case B_KEY1:\r
1762                 case B_KEY2:\r
1763                 case B_KEY3:\r
1764                 case B_KEY4:\r
1765                 case B_KEY5:\r
1766                 case B_KEY6:\r
1767                         switch (HIWORD(wParam))\r
1768                         {\r
1769                         case EN_CHANGE:\r
1770                                 SmLicenseAddDlgUpdate(hWnd, s);\r
1771 \r
1772                                 switch (LOWORD(wParam))\r
1773                                 {\r
1774                                 case B_KEY2:\r
1775                                         if (GetTextLen(hWnd, B_KEY2, true) == 0)\r
1776                                         {\r
1777                                                 FocusEx(hWnd, B_KEY1);\r
1778                                         }\r
1779                                         break;\r
1780                                 case B_KEY3:\r
1781                                         if (GetTextLen(hWnd, B_KEY3, true) == 0)\r
1782                                         {\r
1783                                                 FocusEx(hWnd, B_KEY2);\r
1784                                         }\r
1785                                         break;\r
1786                                 case B_KEY4:\r
1787                                         if (GetTextLen(hWnd, B_KEY4, true) == 0)\r
1788                                         {\r
1789                                                 FocusEx(hWnd, B_KEY3);\r
1790                                         }\r
1791                                         break;\r
1792                                 case B_KEY5:\r
1793                                         if (GetTextLen(hWnd, B_KEY5, true) == 0)\r
1794                                         {\r
1795                                                 FocusEx(hWnd, B_KEY4);\r
1796                                         }\r
1797                                         break;\r
1798                                 case B_KEY6:\r
1799                                         if (GetTextLen(hWnd, B_KEY6, true) == 0)\r
1800                                         {\r
1801                                                 FocusEx(hWnd, B_KEY5);\r
1802                                         }\r
1803                                         break;\r
1804                                 }\r
1805                                 break;\r
1806                         }\r
1807                         break;\r
1808                 }\r
1809 \r
1810                 switch (wParam)\r
1811                 {\r
1812                 case IDOK:\r
1813                         SmLicenseAddDlgOnOk(hWnd, s);\r
1814                         break;\r
1815 \r
1816                 case IDCANCEL:\r
1817                         Close(hWnd);\r
1818                         break;\r
1819                 }\r
1820                 break;\r
1821 \r
1822         case WM_CLOSE:\r
1823                 EndDialog(hWnd, 0);\r
1824                 break;\r
1825         }\r
1826 \r
1827         return 0;\r
1828 }\r
1829 \r
1830 // ライセンスの追加\r
1831 bool SmLicenseAdd(HWND hWnd, SM_SERVER *s)\r
1832 {\r
1833         // 引数チェック\r
1834         if (s == NULL)\r
1835         {\r
1836                 return false;\r
1837         }\r
1838 \r
1839         return Dialog(hWnd, D_SM_LICENSE_ADD, SmLicenseAddDlg, s);\r
1840 }\r
1841 \r
1842 // ライセンスダイアログ初期化\r
1843 void SmLicenseDlgInit(HWND hWnd, SM_SERVER *s)\r
1844 {\r
1845         // 引数チェック\r
1846         if (hWnd == NULL || s == NULL)\r
1847         {\r
1848                 return;\r
1849         }\r
1850 \r
1851         SetIcon(hWnd, 0, ICO_CERT);\r
1852 \r
1853         DlgFont(hWnd, S_BOLD, 0, true);\r
1854         DlgFont(hWnd, S_BOLD2, 0, true);\r
1855 \r
1856         LvInit(hWnd, L_LIST);\r
1857         LvSetStyle(hWnd, L_LIST, LVS_EX_GRIDLINES);\r
1858         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_LICENSE_COLUMN_1"), 50);\r
1859         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_LICENSE_COLUMN_2"), 100);\r
1860         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_LICENSE_COLUMN_3"), 290);\r
1861         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_LICENSE_COLUMN_4"), 150);\r
1862         LvInsertColumn(hWnd, L_LIST, 4, _UU("SM_LICENSE_COLUMN_5"), 120);\r
1863         LvInsertColumn(hWnd, L_LIST, 5, _UU("SM_LICENSE_COLUMN_6"), 250);\r
1864         LvInsertColumn(hWnd, L_LIST, 6, _UU("SM_LICENSE_COLUMN_7"), 100);\r
1865         LvInsertColumn(hWnd, L_LIST, 7, _UU("SM_LICENSE_COLUMN_8"), 100);\r
1866         LvInsertColumn(hWnd, L_LIST, 8, _UU("SM_LICENSE_COLUMN_9"), 100);\r
1867 \r
1868         LvInitEx(hWnd, L_STATUS, true);\r
1869         LvInsertColumn(hWnd, L_STATUS, 0, _UU("SM_STATUS_COLUMN_1"), 100);\r
1870         LvInsertColumn(hWnd, L_STATUS, 1, _UU("SM_STATUS_COLUMN_2"), 100);\r
1871 \r
1872         SmLicenseDlgRefresh(hWnd, s);\r
1873 }\r
1874 \r
1875 // ライセンスダイアログ更新\r
1876 void SmLicenseDlgRefresh(HWND hWnd, SM_SERVER *s)\r
1877 {\r
1878         RPC_ENUM_LICENSE_KEY t;\r
1879         RPC_LICENSE_STATUS st;\r
1880         UINT i;\r
1881         wchar_t tmp[MAX_SIZE];\r
1882         LVB *b;\r
1883         // 引数チェック\r
1884         if (hWnd == NULL || s == NULL)\r
1885         {\r
1886                 return;\r
1887         }\r
1888 \r
1889         Zero(&t, sizeof(t));\r
1890 \r
1891         if (CALL(hWnd, ScEnumLicenseKey(s->Rpc, &t)) == false)\r
1892         {\r
1893                 Close(hWnd);\r
1894                 return;\r
1895         }\r
1896 \r
1897         b = LvInsertStart();\r
1898 \r
1899         for (i = 0;i < t.NumItem;i++)\r
1900         {\r
1901                 wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],\r
1902                         *tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],\r
1903                         tmp8[64], tmp9[64];\r
1904                 RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];\r
1905 \r
1906                 UniToStru(tmp1, e->Id);\r
1907                 StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);\r
1908                 StrToUni(tmp3, sizeof(tmp3), e->LicenseName);\r
1909                 tmp4 = LiGetLicenseStatusStr(e->Status);\r
1910                 if (e->Expires == 0)\r
1911                 {\r
1912                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));\r
1913                 }\r
1914                 else\r
1915                 {\r
1916                         GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);\r
1917                 }\r
1918                 StrToUni(tmp6, sizeof(tmp6), e->LicenseId);\r
1919                 UniToStru(tmp7, e->ProductId);\r
1920                 UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);\r
1921                 UniToStru(tmp9, e->SerialId);\r
1922 \r
1923                 LvInsertAdd(b,\r
1924                         e->Status == LICENSE_STATUS_OK ? ICO_PASS : ICO_DISCARD,\r
1925                         (void *)e->Id, 9,\r
1926                         tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);\r
1927         }\r
1928 \r
1929         LvInsertEnd(b, hWnd, L_LIST);\r
1930 \r
1931         FreeRpcEnumLicenseKey(&t);\r
1932 \r
1933         Zero(&st, sizeof(st));\r
1934 \r
1935         if (CALL(hWnd, ScGetLicenseStatus(s->Rpc, &st)) == false)\r
1936         {\r
1937                 Close(hWnd);\r
1938                 return;\r
1939         }\r
1940 \r
1941         b = LvInsertStart();\r
1942 \r
1943         if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)\r
1944         {\r
1945                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));\r
1946         }\r
1947         else\r
1948         {\r
1949                 // 製品エディション名\r
1950                 StrToUni(tmp, sizeof(tmp), st.EditionStr);\r
1951                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_EDITION"), tmp);\r
1952 \r
1953                 // リリース日付\r
1954                 if (st.ReleaseDate != 0)\r
1955                 {\r
1956                         GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);\r
1957                         LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);\r
1958                 }\r
1959 \r
1960                 // 現在のシステム ID\r
1961                 UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);\r
1962                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);\r
1963 \r
1964                 // 現在の製品ライセンスの有効期限\r
1965                 if (st.SystemExpires == 0)\r
1966                 {\r
1967                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));\r
1968                 }\r
1969                 else\r
1970                 {\r
1971                         GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);\r
1972                 }\r
1973                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);\r
1974 \r
1975                 // サブスクリプション (サポート) 契約\r
1976                 if (st.NeedSubscription == false)\r
1977                 {\r
1978                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));\r
1979                 }\r
1980                 else\r
1981                 {\r
1982                         if (st.SubscriptionExpires == 0)\r
1983                         {\r
1984                                 UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));\r
1985                         }\r
1986                         else\r
1987                         {\r
1988                                 wchar_t dtstr[MAX_PATH];\r
1989 \r
1990                                 GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);\r
1991 \r
1992                                 UniFormat(tmp, sizeof(tmp),\r
1993                                         st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") :  _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),\r
1994                                         dtstr);\r
1995                         }\r
1996                 }\r
1997                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);\r
1998 \r
1999                 if (st.NeedSubscription == false && st.SubscriptionExpires != 0)\r
2000                 {\r
2001                         wchar_t dtstr[MAX_PATH];\r
2002 \r
2003                         GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);\r
2004 \r
2005                         LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);\r
2006                 }\r
2007 \r
2008                 if (st.NeedSubscription && st.SubscriptionExpires != 0)\r
2009                 {\r
2010                         wchar_t dtstr[MAX_PATH];\r
2011 \r
2012                         GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);\r
2013 \r
2014                         UniFormat(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), dtstr);\r
2015 \r
2016                         LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD"), tmp);\r
2017                 }\r
2018 \r
2019                 if (GetCapsBool(s->CapsList, "b_vpn3"))\r
2020                 {\r
2021                         // ユーザー作成可能数\r
2022                         if (st.NumUserCreationLicense == INFINITE)\r
2023                         {\r
2024                                 UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));\r
2025                         }\r
2026                         else\r
2027                         {\r
2028                                 UniToStru(tmp, st.NumUserCreationLicense);\r
2029                         }\r
2030                         LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_NUM_USER"), tmp);\r
2031                 }\r
2032 \r
2033                 // クライアント同時接続可能数\r
2034                 if (st.NumClientConnectLicense == INFINITE)\r
2035                 {\r
2036                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));\r
2037                 }\r
2038                 else\r
2039                 {\r
2040                         UniToStru(tmp, st.NumClientConnectLicense);\r
2041                 }\r
2042                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_NUM_CLIENT"), tmp);\r
2043 \r
2044                 // ブリッジ同時接続可能数\r
2045                 if (st.NumBridgeConnectLicense == INFINITE)\r
2046                 {\r
2047                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));\r
2048                 }\r
2049                 else\r
2050                 {\r
2051                         UniToStru(tmp, st.NumBridgeConnectLicense);\r
2052                 }\r
2053                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);\r
2054 \r
2055                 // エンタープライズ機能の利用可否\r
2056                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_LICENSE_STATUS_ENTERPRISE"),\r
2057                         st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));\r
2058         }\r
2059 \r
2060         LvInsertEnd(b, hWnd, L_STATUS);\r
2061 \r
2062         if (LvNum(hWnd, L_STATUS) >= 1)\r
2063         {\r
2064                 LvAutoSize(hWnd, L_STATUS);\r
2065         }\r
2066 \r
2067         SmLicenseDlgUpdate(hWnd, s);\r
2068 }\r
2069 \r
2070 // ライセンスダイアログコントロール更新\r
2071 void SmLicenseDlgUpdate(HWND hWnd, SM_SERVER *s)\r
2072 {\r
2073         bool b = false;\r
2074         // 引数チェック\r
2075         if (hWnd == NULL || s == NULL)\r
2076         {\r
2077                 return;\r
2078         }\r
2079 \r
2080         b = LvIsSingleSelected(hWnd, L_LIST);\r
2081 \r
2082         SetEnable(hWnd, B_DEL, b);\r
2083         SetEnable(hWnd, IDOK, b);\r
2084 }\r
2085 \r
2086 // ライセンスダイアログ\r
2087 UINT SmLicenseDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2088 {\r
2089         SM_SERVER *s = (SM_SERVER *)param;\r
2090         NMHDR *n;\r
2091         // 引数チェック\r
2092         if (hWnd == NULL)\r
2093         {\r
2094                 return 0;\r
2095         }\r
2096 \r
2097         switch (msg)\r
2098         {\r
2099         case WM_INITDIALOG:\r
2100                 SmLicenseDlgInit(hWnd, s);\r
2101                 break;\r
2102 \r
2103         case WM_NOTIFY:\r
2104                 n = (NMHDR *)lParam;\r
2105                 switch (n->code)\r
2106                 {\r
2107                 case LVN_ITEMCHANGED:\r
2108                         switch (n->idFrom)\r
2109                         {\r
2110                         case L_LIST:\r
2111                         case L_STATUS:\r
2112                                 SmLicenseDlgUpdate(hWnd, s);\r
2113                                 break;\r
2114                         }\r
2115                         break;\r
2116                 }\r
2117                 break;\r
2118 \r
2119         case WM_COMMAND:\r
2120                 switch (wParam)\r
2121                 {\r
2122                 case IDOK:\r
2123                         if (IsEnable(hWnd, IDOK))\r
2124                         {\r
2125                                 UINT i = LvGetSelected(hWnd, L_LIST);\r
2126 \r
2127                                 if (i != INFINITE)\r
2128                                 {\r
2129                                         char *s = LvGetStrA(hWnd, L_LIST, i, 1);\r
2130                                         char tmp[MAX_SIZE];\r
2131 \r
2132                                         Format(tmp, sizeof(tmp), _SS("LICENSE_SUPPORT_URL"), s);\r
2133                                         ShellExecute(hWnd, "open", tmp, NULL, NULL, SW_SHOW);\r
2134 \r
2135                                         Free(s);\r
2136                                 }\r
2137                         }\r
2138                         break;\r
2139 \r
2140                 case B_OBTAIN:\r
2141                         ShellExecute(hWnd, "open", _SS("LICENSE_INFO_URL"), NULL, NULL, SW_SHOW);\r
2142                         break;\r
2143 \r
2144                 case B_ADD:\r
2145                         if (SmLicenseAdd(hWnd, s))\r
2146                         {\r
2147                                 SmLicenseDlgRefresh(hWnd, s);\r
2148                         }\r
2149                         break;\r
2150 \r
2151                 case B_DEL:\r
2152                         if (IsEnable(hWnd, B_DEL))\r
2153                         {\r
2154                                 UINT id = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));\r
2155 \r
2156                                 if (id != 0)\r
2157                                 {\r
2158                                         if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("SM_LICENSE_DELETE_MSG")) == IDYES)\r
2159                                         {\r
2160                                                 RPC_TEST t;\r
2161 \r
2162                                                 Zero(&t, sizeof(t));\r
2163                                                 t.IntValue = id;\r
2164 \r
2165                                                 if (CALL(hWnd, ScDelLicenseKey(s->Rpc, &t)))\r
2166                                                 {\r
2167                                                         SmLicenseDlgRefresh(hWnd, s);\r
2168                                                 }\r
2169                                         }\r
2170                                 }\r
2171                         }\r
2172                         break;\r
2173 \r
2174                 case IDCANCEL:\r
2175                         Close(hWnd);\r
2176                         break;\r
2177                 }\r
2178                 break;\r
2179 \r
2180         case WM_CLOSE:\r
2181                 EndDialog(hWnd, 0);\r
2182                 break;\r
2183         }\r
2184 \r
2185         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
2186 \r
2187         return 0;\r
2188 }\r
2189 \r
2190 // ライセンスの追加と削除\r
2191 void SmLicense(HWND hWnd, SM_SERVER *s)\r
2192 {\r
2193         // 引数チェック\r
2194         if (s == NULL)\r
2195         {\r
2196                 return;\r
2197         }\r
2198 \r
2199         Dialog(hWnd, D_SM_LICENSE, SmLicenseDlg, s);\r
2200 \r
2201         FreeCapsList(s->CapsList);\r
2202         s->CapsList = ScGetCapsEx(s->Rpc);\r
2203 }\r
2204 \r
2205 // ログ保存プロシージャ\r
2206 UINT SmSaveLogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2207 {\r
2208         SM_READ_LOG_FILE *p = (SM_READ_LOG_FILE *)param;\r
2209         // 引数チェック\r
2210         if (hWnd == NULL)\r
2211         {\r
2212                 return 0;\r
2213         }\r
2214 \r
2215         switch (msg)\r
2216         {\r
2217         case WM_INITDIALOG:\r
2218                 FormatText(hWnd, S_INFO, p->filepath);\r
2219                 break;\r
2220 \r
2221         case WM_COMMAND:\r
2222                 switch (wParam)\r
2223                 {\r
2224                 case IDOK:\r
2225                 case B_SAVE:\r
2226                         if (p->Buffer != NULL)\r
2227                         {\r
2228                                 char filename[MAX_PATH];\r
2229 \r
2230                                 Format(filename, sizeof(filename), "%s_%s", p->server_name, p->filepath);\r
2231                                 ConvertSafeFileName(filename, sizeof(filename), filename);\r
2232 \r
2233                                 if (wParam == IDOK)\r
2234                                 {\r
2235                                         // エディタで開く\r
2236                                         char fullpath[MAX_PATH];\r
2237 \r
2238                                         Format(fullpath, sizeof(fullpath), "%s\\%s",\r
2239                                                 MsGetMyTempDir(), filename);\r
2240 \r
2241                                         if (DumpBuf(p->Buffer, fullpath) == false)\r
2242                                         {\r
2243                                                 MsgBoxEx(hWnd, MB_ICONSTOP, _UU("SM_READ_SAVE_TMP_FAILED"),\r
2244                                                         fullpath);\r
2245                                         }\r
2246                                         else\r
2247                                         {\r
2248                                                 if (((UINT)ShellExecute(hWnd, "open", fullpath, NULL, NULL, SW_SHOWNORMAL)) > 32)\r
2249                                                 {\r
2250                                                         EndDialog(hWnd, true);\r
2251                                                 }\r
2252                                                 else\r
2253                                                 {\r
2254                                                         MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SM_READ_SAVE_OPEN_ERROR"), fullpath);\r
2255                                                 }\r
2256                                         }\r
2257                                 }\r
2258                                 else\r
2259                                 {\r
2260                                         // ファイルに保存する\r
2261                                         wchar_t def[MAX_PATH];\r
2262                                         wchar_t *uni_path;\r
2263 \r
2264                                         StrToUni(def, sizeof(def), filename);\r
2265                                         \r
2266                                         uni_path = SaveDlg(hWnd, _UU("SM_READ_SAVE_DLG_FILTER"), _UU("SM_READ_SAVE_DLG_TITLE"),\r
2267                                                 def, L".log");\r
2268 \r
2269                                         if (uni_path != NULL)\r
2270                                         {\r
2271                                                 char path[MAX_PATH];\r
2272 \r
2273                                                 UniToStr(path, sizeof(path), uni_path);\r
2274                                                 Free(uni_path);\r
2275 \r
2276                                                 if (DumpBuf(p->Buffer, path) == false)\r
2277                                                 {\r
2278                                                         MsgBox(hWnd, MB_ICONSTOP, _UU("SM_READ_SAVE_FAILED"));\r
2279                                                 }\r
2280                                                 else\r
2281                                                 {\r
2282                                                         EndDialog(hWnd, true);\r
2283                                                 }\r
2284                                         }\r
2285                                 }\r
2286                         }\r
2287                         break;\r
2288 \r
2289                 case IDCANCEL:\r
2290                         Close(hWnd);\r
2291                         break;\r
2292                 }\r
2293                 break;\r
2294 \r
2295         case WM_CLOSE:\r
2296                 EndDialog(hWnd, false);\r
2297                 break;\r
2298         }\r
2299 \r
2300         return 0;\r
2301 }\r
2302 \r
2303 // ダウンロードコールバックプロシージャ\r
2304 bool SmReadLogFileProc(DOWNLOAD_PROGRESS *g)\r
2305 {\r
2306         wchar_t tmp[MAX_SIZE];\r
2307         char size1[64], size2[64];\r
2308         SM_READ_LOG_FILE *p;\r
2309         HWND hWnd;\r
2310         // 引数チェック\r
2311         if (g == NULL)\r
2312         {\r
2313                 return false;\r
2314         }\r
2315 \r
2316         p = (SM_READ_LOG_FILE *)g->Param;\r
2317         hWnd = p->hWnd;\r
2318 \r
2319         SetPos(hWnd, P_PROGRESS, g->ProgressPercent);\r
2320 \r
2321         ToStrByte(size1, sizeof(size1), g->CurrentSize);\r
2322         ToStrByte(size2, sizeof(size2), g->TotalSize);\r
2323         UniFormat(tmp, sizeof(tmp), _UU("SM_READ_LOG_FILE_INFO_2"), size2, size1);\r
2324 \r
2325         SetText(hWnd, S_INFO, tmp);\r
2326 \r
2327         DoEvents(hWnd);\r
2328 \r
2329         return p->cancel_flag ? false : true;\r
2330 }\r
2331 \r
2332 // ログファイルダウンロードダイアログプロシージャ\r
2333 UINT SmReadLogFile(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2334 {\r
2335         SM_READ_LOG_FILE *p = (SM_READ_LOG_FILE *)param;\r
2336         BUF *buf;\r
2337         // 引数チェック\r
2338         if (hWnd == NULL)\r
2339         {\r
2340                 return 0;\r
2341         }\r
2342 \r
2343         switch (msg)\r
2344         {\r
2345         case WM_INITDIALOG:\r
2346                 p->hWnd = hWnd;\r
2347                 SetFont(hWnd, S_INFO, Font(11, true));\r
2348                 SetText(hWnd, S_INFO, _UU("SM_READ_LOG_FILE_INFO_1"));\r
2349                 DisableClose(hWnd);\r
2350                 FormatText(hWnd, S_INFO2, p->filepath);\r
2351                 SetRange(hWnd, P_PROGRESS, 0, 100);\r
2352 \r
2353                 SetTimer(hWnd, 1, 100, NULL);\r
2354                 break;\r
2355 \r
2356         case WM_TIMER:\r
2357                 switch (wParam)\r
2358                 {\r
2359                 case 1:\r
2360                         KillTimer(hWnd, 1);\r
2361                         buf = DownloadFileFromServer(p->s->Rpc, p->server_name, p->filepath, p->totalsize, SmReadLogFileProc, p);\r
2362                         if (buf == NULL)\r
2363                         {\r
2364                                 if (p->cancel_flag == false)\r
2365                                 {\r
2366                                         // ダウンロード失敗\r
2367                                         MsgBox(hWnd, MB_ICONSTOP, _UU("SM_READ_LOG_FILE_ERROR"));\r
2368                                 }\r
2369                                 EndDialog(hWnd, false);\r
2370                         }\r
2371                         else\r
2372                         {\r
2373                                 // ダウンロード成功\r
2374                                 p->Buffer = buf;\r
2375                                 Dialog(hWnd, D_SM_SAVE_LOG, SmSaveLogProc, p);\r
2376                                 FreeBuf(buf);\r
2377                                 EndDialog(hWnd, true);\r
2378                         }\r
2379                         break;\r
2380                 }\r
2381                 break;\r
2382 \r
2383         case WM_COMMAND:\r
2384                 switch (wParam)\r
2385                 {\r
2386                 case IDCANCEL:\r
2387                         p->cancel_flag = true;\r
2388                         break;\r
2389                 }\r
2390                 break;\r
2391         }\r
2392 \r
2393         return 0;\r
2394 }\r
2395 \r
2396 // ログファイルのダウンロードを開始する\r
2397 void SmLogFileStartDownload(HWND hWnd, SM_SERVER *s, char *server_name, char *filepath, UINT totalsize)\r
2398 {\r
2399         SM_READ_LOG_FILE p;\r
2400         // 引数チェック\r
2401         if (hWnd == NULL || server_name == NULL || filepath == NULL || totalsize == 0)\r
2402         {\r
2403                 return;\r
2404         }\r
2405 \r
2406         Zero(&p, sizeof(p));\r
2407         p.filepath = filepath;\r
2408         p.s = s;\r
2409         p.server_name = server_name;\r
2410         p.totalsize = totalsize;\r
2411 \r
2412         Dialog(hWnd, D_SM_READ_LOG_FILE, SmReadLogFile, &p);\r
2413 }\r
2414 \r
2415 // ダイアログ初期化\r
2416 void SmLogFileDlgInit(HWND hWnd, SM_SERVER *p)\r
2417 {\r
2418         // 引数チェック\r
2419         if (hWnd == NULL || p == NULL)\r
2420         {\r
2421                 return;\r
2422         }\r
2423 \r
2424         SetIcon(hWnd, 0, ICO_LOG2);\r
2425 \r
2426         LvInit(hWnd, L_LIST);\r
2427 \r
2428         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_LOG_FILE_COLUMN_1"), 250);\r
2429         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_LOG_FILE_COLUMN_2"), 100);\r
2430         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_LOG_FILE_COLUMN_3"), 130);\r
2431         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_LOG_FILE_COLUMN_4"), 110);\r
2432 \r
2433         SmLogFileDlgRefresh(hWnd, p);\r
2434 }\r
2435 \r
2436 // ダイアログ内容更新\r
2437 void SmLogFileDlgRefresh(HWND hWnd, SM_SERVER *p)\r
2438 {\r
2439         UINT i;\r
2440         LVB *v;\r
2441         RPC_ENUM_LOG_FILE t;\r
2442         // 引数チェック\r
2443         if (hWnd == NULL || p == NULL)\r
2444         {\r
2445                 return;\r
2446         }\r
2447 \r
2448         Zero(&t, sizeof(t));\r
2449         if (CALL(hWnd, ScEnumLogFile(p->Rpc, &t)) == false)\r
2450         {\r
2451                 Close(hWnd);\r
2452                 return;\r
2453         }\r
2454 \r
2455         v = LvInsertStart();\r
2456 \r
2457         for (i = 0;i < t.NumItem;i++)\r
2458         {\r
2459                 RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];\r
2460                 wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];\r
2461                 char tmp[MAX_SIZE];\r
2462 \r
2463                 StrToUni(tmp1, sizeof(tmp1), e->FilePath);\r
2464 \r
2465                 ToStrByte(tmp, sizeof(tmp), e->FileSize);\r
2466                 StrToUni(tmp2, sizeof(tmp2), tmp);\r
2467 \r
2468                 GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));\r
2469 \r
2470                 StrToUni(tmp4, sizeof(tmp4), e->ServerName);\r
2471 \r
2472                 LvInsertAdd(v, ICO_LOG2, (void *)e->FileSize, 4, tmp1, tmp2, tmp3, tmp4);\r
2473         }\r
2474 \r
2475         LvInsertEndEx(v, hWnd, L_LIST, true);\r
2476 \r
2477         if (t.NumItem != 0)\r
2478         {\r
2479                 LvAutoSize(hWnd, L_LIST);\r
2480         }\r
2481 \r
2482         FreeRpcEnumLogFile(&t);\r
2483 \r
2484         SmLogFileDlgUpdate(hWnd, p);\r
2485 }\r
2486 \r
2487 // ダイアログコントロール更新\r
2488 void SmLogFileDlgUpdate(HWND hWnd, SM_SERVER *p)\r
2489 {\r
2490         // 引数チェック\r
2491         if (hWnd == NULL || p == NULL)\r
2492         {\r
2493                 return;\r
2494         }\r
2495 \r
2496         SetEnable(hWnd, IDOK, LvIsSingleSelected(hWnd, L_LIST));\r
2497 }\r
2498 \r
2499 // ログファイルダイアログプロシージャ\r
2500 UINT SmLogFileDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2501 {\r
2502         NMHDR *n;\r
2503         SM_SERVER *p = (SM_SERVER *)param;\r
2504         // 引数チェック\r
2505         if (hWnd == NULL)\r
2506         {\r
2507                 return 0;\r
2508         }\r
2509 \r
2510         switch (msg)\r
2511         {\r
2512         case WM_INITDIALOG:\r
2513                 SmLogFileDlgInit(hWnd, p);\r
2514                 break;\r
2515 \r
2516         case WM_COMMAND:\r
2517                 switch (wParam)\r
2518                 {\r
2519                 case IDOK:\r
2520                         if (IsEnable(hWnd, IDOK))\r
2521                         {\r
2522                                 UINT i = LvGetSelected(hWnd, L_LIST);\r
2523                                 if (i != INFINITE)\r
2524                                 {\r
2525                                         UINT size = (UINT)LvGetParam(hWnd, L_LIST, i);\r
2526                                         char *server_name;\r
2527                                         char *filepath;\r
2528 \r
2529                                         server_name = LvGetStrA(hWnd, L_LIST, i, 3);\r
2530                                         filepath = LvGetStrA(hWnd, L_LIST, i, 0);\r
2531                                         SmLogFileStartDownload(hWnd, p, server_name, filepath, size);\r
2532                                         Free(filepath);\r
2533                                         Free(server_name);\r
2534                                 }\r
2535                         }\r
2536                         break;\r
2537 \r
2538                 case IDCANCEL:\r
2539                         Close(hWnd);\r
2540                         break;\r
2541 \r
2542                 case B_REFRESH:\r
2543                         SmLogFileDlgRefresh(hWnd, p);\r
2544                         break;\r
2545                 }\r
2546                 break;\r
2547 \r
2548         case WM_NOTIFY:\r
2549                 n = (NMHDR *)lParam;\r
2550                 switch (n->code)\r
2551                 {\r
2552                 case LVN_ITEMCHANGED:\r
2553                         switch (n->idFrom)\r
2554                         {\r
2555                         case L_LIST:\r
2556                                 SmLogFileDlgUpdate(hWnd, p);\r
2557                                 break;\r
2558                         }\r
2559                         break;\r
2560                 }\r
2561                 break;\r
2562 \r
2563         case WM_CLOSE:\r
2564                 EndDialog(hWnd, false);\r
2565                 break;\r
2566         }\r
2567 \r
2568         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
2569 \r
2570         return 0;\r
2571 }\r
2572 \r
2573 // ダイアログ初期化\r
2574 void SmHubEditAcDlgInit(HWND hWnd, SM_EDIT_AC *p)\r
2575 {\r
2576         // 引数チェック\r
2577         if (hWnd == NULL || p == NULL)\r
2578         {\r
2579                 return;\r
2580         }\r
2581 \r
2582         SetEnable(hWnd, R_IPV6, GetCapsBool(p->e->s->p->CapsList, "b_support_ipv6_ac"));\r
2583 \r
2584         if (p->id == 0)\r
2585         {\r
2586                 UINT i, v;\r
2587 \r
2588                 Check(hWnd, R_SINGLE, true);\r
2589                 Check(hWnd, R_PASS, true);\r
2590                 Check(hWnd, R_IPV4, true);\r
2591 \r
2592                 v = 0;\r
2593 \r
2594                 for (i = 0;i < LIST_NUM(p->e->AcList);i++)\r
2595                 {\r
2596                         AC *ac = LIST_DATA(p->e->AcList, i);\r
2597 \r
2598                         v = MAX(v, ac->Priority);\r
2599                 }\r
2600 \r
2601                 v += 100;\r
2602 \r
2603                 SetInt(hWnd, E_PRIORITY, v);\r
2604         }\r
2605         else\r
2606         {\r
2607                 AC *ac = GetAc(p->e->AcList, p->id);\r
2608 \r
2609                 if (ac == NULL)\r
2610                 {\r
2611                         EndDialog(hWnd, false);\r
2612                         return;\r
2613                 }\r
2614 \r
2615                 Check(hWnd, R_SINGLE, ac->Masked == false);\r
2616                 Check(hWnd, R_MASKED, ac->Masked);\r
2617                 Check(hWnd, R_IPV4, IsIP4(&ac->IpAddress));\r
2618                 Check(hWnd, R_IPV6, IsIP6(&ac->IpAddress));\r
2619 \r
2620                 if (IsIP4(&ac->IpAddress))\r
2621                 {\r
2622                         IpSet(hWnd, E_IP, IPToUINT(&ac->IpAddress));\r
2623                 }\r
2624                 else\r
2625                 {\r
2626                         char tmp[MAX_SIZE];\r
2627 \r
2628                         IPToStr(tmp, sizeof(tmp), &ac->IpAddress);\r
2629                         SetTextA(hWnd, E_IPV6, tmp);\r
2630                 }\r
2631 \r
2632                 if (ac->Masked)\r
2633                 {\r
2634                         if (IsIP4(&ac->IpAddress))\r
2635                         {\r
2636                                 IpSet(hWnd, E_MASK, IPToUINT(&ac->SubnetMask));\r
2637                         }\r
2638                         else\r
2639                         {\r
2640                                 char tmp[MAX_SIZE];\r
2641 \r
2642                                 MaskToStrEx(tmp, sizeof(tmp), &ac->SubnetMask, false);\r
2643 \r
2644                                 if (IsNum(tmp))\r
2645                                 {\r
2646                                         StrCatLeft(tmp, sizeof(tmp), "/");\r
2647                                 }\r
2648 \r
2649                                 SetTextA(hWnd, E_MASKV6, tmp);\r
2650                         }\r
2651                 }\r
2652 \r
2653                 Check(hWnd, R_PASS, ac->Deny == false);\r
2654                 Check(hWnd, R_DENY, ac->Deny);\r
2655                 SetInt(hWnd, E_PRIORITY, ac->Priority);\r
2656 \r
2657                 Free(ac);\r
2658         }\r
2659 \r
2660         Focus(hWnd, E_IP);\r
2661 \r
2662         SmHubEditAcDlgUpdate(hWnd, p);\r
2663 }\r
2664 \r
2665 // ダイアログ更新\r
2666 void SmHubEditAcDlgUpdate(HWND hWnd, SM_EDIT_AC *p)\r
2667 {\r
2668         bool b = true;\r
2669         char tmp[MAX_SIZE];\r
2670         // 引数チェック\r
2671         if (hWnd == NULL || p == NULL)\r
2672         {\r
2673                 return;\r
2674         }\r
2675 \r
2676         if (IsChecked(hWnd, R_SINGLE))\r
2677         {\r
2678                 if (IsChecked(hWnd, R_IPV6) == false)\r
2679                 {\r
2680                         Show(hWnd, E_IP);\r
2681                         Hide(hWnd, E_IPV6);\r
2682 \r
2683                         if (IpIsFilled(hWnd, E_IP) == false)\r
2684                         {\r
2685                                 b = false;\r
2686                         }\r
2687 \r
2688                         if (IpGet(hWnd, E_IP) == 0 || IpGet(hWnd, E_IP) == 0xffffffff)\r
2689                         {\r
2690                                 b = false;\r
2691                         }\r
2692                 }\r
2693                 else\r
2694                 {\r
2695                         Show(hWnd, E_IPV6);\r
2696                         Hide(hWnd, E_IP);\r
2697 \r
2698                         GetTxtA(hWnd, E_IPV6, tmp, sizeof(tmp));\r
2699 \r
2700                         if (IsStrIPv6Address(tmp) == false)\r
2701                         {\r
2702                                 b = false;\r
2703                         }\r
2704                 }\r
2705 \r
2706                 Hide(hWnd, S_MASK);\r
2707                 Hide(hWnd, E_MASK);\r
2708                 Hide(hWnd, E_MASKV6);\r
2709         }\r
2710         else\r
2711         {\r
2712                 if (IsChecked(hWnd, R_IPV6) == false)\r
2713                 {\r
2714                         Show(hWnd, E_IP);\r
2715                         Hide(hWnd, E_IPV6);\r
2716 \r
2717                         if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)\r
2718                         {\r
2719                                 b = false;\r
2720                         }\r
2721 \r
2722                         if (IpGet(hWnd, E_IP) == 0xffffffff)\r
2723                         {\r
2724                                 b = false;\r
2725                         }\r
2726                 }\r
2727                 else\r
2728                 {\r
2729                         char tmp1[MAX_SIZE], tmp2[MAX_SIZE];\r
2730 \r
2731                         Show(hWnd, E_IPV6);\r
2732                         Hide(hWnd, E_IP);\r
2733 \r
2734                         GetTxtA(hWnd, E_IPV6, tmp1, sizeof(tmp1));\r
2735                         GetTxtA(hWnd, E_MASKV6, tmp2, sizeof(tmp2));\r
2736 \r
2737                         if (!(IsIpStr6(tmp1) && IsIpMask6(tmp2)))\r
2738                         {\r
2739                                 b = false;\r
2740                         }\r
2741                 }\r
2742 \r
2743                 Show(hWnd, S_MASK);\r
2744                 SetShow(hWnd, E_MASK, !IsChecked(hWnd, R_IPV6));\r
2745                 SetShow(hWnd, E_MASKV6, IsChecked(hWnd, R_IPV6));\r
2746         }\r
2747 \r
2748         if (GetInt(hWnd, E_PRIORITY) == 0)\r
2749         {\r
2750                 b = false;\r
2751         }\r
2752 \r
2753         SetIcon(hWnd, S_ICON, IsChecked(hWnd, R_PASS) ? ICO_INTERNET : ICO_INTERNET_X);\r
2754 \r
2755         SetEnable(hWnd, IDOK, b);\r
2756 }\r
2757 \r
2758 // ダイアログで OK ボタンがクリックされた\r
2759 void SmHubEditAcDlgOnOk(HWND hWnd, SM_EDIT_AC *p)\r
2760 {\r
2761         AC ac;\r
2762         char tmp[MAX_SIZE];\r
2763         // 引数チェック\r
2764         if (hWnd == NULL || p == NULL)\r
2765         {\r
2766                 return;\r
2767         }\r
2768 \r
2769         Zero(&ac, sizeof(ac));\r
2770         ac.Deny = IsChecked(hWnd, R_DENY);\r
2771         ac.Priority = GetInt(hWnd, E_PRIORITY);\r
2772 \r
2773         if (IsChecked(hWnd, R_IPV6) == false)\r
2774         {\r
2775                 UINTToIP(&ac.IpAddress, IpGet(hWnd, E_IP));\r
2776         }\r
2777         else\r
2778         {\r
2779                 GetTxtA(hWnd, E_IPV6, tmp, sizeof(tmp));\r
2780 \r
2781                 StrToIP6(&ac.IpAddress, tmp);\r
2782         }\r
2783 \r
2784         ac.Masked = IsChecked(hWnd, R_MASKED);\r
2785 \r
2786         if (ac.Masked)\r
2787         {\r
2788                 if (IsChecked(hWnd, R_IPV6) == false)\r
2789                 {\r
2790                         UINTToIP(&ac.SubnetMask, IpGet(hWnd, E_MASK));\r
2791                 }\r
2792                 else\r
2793                 {\r
2794                         GetTxtA(hWnd, E_MASKV6, tmp, sizeof(tmp));\r
2795 \r
2796                         StrToMask6(&ac.SubnetMask, tmp);\r
2797                 }\r
2798         }\r
2799 \r
2800         if (p->id != 0)\r
2801         {\r
2802                 SetAc(p->e->AcList, p->id, &ac);\r
2803         }\r
2804         else\r
2805         {\r
2806                 AddAc(p->e->AcList, &ac);\r
2807         }\r
2808 \r
2809         EndDialog(hWnd, true);\r
2810 }\r
2811 \r
2812 // AC 編集ダイアログ\r
2813 UINT SmHubEditAcDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2814 {\r
2815         SM_EDIT_AC *p = (SM_EDIT_AC *)param;\r
2816         // 引数チェック\r
2817         if (hWnd == NULL)\r
2818         {\r
2819                 return 0;\r
2820         }\r
2821 \r
2822         switch (msg)\r
2823         {\r
2824         case WM_INITDIALOG:\r
2825                 SmHubEditAcDlgInit(hWnd, p);\r
2826                 break;\r
2827 \r
2828         case WM_COMMAND:\r
2829                 switch (LOWORD(wParam))\r
2830                 {\r
2831                 case R_SINGLE:\r
2832                 case R_MASKED:\r
2833                 case E_IP:\r
2834                 case E_MASK:\r
2835                 case R_PASS:\r
2836                 case R_DENY:\r
2837                 case E_PRIORITY:\r
2838                 case R_IPV4:\r
2839                 case R_IPV6:\r
2840                 case E_IPV6:\r
2841                 case E_MASKV6:\r
2842                         SmHubEditAcDlgUpdate(hWnd, p);\r
2843                         break;\r
2844                 }\r
2845 \r
2846                 switch (wParam)\r
2847                 {\r
2848                 case R_IPV4:\r
2849                 case R_IPV6:\r
2850                 case R_SINGLE:\r
2851                 case R_MASKED:\r
2852                         if (IsChecked(hWnd, R_IPV6) == false)\r
2853                         {\r
2854                                 if (IpIsFilled(hWnd, E_IP))\r
2855                                 {\r
2856                                         Focus(hWnd, E_MASK);\r
2857                                 }\r
2858                                 else\r
2859                                 {\r
2860                                         Focus(hWnd, E_IP);\r
2861                                 }\r
2862                         }\r
2863                         else\r
2864                         {\r
2865                                 char tmp[MAX_SIZE];\r
2866 \r
2867                                 GetTxtA(hWnd, E_IPV6, tmp, sizeof(tmp));\r
2868 \r
2869                                 if (IsStrIPv6Address(tmp))\r
2870                                 {\r
2871                                         FocusEx(hWnd, E_MASKV6);\r
2872                                 }\r
2873                                 else\r
2874                                 {\r
2875                                         FocusEx(hWnd, E_IPV6);\r
2876                                 }\r
2877                         }\r
2878                         break;\r
2879 \r
2880                 case IDOK:\r
2881                         SmHubEditAcDlgOnOk(hWnd, p);\r
2882                         break;\r
2883 \r
2884                 case IDCANCEL:\r
2885                         Close(hWnd);\r
2886                         break;\r
2887                 }\r
2888                 break;\r
2889 \r
2890         case WM_CLOSE:\r
2891                 EndDialog(hWnd, false);\r
2892                 break;\r
2893         }\r
2894 \r
2895         return 0;\r
2896 }\r
2897 \r
2898 // ダイアログ初期化\r
2899 void SmHubAcDlgInit(HWND hWnd, SM_EDIT_AC_LIST *p)\r
2900 {\r
2901         // 引数チェック\r
2902         if (hWnd == NULL || p == NULL)\r
2903         {\r
2904                 return;\r
2905         }\r
2906 \r
2907         SetIcon(hWnd, 0, ICO_INTERNET);\r
2908 \r
2909         FormatText(hWnd, S_TITLE, p->s->HubName);\r
2910 \r
2911         LvInit(hWnd, L_LIST);\r
2912         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_AC_COLUMN_1"), 40);\r
2913         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_AC_COLUMN_2"), 80);\r
2914         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_AC_COLUMN_3"), 90);\r
2915         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_AC_COLUMN_4"), 170);\r
2916 \r
2917         SmHubAcDlgRefresh(hWnd, p);\r
2918 }\r
2919 \r
2920 // ダイアログコントロール更新\r
2921 void SmHubAcDlgUpdate(HWND hWnd, SM_EDIT_AC_LIST *p)\r
2922 {\r
2923         bool b;\r
2924         // 引数チェック\r
2925         if (hWnd == NULL || p == NULL)\r
2926         {\r
2927                 return;\r
2928         }\r
2929 \r
2930         b = LvIsSingleSelected(hWnd, L_LIST);\r
2931 \r
2932         SetEnable(hWnd, IDOK, b);\r
2933         SetEnable(hWnd, B_DELETE, b);\r
2934 }\r
2935 \r
2936 // ダイアログ内容更新\r
2937 void SmHubAcDlgRefresh(HWND hWnd, SM_EDIT_AC_LIST *p)\r
2938 {\r
2939         UINT i;\r
2940         LVB *v;\r
2941         // 引数チェック\r
2942         if (hWnd == NULL || p == NULL)\r
2943         {\r
2944                 return;\r
2945         }\r
2946 \r
2947         v = LvInsertStart();\r
2948 \r
2949         for (i = 0;i < LIST_NUM(p->AcList);i++)\r
2950         {\r
2951                 wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];\r
2952                 char *tmp_str;\r
2953                 AC *ac = LIST_DATA(p->AcList, i);\r
2954 \r
2955                 UniToStru(tmp1, ac->Id);\r
2956                 tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");\r
2957                 tmp_str = GenerateAcStr(ac);\r
2958                 StrToUni(tmp3, sizeof(tmp3), tmp_str);\r
2959 \r
2960                 Free(tmp_str);\r
2961 \r
2962                 UniToStru(tmp4, ac->Priority);\r
2963 \r
2964                 LvInsertAdd(v, ac->Deny ? ICO_INTERNET_X : ICO_INTERNET,\r
2965                         (void *)ac->Id, 4, tmp1, tmp4, tmp2, tmp3);\r
2966         }\r
2967 \r
2968         LvInsertEnd(v, hWnd, L_LIST);\r
2969         LvSortEx(hWnd, L_LIST, 0, false, true);\r
2970 \r
2971 \r
2972         SmHubAcDlgUpdate(hWnd, p);\r
2973 }\r
2974 \r
2975 // アクセス制御リスト編集ダイアログ\r
2976 UINT SmHubAcDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
2977 {\r
2978         NMHDR *n;\r
2979         SM_EDIT_AC_LIST *p = (SM_EDIT_AC_LIST *)param;\r
2980         // 引数チェック\r
2981         if (hWnd == NULL)\r
2982         {\r
2983                 return 0;\r
2984         }\r
2985 \r
2986         switch (msg)\r
2987         {\r
2988         case WM_INITDIALOG:\r
2989                 SmHubAcDlgInit(hWnd, p);\r
2990                 break;\r
2991 \r
2992         case WM_COMMAND:\r
2993                 switch (wParam)\r
2994                 {\r
2995                 case IDOK:\r
2996                         if (IsEnable(hWnd, IDOK))\r
2997                         {\r
2998                                 SM_EDIT_AC s;\r
2999                                 Zero(&s, sizeof(s));\r
3000 \r
3001                                 s.e = p;\r
3002                                 s.id = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));\r
3003 \r
3004                                 if (Dialog(hWnd, D_SM_AC, SmHubEditAcDlgProc, &s))\r
3005                                 {\r
3006                                         SmHubAcDlgRefresh(hWnd, p);\r
3007                                 }\r
3008                         }\r
3009                         break;\r
3010 \r
3011                 case B_ADD:\r
3012                         if (IsEnable(hWnd, B_ADD))\r
3013                         {\r
3014                                 SM_EDIT_AC s;\r
3015                                 Zero(&s, sizeof(s));\r
3016 \r
3017                                 s.e = p;\r
3018 \r
3019                                 if (Dialog(hWnd, D_SM_AC, SmHubEditAcDlgProc, &s))\r
3020                                 {\r
3021                                         SmHubAcDlgRefresh(hWnd, p);\r
3022                                 }\r
3023                         }\r
3024                         break;\r
3025 \r
3026                 case B_DELETE:\r
3027                         if (IsEnable(hWnd, B_DELETE))\r
3028                         {\r
3029                                 UINT id = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));\r
3030 \r
3031                                 if (DelAc(p->AcList, id))\r
3032                                 {\r
3033                                         SmHubAcDlgRefresh(hWnd, p);\r
3034                                 }\r
3035                         }\r
3036                         break;\r
3037 \r
3038                 case B_SAVE:\r
3039                         if (IsEnable(hWnd, B_SAVE))\r
3040                         {\r
3041                                 RPC_AC_LIST t;\r
3042 \r
3043                                 Zero(&t, sizeof(t));\r
3044                                 StrCpy(t.HubName, sizeof(t.HubName), p->s->HubName);\r
3045                                 t.o = CloneAcList(p->AcList);\r
3046 \r
3047                                 if (CALL(hWnd, ScSetAcList(p->s->p->Rpc, &t)))\r
3048                                 {\r
3049                                         EndDialog(hWnd, true);\r
3050                                 }\r
3051 \r
3052                                 FreeRpcAcList(&t);\r
3053                         }\r
3054                         break;\r
3055 \r
3056                 case IDCANCEL:\r
3057                         Close(hWnd);\r
3058                         break;\r
3059                 }\r
3060                 break;\r
3061 \r
3062         case WM_NOTIFY:\r
3063                 n = (NMHDR *)lParam;\r
3064                 switch (n->code)\r
3065                 {\r
3066                 case LVN_ITEMCHANGED:\r
3067                         switch (n->idFrom)\r
3068                         {\r
3069                         case L_LIST:\r
3070                                 SmHubAcDlgUpdate(hWnd, p);\r
3071                                 break;\r
3072                         }\r
3073                         break;\r
3074                 }\r
3075                 break;\r
3076 \r
3077         case WM_CLOSE:\r
3078                 EndDialog(hWnd, false);\r
3079                 break;\r
3080         }\r
3081 \r
3082         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
3083 \r
3084         return 0;\r
3085 }\r
3086 \r
3087 // アクセス制御リスト編集\r
3088 void SmHubAc(HWND hWnd, SM_EDIT_HUB *s)\r
3089 {\r
3090         SM_EDIT_AC_LIST p;\r
3091         RPC_AC_LIST t;\r
3092         // 引数チェック\r
3093         if (hWnd == NULL || s == NULL)\r
3094         {\r
3095                 return;\r
3096         }\r
3097 \r
3098         Zero(&t, sizeof(t));\r
3099         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
3100 \r
3101         if (CALL(hWnd, ScGetAcList(s->p->Rpc, &t)) == false)\r
3102         {\r
3103                 return;\r
3104         }\r
3105 \r
3106         Zero(&p, sizeof(p));\r
3107         p.s = s;\r
3108         p.AcList = CloneAcList(t.o);\r
3109 \r
3110         FreeRpcAcList(&t);\r
3111 \r
3112         Dialog(hWnd, D_SM_AC_LIST, SmHubAcDlgProc, &p);\r
3113 \r
3114         FreeAcList(p.AcList);\r
3115 }\r
3116 \r
3117 // ダイアログ初期化\r
3118 void SmEditCrlDlgInit(HWND hWnd, SM_EDIT_CRL *c)\r
3119 {\r
3120         // 引数チェック\r
3121         if (hWnd == NULL || c == NULL)\r
3122         {\r
3123                 return;\r
3124         }\r
3125 \r
3126         if (c->NewCrl == false)\r
3127         {\r
3128                 RPC_CRL t;\r
3129                 CRL *crl;\r
3130 \r
3131                 Zero(&t, sizeof(t));\r
3132                 StrCpy(t.HubName, sizeof(t.HubName), c->s->HubName);\r
3133                 t.Key = c->Key;\r
3134 \r
3135                 if (CALL(hWnd, ScGetCrl(c->s->Rpc, &t)) == false)\r
3136                 {\r
3137                         EndDialog(hWnd, false);\r
3138                         return;\r
3139                 }\r
3140 \r
3141                 crl = t.Crl;\r
3142 \r
3143                 SmEditCrlDlgSetName(hWnd, crl->Name);\r
3144                 SmEditCrlDlgSetSerial(hWnd, crl->Serial);\r
3145                 SmEditCrlDlgSetHash(hWnd, crl->DigestMD5, crl->DigestSHA1);\r
3146 \r
3147                 FreeRpcCrl(&t);\r
3148         }\r
3149 \r
3150         SmEditCrlDlgUpdate(hWnd, c);\r
3151 }\r
3152 \r
3153 // コントロール更新\r
3154 void SmEditCrlDlgUpdate(HWND hWnd, SM_EDIT_CRL *c)\r
3155 {\r
3156         bool b = true;\r
3157         // 引数チェック\r
3158         if (hWnd == NULL || c == NULL)\r
3159         {\r
3160                 return;\r
3161         }\r
3162 \r
3163         SetEnable(hWnd, E_CN, IsChecked(hWnd, R_CN));\r
3164         SetEnable(hWnd, E_O, IsChecked(hWnd, R_O));\r
3165         SetEnable(hWnd, E_OU, IsChecked(hWnd, R_OU));\r
3166         SetEnable(hWnd, E_C, IsChecked(hWnd, R_C));\r
3167         SetEnable(hWnd, E_ST, IsChecked(hWnd, R_ST));\r
3168         SetEnable(hWnd, E_L, IsChecked(hWnd, R_L));\r
3169         SetEnable(hWnd, E_SERI, IsChecked(hWnd, R_SERI));\r
3170         SetEnable(hWnd, E_MD5_HASH, IsChecked(hWnd, R_MD5_HASH));\r
3171         SetEnable(hWnd, E_SHA1_HASH, IsChecked(hWnd, R_SHA1_HASH));\r
3172 \r
3173         if (IsChecked(hWnd, R_CN))\r
3174         {\r
3175                 if (IsEmpty(hWnd, E_CN))\r
3176                 {\r
3177                         b = false;\r
3178                 }\r
3179         }\r
3180 \r
3181         if (IsChecked(hWnd, R_O))\r
3182         {\r
3183                 if (IsEmpty(hWnd, E_O))\r
3184                 {\r
3185                         b = false;\r
3186                 }\r
3187         }\r
3188 \r
3189         if (IsChecked(hWnd, R_OU))\r
3190         {\r
3191                 if (IsEmpty(hWnd, E_OU))\r
3192                 {\r
3193                         b = false;\r
3194                 }\r
3195         }\r
3196 \r
3197         if (IsChecked(hWnd, R_C))\r
3198         {\r
3199                 if (IsEmpty(hWnd, E_C))\r
3200                 {\r
3201                         b = false;\r
3202                 }\r
3203         }\r
3204 \r
3205         if (IsChecked(hWnd, R_ST))\r
3206         {\r
3207                 if (IsEmpty(hWnd, E_ST))\r
3208                 {\r
3209                         b = false;\r
3210                 }\r
3211         }\r
3212 \r
3213         if (IsChecked(hWnd, R_L))\r
3214         {\r
3215                 if (IsEmpty(hWnd, E_L))\r
3216                 {\r
3217                         b = false;\r
3218                 }\r
3219         }\r
3220 \r
3221         if (IsChecked(hWnd, R_SERI))\r
3222         {\r
3223                 char tmp[MAX_SIZE];\r
3224                 BUF *buf;\r
3225 \r
3226                 GetTxtA(hWnd, E_SERI, tmp, sizeof(tmp));\r
3227                 buf = StrToBin(tmp);\r
3228 \r
3229                 if (buf->Size == 0)\r
3230                 {\r
3231                         b = false;\r
3232                 }\r
3233 \r
3234                 FreeBuf(buf);\r
3235         }\r
3236 \r
3237         if (IsChecked(hWnd, R_MD5_HASH))\r
3238         {\r
3239                 char tmp[MAX_SIZE];\r
3240                 BUF *buf;\r
3241 \r
3242                 GetTxtA(hWnd, E_MD5_HASH, tmp, sizeof(tmp));\r
3243                 buf = StrToBin(tmp);\r
3244 \r
3245                 if (buf->Size != MD5_SIZE)\r
3246                 {\r
3247                         b = false;\r
3248                 }\r
3249 \r
3250                 FreeBuf(buf);\r
3251         }\r
3252 \r
3253         if (IsChecked(hWnd, R_SHA1_HASH))\r
3254         {\r
3255                 char tmp[MAX_SIZE];\r
3256                 BUF *buf;\r
3257 \r
3258                 GetTxtA(hWnd, E_SHA1_HASH, tmp, sizeof(tmp));\r
3259                 buf = StrToBin(tmp);\r
3260 \r
3261                 if (buf->Size != SHA1_SIZE)\r
3262                 {\r
3263                         b = false;\r
3264                 }\r
3265 \r
3266                 FreeBuf(buf);\r
3267         }\r
3268 \r
3269         SetEnable(hWnd, IDOK, b);\r
3270 }\r
3271 \r
3272 // OK ボタンクリック\r
3273 void SmEditCrlDlgOnOk(HWND hWnd, SM_EDIT_CRL *c)\r
3274 {\r
3275         CRL *crl;\r
3276         NAME *n;\r
3277         RPC_CRL t;\r
3278         bool empty = true;\r
3279         // 引数チェック\r
3280         if (hWnd == NULL || c == NULL)\r
3281         {\r
3282                 return;\r
3283         }\r
3284 \r
3285         crl = ZeroMalloc(sizeof(CRL));\r
3286         crl->Name = ZeroMalloc(sizeof(NAME));\r
3287         n = crl->Name;\r
3288 \r
3289         if (IsChecked(hWnd, R_CN))\r
3290         {\r
3291                 n->CommonName = GetText(hWnd, E_CN);\r
3292                 empty = false;\r
3293         }\r
3294 \r
3295         if (IsChecked(hWnd, R_O))\r
3296         {\r
3297                 n->Organization = GetText(hWnd, E_O);\r
3298                 empty = false;\r
3299         }\r
3300 \r
3301         if (IsChecked(hWnd, R_OU))\r
3302         {\r
3303                 n->Unit = GetText(hWnd, E_OU);\r
3304                 empty = false;\r
3305         }\r
3306 \r
3307         if (IsChecked(hWnd, R_C))\r
3308         {\r
3309                 n->Country = GetText(hWnd, E_C);\r
3310                 empty = false;\r
3311         }\r
3312 \r
3313         if (IsChecked(hWnd, R_ST))\r
3314         {\r
3315                 n->State = GetText(hWnd, E_ST);\r
3316                 empty = false;\r
3317         }\r
3318 \r
3319         if (IsChecked(hWnd, R_L))\r
3320         {\r
3321                 n->Local = GetText(hWnd, E_L);\r
3322                 empty = false;\r
3323         }\r
3324 \r
3325         if (IsChecked(hWnd, R_SERI))\r
3326         {\r
3327                 char tmp[MAX_SIZE];\r
3328                 BUF *b;\r
3329 \r
3330                 GetTxtA(hWnd, E_SERI, tmp, sizeof(tmp));\r
3331                 b = StrToBin(tmp);\r
3332 \r
3333                 if (b != NULL && b->Size >= 1)\r
3334                 {\r
3335                         crl->Serial = NewXSerial(b->Buf, b->Size);\r
3336                 }\r
3337 \r
3338                 FreeBuf(b);\r
3339 \r
3340                 empty = false;\r
3341         }\r
3342 \r
3343         if (IsChecked(hWnd, R_MD5_HASH))\r
3344         {\r
3345                 char tmp[MAX_SIZE];\r
3346                 BUF *b;\r
3347 \r
3348                 GetTxtA(hWnd, E_MD5_HASH, tmp, sizeof(tmp));\r
3349                 b = StrToBin(tmp);\r
3350 \r
3351                 if (b != NULL && b->Size == MD5_SIZE)\r
3352                 {\r
3353                         Copy(crl->DigestMD5, b->Buf, MD5_SIZE);\r
3354                 }\r
3355 \r
3356                 FreeBuf(b);\r
3357 \r
3358                 empty = false;\r
3359         }\r
3360 \r
3361         if (IsChecked(hWnd, R_SHA1_HASH))\r
3362         {\r
3363                 char tmp[MAX_SIZE];\r
3364                 BUF *b;\r
3365 \r
3366                 GetTxtA(hWnd, E_SHA1_HASH, tmp, sizeof(tmp));\r
3367                 b = StrToBin(tmp);\r
3368 \r
3369                 if (b != NULL && b->Size == SHA1_SIZE)\r
3370                 {\r
3371                         Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);\r
3372                 }\r
3373 \r
3374                 FreeBuf(b);\r
3375 \r
3376                 empty = false;\r
3377         }\r
3378 \r
3379         if (empty)\r
3380         {\r
3381                 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, _UU("SM_CRL_EMPTY_MSG")) == IDNO)\r
3382                 {\r
3383                         return;\r
3384                 }\r
3385         }\r
3386 \r
3387         if (c->NewCrl)\r
3388         {\r
3389                 Zero(&t, sizeof(t));\r
3390                 StrCpy(t.HubName, sizeof(t.HubName), c->s->HubName);\r
3391                 t.Crl = crl;\r
3392 \r
3393                 if (CALL(hWnd, ScAddCrl(c->s->Rpc, &t)))\r
3394                 {\r
3395                         EndDialog(hWnd, true);\r
3396                 }\r
3397 \r
3398                 FreeRpcCrl(&t);\r
3399         }\r
3400         else\r
3401         {\r
3402                 Zero(&t, sizeof(t));\r
3403                 StrCpy(t.HubName, sizeof(t.HubName), c->s->HubName);\r
3404                 t.Crl = crl;\r
3405                 t.Key = c->Key;\r
3406 \r
3407                 if (CALL(hWnd, ScSetCrl(c->s->Rpc, &t)))\r
3408                 {\r
3409                         EndDialog(hWnd, true);\r
3410                 }\r
3411 \r
3412                 FreeRpcCrl(&t);\r
3413         }\r
3414 }\r
3415 \r
3416 // 証明書の読み込み\r
3417 void SmEditCrlDlgOnLoad(HWND hWnd, SM_EDIT_CRL *c)\r
3418 {\r
3419         X *x;\r
3420         // 引数チェック\r
3421         if (hWnd == NULL || c == NULL)\r
3422         {\r
3423                 return;\r
3424         }\r
3425 \r
3426         if (CmLoadXFromFileOrSecureCard(hWnd, &x))\r
3427         {\r
3428                 UCHAR md5[MD5_SIZE], sha1[SHA1_SIZE];\r
3429 \r
3430                 SmEditCrlDlgSetName(hWnd, x->subject_name);\r
3431                 SmEditCrlDlgSetSerial(hWnd, x->serial);\r
3432                 GetXDigest(x, md5, false);\r
3433                 GetXDigest(x, sha1, true);\r
3434                 SmEditCrlDlgSetHash(hWnd, md5, sha1);\r
3435 \r
3436                 FreeX(x);\r
3437 \r
3438                 SmEditCrlDlgUpdate(hWnd, c);\r
3439         }\r
3440 }\r
3441 \r
3442 // ダイアログにハッシュ情報を設定する\r
3443 void SmEditCrlDlgSetHash(HWND hWnd, UCHAR *hash_md5, UCHAR *hash_sha1)\r
3444 {\r
3445         char tmp[MAX_SIZE];\r
3446         // 引数チェック\r
3447         if (hWnd == NULL)\r
3448         {\r
3449                 return;\r
3450         }\r
3451 \r
3452         if (hash_md5 != NULL && IsZero(hash_md5, MD5_SIZE) == false)\r
3453         {\r
3454                 Check(hWnd, R_MD5_HASH, true);\r
3455                 BinToStrEx(tmp, sizeof(tmp), hash_md5, MD5_SIZE);\r
3456                 SetTextA(hWnd, E_MD5_HASH, tmp);\r
3457         }\r
3458         else\r
3459         {\r
3460                 Check(hWnd, R_MD5_HASH, false);\r
3461         }\r
3462 \r
3463         if (hash_sha1 != NULL && IsZero(hash_sha1, SHA1_SIZE) == false)\r
3464         {\r
3465                 Check(hWnd, R_SHA1_HASH, true);\r
3466                 BinToStrEx(tmp, sizeof(tmp), hash_sha1, SHA1_SIZE);\r
3467                 SetTextA(hWnd, E_SHA1_HASH, tmp);\r
3468         }\r
3469         else\r
3470         {\r
3471                 Check(hWnd, R_SHA1_HASH, false);\r
3472         }\r
3473 }\r
3474 \r
3475 // ダイアログにシリアル番号を設定する\r
3476 void SmEditCrlDlgSetSerial(HWND hWnd, X_SERIAL *serial)\r
3477 {\r
3478         char tmp[MAX_SIZE];\r
3479         // 引数チェック\r
3480         if (hWnd == NULL || serial == NULL)\r
3481         {\r
3482                 return;\r
3483         }\r
3484 \r
3485         BinToStrEx(tmp, sizeof(tmp), serial->data, serial->size);\r
3486 \r
3487         Check(hWnd, R_SERI, true);\r
3488 \r
3489         SetTextA(hWnd, E_SERI, tmp);\r
3490 }\r
3491 \r
3492 // ダイアログに名前状況を設定する\r
3493 void SmEditCrlDlgSetName(HWND hWnd, NAME *name)\r
3494 {\r
3495         // 引数チェック\r
3496         if (hWnd == NULL || name == NULL)\r
3497         {\r
3498                 return;\r
3499         }\r
3500 \r
3501         // CN\r
3502         if (UniIsEmptyStr(name->CommonName))\r
3503         {\r
3504                 Check(hWnd, R_CN, false);\r
3505         }\r
3506         else\r
3507         {\r
3508                 Check(hWnd, R_CN, true);\r
3509                 SetText(hWnd, E_CN, name->CommonName);\r
3510         }\r
3511 \r
3512         // O\r
3513         if (UniIsEmptyStr(name->Organization))\r
3514         {\r
3515                 Check(hWnd, R_O, false);\r
3516         }\r
3517         else\r
3518         {\r
3519                 Check(hWnd, R_O, true);\r
3520                 SetText(hWnd, E_O, name->Organization);\r
3521         }\r
3522 \r
3523         // OU\r
3524         if (UniIsEmptyStr(name->Unit))\r
3525         {\r
3526                 Check(hWnd, R_OU, false);\r
3527         }\r
3528         else\r
3529         {\r
3530                 Check(hWnd, R_OU, true);\r
3531                 SetText(hWnd, E_OU, name->Unit);\r
3532         }\r
3533 \r
3534         // C\r
3535         if (UniIsEmptyStr(name->Country))\r
3536         {\r
3537                 Check(hWnd, R_C, false);\r
3538         }\r
3539         else\r
3540         {\r
3541                 Check(hWnd, R_C, true);\r
3542                 SetText(hWnd, E_C, name->Country);\r
3543         }\r
3544 \r
3545         // ST\r
3546         if (UniIsEmptyStr(name->State))\r
3547         {\r
3548                 Check(hWnd, R_ST, false);\r
3549         }\r
3550         else\r
3551         {\r
3552                 Check(hWnd, R_ST, true);\r
3553                 SetText(hWnd, E_ST, name->State);\r
3554         }\r
3555 \r
3556         // L\r
3557         if (UniIsEmptyStr(name->Local))\r
3558         {\r
3559                 Check(hWnd, R_L, false);\r
3560         }\r
3561         else\r
3562         {\r
3563                 Check(hWnd, R_L, true);\r
3564                 SetText(hWnd, E_L, name->Local);\r
3565         }\r
3566 }\r
3567 \r
3568 // CRL 編集ダイアログプロシージャ\r
3569 UINT SmEditCrlDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
3570 {\r
3571         SM_EDIT_CRL *c = (SM_EDIT_CRL *)param;\r
3572         // 引数チェック\r
3573         if (hWnd == NULL)\r
3574         {\r
3575                 return 0;\r
3576         }\r
3577 \r
3578         switch (msg)\r
3579         {\r
3580         case WM_INITDIALOG:\r
3581                 SmEditCrlDlgInit(hWnd, c);\r
3582                 break;\r
3583 \r
3584         case WM_COMMAND:\r
3585                 switch (LOWORD(wParam))\r
3586                 {\r
3587                 case R_CN:\r
3588                 case E_CN:\r
3589                 case R_O:\r
3590                 case E_O:\r
3591                 case R_OU:\r
3592                 case E_OU:\r
3593                 case R_C:\r
3594                 case E_C:\r
3595                 case R_ST:\r
3596                 case E_ST:\r
3597                 case R_L:\r
3598                 case E_L:\r
3599                 case R_SERI:\r
3600                 case E_SERI:\r
3601                 case R_MD5_HASH:\r
3602                 case E_MD5_HASH:\r
3603                 case R_SHA1_HASH:\r
3604                 case E_SHA1_HASH:\r
3605                         SmEditCrlDlgUpdate(hWnd, c);\r
3606                         break;\r
3607                 }\r
3608 \r
3609                 switch (wParam)\r
3610                 {\r
3611                 case B_LOAD:\r
3612                         SmEditCrlDlgOnLoad(hWnd, c);\r
3613                         break;\r
3614 \r
3615                 case IDOK:\r
3616                         SmEditCrlDlgOnOk(hWnd, c);\r
3617                         break;\r
3618 \r
3619                 case IDCANCEL:\r
3620                         Close(hWnd);\r
3621                         break;\r
3622 \r
3623                 case R_CN:\r
3624                         FocusEx(hWnd, E_CN);\r
3625                         break;\r
3626 \r
3627                 case R_O:\r
3628                         FocusEx(hWnd, E_O);\r
3629                         break;\r
3630 \r
3631                 case R_OU:\r
3632                         FocusEx(hWnd, E_OU);\r
3633                         break;\r
3634 \r
3635                 case R_C:\r
3636                         FocusEx(hWnd, E_C);\r
3637                         break;\r
3638 \r
3639                 case R_ST:\r
3640                         FocusEx(hWnd, E_ST);\r
3641                         break;\r
3642 \r
3643                 case R_L:\r
3644                         FocusEx(hWnd, E_L);\r
3645                         break;\r
3646 \r
3647                 case R_SERI:\r
3648                         FocusEx(hWnd, E_SERI);\r
3649                         break;\r
3650 \r
3651                 case R_MD5_HASH:\r
3652                         FocusEx(hWnd, E_MD5_HASH);\r
3653                         break;\r
3654 \r
3655                 case R_SHA1_HASH:\r
3656                         FocusEx(hWnd, E_SHA1_HASH);\r
3657                         break;\r
3658                 }\r
3659                 break;\r
3660 \r
3661         case WM_CLOSE:\r
3662                 EndDialog(hWnd, false);\r
3663                 break;\r
3664         }\r
3665 \r
3666         return 0;\r
3667 }\r
3668 \r
3669 // ダイアログ初期化\r
3670 void SmCrlDlgInit(HWND hWnd, SM_HUB *s)\r
3671 {\r
3672         // 引数チェック\r
3673         if (hWnd == NULL || s == NULL)\r
3674         {\r
3675                 return;\r
3676         }\r
3677 \r
3678         SetIcon(hWnd, 0, ICO_CERT_X);\r
3679 \r
3680         LvInit(hWnd, L_LIST);\r
3681         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_CRL_COLUMN_1"), 555);\r
3682 \r
3683         SmCrlDlgRefresh(hWnd, s);\r
3684 }\r
3685 \r
3686 // コントロール更新\r
3687 void SmCrlDlgUpdate(HWND hWnd, SM_HUB *s)\r
3688 {\r
3689         // 引数チェック\r
3690         if (hWnd == NULL || s == NULL)\r
3691         {\r
3692                 return;\r
3693         }\r
3694 \r
3695         SetEnable(hWnd, IDOK, LvIsSingleSelected(hWnd, L_LIST));\r
3696         SetEnable(hWnd, B_DELETE, LvIsSingleSelected(hWnd, L_LIST));\r
3697 }\r
3698 \r
3699 // 内容更新\r
3700 void SmCrlDlgRefresh(HWND hWnd, SM_HUB *s)\r
3701 {\r
3702         UINT i;\r
3703         RPC_ENUM_CRL t;\r
3704         LVB *v;\r
3705         // 引数チェック\r
3706         if (hWnd == NULL || s == NULL)\r
3707         {\r
3708                 return;\r
3709         }\r
3710 \r
3711         Zero(&t, sizeof(t));\r
3712         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
3713 \r
3714         if (CALL(hWnd, ScEnumCrl(s->Rpc, &t)) == false)\r
3715         {\r
3716                 EndDialog(hWnd, false);\r
3717                 return;\r
3718         }\r
3719 \r
3720         v = LvInsertStart();\r
3721 \r
3722         for (i = 0;i < t.NumItem;i++)\r
3723         {\r
3724                 RPC_ENUM_CRL_ITEM *e = &t.Items[i];\r
3725                 LvInsertAdd(v, ICO_CERT_X, (void *)e->Key, 1, e->CrlInfo);\r
3726         }\r
3727 \r
3728         LvInsertEndEx(v, hWnd, L_LIST, true);\r
3729 \r
3730         if (t.NumItem >= 1)\r
3731         {\r
3732                 LvAutoSize(hWnd, L_LIST);\r
3733         }\r
3734 \r
3735         FreeRpcEnumCrl(&t);\r
3736 \r
3737         SmCrlDlgUpdate(hWnd, s);\r
3738 }\r
3739 \r
3740 // 無効な証明書一覧ダイアログプロシージャ\r
3741 UINT SmCrlDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
3742 {\r
3743         SM_EDIT_CRL c;\r
3744         SM_HUB *s = (SM_HUB *)param;\r
3745         NMHDR *n;\r
3746         // 引数チェック\r
3747         if (hWnd == NULL)\r
3748         {\r
3749                 return 0;\r
3750         }\r
3751 \r
3752         switch (msg)\r
3753         {\r
3754         case WM_INITDIALOG:\r
3755                 SmCrlDlgInit(hWnd, s);\r
3756                 break;\r
3757 \r
3758         case WM_COMMAND:\r
3759                 switch (wParam)\r
3760                 {\r
3761                 case B_ADD:\r
3762                         Zero(&c, sizeof(c));\r
3763                         c.NewCrl = true;\r
3764                         c.s = s;\r
3765 \r
3766                         if (Dialog(hWnd, D_SM_EDIT_CRL, SmEditCrlDlgProc, &c))\r
3767                         {\r
3768                                 SmCrlDlgRefresh(hWnd, s);\r
3769                         }\r
3770                         break;\r
3771 \r
3772                 case B_DELETE:\r
3773                         if (IsEnable(hWnd, B_DELETE))\r
3774                         {\r
3775                                 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("SM_CRL_DELETE_MSG")) == IDYES)\r
3776                                 {\r
3777                                         RPC_CRL t;\r
3778 \r
3779                                         Zero(&t, sizeof(t));\r
3780                                         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
3781                                         t.Key = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));\r
3782 \r
3783                                         if (CALL(hWnd, ScDelCrl(s->Rpc, &t)))\r
3784                                         {\r
3785                                                 SmCrlDlgRefresh(hWnd, s);\r
3786                                         }\r
3787 \r
3788                                         FreeRpcCrl(&t);\r
3789                                 }\r
3790                         }\r
3791                         break;\r
3792 \r
3793                 case IDOK:\r
3794                         if (IsEnable(hWnd, IDOK))\r
3795                         {\r
3796                                 SM_EDIT_CRL c;\r
3797 \r
3798                                 Zero(&c, sizeof(c));\r
3799                                 c.NewCrl = false;\r
3800                                 c.s = s;\r
3801                                 c.Key = (UINT)LvGetParam(hWnd, L_LIST, LvGetSelected(hWnd, L_LIST));\r
3802 \r
3803                                 if (Dialog(hWnd, D_SM_EDIT_CRL, SmEditCrlDlgProc, &c))\r
3804                                 {\r
3805                                         SmCrlDlgRefresh(hWnd, s);\r
3806                                 }\r
3807                         }\r
3808                         break;\r
3809 \r
3810                 case IDCANCEL:\r
3811                         Close(hWnd);\r
3812                         break;\r
3813                 }\r
3814                 break;\r
3815 \r
3816         case WM_CLOSE:\r
3817                 EndDialog(hWnd, 0);\r
3818                 break;\r
3819 \r
3820         case WM_NOTIFY:\r
3821                 n = (NMHDR *)lParam;\r
3822                 switch (n->code)\r
3823                 {\r
3824                 case LVN_ITEMCHANGED:\r
3825                         switch (n->idFrom)\r
3826                         {\r
3827                         case L_LIST:\r
3828                                 SmCrlDlgUpdate(hWnd, s);\r
3829                                 break;\r
3830                         }\r
3831                         break;\r
3832                 }\r
3833                 break;\r
3834         }\r
3835 \r
3836         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
3837 \r
3838         return 0;\r
3839 }\r
3840 \r
3841 // スマートカードマネージャ\r
3842 void SmSecureManager(HWND hWnd)\r
3843 {\r
3844         UINT id = SmGetCurrentSecureIdFromReg();\r
3845 \r
3846         if (id == 0)\r
3847         {\r
3848                 id = SmSelectSecureId(hWnd);\r
3849         }\r
3850 \r
3851         if (id == 0)\r
3852         {\r
3853                 return;\r
3854         }\r
3855 \r
3856         CmSecureManager(hWnd, id);\r
3857 }\r
3858 \r
3859 // ダイアログ初期化\r
3860 void SmSelectKeyPairDlgInit(HWND hWnd, SM_SECURE_KEYPAIR *k)\r
3861 {\r
3862         SECURE_DEVICE *dev;\r
3863         // 引数チェック\r
3864         if (hWnd == NULL || k == NULL)\r
3865         {\r
3866                 return;\r
3867         }\r
3868 \r
3869         dev = GetSecureDevice(k->Id);\r
3870         if (dev != NULL)\r
3871         {\r
3872                 FormatText(hWnd, S_INFO, dev->DeviceName);\r
3873         }\r
3874 \r
3875         LvInit(hWnd, L_CERT);\r
3876         LvInsertColumn(hWnd, L_CERT, 0, _UU("SEC_MGR_COLUMN1"), 200);\r
3877         LvInsertColumn(hWnd, L_CERT, 1, _UU("SEC_MGR_COLUMN2"), 110);\r
3878 \r
3879         LvInit(hWnd, L_KEY);\r
3880         LvInsertColumn(hWnd, L_KEY, 0, _UU("SEC_MGR_COLUMN1"), 200);\r
3881         LvInsertColumn(hWnd, L_KEY, 1, _UU("SEC_MGR_COLUMN2"), 110);\r
3882 \r
3883         SetEnable(hWnd, L_CERT, k->UseCert);\r
3884         SetEnable(hWnd, B_BOLD1, k->UseCert);\r
3885         SetEnable(hWnd, L_KEY, k->UseKey);\r
3886         SetEnable(hWnd, B_BOLD2, k->UseKey);\r
3887 \r
3888         SetFont(hWnd, B_BOLD1, Font(0, true));\r
3889         SetFont(hWnd, B_BOLD2, Font(0, true));\r
3890 \r
3891         SmSelectKeyPairDlgUpdate(hWnd, k);\r
3892 }\r
3893 \r
3894 // ダイアログコントロール更新\r
3895 void SmSelectKeyPairDlgUpdate(HWND hWnd, SM_SECURE_KEYPAIR *k)\r
3896 {\r
3897         bool ok = true;\r
3898         // 引数チェック\r
3899         if (hWnd == NULL || k == NULL)\r
3900         {\r
3901                 return;\r
3902         }\r
3903 \r
3904         if (k->UseCert)\r
3905         {\r
3906                 if (LvIsSingleSelected(hWnd, L_CERT) == false)\r
3907                 {\r
3908                         ok = false;\r
3909                 }\r
3910                 else\r
3911                 {\r
3912                         char *name = LvGetSelectedStrA(hWnd, L_CERT, 0);\r
3913                         if (name != NULL)\r
3914                         {\r
3915                                 if (LvIsSingleSelected(hWnd, L_KEY) == false)\r
3916                                 {\r
3917                                         if ((k->Flag++) == 0)\r
3918                                         {\r
3919                                                 LvSelect(hWnd, L_KEY, LvSearchStrA(hWnd, L_KEY, 0, name));\r
3920                                         }\r
3921                                 }\r
3922                                 Free(name);\r
3923                         }\r
3924                 }\r
3925         }\r
3926 \r
3927         if (k->UseKey)\r
3928         {\r
3929                 if (LvIsSingleSelected(hWnd, L_KEY) == false)\r
3930                 {\r
3931                         ok = false;\r
3932                 }\r
3933                 else\r
3934                 {\r
3935                         char *name = LvGetSelectedStrA(hWnd, L_KEY, 0);\r
3936                         if (name != NULL)\r
3937                         {\r
3938                                 if (LvIsSingleSelected(hWnd, L_CERT) == false)\r
3939                                 {\r
3940                                         if ((k->Flag++) == 0)\r
3941                                         {\r
3942                                                 LvSelect(hWnd, L_CERT, LvSearchStrA(hWnd, L_CERT, 0, name));\r
3943                                         }\r
3944                                 }\r
3945                                 Free(name);\r
3946                         }\r
3947                 }\r
3948         }\r
3949 \r
3950         SetEnable(hWnd, IDOK, ok);\r
3951 }\r
3952 \r
3953 // コンテンツ更新\r
3954 void SmSelectKeyPairDlgRefresh(HWND hWnd, SM_SECURE_KEYPAIR *k)\r
3955 {\r
3956         bool ret;\r
3957         LIST *o;\r
3958         WINUI_SECURE_BATCH batch[] =\r
3959         {\r
3960                 {WINUI_SECURE_ENUM_OBJECTS, NULL, false, NULL, NULL, NULL, NULL, NULL, NULL},\r
3961         };\r
3962         // 引数チェック\r
3963         if (hWnd == NULL || k == NULL)\r
3964         {\r
3965                 return;\r
3966         }\r
3967 \r
3968         ret = SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), k->Id, k->BitmapId);\r
3969 \r
3970         if (ret == false)\r
3971         {\r
3972                 Close(hWnd);\r
3973                 return;\r
3974         }\r
3975 \r
3976         o = batch[0].EnumList;\r
3977         if (o != NULL)\r
3978         {\r
3979                 if (k->UseCert)\r
3980                 {\r
3981                         CmSecureManagerDlgPrintListEx(hWnd, L_CERT, o, SEC_X);\r
3982                 }\r
3983 \r
3984                 if (k->UseKey)\r
3985                 {\r
3986                         CmSecureManagerDlgPrintListEx(hWnd, L_KEY, o, SEC_K);\r
3987                 }\r
3988 \r
3989                 FreeEnumSecObject(o);\r
3990         }\r
3991 \r
3992         // コントロール更新\r
3993         SmSelectKeyPairDlgUpdate(hWnd, k);\r
3994 }\r
3995 \r
3996 // キーペア読み込みダイアログプロシージャ\r
3997 UINT SmSelectKeyPairDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
3998 {\r
3999         NMHDR *n;\r
4000         SM_SECURE_KEYPAIR *k = (SM_SECURE_KEYPAIR *)param;\r
4001         char *s1, *s2;\r
4002         // 引数チェック\r
4003         if (hWnd == NULL)\r
4004         {\r
4005                 return 0;\r
4006         }\r
4007 \r
4008         switch (msg)\r
4009         {\r
4010         case WM_INITDIALOG:\r
4011                 SmSelectKeyPairDlgInit(hWnd, k);\r
4012 \r
4013                 SetTimer(hWnd, 1, 1, NULL);\r
4014                 SetTimer(hWnd, 2, 100, NULL);\r
4015                 break;\r
4016 \r
4017         case WM_TIMER:\r
4018                 switch (wParam)\r
4019                 {\r
4020                 case 1:\r
4021                         KillTimer(hWnd, 1);\r
4022                         SmSelectKeyPairDlgRefresh(hWnd, k);\r
4023                         break;\r
4024 \r
4025                 case 2:\r
4026                         SmSelectKeyPairDlgUpdate(hWnd, k);\r
4027                         break;\r
4028                 }\r
4029                 break;\r
4030 \r
4031         case WM_COMMAND:\r
4032                 switch (wParam)\r
4033                 {\r
4034                 case IDOK:\r
4035                         s1 = LvGetSelectedStrA(hWnd, L_CERT, 0);\r
4036                         s2 = LvGetSelectedStrA(hWnd, L_KEY, 0);\r
4037                         if (k->UseCert)\r
4038                         {\r
4039                                 StrCpy(k->CertName, sizeof(k->CertName), s1);\r
4040                         }\r
4041                         if (k->UseKey)\r
4042                         {\r
4043                                 StrCpy(k->KeyName, sizeof(k->KeyName), s2);\r
4044                         }\r
4045                         Free(s1);\r
4046                         Free(s2);\r
4047                         EndDialog(hWnd, true);\r
4048                         break;\r
4049 \r
4050                 case IDCANCEL:\r
4051                         Close(hWnd);\r
4052                         break;\r
4053                 }\r
4054                 break;\r
4055 \r
4056         case WM_CLOSE:\r
4057                 EndDialog(hWnd, 0);\r
4058                 break;\r
4059 \r
4060         case WM_NOTIFY:\r
4061                 n = (NMHDR *)lParam;\r
4062                 switch (n->idFrom)\r
4063                 {\r
4064                 case L_CERT:\r
4065                 case L_KEY:\r
4066                         switch (n->code)\r
4067                         {\r
4068                         case LVN_ITEMCHANGED:\r
4069                                 SmSelectKeyPairDlgUpdate(hWnd, k);\r
4070                                 break;\r
4071                         }\r
4072                         break;\r
4073                 }\r
4074                 break;\r
4075         }\r
4076 \r
4077         return 0;\r
4078 }\r
4079 \r
4080 // キーペアをスマートカードから読み込む\r
4081 bool SmSelectKeyPair(HWND hWnd, char *cert_name, UINT cert_name_size, char *key_name, UINT key_name_size)\r
4082 {\r
4083         return SmSelectKeyPairEx(hWnd, cert_name, cert_name_size, key_name, key_name_size, 0);\r
4084 }\r
4085 bool SmSelectKeyPairEx(HWND hWnd, char *cert_name, UINT cert_name_size, char *key_name, UINT key_name_size, UINT bitmap_id)\r
4086 {\r
4087         SM_SECURE_KEYPAIR p;\r
4088         // 引数チェック\r
4089         if (hWnd == NULL || (cert_name == NULL && key_name == NULL))\r
4090         {\r
4091                 return false;\r
4092         }\r
4093 \r
4094         Zero(&p, sizeof(p));\r
4095         p.Id = SmGetCurrentSecureId(hWnd);\r
4096         if (p.Id == 0)\r
4097         {\r
4098                 return false;\r
4099         }\r
4100 \r
4101         p.UseCert = (cert_name == NULL) ? false : true;\r
4102         p.UseKey = (key_name == NULL) ? false : true;\r
4103         p.BitmapId = bitmap_id;\r
4104 \r
4105         if (Dialog(hWnd, D_SM_SELECT_KEYPAIR, SmSelectKeyPairDlg, &p) == false)\r
4106         {\r
4107                 return false;\r
4108         }\r
4109 \r
4110         if (p.UseCert)\r
4111         {\r
4112                 StrCpy(cert_name, cert_name_size, p.CertName);\r
4113         }\r
4114         if (p.UseKey)\r
4115         {\r
4116                 StrCpy(key_name, key_name_size, p.KeyName);\r
4117         }\r
4118 \r
4119         return true;\r
4120 }\r
4121 \r
4122 // スマートカード番号をユーザーに選択させる\r
4123 UINT SmSelectSecureId(HWND hWnd)\r
4124 {\r
4125         UINT id = MsRegReadInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DeviceId");\r
4126         UINT ret;\r
4127 \r
4128         if (id != 0 && CheckSecureDeviceId(id) == false)\r
4129         {\r
4130                 id = 0;\r
4131         }\r
4132 \r
4133         ret = CmSelectSecure(hWnd, id);\r
4134         if (ret == 0)\r
4135         {\r
4136                 return 0;\r
4137         }\r
4138 \r
4139         SmWriteSelectSecureIdReg(ret);\r
4140 \r
4141         return ret;\r
4142 }\r
4143 \r
4144 // 現在のスマートカード番号をレジストリに書き込む\r
4145 void SmWriteSelectSecureIdReg(UINT id)\r
4146 {\r
4147         MsRegWriteInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DeviceId", id);\r
4148 }\r
4149 \r
4150 // 現在のスマートカード番号を取得する\r
4151 UINT SmGetCurrentSecureId(HWND hWnd)\r
4152 {\r
4153         // 現在の設定をロード\r
4154         UINT id = MsRegReadInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DeviceId");\r
4155 \r
4156         // 正常かどうかチェック\r
4157         if (id == 0 || CheckSecureDeviceId(id) == false)\r
4158         {\r
4159                 // 不正な場合はスマートカードデバイス番号を選択させる\r
4160                 id = SmSelectSecureId(hWnd);\r
4161         }\r
4162 \r
4163         return id;\r
4164 }\r
4165 \r
4166 // レジストリから現在のスマートカード番号を取得する\r
4167 UINT SmGetCurrentSecureIdFromReg()\r
4168 {\r
4169         // 現在の設定をロード\r
4170         UINT id = MsRegReadInt(REG_CURRENT_USER, SECURE_MANAGER_KEY, "DeviceId");\r
4171 \r
4172         // 正常かどうかチェック\r
4173         if (id == 0 || CheckSecureDeviceId(id) == false)\r
4174         {\r
4175                 id = 0;\r
4176         }\r
4177 \r
4178         return id;\r
4179 }\r
4180 \r
4181 // 指定した名前の L3 スイッチが開始されているかどうか取得する\r
4182 bool SmL3IsSwActive(SM_SERVER *s, char *name)\r
4183 {\r
4184         bool ret = false;\r
4185         UINT i;\r
4186         RPC_ENUM_L3SW t;\r
4187         // 引数チェック\r
4188         if (s == NULL || name == NULL)\r
4189         {\r
4190                 return false;\r
4191         }\r
4192 \r
4193         Zero(&t, sizeof(t));\r
4194         if (ScEnumL3Switch(s->Rpc, &t) == ERR_NO_ERROR)\r
4195         {\r
4196                 for (i = 0;i < t.NumItem;i++)\r
4197                 {\r
4198                         RPC_ENUM_L3SW_ITEM *e = &t.Items[i];\r
4199                         if (StrCmpi(e->Name, name) == 0)\r
4200                         {\r
4201                                 if (e->Active)\r
4202                                 {\r
4203                                         ret = true;\r
4204                                         break;\r
4205                                 }\r
4206                         }\r
4207                 }\r
4208                 FreeRpcEnumL3Sw(&t);\r
4209         }\r
4210 \r
4211         return ret;\r
4212 }\r
4213 \r
4214 // ダイアログ初期化\r
4215 void SmL3SwTableDlgInit(HWND hWnd, SM_L3SW *w)\r
4216 {\r
4217         // 引数チェック\r
4218         if (hWnd == NULL || w == NULL)\r
4219         {\r
4220                 return;\r
4221         }\r
4222 \r
4223         SmL3SwTableDlgUpdate(hWnd, w);\r
4224 }\r
4225 \r
4226 // コントロール更新\r
4227 void SmL3SwTableDlgUpdate(HWND hWnd, SM_L3SW *w)\r
4228 {\r
4229         bool b = true;\r
4230         UINT ip;\r
4231         // 引数チェック\r
4232         if (hWnd == NULL || w == NULL)\r
4233         {\r
4234                 return;\r
4235         }\r
4236 \r
4237         if (IpIsFilled(hWnd, E_NETWORK) == false ||\r
4238                 IpIsFilled(hWnd, E_MASK) == false ||\r
4239                 IpIsFilled(hWnd, E_GATEWAY) == false)\r
4240         {\r
4241                 b = false;\r
4242         }\r
4243 \r
4244         ip = IpGet(hWnd, E_GATEWAY);\r
4245         if (ip == 0 || ip == 0xffffffff)\r
4246         {\r
4247                 b = false;\r
4248         }\r
4249 \r
4250         if (GetInt(hWnd, E_METRIC) == 0)\r
4251         {\r
4252                 b = false;\r
4253         }\r
4254 \r
4255         if (IsNetworkAddress32(IpGet(hWnd, E_NETWORK), IpGet(hWnd, E_MASK)) == false)\r
4256         {\r
4257                 b = false;\r
4258         }\r
4259 \r
4260         SetEnable(hWnd, IDOK, b);\r
4261 }\r
4262 \r
4263 UINT SmL3SwTableDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
4264 {\r
4265         SM_L3SW *w = (SM_L3SW *)param;\r
4266         RPC_L3TABLE t;\r
4267 \r
4268         if (hWnd == NULL)\r
4269         {\r
4270                 return 0;\r
4271         }\r
4272 \r
4273         switch (msg)\r
4274         {\r
4275         case WM_INITDIALOG:\r
4276                 SmL3SwTableDlgInit(hWnd, w);\r
4277                 break;\r
4278 \r
4279         case WM_COMMAND:\r
4280                 switch (LOWORD(wParam))\r
4281                 {\r
4282                 case E_NETWORK:\r
4283                 case E_MASK:\r
4284                 case E_GATEWAY:\r
4285                 case E_METRIC:\r
4286                         SmL3SwTableDlgUpdate(hWnd, w);\r
4287                         break;\r
4288                 }\r
4289 \r
4290                 switch (wParam)\r
4291                 {\r
4292                 case IDOK:\r
4293                         Zero(&t, sizeof(t));\r
4294                         StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4295                         t.NetworkAddress = IpGet(hWnd, E_NETWORK);\r
4296                         t.SubnetMask = IpGet(hWnd, E_MASK);\r
4297                         t.GatewayAddress = IpGet(hWnd, E_GATEWAY);\r
4298                         t.Metric = GetInt(hWnd, E_METRIC);\r
4299 \r
4300                         if (CALL(hWnd, ScAddL3Table(w->s->Rpc, &t)))\r
4301                         {\r
4302                                 EndDialog(hWnd, 1);\r
4303                         }\r
4304                         break;\r
4305 \r
4306                 case IDCANCEL:\r
4307                         Close(hWnd);\r
4308                         break;\r
4309                 }\r
4310                 break;\r
4311 \r
4312         case WM_CLOSE:\r
4313                 EndDialog(hWnd, 0);\r
4314                 break;\r
4315         }\r
4316 \r
4317         return 0;\r
4318 }\r
4319 \r
4320 // ダイアログ初期化\r
4321 void SmL3SwIfDlgInit(HWND hWnd, SM_L3SW *w)\r
4322 {\r
4323         RPC_ENUM_HUB t;\r
4324         UINT i;\r
4325         // 引数チェック\r
4326         if (hWnd == NULL || w == NULL)\r
4327         {\r
4328                 return;\r
4329         }\r
4330 \r
4331         Zero(&t, sizeof(t));\r
4332 \r
4333         if (CALL(hWnd, ScEnumHub(w->s->Rpc, &t)) == false)\r
4334         {\r
4335                 Close(hWnd);\r
4336                 return;\r
4337         }\r
4338 \r
4339         CbReset(hWnd, E_HUBNAME);\r
4340         CbSetHeight(hWnd, E_HUBNAME, 18);\r
4341 \r
4342         for (i = 0;i < t.NumHub;i++)\r
4343         {\r
4344                 RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];\r
4345 \r
4346                 if (e->HubType != HUB_TYPE_FARM_DYNAMIC)\r
4347                 {\r
4348                         CbAddStrA(hWnd, E_HUBNAME, e->HubName, 0);\r
4349                 }\r
4350         }\r
4351 \r
4352         FreeRpcEnumHub(&t);\r
4353 \r
4354         SetTextA(hWnd, E_HUBNAME, "");\r
4355 \r
4356         SmL3SwIfDlgUpdate(hWnd, w);\r
4357 }\r
4358 \r
4359 // コントロール更新\r
4360 void SmL3SwIfDlgUpdate(HWND hWnd, SM_L3SW *w)\r
4361 {\r
4362         bool b = true;\r
4363         // 引数チェック\r
4364         if (hWnd == NULL || w == NULL)\r
4365         {\r
4366                 return;\r
4367         }\r
4368 \r
4369         if (IsEmpty(hWnd, E_HUBNAME))\r
4370         {\r
4371                 b = false;\r
4372         }\r
4373 \r
4374         if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)\r
4375         {\r
4376                 b = false;\r
4377         }\r
4378 \r
4379         if (IpGet(hWnd, E_IP) == 0 || IpGet(hWnd, E_IP) == 0xffffffff)\r
4380         {\r
4381                 b = false;\r
4382         }\r
4383 \r
4384         if (IsSubnetMask32(IpGet(hWnd, E_MASK)) == false)\r
4385         {\r
4386                 b = false;\r
4387         }\r
4388 \r
4389         SetEnable(hWnd, IDOK, b);\r
4390 }\r
4391 \r
4392 // 仮想インターフェイスの追加ダイアログ\r
4393 UINT SmL3SwIfDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
4394 {\r
4395         SM_L3SW *w = (SM_L3SW *)param;\r
4396         char *hubname;\r
4397         // 引数チェック\r
4398         if (hWnd == NULL)\r
4399         {\r
4400                 return 0;\r
4401         }\r
4402 \r
4403         switch (msg)\r
4404         {\r
4405         case WM_INITDIALOG:\r
4406                 SmL3SwIfDlgInit(hWnd, w);\r
4407 \r
4408                 SetTimer(hWnd, 1, 250, NULL);\r
4409                 break;\r
4410 \r
4411         case WM_TIMER:\r
4412                 switch (wParam)\r
4413                 {\r
4414                 case 1:\r
4415                         SmL3SwIfDlgUpdate(hWnd, w);\r
4416                         break;\r
4417                 }\r
4418                 break;\r
4419 \r
4420         case WM_COMMAND:\r
4421                 switch (LOWORD(wParam))\r
4422                 {\r
4423                 case E_HUBNAME:\r
4424                 case E_IP:\r
4425                 case E_MASK:\r
4426                         SmL3SwIfDlgUpdate(hWnd, w);\r
4427                         break;\r
4428                 }\r
4429 \r
4430                 switch (wParam)\r
4431                 {\r
4432                 case IDOK:\r
4433                         hubname = GetTextA(hWnd, E_HUBNAME);\r
4434                         if (hubname != NULL)\r
4435                         {\r
4436                                 RPC_L3IF t;\r
4437                                 Zero(&t, sizeof(t));\r
4438                                 StrCpy(t.HubName, sizeof(t.HubName), hubname);\r
4439                                 t.IpAddress = IpGet(hWnd, E_IP);\r
4440                                 t.SubnetMask = IpGet(hWnd, E_MASK);\r
4441                                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4442 \r
4443                                 if (CALL(hWnd, ScAddL3If(w->s->Rpc, &t)))\r
4444                                 {\r
4445                                         EndDialog(hWnd, 1);\r
4446                                 }\r
4447 \r
4448                                 Free(hubname);\r
4449                         }\r
4450                         break;\r
4451 \r
4452                 case IDCANCEL:\r
4453                         Close(hWnd);\r
4454                         break;\r
4455                 }\r
4456                 break;\r
4457 \r
4458         case WM_CLOSE:\r
4459                 EndDialog(hWnd, 0);\r
4460                 break;\r
4461         }\r
4462 \r
4463         return 0;\r
4464 }\r
4465 \r
4466 // 初期化\r
4467 void SmL3SwDlgInit(HWND hWnd, SM_L3SW *w)\r
4468 {\r
4469         // 引数チェック\r
4470         if (hWnd == NULL || w == NULL)\r
4471         {\r
4472                 return;\r
4473         }\r
4474 \r
4475         SetIcon(hWnd, 0, ICO_SWITCH_OFFLINE);\r
4476 \r
4477         FormatText(hWnd, 0, w->SwitchName);\r
4478 \r
4479         SetFont(hWnd, S_BOLD1, Font(0, true));\r
4480         SetFont(hWnd, S_BOLD2, Font(0, true));\r
4481 \r
4482         LvInit(hWnd, L_IF);\r
4483         LvInsertColumn(hWnd, L_IF, 0, _UU("SM_L3_SW_IF_COLUMN1"), 150);\r
4484         LvInsertColumn(hWnd, L_IF, 1, _UU("SM_L3_SW_IF_COLUMN2"), 150);\r
4485         LvInsertColumn(hWnd, L_IF, 2, _UU("SM_L3_SW_IF_COLUMN3"), 180);\r
4486 \r
4487         LvInit(hWnd, L_TABLE);\r
4488         LvInsertColumn(hWnd, L_TABLE, 0, _UU("SM_L3_SW_TABLE_COLUMN1"), 130);\r
4489         LvInsertColumn(hWnd, L_TABLE, 1, _UU("SM_L3_SW_TABLE_COLUMN2"), 130);\r
4490         LvInsertColumn(hWnd, L_TABLE, 2, _UU("SM_L3_SW_TABLE_COLUMN3"), 130);\r
4491         LvInsertColumn(hWnd, L_TABLE, 3, _UU("SM_L3_SW_TABLE_COLUMN4"), 100);\r
4492 \r
4493         w->Enable = SmL3IsSwActive(w->s, w->SwitchName) ? false : true;\r
4494 \r
4495         SmL3SwDlgRefresh(hWnd, w);\r
4496 }\r
4497 \r
4498 // コントロール更新\r
4499 void SmL3SwDlgUpdate(HWND hWnd, SM_L3SW *w)\r
4500 {\r
4501         // 引数チェック\r
4502         if (hWnd == NULL || w == NULL)\r
4503         {\r
4504                 return;\r
4505         }\r
4506 \r
4507         SetEnable(hWnd, B_ADD_IF, w->s->ServerAdminMode && w->Enable);\r
4508         SetEnable(hWnd, B_ADD_TABLE, w->s->ServerAdminMode && w->Enable);\r
4509         SetEnable(hWnd, B_DEL_IF, LvIsSingleSelected(hWnd, L_IF) && w->s->ServerAdminMode && w->Enable);\r
4510         SetEnable(hWnd, B_DEL_TABLE, LvIsSingleSelected(hWnd, L_TABLE) && w->s->ServerAdminMode && w->Enable);\r
4511         SetEnable(hWnd, B_START, w->s->ServerAdminMode && w->Enable);\r
4512         SetEnable(hWnd, B_STOP, w->s->ServerAdminMode && (w->Enable == false));\r
4513 }\r
4514 \r
4515 // 内容更新\r
4516 void SmL3SwDlgRefresh(HWND hWnd, SM_L3SW *w)\r
4517 {\r
4518         UINT i;\r
4519         wchar_t tmp1[MAX_SIZE];\r
4520         wchar_t tmp2[MAX_SIZE];\r
4521         wchar_t tmp3[MAX_SIZE];\r
4522         wchar_t tmp4[MAX_SIZE];\r
4523         // 引数チェック\r
4524         if (hWnd == NULL || w == NULL)\r
4525         {\r
4526                 return;\r
4527         }\r
4528 \r
4529         // 仮想インターフェイス一覧\r
4530         {\r
4531                 RPC_ENUM_L3IF t;\r
4532                 LVB *v;\r
4533 \r
4534                 Zero(&t, sizeof(t));\r
4535                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4536 \r
4537                 if (CALL(hWnd, ScEnumL3If(w->s->Rpc, &t)) == false)\r
4538                 {\r
4539                         Close(hWnd);\r
4540                         return;\r
4541                 }\r
4542 \r
4543                 v = LvInsertStart();\r
4544 \r
4545                 for (i = 0;i < t.NumItem;i++)\r
4546                 {\r
4547                         RPC_L3IF *e = &t.Items[i];\r
4548 \r
4549                         IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);\r
4550                         IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);\r
4551                         StrToUni(tmp3, sizeof(tmp3), e->HubName);\r
4552 \r
4553                         LvInsertAdd(v, ICO_NIC_ONLINE, NULL, 3, tmp1, tmp2, tmp3);\r
4554                 }\r
4555 \r
4556                 LvReset(hWnd, L_IF);\r
4557 \r
4558                 LvInsertEnd(v, hWnd, L_IF);\r
4559 \r
4560                 FreeRpcEnumL3If(&t);\r
4561         }\r
4562 \r
4563         // ルーティングテーブル一覧\r
4564         {\r
4565                 RPC_ENUM_L3TABLE t;\r
4566                 LVB *v;\r
4567 \r
4568                 Zero(&t, sizeof(t));\r
4569                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4570 \r
4571                 if (CALL(hWnd, ScEnumL3Table(w->s->Rpc, &t)) == false)\r
4572                 {\r
4573                         Close(hWnd);\r
4574                         return;\r
4575                 }\r
4576 \r
4577                 v = LvInsertStart();\r
4578 \r
4579                 for (i = 0;i < t.NumItem;i++)\r
4580                 {\r
4581                         RPC_L3TABLE *e = &t.Items[i];\r
4582 \r
4583                         IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);\r
4584                         IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);\r
4585                         IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);\r
4586                         UniToStru(tmp4, e->Metric);\r
4587 \r
4588                         LvInsertAdd(v, ICO_PROTOCOL, NULL, 4, tmp1, tmp2, tmp3, tmp4);\r
4589                 }\r
4590 \r
4591                 LvReset(hWnd, L_TABLE);\r
4592 \r
4593                 LvInsertEnd(v, hWnd, L_TABLE);\r
4594 \r
4595                 FreeRpcEnumL3Table(&t);\r
4596         }\r
4597 \r
4598         SmL3SwDlgUpdate(hWnd, w);\r
4599 }\r
4600 \r
4601 // L3 スイッチの編集ダイアログ\r
4602 UINT SmL3SwDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
4603 {\r
4604         SM_L3SW *w = (SM_L3SW *)param;\r
4605         NMHDR *n;\r
4606         // 引数チェック\r
4607         if (hWnd == NULL)\r
4608         {\r
4609                 return 0;\r
4610         }\r
4611 \r
4612         switch (msg)\r
4613         {\r
4614         case WM_INITDIALOG:\r
4615                 SmL3SwDlgInit(hWnd, w);\r
4616 \r
4617                 SetTimer(hWnd, 1, 1000, NULL);\r
4618                 break;\r
4619 \r
4620         case WM_TIMER:\r
4621                 switch (wParam)\r
4622                 {\r
4623                 case 1:\r
4624                         KillTimer(hWnd, 1);\r
4625                         w->Enable = SmL3IsSwActive(w->s, w->SwitchName) ? false : true;\r
4626                         SmL3SwDlgUpdate(hWnd, w);\r
4627                         SetTimer(hWnd, 1, 1000, NULL);\r
4628                         break;\r
4629                 }\r
4630                 break;\r
4631 \r
4632         case WM_COMMAND:\r
4633                 switch (wParam)\r
4634                 {\r
4635                 case B_START:\r
4636                         if (IsEnable(hWnd, B_START))\r
4637                         {\r
4638                                 RPC_L3SW t;\r
4639 \r
4640                                 Zero(&t, sizeof(t));\r
4641                                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4642 \r
4643                                 if (CALL(hWnd, ScStartL3Switch(w->s->Rpc, &t)))\r
4644                                 {\r
4645                                         SmL3SwDlgUpdate(hWnd, w);\r
4646                                 }\r
4647                         }\r
4648                         break;\r
4649 \r
4650                 case B_STOP:\r
4651                         if (IsEnable(hWnd, B_STOP))\r
4652                         {\r
4653                                 RPC_L3SW t;\r
4654 \r
4655                                 Zero(&t, sizeof(t));\r
4656                                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4657 \r
4658                                 if (CALL(hWnd, ScStopL3Switch(w->s->Rpc, &t)))\r
4659                                 {\r
4660                                         SmL3SwDlgUpdate(hWnd, w);\r
4661                                 }\r
4662                         }\r
4663                         break;\r
4664 \r
4665                 case B_ADD_IF:\r
4666                         if (Dialog(hWnd, D_SM_L3_SW_IF, SmL3SwIfDlg, w))\r
4667                         {\r
4668                                 SmL3SwDlgRefresh(hWnd, w);\r
4669                         }\r
4670                         break;\r
4671 \r
4672                 case B_DEL_IF:\r
4673                         if (LvIsSingleSelected(hWnd, L_IF))\r
4674                         {\r
4675                                 RPC_L3IF t;\r
4676                                 char *tmp1, *tmp2, *tmp3;\r
4677 \r
4678                                 tmp1 = LvGetSelectedStrA(hWnd, L_IF, 0);\r
4679                                 tmp2 = LvGetSelectedStrA(hWnd, L_IF, 1);\r
4680                                 tmp3 = LvGetSelectedStrA(hWnd, L_IF, 2);\r
4681 \r
4682                                 Zero(&t, sizeof(t));\r
4683                                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4684                                 t.IpAddress = StrToIP32(tmp1);\r
4685                                 t.SubnetMask = StrToIP32(tmp2);\r
4686                                 StrCpy(t.HubName, sizeof(t.HubName), tmp3);\r
4687 \r
4688                                 if (CALL(hWnd, ScDelL3If(w->s->Rpc, &t)))\r
4689                                 {\r
4690                                         SmL3SwDlgRefresh(hWnd, w);\r
4691                                 }\r
4692 \r
4693                                 Free(tmp1);\r
4694                                 Free(tmp2);\r
4695                                 Free(tmp3);\r
4696                         }\r
4697                         break;\r
4698 \r
4699                 case B_ADD_TABLE:\r
4700                         if (Dialog(hWnd, D_SM_L3_SW_TABLE, SmL3SwTableDlg, w))\r
4701                         {\r
4702                                 SmL3SwDlgRefresh(hWnd, w);\r
4703                         }\r
4704                         break;\r
4705 \r
4706                 case B_DEL_TABLE:\r
4707                         if (LvIsSingleSelected(hWnd, L_TABLE))\r
4708                         {\r
4709                                 RPC_L3TABLE t;\r
4710                                 char *tmp1, *tmp2, *tmp3, *tmp4;\r
4711 \r
4712                                 tmp1 = LvGetSelectedStrA(hWnd, L_TABLE, 0);\r
4713                                 tmp2 = LvGetSelectedStrA(hWnd, L_TABLE, 1);\r
4714                                 tmp3 = LvGetSelectedStrA(hWnd, L_TABLE, 2);\r
4715                                 tmp4 = LvGetSelectedStrA(hWnd, L_TABLE, 3);\r
4716 \r
4717                                 Zero(&t, sizeof(t));\r
4718                                 StrCpy(t.Name, sizeof(t.Name), w->SwitchName);\r
4719                                 t.NetworkAddress = StrToIP32(tmp1);\r
4720                                 t.SubnetMask = StrToIP32(tmp2);\r
4721                                 t.GatewayAddress = StrToIP32(tmp3);\r
4722                                 t.Metric = ToInt(tmp4);\r
4723 \r
4724                                 if (CALL(hWnd, ScDelL3Table(w->s->Rpc, &t)))\r
4725                                 {\r
4726                                         SmL3SwDlgRefresh(hWnd, w);\r
4727                                 }\r
4728 \r
4729                                 Free(tmp1);\r
4730                                 Free(tmp2);\r
4731                                 Free(tmp3);\r
4732                                 Free(tmp4);\r
4733                         }\r
4734                         break;\r
4735 \r
4736                 case IDCANCEL:\r
4737                         Close(hWnd);\r
4738                         break;\r
4739                 }\r
4740                 break;\r
4741 \r
4742         case WM_CLOSE:\r
4743                 EndDialog(hWnd, 0);\r
4744                 break;\r
4745 \r
4746         case WM_NOTIFY:\r
4747                 n = (NMHDR *)lParam;\r
4748                 switch (n->idFrom)\r
4749                 {\r
4750                 case L_IF:\r
4751                 case L_TABLE:\r
4752                         switch (n->code)\r
4753                         {\r
4754                         case LVN_ITEMCHANGED:\r
4755                                 SmL3SwDlgUpdate(hWnd, w);\r
4756                                 break;\r
4757                         }\r
4758                         break;\r
4759                 }\r
4760                 break;\r
4761         }\r
4762 \r
4763         return 0;\r
4764 }\r
4765 \r
4766 // コントロール更新\r
4767 void SmL3AddDlgUpdate(HWND hWnd, SM_SERVER *s)\r
4768 {\r
4769         char *tmp;\r
4770         // 引数チェック\r
4771         if (hWnd == NULL || s == NULL)\r
4772         {\r
4773                 return;\r
4774         }\r
4775 \r
4776         tmp = GetTextA(hWnd, E_NAME);\r
4777 \r
4778         SetEnable(hWnd, IDOK, IsEmptyStr(tmp) == false && IsSafeStr(tmp));\r
4779 \r
4780         Free(tmp);\r
4781 }\r
4782 \r
4783 // 新しい L3 スイッチの作成ダイアログ\r
4784 UINT SmL3AddDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
4785 {\r
4786         SM_SERVER *s = (SM_SERVER *)param;\r
4787         RPC_L3SW t;\r
4788         // 引数チェック\r
4789         if (hWnd == NULL)\r
4790         {\r
4791                 return 0;\r
4792         }\r
4793 \r
4794         switch (msg)\r
4795         {\r
4796         case WM_INITDIALOG:\r
4797                 LimitText(hWnd, E_NAME, MAX_HUBNAME_LEN);\r
4798                 SmL3AddDlgUpdate(hWnd, s);\r
4799                 break;\r
4800 \r
4801         case WM_COMMAND:\r
4802                 switch (LOWORD(wParam))\r
4803                 {\r
4804                 case E_NAME:\r
4805                         SmL3AddDlgUpdate(hWnd, s);\r
4806                         break;\r
4807                 }\r
4808 \r
4809                 switch (wParam)\r
4810                 {\r
4811                 case IDOK:\r
4812                         Zero(&t, sizeof(t));\r
4813                         GetTxtA(hWnd, E_NAME, t.Name, sizeof(t.Name));\r
4814                         if (CALL(hWnd, ScAddL3Switch(s->Rpc, &t)))\r
4815                         {\r
4816                                 EndDialog(hWnd, 1);\r
4817                         }\r
4818                         break;\r
4819 \r
4820                 case IDCANCEL:\r
4821                         Close(hWnd);\r
4822                         break;\r
4823                 }\r
4824                 break;\r
4825 \r
4826         case WM_CLOSE:\r
4827                 EndDialog(hWnd, 0);\r
4828                 break;\r
4829         }\r
4830 \r
4831         return 0;\r
4832 }\r
4833 \r
4834 // ダイアログ初期化\r
4835 void SmL3DlgInit(HWND hWnd, SM_SERVER *s)\r
4836 {\r
4837         // 引数チェック\r
4838         if (hWnd == NULL || s == NULL)\r
4839         {\r
4840                 return;\r
4841         }\r
4842 \r
4843         SetFont(hWnd, S_BOLD, Font(0, true));\r
4844 \r
4845         SetIcon(hWnd, 0, ICO_SWITCH);\r
4846 \r
4847         LvInit(hWnd, L_LIST);\r
4848         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_L3_SW_COLUMN1"), 150);\r
4849         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_L3_SW_COLUMN2"), 120);\r
4850         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_L3_SW_COLUMN3"), 100);\r
4851         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_L3_SW_COLUMN4"), 100);\r
4852 \r
4853         SmL3DlgRefresh(hWnd, s);\r
4854 }\r
4855 \r
4856 // ダイアログコントロール更新\r
4857 void SmL3DlgUpdate(HWND hWnd, SM_SERVER *s)\r
4858 {\r
4859         bool b = false;\r
4860         bool active = false;\r
4861         // 引数チェック\r
4862         if (hWnd == NULL || s == NULL)\r
4863         {\r
4864                 return;\r
4865         }\r
4866 \r
4867         if (LvIsSingleSelected(hWnd, L_LIST))\r
4868         {\r
4869                 wchar_t *tmp;\r
4870                 UINT i;\r
4871                 b = true;\r
4872                 i = LvGetSelected(hWnd, L_LIST);\r
4873                 if (i != INFINITE)\r
4874                 {\r
4875                         tmp = LvGetStr(hWnd, L_LIST, i, 1);\r
4876                         if (UniStrCmpi(tmp, _UU("SM_L3_SW_ST_F_F")) != 0)\r
4877                         {\r
4878                                 active = true;\r
4879                         }\r
4880                         Free(tmp);\r
4881                 }\r
4882         }\r
4883 \r
4884         SetEnable(hWnd, B_START, b && (active == false));\r
4885         SetEnable(hWnd, B_STOP, b && (active != false));\r
4886         SetEnable(hWnd, IDOK, b);\r
4887         SetEnable(hWnd, B_DELETE, b);\r
4888 }\r
4889 \r
4890 // ダイアログ内容更新\r
4891 void SmL3DlgRefresh(HWND hWnd, SM_SERVER *s)\r
4892 {\r
4893         RPC_ENUM_L3SW t;\r
4894         UINT i;\r
4895         LVB *v;\r
4896         // 引数チェック\r
4897         if (hWnd == NULL || s == NULL)\r
4898         {\r
4899                 return;\r
4900         }\r
4901 \r
4902         Zero(&t, sizeof(t));\r
4903         if (CALL(hWnd, ScEnumL3Switch(s->Rpc, &t)) == false)\r
4904         {\r
4905                 Close(hWnd);\r
4906                 return;\r
4907         }\r
4908 \r
4909         v = LvInsertStart();\r
4910 \r
4911         for (i = 0;i < t.NumItem;i++)\r
4912         {\r
4913                 RPC_ENUM_L3SW_ITEM *e = &t.Items[i];\r
4914                 wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];\r
4915 \r
4916                 StrToUni(tmp1, sizeof(tmp1), e->Name);\r
4917                 if (e->Active == false)\r
4918                 {\r
4919                         tmp2 = _UU("SM_L3_SW_ST_F_F");\r
4920                 }\r
4921                 else if (e->Online == false)\r
4922                 {\r
4923                         tmp2 = _UU("SM_L3_SW_ST_T_F");\r
4924                 }\r
4925                 else\r
4926                 {\r
4927                         tmp2 = _UU("SM_L3_SW_ST_T_T");\r
4928                 }\r
4929                 UniToStru(tmp3, e->NumInterfaces);\r
4930                 UniToStru(tmp4, e->NumTables);\r
4931 \r
4932                 LvInsertAdd(v, e->Active ? ICO_SWITCH : ICO_SWITCH_OFFLINE, NULL,\r
4933                         4, tmp1, tmp2, tmp3, tmp4);\r
4934         }\r
4935 \r
4936         LvInsertEnd(v, hWnd, L_LIST);\r
4937 \r
4938         FreeRpcEnumL3Sw(&t);\r
4939 \r
4940         SmL3DlgUpdate(hWnd, s);\r
4941 }\r
4942 \r
4943 // L3 ダイアログプロシージャ\r
4944 UINT SmL3Dlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
4945 {\r
4946         NMHDR *n;\r
4947         SM_SERVER *s = (SM_SERVER *)param;\r
4948         RPC_L3SW t;\r
4949         char *name;\r
4950         // 引数チェック\r
4951         if (hWnd == NULL)\r
4952         {\r
4953                 return 0;\r
4954         }\r
4955 \r
4956         switch (msg)\r
4957         {\r
4958         case WM_INITDIALOG:\r
4959                 SmL3DlgInit(hWnd, s);\r
4960 \r
4961                 SetTimer(hWnd, 1, 1000, NULL);\r
4962                 break;\r
4963 \r
4964         case WM_TIMER:\r
4965                 KillTimer(hWnd, 1);\r
4966                 SmL3DlgRefresh(hWnd, s);\r
4967                 SetTimer(hWnd, 1, 1000, NULL);\r
4968                 break;\r
4969 \r
4970         case WM_COMMAND:\r
4971                 switch (wParam)\r
4972                 {\r
4973                 case B_ADD:\r
4974                         // 追加\r
4975                         if (Dialog(hWnd, D_SM_L3_ADD, SmL3AddDlg, s))\r
4976                         {\r
4977                                 SmL3DlgRefresh(hWnd, s);\r
4978                         }\r
4979                         break;\r
4980 \r
4981                 case B_START:\r
4982                         // 動作開始\r
4983                         name = LvGetSelectedStrA(hWnd, L_LIST, 0);\r
4984                         if (name != NULL)\r
4985                         {\r
4986                                 Zero(&t, sizeof(t));\r
4987                                 StrCpy(t.Name, sizeof(t.Name), name);\r
4988 \r
4989                                 if (CALL(hWnd, ScStartL3Switch(s->Rpc, &t)))\r
4990                                 {\r
4991                                         SmL3DlgRefresh(hWnd, s);\r
4992                                 }\r
4993 \r
4994                                 Free(name);\r
4995                         }\r
4996                         break;\r
4997 \r
4998                 case B_STOP:\r
4999                         // 動作停止\r
5000                         name = LvGetSelectedStrA(hWnd, L_LIST, 0);\r
5001                         if (name != NULL)\r
5002                         {\r
5003                                 Zero(&t, sizeof(t));\r
5004                                 StrCpy(t.Name, sizeof(t.Name), name);\r
5005 \r
5006                                 if (CALL(hWnd, ScStopL3Switch(s->Rpc, &t)))\r
5007                                 {\r
5008                                         SmL3DlgRefresh(hWnd, s);\r
5009                                 }\r
5010 \r
5011                                 Free(name);\r
5012                         }\r
5013                         break;\r
5014 \r
5015                 case IDOK:\r
5016                         // 編集\r
5017                         if (IsEnable(hWnd, IDOK))\r
5018                         {\r
5019                                 name = LvGetSelectedStrA(hWnd, L_LIST, 0);\r
5020                                 if (name != NULL)\r
5021                                 {\r
5022                                         SM_L3SW w;\r
5023                                         Zero(&w, sizeof(w));\r
5024                                         w.s = s;\r
5025                                         w.SwitchName = name;\r
5026 \r
5027                                         Dialog(hWnd, D_SM_L3_SW, SmL3SwDlg, &w);\r
5028 \r
5029                                         Free(name);\r
5030                                 }\r
5031                         }\r
5032                         break;\r
5033 \r
5034                 case B_DELETE:\r
5035                         // 削除\r
5036                         name = LvGetSelectedStrA(hWnd, L_LIST, 0);\r
5037                         if (name != NULL)\r
5038                         {\r
5039                                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2,\r
5040                                         _UU("SM_L3_SW_DEL_MSG"), name) == IDYES)\r
5041                                 {\r
5042                                         Zero(&t, sizeof(t));\r
5043                                         StrCpy(t.Name, sizeof(t.Name), name);\r
5044 \r
5045                                         if (CALL(hWnd, ScDelL3Switch(s->Rpc, &t)))\r
5046                                         {\r
5047                                                 SmL3DlgRefresh(hWnd, s);\r
5048                                         }\r
5049                                 }\r
5050 \r
5051                                 Free(name);\r
5052                         }\r
5053                         break;\r
5054 \r
5055                 case IDCANCEL:\r
5056                         // 閉じる\r
5057                         Close(hWnd);\r
5058                         break;\r
5059                 }\r
5060                 break;\r
5061 \r
5062         case WM_NOTIFY:\r
5063                 n = (NMHDR *)lParam;\r
5064                 switch (n->idFrom)\r
5065                 {\r
5066                 case L_LIST:\r
5067                         switch (n->code)\r
5068                         {\r
5069                         case LVN_ITEMCHANGED:\r
5070                                 SmL3DlgUpdate(hWnd, s);\r
5071                                 break;\r
5072 \r
5073                         case NM_DBLCLK:\r
5074                                 Command(hWnd, IDOK);\r
5075                                 break;\r
5076                         }\r
5077                         break;\r
5078                 }\r
5079                 break;\r
5080 \r
5081         case WM_CLOSE:\r
5082                 EndDialog(hWnd, 0);\r
5083                 break;\r
5084         }\r
5085 \r
5086         return 0;\r
5087 }\r
5088 \r
5089 // L3 ダイアログ\r
5090 void SmL3(HWND hWnd, SM_SERVER *s)\r
5091 {\r
5092         // 引数チェック\r
5093         if (s == NULL)\r
5094         {\r
5095                 return;\r
5096         }\r
5097 \r
5098         Dialog(hWnd, D_SM_L3, SmL3Dlg, s);\r
5099 }\r
5100 \r
5101 // 管理オプション値用ダイアログ\r
5102 UINT SmHubAdminOptionValueDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
5103 {\r
5104         SM_EDIT_AO *a = (SM_EDIT_AO *)param;\r
5105         UINT i;\r
5106         char tmp[MAX_SIZE];\r
5107         // 引数チェック\r
5108         if (hWnd == NULL)\r
5109         {\r
5110                 return 0;\r
5111         }\r
5112 \r
5113         switch (msg)\r
5114         {\r
5115         case WM_INITDIALOG:\r
5116                 CbReset(hWnd, C_NAME);\r
5117                 for (i = 0;i < a->DefaultOptions.NumItem;i++)\r
5118                 {\r
5119                         wchar_t tmp[MAX_PATH];\r
5120                         StrToUni(tmp, sizeof(tmp), a->DefaultOptions.Items[i].Name);\r
5121                         CbAddStr(hWnd, C_NAME, tmp, 0);\r
5122                 }\r
5123                 if (a->NewMode == false)\r
5124                 {\r
5125                         char tmp[MAX_SIZE];\r
5126 \r
5127                         SetTextA(hWnd, C_NAME, a->Name);\r
5128                         ToStr(tmp, a->Value);\r
5129 \r
5130                         SetTextA(hWnd, E_VALUE, tmp);\r
5131                 }\r
5132                 else\r
5133                 {\r
5134                         SetTextA(hWnd, C_NAME, "");\r
5135                 }\r
5136                 SmHubAdminOptionValueDlgUpdate(hWnd, a);\r
5137                 if (a->NewMode == false)\r
5138                 {\r
5139                         FocusEx(hWnd, E_VALUE);\r
5140                         Disable(hWnd, C_NAME);\r
5141                 }\r
5142                 else\r
5143                 {\r
5144                         FocusEx(hWnd, C_NAME);\r
5145                 }\r
5146 \r
5147                 SetTimer(hWnd, 1, 100, NULL);\r
5148                 break;\r
5149 \r
5150         case WM_TIMER:\r
5151                 SmHubAdminOptionValueDlgUpdate(hWnd, a);\r
5152                 break;\r
5153 \r
5154         case WM_COMMAND:\r
5155                 switch (wParam)\r
5156                 {\r
5157                 case IDOK:\r
5158                         if (a->NewMode)\r
5159                         {\r
5160                                 GetTxtA(hWnd, C_NAME, a->Name, sizeof(a->Name));\r
5161                         }\r
5162 \r
5163                         GetTxtA(hWnd, E_VALUE, tmp, sizeof(tmp));\r
5164                         a->Value = ToInt(tmp);\r
5165 \r
5166                         Trim(a->Name);\r
5167 \r
5168                         if (StartWith(a->Name, "no") || StartWith(a->Name, "allow") || StartWith(a->Name, "deny")\r
5169                                  || StartWith(a->Name, "filter") || StartWith(a->Name, "fix") || StartWith(a->Name, "force")\r
5170                                  || StartWith(a->Name, "use") || StartWith(a->Name, "b_") || StartWith(a->Name, "is")\r
5171                                  || StartWith(a->Name, "manage") || StartWith(a->Name, "yield")\r
5172                                  || StartWith(a->Name, "permit") || StartWith(a->Name, "yes") || StartWith(a->Name, "ok")\r
5173                                  || StartWith(a->Name, "do") || StartWith(a->Name, "only") || StartWith(a->Name, "disable"))\r
5174                         {\r
5175                                 if (StrCmpi(tmp, "0") != 0 && StrCmpi(tmp, "1") != 0)\r
5176                                 {\r
5177                                         MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SM_TRUE_OR_FALSE"));\r
5178                                         FocusEx(hWnd, E_VALUE);\r
5179                                         break;\r
5180                                 }\r
5181                         }\r
5182 \r
5183                         EndDialog(hWnd, true);\r
5184                         break;\r
5185 \r
5186                 case IDCANCEL:\r
5187                         Close(hWnd);\r
5188                         break;\r
5189                 }\r
5190 \r
5191                 SmHubAdminOptionValueDlgUpdate(hWnd, a);\r
5192 \r
5193                 break;\r
5194 \r
5195         case WM_CLOSE:\r
5196                 EndDialog(hWnd, false);\r
5197                 break;\r
5198         }\r
5199 \r
5200         return 0;\r
5201 }\r
5202 \r
5203 // 管理オプション値用ダイアログ コントロール更新\r
5204 void SmHubAdminOptionValueDlgUpdate(HWND hWnd, SM_EDIT_AO *a)\r
5205 {\r
5206         char tmp[MAX_SIZE];\r
5207         // 引数チェック\r
5208         if (hWnd == NULL || a == NULL)\r
5209         {\r
5210                 return;\r
5211         }\r
5212 \r
5213         GetTxtA(hWnd, C_NAME, tmp, sizeof(tmp));\r
5214 \r
5215         SetEnable(hWnd, IDOK, IsEmpty(hWnd, C_NAME) == false && IsEmpty(hWnd, E_VALUE) == false &&\r
5216                 IsSafeStr(tmp));\r
5217 }\r
5218 \r
5219 // 初期化\r
5220 void SmHubAdminOptionDlgInit(HWND hWnd, SM_EDIT_AO *a)\r
5221 {\r
5222         UINT i;\r
5223         // 引数チェック\r
5224         if (hWnd == NULL || a == NULL)\r
5225         {\r
5226                 return;\r
5227         }\r
5228 \r
5229         SetIcon(hWnd, 0, ICO_USER_ADMIN);\r
5230 \r
5231         if (a->e->p->ServerAdminMode)\r
5232         {\r
5233                 a->CanChange = true;\r
5234         }\r
5235         else\r
5236         {\r
5237                 if (a->ExtOption == false)\r
5238                 {\r
5239                         for (i = 0;i < a->CurrentOptions.NumItem;i++)\r
5240                         {\r
5241                                 if (StrCmpi(a->CurrentOptions.Items[i].Name, "allow_hub_admin_change_option") == 0)\r
5242                                 {\r
5243                                         if (a->CurrentOptions.Items[i].Value != 0)\r
5244                                         {\r
5245                                                 a->CanChange = true;\r
5246                                         }\r
5247                                 }\r
5248                         }\r
5249                 }\r
5250                 else\r
5251                 {\r
5252                         a->CanChange = true;\r
5253                 }\r
5254         }\r
5255 \r
5256         FormatText(hWnd, S_INFO, a->e->HubName);\r
5257 \r
5258         DlgFont(hWnd, S_BOLD, 0, true);\r
5259 \r
5260         LvInit(hWnd, L_LIST);\r
5261         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_AO_COLUMN_1"), 260);\r
5262         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_AO_COLUMN_2"), 100);\r
5263 \r
5264         for (i = 0;i < a->CurrentOptions.NumItem;i++)\r
5265         {\r
5266                 ADMIN_OPTION *e = &a->CurrentOptions.Items[i];\r
5267                 wchar_t tmp1[MAX_SIZE];\r
5268                 wchar_t tmp2[MAX_SIZE];\r
5269 \r
5270                 StrToUni(tmp1, sizeof(tmp1), e->Name);\r
5271                 UniToStru(tmp2, e->Value);\r
5272 \r
5273                 LvInsert(hWnd, L_LIST, ICO_LOG, NULL, 2, tmp1, tmp2);\r
5274                         \r
5275         }\r
5276 \r
5277         if (a->ExtOption)\r
5278         {\r
5279                 SetIcon(hWnd, S_ICON, ICO_LINK2);\r
5280                 SetIcon(hWnd, 0, ICO_LINK2);\r
5281 \r
5282                 SetText(hWnd, 0, _UU("SM_HUBEXT_OPTION_TITLE"));\r
5283                 SetText(hWnd, S_STATIC1, _UU("SM_HUBEXT_OPTION_STATIC1"));\r
5284                 SetText(hWnd, S_STATIC2, _UU("SM_HUBEXT_OPTION_STATIC2"));\r
5285         }\r
5286 \r
5287         // コントロール更新\r
5288         SmHubAdminOptionDlgUpdate(hWnd, a);\r
5289 }\r
5290 \r
5291 // コントロール更新\r
5292 void SmHubAdminOptionDlgUpdate(HWND hWnd, SM_EDIT_AO *a)\r
5293 {\r
5294         bool b = false;\r
5295         wchar_t *helpstr;\r
5296         // 引数チェック\r
5297         if (hWnd == NULL || a == NULL)\r
5298         {\r
5299                 return;\r
5300         }\r
5301 \r
5302         helpstr = _UU("HUB_AO_CLICK");\r
5303 \r
5304         SetEnable(hWnd, IDOK, a->CanChange);\r
5305         SetEnable(hWnd, B_ADD, a->CanChange);\r
5306         SetEnable(hWnd, B_EDIT, a->CanChange && (LvIsMasked(hWnd, L_LIST) && LvIsMultiMasked(hWnd, L_LIST) == false));\r
5307 \r
5308         if (LvIsMasked(hWnd, L_LIST) && LvIsMultiMasked(hWnd, L_LIST) == false)\r
5309         {\r
5310                 UINT i;\r
5311                 i = LvGetSelected(hWnd, L_LIST);\r
5312 \r
5313                 if (a->CanChange)\r
5314                 {\r
5315 \r
5316                         b = true;\r
5317 \r
5318                         if (i != INFINITE)\r
5319                         {\r
5320                                 char *name = LvGetStrA(hWnd, L_LIST, i, 0);\r
5321                                 if (name != NULL)\r
5322                                 {\r
5323                                         UINT j;\r
5324 \r
5325                                         for (j = 0;j < a->DefaultOptions.NumItem;j++)\r
5326                                         {\r
5327                                                 if (StrCmpi(a->DefaultOptions.Items[j].Name, name) == 0)\r
5328                                                 {\r
5329                                                         b = false;\r
5330                                                 }\r
5331                                         }\r
5332                                         Free(name);\r
5333                                 }\r
5334                         }\r
5335                 }\r
5336 \r
5337                 if (i != INFINITE)\r
5338                 {\r
5339                         char *name = LvGetStrA(hWnd, L_LIST, i, 0);\r
5340                         if (name != NULL)\r
5341                         {\r
5342                                 helpstr = GetHubAdminOptionHelpString(name);\r
5343                         }\r
5344                         Free(name);\r
5345                 }\r
5346         }\r
5347         SetEnable(hWnd, B_DELETE, b);\r
5348 \r
5349         SetText(hWnd, E_HELP, helpstr);\r
5350 }\r
5351 \r
5352 // 保存\r
5353 void SmHubAdminOptionDlgOk(HWND hWnd, SM_EDIT_AO *a)\r
5354 {\r
5355         UINT i, num;\r
5356         RPC_ADMIN_OPTION t;\r
5357         // 引数チェック\r
5358         if (hWnd == NULL || a == NULL)\r
5359         {\r
5360                 return;\r
5361         }\r
5362 \r
5363         num = LvNum(hWnd, L_LIST);\r
5364 \r
5365         Zero(&t, sizeof(t));\r
5366 \r
5367         StrCpy(t.HubName, sizeof(t.HubName), a->e->HubName);\r
5368         t.NumItem = num;\r
5369         t.Items = ZeroMalloc(sizeof(ADMIN_OPTION) * num);\r
5370 \r
5371         for (i = 0;i < num;i++)\r
5372         {\r
5373                 char *name = LvGetStrA(hWnd, L_LIST, i, 0);\r
5374                 char *s_value = LvGetStrA(hWnd, L_LIST, i, 1);\r
5375                 ADMIN_OPTION *a = &t.Items[i];\r
5376 \r
5377                 StrCpy(a->Name, sizeof(a->Name), name);\r
5378                 a->Value = ToInt(s_value);\r
5379 \r
5380                 Free(name);\r
5381                 Free(s_value);\r
5382         }\r
5383 \r
5384         if (a->ExtOption == false)\r
5385         {\r
5386                 if (CALL(hWnd, ScSetHubAdminOptions(a->e->p->Rpc, &t)))\r
5387                 {\r
5388                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_AO_SET_OK"));\r
5389                         EndDialog(hWnd, true);\r
5390                 }\r
5391         }\r
5392         else\r
5393         {\r
5394                 if (CALL(hWnd, ScSetHubExtOptions(a->e->p->Rpc, &t)))\r
5395                 {\r
5396                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_EXT_OPTION_SET_OK"));\r
5397                         EndDialog(hWnd, true);\r
5398                 }\r
5399         }\r
5400 \r
5401         FreeRpcAdminOption(&t);\r
5402 }\r
5403 \r
5404 // 仮想 HUB 管理オプションダイアログ\r
5405 UINT SmHubAdminOptionDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
5406 {\r
5407         SM_EDIT_AO *a = (SM_EDIT_AO *)param;\r
5408         NMHDR *n;\r
5409         UINT i;\r
5410         // 引数チェック\r
5411         if (hWnd == NULL)\r
5412         {\r
5413                 return 0;\r
5414         }\r
5415 \r
5416         switch (msg)\r
5417         {\r
5418         case WM_INITDIALOG:\r
5419                 SmHubAdminOptionDlgInit(hWnd, a);\r
5420                 break;\r
5421 \r
5422         case WM_COMMAND:\r
5423                 switch (wParam)\r
5424                 {\r
5425                 case B_ADD:\r
5426                         a->NewMode = true;\r
5427                         StrCpy(a->Name, sizeof(a->Name), "");\r
5428                         a->Value = 0;\r
5429                         if (Dialog(hWnd, D_SM_AO_VALUE, SmHubAdminOptionValueDlg,\r
5430                                 a))\r
5431                         {\r
5432                                 wchar_t tmp1[MAX_SIZE];\r
5433                                 wchar_t tmp2[MAX_SIZE];\r
5434                                 StrToUni(tmp1, sizeof(tmp1), a->Name);\r
5435                                 UniToStru(tmp2, a->Value);\r
5436 \r
5437                                 LvInsert(hWnd, L_LIST, ICO_LOG, NULL, 2, tmp1, tmp2);\r
5438                         }\r
5439                         break;\r
5440 \r
5441                 case B_EDIT:\r
5442                         i = LvGetSelected(hWnd, L_LIST);\r
5443                         if (i != INFINITE && a->CanChange)\r
5444                         {\r
5445                                 char *name, *value;\r
5446                                 name = LvGetStrA(hWnd, L_LIST, i, 0);\r
5447                                 value = LvGetStrA(hWnd, L_LIST, i, 1);\r
5448                                 a->NewMode = false;\r
5449                                 StrCpy(a->Name, sizeof(a->Name), name);\r
5450                                 a->Value = ToInt(value);\r
5451 \r
5452                                 if (Dialog(hWnd, D_SM_AO_VALUE, SmHubAdminOptionValueDlg,\r
5453                                         a))\r
5454                                 {\r
5455                                         char tmp[MAX_PATH];\r
5456                                         ToStr(tmp, a->Value);\r
5457                                         LvSetItemA(hWnd, L_LIST, i, 1, tmp);\r
5458                                 }\r
5459 \r
5460                                 Free(name);\r
5461                                 Free(value);\r
5462                         }\r
5463                         break;\r
5464 \r
5465                 case B_DELETE:\r
5466                         i = LvGetSelected(hWnd, L_LIST);\r
5467                         if (i != INFINITE)\r
5468                         {\r
5469                                 LvDeleteItem(hWnd, L_LIST, i);\r
5470                         }\r
5471                         break;\r
5472 \r
5473                 case IDCANCEL:\r
5474                         Close(hWnd);\r
5475                         break;\r
5476 \r
5477                 case IDOK:\r
5478                         SmHubAdminOptionDlgOk(hWnd, a);\r
5479                         break;\r
5480                 }\r
5481                 break;\r
5482 \r
5483         case WM_NOTIFY:\r
5484                 n = (NMHDR *)lParam;\r
5485                 switch (n->idFrom)\r
5486                 {\r
5487                 case L_LIST:\r
5488                         switch (n->code)\r
5489                         {\r
5490                         case LVN_ITEMCHANGED:\r
5491                                 SmHubAdminOptionDlgUpdate(hWnd, a);\r
5492                                 break;\r
5493 \r
5494                         case NM_DBLCLK:\r
5495                                 Command(hWnd, B_EDIT);\r
5496                                 break;\r
5497                         }\r
5498                         break;\r
5499                 }\r
5500                 break;\r
5501 \r
5502         case WM_CLOSE:\r
5503                 EndDialog(hWnd, 0);\r
5504                 break;\r
5505         }\r
5506 \r
5507         return 0;\r
5508 }\r
5509 \r
5510 // 仮想 HUB 拡張オプション\r
5511 void SmHubExtOption(HWND hWnd, SM_EDIT_HUB *e)\r
5512 {\r
5513         SM_EDIT_AO a;\r
5514         // 引数チェック\r
5515         if (hWnd == NULL || e == NULL)\r
5516         {\r
5517                 return;\r
5518         }\r
5519 \r
5520         Zero(&a, sizeof(a));\r
5521         a.e = e;\r
5522         a.ExtOption = true;\r
5523 \r
5524         StrCpy(a.CurrentOptions.HubName, sizeof(a.CurrentOptions.HubName), e->HubName);\r
5525 \r
5526         // 現在のサーバー上のオプションを取得する\r
5527         if (CALL(hWnd, ScGetHubExtOptions(e->p->Rpc, &a.CurrentOptions)) == false)\r
5528         {\r
5529                 return;\r
5530         }\r
5531 \r
5532         Dialog(hWnd, D_SM_ADMIN_OPTION, SmHubAdminOptionDlg, &a);\r
5533 \r
5534         FreeRpcAdminOption(&a.CurrentOptions);\r
5535         FreeRpcAdminOption(&a.DefaultOptions);\r
5536 }\r
5537 \r
5538 // 仮想 HUB 管理オプション\r
5539 void SmHubAdminOption(HWND hWnd, SM_EDIT_HUB *e)\r
5540 {\r
5541         SM_EDIT_AO a;\r
5542         // 引数チェック\r
5543         if (hWnd == NULL || e == NULL)\r
5544         {\r
5545                 return;\r
5546         }\r
5547 \r
5548         Zero(&a, sizeof(a));\r
5549         a.e = e;\r
5550 \r
5551         StrCpy(a.CurrentOptions.HubName, sizeof(a.CurrentOptions.HubName), e->HubName);\r
5552 \r
5553         // 現在のサーバー上のオプションを取得する\r
5554         if (CALL(hWnd, ScGetHubAdminOptions(e->p->Rpc, &a.CurrentOptions)) == false)\r
5555         {\r
5556                 return;\r
5557         }\r
5558 \r
5559         ScGetDefaultHubAdminOptions(e->p->Rpc, &a.DefaultOptions);\r
5560 \r
5561         Dialog(hWnd, D_SM_ADMIN_OPTION, SmHubAdminOptionDlg, &a);\r
5562 \r
5563         FreeRpcAdminOption(&a.CurrentOptions);\r
5564         FreeRpcAdminOption(&a.DefaultOptions);\r
5565 }\r
5566 \r
5567 // 初期化\r
5568 void SmConfigDlgInit(HWND hWnd, SM_CONFIG *c)\r
5569 {\r
5570         wchar_t *tmp;\r
5571         UINT tmp_size;\r
5572         // 引数チェック\r
5573         if (hWnd == NULL || c == NULL)\r
5574         {\r
5575                 return;\r
5576         }\r
5577 \r
5578         Focus(hWnd, IDCANCEL);\r
5579 \r
5580         SetIcon(hWnd, 0, ICO_MACHINE);\r
5581 \r
5582         SetFont(hWnd, E_CONFIG, GetFont(_SS("DEFAULT_FONT_2"), 0, false, false,\r
5583                 false, false));\r
5584 \r
5585         FormatText(hWnd, IDC_INFO, c->s->ServerName);\r
5586 \r
5587         // UTF-8 から Unicode に変換\r
5588         tmp_size = CalcUtf8ToUni(c->Config.FileData, StrLen(c->Config.FileData)) + 1;\r
5589         tmp = ZeroMalloc(tmp_size);\r
5590         Utf8ToUni(tmp, tmp_size, c->Config.FileData, StrLen(c->Config.FileData));\r
5591 \r
5592         SetText(hWnd, E_CONFIG, tmp);\r
5593 \r
5594         Free(tmp);\r
5595 }\r
5596 \r
5597 // config 編集ダイアログ\r
5598 UINT SmConfigDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
5599 {\r
5600         SM_CONFIG *c = (SM_CONFIG *)param;\r
5601         char *filename;\r
5602         wchar_t *filename_unicode;\r
5603         wchar_t tmp[MAX_SIZE];\r
5604         // 引数チェック\r
5605         if (hWnd == NULL)\r
5606         {\r
5607                 return 0;\r
5608         }\r
5609 \r
5610         switch (msg)\r
5611         {\r
5612         case WM_INITDIALOG:\r
5613                 SmConfigDlgInit(hWnd, c);\r
5614                 break;\r
5615 \r
5616         case WM_COMMAND:\r
5617                 switch (wParam)\r
5618                 {\r
5619                 case B_EXPORT:\r
5620                         StrToUni(tmp, sizeof(tmp), c->Config.FileName);\r
5621                         filename_unicode = SaveDlg(hWnd, _UU("DLG_CONFIG_FILES"), _UU("DLG_SAVE_CONFIG"), tmp, L".config");\r
5622                         if (filename_unicode != NULL)\r
5623                         {\r
5624                                 BUF *b = NewBuf();\r
5625                                 filename = CopyUniToStr(filename_unicode);\r
5626                                 WriteBuf(b, c->Config.FileData, StrLen(c->Config.FileData));\r
5627                                 if (DumpBuf(b, filename))\r
5628                                 {\r
5629                                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_CONFIG_SAVED"));\r
5630                                 }\r
5631                                 else\r
5632                                 {\r
5633                                         MsgBox(hWnd, MB_ICONSTOP, _UU("SM_CONFIG_SAVE_FAILED"));\r
5634                                 }\r
5635                                 FreeBuf(b);\r
5636                                 Free(filename);\r
5637                                 Free(filename_unicode);\r
5638                         }\r
5639                         break;\r
5640 \r
5641                 case B_IMPORT:\r
5642                         filename_unicode = OpenDlg(hWnd, _UU("DLG_CONFIG_FILES"), _UU("DLG_OPEN_CONFIG"));\r
5643                         if (filename_unicode != NULL)\r
5644                         {\r
5645                                 BUF *b;\r
5646                                 filename = CopyUniToStr(filename_unicode);\r
5647                                 b = ReadDump(filename);\r
5648                                 if (b != NULL)\r
5649                                 {\r
5650                                         RPC_CONFIG t;\r
5651 \r
5652                                         if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("SM_CONFIG_CONFIRM")) == IDYES)\r
5653                                         {\r
5654                                                 Zero(&t, sizeof(t));\r
5655                                                 t.FileData = ZeroMalloc(b->Size + 1);\r
5656                                                 Copy(t.FileData, b->Buf, b->Size);\r
5657 \r
5658                                                 if (CALL(hWnd, ScSetConfig(c->s->Rpc, &t)))\r
5659                                                 {\r
5660                                                         // 成功\r
5661                                                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_CONFIG_WRITE_OK"));\r
5662                                                         _exit(0);\r
5663                                                 }\r
5664 \r
5665                                                 FreeRpcConfig(&t);\r
5666 \r
5667                                                 FreeRpcConfig(&t);\r
5668                                                 FreeBuf(b);\r
5669                                         }\r
5670                                 }\r
5671                                 else\r
5672                                 {\r
5673                                         MsgBox(hWnd, MB_ICONSTOP, _UU("SM_CONFIG_OPEN_FAILED"));\r
5674                                 }\r
5675                                 Free(filename);\r
5676                                 Free(filename_unicode);\r
5677                         }\r
5678                         break;\r
5679 \r
5680                 case IDCANCEL:\r
5681                         Close(hWnd);\r
5682                         break;\r
5683                 }\r
5684                 break;\r
5685 \r
5686         case WM_CLOSE:\r
5687                 EndDialog(hWnd, 0);\r
5688                 break;\r
5689         }\r
5690 \r
5691         return 0;\r
5692 }\r
5693 \r
5694 // config 編集ダイアログを表示する\r
5695 void SmConfig(HWND hWnd, SM_SERVER *s)\r
5696 {\r
5697         SM_CONFIG c;\r
5698         // 引数チェック\r
5699         if (hWnd == NULL || s == NULL)\r
5700         {\r
5701                 return;\r
5702         }\r
5703 \r
5704         Zero(&c, sizeof(c));\r
5705 \r
5706         c.s = s;\r
5707 \r
5708         // 現在の config をサーバーから取得\r
5709         if (CALL(hWnd, ScGetConfig(s->Rpc, &c.Config)) == false)\r
5710         {\r
5711                 return;\r
5712         }\r
5713 \r
5714         // ダイアログ表示\r
5715         Dialog(hWnd, D_SM_CONFIG, SmConfigDlg, &c);\r
5716 \r
5717         // 解放\r
5718         FreeRpcConfig(&c.Config);\r
5719 }\r
5720 \r
5721 // ブリッジダイアログ初期化\r
5722 void SmBridgeDlgInit(HWND hWnd, SM_SERVER *s)\r
5723 {\r
5724         UINT i;\r
5725         RPC_ENUM_ETH t;\r
5726         RPC_SERVER_INFO si;\r
5727         // 引数チェック\r
5728         if (hWnd == NULL || s == NULL)\r
5729         {\r
5730                 return;\r
5731         }\r
5732 \r
5733         LvInit(hWnd, L_LIST);\r
5734         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_BRIDGE_COLUMN_1"), 50);\r
5735         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_BRIDGE_COLUMN_2"), 145);\r
5736         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_BRIDGE_COLUMN_3"), 300);\r
5737         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_BRIDGE_COLUMN_4"), 100);\r
5738 \r
5739         SmBridgeDlgRefresh(hWnd, s);\r
5740 \r
5741         SetShow(hWnd, B_VLAN, GetCapsBool(s->CapsList, "b_support_eth_vlan"));\r
5742 \r
5743         SetIcon(hWnd, 0, ICO_BRIDGE);\r
5744 \r
5745         // サーバー情報を取得\r
5746         Zero(&si, sizeof(si));\r
5747         ScGetServerInfo(s->Rpc, &si);\r
5748         if (GetCapsBool(s->CapsList, "b_tap_supported") == false)\r
5749         {\r
5750                 // tap はサポートしていない\r
5751                 Hide(hWnd, R_TAP);\r
5752                 Hide(hWnd, S_TAP_1);\r
5753                 Hide(hWnd, E_TAPNAME);\r
5754                 Hide(hWnd, S_TAP_2);\r
5755                 Hide(hWnd, R_BRIDGE);\r
5756                 Hide(hWnd, S_STATIC5);\r
5757         }\r
5758         Check(hWnd, R_BRIDGE, true);\r
5759         FreeRpcServerInfo(&si);\r
5760 \r
5761         // Ethernet 列挙\r
5762         Zero(&t, sizeof(t));\r
5763         ScEnumEthernet(s->Rpc, &t);\r
5764 \r
5765         CbReset(hWnd, E_NICNAME);\r
5766         CbSetHeight(hWnd, E_NICNAME, 18);\r
5767 \r
5768         for (i = 0;i < t.NumItem;i++)\r
5769         {\r
5770                 RPC_ENUM_ETH_ITEM *e = &t.Items[i];\r
5771                 if(UniIsEmptyStr(e->NetworkConnectionName) == false)\r
5772                 {\r
5773                         wchar_t ncname[MAX_SIZE * 2];\r
5774                         UniFormat(ncname, sizeof(ncname), BRIDGE_NETWORK_CONNECTION_STR, e->NetworkConnectionName, e->DeviceName);\r
5775                         CbAddStr(hWnd, E_NICNAME, ncname, 0);\r
5776                 }\r
5777                 else\r
5778                 {\r
5779                         wchar_t *s = CopyStrToUni(e->DeviceName);\r
5780                         CbAddStr(hWnd, E_NICNAME, s, 0);\r
5781                         Free(s);\r
5782                 }\r
5783         }\r
5784 \r
5785         FreeRpcEnumEth(&t);\r
5786 \r
5787         // 仮想 HUB 列挙\r
5788         {\r
5789                 RPC_ENUM_HUB t;\r
5790                 Zero(&t, sizeof(t));\r
5791 \r
5792                 ScEnumHub(s->Rpc, &t);\r
5793 \r
5794                 CbReset(hWnd, E_HUBNAME);\r
5795                 CbSetHeight(hWnd, E_HUBNAME, 18);\r
5796 \r
5797                 for (i = 0;i < t.NumHub;i++)\r
5798                 {\r
5799                         RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];\r
5800                         wchar_t *s = CopyStrToUni(e->HubName);\r
5801 \r
5802                         if (e->HubType != HUB_TYPE_FARM_DYNAMIC)\r
5803                         {\r
5804                                 CbAddStr(hWnd, E_HUBNAME, s, 0);\r
5805                         }\r
5806                         Free(s);\r
5807                 }\r
5808 \r
5809                 SetText(hWnd, E_HUBNAME, L"");\r
5810 \r
5811                 FreeRpcEnumHub(&t);\r
5812         }\r
5813 \r
5814         if (s->Bridge)\r
5815         {\r
5816                 SetTextA(hWnd, E_HUBNAME, "BRIDGE");\r
5817         }\r
5818 \r
5819         Focus(hWnd, E_HUBNAME);\r
5820         \r
5821         SmBridgeDlgUpdate(hWnd, s);\r
5822 \r
5823         SetTimer(hWnd, 1, 1000, NULL);\r
5824 }\r
5825 \r
5826 // ブリッジダイアログコントロール更新\r
5827 void SmBridgeDlgUpdate(HWND hWnd, SM_SERVER *s)\r
5828 {\r
5829         bool ok = true;\r
5830         // 引数チェック\r
5831         if (hWnd == NULL || s == NULL)\r
5832         {\r
5833                 return;\r
5834         }\r
5835 \r
5836         if (LvIsMasked(hWnd, L_LIST) && LvIsMultiMasked(hWnd, L_LIST) == false)\r
5837         {\r
5838                 Enable(hWnd, B_DELETE);\r
5839         }\r
5840         else\r
5841         {\r
5842                 Disable(hWnd, B_DELETE);\r
5843         }\r
5844 \r
5845         if (IsEmpty(hWnd, E_HUBNAME))\r
5846         {\r
5847                 ok = false;\r
5848         }\r
5849 \r
5850         if (IsChecked(hWnd, R_TAP) == false)\r
5851         {\r
5852                 // ブリッジモード\r
5853                 Enable(hWnd, S_ETH_1);\r
5854                 Enable(hWnd, E_NICNAME);\r
5855                 Disable(hWnd, S_TAP_1);\r
5856                 Disable(hWnd, S_TAP_2);\r
5857                 Disable(hWnd, E_TAPNAME);\r
5858                 SetText(hWnd, S_INFO, _UU("SM_BRIDGE_INFO_1"));\r
5859                 SetIcon(hWnd, S_ICON, ICO_NIC_ONLINE);\r
5860                 if (IsEmpty(hWnd, E_NICNAME))\r
5861                 {\r
5862                         ok = false;\r
5863                 }\r
5864         }\r
5865         else\r
5866         {\r
5867                 char tmp[MAX_SIZE];\r
5868                 // tap モード\r
5869                 Disable(hWnd, S_ETH_1);\r
5870                 Disable(hWnd, E_NICNAME);\r
5871                 Enable(hWnd, S_TAP_1);\r
5872                 Enable(hWnd, S_TAP_2);\r
5873                 Enable(hWnd, E_TAPNAME);\r
5874                 SetText(hWnd, S_INFO, _UU("SM_BRIDGE_INFO_2"));\r
5875                 SetIcon(hWnd, S_ICON, ICO_PROTOCOL);\r
5876                 GetTxtA(hWnd, E_TAPNAME, tmp, sizeof(tmp));\r
5877                 if (IsEmptyStr(tmp))\r
5878                 {\r
5879                         ok = false;\r
5880                 }\r
5881                 else\r
5882                 {\r
5883                         if (IsSafeStr(tmp) == false)\r
5884                         {\r
5885                                 ok = false;\r
5886                         }\r
5887                         if (StrLen(tmp) >= 12)\r
5888                         {\r
5889                                 ok = false;\r
5890                         }\r
5891                 }\r
5892         }\r
5893 \r
5894         SetEnable(hWnd, IDOK, ok);\r
5895 }\r
5896 \r
5897 // ブリッジダイアログ更新\r
5898 void SmBridgeDlgRefresh(HWND hWnd, SM_SERVER *s)\r
5899 {\r
5900         LVB *lvb;\r
5901         RPC_ENUM_LOCALBRIDGE t;\r
5902         UINT i;\r
5903         // 引数チェック\r
5904         if (hWnd == NULL || s == NULL)\r
5905         {\r
5906                 return;\r
5907         }\r
5908 \r
5909         lvb = LvInsertStart();\r
5910 \r
5911         Zero(&t, sizeof(t));\r
5912 \r
5913         ScEnumLocalBridge(s->Rpc, &t);\r
5914 \r
5915         for (i = 0;i < t.NumItem;i++)\r
5916         {\r
5917                 RPC_LOCALBRIDGE *e = &t.Items[i];\r
5918                 wchar_t name[MAX_SIZE];\r
5919                 wchar_t nic[MAX_SIZE];\r
5920                 wchar_t hub[MAX_SIZE];\r
5921                 wchar_t *status = _UU("SM_BRIDGE_OFFLINE");\r
5922 \r
5923                 UniToStru(name, i + 1);\r
5924                 StrToUni(nic, sizeof(nic), e->DeviceName);\r
5925                 StrToUni(hub, sizeof(hub), e->HubName);\r
5926 \r
5927                 if (e->Online)\r
5928                 {\r
5929                         status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");\r
5930                 }\r
5931 \r
5932                 LvInsertAdd(lvb, e->TapMode == false ? (e->Active ? ICO_NIC_ONLINE : ICO_NIC_OFFLINE) : ICO_PROTOCOL,\r
5933                         NULL, 4, name, hub, nic, status);\r
5934         }\r
5935 \r
5936         FreeRpcEnumLocalBridge(&t);\r
5937 \r
5938         LvInsertEnd(lvb, hWnd, L_LIST);\r
5939 \r
5940         SmBridgeDlgUpdate(hWnd, s);\r
5941 }\r
5942 \r
5943 // ローカルブリッジの追加\r
5944 void SmBridgeDlgOnOk(HWND hWnd, SM_SERVER *s)\r
5945 {\r
5946         char nic[MAX_SIZE];\r
5947         char hub[MAX_SIZE];\r
5948         RPC_LOCALBRIDGE t;\r
5949         bool tapmode = false;\r
5950         // 引数チェック\r
5951         if (hWnd == NULL || s == NULL)\r
5952         {\r
5953                 return;\r
5954         }\r
5955 \r
5956         GetTxtA(hWnd, E_HUBNAME, hub, sizeof(hub));\r
5957 \r
5958         Zero(nic, sizeof(nic));\r
5959 \r
5960         if (IsChecked(hWnd, R_TAP) == false)\r
5961         {\r
5962                 wchar_t nctmp[MAX_SIZE * 2];\r
5963                 if(GetCapsBool(s->CapsList, "b_support_network_connection_name") && GetTxt(hWnd, E_NICNAME, nctmp, sizeof(nctmp)))\r
5964                 {\r
5965                         RPC_ENUM_ETH et;\r
5966                         UINT i;\r
5967                         Zero(&et, sizeof(et));\r
5968                         ScEnumEthernet(s->Rpc, &et);\r
5969                         for(i = 0; i < et.NumItem; i++)\r
5970                         {\r
5971                                 RPC_ENUM_ETH_ITEM *e = &et.Items[i];\r
5972                                 if(UniIsEmptyStr(e->NetworkConnectionName) == false)\r
5973                                 {\r
5974                                         wchar_t ncname[MAX_SIZE * 2];\r
5975                                         UniFormat(ncname, sizeof(ncname), BRIDGE_NETWORK_CONNECTION_STR, e->NetworkConnectionName, e->DeviceName);\r
5976                                         if(UniStrCmp(ncname, nctmp) == 0)\r
5977                                         {\r
5978                                                 StrCpy(nic, sizeof(nic), e->DeviceName);\r
5979                                                 break;\r
5980                                         }\r
5981                                 }               \r
5982                         }\r
5983                         FreeRpcEnumEth(&et);\r
5984 \r
5985                         if (IsEmptyStr(nic))\r
5986                         {\r
5987                                 GetTxtA(hWnd, E_NICNAME, nic, sizeof(nic));\r
5988                         }\r
5989                 }\r
5990                 else\r
5991                 {\r
5992                         GetTxtA(hWnd, E_NICNAME, nic, sizeof(nic));\r
5993                 }\r
5994         }\r
5995         else\r
5996         {\r
5997                 tapmode = true;\r
5998                 GetTxtA(hWnd, E_TAPNAME, nic, sizeof(nic));\r
5999         }\r
6000 \r
6001         Trim(hub);\r
6002         Trim(nic);\r
6003 \r
6004         Zero(&t, sizeof(t));\r
6005         StrCpy(t.DeviceName, sizeof(t.DeviceName), nic);\r
6006         StrCpy(t.HubName, sizeof(t.HubName), hub);\r
6007         t.TapMode = tapmode;\r
6008 \r
6009         if (InStrEx(t.DeviceName, "vpn", false) || InStrEx(t.DeviceName, "tun", false)\r
6010                 || InStrEx(t.DeviceName, "tap", false))\r
6011         {\r
6012                 // VPN デバイスにローカルブリッジしようとしている\r
6013                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2,\r
6014                         _UU("SM_BRIDGE_VPN"),\r
6015                         t.DeviceName) == IDNO)\r
6016                 {\r
6017                         return;\r
6018                 }\r
6019         }\r
6020 \r
6021         // Intel 製 LAN カードなどに関する警告\r
6022         if (tapmode == false)\r
6023         {\r
6024                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_INTEL"));\r
6025         }\r
6026 \r
6027         if (CALL(hWnd, ScAddLocalBridge(s->Rpc, &t)) == false)\r
6028         {\r
6029                 Focus(hWnd, E_HUBNAME);\r
6030                 return;\r
6031         }\r
6032 \r
6033         SetText(hWnd, E_HUBNAME, L"");\r
6034         Focus(hWnd, E_HUBNAME);\r
6035 \r
6036         if (tapmode)\r
6037         {\r
6038                 SetTextA(hWnd, E_TAPNAME, "");\r
6039         }\r
6040 \r
6041         SmBridgeDlgRefresh(hWnd, s);\r
6042 \r
6043         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_OK"));\r
6044 }\r
6045 \r
6046 // ブリッジダイアログプロシージャ\r
6047 UINT SmBridgeDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
6048 {\r
6049         NMHDR *n;\r
6050         SM_SERVER *s = (SM_SERVER *)param;\r
6051         UINT i;\r
6052         // 引数チェック\r
6053         if (hWnd == NULL)\r
6054         {\r
6055                 return 0;\r
6056         }\r
6057 \r
6058         switch (msg)\r
6059         {\r
6060         case WM_INITDIALOG:\r
6061                 SmBridgeDlgInit(hWnd, s);\r
6062                 break;\r
6063 \r
6064         case WM_COMMAND:\r
6065                 switch (LOWORD(wParam))\r
6066                 {\r
6067                 case E_HUBNAME:\r
6068                 case E_NICNAME:\r
6069                 case R_BRIDGE:\r
6070                 case R_TAP:\r
6071                 case E_TAPNAME:\r
6072                         SmBridgeDlgUpdate(hWnd, s);\r
6073                         break;\r
6074                 }\r
6075 \r
6076                 switch (wParam)\r
6077                 {\r
6078                 case R_BRIDGE:\r
6079                         Focus(hWnd, E_NICNAME);\r
6080                         break;\r
6081 \r
6082                 case R_TAP:\r
6083                         FocusEx(hWnd, E_TAPNAME);\r
6084                         break;\r
6085 \r
6086                 case IDOK:\r
6087                         // 追加\r
6088                         SmBridgeDlgOnOk(hWnd, s);\r
6089                         break;\r
6090 \r
6091                 case IDCANCEL:\r
6092                         // 閉じる\r
6093                         Close(hWnd);\r
6094                         break;\r
6095 \r
6096                 case B_VLAN:\r
6097                         // VLAN ユーティリティ\r
6098                         SmVLan(hWnd, s);\r
6099                         break;\r
6100 \r
6101                 case B_DELETE:\r
6102                         // 削除\r
6103                         i = LvGetSelected(hWnd, L_LIST);\r
6104                         if (i != INFINITE)\r
6105                         {\r
6106                                 wchar_t *nic, *hub;\r
6107                                 wchar_t tmp[MAX_SIZE];\r
6108                                 RPC_LOCALBRIDGE t;\r
6109 \r
6110                                 hub = LvGetStr(hWnd, L_LIST, i, 1);\r
6111                                 nic = LvGetStr(hWnd, L_LIST, i, 2);\r
6112 \r
6113                                 UniFormat(tmp, sizeof(tmp), _UU("SM_BRIDGE_DELETE"),\r
6114                                         hub, nic);\r
6115 \r
6116                                 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, tmp) == IDYES)\r
6117                                 {\r
6118                                         Zero(&t, sizeof(t));\r
6119                                         UniToStr(t.DeviceName, sizeof(t.DeviceName), nic);\r
6120                                         UniToStr(t.HubName, sizeof(t.HubName), hub);\r
6121 \r
6122                                         if (CALL(hWnd, ScDeleteLocalBridge(s->Rpc, &t)))\r
6123                                         {\r
6124                                                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_DELETE_OK"));\r
6125                                                 SmBridgeDlgRefresh(hWnd, s);\r
6126                                         }\r
6127                                 }\r
6128 \r
6129                                 Free(hub);\r
6130                                 Free(nic);\r
6131                         }\r
6132                         break;\r
6133                 }\r
6134                 break;\r
6135 \r
6136         case WM_TIMER:\r
6137                 switch (wParam)\r
6138                 {\r
6139                 case 1:\r
6140                         KillTimer(hWnd, 1);\r
6141                         SmBridgeDlgRefresh(hWnd, s);\r
6142                         SetTimer(hWnd, 1, 1000, NULL);\r
6143                         break;\r
6144                 }\r
6145                 break;\r
6146 \r
6147         case WM_NOTIFY:\r
6148                 n = (NMHDR *)lParam;\r
6149                 switch (n->code)\r
6150                 {\r
6151                 case LVN_ITEMCHANGED:\r
6152                         switch (n->idFrom)\r
6153                         {\r
6154                         case L_LIST:\r
6155                                 SmBridgeDlgUpdate(hWnd, s);\r
6156                                 break;\r
6157                         }\r
6158                         break;\r
6159                 }\r
6160                 break;\r
6161 \r
6162         case WM_CLOSE:\r
6163                 EndDialog(hWnd, false);\r
6164                 break;\r
6165         }\r
6166 \r
6167         return 0;\r
6168 }\r
6169 \r
6170 // WinPcap のインストール作業\r
6171 void SmInstallWinPcap(HWND hWnd, SM_SERVER *s)\r
6172 {\r
6173         wchar_t temp_name[MAX_SIZE];\r
6174         IO *io;\r
6175         BUF *buf;\r
6176 \r
6177         // インストールを開始するかどうか質問する\r
6178         if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("SM_BRIDGE_WPCAP_INSTALL")) == IDNO)\r
6179         {\r
6180                 return;\r
6181         }\r
6182 \r
6183         // 一時ファイル名を生成\r
6184         UniFormat(temp_name, sizeof(temp_name), L"%s\\winpcap_installer.exe", MsGetTempDirW());\r
6185 \r
6186         // hamcore から読み込む\r
6187         buf = ReadDump(MsIsNt() ? "|winpcap_installer.exe" : "|winpcap_installer_win9x.exe");\r
6188         if (buf == NULL)\r
6189         {\r
6190 RES_ERROR:\r
6191                 MsgBox(hWnd, MB_ICONSTOP, _UU("SM_BRIDGE_RESOURCE"));\r
6192                 return;\r
6193         }\r
6194 \r
6195         // 一時ファイルに書き出す\r
6196         io = FileCreateW(temp_name);\r
6197         if (io == NULL)\r
6198         {\r
6199                 FreeBuf(buf);\r
6200                 goto RES_ERROR;\r
6201         }\r
6202 \r
6203         FileWrite(io, buf->Buf, buf->Size);\r
6204         FileClose(io);\r
6205 \r
6206         FreeBuf(buf);\r
6207 \r
6208         // 実行する\r
6209         if (RunW(temp_name, NULL, false, true) == false)\r
6210         {\r
6211                 // 失敗\r
6212                 FileDeleteW(temp_name);\r
6213                 goto RES_ERROR;\r
6214         }\r
6215 \r
6216         FileDeleteW(temp_name);\r
6217 \r
6218         if (s == NULL)\r
6219         {\r
6220                 return;\r
6221         }\r
6222 \r
6223         // 終了後のメッセージ\r
6224         if (OS_IS_WINDOWS_NT(GetOsInfo()->OsType) == false)\r
6225         {\r
6226                 // コンピュータの再起動が必要\r
6227                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_WPCAP_REBOOT1"));\r
6228         }\r
6229         else\r
6230         {\r
6231                 // サービスの再起動が必要\r
6232                 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("SM_BRIDGE_WPCAP_REBOOT2")) == IDNO)\r
6233                 {\r
6234                         // 再起動しない\r
6235                 }\r
6236                 else\r
6237                 {\r
6238                         // 再起動する\r
6239                         RPC_TEST t;\r
6240                         Zero(&t, sizeof(t));\r
6241                         ScRebootServer(s->Rpc, &t);\r
6242 \r
6243                         SleepThread(500);\r
6244 \r
6245                         Zero(&t, sizeof(t));\r
6246                         CALL(hWnd, ScTest(s->Rpc, &t));\r
6247                 }\r
6248         }\r
6249 }\r
6250 \r
6251 // ブリッジダイアログ\r
6252 void SmBridgeDlg(HWND hWnd, SM_SERVER *s)\r
6253 {\r
6254         RPC_BRIDGE_SUPPORT t;\r
6255         // 引数チェック\r
6256         if (hWnd == NULL || s == NULL)\r
6257         {\r
6258                 return;\r
6259         }\r
6260 \r
6261         // まずサーバー側のブリッジ対応状況を調べる\r
6262         Zero(&t, sizeof(t));\r
6263         if (CALLEX(hWnd, ScGetBridgeSupport(s->Rpc, &t)) != ERR_NO_ERROR)\r
6264         {\r
6265                 // 古いバージョンなので未対応\r
6266                 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SM_BRIDGE_TOO_OLD_VER"));\r
6267                 return;\r
6268         }\r
6269 \r
6270         if (t.IsBridgeSupportedOs == false)\r
6271         {\r
6272                 // OS がブリッジに対応していない\r
6273                 MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("SM_BRIDGE_UNSUPPORTED"));\r
6274                 return;\r
6275         }\r
6276 \r
6277         if (t.IsWinPcapNeeded)\r
6278         {\r
6279                 if (s->Rpc->Sock->RemoteIP.addr[0] != 127)\r
6280                 {\r
6281                         // WinPcap が必要だがリモート管理モードなので何も出来ない\r
6282                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_WPCAP_REMOTE"));\r
6283                         return;\r
6284                 }\r
6285                 else\r
6286                 {\r
6287                         // WinPcap が必要でローカル管理モードである\r
6288                         if (MsIsAdmin())\r
6289                         {\r
6290                                 // Administrators である\r
6291                                 SmInstallWinPcap(hWnd, s);\r
6292                                 return;\r
6293                         }\r
6294                         else\r
6295                         {\r
6296                                 // Administrators でない\r
6297                                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_BRIDGE_WPCAP_ROOT"));\r
6298                                 return;\r
6299                         }\r
6300                 }\r
6301         }\r
6302 \r
6303         Dialog(hWnd, D_SM_BRIDGE, SmBridgeDlgProc, s);\r
6304 }\r
6305 \r
6306 // SecureNAT 画面更新\r
6307 void SmSNATDlgUpdate(HWND hWnd, SM_HUB *s)\r
6308 {\r
6309         bool b;\r
6310         RPC_HUB_STATUS t;\r
6311         // 引数チェック\r
6312         if (hWnd == NULL || s == NULL)\r
6313         {\r
6314                 return;\r
6315         }\r
6316 \r
6317         Zero(&t, sizeof(t));\r
6318         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
6319         if (CALL(hWnd, ScGetHubStatus(s->Rpc, &t)) == false)\r
6320         {\r
6321                 Close(hWnd);\r
6322                 return;\r
6323         }\r
6324 \r
6325         b = t.SecureNATEnabled;\r
6326 \r
6327         if (b)\r
6328         {\r
6329                 Disable(hWnd, B_ENABLE);\r
6330                 Enable(hWnd, B_DISABLE);\r
6331                 Enable(hWnd, B_NAT);\r
6332                 Enable(hWnd, B_DHCP);\r
6333                 Enable(hWnd, B_STATUS);\r
6334         }\r
6335         else\r
6336         {\r
6337                 Enable(hWnd, B_ENABLE);\r
6338                 Disable(hWnd, B_DISABLE);\r
6339                 Disable(hWnd, B_NAT);\r
6340                 Disable(hWnd, B_DHCP);\r
6341                 Disable(hWnd, B_STATUS);\r
6342         }\r
6343 }\r
6344 \r
6345 // SecureNAT 設定画面\r
6346 UINT SmSNATDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
6347 {\r
6348         SM_HUB *s = (SM_HUB *)param;\r
6349         RPC_HUB t;\r
6350         // 引数チェック\r
6351         if (hWnd == NULL)\r
6352         {\r
6353                 return 0;\r
6354         }\r
6355 \r
6356         switch (msg)\r
6357         {\r
6358         case WM_INITDIALOG:\r
6359                 SetIcon(hWnd, 0, ICO_ROUTER);\r
6360                 DlgFont(hWnd, S_WARNING, (_GETLANG() == 0 || _GETLANG() == 2) ? 13 : 10, true);\r
6361                 FormatText(hWnd, S_TITLE, s->HubName);\r
6362                 SmSNATDlgUpdate(hWnd, s);\r
6363 \r
6364                 SetTimer(hWnd, 1, 1000, NULL);\r
6365                 break;\r
6366 \r
6367         case WM_TIMER:\r
6368                 if (wParam == 1)\r
6369                 {\r
6370                         KillTimer(hWnd, 1);\r
6371 \r
6372                         SmSNATDlgUpdate(hWnd, s);\r
6373 \r
6374                         SetTimer(hWnd, 1, 1000, NULL);\r
6375                 }\r
6376                 break;\r
6377 \r
6378         case WM_COMMAND:\r
6379                 switch (wParam)\r
6380                 {\r
6381                 case IDCANCEL:\r
6382                         Close(hWnd);\r
6383                         break;\r
6384 \r
6385                 case B_ENABLE:\r
6386                         if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_OKCANCEL | MB_DEFBUTTON2,\r
6387                                 _UU("SM_SECURE_NAT_MSG")) == IDOK)\r
6388                         {\r
6389                                 Zero(&t, sizeof(t));\r
6390                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
6391                                 CALL(hWnd, ScEnableSecureNAT(s->Rpc, &t));\r
6392                                 SmSNATDlgUpdate(hWnd, s);\r
6393                         }\r
6394                         break;\r
6395 \r
6396                 case B_DISABLE:\r
6397                         Zero(&t, sizeof(t));\r
6398                         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
6399                         CALL(hWnd, ScDisableSecureNAT(s->Rpc, &t));\r
6400                         SmSNATDlgUpdate(hWnd, s);\r
6401                         break;\r
6402 \r
6403                 case B_CONFIG:\r
6404                         NmEditVhOption(hWnd, s);\r
6405                         break;\r
6406 \r
6407                 case B_NAT:\r
6408                         NmNat(hWnd, s);\r
6409                         break;\r
6410 \r
6411                 case B_DHCP:\r
6412                         NmDhcp(hWnd, s);\r
6413                         break;\r
6414 \r
6415                 case B_STATUS:\r
6416                         SmStatusDlg(hWnd, s->p, s, false, true, _UU("SM_SNAT_STATUS"), ICO_ROUTER,\r
6417                                 NULL, NmStatus);\r
6418                         break;\r
6419                 }\r
6420                 break;\r
6421 \r
6422         case WM_CLOSE:\r
6423                 EndDialog(hWnd, 0);\r
6424                 break;\r
6425         }\r
6426 \r
6427         return 0;\r
6428 }\r
6429 \r
6430 // 初期化\r
6431 void SmCreateCertDlgInit(HWND hWnd, SM_CERT *s)\r
6432 {\r
6433         UINT cert_sign;\r
6434         UINT cert_days;\r
6435         char *reg_o, *reg_ou, *reg_c, *reg_st, *reg_l;\r
6436         UINT bits[] = {1024, 1536, 2048, 3072, 4096 };\r
6437         UINT i;\r
6438         UINT last_bit;\r
6439         // 引数チェック\r
6440         if (hWnd == NULL || s == NULL)\r
6441         {\r
6442                 return;\r
6443         }\r
6444 \r
6445         SetTextA(hWnd, E_CN, s->default_cn);\r
6446 \r
6447         last_bit = MsRegReadInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Bits");\r
6448         if (last_bit == 0)\r
6449         {\r
6450                 last_bit = 1024;\r
6451         }\r
6452 \r
6453         CbReset(hWnd, C_BITS);\r
6454         for (i = 0;i < sizeof(bits) / sizeof(bits[0]);i++)\r
6455         {\r
6456                 char tmp[MAX_PATH];\r
6457                 UINT index;\r
6458 \r
6459                 ToStr(tmp, bits[i]);\r
6460 \r
6461                 index = CbAddStrA(hWnd, C_BITS, tmp, bits[i]);\r
6462         }\r
6463 \r
6464         CbSelect(hWnd, C_BITS, 1024);\r
6465         CbSelect(hWnd, C_BITS, last_bit);\r
6466 \r
6467         reg_o = MsRegReadStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "O");\r
6468         reg_ou = MsRegReadStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "OU");\r
6469         reg_c = MsRegReadStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "C");\r
6470         reg_st = MsRegReadStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "ST");\r
6471         reg_l = MsRegReadStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "L");\r
6472         SetTextA(hWnd, E_O, reg_o);\r
6473         SetTextA(hWnd, E_OU, reg_ou);\r
6474         SetTextA(hWnd, E_C, reg_c);\r
6475         SetTextA(hWnd, E_ST, reg_st);\r
6476         SetTextA(hWnd, E_L, reg_l);\r
6477         Free(reg_o);\r
6478         Free(reg_ou);\r
6479         Free(reg_c);\r
6480         Free(reg_st);\r
6481         Free(reg_l);\r
6482 \r
6483         LimitText(hWnd, E_C, 2);\r
6484 \r
6485         cert_sign = MsRegReadInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Sign");\r
6486         cert_days = MsRegReadInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Days");\r
6487 \r
6488         Check(hWnd, R_ROOT_CERT, cert_sign ? false : true);\r
6489         Check(hWnd, R_SIGNED_CERT, cert_sign ? true : false);\r
6490 \r
6491         if (cert_days == 0)\r
6492         {\r
6493                 cert_days = 3650;\r
6494         }\r
6495 \r
6496         SetIntEx(hWnd, E_EXPIRE, cert_days);\r
6497 \r
6498         SmCreateCertDlgUpdate(hWnd, s);\r
6499 \r
6500         FocusEx(hWnd, E_CN);\r
6501 }\r
6502 \r
6503 // 更新\r
6504 void SmCreateCertDlgUpdate(HWND hWnd, SM_CERT *s)\r
6505 {\r
6506         bool ok = true;\r
6507         bool b;\r
6508         UINT i;\r
6509         // 引数チェック\r
6510         if (hWnd == NULL || s == NULL)\r
6511         {\r
6512                 return;\r
6513         }\r
6514 \r
6515         if (IsEmpty(hWnd, E_CN) && IsEmpty(hWnd, E_O) && IsEmpty(hWnd, E_OU) &&\r
6516                 IsEmpty(hWnd, E_ST) && IsEmpty(hWnd, E_L))\r
6517         {\r
6518                 ok = false;\r
6519         }\r
6520 \r
6521         i = GetInt(hWnd, E_EXPIRE);\r
6522         if (i == 0 || i >= (365 * 30))\r
6523         {\r
6524                 ok = false;\r
6525         }\r
6526 \r
6527         b = IsChecked(hWnd, R_SIGNED_CERT);\r
6528 \r
6529         SetEnable(hWnd, S_LOAD_1, b);\r
6530         SetEnable(hWnd, B_LOAD, b);\r
6531         SetEnable(hWnd, S_LOAD_2, b);\r
6532 \r
6533         if (b && (s->root_k == NULL || s->root_x == NULL))\r
6534         {\r
6535                 ok = false;\r
6536         }\r
6537 \r
6538         SetEnable(hWnd, IDOK, ok);\r
6539 }\r
6540 \r
6541 // OK ボタン\r
6542 void SmCreateCertDlgOnOk(HWND hWnd, SM_CERT *s)\r
6543 {\r
6544         wchar_t cn[MAX_SIZE], o[MAX_SIZE], ou[MAX_SIZE], c[MAX_SIZE], st[MAX_SIZE], l[MAX_SIZE];\r
6545         char *reg_o, *reg_ou, *reg_c, *reg_st, *reg_l;\r
6546         UINT days;\r
6547         bool sign;\r
6548         char serial[MAX_SIZE * 2];\r
6549         X *x;\r
6550         K *pub;\r
6551         K *pri;\r
6552         NAME *n;\r
6553         X_SERIAL *x_serial;\r
6554         BUF *buf;\r
6555         UINT bits;\r
6556         // 引数チェック\r
6557         if (hWnd == NULL || s == NULL)\r
6558         {\r
6559                 return;\r
6560         }\r
6561 \r
6562         GetTxt(hWnd, E_CN, cn, sizeof(cn));\r
6563         GetTxt(hWnd, E_O, o, sizeof(o));\r
6564         GetTxt(hWnd, E_OU, ou, sizeof(ou));\r
6565         GetTxt(hWnd, E_C, c, sizeof(c));\r
6566         GetTxt(hWnd, E_ST, st, sizeof(st));\r
6567         GetTxt(hWnd, E_L, l, sizeof(l));\r
6568         GetTxtA(hWnd, E_SERIAL, serial, sizeof(serial));\r
6569 \r
6570         bits = CbGetSelect(hWnd, C_BITS);\r
6571         if (bits == INFINITE)\r
6572         {\r
6573                 bits = 1024;\r
6574         }\r
6575 \r
6576         buf = StrToBin(serial);\r
6577         if (buf == NULL)\r
6578         {\r
6579                 return;\r
6580         }\r
6581 \r
6582         if (buf->Size > 1)\r
6583         {\r
6584                 x_serial = NewXSerial(buf->Buf, buf->Size);\r
6585         }\r
6586         else\r
6587         {\r
6588                 x_serial = NULL;\r
6589         }\r
6590 \r
6591         FreeBuf(buf);\r
6592 \r
6593         n = NewName(UniStrLen(cn) ? cn : NULL,\r
6594                 UniStrLen(o) ? o : NULL,\r
6595                 UniStrLen(ou) ? ou : NULL,\r
6596                 UniStrLen(c) ? c : NULL,\r
6597                 UniStrLen(st) ? st : NULL,\r
6598                 UniStrLen(l) ? l : NULL);\r
6599 \r
6600         days = GetInt(hWnd, E_EXPIRE);\r
6601 \r
6602         sign = IsChecked(hWnd, R_SIGNED_CERT);\r
6603 \r
6604         MsRegWriteInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Sign", sign);\r
6605         MsRegWriteInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Days", days);\r
6606         MsRegWriteInt(REG_CURRENT_USER, SM_CERT_REG_KEY, "Bits", bits);\r
6607 \r
6608         RsaGen(&pri, &pub, bits);\r
6609 \r
6610         if (sign == false)\r
6611         {\r
6612                 x = NewRootX(pub, pri, n, days, x_serial);\r
6613         }\r
6614         else\r
6615         {\r
6616                 x = NewX(pub, s->root_k, s->root_x, n, days, x_serial);\r
6617         }\r
6618 \r
6619         FreeName(n);\r
6620 \r
6621         FreeXSerial(x_serial);\r
6622 \r
6623         if (x == NULL)\r
6624         {\r
6625                 FreeX(x);\r
6626                 FreeK(pub);\r
6627                 FreeK(pri);\r
6628                 return;\r
6629         }\r
6630 \r
6631         if (s->do_not_save == false)\r
6632         {\r
6633                 if (SmSaveKeyPairDlg(hWnd, x, pri) == false)\r
6634                 {\r
6635                         FreeX(x);\r
6636                         FreeK(pub);\r
6637                         FreeK(pri);\r
6638                         return;\r
6639                 }\r
6640         }\r
6641 \r
6642         s->x = x;\r
6643         s->k = pri;\r
6644         FreeK(pub);\r
6645 \r
6646         reg_o = GetTextA(hWnd, E_O);\r
6647         reg_ou = GetTextA(hWnd, E_OU);\r
6648         reg_c = GetTextA(hWnd, E_C);\r
6649         reg_st = GetTextA(hWnd, E_ST);\r
6650         reg_l = GetTextA(hWnd, E_L);\r
6651         MsRegWriteStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "O", reg_o);\r
6652         MsRegWriteStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "OU", reg_ou);\r
6653         MsRegWriteStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "C", reg_c);\r
6654         MsRegWriteStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "ST", reg_st);\r
6655         MsRegWriteStr(REG_CURRENT_USER, SM_CERT_REG_KEY, "L", reg_l);\r
6656         Free(reg_o);\r
6657         Free(reg_ou);\r
6658         Free(reg_c);\r
6659         Free(reg_st);\r
6660         Free(reg_l);\r
6661 \r
6662         EndDialog(hWnd, true);\r
6663 }\r
6664 \r
6665 // 証明書作成画面\r
6666 UINT SmCreateCertDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
6667 {\r
6668         SM_CERT *s = (SM_CERT *)param;\r
6669         // 引数チェック\r
6670         if (hWnd == NULL)\r
6671         {\r
6672                 return 0;\r
6673         }\r
6674 \r
6675         switch (msg)\r
6676         {\r
6677         case WM_INITDIALOG:\r
6678                 // 初期化\r
6679                 SmCreateCertDlgInit(hWnd, s);\r
6680                 break;\r
6681 \r
6682         case WM_COMMAND:\r
6683                 switch (LOWORD(wParam))\r
6684                 {\r
6685                 case R_ROOT_CERT:\r
6686                 case R_SIGNED_CERT:\r
6687                 case B_LOAD:\r
6688                 case E_CN:\r
6689                 case E_O:\r
6690                 case E_OU:\r
6691                 case E_C:\r
6692                 case E_ST:\r
6693                 case E_L:\r
6694                 case E_EXPIRE:\r
6695                         SmCreateCertDlgUpdate(hWnd, s);\r
6696                         break;\r
6697                 }\r
6698 \r
6699                 switch (wParam)\r
6700                 {\r
6701                 case IDOK:\r
6702                         // OK ボタン\r
6703                         SmCreateCertDlgOnOk(hWnd, s);\r
6704                         break;\r
6705 \r
6706                 case R_ROOT_CERT:\r
6707                         if (IsChecked(hWnd, R_ROOT_CERT))\r
6708                         {\r
6709                                 FocusEx(hWnd, E_CN);\r
6710                         }\r
6711                         break;\r
6712 \r
6713                 case B_LOAD:\r
6714                         // 証明書読み込み\r
6715                         if (1)\r
6716                         {\r
6717                                 X *x;\r
6718                                 K *k;\r
6719                                 if (CmLoadXAndK(hWnd, &x, &k))\r
6720                                 {\r
6721                                         wchar_t tmp[MAX_SIZE];\r
6722                                         FreeX(s->root_x);\r
6723                                         FreeK(s->root_k);\r
6724                                         s->root_x = x;\r
6725                                         s->root_k = k;\r
6726 \r
6727                                         SmGetCertInfoStr(tmp, sizeof(tmp), x);\r
6728                                         SetText(hWnd, S_LOAD_2, tmp);\r
6729                                         SmCreateCertDlgUpdate(hWnd, s);\r
6730                                 }\r
6731                         }\r
6732                         break;\r
6733 \r
6734                 case IDCANCEL:\r
6735                         // キャンセルボタン\r
6736                         Close(hWnd);\r
6737                         break;\r
6738                 }\r
6739                 break;\r
6740 \r
6741         case WM_CLOSE:\r
6742                 EndDialog(hWnd, false);\r
6743                 break;\r
6744         }\r
6745 \r
6746         return 0;\r
6747 }\r
6748 \r
6749 // 証明書ツール\r
6750 bool SmCreateCert(HWND hWnd, X **x, K **k, bool do_not_save, char *default_cn)\r
6751 {\r
6752         bool ret;\r
6753         SM_CERT s;\r
6754         Zero(&s, sizeof(s));\r
6755 \r
6756         if (default_cn == NULL)\r
6757         {\r
6758                 default_cn = "";\r
6759         }\r
6760 \r
6761         s.default_cn = default_cn;\r
6762 \r
6763         s.do_not_save = do_not_save;\r
6764 \r
6765         ret = Dialog(hWnd, D_SM_CREATE_CERT, SmCreateCertDlgProc, &s);\r
6766 \r
6767         if (ret)\r
6768         {\r
6769                 if (x != NULL)\r
6770                 {\r
6771                         *x = CloneX(s.x);\r
6772                 }\r
6773 \r
6774                 if (k != NULL)\r
6775                 {\r
6776                         *k = CloneK(s.k);\r
6777                 }\r
6778         }\r
6779 \r
6780         FreeX(s.x);\r
6781         FreeK(s.k);\r
6782         FreeX(s.root_x);\r
6783         FreeK(s.root_k);\r
6784 \r
6785         return ret;\r
6786 }\r
6787 \r
6788 // 初期化\r
6789 void SmIpTableDlgInit(HWND hWnd, SM_TABLE *s)\r
6790 {\r
6791         // 引数チェック\r
6792         if (hWnd == NULL || s == NULL)\r
6793         {\r
6794                 return;\r
6795         }\r
6796 \r
6797         SetIcon(hWnd, 0, ICO_PROTOCOL);\r
6798         FormatText(hWnd, S_TITLE, s->Hub->HubName);\r
6799 \r
6800         if (s->SessionName != NULL)\r
6801         {\r
6802                 wchar_t tmp[MAX_SIZE];\r
6803                 wchar_t tmp2[MAX_SIZE];\r
6804                 GetTxt(hWnd, S_TITLE, tmp, sizeof(tmp));\r
6805                 UniFormat(tmp2, sizeof(tmp2), _UU("SM_SESSION_FILTER"), s->SessionName);\r
6806                 UniStrCat(tmp, sizeof(tmp), tmp2);\r
6807                 SetText(hWnd, S_TITLE, tmp);\r
6808         }\r
6809 \r
6810         LvInit(hWnd, L_TABLE);\r
6811         LvInsertColumn(hWnd, L_TABLE, 0, _UU("SM_IP_COLUMN_1"), 190);\r
6812         LvInsertColumn(hWnd, L_TABLE, 1, _UU("SM_IP_COLUMN_2"), 140);\r
6813         LvInsertColumn(hWnd, L_TABLE, 2, _UU("SM_IP_COLUMN_3"), 133);\r
6814         LvInsertColumn(hWnd, L_TABLE, 3, _UU("SM_IP_COLUMN_4"), 133);\r
6815         LvInsertColumn(hWnd, L_TABLE, 4, _UU("SM_IP_COLUMN_5"), 133);\r
6816         LvSetStyle(hWnd, L_TABLE, LVS_EX_GRIDLINES);\r
6817 \r
6818         SmIpTableDlgRefresh(hWnd, s);\r
6819 }\r
6820 \r
6821 // コントロール更新\r
6822 void SmIpTableDlgUpdate(HWND hWnd, SM_TABLE *s)\r
6823 {\r
6824         bool ok = true;\r
6825         // 引数チェック\r
6826         if (hWnd == NULL || s == NULL)\r
6827         {\r
6828                 return;\r
6829         }\r
6830 \r
6831         if (LvIsSelected(hWnd, L_TABLE) == false || LvIsMultiMasked(hWnd, L_TABLE))\r
6832         {\r
6833                 ok = false;\r
6834         }\r
6835 \r
6836         SetEnable(hWnd, B_DELETE, ok);\r
6837 }\r
6838 \r
6839 // 内容更新\r
6840 void SmIpTableDlgRefresh(HWND hWnd, SM_TABLE *s)\r
6841 {\r
6842         UINT i;\r
6843         RPC_ENUM_IP_TABLE t;\r
6844         UINT old_selected = 0;\r
6845         // 引数チェック\r
6846         if (hWnd == NULL || s == NULL)\r
6847         {\r
6848                 return;\r
6849         }\r
6850 \r
6851         Zero(&t, sizeof(t));\r
6852         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
6853 \r
6854         if (CALL(hWnd, ScEnumIpTable(s->Rpc, &t)) == false)\r
6855         {\r
6856                 EndDialog(hWnd, false);\r
6857                 return;\r
6858         }\r
6859 \r
6860         i = LvGetSelected(hWnd, L_TABLE);\r
6861         if (i != INFINITE)\r
6862         {\r
6863                 old_selected = (UINT)LvGetParam(hWnd, L_TABLE, i);\r
6864         }\r
6865 \r
6866         LvReset(hWnd, L_TABLE);\r
6867 \r
6868         for (i = 0;i < t.NumIpTable;i++)\r
6869         {\r
6870                 char str[MAX_SIZE];\r
6871                 wchar_t tmp1[MAX_SIZE];\r
6872                 wchar_t tmp2[MAX_SIZE];\r
6873                 wchar_t tmp3[MAX_SIZE];\r
6874                 wchar_t tmp4[MAX_SIZE];\r
6875                 wchar_t tmp5[MAX_SIZE];\r
6876                 RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];\r
6877 \r
6878                 if (s->SessionName == NULL || StrCmpi(e->SessionName, s->SessionName) == 0)\r
6879                 {\r
6880                         StrToUni(tmp1, sizeof(tmp1), e->SessionName);\r
6881 \r
6882                         if (e->DhcpAllocated == false)\r
6883                         {\r
6884                                 IPToStr(str, sizeof(str), &e->IpV6);\r
6885                                 StrToUni(tmp2, sizeof(tmp2), str);\r
6886                         }\r
6887                         else\r
6888                         {\r
6889                                 IPToStr(str, sizeof(str), &e->IpV6);\r
6890                                 UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);\r
6891                         }\r
6892 \r
6893                         GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));\r
6894 \r
6895                         GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));\r
6896 \r
6897                         if (StrLen(e->RemoteHostname) == 0)\r
6898                         {\r
6899                                 UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));\r
6900                         }\r
6901                         else\r
6902                         {\r
6903                                 UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);\r
6904                         }\r
6905 \r
6906                         LvInsert(hWnd, L_TABLE, e->DhcpAllocated ? ICO_PROTOCOL_DHCP : ICO_PROTOCOL, (void *)e->Key, 5,\r
6907                                 tmp1, tmp2, tmp3, tmp4, tmp5);\r
6908                 }\r
6909         }\r
6910 \r
6911         FreeRpcEnumIpTable(&t);\r
6912 \r
6913         if (old_selected != 0)\r
6914         {\r
6915                 LvSelect(hWnd, L_TABLE, LvSearchParam(hWnd, L_TABLE, (void *)old_selected));\r
6916         }\r
6917 \r
6918         SmIpTableDlgUpdate(hWnd, s);\r
6919 }\r
6920 \r
6921 // IP アドレステーブルダイアログプロシージャ\r
6922 UINT SmIpTableDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
6923 {\r
6924         SM_TABLE *s = (SM_TABLE *)param;\r
6925         NMHDR *n;\r
6926         UINT i;\r
6927         // 引数チェック\r
6928         if (hWnd == NULL)\r
6929         {\r
6930                 return 0;\r
6931         }\r
6932 \r
6933         switch (msg)\r
6934         {\r
6935         case WM_INITDIALOG:\r
6936                 // 初期化\r
6937                 SmIpTableDlgInit(hWnd, s);\r
6938                 break;\r
6939 \r
6940         case WM_COMMAND:\r
6941                 switch (wParam)\r
6942                 {\r
6943                 case B_DELETE:\r
6944                         // 削除\r
6945                         i = LvGetSelected(hWnd, L_TABLE);\r
6946                         if (i != INFINITE)\r
6947                         {\r
6948                                 RPC_DELETE_TABLE t;\r
6949                                 UINT key = (UINT)LvGetParam(hWnd, L_TABLE, i);\r
6950 \r
6951                                 Zero(&t, sizeof(t));\r
6952                                 StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
6953                                 t.Key = key;\r
6954                                 if (CALL(hWnd, ScDeleteIpTable(s->Rpc, &t)))\r
6955                                 {\r
6956                                         LvDeleteItem(hWnd, L_TABLE, i);\r
6957                                 }\r
6958                         }\r
6959                         break;\r
6960 \r
6961                 case B_REFRESH:\r
6962                         // 更新\r
6963                         SmIpTableDlgRefresh(hWnd, s);\r
6964                         break;\r
6965 \r
6966                 case IDCANCEL:\r
6967                         // キャンセルボタン\r
6968                         Close(hWnd);\r
6969                         break;\r
6970                 }\r
6971                 break;\r
6972 \r
6973         case WM_NOTIFY:\r
6974                 n = (NMHDR *)lParam;\r
6975                 switch (n->idFrom)\r
6976                 {\r
6977                 case L_TABLE:\r
6978                         switch (n->code)\r
6979                         {\r
6980                         case LVN_ITEMCHANGED:\r
6981                                 SmIpTableDlgUpdate(hWnd, s);\r
6982                                 break;\r
6983                         }\r
6984                         break;\r
6985                 }\r
6986                 break;\r
6987 \r
6988         case WM_CLOSE:\r
6989                 EndDialog(hWnd, false);\r
6990                 break;\r
6991         }\r
6992 \r
6993         LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);\r
6994 \r
6995         return 0;\r
6996 }\r
6997 \r
6998 // IP アドレステーブルダイアログ\r
6999 void SmIpTableDlg(HWND hWnd, SM_HUB *s, char *session_name)\r
7000 {\r
7001         SM_TABLE t;\r
7002         // 引数チェック\r
7003         if (hWnd == NULL || s == NULL)\r
7004         {\r
7005                 return;\r
7006         }\r
7007 \r
7008         Zero(&t, sizeof(t));\r
7009         t.Hub = s;\r
7010         t.Rpc = s->Rpc;\r
7011         t.SessionName = session_name;\r
7012 \r
7013         Dialog(hWnd, D_SM_IP, SmIpTableDlgProc, &t);\r
7014 }\r
7015 \r
7016 \r
7017 // 初期化\r
7018 void SmMacTableDlgInit(HWND hWnd, SM_TABLE *s)\r
7019 {\r
7020         UINT i = 0;\r
7021         // 引数チェック\r
7022         if (hWnd == NULL || s == NULL)\r
7023         {\r
7024                 return;\r
7025         }\r
7026 \r
7027         SetIcon(hWnd, 0, ICO_NIC_ONLINE);\r
7028         FormatText(hWnd, S_TITLE, s->Hub->HubName);\r
7029 \r
7030         if (s->SessionName != NULL)\r
7031         {\r
7032                 wchar_t tmp[MAX_SIZE];\r
7033                 wchar_t tmp2[MAX_SIZE];\r
7034                 GetTxt(hWnd, S_TITLE, tmp, sizeof(tmp));\r
7035                 UniFormat(tmp2, sizeof(tmp2), _UU("SM_SESSION_FILTER"), s->SessionName);\r
7036                 UniStrCat(tmp, sizeof(tmp), tmp2);\r
7037                 SetText(hWnd, S_TITLE, tmp);\r
7038         }\r
7039 \r
7040         LvInit(hWnd, L_TABLE);\r
7041         LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_1"), 190);\r
7042         if (GetCapsBool(s->Hub->p->CapsList, "b_support_vlan"))\r
7043         {\r
7044                 LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_1A"), 65);\r
7045         }\r
7046         LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_2"), 140);\r
7047         LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_3"), 133);\r
7048         LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_4"), 133);\r
7049         LvInsertColumn(hWnd, L_TABLE, i++, _UU("SM_MAC_COLUMN_5"), 133);\r
7050         LvSetStyle(hWnd, L_TABLE, LVS_EX_GRIDLINES);\r
7051 \r
7052         SmMacTableDlgRefresh(hWnd, s);\r
7053 }\r
7054 \r
7055 // コントロール更新\r
7056 void SmMacTableDlgUpdate(HWND hWnd, SM_TABLE *s)\r
7057 {\r
7058         bool ok = true;\r
7059         // 引数チェック\r
7060         if (hWnd == NULL || s == NULL)\r
7061         {\r
7062                 return;\r
7063         }\r
7064 \r
7065         if (LvIsSelected(hWnd, L_TABLE) == false || LvIsMultiMasked(hWnd, L_TABLE))\r
7066         {\r
7067                 ok = false;\r
7068         }\r
7069 \r
7070         SetEnable(hWnd, B_DELETE, ok);\r
7071 }\r
7072 \r
7073 // 内容更新\r
7074 void SmMacTableDlgRefresh(HWND hWnd, SM_TABLE *s)\r
7075 {\r
7076         UINT i;\r
7077         RPC_ENUM_MAC_TABLE t;\r
7078         UINT old_selected = 0;\r
7079         // 引数チェック\r
7080         if (hWnd == NULL || s == NULL)\r
7081         {\r
7082                 return;\r
7083         }\r
7084 \r
7085         Zero(&t, sizeof(t));\r
7086         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
7087 \r
7088         if (CALL(hWnd, ScEnumMacTable(s->Rpc, &t)) == false)\r
7089         {\r
7090                 EndDialog(hWnd, false);\r
7091                 return;\r
7092         }\r
7093 \r
7094         i = LvGetSelected(hWnd, L_TABLE);\r
7095         if (i != INFINITE)\r
7096         {\r
7097                 old_selected = (UINT)LvGetParam(hWnd, L_TABLE, i);\r
7098         }\r
7099 \r
7100         LvReset(hWnd, L_TABLE);\r
7101 \r
7102         for (i = 0;i < t.NumMacTable;i++)\r
7103         {\r
7104                 char str[MAX_SIZE];\r
7105                 wchar_t tmp1[MAX_SIZE];\r
7106                 wchar_t tmp2[MAX_SIZE];\r
7107                 wchar_t tmp3[MAX_SIZE];\r
7108                 wchar_t tmp4[MAX_SIZE];\r
7109                 wchar_t tmp5[MAX_SIZE];\r
7110                 wchar_t tmp6[MAX_SIZE];\r
7111                 RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];\r
7112 \r
7113                 if (s->SessionName == NULL || StrCmpi(e->SessionName, s->SessionName) == 0)\r
7114                 {\r
7115                         StrToUni(tmp1, sizeof(tmp1), e->SessionName);\r
7116 \r
7117                         MacToStr(str, sizeof(str), e->MacAddress);\r
7118                         StrToUni(tmp2, sizeof(tmp2), str);\r
7119 \r
7120                         GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));\r
7121 \r
7122                         GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));\r
7123 \r
7124                         if (StrLen(e->RemoteHostname) == 0)\r
7125                         {\r
7126                                 UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));\r
7127                         }\r
7128                         else\r
7129                         {\r
7130                                 UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);\r
7131                         }\r
7132 \r
7133                         UniToStru(tmp6, e->VlanId);\r
7134                         if (e->VlanId == 0)\r
7135                         {\r
7136                                 UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));\r
7137                         }\r
7138 \r
7139                         if (GetCapsBool(s->Hub->p->CapsList, "b_support_vlan"))\r
7140                         {\r
7141                                 LvInsert(hWnd, L_TABLE, ICO_NIC_ONLINE, (void *)e->Key, 6,\r
7142                                         tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);\r
7143                         }\r
7144                         else\r
7145                         {\r
7146                                 LvInsert(hWnd, L_TABLE, ICO_NIC_ONLINE, (void *)e->Key, 5,\r
7147                                         tmp1, tmp2, tmp3, tmp4, tmp5);\r
7148                         }\r
7149                 }\r
7150         }\r
7151 \r
7152         FreeRpcEnumMacTable(&t);\r
7153 \r
7154         if (old_selected != 0)\r
7155         {\r
7156                 LvSelect(hWnd, L_TABLE, LvSearchParam(hWnd, L_TABLE, (void *)old_selected));\r
7157         }\r
7158 \r
7159         SmMacTableDlgUpdate(hWnd, s);\r
7160 }\r
7161 \r
7162 // MAC アドレステーブルダイアログプロシージャ\r
7163 UINT SmMacTableDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
7164 {\r
7165         SM_TABLE *s = (SM_TABLE *)param;\r
7166         NMHDR *n;\r
7167         UINT i;\r
7168         // 引数チェック\r
7169         if (hWnd == NULL)\r
7170         {\r
7171                 return 0;\r
7172         }\r
7173 \r
7174         switch (msg)\r
7175         {\r
7176         case WM_INITDIALOG:\r
7177                 // 初期化\r
7178                 SmMacTableDlgInit(hWnd, s);\r
7179                 break;\r
7180 \r
7181         case WM_COMMAND:\r
7182                 switch (wParam)\r
7183                 {\r
7184                 case B_DELETE:\r
7185                         // 削除\r
7186                         i = LvGetSelected(hWnd, L_TABLE);\r
7187                         if (i != INFINITE)\r
7188                         {\r
7189                                 RPC_DELETE_TABLE t;\r
7190                                 UINT key = (UINT)LvGetParam(hWnd, L_TABLE, i);\r
7191 \r
7192                                 Zero(&t, sizeof(t));\r
7193                                 StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
7194                                 t.Key = key;\r
7195                                 if (CALL(hWnd, ScDeleteMacTable(s->Rpc, &t)))\r
7196                                 {\r
7197                                         LvDeleteItem(hWnd, L_TABLE, i);\r
7198                                 }\r
7199                         }\r
7200                         break;\r
7201 \r
7202                 case B_REFRESH:\r
7203                         // 更新\r
7204                         SmMacTableDlgRefresh(hWnd, s);\r
7205                         break;\r
7206 \r
7207                 case IDCANCEL:\r
7208                         // キャンセルボタン\r
7209                         Close(hWnd);\r
7210                         break;\r
7211                 }\r
7212                 break;\r
7213 \r
7214         case WM_NOTIFY:\r
7215                 n = (NMHDR *)lParam;\r
7216                 switch (n->idFrom)\r
7217                 {\r
7218                 case L_TABLE:\r
7219                         switch (n->code)\r
7220                         {\r
7221                         case LVN_ITEMCHANGED:\r
7222                                 SmMacTableDlgUpdate(hWnd, s);\r
7223                                 break;\r
7224                         }\r
7225                         break;\r
7226                 }\r
7227                 break;\r
7228 \r
7229         case WM_CLOSE:\r
7230                 EndDialog(hWnd, false);\r
7231                 break;\r
7232         }\r
7233 \r
7234         LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);\r
7235 \r
7236         return 0;\r
7237 }\r
7238 \r
7239 // MAC アドレステーブルダイアログ\r
7240 void SmMacTableDlg(HWND hWnd, SM_HUB *s, char *session_name)\r
7241 {\r
7242         SM_TABLE t;\r
7243         // 引数チェック\r
7244         if (hWnd == NULL || s == NULL)\r
7245         {\r
7246                 return;\r
7247         }\r
7248 \r
7249         Zero(&t, sizeof(t));\r
7250         t.Hub = s;\r
7251         t.Rpc = s->Rpc;\r
7252         t.SessionName = session_name;\r
7253 \r
7254         Dialog(hWnd, D_SM_MAC, SmMacTableDlgProc, &t);\r
7255 }\r
7256 \r
7257 // 初期化\r
7258 void SmSessionDlgInit(HWND hWnd, SM_HUB *s)\r
7259 {\r
7260         // 引数チェック\r
7261         if (hWnd == NULL || s == NULL)\r
7262         {\r
7263                 return;\r
7264         }\r
7265 \r
7266         SetIcon(hWnd, 0, ICO_VPN);\r
7267         FormatText(hWnd, 0, s->HubName);\r
7268         FormatText(hWnd, S_TITLE, s->HubName);\r
7269 \r
7270         LvInit(hWnd, L_LIST);\r
7271         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_SESS_COLUMN_1"), 176);\r
7272         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_SESS_COLUMN_8"), 58);\r
7273         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_SESS_COLUMN_2"), 62);\r
7274         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_SESS_COLUMN_3"), 78);\r
7275         LvInsertColumn(hWnd, L_LIST, 4, _UU("SM_SESS_COLUMN_4"), 122);\r
7276         LvInsertColumn(hWnd, L_LIST, 5, _UU("SM_SESS_COLUMN_5"), 68);\r
7277         LvInsertColumn(hWnd, L_LIST, 6, _UU("SM_SESS_COLUMN_6"), 100);\r
7278         LvInsertColumn(hWnd, L_LIST, 7, _UU("SM_SESS_COLUMN_7"), 100);\r
7279         LvSetStyle(hWnd, L_LIST, LVS_EX_GRIDLINES);\r
7280 \r
7281         if (s->p->ServerType == SERVER_TYPE_FARM_CONTROLLER && GetCapsBool(s->p->CapsList, "b_support_cluster_admin") == false)\r
7282         {\r
7283                 Show(hWnd, S_FARM_INFO_1);\r
7284                 Show(hWnd, S_FARM_INFO_2);\r
7285         }\r
7286 \r
7287         SmSessionDlgRefresh(hWnd, s);\r
7288 }\r
7289 \r
7290 // コントロールを更新する\r
7291 void SmSessionDlgUpdate(HWND hWnd, SM_HUB *s)\r
7292 {\r
7293         bool ok = true;\r
7294         bool ok2 = true;\r
7295         // 引数チェック\r
7296         if (hWnd == NULL || s == NULL)\r
7297         {\r
7298                 return;\r
7299         }\r
7300 \r
7301         if (LvIsSelected(hWnd, L_LIST) == false || LvIsMultiMasked(hWnd, L_LIST))\r
7302         {\r
7303                 ok = false;\r
7304                 ok2 = false;\r
7305         }\r
7306         else\r
7307         {\r
7308                 UINT i = LvGetSelected(hWnd, L_LIST);\r
7309                 if (i != INFINITE)\r
7310                 {\r
7311                         void *p = LvGetParam(hWnd, L_LIST, i);\r
7312                         if (((bool)p) != false)\r
7313                         {\r
7314                                 if (GetCapsBool(s->p->CapsList, "b_support_cluster_admin") == false)\r
7315                                 {\r
7316                                         ok = false;\r
7317                                 }\r
7318                         }\r
7319                 }\r
7320         }\r
7321 \r
7322         if (s->p->ServerInfo.ServerBuildInt < 2844)\r
7323         {\r
7324                 // セッションのリモート管理非対応 Ver\r
7325                 ok2 = ok;\r
7326         }\r
7327 \r
7328         SetEnable(hWnd, IDOK, ok2);\r
7329         SetEnable(hWnd, B_DISCONNECT, ok2);\r
7330         SetEnable(hWnd, B_SESSION_IP_TABLE, ok);\r
7331         SetEnable(hWnd, B_SESSION_MAC_TABLE, ok);\r
7332 }\r
7333 \r
7334 // リストを更新する\r
7335 void SmSessionDlgRefresh(HWND hWnd, SM_HUB *s)\r
7336 {\r
7337         LVB *b;\r
7338         UINT i;\r
7339         wchar_t *old_select;\r
7340         RPC_ENUM_SESSION t;\r
7341         // 引数チェック\r
7342         if (hWnd == NULL || s == NULL)\r
7343         {\r
7344                 return;\r
7345         }\r
7346 \r
7347         Zero(&t, sizeof(t));\r
7348         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7349 \r
7350         if (CALL(hWnd, ScEnumSession(s->Rpc, &t)) == false)\r
7351         {\r
7352                 EndDialog(hWnd, false);\r
7353                 return;\r
7354         }\r
7355 \r
7356         old_select = LvGetSelectedStr(hWnd, L_LIST, 0);\r
7357 \r
7358         LvReset(hWnd, L_LIST);\r
7359 \r
7360         b = LvInsertStart();\r
7361 \r
7362         for (i = 0;i < t.NumSession;i++)\r
7363         {\r
7364                 RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];\r
7365                 wchar_t tmp1[MAX_SIZE];\r
7366                 wchar_t *tmp2;\r
7367                 wchar_t tmp3[MAX_SIZE];\r
7368                 wchar_t tmp4[MAX_SIZE];\r
7369                 wchar_t tmp5[MAX_SIZE];\r
7370                 wchar_t tmp6[MAX_SIZE];\r
7371                 wchar_t tmp7[MAX_SIZE];\r
7372                 wchar_t tmp8[MAX_SIZE];\r
7373                 bool free_tmp2 = false;\r
7374                 UINT icon;\r
7375 \r
7376                 StrToUni(tmp1, sizeof(tmp1), e->Name);\r
7377 \r
7378                 tmp2 = _UU("SM_SESS_NORMAL");\r
7379                 icon = ICO_VPN;\r
7380                 if (s->p->ServerType != SERVER_TYPE_STANDALONE)\r
7381                 {\r
7382                         if (e->RemoteSession)\r
7383                         {\r
7384                                 tmp2 = ZeroMalloc(MAX_SIZE);\r
7385                                 UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);\r
7386                                 icon = ICO_VPN;\r
7387                                 free_tmp2 = true;\r
7388                         }\r
7389                         else\r
7390                         {\r
7391                                 if (StrLen(e->RemoteHostname) == 0)\r
7392                                 {\r
7393                                         tmp2 = _UU("SM_SESS_LOCAL");\r
7394                                 }\r
7395                                 else\r
7396                                 {\r
7397                                         tmp2 = ZeroMalloc(MAX_SIZE);\r
7398                                         UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);\r
7399                                         free_tmp2 = true;\r
7400                                 }\r
7401                         }\r
7402                 }\r
7403                 if (e->LinkMode)\r
7404                 {\r
7405                         if (free_tmp2)\r
7406                         {\r
7407                                 Free(tmp2);\r
7408                                 free_tmp2 = false;\r
7409                         }\r
7410                         tmp2 = _UU("SM_SESS_LINK");\r
7411                         icon = ICO_CASCADE;\r
7412                 }\r
7413                 else if (e->SecureNATMode)\r
7414                 {\r
7415                         /*if (free_tmp2)\r
7416                         {\r
7417                                 Free(tmp2);\r
7418                                 free_tmp2 = false;\r
7419                         }\r
7420                         tmp2 = _UU("SM_SESS_SNAT");*/\r
7421                         icon = ICO_ROUTER;\r
7422                 }\r
7423                 else if (e->BridgeMode)\r
7424                 {\r
7425                         icon = ICO_BRIDGE;\r
7426                 }\r
7427                 else if (e->Layer3Mode)\r
7428                 {\r
7429                         icon = ICO_SWITCH;\r
7430                 }\r
7431 \r
7432                 StrToUni(tmp3, sizeof(tmp3), e->Username);\r
7433 \r
7434                 StrToUni(tmp4, sizeof(tmp4), e->Hostname);\r
7435                 if (e->LinkMode)\r
7436                 {\r
7437                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));\r
7438                 }\r
7439                 else if (e->SecureNATMode)\r
7440                 {\r
7441                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));\r
7442                 }\r
7443                 else if (e->BridgeMode)\r
7444                 {\r
7445                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));\r
7446                 }\r
7447                 else if (StartWith(e->Username, L3_USERNAME))\r
7448                 {\r
7449                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));\r
7450                 }\r
7451 \r
7452                 UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);\r
7453                 if (e->LinkMode)\r
7454                 {\r
7455                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));\r
7456                 }\r
7457                 else if (e->SecureNATMode)\r
7458                 {\r
7459                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));\r
7460                 }\r
7461                 else if (e->BridgeMode)\r
7462                 {\r
7463                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));\r
7464                 }\r
7465 \r
7466                 if (e->VLanId == 0)\r
7467                 {\r
7468                         UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));\r
7469                 }\r
7470                 else\r
7471                 {\r
7472                         UniToStru(tmp8, e->VLanId);\r
7473                 }\r
7474 \r
7475                 UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);\r
7476                 UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);\r
7477 \r
7478                 if (icon == ICO_VPN)\r
7479                 {\r
7480                         if (e->Client_BridgeMode)\r
7481                         {\r
7482                                 icon = ICO_SESSION_BRIDGE;\r
7483                         }\r
7484                         else if (e->Client_MonitorMode)\r
7485                         {\r
7486                                 icon = ICO_SESSION_MONITOR;\r
7487                         }\r
7488                 }\r
7489 \r
7490                 LvInsertAdd(b, icon, (void *)(e->RemoteSession), 8, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);\r
7491 \r
7492                 if (free_tmp2)\r
7493                 {\r
7494                         Free(tmp2);\r
7495                 }\r
7496         }\r
7497 \r
7498         LvInsertEnd(b, hWnd, L_LIST);\r
7499 \r
7500         if (old_select != NULL && UniStrLen(old_select) != 0)\r
7501         {\r
7502                 UINT i = LvSearchStr(hWnd, L_LIST, 0, old_select);\r
7503                 if (i != INFINITE)\r
7504                 {\r
7505                         LvSelect(hWnd, L_LIST, i);\r
7506                 }\r
7507         }\r
7508 \r
7509         Free(old_select);\r
7510 \r
7511         FreeRpcEnumSession(&t);\r
7512 \r
7513         SmSessionDlgUpdate(hWnd, s);\r
7514 }\r
7515 \r
7516 // NODE_INFO の表示\r
7517 void SmPrintNodeInfo(LVB *b, NODE_INFO *info)\r
7518 {\r
7519         wchar_t tmp[MAX_SIZE];\r
7520         char str[MAX_SIZE];\r
7521         // 引数チェック\r
7522         if (b == NULL || info == NULL)\r
7523         {\r
7524                 return;\r
7525         }\r
7526 \r
7527         StrToUni(tmp, sizeof(tmp), info->ClientProductName);\r
7528         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_NAME"), tmp);\r
7529 \r
7530         UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);\r
7531         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_VER"), tmp);\r
7532 \r
7533         UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));\r
7534         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_BUILD"), tmp);\r
7535 \r
7536         StrToUni(tmp, sizeof(tmp), info->ClientOsName);\r
7537         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);\r
7538 \r
7539         StrToUni(tmp, sizeof(tmp), info->ClientOsVer);\r
7540         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_OS_VER"), tmp);\r
7541 \r
7542         StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);\r
7543         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_OS_PID"), tmp);\r
7544 \r
7545         StrToUni(tmp, sizeof(tmp), info->ClientHostname);\r
7546         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_HOST"), tmp);\r
7547 \r
7548         IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);\r
7549         StrToUni(tmp, sizeof(tmp), str);\r
7550         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_IP"), tmp);\r
7551 \r
7552         UniToStru(tmp, Endian32(info->ClientPort));\r
7553         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_CLIENT_PORT"), tmp);\r
7554 \r
7555         StrToUni(tmp, sizeof(tmp), info->ServerHostname);\r
7556         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_SERVER_HOST"), tmp);\r
7557 \r
7558         IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);\r
7559         StrToUni(tmp, sizeof(tmp), str);\r
7560         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_SERVER_IP"), tmp);\r
7561 \r
7562         UniToStru(tmp, Endian32(info->ServerPort));\r
7563         LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_SERVER_PORT"), tmp);\r
7564 \r
7565         if (StrLen(info->ProxyHostname) != 0)\r
7566         {\r
7567                 StrToUni(tmp, sizeof(tmp), info->ProxyHostname);\r
7568                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);\r
7569 \r
7570                 IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);\r
7571                 StrToUni(tmp, sizeof(tmp), str);\r
7572                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_PROXY_IP"), tmp);\r
7573 \r
7574                 UniToStru(tmp, Endian32(info->ProxyPort));\r
7575                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_NODE_PROXY_PORT"), tmp);\r
7576         }\r
7577 }\r
7578 \r
7579 // セッション ステータスの更新\r
7580 bool SmRefreshSessionStatus(HWND hWnd, SM_SERVER *s, void *param)\r
7581 {\r
7582         LVB *b;\r
7583         SM_SESSION_STATUS *status = (SM_SESSION_STATUS *)param;\r
7584         RPC_SESSION_STATUS t;\r
7585         wchar_t tmp[MAX_SIZE];\r
7586         char str[MAX_SIZE];\r
7587         // 引数チェック\r
7588         if (hWnd == NULL || s == NULL || param == NULL)\r
7589         {\r
7590                 return false;\r
7591         }\r
7592 \r
7593         Zero(&t, sizeof(t));\r
7594         StrCpy(t.HubName, sizeof(t.HubName), status->Hub->HubName);\r
7595         StrCpy(t.Name, sizeof(t.Name), status->SessionName);\r
7596 \r
7597         if (CALL(hWnd, ScGetSessionStatus(s->Rpc, &t)) == false)\r
7598         {\r
7599                 return false;\r
7600         }\r
7601 \r
7602         b = LvInsertStart();\r
7603 \r
7604         if (t.ClientIp != 0)\r
7605         {\r
7606                 IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);\r
7607                 StrToUni(tmp, sizeof(tmp), str);\r
7608                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_CLIENT_IP"), tmp);\r
7609         }\r
7610 \r
7611         if (StrLen(t.ClientHostName) != 0)\r
7612         {\r
7613                 StrToUni(tmp, sizeof(tmp), t.ClientHostName);\r
7614                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_CLIENT_HOSTNAME"), tmp);\r
7615         }\r
7616 \r
7617         StrToUni(tmp, sizeof(tmp), t.Username);\r
7618         LvInsertAdd(b, 0, NULL, 2, _UU("SM_SESS_STATUS_USERNAME"), tmp);\r
7619 \r
7620         if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0)\r
7621         {\r
7622                 StrToUni(tmp, sizeof(tmp), t.RealUsername);\r
7623                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_SESS_STATUS_REALUSER"), tmp);\r
7624         }\r
7625 \r
7626         if (IsEmptyStr(t.GroupName) == false)\r
7627         {\r
7628                 StrToUni(tmp, sizeof(tmp), t.GroupName);\r
7629                 LvInsertAdd(b, 0, NULL, 2, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);\r
7630         }\r
7631 \r
7632         CmPrintStatusToListViewEx(b, &t.Status, true);\r
7633 \r
7634         if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0 &&\r
7635                 StartWith(t.Username, L3_USERNAME) == false)\r
7636         {\r
7637                 SmPrintNodeInfo(b, &t.NodeInfo);\r
7638         }\r
7639 \r
7640         LvInsertEnd(b, hWnd, L_STATUS);\r
7641 \r
7642         FreeRpcSessionStatus(&t);\r
7643 \r
7644         return true;\r
7645 }\r
7646 \r
7647 // セッション管理ダイアログプロシージャ\r
7648 UINT SmSessionDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
7649 {\r
7650         SM_HUB *s = (SM_HUB *)param;\r
7651         wchar_t *tmp;\r
7652         wchar_t tmp2[MAX_SIZE];\r
7653         char name[MAX_SIZE];\r
7654         NMHDR *n;\r
7655         SM_SESSION_STATUS status;\r
7656         // 引数チェック\r
7657         if (hWnd == NULL)\r
7658         {\r
7659                 return 0;\r
7660         }\r
7661 \r
7662         tmp = LvGetSelectedStr(hWnd, L_LIST, 0);\r
7663         UniToStr(name, sizeof(name), tmp);\r
7664 \r
7665         switch (msg)\r
7666         {\r
7667         case WM_INITDIALOG:\r
7668                 // 初期化\r
7669                 SmSessionDlgInit(hWnd, s);\r
7670                 break;\r
7671 \r
7672         case WM_COMMAND:\r
7673                 switch (wParam)\r
7674                 {\r
7675                 case IDOK:\r
7676                         if (IsEnable(hWnd, IDOK))\r
7677                         {\r
7678                                 // セッション状態表示\r
7679                                 UniFormat(tmp2, sizeof(tmp2), _UU("SM_SESS_STATUS_CAPTION"), name);\r
7680                                 Zero(&status, sizeof(status));\r
7681                                 status.Hub = s;\r
7682                                 status.SessionName = name;\r
7683                                 SmStatusDlg(hWnd, s->p, &status, true, true, tmp2, ICO_VPN,\r
7684                                         NULL, SmRefreshSessionStatus);\r
7685                         }\r
7686                         break;\r
7687 \r
7688                 case B_DISCONNECT:\r
7689                         // 切断\r
7690                         if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
7691                                 _UU("SM_SESS_DISCONNECT_MSG"), name) == IDYES)\r
7692                         {\r
7693                                 RPC_DELETE_SESSION t;\r
7694                                 Zero(&t, sizeof(t));\r
7695                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7696                                 StrCpy(t.Name, sizeof(t.Name), name);\r
7697 \r
7698                                 if (CALL(hWnd, ScDeleteSession(s->Rpc, &t)))\r
7699                                 {\r
7700                                         SmSessionDlgRefresh(hWnd, s);\r
7701                                 }\r
7702                         }\r
7703                         break;\r
7704 \r
7705                 case B_REFRESH:\r
7706                         // 更新\r
7707                         SmSessionDlgRefresh(hWnd, s);\r
7708                         break;\r
7709 \r
7710                 case B_SESSION_IP_TABLE:\r
7711                         // IP テーブル\r
7712                         SmIpTableDlg(hWnd, s, name);\r
7713                         break;\r
7714 \r
7715                 case B_SESSION_MAC_TABLE:\r
7716                         // MAC テーブル\r
7717                         SmMacTableDlg(hWnd, s, name);\r
7718                         break;\r
7719 \r
7720                 case B_MAC_TABLE:\r
7721                         // MAC テーブル一覧\r
7722                         SmMacTableDlg(hWnd, s, NULL);\r
7723                         break;\r
7724 \r
7725                 case B_IP_TABLE:\r
7726                         // IP テーブル一覧\r
7727                         SmIpTableDlg(hWnd, s, NULL);\r
7728                         break;\r
7729 \r
7730                 case IDCANCEL:\r
7731                         // キャンセルボタン\r
7732                         Close(hWnd);\r
7733                         break;\r
7734                 }\r
7735                 break;\r
7736 \r
7737         case WM_NOTIFY:\r
7738                 n = (NMHDR *)lParam;\r
7739                 switch (n->code)\r
7740                 {\r
7741                 case LVN_ITEMCHANGED:\r
7742                         switch (n->idFrom)\r
7743                         {\r
7744                         case L_LIST:\r
7745                                 SmSessionDlgUpdate(hWnd, s);\r
7746                                 break;\r
7747                         }\r
7748                         break;\r
7749                 }\r
7750                 break;\r
7751 \r
7752         case WM_CLOSE:\r
7753                 EndDialog(hWnd, false);\r
7754                 break;\r
7755         }\r
7756 \r
7757         Free(tmp);\r
7758 \r
7759         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
7760 \r
7761         return 0;\r
7762 }\r
7763 \r
7764 // セッション管理ダイアログ\r
7765 void SmSessionDlg(HWND hWnd, SM_HUB *s)\r
7766 {\r
7767         // 引数チェック\r
7768         if (hWnd == NULL || s == NULL)\r
7769         {\r
7770                 return;\r
7771         }\r
7772 \r
7773         Dialog(hWnd, D_SM_SESSION, SmSessionDlgProc, s);\r
7774 }\r
7775 \r
7776 // 証明書一覧更新\r
7777 void SmCaDlgRefresh(HWND hWnd, SM_HUB *s)\r
7778 {\r
7779         LVB *b;\r
7780         UINT i;\r
7781         RPC_HUB_ENUM_CA t;\r
7782         // 引数チェック\r
7783         if (hWnd == NULL || s == NULL)\r
7784         {\r
7785                 return;\r
7786         }\r
7787 \r
7788         Zero(&t, sizeof(t));\r
7789         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7790         if (CALL(hWnd, ScEnumCa(s->Rpc, &t)) == false)\r
7791         {\r
7792                 EndDialog(hWnd, false);\r
7793                 return;\r
7794         }\r
7795 \r
7796         b = LvInsertStart();\r
7797 \r
7798         for (i = 0;i < t.NumCa;i++)\r
7799         {\r
7800                 wchar_t tmp[MAX_SIZE];\r
7801                 RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];\r
7802 \r
7803                 GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);\r
7804 \r
7805                 LvInsertAdd(b, ICO_SERVER_CERT, (void *)e->Key, 3,\r
7806                         e->SubjectName, e->IssuerName, tmp);\r
7807         }\r
7808 \r
7809         LvInsertEnd(b, hWnd, L_CERT);\r
7810 \r
7811         FreeRpcHubEnumCa(&t);\r
7812 \r
7813         SmCaDlgUpdate(hWnd, s);\r
7814 }\r
7815 \r
7816 // 初期化\r
7817 void SmCaDlgInit(HWND hWnd, SM_HUB *s)\r
7818 {\r
7819         // 引数チェック\r
7820         if (hWnd == NULL || s == NULL)\r
7821         {\r
7822                 return;\r
7823         }\r
7824 \r
7825         SetIcon(hWnd, 0, ICO_SERVER_CERT);\r
7826 \r
7827         LvInit(hWnd, L_CERT);\r
7828         LvInsertColumn(hWnd, L_CERT, 0, _UU("CM_CERT_COLUMN_1"), 190);\r
7829         LvInsertColumn(hWnd, L_CERT, 1, _UU("CM_CERT_COLUMN_2"), 190);\r
7830         LvInsertColumn(hWnd, L_CERT, 2, _UU("CM_CERT_COLUMN_3"), 160);\r
7831 \r
7832         SmCaDlgRefresh(hWnd, s);\r
7833 }\r
7834 \r
7835 // コントロール更新\r
7836 void SmCaDlgUpdate(HWND hWnd, SM_HUB *s)\r
7837 {\r
7838         // 引数チェック\r
7839         if (hWnd == NULL || s == NULL)\r
7840         {\r
7841                 return;\r
7842         }\r
7843 \r
7844         SetEnable(hWnd, B_DELETE, LvIsSelected(hWnd, L_CERT));\r
7845         SetEnable(hWnd, IDOK, LvIsSelected(hWnd, L_CERT));\r
7846 }\r
7847 \r
7848 // OK\r
7849 void SmCaDlgOnOk(HWND hWnd, SM_HUB *s)\r
7850 {\r
7851         // 引数チェック\r
7852         if (hWnd == NULL || s == NULL)\r
7853         {\r
7854                 return;\r
7855         }\r
7856 }\r
7857 \r
7858 // CA 追加ダイアログ\r
7859 bool SmCaDlgAdd(HWND hWnd, SM_HUB *s)\r
7860 {\r
7861         X *x;\r
7862         RPC_HUB_ADD_CA t;\r
7863         // 引数チェック\r
7864         if (hWnd == NULL || s == NULL)\r
7865         {\r
7866                 return false;\r
7867         }\r
7868 \r
7869         if (CmLoadXFromFileOrSecureCard(hWnd, &x) == false)\r
7870         {\r
7871                 return false;\r
7872         }\r
7873 \r
7874         Zero(&t, sizeof(t));\r
7875         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7876         t.Cert = x;\r
7877 \r
7878         if (CALL(hWnd, ScAddCa(s->Rpc, &t)) == false)\r
7879         {\r
7880                 return false;\r
7881         }\r
7882 \r
7883         FreeRpcHubAddCa(&t);\r
7884 \r
7885         return true;\r
7886 }\r
7887 \r
7888 // CA 一覧ダイアログプロシージャ\r
7889 UINT SmCaDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
7890 {\r
7891         NMHDR *n;\r
7892         SM_HUB *s = (SM_HUB *)param;\r
7893         UINT i, key;\r
7894         // 引数チェック\r
7895         if (hWnd == NULL)\r
7896         {\r
7897                 return 0;\r
7898         }\r
7899 \r
7900         switch (msg)\r
7901         {\r
7902         case WM_INITDIALOG:\r
7903                 // 初期化\r
7904                 SmCaDlgInit(hWnd, s);\r
7905                 break;\r
7906 \r
7907         case WM_COMMAND:\r
7908                 switch (wParam)\r
7909                 {\r
7910                 case B_IMPORT:\r
7911                         // 追加\r
7912                         if (SmCaDlgAdd(hWnd, s))\r
7913                         {\r
7914                                 SmCaDlgRefresh(hWnd, s);\r
7915                         }\r
7916                         break;\r
7917 \r
7918                 case B_DELETE:\r
7919                         // 削除\r
7920                         i = LvGetSelected(hWnd, L_CERT);\r
7921                         if (i != INFINITE)\r
7922                         {\r
7923                                 key = (UINT)LvGetParam(hWnd, L_CERT, i);\r
7924                                 if (key != 0)\r
7925                                 {\r
7926                                         if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
7927                                                 _UU("CM_CERT_DELETE_MSG")) == IDYES)\r
7928                                         {\r
7929                                                 RPC_HUB_DELETE_CA t;\r
7930                                                 Zero(&t, sizeof(t));\r
7931                                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7932                                                 t.Key = key;\r
7933 \r
7934                                                 if (CALL(hWnd, ScDeleteCa(s->Rpc, &t)))\r
7935                                                 {\r
7936                                                         SmCaDlgRefresh(hWnd, s);\r
7937                                                 }\r
7938                                         }\r
7939                                 }\r
7940                         }\r
7941                         break;\r
7942 \r
7943                 case IDOK:\r
7944                         // 表示\r
7945                         i = LvGetSelected(hWnd, L_CERT);\r
7946                         if (i != INFINITE)\r
7947                         {\r
7948                                 key = (UINT)LvGetParam(hWnd, L_CERT, i);\r
7949                                 if (key != 0)\r
7950                                 {\r
7951                                         RPC_HUB_GET_CA t;\r
7952                                         Zero(&t, sizeof(t));\r
7953                                         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
7954                                         t.Key = key;\r
7955 \r
7956                                         if (CALL(hWnd, ScGetCa(s->Rpc, &t)))\r
7957                                         {\r
7958                                                 CertDlg(hWnd, t.Cert, NULL, true);\r
7959                                                 FreeRpcHubGetCa(&t);\r
7960                                         }\r
7961                                 }\r
7962                         }\r
7963                         break;\r
7964 \r
7965                 case IDCANCEL:\r
7966                         // キャンセルボタン\r
7967                         Close(hWnd);\r
7968                         break;\r
7969                 }\r
7970                 break;\r
7971 \r
7972         case WM_NOTIFY:\r
7973                 n = (NMHDR *)lParam;\r
7974                 switch (n->idFrom)\r
7975                 {\r
7976                 case L_CERT:\r
7977                         switch (n->code)\r
7978                         {\r
7979                         case LVN_ITEMCHANGED:\r
7980                                 SmCaDlgUpdate(hWnd, s);\r
7981                                 break;\r
7982                         }\r
7983                         break;\r
7984                 }\r
7985                 break;\r
7986 \r
7987         case WM_CLOSE:\r
7988                 EndDialog(hWnd, false);\r
7989                 break;\r
7990         }\r
7991 \r
7992         LvStandardHandler(hWnd, msg, wParam, lParam, L_CERT);\r
7993 \r
7994         return 0;\r
7995 }\r
7996 \r
7997 // CA 一覧ダイアログ\r
7998 void SmCaDlg(HWND hWnd, SM_HUB *s)\r
7999 {\r
8000         // 引数チェック\r
8001         if (hWnd == NULL || s == NULL)\r
8002         {\r
8003                 return;\r
8004         }\r
8005 \r
8006         Dialog(hWnd, D_SM_CA, SmCaDlgProc, s);\r
8007 }\r
8008 \r
8009 // 初期化\r
8010 void SmLogDlgInit(HWND hWnd, SM_HUB *s)\r
8011 {\r
8012         RPC_HUB_LOG t;\r
8013         // 引数チェック\r
8014         if (hWnd == NULL || s == NULL)\r
8015         {\r
8016                 return;\r
8017         }\r
8018 \r
8019         SetIcon(hWnd, 0, ICO_LOG2);\r
8020 \r
8021         FormatText(hWnd, S_TITLE, s->HubName);\r
8022 \r
8023         CbSetHeight(hWnd, C_SEC_SWITCH, 18);\r
8024         CbSetHeight(hWnd, C_PACKET_SWITCH, 18);\r
8025 \r
8026         // コントロール初期化\r
8027         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_0"), 0);\r
8028         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_1"), 1);\r
8029         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_2"), 2);\r
8030         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_3"), 3);\r
8031         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_4"), 4);\r
8032         CbAddStr(hWnd, C_SEC_SWITCH, _UU("SM_LOG_SWITCH_5"), 5);\r
8033         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_0"), 0);\r
8034         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_1"), 1);\r
8035         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_2"), 2);\r
8036         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_3"), 3);\r
8037         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_4"), 4);\r
8038         CbAddStr(hWnd, C_PACKET_SWITCH, _UU("SM_LOG_SWITCH_5"), 5);\r
8039 \r
8040         // ログ設定を取得\r
8041         Zero(&t, sizeof(t));\r
8042         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8043         if (CALL(hWnd, ScGetHubLog(s->Rpc, &t)) == false)\r
8044         {\r
8045                 EndDialog(hWnd, false);\r
8046                 return;\r
8047         }\r
8048 \r
8049         Check(hWnd, B_SEC, t.LogSetting.SaveSecurityLog);\r
8050         CbSelect(hWnd, C_SEC_SWITCH, t.LogSetting.SecurityLogSwitchType);\r
8051 \r
8052         Check(hWnd, B_PACKET, t.LogSetting.SavePacketLog);\r
8053         CbSelect(hWnd, C_PACKET_SWITCH, t.LogSetting.PacketLogSwitchType);\r
8054 \r
8055         Check(hWnd, B_PACKET_0_0, t.LogSetting.PacketLogConfig[0] == 0);\r
8056         Check(hWnd, B_PACKET_0_1, t.LogSetting.PacketLogConfig[0] == 1);\r
8057         Check(hWnd, B_PACKET_0_2, t.LogSetting.PacketLogConfig[0] == 2);\r
8058 \r
8059         Check(hWnd, B_PACKET_1_0, t.LogSetting.PacketLogConfig[1] == 0);\r
8060         Check(hWnd, B_PACKET_1_1, t.LogSetting.PacketLogConfig[1] == 1);\r
8061         Check(hWnd, B_PACKET_1_2, t.LogSetting.PacketLogConfig[1] == 2);\r
8062 \r
8063         Check(hWnd, B_PACKET_2_0, t.LogSetting.PacketLogConfig[2] == 0);\r
8064         Check(hWnd, B_PACKET_2_1, t.LogSetting.PacketLogConfig[2] == 1);\r
8065         Check(hWnd, B_PACKET_2_2, t.LogSetting.PacketLogConfig[2] == 2);\r
8066 \r
8067         Check(hWnd, B_PACKET_3_0, t.LogSetting.PacketLogConfig[3] == 0);\r
8068         Check(hWnd, B_PACKET_3_1, t.LogSetting.PacketLogConfig[3] == 1);\r
8069         Check(hWnd, B_PACKET_3_2, t.LogSetting.PacketLogConfig[3] == 2);\r
8070 \r
8071         Check(hWnd, B_PACKET_4_0, t.LogSetting.PacketLogConfig[4] == 0);\r
8072         Check(hWnd, B_PACKET_4_1, t.LogSetting.PacketLogConfig[4] == 1);\r
8073         Check(hWnd, B_PACKET_4_2, t.LogSetting.PacketLogConfig[4] == 2);\r
8074 \r
8075         Check(hWnd, B_PACKET_5_0, t.LogSetting.PacketLogConfig[5] == 0);\r
8076         Check(hWnd, B_PACKET_5_1, t.LogSetting.PacketLogConfig[5] == 1);\r
8077         Check(hWnd, B_PACKET_5_2, t.LogSetting.PacketLogConfig[5] == 2);\r
8078 \r
8079         Check(hWnd, B_PACKET_6_0, t.LogSetting.PacketLogConfig[6] == 0);\r
8080         Check(hWnd, B_PACKET_6_1, t.LogSetting.PacketLogConfig[6] == 1);\r
8081         Check(hWnd, B_PACKET_6_2, t.LogSetting.PacketLogConfig[6] == 2);\r
8082 \r
8083         Check(hWnd, B_PACKET_7_0, t.LogSetting.PacketLogConfig[7] == 0);\r
8084         Check(hWnd, B_PACKET_7_1, t.LogSetting.PacketLogConfig[7] == 1);\r
8085         Check(hWnd, B_PACKET_7_2, t.LogSetting.PacketLogConfig[7] == 2);\r
8086 \r
8087         SmLogDlgUpdate(hWnd, s);\r
8088 }\r
8089 \r
8090 // コントロール更新\r
8091 void SmLogDlgUpdate(HWND hWnd, SM_HUB *s)\r
8092 {\r
8093         bool b;\r
8094         // 引数チェック\r
8095         if (hWnd == NULL || s == NULL)\r
8096         {\r
8097                 return;\r
8098         }\r
8099 \r
8100         b = IsChecked(hWnd, B_SEC);\r
8101         SetEnable(hWnd, S_SEC, b);\r
8102         SetEnable(hWnd, C_SEC_SWITCH, b);\r
8103 \r
8104         b = IsChecked(hWnd, B_PACKET);\r
8105         SetEnable(hWnd, S_PACKET, b);\r
8106         SetEnable(hWnd, C_PACKET_SWITCH, b);\r
8107         SetEnable(hWnd, S_PACKET_0, b);\r
8108         SetEnable(hWnd, S_PACKET_1, b);\r
8109         SetEnable(hWnd, S_PACKET_2, b);\r
8110         SetEnable(hWnd, S_PACKET_3, b);\r
8111         SetEnable(hWnd, S_PACKET_4, b);\r
8112         SetEnable(hWnd, S_PACKET_5, b);\r
8113         SetEnable(hWnd, S_PACKET_6, b);\r
8114         SetEnable(hWnd, S_PACKET_7, b);\r
8115         SetEnable(hWnd, B_PACKET_0_0, b); SetEnable(hWnd, B_PACKET_0_1, b); SetEnable(hWnd, B_PACKET_0_2, b);\r
8116         SetEnable(hWnd, B_PACKET_1_0, b); SetEnable(hWnd, B_PACKET_1_1, b); SetEnable(hWnd, B_PACKET_1_2, b);\r
8117         SetEnable(hWnd, B_PACKET_2_0, b); SetEnable(hWnd, B_PACKET_2_1, b); SetEnable(hWnd, B_PACKET_2_2, b);\r
8118         SetEnable(hWnd, B_PACKET_3_0, b); SetEnable(hWnd, B_PACKET_3_1, b); SetEnable(hWnd, B_PACKET_3_2, b);\r
8119         SetEnable(hWnd, B_PACKET_4_0, b); SetEnable(hWnd, B_PACKET_4_1, b); SetEnable(hWnd, B_PACKET_4_2, b);\r
8120         SetEnable(hWnd, B_PACKET_5_0, b); SetEnable(hWnd, B_PACKET_5_1, b); SetEnable(hWnd, B_PACKET_5_2, b);\r
8121         SetEnable(hWnd, B_PACKET_6_0, b); SetEnable(hWnd, B_PACKET_6_1, b); SetEnable(hWnd, B_PACKET_6_2, b);\r
8122         SetEnable(hWnd, B_PACKET_7_0, b); SetEnable(hWnd, B_PACKET_7_1, b); SetEnable(hWnd, B_PACKET_7_2, b);\r
8123 }\r
8124 \r
8125 // OK\r
8126 void SmLogDlgOnOk(HWND hWnd, SM_HUB *s)\r
8127 {\r
8128         HUB_LOG g;\r
8129         RPC_HUB_LOG t;\r
8130         // 引数チェック\r
8131         if (hWnd == NULL || s == NULL)\r
8132         {\r
8133                 return;\r
8134         }\r
8135 \r
8136         Zero(&g, sizeof(g));\r
8137         g.SaveSecurityLog = IsChecked(hWnd, B_SEC);\r
8138         g.SavePacketLog = IsChecked(hWnd, B_PACKET);\r
8139         g.SecurityLogSwitchType = CbGetSelect(hWnd, C_SEC_SWITCH);\r
8140         g.PacketLogSwitchType = CbGetSelect(hWnd, C_PACKET_SWITCH);\r
8141 \r
8142         g.PacketLogConfig[0] = IsChecked(hWnd, B_PACKET_0_0) ? 0 : IsChecked(hWnd, B_PACKET_0_1) ? 1 : 2;\r
8143         g.PacketLogConfig[1] = IsChecked(hWnd, B_PACKET_1_0) ? 0 : IsChecked(hWnd, B_PACKET_1_1) ? 1 : 2;\r
8144         g.PacketLogConfig[2] = IsChecked(hWnd, B_PACKET_2_0) ? 0 : IsChecked(hWnd, B_PACKET_2_1) ? 1 : 2;\r
8145         g.PacketLogConfig[3] = IsChecked(hWnd, B_PACKET_3_0) ? 0 : IsChecked(hWnd, B_PACKET_3_1) ? 1 : 2;\r
8146         g.PacketLogConfig[4] = IsChecked(hWnd, B_PACKET_4_0) ? 0 : IsChecked(hWnd, B_PACKET_4_1) ? 1 : 2;\r
8147         g.PacketLogConfig[5] = IsChecked(hWnd, B_PACKET_5_0) ? 0 : IsChecked(hWnd, B_PACKET_5_1) ? 1 : 2;\r
8148         g.PacketLogConfig[6] = IsChecked(hWnd, B_PACKET_6_0) ? 0 : IsChecked(hWnd, B_PACKET_6_1) ? 1 : 2;\r
8149         g.PacketLogConfig[7] = IsChecked(hWnd, B_PACKET_7_0) ? 0 : IsChecked(hWnd, B_PACKET_7_1) ? 1 : 2;\r
8150 \r
8151         Zero(&t, sizeof(t));\r
8152         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8153         Copy(&t.LogSetting, &g, sizeof(HUB_LOG));\r
8154 \r
8155         if (CALL(hWnd, ScSetHubLog(s->Rpc, &t)) == false)\r
8156         {\r
8157                 return;\r
8158         }\r
8159 \r
8160         EndDialog(hWnd, true);\r
8161 }\r
8162 \r
8163 // ログ保存設定ダイアログ\r
8164 UINT SmLogDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
8165 {\r
8166         SM_HUB *s = (SM_HUB *)param;\r
8167         // 引数チェック\r
8168         if (hWnd == NULL)\r
8169         {\r
8170                 return 0;\r
8171         }\r
8172 \r
8173         switch (msg)\r
8174         {\r
8175         case WM_INITDIALOG:\r
8176                 // 初期化\r
8177                 SmLogDlgInit(hWnd, s);\r
8178                 break;\r
8179 \r
8180         case WM_COMMAND:\r
8181                 switch (LOWORD(wParam))\r
8182                 {\r
8183                 case B_SEC:\r
8184                 case B_PACKET:\r
8185                         SmLogDlgUpdate(hWnd, s);\r
8186                         break;\r
8187                 }\r
8188 \r
8189                 switch (wParam)\r
8190                 {\r
8191                 case IDOK:\r
8192                         // OK ボタン\r
8193                         SmLogDlgOnOk(hWnd, s);\r
8194                         break;\r
8195 \r
8196                 case IDCANCEL:\r
8197                         // キャンセルボタン\r
8198                         Close(hWnd);\r
8199                         break;\r
8200                 }\r
8201                 break;\r
8202 \r
8203         case WM_CLOSE:\r
8204                 EndDialog(hWnd, false);\r
8205                 break;\r
8206         }\r
8207 \r
8208         return 0;\r
8209 }\r
8210 \r
8211 // カスケード接続のステータスの表示\r
8212 bool SmRefreshLinkStatus(HWND hWnd, SM_SERVER *s, void *param)\r
8213 {\r
8214         SM_LINK *k = (SM_LINK *)param;\r
8215         RPC_LINK_STATUS t;\r
8216         LVB *b;\r
8217         // 引数チェック\r
8218         if (hWnd == NULL || s == NULL || param == NULL)\r
8219         {\r
8220                 return false;\r
8221         }\r
8222 \r
8223         Zero(&t, sizeof(t));\r
8224         StrCpy(t.HubName, sizeof(t.HubName), k->Hub->HubName);\r
8225         UniStrCpy(t.AccountName, sizeof(t.AccountName), k->AccountName);\r
8226 \r
8227         if (CALL(hWnd, ScGetLinkStatus(s->Rpc, &t)) == false)\r
8228         {\r
8229                 return false;\r
8230         }\r
8231 \r
8232         b = LvInsertStart();\r
8233 \r
8234         CmPrintStatusToListView(b, &t.Status);\r
8235 \r
8236         LvInsertEnd(b, hWnd, L_STATUS);\r
8237 \r
8238         FreeRpcLinkStatus(&t);\r
8239 \r
8240         return true;\r
8241 }\r
8242 \r
8243 // リンクの編集\r
8244 bool SmLinkEdit(HWND hWnd, SM_HUB *s, wchar_t *name)\r
8245 {\r
8246         CM_ACCOUNT a;\r
8247         RPC_CREATE_LINK t;\r
8248         bool ret = false;\r
8249         // 引数チェック\r
8250         if (hWnd == NULL || s == NULL || name == NULL)\r
8251         {\r
8252                 return false;\r
8253         }\r
8254 \r
8255         Zero(&a, sizeof(a));\r
8256         Zero(&t, sizeof(t));\r
8257 \r
8258         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8259         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
8260         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), name);\r
8261 \r
8262         if (CALL(hWnd, ScGetLink(s->Rpc, &t)) == false)\r
8263         {\r
8264                 return false;\r
8265         }\r
8266 \r
8267         a.Hub = s;\r
8268         a.EditMode = true;\r
8269         a.LinkMode = true;\r
8270         a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
8271         a.OnlineFlag = t.Online;\r
8272         Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION));\r
8273         a.ClientAuth = CopyClientAuth(t.ClientAuth);\r
8274         Copy(&a.Policy, &t.Policy, sizeof(POLICY));\r
8275         a.CheckServerCert = t.CheckServerCert;\r
8276         a.ServerCert = CloneX(t.ServerCert);\r
8277         a.HideTrustCert = GetCapsBool(s->p->CapsList, "b_support_config_hub");\r
8278         FreeRpcCreateLink(&t);\r
8279 \r
8280         a.PolicyVer = s->p->PolicyVer;\r
8281 \r
8282         if (GetCapsBool(s->p->CapsList, "b_support_cascade_client_cert") == false)\r
8283         {\r
8284                 a.HideClientCertAuth = true;\r
8285         }\r
8286 \r
8287         a.HideSecureAuth = true;\r
8288 \r
8289         ret = CmEditAccountDlg(hWnd, &a);\r
8290 \r
8291         FreeX(a.ServerCert);\r
8292         Free(a.ClientOption);\r
8293         CiFreeClientAuth(a.ClientAuth);\r
8294 \r
8295         return ret;\r
8296 }\r
8297 \r
8298 // 新しいリンクの作成\r
8299 bool SmLinkCreate(HWND hWnd, SM_HUB *s)\r
8300 {\r
8301         return SmLinkCreateEx(hWnd, s, false);\r
8302 }\r
8303 bool SmLinkCreateEx(HWND hWnd, SM_HUB *s, bool connectNow)\r
8304 {\r
8305         CM_ACCOUNT a;\r
8306         bool ret = false;;\r
8307         // 引数チェック\r
8308         if (hWnd == NULL || s == NULL)\r
8309         {\r
8310                 return false;\r
8311         }\r
8312 \r
8313         Zero(&a, sizeof(a));\r
8314 \r
8315         a.Hub = s;\r
8316         a.EditMode = false;\r
8317         a.LinkMode = true;\r
8318         a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
8319         a.OnlineFlag = false;\r
8320         a.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));\r
8321         a.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;\r
8322         Copy(&a.Policy, GetDefaultPolicy(), sizeof(POLICY));\r
8323         a.ClientOption->Port = 443;     // デフォルトポート番号\r
8324         a.ClientOption->NumRetry = INFINITE;\r
8325         a.ClientOption->RetryInterval = 15;\r
8326         a.ClientOption->MaxConnection = 8;\r
8327         a.ClientOption->UseEncrypt = true;\r
8328         a.ClientOption->HalfConnection = false;\r
8329         a.ClientOption->AdditionalConnectionInterval = 1;\r
8330         a.ClientOption->RequireBridgeRoutingMode = true;\r
8331         a.Link_ConnectNow = connectNow;\r
8332 \r
8333         a.PolicyVer = s->p->PolicyVer;\r
8334 \r
8335         if (GetCapsBool(s->p->CapsList, "b_support_cascade_client_cert") == false)\r
8336         {\r
8337                 a.HideClientCertAuth = true;\r
8338         }\r
8339 \r
8340         a.HideSecureAuth = true;\r
8341 \r
8342         ret = CmEditAccountDlg(hWnd, &a);\r
8343 \r
8344         FreeX(a.ServerCert);\r
8345         Free(a.ClientOption);\r
8346         CiFreeClientAuth(a.ClientAuth);\r
8347 \r
8348         return ret;\r
8349 }\r
8350 \r
8351 // 初期化\r
8352 void SmLinkDlgInit(HWND hWnd, SM_HUB *s)\r
8353 {\r
8354         // 引数チェック\r
8355         if (hWnd == NULL || s == NULL)\r
8356         {\r
8357                 return;\r
8358         }\r
8359 \r
8360         SetIcon(hWnd, 0, ICO_LINK);\r
8361 \r
8362         FormatText(hWnd, 0, s->HubName);\r
8363 \r
8364         LvInit(hWnd, L_LINK);\r
8365 \r
8366         LvInsertColumn(hWnd, L_LINK, 0, _UU("SM_LINK_COLUMN_1"), 120);\r
8367         LvInsertColumn(hWnd, L_LINK, 1, _UU("SM_LINK_COLUMN_2"), 150);\r
8368         LvInsertColumn(hWnd, L_LINK, 2, _UU("SM_LINK_COLUMN_3"), 180);\r
8369         LvInsertColumn(hWnd, L_LINK, 3, _UU("SM_LINK_COLUMN_4"), 130);\r
8370         LvInsertColumn(hWnd, L_LINK, 4, _UU("SM_LINK_COLUMN_5"), 130);\r
8371 \r
8372         LvSetStyle(hWnd, L_LINK, LVS_EX_GRIDLINES);\r
8373 \r
8374         SmLinkDlgRefresh(hWnd, s);\r
8375 }\r
8376 \r
8377 // コントロール更新\r
8378 void SmLinkDlgUpdate(HWND hWnd, SM_HUB *s)\r
8379 {\r
8380         bool ok = true;\r
8381         bool online = false;\r
8382         // 引数チェック\r
8383         if (hWnd == NULL || s == NULL)\r
8384         {\r
8385                 return;\r
8386         }\r
8387 \r
8388         if (LvIsSelected(hWnd, L_LINK) == false || LvIsMultiMasked(hWnd, L_LINK))\r
8389         {\r
8390                 ok = false;\r
8391         }\r
8392         else\r
8393         {\r
8394                 online = (bool)LvGetParam(hWnd, L_LINK, LvGetSelected(hWnd, L_LINK));\r
8395         }\r
8396 \r
8397         SetEnable(hWnd, B_EDIT, ok);\r
8398         SetEnable(hWnd, B_ONLINE, ok && (online == false));\r
8399         SetEnable(hWnd, B_OFFLINE, ok && online);\r
8400         SetEnable(hWnd, IDOK, ok && online);\r
8401         SetEnable(hWnd, B_DELETE, ok);\r
8402         SetEnable(hWnd, B_RENAME, ok);\r
8403 }\r
8404 \r
8405 // 内容更新\r
8406 void SmLinkDlgRefresh(HWND hWnd, SM_HUB *s)\r
8407 {\r
8408         LVB *b;\r
8409         RPC_ENUM_LINK t;\r
8410         UINT i;\r
8411         // 引数チェック\r
8412         if (hWnd == NULL || s == NULL)\r
8413         {\r
8414                 return;\r
8415         }\r
8416 \r
8417         Zero(&t, sizeof(t));\r
8418         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8419         if (CALL(hWnd, ScEnumLink(s->Rpc, &t)) == false)\r
8420         {\r
8421                 EndDialog(hWnd, false);\r
8422                 return;\r
8423         }\r
8424 \r
8425         b = LvInsertStart();\r
8426 \r
8427         for (i = 0;i < t.NumLink;i++)\r
8428         {\r
8429                 RPC_ENUM_LINK_ITEM *e = &t.Links[i];\r
8430                 wchar_t tmp1[MAX_SIZE];\r
8431                 wchar_t tmp2[MAX_SIZE];\r
8432                 wchar_t tmp3[MAX_SIZE];\r
8433                 wchar_t tmp4[MAX_SIZE];\r
8434                 UINT icon = ICO_CASCADE;\r
8435 \r
8436                 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);\r
8437                 StrToUni(tmp2, sizeof(tmp2), e->Hostname);\r
8438                 StrToUni(tmp3, sizeof(tmp3), e->HubName);\r
8439 \r
8440                 if (e->Online == false)\r
8441                 {\r
8442                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));\r
8443                 }\r
8444                 else\r
8445                 {\r
8446                         if (e->Connected)\r
8447                         {\r
8448                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));\r
8449                         }\r
8450                         else\r
8451                         {\r
8452                                 if (e->LastError != 0)\r
8453                                 {\r
8454                                         UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));\r
8455                                 }\r
8456                                 else\r
8457                                 {\r
8458                                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));\r
8459                                 }\r
8460                         }\r
8461                 }\r
8462 \r
8463                 if (e->Online == false)\r
8464                 {\r
8465                         icon = ICO_CASCADE_OFFLINE;\r
8466                 }\r
8467                 else\r
8468                 {\r
8469                         if (e->Connected == false && e->LastError != 0)\r
8470                         {\r
8471                                 icon = ICO_CASCADE_ERROR;\r
8472                         }\r
8473                         else\r
8474                         {\r
8475                                 icon = ICO_CASCADE;\r
8476                         }\r
8477                 }\r
8478 \r
8479                 LvInsertAdd(b,\r
8480                         icon, (void *)e->Online, 5,\r
8481                         e->AccountName, tmp4, tmp1, tmp2, tmp3);\r
8482         }\r
8483 \r
8484         LvInsertEnd(b, hWnd, L_LINK);\r
8485 \r
8486         FreeRpcEnumLink(&t);\r
8487 \r
8488         SmLinkDlgUpdate(hWnd, s);\r
8489 }\r
8490 \r
8491 \r
8492 // リンク一覧ダイアログプロシージャ\r
8493 UINT SmLinkDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
8494 {\r
8495         SM_HUB *s = (SM_HUB *)param;\r
8496         wchar_t *str;\r
8497         NMHDR *n;\r
8498         NMLVDISPINFOW *disp_info;\r
8499         NMLVKEYDOWN *key;\r
8500         // 引数チェック\r
8501         if (hWnd == NULL)\r
8502         {\r
8503                 return 0;\r
8504         }\r
8505 \r
8506         str = LvGetSelectedStr(hWnd, L_LINK, 0);\r
8507 \r
8508         switch (msg)\r
8509         {\r
8510         case WM_INITDIALOG:\r
8511                 // 初期化\r
8512                 SmLinkDlgInit(hWnd, s);\r
8513 \r
8514                 if (link_create_now)\r
8515                 {\r
8516                         if (SmLinkCreateEx(hWnd, s, true))\r
8517                         {\r
8518                                 SmLinkDlgRefresh(hWnd, s);\r
8519                         }\r
8520                 }\r
8521 \r
8522                 SetTimer(hWnd, 1, 1000, NULL);\r
8523                 break;\r
8524 \r
8525         case WM_TIMER:\r
8526                 switch (wParam)\r
8527                 {\r
8528                 case 1:\r
8529                         KillTimer(hWnd, 1);\r
8530                         SmLinkDlgRefresh(hWnd, s);\r
8531                         SetTimer(hWnd, 1, 1000, NULL);\r
8532                         break;\r
8533                 }\r
8534                 break;\r
8535 \r
8536         case WM_COMMAND:\r
8537                 switch (wParam)\r
8538                 {\r
8539                 case B_CREATE:\r
8540                         // 新規作成\r
8541                         if (SmLinkCreate(hWnd, s))\r
8542                         {\r
8543                                 SmLinkDlgRefresh(hWnd, s);\r
8544                         }\r
8545                         break;\r
8546 \r
8547                 case B_EDIT:\r
8548                         // 編集\r
8549                         if (str != NULL)\r
8550                         {\r
8551                                 if (SmLinkEdit(hWnd, s, str))\r
8552                                 {\r
8553                                         SmLinkDlgRefresh(hWnd, s);\r
8554                                 }\r
8555                         }\r
8556                         break;\r
8557 \r
8558                 case B_ONLINE:\r
8559                         // オンライン\r
8560                         if (str != NULL)\r
8561                         {\r
8562                                 RPC_LINK t;\r
8563                                 Zero(&t, sizeof(t));\r
8564                                 UniStrCpy(t.AccountName, sizeof(t.AccountName), str);\r
8565                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8566 \r
8567                                 if (CALL(hWnd, ScSetLinkOnline(s->Rpc, &t)))\r
8568                                 {\r
8569                                         SmLinkDlgRefresh(hWnd, s);\r
8570                                 }\r
8571                         }\r
8572                         break;\r
8573 \r
8574                 case B_OFFLINE:\r
8575                         // オフライン\r
8576                         if (str != NULL)\r
8577                         {\r
8578                                 RPC_LINK t;\r
8579                                 Zero(&t, sizeof(t));\r
8580                                 UniStrCpy(t.AccountName, sizeof(t.AccountName), str);\r
8581                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8582 \r
8583                                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2,\r
8584                                         _UU("SM_LINK_OFFLINE_MSG"), t.AccountName) == IDYES)\r
8585                                 {\r
8586                                         if (CALL(hWnd, ScSetLinkOffline(s->Rpc, &t)))\r
8587                                         {\r
8588                                                 SmLinkDlgRefresh(hWnd, s);\r
8589                                         }\r
8590                                 }\r
8591                         }\r
8592                         break;\r
8593 \r
8594                 case IDOK:\r
8595                         // 状態\r
8596                         if (str != NULL)\r
8597                         {\r
8598                                 wchar_t tmp[MAX_SIZE];\r
8599                                 SM_LINK t;\r
8600                                 Zero(&t, sizeof(t));\r
8601                                 t.Hub = s;\r
8602                                 t.AccountName = str;\r
8603                                 UniFormat(tmp, sizeof(tmp), _UU("SM_LINK_STATUS_CAPTION"), str);\r
8604                                 SmStatusDlg(hWnd, s->p, &t, true, true, tmp,\r
8605                                         ICO_CASCADE, NULL, SmRefreshLinkStatus);\r
8606                         }\r
8607                         break;\r
8608 \r
8609                 case B_DELETE:\r
8610                         // 削除\r
8611                         if (str != NULL)\r
8612                         {\r
8613                                 RPC_LINK t;\r
8614                                 Zero(&t, sizeof(t));\r
8615                                 UniStrCpy(t.AccountName, sizeof(t.AccountName), str);\r
8616                                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8617 \r
8618                                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2,\r
8619                                         _UU("SM_LINK_DELETE_MSG"), t.AccountName) == IDYES)\r
8620                                 {\r
8621                                         if (CALL(hWnd, ScDeleteLink(s->Rpc, &t)))\r
8622                                         {\r
8623                                                 SmLinkDlgRefresh(hWnd, s);\r
8624                                         }\r
8625                                 }\r
8626                         }\r
8627                         break;\r
8628 \r
8629                 case B_REFRESH:\r
8630                         // 更新\r
8631                         SmLinkDlgRefresh(hWnd, s);\r
8632                         break;\r
8633 \r
8634                 case IDCANCEL:\r
8635                         // キャンセルボタン\r
8636                         Close(hWnd);\r
8637                         break;\r
8638 \r
8639                 case B_RENAME:\r
8640                         // 名前の変更\r
8641                         Focus(hWnd, L_LINK);\r
8642                         LvRename(hWnd, L_LINK, LvGetSelected(hWnd, L_LINK));\r
8643                         break;\r
8644                 }\r
8645                 break;\r
8646 \r
8647         case WM_NOTIFY:\r
8648                 n = (NMHDR *)lParam;\r
8649                 switch (n->idFrom)\r
8650                 {\r
8651                 case L_LINK:\r
8652                         switch (n->code)\r
8653                         {\r
8654                         case LVN_ITEMCHANGED:\r
8655                                 // 選択状態の変更\r
8656                                 SmLinkDlgUpdate(hWnd, s);\r
8657                                 break;\r
8658 \r
8659                         case LVN_ENDLABELEDITW:\r
8660                                 // 名前の変更\r
8661                                 disp_info = (NMLVDISPINFOW *)n;\r
8662                                 if (disp_info->item.pszText != NULL)\r
8663                                 {\r
8664                                         wchar_t *new_name = disp_info->item.pszText;\r
8665                                         wchar_t *old_name = LvGetStr(hWnd, L_LINK, disp_info->item.iItem, 0);\r
8666 \r
8667                                         if (old_name != NULL)\r
8668                                         {\r
8669                                                 if (UniStrCmp(new_name, old_name) != 0 && UniIsEmptyStr(new_name) == false)\r
8670                                                 {\r
8671                                                         RPC_RENAME_LINK t;\r
8672                                                         Zero(&t, sizeof(t));\r
8673                                                         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8674                                                         UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), old_name);\r
8675                                                         UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), new_name);\r
8676                                                         if (CALL(hWnd, ScRenameLink(s->Rpc, &t)))\r
8677                                                         {\r
8678                                                                 SmLinkDlgRefresh(hWnd, s);\r
8679                                                         }\r
8680                                                 }\r
8681 \r
8682                                                 Free(old_name);\r
8683                                         }\r
8684                                 }\r
8685                                 break;\r
8686 \r
8687                         case LVN_KEYDOWN:\r
8688                                 // キー押下\r
8689                                 key = (NMLVKEYDOWN *)n;\r
8690                                 if (key != NULL)\r
8691                                 {\r
8692                                         bool ctrl, alt;\r
8693                                         UINT code = key->wVKey;\r
8694                                         ctrl = (GetKeyState(VK_CONTROL) & 0x8000) == 0 ? false : true;\r
8695                                         alt = (GetKeyState(VK_MENU) & 0x8000) == 0 ? false : true;\r
8696 \r
8697                                         if (code == VK_F2)\r
8698                                         {\r
8699                                                 Command(hWnd, B_RENAME);\r
8700                                         }\r
8701                                 }\r
8702                                 break;\r
8703                         }\r
8704                         break;\r
8705                 }\r
8706                 break;\r
8707 \r
8708         case WM_CLOSE:\r
8709                 EndDialog(hWnd, false);\r
8710                 break;\r
8711         }\r
8712 \r
8713         Free(str);\r
8714 \r
8715         LvStandardHandler(hWnd, msg, wParam, lParam, L_LINK);\r
8716 \r
8717         return 0;\r
8718 }\r
8719 \r
8720 // リンク一覧ダイアログ\r
8721 void SmLinkDlg(HWND hWnd, SM_HUB *s)\r
8722 {\r
8723         SmLinkDlgEx(hWnd, s, false);\r
8724 }\r
8725 void SmLinkDlgEx(HWND hWnd, SM_HUB *s, bool createNow)\r
8726 {\r
8727         // 引数チェック\r
8728         if (hWnd == NULL || s == NULL)\r
8729         {\r
8730                 return;\r
8731         }\r
8732 \r
8733         link_create_now = createNow;\r
8734 \r
8735         Dialog(hWnd, D_SM_LINK, SmLinkDlgProc, s);\r
8736 }\r
8737 \r
8738 // 初期化\r
8739 void SmRadiusDlgInit(HWND hWnd, SM_HUB *s)\r
8740 {\r
8741         RPC_RADIUS t;\r
8742         // 引数チェック\r
8743         if (hWnd == NULL || s == NULL)\r
8744         {\r
8745                 return;\r
8746         }\r
8747 \r
8748         SetIcon(hWnd, 0, ICO_TOWER);\r
8749 \r
8750         FormatText(hWnd, S_TITLE, s->HubName);\r
8751         FormatText(hWnd, S_RADIUS_7, RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT);\r
8752 \r
8753         Zero(&t, sizeof(t));\r
8754         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8755 \r
8756         if (CALL(hWnd, ScGetHubRadius(s->Rpc, &t)) == false)\r
8757         {\r
8758                 EndDialog(hWnd, false);\r
8759                 return;\r
8760         }\r
8761 \r
8762         Check(hWnd, R_USE_RADIUS, StrLen(t.RadiusServerName) != 0);\r
8763 \r
8764         if (StrLen(t.RadiusServerName) != 0)\r
8765         {\r
8766                 SetTextA(hWnd, E_HOSTNAME, t.RadiusServerName);\r
8767                 SetIntEx(hWnd, E_PORT, t.RadiusPort);\r
8768                 SetTextA(hWnd, E_SECRET1, t.RadiusSecret);\r
8769                 SetTextA(hWnd, E_SECRET2, t.RadiusSecret);\r
8770                 SetIntEx(hWnd, E_RADIUS_RETRY_INTERVAL, t.RadiusRetryInterval);\r
8771                 FocusEx(hWnd, E_HOSTNAME);\r
8772         }\r
8773         else\r
8774         {\r
8775                 SetInt(hWnd, E_PORT, RADIUS_DEFAULT_PORT);\r
8776                 SetInt(hWnd, E_RADIUS_RETRY_INTERVAL, RADIUS_RETRY_INTERVAL);\r
8777         }\r
8778 \r
8779         SmRadiusDlgUpdate(hWnd, s);\r
8780 }\r
8781 \r
8782 // コントロール更新\r
8783 void SmRadiusDlgUpdate(HWND hWnd, SM_HUB *s)\r
8784 {\r
8785         bool ok = true;\r
8786         bool b, b1;\r
8787         char tmp1[MAX_SIZE];\r
8788         char tmp2[MAX_SIZE];\r
8789         // 引数チェック\r
8790         if (hWnd == NULL || s == NULL)\r
8791         {\r
8792                 return;\r
8793         }\r
8794 \r
8795         b1 = GetCapsBool(s->p->CapsList, "b_support_radius_retry_interval_and_several_servers");\r
8796         if(b1 == false)\r
8797         {\r
8798                 Hide(hWnd, S_RADIUS_7);\r
8799                 Hide(hWnd, S_RADIUS_8);\r
8800                 Hide(hWnd, S_RADIUS_9);\r
8801                 Hide(hWnd, E_RADIUS_RETRY_INTERVAL);\r
8802         }\r
8803 \r
8804         b = IsChecked(hWnd, R_USE_RADIUS);\r
8805 \r
8806         SetEnable(hWnd, S_RADIUS_1, b);\r
8807         SetEnable(hWnd, S_RADIUS_2, b);\r
8808         SetEnable(hWnd, S_RADIUS_3, b);\r
8809         SetEnable(hWnd, S_RADIUS3, b);\r
8810         SetEnable(hWnd, S_RADIUS_4, b);\r
8811         SetEnable(hWnd, S_RADIUS_5, b);\r
8812         SetEnable(hWnd, S_RADIUS_6, b);\r
8813         SetEnable(hWnd, S_RADIUS_7, b);\r
8814         SetEnable(hWnd, S_RADIUS_8, b);\r
8815         SetEnable(hWnd, S_RADIUS_9, b);\r
8816         SetEnable(hWnd, E_HOSTNAME, b);\r
8817         SetEnable(hWnd, E_PORT, b);\r
8818         SetEnable(hWnd, E_SECRET1, b);\r
8819         SetEnable(hWnd, E_SECRET2, b);\r
8820         SetEnable(hWnd, E_RADIUS_RETRY_INTERVAL, b);\r
8821 \r
8822         if (b)\r
8823         {\r
8824                 UINT p, m;\r
8825                 GetTxtA(hWnd, E_SECRET1, tmp1, sizeof(tmp1));\r
8826                 GetTxtA(hWnd, E_SECRET2, tmp2, sizeof(tmp2));\r
8827 \r
8828                 if (StrCmp(tmp1, tmp2) != 0)\r
8829                 {\r
8830                         ok = false;\r
8831                 }\r
8832 \r
8833                 if (IsEmpty(hWnd, E_HOSTNAME))\r
8834                 {\r
8835                         ok = false;\r
8836                 }\r
8837 \r
8838                 p = GetInt(hWnd, E_PORT);\r
8839 \r
8840                 if (p == 0 || p >= 65536)\r
8841                 {\r
8842                         ok = false;\r
8843                 }\r
8844 \r
8845                 m = GetInt(hWnd, E_RADIUS_RETRY_INTERVAL);\r
8846                 if (m > RADIUS_RETRY_TIMEOUT || m < RADIUS_RETRY_INTERVAL)\r
8847                 {\r
8848                         ok = false;\r
8849                 }\r
8850         }\r
8851 \r
8852         SetEnable(hWnd, IDOK, ok);\r
8853 }\r
8854 \r
8855 // OK ボタン\r
8856 void SmRadiusDlgOnOk(HWND hWnd, SM_HUB *s)\r
8857 {\r
8858         RPC_RADIUS t;\r
8859         // 引数チェック\r
8860         if (hWnd == NULL || s == NULL)\r
8861         {\r
8862                 return;\r
8863         }\r
8864 \r
8865         Zero(&t, sizeof(t));\r
8866         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
8867 \r
8868         if (IsChecked(hWnd, R_USE_RADIUS))\r
8869         {\r
8870                 GetTxtA(hWnd, E_HOSTNAME, t.RadiusServerName, sizeof(t.RadiusServerName));\r
8871                 t.RadiusPort = GetInt(hWnd, E_PORT);\r
8872                 GetTxtA(hWnd, E_SECRET1,t.RadiusSecret, sizeof(t.RadiusSecret));\r
8873                 t.RadiusRetryInterval = GetInt(hWnd, E_RADIUS_RETRY_INTERVAL);\r
8874         }\r
8875 \r
8876         if (CALL(hWnd, ScSetHubRadius(s->Rpc, &t)) == false)\r
8877         {\r
8878                 return;\r
8879         }\r
8880 \r
8881         EndDialog(hWnd, true);\r
8882 }\r
8883 \r
8884 \r
8885 // Radius ダイアログ プロシージャ\r
8886 UINT SmRadiusDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
8887 {\r
8888         SM_HUB *s = (SM_HUB *)param;\r
8889         // 引数チェック\r
8890         if (hWnd == NULL)\r
8891         {\r
8892                 return 0;\r
8893         }\r
8894 \r
8895         switch (msg)\r
8896         {\r
8897         case WM_INITDIALOG:\r
8898                 // 初期化\r
8899                 SmRadiusDlgInit(hWnd, s);\r
8900                 break;\r
8901 \r
8902         case WM_COMMAND:\r
8903                 switch (LOWORD(wParam))\r
8904                 {\r
8905                 case E_HOSTNAME:\r
8906                 case E_PORT:\r
8907                 case E_SECRET1:\r
8908                 case E_SECRET2:\r
8909                 case E_RADIUS_RETRY_INTERVAL:\r
8910                 case R_USE_RADIUS:\r
8911                         SmRadiusDlgUpdate(hWnd, s);\r
8912                         break;\r
8913                 }\r
8914 \r
8915                 switch (wParam)\r
8916                 {\r
8917                 case IDOK:\r
8918                         // OK ボタン\r
8919                         SmRadiusDlgOnOk(hWnd, s);\r
8920                         break;\r
8921 \r
8922                 case IDCANCEL:\r
8923                         // キャンセルボタン\r
8924                         Close(hWnd);\r
8925                         break;\r
8926 \r
8927                 case R_USE_RADIUS:\r
8928                         if (IsChecked(hWnd, R_USE_RADIUS))\r
8929                         {\r
8930                                 FocusEx(hWnd, E_HOSTNAME);\r
8931                         }\r
8932                         break;\r
8933                 }\r
8934                 break;\r
8935 \r
8936         case WM_CLOSE:\r
8937                 EndDialog(hWnd, false);\r
8938                 break;\r
8939         }\r
8940 \r
8941         return 0;\r
8942 }\r
8943 \r
8944 // Radius 設定ダイアログ\r
8945 void SmRadiusDlg(HWND hWnd, SM_HUB *s)\r
8946 {\r
8947         // 引数チェック\r
8948         if (hWnd == NULL || s == NULL)\r
8949         {\r
8950                 return;\r
8951         }\r
8952 \r
8953         Dialog(hWnd, D_SM_RADIUS, SmRadiusDlgProc, s);\r
8954 }\r
8955 \r
8956 \r
8957 // 初期化\r
8958 void SmEditAccessInit(HWND hWnd, SM_EDIT_ACCESS *s)\r
8959 {\r
8960         ACCESS *a;\r
8961         wchar_t tmp[MAX_SIZE];\r
8962         // 引数チェック\r
8963         if (hWnd == NULL || s == NULL)\r
8964         {\r
8965                 return;\r
8966         }\r
8967 \r
8968         SetIcon(hWnd, 0, ICO_PASS);\r
8969 \r
8970         GetTxt(hWnd, 0, tmp, sizeof(tmp));\r
8971 \r
8972         UniStrCat(tmp, sizeof(tmp), s->Access->IsIPv6 ? L" (IPv6)" : L" (IPv4)");\r
8973 \r
8974         SetText(hWnd, 0, tmp);\r
8975 \r
8976         s->Inited = false;\r
8977         a = s->Access;\r
8978 \r
8979         SetText(hWnd, E_NOTE, a->Note);\r
8980 \r
8981         Check(hWnd, R_DISCARD, a->Discard);\r
8982         Check(hWnd, R_PASS, a->Discard == false);\r
8983         SetIntEx(hWnd, E_PRIORITY, a->Priority);\r
8984 \r
8985         if (a->IsIPv6 == false)\r
8986         {\r
8987                 // IPv4\r
8988                 if (a->SrcIpAddress == 0 && a->SrcSubnetMask == 0)\r
8989                 {\r
8990                         Check(hWnd, R_SRC_ALL, true);\r
8991                 }\r
8992                 else\r
8993                 {\r
8994                         IpSet(hWnd, E_SRC_IP, a->SrcIpAddress);\r
8995                         IpSet(hWnd, E_SRC_MASK, a->SrcSubnetMask);\r
8996                 }\r
8997 \r
8998                 if (a->DestIpAddress == 0 && a->DestSubnetMask == 0)\r
8999                 {\r
9000                         Check(hWnd, R_DST_ALL, true);\r
9001                 }\r
9002                 else\r
9003                 {\r
9004                         IpSet(hWnd, E_DST_IP, a->DestIpAddress);\r
9005                         IpSet(hWnd, E_DST_MASK, a->DestSubnetMask);\r
9006                 }\r
9007         }\r
9008         else\r
9009         {\r
9010                 // IPv6\r
9011                 if (IsZeroIP6Addr(&a->SrcIpAddress6) && IsZeroIP6Addr(&a->SrcSubnetMask6))\r
9012                 {\r
9013                         Check(hWnd, R_SRC_ALL, true);\r
9014                 }\r
9015                 else\r
9016                 {\r
9017                         char tmp[MAX_SIZE];\r
9018 \r
9019                         IP6AddrToStr(tmp, sizeof(tmp), &a->SrcIpAddress6);\r
9020                         SetTextA(hWnd, E_SRC_IP_V6, tmp);\r
9021 \r
9022                         Mask6AddrToStrEx(tmp, sizeof(tmp), &a->SrcSubnetMask6, false);\r
9023 \r
9024                         if (IsNum(tmp))\r
9025                         {\r
9026                                 StrCatLeft(tmp, sizeof(tmp), "/");\r
9027                         }\r
9028 \r
9029                         SetTextA(hWnd, E_SRC_MASK_V6, tmp);\r
9030                 }\r
9031 \r
9032                 if (IsZeroIP6Addr(&a->DestIpAddress6) && IsZeroIP6Addr(&a->DestSubnetMask6))\r
9033                 {\r
9034                         Check(hWnd, R_DST_ALL, true);\r
9035                 }\r
9036                 else\r
9037                 {\r
9038                         char tmp[MAX_SIZE];\r
9039 \r
9040                         IP6AddrToStr(tmp, sizeof(tmp), &a->DestIpAddress6);\r
9041                         SetTextA(hWnd, E_DST_IP_V6, tmp);\r
9042 \r
9043                         Mask6AddrToStrEx(tmp, sizeof(tmp), &a->DestSubnetMask6, false);\r
9044 \r
9045                         if (IsNum(tmp))\r
9046                         {\r
9047                                 StrCatLeft(tmp, sizeof(tmp), "/");\r
9048                         }\r
9049 \r
9050                         SetTextA(hWnd, E_DST_MASK_V6, tmp);\r
9051                 }\r
9052         }\r
9053 \r
9054         CbSetHeight(hWnd, C_PROTOCOL, 18);\r
9055         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_1"), 0);\r
9056         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_2"), 0);\r
9057         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_3"), 0);\r
9058         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_4"), 0);\r
9059         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_5"), 0);\r
9060         CbAddStr(hWnd, C_PROTOCOL, _UU("SM_ACCESS_PROTO_6"), 0);\r
9061 \r
9062         switch (a->Protocol)\r
9063         {\r
9064         case 0:\r
9065                 CbSelectIndex(hWnd, C_PROTOCOL, 0);\r
9066                 break;\r
9067         case 6:\r
9068                 CbSelectIndex(hWnd, C_PROTOCOL, 1);\r
9069                 break;\r
9070         case 17:\r
9071                 CbSelectIndex(hWnd, C_PROTOCOL, 2);\r
9072                 break;\r
9073         case 1:\r
9074                 CbSelectIndex(hWnd, C_PROTOCOL, 3);\r
9075                 break;\r
9076         case 58:\r
9077                 CbSelectIndex(hWnd, C_PROTOCOL, 4);\r
9078                 break;\r
9079         default:\r
9080                 CbSelectIndex(hWnd, C_PROTOCOL, 5);\r
9081                 break;\r
9082         }\r
9083 \r
9084         Check(hWnd, R_DISABLE, a->Active ? false : true);\r
9085 \r
9086         SetIntEx(hWnd, E_IP_PROTO, a->Protocol);\r
9087 \r
9088         SetIntEx(hWnd, E_SRC_PORT_1, a->SrcPortStart);\r
9089         SetIntEx(hWnd, E_SRC_PORT_2, a->SrcPortEnd);\r
9090         SetIntEx(hWnd, E_DST_PORT_1, a->DestPortStart);\r
9091         SetIntEx(hWnd, E_DST_PORT_2, a->DestPortEnd);\r
9092 \r
9093         SetTextA(hWnd, E_USERNAME1, a->SrcUsername);\r
9094         SetTextA(hWnd, E_USERNAME2, a->DestUsername);\r
9095 \r
9096         if(a->CheckSrcMac != false)\r
9097         {\r
9098                 char mac[MAX_SIZE], mask[MAX_SIZE];\r
9099                 MacToStr(mac, sizeof(mac), a->SrcMacAddress);\r
9100                 MacToStr(mask, sizeof(mask), a->SrcMacMask);\r
9101                 SetTextA(hWnd, E_SRC_MAC, mac); \r
9102                 SetTextA(hWnd, E_SRC_MAC_MASK, mask);\r
9103         }\r
9104         if(a->CheckDstMac != false)\r
9105         {\r
9106                 char mac[MAX_SIZE], mask[MAX_SIZE];\r
9107                 MacToStr(mac, sizeof(mac), a->DstMacAddress);\r
9108                 MacToStr(mask, sizeof(mask), a->DstMacMask);\r
9109                 SetTextA(hWnd, E_DST_MAC, mac); \r
9110                 SetTextA(hWnd, E_DST_MAC_MASK, mask);\r
9111         }\r
9112         Check(hWnd, R_CHECK_SRC_MAC, !a->CheckSrcMac);\r
9113         Check(hWnd, R_CHECK_DST_MAC, !a->CheckDstMac);\r
9114 \r
9115         Check(hWnd, R_CHECK_TCP_STATE, a->CheckTcpState);\r
9116         if(a->CheckTcpState != false)\r
9117         {\r
9118                 Check(hWnd, R_ESTABLISHED, a->Established);\r
9119                 Check(hWnd, R_UNESTABLISHED, !a->Established);\r
9120         }\r
9121 \r
9122         if (GetCapsBool(s->Hub->p->CapsList, "b_support_acl_group") == false)\r
9123         {\r
9124                 SetText(hWnd, S_STATIC11, _UU("D_SM_EDIT_ACCESS@STATIC11_OLD"));\r
9125                 SetText(hWnd, S_STATIC12, _UU("D_SM_EDIT_ACCESS@STATIC12_OLD"));\r
9126                 SetText(hWnd, S_STATIC15, _UU("D_SM_EDIT_ACCESS@STATIC15_OLD"));\r
9127         }\r
9128 \r
9129         s->Inited = true;\r
9130 \r
9131         SmEditAccessUpdate(hWnd, s);\r
9132 }\r
9133 \r
9134 // コントロール更新\r
9135 void SmEditAccessUpdate(HWND hWnd, SM_EDIT_ACCESS *s)\r
9136 {\r
9137         bool ok = true;\r
9138         bool tcp;\r
9139         bool b;\r
9140         bool check_srcmac, check_dstmac, support_mac;\r
9141         bool check_state, support_check_state;\r
9142         char srcmac[MAX_SIZE], srcmac_mask[MAX_SIZE], dstmac[MAX_SIZE], dstmac_mask[MAX_SIZE];\r
9143         char tmp[MAX_SIZE];\r
9144         wchar_t unitmp[MAX_SIZE];\r
9145         ACCESS *a;\r
9146         // 引数チェック\r
9147         if (hWnd == NULL || s == NULL)\r
9148         {\r
9149                 return;\r
9150         }\r
9151 \r
9152         if (s->Inited == false)\r
9153         {\r
9154                 return;\r
9155         }\r
9156 \r
9157         a = s->Access;\r
9158 \r
9159         GetTxt(hWnd, E_NOTE, a->Note, sizeof(a->Note));\r
9160 \r
9161         a->Discard = IsChecked(hWnd, R_DISCARD);\r
9162 \r
9163         a->Priority = GetInt(hWnd, E_PRIORITY);\r
9164         if (a->Priority == 0)\r
9165         {\r
9166                 ok = false;\r
9167         }\r
9168 \r
9169 \r
9170         b = IsChecked(hWnd, R_SRC_ALL) ? false : true;\r
9171         if (b == false)\r
9172         {\r
9173                 if (a->IsIPv6 == false)\r
9174                 {\r
9175                         a->SrcIpAddress = 0;\r
9176                         a->SrcSubnetMask = 0;\r
9177                 }\r
9178                 else\r
9179                 {\r
9180                         Zero(&a->SrcIpAddress6, sizeof(IPV6_ADDR));\r
9181                         Zero(&a->SrcSubnetMask6, sizeof(IPV6_ADDR));\r
9182                 }\r
9183         }\r
9184         else\r
9185         {\r
9186                 if (a->IsIPv6 == false)\r
9187                 {\r
9188                         if (IpIsFilled(hWnd, E_SRC_IP) == false || IpIsFilled(hWnd, E_SRC_MASK) == false)\r
9189                         {\r
9190                                 ok = false;\r
9191                         }\r
9192                         else\r
9193                         {\r
9194                                 a->SrcIpAddress = IpGet(hWnd, E_SRC_IP);\r
9195                                 a->SrcSubnetMask = IpGet(hWnd, E_SRC_MASK);\r
9196                         }\r
9197                 }\r
9198                 else\r
9199                 {\r
9200                         char tmp1[MAX_SIZE];\r
9201                         char tmp2[MAX_SIZE];\r
9202 \r
9203                         GetTxtA(hWnd, E_SRC_IP_V6, tmp1, sizeof(tmp1));\r
9204                         GetTxtA(hWnd, E_SRC_MASK_V6, tmp2, sizeof(tmp2));\r
9205 \r
9206                         if (StrToIP6Addr(&a->SrcIpAddress6, tmp1) == false ||\r
9207                                 StrToMask6Addr(&a->SrcSubnetMask6, tmp2) == false)\r
9208                         {\r
9209                                 ok = false;\r
9210                         }\r
9211                 }\r
9212         }\r
9213         SetEnable(hWnd, S_SRC_IP_1, b);\r
9214         SetEnable(hWnd, S_SRC_IP_2, b);\r
9215         SetEnable(hWnd, S_SRC_IP_3, b);\r
9216         SetEnable(hWnd, E_SRC_IP, b);\r
9217         SetEnable(hWnd, E_SRC_MASK, b);\r
9218         SetEnable(hWnd, E_SRC_IP_V6, b);\r
9219         SetEnable(hWnd, E_SRC_MASK_V6, b);\r
9220 \r
9221         b = IsChecked(hWnd, R_DST_ALL) ? false : true;\r
9222         if (b == false)\r
9223         {\r
9224                 if (a->IsIPv6 == false)\r
9225                 {\r
9226                         a->DestIpAddress = 0;\r
9227                         a->DestSubnetMask = 0;\r
9228                 }\r
9229                 else\r
9230                 {\r
9231                         Zero(&a->DestIpAddress6, sizeof(IPV6_ADDR));\r
9232                         Zero(&a->DestSubnetMask6, sizeof(IPV6_ADDR));\r
9233                 }\r
9234         }\r
9235         else\r
9236         {\r
9237                 if (a->IsIPv6 == false)\r
9238                 {\r
9239                         if (IpIsFilled(hWnd, E_DST_IP) == false || IpIsFilled(hWnd, E_DST_MASK) == false)\r
9240                         {\r
9241                                 ok = false;\r
9242                         }\r
9243                         else\r
9244                         {\r
9245                                 a->DestIpAddress = IpGet(hWnd, E_DST_IP);\r
9246                                 a->DestSubnetMask = IpGet(hWnd, E_DST_MASK);\r
9247                         }\r
9248                 }\r
9249                 else\r
9250                 {\r
9251                         char tmp1[MAX_SIZE];\r
9252                         char tmp2[MAX_SIZE];\r
9253 \r
9254                         GetTxtA(hWnd, E_DST_IP_V6, tmp1, sizeof(tmp1));\r
9255                         GetTxtA(hWnd, E_DST_MASK_V6, tmp2, sizeof(tmp2));\r
9256 \r
9257                         if (StrToIP6Addr(&a->DestIpAddress6, tmp1) == false ||\r
9258                                 StrToMask6Addr(&a->DestSubnetMask6, tmp2) == false)\r
9259                         {\r
9260                                 ok = false;\r
9261                         }\r
9262                 }\r
9263         }\r
9264         SetEnable(hWnd, S_IP_DST_1, b);\r
9265         SetEnable(hWnd, S_IP_DST_2, b);\r
9266         SetEnable(hWnd, S_IP_DST_3, b);\r
9267         SetEnable(hWnd, E_DST_IP, b);\r
9268         SetEnable(hWnd, E_DST_MASK, b);\r
9269         SetEnable(hWnd, E_DST_IP_V6, b);\r
9270         SetEnable(hWnd, E_DST_MASK_V6, b);\r
9271 \r
9272         a->Protocol = GetInt(hWnd, C_PROTOCOL);\r
9273 \r
9274         GetTxtA(hWnd, C_PROTOCOL, tmp, sizeof(tmp));\r
9275         GetTxt(hWnd, C_PROTOCOL, unitmp, sizeof(unitmp));\r
9276 \r
9277         if (UniStrCmpi(unitmp, _UU("SM_ACCESS_PROTO_6")) == 0 || StrCmpi(tmp, _SS("SM_ACCESS_PROTO_6")) == 0)\r
9278         {\r
9279                 a->Protocol = GetInt(hWnd, E_IP_PROTO);\r
9280 \r
9281                 if (IsEmpty(hWnd, E_IP_PROTO))\r
9282                 {\r
9283                         ok = false;\r
9284                 }\r
9285 \r
9286                 Enable(hWnd, S_PROTOID);\r
9287                 Enable(hWnd, E_IP_PROTO);\r
9288         }\r
9289         else\r
9290         {\r
9291                 Disable(hWnd, E_IP_PROTO);\r
9292                 Disable(hWnd, S_PROTOID);\r
9293         }\r
9294 \r
9295         tcp = false;\r
9296         if (a->Protocol == 17 || a->Protocol == 6)\r
9297         {\r
9298                 tcp = true;\r
9299         }\r
9300 \r
9301         SetEnable(hWnd, S_TCP_1, tcp);\r
9302         SetEnable(hWnd, S_TCP_2, tcp);\r
9303         SetEnable(hWnd, S_TCP_3, tcp);\r
9304         SetEnable(hWnd, S_TCP_4, tcp);\r
9305         SetEnable(hWnd, S_TCP_5, tcp);\r
9306         SetEnable(hWnd, S_TCP_6, tcp);\r
9307         SetEnable(hWnd, S_TCP_7, tcp);\r
9308         SetEnable(hWnd, E_SRC_PORT_1, tcp);\r
9309         SetEnable(hWnd, E_SRC_PORT_2, tcp);\r
9310         SetEnable(hWnd, E_DST_PORT_1, tcp);\r
9311         SetEnable(hWnd, E_DST_PORT_2, tcp);\r
9312 \r
9313         if (tcp == false)\r
9314         {\r
9315                 a->SrcPortEnd = a->SrcPortStart = a->DestPortEnd = a->DestPortStart = 0;\r
9316         }\r
9317         else\r
9318         {\r
9319                 a->SrcPortStart = GetInt(hWnd, E_SRC_PORT_1);\r
9320                 a->SrcPortEnd = GetInt(hWnd, E_SRC_PORT_2);\r
9321                 a->DestPortStart = GetInt(hWnd, E_DST_PORT_1);\r
9322                 a->DestPortEnd = GetInt(hWnd, E_DST_PORT_2);\r
9323 \r
9324                 if (a->SrcPortStart != 0)\r
9325                 {\r
9326                         if (a->SrcPortEnd != 0)\r
9327                         {\r
9328                                 if (a->SrcPortStart > a->SrcPortEnd)\r
9329                                 {\r
9330                                         ok = false;\r
9331                                 }\r
9332                         }\r
9333                 }\r
9334                 else\r
9335                 {\r
9336                         if (a->SrcPortEnd != 0)\r
9337                         {\r
9338                                 ok = false;\r
9339                         }\r
9340                 }\r
9341 \r
9342                 if (a->DestPortStart != 0)\r
9343                 {\r
9344                         if (a->DestPortEnd != 0)\r
9345                         {\r
9346                                 if (a->DestPortStart > a->DestPortEnd)\r
9347                                 {\r
9348                                         ok = false;\r
9349                                 }\r
9350                         }\r
9351                 }\r
9352                 else\r
9353                 {\r
9354                         if (a->DestPortEnd != 0)\r
9355                         {\r
9356                                 ok = false;\r
9357                         }\r
9358                 }\r
9359 \r
9360                 if (a->DestPortEnd < a->DestPortStart)\r
9361                 {\r
9362                         a->DestPortEnd = a->DestPortStart;\r
9363                 }\r
9364 \r
9365                 if (a->SrcPortEnd < a->SrcPortStart)\r
9366                 {\r
9367                         a->SrcPortEnd = a->SrcPortStart;\r
9368                 }\r
9369         }\r
9370 \r
9371         a->SrcUsernameHash = a->DestUsernameHash = 0;\r
9372         GetTxtA(hWnd, E_USERNAME1, a->SrcUsername, sizeof(a->SrcUsername));\r
9373         GetTxtA(hWnd, E_USERNAME2, a->DestUsername, sizeof(a->DestUsername));\r
9374 \r
9375         Trim(a->SrcUsername);\r
9376         /*\r
9377         if (StrLen(a->SrcUsername) != 0)\r
9378         {\r
9379                 if (IsUserName(a->SrcUsername) == false)\r
9380                 {\r
9381                         ok = false;\r
9382                 }\r
9383         }*/\r
9384 \r
9385         Trim(a->DestUsername);\r
9386         /*\r
9387         if (StrLen(a->DestUsername) != 0)\r
9388         {\r
9389                 if (IsUserName(a->DestUsername) == false)\r
9390                 {\r
9391                         ok = false;\r
9392                 }\r
9393         }*/\r
9394 \r
9395         support_mac = GetCapsBool(s->Hub->p->CapsList, "b_support_check_mac");\r
9396 \r
9397         // 送信元 MAC アドレスの設定\r
9398         check_srcmac = a->CheckSrcMac = support_mac && (IsChecked(hWnd, R_CHECK_SRC_MAC) ? false : true);\r
9399         if(check_srcmac == false)\r
9400         {\r
9401                 Zero(a->SrcMacAddress, sizeof(a->SrcMacAddress));\r
9402                 Zero(a->SrcMacMask, sizeof(a->SrcMacMask));\r
9403         }\r
9404         else\r
9405         {\r
9406                 GetTxtA(hWnd, E_SRC_MAC, srcmac, sizeof(srcmac));\r
9407                 GetTxtA(hWnd, E_SRC_MAC_MASK, srcmac_mask, sizeof(srcmac_mask));\r
9408                 Trim(srcmac);\r
9409                 Trim(srcmac_mask);\r
9410                 if(StrLen(srcmac) != 0 && StrLen(srcmac_mask) != 0)\r
9411                 {\r
9412                         UCHAR mac[6], mask[6];\r
9413                         if(StrToMac(mac, srcmac) && StrToMac(mask, srcmac_mask))\r
9414                         {\r
9415                                 Copy(a->SrcMacAddress, mac, 6);\r
9416                                 Copy(a->SrcMacMask, mask, 6);\r
9417                         }\r
9418                         else\r
9419                         {\r
9420                                 ok = false;\r
9421                         }\r
9422                 }\r
9423                 else\r
9424                 {\r
9425                         ok = false;\r
9426                 }\r
9427         }\r
9428         SetEnable(hWnd, S_CHECK_SRC_MAC, support_mac);\r
9429         SetEnable(hWnd, R_CHECK_SRC_MAC, support_mac);\r
9430         SetEnable(hWnd, S_SRC_MAC, check_srcmac);\r
9431         SetEnable(hWnd, S_SRC_MAC_MASK, check_srcmac);\r
9432         SetEnable(hWnd, E_SRC_MAC, check_srcmac);\r
9433         SetEnable(hWnd, E_SRC_MAC_MASK, check_srcmac);\r
9434 \r
9435         // 宛先 MAC アドレスの設定\r
9436         check_dstmac = a->CheckDstMac = support_mac && (IsChecked(hWnd, R_CHECK_DST_MAC) ? false : true);\r
9437         if(check_dstmac == false)\r
9438         {\r
9439                 Zero(a->DstMacAddress, sizeof(a->DstMacAddress));\r
9440                 Zero(a->DstMacMask, sizeof(a->DstMacMask));\r
9441         }\r
9442         else\r
9443         {\r
9444                 GetTxtA(hWnd, E_DST_MAC, dstmac, sizeof(dstmac));\r
9445                 GetTxtA(hWnd, E_DST_MAC_MASK, dstmac_mask, sizeof(dstmac_mask));\r
9446                 Trim(dstmac);\r
9447                 Trim(dstmac_mask);\r
9448                 if(StrLen(dstmac) != 0 && StrLen(dstmac_mask) != 0)\r
9449                 {\r
9450                         UCHAR mac[6], mask[6];\r
9451                         if(StrToMac(mac, dstmac) && StrToMac(mask, dstmac_mask))\r
9452                         {\r
9453                                 Copy(a->DstMacAddress, mac, 6);\r
9454                                 Copy(a->DstMacMask, mask, 6);\r
9455                         }\r
9456                         else\r
9457                         {\r
9458                                 ok = false;\r
9459                         }\r
9460                 }\r
9461                 else\r
9462                 {\r
9463                         ok = false;\r
9464                 }\r
9465         }\r
9466         SetEnable(hWnd, S_CHECK_DST_MAC, support_mac);\r
9467         SetEnable(hWnd, R_CHECK_DST_MAC, support_mac);\r
9468         SetEnable(hWnd, S_DST_MAC, check_dstmac);\r
9469         SetEnable(hWnd, S_DST_MAC_MASK, check_dstmac);\r
9470         SetEnable(hWnd, E_DST_MAC, check_dstmac);\r
9471         SetEnable(hWnd, E_DST_MAC_MASK, check_dstmac);\r
9472 \r
9473         SetEnable(hWnd, S_MAC_NOTE, check_srcmac || check_dstmac);\r
9474 \r
9475         // TCP コネクションの状態\r
9476         support_check_state = GetCapsBool(s->Hub->p->CapsList, "b_support_check_tcp_state") && a->Protocol == 6;\r
9477         SetEnable(hWnd, R_CHECK_TCP_STATE, support_check_state);\r
9478         check_state = a->CheckTcpState = support_check_state && IsChecked(hWnd, R_CHECK_TCP_STATE);\r
9479 \r
9480         a->Established = IsChecked(hWnd, R_ESTABLISHED) && check_state;\r
9481         SetEnable(hWnd, R_ESTABLISHED, check_state);\r
9482         SetEnable(hWnd, R_UNESTABLISHED, check_state);\r
9483         if(check_state != false && IsChecked(hWnd, R_ESTABLISHED) == false && IsChecked(hWnd, R_UNESTABLISHED) == false)\r
9484         {\r
9485                 ok = false;\r
9486         }\r
9487 \r
9488         a->Active = IsChecked(hWnd, R_DISABLE) ? false : true;\r
9489 \r
9490         SetEnable(hWnd, B_SIMULATION, a->Discard == false && GetCapsBool(s->Hub->p->CapsList, "b_support_ex_acl"));\r
9491 \r
9492         SetEnable(hWnd, IDOK, ok);\r
9493 }\r
9494 \r
9495 // OK クリック\r
9496 void SmEditAccessOnOk(HWND hWnd, SM_EDIT_ACCESS *s)\r
9497 {\r
9498         // 引数チェック\r
9499         if (hWnd == NULL || s == NULL)\r
9500         {\r
9501                 return;\r
9502         }\r
9503 \r
9504         SmEditAccessUpdate(hWnd, s);\r
9505 \r
9506         EndDialog(hWnd, true);\r
9507 }\r
9508 \r
9509 \r
9510 // アクセスリスト編集ダイアログ\r
9511 UINT SmEditAccessDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
9512 {\r
9513         SM_EDIT_ACCESS *s = (SM_EDIT_ACCESS *)param;\r
9514         UINT ico;\r
9515         ACCESS *a;\r
9516         char tmp[MAX_SIZE];\r
9517         // 引数チェック\r
9518         if (hWnd == NULL)\r
9519         {\r
9520                 return 0;\r
9521         }\r
9522 \r
9523         switch (msg)\r
9524         {\r
9525         case WM_INITDIALOG:\r
9526                 // 初期化\r
9527                 SmEditAccessInit(hWnd, s);\r
9528 \r
9529                 goto REFRESH_ICON;\r
9530 \r
9531         case WM_COMMAND:\r
9532                 switch (LOWORD(wParam))\r
9533                 {\r
9534                 case R_PASS:\r
9535                 case R_DISCARD:\r
9536                 case E_PRIORITY:\r
9537                 case R_SRC_ALL:\r
9538                 case E_SRC_IP:\r
9539                 case E_SRC_MASK:\r
9540                 case R_DST_ALL:\r
9541                 case E_DST_MASK:\r
9542                 case E_SRC_IP_V6:\r
9543                 case E_SRC_MASK_V6:\r
9544                 case E_DST_MASK_V6:\r
9545                 case E_DST_IP_V6:\r
9546                 case C_PROTOCOL:\r
9547                 case E_SRC_PORT_1:\r
9548                 case E_SRC_PORT_2:\r
9549                 case E_DST_PORT_1:\r
9550                 case E_DST_PORT_2:\r
9551                 case E_USERNAME1:\r
9552                 case E_USERNAME2:\r
9553                 case R_DISABLE:\r
9554                 case E_IP_PROTO:\r
9555                 case R_CHECK_SRC_MAC:\r
9556                 case E_SRC_MAC:\r
9557                 case E_SRC_MAC_MASK:\r
9558                 case R_CHECK_DST_MAC:\r
9559                 case E_DST_MAC:\r
9560                 case E_DST_MAC_MASK:\r
9561                 case R_CHECK_TCP_STATE:\r
9562                 case R_ESTABLISHED:\r
9563                 case R_UNESTABLISHED:\r
9564                         SmEditAccessUpdate(hWnd, s);\r
9565                         break;\r
9566                 }\r
9567 \r
9568                 switch (wParam)\r
9569                 {\r
9570                 case B_USER1:\r
9571                         if (GetTxtA(hWnd, E_USERNAME1, tmp, sizeof(tmp)))\r
9572                         {\r
9573                                 char *ret = SmSelectUserDlgEx(hWnd, s->Hub, tmp, GetCapsBool(s->Hub->p->CapsList, "b_support_acl_group"));\r
9574                                 if (ret == NULL)\r
9575                                 {\r
9576                                         SetTextA(hWnd, E_USERNAME1, "");\r
9577                                 }\r
9578                                 else\r
9579                                 {\r
9580                                         SetTextA(hWnd, E_USERNAME1, ret);\r
9581                                         Free(ret);\r
9582                                 }\r
9583                                 FocusEx(hWnd, E_USERNAME1);\r
9584                         }\r
9585                         break;\r
9586 \r
9587                 case B_USER2:\r
9588                         if (GetTxtA(hWnd, E_USERNAME2, tmp, sizeof(tmp)))\r
9589                         {\r
9590                                 char *ret = SmSelectUserDlgEx(hWnd, s->Hub, tmp, GetCapsBool(s->Hub->p->CapsList, "b_support_acl_group"));\r
9591                                 if (ret == NULL)\r
9592                                 {\r
9593                                         SetTextA(hWnd, E_USERNAME2, "");\r
9594                                 }\r
9595                                 else\r
9596                                 {\r
9597                                         SetTextA(hWnd, E_USERNAME2, ret);\r
9598                                         Free(ret);\r
9599                                 }\r
9600                                 FocusEx(hWnd, E_USERNAME2);\r
9601                         }\r
9602                         break;\r
9603 \r
9604                 case IDOK:\r
9605                         // OK ボタン\r
9606                         SmEditAccessOnOk(hWnd, s);\r
9607                         break;\r
9608 \r
9609                 case IDCANCEL:\r
9610                         // キャンセルボタン\r
9611                         Close(hWnd);\r
9612                         break;\r
9613 \r
9614                 case R_SRC_ALL:\r
9615                         if (IsChecked(hWnd, R_SRC_ALL) == false)\r
9616                         {\r
9617                                 if (s->Access->IsIPv6)\r
9618                                 {\r
9619                                         FocusEx(hWnd, E_SRC_IP_V6);\r
9620                                 }\r
9621                                 else\r
9622                                 {\r
9623                                         Focus(hWnd, E_SRC_IP);\r
9624                                 }\r
9625                         }\r
9626                         break;\r
9627 \r
9628                 case R_DST_ALL:\r
9629                         if (IsChecked(hWnd, R_DST_ALL) == false)\r
9630                         {\r
9631                                 if (s->Access->IsIPv6)\r
9632                                 {\r
9633                                         FocusEx(hWnd, E_DST_IP_V6);\r
9634                                 }\r
9635                                 else\r
9636                                 {\r
9637                                         Focus(hWnd, E_DST_IP);\r
9638                                 }\r
9639                         }\r
9640                         break;\r
9641                 case R_CHECK_SRC_MAC:\r
9642                         if(IsChecked(hWnd, R_CHECK_SRC_MAC) == false)\r
9643                         {\r
9644                                 Focus(hWnd, E_SRC_MAC);\r
9645                         }\r
9646                         break;\r
9647                 case R_CHECK_DST_MAC:\r
9648                         if(IsChecked(hWnd, R_CHECK_DST_MAC) == false)\r
9649                         {\r
9650                                 Focus(hWnd, E_DST_MAC);\r
9651                         }\r
9652                         break;\r
9653 \r
9654                 case R_PASS:\r
9655                 case R_DISCARD:\r
9656                 case R_DISABLE:\r
9657 REFRESH_ICON:\r
9658                         a = s->Access;\r
9659                         if (a->Discard == false && a->Active == false)\r
9660                         {\r
9661                                 ico = ICO_PASS_DISABLE;\r
9662                         }\r
9663                         else if (a->Discard == false && a->Active)\r
9664                         {\r
9665                                 ico = ICO_PASS;\r
9666                         }\r
9667                         else if (a->Discard && a->Active == false)\r
9668                         {\r
9669                                 ico = ICO_DISCARD_DISABLE;\r
9670                         }\r
9671                         else\r
9672                         {\r
9673                                 ico = ICO_DISCARD;\r
9674                         }\r
9675 \r
9676                         SetIcon(hWnd, S_ICON, ico);\r
9677                         break;\r
9678 \r
9679                 case B_SIMULATION:\r
9680                         // シミュレーション\r
9681                         Dialog(hWnd, D_SM_SIMULATION, SmSimulationDlg, s);\r
9682                         break;\r
9683                 }\r
9684                 break;\r
9685 \r
9686         case WM_CLOSE:\r
9687                 EndDialog(hWnd, false);\r
9688                 break;\r
9689         }\r
9690 \r
9691         return 0;\r
9692 }\r
9693 \r
9694 // 遅延・ジッタ・パケットロスダイアログ\r
9695 UINT SmSimulationDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
9696 {\r
9697         SM_EDIT_ACCESS *s = (SM_EDIT_ACCESS *)param;\r
9698         // 引数チェック\r
9699         if (hWnd == NULL)\r
9700         {\r
9701                 return 0;\r
9702         }\r
9703 \r
9704         switch (msg)\r
9705         {\r
9706         case WM_INITDIALOG:\r
9707                 SmSimulationInit(hWnd, s);\r
9708                 break;\r
9709 \r
9710         case WM_COMMAND:\r
9711                 switch (LOWORD(wParam))\r
9712                 {\r
9713                 case E_DELAY:\r
9714                 case E_JITTER:\r
9715                 case E_LOSS:\r
9716                         SmSimulationUpdate(hWnd, s);\r
9717                         break;\r
9718                 }\r
9719 \r
9720                 switch (wParam)\r
9721                 {\r
9722                 case IDOK:\r
9723                         SmSimulationOnOk(hWnd, s);\r
9724                         break;\r
9725 \r
9726                 case IDCANCEL:\r
9727                         Close(hWnd);\r
9728                         break;\r
9729 \r
9730                 case C_DELAY:\r
9731                         SmSimulationUpdate(hWnd, s);\r
9732                         if (IsChecked(hWnd, C_DELAY))\r
9733                         {\r
9734                                 FocusEx(hWnd, E_DELAY);\r
9735                         }\r
9736                         break;\r
9737 \r
9738                 case C_JITTER:\r
9739                         SmSimulationUpdate(hWnd, s);\r
9740                         if (IsChecked(hWnd, C_JITTER))\r
9741                         {\r
9742                                 FocusEx(hWnd, E_JITTER);\r
9743                         }\r
9744                         break;\r
9745 \r
9746                 case C_LOSS:\r
9747                         SmSimulationUpdate(hWnd, s);\r
9748                         if (IsChecked(hWnd, C_LOSS))\r
9749                         {\r
9750                                 FocusEx(hWnd, E_LOSS);\r
9751                         }\r
9752                         break;\r
9753                 }\r
9754                 break;\r
9755 \r
9756         case WM_CLOSE:\r
9757                 EndDialog(hWnd, false);\r
9758                 break;\r
9759         }\r
9760 \r
9761         return 0;\r
9762 }\r
9763 \r
9764 // 遅延・ジッタ・パケットロスダイアログの更新\r
9765 void SmSimulationUpdate(HWND hWnd, SM_EDIT_ACCESS *s)\r
9766 {\r
9767         bool b1, b2, b3;\r
9768         bool ok = true;\r
9769         // 引数チェック\r
9770         if (hWnd == NULL || s == NULL)\r
9771         {\r
9772                 return;\r
9773         }\r
9774 \r
9775         b1 = IsChecked(hWnd, C_DELAY);\r
9776         b2 = IsChecked(hWnd, C_JITTER);\r
9777         b3 = IsChecked(hWnd, C_LOSS);\r
9778 \r
9779         SetEnable(hWnd, S_DELAY, b1);\r
9780         SetEnable(hWnd, S_DELAY2, b1);\r
9781         SetEnable(hWnd, E_DELAY, b1);\r
9782 \r
9783         SetEnable(hWnd, C_JITTER, b1);\r
9784 \r
9785         if (b1 == false)\r
9786         {\r
9787                 b2 = false;\r
9788         }\r
9789 \r
9790         SetEnable(hWnd, S_JITTER, b2);\r
9791         SetEnable(hWnd, S_JITTER2, b2);\r
9792         SetEnable(hWnd, E_JITTER, b2);\r
9793 \r
9794         SetEnable(hWnd, S_LOSS, b3);\r
9795         SetEnable(hWnd, S_LOSS2, b3);\r
9796         SetEnable(hWnd, E_LOSS, b3);\r
9797 \r
9798         if (b1)\r
9799         {\r
9800                 UINT i = GetInt(hWnd, E_DELAY);\r
9801                 if (i == 0 || i > HUB_ACCESSLIST_DELAY_MAX)\r
9802                 {\r
9803                         ok = false;\r
9804                 }\r
9805         }\r
9806 \r
9807         if (b2)\r
9808         {\r
9809                 UINT i = GetInt(hWnd, E_JITTER);\r
9810                 if (i == 0 || i > HUB_ACCESSLIST_JITTER_MAX)\r
9811                 {\r
9812                         ok = false;\r
9813                 }\r
9814         }\r
9815 \r
9816         if (b3)\r
9817         {\r
9818                 UINT i = GetInt(hWnd, E_LOSS);\r
9819                 if (i == 0 || i > HUB_ACCESSLIST_LOSS_MAX)\r
9820                 {\r
9821                         ok = false;\r
9822                 }\r
9823         }\r
9824 \r
9825         SetEnable(hWnd, IDOK, ok);\r
9826 }\r
9827 \r
9828 // 遅延・ジッタ・パケットロスダイアログの初期化\r
9829 void SmSimulationInit(HWND hWnd, SM_EDIT_ACCESS *s)\r
9830 {\r
9831         ACCESS *a;\r
9832         // 引数チェック\r
9833         if (hWnd == NULL || s == NULL)\r
9834         {\r
9835                 return;\r
9836         }\r
9837 \r
9838         a = s->Access;\r
9839 \r
9840         Check(hWnd, C_DELAY, a->Delay != 0);\r
9841         Check(hWnd, C_JITTER, a->Jitter != 0);\r
9842         Check(hWnd, C_LOSS, a->Loss != 0);\r
9843 \r
9844         SetIntEx(hWnd, E_DELAY, a->Delay);\r
9845         if (a->Delay != 0)\r
9846         {\r
9847                 SetIntEx(hWnd, E_JITTER, a->Jitter);\r
9848         }\r
9849         SetIntEx(hWnd, E_LOSS, a->Loss);\r
9850 \r
9851         SmSimulationUpdate(hWnd, s);\r
9852 \r
9853         if (a->Delay != 0)\r
9854         {\r
9855                 FocusEx(hWnd, E_DELAY);\r
9856         }\r
9857         else\r
9858         {\r
9859                 Focus(hWnd, C_DELAY);\r
9860         }\r
9861 }\r
9862 \r
9863 // 遅延・ジッタ・パケットロスダイアログの保存\r
9864 void SmSimulationOnOk(HWND hWnd, SM_EDIT_ACCESS *s)\r
9865 {\r
9866         ACCESS *a;\r
9867         // 引数チェック\r
9868         if (hWnd == NULL || s == NULL)\r
9869         {\r
9870                 return;\r
9871         }\r
9872 \r
9873         a = s->Access;\r
9874 \r
9875         a->Jitter = a->Loss = a->Delay = 0;\r
9876 \r
9877         if (IsChecked(hWnd, C_DELAY))\r
9878         {\r
9879                 a->Delay = GetInt(hWnd, E_DELAY);\r
9880         }\r
9881 \r
9882         if (IsChecked(hWnd, C_JITTER))\r
9883         {\r
9884                 a->Jitter = GetInt(hWnd, E_JITTER);\r
9885         }\r
9886 \r
9887         if (IsChecked(hWnd, C_LOSS))\r
9888         {\r
9889                 a->Loss = GetInt(hWnd, E_LOSS);\r
9890         }\r
9891 \r
9892         EndDialog(hWnd, 1);\r
9893 }\r
9894 \r
9895 // アクセスリストの編集\r
9896 bool SmEditAccess(HWND hWnd, SM_ACCESS_LIST *s, ACCESS *a)\r
9897 {\r
9898         SM_EDIT_ACCESS edit;\r
9899         bool ret;\r
9900         UINT i;\r
9901         // 引数チェック\r
9902         if (hWnd == NULL || s == NULL)\r
9903         {\r
9904                 return false;\r
9905         }\r
9906 \r
9907         Zero(&edit, sizeof(edit));\r
9908         edit.AccessList = s;\r
9909         edit.EditMode = true;\r
9910         edit.Access = ZeroMalloc(sizeof(ACCESS));\r
9911         edit.Hub = s->Hub;\r
9912         Copy(edit.Access, a, sizeof(ACCESS));\r
9913 \r
9914         if (edit.Access->IsIPv6 == false)\r
9915         {\r
9916                 ret = Dialog(hWnd, D_SM_EDIT_ACCESS, SmEditAccessDlg, &edit);\r
9917         }\r
9918         else\r
9919         {\r
9920                 ret = Dialog(hWnd, D_SM_EDIT_ACCESS_V6, SmEditAccessDlg, &edit);\r
9921         }\r
9922 \r
9923         if (ret)\r
9924         {\r
9925                 Copy(a, edit.Access, sizeof(ACCESS));\r
9926                 Free(edit.Access);\r
9927                 Sort(s->AccessList);\r
9928 \r
9929                 // ID を振り直す\r
9930                 for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
9931                 {\r
9932                         ACCESS *a = LIST_DATA(s->AccessList, i);\r
9933                         a->Id = (i + 1);\r
9934                 }\r
9935         }\r
9936         else\r
9937         {\r
9938                 Free(edit.Access);\r
9939         }\r
9940 \r
9941         return ret;\r
9942 }\r
9943 \r
9944 // アクセスリストの追加\r
9945 bool SmAddAccess(HWND hWnd, SM_ACCESS_LIST *s, bool ipv6)\r
9946 {\r
9947         SM_EDIT_ACCESS edit;\r
9948         bool ret;\r
9949         UINT i;\r
9950         // 引数チェック\r
9951         if (hWnd == NULL || s == NULL)\r
9952         {\r
9953                 return false;\r
9954         }\r
9955 \r
9956         Zero(&edit, sizeof(edit));\r
9957         edit.AccessList = s;\r
9958         edit.Access = ZeroMalloc(sizeof(ACCESS));\r
9959         edit.Access->Active = true;\r
9960         edit.Access->Priority = 0;\r
9961         edit.Access->IsIPv6 = ipv6;\r
9962         edit.Hub = s->Hub;\r
9963 \r
9964         // 新しい優先順位の取得\r
9965         for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
9966         {\r
9967                 ACCESS *a = LIST_DATA(s->AccessList, i);\r
9968                 edit.Access->Priority = MAX(edit.Access->Priority, a->Priority);\r
9969         }\r
9970 \r
9971         if (edit.Access->Priority == 0)\r
9972         {\r
9973                 edit.Access->Priority = 900;\r
9974         }\r
9975 \r
9976         edit.Access->Priority += 100;\r
9977 \r
9978         if (edit.Access->IsIPv6 == false)\r
9979         {\r
9980                 ret = Dialog(hWnd, D_SM_EDIT_ACCESS, SmEditAccessDlg, &edit);\r
9981         }\r
9982         else\r
9983         {\r
9984                 ret = Dialog(hWnd, D_SM_EDIT_ACCESS_V6, SmEditAccessDlg, &edit);\r
9985         }\r
9986 \r
9987         if (ret)\r
9988         {\r
9989                 Insert(s->AccessList, edit.Access);\r
9990 \r
9991                 // ID を振り直す\r
9992                 for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
9993                 {\r
9994                         ACCESS *a = LIST_DATA(s->AccessList, i);\r
9995                         a->Id = (i + 1);\r
9996                 }\r
9997         }\r
9998         else\r
9999         {\r
10000                 Free(edit.Access);\r
10001         }\r
10002 \r
10003         return ret;\r
10004 }\r
10005 \r
10006 // 初期化\r
10007 void SmAccessListInit(HWND hWnd, SM_ACCESS_LIST *s)\r
10008 {\r
10009         // 引数チェック\r
10010         if (hWnd == NULL || s == NULL)\r
10011         {\r
10012                 return;\r
10013         }\r
10014 \r
10015         SetIcon(hWnd, 0, ICO_PASS);\r
10016         FormatText(hWnd, S_TITLE, s->Hub->HubName);\r
10017 \r
10018         LvInit(hWnd, L_ACCESS_LIST);\r
10019         LvInsertColumn(hWnd, L_ACCESS_LIST, 0, _UU("SM_ACCESS_COLUMN_0"), 60);\r
10020         LvInsertColumn(hWnd, L_ACCESS_LIST, 1, _UU("SM_ACCESS_COLUMN_1"), 60);\r
10021         LvInsertColumn(hWnd, L_ACCESS_LIST, 2, _UU("SM_ACCESS_COLUMN_2"), 60);\r
10022         LvInsertColumn(hWnd, L_ACCESS_LIST, 3, _UU("SM_ACCESS_COLUMN_3"), 70);\r
10023         LvInsertColumn(hWnd, L_ACCESS_LIST, 4, _UU("SM_ACCESS_COLUMN_4"), 150);\r
10024         LvInsertColumn(hWnd, L_ACCESS_LIST, 5, _UU("SM_ACCESS_COLUMN_5"), 600);\r
10025 \r
10026         LvSetStyle(hWnd, L_ACCESS_LIST, LVS_EX_GRIDLINES);\r
10027 \r
10028         SetEnable(hWnd, B_ADD_V6, GetCapsBool(s->Hub->p->CapsList, "b_support_ipv6_acl"));\r
10029 \r
10030         SmAccessListRefresh(hWnd, s);\r
10031 }\r
10032 \r
10033 // コントロール更新\r
10034 void SmAccessListUpdate(HWND hWnd, SM_ACCESS_LIST *s)\r
10035 {\r
10036         bool ok = true;\r
10037         // 引数チェック\r
10038         if (hWnd == NULL || s == NULL)\r
10039         {\r
10040                 return;\r
10041         }\r
10042 \r
10043         if (LvIsSelected(hWnd, L_ACCESS_LIST) == false || LvIsMultiMasked(hWnd, L_ACCESS_LIST))\r
10044         {\r
10045                 ok = false;\r
10046         }\r
10047 \r
10048         SetEnable(hWnd, IDOK, ok);\r
10049         SetEnable(hWnd, B_DELETE, ok);\r
10050 \r
10051         SetEnable(hWnd, B_CREATE, LIST_NUM(s->AccessList) < MAX_ACCESSLISTS);\r
10052 }\r
10053 \r
10054 // 内容更新\r
10055 void SmAccessListRefresh(HWND hWnd, SM_ACCESS_LIST *s)\r
10056 {\r
10057         LVB *b;\r
10058         UINT i;\r
10059         // 引数チェック\r
10060         if (hWnd == NULL || s == NULL)\r
10061         {\r
10062                 return;\r
10063         }\r
10064 \r
10065         b = LvInsertStart();\r
10066 \r
10067         Sort(s->AccessList);\r
10068 \r
10069         for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
10070         {\r
10071                 ACCESS *a = LIST_DATA(s->AccessList, i);\r
10072                 char tmp[MAX_SIZE];\r
10073                 UINT ico = ICO_PASS;\r
10074                 wchar_t tmp3[MAX_SIZE];\r
10075                 wchar_t tmp1[MAX_SIZE];\r
10076                 wchar_t tmp2[MAX_SIZE];\r
10077                 GetAccessListStr(tmp, sizeof(tmp), a);\r
10078                 UniToStru(tmp1, a->Priority);\r
10079                 StrToUni(tmp2, sizeof(tmp2), tmp);\r
10080 \r
10081                 if (a->Discard == false && a->Active == false)\r
10082                 {\r
10083                         ico = ICO_PASS_DISABLE;\r
10084                 }\r
10085                 else if (a->Discard == false && a->Active)\r
10086                 {\r
10087                         ico = ICO_PASS;\r
10088                 }\r
10089                 else if (a->Discard && a->Active == false)\r
10090                 {\r
10091                         ico = ICO_DISCARD_DISABLE;\r
10092                 }\r
10093                 else\r
10094                 {\r
10095                         ico = ICO_DISCARD;\r
10096                 }\r
10097 \r
10098                 UniToStru(tmp3, a->Id);\r
10099 \r
10100                 LvInsertAdd(b, ico, (void *)a, 6,\r
10101                         tmp3,\r
10102                         a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),\r
10103                         a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),\r
10104                         tmp1,\r
10105                         a->Note,\r
10106                         tmp2);\r
10107         }\r
10108 \r
10109         LvInsertEnd(b, hWnd, L_ACCESS_LIST);\r
10110         LvSortEx(hWnd, L_ACCESS_LIST, 0, false, true);\r
10111 \r
10112         SmAccessListUpdate(hWnd, s);\r
10113 }\r
10114 \r
10115 // アクセスリストダイアログプロシージャ\r
10116 UINT SmAccessListProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
10117 {\r
10118         SM_ACCESS_LIST *s = (SM_ACCESS_LIST *)param;\r
10119         NMHDR *n;\r
10120         ACCESS *a;\r
10121         // 引数チェック\r
10122         if (hWnd == NULL)\r
10123         {\r
10124                 return 0;\r
10125         }\r
10126 \r
10127         switch (msg)\r
10128         {\r
10129         case WM_INITDIALOG:\r
10130                 // 初期化\r
10131                 SmAccessListInit(hWnd, s);\r
10132                 break;\r
10133 \r
10134         case WM_COMMAND:\r
10135                 switch (wParam)\r
10136                 {\r
10137                 case B_ADD:\r
10138                         // 追加 (IPv4)\r
10139                         if (SmAddAccess(hWnd, s, false))\r
10140                         {\r
10141                                 SmAccessListRefresh(hWnd, s);\r
10142                         }\r
10143                         break;\r
10144 \r
10145                 case B_ADD_V6:\r
10146                         // 追加 (IPv6)\r
10147                         if (SmAddAccess(hWnd, s, true))\r
10148                         {\r
10149                                 SmAccessListRefresh(hWnd, s);\r
10150                         }\r
10151                         break;\r
10152 \r
10153                 case IDOK:\r
10154                         // 編集\r
10155                         a = LvGetParam(hWnd, L_ACCESS_LIST, LvGetSelected(hWnd, L_ACCESS_LIST));\r
10156                         if (a != NULL)\r
10157                         {\r
10158                                 if (SmEditAccess(hWnd, s, a))\r
10159                                 {\r
10160                                         SmAccessListRefresh(hWnd, s);\r
10161                                 }\r
10162                         }\r
10163                         break;\r
10164 \r
10165                 case B_DELETE:\r
10166                         // 削除\r
10167                         a = LvGetParam(hWnd, L_ACCESS_LIST, LvGetSelected(hWnd, L_ACCESS_LIST));\r
10168                         if (a != NULL)\r
10169                         {\r
10170                                 UINT i;\r
10171                                 if (IsInList(s->AccessList, a))\r
10172                                 {\r
10173                                         Delete(s->AccessList, a);\r
10174                                         Free(a);\r
10175                                         // ID を振り直す\r
10176                                         for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
10177                                         {\r
10178                                                 ACCESS *a = LIST_DATA(s->AccessList, i);\r
10179                                                 a->Id = (i + 1);\r
10180                                         }\r
10181                                         SmAccessListRefresh(hWnd, s);\r
10182                                 }\r
10183                         }\r
10184                         break;\r
10185 \r
10186                 case B_SAVE:\r
10187                         // 保存\r
10188                         {\r
10189                                 UINT i;\r
10190                                 bool ok;\r
10191                                 // アクセスリストを保存する\r
10192                                 RPC_ENUM_ACCESS_LIST t;\r
10193                                 Zero(&t, sizeof(t));\r
10194                                 StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
10195                                 t.NumAccess = LIST_NUM(s->AccessList);\r
10196                                 t.Accesses = ZeroMalloc(sizeof(ACCESS) * t.NumAccess);\r
10197                                 for (i = 0;i < LIST_NUM(s->AccessList);i++)\r
10198                                 {\r
10199                                         ACCESS *access = LIST_DATA(s->AccessList, i);\r
10200                                         Copy(&t.Accesses[i], access, sizeof(ACCESS));\r
10201                                 }\r
10202 \r
10203                                 ok = CALL(hWnd, ScSetAccessList(s->Rpc, &t));\r
10204                                 FreeRpcEnumAccessList(&t);\r
10205                                 if (ok)\r
10206                                 {\r
10207                                         EndDialog(hWnd, true);\r
10208                                 }\r
10209                         }\r
10210                         break;\r
10211 \r
10212                 case IDCANCEL:\r
10213                         // キャンセルボタン\r
10214                         Close(hWnd);\r
10215                         break;\r
10216                 }\r
10217                 break;\r
10218 \r
10219         case WM_NOTIFY:\r
10220                 n = (NMHDR *)lParam;\r
10221                 switch (n->idFrom)\r
10222                 {\r
10223                 case L_ACCESS_LIST:\r
10224                         switch (n->code)\r
10225                         {\r
10226                         case LVN_ITEMCHANGED:\r
10227                                 SmAccessListUpdate(hWnd, s);\r
10228                                 break;\r
10229                         }\r
10230                         break;\r
10231                 }\r
10232                 break;\r
10233 \r
10234         case WM_CLOSE:\r
10235                 EndDialog(hWnd, false);\r
10236                 break;\r
10237         }\r
10238 \r
10239         LvStandardHandler(hWnd, msg, wParam, lParam, L_ACCESS_LIST);\r
10240 \r
10241         return 0;\r
10242 }\r
10243 \r
10244 \r
10245 // アクセスリストダイアログ\r
10246 void SmAccessListDlg(HWND hWnd, SM_HUB *s)\r
10247 {\r
10248         SM_ACCESS_LIST a;\r
10249         UINT i;\r
10250         RPC_ENUM_ACCESS_LIST t;\r
10251         bool ret;\r
10252         // 引数チェック\r
10253         if (hWnd == NULL || s == NULL)\r
10254         {\r
10255                 return;\r
10256         }\r
10257 \r
10258         Zero(&a, sizeof(a));\r
10259         a.Hub = s;\r
10260         a.Rpc = s->Rpc;\r
10261 \r
10262         // アクセスリストの取得\r
10263         Zero(&t, sizeof(t));\r
10264         StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
10265         if (CALL(hWnd, ScEnumAccess(s->Rpc, &t)) == false)\r
10266         {\r
10267                 return;\r
10268         }\r
10269 \r
10270         a.AccessList = NewListFast(CmpAccessList);\r
10271         // リストに追加\r
10272         for (i = 0;i < t.NumAccess;i++)\r
10273         {\r
10274                 ACCESS *access = ZeroMalloc(sizeof(ACCESS));\r
10275                 Copy(access, &t.Accesses[i], sizeof(ACCESS));\r
10276 \r
10277                 Add(a.AccessList, access);\r
10278         }\r
10279 \r
10280         // ソート\r
10281         Sort(a.AccessList);\r
10282         FreeRpcEnumAccessList(&t);\r
10283 \r
10284         // ダイアログ表示\r
10285         ret = Dialog(hWnd, D_SM_ACCESS_LIST, SmAccessListProc, &a);\r
10286 \r
10287         for (i = 0;i < LIST_NUM(a.AccessList);i++)\r
10288         {\r
10289                 ACCESS *access = LIST_DATA(a.AccessList, i);\r
10290                 Free(access);\r
10291         }\r
10292         ReleaseList(a.AccessList);\r
10293 }\r
10294 \r
10295 // 初期化\r
10296 void SmEditGroupDlgInit(HWND hWnd, SM_EDIT_GROUP *g)\r
10297 {\r
10298         RPC_SET_GROUP *group;\r
10299         LVB *b;\r
10300         // 引数チェック\r
10301         if (hWnd == NULL || g == NULL)\r
10302         {\r
10303                 return;\r
10304         }\r
10305 \r
10306         SetIcon(hWnd, 0, ICO_GROUP);\r
10307 \r
10308         group = &g->SetGroup;\r
10309 \r
10310         if (g->EditMode == false)\r
10311         {\r
10312                 SetText(hWnd, 0, _UU("SM_EDIT_GROUP_CAPTION_1"));\r
10313         }\r
10314         else\r
10315         {\r
10316                 wchar_t tmp[MAX_SIZE];\r
10317                 UniFormat(tmp, sizeof(tmp), _UU("SM_EDIT_GROUP_CAPTION_2"), group->Name);\r
10318                 SetText(hWnd, 0, tmp);\r
10319         }\r
10320 \r
10321         SetTextA(hWnd, E_GROUPNAME, group->Name);\r
10322         SetText(hWnd, E_REALNAME, group->Realname);\r
10323         SetText(hWnd, E_NOTE, group->Note);\r
10324 \r
10325         g->Inited = true;\r
10326 \r
10327         if (g->EditMode == false)\r
10328         {\r
10329                 Disable(hWnd, L_STATUS);\r
10330         }\r
10331         else\r
10332         {\r
10333                 LvInit(hWnd, L_STATUS);\r
10334                 LvInsertColumn(hWnd, L_STATUS, 0, _UU("SM_STATUS_COLUMN_1"), 0);\r
10335                 LvInsertColumn(hWnd, L_STATUS, 1, _UU("SM_STATUS_COLUMN_2"), 0);\r
10336                 LvSetStyle(hWnd, L_STATUS, LVS_EX_GRIDLINES);\r
10337 \r
10338                 b = LvInsertStart();\r
10339 \r
10340                 SmInsertTrafficInfo(b, &group->Traffic);\r
10341 \r
10342                 LvInsertEnd(b, hWnd, L_STATUS);\r
10343 \r
10344                 LvAutoSize(hWnd, L_STATUS);\r
10345         }\r
10346 \r
10347         Check(hWnd, R_POLICY, group->Policy != NULL);\r
10348 \r
10349         if (g->EditMode)\r
10350         {\r
10351                 Disable(hWnd, E_GROUPNAME);\r
10352                 FocusEx(hWnd, E_REALNAME);\r
10353         }\r
10354 \r
10355         SmEditGroupDlgUpdate(hWnd, g);\r
10356 }\r
10357 \r
10358 // 更新\r
10359 void SmEditGroupDlgUpdate(HWND hWnd, SM_EDIT_GROUP *g)\r
10360 {\r
10361         bool ok = true;\r
10362         RPC_SET_GROUP *group;\r
10363         // 引数チェック\r
10364         if (hWnd == NULL || g == NULL)\r
10365         {\r
10366                 return;\r
10367         }\r
10368 \r
10369         if (g->Inited == false)\r
10370         {\r
10371                 return;\r
10372         }\r
10373 \r
10374         group = &g->SetGroup;\r
10375 \r
10376         GetTxtA(hWnd, E_GROUPNAME, group->Name, sizeof(group->Name));\r
10377         Trim(group->Name);\r
10378 \r
10379         if (IsUserName(group->Name) == false)\r
10380         {\r
10381                 ok = false;\r
10382         }\r
10383 \r
10384         GetTxt(hWnd, E_REALNAME, group->Realname, sizeof(group->Realname));\r
10385         UniTrim(group->Realname);\r
10386 \r
10387         GetTxt(hWnd, E_NOTE, group->Note, sizeof(group->Note));\r
10388         UniTrim(group->Note);\r
10389 \r
10390         SetEnable(hWnd, B_POLICY, IsChecked(hWnd, R_POLICY));\r
10391 \r
10392         if (IsChecked(hWnd, R_POLICY))\r
10393         {\r
10394                 if (group->Policy == NULL)\r
10395                 {\r
10396                         ok = false;\r
10397                 }\r
10398         }\r
10399 \r
10400         SetEnable(hWnd, IDOK, ok);\r
10401 }\r
10402 \r
10403 // OK\r
10404 void SmEditGroupDlgOnOk(HWND hWnd, SM_EDIT_GROUP *g)\r
10405 {\r
10406         RPC_SET_GROUP *group;\r
10407         RPC_SET_GROUP t;\r
10408         // 引数チェック\r
10409         if (hWnd == NULL || g == NULL)\r
10410         {\r
10411                 return;\r
10412         }\r
10413 \r
10414         SmEditGroupDlgUpdate(hWnd, g);\r
10415 \r
10416         group = &g->SetGroup;\r
10417 \r
10418         if (IsChecked(hWnd, R_POLICY) == false)\r
10419         {\r
10420                 if (group->Policy != NULL)\r
10421                 {\r
10422                         Free(group->Policy);\r
10423                         group->Policy = NULL;\r
10424                 }\r
10425         }\r
10426 \r
10427         Zero(&t, sizeof(t));\r
10428         Copy(&t, group, sizeof(RPC_SET_GROUP));\r
10429 \r
10430         t.Policy = ClonePolicy(group->Policy);\r
10431 \r
10432         if (g->EditMode == false)\r
10433         {\r
10434                 if (CALL(hWnd, ScCreateGroup(g->Rpc, &t)) == false)\r
10435                 {\r
10436                         FocusEx(hWnd, E_GROUPNAME);\r
10437                         return;\r
10438                 }\r
10439         }\r
10440         else\r
10441         {\r
10442                 if (CALL(hWnd, ScSetGroup(g->Rpc, &t)) == false)\r
10443                 {\r
10444                         return;\r
10445                 }\r
10446         }\r
10447 \r
10448         FreeRpcSetGroup(&t);\r
10449 \r
10450         if (g->EditMode == false)\r
10451         {\r
10452                 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("SM_GROUP_CREATED"), group->Name);\r
10453         }\r
10454 \r
10455         EndDialog(hWnd, true);\r
10456 }\r
10457 \r
10458 // グループ編集ダイアログプロシージャ\r
10459 UINT SmEditGroupDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
10460 {\r
10461         SM_EDIT_GROUP *g = (SM_EDIT_GROUP *)param;\r
10462         wchar_t tmp[MAX_SIZE];\r
10463         NMHDR *n;\r
10464         // 引数チェック\r
10465         if (hWnd == NULL)\r
10466         {\r
10467                 return 0;\r
10468         }\r
10469 \r
10470         switch (msg)\r
10471         {\r
10472         case WM_INITDIALOG:\r
10473                 // 初期化\r
10474                 SmEditGroupDlgInit(hWnd, g);\r
10475                 break;\r
10476 \r
10477         case WM_COMMAND:\r
10478                 switch (LOWORD(wParam))\r
10479                 {\r
10480                 case E_GROUPNAME:\r
10481                 case E_REALNAME:\r
10482                 case E_NOTE:\r
10483                 case R_POLICY:\r
10484                         SmEditGroupDlgUpdate(hWnd, g);\r
10485                         break;\r
10486                 }\r
10487 \r
10488                 switch (wParam)\r
10489                 {\r
10490                 case IDOK:\r
10491                         // OK ボタン\r
10492                         SmEditGroupDlgOnOk(hWnd, g);\r
10493                         break;\r
10494 \r
10495                 case IDCANCEL:\r
10496                         // キャンセルボタン\r
10497                         Close(hWnd);\r
10498                         break;\r
10499 \r
10500                 case R_POLICY:\r
10501                         if (IsChecked(hWnd, R_POLICY))\r
10502                         {\r
10503                                 Focus(hWnd, B_POLICY);\r
10504                         }\r
10505                         break;\r
10506 \r
10507                 case B_POLICY:\r
10508                         // セキュリティ ポリシー\r
10509                         UniFormat(tmp, sizeof(tmp), _UU("SM_GROUP_POLICY_CAPTION"), g->SetGroup.Name);\r
10510                         if (g->SetGroup.Policy == NULL)\r
10511                         {\r
10512                                 POLICY *p = ClonePolicy(GetDefaultPolicy());\r
10513                                 if (SmPolicyDlgEx2(hWnd, p, tmp, false, g->p->PolicyVer))\r
10514                                 {\r
10515                                         g->SetGroup.Policy = p;\r
10516                                         SmEditGroupDlgUpdate(hWnd, g);\r
10517                                 }\r
10518                                 else\r
10519                                 {\r
10520                                         Free(p);\r
10521                                 }\r
10522                         }\r
10523                         else\r
10524                         {\r
10525                                 SmPolicyDlgEx2(hWnd, g->SetGroup.Policy, tmp, false, g->p->PolicyVer);\r
10526                         }\r
10527                         break;\r
10528                 }\r
10529                 break;\r
10530 \r
10531         case WM_NOTIFY:\r
10532                 n = (NMHDR *)lParam;\r
10533                 switch (n->idFrom)\r
10534                 {\r
10535                 case L_STATUS:\r
10536                         switch (n->code)\r
10537                         {\r
10538                         case LVN_ITEMCHANGED:\r
10539                                 SmEditGroupDlgUpdate(hWnd, g);\r
10540                                 break;\r
10541                         }\r
10542                         break;\r
10543                 }\r
10544                 break;\r
10545 \r
10546         case WM_CLOSE:\r
10547                 EndDialog(hWnd, false);\r
10548                 break;\r
10549         }\r
10550 \r
10551         return 0;\r
10552 }\r
10553 \r
10554 // グループ編集ダイアログ\r
10555 bool SmEditGroupDlg(HWND hWnd, SM_GROUP *s, char *name)\r
10556 {\r
10557         SM_EDIT_GROUP g;\r
10558         RPC_SET_GROUP *group;\r
10559         bool ret;\r
10560         // 引数チェック\r
10561         if (hWnd == NULL || s == NULL)\r
10562         {\r
10563                 return false;\r
10564         }\r
10565 \r
10566         Zero(&g, sizeof(g));\r
10567         g.EditMode = true;\r
10568         g.Hub = s->Hub;\r
10569         g.p = s->p;\r
10570         g.Rpc = s->Rpc;\r
10571 \r
10572         group = &g.SetGroup;\r
10573 \r
10574         StrCpy(group->Name, sizeof(group->Name), name);\r
10575         StrCpy(group->HubName, sizeof(group->HubName), s->Hub->HubName);\r
10576 \r
10577         if (CALL(hWnd, ScGetGroup(s->Rpc, group)) == false)\r
10578         {\r
10579                 return false;\r
10580         }\r
10581 \r
10582         ret = Dialog(hWnd, D_SM_EDIT_GROUP, SmEditGroupDlgProc, &g);\r
10583 \r
10584         FreeRpcSetGroup(group);\r
10585 \r
10586         return ret;\r
10587 }\r
10588 \r
10589 // グループ作成ダイアログ\r
10590 bool SmCreateGroupDlg(HWND hWnd, SM_GROUP *s)\r
10591 {\r
10592         SM_EDIT_GROUP g;\r
10593         RPC_SET_GROUP *group;\r
10594         bool ret;\r
10595         // 引数チェック\r
10596         if (hWnd == NULL || s == NULL)\r
10597         {\r
10598                 return false;\r
10599         }\r
10600 \r
10601         Zero(&g, sizeof(g));\r
10602         g.EditMode = false;\r
10603         g.Hub = s->Hub;\r
10604         g.p = s->p;\r
10605         g.Rpc = s->Rpc;\r
10606 \r
10607         group = &g.SetGroup;\r
10608 \r
10609         StrCpy(group->HubName, sizeof(group->HubName), s->Hub->HubName);\r
10610 \r
10611         ret = Dialog(hWnd, D_SM_EDIT_GROUP, SmEditGroupDlgProc, &g);\r
10612 \r
10613         FreeRpcSetGroup(group);\r
10614 \r
10615         return ret;\r
10616 }\r
10617 \r
10618 // 初期化\r
10619 void SmGroupListDlgInit(HWND hWnd, SM_GROUP *s)\r
10620 {\r
10621         if (hWnd == NULL || s == NULL)\r
10622         {\r
10623                 return;\r
10624         }\r
10625 \r
10626         SetIcon(hWnd, 0, ICO_GROUP);\r
10627 \r
10628         // カラム初期化\r
10629         LvInit(hWnd, L_GROUP);\r
10630         LvInsertColumn(hWnd, L_GROUP, 0, _UU("SM_GROUPLIST_NAME"), 130);\r
10631         LvInsertColumn(hWnd, L_GROUP, 1, _UU("SM_GROUPLIST_REALNAME"), 130);\r
10632         LvInsertColumn(hWnd, L_GROUP, 2, _UU("SM_GROUPLIST_NOTE"), 170);\r
10633         LvInsertColumn(hWnd, L_GROUP, 3, _UU("SM_GROUPLIST_NUMUSERS"), 80);\r
10634         LvSetStyle(hWnd, L_GROUP, LVS_EX_GRIDLINES);\r
10635 \r
10636         FormatText(hWnd, S_TITLE, s->Hub->HubName);\r
10637 \r
10638         SmGroupListDlgRefresh(hWnd, s);\r
10639 \r
10640         if (s->SelectMode)\r
10641         {\r
10642                 SetStyle(hWnd, L_GROUP, LVS_SINGLESEL);\r
10643         }\r
10644 \r
10645         if (s->SelectMode)\r
10646         {\r
10647                 wchar_t tmp[MAX_SIZE];\r
10648                 SetText(hWnd, IDOK, _UU("SM_SELECT_GROUP"));\r
10649 \r
10650                 if (s->SelectedGroupName != NULL)\r
10651                 {\r
10652                         UINT i;\r
10653                         StrToUni(tmp, sizeof(tmp), s->SelectedGroupName);\r
10654                         i = LvSearchStr(hWnd, L_GROUP, 0, tmp);\r
10655                         if (i != INFINITE)\r
10656                         {\r
10657                                 LvSelect(hWnd, L_GROUP, i);\r
10658                         }\r
10659                 }\r
10660         }\r
10661 }\r
10662 \r
10663 // コントロール更新\r
10664 void SmGroupListDlgUpdate(HWND hWnd, SM_GROUP *s)\r
10665 {\r
10666         bool ok = true;\r
10667         if (hWnd == NULL || s == NULL)\r
10668         {\r
10669                 return;\r
10670         }\r
10671 \r
10672         if (LvIsSelected(hWnd, L_GROUP) == false || LvIsMultiMasked(hWnd, L_GROUP))\r
10673         {\r
10674                 ok = false;\r
10675         }\r
10676 \r
10677         SetEnable(hWnd, IDOK, ok);\r
10678         SetEnable(hWnd, B_USER, ok);\r
10679         SetEnable(hWnd, B_STATUS, ok);\r
10680 \r
10681         if (s->SelectMode == false)\r
10682         {\r
10683                 SetEnable(hWnd, B_DELETE, ok);\r
10684         }\r
10685         else\r
10686         {\r
10687                 SetEnable(hWnd, B_DELETE, false);\r
10688                 SetEnable(hWnd, B_USER, false);\r
10689                 SetText(hWnd, IDCANCEL, _UU("SM_SELECT_NO_GROUP"));\r
10690         }\r
10691 }\r
10692 \r
10693 // 内容更新\r
10694 void SmGroupListDlgRefresh(HWND hWnd, SM_GROUP *s)\r
10695 {\r
10696         RPC_ENUM_GROUP t;\r
10697         UINT i;\r
10698         LVB *b;\r
10699         if (hWnd == NULL || s == NULL)\r
10700         {\r
10701                 return;\r
10702         }\r
10703 \r
10704         Zero(&t, sizeof(t));\r
10705         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
10706 \r
10707         if (CALL(hWnd, ScEnumGroup(s->Rpc, &t)) == false)\r
10708         {\r
10709                 return;\r
10710         }\r
10711 \r
10712         b = LvInsertStart();\r
10713 \r
10714         for (i = 0;i < t.NumGroup;i++)\r
10715         {\r
10716                 wchar_t tmp1[MAX_SIZE];\r
10717                 wchar_t tmp2[MAX_SIZE];\r
10718                 RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];\r
10719 \r
10720                 StrToUni(tmp1, sizeof(tmp1), e->Name);\r
10721                 UniToStru(tmp2, e->NumUsers);\r
10722 \r
10723                 LvInsertAdd(b, e->DenyAccess == false ? ICO_GROUP : ICO_GROUP_DENY,\r
10724                         NULL, 4, tmp1, e->Realname, e->Note, tmp2);\r
10725         }\r
10726 \r
10727         LvInsertEnd(b, hWnd, L_GROUP);\r
10728 \r
10729         SmGroupListDlgUpdate(hWnd, s);\r
10730 \r
10731         FreeRpcEnumGroup(&t);\r
10732 }\r
10733 \r
10734 // グループリストダイアログプロシージャ\r
10735 UINT SmGroupListDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
10736 {\r
10737         SM_GROUP *s = (SM_GROUP *)param;\r
10738         NMHDR *n;\r
10739         wchar_t *tmp;\r
10740         // 引数チェック\r
10741         if (hWnd == NULL)\r
10742         {\r
10743                 return 0;\r
10744         }\r
10745 \r
10746         switch (msg)\r
10747         {\r
10748         case WM_INITDIALOG:\r
10749                 // 初期化\r
10750                 SmGroupListDlgInit(hWnd, s);\r
10751                 break;\r
10752 \r
10753         case WM_COMMAND:\r
10754                 switch (wParam)\r
10755                 {\r
10756                 case B_CREATE:\r
10757                         // 新規作成\r
10758                         if (SmCreateGroupDlg(hWnd, s))\r
10759                         {\r
10760                                 SmGroupListDlgRefresh(hWnd, s);\r
10761                         }\r
10762                         break;\r
10763 \r
10764                 case IDOK:\r
10765                         // 編集\r
10766                         tmp = LvGetSelectedStr(hWnd, L_GROUP, 0);\r
10767                         if (tmp != NULL)\r
10768                         {\r
10769                                 char name[MAX_SIZE];\r
10770                                 UniToStr(name, sizeof(name), tmp);\r
10771 \r
10772                                 if (s->SelectMode == false)\r
10773                                 {\r
10774                                         if (SmEditGroupDlg(hWnd, s, name))\r
10775                                         {\r
10776                                                 SmGroupListDlgRefresh(hWnd, s);\r
10777                                         }\r
10778                                 }\r
10779                                 else\r
10780                                 {\r
10781                                         s->SelectedGroupName = CopyStr(name);\r
10782                                         EndDialog(hWnd, true);\r
10783                                 }\r
10784                                 Free(tmp);\r
10785                         }\r
10786                         break;\r
10787 \r
10788                 case B_DELETE:\r
10789                         // 削除\r
10790                         tmp = LvGetSelectedStr(hWnd, L_GROUP, 0);\r
10791                         if (tmp != NULL)\r
10792                         {\r
10793                                 char name[MAX_SIZE];\r
10794                                 RPC_DELETE_USER t;\r
10795                                 UniToStr(name, sizeof(name), tmp);\r
10796 \r
10797                                 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
10798                                         _UU("SM_GROUP_DELETE_MSG"), name) == IDYES)\r
10799                                 {\r
10800                                         Zero(&t, sizeof(t));\r
10801                                         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
10802                                         StrCpy(t.Name, sizeof(t.Name), name);\r
10803 \r
10804                                         if (CALL(hWnd, ScDeleteGroup(s->Rpc, &t)))\r
10805                                         {\r
10806                                                 SmGroupListDlgRefresh(hWnd, s);\r
10807                                         }\r
10808                                 }\r
10809 \r
10810                                 Free(tmp);\r
10811                         }\r
10812                         break;\r
10813 \r
10814                 case B_USER:\r
10815                         // メンバ一覧\r
10816                         tmp = LvGetSelectedStr(hWnd, L_GROUP, 0);\r
10817                         if (tmp != NULL)\r
10818                         {\r
10819                                 char name[MAX_SIZE];\r
10820                                 UniToStr(name, sizeof(name), tmp);\r
10821                                 SmUserListDlgEx(hWnd, s->Hub, name, false);\r
10822                                 Free(tmp);\r
10823                         }\r
10824                         break;\r
10825 \r
10826                 case B_REFRESH:\r
10827                         // 最新情報に更新\r
10828                         SmGroupListDlgRefresh(hWnd, s);\r
10829                         break;\r
10830 \r
10831                 case IDCANCEL:\r
10832                         // キャンセルボタン\r
10833                         Close(hWnd);\r
10834                         break;\r
10835                 }\r
10836                 break;\r
10837 \r
10838         case WM_NOTIFY:\r
10839                 n = (NMHDR *)lParam;\r
10840                 switch (n->idFrom)\r
10841                 {\r
10842                 case L_GROUP:\r
10843                         switch (n->code)\r
10844                         {\r
10845                         case LVN_ITEMCHANGED:\r
10846                                 SmGroupListDlgUpdate(hWnd, s);\r
10847                                 break;\r
10848                         }\r
10849                         break;\r
10850                 }\r
10851                 break;\r
10852 \r
10853         case WM_CLOSE:\r
10854                 EndDialog(hWnd, false);\r
10855                 break;\r
10856         }\r
10857 \r
10858         LvStandardHandler(hWnd, msg, wParam, lParam, L_GROUP);\r
10859 \r
10860         return 0;\r
10861 }\r
10862 \r
10863 // グループリストダイアログ (選択モード)\r
10864 char *SmSelectGroupDlg(HWND hWnd, SM_HUB *s, char *default_name)\r
10865 {\r
10866         SM_GROUP g;\r
10867         // 引数チェック\r
10868         if (hWnd == NULL || s == NULL)\r
10869         {\r
10870                 return NULL;\r
10871         }\r
10872 \r
10873         Zero(&g, sizeof(g));\r
10874         g.Hub = s;\r
10875         g.p = s->p;\r
10876         g.Rpc = s->Rpc;\r
10877         g.SelectMode = true;\r
10878         g.SelectedGroupName = default_name;\r
10879 \r
10880         if (Dialog(hWnd, D_SM_GROUP, SmGroupListDlgProc, &g) == false)\r
10881         {\r
10882                 return NULL;\r
10883         }\r
10884 \r
10885         return g.SelectedGroupName;\r
10886 }\r
10887 \r
10888 // グループリストダイアログ\r
10889 void SmGroupListDlg(HWND hWnd, SM_HUB *s)\r
10890 {\r
10891         SM_GROUP g;\r
10892         // 引数チェック\r
10893         if (hWnd == NULL || s == NULL)\r
10894         {\r
10895                 return;\r
10896         }\r
10897 \r
10898         Zero(&g, sizeof(g));\r
10899         g.Hub = s;\r
10900         g.p = s->p;\r
10901         g.Rpc = s->Rpc;\r
10902         g.SelectMode = false;\r
10903 \r
10904         Dialog(hWnd, D_SM_GROUP, SmGroupListDlgProc, &g);\r
10905 }\r
10906 \r
10907 // ユーザー情報の更新\r
10908 bool SmRefreshUserInfo(HWND hWnd, SM_SERVER *s, void *param)\r
10909 {\r
10910         RPC_SET_USER t;\r
10911         SM_USER_INFO *p = (SM_USER_INFO *)param;\r
10912         LVB *b;\r
10913         wchar_t tmp[MAX_SIZE];\r
10914         char *username;\r
10915 \r
10916         // 引数チェック\r
10917         if (hWnd == NULL || s == NULL || param == NULL)\r
10918         {\r
10919                 return false;\r
10920         }\r
10921 \r
10922         username = p->Username;\r
10923 \r
10924         Zero(&t, sizeof(t));\r
10925         StrCpy(t.HubName, sizeof(t.HubName), p->Hub->HubName);\r
10926         StrCpy(t.Name, sizeof(t.Name), username);\r
10927 \r
10928         if (CALL(hWnd, ScGetUser(s->Rpc, &t)) == false)\r
10929         {\r
10930                 return false;\r
10931         }\r
10932 \r
10933         b = LvInsertStart();\r
10934 \r
10935         StrToUni(tmp, sizeof(tmp), t.Name);\r
10936         LvInsertAdd(b, ICO_USER, NULL, 2, _UU("SM_USERINFO_NAME"), tmp);\r
10937 \r
10938         if (StrLen(t.GroupName) != 0)\r
10939         {\r
10940                 StrToUni(tmp, sizeof(tmp), t.GroupName);\r
10941                 LvInsertAdd(b, ICO_GROUP, NULL, 2, _UU("SM_USERINFO_GROUP"), tmp);\r
10942         }\r
10943 \r
10944         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);\r
10945         LvInsertAdd(b, ICO_USER_ADMIN, NULL, 2, _UU("SM_USERINFO_CREATE"), tmp);\r
10946 \r
10947         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);\r
10948         LvInsertAdd(b, ICO_USER_ADMIN, NULL, 2, _UU("SM_USERINFO_UPDATE"), tmp);\r
10949 \r
10950         if (t.ExpireTime != 0)\r
10951         {\r
10952                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);\r
10953                 LvInsertAdd(b, ICO_WARNING, NULL, 2, _UU("SM_USERINFO_EXPIRE"), tmp);\r
10954         }\r
10955 \r
10956         SmInsertTrafficInfo(b, &t.Traffic);\r
10957 \r
10958         UniToStru(tmp, t.NumLogin);\r
10959         LvInsertAdd(b, ICO_LINK, NULL, 2, _UU("SM_USERINFO_NUMLOGIN"), tmp);\r
10960 \r
10961         LvInsertEnd(b, hWnd, L_STATUS);\r
10962 \r
10963         FreeRpcSetUser(&t);\r
10964 \r
10965         return true;\r
10966 }\r
10967 \r
10968 // 初期化\r
10969 void SmPolicyDlgInit(HWND hWnd, SM_POLICY *s)\r
10970 {\r
10971         CM_POLICY cp;\r
10972         // 引数チェック\r
10973         if (hWnd == NULL || s == NULL)\r
10974         {\r
10975                 return;\r
10976         }\r
10977 \r
10978         SetIcon(hWnd, 0, ICO_MACHINE);\r
10979         SetText(hWnd, 0, s->Caption);\r
10980         SetText(hWnd, S_TITLE, s->Caption);\r
10981         DlgFont(hWnd, S_BOLD, 10, true);\r
10982         DlgFont(hWnd, S_BOLD2, 10, true);\r
10983 \r
10984         DlgFont(hWnd, S_POLICY_TITLE, 11, false);\r
10985         DlgFont(hWnd, E_POLICY_DESCRIPTION, 10, false);\r
10986 \r
10987         Zero(&cp, sizeof(cp));\r
10988         cp.Policy = s->Policy;\r
10989         cp.Extension = true;\r
10990 \r
10991         LvInit(hWnd, L_POLICY);\r
10992         LvInsertColumn(hWnd, L_POLICY, 0, _UU("POL_TITLE_STR"), 250);\r
10993         LvInsertColumn(hWnd, L_POLICY, 1, _UU("POL_VALUE_STR"), 150);\r
10994         LvSetStyle(hWnd, L_POLICY, LVS_EX_GRIDLINES);\r
10995 \r
10996         CmPolicyDlgPrintEx2(hWnd, &cp, s->CascadeMode, s->Ver);\r
10997 \r
10998         LvSelect(hWnd, L_POLICY, 0);\r
10999 \r
11000         s->Inited = true;\r
11001         SmPolicyDlgUpdate(hWnd, s);\r
11002 }\r
11003 \r
11004 // 更新\r
11005 void SmPolicyDlgUpdate(HWND hWnd, SM_POLICY *s)\r
11006 {\r
11007         bool ok = true;\r
11008         bool value_changed = false;\r
11009         UINT i;\r
11010         // 引数チェック\r
11011         if (hWnd == NULL || s == NULL)\r
11012         {\r
11013                 return;\r
11014         }\r
11015 \r
11016         if (s->Inited == false)\r
11017         {\r
11018                 return;\r
11019         }\r
11020 \r
11021         i = LvGetSelected(hWnd, L_POLICY);\r
11022         if (i != INFINITE)\r
11023         {\r
11024                 i = (UINT)LvGetParam(hWnd, L_POLICY, i);\r
11025         }\r
11026         if (i == INFINITE || i >= NUM_POLICY_ITEM)\r
11027         {\r
11028                 SetText(hWnd, S_POLICY_TITLE, _UU("SM_POLICY_INIT_TITLE"));\r
11029                 SetText(hWnd, E_POLICY_DESCRIPTION, L"");\r
11030                 Disable(hWnd, S_POLICY_TITLE);\r
11031                 Disable(hWnd, S_BOLD);\r
11032                 Hide(hWnd, S_BOLD2);\r
11033                 Hide(hWnd, R_ENABLE);\r
11034                 Hide(hWnd, R_DISABLE);\r
11035                 Hide(hWnd, R_DEFINE);\r
11036                 Hide(hWnd, E_VALUE);\r
11037                 Hide(hWnd, S_TANI);\r
11038                 Hide(hWnd, S_LIMIT);\r
11039         }\r
11040         else\r
11041         {\r
11042                 POLICY_ITEM *item = &policy_item[i];\r
11043                 bool changed = false;\r
11044                 wchar_t *tmp = GetText(hWnd, S_POLICY_TITLE);\r
11045                 if (UniStrCmp(tmp, GetPolicyTitle(i)) != 0)\r
11046                 {\r
11047                         changed = true;\r
11048                 }\r
11049                 Free(tmp);\r
11050                 SetText(hWnd, S_POLICY_TITLE, GetPolicyTitle(i));\r
11051                 SetText(hWnd, E_POLICY_DESCRIPTION, GetPolicyDescription(i));\r
11052                 Enable(hWnd, S_POLICY_TITLE);\r
11053                 Enable(hWnd, S_BOLD);\r
11054                 Show(hWnd, S_BOLD2);\r
11055 \r
11056                 if (item->TypeInt == false)\r
11057                 {\r
11058                         Show(hWnd, R_ENABLE);\r
11059                         Show(hWnd, R_DISABLE);\r
11060                         Hide(hWnd, R_DEFINE);\r
11061                         Hide(hWnd, E_VALUE);\r
11062                         Hide(hWnd, S_TANI);\r
11063                         Hide(hWnd, S_LIMIT);\r
11064 \r
11065                         if (changed)\r
11066                         {\r
11067                                 if (POLICY_BOOL(s->Policy, i))\r
11068                                 {\r
11069                                         Check(hWnd, R_ENABLE, true);\r
11070                                         Check(hWnd, R_DISABLE, false);\r
11071                                 }\r
11072                                 else\r
11073                                 {\r
11074                                         Check(hWnd, R_ENABLE, false);\r
11075                                         Check(hWnd, R_DISABLE, true);\r
11076                                 }\r
11077                         }\r
11078 \r
11079                         if ((!(POLICY_BOOL(s->Policy, i))) != (!(IsChecked(hWnd, R_ENABLE))))\r
11080                         {\r
11081                                 POLICY_BOOL(s->Policy, i) = IsChecked(hWnd, R_ENABLE);\r
11082                                 value_changed = true;\r
11083                         }\r
11084                 }\r
11085                 else\r
11086                 {\r
11087                         wchar_t tmp[MAX_SIZE];\r
11088                         UINT value;\r
11089                         if (item->AllowZero)\r
11090                         {\r
11091                                 if (changed)\r
11092                                 {\r
11093                                         Check(hWnd, R_DEFINE, POLICY_INT(s->Policy, i) != 0);\r
11094                                         Enable(hWnd, R_DEFINE);\r
11095                                         SetIntEx(hWnd, E_VALUE, POLICY_INT(s->Policy, i));\r
11096                                 }\r
11097 \r
11098                                 SetEnable(hWnd, E_VALUE, IsChecked(hWnd, R_DEFINE));\r
11099                                 SetEnable(hWnd, S_TANI, IsChecked(hWnd, R_DEFINE));\r
11100                                 SetEnable(hWnd, S_LIMIT, IsChecked(hWnd, R_DEFINE));\r
11101                         }\r
11102                         else\r
11103                         {\r
11104                                 if (changed)\r
11105                                 {\r
11106                                         Check(hWnd, R_DEFINE, true);\r
11107                                         Disable(hWnd, R_DEFINE);\r
11108                                         SetInt(hWnd, E_VALUE, POLICY_INT(s->Policy, i));\r
11109                                 }\r
11110 \r
11111                                 SetEnable(hWnd, E_VALUE, IsChecked(hWnd, R_DEFINE));\r
11112                                 SetEnable(hWnd, S_TANI, IsChecked(hWnd, R_DEFINE));\r
11113                                 SetEnable(hWnd, S_LIMIT, IsChecked(hWnd, R_DEFINE));\r
11114                         }\r
11115 \r
11116                         UniReplaceStrEx(tmp, sizeof(tmp), _UU(policy_item[i].FormatStr),\r
11117                                 L"%u ", L"", false);\r
11118                         UniReplaceStrEx(tmp, sizeof(tmp), tmp,\r
11119                                 L"%u", L"", false);\r
11120 \r
11121                         SetText(hWnd, S_TANI, tmp);\r
11122 \r
11123                         UniFormat(tmp, sizeof(tmp), _UU("SM_LIMIT_STR"), policy_item[i].MinValue, policy_item[i].MaxValue);\r
11124                         SetText(hWnd, S_LIMIT, tmp);\r
11125 \r
11126                         Hide(hWnd, R_ENABLE);\r
11127                         Hide(hWnd, R_DISABLE);\r
11128                         Show(hWnd, E_VALUE);\r
11129                         Show(hWnd, R_DEFINE);\r
11130                         Show(hWnd, S_TANI);\r
11131                         Show(hWnd, S_LIMIT);\r
11132 \r
11133                         value = GetInt(hWnd, E_VALUE);\r
11134 \r
11135                         if (item->AllowZero && (IsChecked(hWnd, R_DEFINE) == false))\r
11136                         {\r
11137                                 value = 0;\r
11138                         }\r
11139                         else\r
11140                         {\r
11141                                 if (value < policy_item[i].MinValue || value > policy_item[i].MaxValue)\r
11142                                 {\r
11143                                         ok = false;\r
11144                                 }\r
11145                         }\r
11146 \r
11147                         if (ok)\r
11148                         {\r
11149                                 if (POLICY_INT(s->Policy, i) != value)\r
11150                                 {\r
11151                                         POLICY_INT(s->Policy, i) = value;\r
11152                                         value_changed = true;\r
11153                                 }\r
11154                         }\r
11155                 }\r
11156         }\r
11157 \r
11158         SetEnable(hWnd, IDOK, ok);\r
11159         SetEnable(hWnd, L_POLICY, ok);\r
11160 \r
11161         if (value_changed)\r
11162         {\r
11163                 CM_POLICY cp;\r
11164                 Zero(&cp, sizeof(cp));\r
11165                 cp.Policy = s->Policy;\r
11166                 cp.Extension = true;\r
11167 \r
11168                 CmPolicyDlgPrintEx(hWnd, &cp, s->CascadeMode);\r
11169         }\r
11170 }\r
11171 \r
11172 // 確定\r
11173 void SmPolicyDlgOk(HWND hWnd, SM_POLICY *s)\r
11174 {\r
11175         // 引数チェック\r
11176         if (hWnd == NULL || s == NULL)\r
11177         {\r
11178                 return;\r
11179         }\r
11180 \r
11181         EndDialog(hWnd, true);\r
11182 }\r
11183 \r
11184 // ポリシー ダイアログ ボックス プロシージャ\r
11185 UINT SmPolicyDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
11186 {\r
11187         SM_POLICY *s = (SM_POLICY *)param;\r
11188         NMHDR *n;\r
11189         // 引数チェック\r
11190         if (hWnd == NULL)\r
11191         {\r
11192                 return 0;\r
11193         }\r
11194 \r
11195         switch (msg)\r
11196         {\r
11197         case WM_INITDIALOG:\r
11198                 // 初期化\r
11199                 SmPolicyDlgInit(hWnd, s);\r
11200                 break;\r
11201 \r
11202         case WM_COMMAND:\r
11203                 switch (LOWORD(wParam))\r
11204                 {\r
11205                 case R_DEFINE:\r
11206                 case R_ENABLE:\r
11207                 case R_DISABLE:\r
11208                 case E_VALUE:\r
11209                         SmPolicyDlgUpdate(hWnd, s);\r
11210                         break;\r
11211                 }\r
11212 \r
11213                 switch (wParam)\r
11214                 {\r
11215                 case IDOK:\r
11216                         // OK ボタン\r
11217                         SmPolicyDlgOk(hWnd, s);\r
11218                         break;\r
11219 \r
11220                 case IDCANCEL:\r
11221                         // キャンセルボタン\r
11222                         Close(hWnd);\r
11223                         break;\r
11224 \r
11225                 case R_DEFINE:\r
11226                         if (IsChecked(hWnd, R_DEFINE))\r
11227                         {\r
11228                                 FocusEx(hWnd, E_VALUE);\r
11229                         }\r
11230                         break;\r
11231                 }\r
11232                 break;\r
11233 \r
11234         case WM_NOTIFY:\r
11235                 n = (NMHDR *)lParam;\r
11236                 switch (n->idFrom)\r
11237                 {\r
11238                 case L_POLICY:\r
11239                         switch (n->code)\r
11240                         {\r
11241                         case LVN_ITEMCHANGED:\r
11242                                 SmPolicyDlgUpdate(hWnd, s);\r
11243                                 break;\r
11244                         }\r
11245                         break;\r
11246                 }\r
11247                 break;\r
11248 \r
11249         case WM_CLOSE:\r
11250                 EndDialog(hWnd, false);\r
11251                 break;\r
11252         }\r
11253 \r
11254         return 0;\r
11255 }\r
11256 \r
11257 // ポリシー ダイアログ ボックスの表示\r
11258 bool SmPolicyDlg(HWND hWnd, POLICY *p, wchar_t *caption)\r
11259 {\r
11260         return SmPolicyDlgEx(hWnd, p, caption, false);\r
11261 }\r
11262 bool SmPolicyDlgEx(HWND hWnd, POLICY *p, wchar_t *caption, bool cascade_mode)\r
11263 {\r
11264         return SmPolicyDlgEx2(hWnd, p, caption, cascade_mode, POLICY_CURRENT_VERSION);\r
11265 }\r
11266 bool SmPolicyDlgEx2(HWND hWnd, POLICY *p, wchar_t *caption, bool cascade_mode, UINT ver)\r
11267 {\r
11268         SM_POLICY s;\r
11269         bool ret;\r
11270         // 引数チェック\r
11271         if (hWnd == NULL || p == NULL)\r
11272         {\r
11273                 return false;\r
11274         }\r
11275 \r
11276         if (caption == NULL)\r
11277         {\r
11278                 caption = _UU("SM_POLICY_DEF_CAPTION");\r
11279         }\r
11280 \r
11281         Zero(&s, sizeof(s));\r
11282         s.Caption = caption;\r
11283         s.Policy = ClonePolicy(p);\r
11284         s.CascadeMode = cascade_mode;\r
11285         s.Ver = ver;\r
11286 \r
11287         ret = Dialog(hWnd, D_SM_POLICY, SmPolicyDlgProc, &s);\r
11288 \r
11289         if (ret)\r
11290         {\r
11291                 Copy(p, s.Policy, sizeof(POLICY));\r
11292         }\r
11293 \r
11294         Free(s.Policy);\r
11295 \r
11296         return ret;\r
11297 }\r
11298 \r
11299 // ユーザー編集確定\r
11300 void SmEditUserDlgOk(HWND hWnd, SM_EDIT_USER *s)\r
11301 {\r
11302         RPC_SET_USER t;\r
11303         RPC_SET_USER *u;\r
11304         // 引数チェック\r
11305         if (hWnd == NULL || s == NULL)\r
11306         {\r
11307                 return;\r
11308         }\r
11309 \r
11310         SmEditUserDlgUpdate(hWnd, s);\r
11311 \r
11312         Zero(&t, sizeof(t));\r
11313         u = &s->SetUser;\r
11314 \r
11315         StrCpy(t.HubName, sizeof(t.HubName), u->HubName);\r
11316         StrCpy(t.Name, sizeof(t.Name), u->Name);\r
11317         StrCpy(t.GroupName, sizeof(t.GroupName), u->GroupName);\r
11318         UniStrCpy(t.Realname, sizeof(t.Realname), u->Realname);\r
11319         UniStrCpy(t.Note, sizeof(t.Note), u->Note);\r
11320         t.ExpireTime = u->ExpireTime;\r
11321         t.AuthType = u->AuthType;\r
11322         t.AuthData = CopyAuthData(u->AuthData, t.AuthType);\r
11323 \r
11324         if (IsChecked(hWnd, R_POLICY))\r
11325         {\r
11326                 t.Policy = ClonePolicy(u->Policy);\r
11327         }\r
11328         else\r
11329         {\r
11330                 t.Policy = NULL;\r
11331         }\r
11332 \r
11333         if (s->EditMode == false)\r
11334         {\r
11335                 if (CALL(hWnd, ScCreateUser(s->Rpc, &t)) == false)\r
11336                 {\r
11337                         FocusEx(hWnd, E_USERNAME);\r
11338                         return;\r
11339                 }\r
11340                 FreeRpcSetUser(&t);\r
11341 \r
11342                 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("SM_USER_CREEATE_OK"), u->Name);\r
11343         }\r
11344         else\r
11345         {\r
11346                 if (CALL(hWnd, ScSetUser(s->Rpc, &t)) == false)\r
11347                 {\r
11348                         FocusEx(hWnd, E_REALNAME);\r
11349                         return;\r
11350                 }\r
11351                 FreeRpcSetUser(&t);\r
11352         }\r
11353 \r
11354         EndDialog(hWnd, true);\r
11355 }\r
11356 \r
11357 // ユーザー編集初期化\r
11358 void SmEditUserDlgInit(HWND hWnd, SM_EDIT_USER *s)\r
11359 {\r
11360         RPC_SET_USER *u;\r
11361         wchar_t tmp[MAX_SIZE];\r
11362         UINT i;\r
11363         UINT icons[6] = {ICO_PASS, ICO_KEY, ICO_CERT, ICO_SERVER_CERT,\r
11364                 ICO_TOWER, ICO_LINK};\r
11365         RECT rect;\r
11366 \r
11367         // 引数チェック\r
11368         if (hWnd == NULL || s == NULL)\r
11369         {\r
11370                 return;\r
11371         }\r
11372 \r
11373         SetIcon(hWnd, 0, ICO_USER);\r
11374 \r
11375         u = &s->SetUser;\r
11376 \r
11377         // カラム初期化\r
11378         LvInit(hWnd, L_AUTH);\r
11379         LvSetStyle(hWnd, L_AUTH, LVS_EX_GRIDLINES);\r
11380 \r
11381         GetClientRect(DlgItem(hWnd, L_AUTH), &rect);\r
11382         LvInsertColumn(hWnd, L_AUTH, 0, L"Name", rect.right - rect.left);\r
11383 \r
11384         for (i = 0;i < 6;i++)\r
11385         {\r
11386                 LvInsert(hWnd, L_AUTH, icons[i], (void *)i, 1, SmGetAuthTypeStr(i));\r
11387         }\r
11388 \r
11389         // ユーザー名など\r
11390         SetTextA(hWnd, E_USERNAME, u->Name);\r
11391         SetText(hWnd, E_REALNAME, u->Realname);\r
11392         SetText(hWnd, E_NOTE, u->Note);\r
11393 \r
11394 \r
11395         // 有効期限\r
11396         if (u->ExpireTime == 0)\r
11397         {\r
11398                 SYSTEMTIME st;\r
11399                 Check(hWnd, R_EXPIRES, false);\r
11400                 GetLocalTime(&st);\r
11401                 UINT64ToSystem(&st, SystemToUINT64(&st) + (60 * 60 * 24 * 1000));\r
11402                 st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;\r
11403                 DateTime_SetSystemtime(DlgItem(hWnd, E_EXPIRES_DATE), GDT_VALID, &st);\r
11404                 DateTime_SetSystemtime(DlgItem(hWnd, E_EXPIRES_TIME), GDT_VALID, &st);\r
11405         }\r
11406         else\r
11407         {\r
11408                 SYSTEMTIME st;\r
11409                 UINT64ToSystem(&st, SystemToLocal64(u->ExpireTime));\r
11410                 Check(hWnd, R_EXPIRES, true);\r
11411                 DateTime_SetSystemtime(DlgItem(hWnd, E_EXPIRES_DATE), GDT_VALID, &st);\r
11412                 DateTime_SetSystemtime(DlgItem(hWnd, E_EXPIRES_TIME), GDT_VALID, &st);\r
11413         }\r
11414 \r
11415         SetStyle(hWnd, E_EXPIRES_DATE, DTS_LONGDATEFORMAT);\r
11416         SetWindowLong(DlgItem(hWnd, E_EXPIRES_TIME), GWL_STYLE, WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | DTS_RIGHTALIGN | DTS_TIMEFORMAT | DTS_UPDOWN);\r
11417 \r
11418         // グループ名\r
11419         SetTextA(hWnd, E_GROUP, u->GroupName);\r
11420 \r
11421         // 認証方法\r
11422         LvSelect(hWnd, L_AUTH, u->AuthType);\r
11423 \r
11424         SetText(hWnd, S_CERT_INFO, _UU("SM_EDIT_USER_CERT_INFO"));\r
11425 \r
11426         switch (u->AuthType)\r
11427         {\r
11428         case AUTHTYPE_PASSWORD:\r
11429                 if (s->EditMode)\r
11430                 {\r
11431                         SetTextA(hWnd, E_PASSWORD1, HIDDEN_PASSWORD);\r
11432                         SetTextA(hWnd, E_PASSWORD2, HIDDEN_PASSWORD);\r
11433                 }\r
11434                 break;\r
11435 \r
11436         case AUTHTYPE_USERCERT:\r
11437                 SmGetCertInfoStr(tmp, sizeof(tmp), ((AUTHUSERCERT *)u->AuthData)->UserX);\r
11438                 break;\r
11439 \r
11440         case AUTHTYPE_ROOTCERT:\r
11441                 if (u->AuthData != NULL)\r
11442                 {\r
11443                         AUTHROOTCERT *c = (AUTHROOTCERT *)u->AuthData;\r
11444                         if (c->CommonName != NULL && UniStrLen(c->CommonName) != 0)\r
11445                         {\r
11446                                 Check(hWnd, R_CN, true);\r
11447                                 SetText(hWnd, E_CN, c->CommonName);\r
11448                         }\r
11449                         else\r
11450                         {\r
11451                                 Check(hWnd, R_CN, false);\r
11452                         }\r
11453                         if (c->Serial != NULL && c->Serial->size != 0)\r
11454                         {\r
11455                                 X_SERIAL *s = c->Serial;\r
11456                                 char *tmp;\r
11457                                 UINT tmp_size = s->size * 3 + 1;\r
11458                                 tmp = ZeroMalloc(tmp_size);\r
11459                                 BinToStrEx(tmp, tmp_size, s->data, s->size);\r
11460                                 SetTextA(hWnd, E_SERIAL, tmp);\r
11461                                 Free(tmp);\r
11462                                 Check(hWnd, R_SERIAL, true);\r
11463                         }\r
11464                         else\r
11465                         {\r
11466                                 Check(hWnd, R_SERIAL, false);\r
11467                         }\r
11468                 }\r
11469                 break;\r
11470 \r
11471         case AUTHTYPE_RADIUS:\r
11472                 if (u->AuthData != NULL)\r
11473                 {\r
11474                         AUTHRADIUS *r = (AUTHRADIUS *)u->AuthData;\r
11475                         if (UniStrLen(r->RadiusUsername) != 0)\r
11476                         {\r
11477                                 Check(hWnd, R_SET_RADIUS_USERNAME, true);\r
11478                                 SetText(hWnd, E_RADIUS_USERNAME, r->RadiusUsername);\r
11479                         }\r
11480                         else\r
11481                         {\r
11482                                 Check(hWnd, R_SET_RADIUS_USERNAME, false);\r
11483                         }\r
11484                 }\r
11485                 break;\r
11486 \r
11487         case AUTHTYPE_NT:\r
11488                 if (u->AuthData != NULL)\r
11489                 {\r
11490                         AUTHNT *n = (AUTHNT *)u->AuthData;\r
11491                         if (UniStrLen(n->NtUsername) != 0)\r
11492                         {\r
11493                                 Check(hWnd, R_SET_RADIUS_USERNAME, true);\r
11494                                 SetText(hWnd, E_RADIUS_USERNAME, n->NtUsername);\r
11495                         }\r
11496                         else\r
11497                         {\r
11498                                 Check(hWnd, R_SET_RADIUS_USERNAME, false);\r
11499                         }\r
11500                 }\r
11501                 break;\r
11502         }\r
11503 \r
11504         if (u->Policy != NULL)\r
11505         {\r
11506                 Check(hWnd, R_POLICY, true);\r
11507         }\r
11508 \r
11509         s->Inited = true;\r
11510 \r
11511         SmEditUserDlgUpdate(hWnd, s);\r
11512 \r
11513         if (s->EditMode == false)\r
11514         {\r
11515                 Focus(hWnd, E_USERNAME);\r
11516                 SetText(hWnd, 0, _UU("SM_EDIT_USER_CAPTION_1"));\r
11517         }\r
11518         else\r
11519         {\r
11520                 wchar_t tmp[MAX_SIZE];\r
11521                 UniFormat(tmp, sizeof(tmp), _UU("SM_EDIT_USER_CAPTION_2"), s->SetUser.Name);\r
11522                 SetText(hWnd, 0, tmp);\r
11523 \r
11524                 Disable(hWnd, E_USERNAME);\r
11525                 FocusEx(hWnd, E_REALNAME);\r
11526         }\r
11527 }\r
11528 \r
11529 // ユーザー編集コントロール更新\r
11530 void SmEditUserDlgUpdate(HWND hWnd, SM_EDIT_USER *s)\r
11531 {\r
11532         RPC_SET_USER *u;\r
11533         bool ok = true;\r
11534         UINT old_authtype;\r
11535         char tmp1[MAX_SIZE];\r
11536         char tmp2[MAX_SIZE];\r
11537         bool authtype_changed = false;\r
11538         // 引数チェック\r
11539         if (hWnd == NULL || s == NULL)\r
11540         {\r
11541                 return;\r
11542         }\r
11543 \r
11544         if (s->Inited == false)\r
11545         {\r
11546                 return;\r
11547         }\r
11548 \r
11549         u = &s->SetUser;\r
11550 \r
11551         // ユーザー名\r
11552         GetTxtA(hWnd, E_USERNAME, u->Name, sizeof(u->Name));\r
11553         Trim(u->Name);\r
11554         if (StrLen(u->Name) == 0 || IsUserName(u->Name) == false)\r
11555         {\r
11556                 ok = false;\r
11557         }\r
11558 \r
11559         // 本名\r
11560         GetTxt(hWnd, E_REALNAME, u->Realname, sizeof(u->Realname));\r
11561         UniTrim(u->Realname);\r
11562 \r
11563         // メモ\r
11564         GetTxt(hWnd, E_NOTE, u->Note, sizeof(u->Note));\r
11565         UniTrim(u->Realname);\r
11566 \r
11567         // グループ\r
11568         GetTxtA(hWnd, E_GROUP, u->GroupName, sizeof(u->GroupName));\r
11569         Trim(u->GroupName);\r
11570 \r
11571         // 有効期限\r
11572         if (IsChecked(hWnd, R_EXPIRES) == false)\r
11573         {\r
11574                 u->ExpireTime = 0;\r
11575                 Disable(hWnd, E_EXPIRES_DATE);\r
11576                 Disable(hWnd, E_EXPIRES_TIME);\r
11577         }\r
11578         else\r
11579         {\r
11580                 SYSTEMTIME st1, st2;\r
11581                 Enable(hWnd, E_EXPIRES_DATE);\r
11582                 Enable(hWnd, E_EXPIRES_TIME);\r
11583                 DateTime_GetSystemtime(DlgItem(hWnd, E_EXPIRES_DATE), &st1);\r
11584                 DateTime_GetSystemtime(DlgItem(hWnd, E_EXPIRES_TIME), &st2);\r
11585                 st1.wHour = st2.wHour;\r
11586                 st1.wMinute = st2.wMinute;\r
11587                 st1.wSecond = st2.wSecond;\r
11588                 st1.wMilliseconds = st2.wMilliseconds;\r
11589                 u->ExpireTime = LocalToSystem64(SystemToUINT64(&st1));\r
11590         }\r
11591 \r
11592         // 認証方法\r
11593         old_authtype = u->AuthType;\r
11594         u->AuthType = LvGetSelected(hWnd, L_AUTH);\r
11595 \r
11596         if (StrCmpi(u->Name, "*") == 0)\r
11597         {\r
11598                 if (u->AuthType != AUTHTYPE_RADIUS && u->AuthType != AUTHTYPE_NT)\r
11599                 {\r
11600                         ok = false;\r
11601                 }\r
11602         }\r
11603 \r
11604         if (u->AuthType == INFINITE)\r
11605         {\r
11606                 ok = false;\r
11607                 u->AuthType = 0;\r
11608         }\r
11609         if (old_authtype != u->AuthType)\r
11610         {\r
11611                 authtype_changed = true;\r
11612         }\r
11613 \r
11614         if (authtype_changed)\r
11615         {\r
11616                 FreeAuthData(old_authtype, u->AuthData);\r
11617                 u->AuthData = NULL;\r
11618                 switch (u->AuthType)\r
11619                 {\r
11620                 case AUTHTYPE_ANONYMOUS:\r
11621                         u->AuthData = NULL;\r
11622                         break;\r
11623 \r
11624                 case AUTHTYPE_PASSWORD:\r
11625                         u->AuthData = NewPasswordAuthData("", "");\r
11626                         GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));\r
11627                         if (StrCmp(tmp1, HIDDEN_PASSWORD) == 0)\r
11628                         {\r
11629                                 SetTextA(hWnd, E_PASSWORD1, "");\r
11630                         }\r
11631                         GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));\r
11632                         if (StrCmp(tmp2, HIDDEN_PASSWORD) == 0)\r
11633                         {\r
11634                                 SetTextA(hWnd, E_PASSWORD2, "");\r
11635                         }\r
11636                         break;\r
11637 \r
11638                 case AUTHTYPE_USERCERT:\r
11639                         u->AuthData = NewUserCertAuthData(NULL);\r
11640                         SetText(hWnd, S_CERT_INFO, _UU("SM_EDIT_USER_CERT_INFO"));\r
11641                         break;\r
11642 \r
11643                 case AUTHTYPE_ROOTCERT:\r
11644                         u->AuthData = NewRootCertAuthData(NULL, NULL);\r
11645                         break;\r
11646 \r
11647                 case AUTHTYPE_NT:\r
11648                         u->AuthData = NewNTAuthData(L"");\r
11649                         break;\r
11650 \r
11651                 case AUTHTYPE_RADIUS:\r
11652                         u->AuthData = NewRadiusAuthData(L"");\r
11653                         break;\r
11654                 }\r
11655         }\r
11656 \r
11657         SetEnable(hWnd, S_RADIUS_3, (u->AuthType == AUTHTYPE_RADIUS) || (u->AuthType == AUTHTYPE_NT));\r
11658         SetEnable(hWnd, R_SET_RADIUS_USERNAME, (u->AuthType == AUTHTYPE_RADIUS) || (u->AuthType == AUTHTYPE_NT));\r
11659         SetEnable(hWnd, S_RADIUS_1, (u->AuthType == AUTHTYPE_RADIUS) || (u->AuthType == AUTHTYPE_NT));\r
11660 \r
11661         if (StrCmp(u->Name, "*") == 0)\r
11662         {\r
11663                 Check(hWnd, R_SET_RADIUS_USERNAME, false);\r
11664                 Disable(hWnd, R_SET_RADIUS_USERNAME);\r
11665         }\r
11666 \r
11667         if ((u->AuthType == AUTHTYPE_RADIUS) || (u->AuthType == AUTHTYPE_NT))\r
11668         {\r
11669                 SetEnable(hWnd, E_RADIUS_USERNAME, IsChecked(hWnd, R_SET_RADIUS_USERNAME));\r
11670                 SetEnable(hWnd, S_RADIUS_2, IsChecked(hWnd, R_SET_RADIUS_USERNAME));\r
11671         }\r
11672         else\r
11673         {\r
11674                 SetEnable(hWnd, E_RADIUS_USERNAME, false);\r
11675                 SetEnable(hWnd, S_RADIUS_2, false);\r
11676         }\r
11677 \r
11678         SetEnable(hWnd, S_PASSWORD_1, u->AuthType == AUTHTYPE_PASSWORD);\r
11679         SetEnable(hWnd, S_PASSWORD_2, u->AuthType == AUTHTYPE_PASSWORD);\r
11680         SetEnable(hWnd, S_PASSWORD_3, u->AuthType == AUTHTYPE_PASSWORD);\r
11681         SetEnable(hWnd, E_PASSWORD1, u->AuthType == AUTHTYPE_PASSWORD);\r
11682         SetEnable(hWnd, E_PASSWORD2, u->AuthType == AUTHTYPE_PASSWORD);\r
11683 \r
11684         SetEnable(hWnd, S_USER_CERT_1, u->AuthType == AUTHTYPE_USERCERT);\r
11685         SetEnable(hWnd, S_CERT_INFO, u->AuthType == AUTHTYPE_USERCERT);\r
11686         SetEnable(hWnd, B_LOAD_CERT, u->AuthType == AUTHTYPE_USERCERT);\r
11687 \r
11688         if (u->AuthType == AUTHTYPE_USERCERT)\r
11689         {\r
11690                 SetEnable(hWnd, B_VIEW_CERT, ((AUTHUSERCERT *)u->AuthData)->UserX != NULL);\r
11691         }\r
11692         else\r
11693         {\r
11694                 SetEnable(hWnd, B_VIEW_CERT, false);\r
11695         }\r
11696 \r
11697         SetEnable(hWnd, S_ROOT_CERT_1, u->AuthType == AUTHTYPE_ROOTCERT);\r
11698         SetEnable(hWnd, S_ROOT_CERT_2, u->AuthType == AUTHTYPE_ROOTCERT);\r
11699         SetEnable(hWnd, S_ROOT_CERT_3, u->AuthType == AUTHTYPE_ROOTCERT);\r
11700         SetEnable(hWnd, R_CN, u->AuthType == AUTHTYPE_ROOTCERT);\r
11701         SetEnable(hWnd, R_SERIAL, u->AuthType == AUTHTYPE_ROOTCERT);\r
11702 \r
11703         if (u->AuthType == AUTHTYPE_ROOTCERT)\r
11704         {\r
11705                 SetEnable(hWnd, E_CN, IsChecked(hWnd, R_CN));\r
11706                 SetEnable(hWnd, E_SERIAL, IsChecked(hWnd, R_SERIAL));\r
11707         }\r
11708         else\r
11709         {\r
11710                 Disable(hWnd, E_CN);\r
11711                 Disable(hWnd, E_SERIAL);\r
11712         }\r
11713 \r
11714         switch (u->AuthType)\r
11715         {\r
11716         case AUTHTYPE_PASSWORD:\r
11717                 GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));\r
11718                 GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));\r
11719                 if (StrCmp(tmp1, tmp2) != 0)\r
11720                 {\r
11721                         ok = false;\r
11722                 }\r
11723                 else\r
11724                 {\r
11725                         if (StrCmp(tmp1, HIDDEN_PASSWORD) != 0)\r
11726                         {\r
11727                                 HashPassword(((AUTHPASSWORD *)u->AuthData)->HashedKey, u->Name, tmp1);\r
11728                         }\r
11729                 }\r
11730                 break;\r
11731 \r
11732         case AUTHTYPE_USERCERT:\r
11733                 if (((AUTHUSERCERT *)u->AuthData)->UserX == NULL)\r
11734                 {\r
11735                         ok = false;\r
11736                 }\r
11737                 break;\r
11738 \r
11739         case AUTHTYPE_ROOTCERT:\r
11740                 Free(((AUTHROOTCERT *)u->AuthData)->CommonName);\r
11741                 ((AUTHROOTCERT *)u->AuthData)->CommonName = NULL;\r
11742                 if (IsChecked(hWnd, R_CN) && (IsEmpty(hWnd, E_CN) == false))\r
11743                 {\r
11744                         ((AUTHROOTCERT *)u->AuthData)->CommonName = GetText(hWnd, E_CN);\r
11745                         UniTrim(((AUTHROOTCERT *)u->AuthData)->CommonName);\r
11746                 }\r
11747                 if (IsChecked(hWnd, R_CN) && ((AUTHROOTCERT *)u->AuthData)->CommonName == NULL)\r
11748                 {\r
11749                         ok = false;\r
11750                 }\r
11751                 FreeXSerial(((AUTHROOTCERT *)u->AuthData)->Serial);\r
11752                 ((AUTHROOTCERT *)u->AuthData)->Serial = NULL;\r
11753                 if (IsChecked(hWnd, R_SERIAL))\r
11754                 {\r
11755                         char *serial_str = GetTextA(hWnd, E_SERIAL);\r
11756                         if (serial_str != NULL)\r
11757                         {\r
11758                                 BUF *b = StrToBin(serial_str);\r
11759                                 if (b->Size >= 1)\r
11760                                 {\r
11761                                         ((AUTHROOTCERT *)u->AuthData)->Serial = NewXSerial(b->Buf, b->Size);\r
11762                                 }\r
11763                                 FreeBuf(b);\r
11764                                 Free(serial_str);\r
11765                         }\r
11766                 }\r
11767                 if (IsChecked(hWnd, R_SERIAL) && ((AUTHROOTCERT *)u->AuthData)->Serial == NULL)\r
11768                 {\r
11769                         ok = false;\r
11770                 }\r
11771                 break;\r
11772 \r
11773         case AUTHTYPE_RADIUS:\r
11774                 Free(((AUTHRADIUS *)u->AuthData)->RadiusUsername);\r
11775                 ((AUTHRADIUS *)u->AuthData)->RadiusUsername = NULL;\r
11776                 if (IsChecked(hWnd, R_SET_RADIUS_USERNAME) && (IsEmpty(hWnd, E_RADIUS_USERNAME) == false))\r
11777                 {\r
11778                         ((AUTHRADIUS *)u->AuthData)->RadiusUsername = GetText(hWnd, E_RADIUS_USERNAME);\r
11779                 }\r
11780                 if (IsChecked(hWnd, R_SET_RADIUS_USERNAME) && ((AUTHRADIUS *)u->AuthData)->RadiusUsername == NULL)\r
11781                 {\r
11782                         ok = false;\r
11783                 }\r
11784                 break;\r
11785 \r
11786         case AUTHTYPE_NT:\r
11787                 Free(((AUTHNT *)u->AuthData)->NtUsername);\r
11788                 ((AUTHNT *)u->AuthData)->NtUsername = NULL;\r
11789                 if (IsChecked(hWnd, R_SET_RADIUS_USERNAME) && (IsEmpty(hWnd, E_RADIUS_USERNAME) == false))\r
11790                 {\r
11791                         ((AUTHNT *)u->AuthData)->NtUsername = GetText(hWnd, E_RADIUS_USERNAME);\r
11792                 }\r
11793                 if (IsChecked(hWnd, R_SET_RADIUS_USERNAME) && ((AUTHNT *)u->AuthData)->NtUsername == NULL)\r
11794                 {\r
11795                         ok = false;\r
11796                 }\r
11797                 break;\r
11798         }\r
11799 \r
11800         SetEnable(hWnd, B_POLICY, IsChecked(hWnd, R_POLICY));\r
11801         if (IsChecked(hWnd, R_POLICY))\r
11802         {\r
11803                 if (u->Policy == NULL)\r
11804                 {\r
11805                         ok = false;\r
11806                 }\r
11807         }\r
11808 \r
11809         SetEnable(hWnd, IDOK, ok);\r
11810 }\r
11811 \r
11812 // ユーザー編集ダイアログプロシージャ\r
11813 UINT SmEditUserDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
11814 {\r
11815         SM_EDIT_USER *s = (SM_EDIT_USER *)param;\r
11816         NMHDR *n;\r
11817         POLICY *policy;\r
11818         X *x = NULL;\r
11819         wchar_t tmp[MAX_SIZE];\r
11820         char name[MAX_SIZE];\r
11821         char *ret;\r
11822         // 引数チェック\r
11823         if (hWnd == NULL)\r
11824         {\r
11825                 return 0;\r
11826         }\r
11827 \r
11828         switch (msg)\r
11829         {\r
11830         case WM_INITDIALOG:\r
11831                 // 初期化\r
11832                 SmEditUserDlgInit(hWnd, s);\r
11833                 break;\r
11834 \r
11835         case WM_COMMAND:\r
11836                 switch (LOWORD(wParam))\r
11837                 {\r
11838                 case E_USERNAME:\r
11839                 case E_REALNAME:\r
11840                 case E_NOTE:\r
11841                 case R_EXPIRES:\r
11842                 case E_EXPIRES_DATE:\r
11843                 case E_EXPIRES_TIME:\r
11844                 case E_GROUP:\r
11845                 case L_AUTH:\r
11846                 case R_SET_RADIUS_USERNAME:\r
11847                 case E_RADIUS_USERNAME:\r
11848                 case R_POLICY:\r
11849                 case E_PASSWORD1:\r
11850                 case E_PASSWORD2:\r
11851                 case R_CN:\r
11852                 case E_CN:\r
11853                 case R_SERIAL:\r
11854                 case E_SERIAL:\r
11855                         SmEditUserDlgUpdate(hWnd, s);\r
11856                         break;\r
11857                 }\r
11858 \r
11859                 switch (wParam)\r
11860                 {\r
11861                 case IDOK:\r
11862                         // OK ボタン\r
11863                         SmEditUserDlgOk(hWnd, s);\r
11864                         break;\r
11865 \r
11866                 case IDCANCEL:\r
11867                         // キャンセルボタン\r
11868                         Close(hWnd);\r
11869                         break;\r
11870 \r
11871                 case B_POLICY:\r
11872                         UniFormat(tmp, sizeof(tmp), _UU("SM_EDIT_USER_POL_DLG"), s->SetUser.Name);\r
11873                         // ポリシー\r
11874                         if (s->SetUser.Policy == NULL)\r
11875                         {\r
11876                                 policy = ClonePolicy(GetDefaultPolicy());\r
11877                                 if (SmPolicyDlgEx2(hWnd, policy, tmp, false, s->p->PolicyVer))\r
11878                                 {\r
11879                                         s->SetUser.Policy = policy;\r
11880                                         SmEditUserDlgUpdate(hWnd, s);\r
11881                                 }\r
11882                                 else\r
11883                                 {\r
11884                                         Free(policy);\r
11885                                 }\r
11886                         }\r
11887                         else\r
11888                         {\r
11889                                 SmPolicyDlgEx2(hWnd, s->SetUser.Policy, tmp, false, s->p->PolicyVer);\r
11890                         }\r
11891                         break;\r
11892 \r
11893                 case B_GROUP:\r
11894                         // グループの参照\r
11895                         GetTxtA(hWnd, E_GROUP, name, sizeof(name));\r
11896                         Trim(name);\r
11897                         ret = SmSelectGroupDlg(hWnd, s->Hub, StrLen(name) == 0 ? NULL : name);\r
11898                         if (ret != NULL)\r
11899                         {\r
11900                                 SetTextA(hWnd, E_GROUP, ret);\r
11901                                 Free(ret);\r
11902                         }\r
11903                         else\r
11904                         {\r
11905                                 SetTextA(hWnd, E_GROUP, "");\r
11906                         }\r
11907                         FocusEx(hWnd, E_GROUP);\r
11908                         break;\r
11909 \r
11910                 case B_LOAD_CERT:\r
11911                         // 証明書の指定\r
11912                         if (CmLoadXFromFileOrSecureCard(hWnd, &x))\r
11913                         {\r
11914 UPDATE_CERT:\r
11915                                 if (s->SetUser.AuthType == AUTHTYPE_USERCERT)\r
11916                                 {\r
11917                                         wchar_t tmp[MAX_SIZE];\r
11918                                         FreeX(((AUTHUSERCERT *)s->SetUser.AuthData)->UserX);\r
11919                                         ((AUTHUSERCERT *)s->SetUser.AuthData)->UserX = x;\r
11920                                         SmGetCertInfoStr(tmp, sizeof(tmp), x);\r
11921                                         SetText(hWnd, S_CERT_INFO, tmp);\r
11922                                         SmEditUserDlgUpdate(hWnd, s);\r
11923                                 }\r
11924                                 else\r
11925                                 {\r
11926                                         if (x != NULL)\r
11927                                         {\r
11928                                                 FreeX(x);\r
11929                                                 x = NULL;\r
11930                                         }\r
11931                                 }\r
11932                         }\r
11933                         break;\r
11934 \r
11935                 case B_VIEW_CERT:\r
11936                         // 証明書の表示\r
11937                         if (s->SetUser.AuthType == AUTHTYPE_USERCERT)\r
11938                         {\r
11939                                 CertDlg(hWnd, ((AUTHUSERCERT *)s->SetUser.AuthData)->UserX, NULL, true);\r
11940                         }\r
11941                         break;\r
11942 \r
11943                 case B_CREATE:\r
11944                         // 作成\r
11945                         GetTxtA(hWnd, E_USERNAME, name, sizeof(name));\r
11946                         Trim(name);\r
11947                         if (SmCreateCert(hWnd, &x, NULL, false, name))\r
11948                         {\r
11949                                 if (s->SetUser.AuthType != AUTHTYPE_USERCERT)\r
11950                                 {\r
11951                                         LvSelect(hWnd, L_AUTH, 2);\r
11952                                 }\r
11953                                 goto UPDATE_CERT;\r
11954                         }\r
11955                         break;\r
11956 \r
11957                 case R_SET_RADIUS_USERNAME:\r
11958                         if (IsChecked(hWnd, R_SET_RADIUS_USERNAME))\r
11959                         {\r
11960                                 FocusEx(hWnd, E_RADIUS_USERNAME);\r
11961                         }\r
11962                         break;\r
11963 \r
11964                 case R_EXPIRES:\r
11965                         if (IsChecked(hWnd, R_EXPIRES))\r
11966                         {\r
11967                                 Focus(hWnd, E_EXPIRES_DATE);\r
11968                         }\r
11969                         break;\r
11970 \r
11971                 case R_POLICY:\r
11972                         if (IsChecked(hWnd, R_POLICY))\r
11973                         {\r
11974                                 Focus(hWnd, B_POLICY);\r
11975                         }\r
11976                         break;\r
11977 \r
11978                 case R_CN:\r
11979                         if (IsChecked(hWnd, R_CN))\r
11980                         {\r
11981                                 Focus(hWnd, E_CN);\r
11982                         }\r
11983                         break;\r
11984 \r
11985                 case R_SERIAL:\r
11986                         if (IsChecked(hWnd, R_SERIAL))\r
11987                         {\r
11988                                 Focus(hWnd, E_SERIAL);\r
11989                         }\r
11990                         break;\r
11991                 }\r
11992                 break;\r
11993 \r
11994         case WM_NOTIFY:\r
11995                 n = (NMHDR *)lParam;\r
11996                 switch (n->idFrom)\r
11997                 {\r
11998                 case L_AUTH:\r
11999                         switch (n->code)\r
12000                         {\r
12001                         case LVN_ITEMCHANGED:\r
12002                                 SmEditUserDlgUpdate(hWnd, s);\r
12003                                 break;\r
12004                         }\r
12005                         break;\r
12006                 }\r
12007                 break;\r
12008 \r
12009         case WM_CLOSE:\r
12010                 EndDialog(hWnd, false);\r
12011                 break;\r
12012         }\r
12013 \r
12014         return 0;\r
12015 }\r
12016 \r
12017 // ユーザーの編集ダイアログ\r
12018 bool SmEditUserDlg(HWND hWnd, SM_HUB *s, char *username)\r
12019 {\r
12020         SM_EDIT_USER e;\r
12021         bool ret;\r
12022         // 引数チェック\r
12023         if (hWnd == NULL || s == NULL || username == NULL)\r
12024         {\r
12025                 return false;\r
12026         }\r
12027 \r
12028         Zero(&e, sizeof(e));\r
12029         e.p = s->p;\r
12030         e.Rpc = s->Rpc;\r
12031         e.Hub = s;\r
12032 \r
12033         // ユーザーの取得\r
12034         StrCpy(e.SetUser.HubName, sizeof(e.SetUser.HubName), e.Hub->HubName);\r
12035         StrCpy(e.SetUser.Name, sizeof(e.SetUser.Name), username);\r
12036 \r
12037         if (CALL(hWnd, ScGetUser(s->Rpc, &e.SetUser)) == false)\r
12038         {\r
12039                 return false;\r
12040         }\r
12041 \r
12042         e.EditMode = true;\r
12043 \r
12044         ret = Dialog(hWnd, D_SM_EDIT_USER, SmEditUserDlgProc, &e);\r
12045 \r
12046         FreeRpcSetUser(&e.SetUser);\r
12047 \r
12048         return ret;\r
12049 }\r
12050 \r
12051 // ユーザーの新規作成ダイアログ\r
12052 bool SmCreateUserDlg(HWND hWnd, SM_HUB *s)\r
12053 {\r
12054         SM_EDIT_USER e;\r
12055         bool ret;\r
12056         // 引数チェック\r
12057         if (hWnd == NULL || s == NULL)\r
12058         {\r
12059                 return false;\r
12060         }\r
12061 \r
12062         Zero(&e, sizeof(e));\r
12063         e.EditMode = false;\r
12064         e.p = s->p;\r
12065         e.Rpc = s->Rpc;\r
12066         e.Hub = s;\r
12067 \r
12068         // 新しいユーザーの設定\r
12069         StrCpy(e.SetUser.HubName, sizeof(e.SetUser.HubName), e.Hub->HubName);\r
12070         e.SetUser.AuthType = CLIENT_AUTHTYPE_PASSWORD;\r
12071         e.SetUser.AuthData = NewPasswordAuthData("", "");\r
12072 \r
12073         ret = Dialog(hWnd, D_SM_EDIT_USER, SmEditUserDlgProc, &e);\r
12074 \r
12075         FreeRpcSetUser(&e.SetUser);\r
12076 \r
12077         return ret;\r
12078 }\r
12079 \r
12080 // ユーザー認証方法の文字列の取得\r
12081 wchar_t *SmGetAuthTypeStr(UINT id)\r
12082 {\r
12083         return GetAuthTypeStr(id);\r
12084 }\r
12085 \r
12086 // ユーザーリスト初期化\r
12087 void SmUserListInit(HWND hWnd, SM_USER *s)\r
12088 {\r
12089         wchar_t tmp1[MAX_SIZE];\r
12090         wchar_t tmp2[MAX_SIZE];\r
12091         // 引数チェック\r
12092         if (hWnd == NULL || s == NULL)\r
12093         {\r
12094                 return;\r
12095         }\r
12096 \r
12097         SetIcon(hWnd, 0, ICO_USER);\r
12098 \r
12099         // カラム初期化\r
12100         LvInit(hWnd, L_USER);\r
12101         LvSetStyle(hWnd, L_USER, LVS_EX_GRIDLINES);\r
12102         LvInsertColumn(hWnd, L_USER, 0, _UU("SM_USER_COLUMN_1"), 120);\r
12103         LvInsertColumn(hWnd, L_USER, 1, _UU("SM_USER_COLUMN_2"), 100);\r
12104         LvInsertColumn(hWnd, L_USER, 2, _UU("SM_USER_COLUMN_3"), 100);\r
12105         LvInsertColumn(hWnd, L_USER, 3, _UU("SM_USER_COLUMN_4"), 130);\r
12106         LvInsertColumn(hWnd, L_USER, 4, _UU("SM_USER_COLUMN_5"), 100);\r
12107         LvInsertColumn(hWnd, L_USER, 5, _UU("SM_USER_COLUMN_6"), 90);\r
12108         LvInsertColumn(hWnd, L_USER, 6, _UU("SM_USER_COLUMN_7"), 120);\r
12109 \r
12110         FormatText(hWnd, S_TITLE, s->Hub->HubName);\r
12111 \r
12112         if (s->GroupName != NULL)\r
12113         {\r
12114                 GetTxt(hWnd, 0, tmp1, sizeof(tmp1));\r
12115                 UniFormat(tmp2, sizeof(tmp2), _UU("SM_GROUP_MEMBER_STR"), s->GroupName);\r
12116                 UniStrCat(tmp1, sizeof(tmp1), tmp2);\r
12117                 SetText(hWnd, S_TITLE, tmp1);\r
12118                 Disable(hWnd, B_CREATE);\r
12119         }\r
12120 \r
12121         if (s->SelectMode)\r
12122         {\r
12123                 SetStyle(hWnd, L_USER, LVS_SINGLESEL);\r
12124         }\r
12125 \r
12126         SmUserListRefresh(hWnd, s);\r
12127 \r
12128         if (s->SelectMode)\r
12129         {\r
12130                 wchar_t tmp[MAX_SIZE];\r
12131                 UINT i;\r
12132                 StrToUni(tmp, sizeof(tmp), s->SelectedName);\r
12133                 i = LvSearchStr(hWnd, L_USER, 0, tmp);\r
12134                 if (i != INFINITE)\r
12135                 {\r
12136                         LvSelect(hWnd, L_USER, i);\r
12137                 }\r
12138 \r
12139                 if (s->AllowGroup)\r
12140                 {\r
12141                         SetText(hWnd, B_DELETE, _UU("SM_SELECT_ALT_GROUP"));\r
12142                 }\r
12143         }\r
12144 }\r
12145 \r
12146 // ユーザーリスト更新\r
12147 void SmUserListRefresh(HWND hWnd, SM_USER *s)\r
12148 {\r
12149         LVB *b;\r
12150         RPC_ENUM_USER t;\r
12151         UINT i;\r
12152         // 引数チェック\r
12153         if (hWnd == NULL || s == NULL)\r
12154         {\r
12155                 return;\r
12156         }\r
12157 \r
12158         Zero(&t, sizeof(t));\r
12159 \r
12160         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
12161         if (CALL(hWnd, ScEnumUser(s->Rpc, &t)) == false)\r
12162         {\r
12163                 EndDialog(hWnd, false);\r
12164                 return;\r
12165         }\r
12166 \r
12167         b = LvInsertStart();\r
12168 \r
12169         for (i = 0;i < t.NumUser;i++)\r
12170         {\r
12171                 RPC_ENUM_USER_ITEM *e = &t.Users[i];\r
12172                 wchar_t name[MAX_SIZE];\r
12173                 wchar_t group[MAX_SIZE];\r
12174                 wchar_t num[MAX_SIZE];\r
12175                 wchar_t time[MAX_SIZE];\r
12176 \r
12177                 if (s->GroupName != NULL)\r
12178                 {\r
12179                         if (StrCmpi(s->GroupName, e->GroupName) != 0)\r
12180                         {\r
12181                                 continue;\r
12182                         }\r
12183                 }\r
12184 \r
12185                 StrToUni(name, sizeof(name), e->Name);\r
12186 \r
12187                 if (StrLen(e->GroupName) != 0)\r
12188                 {\r
12189                         StrToUni(group, sizeof(group), e->GroupName);\r
12190                 }\r
12191                 else\r
12192                 {\r
12193                         UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));\r
12194                 }\r
12195 \r
12196                 UniToStru(num, e->NumLogin);\r
12197 \r
12198                 GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);\r
12199 \r
12200                 LvInsertAdd(b, e->DenyAccess ? ICO_USER_DENY : ICO_USER, NULL, 7,\r
12201                         name, e->Realname, group, e->Note, SmGetAuthTypeStr(e->AuthType),\r
12202                         num, time);\r
12203         }\r
12204 \r
12205         LvInsertEnd(b, hWnd, L_USER);\r
12206 \r
12207         FreeRpcEnumUser(&t);\r
12208 \r
12209         SmUserListUpdate(hWnd, s);\r
12210 }\r
12211 \r
12212 // ユーザーリストコントロール更新\r
12213 void SmUserListUpdate(HWND hWnd, SM_USER *s)\r
12214 {\r
12215         bool b = true;\r
12216         // 引数チェック\r
12217         if (hWnd == NULL || s == NULL)\r
12218         {\r
12219                 return;\r
12220         }\r
12221 \r
12222         if (LvIsSelected(hWnd, L_USER) == false || LvIsMultiMasked(hWnd, L_USER))\r
12223         {\r
12224                 b = false;\r
12225         }\r
12226 \r
12227         if (s->SelectMode)\r
12228         {\r
12229                 SetText(hWnd, IDOK, _UU("SM_SELECT_USER"));\r
12230                 SetText(hWnd, IDCANCEL, _UU("SM_SELECT_NO"));\r
12231                 SetText(hWnd, S_TITLE, _UU("SM_PLEASE_SELECT"));\r
12232         }\r
12233 \r
12234         SetEnable(hWnd, IDOK, b);\r
12235 \r
12236         SetEnable(hWnd, B_STATUS, b);\r
12237         SetEnable(hWnd, B_DELETE, (b && s->SelectedName == false) || s->AllowGroup);\r
12238         SetEnable(hWnd, B_CREATE, s->SelectedName == false);\r
12239 }\r
12240 \r
12241 // ユーザーリストダイアログプロシージャ\r
12242 UINT SmUserListProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
12243 {\r
12244         SM_USER *s = (SM_USER *)param;\r
12245         NMHDR *n;\r
12246         wchar_t *str;\r
12247         // 引数チェック\r
12248         if (hWnd == NULL)\r
12249         {\r
12250                 return 0;\r
12251         }\r
12252 \r
12253         switch (msg)\r
12254         {\r
12255         case WM_INITDIALOG:\r
12256                 // 初期化\r
12257                 SmUserListInit(hWnd, s);\r
12258 \r
12259                 if (s->CreateNow)\r
12260                 {\r
12261                         // すぐに作成\r
12262                         if (IsEnable(hWnd, B_CREATE))\r
12263                         {\r
12264                                 Command(hWnd, B_CREATE);\r
12265                         }\r
12266                 }\r
12267                 break;\r
12268 \r
12269         case WM_COMMAND:\r
12270                 switch (wParam)\r
12271                 {\r
12272                 case IDOK:\r
12273                         if (s->SelectMode == false)\r
12274                         {\r
12275                                 // プロパティ\r
12276                                 str = LvGetSelectedStr(hWnd, L_USER, 0);\r
12277                                 if (str != NULL)\r
12278                                 {\r
12279                                         char name[MAX_SIZE];\r
12280                                         UniToStr(name, sizeof(name), str);\r
12281 \r
12282                                         if (SmEditUserDlg(hWnd, s->Hub, name))\r
12283                                         {\r
12284                                                 SmUserListRefresh(hWnd, s);\r
12285                                         }\r
12286 \r
12287                                         Free(str);\r
12288                                 }\r
12289                         }\r
12290                         else\r
12291                         {\r
12292                                 // ユーザーを選択した\r
12293                                 str = LvGetSelectedStr(hWnd, L_USER, 0);\r
12294                                 if (str != NULL)\r
12295                                 {\r
12296                                         char name[MAX_SIZE];\r
12297                                         UniToStr(name, sizeof(name), str);\r
12298 \r
12299                                         s->SelectedName = CopyStr(name);\r
12300 \r
12301                                         EndDialog(hWnd, true);\r
12302 \r
12303                                         Free(str);\r
12304                                 }\r
12305                         }\r
12306                         break;\r
12307 \r
12308                 case B_CREATE:\r
12309                         // 新規作成\r
12310                         if (SmCreateUserDlg(hWnd, s->Hub))\r
12311                         {\r
12312                                 SmUserListRefresh(hWnd, s);\r
12313                         }\r
12314                         break;\r
12315 \r
12316                 case B_DELETE:\r
12317                         if (s->AllowGroup)\r
12318                         {\r
12319                                 // グループ選択\r
12320                                 EndDialog(hWnd, INFINITE);\r
12321                         }\r
12322                         else\r
12323                         {\r
12324                                 // 削除\r
12325                                 str = LvGetSelectedStr(hWnd, L_USER, 0);\r
12326                                 if (str != NULL)\r
12327                                 {\r
12328                                         RPC_DELETE_USER t;\r
12329                                         char name[MAX_SIZE];\r
12330                                         UniToStr(name, sizeof(name), str);\r
12331 \r
12332                                         Zero(&t, sizeof(t));\r
12333                                         StrCpy(t.HubName, sizeof(t.HubName), s->Hub->HubName);\r
12334                                         StrCpy(t.Name, sizeof(t.Name), name);\r
12335 \r
12336                                         if (MsgBoxEx(hWnd, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION,\r
12337                                                 _UU("SM_USER_DELETE_MSG"), str) == IDYES)\r
12338                                         {\r
12339                                                 if (CALL(hWnd, ScDeleteUser(s->Rpc, &t)))\r
12340                                                 {\r
12341                                                         SmUserListRefresh(hWnd, s);\r
12342                                                 }\r
12343                                         }\r
12344 \r
12345                                         Free(str);\r
12346                                 }\r
12347                         }\r
12348                         break;\r
12349 \r
12350                 case B_STATUS:\r
12351                         // ユーザー情報表示\r
12352                         str = LvGetSelectedStr(hWnd, L_USER, 0);\r
12353                         if (str != NULL)\r
12354                         {\r
12355                                 char name[MAX_SIZE];\r
12356                                 wchar_t tmp[MAX_SIZE];\r
12357                                 SM_USER_INFO info;\r
12358                                 UniToStr(name, sizeof(name), str);\r
12359 \r
12360                                 UniFormat(tmp, sizeof(tmp), _UU("SM_USERINFO_CAPTION"), name);\r
12361 \r
12362                                 Zero(&info, sizeof(info));\r
12363                                 info.p = s->p;\r
12364                                 info.Rpc = s->Rpc;\r
12365                                 info.Hub = s->Hub;\r
12366                                 info.Username = name;\r
12367 \r
12368                                 SmStatusDlg(hWnd, s->p, &info, false, true, tmp, ICO_USER, NULL, SmRefreshUserInfo);\r
12369 \r
12370                                 Free(str);\r
12371                         }\r
12372                         break;\r
12373                         break;\r
12374 \r
12375                 case B_REFRESH:\r
12376                         // 更新\r
12377                         SmUserListRefresh(hWnd, s);\r
12378                         break;\r
12379 \r
12380                 case IDCANCEL:\r
12381                         // キャンセルボタン\r
12382                         Close(hWnd);\r
12383                         break;\r
12384                 }\r
12385                 break;\r
12386 \r
12387         case WM_NOTIFY:\r
12388                 n = (NMHDR *)lParam;\r
12389                 switch (n->idFrom)\r
12390                 {\r
12391                 case L_USER:\r
12392                         switch (n->code)\r
12393                         {\r
12394                         case LVN_ITEMCHANGED:\r
12395                                 // コントロール更新\r
12396                                 SmUserListUpdate(hWnd, s);\r
12397                                 break;\r
12398                         }\r
12399                         break;\r
12400                 }\r
12401                 break;\r
12402 \r
12403         case WM_CLOSE:\r
12404                 EndDialog(hWnd, false);\r
12405                 break;\r
12406         }\r
12407 \r
12408         LvStandardHandler(hWnd, msg, wParam, lParam, L_USER);\r
12409 \r
12410         return 0;\r
12411 }\r
12412 \r
12413 // ユーザーリストダイアログ (選択)\r
12414 char *SmSelectUserDlg(HWND hWnd, SM_HUB *s, char *default_name)\r
12415 {\r
12416         return SmSelectUserDlgEx(hWnd, s, default_name, false);\r
12417 }\r
12418 char *SmSelectUserDlgEx(HWND hWnd, SM_HUB *s, char *default_name, bool allow_group)\r
12419 {\r
12420         UINT ret;\r
12421         SM_USER user;\r
12422         // 引数チェック\r
12423         if (hWnd == NULL || s == NULL)\r
12424         {\r
12425                 return NULL;\r
12426         }\r
12427 \r
12428         Zero(&user, sizeof(user));\r
12429         user.Hub = s;\r
12430         user.p = s->p;\r
12431         user.Rpc = s->Rpc;\r
12432         user.GroupName = NULL;\r
12433         user.SelectedName = default_name;\r
12434         user.SelectMode = true;\r
12435         user.AllowGroup = allow_group;\r
12436 \r
12437         ret = Dialog(hWnd, D_SM_USER, SmUserListProc, &user);\r
12438 \r
12439         if (ret == 0)\r
12440         {\r
12441                 return NULL;\r
12442         }\r
12443         else if (ret == INFINITE)\r
12444         {\r
12445                 // グループの選択\r
12446                 return SmSelectGroupDlg(hWnd, s, default_name);\r
12447         }\r
12448         else\r
12449         {\r
12450                 return user.SelectedName;\r
12451         }\r
12452 }\r
12453 \r
12454 // ユーザーリストダイアログ (グループ名でフィルタ)\r
12455 void SmUserListDlgEx(HWND hWnd, SM_HUB *s, char *groupname, bool create)\r
12456 {\r
12457         SM_USER user;\r
12458         // 引数チェック\r
12459         if (hWnd == NULL || s == NULL)\r
12460         {\r
12461                 return;\r
12462         }\r
12463 \r
12464         Zero(&user, sizeof(user));\r
12465         user.Hub = s;\r
12466         user.p = s->p;\r
12467         user.Rpc = s->Rpc;\r
12468         user.GroupName = groupname;\r
12469         user.CreateNow = create;\r
12470 \r
12471         Dialog(hWnd, D_SM_USER, SmUserListProc, &user);\r
12472 }\r
12473 \r
12474 // ユーザーリストダイアログ\r
12475 void SmUserListDlg(HWND hWnd, SM_HUB *s)\r
12476 {\r
12477         SmUserListDlgEx(hWnd, s, NULL, false);\r
12478 }\r
12479 \r
12480 // 初期化\r
12481 void SmHubDlgInit(HWND hWnd, SM_HUB *s)\r
12482 {\r
12483         CAPSLIST *caps;\r
12484         bool support_user, support_group, support_accesslist, support_cascade,\r
12485                 support_log, support_config_hub, support_secure_nat, support_config_radius;\r
12486         // 引数チェック\r
12487         if (hWnd == NULL || s == NULL)\r
12488         {\r
12489                 return;\r
12490         }\r
12491 \r
12492         FormatText(hWnd, 0, s->HubName);\r
12493         FormatText(hWnd, S_TITLE, s->HubName);\r
12494         SetIcon(hWnd, 0, ICO_HUB);\r
12495         DlgFont(hWnd, S_TITLE, 15, true);\r
12496 \r
12497         LvInit(hWnd, L_STATUS);\r
12498         LvSetStyle(hWnd, L_STATUS, LVS_EX_GRIDLINES);\r
12499         LvInsertColumn(hWnd, L_STATUS, 0, _UU("SM_STATUS_COLUMN_1"), 0);\r
12500         LvInsertColumn(hWnd, L_STATUS, 1, _UU("SM_STATUS_COLUMN_2"), 0);\r
12501 \r
12502         caps = s->p->CapsList;\r
12503 \r
12504         support_user = GetCapsInt(caps, "i_max_users_per_hub") == 0 ? false : true;\r
12505         support_group = GetCapsInt(caps, "i_max_groups_per_hub") == 0 ? false : true;\r
12506         support_accesslist = GetCapsInt(caps, "i_max_access_lists") == 0 ? false : true;\r
12507         support_cascade = GetCapsBool(caps, "b_support_cascade");\r
12508         support_log = GetCapsBool(caps, "b_support_config_log");\r
12509         support_config_hub = GetCapsBool(caps, "b_support_config_hub");\r
12510         support_secure_nat = GetCapsBool(caps, "b_support_securenat");\r
12511         support_config_radius = GetCapsBool(caps, "b_support_radius");\r
12512 \r
12513         SetEnable(hWnd, B_USER, support_user);\r
12514         SetEnable(hWnd, S_USER, support_user);\r
12515 \r
12516         SetEnable(hWnd, B_GROUP, support_group);\r
12517         SetEnable(hWnd, S_GROUP, support_group);\r
12518 \r
12519         SetEnable(hWnd, B_ACCESS, support_accesslist);\r
12520         SetEnable(hWnd, S_ACCESS, support_accesslist);\r
12521 \r
12522         SetEnable(hWnd, B_PROPERTY, s->p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
12523         SetEnable(hWnd, S_PROPERTY, s->p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
12524 \r
12525         SetEnable(hWnd, B_RADIUS, support_config_radius);\r
12526         SetEnable(hWnd, S_RADIUS, support_config_radius);\r
12527 \r
12528         SetEnable(hWnd, B_LINK, support_cascade);\r
12529         SetEnable(hWnd, S_LINK, support_cascade);\r
12530 \r
12531         SetEnable(hWnd, B_LOG, support_log);\r
12532         SetEnable(hWnd, S_LOG, support_log);\r
12533 \r
12534         SetEnable(hWnd, B_CA, support_config_hub);\r
12535         SetEnable(hWnd, S_CA, support_config_hub);\r
12536 \r
12537         SetEnable(hWnd, B_SNAT, support_secure_nat);\r
12538         SetEnable(hWnd, S_SNAT, support_secure_nat);\r
12539 \r
12540         SetEnable(hWnd, B_CRL, GetCapsBool(caps, "b_support_crl"));\r
12541 \r
12542         SetEnable(hWnd, B_LOG_FILE, GetCapsBool(caps, "b_support_read_log"));\r
12543 \r
12544         SmHubDlgRefresh(hWnd, s);\r
12545 }\r
12546 \r
12547 // コントロール更新\r
12548 void SmHubDlgUpdate(HWND hWnd, SM_HUB *s)\r
12549 {\r
12550         // 引数チェック\r
12551         if (hWnd == NULL || s == NULL)\r
12552         {\r
12553                 return;\r
12554         }\r
12555 }\r
12556 \r
12557 // 内容更新\r
12558 void SmHubDlgRefresh(HWND hWnd, SM_HUB *s)\r
12559 {\r
12560         // 引数チェック\r
12561         if (hWnd == NULL || s == NULL)\r
12562         {\r
12563                 return;\r
12564         }\r
12565 \r
12566         SmRefreshHubStatus(hWnd, s->p, (void *)s->HubName);\r
12567         LvAutoSize(hWnd, L_STATUS);\r
12568 \r
12569         SmHubDlgUpdate(hWnd, s);\r
12570 }\r
12571 \r
12572 // HUB 管理ダイアログ\r
12573 UINT SmHubDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
12574 {\r
12575         SM_HUB *s = (SM_HUB *)param;\r
12576         // 引数チェック\r
12577         if (hWnd == NULL)\r
12578         {\r
12579                 return 0;\r
12580         }\r
12581 \r
12582         switch (msg)\r
12583         {\r
12584         case WM_INITDIALOG:\r
12585                 // 初期化\r
12586                 SmHubDlgInit(hWnd, s);\r
12587                 break;\r
12588 \r
12589         case WM_COMMAND:\r
12590                 switch (wParam)\r
12591                 {\r
12592                 case B_USER:\r
12593                         // ユーザー\r
12594                         SmUserListDlg(hWnd, s);\r
12595                         SmHubDlgRefresh(hWnd, s);\r
12596                         break;\r
12597 \r
12598                 case B_GROUP:\r
12599                         // グループ\r
12600                         SmGroupListDlg(hWnd, s);\r
12601                         SmHubDlgRefresh(hWnd, s);\r
12602                         break;\r
12603 \r
12604                 case B_ACCESS:\r
12605                         // アクセスリスト\r
12606                         SmAccessListDlg(hWnd, s);\r
12607                         SmHubDlgRefresh(hWnd, s);\r
12608                         break;\r
12609 \r
12610                 case B_PROPERTY:\r
12611                         // プロパティ\r
12612                         if (SmEditHubDlg(hWnd, s->p, s->HubName))\r
12613                         {\r
12614                                 SmHubDlgRefresh(hWnd, s);\r
12615                         }\r
12616                         break;\r
12617 \r
12618                 case B_RADIUS:\r
12619                         // Radius\r
12620                         SmRadiusDlg(hWnd, s);\r
12621                         SmHubDlgRefresh(hWnd, s);\r
12622                         break;\r
12623 \r
12624                 case B_LINK:\r
12625                         // カスケード\r
12626                         SmLinkDlg(hWnd, s);\r
12627                         SmHubDlgRefresh(hWnd, s);\r
12628                         break;\r
12629 \r
12630                 case B_SESSION:\r
12631                         // セッション\r
12632                         SmSessionDlg(hWnd, s);\r
12633                         SmHubDlgRefresh(hWnd, s);\r
12634                         break;\r
12635 \r
12636                 case B_LOG:\r
12637                         // ログ\r
12638                         Dialog(hWnd, D_SM_LOG, SmLogDlg, s);\r
12639                         SmHubDlgRefresh(hWnd, s);\r
12640                         break;\r
12641 \r
12642                 case B_CA:\r
12643                         // CA\r
12644                         SmCaDlg(hWnd, s);\r
12645                         SmHubDlgRefresh(hWnd, s);\r
12646                         break;\r
12647 \r
12648                 case IDCANCEL:\r
12649                         // キャンセルボタン\r
12650                         Close(hWnd);\r
12651                         break;\r
12652 \r
12653                 case B_REFRESH:\r
12654                         // 更新\r
12655                         SmHubDlgRefresh(hWnd, s);\r
12656                         break;\r
12657 \r
12658                 case B_SNAT:\r
12659                         // SecureNAT\r
12660                         Dialog(hWnd, D_SM_SNAT, SmSNATDlgProc, s);\r
12661                         SmHubDlgRefresh(hWnd, s);\r
12662                         break;\r
12663 \r
12664                 case B_CRL:\r
12665                         // 無効な証明書の一覧\r
12666                         Dialog(hWnd, D_SM_CRL, SmCrlDlgProc, s);\r
12667                         break;\r
12668 \r
12669                 case B_LOG_FILE:\r
12670                         // ログファイル\r
12671                         Dialog(hWnd, D_SM_LOG_FILE, SmLogFileDlgProc, s->p);\r
12672                         break;\r
12673                 }\r
12674                 break;\r
12675 \r
12676         case WM_CLOSE:\r
12677                 EndDialog(hWnd, false);\r
12678                 break;\r
12679         }\r
12680 \r
12681         return 0;\r
12682 }\r
12683 \r
12684 // HUB の管理\r
12685 void SmHubDlg(HWND hWnd, SM_HUB *s)\r
12686 {\r
12687         // 引数チェック\r
12688         if (hWnd == NULL || s == NULL)\r
12689         {\r
12690                 return;\r
12691         }\r
12692 \r
12693         Dialog(hWnd, D_SM_HUB, SmHubDlgProc, s);\r
12694 }\r
12695 \r
12696 // サーバー パスワードの変更\r
12697 UINT SmChangeServerPasswordDlg(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
12698 {\r
12699         SM_SERVER *p = (SM_SERVER *)param;\r
12700         char tmp1[MAX_SIZE];\r
12701         char tmp2[MAX_SIZE];\r
12702         UCHAR hash[SHA1_SIZE];\r
12703         RPC_SET_PASSWORD t;\r
12704         SETTING *setting;\r
12705         // 引数チェック\r
12706         if (hWnd == NULL)\r
12707         {\r
12708                 return 0;\r
12709         }\r
12710 \r
12711         switch (msg)\r
12712         {\r
12713         case WM_INITDIALOG:\r
12714                 // 初期化\r
12715                 SetIcon(hWnd, 0, ICO_USER_ADMIN);\r
12716                 FormatText(hWnd, 0, p->ServerName);\r
12717                 FormatText(hWnd, S_TITLE, p->ServerName);\r
12718                 break;\r
12719 \r
12720         case WM_COMMAND:\r
12721                 switch (wParam)\r
12722                 {\r
12723                 case IDOK:\r
12724                         // OK ボタン\r
12725                         GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));\r
12726                         GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));\r
12727                         if (StrCmp(tmp1, tmp2) != 0)\r
12728                         {\r
12729                                 MsgBox(hWnd, MB_ICONSTOP, _UU("SM_CHANGE_PASSWORD_1"));\r
12730                                 FocusEx(hWnd, E_PASSWORD2);\r
12731                                 break;\r
12732                         }\r
12733                         if (StrLen(tmp1) == 0)\r
12734                         {\r
12735                                 if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, _UU("SM_CHANGE_PASSWORD_2")) == IDNO)\r
12736                                 {\r
12737                                         Focus(hWnd, E_PASSWORD1);\r
12738                                         break;\r
12739                                 }\r
12740                         }\r
12741                         Zero(&t, sizeof(t));\r
12742                         Hash(t.HashedPassword, tmp1, StrLen(tmp1), true);\r
12743                         Copy(hash, t.HashedPassword, sizeof(hash));\r
12744                         if (CALL(hWnd, ScSetServerPassword(p->Rpc, &t)) == false)\r
12745                         {\r
12746                                 break;\r
12747                         }\r
12748                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SM_CHANGE_PASSWORD_3"));\r
12749 \r
12750                         // 接続設定のパスワードを変更する\r
12751                         setting = SmGetSetting(p->CurrentSetting->Title);\r
12752                         if (setting != NULL && sm->TempSetting == NULL)\r
12753                         {\r
12754                                 if (IsZero(setting->HashedPassword, SHA1_SIZE) == false)\r
12755                                 {\r
12756                                         Copy(setting->HashedPassword, hash, SHA1_SIZE);\r
12757                                         SmWriteSettingList();\r
12758                                 }\r
12759                         }\r
12760 \r
12761                         EndDialog(hWnd, true);\r
12762                         break;\r
12763 \r
12764                 case IDCANCEL:\r
12765                         // キャンセルボタン\r
12766                         Close(hWnd);\r
12767                         break;\r
12768                 }\r
12769                 break;\r
12770 \r
12771         case WM_CLOSE:\r
12772                 EndDialog(hWnd, false);\r
12773                 break;\r
12774         }\r
12775 \r
12776         return 0;\r
12777 }\r
12778 \r
12779 // サーバー ファーム コントローラへの接続状況更新\r
12780 bool SmRefreshFarmConnectionInfo(HWND hWnd, SM_SERVER *p, void *param)\r
12781 {\r
12782         RPC_FARM_CONNECTION_STATUS t;\r
12783         LVB *b;\r
12784         wchar_t tmp[MAX_SIZE];\r
12785         char str[MAX_SIZE];\r
12786         // 引数チェック\r
12787         if (hWnd == NULL || p == NULL)\r
12788         {\r
12789                 return false;\r
12790         }\r
12791 \r
12792         Zero(&t, sizeof(t));\r
12793         if (CALL(hWnd, ScGetFarmConnectionStatus(p->Rpc, &t)) == false)\r
12794         {\r
12795                 return false;\r
12796         }\r
12797 \r
12798         b = LvInsertStart();\r
12799 \r
12800         if (t.Online == false)\r
12801         {\r
12802                 LvInsertAdd(b, ICO_FARM, NULL, 2, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));\r
12803 \r
12804                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));\r
12805         }\r
12806         else\r
12807         {\r
12808                 IPToStr32(str, sizeof(str), t.Ip);\r
12809                 StrToUni(tmp, sizeof(tmp), str);\r
12810                 LvInsertAdd(b, ICO_FARM, NULL, 2, _UU("SM_FC_IP"), tmp);\r
12811 \r
12812                 UniToStru(tmp, t.Port);\r
12813                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FC_PORT"), tmp);\r
12814         }\r
12815 \r
12816         LvInsertAdd(b,\r
12817                 t.Online ? ICO_SERVER_ONLINE_EX : ICO_PROTOCOL_X, NULL, 2,\r
12818                 _UU("SM_FC_STATUS"),\r
12819                 t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));\r
12820 \r
12821         if (t.Online == false)\r
12822         {\r
12823                 UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);\r
12824                 LvInsertAdd(b, ICO_STOP, NULL, 2,\r
12825                         _UU("SM_FC_LAST_ERROR"), tmp);\r
12826         }\r
12827 \r
12828         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);\r
12829         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_FC_START_TIME"), tmp);\r
12830 \r
12831         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);\r
12832         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_FC_FIRST_TIME"), tmp);\r
12833 \r
12834         //if (t.Online == false)\r
12835         {\r
12836                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);\r
12837                 LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_FC_CURRENT_TIME"), tmp);\r
12838         }\r
12839 \r
12840         UniToStru(tmp, t.NumTry);\r
12841         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FC_NUM_TRY"), tmp);\r
12842 \r
12843         UniToStru(tmp, t.NumConnected);\r
12844         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FC_NUM_CONNECTED"), tmp);\r
12845 \r
12846         UniToStru(tmp, t.NumFailed);\r
12847         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FC_NUM_FAILED"), tmp);\r
12848 \r
12849         LvInsertEnd(b, hWnd, L_STATUS);\r
12850 \r
12851         return true;\r
12852 }\r
12853 \r
12854 // 初期化\r
12855 void SmFarmMemberDlgInit(HWND hWnd, SM_SERVER *p)\r
12856 {\r
12857         // 引数チェック\r
12858         if (hWnd == NULL || p == NULL)\r
12859         {\r
12860                 return;\r
12861         }\r
12862 \r
12863         SetIcon(hWnd, 0, ICO_FARM);\r
12864 \r
12865         FormatText(hWnd, S_TITLE, p->ServerName);\r
12866 \r
12867         // カラム初期化\r
12868         LvInit(hWnd, L_FARM_MEMBER);\r
12869         LvSetStyle(hWnd, L_FARM_MEMBER, LVS_EX_GRIDLINES);\r
12870         LvInsertColumn(hWnd, L_FARM_MEMBER, 0, _UU("SM_FM_COLUMN_1"), 90);\r
12871         LvInsertColumn(hWnd, L_FARM_MEMBER, 1, _UU("SM_FM_COLUMN_2"), 150);\r
12872         LvInsertColumn(hWnd, L_FARM_MEMBER, 2, _UU("SM_FM_COLUMN_3"), 140);\r
12873         LvInsertColumn(hWnd, L_FARM_MEMBER, 3, _UU("SM_FM_COLUMN_4"), 60);\r
12874         LvInsertColumn(hWnd, L_FARM_MEMBER, 4, _UU("SM_FM_COLUMN_5"), 80);\r
12875         LvInsertColumn(hWnd, L_FARM_MEMBER, 5, _UU("SM_FM_COLUMN_6"), 80);\r
12876         LvInsertColumn(hWnd, L_FARM_MEMBER, 6, _UU("SM_FM_COLUMN_7"), 80);\r
12877         LvInsertColumn(hWnd, L_FARM_MEMBER, 7, _UU("SM_FM_COLUMN_8"), 160);\r
12878         LvInsertColumn(hWnd, L_FARM_MEMBER, 8, _UU("SM_FM_COLUMN_9"), 160);\r
12879 \r
12880         SmFarmMemberDlgRefresh(hWnd, p);\r
12881 }\r
12882 \r
12883 // 更新\r
12884 void SmFarmMemberDlgUpdate(HWND hWnd, SM_SERVER *p)\r
12885 {\r
12886         // 引数チェック\r
12887         if (hWnd == NULL || p == NULL)\r
12888         {\r
12889                 return;\r
12890         }\r
12891 \r
12892         SetEnable(hWnd, IDOK, LvIsSelected(hWnd, L_FARM_MEMBER) && (LvIsMultiMasked(hWnd, L_FARM_MEMBER) == false));\r
12893         SetEnable(hWnd, B_CERT, LvIsSelected(hWnd, L_FARM_MEMBER) && (LvIsMultiMasked(hWnd, L_FARM_MEMBER) == false));\r
12894 }\r
12895 \r
12896 // 内容更新\r
12897 void SmFarmMemberDlgRefresh(HWND hWnd, SM_SERVER *p)\r
12898 {\r
12899         RPC_ENUM_FARM t;\r
12900         UINT i;\r
12901         // 引数チェック\r
12902         if (hWnd == NULL || p == NULL)\r
12903         {\r
12904                 return;\r
12905         }\r
12906 \r
12907         Zero(&t, sizeof(t));\r
12908         if (CALL(hWnd, ScEnumFarmMember(p->Rpc, &t)) == false)\r
12909         {\r
12910                 EndDialog(hWnd, false);\r
12911                 return;\r
12912         }\r
12913 \r
12914         LvReset(hWnd, L_FARM_MEMBER);\r
12915 \r
12916         for (i = 0;i < t.NumFarm;i++)\r
12917         {\r
12918                 RPC_ENUM_FARM_ITEM *e = &t.Farms[i];\r
12919                 wchar_t tmp1[MAX_SIZE];\r
12920                 wchar_t tmp2[MAX_SIZE];\r
12921                 wchar_t tmp3[64];\r
12922                 wchar_t tmp4[64];\r
12923                 wchar_t tmp5[64];\r
12924                 wchar_t tmp6[64];\r
12925                 wchar_t tmp7[64];\r
12926                 wchar_t tmp8[64];\r
12927 \r
12928                 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);\r
12929                 StrToUni(tmp2, sizeof(tmp2), e->Hostname);\r
12930                 UniToStru(tmp3, e->Point);\r
12931                 UniToStru(tmp4, e->NumSessions);\r
12932                 UniToStru(tmp5, e->NumTcpConnections);\r
12933                 UniToStru(tmp6, e->NumHubs);\r
12934                 UniToStru(tmp7, e->AssignedClientLicense);\r
12935                 UniToStru(tmp8, e->AssignedBridgeLicense);\r
12936 \r
12937                 LvInsert(hWnd, L_FARM_MEMBER, e->Controller ? ICO_FARM : ICO_TOWER, (void *)e->Id, 9,\r
12938                         e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),\r
12939                         tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);\r
12940         }\r
12941 \r
12942         FreeRpcEnumFarm(&t);\r
12943 \r
12944         SmFarmMemberDlgUpdate(hWnd, p);\r
12945 }\r
12946 \r
12947 // OK ボタン\r
12948 void SmFarmMemberDlgOnOk(HWND hWnd, SM_SERVER *p)\r
12949 {\r
12950         // 引数チェック\r
12951         if (hWnd == NULL || p == NULL)\r
12952         {\r
12953                 return;\r
12954         }\r
12955 \r
12956 }\r
12957 \r
12958 // ファーム メンバ証明書の表示\r
12959 void SmFarmMemberCert(HWND hWnd, SM_SERVER *p, UINT id)\r
12960 {\r
12961         RPC_FARM_INFO t;\r
12962         // 引数チェック\r
12963         if (hWnd == NULL || p == NULL || id == 0)\r
12964         {\r
12965                 return;\r
12966         }\r
12967 \r
12968         Zero(&t, sizeof(t));\r
12969         t.Id = id;\r
12970 \r
12971         if (CALL(hWnd, ScGetFarmInfo(p->Rpc, &t)) == false)\r
12972         {\r
12973                 return;\r
12974         }\r
12975 \r
12976         CertDlg(hWnd, t.ServerCert, NULL, true);\r
12977 \r
12978         FreeRpcFarmInfo(&t);\r
12979 }\r
12980 \r
12981 // ファームメンバ情報の更新\r
12982 bool SmRefreshFarmMemberInfo(HWND hWnd, SM_SERVER *p, void *param)\r
12983 {\r
12984         RPC_FARM_INFO t;\r
12985         UINT id = (UINT)param;\r
12986         LVB *b;\r
12987         UINT i;\r
12988         wchar_t tmp[MAX_SIZE];\r
12989         char str[MAX_SIZE];\r
12990         // 引数チェック\r
12991         if (hWnd == NULL || p == NULL || id == 0)\r
12992         {\r
12993                 return false;\r
12994         }\r
12995 \r
12996         Zero(&t, sizeof(t));\r
12997         t.Id = id;\r
12998 \r
12999         if (CALL(hWnd, ScGetFarmInfo(p->Rpc, &t)) == false)\r
13000         {\r
13001                 return false;\r
13002         }\r
13003 \r
13004         b = LvInsertStart();\r
13005 \r
13006         LvInsertAdd(b, ICO_FARM, NULL, 2, _UU("SM_FMINFO_TYPE"),\r
13007                 t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));\r
13008 \r
13009         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);\r
13010         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_FMINFO_CONNECT_TIME"), tmp);\r
13011 \r
13012         IPToStr32(str, sizeof(str), t.Ip);\r
13013         StrToUni(tmp, sizeof(tmp), str);\r
13014         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FMINFO_IP"), tmp);\r
13015 \r
13016         StrToUni(tmp, sizeof(tmp), t.Hostname);\r
13017         LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("SM_FMINFO_HOSTNAME"), tmp);\r
13018 \r
13019         UniToStru(tmp, t.Point);\r
13020         LvInsertAdd(b, ICO_TEST, NULL, 2, _UU("SM_FMINFO_POINT"), tmp);\r
13021 \r
13022         UniToStru(tmp, t.Weight);\r
13023         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_FMINFO_WEIGHT"), tmp);\r
13024 \r
13025         UniToStru(tmp, t.NumPort);\r
13026         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FMINFO_NUM_PORT"), tmp);\r
13027 \r
13028         for (i = 0;i < t.NumPort;i++)\r
13029         {\r
13030                 wchar_t tmp2[MAX_SIZE];\r
13031                 UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);\r
13032                 UniToStru(tmp2, t.Ports[i]);\r
13033                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, tmp, tmp2);\r
13034         }\r
13035 \r
13036         UniToStru(tmp, t.NumFarmHub);\r
13037         LvInsertAdd(b, ICO_HUB_OFFLINE, NULL, 2, _UU("SM_FMINFO_NUM_HUB"), tmp);\r
13038 \r
13039         for (i = 0;i < t.NumFarmHub;i++)\r
13040         {\r
13041                 wchar_t tmp2[MAX_SIZE];\r
13042                 UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);\r
13043                 UniFormat(tmp2, sizeof(tmp2),\r
13044                         t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),\r
13045                         t.FarmHubs[i].HubName);\r
13046                 LvInsertAdd(b, ICO_HUB, NULL, 2, tmp, tmp2);\r
13047         }\r
13048 \r
13049         UniToStru(tmp, t.NumSessions);\r
13050         LvInsertAdd(b, ICO_VPN, NULL, 2, _UU("SM_FMINFO_NUM_SESSION"), tmp);\r
13051 \r
13052         UniToStru(tmp, t.NumTcpConnections);\r
13053         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);\r
13054 \r
13055         LvInsertEnd(b, hWnd, L_STATUS);\r
13056 \r
13057         FreeRpcFarmInfo(&t);\r
13058 \r
13059         return true;\r
13060 }\r
13061 \r
13062 // ファームメンバ一覧ダイアログ\r
13063 UINT SmFarmMemberDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
13064 {\r
13065         SM_SERVER *p = (SM_SERVER *)param;\r
13066         NMHDR *n;\r
13067         UINT i;\r
13068         // 引数チェック\r
13069         if (hWnd == NULL)\r
13070         {\r
13071                 return 0;\r
13072         }\r
13073 \r
13074         switch (msg)\r
13075         {\r
13076         case WM_INITDIALOG:\r
13077                 // 初期化\r
13078                 SmFarmMemberDlgInit(hWnd, p);\r
13079                 break;\r
13080 \r
13081         case WM_COMMAND:\r
13082                 switch (wParam)\r
13083                 {\r
13084                 case IDOK:\r
13085                         // ファーム メンバの情報を表示\r
13086                         i = LvGetSelected(hWnd, L_FARM_MEMBER);\r
13087                         if (i != INFINITE)\r
13088                         {\r
13089                                 SmStatusDlg(hWnd, p, LvGetParam(hWnd, L_FARM_MEMBER, i), false, true,\r
13090                                         _UU("SM_FMINFO_CAPTION"), ICO_FARM, NULL, SmRefreshFarmMemberInfo);\r
13091                         }\r
13092                         break;\r
13093 \r
13094                 case B_CERT:\r
13095                         // サーバー証明書の表示\r
13096                         i = LvGetSelected(hWnd, L_FARM_MEMBER);\r
13097                         if (i != INFINITE)\r
13098                         {\r
13099                                 SmFarmMemberCert(hWnd, p, (UINT)LvGetParam(hWnd, L_FARM_MEMBER, i));\r
13100                         }\r
13101                         break;\r
13102 \r
13103                 case IDCANCEL:\r
13104                         // キャンセルボタン\r
13105                         Close(hWnd);\r
13106                         break;\r
13107 \r
13108                 case B_REFRESH:\r
13109                         // 更新\r
13110                         SmFarmMemberDlgRefresh(hWnd, p);\r
13111                         break;\r
13112                 }\r
13113                 break;\r
13114 \r
13115         case WM_NOTIFY:\r
13116                 n = (NMHDR *)lParam;\r
13117                 switch (n->code)\r
13118                 {\r
13119                 case LVN_ITEMCHANGED:\r
13120                         switch (n->idFrom)\r
13121                         {\r
13122                         case L_FARM_MEMBER:\r
13123                                 SmFarmMemberDlgUpdate(hWnd, p);\r
13124                                 break;\r
13125                         }\r
13126                         break;\r
13127                 }\r
13128                 break;\r
13129 \r
13130         case WM_CLOSE:\r
13131                 EndDialog(hWnd, false);\r
13132                 break;\r
13133         }\r
13134 \r
13135         LvStandardHandler(hWnd, msg, wParam, lParam, L_FARM_MEMBER);\r
13136 \r
13137         return 0;\r
13138 }\r
13139 \r
13140 // 文字列をポートリストに変換\r
13141 LIST *SmStrToPortList(char *str)\r
13142 {\r
13143         return StrToPortList(str);\r
13144 }\r
13145 \r
13146 // ダイアログ初期化\r
13147 void SmFarmDlgInit(HWND hWnd, SM_SERVER *p)\r
13148 {\r
13149         RPC_FARM t;\r
13150         // 引数チェック\r
13151         if (hWnd == NULL || p == NULL)\r
13152         {\r
13153                 return;\r
13154         }\r
13155 \r
13156         SetIcon(hWnd, 0, ICO_FARM);\r
13157 \r
13158         // 現在の設定を取得\r
13159         Zero(&t, sizeof(t));\r
13160         if (CALL(hWnd, ScGetFarmSetting(p->Rpc, &t)) == false)\r
13161         {\r
13162                 EndDialog(hWnd, false);\r
13163                 return;\r
13164         }\r
13165 \r
13166         if (t.Weight == 0)\r
13167         {\r
13168                 t.Weight = FARM_DEFAULT_WEIGHT;\r
13169         }\r
13170 \r
13171         FormatText(hWnd, S_TITLE, p->ServerName);\r
13172         DlgFont(hWnd, S_CURRENT, 11, true);\r
13173 \r
13174         SetText(hWnd, S_CURRENT, GetServerTypeStr(t.ServerType));\r
13175 \r
13176         switch (t.ServerType)\r
13177         {\r
13178         case SERVER_TYPE_FARM_CONTROLLER:\r
13179                 Check(hWnd, R_CONTROLLER, true);\r
13180                 break;\r
13181 \r
13182         case SERVER_TYPE_FARM_MEMBER:\r
13183                 Check(hWnd, R_MEMBER, true);\r
13184                 break;\r
13185 \r
13186         default:\r
13187                 Check(hWnd, R_STANDALONE, true);\r
13188                 break;\r
13189         }\r
13190 \r
13191         SetInt(hWnd, E_WEIGHT, t.Weight);\r
13192 \r
13193         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
13194         {\r
13195                 Check(hWnd, R_CONTROLLER_ONLY, t.ControllerOnly);\r
13196         }\r
13197 \r
13198         if (t.ServerType == SERVER_TYPE_FARM_MEMBER)\r
13199         {\r
13200                 char tmp[MAX_PUBLIC_PORT_NUM * 8];\r
13201                 UINT i;\r
13202                 if (t.PublicIp != 0)\r
13203                 {\r
13204                         IpSet(hWnd, E_IP, t.PublicIp);\r
13205                 }\r
13206                 StrCpy(tmp, sizeof(tmp), "");\r
13207                 if (t.NumPort != 0)\r
13208                 {\r
13209                         for (i = 0;i < t.NumPort;i++)\r
13210                         {\r
13211                                 Format(tmp, sizeof(tmp), "%s%u", tmp, t.Ports[i]);\r
13212                                 if (i != (t.NumPort - 1))\r
13213                                 {\r
13214                                         StrCat(tmp, sizeof(tmp), ", ");\r
13215                                 }\r
13216                         }\r
13217                         SetTextA(hWnd, E_PORT, tmp);\r
13218                 }\r
13219                 SetTextA(hWnd, E_CONTROLLER, t.ControllerName);\r
13220                 SetIntEx(hWnd, E_CONTROLLER_PORT, t.ControllerPort);\r
13221                 SetTextA(hWnd, E_PASSWORD, HIDDEN_PASSWORD);\r
13222         }\r
13223         else\r
13224         {\r
13225                 // ポート一覧を書き込む\r
13226                 RPC_LISTENER_LIST t;\r
13227                 char tmp[MAX_PUBLIC_PORT_NUM * 8];\r
13228                 Zero(&t, sizeof(t));\r
13229                 StrCpy(tmp, sizeof(tmp), "");\r
13230                 if (CALL(hWnd, ScEnumListener(p->Rpc, &t)))\r
13231                 {\r
13232                         UINT i;\r
13233                         if (t.NumPort != 0)\r
13234                         {\r
13235                                 for (i = 0;i < t.NumPort;i++)\r
13236                                 {\r
13237                                         Format(tmp, sizeof(tmp), "%s%u", tmp, t.Ports[i]);\r
13238                                         if (i != (t.NumPort - 1))\r
13239                                         {\r
13240                                                 StrCat(tmp, sizeof(tmp), ", ");\r
13241                                         }\r
13242                                 }\r
13243                                 SetTextA(hWnd, E_PORT, tmp);\r
13244                         }\r
13245                         FreeRpcListenerList(&t);\r
13246                 }\r
13247         }\r
13248 \r
13249         SmFarmDlgUpdate(hWnd, p);\r
13250 \r
13251         FreeRpcFarm(&t);\r
13252 \r
13253         Focus(hWnd, IDOK);\r
13254 }\r
13255 \r
13256 // ダイアログ更新\r
13257 void SmFarmDlgUpdate(HWND hWnd, SM_SERVER *p)\r
13258 {\r
13259         bool ok = true;\r
13260         bool farm_member_control = false;\r
13261         char *s;\r
13262         // 引数チェック\r
13263         if (hWnd == NULL || p == NULL)\r
13264         {\r
13265                 return;\r
13266         }\r
13267 \r
13268         if (IsChecked(hWnd, R_MEMBER))\r
13269         {\r
13270                 LIST *o;\r
13271                 UINT i = IpGetFilledNum(hWnd, E_IP);\r
13272                 if (i != 0 && i != 4)\r
13273                 {\r
13274                         ok = false;\r
13275                 }\r
13276 \r
13277                 s = GetTextA(hWnd, E_PORT);\r
13278                 o = SmStrToPortList(s);\r
13279                 if (o == NULL)\r
13280                 {\r
13281                         ok = false;\r
13282                 }\r
13283                 else\r
13284                 {\r
13285                         ReleaseList(o);\r
13286                 }\r
13287                 Free(s);\r
13288 \r
13289                 if (IsEmpty(hWnd, E_CONTROLLER))\r
13290                 {\r
13291                         ok = false;\r
13292                 }\r
13293 \r
13294                 i = GetInt(hWnd, E_CONTROLLER_PORT);\r
13295                 if (i == 0 || i >= 65536)\r
13296                 {\r
13297                         ok = false;\r
13298                 }\r
13299 \r
13300                 farm_member_control = true;\r
13301         }\r
13302 \r
13303         if (IsChecked(hWnd, R_STANDALONE))\r
13304         {\r
13305                 Disable(hWnd, S_1);\r
13306                 Disable(hWnd, S_2);\r
13307                 Disable(hWnd, E_WEIGHT);\r
13308         }\r
13309         else\r
13310         {\r
13311                 Enable(hWnd, S_1);\r
13312                 Enable(hWnd, S_2);\r
13313                 Enable(hWnd, E_WEIGHT);\r
13314         }\r
13315 \r
13316         if (IsChecked(hWnd, R_CONTROLLER))\r
13317         {\r
13318                 Enable(hWnd, R_CONTROLLER_ONLY);\r
13319         }\r
13320         else\r
13321         {\r
13322                 Disable(hWnd, R_CONTROLLER_ONLY);\r
13323         }\r
13324 \r
13325         if (IsChecked(hWnd, R_CONTROLLER) || IsChecked(hWnd, R_MEMBER))\r
13326         {\r
13327                 if (GetInt(hWnd, E_WEIGHT) == 0)\r
13328                 {\r
13329                         ok = false;\r
13330                 }\r
13331         }\r
13332 \r
13333         SetEnable(hWnd, S_IP_1, farm_member_control);\r
13334         SetEnable(hWnd, E_IP, farm_member_control);\r
13335         SetEnable(hWnd, S_IP_2, farm_member_control);\r
13336         SetEnable(hWnd, S_PORT_1, farm_member_control);\r
13337         SetEnable(hWnd, E_PORT, farm_member_control);\r
13338         SetEnable(hWnd, S_PORT_2, farm_member_control);\r
13339         SetEnable(hWnd, S_PORT_3, farm_member_control);\r
13340         SetEnable(hWnd, E_CONTROLLER, farm_member_control);\r
13341         SetEnable(hWnd, S_CONTROLLER, farm_member_control);\r
13342         SetEnable(hWnd, E_CONTROLLER_PORT, farm_member_control);\r
13343         SetEnable(hWnd, S_CONTROLLER_PORT, farm_member_control);\r
13344         SetEnable(hWnd, S_PASSWORD, farm_member_control);\r
13345         SetEnable(hWnd, E_PASSWORD, farm_member_control);\r
13346         SetEnable(hWnd, IDOK, ok);\r
13347 }\r
13348 \r
13349 // OK ボタン\r
13350 void SmFarmDlgOnOk(HWND hWnd, SM_SERVER *p)\r
13351 {\r
13352         // 引数チェック\r
13353         if (hWnd == NULL || p == NULL)\r
13354         {\r
13355                 return;\r
13356         }\r
13357 \r
13358         // メッセージ表示\r
13359         if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_OKCANCEL | MB_DEFBUTTON2,\r
13360                 _UU("SM_FARM_REBOOT_MSG")) == IDOK)\r
13361         {\r
13362                 RPC_FARM t;\r
13363                 Zero(&t, sizeof(t));\r
13364                 t.ServerType = SERVER_TYPE_STANDALONE;\r
13365                 if (IsChecked(hWnd, R_CONTROLLER))\r
13366                 {\r
13367                         t.ServerType = SERVER_TYPE_FARM_CONTROLLER;\r
13368                 }\r
13369                 if (IsChecked(hWnd, R_MEMBER))\r
13370                 {\r
13371                         t.ServerType = SERVER_TYPE_FARM_MEMBER;\r
13372                 }\r
13373 \r
13374                 t.ControllerOnly = IsChecked(hWnd, R_CONTROLLER_ONLY);\r
13375                 t.Weight = GetInt(hWnd, E_WEIGHT);\r
13376 \r
13377                 if (t.ServerType == SERVER_TYPE_FARM_MEMBER)\r
13378                 {\r
13379                         char *s;\r
13380                         char pass[MAX_SIZE];\r
13381                         t.PublicIp = IpGet(hWnd, E_IP);\r
13382                         s = GetTextA(hWnd, E_PORT);\r
13383                         if (s != NULL)\r
13384                         {\r
13385                                 LIST *o = SmStrToPortList(s);\r
13386                                 if (o != NULL)\r
13387                                 {\r
13388                                         UINT i;\r
13389                                         t.NumPort = LIST_NUM(o);\r
13390                                         t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);\r
13391                                         for (i = 0;i < t.NumPort;i++)\r
13392                                         {\r
13393                                                 t.Ports[i] = (UINT)LIST_DATA(o, i);\r
13394                                         }\r
13395                                         ReleaseList(o);\r
13396                                 }\r
13397                                 Free(s);\r
13398                         }\r
13399                         GetTxtA(hWnd, E_CONTROLLER, t.ControllerName, sizeof(t.ControllerName));\r
13400                         t.ControllerPort = GetInt(hWnd, E_CONTROLLER_PORT);\r
13401                         GetTxtA(hWnd, E_PASSWORD, pass, sizeof(pass));\r
13402                         if (StrCmp(pass, HIDDEN_PASSWORD) != 0)\r
13403                         {\r
13404                                 Hash(t.MemberPassword, pass, StrLen(pass), true);\r
13405                         }\r
13406                 }\r
13407 \r
13408                 // 設定更新\r
13409                 if (CALL(hWnd, ScSetFarmSetting(p->Rpc, &t)) == false)\r
13410                 {\r
13411                         return;\r
13412                 }\r
13413 \r
13414                 FreeRpcFarm(&t);\r
13415 \r
13416                 EndDialog(hWnd, true);\r
13417         }\r
13418 }\r
13419 \r
13420 // サーバー ファーム ダイアログ プロシージャ\r
13421 UINT SmFarmDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
13422 {\r
13423         SM_SERVER *p = (SM_SERVER *)param;\r
13424         // 引数チェック\r
13425         if (hWnd == NULL)\r
13426         {\r
13427                 return 0;\r
13428         }\r
13429 \r
13430         switch (msg)\r
13431         {\r
13432         case WM_INITDIALOG:\r
13433                 // 初期化\r
13434                 SmFarmDlgInit(hWnd, p);\r
13435                 break;\r
13436 \r
13437         case WM_COMMAND:\r
13438                 switch (LOWORD(wParam))\r
13439                 {\r
13440                 case R_STANDALONE:\r
13441                 case R_CONTROLLER:\r
13442                 case R_MEMBER:\r
13443                 case E_IP:\r
13444                 case E_PORT:\r
13445                 case E_CONTROLLER:\r
13446                 case E_CONTROLLER_PORT:\r
13447                 case E_PASSWORD:\r
13448                 case R_CONTROLLER_ONLY:\r
13449                 case E_WEIGHT:\r
13450                         SmFarmDlgUpdate(hWnd, p);\r
13451                         break;\r
13452                 }\r
13453 \r
13454                 switch (wParam)\r
13455                 {\r
13456                 case IDOK:\r
13457                         // OK ボタン\r
13458                         SmFarmDlgOnOk(hWnd, p);\r
13459                         break;\r
13460 \r
13461                 case IDCANCEL:\r
13462                         // キャンセルボタン\r
13463                         Close(hWnd);\r
13464                         break;\r
13465 \r
13466                 case R_MEMBER:\r
13467                         if (IsChecked(hWnd, R_MEMBER))\r
13468                         {\r
13469                                 Focus(hWnd, E_IP);\r
13470                         }\r
13471                         break;\r
13472                 }\r
13473                 break;\r
13474 \r
13475         case WM_CLOSE:\r
13476                 EndDialog(hWnd, false);\r
13477                 break;\r
13478         }\r
13479 \r
13480         return 0;\r
13481 }\r
13482 \r
13483 // サーバー ファーム構成\r
13484 bool SmFarmDlg(HWND hWnd, SM_SERVER *p)\r
13485 {\r
13486         // 引数チェック\r
13487         if (hWnd == NULL || p == NULL)\r
13488         {\r
13489                 return false;\r
13490         }\r
13491 \r
13492         return Dialog(hWnd, D_SM_FARM, SmFarmDlgProc, p);\r
13493 }\r
13494 \r
13495 // コネクション情報の更新\r
13496 bool SmRefreshConnectionStatus(HWND hWnd, SM_SERVER *p, void *param)\r
13497 {\r
13498         RPC_CONNECTION_INFO t;\r
13499         SM_CONNECTION_INFO *info = (SM_CONNECTION_INFO *)param;\r
13500         LVB *b;\r
13501         wchar_t tmp[MAX_SIZE];\r
13502         // 引数チェック\r
13503         if (hWnd == NULL || p == NULL || param == NULL)\r
13504         {\r
13505                 return false;\r
13506         }\r
13507 \r
13508         Zero(&t, sizeof(t));\r
13509         StrCpy(t.Name, sizeof(t.Name), info->ConnectionName);\r
13510         if (CALL(hWnd, ScGetConnectionInfo(p->Rpc, &t)) == false)\r
13511         {\r
13512                 return false;\r
13513         }\r
13514 \r
13515         b = LvInsertStart();\r
13516 \r
13517         StrToUni(tmp, sizeof(tmp), t.Name);\r
13518         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_CONNINFO_NAME"), tmp);\r
13519 \r
13520         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_CONNINFO_TYPE"), SmGetConnectionTypeStr(t.Type));\r
13521 \r
13522         StrToUni(tmp, sizeof(tmp), t.Hostname);\r
13523         LvInsertAdd(b, ICO_FARM, NULL, 2, _UU("SM_CONNINFO_HOSTNAME"), tmp);\r
13524 \r
13525         UniToStru(tmp, t.Port);\r
13526         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_CONNINFO_PORT"), tmp);\r
13527 \r
13528         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);\r
13529         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_CONNINFO_TIME"), tmp);\r
13530 \r
13531         StrToUni(tmp, sizeof(tmp), t.ServerStr);\r
13532         LvInsertAdd(b, ICO_VPNSERVER, NULL, 2, _UU("SM_CONNINFO_SERVER_STR"), tmp);\r
13533 \r
13534         UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);\r
13535         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_CONNINFO_SERVER_VER"), tmp);\r
13536 \r
13537         UniToStru(tmp, t.ServerBuild);\r
13538         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);\r
13539 \r
13540         if (StrLen(t.ClientStr) != 0)\r
13541         {\r
13542                 StrToUni(tmp, sizeof(tmp), t.ClientStr);\r
13543                 LvInsertAdd(b, ICO_VPN, NULL, 2, _UU("SM_CONNINFO_CLIENT_STR"), tmp);\r
13544 \r
13545                 UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);\r
13546                 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_CONNINFO_CLIENT_VER"), tmp);\r
13547 \r
13548                 UniToStru(tmp, t.ClientBuild);\r
13549                 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);\r
13550         }\r
13551 \r
13552         LvInsertEnd(b, hWnd, L_STATUS);\r
13553 \r
13554         return true;\r
13555 }\r
13556 \r
13557 // 初期化\r
13558 void SmConnectionDlgInit(HWND hWnd, SM_SERVER *p)\r
13559 {\r
13560         // 引数チェック\r
13561         if (hWnd == NULL || p == NULL)\r
13562         {\r
13563                 return;\r
13564         }\r
13565 \r
13566         SetIcon(hWnd, 0, ICO_PROTOCOL);\r
13567         FormatText(hWnd, S_TITLE, p->ServerName);\r
13568 \r
13569         // カラム初期化\r
13570         LvInit(hWnd, L_LIST);\r
13571         LvSetStyle(hWnd, L_LIST, LVS_EX_GRIDLINES);\r
13572         LvInsertColumn(hWnd, L_LIST, 0, _UU("SM_CONN_COLUMN_1"), 90);\r
13573         LvInsertColumn(hWnd, L_LIST, 1, _UU("SM_CONN_COLUMN_2"), 150);\r
13574         LvInsertColumn(hWnd, L_LIST, 2, _UU("SM_CONN_COLUMN_3"), 200);\r
13575         LvInsertColumn(hWnd, L_LIST, 3, _UU("SM_CONN_COLUMN_4"), 80);\r
13576 \r
13577         SmConnectionDlgRefresh(hWnd, p);\r
13578         SmConnectionDlgUpdate(hWnd, p);\r
13579 }\r
13580 \r
13581 // 更新\r
13582 void SmConnectionDlgRefresh(HWND hWnd, SM_SERVER *p)\r
13583 {\r
13584         LVB *b;\r
13585         UINT i;\r
13586         RPC_ENUM_CONNECTION t;\r
13587         // 引数チェック\r
13588         if (hWnd == NULL || p == NULL)\r
13589         {\r
13590                 return;\r
13591         }\r
13592 \r
13593         Zero(&t, sizeof(t));\r
13594         if (CALL(hWnd, ScEnumConnection(p->Rpc, &t)) == false)\r
13595         {\r
13596                 EndDialog(hWnd, false);\r
13597                 return;\r
13598         }\r
13599 \r
13600         b = LvInsertStart();\r
13601 \r
13602         for (i = 0;i < t.NumConnection;i++)\r
13603         {\r
13604                 wchar_t tmp[MAX_SIZE];\r
13605                 wchar_t name[MAX_SIZE];\r
13606                 wchar_t datetime[MAX_SIZE];\r
13607                 RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];\r
13608 \r
13609                 StrToUni(name, sizeof(name), e->Name);\r
13610                 UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);\r
13611                 GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);\r
13612 \r
13613                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 4, name, tmp, datetime,\r
13614                         SmGetConnectionTypeStr(e->Type));\r
13615         }\r
13616 \r
13617         LvInsertEnd(b, hWnd, L_LIST);\r
13618 \r
13619         FreeRpcEnumConnetion(&t);\r
13620 }\r
13621 \r
13622 // コントロール更新\r
13623 void SmConnectionDlgUpdate(HWND hWnd, SM_SERVER *p)\r
13624 {\r
13625         bool b = false;\r
13626         // 引数チェック\r
13627         if (hWnd == NULL || p == NULL)\r
13628         {\r
13629                 return;\r
13630         }\r
13631 \r
13632         if (LvIsSelected(hWnd, L_LIST) && (LvIsMultiMasked(hWnd, L_LIST) == false))\r
13633         {\r
13634                 b = true;\r
13635         }\r
13636 \r
13637         SetEnable(hWnd, IDOK, b);\r
13638         SetEnable(hWnd, B_DISCONNECT, b && p->ServerAdminMode);\r
13639 }\r
13640 \r
13641 // コネクション一覧プロシージャ\r
13642 UINT SmConnectionDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
13643 {\r
13644         SM_SERVER *p = (SM_SERVER *)param;\r
13645         NMHDR *n;\r
13646         wchar_t *s;\r
13647         // 引数チェック\r
13648         if (hWnd == NULL)\r
13649         {\r
13650                 return 0;\r
13651         }\r
13652 \r
13653         switch (msg)\r
13654         {\r
13655         case WM_INITDIALOG:\r
13656                 // 初期化\r
13657                 SmConnectionDlgInit(hWnd, p);\r
13658                 break;\r
13659 \r
13660         case WM_COMMAND:\r
13661                 switch (wParam)\r
13662                 {\r
13663                 case IDOK:\r
13664                         // コネクション情報を表示\r
13665                         s = LvGetSelectedStr(hWnd, L_LIST, 0);\r
13666                         if (s != NULL)\r
13667                         {\r
13668                                 wchar_t caption[MAX_SIZE];\r
13669                                 SM_CONNECTION_INFO info;\r
13670                                 UniFormat(caption, sizeof(caption), _UU("SM_CONNINFO_CAPTION"),\r
13671                                         s);\r
13672                                 Zero(&info, sizeof(info));\r
13673                                 info.ConnectionName = CopyUniToStr(s);\r
13674                                 info.p = p;\r
13675                                 SmStatusDlg(hWnd, p, &info, false, false, caption, ICO_PROTOCOL,\r
13676                                         NULL, SmRefreshConnectionStatus);\r
13677                                 Free(info.ConnectionName);\r
13678                                 Free(s);\r
13679                         }\r
13680                         break;\r
13681 \r
13682                 case B_DISCONNECT:\r
13683                         // 切断\r
13684                         s = LvGetSelectedStr(hWnd, L_LIST, 0);\r
13685                         if (s != NULL)\r
13686                         {\r
13687                                 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
13688                                         _UU("SM_CONN_DISCONNECT_MSG"), s) == IDYES)\r
13689                                 {\r
13690                                         char tmp[MAX_SIZE];\r
13691                                         RPC_DISCONNECT_CONNECTION t;\r
13692 \r
13693                                         UniToStr(tmp, sizeof(tmp), s);\r
13694                                         Zero(&t, sizeof(t));\r
13695                                         StrCpy(t.Name, sizeof(t.Name), tmp);\r
13696 \r
13697                                         if (CALL(hWnd, ScDisconnectConnection(p->Rpc, &t)))\r
13698                                         {\r
13699                                                 SmConnectionDlgRefresh(hWnd, p);\r
13700                                         }\r
13701                                 }\r
13702                                 Free(s);\r
13703                         }\r
13704                         break;\r
13705 \r
13706                 case B_REFRESH:\r
13707                         // 最新の状態に更新\r
13708                         SmConnectionDlgRefresh(hWnd, p);\r
13709                         break;\r
13710 \r
13711                 case IDCANCEL:\r
13712                         // キャンセルボタン\r
13713                         Close(hWnd);\r
13714                         break;\r
13715                 }\r
13716                 break;\r
13717 \r
13718         case WM_NOTIFY:\r
13719                 n = (NMHDR *)lParam;\r
13720                 switch (n->idFrom)\r
13721                 {\r
13722                 case L_LIST:\r
13723                         switch (n->code)\r
13724                         {\r
13725                         case LVN_ITEMCHANGED:\r
13726                                 SmConnectionDlgUpdate(hWnd, p);\r
13727                                 break;\r
13728                         }\r
13729                         break;\r
13730                 }\r
13731                 break;\r
13732 \r
13733         case WM_CLOSE:\r
13734                 EndDialog(hWnd, false);\r
13735                 break;\r
13736         }\r
13737 \r
13738         LvStandardHandler(hWnd, msg, wParam, lParam, L_LIST);\r
13739 \r
13740         return 0;\r
13741 }\r
13742 \r
13743 // コネクション一覧の表示\r
13744 void SmConnectionDlg(HWND hWnd, SM_SERVER *p)\r
13745 {\r
13746         // 引数チェック\r
13747         if (hWnd == NULL || p == NULL)\r
13748         {\r
13749                 return;\r
13750         }\r
13751 \r
13752         Dialog(hWnd, D_SM_CONNECTION, SmConnectionDlgProc, p);\r
13753 }\r
13754 \r
13755 // コネクション種類文字列の取得\r
13756 wchar_t *SmGetConnectionTypeStr(UINT type)\r
13757 {\r
13758         return GetConnectionTypeStr(type);\r
13759 }\r
13760 \r
13761 // サーバー情報の更新\r
13762 bool SmRefreshServerInfo(HWND hWnd, SM_SERVER *p, void *param)\r
13763 {\r
13764         RPC_SERVER_INFO t;\r
13765         LVB *b;\r
13766         wchar_t tmp[MAX_SIZE];\r
13767         // 引数チェック\r
13768         if (hWnd == NULL || p == NULL)\r
13769         {\r
13770                 return false;\r
13771         }\r
13772 \r
13773         Zero(&t, sizeof(t));\r
13774         if (CALL(hWnd, ScGetServerInfo(p->Rpc, &t)) == false)\r
13775         {\r
13776                 return false;\r
13777         }\r
13778 \r
13779         b = LvInsertStart();\r
13780 \r
13781         // 製品名\r
13782         StrToUni(tmp, sizeof(tmp), t.ServerProductName);\r
13783         LvInsertAdd(b, ICO_VPNSERVER, NULL, 2, _UU("SM_INFO_PRODUCT_NAME"), tmp);\r
13784 \r
13785         // バージョン\r
13786         StrToUni(tmp, sizeof(tmp), t.ServerVersionString);\r
13787         LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("SM_INFO_VERSION"), tmp);\r
13788 \r
13789         // ビルド\r
13790         StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);\r
13791         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_INFO_BUILD"), tmp);\r
13792 \r
13793         // ホスト名\r
13794         StrToUni(tmp, sizeof(tmp), t.ServerHostName);\r
13795         LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("SM_INFO_HOSTNAME"), tmp);\r
13796 \r
13797         // 種類\r
13798         LvInsertAdd(b, t.ServerType == SERVER_TYPE_STANDALONE ? ICO_SERVER_ONLINE : ICO_FARM, 0,\r
13799                 2, _UU("SM_ST_SERVER_TYPE"),\r
13800                 GetServerTypeStr(t.ServerType));\r
13801 \r
13802         // OS\r
13803         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);\r
13804         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SYSTEM_NAME"), tmp);\r
13805 \r
13806         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);\r
13807         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_PRODUCT_NAME"), tmp);\r
13808 \r
13809         if (t.OsInfo.OsServicePack != 0)\r
13810         {\r
13811                 UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);\r
13812                 LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SERVICE_PACK"), tmp);\r
13813         }\r
13814 \r
13815         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);\r
13816         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VENDER_NAME"), tmp);\r
13817 \r
13818         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);\r
13819         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VERSION"), tmp);\r
13820 \r
13821         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);\r
13822         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_NAME"), tmp);\r
13823 \r
13824         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);\r
13825         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_VERSION"), tmp);\r
13826 \r
13827         SmAddServerCaps(b, p->CapsList);\r
13828 \r
13829         LvInsertEnd(b, hWnd, L_STATUS);\r
13830 \r
13831         FreeRpcServerInfo(&t);\r
13832 \r
13833         return true;\r
13834 }\r
13835 \r
13836 // サーバーの Caps を画面に表示する\r
13837 void SmAddServerCaps(LVB *b, CAPSLIST *t)\r
13838 {\r
13839         UINT i;\r
13840         // 引数チェック\r
13841         if (b == NULL || t == NULL)\r
13842         {\r
13843                 return;\r
13844         }\r
13845 \r
13846         for (i = 0;i < LIST_NUM(t->CapsList);i++)\r
13847         {\r
13848                 CAPS *c = LIST_DATA(t->CapsList, i);\r
13849                 wchar_t title[MAX_SIZE];\r
13850                 char name[256];\r
13851 \r
13852                 Format(name, sizeof(name), "CT_%s", c->Name);\r
13853 \r
13854                 UniStrCpy(title, sizeof(title), _UU(name));\r
13855 \r
13856                 if (UniIsEmptyStr(title))\r
13857                 {\r
13858                         UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);\r
13859                 }\r
13860 \r
13861                 if (StartWith(c->Name, "b_"))\r
13862                 {\r
13863                         bool icon_pass = c->Value == 0 ? false : true;\r
13864                         if (StrCmpi(c->Name, "b_must_install_pcap") == 0)\r
13865                         {\r
13866                                 // WinPcap の項目のみ反転する\r
13867                                 icon_pass = !icon_pass;\r
13868                         }\r
13869                         LvInsertAdd(b, icon_pass == false ? ICO_DISCARD : ICO_PASS,\r
13870                                 NULL, 2, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));\r
13871                 }\r
13872                 else\r
13873                 {\r
13874                         wchar_t str[64];\r
13875                         UniToStru(str, c->Value);\r
13876                         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, title, str);\r
13877                 }\r
13878         }\r
13879 }\r
13880 \r
13881 // サーバー状態の更新\r
13882 bool SmRefreshServerStatus(HWND hWnd, SM_SERVER *p, void *param)\r
13883 {\r
13884         RPC_SERVER_STATUS t;\r
13885         LVB *b;\r
13886         wchar_t tmp[MAX_SIZE];\r
13887         char str[MAX_SIZE];\r
13888         // 引数チェック\r
13889         if (hWnd == NULL || p == NULL)\r
13890         {\r
13891                 return false;\r
13892         }\r
13893 \r
13894         Zero(&t, sizeof(t));\r
13895         if (CALL(hWnd, ScGetServerStatus(p->Rpc, &t)) == false)\r
13896         {\r
13897                 return false;\r
13898         }\r
13899 \r
13900         b = LvInsertStart();\r
13901 \r
13902         // サーバーの種類\r
13903         LvInsertAdd(b, t.ServerType == SERVER_TYPE_STANDALONE ? ICO_SERVER_ONLINE : ICO_FARM, 0,\r
13904                 2, _UU("SM_ST_SERVER_TYPE"),\r
13905                 GetServerTypeStr(t.ServerType));\r
13906 \r
13907         // TCP コネクション数\r
13908         UniToStru(tmp, t.NumTcpConnections);\r
13909         LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_ST_NUM_TCP"), tmp);\r
13910 \r
13911         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
13912         {\r
13913                 // ローカル TCP コネクション数\r
13914                 UniToStru(tmp, t.NumTcpConnectionsLocal);\r
13915                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);\r
13916 \r
13917                 // リモート TCP コネクション数\r
13918                 UniToStru(tmp, t.NumTcpConnectionsRemote);\r
13919                 LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);\r
13920         }\r
13921 \r
13922         // 仮想 HUB 数\r
13923         UniToStru(tmp, t.NumHubTotal);\r
13924         LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);\r
13925 \r
13926         if (t.ServerType != SERVER_TYPE_STANDALONE)\r
13927         {\r
13928                 // スタティック HUB 数\r
13929                 UniToStru(tmp, t.NumHubStatic);\r
13930                 LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_ST_NUM_HUB_STATIC"), tmp);\r
13931 \r
13932                 // ダイナミック HUB 数\r
13933                 UniToStru(tmp, t.NumHubDynamic);\r
13934                 LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);\r
13935         }\r
13936 \r
13937         // セッション数\r
13938         UniToStru(tmp, t.NumSessionsTotal);\r
13939         LvInsertAdd(b, ICO_VPN, NULL, 2, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);\r
13940 \r
13941         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
13942         {\r
13943                 // ローカルセッション数\r
13944                 UniToStru(tmp, t.NumSessionsLocal);\r
13945                 LvInsertAdd(b, ICO_VPN, NULL, 2, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);\r
13946 \r
13947                 // ローカルセッション数\r
13948                 UniToStru(tmp, t.NumSessionsRemote);\r
13949                 LvInsertAdd(b, ICO_VPN, NULL, 2, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);\r
13950         }\r
13951 \r
13952         // MAC テーブル数\r
13953         UniToStru(tmp, t.NumMacTables);\r
13954         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_ST_NUM_MAC_TABLE"), tmp);\r
13955 \r
13956         // IP テーブル数\r
13957         UniToStru(tmp, t.NumIpTables);\r
13958         LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_ST_NUM_IP_TABLE"), tmp);\r
13959 \r
13960         // ユーザー数\r
13961         UniToStru(tmp, t.NumUsers);\r
13962         LvInsertAdd(b, ICO_USER, NULL, 2, _UU("SM_ST_NUM_USERS"), tmp);\r
13963 \r
13964         // グループ数\r
13965         UniToStru(tmp, t.NumGroups);\r
13966         LvInsertAdd(b, ICO_GROUP, NULL, 2, _UU("SM_ST_NUM_GROUPS"), tmp);\r
13967 \r
13968         // 割り当て済みライセンス数\r
13969         UniToStru(tmp, t.AssignedClientLicenses);\r
13970         LvInsertAdd(b, ICO_CERT, NULL, 2, _UU("SM_ST_CLIENT_LICENSE"), tmp);\r
13971         UniToStru(tmp, t.AssignedBridgeLicenses);\r
13972         LvInsertAdd(b, ICO_CERT, NULL, 2, _UU("SM_ST_BRIDGE_LICENSE"), tmp);\r
13973 \r
13974         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
13975         {\r
13976                 UniToStru(tmp, t.AssignedClientLicensesTotal);\r
13977                 LvInsertAdd(b, ICO_CERT, NULL, 2, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);\r
13978                 UniToStru(tmp, t.AssignedBridgeLicensesTotal);\r
13979                 LvInsertAdd(b, ICO_CERT, NULL, 2, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);\r
13980         }\r
13981 \r
13982         // トラフィック\r
13983         SmInsertTrafficInfo(b, &t.Traffic);\r
13984 \r
13985         // サーバー起動時刻\r
13986         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);\r
13987         LvInsertAdd(b, ICO_NULL, NULL, 2, _UU("SM_ST_START_TIME"), tmp);\r
13988 \r
13989         // 現在時刻\r
13990         GetDateTimeStrMilli64(str, sizeof(str), SystemToLocal64(t.CurrentTime));\r
13991         StrToUni(tmp, sizeof(tmp), str);\r
13992         LvInsertAdd(b, ICO_NULL, NULL, 2, _UU("SM_ST_CURRENT_TIME"), tmp);\r
13993 \r
13994         // Tick 値\r
13995         UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);\r
13996         LvInsertAdd(b, ICO_NULL, NULL, 2, _UU("SM_ST_CURRENT_TICK"), tmp);\r
13997 \r
13998         // メモリ情報\r
13999         if (t.MemInfo.TotalMemory != 0)\r
14000         {\r
14001                 char vv[128];\r
14002 \r
14003                 ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);\r
14004                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14005                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_MEMORY"), tmp);\r
14006 \r
14007                 ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);\r
14008                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14009                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_MEMORY"), tmp);\r
14010 \r
14011                 ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);\r
14012                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14013                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_MEMORY"), tmp);\r
14014 \r
14015                 ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);\r
14016                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14017                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_PHYS"), tmp);\r
14018 \r
14019                 ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);\r
14020                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14021                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_PHYS"), tmp);\r
14022 \r
14023                 ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);\r
14024                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
14025                 LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_PHYS"), tmp);\r
14026         }\r
14027 \r
14028         LvInsertEnd(b, hWnd, L_STATUS);\r
14029 \r
14030         return true;\r
14031 }\r
14032 \r
14033 // 初期化\r
14034 void SmSaveKeyPairDlgInit(HWND hWnd, SM_SAVE_KEY_PAIR *s)\r
14035 {\r
14036         UINT current;\r
14037         // 引数チェック\r
14038         if (hWnd == NULL || s == NULL)\r
14039         {\r
14040                 return;\r
14041         }\r
14042 \r
14043         current = MsRegReadInt(REG_CURRENT_USER, SM_REG_KEY, "SavePkcs12");\r
14044 \r
14045         if (current == 1)\r
14046         {\r
14047                 Check(hWnd, R_PKCS12, true);\r
14048         }\r
14049         else if (current == 2)\r
14050         {\r
14051                 Check(hWnd, R_SECURE, true);\r
14052         }\r
14053         else\r
14054         {\r
14055                 Check(hWnd, R_X509_AND_KEY, true);\r
14056         }\r
14057 \r
14058         SmSaveKeyPairDlgUpdate(hWnd, s);\r
14059 }\r
14060 \r
14061 // 更新\r
14062 void SmSaveKeyPairDlgUpdate(HWND hWnd, SM_SAVE_KEY_PAIR *s)\r
14063 {\r
14064         SECURE_DEVICE *dev;\r
14065         bool ok = true;\r
14066         wchar_t tmp[MAX_SIZE];\r
14067         // 引数チェック\r
14068         if (hWnd == NULL || s == NULL)\r
14069         {\r
14070                 return;\r
14071         }\r
14072 \r
14073         dev = GetSecureDevice(SmGetCurrentSecureIdFromReg());\r
14074         if (dev == NULL)\r
14075         {\r
14076                 UniStrCpy(tmp, sizeof(tmp), _UU("SEC_CURRENT_NO_DEVICE"));\r
14077         }\r
14078         else\r
14079         {\r
14080                 UniFormat(tmp, sizeof(tmp), _UU("SEC_CURRENT_DEVICE"), dev->DeviceName);\r
14081         }\r
14082 \r
14083         SetText(hWnd, S_INFO, tmp);\r
14084 \r
14085         if (IsChecked(hWnd, R_USE_PASS))\r
14086         {\r
14087                 char *s1, *s2;\r
14088                 s1 = GetTextA(hWnd, E_PASS1);\r
14089                 s2 = GetTextA(hWnd, E_PASS2);\r
14090                 if (StrCmp(s1, s2) != 0)\r
14091                 {\r
14092                         ok = false;\r
14093                 }\r
14094                 Free(s1);\r
14095                 Free(s2);\r
14096         }\r
14097 \r
14098         if (IsChecked(hWnd, R_SECURE))\r
14099         {\r
14100                 if (dev == NULL)\r
14101                 {\r
14102                         ok = false;\r
14103                 }\r
14104         }\r
14105 \r
14106         SetEnable(hWnd, B_SELECT, IsChecked(hWnd, R_SECURE));\r
14107         SetEnable(hWnd, B_SECURE_MANAGER, IsChecked(hWnd, R_SECURE));\r
14108         SetEnable(hWnd, S_INFO, IsChecked(hWnd, R_SECURE));\r
14109 \r
14110         SetEnable(hWnd, E_PASS1, IsChecked(hWnd, R_USE_PASS) && (IsChecked(hWnd, R_SECURE) == false));\r
14111         SetEnable(hWnd, E_PASS2, IsChecked(hWnd, R_USE_PASS) && (IsChecked(hWnd, R_SECURE) == false));\r
14112         SetEnable(hWnd, S_PASS1, IsChecked(hWnd, R_USE_PASS) && (IsChecked(hWnd, R_SECURE) == false));\r
14113         SetEnable(hWnd, S_PASS2, IsChecked(hWnd, R_USE_PASS) && (IsChecked(hWnd, R_SECURE) == false));\r
14114         SetEnable(hWnd, R_USE_PASS, (IsChecked(hWnd, R_SECURE) == false));\r
14115         SetEnable(hWnd, S_PASS3, (IsChecked(hWnd, R_SECURE) == false));\r
14116         SetEnable(hWnd, S_PASS4, (IsChecked(hWnd, R_SECURE) == false));\r
14117 \r
14118         SetEnable(hWnd, IDOK, ok);\r
14119 }\r
14120 \r
14121 // OK ボタン\r
14122 void SmSaveKeyPairDlgOnOk(HWND hWnd, SM_SAVE_KEY_PAIR *s)\r
14123 {\r
14124         UINT pkcs12;\r
14125         char pass[MAX_SIZE];\r
14126         char *password;\r
14127         // 引数チェック\r
14128         if (hWnd == NULL || s == NULL)\r
14129         {\r
14130                 return;\r
14131         }\r
14132 \r
14133         pkcs12 = 0;\r
14134 \r
14135         if (IsChecked(hWnd, R_PKCS12))\r
14136         {\r
14137                 pkcs12 = 1;\r
14138         }\r
14139         else if (IsChecked(hWnd, R_SECURE))\r
14140         {\r
14141                 pkcs12 = 2;\r
14142         }\r
14143         MsRegWriteInt(REG_CURRENT_USER, SM_REG_KEY, "SavePkcs12", pkcs12);\r
14144 \r
14145         if (pkcs12 != 2)\r
14146         {\r
14147                 GetTxtA(hWnd, E_PASS1, pass, sizeof(pass));\r
14148 \r
14149                 if (StrLen(pass) != 0)\r
14150                 {\r
14151                         password = pass;\r
14152                 }\r
14153                 else\r
14154                 {\r
14155                         password = NULL;\r
14156                 }\r
14157 \r
14158                 if (pkcs12 == false)\r
14159                 {\r
14160                         // X509 と KEY に書き込む\r
14161                         wchar_t *x509_name, *key_name;\r
14162                         x509_name = SaveDlg(hWnd, _UU("DLG_CERT_FILES"), _UU("DLG_SAVE_CERT"), NULL, L".cer");\r
14163                         if (x509_name == NULL)\r
14164                         {\r
14165                                 // キャンセル\r
14166                                 return;\r
14167                         }\r
14168                         else\r
14169                         {\r
14170                                 wchar_t default_key_name[MAX_SIZE];\r
14171                                 UniReplaceStrEx(default_key_name, sizeof(default_key_name), x509_name,\r
14172                                         L".cer", L"", false);\r
14173                                 UniReplaceStrEx(default_key_name, sizeof(default_key_name), default_key_name,\r
14174                                                                 L".crt", L"", false);\r
14175                                 UniStrCat(default_key_name, sizeof(default_key_name), L".key");\r
14176                                 key_name = SaveDlg(hWnd, _UU("DLG_KEY_FILTER"), _UU("DLG_SAVE_KEY"),\r
14177                                         default_key_name, L".key");\r
14178                                 if (key_name == NULL)\r
14179                                 {\r
14180                                         // キャンセル\r
14181                                         Free(x509_name);\r
14182                                         return;\r
14183                                 }\r
14184                                 else\r
14185                                 {\r
14186                                         bool ok = true;\r
14187                                         char filename1[MAX_SIZE];\r
14188                                         char filename2[MAX_SIZE];\r
14189 \r
14190                                         UniToStr(filename1, sizeof(filename1), x509_name);\r
14191                                         UniToStr(filename2, sizeof(filename2), key_name);\r
14192 \r
14193                                         // 証明書の保存\r
14194                                         if (XToFile(s->Cert, filename1, true) == false)\r
14195                                         {\r
14196                                                 MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_CERT_SAVE_ERROR"));\r
14197                                                 ok = false;\r
14198                                         }\r
14199                                         else\r
14200                                         {\r
14201                                                 if (KToFile(s->Key, filename2, true, password) == false)\r
14202                                                 {\r
14203                                                         MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_KEY_SAVE_ERROR"));\r
14204                                                         ok = false;\r
14205                                                 }\r
14206                                         }\r
14207 \r
14208                                         if (ok)\r
14209                                         {\r
14210                                                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("DLG_KEY_PAIR_SAVE_OK"));\r
14211                                                 EndDialog(hWnd, true);\r
14212                                         }\r
14213 \r
14214                                         Free(key_name);\r
14215                                 }\r
14216                                 Free(x509_name);\r
14217                         }\r
14218                 }\r
14219                 else\r
14220                 {\r
14221                         // PKCS#12 に書き込む\r
14222                         wchar_t *name = SaveDlg(hWnd, _UU("DLG_PKCS12_FILTER"), _UU("DLG_SAVE_P12"), NULL, L".p12");\r
14223                         if (name == NULL)\r
14224                         {\r
14225                                 // キャンセル\r
14226                                 return;\r
14227                         }\r
14228                         else\r
14229                         {\r
14230                                 P12 *p12;\r
14231                                 char filename[MAX_SIZE];\r
14232                                 UniToStr(filename, sizeof(filename), name);\r
14233 \r
14234                                 // PKCS#12 に変換\r
14235                                 p12 = NewP12(s->Cert, s->Key, pass);\r
14236                                 if (p12 == NULL)\r
14237                                 {\r
14238                                         // 失敗\r
14239                                         MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_KEY_PAIR_SAVE_OK"));\r
14240                                 }\r
14241                                 else\r
14242                                 {\r
14243                                         // 保存\r
14244                                         if (P12ToFile(p12, filename) == false)\r
14245                                         {\r
14246                                                 // 失敗\r
14247                                                 MsgBox(hWnd, MB_ICONSTOP, _UU("DLG_KEY_PAIR_SAVE_OK"));\r
14248                                         }\r
14249                                         else\r
14250                                         {\r
14251                                                 // 成功\r
14252                                                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("DLG_KEY_PAIR_SAVE_OK"));\r
14253                                                 EndDialog(hWnd, true);\r
14254                                         }\r
14255                                         FreeP12(p12);\r
14256                                 }\r
14257 \r
14258                                 Free(name);\r
14259                         }\r
14260                 }\r
14261         }\r
14262         else\r
14263         {\r
14264                 char default_name[MAX_SIZE];\r
14265                 char *object_name;\r
14266                 bool ok = false;\r
14267                 X *x;\r
14268                 K *k;\r
14269                 WINUI_SECURE_BATCH batch[] =\r
14270                 {\r
14271                         {WINUI_SECURE_WRITE_CERT, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL},\r
14272                         {WINUI_SECURE_WRITE_KEY, NULL, true, NULL, NULL, NULL, NULL, NULL, NULL},\r
14273                 };\r
14274 \r
14275                 x = s->Cert;\r
14276                 k = s->Key;\r
14277 \r
14278                 // デフォルトの名前を生成する\r
14279                 GetPrintNameFromXA(default_name, sizeof(default_name), x);\r
14280                 ConvertSafeFileName(default_name, sizeof(default_name), default_name);\r
14281 \r
14282                 object_name = StringDlgA(hWnd, _UU("SEC_OBJECT_NAME_TITLE"),\r
14283                         _UU("SEC_OBJECT_NAME_INFO"), default_name, ICO_CERT, false, false);\r
14284 \r
14285                 if (object_name != NULL)\r
14286                 {\r
14287                         // 書き込みと列挙\r
14288                         batch[0].InputX = x;\r
14289                         batch[0].Name = object_name;\r
14290                         batch[1].InputK = k;\r
14291                         batch[1].Name = object_name;\r
14292 \r
14293                         if (SecureDeviceWindow(hWnd, batch, sizeof(batch) / sizeof(batch[0]), SmGetCurrentSecureIdFromReg(), 0) == false)\r
14294                         {\r
14295                                 // 失敗\r
14296                         }\r
14297                         else\r
14298                         {\r
14299                                 ok = true;\r
14300                         }\r
14301 \r
14302                         Free(object_name);\r
14303                 }\r
14304 \r
14305                 if (ok)\r
14306                 {\r
14307                         MsgBox(hWnd, MB_ICONINFORMATION, _UU("SEC_NEW_CERT_IMPORT_OK"));\r
14308 \r
14309                         EndDialog(hWnd, true);\r
14310                 }\r
14311         }\r
14312 }\r
14313 \r
14314 // 証明書と秘密鍵の保存ダイアログ\r
14315 UINT SmSaveKeyPairDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
14316 {\r
14317         SM_SAVE_KEY_PAIR *s = (SM_SAVE_KEY_PAIR *)param;\r
14318         // 引数チェック\r
14319         if (hWnd == NULL)\r
14320         {\r
14321                 return 0;\r
14322         }\r
14323 \r
14324         switch (msg)\r
14325         {\r
14326         case WM_INITDIALOG:\r
14327                 // 初期化\r
14328                 SmSaveKeyPairDlgInit(hWnd, s);\r
14329                 break;\r
14330 \r
14331         case WM_COMMAND:\r
14332                 switch (LOWORD(wParam))\r
14333                 {\r
14334                 case E_PASS1:\r
14335                 case E_PASS2:\r
14336                 case R_USE_PASS:\r
14337                 case R_SECURE:\r
14338                 case R_X509_AND_KEY:\r
14339                 case R_PKCS12:\r
14340                         SmSaveKeyPairDlgUpdate(hWnd, s);\r
14341                         break;\r
14342                 }\r
14343 \r
14344                 switch (wParam)\r
14345                 {\r
14346                 case IDOK:\r
14347                         // OK ボタン\r
14348                         SmSaveKeyPairDlgOnOk(hWnd, s);\r
14349                         break;\r
14350 \r
14351                 case IDCANCEL:\r
14352                         // キャンセルボタン\r
14353                         Close(hWnd);\r
14354                         break;\r
14355 \r
14356                 case R_USE_PASS:\r
14357                         if (IsChecked(hWnd, R_USE_PASS))\r
14358                         {\r
14359                                 FocusEx(hWnd, E_PASS1);\r
14360                         }\r
14361                         break;\r
14362 \r
14363                 case B_SELECT:\r
14364                         SmSelectSecureId(hWnd);\r
14365                         SmSaveKeyPairDlgUpdate(hWnd, s);\r
14366                         break;\r
14367 \r
14368                 case B_SECURE_MANAGER:\r
14369                         CmSecureManagerEx(hWnd, SmGetCurrentSecureId(hWnd), true);\r
14370                         SmSaveKeyPairDlgUpdate(hWnd, s);\r
14371                         break;\r
14372                 }\r
14373                 break;\r
14374 \r
14375         case WM_CLOSE:\r
14376                 EndDialog(hWnd, false);\r
14377                 break;\r
14378         }\r
14379 \r
14380         return 0;\r
14381 }\r
14382 \r
14383 // 証明書と秘密鍵を保存する\r
14384 bool SmSaveKeyPairDlg(HWND hWnd, X *x, K *k)\r
14385 {\r
14386         SM_SAVE_KEY_PAIR s;\r
14387         // 引数チェック\r
14388         if (hWnd == NULL || x == NULL || k == NULL)\r
14389         {\r
14390                 return false;\r
14391         }\r
14392 \r
14393         Zero(&s, sizeof(s));\r
14394         s.Cert = x;\r
14395         s.Key = k;\r
14396 \r
14397         return Dialog(hWnd,     D_SM_SAVE_KEY_PAIR, SmSaveKeyPairDlgProc, &s);\r
14398 }\r
14399 \r
14400 // SSL 関係ダイアログで OK がクリックされた\r
14401 void SmSslDlgOnOk(HWND hWnd, SM_SSL *s)\r
14402 {\r
14403         char *name;\r
14404         RPC_KEEP t;\r
14405         // 引数チェック\r
14406         if (hWnd == NULL || s == NULL)\r
14407         {\r
14408                 return;\r
14409         }\r
14410 \r
14411         if (s->p->ServerAdminMode == false)\r
14412         {\r
14413                 EndDialog(hWnd, false);\r
14414                 return;\r
14415         }\r
14416 \r
14417         name = GetTextA(hWnd, C_CIPHER);\r
14418         if (name == NULL)\r
14419         {\r
14420                 return;\r
14421         }\r
14422         else\r
14423         {\r
14424                 RPC_STR t;\r
14425                 Zero(&t, sizeof(t));\r
14426                 t.String = name;\r
14427 \r
14428                 // 暗号化アルゴリズムの設定\r
14429                 if (CALL(hWnd, ScSetServerCipher(s->p->Rpc, &t)) == false)\r
14430                 {\r
14431                         Focus(hWnd, C_CIPHER);\r
14432                         return;\r
14433                 }\r
14434                 FreeRpcStr(&t);\r
14435         }\r
14436 \r
14437         if (s->SetCertAndKey)\r
14438         {\r
14439                 // 証明書のセット\r
14440                 RPC_KEY_PAIR t;\r
14441                 Zero(&t, sizeof(t));\r
14442 \r
14443                 t.Cert = CloneX(s->Cert);\r
14444                 t.Key = CloneK(s->Key);\r
14445 \r
14446                 if (CALL(hWnd, ScSetServerCert(s->p->Rpc, &t)) == false)\r
14447                 {\r
14448                         return;\r
14449                 }\r
14450                 FreeRpcKeyPair(&t);\r
14451 \r
14452                 MsgBox(hWnd, MB_ICONINFORMATION, _UU("CM_CERT_SET_MSG"));\r
14453         }\r
14454 \r
14455         Zero(&t, sizeof(t));\r
14456         t.UseKeepConnect = IsChecked(hWnd, R_USE_KEEP_CONNECT);\r
14457         GetTxtA(hWnd, E_HOSTNAME, t.KeepConnectHost, sizeof(t.KeepConnectHost));\r
14458         t.KeepConnectPort = GetInt(hWnd, E_PORT);\r
14459         t.KeepConnectInterval = GetInt(hWnd, E_INTERVAL);\r
14460         t.KeepConnectProtocol = IsChecked(hWnd, R_UDP) ? 1 : 0;\r
14461 \r
14462         CALL(hWnd, ScSetKeep(s->p->Rpc, &t));\r
14463 \r
14464         if (GetCapsBool(s->p->CapsList, "b_support_syslog"))\r
14465         {\r
14466                 if (s->p->ServerAdminMode)\r
14467                 {\r
14468                         SYSLOG_SETTING set;\r
14469 \r
14470                         Zero(&set, sizeof(set));\r
14471                         GetTxtA(hWnd, E_SYSLOG_HOSTNAME, set.Hostname, sizeof(set.Hostname));\r
14472                         set.Port = GetInt(hWnd, E_SYSLOG_PORT);\r
14473                         set.SaveType = CbGetSelect(hWnd, C_SYSLOG);\r
14474 \r
14475                         if (CALL(hWnd, ScSetSysLog(s->p->Rpc, &set)) == false)\r
14476                         {\r
14477                                 return;\r
14478                         }\r
14479                 }\r
14480         }\r
14481 \r
14482         EndDialog(hWnd, true);\r
14483 }\r
14484 \r
14485 // SSL 関係ダイアログ初期化\r
14486 void SmSslDlgInit(HWND hWnd, SM_SSL *s)\r
14487 {\r
14488         UINT i;\r
14489         TOKEN_LIST *cipher_list;\r
14490         RPC_KEEP t;\r
14491         // 引数チェック\r
14492         if (hWnd == NULL || s == NULL)\r
14493         {\r
14494                 return;\r
14495         }\r
14496 \r
14497         // 暗号化アルゴリズム一覧を設定する\r
14498         cipher_list = GetCipherList();\r
14499         CbSetHeight(hWnd, C_CIPHER, 18);\r
14500         for (i = 0;i < cipher_list->NumTokens;i++)\r
14501         {\r
14502                 wchar_t tmp[MAX_SIZE];\r
14503                 char *name = cipher_list->Token[i];\r
14504                 StrToUni(tmp, sizeof(tmp), name);\r
14505                 CbAddStr(hWnd, C_CIPHER, tmp, 0);\r
14506         }\r
14507 \r
14508         if (s->p != NULL)\r
14509         {\r
14510                 // サーバーから暗号化アルゴリズム名を取得する\r
14511                 RPC_STR t;\r
14512                 Zero(&t, sizeof(t));\r
14513                 if (CALL(hWnd, ScGetServerCipher(s->p->Rpc, &t)))\r
14514                 {\r
14515                         wchar_t tmp[MAX_SIZE];\r
14516                         StrToUni(tmp, sizeof(tmp), t.String);\r
14517                         SetText(hWnd, C_CIPHER, tmp);\r
14518                         FreeRpcStr(&t);\r
14519                 }\r
14520                 else\r
14521                 {\r
14522                         EndDialog(hWnd, 0);\r
14523                         return;\r
14524                 }\r
14525         }\r
14526 \r
14527         if (s->p != NULL)\r
14528         {\r
14529                 wchar_t tmp[MAX_SIZE];\r
14530                 // サーバーから SSL 証明書と秘密鍵を取得する\r
14531                 RPC_KEY_PAIR t;\r
14532                 s->SetCertAndKey = false;\r
14533                 Zero(&t, sizeof(t));\r
14534                 if (CALL(hWnd, ScGetServerCert(s->p->Rpc, &t)))\r
14535                 {\r
14536                         // 証明書と鍵のコピー\r
14537                         s->Cert = CloneX(t.Cert);\r
14538                         s->Key = CloneK(t.Key);\r
14539                         FreeRpcKeyPair(&t);\r
14540                 }\r
14541                 else\r
14542                 {\r
14543                         EndDialog(hWnd, 0);\r
14544                         return;\r
14545                 }\r
14546 \r
14547                 // 証明書情報の表示\r
14548                 SmGetCertInfoStr(tmp, sizeof(tmp), s->Cert);\r
14549                 SetText(hWnd, S_CERT_INFO, tmp);\r
14550         }\r
14551 \r
14552         // パスワード変更\r
14553         SetEnable(hWnd, B_PASSWORD, s->p->ServerAdminMode);\r
14554 \r
14555         // ボタンの有効化 / 無効化\r
14556         SetEnable(hWnd, B_IMPORT, s->p->ServerAdminMode);\r
14557         SetEnable(hWnd, B_EXPORT, s->p->ServerAdminMode);\r
14558         SetEnable(hWnd, R_USE_KEEP_CONNECT, s->p->ServerAdminMode);\r
14559 \r
14560         if (s->p->ServerAdminMode == false)\r
14561         {\r
14562                 Disable(hWnd, C_CIPHER);\r
14563         }\r
14564 \r
14565         if (CALL(hWnd, ScGetKeep(s->p->Rpc, &t)))\r
14566         {\r
14567                 Check(hWnd, R_USE_KEEP_CONNECT, t.UseKeepConnect);\r
14568                 SetTextA(hWnd, E_HOSTNAME, t.KeepConnectHost);\r
14569                 SetIntEx(hWnd, E_PORT, t.KeepConnectPort);\r
14570                 SetInt(hWnd, E_INTERVAL, t.KeepConnectInterval);\r
14571                 Check(hWnd, R_TCP, t.KeepConnectProtocol == 0);\r
14572                 Check(hWnd, R_UDP, t.KeepConnectProtocol != 0);\r
14573         }\r
14574 \r
14575         CbSetHeight(hWnd, C_SYSLOG, 18);\r
14576         CbReset(hWnd, C_SYSLOG);\r
14577         CbAddStr(hWnd, C_SYSLOG, _UU("SM_SYSLOG_0"), SYSLOG_NONE);\r
14578         CbAddStr(hWnd, C_SYSLOG, _UU("SM_SYSLOG_1"), SYSLOG_SERVER_LOG);\r
14579         CbAddStr(hWnd, C_SYSLOG, _UU("SM_SYSLOG_2"), SYSLOG_SERVER_AND_HUB_SECURITY_LOG);\r
14580         CbAddStr(hWnd, C_SYSLOG, _UU("SM_SYSLOG_3"), SYSLOG_SERVER_AND_HUB_ALL_LOG);\r
14581 \r
14582         if (GetCapsBool(s->p->CapsList, "b_support_syslog"))\r
14583         {\r
14584                 SYSLOG_SETTING set;\r
14585 \r
14586                 SetEnable(hWnd, C_SYSLOG, s->p->ServerAdminMode);\r
14587                 SetEnable(hWnd, E_SYSLOG_HOSTNAME, s->p->ServerAdminMode);\r
14588                 SetEnable(hWnd, E_SYSLOG_PORT, s->p->ServerAdminMode);\r
14589                 SetEnable(hWnd, S_01, s->p->ServerAdminMode);\r
14590                 SetEnable(hWnd, S_02, s->p->ServerAdminMode);\r
14591 \r
14592                 Zero(&set, sizeof(set));\r
14593 \r
14594                 if (CALL(hWnd, ScGetSysLog(s->p->Rpc, &set)))\r
14595                 {\r
14596                         SetTextA(hWnd, E_SYSLOG_HOSTNAME, set.Hostname);\r
14597                         SetInt(hWnd, E_SYSLOG_PORT, set.Port == 0 ? SYSLOG_PORT : set.Port);\r
14598                         CbSelect(hWnd, C_SYSLOG, set.SaveType);\r
14599                 }\r
14600         }\r
14601         else\r
14602         {\r
14603                 Disable(hWnd, C_SYSLOG);\r
14604                 Disable(hWnd, E_SYSLOG_HOSTNAME);\r
14605                 Disable(hWnd, E_SYSLOG_PORT);\r
14606                 Disable(hWnd, S_01);\r
14607                 Disable(hWnd, S_02);\r
14608         }\r
14609 \r
14610         SmSslDlgUpdate(hWnd, s);\r
14611 }\r
14612 \r
14613 // SSL 関係ダイアログコントロール更新\r
14614 void SmSslDlgUpdate(HWND hWnd, SM_SSL *s)\r
14615 {\r
14616         bool ok = true;\r
14617         bool b;\r
14618         // 引数チェック\r
14619         if (hWnd == NULL || s == NULL)\r
14620         {\r
14621                 return;\r
14622         }\r
14623 \r
14624         if (IsChecked(hWnd, R_USE_KEEP_CONNECT))\r
14625         {\r
14626                 UINT i;\r
14627                 b = true;\r
14628                 if (IsEmpty(hWnd, E_HOSTNAME))\r
14629                 {\r
14630                         ok = false;\r
14631                 }\r
14632                 i = GetInt(hWnd, E_PORT);\r
14633                 if (i == 0 || i >= 65536)\r
14634                 {\r
14635                         ok = false;\r
14636                 }\r
14637                 i = GetInt(hWnd, E_INTERVAL);\r
14638                 if (i < 5 || i > 600)\r
14639                 {\r
14640                         ok = false;\r
14641                 }\r
14642         }\r
14643         else\r
14644         {\r
14645                 b = false;\r
14646         }\r
14647 \r
14648         if (IsEnable(hWnd, C_SYSLOG))\r
14649         {\r
14650                 UINT i = CbGetSelect(hWnd, C_SYSLOG);\r
14651 \r
14652                 SetEnable(hWnd, E_SYSLOG_HOSTNAME, i != SYSLOG_NONE);\r
14653                 SetEnable(hWnd, E_SYSLOG_PORT, i != SYSLOG_NONE);\r
14654                 SetEnable(hWnd, S_01, i != SYSLOG_NONE);\r
14655                 SetEnable(hWnd, S_02, i != SYSLOG_NONE);\r
14656         }\r
14657 \r
14658         SetEnable(hWnd, S_HOSTNAME, b);\r
14659         SetEnable(hWnd, E_HOSTNAME, b);\r
14660         SetEnable(hWnd, S_PORT, b);\r
14661         SetEnable(hWnd, E_PORT, b);\r
14662         SetEnable(hWnd, S_INTERVAL, b);\r
14663         SetEnable(hWnd, E_INTERVAL, b);\r
14664         SetEnable(hWnd, S_INTERVAL2, b);\r
14665         SetEnable(hWnd, S_PROTOCOL, b);\r
14666         SetEnable(hWnd, R_TCP, b);\r
14667         SetEnable(hWnd, R_UDP, b);\r
14668         SetEnable(hWnd, S_INFO, b);\r
14669 \r
14670         SetEnable(hWnd, IDOK, ok);\r
14671 }\r
14672 \r
14673 // 証明書情報文字列の取得\r
14674 void SmGetCertInfoStr(wchar_t *str, UINT size, X *x)\r
14675 {\r
14676         wchar_t subject[MAX_SIZE];\r
14677         wchar_t issuer[MAX_SIZE];\r
14678         wchar_t date[MAX_SIZE];\r
14679         // 引数チェック\r
14680         if (x == NULL || str == NULL)\r
14681         {\r
14682                 if (str != NULL)\r
14683                 {\r
14684                         str[0] = 0;\r
14685                 }\r
14686                 return;\r
14687         }\r
14688 \r
14689         GetPrintNameFromName(subject, sizeof(subject), x->subject_name);\r
14690         GetPrintNameFromName(issuer, sizeof(issuer), x->issuer_name);\r
14691         GetDateStrEx64(date, sizeof(date), x->notAfter, NULL);\r
14692 \r
14693         UniFormat(str, size, _UU("CM_CERT_INFO"), subject, issuer, date);\r
14694 }\r
14695 \r
14696 // SSL 関係ダイアログプロシージャ\r
14697 UINT SmSslDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
14698 {\r
14699         SM_SSL *s = (SM_SSL *)param;\r
14700         X *x;\r
14701         K *k;\r
14702         // 引数チェック\r
14703         if (hWnd == NULL)\r
14704         {\r
14705                 return 0;\r
14706         }\r
14707 \r
14708         switch (msg)\r
14709         {\r
14710         case WM_INITDIALOG:\r
14711                 // 初期化\r
14712                 SmSslDlgInit(hWnd, s);\r
14713                 break;\r
14714 \r
14715         case WM_COMMAND:\r
14716                 switch (LOWORD(wParam))\r
14717                 {\r
14718                 case R_USE_KEEP_CONNECT:\r
14719                 case E_HOSTNAME:\r
14720                 case E_PORT:\r
14721                 case E_INTERVAL:\r
14722                 case R_TCP:\r
14723                 case R_UDP:\r
14724                 case C_SYSLOG:\r
14725                 case E_SYSLOG_HOSTNAME:\r
14726                 case E_SYSLOG_PORT:\r
14727                         SmSslDlgUpdate(hWnd, s);\r
14728                         break;\r
14729                 }\r
14730 \r
14731                 switch (wParam)\r
14732                 {\r
14733                 case IDOK:\r
14734                         // OK ボタン\r
14735                         SmSslDlgOnOk(hWnd, s);\r
14736                         break;\r
14737 \r
14738                 case IDCANCEL:\r
14739                         // キャンセルボタン\r
14740                         Close(hWnd);\r
14741                         break;\r
14742 \r
14743                 case B_IMPORT:\r
14744                         // インポート\r
14745                         if (CmLoadXAndK(hWnd, &x, &k))\r
14746                         {\r
14747                                 wchar_t tmp[MAX_SIZE];\r
14748                                 FreeX(s->Cert);\r
14749                                 FreeK(s->Key);\r
14750                                 s->Cert = x;\r
14751                                 s->Key = k;\r
14752                                 s->SetCertAndKey = true;\r
14753                                 // 証明書情報の表示\r
14754                                 SmGetCertInfoStr(tmp, sizeof(tmp), s->Cert);\r
14755                                 SetText(hWnd, S_CERT_INFO, tmp);\r
14756                         }\r
14757                         break;\r
14758 \r
14759                 case B_EXPORT:\r
14760                         // エクスポート\r
14761                         SmSaveKeyPairDlg(hWnd, s->Cert, s->Key);\r
14762                         break;\r
14763 \r
14764                 case B_VIEW:\r
14765                         // 証明書の表示\r
14766                         CertDlg(hWnd, s->Cert, NULL, true);\r
14767                         break;\r
14768 \r
14769                 case B_PASSWORD:\r
14770                         // パスワード変更\r
14771                         Dialog(hWnd, D_SM_CHANGE_PASSWORD, SmChangeServerPasswordDlg, s->p);\r
14772                         break;\r
14773 \r
14774                 case R_USE_KEEP_CONNECT:\r
14775                         if (IsChecked(hWnd, R_USE_KEEP_CONNECT))\r
14776                         {\r
14777                                 FocusEx(hWnd, E_HOSTNAME);\r
14778                         }\r
14779                         break;\r
14780                 }\r
14781                 break;\r
14782 \r
14783         case WM_CLOSE:\r
14784                 EndDialog(hWnd, false);\r
14785                 break;\r
14786         }\r
14787 \r
14788         return 0;\r
14789 }\r
14790 \r
14791 // SSL 関係ダイアログの表示\r
14792 void SmSslDlg(HWND hWnd, SM_SERVER *p)\r
14793 {\r
14794         SM_SSL s;\r
14795         // 引数チェック\r
14796         if (hWnd == NULL || p == NULL)\r
14797         {\r
14798                 return;\r
14799         }\r
14800 \r
14801         Zero(&s, sizeof(s));\r
14802         s.p = p;\r
14803 \r
14804         Dialog(hWnd, D_SM_SSL, SmSslDlgProc, &s);\r
14805 \r
14806         // クリーンアップ\r
14807         FreeX(s.Cert);\r
14808         FreeK(s.Key);\r
14809 }\r
14810 \r
14811 // リスナー作成ダイアログプロシージャ\r
14812 UINT SmCreateListenerDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
14813 {\r
14814         UINT port;\r
14815         RPC_LISTENER t;\r
14816         SM_SERVER *p = (SM_SERVER *)param;\r
14817         // 引数チェック\r
14818         if (hWnd == NULL)\r
14819         {\r
14820                 return 0;\r
14821         }\r
14822 \r
14823         switch (msg)\r
14824         {\r
14825         case WM_INITDIALOG:\r
14826                 Focus(hWnd, E_PORT);\r
14827                 Disable(hWnd, IDOK);\r
14828                 break;\r
14829 \r
14830         case WM_COMMAND:\r
14831                 switch (LOWORD(wParam))\r
14832                 {\r
14833                 case E_PORT:\r
14834                         port = GetInt(hWnd, E_PORT);\r
14835                         if (port == 0 || port >= 65536)\r
14836                         {\r
14837                                 Disable(hWnd, IDOK);\r
14838                         }\r
14839                         else\r
14840                         {\r
14841                                 Enable(hWnd, IDOK);\r
14842                         }\r
14843                         break;\r
14844                 }\r
14845 \r
14846                 switch (wParam)\r
14847                 {\r
14848                 case IDOK:\r
14849                         port = GetInt(hWnd, E_PORT);\r
14850                         Zero(&t, sizeof(t));\r
14851                         t.Enable = true;\r
14852                         t.Port = port;\r
14853                         if (CALL(hWnd, ScCreateListener(p->Rpc, &t)))\r
14854                         {\r
14855                                 EndDialog(hWnd, true);\r
14856                         }\r
14857                         break;\r
14858                 case IDCANCEL:\r
14859                         Close(hWnd);\r
14860                 }\r
14861                 break;\r
14862 \r
14863         case WM_CLOSE:\r
14864                 EndDialog(hWnd, false);\r
14865                 break;\r
14866         }\r
14867 \r
14868         return 0;\r
14869 }\r
14870 \r
14871 // リスナー作成ダイアログ\r
14872 bool SmCreateListenerDlg(HWND hWnd, SM_SERVER *p)\r
14873 {\r
14874         // 引数チェック\r
14875         if (hWnd == NULL || p == NULL)\r
14876         {\r
14877                 return false;\r
14878         }\r
14879 \r
14880         return Dialog(hWnd, D_SM_CREATE_LISTENER, SmCreateListenerDlgProc, p);\r
14881 }\r
14882 \r
14883 // HUB 編集 OK ボタン\r
14884 void SmEditHubOnOk(HWND hWnd, SM_EDIT_HUB *s)\r
14885 {\r
14886         RPC_CREATE_HUB t;\r
14887         char pass1[MAX_SIZE];\r
14888         char pass2[MAX_SIZE];\r
14889         char hubname[MAX_HUBNAME_LEN + 1];\r
14890         // 引数チェック\r
14891         if (hWnd == NULL || s == NULL)\r
14892         {\r
14893                 return;\r
14894         }\r
14895 \r
14896         Zero(&t, sizeof(t));\r
14897         if (s->EditMode)\r
14898         {\r
14899                 StrCpy(hubname, sizeof(hubname), s->HubName);\r
14900                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
14901         }\r
14902         else\r
14903         {\r
14904                 GetTxtA(hWnd, E_HUBNAME, t.HubName, sizeof(t.HubName));\r
14905                 StrCpy(hubname, sizeof(hubname), t.HubName);\r
14906         }\r
14907 \r
14908         GetTxtA(hWnd, E_PASSWORD1, pass1, sizeof(pass1));\r
14909         GetTxtA(hWnd, E_PASSWORD2, pass2, sizeof(pass2));\r
14910 \r
14911         if (s->EditMode == false || StrCmp(pass1, HIDDEN_PASSWORD) != 0)\r
14912         {\r
14913                 Hash(t.HashedPassword, pass1, StrLen(pass1), true);\r
14914                 HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass1);\r
14915         }\r
14916 \r
14917         if (IsChecked(hWnd, R_LIMIT_MAX_SESSION))\r
14918         {\r
14919                 t.HubOption.MaxSession = GetInt(hWnd, E_MAX_SESSION);\r
14920         }\r
14921 \r
14922         t.Online = IsChecked(hWnd, R_ONLINE);\r
14923 \r
14924         if (s->p->ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
14925         {\r
14926                 t.HubType = HUB_TYPE_FARM_STATIC;\r
14927                 if (IsChecked(hWnd, R_DYNAMIC))\r
14928                 {\r
14929                         t.HubType = HUB_TYPE_FARM_DYNAMIC;\r
14930                 }\r
14931         }\r
14932 \r
14933         t.HubOption.NoEnum = IsChecked(hWnd, R_NO_ENUM);\r
14934 \r
14935         if (s->EditMode == false)\r
14936         {\r
14937                 if (CALL(hWnd, ScCreateHub(s->p->Rpc, &t)))\r
14938                 {\r
14939                         MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_EDIT_HUB_CREATER"), hubname);\r
14940                         EndDialog(hWnd, true);\r
14941                 }\r
14942         }\r
14943         else\r
14944         {\r
14945                 if (CALL(hWnd, ScSetHub(s->p->Rpc, &t)))\r
14946                 {\r
14947                         EndDialog(hWnd, true);\r
14948                 }\r
14949         }\r
14950 }\r
14951 \r
14952 // HUB 編集更新\r
14953 void SmEditHubUpdate(HWND hWnd, SM_EDIT_HUB *s)\r
14954 {\r
14955         bool ok = true;\r
14956         char *s1, *s2;\r
14957         char hubname[MAX_HUBNAME_LEN + 1];\r
14958         // 引数チェック\r
14959         if (hWnd == NULL || s == NULL)\r
14960         {\r
14961                 return;\r
14962         }\r
14963 \r
14964         s1 = GetTextA(hWnd, E_PASSWORD1);\r
14965         s2 = GetTextA(hWnd, E_PASSWORD2);\r
14966         if (StrCmp(s1, s2) != 0)\r
14967         {\r
14968                 ok = false;\r
14969         }\r
14970         Free(s1);\r
14971         Free(s2);\r
14972 \r
14973         GetTxtA(hWnd, E_HUBNAME, hubname, sizeof(hubname));\r
14974         Trim(hubname);\r
14975         if (StrLen(hubname) == 0 ||\r
14976                 IsSafeStr(hubname) == false)\r
14977         {\r
14978                 ok = false;\r
14979         }\r
14980 \r
14981         if (IsChecked(hWnd, R_LIMIT_MAX_SESSION))\r
14982         {\r
14983                 Enable(hWnd, E_MAX_SESSION);\r
14984                 Enable(hWnd, S_MAX_SESSION_1);\r
14985                 Enable(hWnd, S_MAX_SESSION_2);\r
14986                 if (GetInt(hWnd, E_MAX_SESSION) == 0)\r
14987                 {\r
14988                         ok = false;\r
14989                 }\r
14990         }\r
14991         else\r
14992         {\r
14993                 Disable(hWnd, E_MAX_SESSION);\r
14994                 Disable(hWnd, S_MAX_SESSION_1);\r
14995                 Disable(hWnd, S_MAX_SESSION_2);\r
14996         }\r
14997 \r
14998         SetEnable(hWnd, IDOK, ok);\r
14999 }\r
15000 \r
15001 // HUB 編集初期化\r
15002 void SmEditHubInit(HWND hWnd, SM_EDIT_HUB *s)\r
15003 {\r
15004         RPC_CREATE_HUB t;\r
15005         bool b = false;\r
15006         bool support_extoption = false;\r
15007         // 引数チェック\r
15008         if (hWnd == NULL || s == NULL)\r
15009         {\r
15010                 return;\r
15011         }\r
15012 \r
15013         SetIcon(hWnd, 0, ICO_HUB);\r
15014 \r
15015         Zero(&t, sizeof(t));\r
15016 \r
15017         if (s->EditMode == false)\r
15018         {\r
15019                 // 新規作成\r
15020                 SetText(hWnd, 0, _UU("CM_EDIT_HUB_1"));\r
15021                 FocusEx(hWnd, E_HUBNAME);\r
15022 \r
15023                 if (s->p->ServerType == SERVER_TYPE_STANDALONE)\r
15024                 {\r
15025                         // スタンドアロン モード\r
15026                         Disable(hWnd, R_STATIC);\r
15027                         Disable(hWnd, R_DYNAMIC);\r
15028                         SetText(hWnd, S_FARM_INFO, _UU("CM_EDIT_HUB_STANDALONE"));\r
15029                 }\r
15030                 else\r
15031                 {\r
15032                         Check(hWnd, R_STATIC, true);\r
15033                 }\r
15034 \r
15035                 Check(hWnd, R_ONLINE, true);\r
15036 \r
15037                 Hide(hWnd, B_ACL);\r
15038                 Hide(hWnd, S_ACL);\r
15039                 Hide(hWnd, S_ACL_2);\r
15040                 Hide(hWnd, S_ACL_3);\r
15041                 Hide(hWnd, S_MSG_1);\r
15042                 Hide(hWnd, S_MSG_4);\r
15043                 Hide(hWnd, S_MSG_2);\r
15044                 Hide(hWnd, B_MSG);\r
15045         }\r
15046         else\r
15047         {\r
15048                 // 編集\r
15049                 wchar_t tmp[MAX_SIZE];\r
15050                 UniFormat(tmp, sizeof(tmp), _UU("CM_EDIT_HUB_2"), s->HubName);\r
15051                 SetText(hWnd, 0, tmp);\r
15052                 SetTextA(hWnd, E_HUBNAME, s->HubName);\r
15053                 Disable(hWnd, E_HUBNAME);\r
15054 \r
15055                 if (s->p->ServerType == SERVER_TYPE_STANDALONE)\r
15056                 {\r
15057                         // スタンドアロン モード\r
15058                         Disable(hWnd, R_STATIC);\r
15059                         Disable(hWnd, R_DYNAMIC);\r
15060                         SetText(hWnd, S_FARM_INFO, _UU("CM_EDIT_HUB_STANDALONE"));\r
15061                 }\r
15062 \r
15063                 if (s->p->ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
15064                 {\r
15065                         // コントローラ\r
15066                         if (GetCapsBool(s->p->CapsList, "b_cluster_hub_type_fixed"))\r
15067                         {\r
15068                                 Disable(hWnd, R_STATIC);\r
15069                                 Disable(hWnd, R_DYNAMIC);\r
15070                                 SetText(hWnd, S_FARM_INFO, _UU("CM_EDIT_HUB_TYPE_FIXED"));\r
15071                         }\r
15072                 }\r
15073 \r
15074                 // HUB 情報の取得\r
15075                 StrCpy(t.HubName, sizeof(t.HubName), s->HubName);\r
15076                 if (CALL(hWnd, ScGetHub(s->p->Rpc, &t)) == false)\r
15077                 {\r
15078                         EndDialog(hWnd, false);\r
15079                         return;\r
15080                 }\r
15081 \r
15082                 SetTextA(hWnd, E_PASSWORD1, HIDDEN_PASSWORD);\r
15083                 SetTextA(hWnd, E_PASSWORD2, HIDDEN_PASSWORD);\r
15084 \r
15085                 if (t.HubOption.MaxSession == 0)\r
15086                 {\r
15087                         Check(hWnd, R_LIMIT_MAX_SESSION, false);\r
15088                 }\r
15089                 else\r
15090                 {\r
15091                         Check(hWnd, R_LIMIT_MAX_SESSION, true);\r
15092                 }\r
15093 \r
15094                 Check(hWnd, R_NO_ENUM, t.HubOption.NoEnum);\r
15095 \r
15096                 SetIntEx(hWnd, E_MAX_SESSION, t.HubOption.MaxSession);\r
15097 \r
15098                 Check(hWnd, R_ONLINE, t.Online);\r
15099                 Check(hWnd, R_OFFLINE, t.Online ? false : true);\r
15100 \r
15101                 Check(hWnd, R_STATIC, t.HubType == HUB_TYPE_FARM_STATIC);\r
15102                 Check(hWnd, R_DYNAMIC, t.HubType == HUB_TYPE_FARM_DYNAMIC);\r
15103 \r
15104                 SetShow(hWnd, B_ACL, GetCapsBool(s->p->CapsList, "b_support_ac"));\r
15105                 SetShow(hWnd, S_ACL, GetCapsBool(s->p->CapsList, "b_support_ac"));\r
15106                 SetShow(hWnd, S_ACL_2, GetCapsBool(s->p->CapsList, "b_support_ac"));\r
15107                 SetShow(hWnd, S_ACL_3, GetCapsBool(s->p->CapsList, "b_support_ac"));\r
15108 \r
15109                 SetShow(hWnd, S_MSG_1, GetCapsBool(s->p->CapsList, "b_support_msg"));\r
15110                 SetShow(hWnd, S_MSG_4, GetCapsBool(s->p->CapsList, "b_support_msg"));\r
15111                 SetShow(hWnd, S_MSG_2, GetCapsBool(s->p->CapsList, "b_support_msg"));\r
15112                 SetShow(hWnd, B_MSG, GetCapsBool(s->p->CapsList, "b_support_msg"));\r
15113         }\r
15114 \r
15115         // 拡張オプション\r
15116         if (s->EditMode)\r
15117         {\r
15118                 support_extoption = GetCapsBool(s->p->CapsList, "b_support_hub_ext_options");\r
15119         }\r
15120 \r
15121         SetEnable(hWnd, S_STATIC, support_extoption);\r
15122         SetEnable(hWnd, B_EXTOPTION, support_extoption);\r
15123 \r
15124         SetEnable(hWnd, R_NO_ENUM, GetCapsBool(s->p->CapsList, "b_support_hide_hub"));\r
15125 \r
15126         SmEditHubUpdate(hWnd, s);\r
15127 \r
15128         if (s->EditMode)\r
15129         {\r
15130                 Focus(hWnd, IDOK);\r
15131         }\r
15132 \r
15133         if (s->EditMode)\r
15134         {\r
15135                 if (GetCapsBool(s->p->CapsList, "b_support_hub_admin_option"))\r
15136                 {\r
15137                         b = true;\r
15138                 }\r
15139         }\r
15140 \r
15141         SetShow(hWnd, S_AO_1, b);\r
15142         SetShow(hWnd, S_AO_2, b);\r
15143         SetShow(hWnd, S_AO_3, b);\r
15144         SetShow(hWnd, B_ADMINOPTION, b);\r
15145 }\r
15146 \r
15147 // HUB 編集プロシージャ\r
15148 UINT SmEditHubProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
15149 {\r
15150         SM_EDIT_HUB *s = (SM_EDIT_HUB *)param;\r
15151         // 引数チェック\r
15152         if (hWnd == NULL)\r
15153         {\r
15154                 return 0;\r
15155         }\r
15156 \r
15157         switch (msg)\r
15158         {\r
15159         case WM_INITDIALOG:\r
15160                 SmEditHubInit(hWnd, s);\r
15161                 break;\r
15162 \r
15163         case WM_COMMAND:\r
15164                 switch (LOWORD(wParam))\r
15165                 {\r
15166                 case E_PASSWORD1:\r
15167                 case E_PASSWORD2:\r
15168                 case E_HUBNAME:\r
15169                 case R_LIMIT_MAX_SESSION:\r
15170                 case E_MAX_SESSION:\r
15171                         SmEditHubUpdate(hWnd, s);\r
15172                         break;\r
15173                 }\r
15174 \r
15175                 switch (wParam)\r
15176                 {\r
15177                 case IDOK:\r
15178                         SmEditHubOnOk(hWnd, s);\r
15179                         break;\r
15180 \r
15181                 case IDCANCEL:\r
15182                         Close(hWnd);\r
15183                         break;\r
15184 \r
15185                 case R_LIMIT_MAX_SESSION:\r
15186                         if (IsChecked(hWnd, R_LIMIT_MAX_SESSION))\r
15187                         {\r
15188                                 FocusEx(hWnd, E_MAX_SESSION);\r
15189                         }\r
15190                         break;\r
15191 \r
15192                 case B_ADMINOPTION:\r
15193                         SmHubAdminOption(hWnd, s);\r
15194                         break;\r
15195 \r
15196                 case B_EXTOPTION:\r
15197                         SmHubExtOption(hWnd, s);\r
15198                         break;\r
15199 \r
15200                 case B_ACL:\r
15201                         SmHubAc(hWnd, s);\r
15202                         break;\r
15203 \r
15204                 case B_MSG:\r
15205                         SmHubMsg(hWnd, s);\r
15206                         break;\r
15207                 }\r
15208                 break;\r
15209 \r
15210         case WM_CLOSE:\r
15211                 EndDialog(hWnd, false);\r
15212                 break;\r
15213         }\r
15214 \r
15215         return 0;\r
15216 }\r
15217 \r
15218 // HUB 編集ダイアログ\r
15219 bool SmEditHubDlg(HWND hWnd, SM_SERVER *p, char *hubname)\r
15220 {\r
15221         SM_EDIT_HUB s;\r
15222         // 引数チェック\r
15223         if (hWnd == NULL || p == NULL)\r
15224         {\r
15225                 return false;\r
15226         }\r
15227 \r
15228         Zero(&s, sizeof(s));\r
15229         s.p = p;\r
15230         s.EditMode = true;\r
15231         StrCpy(s.HubName, sizeof(s.HubName), hubname);\r
15232 \r
15233         if (p->Bridge == false)\r
15234         {\r
15235                 return Dialog(hWnd, D_SM_EDIT_HUB, SmEditHubProc, &s);\r
15236         }\r
15237         else\r
15238         {\r
15239                 SmHubExtOption(hWnd, &s);\r
15240                 return false;\r
15241         }\r
15242 }\r
15243 \r
15244 // HUB 作成ダイアログ\r
15245 bool SmCreateHubDlg(HWND hWnd, SM_SERVER *p)\r
15246 {\r
15247         SM_EDIT_HUB s;\r
15248         // 引数チェック\r
15249         if (hWnd == NULL || p == NULL)\r
15250         {\r
15251                 return false;\r
15252         }\r
15253 \r
15254         Zero(&s, sizeof(s));\r
15255         s.p = p;\r
15256         s.EditMode = false;\r
15257 \r
15258         return Dialog(hWnd, D_SM_EDIT_HUB, SmEditHubProc, &s);\r
15259 }\r
15260 \r
15261 // 仮想 HUB 状態の表示\r
15262 bool SmRefreshHubStatus(HWND hWnd, SM_SERVER *p, void *param)\r
15263 {\r
15264         RPC_HUB_STATUS t;\r
15265         // 引数チェック\r
15266         if (hWnd == NULL || p == NULL || param == NULL)\r
15267         {\r
15268                 return false;\r
15269         }\r
15270 \r
15271         Zero(&t, sizeof(RPC_HUB_STATUS));\r
15272         StrCpy(t.HubName, sizeof(t.HubName), (char *)param);\r
15273         if (CALL(hWnd, ScGetHubStatus(p->Rpc, &t)))\r
15274         {\r
15275                 wchar_t *s;\r
15276                 wchar_t tmp[MAX_SIZE];\r
15277                 LVB *b = LvInsertStart();\r
15278 \r
15279                 // HUB 名\r
15280                 s = CopyStrToUni((char *)param);\r
15281                 LvInsertAdd(b, ICO_HUB, 0, 2, _UU("SM_HUB_STATUS_HUBNAME"), s);\r
15282                 Free(s);\r
15283 \r
15284                 // オンライン\r
15285                 LvInsertAdd(b, t.Online ? ICO_PROTOCOL : ICO_PROTOCOL_X, 0, 2, _UU("SM_HUB_STATUS_ONLINE"),\r
15286                         t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));\r
15287 \r
15288                 // HUB の種類\r
15289                 LvInsertAdd(b, t.HubType == HUB_TYPE_STANDALONE ? ICO_TOWER : ICO_FARM, 0, 2, _UU("SM_HUB_TYPE"),\r
15290                         GetHubTypeStr(t.HubType));\r
15291 \r
15292                 if (t.HubType == HUB_TYPE_STANDALONE)\r
15293                 {\r
15294                         // SecureNAT の有効/無効\r
15295                         LvInsertAdd(b, ICO_ROUTER, NULL, 2, _UU("SM_HUB_SECURE_NAT"),\r
15296                                 t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));\r
15297                 }\r
15298 \r
15299                 // その他の値\r
15300                 UniToStru(tmp, t.NumSessions);\r
15301                 LvInsertAdd(b, ICO_PROTOCOL, 0, 2, _UU("SM_HUB_NUM_SESSIONS"), tmp);\r
15302                 if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)\r
15303                 {\r
15304                         UniToStru(tmp, t.NumSessionsClient);\r
15305                         LvInsertAdd(b, ICO_PROTOCOL, 0, 2, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);\r
15306                         UniToStru(tmp, t.NumSessionsBridge);\r
15307                         LvInsertAdd(b, ICO_PROTOCOL, 0, 2, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);\r
15308                 }\r
15309 \r
15310                 UniToStru(tmp, t.NumAccessLists);\r
15311                 LvInsertAdd(b, ICO_DISCARD, 0, 2, _UU("SM_HUB_NUM_ACCESSES"), tmp);\r
15312 \r
15313                 if (p->ServerType != SERVER_TYPE_FARM_MEMBER)\r
15314                 {\r
15315                         UniToStru(tmp, t.NumUsers);\r
15316                         LvInsertAdd(b, ICO_USER, 0, 2, _UU("SM_HUB_NUM_USERS"), tmp);\r
15317                         UniToStru(tmp, t.NumGroups);\r
15318                         LvInsertAdd(b, ICO_GROUP, 0, 2, _UU("SM_HUB_NUM_GROUPS"), tmp);\r
15319                 }\r
15320 \r
15321                 UniToStru(tmp, t.NumMacTables);\r
15322                 LvInsertAdd(b, ICO_MACHINE, 0, 2, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);\r
15323                 UniToStru(tmp, t.NumIpTables);\r
15324                 LvInsertAdd(b, ICO_MACHINE, 0, 2, _UU("SM_HUB_NUM_IP_TABLES"), tmp);\r
15325 \r
15326                 // 利用状況\r
15327                 UniToStru(tmp, t.NumLogin);\r
15328                 LvInsertAdd(b, ICO_KEY, NULL, 2, _UU("SM_HUB_NUM_LOGIN"), tmp);\r
15329 \r
15330                 if (t.LastLoginTime != 0)\r
15331                 {\r
15332                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));\r
15333                 }\r
15334                 else\r
15335                 {\r
15336                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
15337                 }\r
15338                 LvInsertAdd(b, ICO_DATETIME, NULL, 2, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);\r
15339 \r
15340                 if (t.LastCommTime != 0)\r
15341                 {\r
15342                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));\r
15343                 }\r
15344                 else\r
15345                 {\r
15346                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
15347                 }\r
15348                 LvInsertAdd(b, ICO_DATETIME, NULL, 2, _UU("SM_HUB_LAST_COMM_TIME"), tmp);\r
15349 \r
15350                 if (t.CreatedTime != 0)\r
15351                 {\r
15352                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));\r
15353                 }\r
15354                 else\r
15355                 {\r
15356                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
15357                 }\r
15358                 LvInsertAdd(b, ICO_DATETIME, NULL, 2, _UU("SM_HUB_CREATED_TIME"), tmp);\r
15359 \r
15360                 // トラフィック情報\r
15361                 SmInsertTrafficInfo(b, &t.Traffic);\r
15362 \r
15363                 LvInsertEnd(b, hWnd, L_STATUS);\r
15364         }\r
15365         else\r
15366         {\r
15367                 return false;\r
15368         }\r
15369 \r
15370         return true;\r
15371 }\r
15372 \r
15373 // トラフィック情報を LVB に追加\r
15374 void SmInsertTrafficInfo(LVB *b, TRAFFIC *t)\r
15375 {\r
15376         wchar_t tmp[MAX_SIZE];\r
15377         char vv[128];\r
15378         // 引数チェック\r
15379         if (b == NULL || t == NULL)\r
15380         {\r
15381                 return;\r
15382         }\r
15383 \r
15384         // 送信情報\r
15385         ToStr3(vv, sizeof(vv), t->Send.UnicastCount);\r
15386         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
15387         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_SEND_UCAST_NUM"), tmp);\r
15388 \r
15389         ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);\r
15390         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
15391         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);\r
15392 \r
15393         ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);\r
15394         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
15395         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_SEND_BCAST_NUM"), tmp);\r
15396 \r
15397         ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);\r
15398         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
15399         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);\r
15400 \r
15401         // 受信情報\r
15402         ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);\r
15403         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
15404         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_RECV_UCAST_NUM"), tmp);\r
15405 \r
15406         ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);\r
15407         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
15408         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);\r
15409 \r
15410         ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);\r
15411         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
15412         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_RECV_BCAST_NUM"), tmp);\r
15413 \r
15414         ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);\r
15415         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
15416         LvInsertAdd(b, ICO_INFORMATION, 0, 2, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);\r
15417 }\r
15418 \r
15419 // ステータス表示ダイアログプロシージャ\r
15420 UINT SmStatusDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
15421 {\r
15422         SM_STATUS *s = (SM_STATUS *)param;\r
15423         // 引数チェック\r
15424         if (hWnd == NULL)\r
15425         {\r
15426                 return 0;\r
15427         }\r
15428 \r
15429         switch (msg)\r
15430         {\r
15431         case WM_INITDIALOG:\r
15432                 // 初期化\r
15433                 LvInitEx(hWnd, L_STATUS, s->NoImage);\r
15434                 LvSetStyle(hWnd, L_STATUS, LVS_EX_GRIDLINES);\r
15435                 SetIcon(hWnd, 0, s->Icon);\r
15436                 SetIcon(hWnd, S_ICON, s->Icon);\r
15437                 SetText(hWnd, 0, s->Caption);\r
15438                 SetText(hWnd, S_TITLE, s->Caption);\r
15439                 DlgFont(hWnd, S_TITLE, 15, true);\r
15440                 if (s->InitProc != NULL)\r
15441                 {\r
15442                         s->InitProc(hWnd, s->p, s->Param);\r
15443                 }\r
15444                 else\r
15445                 {\r
15446                         // カラム初期化\r
15447                         LvInsertColumn(hWnd, L_STATUS, 0, _UU("SM_STATUS_COLUMN_1"), 0);\r
15448                         LvInsertColumn(hWnd, L_STATUS, 1, _UU("SM_STATUS_COLUMN_2"), 0);\r
15449                 }\r
15450                 if (s->RefreshProc(hWnd, s->p, s->Param) == false)\r
15451                 {\r
15452                         Close(hWnd);\r
15453                 }\r
15454                 LvAutoSize(hWnd, L_STATUS);\r
15455                 Focus(hWnd, L_STATUS);\r
15456 \r
15457                 if (s->show_refresh_button == false)\r
15458                 {\r
15459                         Hide(hWnd, IDOK);\r
15460                 }\r
15461 \r
15462                 break;\r
15463 \r
15464         case WM_COMMAND:\r
15465                 switch (wParam)\r
15466                 {\r
15467                 case IDOK:\r
15468                         // 更新\r
15469                         if (s->RefreshProc(hWnd, s->p, s->Param) == false)\r
15470                         {\r
15471                                 Close(hWnd);\r
15472                         }\r
15473                         LvAutoSize(hWnd, L_STATUS);\r
15474                         break;\r
15475 \r
15476                 case IDCANCEL:\r
15477                         Close(hWnd);\r
15478                         break;\r
15479                 }\r
15480                 break;\r
15481 \r
15482         case WM_CLOSE:\r
15483                 EndDialog(hWnd, 0);\r
15484                 break;\r
15485         }\r
15486 \r
15487         LvStandardHandler(hWnd, msg, wParam, lParam, L_STATUS);\r
15488 \r
15489         return 0;\r
15490 }\r
15491 \r
15492 // ステータス表示ダイアログ\r
15493 void SmStatusDlg(HWND hWnd, SM_SERVER *p, void *param, bool no_image, bool show_refresh_button, wchar_t *caption, UINT icon,\r
15494                                  SM_STATUS_INIT_PROC *init, SM_STATUS_REFRESH_PROC *refresh)\r
15495 {\r
15496         SM_STATUS s;\r
15497         // 引数チェック\r
15498         if (hWnd == NULL || p == NULL || refresh == NULL)\r
15499         {\r
15500                 return;\r
15501         }\r
15502 \r
15503         if (icon == 0)\r
15504         {\r
15505                 icon = ICO_INFORMATION;\r
15506         }\r
15507         if (caption == NULL)\r
15508         {\r
15509                 caption = _UU("SM_INFORMATION");\r
15510         }\r
15511 \r
15512         Zero(&s, sizeof(s));\r
15513         s.show_refresh_button = show_refresh_button;\r
15514         s.p = p;\r
15515         s.NoImage = no_image;\r
15516         s.Param = param;\r
15517         s.Icon = icon;\r
15518         s.Caption = caption;\r
15519         s.InitProc = init;\r
15520         s.RefreshProc = refresh;\r
15521 \r
15522         Dialog(hWnd, D_SM_STATUS, SmStatusDlgProc, &s);\r
15523 }\r
15524 \r
15525 // サーバー管理ダイアログ更新\r
15526 void SmServerDlgUpdate(HWND hWnd, SM_SERVER *p)\r
15527 {\r
15528         bool hub_selected = false;\r
15529         bool hub_selected_online = false;\r
15530         bool hub_selected_offline = false;\r
15531         bool hub_have_admin_right = false;\r
15532         bool listener_selected = false;\r
15533         bool listener_selected_enabled = false;\r
15534         bool listener_selected_disabled = false;\r
15535         bool two_or_more_listener = false;\r
15536         bool bridge;\r
15537         UINT i;\r
15538         // 引数チェック\r
15539         if (hWnd == NULL || p == NULL)\r
15540         {\r
15541                 return;\r
15542         }\r
15543 \r
15544         bridge = GetCapsBool(p->CapsList, "b_bridge");\r
15545 \r
15546         hub_selected = LvIsSelected(hWnd, L_HUB);\r
15547 \r
15548         if (hub_selected)\r
15549         {\r
15550                 if (p->ServerAdminMode)\r
15551                 {\r
15552                         hub_have_admin_right = true;\r
15553                 }\r
15554                 i = LvGetSelected(hWnd, L_HUB);\r
15555                 if (i != INFINITE)\r
15556                 {\r
15557                         wchar_t *s = LvGetStr(hWnd, L_HUB, i, 1);\r
15558                         if (p->ServerAdminMode == false)\r
15559                         {\r
15560                                 char *hubname = LvGetStrA(hWnd, L_HUB, i, 0);\r
15561                                 if (hubname != NULL)\r
15562                                 {\r
15563                                         if (StrCmpi(hubname, p->HubName) == 0)\r
15564                                         {\r
15565                                                 hub_have_admin_right = true;\r
15566                                         }\r
15567                                         Free(hubname);\r
15568                                 }\r
15569                         }\r
15570                         hub_selected_online = (UniStrCmpi(s, _UU("SM_HUB_ONLINE")) == 0);\r
15571                         hub_selected_offline = hub_selected_online ? false : true;\r
15572                         Free(s);\r
15573                 }\r
15574         }\r
15575 \r
15576         listener_selected = LvIsSelected(hWnd, L_LISTENER);\r
15577         if (listener_selected)\r
15578         {\r
15579                 wchar_t *s = LvGetSelectedStr(hWnd, L_LISTENER, 1);\r
15580                 if (UniStrCmpi(s, _UU("CM_LISTENER_OFFLINE")) == 0)\r
15581                 {\r
15582                         listener_selected_disabled = true;\r
15583                 }\r
15584                 else\r
15585                 {\r
15586                         listener_selected_enabled = true;\r
15587                 }\r
15588                 Free(s);\r
15589         }\r
15590 \r
15591         if (LvNum(hWnd, L_LISTENER) >= 2)\r
15592         {\r
15593                 two_or_more_listener = true;\r
15594         }\r
15595 \r
15596         SetEnable(hWnd, IDOK, bridge || (hub_selected && hub_have_admin_right));\r
15597         SetEnable(hWnd, B_ONLINE, bridge == false && hub_selected_offline && hub_have_admin_right && p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
15598         SetEnable(hWnd, B_OFFLINE, bridge == false && hub_selected_online && hub_have_admin_right && p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
15599         SetEnable(hWnd, B_HUB_STATUS, hub_selected && hub_have_admin_right);\r
15600         SetEnable(hWnd, B_DELETE, bridge == false && hub_selected && p->ServerAdminMode && p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
15601         SetEnable(hWnd, B_EDIT, hub_selected && hub_have_admin_right && p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
15602         SetEnable(hWnd, B_CREATE, bridge == false && p->ServerAdminMode && p->ServerType != SERVER_TYPE_FARM_MEMBER);\r
15603 \r
15604         SetEnable(hWnd, B_CREATE_LISTENER, p->ServerAdminMode);\r
15605         SetEnable(hWnd, B_DELETE_LISTENER, p->ServerAdminMode && listener_selected && two_or_more_listener);\r
15606         SetEnable(hWnd, B_START, p->ServerAdminMode && listener_selected_disabled);\r
15607         SetEnable(hWnd, B_STOP, p->ServerAdminMode && listener_selected_enabled);\r
15608         SetEnable(hWnd, B_FARM, GetCapsBool(p->CapsList, "b_support_cluster") && p->ServerAdminMode);\r
15609         SetEnable(hWnd, B_FARM_STATUS, GetCapsBool(p->CapsList, "b_support_cluster") && p->ServerType != SERVER_TYPE_STANDALONE);\r
15610 }\r
15611 \r
15612 // サーバー管理ダイアログ初期化\r
15613 void SmServerDlgInit(HWND hWnd, SM_SERVER *p)\r
15614 {\r
15615         // 引数チェック\r
15616         if (hWnd == NULL || p == NULL)\r
15617         {\r
15618                 return;\r
15619         }\r
15620 \r
15621         // カラム初期化\r
15622         LvInit(hWnd, L_HUB);\r
15623         LvSetStyle(hWnd, L_HUB, LVS_EX_GRIDLINES);\r
15624         LvInsertColumn(hWnd, L_HUB, 0, _UU("SM_HUB_COLUMN_1"), 150);\r
15625         LvInsertColumn(hWnd, L_HUB, 1, _UU("SM_HUB_COLUMN_2"), 80);\r
15626         LvInsertColumn(hWnd, L_HUB, 2, _UU("SM_HUB_COLUMN_3"), 80);\r
15627         LvInsertColumn(hWnd, L_HUB, 3, _UU("SM_HUB_COLUMN_4"), 80);\r
15628         LvInsertColumn(hWnd, L_HUB, 4, _UU("SM_HUB_COLUMN_5"), 80);\r
15629         LvInsertColumn(hWnd, L_HUB, 5, _UU("SM_HUB_COLUMN_6"), 80);\r
15630         LvInsertColumn(hWnd, L_HUB, 6, _UU("SM_HUB_COLUMN_7"), 80);\r
15631         LvInsertColumn(hWnd, L_HUB, 7, _UU("SM_HUB_COLUMN_8"), 80);\r
15632         LvInsertColumn(hWnd, L_HUB, 8, _UU("SM_HUB_COLUMN_9"), 80);\r
15633         LvInsertColumn(hWnd, L_HUB, 9, _UU("SM_HUB_COLUMN_10"), 120);\r
15634         LvInsertColumn(hWnd, L_HUB, 10, _UU("SM_HUB_COLUMN_11"), 120);\r
15635 \r
15636         LvInit(hWnd, L_LISTENER);\r
15637         LvSetStyle(hWnd, L_LISTENER, LVS_EX_GRIDLINES);\r
15638         LvInsertColumn(hWnd, L_LISTENER, 0, _UU("CM_LISTENER_COLUMN_1"), 90);\r
15639         LvInsertColumn(hWnd, L_LISTENER, 1, _UU("CM_LISTENER_COLUMN_2"), 80);\r
15640 \r
15641         SmServerDlgRefresh(hWnd, p);\r
15642 \r
15643         if (p->ServerAdminMode == false)\r
15644         {\r
15645                 // 仮想 HUB 管理モードの場合は唯一の HUB を選択する\r
15646                 wchar_t *s = CopyStrToUni(p->HubName);\r
15647                 LvSelect(hWnd, L_HUB, LvSearchStr(hWnd, L_HUB, 0, s));\r
15648                 Free(s);\r
15649         }\r
15650         else\r
15651         {\r
15652                 // サーバー全体の管理モードの場合\r
15653                 UINT num_hubs = LvNum(hWnd, L_HUB);\r
15654 \r
15655                 if (num_hubs == 1)\r
15656                 {\r
15657                         // 仮想 HUB が 1 個の場合は必ずその仮想 HUB を選択する\r
15658                         LvSelect(hWnd, L_HUB, 0);\r
15659                 }\r
15660                 else\r
15661                 {\r
15662                         // 仮想 HUB が複数個ある場合は前回最後に選択した仮想 HUB を選択する\r
15663                         char tmp[MAX_SIZE];\r
15664                         char *hubname;\r
15665 \r
15666                         Format(tmp, sizeof(tmp), "%s:%u:%s", p->CurrentSetting->ClientOption.Hostname,\r
15667                                 p->CurrentSetting->ClientOption.Port,\r
15668                                 p->CurrentSetting->ServerAdminMode ? "" : p->CurrentSetting->HubName);\r
15669 \r
15670                         hubname = MsRegReadStr(REG_CURRENT_USER, SM_LASTHUB_REG_KEY, tmp);\r
15671 \r
15672                         if (IsEmptyStr(hubname) == false)\r
15673                         {\r
15674                                 LvSelect(hWnd, L_HUB, LvSearchStrA(hWnd, L_HUB, 0, hubname));\r
15675                         }\r
15676 \r
15677                         Free(hubname);\r
15678                 }\r
15679         }\r
15680 \r
15681         Focus(hWnd, L_HUB);\r
15682 \r
15683         SmServerDlgUpdate(hWnd, p);\r
15684 \r
15685         if (GetCapsBool(p->CapsList, "b_bridge"))\r
15686         {\r
15687                 Disable(hWnd, L_HUB);\r
15688         }\r
15689 \r
15690         // ローカルブリッジボタン等はサーバーの Admin の場合に有効にする\r
15691         SetEnable(hWnd, B_BRIDGE, GetCapsBool(p->CapsList, "b_local_bridge") && p->ServerAdminMode);\r
15692         SetEnable(hWnd, B_CONNECTION, p->ServerAdminMode);\r
15693 \r
15694         // Config R/W ボタン\r
15695         SetEnable(hWnd, B_CONFIG, GetCapsBool(p->CapsList, "b_support_config_rw") && p->ServerAdminMode);\r
15696 \r
15697         // レイヤ 3 ボタン\r
15698         SetEnable(hWnd, B_L3, GetCapsBool(p->CapsList, "b_support_layer3") && p->ServerAdminMode);\r
15699 \r
15700         // ライセンスボタン\r
15701         SetShow(hWnd, B_LICENSE, GetCapsBool(p->CapsList, "b_support_license") && p->ServerAdminMode);\r
15702         SetShow(hWnd, S_LICENSE, GetCapsBool(p->CapsList, "b_support_license") && p->ServerAdminMode);\r
15703         SetShow(hWnd, S_BETA, GetCapsBool(p->CapsList, "b_beta_version") && (IsShow(hWnd, B_LICENSE) == false));\r
15704 \r
15705         DlgFont(hWnd, S_BETA, 12, false);\r
15706 }\r
15707 \r
15708 // サーバー管理ダイアログ更新\r
15709 void SmServerDlgRefresh(HWND hWnd, SM_SERVER *p)\r
15710 {\r
15711         RPC_ENUM_HUB t;\r
15712         UINT i;\r
15713         // 引数チェック\r
15714         if (hWnd == NULL || p == NULL)\r
15715         {\r
15716                 return;\r
15717         }\r
15718 \r
15719         // 仮想 HUB リスト更新\r
15720         Zero(&t, sizeof(t));\r
15721         if (CALL(hWnd, ScEnumHub(p->Rpc, &t)))\r
15722         {\r
15723                 LVB *b = LvInsertStart();\r
15724                 for (i = 0;i < t.NumHub;i++)\r
15725                 {\r
15726                         RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];\r
15727                         wchar_t name[MAX_HUBNAME_LEN + 1];\r
15728                         wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];\r
15729                         wchar_t s6[64], s7[128], s8[128];\r
15730                         UniToStru(s1, e->NumUsers);\r
15731                         UniToStru(s2, e->NumGroups);\r
15732                         UniToStru(s3, e->NumSessions);\r
15733                         UniToStru(s4, e->NumMacTables);\r
15734                         UniToStru(s5, e->NumIpTables);\r
15735 \r
15736                         UniToStru(s6, e->NumLogin);\r
15737 \r
15738                         if (e->LastLoginTime != 0)\r
15739                         {\r
15740                                 GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));\r
15741                         }\r
15742                         else\r
15743                         {\r
15744                                 UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));\r
15745                         }\r
15746 \r
15747                         if (e->LastCommTime != 0)\r
15748                         {\r
15749                                 GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));\r
15750                         }\r
15751                         else\r
15752                         {\r
15753                                 UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));\r
15754                         }\r
15755 \r
15756                         StrToUni(name, sizeof(name), e->HubName);\r
15757 \r
15758                         LvInsertAdd(b,\r
15759                                 e->Online ? ICO_HUB : ICO_HUB_OFFLINE,\r
15760                                 NULL,\r
15761                                 11,\r
15762                                 name,\r
15763                                 e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),\r
15764                                 GetHubTypeStr(e->HubType),\r
15765                                 s1, s2, s3, s4, s5, s6, s7, s8);\r
15766                 }\r
15767                 LvInsertEnd(b, hWnd, L_HUB);\r
15768                 FreeRpcEnumHub(&t);\r
15769         }\r
15770 \r
15771         // リスナーリスト更新\r
15772         if (p != NULL)\r
15773         {\r
15774                 RPC_LISTENER_LIST t;\r
15775                 Zero(&t, sizeof(RPC_LISTENER_LIST));\r
15776                 if (CALL(hWnd, ScEnumListener(p->Rpc, &t)))\r
15777                 {\r
15778                         LVB *b = LvInsertStart();\r
15779                         for (i = 0;i < t.NumPort;i++)\r
15780                         {\r
15781                                 wchar_t tmp[MAX_SIZE];\r
15782                                 wchar_t *status;\r
15783                                 UINT icon;\r
15784                                 UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);\r
15785 \r
15786                                 status = _UU("CM_LISTENER_ONLINE");\r
15787                                 icon = ICO_PROTOCOL;\r
15788                                 if (t.Errors[i])\r
15789                                 {\r
15790                                         status = _UU("CM_LISTENER_ERROR");\r
15791                                         icon = ICO_PROTOCOL_X;\r
15792                                 }\r
15793                                 else if (t.Enables[i] == false)\r
15794                                 {\r
15795                                         status = _UU("CM_LISTENER_OFFLINE");\r
15796                                         icon = ICO_PROTOCOL_OFFLINE;\r
15797                                 }\r
15798 \r
15799                                 LvInsertAdd(b, icon, (void *)t.Ports[i], 2, tmp, status);\r
15800                         }\r
15801                         LvInsertEnd(b, hWnd, L_LISTENER);\r
15802                         FreeRpcListenerList(&t);\r
15803                 }\r
15804         }\r
15805 \r
15806         SmServerDlgUpdate(hWnd, p);\r
15807 }\r
15808 \r
15809 // サーバー管理ダイアログプロシージャ\r
15810 UINT SmServerDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
15811 {\r
15812         SM_SERVER *p = (SM_SERVER *)param;\r
15813         wchar_t *s;\r
15814         wchar_t tmp[MAX_SIZE];\r
15815         NMHDR *n;\r
15816         UINT i;\r
15817         // 引数チェック\r
15818         if (hWnd == NULL)\r
15819         {\r
15820                 return 0;\r
15821         }\r
15822 \r
15823         switch (msg)\r
15824         {\r
15825         case WM_INITDIALOG:\r
15826                 FormatText(hWnd, 0, p->Title);\r
15827 \r
15828                 if (p->Bridge == false)\r
15829                 {\r
15830                         FormatText(hWnd, S_TITLE, p->ServerName);\r
15831                 }\r
15832                 else\r
15833                 {\r
15834                         UniFormat(tmp, sizeof(tmp), _UU("SM_SERVER_BRIDGE_TITLE"), p->ServerName);\r
15835                         SetText(hWnd, S_TITLE, tmp);\r
15836 \r
15837                         SetText(hWnd, S_VHUB_BRIDGE, _UU("SM_S_VHUB_BRIDGE"));\r
15838                 }\r
15839 \r
15840                 DlgFont(hWnd, S_TITLE, 16, 1);\r
15841 \r
15842                 SetIcon(hWnd, 0, p->Bridge == false ? ICO_VPNSERVER : ICO_BRIDGE);\r
15843 \r
15844                 SmServerDlgInit(hWnd, p);\r
15845 \r
15846                 SetTimer(hWnd, 1, 50, NULL);\r
15847 \r
15848                 break;\r
15849 \r
15850         case WM_COMMAND:\r
15851                 switch (wParam)\r
15852                 {\r
15853                 case IDOK:\r
15854                         // 管理\r
15855                         if (IsEnable(hWnd, IDOK))\r
15856                         {\r
15857                                 if (p->Bridge == false)\r
15858                                 {\r
15859                                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15860                                 }\r
15861                                 else\r
15862                                 {\r
15863                                         s = CopyUniStr(L"BRIDGE");\r
15864                                 }\r
15865                                 if (s != NULL)\r
15866                                 {\r
15867                                         char hubname[MAX_HUBNAME_LEN + 1];\r
15868                                         SM_HUB hub;\r
15869                                         Zero(&hub, sizeof(hub));\r
15870                                         UniToStr(hubname, sizeof(hubname), s);\r
15871                                         hub.p = p;\r
15872                                         hub.Rpc = p->Rpc;\r
15873                                         hub.HubName = hubname;\r
15874                                         SmHubDlg(hWnd, &hub);\r
15875                                         //SmServerDlgRefresh(hWnd, p);\r
15876                                         Free(s);\r
15877                                 }\r
15878                         }\r
15879                         break;\r
15880 \r
15881                 case B_ONLINE:\r
15882                         // オンラインにする\r
15883                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15884                         if (s != NULL)\r
15885                         {\r
15886                                 RPC_SET_HUB_ONLINE t;\r
15887                                 Zero(&t, sizeof(t));\r
15888                                 UniToStr(t.HubName, sizeof(t.HubName), s);\r
15889                                 t.Online = true;\r
15890                                 if (CALL(hWnd, ScSetHubOnline(p->Rpc, &t)))\r
15891                                 {\r
15892                                         SmServerDlgRefresh(hWnd, p);\r
15893                                 }\r
15894                                 Free(s);\r
15895                         }\r
15896                         break;\r
15897 \r
15898                 case B_OFFLINE:\r
15899                         // オフラインにする\r
15900                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15901                         if (s != NULL)\r
15902                         {\r
15903                                 RPC_SET_HUB_ONLINE t;\r
15904                                 Zero(&t, sizeof(t));\r
15905                                 // 確認メッセージ\r
15906                                 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
15907                                         _UU("CM_OFFLINE_MSG"), s) == IDYES)\r
15908                                 {\r
15909                                         UniToStr(t.HubName, sizeof(t.HubName), s);\r
15910                                         t.Online = false;\r
15911                                         if (CALL(hWnd, ScSetHubOnline(p->Rpc, &t)))\r
15912                                         {\r
15913                                                 SmServerDlgRefresh(hWnd, p);\r
15914                                         }\r
15915                                 }\r
15916                                 Free(s);\r
15917                         }\r
15918                         break;\r
15919 \r
15920                 case B_HUB_STATUS:\r
15921                         // HUB の状態\r
15922                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15923                         if (s != NULL)\r
15924                         {\r
15925                                 wchar_t tmp[MAX_SIZE];\r
15926                                 char *hubname = CopyUniToStr(s);\r
15927                                 UniFormat(tmp, sizeof(tmp), _UU("SM_HUB_STATUS_CAPTION"), s);\r
15928                                 SmStatusDlg(hWnd, p, hubname, false, true, tmp, ICO_HUB,\r
15929                                         NULL, SmRefreshHubStatus);\r
15930                                 Free(hubname);\r
15931                                 Free(s);\r
15932                         }\r
15933                         break;\r
15934 \r
15935                 case B_CREATE:\r
15936                         // HUB の作成\r
15937                         if (SmCreateHubDlg(hWnd, p))\r
15938                         {\r
15939                                 SmServerDlgRefresh(hWnd, p);\r
15940                         }\r
15941                         break;\r
15942 \r
15943                 case B_EDIT:\r
15944                         // HUB の編集\r
15945                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15946                         if (s != NULL)\r
15947                         {\r
15948                                 char *name = CopyUniToStr(s);\r
15949                                 if (SmEditHubDlg(hWnd, p, name))\r
15950                                 {\r
15951                                         SmServerDlgRefresh(hWnd, p);\r
15952                                 }\r
15953                                 Free(name);\r
15954                                 Free(s);\r
15955                         }\r
15956                         break;\r
15957 \r
15958                 case B_DELETE:\r
15959                         // HUB の削除\r
15960                         s = LvGetSelectedStr(hWnd, L_HUB, 0);\r
15961                         if (s != NULL)\r
15962                         {\r
15963                                 char *name = CopyUniToStr(s);\r
15964                                 RPC_DELETE_HUB t;\r
15965                                 Zero(&t, sizeof(t));\r
15966                                 StrCpy(t.HubName, sizeof(t.HubName), name);\r
15967                                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_HUB_MSG"), name) == IDYES)\r
15968                                 {\r
15969                                         if (CALL(hWnd, ScDeleteHub(p->Rpc, &t)))\r
15970                                         {\r
15971                                                 SmServerDlgRefresh(hWnd, p);\r
15972                                                 MsgBoxEx(hWnd, MB_ICONINFORMATION, _UU("CM_HUB_DELETED_MSG"), name);\r
15973                                         }\r
15974                                 }\r
15975                                 Free(name);\r
15976                                 Free(s);\r
15977                         }\r
15978                         break;\r
15979 \r
15980                 case B_CREATE_LISTENER:\r
15981                         // リスナー作成\r
15982                         if (SmCreateListenerDlg(hWnd, p))\r
15983                         {\r
15984                                 SmServerDlgRefresh(hWnd, p);\r
15985                         }\r
15986                         break;\r
15987 \r
15988                 case B_DELETE_LISTENER:\r
15989                         // リスナー削除\r
15990                         i = LvGetSelected(hWnd, L_LISTENER);\r
15991                         if (i != INFINITE)\r
15992                         {\r
15993                                 UINT port = (UINT)LvGetParam(hWnd, L_LISTENER, i);\r
15994                                 if (MsgBoxEx(hWnd, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_DELETE_LISTENER_MSG"), port) == IDYES)\r
15995                                 {\r
15996                                         RPC_LISTENER t;\r
15997                                         Zero(&t, sizeof(t));\r
15998                                         t.Enable = false;\r
15999                                         t.Port = port;\r
16000 \r
16001                                         if (CALL(hWnd, ScDeleteListener(p->Rpc, &t)))\r
16002                                         {\r
16003                                                 SmServerDlgRefresh(hWnd, p);\r
16004                                         }\r
16005                                 }\r
16006                         }\r
16007                         break;\r
16008 \r
16009                 case B_START:\r
16010                         // 開始\r
16011                         i = LvGetSelected(hWnd, L_LISTENER);\r
16012                         if (i != INFINITE)\r
16013                         {\r
16014                                 UINT port = (UINT)LvGetParam(hWnd, L_LISTENER, i);\r
16015                                 RPC_LISTENER t;\r
16016                                 Zero(&t, sizeof(t));\r
16017                                 t.Enable = true;\r
16018                                 t.Port = port;\r
16019 \r
16020                                 if (CALL(hWnd, ScEnableListener(p->Rpc, &t)))\r
16021                                 {\r
16022                                         SmServerDlgRefresh(hWnd, p);\r
16023                                 }\r
16024                         }\r
16025                         break;\r
16026 \r
16027                 case B_STOP:\r
16028                         // 停止\r
16029                         i = LvGetSelected(hWnd, L_LISTENER);\r
16030                         if (i != INFINITE)\r
16031                         {\r
16032                                 UINT port = (UINT)LvGetParam(hWnd, L_LISTENER, i);\r
16033                                 if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2, _UU("CM_STOP_LISTENER_MSG"), port) == IDYES)\r
16034                                 {\r
16035                                         RPC_LISTENER t;\r
16036                                         Zero(&t, sizeof(t));\r
16037                                         t.Enable = false;\r
16038                                         t.Port = port;\r
16039 \r
16040                                         if (CALL(hWnd, ScEnableListener(p->Rpc, &t)))\r
16041                                         {\r
16042                                                 SmServerDlgRefresh(hWnd, p);\r
16043                                         }\r
16044                                 }\r
16045                         }\r
16046                         break;\r
16047 \r
16048                 case B_SSL:\r
16049                         // SSL 関係\r
16050                         SmSslDlg(hWnd, p);\r
16051                         break;\r
16052 \r
16053                 case B_STATUS:\r
16054                         // サーバー状態\r
16055                         SmStatusDlg(hWnd, p, p, false, true, _UU("SM_SERVER_STATUS"), ICO_VPNSERVER,\r
16056                                 NULL, SmRefreshServerStatus);\r
16057                         break;\r
16058 \r
16059                 case B_INFO:\r
16060                         // サーバー情報\r
16061                         SmStatusDlg(hWnd, p, p, false, false, _UU("SM_INFO_TITLE"), ICO_VPNSERVER,\r
16062                                 NULL, SmRefreshServerInfo);\r
16063                         break;\r
16064 \r
16065                 case B_BRIDGE:\r
16066                         // ローカルブリッジ設定\r
16067                         SmBridgeDlg(hWnd, p);\r
16068                         SmServerDlgRefresh(hWnd, p);\r
16069                         break;\r
16070 \r
16071                 case B_FARM:\r
16072                         // サーバーファーム\r
16073                         if (SmFarmDlg(hWnd, p))\r
16074                         {\r
16075                                 // サーバー ファーム構成が変更された場合はダイアログを閉じる\r
16076                                 Close(hWnd);\r
16077                         }\r
16078                         break;\r
16079 \r
16080                 case B_FARM_STATUS:\r
16081                         // サーバー ファーム 状態\r
16082                         if (p->ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
16083                         {\r
16084                                 Dialog(hWnd, D_SM_FARM_MEMBER, SmFarmMemberDlgProc, p);\r
16085                         }\r
16086                         else if (p->ServerType == SERVER_TYPE_FARM_MEMBER)\r
16087                         {\r
16088                                 SmStatusDlg(hWnd, p, NULL, false, true, _UU("SM_FC_STATUS_CAPTION"),\r
16089                                         ICO_FARM, NULL, SmRefreshFarmConnectionInfo);\r
16090                         }\r
16091                         break;\r
16092 \r
16093                 case B_CONNECTION:\r
16094                         // TCP コネクション一覧\r
16095                         SmConnectionDlg(hWnd, p);\r
16096                         break;\r
16097 \r
16098                 case B_REFRESH:\r
16099                         // 最新の状態に更新\r
16100                         SmServerDlgRefresh(hWnd, p);\r
16101                         break;\r
16102 \r
16103                 case B_CONFIG:\r
16104                         // config 編集\r
16105                         SmConfig(hWnd, p);\r
16106                         break;\r
16107 \r
16108                 case B_L3:\r
16109                         // L3 スイッチ\r
16110                         SmL3(hWnd, p);\r
16111                         break;\r
16112 \r
16113                 case B_LICENSE:\r
16114                         // ライセンスの追加と削除\r
16115                         SmLicense(hWnd, p);\r
16116                         SmServerDlgUpdate(hWnd, p);\r
16117                         break;\r
16118 \r
16119                 case IDCANCEL:\r
16120                         Close(hWnd);\r
16121                         break;\r
16122                 }\r
16123                 break;\r
16124 \r
16125         case WM_CLOSE:\r
16126                 {\r
16127                         // 最後に選択されていた HUB を保存する\r
16128                         char *hubname = NULL;\r
16129                         char tmp[MAX_SIZE];\r
16130 \r
16131 \r
16132                         Format(tmp, sizeof(tmp), "%s:%u:%s", p->CurrentSetting->ClientOption.Hostname,\r
16133                                 p->CurrentSetting->ClientOption.Port,\r
16134                                 p->CurrentSetting->ServerAdminMode ? "" : p->CurrentSetting->HubName);\r
16135 \r
16136                         if (LvIsSingleSelected(hWnd, L_HUB))\r
16137                         {\r
16138                                 hubname = LvGetSelectedStrA(hWnd, L_HUB, 0);\r
16139                         }\r
16140 \r
16141                         if (IsEmptyStr(hubname) == false)\r
16142                         {\r
16143                                 MsRegWriteStr(REG_CURRENT_USER, SM_LASTHUB_REG_KEY, tmp, hubname);\r
16144                         }\r
16145                         else\r
16146                         {\r
16147                                 MsRegDeleteValue(REG_CURRENT_USER, SM_LASTHUB_REG_KEY, tmp);\r
16148                         }\r
16149 \r
16150                         Free(hubname);\r
16151 \r
16152                         EndDialog(hWnd, false);\r
16153                 }\r
16154                 break;\r
16155 \r
16156         case WM_NOTIFY:\r
16157                 n = (NMHDR *)lParam;\r
16158                 switch (n->idFrom)\r
16159                 {\r
16160                 case L_HUB:\r
16161                         switch (n->code)\r
16162                         {\r
16163                         case LVN_ITEMCHANGED:\r
16164                                 SmServerDlgUpdate(hWnd, p);\r
16165                                 break;\r
16166                         }\r
16167                         break;\r
16168                 case L_LISTENER:\r
16169                         switch (n->code)\r
16170                         {\r
16171                         case LVN_ITEMCHANGED:\r
16172                                 SmServerDlgUpdate(hWnd, p);\r
16173                                 break;\r
16174                         }\r
16175                         break;\r
16176                 }\r
16177                 break;\r
16178 \r
16179         case WM_TIMER:\r
16180                 switch (wParam)\r
16181                 {\r
16182                 case 1:\r
16183                         KillTimer(hWnd, 1);\r
16184 \r
16185                         if (p->EmptyPassword && p->ServerAdminMode)\r
16186                         {\r
16187                                 // パスワードが空の場合は変更を推奨する\r
16188                                 if (MsgBox(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("SM_PASSWORD_MSG")) == IDYES)\r
16189                                 {\r
16190                                         Dialog(hWnd, D_SM_CHANGE_PASSWORD, SmChangeServerPasswordDlg, p);\r
16191                                 }\r
16192                         }\r
16193 \r
16194                         if (p->ServerAdminMode)\r
16195                         {\r
16196                                 // ライセンスキーが登録されていない場合は登録を促す\r
16197                                 RPC_LICENSE_STATUS t;\r
16198 \r
16199                                 Zero(&t, sizeof(t));\r
16200                                 if (p->Bridge == false && GetCapsBool(p->CapsList, "b_support_license"))\r
16201                                 {\r
16202                                         if (ScGetLicenseStatus(p->Rpc, &t) == ERR_NO_ERROR)\r
16203                                         {\r
16204                                                 if (t.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE || (t.NeedSubscription && t.SubscriptionExpires == 0))\r
16205                                                 {\r
16206                                                         // 有効なライセンスキーが 1 つも登録されていない\r
16207 \r
16208                                                         if (MsgBox(hWnd, MB_YESNO | MB_ICONINFORMATION,\r
16209                                                                 _UU("SM_SETUP_NO_LICENSE_KEY")) == IDYES)\r
16210                                                         {\r
16211                                                                 SmLicense(hWnd, p);\r
16212                                                         }\r
16213                                                 }\r
16214                                         }\r
16215                                 }\r
16216                         }\r
16217 \r
16218                         SetTimer(hWnd, 2, 150, NULL);\r
16219                         break;\r
16220 \r
16221                 case 2:\r
16222                         // セットアップ\r
16223                         KillTimer(hWnd, 2);\r
16224 \r
16225                         if (SmSetupIsNew(p))\r
16226                         {\r
16227                                 if (SmSetup(hWnd, p))\r
16228                                 {\r
16229                                         SmServerDlgRefresh(hWnd, p);\r
16230                                 }\r
16231                         }\r
16232 \r
16233                         SetTimer(hWnd, 3, 150, NULL);\r
16234                         break;\r
16235 \r
16236                 case 3:\r
16237                         // 管理者向けメッセージ\r
16238                         KillTimer(hWnd, 3);\r
16239 \r
16240                         if (UniIsEmptyStr(p->AdminMsg) == false)\r
16241                         {\r
16242                                 wchar_t tmp[MAX_SIZE];\r
16243 \r
16244                                 UniFormat(tmp, sizeof(tmp), _UU("SM_SERVER_ADMIN_MSG"), p->ServerName);\r
16245                                 OnceMsg(hWnd, tmp, p->AdminMsg, true, ICO_VPNSERVER);\r
16246                         }\r
16247                         break;\r
16248                 }\r
16249                 break;\r
16250         }\r
16251 \r
16252         LvStandardHandler(hWnd, msg, wParam, lParam, L_HUB);\r
16253 \r
16254         return 0;\r
16255 }\r
16256 \r
16257 // 接続\r
16258 void SmConnect(HWND hWnd, SETTING *s)\r
16259 {\r
16260         bool ok;\r
16261         RPC *rpc;\r
16262         char *pass;\r
16263         bool empty_password = false;\r
16264         bool first_bad_password = false;\r
16265         // 引数チェック\r
16266         if (s == NULL)\r
16267         {\r
16268                 return;\r
16269         }\r
16270 \r
16271         // コントロールの無効化\r
16272         Disable(hWnd, L_SETTING);\r
16273         Disable(hWnd, B_NEW_SETTING);\r
16274         Disable(hWnd, B_EDIT_SETTING);\r
16275         Disable(hWnd, B_DELETE);\r
16276         Disable(hWnd, IDOK);\r
16277         Disable(hWnd, B_ABOUT);\r
16278         Disable(hWnd, IDCANCEL);\r
16279         Disable(hWnd, B_SECURE_MANAGER);\r
16280         Disable(hWnd, B_SELECT_SECURE);\r
16281 \r
16282         ok = true;\r
16283 \r
16284         if (IsZero(s->HashedPassword, SHA1_SIZE))\r
16285         {\r
16286                 // パスワード入力画面\r
16287 ENTER_PASSWORD:\r
16288                 pass = SmPassword(hWnd, s->ClientOption.Hostname);\r
16289                 if (pass != NULL)\r
16290                 {\r
16291                         Hash(s->HashedPassword, pass, StrLen(pass), true);\r
16292                         Free(pass);\r
16293                         ok = true;\r
16294                 }\r
16295                 else\r
16296                 {\r
16297                         ok = false;\r
16298                 }\r
16299         }\r
16300 \r
16301         if (ok)\r
16302         {\r
16303                 UINT err = ERR_INTERNAL_ERROR;\r
16304                 // 接続\r
16305                 rpc = AdminConnectEx2(sm->Cedar, &s->ClientOption, s->ServerAdminMode ? "" : s->HubName, s->HashedPassword, &err, NULL,\r
16306                         hWnd);\r
16307                 if (rpc == NULL)\r
16308                 {\r
16309                         // エラー発生\r
16310                         if (err != ERR_ACCESS_DENIED || first_bad_password)\r
16311                         {\r
16312                                 MsgBox(hWnd, MB_ICONSTOP, _E(err));\r
16313                         }\r
16314                         if (err == ERR_ACCESS_DENIED)\r
16315                         {\r
16316                                 // パスワード間違い\r
16317                                 first_bad_password = true;\r
16318                                 goto ENTER_PASSWORD;\r
16319                         }\r
16320                         else\r
16321                         {\r
16322                                 // その他のエラー\r
16323                         }\r
16324                 }\r
16325                 else\r
16326                 {\r
16327                         UCHAR test[SHA1_SIZE];\r
16328                         SM_SERVER p;\r
16329                         RPC_SERVER_STATUS status;\r
16330                         RPC_SERVER_INFO info;\r
16331                         SETTING *setting;\r
16332                         RPC_MSG msg;\r
16333 \r
16334                         Hash(test, "", 0, true);\r
16335 \r
16336                         if (Cmp(test, s->HashedPassword, SHA1_SIZE) == 0)\r
16337                         {\r
16338                                 empty_password = true;\r
16339                         }\r
16340 \r
16341                         if (sm->TempSetting == NULL)\r
16342                         {\r
16343                                 setting = SmGetSetting(s->Title);\r
16344                                 if (setting != NULL)\r
16345                                 {\r
16346                                         if (IsZero(setting->HashedPassword, SHA1_SIZE) == false)\r
16347                                         {\r
16348                                                 Copy(setting->HashedPassword, s->HashedPassword, SHA1_SIZE);\r
16349                                                 SmWriteSettingList();\r
16350                                         }\r
16351                                 }\r
16352                         }\r
16353 \r
16354                         rpc->ServerAdminMode = s->ServerAdminMode;\r
16355                         if (s->ServerAdminMode == false)\r
16356                         {\r
16357                                 StrCpy(rpc->HubName, sizeof(rpc->HubName), s->HubName);\r
16358                         }\r
16359 \r
16360                         Zero(&p, sizeof(p));\r
16361                         p.CurrentSetting = s;\r
16362                         p.Rpc = rpc;\r
16363                         p.EmptyPassword = empty_password;\r
16364                         p.ServerAdminMode = rpc->ServerAdminMode;\r
16365                         StrCpy(p.ServerName, sizeof(p.ServerName), s->ClientOption.Hostname);\r
16366                         if (p.ServerAdminMode == false)\r
16367                         {\r
16368                                 StrCpy(p.HubName, sizeof(p.HubName), rpc->HubName);\r
16369                         }\r
16370                         UniStrCpy(p.Title, sizeof(p.Title), s->Title);\r
16371 \r
16372                         // サーバーの種類の取得\r
16373                         Zero(&status, sizeof(status));\r
16374                         ScGetServerStatus(rpc, &status);\r
16375 \r
16376                         p.ServerType = status.ServerType;\r
16377 \r
16378                         Zero(&info, sizeof(info));\r
16379                         ScGetServerInfo(rpc, &info);\r
16380 \r
16381                         Copy(&p.ServerInfo, &info, sizeof(RPC_SERVER_INFO));\r
16382                         Copy(&p.ServerStatus, &status, sizeof(RPC_SERVER_STATUS));\r
16383 \r
16384                         // Admin Msg の取得\r
16385                         Zero(&msg, sizeof(msg));\r
16386                         if (ScGetAdminMsg(rpc, &msg) == ERR_NO_ERROR)\r
16387                         {\r
16388                                 p.AdminMsg = UniCopyStr(msg.Msg);\r
16389                                 FreeRpcMsg(&msg);\r
16390                         }\r
16391 \r
16392                         // Caps の取得\r
16393                         p.CapsList = ScGetCapsEx(p.Rpc);\r
16394 \r
16395                         p.Bridge = GetCapsBool(p.CapsList, "b_bridge");\r
16396 \r
16397                         if (GetCapsBool(p.CapsList, "b_support_policy_ver_3"))\r
16398                         {\r
16399                                 p.PolicyVer = 3;\r
16400                         }\r
16401                         else\r
16402                         {\r
16403                                 p.PolicyVer = 2;\r
16404                         }\r
16405 \r
16406                         // サーバー管理画面\r
16407                         Dialog(hWnd, D_SM_SERVER, SmServerDlgProc, &p);\r
16408 \r
16409                         // 切断\r
16410                         AdminDisconnect(rpc);\r
16411 \r
16412                         // Caps の解放\r
16413                         FreeCapsList(p.CapsList);\r
16414 \r
16415                         Free(p.AdminMsg);\r
16416                         p.AdminMsg = NULL;\r
16417 \r
16418                         FreeRpcServerInfo(&info);\r
16419                 }\r
16420         }\r
16421 \r
16422         // コントロールの有効化\r
16423         Enable(hWnd, L_SETTING);\r
16424         Enable(hWnd, B_NEW_SETTING);\r
16425         Enable(hWnd, B_EDIT_SETTING);\r
16426         Enable(hWnd, B_DELETE);\r
16427         Enable(hWnd, IDOK);\r
16428         Enable(hWnd, B_ABOUT);\r
16429         Enable(hWnd, IDCANCEL);\r
16430         Enable(hWnd, B_SECURE_MANAGER);\r
16431         Enable(hWnd, B_SELECT_SECURE);\r
16432 }\r
16433 \r
16434 // パスワード入力ダイアログ\r
16435 char *SmPassword(HWND hWnd, char *server_name)\r
16436 {\r
16437         char *ret;\r
16438         UI_PASSWORD_DLG p;\r
16439         // 引数チェック\r
16440         if (server_name == NULL)\r
16441         {\r
16442                 return NULL;\r
16443         }\r
16444 \r
16445         Zero(&p, sizeof(p));\r
16446         p.AdminMode = true;\r
16447         StrCpy(p.ServerName, sizeof(p.ServerName), server_name);\r
16448 \r
16449         if (PasswordDlg(hWnd, &p) == false)\r
16450         {\r
16451                 return NULL;\r
16452         }\r
16453 \r
16454         ret = CopyStr(p.Password);\r
16455 \r
16456         return ret;\r
16457 }\r
16458 \r
16459 // 設定の編集ダイアログ初期化\r
16460 void SmEditSettingDlgInit(HWND hWnd, SM_EDIT_SETTING *p)\r
16461 {\r
16462         SETTING *s;\r
16463         // 引数チェック\r
16464         if (hWnd == NULL || p == NULL)\r
16465         {\r
16466                 return;\r
16467         }\r
16468 \r
16469         p->Inited = false;\r
16470 \r
16471         s = p->Setting;\r
16472 \r
16473         // タイトル\r
16474         if (p->EditMode == false)\r
16475         {\r
16476                 SetText(hWnd, 0, _UU("SM_EDIT_CAPTION_1"));\r
16477         }\r
16478         else\r
16479         {\r
16480                 wchar_t tmp[MAX_SIZE];\r
16481                 UniFormat(tmp, sizeof(tmp), _UU("SM_EDIT_CAPTION_2"), s->Title);\r
16482                 SetText(hWnd, 0, tmp);\r
16483         }\r
16484 \r
16485         // 接続設定名\r
16486         SetText(hWnd, E_ACCOUNT_NAME, s->Title);\r
16487 \r
16488         // ホスト名\r
16489         SetTextA(hWnd, E_HOSTNAME, s->ClientOption.Hostname);\r
16490 \r
16491         // ポート番号\r
16492         CbSetHeight(hWnd, C_PORT, 18);\r
16493         CbAddStr(hWnd, C_PORT, _UU("CM_PORT_4"), 0);\r
16494         CbAddStr(hWnd, C_PORT, _UU("CM_PORT_1"), 0);\r
16495         CbAddStr(hWnd, C_PORT, _UU("CM_PORT_2"), 0);\r
16496         CbAddStr(hWnd, C_PORT, _UU("CM_PORT_3"), 0);\r
16497         SetIntEx(hWnd, C_PORT, s->ClientOption.Port);\r
16498 \r
16499         // プロキシ設定\r
16500         Check(hWnd, R_DIRECT_TCP, s->ClientOption.ProxyType == PROXY_DIRECT);\r
16501         Check(hWnd, R_HTTPS, s->ClientOption.ProxyType == PROXY_HTTP);\r
16502         Check(hWnd, R_SOCKS, s->ClientOption.ProxyType == PROXY_SOCKS);\r
16503 \r
16504         // 管理モード設定\r
16505         Check(hWnd, R_SERVER_ADMIN, s->ServerAdminMode);\r
16506         Check(hWnd, R_HUB_ADMIN, s->ServerAdminMode == false ? true : false);\r
16507         CbSetHeight(hWnd, C_HUBNAME, 18);\r
16508         SetTextA(hWnd, C_HUBNAME, s->HubName);\r
16509 \r
16510         // パスワード\r
16511         if (IsZero(s->HashedPassword, SHA1_SIZE))\r
16512         {\r
16513                 Check(hWnd, R_NO_SAVE, true);\r
16514         }\r
16515         else\r
16516         {\r
16517                 UCHAR test[SHA1_SIZE];\r
16518 \r
16519                 Hash(test, "", 0, true);\r
16520                 if (Cmp(test, s->HashedPassword, SHA1_SIZE) != 0)\r
16521                 {\r
16522                         SetTextA(hWnd, E_PASSWORD, HIDDEN_PASSWORD);\r
16523                 }\r
16524         }\r
16525 \r
16526         if (p->EditMode == false)\r
16527         {\r
16528                 FocusEx(hWnd, E_ACCOUNT_NAME);\r
16529         }\r
16530         else\r
16531         {\r
16532                 FocusEx(hWnd, E_HOSTNAME);\r
16533         }\r
16534 \r
16535         p->Inited = true;\r
16536 \r
16537         // 仮想 HUB の列挙を開始\r
16538         CmEnumHubStart(hWnd, &s->ClientOption);\r
16539 \r
16540         SmEditSettingDlgUpdate(hWnd, p);\r
16541 }\r
16542 \r
16543 // 設定の編集ダイアログ更新\r
16544 void SmEditSettingDlgUpdate(HWND hWnd, SM_EDIT_SETTING *p)\r
16545 {\r
16546         bool ok = true;\r
16547         UINT delete_hub_list = 0;\r
16548         SETTING *s;\r
16549         char tmp[MAX_SIZE];\r
16550         // 引数チェック\r
16551         if (hWnd == NULL || p == NULL || p->Inited == false)\r
16552         {\r
16553                 return;\r
16554         }\r
16555 \r
16556         s = p->Setting;\r
16557 \r
16558         GetTxt(hWnd, E_ACCOUNT_NAME, s->Title, sizeof(s->Title));\r
16559         UniTrim(s->Title);\r
16560 \r
16561         if (UniStrLen(s->Title) == 0)\r
16562         {\r
16563                 ok = false;\r
16564         }\r
16565 \r
16566         if (IsChecked(hWnd, R_LOCALHOST))\r
16567         {\r
16568                 SetTextA(hWnd, E_HOSTNAME, "localhost");\r
16569                 Disable(hWnd, E_HOSTNAME);\r
16570         }\r
16571         else\r
16572         {\r
16573                 Enable(hWnd, E_HOSTNAME);\r
16574         }\r
16575 \r
16576         GetTxtA(hWnd, E_HOSTNAME, tmp, sizeof(tmp));\r
16577         Trim(tmp);\r
16578 \r
16579         if (StrCmpi(tmp, s->ClientOption.Hostname) != 0)\r
16580         {\r
16581                 delete_hub_list++;\r
16582         }\r
16583 \r
16584         StrCpy(s->ClientOption.Hostname, sizeof(s->ClientOption.Hostname), tmp);\r
16585 \r
16586         if (StrLen(s->ClientOption.Hostname) == 0)\r
16587         {\r
16588                 ok = false;\r
16589         }\r
16590 \r
16591         s->ClientOption.Port = GetInt(hWnd, C_PORT);\r
16592         if (s->ClientOption.Port == 0)\r
16593         {\r
16594                 ok = false;\r
16595         }\r
16596 \r
16597         if (IsChecked(hWnd, R_DIRECT_TCP))\r
16598         {\r
16599                 s->ClientOption.ProxyType = PROXY_DIRECT;\r
16600         }\r
16601         else if (IsChecked(hWnd, R_HTTPS))\r
16602         {\r
16603                 s->ClientOption.ProxyType = PROXY_HTTP;\r
16604         }\r
16605         else\r
16606         {\r
16607                 s->ClientOption.ProxyType = PROXY_SOCKS;\r
16608         }\r
16609 \r
16610         SetEnable(hWnd, B_PROXY_CONFIG, s->ClientOption.ProxyType != PROXY_DIRECT);\r
16611 \r
16612         if (s->ClientOption.ProxyType != PROXY_DIRECT)\r
16613         {\r
16614                 if (StrLen(s->ClientOption.ProxyName) == 0)\r
16615                 {\r
16616                         ok = false;\r
16617                 }\r
16618                 if (s->ClientOption.ProxyPort == 0)\r
16619                 {\r
16620                         ok = false;\r
16621                 }\r
16622         }\r
16623 \r
16624         s->ServerAdminMode = IsChecked(hWnd, R_SERVER_ADMIN);\r
16625 \r
16626         SetEnable(hWnd, C_HUBNAME, s->ServerAdminMode == false ? true : false);\r
16627         SetEnable(hWnd, S_HUBNAME, s->ServerAdminMode == false ? true : false);\r
16628 \r
16629         GetTxtA(hWnd, C_HUBNAME, s->HubName, sizeof(s->HubName));\r
16630         Trim(s->HubName);\r
16631         if (StrLen(s->HubName) == 0)\r
16632         {\r
16633                 if (s->ServerAdminMode == false)\r
16634                 {\r
16635                         ok = false;\r
16636                 }\r
16637         }\r
16638 \r
16639         if (IsChecked(hWnd, R_NO_SAVE))\r
16640         {\r
16641                 Zero(s->HashedPassword, SHA1_SIZE);\r
16642                 SetTextA(hWnd, E_PASSWORD, "");\r
16643                 Disable(hWnd, E_PASSWORD);\r
16644                 Disable(hWnd, S_PASSWORD);\r
16645         }\r
16646         else\r
16647         {\r
16648                 char tmp[MAX_PASSWORD_LEN + 1];\r
16649                 Enable(hWnd, E_PASSWORD);\r
16650                 Enable(hWnd, S_PASSWORD);\r
16651                 GetTxtA(hWnd, E_PASSWORD, tmp, sizeof(tmp));\r
16652                 if (StrCmp(tmp, HIDDEN_PASSWORD) != 0)\r
16653                 {\r
16654                         Hash(s->HashedPassword, tmp, StrLen(tmp), true);\r
16655                 }\r
16656         }\r
16657 \r
16658         if (delete_hub_list)\r
16659         {\r
16660                 CbReset(hWnd, C_HUBNAME);\r
16661         }\r
16662 \r
16663         SetEnable(hWnd, IDOK, ok);\r
16664 }\r
16665 \r
16666 // 設定の編集ダイアログ OK ボタン\r
16667 void SmEditSettingDlgOnOk(HWND hWnd, SM_EDIT_SETTING *p)\r
16668 {\r
16669         // 引数チェック\r
16670         if (hWnd == NULL || p == NULL)\r
16671         {\r
16672                 return;\r
16673         }\r
16674 \r
16675         if (p->EditMode == false)\r
16676         {\r
16677                 // 新規登録\r
16678                 SETTING *s = ZeroMalloc(sizeof(SETTING));\r
16679                 Copy(s, p->Setting, sizeof(SETTING));\r
16680                 if (SmAddSetting(s) == false)\r
16681                 {\r
16682                         MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SM_SETTING_EXISTS"), s->Title);\r
16683                         Free(s);\r
16684                         FocusEx(hWnd, E_ACCOUNT_NAME);\r
16685                         return;\r
16686                 }\r
16687                 EndDialog(hWnd, true);\r
16688         }\r
16689         else\r
16690         {\r
16691                 // 更新登録\r
16692                 SETTING *t = SmGetSetting(p->Setting->Title);\r
16693                 if (t != NULL && t != p->OldSetting)\r
16694                 {\r
16695                         MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SM_SETTING_EXISTS"), p->Setting->Title);\r
16696                         FocusEx(hWnd, E_ACCOUNT_NAME);\r
16697                         return;\r
16698                 }\r
16699 \r
16700                 Copy(p->OldSetting, p->Setting, sizeof(SETTING));\r
16701                 Sort(sm->SettingList);\r
16702                 SmWriteSettingList();\r
16703 \r
16704                 EndDialog(hWnd, true);\r
16705         }\r
16706 }\r
16707 \r
16708 // 設定の追加 / 編集ダイアログ\r
16709 UINT SmEditSettingDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
16710 {\r
16711         SM_EDIT_SETTING *p = (SM_EDIT_SETTING *)param;\r
16712         // 引数チェック\r
16713         if (hWnd == NULL)\r
16714         {\r
16715                 return 0;\r
16716         }\r
16717 \r
16718         switch (msg)\r
16719         {\r
16720         case WM_INITDIALOG:\r
16721                 SmEditSettingDlgInit(hWnd, p);\r
16722                 break;\r
16723 \r
16724         case WM_COMMAND:\r
16725                 switch (LOWORD(wParam))\r
16726                 {\r
16727                 case R_LOCALHOST:\r
16728                 case E_ACCOUNT_NAME:\r
16729                 case E_HOSTNAME:\r
16730                 case C_PORT:\r
16731                 case R_DIRECT_TCP:\r
16732                 case R_HTTPS:\r
16733                 case R_SOCKS:\r
16734                 case R_SERVER_ADMIN:\r
16735                 case R_HUB_ADMIN:\r
16736                 case C_HUBNAME:\r
16737                 case E_PASSWORD:\r
16738                 case R_NO_SAVE:\r
16739                         SmEditSettingDlgUpdate(hWnd, p);\r
16740                         break;\r
16741                 }\r
16742 \r
16743                 if (LOWORD(wParam) == R_LOCALHOST)\r
16744                 {\r
16745                         FocusEx(hWnd, E_HOSTNAME);\r
16746                 }\r
16747 \r
16748                 switch (LOWORD(wParam))\r
16749                 {\r
16750                 case E_HOSTNAME:\r
16751                         if (HIWORD(wParam) == EN_KILLFOCUS)\r
16752                         {\r
16753                                 CmEnumHubStart(hWnd, &p->Setting->ClientOption);\r
16754                         }\r
16755                         break;\r
16756                 case C_PORT:\r
16757                         if (HIWORD(wParam) == CBN_KILLFOCUS)\r
16758                         {\r
16759                                 CmEnumHubStart(hWnd, &p->Setting->ClientOption);\r
16760                         }\r
16761                         break;\r
16762                 case R_DIRECT_TCP:\r
16763                 case R_HTTPS:\r
16764                 case R_SOCKS:\r
16765                         if (HIWORD(wParam) == BN_CLICKED)\r
16766                         {\r
16767                                 CmEnumHubStart(hWnd, &p->Setting->ClientOption);\r
16768                         }\r
16769                         break;\r
16770                 }\r
16771 \r
16772                 switch (wParam)\r
16773                 {\r
16774                 case IDOK:\r
16775                         SmEditSettingDlgOnOk(hWnd, p);\r
16776                         break;\r
16777 \r
16778                 case IDCANCEL:\r
16779                         Close(hWnd);\r
16780                         break;\r
16781 \r
16782                 case B_PROXY_CONFIG:\r
16783                         // プロキシ設定\r
16784                         if (CmProxyDlg(hWnd, &p->Setting->ClientOption))\r
16785                         {\r
16786                                 UINT n = GetInt(hWnd, C_PORT);\r
16787                                 if (p->Setting->ClientOption.ProxyType == PROXY_HTTP &&\r
16788                                         n != 443)\r
16789                                 {\r
16790                                         // HTTP プロキシ経由の設定になっていて接続先が 443 番ポート\r
16791                                         // 以外のポートである場合は警告を表示する\r
16792                                         if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO, _UU("CM_HTTP_PROXY_WARNING"), n) == IDYES)\r
16793                                         {\r
16794                                                 // ポート番号を 443 に変更する\r
16795                                                 SetText(hWnd, C_PORT, _UU("CM_PORT_2"));\r
16796                                         }\r
16797                                 }\r
16798                                 SmEditSettingDlgUpdate(hWnd, p);\r
16799                                 CmEnumHubStart(hWnd, &p->Setting->ClientOption);\r
16800                         }\r
16801                         break;\r
16802 \r
16803                 case R_NO_SAVE:\r
16804                         if (IsChecked(hWnd, R_NO_SAVE) == false)\r
16805                         {\r
16806                                 FocusEx(hWnd, E_PASSWORD);\r
16807                         }\r
16808                         break;\r
16809                 }\r
16810                 break;\r
16811 \r
16812         case WM_CLOSE:\r
16813                 EndDialog(hWnd, false);\r
16814                 break;\r
16815         }\r
16816 \r
16817         return 0;\r
16818 }\r
16819 \r
16820 // 設定の追加ダイアログを表示\r
16821 bool SmAddSettingDlg(HWND hWnd, wchar_t *new_name, UINT new_name_size)\r
16822 {\r
16823         SM_EDIT_SETTING p;\r
16824         SETTING s;\r
16825         UINT i;\r
16826         bool ret;\r
16827         // 引数チェック\r
16828         if (hWnd == NULL || new_name == NULL)\r
16829         {\r
16830                 return false;\r
16831         }\r
16832 \r
16833         Zero(&p, sizeof(p));\r
16834         Zero(&s, sizeof(s));\r
16835 \r
16836         s.ClientOption.Port = 443;\r
16837 \r
16838         p.EditMode = false;\r
16839         p.Setting = &s;\r
16840 \r
16841         for (i = 1;;i++)\r
16842         {\r
16843                 wchar_t tmp[MAX_SIZE];\r
16844                 if (i == 1)\r
16845                 {\r
16846                         UniFormat(tmp, sizeof(tmp), _UU("CM_NEW_ACCOUNT_NAME_1"));\r
16847                 }\r
16848                 else\r
16849                 {\r
16850                         UniFormat(tmp, sizeof(tmp), _UU("CM_NEW_ACCOUNT_NAME_2"), i);\r
16851                 }\r
16852 \r
16853                 if (SmGetSetting(tmp) == NULL)\r
16854                 {\r
16855                         UniStrCpy(s.Title, sizeof(s.Title), tmp);\r
16856                         Hash(s.HashedPassword, "", 0, true);\r
16857                         s.ServerAdminMode = true;\r
16858                         break;\r
16859                 }\r
16860         }\r
16861 \r
16862         ret = Dialog(hWnd, D_SM_EDIT_SETTING, SmEditSettingDlgProc, &p);\r
16863 \r
16864         if (ret)\r
16865         {\r
16866                 UniStrCpy(new_name, new_name_size, s.Title);\r
16867         }\r
16868 \r
16869         return ret;\r
16870 }\r
16871 \r
16872 // 設定の編集ダイアログを表示\r
16873 bool SmEditSettingDlg(HWND hWnd)\r
16874 {\r
16875         SM_EDIT_SETTING p;\r
16876         SETTING s, *setting;\r
16877         UINT i;\r
16878         wchar_t *name;\r
16879         // 引数チェック\r
16880         if (hWnd == NULL)\r
16881         {\r
16882                 return false;\r
16883         }\r
16884 \r
16885         i = LvGetSelected(hWnd, L_SETTING);\r
16886         if (i == INFINITE)\r
16887         {\r
16888                 return false;\r
16889         }\r
16890 \r
16891         name = LvGetStr(hWnd, L_SETTING, i, 0);\r
16892 \r
16893         setting = SmGetSetting(name);\r
16894         if (setting == NULL)\r
16895         {\r
16896                 Free(name);\r
16897                 return false;\r
16898         }\r
16899 \r
16900         Free(name);\r
16901 \r
16902         Copy(&s, setting, sizeof(SETTING));\r
16903 \r
16904         Zero(&p, sizeof(p));\r
16905 \r
16906         p.EditMode = true;\r
16907         p.OldSetting = setting;\r
16908         p.Setting = &s;\r
16909 \r
16910         return Dialog(hWnd, D_SM_EDIT_SETTING, SmEditSettingDlgProc, &p);\r
16911 }\r
16912 \r
16913 // 設定の更新\r
16914 bool SmCheckNewName(SETTING *s, wchar_t *new_title)\r
16915 {\r
16916         UINT i;\r
16917         // 引数チェック\r
16918         if (new_title == NULL)\r
16919         {\r
16920                 return false;\r
16921         }\r
16922         if (s != NULL)\r
16923         {\r
16924                 if (IsInList(sm->SettingList, s) == false)\r
16925                 {\r
16926                         return false;\r
16927                 }\r
16928         }\r
16929 \r
16930         // 他に同一の名前が無いかどうかチェック\r
16931         for (i = 0;i < LIST_NUM(sm->SettingList);i++)\r
16932         {\r
16933                 SETTING *t = LIST_DATA(sm->SettingList, i);\r
16934 \r
16935                 if (s != t)\r
16936                 {\r
16937                         if (UniStrCmpi(t->Title, new_title) == 0)\r
16938                         {\r
16939                                 return false;\r
16940                         }\r
16941                 }\r
16942         }\r
16943 \r
16944         return true;\r
16945 }\r
16946 \r
16947 // 設定の削除\r
16948 void SmDeleteSetting(wchar_t *title)\r
16949 {\r
16950         SETTING *s;\r
16951         // 引数チェック\r
16952         if (title == NULL)\r
16953         {\r
16954                 return;\r
16955         }\r
16956 \r
16957         s = SmGetSetting(title);\r
16958         if (s == NULL)\r
16959         {\r
16960                 return;\r
16961         }\r
16962 \r
16963         Delete(sm->SettingList, s);\r
16964         Free(s);\r
16965         Sort(sm->SettingList);\r
16966 \r
16967         SmWriteSettingList();\r
16968 }\r
16969 \r
16970 // 設定の追加\r
16971 bool SmAddSetting(SETTING *s)\r
16972 {\r
16973         // 引数チェック\r
16974         if (s == NULL)\r
16975         {\r
16976                 return false;\r
16977         }\r
16978 \r
16979         if (SmGetSetting(s->Title) != NULL)\r
16980         {\r
16981                 return false;\r
16982         }\r
16983 \r
16984         Insert(sm->SettingList, s);\r
16985 \r
16986         SmWriteSettingList();\r
16987 \r
16988         return true;\r
16989 }\r
16990 \r
16991 // 設定の取得\r
16992 SETTING *SmGetSetting(wchar_t *title)\r
16993 {\r
16994         SETTING s;\r
16995         // 引数チェック\r
16996         if (title == NULL)\r
16997         {\r
16998                 return NULL;\r
16999         }\r
17000 \r
17001         Zero(&s, sizeof(SETTING));\r
17002         UniStrCpy(s.Title, sizeof(s.Title), title);\r
17003 \r
17004         return (SETTING *)Search(sm->SettingList, &s);\r
17005 }\r
17006 \r
17007 // 接続設定の比較\r
17008 int SmCompareSetting(void *p1, void *p2)\r
17009 {\r
17010         SETTING *s1, *s2;\r
17011         if (p1 == NULL || p2 == NULL)\r
17012         {\r
17013                 return 0;\r
17014         }\r
17015         s1 = *(SETTING **)p1;\r
17016         s2 = *(SETTING **)p2;\r
17017         if (s1 == NULL || s2 == NULL)\r
17018         {\r
17019                 return 0;\r
17020         }\r
17021 \r
17022         return UniStrCmpi(s1->Title, s2->Title);\r
17023 }\r
17024 \r
17025 // 設定リストの初期化\r
17026 void SmInitSettingList()\r
17027 {\r
17028         sm->SettingList = NewList(SmCompareSetting);\r
17029 \r
17030         SmLoadSettingList();\r
17031 \r
17032         SmInitDefaultSettingList();\r
17033 }\r
17034 \r
17035 // 設定リストの解放\r
17036 void SmFreeSettingList()\r
17037 {\r
17038         UINT i;\r
17039 \r
17040         // 書き込み\r
17041         SmWriteSettingList();\r
17042 \r
17043         for (i = 0;i < LIST_NUM(sm->SettingList);i++)\r
17044         {\r
17045                 SETTING *s = LIST_DATA(sm->SettingList, i);\r
17046                 Free(s);\r
17047         }\r
17048         ReleaseList(sm->SettingList);\r
17049 \r
17050         sm->SettingList = NULL;\r
17051 }\r
17052 \r
17053 // 設定リストの書き込み\r
17054 void SmWriteSettingList()\r
17055 {\r
17056         TOKEN_LIST *t;\r
17057         UINT i;\r
17058 \r
17059         t = MsRegEnumValue(REG_CURRENT_USER, SM_SETTING_REG_KEY);\r
17060         if (t != NULL)\r
17061         {\r
17062                 // 既存のすべての値を削除する\r
17063                 for (i = 0;i < t->NumTokens;i++)\r
17064                 {\r
17065                         char *name = t->Token[i];\r
17066                         MsRegDeleteValue(REG_CURRENT_USER, SM_SETTING_REG_KEY, name);\r
17067                 }\r
17068 \r
17069                 FreeToken(t);\r
17070         }\r
17071 \r
17072         for (i = 0;i < LIST_NUM(sm->SettingList);i++)\r
17073         {\r
17074                 char name[MAX_SIZE];\r
17075                 SETTING *s = LIST_DATA(sm->SettingList, i);\r
17076 \r
17077                 // 書き込む\r
17078                 Format(name, sizeof(name), "Setting%u", i + 1);\r
17079                 MsRegWriteBin(REG_CURRENT_USER, SM_SETTING_REG_KEY, name, s, sizeof(SETTING));\r
17080         }\r
17081 }\r
17082 \r
17083 // 接続リストの読み込み\r
17084 void SmLoadSettingList()\r
17085 {\r
17086         TOKEN_LIST *t;\r
17087         UINT i;\r
17088         char *key_name = SM_SETTING_REG_KEY;\r
17089 \r
17090         t = MsRegEnumValue(REG_CURRENT_USER, key_name);\r
17091         if (t == NULL)\r
17092         {\r
17093                 key_name = SM_SETTING_REG_KEY_OLD;\r
17094                 t = MsRegEnumValue(REG_CURRENT_USER, key_name);\r
17095                 if (t == NULL)\r
17096                 {\r
17097                         return;\r
17098                 }\r
17099         }\r
17100 \r
17101         for (i = 0;i < t->NumTokens;i++)\r
17102         {\r
17103                 char *name = t->Token[i];\r
17104                 BUF *b = MsRegReadBin(REG_CURRENT_USER, key_name, name);\r
17105                 if (b != NULL)\r
17106                 {\r
17107                         if (b->Size == sizeof(SETTING))\r
17108                         {\r
17109                                 SETTING *s = ZeroMalloc(sizeof(SETTING));\r
17110                                 Copy(s, b->Buf, sizeof(SETTING));\r
17111 \r
17112                                 Add(sm->SettingList, s);\r
17113                         }\r
17114                         FreeBuf(b);\r
17115                 }\r
17116         }\r
17117 \r
17118         FreeToken(t);\r
17119 \r
17120         Sort(sm->SettingList);\r
17121 }\r
17122 \r
17123 // デフォルトの設定リストの初期化\r
17124 void SmInitDefaultSettingList()\r
17125 {\r
17126         if (LIST_NUM(sm->SettingList) == 0)\r
17127         {\r
17128                 bool b = false;\r
17129                 LIST *pl = MsGetProcessList();\r
17130 \r
17131                 if (pl != NULL)\r
17132                 {\r
17133                         UINT i;\r
17134                         for (i = 0;i < LIST_NUM(pl);i++)\r
17135                         {\r
17136                                 MS_PROCESS *p = LIST_DATA(pl, i);\r
17137 \r
17138                                 if (InStr(p->ExeFilename, "utvpnserver.exe") || InStr(p->ExeFilename, "utvpnserver_x64.exe") ||\r
17139                                         InStr(p->ExeFilename, "utvpnserver_ia64.exe") ||\r
17140                                         InStr(p->ExeFilename, "utvpnbridge.exe") || InStr(p->ExeFilename, "utvpnbridge_x64.exe") ||\r
17141                                         InStr(p->ExeFilename, "utvpnbridge_ia64.exe"))\r
17142                                 {\r
17143                                         b = true;\r
17144                                 }\r
17145                         }\r
17146                 }\r
17147 \r
17148                 MsFreeProcessList(pl);\r
17149 \r
17150                 if (b == false)\r
17151                 {\r
17152                         if (MsIsServiceRunning(_SS("SVC_UTVPNSERVER_NAME")))\r
17153                         {\r
17154                                 b = true;\r
17155                         }\r
17156                 }\r
17157 \r
17158                 if (b)\r
17159                 {\r
17160                         SETTING *s = ZeroMalloc(sizeof(SETTING));\r
17161 \r
17162                         UniStrCpy(s->Title, sizeof(s->Title), _UU("SM_LOCALHOST"));\r
17163                         s->ServerAdminMode = true;\r
17164                         Hash(s->HashedPassword, "", 0, true);\r
17165                         UniStrCpy(s->ClientOption.AccountName, sizeof(s->ClientOption.AccountName), s->Title);\r
17166                         StrCpy(s->ClientOption.Hostname, sizeof(s->ClientOption.Hostname), "localhost");\r
17167                         s->ClientOption.Port = 5555;\r
17168 \r
17169                         Add(sm->SettingList, s);\r
17170                 }\r
17171         }\r
17172 }\r
17173 \r
17174 // メインダイアログ初期化\r
17175 void SmMainDlgInit(HWND hWnd)\r
17176 {\r
17177         wchar_t *last_select;\r
17178         UINT i = INFINITE;\r
17179         // 引数チェック\r
17180         if (hWnd == NULL)\r
17181         {\r
17182                 return;\r
17183         }\r
17184 \r
17185         SetIcon(hWnd, 0, ICO_VPNSERVER);\r
17186 \r
17187         LvInit(hWnd, L_SETTING);\r
17188         LvSetStyle(hWnd, L_SETTING, LVS_EX_GRIDLINES);\r
17189         LvInsertColumn(hWnd, L_SETTING, 0, _UU("SM_MAIN_COLUMN_1"), 146);\r
17190         LvInsertColumn(hWnd, L_SETTING, 1, _UU("SM_MAIN_COLUMN_2"), 130);\r
17191         LvInsertColumn(hWnd, L_SETTING, 2, _UU("SM_MAIN_COLUMN_3"), 130);\r
17192 \r
17193         SmRefreshSetting(hWnd);\r
17194 \r
17195         last_select = MsRegReadStrW(REG_CURRENT_USER, SM_REG_KEY, "Last Select");\r
17196         if (UniIsEmptyStr(last_select) == false)\r
17197         {\r
17198                 i = LvSearchStr(hWnd, L_SETTING, 0, last_select);\r
17199         }\r
17200         Free(last_select);\r
17201 \r
17202         if (i == INFINITE)\r
17203         {\r
17204                 LvSelect(hWnd, L_SETTING, 0);\r
17205         }\r
17206         else\r
17207         {\r
17208                 LvSelect(hWnd, L_SETTING, i);\r
17209         }\r
17210 \r
17211         Focus(hWnd, L_SETTING);\r
17212 \r
17213         SmMainDlgUpdate(hWnd);\r
17214 }\r
17215 \r
17216 // 設定一覧の更新\r
17217 void SmRefreshSetting(HWND hWnd)\r
17218 {\r
17219         SmRefreshSettingEx(hWnd, NULL);\r
17220 }\r
17221 void SmRefreshSettingEx(HWND hWnd, wchar_t *select_name)\r
17222 {\r
17223         LVB *b;\r
17224         UINT i;\r
17225         // 引数チェック\r
17226         if (hWnd == NULL)\r
17227         {\r
17228                 return;\r
17229         }\r
17230 \r
17231         b = LvInsertStart();\r
17232 \r
17233         for (i = 0;i < LIST_NUM(sm->SettingList);i++)\r
17234         {\r
17235                 wchar_t tmp[MAX_SIZE];\r
17236                 wchar_t tmp2[MAX_SIZE];\r
17237                 SETTING *s = LIST_DATA(sm->SettingList, i);\r
17238 \r
17239                 if (s->ServerAdminMode)\r
17240                 {\r
17241                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_MODE_SERVER"));\r
17242                 }\r
17243                 else\r
17244                 {\r
17245                         UniFormat(tmp, sizeof(tmp), _UU("SM_MODE_HUB"), s->HubName);\r
17246                 }\r
17247 \r
17248                 StrToUni(tmp2, sizeof(tmp2), s->ClientOption.Hostname);\r
17249 \r
17250                 LvInsertAdd(b,\r
17251                         (s->ServerAdminMode ? ICO_SERVER_ONLINE : ICO_HUB),\r
17252                         NULL,\r
17253                         3,\r
17254                         s->Title,\r
17255                         tmp2,\r
17256                         tmp);\r
17257         }\r
17258 \r
17259         LvInsertEnd(b, hWnd, L_SETTING);\r
17260 \r
17261         if (UniIsEmptyStr(select_name) == false)\r
17262         {\r
17263                 LvSelect(hWnd, L_SETTING, LvSearchStr(hWnd, L_SETTING, 0, select_name));\r
17264         }\r
17265 }\r
17266 \r
17267 // メインダイアログ更新\r
17268 void SmMainDlgUpdate(HWND hWnd)\r
17269 {\r
17270         bool ok = true;\r
17271         // 引数チェック\r
17272         if (hWnd == NULL)\r
17273         {\r
17274                 return;\r
17275         }\r
17276 \r
17277         if (LvIsSelected(hWnd, L_SETTING) == false)\r
17278         {\r
17279                 ok = false;\r
17280         }\r
17281         if (LvIsMultiMasked(hWnd, L_SETTING))\r
17282         {\r
17283                 ok = false;\r
17284         }\r
17285 \r
17286         SetEnable(hWnd, IDOK, ok);\r
17287         SetEnable(hWnd, B_EDIT_SETTING, ok);\r
17288         SetEnable(hWnd, B_DELETE, ok);\r
17289 }\r
17290 \r
17291 // メインウインドウプロシージャ\r
17292 UINT SmMainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)\r
17293 {\r
17294         NMHDR *n;\r
17295         NMLVDISPINFOW *info;\r
17296         NMLVKEYDOWN *key;\r
17297         wchar_t *tmp;\r
17298         UINT i;\r
17299         wchar_t new_name[MAX_SIZE];\r
17300         // 引数チェック\r
17301         if (hWnd == NULL)\r
17302         {\r
17303                 return 0;\r
17304         }\r
17305 \r
17306         switch (msg)\r
17307         {\r
17308         case WM_INITDIALOG:\r
17309                 ShowSplashEx(hWnd, "UT-VPN Server", 1300, SM_SPLASH_BORDER_COLOR);\r
17310                 SmMainDlgInit(hWnd);\r
17311                 SetTimer(hWnd, 4, 100, NULL);\r
17312                 break;\r
17313 \r
17314         case WM_TIMER:\r
17315                 switch (wParam)\r
17316                 {\r
17317                 case 4:\r
17318                         KillTimer(hWnd, 4);\r
17319                         break;\r
17320                 }\r
17321                 break;\r
17322 \r
17323         case WM_COMMAND:\r
17324                 switch (wParam)\r
17325                 {\r
17326                 case IDOK:\r
17327                         // 接続\r
17328                         i = LvGetSelected(hWnd, L_SETTING);\r
17329                         if (i != INFINITE)\r
17330                         {\r
17331                                 tmp = LvGetStr(hWnd, L_SETTING, i, 0);\r
17332                                 if (tmp != NULL)\r
17333                                 {\r
17334                                         SETTING *setting = SmGetSetting(tmp);\r
17335                                         if (setting != NULL)\r
17336                                         {\r
17337                                                 SETTING s;\r
17338 \r
17339                                                 // レジストリに最後の選択として記録\r
17340                                                 MsRegWriteStrW(REG_CURRENT_USER, SM_REG_KEY, "Last Select", tmp);\r
17341 \r
17342                                                 // 設定コピー\r
17343                                                 Copy(&s, setting, sizeof(SETTING));\r
17344                                                 SmConnect(hWnd, &s);\r
17345                                         }\r
17346                                         Free(tmp);\r
17347                                 }\r
17348                         }\r
17349                         break;\r
17350 \r
17351                 case IDCANCEL:\r
17352                         Close(hWnd);\r
17353                         break;\r
17354 \r
17355                 case B_NEW_SETTING:\r
17356                         // 追加\r
17357                         if (SmAddSettingDlg(hWnd, new_name, sizeof(new_name)))\r
17358                         {\r
17359                                 SmRefreshSettingEx(hWnd, new_name);\r
17360                         }\r
17361                         break;\r
17362 \r
17363                 case B_EDIT_SETTING:\r
17364                         // 編集\r
17365                         if (SmEditSettingDlg(hWnd))\r
17366                         {\r
17367                                 SmWriteSettingList();\r
17368                                 SmRefreshSetting(hWnd);\r
17369                         }\r
17370 \r
17371                         break;\r
17372 \r
17373                 case B_DELETE:\r
17374                         // 削除\r
17375                         i = LvGetSelected(hWnd, L_SETTING);\r
17376                         if (i != INFINITE)\r
17377                         {\r
17378                                 tmp = LvGetStr(hWnd, L_SETTING, i, 0);\r
17379                                 if (tmp != NULL)\r
17380                                 {\r
17381                                         if (MsgBoxEx(hWnd, MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,\r
17382                                                 _UU("SM_SETTING_DELETE_MSG"), tmp) == IDYES)\r
17383                                         {\r
17384                                                 SmDeleteSetting(tmp);\r
17385                                                 SmWriteSettingList();\r
17386                                                 SmRefreshSetting(hWnd);\r
17387                                         }\r
17388                                         Free(tmp);\r
17389                                 }\r
17390                         }\r
17391                         break;\r
17392 \r
17393                 case B_ABOUT:\r
17394                         // バージョン情報\r
17395                         ShowSplashEx(hWnd, "UT-VPN Server", 0, SM_SPLASH_BORDER_COLOR);\r
17396                         break;\r
17397 \r
17398                 case B_SECURE_MANAGER:\r
17399                         // スマートカードマネージャ\r
17400                         SmSecureManager(hWnd);\r
17401                         break;\r
17402 \r
17403                 case B_SELECT_SECURE:\r
17404                         // スマートカード選択\r
17405                         SmSelectSecureId(hWnd);\r
17406                         break;\r
17407                 }\r
17408 \r
17409                 break;\r
17410 \r
17411         case WM_CLOSE:\r
17412                 EndDialog(hWnd, 0);\r
17413                 break;\r
17414 \r
17415         case WM_NOTIFY:\r
17416                 n = (NMHDR *)lParam;\r
17417                 switch (n->idFrom)\r
17418                 {\r
17419                 case L_SETTING:\r
17420                         switch (n->code)\r
17421                         {\r
17422                         case NM_DBLCLK:\r
17423                                 Command(hWnd, IDOK);\r
17424                                 break;\r
17425 \r
17426                         case LVN_KEYDOWN:\r
17427                                 key = (NMLVKEYDOWN *)n;\r
17428                                 if (key != NULL)\r
17429                                 {\r
17430                                         UINT code = key->wVKey;\r
17431                                         switch (code)\r
17432                                         {\r
17433                                         case VK_F2:\r
17434                                                 if (LvIsSelected(hWnd, L_SETTING))\r
17435                                                 {\r
17436                                                         LvRename(hWnd, L_SETTING, LvGetSelected(hWnd, L_SETTING));\r
17437                                                 }\r
17438                                                 break;\r
17439 \r
17440                                         case VK_DELETE:\r
17441                                                 Command(hWnd, B_DELETE);\r
17442                                                 break;\r
17443 \r
17444                                         case VK_RETURN:\r
17445                                                 Command(hWnd, IDOK);\r
17446                                                 break;\r
17447                                         }\r
17448                                 }\r
17449                                 break;\r
17450 \r
17451                         case LVN_ENDLABELEDITW:\r
17452                                 // 名前の変更\r
17453                                 info = (NMLVDISPINFOW *)n;\r
17454                                 if (info->item.pszText != NULL)\r
17455                                 {\r
17456                                         wchar_t *new_name = info->item.pszText;\r
17457                                         wchar_t *old_name = LvGetStr(hWnd, L_SETTING, info->item.iItem, 0);\r
17458 \r
17459                                         if (old_name != NULL)\r
17460                                         {\r
17461                                                 if (UniStrCmp(new_name, old_name) != 0 && UniStrLen(new_name) != 0)\r
17462                                                 {\r
17463                                                         // 名前変更の実行\r
17464                                                         SETTING *s = SmGetSetting(old_name);\r
17465                                                         if (s != NULL)\r
17466                                                         {\r
17467                                                                 if (SmGetSetting(new_name) != NULL)\r
17468                                                                 {\r
17469                                                                         MsgBoxEx(hWnd, MB_ICONEXCLAMATION, _UU("SM_SETTING_EXISTS"),\r
17470                                                                                 new_name);\r
17471                                                                 }\r
17472                                                                 else\r
17473                                                                 {\r
17474                                                                         UniStrCpy(s->Title, sizeof(s->Title), new_name);\r
17475                                                                         Sort(sm->SettingList);\r
17476                                                                         SmWriteSettingList();\r
17477                                                                         LvSetItem(hWnd, L_SETTING, info->item.iItem, 0, new_name);\r
17478                                                                 }\r
17479                                                         }\r
17480                                                 }\r
17481 \r
17482                                                 Free(old_name);\r
17483                                         }\r
17484                                 }\r
17485                                 break;\r
17486 \r
17487                         case LVN_ITEMCHANGED:\r
17488                                 SmMainDlgUpdate(hWnd);\r
17489                                 break;\r
17490                         }\r
17491                         break;\r
17492                 }\r
17493                 break;\r
17494         }\r
17495 \r
17496         LvSortHander(hWnd, msg, wParam, lParam, L_SETTING);\r
17497 \r
17498         return 0;\r
17499 }\r
17500 \r
17501 // メインウインドウ\r
17502 void SmMainDlg()\r
17503 {\r
17504         Dialog(NULL, D_SM_MAIN, SmMainDlgProc, NULL);\r
17505 }\r
17506 \r
17507 // Server Manager メイン処理\r
17508 void MainSM()\r
17509 {\r
17510         if (sm->TempSetting == NULL)\r
17511         {\r
17512                 // メインウインドウを開く\r
17513                 SmMainDlg();\r
17514         }\r
17515         else\r
17516         {\r
17517                 SmConnect(sm->hParentWnd, sm->TempSetting);\r
17518         }\r
17519 }\r
17520 \r
17521 // 初期化\r
17522 void InitSM()\r
17523 {\r
17524         if (sm != NULL)\r
17525         {\r
17526                 // すでに初期化されている\r
17527                 return;\r
17528         }\r
17529 \r
17530         sm = ZeroMalloc(sizeof(SM));\r
17531 \r
17532         InitWinUi(_UU("SM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));\r
17533 \r
17534         sm->Cedar = NewCedar(NULL, NULL);\r
17535 \r
17536         SmInitSettingList();\r
17537 \r
17538         InitCM();\r
17539 \r
17540         // コマンドラインを解釈する\r
17541         SmParseCommandLine();\r
17542 }\r
17543 \r
17544 // コマンドラインを解釈する\r
17545 void SmParseCommandLine()\r
17546 {\r
17547         LIST *o;\r
17548         CONSOLE *c = NewLocalConsole(NULL, NULL);\r
17549         wchar_t *cmdline;\r
17550         PARAM args[] =\r
17551         {\r
17552                 {"[vpnserver]", NULL, NULL, NULL, NULL,},\r
17553                 {"HUB", NULL, NULL, NULL, NULL,},\r
17554                 {"PASSWORD", NULL, NULL, NULL, NULL,},\r
17555                 {"TITLE", NULL, NULL, NULL, NULL,},\r
17556                 {"HWND", NULL, NULL, NULL, NULL,},\r
17557         };\r
17558         if (c == NULL)\r
17559         {\r
17560                 return;\r
17561         }\r
17562         \r
17563         cmdline = GetCommandLineUniStr();\r
17564 \r
17565         if (UniIsEmptyStr(cmdline) == false)\r
17566         {\r
17567                 o = ParseCommandList(c, "vpnsmgr", cmdline, args, sizeof(args) / sizeof(args[0]));\r
17568                 if (o != NULL)\r
17569                 {\r
17570                         char *host;\r
17571                         UINT port;\r
17572 \r
17573                         if (ParseHostPort(GetParamStr(o, "[vpnserver]"), &host, &port, 443))\r
17574                         {\r
17575                                 char *hub = GetParamStr(o, "HUB");\r
17576                                 char *password = GetParamStr(o, "PASSWORD");\r
17577                                 char *title = GetParamStr(o, "TITLE");\r
17578                                 char *hwndstr = GetParamStr(o, "HWND");\r
17579 \r
17580                                 if (hub == NULL || StrCmpi(hub, "\"") == 0)\r
17581                                 {\r
17582                                         hub = CopyStr("");\r
17583                                 }\r
17584                                 if (password == NULL)\r
17585                                 {\r
17586                                         password = CopyStr("");\r
17587                                 }\r
17588                                 if (title == NULL)\r
17589                                 {\r
17590                                         title = CopyStr(host);\r
17591                                 }\r
17592 \r
17593                                 if (IsEmptyStr(host) == false)\r
17594                                 {\r
17595                                         SETTING *s = ZeroMalloc(sizeof(SETTING));\r
17596                                         BUF *b;\r
17597                                         CLIENT_OPTION *o;\r
17598 \r
17599                                         StrToUni(s->Title, sizeof(s->Title), title);\r
17600 \r
17601                                         if (IsEmptyStr(hub))\r
17602                                         {\r
17603                                                 s->ServerAdminMode = true;\r
17604                                         }\r
17605                                         else\r
17606                                         {\r
17607                                                 s->ServerAdminMode = false;\r
17608                                                 StrCpy(s->HubName, sizeof(s->HubName), hub);\r
17609                                         }\r
17610 \r
17611                                         b = StrToBin(password);\r
17612                                         if (b == NULL || b->Size != SHA1_SIZE)\r
17613                                         {\r
17614                                                 Hash(s->HashedPassword, password, StrLen(password), true);\r
17615                                         }\r
17616                                         else\r
17617                                         {\r
17618                                                 Copy(s->HashedPassword, b->Buf, SHA1_SIZE);\r
17619                                         }\r
17620                                         FreeBuf(b);\r
17621 \r
17622                                         o = &s->ClientOption;\r
17623 \r
17624                                         UniStrCpy(o->AccountName, sizeof(o->AccountName), s->Title);\r
17625                                         StrCpy(o->Hostname, sizeof(o->Hostname), host);\r
17626                                         o->Port = port;\r
17627                                         o->ProxyType = PROXY_DIRECT;\r
17628                                         StrCpy(o->DeviceName, sizeof(o->DeviceName), "DUMMY");\r
17629 \r
17630                                         sm->TempSetting = s;\r
17631 \r
17632                                         if (IsEmptyStr(hwndstr) == false)\r
17633                                         {\r
17634                                                 sm->hParentWnd = (HWND)ToInt64(hwndstr);\r
17635                                         }\r
17636                                 }\r
17637 \r
17638                                 Free(hwndstr);\r
17639                                 Free(title);\r
17640                                 Free(hub);\r
17641                                 Free(password);\r
17642                                 Free(host);\r
17643                         }\r
17644                 }\r
17645         }\r
17646 \r
17647         Free(cmdline);\r
17648 \r
17649         c->Free(c);\r
17650 }\r
17651 \r
17652 // 解放\r
17653 void FreeSM()\r
17654 {\r
17655         if (sm == NULL)\r
17656         {\r
17657                 // 初期化されていない\r
17658                 return;\r
17659         }\r
17660 \r
17661         FreeCM();\r
17662 \r
17663         SmFreeSettingList();\r
17664 \r
17665         ReleaseCedar(sm->Cedar);\r
17666 \r
17667         FreeWinUi();\r
17668 \r
17669         if (sm->TempSetting != NULL)\r
17670         {\r
17671                 Free(sm->TempSetting);\r
17672         }\r
17673 \r
17674         Free(sm);\r
17675         sm = NULL;\r
17676 }\r
17677 \r
17678 // Server Manager の実行\r
17679 void SMExec()\r
17680 {\r
17681         InitSM();\r
17682         MainSM();\r
17683         FreeSM();\r
17684 }\r
17685 \r
17686 #endif  // WIN32\r
17687 \r
17688 \r