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
84 POLICY_ITEM policy_item[] =
\r
86 // 番号, 数値, 省略可能, 最小, 最大, デフォルト, 単位文字列
\r
88 {0, false, false, 0, 0, 0, NULL}, // Access
\r
89 {1, false, false, 0, 0, 0, NULL}, // DHCPFilter
\r
90 {2, false, false, 0, 0, 0, NULL}, // DHCPNoServer
\r
91 {3, false, false, 0, 0, 0, NULL}, // DHCPForce
\r
92 {4, false, false, 0, 0, 0, NULL}, // NoBridge
\r
93 {5, false, false, 0, 0, 0, NULL}, // NoRouting
\r
94 {6, false, false, 0, 0, 0, NULL}, // CheckMac
\r
95 {7, false, false, 0, 0, 0, NULL}, // CheckIP
\r
96 {8, false, false, 0, 0, 0, NULL}, // ArpDhcpOnly
\r
97 {9, false, false, 0, 0, 0, NULL}, // PrivacyFilter
\r
98 {10, false, false, 0, 0, 0, NULL}, // NoServer
\r
99 {11, false, false, 0, 0, 0, NULL}, // NoBroadcastLimiter
\r
100 {12, false, false, 0, 0, 0, NULL}, // MonitorPort
\r
101 {13, true, false, 1, 32, 32, "POL_INT_COUNT"}, // MaxConnection
\r
102 {14, true, false, 5, 60, 20, "POL_INT_SEC"}, // TimeOut
\r
103 {15, true, true, 1, 65535, 0, "POL_INT_COUNT"}, // MaxMac
\r
104 {16, true, true, 1, 65535, 0, "POL_INT_COUNT"}, // MaxIP
\r
105 {17, true, true, 1, 4294967295UL, 0, "POL_INT_BPS"}, // MaxUpload
\r
106 {18, true, true, 1, 4294967295UL, 0, "POL_INT_BPS"}, // MaxDownload
\r
107 {19, false, false, 0, 0, 0, NULL}, // FixPassword
\r
108 {20, true, true, 1, 65535, 0, "POL_INT_COUNT"}, // MultiLogins
\r
109 {21, false, false, 0, 0, 0, NULL}, // NoQoS
\r
111 {22, false, false, 0, 0, 0, NULL}, // RSandRAFilter
\r
112 {23, false, false, 0, 0, 0, NULL}, // RAFilter
\r
113 {24, false, false, 0, 0, 0, NULL}, // DHCPv6Filter
\r
114 {25, false, false, 0, 0, 0, NULL}, // DHCPv6NoServer
\r
115 {26, false, false, 0, 0, 0, NULL}, // NoRoutingV6
\r
116 {27, false, false, 0, 0, 0, NULL}, // CheckIPv6
\r
117 {28, false, false, 0, 0, 0, NULL}, // NoServerV6
\r
118 {29, true, true, 1, 65535, 0, "POL_INT_COUNT"}, // MaxIPv6
\r
119 {30, false, false, 0, 0, 0, NULL}, // NoSavePassword
\r
120 {31, true, true, 1, 4294967295UL, 0, "POL_INT_SEC"}, // AutoDisconnect
\r
121 {32, false, false, 0, 0, 0, NULL}, // FilterIPv4
\r
122 {33, false, false, 0, 0, 0, NULL}, // FilterIPv6
\r
123 {34, false, false, 0, 0, 0, NULL}, // FilterNonIP
\r
124 {35, false, false, 0, 0, 0, NULL}, // NoIPv6DefaultRouterInRA
\r
125 {36, false, false, 0, 0, 0, NULL}, // NoIPv6DefaultRouterInRAWhenIPv6
\r
126 {37, true, true, 1, 4095, 0, "POL_INT_VLAN"}, // VLanId
\r
130 char *NormalizePolicyName(char *name)
\r
138 return PolicyIdToStr(PolicyStrToId(name));
\r
142 void FormatPolicyValue(wchar_t *str, UINT size, UINT id, UINT value)
\r
151 p = GetPolicyItem(id);
\r
153 if (p->TypeInt == false)
\r
158 UniStrCpy(str, size, L"No");
\r
162 UniStrCpy(str, size, L"Yes");
\r
168 if (value == 0 && p->AllowZero)
\r
170 UniStrCpy(str, size, _UU("CMD_NO_SETTINGS"));
\r
174 UniFormat(str, size, _UU(p->FormatStr), value);
\r
179 // ポリシーとして設定可能な値の範囲を説明する文字列を取得
\r
180 void GetPolicyValueRangeStr(wchar_t *str, UINT size, UINT id)
\r
189 p = GetPolicyItem(id);
\r
191 if (p->TypeInt == false)
\r
194 UniStrCpy(str, size, _UU("CMD_PolicyList_Range_Bool"));
\r
199 wchar_t tmp1[256], tmp2[256];
\r
204 tag = _UU("CMD_PolicyList_Range_Int_2");
\r
208 tag = _UU("CMD_PolicyList_Range_Int_1");
\r
211 UniFormat(tmp1, sizeof(tmp1), _UU(p->FormatStr), p->MinValue);
\r
212 UniFormat(tmp2, sizeof(tmp2), _UU(p->FormatStr), p->MaxValue);
\r
214 UniFormat(str, size, tag, tmp1, tmp2);
\r
219 POLICY_ITEM *GetPolicyItem(UINT id)
\r
221 return &policy_item[id];
\r
224 // 指定されたポリシーがカスケード接続でサポートされているかどうか
\r
225 bool PolicyIsSupportedForCascade(UINT i)
\r
227 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
228 if (i == 0 || i == 4 || i == 5 || i == 9 || i == 12 || i == 13 ||
\r
229 i == 14 || i == 19 || i == 20 || i == 21 || i == 26 || i == 30 || i == 31 || i == 36)
\r
231 // これらの項目はカスケード接続でサポートされていない
\r
239 char *PolicyIdToStr(UINT i)
\r
241 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
245 case 0: return "Access";
\r
246 case 1: return "DHCPFilter";
\r
247 case 2: return "DHCPNoServer";
\r
248 case 3: return "DHCPForce";
\r
249 case 4: return "NoBridge";
\r
250 case 5: return "NoRouting";
\r
251 case 6: return "CheckMac";
\r
252 case 7: return "CheckIP";
\r
253 case 8: return "ArpDhcpOnly";
\r
254 case 9: return "PrivacyFilter";
\r
255 case 10: return "NoServer";
\r
256 case 11: return "NoBroadcastLimiter";
\r
257 case 12: return "MonitorPort";
\r
258 case 13: return "MaxConnection";
\r
259 case 14: return "TimeOut";
\r
260 case 15: return "MaxMac";
\r
261 case 16: return "MaxIP";
\r
262 case 17: return "MaxUpload";
\r
263 case 18: return "MaxDownload";
\r
264 case 19: return "FixPassword";
\r
265 case 20: return "MultiLogins";
\r
266 case 21: return "NoQoS";
\r
269 case 22: return "RSandRAFilter";
\r
270 case 23: return "RAFilter";
\r
271 case 24: return "DHCPv6Filter";
\r
272 case 25: return "DHCPv6NoServer";
\r
273 case 26: return "NoRoutingV6";
\r
274 case 27: return "CheckIPv6";
\r
275 case 28: return "NoServerV6";
\r
276 case 29: return "MaxIPv6";
\r
277 case 30: return "NoSavePassword";
\r
278 case 31: return "AutoDisconnect";
\r
279 case 32: return "FilterIPv4";
\r
280 case 33: return "FilterIPv6";
\r
281 case 34: return "FilterNonIP";
\r
282 case 35: return "NoIPv6DefaultRouterInRA";
\r
283 case 36: return "NoIPv6DefaultRouterInRAWhenIPv6";
\r
284 case 37: return "VLanId";
\r
291 UINT PolicyStrToId(char *name)
\r
300 for (i = 0;i < NUM_POLICY_ITEM;i++)
\r
302 if (StartWith(PolicyIdToStr(i), name))
\r
314 return NUM_POLICY_ITEM;
\r
317 // 指定した名前をアカウント名として使用できるかどうか確認する
\r
318 bool IsUserName(char *name)
\r
320 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
321 char tmp[MAX_SIZE];
\r
328 StrCpy(tmp, sizeof(tmp), name);
\r
333 if (StrLen(name) == 0)
\r
338 if (StrCmpi(name, "*") == 0)
\r
343 if (IsSafeStr(name) == false)
\r
348 if (StrCmpi(name, LINK_USER_NAME) == 0)
\r
353 if (StartWith(name, L3_USERNAME))
\r
358 if (StrCmpi(name, LINK_USER_NAME_PRINT) == 0)
\r
363 if (StrCmpi(name, SNAT_USER_NAME) == 0)
\r
368 if (StrCmpi(name, SNAT_USER_NAME_PRINT) == 0)
\r
373 if (StrCmpi(name, BRIDGE_USER_NAME) == 0)
\r
378 if (StrCmpi(name, BRIDGE_USER_NAME_PRINT) == 0)
\r
383 if (StrCmpi(name, ADMINISTRATOR_USERNAME) == 0)
\r
392 wchar_t *GetPolicyTitle(UINT id)
\r
394 char tmp[MAX_SIZE];
\r
395 Format(tmp, sizeof(tmp), "POL_%u", id);
\r
401 wchar_t *GetPolicyDescription(UINT id)
\r
403 char tmp[MAX_SIZE];
\r
404 Format(tmp, sizeof(tmp), "POL_EX_%u", id);
\r
410 POLICY *ClonePolicy(POLICY *policy)
\r
414 if (policy == NULL)
\r
419 ret = ZeroMalloc(sizeof(POLICY));
\r
420 Copy(ret, policy, sizeof(POLICY));
\r
425 // ポリシーを上書きする (古いバージョンを上書きする場合は新しいバージョンのデータは残す)
\r
426 void OverwritePolicy(POLICY **target, POLICY *p)
\r
429 if (target == NULL)
\r
437 if (*target != NULL)
\r
448 if (*target != NULL)
\r
454 *target = ClonePolicy(p);
\r
459 if (*target == NULL)
\r
461 *target = ClonePolicy(p);
\r
465 Copy(*target, p, NUM_POLICY_ITEM_FOR_VER2 * sizeof(UINT));
\r
472 void SetUserPolicy(USER *u, POLICY *policy)
\r
482 OverwritePolicy(&u->Policy, policy);
\r
488 POLICY *GetUserPolicy(USER *u)
\r
499 if (u->Policy == NULL)
\r
505 ret = ClonePolicy(u->Policy);
\r
514 void SetGroupPolicy(USERGROUP *g, POLICY *policy)
\r
524 OverwritePolicy(&g->Policy, policy);
\r
530 POLICY *GetGroupPolicy(USERGROUP *g)
\r
541 if (g->Policy == NULL)
\r
547 ret = ClonePolicy(g->Policy);
\r
556 POLICY *GetDefaultPolicy()
\r
558 // このあたりは急いで実装したのでコードがあまり美しくない。
\r
559 static POLICY def_policy =
\r
600 return &def_policy;
\r
604 void *NewNTAuthData(wchar_t *username)
\r
608 a = ZeroMallocEx(sizeof(AUTHNT), true);
\r
609 a->NtUsername = CopyUniStr(username);
\r
615 void *NewRadiusAuthData(wchar_t *username)
\r
619 a = ZeroMallocEx(sizeof(AUTHRADIUS), true);
\r
620 a->RadiusUsername = CopyUniStr(username);
\r
625 // ルート証明書による認証データの作成
\r
626 void *NewRootCertAuthData(X_SERIAL *serial, wchar_t *common_name)
\r
630 a = ZeroMallocEx(sizeof(AUTHROOTCERT), true);
\r
631 if (common_name != NULL && UniIsEmptyStr(common_name) == false)
\r
633 a->CommonName = CopyUniStr(common_name);
\r
635 if (serial != NULL && serial->size >= 1)
\r
637 a->Serial = CloneXSerial(serial);
\r
644 void *NewUserCertAuthData(X *x)
\r
648 a = ZeroMalloc(sizeof(AUTHUSERCERT));
\r
649 a->UserX = CloneX(x);
\r
655 void HashPassword(void *dst, char *username, char *password)
\r
658 char *username_upper;
\r
660 if (dst == NULL || username == NULL || password == NULL)
\r
666 username_upper = CopyStr(username);
\r
667 StrUpper(username_upper);
\r
668 WriteBuf(b, password, StrLen(password));
\r
669 WriteBuf(b, username_upper, StrLen(username_upper));
\r
670 Hash(dst, b->Buf, b->Size, true);
\r
673 Free(username_upper);
\r
677 void *NewPasswordAuthData(char *username, char *password)
\r
681 if (username == NULL || password == NULL)
\r
686 pw = ZeroMalloc(sizeof(AUTHPASSWORD));
\r
687 HashPassword(pw->HashedKey, username, password);
\r
691 void *NewPasswordAuthDataRaw(UCHAR *hashed_password)
\r
695 if (hashed_password == NULL)
\r
700 pw = ZeroMalloc(sizeof(AUTHPASSWORD));
\r
701 Copy(pw->HashedKey, hashed_password, SHA1_SIZE);
\r
707 void *CopyAuthData(void *authdata, UINT authtype)
\r
709 AUTHPASSWORD *pw = (AUTHPASSWORD *)authdata;
\r
710 AUTHUSERCERT *usercert = (AUTHUSERCERT *)authdata;
\r
711 AUTHROOTCERT *rootcert = (AUTHROOTCERT *)authdata;
\r
712 AUTHRADIUS *radius = (AUTHRADIUS *)authdata;
\r
713 AUTHNT *nt = (AUTHNT *)authdata;
\r
715 if (authdata == NULL || authtype == AUTHTYPE_ANONYMOUS)
\r
722 case AUTHTYPE_PASSWORD:
\r
724 AUTHPASSWORD *ret = ZeroMalloc(sizeof(AUTHPASSWORD));
\r
725 Copy(ret, pw, sizeof(AUTHPASSWORD));
\r
730 case AUTHTYPE_USERCERT:
\r
732 AUTHUSERCERT *ret = ZeroMalloc(sizeof(AUTHUSERCERT));
\r
733 ret->UserX = CloneX(usercert->UserX);
\r
738 case AUTHTYPE_ROOTCERT:
\r
740 AUTHROOTCERT *ret = ZeroMalloc(sizeof(AUTHROOTCERT));
\r
741 ret->CommonName = CopyUniStr(rootcert->CommonName);
\r
742 ret->Serial = CloneXSerial(rootcert->Serial);
\r
747 case AUTHTYPE_RADIUS:
\r
749 AUTHRADIUS *ret = ZeroMalloc(sizeof(AUTHRADIUS));
\r
750 ret->RadiusUsername = UniCopyStr(radius->RadiusUsername);
\r
757 AUTHNT *ret = ZeroMalloc(sizeof(AUTHNT));
\r
758 ret->NtUsername = UniCopyStr(nt->NtUsername);
\r
768 void SetUserAuthData(USER *u, UINT authtype, void *authdata)
\r
775 if (authtype != AUTHTYPE_ANONYMOUS && authdata == NULL)
\r
782 if (u->AuthType != AUTHTYPE_ANONYMOUS)
\r
785 FreeAuthData(u->AuthType, u->AuthData);
\r
788 u->AuthType = authtype;
\r
789 u->AuthData = authdata;
\r
794 // グループのトラフィックデータを加算
\r
795 void AddGroupTraffic(USERGROUP *g, TRAFFIC *diff)
\r
798 if (g == NULL || diff == NULL)
\r
805 AddTraffic(g->Traffic, diff);
\r
810 // ユーザーのトラフィックデータを加算
\r
811 void AddUserTraffic(USER *u, TRAFFIC *diff)
\r
814 if (u == NULL || diff == NULL)
\r
821 AddTraffic(u->Traffic, diff);
\r
826 // グループのトラフィック情報をセット
\r
827 void SetGroupTraffic(USERGROUP *g, TRAFFIC *t)
\r
839 Copy(g->Traffic, t, sizeof(TRAFFIC));
\r
843 Zero(g->Traffic, sizeof(TRAFFIC));
\r
849 // ユーザーのトラフィック情報をセット
\r
850 void SetUserTraffic(USER *u, TRAFFIC *t)
\r
862 Copy(u->Traffic, t, sizeof(TRAFFIC));
\r
866 Zero(u->Traffic, sizeof(TRAFFIC));
\r
873 void JoinUserToGroup(USER *u, USERGROUP *g)
\r
888 if (u->Group != NULL)
\r
891 ReleaseGroup(u->Group);
\r
893 Free(u->GroupName);
\r
894 u->GroupName = NULL;
\r
897 u->GroupName = CopyStr(g->Name);
\r
910 if (u->Group != NULL)
\r
913 ReleaseGroup(u->Group);
\r
915 Free(u->GroupName);
\r
916 u->GroupName = NULL;
\r
924 bool AcIsGroup(HUB *h, char *name)
\r
928 if (h == NULL || name == NULL || NO_ACCOUNT_DB(h))
\r
933 g = AcGetGroup(h, name);
\r
944 bool AcIsUser(HUB *h, char *name)
\r
948 if (h == NULL || name == NULL || NO_ACCOUNT_DB(h))
\r
953 u = AcGetUser(h, name);
\r
964 USERGROUP *AcGetGroup(HUB *h, char *name)
\r
968 if (h == NULL || name == NULL || NO_ACCOUNT_DB(h))
\r
974 g = Search(h->HubDb->GroupList, &t);
\r
985 USER *AcGetUser(HUB *h, char *name)
\r
989 if (h == NULL || name == NULL || NO_ACCOUNT_DB(h))
\r
995 u = Search(h->HubDb->UserList, &t);
\r
1006 bool AcDeleteUser(HUB *h, char *name)
\r
1010 if (h == NULL || name == NULL)
\r
1015 u = AcGetUser(h, name);
\r
1021 if (Delete(h->HubDb->UserList, u))
\r
1032 bool AcDeleteGroup(HUB *h, char *name)
\r
1037 if (h == NULL || name == NULL)
\r
1042 g = AcGetGroup(h, name);
\r
1048 if (Delete(h->HubDb->GroupList, g))
\r
1053 for (i = 0;i < LIST_NUM(h->HubDb->UserList);i++)
\r
1055 USER *u = LIST_DATA(h->HubDb->UserList, i);
\r
1058 if (u->Group == g)
\r
1060 JoinUserToGroup(u, NULL);
\r
1072 bool AcAddGroup(HUB *h, USERGROUP *g)
\r
1075 if (h == NULL || g == NULL || NO_ACCOUNT_DB(h))
\r
1080 if (LIST_NUM(h->HubDb->GroupList) >= MAX_GROUPS)
\r
1085 if (AcIsGroup(h, g->Name) != false)
\r
1090 Insert(h->HubDb->GroupList, g);
\r
1097 bool AcAddUser(HUB *h, USER *u)
\r
1100 if (h == NULL || u == NULL || NO_ACCOUNT_DB(h))
\r
1105 if (LIST_NUM(h->HubDb->UserList) >= MAX_USERS)
\r
1110 if (AcIsUser(h, u->Name) != false)
\r
1115 Insert(h->HubDb->UserList, u);
\r
1122 void ReleaseUser(USER *u)
\r
1130 if (Release(u->ref) == 0)
\r
1137 void CleanupUser(USER *u)
\r
1145 DeleteLock(u->lock);
\r
1147 Free(u->RealName);
\r
1149 Free(u->GroupName);
\r
1150 if (u->Group != NULL)
\r
1152 ReleaseGroup(u->Group);
\r
1156 FreeAuthData(u->AuthType, u->AuthData);
\r
1164 FreeTraffic(u->Traffic);
\r
1170 void FreeAuthData(UINT authtype, void *authdata)
\r
1172 AUTHPASSWORD *pw = (AUTHPASSWORD *)authdata;
\r
1173 AUTHUSERCERT *uc = (AUTHUSERCERT *)authdata;
\r
1174 AUTHROOTCERT *rc = (AUTHROOTCERT *)authdata;
\r
1175 AUTHRADIUS *rd = (AUTHRADIUS *)authdata;
\r
1176 AUTHNT *nt = (AUTHNT *)authdata;
\r
1178 if (authtype == AUTHTYPE_ANONYMOUS || authdata == NULL)
\r
1185 case AUTHTYPE_PASSWORD:
\r
1190 case AUTHTYPE_USERCERT:
\r
1195 case AUTHTYPE_ROOTCERT:
\r
1197 if (rc->Serial != NULL)
\r
1199 FreeXSerial(rc->Serial);
\r
1201 if (rc->CommonName != NULL)
\r
1203 Free(rc->CommonName);
\r
1207 case AUTHTYPE_RADIUS:
\r
1209 Free(rd->RadiusUsername);
\r
1214 Free(nt->NtUsername);
\r
1222 USER *NewUser(char *name, wchar_t *realname, wchar_t *note, UINT authtype, void *authdata)
\r
1226 if (name == NULL || realname == NULL || note == NULL)
\r
1230 if (authtype != AUTHTYPE_ANONYMOUS && authdata == NULL)
\r
1235 u = ZeroMalloc(sizeof(USER));
\r
1236 u->lock = NewLock();
\r
1237 u->ref = NewRef();
\r
1238 u->Name = CopyStr(name);
\r
1239 u->RealName = CopyUniStr(realname);
\r
1240 u->Note = CopyUniStr(note);
\r
1241 u->GroupName = NULL;
\r
1243 u->AuthType = authtype;
\r
1244 u->AuthData = authdata;
\r
1245 u->CreatedTime = SystemTime64();
\r
1246 u->UpdatedTime = SystemTime64();
\r
1249 u->Traffic = NewTraffic();
\r
1255 void ReleaseGroup(USERGROUP *g)
\r
1263 if (Release(g->ref) == 0)
\r
1270 void CleanupGroup(USERGROUP *g)
\r
1279 Free(g->RealName);
\r
1289 FreeTraffic(g->Traffic);
\r
1291 DeleteLock(g->lock);
\r
1296 USERGROUP *NewGroup(char *name, wchar_t *realname, wchar_t *note)
\r
1300 if (name == NULL || realname == NULL || note == NULL)
\r
1305 g = ZeroMalloc(sizeof(USERGROUP));
\r
1306 g->lock = NewLock();
\r
1307 g->ref = NewRef();
\r
1308 g->Name = CopyStr(name);
\r
1309 g->RealName = CopyUniStr(realname);
\r
1310 g->Note = CopyUniStr(note);
\r
1312 g->Traffic = NewTraffic();
\r
1317 // HUB のアカウントデータベースのロック
\r
1318 void AcLock(HUB *h)
\r
1325 if (NO_ACCOUNT_DB(h))
\r
1331 LockList(h->HubDb->GroupList);
\r
1332 LockList(h->HubDb->UserList);
\r
1335 // HUB のアカウントデータベースのロック解除
\r
1336 void AcUnlock(HUB *h)
\r
1343 if (NO_ACCOUNT_DB(h))
\r
1348 // グループとユーザーをロック解除
\r
1349 UnlockList(h->HubDb->UserList);
\r
1350 UnlockList(h->HubDb->GroupList);
\r
1354 int CompareGroupName(void *p1, void *p2)
\r
1356 USERGROUP *g1, *g2;
\r
1358 if (p1 == NULL || p2 == NULL)
\r
1362 g1 = *(USERGROUP **)p1;
\r
1363 g2 = *(USERGROUP **)p2;
\r
1364 if (g1 == NULL || g2 == NULL)
\r
1369 return StrCmpi(g1->Name, g2->Name);
\r
1373 int CompareUserName(void *p1, void *p2)
\r
1377 if (p1 == NULL || p2 == NULL)
\r
1381 u1 = *(USER **)p1;
\r
1382 u2 = *(USER **)p2;
\r
1383 if (u1 == NULL || u2 == NULL)
\r
1388 return StrCmpi(u1->Name, u2->Name);
\r