1 // SoftEther UT-VPN SourceCode
\r
3 // Copyright (C) 2004-2010 SoftEther Corporation.
\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.
\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.
\r
6 // All Rights Reserved.
\r
8 // http://utvpn.tsukuba.ac.jp/
\r
10 // This program is free software; you can redistribute it and/or
\r
11 // modify it under the terms of the GNU General Public License
\r
12 // version 2 as published by the Free Software Foundation.
\r
14 // This program is distributed in the hope that it will be useful,
\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 // GNU General Public License for more details.
\r
19 // You should have received a copy of the GNU General Public License version 2
\r
20 // along with this program; if not, write to the Free Software
\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。
\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布
\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示
\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の
\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。
\r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の
\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )
\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって
\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、
\r
34 // および、試験または研究のために利用が行われることを想定して配布
\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に
\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード
\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して
\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して
\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース
\r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する
\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。
\r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社
\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。
\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの
\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意
\r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の
\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、
\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの
\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社
\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、
\r
58 // 公益保護にご協力いただきますようお願い申し上げます。
\r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を
\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客
\r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/
\r
65 // 日本国内の脆弱性情報届出受付公的機関:
\r
67 // http://www.ipa.go.jp/security/vuln/report/
\r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。
\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/
\r
72 // -----------------------------------------------
\r
75 // 新規リリース by SoftEther
\r
76 // -----------------------------------------------
\r
81 #include "CedarPch.h"
\r
83 static LOCK *nat_lock = NULL;
\r
84 static NAT *nat = NULL;
\r
88 void NatAdminDisconnect(RPC *r)
\r
100 RPC *NatAdminConnect(CEDAR *cedar, char *hostname, UINT port, void *hashed_password, UINT *err)
\r
102 UCHAR secure_password[SHA1_SIZE];
\r
103 UCHAR random[SHA1_SIZE];
\r
109 if (cedar == NULL || hostname == NULL || port == 0 || hashed_password == NULL || err == NULL)
\r
113 *err = ERR_INTERNAL_ERROR;
\r
119 sock = Connect(hostname, port);
\r
122 *err = ERR_CONNECT_FAILED;
\r
126 if (StartSSL(sock, NULL, NULL) == false)
\r
128 *err = ERR_PROTOCOL_ERROR;
\r
133 SetTimeout(sock, 5000);
\r
135 p = HttpClientRecv(sock);
\r
138 *err = ERR_DISCONNECTED;
\r
143 if (PackGetData2(p, "auth_random", random, SHA1_SIZE) == false)
\r
146 *err = ERR_PROTOCOL_ERROR;
\r
153 SecurePassword(secure_password, hashed_password, random);
\r
156 PackAddData(p, "secure_password", secure_password, SHA1_SIZE);
\r
158 if (HttpClientSend(sock, p) == false)
\r
161 *err = ERR_DISCONNECTED;
\r
168 p = HttpClientRecv(sock);
\r
171 *err = ERR_DISCONNECTED;
\r
176 error = GetErrorFromPack(p);
\r
180 if (error != ERR_NO_ERROR)
\r
187 SetTimeout(sock, TIMEOUT_INFINITE);
\r
189 rpc = StartRpcClient(sock, NULL);
\r
196 #define DECLARE_RPC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
\r
197 else if (StrCmpi(name, rpc_name) == 0) \
\r
200 Zero(&t, sizeof(t)); \
\r
202 err = function(n, &t); \
\r
203 if (err == ERR_NO_ERROR) \
\r
205 out_rpc(ret, &t); \
\r
210 #define DECLARE_RPC(rpc_name, data_type, function, in_rpc, out_rpc) \
\r
211 else if (StrCmpi(name, rpc_name) == 0) \
\r
214 Zero(&t, sizeof(t)); \
\r
216 err = function(n, &t); \
\r
217 if (err == ERR_NO_ERROR) \
\r
219 out_rpc(ret, &t); \
\r
223 #define DECLARE_SC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
\r
224 UINT function(RPC *r, data_type *t) \
\r
228 if (r == NULL || t == NULL) \
\r
230 return ERR_INTERNAL_ERROR; \
\r
235 Zero(t, sizeof(data_type)); \
\r
236 ret = AdminCall(r, rpc_name, p); \
\r
237 err = GetErrorFromPack(ret); \
\r
238 if (err == ERR_NO_ERROR) \
\r
245 #define DECLARE_SC(rpc_name, data_type, function, in_rpc, out_rpc) \
\r
246 UINT function(RPC *r, data_type *t) \
\r
250 if (r == NULL || t == NULL) \
\r
252 return ERR_INTERNAL_ERROR; \
\r
256 ret = AdminCall(r, rpc_name, p); \
\r
257 err = GetErrorFromPack(ret); \
\r
258 if (err == ERR_NO_ERROR) \
\r
267 PACK *NiRpcServer(RPC *r, char *name, PACK *p)
\r
269 NAT *n = (NAT *)r->Param;
\r
274 if (r == NULL || name == NULL || p == NULL)
\r
280 err = ERR_NO_ERROR;
\r
287 // DECLARE_RPC("Online", RPC_DUMMY, NtOnline, InRpcDummy, OutRpcDummy)
\r
288 // DECLARE_RPC("Offline", RPC_DUMMY, NtOffline, InRpcDummy, OutRpcDummy)
\r
289 DECLARE_RPC("SetHostOption", VH_OPTION, NtSetHostOption, InVhOption, OutVhOption)
\r
290 DECLARE_RPC("GetHostOption", VH_OPTION, NtGetHostOption, InVhOption, OutVhOption)
\r
291 // DECLARE_RPC_EX("SetClientConfig", RPC_CREATE_LINK, NtSetClientConfig, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
\r
292 // DECLARE_RPC_EX("GetClientConfig", RPC_CREATE_LINK, NtGetClientConfig, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
\r
293 DECLARE_RPC_EX("GetStatus", RPC_NAT_STATUS, NtGetStatus, InRpcNatStatus, OutRpcNatStatus, FreeRpcNatStatus)
\r
294 // DECLARE_RPC_EX("GetInfo", RPC_NAT_INFO, NtGetInfo, InRpcNatInfo, OutRpcNatInfo, FreeRpcNatInfo)
\r
295 DECLARE_RPC_EX("EnumNatList", RPC_ENUM_NAT, NtEnumNatList, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
\r
296 DECLARE_RPC_EX("EnumDhcpList", RPC_ENUM_DHCP, NtEnumDhcpList, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
\r
297 // DECLARE_RPC("SetPassword", RPC_SET_PASSWORD, NtSetPassword, InRpcSetPassword, OutRpcSetPassword)
\r
303 err = ERR_NOT_SUPPORTED;
\r
306 PackAddInt(ret, "error", err);
\r
316 DECLARE_SC("Online", RPC_DUMMY, NcOnline, InRpcDummy, OutRpcDummy)
\r
317 DECLARE_SC("Offline", RPC_DUMMY, NcOffline, InRpcDummy, OutRpcDummy)
\r
318 DECLARE_SC("SetHostOption", VH_OPTION, NcSetHostOption, InVhOption, OutVhOption)
\r
319 DECLARE_SC("GetHostOption", VH_OPTION, NcGetHostOption, InVhOption, OutVhOption)
\r
320 DECLARE_SC_EX("SetClientConfig", RPC_CREATE_LINK, NcSetClientConfig, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
\r
321 DECLARE_SC_EX("GetClientConfig", RPC_CREATE_LINK, NcGetClientConfig, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
\r
322 DECLARE_SC_EX("GetStatus", RPC_NAT_STATUS, NcGetStatus, InRpcNatStatus, OutRpcNatStatus, FreeRpcNatStatus)
\r
323 DECLARE_SC_EX("GetInfo", RPC_NAT_INFO, NcGetInfo, InRpcNatInfo, OutRpcNatInfo, FreeRpcNatInfo)
\r
324 DECLARE_SC_EX("EnumNatList", RPC_ENUM_NAT, NcEnumNatList, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
\r
325 DECLARE_SC_EX("EnumDhcpList", RPC_ENUM_DHCP, NcEnumDhcpList, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
\r
326 DECLARE_SC("SetPassword", RPC_SET_PASSWORD, NcSetPassword, InRpcSetPassword, OutRpcSetPassword)
\r
333 UINT NtSetPassword(NAT *n, RPC_SET_PASSWORD *t)
\r
335 Copy(n->HashedPassword, t->HashedPassword, SHA1_SIZE);
\r
339 return ERR_NO_ERROR;
\r
343 UINT NtOnline(NAT *n, RPC_DUMMY *t)
\r
345 UINT ret = ERR_NO_ERROR;
\r
352 ret = ERR_ALREADY_ONLINE;
\r
356 if (n->ClientOption == NULL || n->ClientAuth == NULL)
\r
359 ret = ERR_ACCOUNT_NOT_PRESENT;
\r
367 n->Virtual = NewVirtualHostEx(n->Cedar, n->ClientOption, n->ClientAuth,
\r
380 UINT NtOffline(NAT *n, RPC_DUMMY *t)
\r
382 UINT ret = ERR_NO_ERROR;
\r
386 if (n->Online == false)
\r
394 StopVirtualHost(n->Virtual);
\r
395 ReleaseVirtual(n->Virtual);
\r
409 UINT NtSetHostOption(NAT *n, VH_OPTION *t)
\r
411 UINT ret = ERR_NO_ERROR;
\r
415 Copy(&n->Option, t, sizeof(VH_OPTION));
\r
419 SetVirtualHostOption(n->Virtual, t);
\r
427 UINT NtGetHostOption(NAT *n, VH_OPTION *t)
\r
429 UINT ret = ERR_NO_ERROR;
\r
433 Copy(t, &n->Option, sizeof(VH_OPTION));
\r
441 UINT NtSetClientConfig(NAT *n, RPC_CREATE_LINK *t)
\r
445 if (n->ClientOption != NULL || n->ClientAuth != NULL)
\r
447 Free(n->ClientOption);
\r
448 CiFreeClientAuth(n->ClientAuth);
\r
451 n->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
452 Copy(n->ClientOption, t->ClientOption, sizeof(CLIENT_OPTION));
\r
453 n->ClientAuth = CopyClientAuth(t->ClientAuth);
\r
461 NtOffline(n, NULL);
\r
465 return ERR_NO_ERROR;
\r
469 UINT NtGetClientConfig(NAT *n, RPC_CREATE_LINK *t)
\r
471 UINT err = ERR_NO_ERROR;
\r
475 if (n->ClientOption == NULL || n->ClientAuth == NULL)
\r
477 err = ERR_ACCOUNT_NOT_PRESENT;
\r
481 FreeRpcCreateLink(t);
\r
483 Zero(t, sizeof(RPC_CREATE_LINK));
\r
484 t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
\r
485 Copy(t->ClientOption, n->ClientOption, sizeof(CLIENT_OPTION));
\r
486 t->ClientAuth = CopyClientAuth(n->ClientAuth);
\r
495 UINT NtGetStatus(NAT *n, RPC_NAT_STATUS *t)
\r
499 VH *v = n->Virtual;
\r
500 FreeRpcNatStatus(t);
\r
501 Zero(t, sizeof(RPC_NAT_STATUS));
\r
507 LockList(v->NatTable);
\r
509 for (i = 0;i < LIST_NUM(v->NatTable);i++)
\r
511 NAT_ENTRY *e = LIST_DATA(v->NatTable, i);
\r
513 switch (e->Protocol)
\r
516 t->NumTcpSessions++;
\r
520 t->NumUdpSessions++;
\r
525 UnlockList(v->NatTable);
\r
527 t->NumDhcpClients = LIST_NUM(v->DhcpLeaseList);
\r
533 return ERR_NO_ERROR;
\r
537 UINT NtGetInfo(NAT *n, RPC_NAT_INFO *t)
\r
541 Zero(t, sizeof(RPC_NAT_INFO));
\r
543 StrCpy(t->NatProductName, sizeof(t->NatProductName), CEDAR_ROUTER_STR);
\r
544 StrCpy(t->NatVersionString, sizeof(t->NatVersionString), n->Cedar->VerString);
\r
545 StrCpy(t->NatBuildInfoString, sizeof(t->NatBuildInfoString), n->Cedar->BuildInfo);
\r
546 t->NatVerInt = n->Cedar->Build;
\r
547 t->NatBuildInt = n->Cedar->Build;
\r
549 GetMachineName(t->NatHostName, sizeof(t->NatHostName));
\r
551 info = GetOsInfo();
\r
553 CopyOsInfo(&t->OsInfo, info);
\r
555 GetMemInfo(&t->MemInfo);
\r
557 return ERR_NO_ERROR;
\r
561 UINT NtEnumNatList(NAT *n, RPC_ENUM_NAT *t)
\r
563 UINT ret = ERR_NO_ERROR;
\r
570 if (n->Online == false || v == NULL)
\r
578 if (v->Active == false)
\r
585 Zero(t, sizeof(RPC_ENUM_NAT));
\r
587 LockList(v->NatTable);
\r
590 t->NumItem = LIST_NUM(v->NatTable);
\r
591 t->Items = ZeroMalloc(sizeof(RPC_ENUM_NAT_ITEM) * t->NumItem);
\r
593 for (i = 0;i < t->NumItem;i++)
\r
595 NAT_ENTRY *nat = LIST_DATA(v->NatTable, i);
\r
596 RPC_ENUM_NAT_ITEM *e = &t->Items[i];
\r
599 e->Protocol = nat->Protocol;
\r
600 e->SrcIp = nat->SrcIp;
\r
601 e->DestIp = nat->DestIp;
\r
602 e->SrcPort = nat->SrcPort;
\r
603 e->DestPort = nat->DestPort;
\r
605 e->CreatedTime = TickToTime(nat->CreatedTime);
\r
606 e->LastCommTime = TickToTime(nat->LastCommTime);
\r
608 IPToStr32(e->SrcHost, sizeof(e->SrcHost), e->SrcIp);
\r
609 IPToStr32(e->DestHost, sizeof(e->DestHost), e->DestIp);
\r
611 if (nat->Sock != NULL)
\r
613 e->SendSize = nat->Sock->SendSize;
\r
614 e->RecvSize = nat->Sock->RecvSize;
\r
616 if (nat->Sock->Type == SOCK_TCP)
\r
618 StrCpy(e->DestHost, sizeof(e->DestHost), nat->Sock->RemoteHostname);
\r
622 e->TcpStatus = nat->TcpStatus;
\r
625 UnlockList(v->NatTable);
\r
636 UINT NtEnumDhcpList(NAT *n, RPC_ENUM_DHCP *t)
\r
638 UINT ret = ERR_NO_ERROR;
\r
645 if (n->Online == false || v == NULL)
\r
653 if (v->Active == false)
\r
659 FreeRpcEnumDhcp(t);
\r
660 Zero(t, sizeof(RPC_ENUM_DHCP));
\r
662 LockList(v->DhcpLeaseList);
\r
665 t->NumItem = LIST_NUM(v->DhcpLeaseList);
\r
666 t->Items = ZeroMalloc(sizeof(RPC_ENUM_DHCP_ITEM) * t->NumItem);
\r
668 for (i = 0;i < t->NumItem;i++)
\r
670 DHCP_LEASE *dhcp = LIST_DATA(v->DhcpLeaseList, i);
\r
671 RPC_ENUM_DHCP_ITEM *e = &t->Items[i];
\r
674 e->LeasedTime = TickToTime(dhcp->LeasedTime);
\r
675 e->ExpireTime = TickToTime(dhcp->ExpireTime);
\r
676 Copy(e->MacAddress, dhcp->MacAddress, 6);
\r
677 e->IpAddress = dhcp->IpAddress;
\r
678 e->Mask = dhcp->Mask;
\r
679 StrCpy(e->Hostname, sizeof(e->Hostname), dhcp->Hostname);
\r
682 UnlockList(v->DhcpLeaseList);
\r
694 void InVhOption(VH_OPTION *t, PACK *p)
\r
697 if (t == NULL || p == NULL)
\r
702 Zero(t, sizeof(VH_OPTION));
\r
703 PackGetData2(p, "MacAddress", t->MacAddress, 6);
\r
704 PackGetIp(p, "Ip", &t->Ip);
\r
705 PackGetIp(p, "Mask", &t->Mask);
\r
706 t->UseNat = PackGetBool(p, "UseNat");
\r
707 t->Mtu = PackGetInt(p, "Mtu");
\r
708 t->NatTcpTimeout = PackGetInt(p, "NatTcpTimeout");
\r
709 t->NatUdpTimeout = PackGetInt(p, "NatUdpTimeout");
\r
710 t->UseDhcp = PackGetBool(p, "UseDhcp");
\r
711 PackGetIp(p, "DhcpLeaseIPStart", &t->DhcpLeaseIPStart);
\r
712 PackGetIp(p, "DhcpLeaseIPEnd", &t->DhcpLeaseIPEnd);
\r
713 PackGetIp(p, "DhcpSubnetMask", &t->DhcpSubnetMask);
\r
714 t->DhcpExpireTimeSpan = PackGetInt(p, "DhcpExpireTimeSpan");
\r
715 PackGetIp(p, "DhcpGatewayAddress", &t->DhcpGatewayAddress);
\r
716 PackGetIp(p, "DhcpDnsServerAddress", &t->DhcpDnsServerAddress);
\r
717 PackGetStr(p, "DhcpDomainName", t->DhcpDomainName, sizeof(t->DhcpDomainName));
\r
718 t->SaveLog = PackGetBool(p, "SaveLog");
\r
719 PackGetStr(p, "RpcHubName", t->HubName, sizeof(t->HubName));
\r
721 void OutVhOption(PACK *p, VH_OPTION *t)
\r
724 if (t == NULL || p == NULL)
\r
729 PackAddData(p, "MacAddress", t->MacAddress, 6);
\r
730 PackAddIp(p, "Ip", &t->Ip);
\r
731 PackAddIp(p, "Mask", &t->Mask);
\r
732 PackAddBool(p, "UseNat", t->UseNat);
\r
733 PackAddInt(p, "Mtu", t->Mtu);
\r
734 PackAddInt(p, "NatTcpTimeout", t->NatTcpTimeout);
\r
735 PackAddInt(p, "NatUdpTimeout", t->NatUdpTimeout);
\r
736 PackAddBool(p, "UseDhcp", t->UseDhcp);
\r
737 PackAddIp(p, "DhcpLeaseIPStart", &t->DhcpLeaseIPStart);
\r
738 PackAddIp(p, "DhcpLeaseIPEnd", &t->DhcpLeaseIPEnd);
\r
739 PackAddIp(p, "DhcpSubnetMask", &t->DhcpSubnetMask);
\r
740 PackAddInt(p, "DhcpExpireTimeSpan", t->DhcpExpireTimeSpan);
\r
741 PackAddIp(p, "DhcpGatewayAddress", &t->DhcpGatewayAddress);
\r
742 PackAddIp(p, "DhcpDnsServerAddress", &t->DhcpDnsServerAddress);
\r
743 PackAddStr(p, "DhcpDomainName", t->DhcpDomainName);
\r
744 PackAddBool(p, "SaveLog", t->SaveLog);
\r
745 PackAddStr(p, "RpcHubName", t->HubName);
\r
749 void InRpcEnumDhcp(RPC_ENUM_DHCP *t, PACK *p)
\r
753 if (t == NULL || p == NULL)
\r
758 Zero(t, sizeof(RPC_ENUM_DHCP));
\r
759 t->NumItem = PackGetInt(p, "NumItem");
\r
760 t->Items = ZeroMalloc(sizeof(RPC_ENUM_DHCP_ITEM) * t->NumItem);
\r
761 PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
\r
763 for (i = 0;i < t->NumItem;i++)
\r
765 RPC_ENUM_DHCP_ITEM *e = &t->Items[i];
\r
767 e->Id = PackGetIntEx(p, "Id", i);
\r
768 e->LeasedTime = PackGetInt64Ex(p, "LeasedTime", i);
\r
769 e->ExpireTime = PackGetInt64Ex(p, "ExpireTime", i);
\r
770 PackGetDataEx2(p, "MacAddress", e->MacAddress, 6, i);
\r
771 e->IpAddress = PackGetIp32Ex(p, "IpAddress", i);
\r
772 e->Mask = PackGetIntEx(p, "Mask", i);
\r
773 PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
\r
776 void OutRpcEnumDhcp(PACK *p, RPC_ENUM_DHCP *t)
\r
780 if (p == NULL || t == NULL)
\r
785 PackAddInt(p, "NumItem", t->NumItem);
\r
786 PackAddStr(p, "HubName", t->HubName);
\r
788 for (i = 0;i < t->NumItem;i++)
\r
790 RPC_ENUM_DHCP_ITEM *e = &t->Items[i];
\r
792 PackAddIntEx(p, "Id", e->Id, i, t->NumItem);
\r
793 PackAddInt64Ex(p, "LeasedTime", e->LeasedTime, i, t->NumItem);
\r
794 PackAddInt64Ex(p, "ExpireTime", e->ExpireTime, i, t->NumItem);
\r
795 PackAddDataEx(p, "MacAddress", e->MacAddress, 6, i, t->NumItem);
\r
796 PackAddIp32Ex(p, "IpAddress", e->IpAddress, i, t->NumItem);
\r
797 PackAddIntEx(p, "Mask", e->Mask, i, t->NumItem);
\r
798 PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumItem);
\r
801 void FreeRpcEnumDhcp(RPC_ENUM_DHCP *t)
\r
813 void InRpcEnumNat(RPC_ENUM_NAT *t, PACK *p)
\r
817 if (t == NULL || p == NULL)
\r
822 Zero(t, sizeof(RPC_ENUM_NAT));
\r
823 t->NumItem = PackGetInt(p, "NumItem");
\r
824 PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
\r
825 t->Items = ZeroMalloc(sizeof(RPC_ENUM_NAT_ITEM) * t->NumItem);
\r
826 for (i = 0;i < t->NumItem;i++)
\r
828 RPC_ENUM_NAT_ITEM *e = &t->Items[i];
\r
830 e->Id = PackGetIntEx(p, "Id", i);
\r
831 e->Protocol = PackGetIntEx(p, "Protocol", i);
\r
832 e->SrcIp = PackGetIntEx(p, "SrcIp", i);
\r
833 PackGetStrEx(p, "SrcHost", e->SrcHost, sizeof(e->SrcHost), i);
\r
834 e->SrcPort = PackGetIntEx(p, "SrcPort", i);
\r
835 e->DestIp = PackGetIntEx(p, "DestIp", i);
\r
836 PackGetStrEx(p, "DestHost", e->DestHost, sizeof(e->DestHost), i);
\r
837 e->DestPort = PackGetIntEx(p, "DestPort", i);
\r
838 e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
\r
839 e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
\r
840 e->SendSize = PackGetInt64Ex(p, "SendSize", i);
\r
841 e->RecvSize = PackGetInt64Ex(p, "RecvSize", i);
\r
842 e->TcpStatus = PackGetIntEx(p, "TcpStatus", i);
\r
845 void OutRpcEnumNat(PACK *p, RPC_ENUM_NAT *t)
\r
849 if (t == NULL || p == NULL)
\r
854 PackAddInt(p, "NumItem", t->NumItem);
\r
855 PackAddStr(p, "HubName", t->HubName);
\r
856 for (i = 0;i < t->NumItem;i++)
\r
858 RPC_ENUM_NAT_ITEM *e = &t->Items[i];
\r
860 PackAddIntEx(p, "Id", e->Id, i, t->NumItem);
\r
861 PackAddIntEx(p, "Protocol", e->Protocol, i, t->NumItem);
\r
862 PackAddIp32Ex(p, "SrcIp", e->SrcIp, i, t->NumItem);
\r
863 PackAddStrEx(p, "SrcHost", e->SrcHost, i, t->NumItem);
\r
864 PackAddIntEx(p, "SrcPort", e->SrcPort, i, t->NumItem);
\r
865 PackAddIp32Ex(p, "DestIp", e->DestIp, i, t->NumItem);
\r
866 PackAddStrEx(p, "DestHost", e->DestHost, i, t->NumItem);
\r
867 PackAddIntEx(p, "DestPort", e->DestPort, i, t->NumItem);
\r
868 PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumItem);
\r
869 PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumItem);
\r
870 PackAddInt64Ex(p, "SendSize", e->SendSize, i, t->NumItem);
\r
871 PackAddInt64Ex(p, "RecvSize", e->RecvSize, i, t->NumItem);
\r
872 PackAddIntEx(p, "TcpStatus", e->TcpStatus, i, t->NumItem);
\r
875 void FreeRpcEnumNat(RPC_ENUM_NAT *t)
\r
887 void InRpcNatInfo(RPC_NAT_INFO *t, PACK *p)
\r
890 if (t == NULL || p == NULL)
\r
895 Zero(t, sizeof(RPC_NAT_INFO));
\r
896 PackGetStr(p, "NatProductName", t->NatProductName, sizeof(t->NatProductName));
\r
897 PackGetStr(p, "NatVersionString", t->NatVersionString, sizeof(t->NatVersionString));
\r
898 PackGetStr(p, "NatBuildInfoString", t->NatBuildInfoString, sizeof(t->NatBuildInfoString));
\r
899 t->NatVerInt = PackGetInt(p, "NatVerInt");
\r
900 t->NatBuildInt = PackGetInt(p, "NatBuildInt");
\r
901 PackGetStr(p, "NatHostName", t->NatHostName, sizeof(t->NatHostName));
\r
902 InRpcOsInfo(&t->OsInfo, p);
\r
903 InRpcMemInfo(&t->MemInfo, p);
\r
905 void OutRpcNatInfo(PACK *p, RPC_NAT_INFO *t)
\r
908 if (t == NULL || p == NULL)
\r
913 PackAddStr(p, "NatProductName", t->NatProductName);
\r
914 PackAddStr(p, "NatVersionString", t->NatVersionString);
\r
915 PackAddStr(p, "NatBuildInfoString", t->NatBuildInfoString);
\r
916 PackAddInt(p, "NatVerInt", t->NatVerInt);
\r
917 PackAddInt(p, "NatBuildInt", t->NatBuildInt);
\r
918 PackAddStr(p, "NatHostName", t->NatHostName);
\r
919 OutRpcOsInfo(p, &t->OsInfo);
\r
920 OutRpcMemInfo(p, &t->MemInfo);
\r
922 void FreeRpcNatInfo(RPC_NAT_INFO *t)
\r
930 FreeRpcOsInfo(&t->OsInfo);
\r
934 void InRpcNatStatus(RPC_NAT_STATUS *t, PACK *p)
\r
937 if (t == NULL || p == NULL)
\r
942 Zero(t, sizeof(RPC_NAT_STATUS));
\r
943 t->NumTcpSessions = PackGetInt(p, "NumTcpSessions");
\r
944 t->NumUdpSessions = PackGetInt(p, "NumUdpSessions");
\r
945 t->NumDhcpClients = PackGetInt(p, "NumDhcpClients");
\r
946 PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
\r
948 void OutRpcNatStatus(PACK *p, RPC_NAT_STATUS *t)
\r
951 if (p == NULL || t == NULL)
\r
956 PackAddStr(p, "HubName", t->HubName);
\r
957 PackAddInt(p, "NumTcpSessions", t->NumTcpSessions);
\r
958 PackAddInt(p, "NumUdpSessions", t->NumUdpSessions);
\r
959 PackAddInt(p, "NumDhcpClients", t->NumDhcpClients);
\r
961 void FreeRpcNatStatus(RPC_NAT_STATUS *t)
\r
966 void InRpcDummy(RPC_DUMMY *t, PACK *p)
\r
969 if (t == NULL || p == NULL)
\r
974 Zero(t, sizeof(RPC_DUMMY));
\r
975 t->DummyValue = PackGetInt(p, "DummyValue");
\r
977 void OutRpcDummy(PACK *p, RPC_DUMMY *t)
\r
980 if (t == NULL || p == NULL)
\r
985 PackAddInt(p, "DummyValue", t->DummyValue);
\r
989 void NiAdminMain(NAT *n, SOCK *s)
\r
994 if (n == NULL || s == NULL)
\r
1000 HttpServerSend(s, p);
\r
1003 r = StartRpcServer(s, NiRpcServer, n);
\r
1011 void NiAdminThread(THREAD *thread, void *param)
\r
1013 NAT_ADMIN *a = (NAT_ADMIN *)param;
\r
1016 UCHAR random[SHA1_SIZE];
\r
1019 if (thread == NULL || param == NULL)
\r
1025 Rand(random, sizeof(random));
\r
1027 a->Thread = thread;
\r
1028 AddRef(a->Thread->ref);
\r
1034 LockList(n->AdminList);
\r
1036 Add(n->AdminList, a);
\r
1038 UnlockList(n->AdminList);
\r
1040 NoticeThreadInit(thread);
\r
1042 err = ERR_AUTH_FAILED;
\r
1044 if (StartSSL(s, n->AdminX, n->AdminK))
\r
1050 PackAddData(p, "auth_random", random, sizeof(random));
\r
1052 if (HttpServerSend(s, p))
\r
1056 p = HttpServerRecv(s);
\r
1059 UCHAR secure_password[SHA1_SIZE];
\r
1060 UCHAR secure_check[SHA1_SIZE];
\r
1062 if (PackGetData2(p, "secure_password", secure_password, sizeof(secure_password)))
\r
1064 SecurePassword(secure_check, n->HashedPassword, random);
\r
1066 if (Cmp(secure_check, secure_password, SHA1_SIZE) == 0)
\r
1068 UCHAR test[SHA1_SIZE];
\r
1070 Hash(test, "", 0, true);
\r
1071 SecurePassword(test, test, random);
\r
1074 if (Cmp(test, secure_check, SHA1_SIZE) == 0 && s->RemoteIP.addr[0] != 127)
\r
1076 // 空白パスワードは外部から接続できない
\r
1077 err = ERR_NULL_PASSWORD_LOCAL_ONLY;
\r
1084 err = ERR_NO_ERROR;
\r
1085 NiAdminMain(n, s);
\r
1096 if (err != ERR_NO_ERROR)
\r
1098 p = PackError(err);
\r
1099 HttpServerSend(s, p);
\r
1108 // 管理ポート Listen スレッド
\r
1109 void NiListenThread(THREAD *thread, void *param)
\r
1111 NAT *n = (NAT *)param;
\r
1116 if (thread == NULL || param == NULL)
\r
1122 n->AdminList = NewList(NULL);
\r
1126 a = Listen(DEFAULT_NAT_ADMIN_PORT);
\r
1130 NoticeThreadInit(thread);
\r
1137 Wait(n->HaltEvent, NAT_ADMIN_PORT_LISTEN_INTERVAL);
\r
1144 n->AdminListenSock = a;
\r
1150 SOCK *s = Accept(a);
\r
1163 admin = ZeroMalloc(sizeof(NAT_ADMIN));
\r
1166 t = NewThread(NiAdminThread, admin);
\r
1167 WaitThreadInit(t);
\r
1171 // すべての管理コネクションを切断
\r
1172 LockList(n->AdminList);
\r
1174 for (i = 0;i < LIST_NUM(n->AdminList);i++)
\r
1176 NAT_ADMIN *a = LIST_DATA(n->AdminList, i);
\r
1177 Disconnect(a->Sock);
\r
1178 WaitThread(a->Thread, INFINITE);
\r
1179 ReleaseThread(a->Thread);
\r
1180 ReleaseSock(a->Sock);
\r
1184 UnlockList(n->AdminList);
\r
1186 ReleaseList(n->AdminList);
\r
1192 void NiInitAdminAccept(NAT *n)
\r
1201 t = NewThread(NiListenThread, n);
\r
1202 WaitThreadInit(t);
\r
1203 n->AdminAcceptThread = t;
\r
1207 void NiFreeAdminAccept(NAT *n)
\r
1216 Disconnect(n->AdminListenSock);
\r
1217 Set(n->HaltEvent);
\r
1221 if (WaitThread(n->AdminAcceptThread, 1000) == false)
\r
1223 Disconnect(n->AdminListenSock);
\r
1230 ReleaseThread(n->AdminAcceptThread);
\r
1232 ReleaseSock(n->AdminListenSock);
\r
1235 // ダイナミック仮想 HUB でサポートされていない DHCP オプションをクリアする
\r
1236 void NiClearUnsupportedVhOptionForDynamicHub(VH_OPTION *o, bool initial)
\r
1244 o->UseNat = false;
\r
1248 Zero(&o->DhcpGatewayAddress, sizeof(IP));
\r
1249 Zero(&o->DhcpDnsServerAddress, sizeof(IP));
\r
1250 StrCpy(o->DhcpDomainName, sizeof(o->DhcpDomainName), "");
\r
1254 // 仮想ホストのオプションを初期化する
\r
1255 void NiSetDefaultVhOption(NAT *n, VH_OPTION *o)
\r
1263 Zero(o, sizeof(VH_OPTION));
\r
1264 GenMacAddress(o->MacAddress);
\r
1266 // 仮想 IP を 192.168.30.1/24 にする
\r
1267 SetIP(&o->Ip, 192, 168, 30, 1);
\r
1268 SetIP(&o->Mask, 255, 255, 255, 0);
\r
1271 o->NatTcpTimeout = 7200;
\r
1272 o->NatUdpTimeout = 60;
\r
1273 o->UseDhcp = true;
\r
1274 SetIP(&o->DhcpLeaseIPStart, 192, 168, 30, 10);
\r
1275 SetIP(&o->DhcpLeaseIPEnd, 192, 168, 30, 200);
\r
1276 SetIP(&o->DhcpSubnetMask, 255, 255, 255, 0);
\r
1277 o->DhcpExpireTimeSpan = 7200;
\r
1278 o->SaveLog = true;
\r
1280 SetIP(&o->DhcpGatewayAddress, 192, 168, 30, 1);
\r
1281 SetIP(&o->DhcpDnsServerAddress, 192, 168, 30, 1);
\r
1283 GetDomainName(o->DhcpDomainName, sizeof(o->DhcpDomainName));
\r
1286 // NAT の設定を初期状態にする
\r
1287 void NiInitDefaultConfig(NAT *n)
\r
1296 NiSetDefaultVhOption(n, &n->Option);
\r
1299 n->AdminPort = DEFAULT_NAT_ADMIN_PORT;
\r
1302 n->Online = false;
\r
1305 n->Option.SaveLog = true;
\r
1309 void NiInitConfig(NAT *n)
\r
1318 NiInitDefaultConfig(n);
\r
1321 // 仮想ホストオプションの読み込み (拡張)
\r
1322 void NiLoadVhOptionEx(VH_OPTION *o, FOLDER *root)
\r
1324 FOLDER *host, *nat, *dhcp;
\r
1325 char mac_address[MAX_SIZE];
\r
1327 if (o == NULL || root == NULL)
\r
1332 host = CfgGetFolder(root, "VirtualHost");
\r
1333 nat = CfgGetFolder(root, "VirtualRouter");
\r
1334 dhcp = CfgGetFolder(root, "VirtualDhcpServer");
\r
1336 Zero(o, sizeof(VH_OPTION));
\r
1338 GenMacAddress(o->MacAddress);
\r
1339 if (CfgGetStr(host, "VirtualHostMacAddress", mac_address, sizeof(mac_address)))
\r
1341 BUF *b = StrToBin(mac_address);
\r
1346 Copy(o->MacAddress, b->Buf, 6);
\r
1351 CfgGetIp(host, "VirtualHostIp", &o->Ip);
\r
1352 CfgGetIp(host, "VirtualHostIpSubnetMask", &o->Mask);
\r
1354 o->UseNat = CfgGetBool(nat, "NatEnabled");
\r
1355 o->Mtu = CfgGetInt(nat, "NatMtu");
\r
1356 o->NatTcpTimeout = CfgGetInt(nat, "NatTcpTimeout");
\r
1357 o->NatUdpTimeout = CfgGetInt(nat, "NatUdpTimeout");
\r
1359 o->UseDhcp = CfgGetBool(dhcp, "DhcpEnabled");
\r
1360 CfgGetIp(dhcp, "DhcpLeaseIPStart", &o->DhcpLeaseIPStart);
\r
1361 CfgGetIp(dhcp, "DhcpLeaseIPEnd", &o->DhcpLeaseIPEnd);
\r
1362 CfgGetIp(dhcp, "DhcpSubnetMask", &o->DhcpSubnetMask);
\r
1363 o->DhcpExpireTimeSpan = CfgGetInt(dhcp, "DhcpExpireTimeSpan");
\r
1364 CfgGetIp(dhcp, "DhcpGatewayAddress", &o->DhcpGatewayAddress);
\r
1365 CfgGetIp(dhcp, "DhcpDnsServerAddress", &o->DhcpDnsServerAddress);
\r
1366 CfgGetStr(dhcp, "DhcpDomainName", o->DhcpDomainName, sizeof(o->DhcpDomainName));
\r
1368 Trim(o->DhcpDomainName);
\r
1369 if (StrLen(o->DhcpDomainName) == 0)
\r
1371 //GetDomainName(o->DhcpDomainName, sizeof(o->DhcpDomainName));
\r
1374 o->SaveLog = CfgGetBool(root, "SaveLog");
\r
1377 // 仮想ホストオプションの読み込み
\r
1378 void NiLoadVhOption(NAT *n, FOLDER *root)
\r
1381 FOLDER *host, *nat, *dhcp;
\r
1382 char mac_address[MAX_SIZE];
\r
1384 if (n == NULL || root == NULL)
\r
1389 host = CfgGetFolder(root, "VirtualHost");
\r
1390 nat = CfgGetFolder(root, "VirtualRouter");
\r
1391 dhcp = CfgGetFolder(root, "VirtualDhcpServer");
\r
1394 Zero(o, sizeof(VH_OPTION));
\r
1396 GenMacAddress(o->MacAddress);
\r
1397 if (CfgGetStr(host, "VirtualHostMacAddress", mac_address, sizeof(mac_address)))
\r
1399 BUF *b = StrToBin(mac_address);
\r
1404 Copy(o->MacAddress, b->Buf, 6);
\r
1409 CfgGetIp(host, "VirtualHostIp", &o->Ip);
\r
1410 CfgGetIp(host, "VirtualHostIpSubnetMask", &o->Mask);
\r
1412 o->UseNat = CfgGetBool(nat, "NatEnabled");
\r
1413 o->Mtu = CfgGetInt(nat, "NatMtu");
\r
1414 o->NatTcpTimeout = CfgGetInt(nat, "NatTcpTimeout");
\r
1415 o->NatUdpTimeout = CfgGetInt(nat, "NatUdpTimeout");
\r
1417 o->UseDhcp = CfgGetBool(dhcp, "DhcpEnabled");
\r
1418 CfgGetIp(dhcp, "DhcpLeaseIPStart", &o->DhcpLeaseIPStart);
\r
1419 CfgGetIp(dhcp, "DhcpLeaseIPEnd", &o->DhcpLeaseIPEnd);
\r
1420 CfgGetIp(dhcp, "DhcpSubnetMask", &o->DhcpSubnetMask);
\r
1421 o->DhcpExpireTimeSpan = CfgGetInt(dhcp, "DhcpExpireTimeSpan");
\r
1422 CfgGetIp(dhcp, "DhcpGatewayAddress", &o->DhcpGatewayAddress);
\r
1423 CfgGetIp(dhcp, "DhcpDnsServerAddress", &o->DhcpDnsServerAddress);
\r
1424 CfgGetStr(dhcp, "DhcpDomainName", o->DhcpDomainName, sizeof(o->DhcpDomainName));
\r
1426 o->SaveLog = CfgGetBool(root, "SaveLog");
\r
1429 // VPN サーバーからの接続オプションの読み込み
\r
1430 void NiLoadClientData(NAT *n, FOLDER *root)
\r
1434 if (n == NULL || root == NULL)
\r
1439 co = CfgGetFolder(root, "VpnClientOption");
\r
1440 ca = CfgGetFolder(root, "VpnClientAuth");
\r
1441 if (co == NULL || ca == NULL)
\r
1446 n->ClientOption = CiLoadClientOption(co);
\r
1447 n->ClientAuth = CiLoadClientAuth(ca);
\r
1450 // VPN サーバーへの接続オプションの書き込み
\r
1451 void NiWriteClientData(NAT *n, FOLDER *root)
\r
1454 if (n == NULL || root == NULL || n->ClientOption == NULL || n->ClientAuth == NULL)
\r
1459 CiWriteClientOption(CfgCreateFolder(root, "VpnClientOption"), n->ClientOption);
\r
1460 CiWriteClientAuth(CfgCreateFolder(root, "VpnClientAuth"), n->ClientAuth);
\r
1463 // 仮想ホストオプションの書き込み (拡張)
\r
1464 void NiWriteVhOptionEx(VH_OPTION *o, FOLDER *root)
\r
1466 FOLDER *host, *nat, *dhcp;
\r
1467 char mac_address[MAX_SIZE];
\r
1469 if (o == NULL || root == NULL)
\r
1474 host = CfgCreateFolder(root, "VirtualHost");
\r
1475 nat = CfgCreateFolder(root, "VirtualRouter");
\r
1476 dhcp = CfgCreateFolder(root, "VirtualDhcpServer");
\r
1478 MacToStr(mac_address, sizeof(mac_address), o->MacAddress);
\r
1479 CfgAddStr(host, "VirtualHostMacAddress", mac_address);
\r
1480 CfgAddIp(host, "VirtualHostIp", &o->Ip);
\r
1481 CfgAddIp(host, "VirtualHostIpSubnetMask", &o->Mask);
\r
1483 CfgAddBool(nat, "NatEnabled", o->UseNat);
\r
1484 CfgAddInt(nat, "NatMtu", o->Mtu);
\r
1485 CfgAddInt(nat, "NatTcpTimeout", o->NatTcpTimeout);
\r
1486 CfgAddInt(nat, "NatUdpTimeout", o->NatUdpTimeout);
\r
1488 CfgAddBool(dhcp, "DhcpEnabled", o->UseDhcp);
\r
1489 CfgAddIp(dhcp, "DhcpLeaseIPStart", &o->DhcpLeaseIPStart);
\r
1490 CfgAddIp(dhcp, "DhcpLeaseIPEnd", &o->DhcpLeaseIPEnd);
\r
1491 CfgAddIp(dhcp, "DhcpSubnetMask", &o->DhcpSubnetMask);
\r
1492 CfgAddInt(dhcp, "DhcpExpireTimeSpan", o->DhcpExpireTimeSpan);
\r
1493 CfgAddIp(dhcp, "DhcpGatewayAddress", &o->DhcpGatewayAddress);
\r
1494 CfgAddIp(dhcp, "DhcpDnsServerAddress", &o->DhcpDnsServerAddress);
\r
1495 CfgAddStr(dhcp, "DhcpDomainName", o->DhcpDomainName);
\r
1497 CfgAddBool(root, "SaveLog", o->SaveLog);
\r
1500 // 仮想ホストオプションの書き込み
\r
1501 void NiWriteVhOption(NAT *n, FOLDER *root)
\r
1504 FOLDER *host, *nat, *dhcp;
\r
1505 char mac_address[MAX_SIZE];
\r
1507 if (n == NULL || root == NULL)
\r
1512 host = CfgCreateFolder(root, "VirtualHost");
\r
1513 nat = CfgCreateFolder(root, "VirtualRouter");
\r
1514 dhcp = CfgCreateFolder(root, "VirtualDhcpServer");
\r
1518 MacToStr(mac_address, sizeof(mac_address), o->MacAddress);
\r
1519 CfgAddStr(host, "VirtualHostMacAddress", mac_address);
\r
1520 CfgAddIp(host, "VirtualHostIp", &o->Ip);
\r
1521 CfgAddIp(host, "VirtualHostIpSubnetMask", &o->Mask);
\r
1523 CfgAddBool(nat, "NatEnabled", o->UseNat);
\r
1524 CfgAddInt(nat, "NatMtu", o->Mtu);
\r
1525 CfgAddInt(nat, "NatTcpTimeout", o->NatTcpTimeout);
\r
1526 CfgAddInt(nat, "NatUdpTimeout", o->NatUdpTimeout);
\r
1528 CfgAddBool(dhcp, "DhcpEnabled", o->UseDhcp);
\r
1529 CfgAddIp(dhcp, "DhcpLeaseIPStart", &o->DhcpLeaseIPStart);
\r
1530 CfgAddIp(dhcp, "DhcpLeaseIPEnd", &o->DhcpLeaseIPEnd);
\r
1531 CfgAddIp(dhcp, "DhcpSubnetMask", &o->DhcpSubnetMask);
\r
1532 CfgAddInt(dhcp, "DhcpExpireTimeSpan", o->DhcpExpireTimeSpan);
\r
1533 CfgAddIp(dhcp, "DhcpGatewayAddress", &o->DhcpGatewayAddress);
\r
1534 CfgAddIp(dhcp, "DhcpDnsServerAddress", &o->DhcpDnsServerAddress);
\r
1535 CfgAddStr(dhcp, "DhcpDomainName", o->DhcpDomainName);
\r
1537 CfgAddBool(root, "SaveLog", o->SaveLog);
\r
1541 bool NiLoadConfig(NAT *n, FOLDER *root)
\r
1546 if (n == NULL || root == NULL)
\r
1551 host = CfgGetFolder(root, "VirtualHost");
\r
1557 CfgGetByte(root, "HashedPassword", n->HashedPassword, sizeof(n->HashedPassword));
\r
1558 n->AdminPort = CfgGetInt(root, "AdminPort");
\r
1559 n->Online = CfgGetBool(root, "Online");
\r
1561 b = CfgGetBuf(root, "AdminCert");
\r
1564 n->AdminX = BufToX(b, false);
\r
1568 b = CfgGetBuf(root, "AdminKey");
\r
1571 n->AdminK = BufToK(b, true, false, NULL);
\r
1575 NiLoadVhOption(n, root);
\r
1577 NiLoadClientData(n, root);
\r
1583 void NiWriteConfig(NAT *n)
\r
1593 FOLDER *root = CfgCreateFolder(NULL, TAG_ROOT);
\r
1597 b = XToBuf(n->AdminX, false);
\r
1598 CfgAddBuf(root, "AdminCert", b);
\r
1602 b = KToBuf(n->AdminK, false, NULL);
\r
1603 CfgAddBuf(root, "AdminKey", b);
\r
1607 CfgAddByte(root, "HashedPassword", n->HashedPassword, sizeof(n->HashedPassword));
\r
1608 CfgAddInt(root, "AdminPort", n->AdminPort);
\r
1609 CfgAddBool(root, "Online", n->Online);
\r
1612 NiWriteVhOption(n, root);
\r
1615 if (n->ClientOption != NULL && n->ClientAuth != NULL)
\r
1617 NiWriteClientData(n, root);
\r
1620 SaveCfgRw(n->CfgRw, root);
\r
1621 CfgDeleteFolder(root);
\r
1627 void NiFreeConfig(NAT *n)
\r
1639 FreeCfgRw(n->CfgRw);
\r
1642 Free(n->ClientOption);
\r
1643 CiFreeClientAuth(n->ClientAuth);
\r
1650 NAT *NiNewNatEx(SNAT *snat, VH_OPTION *o)
\r
1652 NAT *n = ZeroMalloc(sizeof(NAT));
\r
1654 n->lock = NewLock();
\r
1655 Hash(n->HashedPassword, "", 0, true);
\r
1656 n->HaltEvent = NewEvent();
\r
1658 //n->Cedar = NewCedar(NULL, NULL);
\r
1660 n->SecureNAT = snat;
\r
1663 //OSSetHighPriority();
\r
1670 if (n->Online && n->ClientOption != NULL)
\r
1672 n->Virtual = NewVirtualHostEx(n->Cedar, n->ClientOption, n->ClientAuth, &n->Option, n);
\r
1676 n->Online = false;
\r
1677 n->Virtual = NULL;
\r
1680 n->Virtual = NewVirtualHostEx(n->Cedar, NULL, NULL, o, n);
\r
1685 //NiInitAdminAccept(n);
\r
1691 return NiNewNatEx(NULL, NULL);
\r
1695 void NiFreeNat(NAT *n)
\r
1704 //NiFreeAdminAccept(n);
\r
1706 // 仮想ホストが動作中の場合は停止
\r
1709 if (n->Virtual != NULL)
\r
1711 StopVirtualHost(n->Virtual);
\r
1712 ReleaseVirtual(n->Virtual);
\r
1713 n->Virtual = NULL;
\r
1722 ReleaseCedar(n->Cedar);
\r
1723 ReleaseEvent(n->HaltEvent);
\r
1724 DeleteLock(n->lock);
\r
1759 if (nat_lock != NULL)
\r
1764 nat_lock = NewLock();
\r
1770 if (nat_lock == NULL)
\r
1775 DeleteLock(nat_lock);
\r