// Create new user object USER *NewUser(char *name, wchar_t *realname, wchar_t *note, UINT authtype, void *authdata) { USER *u; // Validate arguments if (name == NULL || realname == NULL || note == NULL) { return NULL; } if (authtype != AUTHTYPE_ANONYMOUS && authdata == NULL) { return NULL; } u = ZeroMalloc(sizeof(USER)); u->lock = NewLock(); u->ref = NewRef(); u->Name = CopyStr(name); u->RealName = CopyUniStr(realname); u->Note = CopyUniStr(note); u->GroupName = NULL; u->Group = NULL; u->AuthType = authtype; u->AuthData = authdata; u->CreatedTime = SystemTime64(); u->UpdatedTime = SystemTime64(); u->Policy = NULL; u->Traffic = NewTraffic(); return u; }
// Create the EL EL *NewEl() { EL *e; #ifdef OS_WIN32 RegistWindowsFirewallAll(); #endif e = ZeroMalloc(sizeof(EL)); e->lock = NewLock(); e->ref = NewRef(); e->Cedar = NewCedar(NULL, NULL); // Ethernet initialization InitEth(); // Setting initialization ElInitConfig(e); // Listener start ElStartListener(e); // Initialize the license status ElParseCurrentLicenseStatus(e->LicenseSystem, e->LicenseStatus); // Eraser start e->Eraser = NewEraser(NULL, e->AutoDeleteCheckDiskFreeSpaceMin); return e; }
// Start Cedar log void StartCedarLog() { if (cedar_log_ref == NULL) { cedar_log_ref = NewRef(); } else { AddRef(cedar_log_ref); } cedar_log = NewLog("debug_log", "debug", LOG_SWITCH_DAY); }
// Creating an event object EVENT *NewEvent() { // Memory allocation EVENT *e = Malloc(sizeof(EVENT)); // Reference counter e->ref = NewRef(); // Event initialization OSInitEvent(e); // KS KS_INC(KS_NEWEVENT_COUNT); return e; }
// Create a new EtherIP server ETHERIP_SERVER *NewEtherIPServer(CEDAR *cedar, IPSEC_SERVER *ipsec, IKE_SERVER *ike, IP *client_ip, UINT client_port, IP *server_ip, UINT server_port, char *crypt_name, bool is_tunnel_mode, UINT crypt_block_size, char *client_id, UINT id) { ETHERIP_SERVER *s; // Validate arguments if (cedar == NULL || ipsec == NULL || ike == NULL || client_ip == NULL || server_ip == NULL || client_id == NULL) { return NULL; } s = ZeroMalloc(sizeof(ETHERIP_SERVER)); s->Ref = NewRef(); s->Id = id; s->Cedar = cedar; AddRef(s->Cedar->ref); s->IPsec = ipsec; s->Ike = ike; s->IsTunnelMode = is_tunnel_mode; StrCpy(s->ClientId, sizeof(s->ClientId), client_id); s->SendPacketList = NewList(NULL); s->Now = Tick64(); s->Lock = NewLock(); Copy(&s->ClientIP, client_ip, sizeof(IP)); s->ClientPort = client_port; Copy(&s->ServerIP, server_ip, sizeof(IP)); s->ServerPort = server_port; StrCpy(s->CryptName, sizeof(s->CryptName), crypt_name); s->CryptBlockSize = crypt_block_size; EtherIPLog(s, "LE_START_MODULE"); return s; }
// Create new group object USERGROUP *NewGroup(char *name, wchar_t *realname, wchar_t *note) { USERGROUP *g; // Validate arguments if (name == NULL || realname == NULL || note == NULL) { return NULL; } g = ZeroMalloc(sizeof(USERGROUP)); g->lock = NewLock(); g->ref = NewRef(); g->Name = CopyStr(name); g->RealName = CopyUniStr(realname); g->Note = CopyUniStr(note); g->Policy = NULL; g->Traffic = NewTraffic(); return g; }
// Create a new L3 switch L3SW *NewL3Sw(CEDAR *c, char *name) { L3SW *o; // Validate arguments if (c == NULL || name == NULL) { return NULL; } o = ZeroMalloc(sizeof(L3SW)); StrCpy(o->Name, sizeof(o->Name), name); o->lock = NewLock(); o->ref = NewRef(); o->Cedar = c; o->Active = false; o->IfList = NewList(CmpL3If); o->TableList = NewList(CmpL3Table); return o; }
// Create Cedar object CEDAR *NewCedar(X *server_x, K *server_k) { CEDAR *c; char tmp[MAX_SIZE]; char tmp2[MAX_SIZE]; char *beta_str; CedarForceLink(); c = ZeroMalloc(sizeof(CEDAR)); c->CurrentActiveLinks = NewCounter(); c->AcceptingSockets = NewCounter(); c->CedarSuperLock = NewLock(); c->CurrentRegionLock = NewLock(); StrCpy(c->OpenVPNDefaultClientOption, sizeof(c->OpenVPNDefaultClientOption), OVPN_DEF_CLIENT_OPTION_STRING); #ifdef BETA_NUMBER c->Beta = BETA_NUMBER; #endif // BETA_NUMBER InitNoSslList(c); c->AssignedBridgeLicense = NewCounter(); c->AssignedClientLicense = NewCounter(); c->CurrentTcpQueueSizeLock = NewLock(); c->QueueBudgetLock = NewLock(); c->FifoBudgetLock = NewLock(); Rand(c->UniqueId, sizeof(c->UniqueId)); c->CreatedTick = Tick64(); c->lock = NewLock(); c->ref = NewRef(); c->OpenVPNPublicPortsLock = NewLock(); c->CurrentTcpConnections = GetNumTcpConnectionsCounter(); c->ListenerList = NewList(CompareListener); c->UDPEntryList = NewList(CompareUDPEntry); c->HubList = NewList(CompareHub); c->ConnectionList = NewList(CompareConnection); c->ConnectionIncrement = NewCounter(); c->CurrentSessions = NewCounter(); if (server_k && server_x) { c->ServerK = CloneK(server_k); c->ServerX = CloneX(server_x); } c->Version = CEDAR_VER; c->Build = CEDAR_BUILD; c->ServerStr = CopyStr(CEDAR_SERVER_STR); GetMachineName(tmp, sizeof(tmp)); c->MachineName = CopyStr(tmp); c->HttpUserAgent = CopyStr(DEFAULT_USER_AGENT); c->HttpAccept = CopyStr(DEFAULT_ACCEPT); c->HttpAcceptLanguage = CopyStr("ja"); c->HttpAcceptEncoding = CopyStr(DEFAULT_ENCODING); c->Traffic = NewTraffic(); c->TrafficLock = NewLock(); c->CaList = NewList(CompareCert); c->TrafficDiffList = NewList(NULL); SetCedarCipherList(c, "RC4-MD5"); c->ClientId = _II("CLIENT_ID"); c->UdpPortList = NewIntList(false); InitNetSvcList(c); InitLocalBridgeList(c); InitCedarLayer3(c); c->WebUI = WuNewWebUI(c); #ifdef ALPHA_VERSION beta_str = "Alpha"; #else // ALPHA_VERSION #ifndef RELEASE_CANDIDATE beta_str = "Beta"; #else // RELEASE_CANDIDATE beta_str = "Release Candidate"; #endif // RELEASE_CANDIDATE #endif // ALPHA_VERSION ToStr(tmp2, c->Beta); Format(tmp, sizeof(tmp), "Version %u.%02u Build %u %s %s (%s)", CEDAR_VER / 100, CEDAR_VER - (CEDAR_VER / 100) * 100, CEDAR_BUILD, c->Beta == 0 ? "" : beta_str, c->Beta == 0 ? "" : tmp2, _SS("LANGSTR")); Trim(tmp); if (true) { SYSTEMTIME st; Zero(&st, sizeof(st)); st.wYear = BUILD_DATE_Y; st.wMonth = BUILD_DATE_M; st.wDay = BUILD_DATE_D; c->BuiltDate = SystemToUINT64(&st); } c->VerString = CopyStr(tmp); Format(tmp, sizeof(tmp), "Compiled %04u/%02u/%02u %02u:%02u:%02u by %s at %s", BUILD_DATE_Y, BUILD_DATE_M, BUILD_DATE_D, BUILD_DATE_HO, BUILD_DATE_MI, BUILD_DATE_SE, BUILDER_NAME, BUILD_PLACE); c->BuildInfo = CopyStr(tmp); return c; }
LISTENER *NewListenerEx5(CEDAR *cedar, UINT proto, UINT port, THREAD_PROC *proc, void *thread_param, bool local_only, bool shadow_ipv6, volatile UINT *natt_global_udp_port, UCHAR rand_port_id, bool enable_ca) { LISTENER *r; THREAD *t; // Validate arguments if ((proto == LISTENER_TCP && port == 0) || cedar == NULL) { return NULL; } // Check the protocol number if (proto != LISTENER_TCP && proto != LISTENER_INPROC && proto != LISTENER_RUDP && proto != LISTENER_ICMP && proto != LISTENER_DNS && proto != LISTENER_REVERSE) { return NULL; } r = ZeroMalloc(sizeof(LISTENER)); r->ThreadProc = proc; r->ThreadParam = thread_param; r->Cedar = cedar; AddRef(r->Cedar->ref); r->lock = NewLock(); r->ref = NewRef(); r->Protocol = proto; r->Port = port; r->Event = NewEvent(); r->LocalOnly = local_only; r->ShadowIPv6 = shadow_ipv6; r->NatTGlobalUdpPort = natt_global_udp_port; r->RandPortId = rand_port_id; r->EnableConditionalAccept = enable_ca; if (r->ShadowIPv6 == false) { if (proto == LISTENER_TCP) { SLog(cedar, "LS_LISTENER_START_1", port); } } // Creating a thread t = NewThread(ListenerThread, r); WaitThreadInit(t); ReleaseThread(t); if (r->ShadowIPv6 == false && proto == LISTENER_TCP) { if (r->Cedar->DisableIPv6Listener == false) { // Add a shadow listener r->ShadowListener = NewListenerEx3(cedar, proto, port, proc, thread_param, local_only, true); } } if (r->ShadowIPv6 == false) { // Add to the Cedar AddListener(cedar, r); } return r; }
// Create a Link LINK *NewLink(CEDAR *cedar, HUB *hub, CLIENT_OPTION *option, CLIENT_AUTH *auth, POLICY *policy) { CLIENT_OPTION *o; LINK *k; CLIENT_AUTH *a; // Validate arguments if (cedar == NULL || hub == NULL || option == NULL || auth == NULL || policy == NULL) { return NULL; } if (hub->Halt) { return NULL; } if (LIST_NUM(hub->LinkList) >= MAX_HUB_LINKS) { return NULL; } if (UniIsEmptyStr(option->AccountName)) { return NULL; } // Limitation of authentication method if (auth->AuthType != CLIENT_AUTHTYPE_ANONYMOUS && auth->AuthType != CLIENT_AUTHTYPE_PASSWORD && auth->AuthType != CLIENT_AUTHTYPE_PLAIN_PASSWORD && auth->AuthType != CLIENT_AUTHTYPE_CERT) { // Authentication method other than anonymous authentication, password authentication, plain password, certificate authentication cannot be used return NULL; } // Copy of the client options (for modification) o = ZeroMalloc(sizeof(CLIENT_OPTION)); Copy(o, option, sizeof(CLIENT_OPTION)); StrCpy(o->DeviceName, sizeof(o->DeviceName), LINK_DEVICE_NAME); o->RequireBridgeRoutingMode = true; // Request the bridge mode o->RequireMonitorMode = false; // Not to require the monitor mode o->NumRetry = INFINITE; // Retry the connection infinitely o->RetryInterval = 10; // Retry interval is 10 seconds o->NoRoutingTracking = true; // Stop the routing tracking // Copy the authentication data a = CopyClientAuth(auth); a->SecureSignProc = NULL; a->CheckCertProc = NULL; // Link object k = ZeroMalloc(sizeof(LINK)); k->lock = NewLock(); k->ref = NewRef(); k->Cedar = cedar; k->Option = o; k->Auth = a; k->Hub = hub; // Copy the policy k->Policy = ZeroMalloc(sizeof(POLICY)); Copy(k->Policy, policy, sizeof(POLICY)); // Normalize the policy NormalizeLinkPolicy(k->Policy); // Register in the link list of the HUB LockList(hub->LinkList); { Add(hub->LinkList, k); AddRef(k->ref); } UnlockList(hub->LinkList); return k; }
// リンクの作成 LINK *NewLink(CEDAR *cedar, HUB *hub, CLIENT_OPTION *option, CLIENT_AUTH *auth, POLICY *policy) { CLIENT_OPTION *o; LINK *k; CLIENT_AUTH *a; // 引数チェック if (cedar == NULL || hub == NULL || option == NULL || auth == NULL || policy == NULL) { return NULL; } if (hub->Halt) { return NULL; } if (LIST_NUM(hub->LinkList) >= MAX_HUB_LINKS) { return NULL; } if (UniIsEmptyStr(option->AccountName)) { return NULL; } // 認証方法の制限 if (auth->AuthType != CLIENT_AUTHTYPE_ANONYMOUS && auth->AuthType != CLIENT_AUTHTYPE_PASSWORD && auth->AuthType != CLIENT_AUTHTYPE_PLAIN_PASSWORD && auth->AuthType != CLIENT_AUTHTYPE_CERT) { // 匿名認証、パスワード認証、プレーンパスワード、証明書認証以外の認証方法は使用できない return NULL; } // クライアントオプションのコピー (改変用) o = ZeroMalloc(sizeof(CLIENT_OPTION)); Copy(o, option, sizeof(CLIENT_OPTION)); StrCpy(o->DeviceName, sizeof(o->DeviceName), LINK_DEVICE_NAME); o->RequireBridgeRoutingMode = true; // ブリッジモードを要求する o->RequireMonitorMode = false; // モニタモードは要求しない o->NumRetry = INFINITE; // 接続の再試行は無限に行う o->RetryInterval = 10; // 再試行間隔は 10 秒 o->NoRoutingTracking = true; // ルーティング追跡停止 // 認証データのコピー a = CopyClientAuth(auth); a->SecureSignProc = NULL; a->CheckCertProc = NULL; // リンク オブジェクト k = ZeroMalloc(sizeof(LINK)); k->lock = NewLock(); k->ref = NewRef(); k->Cedar = cedar; k->Option = o; k->Auth = a; k->Hub = hub; // ポリシーのコピー k->Policy = ZeroMalloc(sizeof(POLICY)); Copy(k->Policy, policy, sizeof(POLICY)); // ポリシーの正規化 NormalizeLinkPolicy(k->Policy); // HUB のリンクリストに登録する LockList(hub->LinkList); { Add(hub->LinkList, k); AddRef(k->ref); } UnlockList(hub->LinkList); return k; }