NM.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521
  1. // SoftEther VPN Source Code - Developer Edition Master Branch
  2. // Cedar Communication Module
  3. // NM.c
  4. // VPN User-mode Router Manager for Win32
  5. #ifdef OS_WIN32
  6. #include "NM.h"
  7. #include "NMInner.h"
  8. #include "CMInner.h"
  9. #include "Nat.h"
  10. #include "Remote.h"
  11. #include "Server.h"
  12. #include "Mayaqua/Internat.h"
  13. #include "Mayaqua/Memory.h"
  14. #include "Mayaqua/Str.h"
  15. #include "../PenCore/resource.h"
  16. // Global variable
  17. static NM *nm = NULL;
  18. // Dialog proc for the push routing option
  19. UINT NmEditPushRouteProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  20. {
  21. SM_HUB *r = (SM_HUB *)param;
  22. char *str = NULL;
  23. // Validate arguments
  24. if (hWnd == NULL)
  25. {
  26. return 0;
  27. }
  28. switch (msg)
  29. {
  30. case WM_INITDIALOG:
  31. SetTextA(hWnd, E_TEXT, r->CurrentPushRouteStr);
  32. Focus(hWnd, E_TEXT);
  33. SetIcon(hWnd, 0, ICO_PROTOCOL);
  34. break;
  35. case WM_COMMAND:
  36. switch (wParam)
  37. {
  38. case IDOK:
  39. str = GetTextA(hWnd, E_TEXT);
  40. if (str != NULL)
  41. {
  42. bool ok = true;
  43. if (CheckClasslessRouteTableStr(str) == false)
  44. {
  45. if (MsgBox(hWnd, MB_ICONWARNING | MB_OKCANCEL | MB_DEFBUTTON2, _UU("NM_PUSH_ROUTE_WARNING")) == IDCANCEL)
  46. {
  47. ok = false;
  48. }
  49. }
  50. if (ok)
  51. {
  52. if (IsEmptyStr(str) == false)
  53. {
  54. if (GetCapsBool(r->p->CapsList, "b_suppport_push_route") == false)
  55. {
  56. MsgBox(hWnd, MB_ICONEXCLAMATION, _UU("ERR_147"));
  57. }
  58. }
  59. StrCpy(r->CurrentPushRouteStr, sizeof(r->CurrentPushRouteStr), str);
  60. EndDialog(hWnd, 1);
  61. }
  62. Free(str);
  63. }
  64. break;
  65. case IDCANCEL:
  66. Close(hWnd);
  67. break;
  68. }
  69. break;
  70. case WM_CLOSE:
  71. EndDialog(hWnd, 0);
  72. break;
  73. }
  74. return 0;
  75. }
  76. // Edit dialog for the push routing option
  77. bool NmEditPushRoute(HWND hWnd, SM_HUB *r)
  78. {
  79. // Validate arguments
  80. if (r == NULL)
  81. {
  82. return false;
  83. }
  84. return Dialog(hWnd, D_NM_PUSH, NmEditPushRouteProc, r);
  85. }
  86. // Change Password dialog
  87. UINT NmChangePasswordProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  88. {
  89. RPC *r = (RPC *)param;
  90. char tmp1[MAX_SIZE];
  91. char tmp2[MAX_SIZE];
  92. RPC_SET_PASSWORD t;
  93. // Validate arguments
  94. if (hWnd == NULL)
  95. {
  96. return 0;
  97. }
  98. switch (msg)
  99. {
  100. case WM_INITDIALOG:
  101. FormatText(hWnd, 0, r->Sock->RemoteHostname);
  102. FormatText(hWnd, S_TITLE, r->Sock->RemoteHostname);
  103. break;
  104. case WM_COMMAND:
  105. GetTxtA(hWnd, E_PASSWORD1, tmp1, sizeof(tmp1));
  106. GetTxtA(hWnd, E_PASSWORD2, tmp2, sizeof(tmp2));
  107. switch (LOWORD(wParam))
  108. {
  109. case E_PASSWORD1:
  110. case E_PASSWORD2:
  111. SetEnable(hWnd, IDOK, StrCmp(tmp1, tmp2) == 0);
  112. break;
  113. }
  114. switch (wParam)
  115. {
  116. case IDOK:
  117. Zero(&t, sizeof(t));
  118. Sha0(t.HashedPassword, tmp1, StrLen(tmp1));
  119. if (CALL(hWnd, NcSetPassword(r, &t)))
  120. {
  121. MsgBox(hWnd, MB_ICONINFORMATION, _UU("NM_PASSWORD_MSG"));
  122. EndDialog(hWnd, true);
  123. }
  124. break;
  125. case IDCANCEL:
  126. Close(hWnd);
  127. break;
  128. }
  129. break;
  130. case WM_CLOSE:
  131. EndDialog(hWnd, false);
  132. break;
  133. }
  134. return 0;
  135. }
  136. // Change the password
  137. void NmChangePassword(HWND hWnd, RPC *r)
  138. {
  139. // Validate arguments
  140. if (hWnd == NULL || r == NULL)
  141. {
  142. return;
  143. }
  144. Dialog(hWnd, D_NM_CHANGE_PASSWORD, NmChangePasswordProc, r);
  145. }
  146. // DHCP enumeration initialization
  147. void NmDhcpInit(HWND hWnd, SM_HUB *r)
  148. {
  149. // Validate arguments
  150. if (hWnd == NULL || r == NULL)
  151. {
  152. return;
  153. }
  154. SetIcon(hWnd, 0, ICO_INTERNET);
  155. LvInit(hWnd, L_TABLE);
  156. LvInsertColumn(hWnd, L_TABLE, 0, _UU("DHCP_DHCP_ID"), 50);
  157. LvInsertColumn(hWnd, L_TABLE, 1, _UU("DHCP_LEASED_TIME"), 200);
  158. LvInsertColumn(hWnd, L_TABLE, 2, _UU("DHCP_EXPIRE_TIME"), 200);
  159. LvInsertColumn(hWnd, L_TABLE, 3, _UU("DHCP_MAC_ADDRESS"), 130);
  160. LvInsertColumn(hWnd, L_TABLE, 4, _UU("DHCP_IP_ADDRESS"), 100);
  161. LvInsertColumn(hWnd, L_TABLE, 5, _UU("DHCP_HOSTNAME"), 150);
  162. NmDhcpRefresh(hWnd, r);
  163. }
  164. // DHCP enumeration
  165. void NmDhcpRefresh(HWND hWnd, SM_HUB *r)
  166. {
  167. LVB *b;
  168. RPC_ENUM_DHCP t;
  169. UINT i;
  170. // Validate arguments
  171. if (hWnd == NULL || r == NULL)
  172. {
  173. Close(hWnd);
  174. return;
  175. }
  176. Zero(&t, sizeof(t));
  177. StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
  178. if (CALL(hWnd, ScEnumDHCP(r->Rpc, &t)) == false)
  179. {
  180. return;
  181. }
  182. b = LvInsertStart();
  183. for (i = 0;i < t.NumItem;i++)
  184. {
  185. RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
  186. wchar_t tmp0[MAX_SIZE];
  187. wchar_t tmp1[MAX_SIZE];
  188. wchar_t tmp2[MAX_SIZE];
  189. wchar_t tmp3[MAX_SIZE];
  190. wchar_t tmp4[MAX_SIZE];
  191. wchar_t tmp5[MAX_SIZE];
  192. char str[MAX_SIZE];
  193. // ID
  194. UniToStru(tmp0, e->Id);
  195. // Time
  196. GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
  197. GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
  198. MacToStr(str, sizeof(str), e->MacAddress);
  199. StrToUni(tmp3, sizeof(tmp3), str);
  200. IPToStr32(str, sizeof(str), e->IpAddress);
  201. StrToUni(tmp4, sizeof(tmp4), str);
  202. StrToUni(tmp5, sizeof(tmp5), e->Hostname);
  203. LvInsertAdd(b, ICO_INTERNET, NULL, 6,
  204. tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
  205. }
  206. LvInsertEnd(b, hWnd, L_TABLE);
  207. FreeRpcEnumDhcp(&t);
  208. }
  209. // DHCP enumeration procedure
  210. UINT NmDhcpProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  211. {
  212. SM_HUB *r = (SM_HUB *)param;
  213. // Validate arguments
  214. if (hWnd == NULL)
  215. {
  216. return 0;
  217. }
  218. switch (msg)
  219. {
  220. case WM_INITDIALOG:
  221. NmDhcpInit(hWnd, r);
  222. SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
  223. break;
  224. case WM_COMMAND:
  225. switch (wParam)
  226. {
  227. case IDCANCEL:
  228. Close(hWnd);
  229. break;
  230. case B_REFRESH:
  231. NmDhcpRefresh(hWnd, r);
  232. break;
  233. }
  234. break;
  235. case WM_TIMER:
  236. switch (wParam)
  237. {
  238. case 1:
  239. KillTimer(hWnd, 1);
  240. NmDhcpRefresh(hWnd, r);
  241. SetTimer(hWnd, 1, NM_DHCP_REFRESH_TIME, NULL);
  242. break;
  243. }
  244. break;
  245. case WM_CLOSE:
  246. EndDialog(hWnd, false);
  247. break;
  248. }
  249. LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
  250. return 0;
  251. }
  252. // DHCP enumeration
  253. void NmDhcp(HWND hWnd, SM_HUB *r)
  254. {
  255. // Validate arguments
  256. if (hWnd == NULL || r == NULL)
  257. {
  258. return;
  259. }
  260. Dialog(hWnd, D_NM_DHCP, NmDhcpProc, r);
  261. }
  262. // NAT enumeration initialization
  263. void NmNatInit(HWND hWnd, SM_HUB *r)
  264. {
  265. // Validate arguments
  266. if (hWnd == NULL || r == NULL)
  267. {
  268. return;
  269. }
  270. SetIcon(hWnd, 0, ICO_PROTOCOL);
  271. LvInit(hWnd, L_TABLE);
  272. LvInsertColumn(hWnd, L_TABLE, 0, _UU("NM_NAT_ID"), 50);
  273. LvInsertColumn(hWnd, L_TABLE, 1, _UU("NM_NAT_PROTOCOL"), 80);
  274. LvInsertColumn(hWnd, L_TABLE, 2, _UU("NM_NAT_SRC_HOST"), 100);
  275. LvInsertColumn(hWnd, L_TABLE, 3, _UU("NM_NAT_SRC_PORT"), 80);
  276. LvInsertColumn(hWnd, L_TABLE, 4, _UU("NM_NAT_DST_HOST"), 150);
  277. LvInsertColumn(hWnd, L_TABLE, 5, _UU("NM_NAT_DST_PORT"), 80);
  278. LvInsertColumn(hWnd, L_TABLE, 6, _UU("NM_NAT_CREATED"), 200);
  279. LvInsertColumn(hWnd, L_TABLE, 7, _UU("NM_NAT_LAST_COMM"), 200);
  280. LvInsertColumn(hWnd, L_TABLE, 8, _UU("NM_NAT_SIZE"), 120);
  281. LvInsertColumn(hWnd, L_TABLE, 9, _UU("NM_NAT_TCP_STATUS"), 120);
  282. NmNatRefresh(hWnd, r);
  283. }
  284. // NAT enumeration
  285. void NmNatRefresh(HWND hWnd, SM_HUB *r)
  286. {
  287. LVB *b;
  288. RPC_ENUM_NAT t;
  289. UINT i;
  290. // Validate arguments
  291. if (hWnd == NULL || r == NULL)
  292. {
  293. return;
  294. }
  295. Zero(&t, sizeof(t));
  296. StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
  297. if (CALL(hWnd, ScEnumNAT(r->Rpc, &t)) == false)
  298. {
  299. Close(hWnd);
  300. return;
  301. }
  302. b = LvInsertStart();
  303. for (i = 0;i < t.NumItem;i++)
  304. {
  305. RPC_ENUM_NAT_ITEM *e = &t.Items[i];
  306. wchar_t tmp0[MAX_SIZE];
  307. wchar_t *tmp1 = L"";
  308. wchar_t tmp2[MAX_SIZE];
  309. wchar_t tmp3[MAX_SIZE];
  310. wchar_t tmp4[MAX_SIZE];
  311. wchar_t tmp5[MAX_SIZE];
  312. wchar_t tmp6[MAX_SIZE];
  313. wchar_t tmp7[MAX_SIZE];
  314. wchar_t tmp8[MAX_SIZE];
  315. wchar_t *tmp9 = L"";
  316. char v1[128], v2[128];
  317. // ID
  318. UniToStru(tmp0, e->Id);
  319. // Protocol
  320. switch (e->Protocol)
  321. {
  322. case NAT_TCP:
  323. tmp1 = _UU("NM_NAT_PROTO_TCP");
  324. break;
  325. case NAT_UDP:
  326. tmp1 = _UU("NM_NAT_PROTO_UDP");
  327. break;
  328. case NAT_DNS:
  329. tmp1 = _UU("NM_NAT_PROTO_DNS");
  330. break;
  331. case NAT_ICMP:
  332. tmp1 = _UU("NM_NAT_PROTO_ICMP");
  333. break;
  334. }
  335. // Source host
  336. StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
  337. // Source port
  338. UniToStru(tmp3, e->SrcPort);
  339. // Destination host
  340. StrToUni(tmp4, sizeof(tmp4), e->DestHost);
  341. // Destination port
  342. UniToStru(tmp5, e->DestPort);
  343. // Creation date and time of the session
  344. GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
  345. // Last communication date and time
  346. GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
  347. // Communication amount
  348. ToStr3(v1, sizeof(v1), e->RecvSize);
  349. ToStr3(v2, sizeof(v2), e->SendSize);
  350. UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
  351. // TCP state
  352. if (e->Protocol == NAT_TCP)
  353. {
  354. switch (e->TcpStatus)
  355. {
  356. case NAT_TCP_CONNECTING:
  357. tmp9 = _UU("NAT_TCP_CONNECTING");
  358. break;
  359. case NAT_TCP_SEND_RESET:
  360. tmp9 = _UU("NAT_TCP_SEND_RESET");
  361. break;
  362. case NAT_TCP_CONNECTED:
  363. tmp9 = _UU("NAT_TCP_CONNECTED");
  364. break;
  365. case NAT_TCP_ESTABLISHED:
  366. tmp9 = _UU("NAT_TCP_ESTABLISHED");
  367. break;
  368. case NAT_TCP_WAIT_DISCONNECT:
  369. tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
  370. break;
  371. }
  372. }
  373. LvInsertAdd(b, ICO_PROTOCOL, NULL, 10,
  374. tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
  375. }
  376. LvInsertEnd(b, hWnd, L_TABLE);
  377. FreeRpcEnumNat(&t);
  378. }
  379. // NAT enumeration procedure
  380. UINT NmNatProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  381. {
  382. SM_HUB *r = (SM_HUB *)param;
  383. // Validate arguments
  384. if (hWnd == NULL)
  385. {
  386. return 0;
  387. }
  388. switch (msg)
  389. {
  390. case WM_INITDIALOG:
  391. NmNatInit(hWnd, r);
  392. SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
  393. break;
  394. case WM_COMMAND:
  395. switch (wParam)
  396. {
  397. case IDCANCEL:
  398. Close(hWnd);
  399. break;
  400. case B_REFRESH:
  401. NmNatRefresh(hWnd, r);
  402. break;
  403. }
  404. break;
  405. case WM_TIMER:
  406. switch (wParam)
  407. {
  408. case 1:
  409. KillTimer(hWnd, 1);
  410. NmNatRefresh(hWnd, r);
  411. SetTimer(hWnd, 1, NM_NAT_REFRESH_TIME, NULL);
  412. break;
  413. }
  414. break;
  415. case WM_CLOSE:
  416. EndDialog(hWnd, false);
  417. break;
  418. }
  419. LvStandardHandler(hWnd, msg, wParam, lParam, L_TABLE);
  420. return 0;
  421. }
  422. // NAT enumeration
  423. void NmNat(HWND hWnd, SM_HUB *r)
  424. {
  425. // Validate arguments
  426. if (hWnd == NULL || r == NULL)
  427. {
  428. return;
  429. }
  430. Dialog(hWnd, D_NM_NAT, NmNatProc, r);
  431. }
  432. // Show the information of the router
  433. bool NmInfo(HWND hWnd, SM_SERVER *s, void *param)
  434. {
  435. LVB *b;
  436. RPC_NAT_INFO t;
  437. wchar_t tmp[MAX_SIZE];
  438. // Validate arguments
  439. if (hWnd == NULL || s == NULL)
  440. {
  441. return false;
  442. }
  443. Zero(&t, sizeof(t));
  444. if (CALL(hWnd, NcGetInfo(s->Rpc, &t)) == false)
  445. {
  446. return false;
  447. }
  448. b = LvInsertStart();
  449. StrToUni(tmp, sizeof(tmp), t.NatProductName);
  450. LvInsertAdd(b, ICO_ROUTER, NULL, 2, _UU("NM_INFO_PRODUCT_NAME"), tmp);
  451. StrToUni(tmp, sizeof(tmp), t.NatVersionString);
  452. LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_VERSION_STR"), tmp);
  453. StrToUni(tmp, sizeof(tmp), t.NatBuildInfoString);
  454. LvInsertAdd(b, ICO_INFORMATION, NULL, 2, _UU("NM_INFO_BUILD_INFO"), tmp);
  455. StrToUni(tmp, sizeof(tmp), t.NatHostName);
  456. LvInsertAdd(b, ICO_TOWER, NULL, 2, _UU("NM_INFO_HOSTNAME"), tmp);
  457. // OS
  458. StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
  459. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SYSTEM_NAME"), tmp);
  460. StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
  461. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_PRODUCT_NAME"), tmp);
  462. if (t.OsInfo.OsServicePack != 0)
  463. {
  464. UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
  465. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_SERVICE_PACK"), tmp);
  466. }
  467. StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
  468. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VENDER_NAME"), tmp);
  469. StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
  470. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_VERSION"), tmp);
  471. StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
  472. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_NAME"), tmp);
  473. StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
  474. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_OS_KERNEL_VERSION"), tmp);
  475. // Memory information
  476. if (t.MemInfo.TotalMemory != 0)
  477. {
  478. char vv[128];
  479. ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
  480. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  481. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_MEMORY"), tmp);
  482. ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
  483. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  484. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_MEMORY"), tmp);
  485. ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
  486. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  487. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_MEMORY"), tmp);
  488. ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
  489. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  490. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_TOTAL_PHYS"), tmp);
  491. ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
  492. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  493. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_USED_PHYS"), tmp);
  494. ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
  495. UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
  496. LvInsertAdd(b, ICO_MEMORY, NULL, 2, _UU("SM_ST_FREE_PHYS"), tmp);
  497. }
  498. LvInsertEnd(b, hWnd, L_STATUS);
  499. FreeRpcNatInfo(&t);
  500. return true;
  501. }
  502. // Show the status of the router
  503. bool NmStatus(HWND hWnd, SM_SERVER *s, void *param)
  504. {
  505. LVB *b;
  506. RPC_NAT_STATUS t;
  507. wchar_t tmp[MAX_SIZE];
  508. SM_HUB *h = (SM_HUB *)param;
  509. // Validate arguments
  510. if (hWnd == NULL || s == NULL)
  511. {
  512. return false;
  513. }
  514. Zero(&t, sizeof(t));
  515. StrCpy(t.HubName, sizeof(t.HubName), h->HubName);
  516. if (CALL(hWnd, ScGetSecureNATStatus(s->Rpc, &t)) == false)
  517. {
  518. return false;
  519. }
  520. b = LvInsertStart();
  521. StrToUni(tmp, sizeof(tmp), h->HubName);
  522. LvInsertAdd(b, ICO_HUB, NULL, 2, _UU("SM_HUB_COLUMN_1"), tmp);
  523. UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
  524. LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_TCP"), tmp);
  525. UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
  526. LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_UDP"), tmp);
  527. UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumIcmpSessions);
  528. LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_ICMP"), tmp);
  529. UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumDnsSessions);
  530. LvInsertAdd(b, ICO_PROTOCOL, NULL, 2, _UU("NM_STATUS_DNS"), tmp);
  531. UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
  532. LvInsertAdd(b, ICO_PROTOCOL_DHCP, NULL, 2, _UU("NM_STATUS_DHCP"), tmp);
  533. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_SNAT_IS_KERNEL"), t.IsKernelMode ? _UU("SEC_YES") : _UU("SEC_NO"));
  534. LvInsertAdd(b, ICO_MACHINE, NULL, 2, _UU("SM_SNAT_IS_RAW"), t.IsRawIpMode ? _UU("SEC_YES") : _UU("SEC_NO"));
  535. LvInsertEnd(b, hWnd, L_STATUS);
  536. FreeRpcNatStatus(&t);
  537. return true;
  538. }
  539. // Convert the contents of the form to the VH_OPTION
  540. void NmEditVhOptionFormToVH(HWND hWnd, VH_OPTION *t)
  541. {
  542. char tmp[MAX_SIZE];
  543. BUF *b;
  544. // Validate arguments
  545. if (hWnd == NULL || t == NULL)
  546. {
  547. return;
  548. }
  549. Zero(t, sizeof(VH_OPTION));
  550. GetTxtA(hWnd, E_MAC, tmp, sizeof(tmp));
  551. b = StrToBin(tmp);
  552. if (b != NULL)
  553. {
  554. if (b->Size == 6)
  555. {
  556. Copy(t->MacAddress, b->Buf, 6);
  557. }
  558. FreeBuf(b);
  559. }
  560. UINTToIP(&t->Ip, IpGet(hWnd, E_IP));
  561. UINTToIP(&t->Mask, IpGet(hWnd, E_MASK));
  562. t->UseNat = IsChecked(hWnd, R_USE_NAT);
  563. t->Mtu = GetInt(hWnd, E_MTU);
  564. t->NatTcpTimeout = GetInt(hWnd, E_TCP);
  565. t->NatUdpTimeout = GetInt(hWnd, E_UDP);
  566. t->UseDhcp = IsChecked(hWnd, R_USE_DHCP);
  567. UINTToIP(&t->DhcpLeaseIPStart, IpGet(hWnd, E_DHCP_START));
  568. UINTToIP(&t->DhcpLeaseIPEnd, IpGet(hWnd, E_DHCP_END));
  569. UINTToIP(&t->DhcpSubnetMask, IpGet(hWnd, E_DHCP_MASK));
  570. t->DhcpExpireTimeSpan = GetInt(hWnd, E_EXPIRES);
  571. UINTToIP(&t->DhcpGatewayAddress, IpGet(hWnd, E_GATEWAY));
  572. UINTToIP(&t->DhcpDnsServerAddress, IpGet(hWnd, E_DNS));
  573. UINTToIP(&t->DhcpDnsServerAddress2, IpGet(hWnd, E_DNS2));
  574. GetTxtA(hWnd, E_DOMAIN, t->DhcpDomainName, sizeof(t->DhcpDomainName));
  575. t->SaveLog = IsChecked(hWnd, R_SAVE_LOG);
  576. }
  577. // Initialize
  578. void NmEditVhOptionInit(HWND hWnd, SM_HUB *r)
  579. {
  580. char tmp[MAX_SIZE];
  581. VH_OPTION t;
  582. // Validate arguments
  583. if (hWnd == NULL || r == NULL)
  584. {
  585. return;
  586. }
  587. SetIcon(hWnd, 0, ICO_ROUTER);
  588. FormatText(hWnd, S_TITLE, r->HubName);
  589. Zero(&t, sizeof(VH_OPTION));
  590. StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
  591. if (CALL(hWnd, ScGetSecureNATOption(r->Rpc, &t)) == false)
  592. {
  593. EndDialog(hWnd, false);
  594. return;
  595. }
  596. if (GetCapsBool(r->p->CapsList, "b_virtual_nat_disabled"))
  597. {
  598. SetEnable(hWnd, R_USE_NAT, false);
  599. Check(hWnd, R_USE_NAT, false);
  600. }
  601. MacToStr(tmp, sizeof(tmp), t.MacAddress);
  602. SetTextA(hWnd, E_MAC, tmp);
  603. IpSet(hWnd, E_IP, IPToUINT(&t.Ip));
  604. IpSet(hWnd, E_MASK, IPToUINT(&t.Mask));
  605. Check(hWnd, R_USE_NAT, t.UseNat);
  606. SetIntEx(hWnd, E_MTU, t.Mtu);
  607. SetIntEx(hWnd, E_TCP, t.NatTcpTimeout);
  608. SetIntEx(hWnd, E_UDP, t.NatUdpTimeout);
  609. Check(hWnd, R_USE_DHCP, t.UseDhcp);
  610. IpSet(hWnd, E_DHCP_START, IPToUINT(&t.DhcpLeaseIPStart));
  611. IpSet(hWnd, E_DHCP_END, IPToUINT(&t.DhcpLeaseIPEnd));
  612. IpSet(hWnd, E_DHCP_MASK, IPToUINT(&t.DhcpSubnetMask));
  613. SetIntEx(hWnd, E_EXPIRES, t.DhcpExpireTimeSpan);
  614. if (IPToUINT(&t.DhcpGatewayAddress) != 0)
  615. {
  616. IpSet(hWnd, E_GATEWAY, IPToUINT(&t.DhcpGatewayAddress));
  617. }
  618. if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
  619. {
  620. IpSet(hWnd, E_DNS, IPToUINT(&t.DhcpDnsServerAddress));
  621. }
  622. if (IPToUINT(&t.DhcpDnsServerAddress2) != 0)
  623. {
  624. IpSet(hWnd, E_DNS2, IPToUINT(&t.DhcpDnsServerAddress2));
  625. }
  626. SetTextA(hWnd, E_DOMAIN, t.DhcpDomainName);
  627. Check(hWnd, R_SAVE_LOG, t.SaveLog);
  628. StrCpy(r->CurrentPushRouteStr, sizeof(r->CurrentPushRouteStr), t.DhcpPushRoutes);
  629. if (GetCapsBool(r->p->CapsList, "b_suppport_push_route_config") == false)
  630. {
  631. Disable(hWnd, S_1);
  632. Disable(hWnd, S_2);
  633. Disable(hWnd, B_PUSH);
  634. }
  635. NmEditVhOptionUpdate(hWnd, r);
  636. }
  637. void NmEditVhOptionUpdate(HWND hWnd, SM_HUB *r)
  638. {
  639. VH_OPTION t;
  640. bool ok = true;
  641. // Validate arguments
  642. if (hWnd == NULL || r == NULL)
  643. {
  644. return;
  645. }
  646. NmEditVhOptionFormToVH(hWnd, &t);
  647. if (IsZero(t.MacAddress, 6))
  648. {
  649. ok = false;
  650. }
  651. if (IPToUINT(&t.Ip) == 0 || IPToUINT(&t.Mask) == 0)
  652. {
  653. ok = false;
  654. }
  655. if (IpIsFilled(hWnd, E_IP) == false || IpIsFilled(hWnd, E_MASK) == false)
  656. {
  657. ok = false;
  658. }
  659. if (IsHostIPAddress4(&t.Ip) == false || IsSubnetMask4(&t.Mask) == false)
  660. {
  661. ok = false;
  662. }
  663. if (t.UseNat)
  664. {
  665. if (t.Mtu < 64 || t.Mtu > 1500)
  666. {
  667. ok = false;
  668. }
  669. if (t.NatTcpTimeout < (NAT_TCP_MIN_TIMEOUT / 1000) || t.NatTcpTimeout > (NAT_TCP_MAX_TIMEOUT / 1000))
  670. {
  671. ok = false;
  672. }
  673. if (t.NatUdpTimeout < (NAT_UDP_MIN_TIMEOUT / 1000) || t.NatUdpTimeout > (NAT_UDP_MAX_TIMEOUT / 1000))
  674. {
  675. ok = false;
  676. }
  677. }
  678. if (t.UseDhcp)
  679. {
  680. if (IpIsFilled(hWnd, E_DHCP_START) == false || IpIsFilled(hWnd, E_DHCP_END) == false ||
  681. IpIsFilled(hWnd, E_DHCP_MASK) == false)
  682. {
  683. ok = false;
  684. }
  685. if (IpGetFilledNum(hWnd, E_GATEWAY) != 0 && IpGetFilledNum(hWnd, E_GATEWAY) != 4)
  686. {
  687. ok = false;
  688. }
  689. if (IpGetFilledNum(hWnd, E_DNS) != 0 && IpGetFilledNum(hWnd, E_DNS) != 4)
  690. {
  691. ok = false;
  692. }
  693. if (IpGetFilledNum(hWnd, E_DNS2) != 0 && IpGetFilledNum(hWnd, E_DNS2) != 4)
  694. {
  695. ok = false;
  696. }
  697. if (IPToUINT(&t.DhcpLeaseIPStart) == 0 || IPToUINT(&t.DhcpLeaseIPEnd) == 0 ||
  698. IPToUINT(&t.DhcpSubnetMask) == 0)
  699. {
  700. ok = false;
  701. }
  702. if (t.DhcpExpireTimeSpan < 15)
  703. {
  704. ok = false;
  705. }
  706. if (Endian32(IPToUINT(&t.DhcpLeaseIPStart)) > Endian32(IPToUINT(&t.DhcpLeaseIPEnd)))
  707. {
  708. ok = false;
  709. }
  710. if (IsHostIPAddress4(&t.DhcpLeaseIPStart) == false ||
  711. IsHostIPAddress4(&t.DhcpLeaseIPEnd) == false)
  712. {
  713. ok = false;
  714. }
  715. if (IsSubnetMask4(&t.DhcpSubnetMask) == false)
  716. {
  717. ok = false;
  718. }
  719. }
  720. SetEnable(hWnd, E_MTU, t.UseNat);
  721. SetEnable(hWnd, E_TCP, t.UseNat);
  722. SetEnable(hWnd, E_UDP, t.UseNat);
  723. SetEnable(hWnd, E_DHCP_START, t.UseDhcp);
  724. SetEnable(hWnd, E_DHCP_END, t.UseDhcp);
  725. SetEnable(hWnd, E_DHCP_MASK, t.UseDhcp);
  726. SetEnable(hWnd, E_EXPIRES, t.UseDhcp);
  727. SetEnable(hWnd, E_GATEWAY, t.UseDhcp);
  728. SetEnable(hWnd, E_DNS, t.UseDhcp);
  729. SetEnable(hWnd, E_DNS2, t.UseDhcp);
  730. SetEnable(hWnd, E_DOMAIN, t.UseDhcp);
  731. SetEnable(hWnd, IDOK, ok);
  732. }
  733. // [OK] button
  734. void NmEditVhOptionOnOk(HWND hWnd, SM_HUB *r)
  735. {
  736. VH_OPTION t;
  737. // Validate arguments
  738. if (hWnd == NULL || r == NULL)
  739. {
  740. return;
  741. }
  742. NmEditVhOptionFormToVH(hWnd, &t);
  743. StrCpy(t.HubName, sizeof(t.HubName), r->HubName);
  744. t.ApplyDhcpPushRoutes = true;
  745. StrCpy(t.DhcpPushRoutes, sizeof(t.DhcpPushRoutes), r->CurrentPushRouteStr);
  746. if (CALL(hWnd, ScSetSecureNATOption(r->Rpc, &t)))
  747. {
  748. EndDialog(hWnd, true);
  749. }
  750. }
  751. // Virtual host options editing dialog
  752. UINT NmEditVhOptionProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  753. {
  754. SM_HUB *r = (SM_HUB *)param;
  755. // Validate arguments
  756. if (hWnd == NULL)
  757. {
  758. return 0;
  759. }
  760. switch (msg)
  761. {
  762. case WM_INITDIALOG:
  763. NmEditVhOptionInit(hWnd, r);
  764. break;
  765. case WM_COMMAND:
  766. switch (LOWORD(wParam))
  767. {
  768. case E_MAC:
  769. case E_IP:
  770. case E_MASK:
  771. case R_USE_NAT:
  772. case E_MTU:
  773. case E_TCP:
  774. case E_UDP:
  775. case R_SAVE_LOG:
  776. case R_USE_DHCP:
  777. case E_DHCP_START:
  778. case E_DHCP_END:
  779. case E_DHCP_MASK:
  780. case E_EXPIRES:
  781. case E_GATEWAY:
  782. case E_DNS:
  783. case E_DNS2:
  784. case E_DOMAIN:
  785. NmEditVhOptionUpdate(hWnd, r);
  786. break;
  787. }
  788. switch (wParam)
  789. {
  790. case IDOK:
  791. NmEditVhOptionOnOk(hWnd, r);
  792. break;
  793. case IDCANCEL:
  794. EndDialog(hWnd, false);
  795. break;
  796. case R_USE_NAT:
  797. if (IsChecked(hWnd, R_USE_NAT))
  798. {
  799. FocusEx(hWnd, E_MTU);
  800. }
  801. if (IsChecked(hWnd, R_USE_DHCP))
  802. {
  803. Focus(hWnd, E_DHCP_START);
  804. }
  805. break;
  806. case B_PUSH:
  807. NmEditPushRoute(hWnd, r);
  808. break;
  809. }
  810. break;
  811. }
  812. return 0;
  813. }
  814. // Edit the virtual host option
  815. void NmEditVhOption(HWND hWnd, SM_HUB *r)
  816. {
  817. // Validate arguments
  818. if (hWnd == NULL || r == NULL)
  819. {
  820. return;
  821. }
  822. Zero(r->CurrentPushRouteStr, sizeof(r->CurrentPushRouteStr));
  823. Dialog(hWnd, D_NM_OPTION, NmEditVhOptionProc, r);
  824. }
  825. // Edit the client configuration
  826. void NmEditClientConfig(HWND hWnd, RPC *r)
  827. {
  828. CM_ACCOUNT a;
  829. RPC_CREATE_LINK t;
  830. bool ret = false;
  831. // Validate arguments
  832. if (hWnd == NULL || r == NULL)
  833. {
  834. return;
  835. }
  836. Zero(&a, sizeof(a));
  837. Zero(&t, sizeof(t));
  838. a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
  839. a.NatMode = true;
  840. a.Rpc = r;
  841. if (CALLEX(hWnd, NcGetClientConfig(r, &t)) != ERR_NO_ERROR)
  842. {
  843. // Create New
  844. a.ClientOption->Port = 443;
  845. a.ClientOption->RetryInterval = 15;
  846. a.ClientOption->NumRetry = INFINITE;
  847. a.ClientOption->AdditionalConnectionInterval = 1;
  848. a.ClientOption->UseEncrypt = true;
  849. a.ClientOption->NoRoutingTracking = true;
  850. a.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
  851. a.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
  852. }
  853. else
  854. {
  855. // Edit
  856. a.EditMode = true;
  857. Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION));
  858. a.ClientAuth = CopyClientAuth(t.ClientAuth);
  859. FreeRpcCreateLink(&t);
  860. }
  861. ret = CmEditAccountDlg(hWnd, &a);
  862. Free(a.ServerCert);
  863. Free(a.ClientOption);
  864. CiFreeClientAuth(a.ClientAuth);
  865. }
  866. // Initialize
  867. void NmMainDlgInit(HWND hWnd, RPC *r)
  868. {
  869. // Validate arguments
  870. if (r == NULL || hWnd == NULL)
  871. {
  872. return;
  873. }
  874. SetIcon(hWnd, 0, ICO_ROUTER);
  875. FormatText(hWnd, 0, r->Sock->RemoteHostname);
  876. DlgFont(hWnd, S_STATUS, 11, true);
  877. NmMainDlgRefresh(hWnd, r);
  878. }
  879. // Update
  880. void NmMainDlgRefresh(HWND hWnd, RPC *r)
  881. {
  882. #if 0
  883. RPC_NAT_STATUS t;
  884. wchar_t tmp[MAX_SIZE];
  885. wchar_t tmp2[MAX_SIZE];
  886. // Validate arguments
  887. if (r == NULL || hWnd == NULL)
  888. {
  889. return;
  890. }
  891. Zero(&t, sizeof(RPC_NAT_STATUS));
  892. CALL(hWnd, NcGetStatus(r, &t));
  893. if (t.Online == false)
  894. {
  895. UniStrCpy(tmp, sizeof(tmp), _UU("NM_OFFLINE"));
  896. Enable(hWnd, B_CONNECT);
  897. Disable(hWnd, B_DISCONNECT);
  898. }
  899. else
  900. {
  901. if (t.Connected)
  902. {
  903. UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECTED"), t.Status.ServerName);
  904. }
  905. else
  906. {
  907. if (t.LastError == ERR_NO_ERROR)
  908. {
  909. UniStrCpy(tmp, sizeof(tmp), _UU("NM_CONNECTING"));
  910. }
  911. else
  912. {
  913. UniFormat(tmp, sizeof(tmp), _UU("NM_CONNECT_ERROR"), t.LastError, _E(t.LastError));
  914. }
  915. }
  916. Disable(hWnd, B_CONNECT);
  917. Enable(hWnd, B_DISCONNECT);
  918. }
  919. UniFormat(tmp2, sizeof(tmp2), _UU("NM_STATUS_TAG"), tmp);
  920. SetText(hWnd, S_STATUS, tmp2);
  921. FreeRpcNatStatus(&t);
  922. #endif
  923. }
  924. // Main dialog procedure
  925. UINT NmMainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  926. {
  927. #if 0
  928. SM_HUB *r = (SM_HUB *)param;
  929. RPC_DUMMY dummy;
  930. SM_SERVER sm;
  931. // Validate arguments
  932. if (hWnd == NULL)
  933. {
  934. return 0;
  935. }
  936. switch (msg)
  937. {
  938. case WM_INITDIALOG:
  939. NmMainDlgInit(hWnd, r);
  940. SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
  941. break;
  942. case WM_COMMAND:
  943. switch (wParam)
  944. {
  945. case B_SETTING:
  946. // Connection setting
  947. NmEditClientConfig(hWnd, r);
  948. break;
  949. case B_CONNECT:
  950. // Connection
  951. Zero(&dummy, sizeof(dummy));
  952. CALL(hWnd, NcOnline(r, &dummy));
  953. NmMainDlgRefresh(hWnd, r);
  954. break;
  955. case B_DISCONNECT:
  956. // Disconnect
  957. Zero(&dummy, sizeof(dummy));
  958. CALL(hWnd, NcOffline(r, &dummy));
  959. NmMainDlgRefresh(hWnd, r);
  960. break;
  961. case B_OPTION:
  962. // Operation setting
  963. NmEditVhOption(hWnd, r->Rpc);
  964. break;
  965. case B_NAT:
  966. // NAT
  967. NmNat(hWnd, r);
  968. break;
  969. case B_DHCP:
  970. // DHCP
  971. NmDhcp(hWnd, r);
  972. break;
  973. case B_STATUS:
  974. // Status
  975. Zero(&sm, sizeof(sm));
  976. sm.Rpc = r;
  977. SmStatusDlg(hWnd, &sm, NULL, true, true, _UU("NM_STATUS"), ICO_ROUTER,
  978. NULL, NmStatus);
  979. break;
  980. case B_INFO:
  981. // Information
  982. Zero(&sm, sizeof(sm));
  983. sm.Rpc = r;
  984. SmStatusDlg(hWnd, &sm, NULL, false, true, _UU("NM_INFO"), ICO_ROUTER,
  985. NULL, NmInfo);
  986. break;
  987. case B_REFRESH:
  988. // Refresh
  989. NmMainDlgRefresh(hWnd, r);
  990. break;
  991. case B_PASSWORD:
  992. // Change the password
  993. NmChangePassword(hWnd, r);
  994. break;
  995. case B_ABOUT:
  996. // Version information
  997. About(hWnd, nm->Cedar, CEDAR_ROUTER_STR);
  998. break;
  999. case IDCANCEL:
  1000. Close(hWnd);
  1001. break;
  1002. }
  1003. break;
  1004. case WM_TIMER:
  1005. switch (wParam)
  1006. {
  1007. case 1:
  1008. KillTimer(hWnd, 1);
  1009. if (IsEnable(hWnd, 0))
  1010. {
  1011. NmMainDlgRefresh(hWnd, r);
  1012. }
  1013. SetTimer(hWnd, 1, NM_REFRESH_TIME, NULL);
  1014. break;
  1015. }
  1016. break;
  1017. case WM_CLOSE:
  1018. EndDialog(hWnd, false);
  1019. break;
  1020. }
  1021. #endif
  1022. return 0;
  1023. }
  1024. // Main dialog
  1025. void NmMainDlg(RPC *r)
  1026. {
  1027. // Validate arguments
  1028. if (r == NULL)
  1029. {
  1030. return;
  1031. }
  1032. Dialog(NULL, D_NM_MAIN, NmMainDlgProc, r);
  1033. }
  1034. // Login dialog
  1035. UINT NmLogin(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  1036. {
  1037. NM_LOGIN *login = (NM_LOGIN *)param;
  1038. char tmp[MAX_SIZE];
  1039. // Validate arguments
  1040. if (hWnd == NULL)
  1041. {
  1042. return 0;
  1043. }
  1044. switch (msg)
  1045. {
  1046. case WM_INITDIALOG:
  1047. FormatText(hWnd, S_TITLE, login->Hostname);
  1048. break;
  1049. case WM_COMMAND:
  1050. switch (wParam)
  1051. {
  1052. case IDOK:
  1053. GetTxtA(hWnd, E_PASSWORD, tmp, sizeof(tmp));
  1054. Sha0(login->hashed_password, tmp, StrLen(tmp));
  1055. EndDialog(hWnd, true);
  1056. break;
  1057. case IDCANCEL:
  1058. Close(hWnd);
  1059. break;
  1060. }
  1061. break;
  1062. case WM_CLOSE:
  1063. EndDialog(hWnd, false);
  1064. break;
  1065. }
  1066. return 0;
  1067. }
  1068. // Connecting dialog
  1069. UINT NmConnectDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, void *param)
  1070. {
  1071. NM_CONNECT *t = (NM_CONNECT *)param;
  1072. RPC *rpc;
  1073. NM_LOGIN login;
  1074. UINT err;
  1075. // Validate arguments
  1076. if (hWnd == NULL)
  1077. {
  1078. return 0;
  1079. }
  1080. switch (msg)
  1081. {
  1082. case WM_INITDIALOG:
  1083. FormatText(hWnd, S_TITLE, t->Hostname);
  1084. SetTimer(hWnd, 1, 50, NULL);
  1085. break;
  1086. case WM_TIMER:
  1087. switch (wParam)
  1088. {
  1089. case 1:
  1090. KillTimer(hWnd, 1);
  1091. while (true)
  1092. {
  1093. bool flag = false;
  1094. RETRY_PASSWORD:
  1095. // Password input dialog
  1096. Zero(&login, sizeof(login));
  1097. login.Hostname = t->Hostname;
  1098. login.Port = t->Port;
  1099. Sha0(login.hashed_password, "", 0);
  1100. if (flag)
  1101. {
  1102. if (Dialog(hWnd, D_NM_LOGIN, NmLogin, &login) == false)
  1103. {
  1104. EndDialog(hWnd, false);
  1105. break;
  1106. }
  1107. }
  1108. RETRY_CONNECT:
  1109. Refresh(DlgItem(hWnd, S_TITLE));
  1110. Refresh(hWnd);
  1111. // Connection
  1112. rpc = NatAdminConnect(nm->Cedar, t->Hostname, t->Port, login.hashed_password, &err);
  1113. if (rpc != NULL)
  1114. {
  1115. t->Rpc = rpc;
  1116. EndDialog(hWnd, true);
  1117. break;
  1118. }
  1119. // Error
  1120. if (err == ERR_ACCESS_DENIED || err == ERR_AUTH_FAILED)
  1121. {
  1122. if (flag)
  1123. {
  1124. if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
  1125. _E(err)) == IDCANCEL)
  1126. {
  1127. EndDialog(hWnd, false);
  1128. break;
  1129. }
  1130. }
  1131. flag = true;
  1132. goto RETRY_PASSWORD;
  1133. }
  1134. else
  1135. {
  1136. if (MsgBox(hWnd, MB_ICONEXCLAMATION | MB_RETRYCANCEL,
  1137. _E(err)) == IDCANCEL)
  1138. {
  1139. EndDialog(hWnd, false);
  1140. break;
  1141. }
  1142. goto RETRY_CONNECT;
  1143. }
  1144. }
  1145. break;
  1146. }
  1147. break;
  1148. }
  1149. return 0;
  1150. }
  1151. // Connect to the User-mode NAT program
  1152. RPC *NmConnect(char *hostname, UINT port)
  1153. {
  1154. NM_CONNECT t;
  1155. // Validate arguments
  1156. if (hostname == NULL || port == 0)
  1157. {
  1158. return NULL;
  1159. }
  1160. Zero(&t, sizeof(t));
  1161. t.Hostname = hostname;
  1162. t.Port = port;
  1163. Dialog(NULL, D_NM_CONNECT, NmConnectDlgProc, &t);
  1164. return t.Rpc;
  1165. }
  1166. // Main process
  1167. void MainNM()
  1168. {
  1169. UINT port;
  1170. char hostname[MAX_HOST_NAME_LEN + 1];
  1171. char *tmp =
  1172. RemoteDlg(NULL, NM_SETTING_REG_KEY, ICO_ROUTER,
  1173. _UU("NM_TITLE"), _UU("NM_CONNECT_TITLE"), NULL);
  1174. TOKEN_LIST *t;
  1175. Zero(hostname, sizeof(hostname));
  1176. if (tmp == NULL)
  1177. {
  1178. return;
  1179. }
  1180. t = ParseToken(tmp, ":");
  1181. port = DEFAULT_NAT_ADMIN_PORT;
  1182. if (t->NumTokens >= 2)
  1183. {
  1184. UINT i = ToInt(t->Token[1]);
  1185. if (i != 0)
  1186. {
  1187. port = i;
  1188. }
  1189. }
  1190. if (t->NumTokens >= 1)
  1191. {
  1192. RPC *rpc;
  1193. StrCpy(hostname, sizeof(hostname), t->Token[0]);
  1194. // Connection
  1195. Trim(hostname);
  1196. if (StrLen(hostname) != 0)
  1197. {
  1198. rpc = NmConnect(hostname, port);
  1199. if (rpc != NULL)
  1200. {
  1201. // Connected
  1202. NmMainDlg(rpc);
  1203. NatAdminDisconnect(rpc);
  1204. }
  1205. }
  1206. }
  1207. FreeToken(t);
  1208. Free(tmp);
  1209. }
  1210. // Initialize
  1211. void InitNM()
  1212. {
  1213. if (nm != NULL)
  1214. {
  1215. // Already initialized
  1216. return;
  1217. }
  1218. nm = ZeroMalloc(sizeof(NM));
  1219. InitWinUi(_UU("NM_TITLE"), _SS("DEFAULT_FONT"), _II("DEFAULT_FONT_SIZE"));
  1220. nm->Cedar = NewCedar(NULL, NULL);
  1221. InitCM(false);
  1222. InitSM();
  1223. }
  1224. // Release
  1225. void FreeNM()
  1226. {
  1227. if (nm == NULL)
  1228. {
  1229. // Uninitialized
  1230. return;
  1231. }
  1232. FreeSM();
  1233. FreeCM();
  1234. ReleaseCedar(nm->Cedar);
  1235. FreeWinUi();
  1236. Free(nm);
  1237. nm = NULL;
  1238. }
  1239. // Execution of NM
  1240. void NMExec()
  1241. {
  1242. InitNM();
  1243. MainNM();
  1244. FreeNM();
  1245. }
  1246. #endif