// Set the connection settings UINT NtSetClientConfig(NAT *n, RPC_CREATE_LINK *t) { Lock(n->lock); { if (n->ClientOption != NULL || n->ClientAuth != NULL) { Free(n->ClientOption); CiFreeClientAuth(n->ClientAuth); } n->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION)); Copy(n->ClientOption, t->ClientOption, sizeof(CLIENT_OPTION)); n->ClientAuth = CopyClientAuth(t->ClientAuth); } Unlock(n->lock); NiWriteConfig(n); if (n->Online) { NtOffline(n, NULL); NtOnline(n, NULL); } return ERR_NO_ERROR; }
// Edit the client configuration void NmEditClientConfig(HWND hWnd, RPC *r) { CM_ACCOUNT a; RPC_CREATE_LINK t; bool ret = false; // Validate arguments if (hWnd == NULL || r == NULL) { return; } Zero(&a, sizeof(a)); Zero(&t, sizeof(t)); a.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION)); a.NatMode = true; a.Rpc = r; if (CALLEX(hWnd, NcGetClientConfig(r, &t)) != ERR_NO_ERROR) { // Create New a.ClientOption->Port = 443; a.ClientOption->RetryInterval = 15; a.ClientOption->NumRetry = INFINITE; a.ClientOption->AdditionalConnectionInterval = 1; a.ClientOption->UseEncrypt = true; a.ClientOption->NoRoutingTracking = true; a.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH)); a.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD; } else { // Edit a.EditMode = true; Copy(a.ClientOption, t.ClientOption, sizeof(CLIENT_OPTION)); a.ClientAuth = CopyClientAuth(t.ClientAuth); FreeRpcCreateLink(&t); } ret = CmEditAccountDlg(hWnd, &a); Free(a.ServerCert); Free(a.ClientOption); CiFreeClientAuth(a.ClientAuth); }
// Get the connection settings UINT NtGetClientConfig(NAT *n, RPC_CREATE_LINK *t) { UINT err = ERR_NO_ERROR; Lock(n->lock); { if (n->ClientOption == NULL || n->ClientAuth == NULL) { err = ERR_ACCOUNT_NOT_PRESENT; } else { FreeRpcCreateLink(t); Zero(t, sizeof(RPC_CREATE_LINK)); t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION)); Copy(t->ClientOption, n->ClientOption, sizeof(CLIENT_OPTION)); t->ClientAuth = CopyClientAuth(n->ClientAuth); } } Unlock(n->lock); return err; }
// 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; }