private UriTemplateBuilder(SegmentList segments, QueryStringList queryString, Type controlledEntityType, bool isRegexMode = false) { _controlledEntityType = controlledEntityType; _isRegexMode = isRegexMode; _segments = segments; _queryString = queryString; }
public async Task <byte[]> SignAsync(string password, ReadOnlyMemory <byte> srcData, string certName, string flags, string comment, int numRetry = 5, CancellationToken cancel = default) { QueryStringList qs = new QueryStringList(); qs.Add("password", password); qs.Add("cert", certName); qs.Add("flags", flags); qs.Add("comment", comment); qs.Add("numretry", numRetry.ToString()); WebRet ret = await this.Web.SimplePostDataAsync(this.Url + "?" + qs, srcData.ToArray(), cancel, Consts.MimeTypes.OctetStream); if (ret.Data.Length <= (srcData.Length * 9L / 10L)) { throw new CoresException("ret.Data.Length <= (srcData.Length * 9L / 10L)"); } if (ExeSignChecker.CheckFileDigitalSignature(ret.Data, flags._InStr("driver", true)) == false) { throw new CoresException("CheckFileDigitalSignature failed."); } return(ret.Data); }
public async Task <HttpResult> PostHandlerAsync(WebMethods method, string path, QueryStringList queryString, HttpContext context, RouteData routeData, IPEndPoint local, IPEndPoint remote, CancellationToken cancel = default) { var request = context.Request; string str = await request._RecvStringContentsAsync(CoresConfig.DataVaultServerApp.MaxHttpPostRecvData, cancel : cancel); DataVaultData?recv = str._JsonToObject <DataVaultData>(); List <DataVaultData> list = new List <DataVaultData>(); if (recv != null) { recv.NormalizeReceivedData(); recv.StatGitCommitId = recv.StatGitCommitId._NonNullTrim(); recv.StatAppVer = recv.StatAppVer._NonNullTrim(); recv.TimeStamp = DtOffsetNow; recv.StatGlobalIp = remote.Address.ToString(); recv.StatGlobalPort = remote.Port; recv.StatGlobalFqdn = await LocalNet.GetHostNameSingleOrIpAsync(recv.StatGlobalIp, cancel); recv.StatLocalIp = recv.StatLocalIp._NonNullTrim(); if (recv.StatLocalIp._IsEmpty()) { recv.StatLocalIp = "127.0.0.1"; } recv.StatLocalFqdn = recv.StatLocalFqdn._NonNullTrim(); if (recv.StatLocalFqdn._IsEmpty()) { recv.StatLocalFqdn = "localhost"; } recv.StatUid = recv.StatUid._NonNullTrim(); if (recv.SystemName._IsFilled() && recv.LogName._IsFilled()) { // キー無し 1 つのディレクトリに全部書き込み try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "all"; d.KeyShortValue = "all"; d.KeyFullValue = "all"; list.Add(d); } catch (Exception ex) { ex._Debug(); } // UID からキーを生成 try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_uid"; d.KeyShortValue = recv.StatUid._TruncStr(2); d.KeyFullValue = recv.StatUid._TruncStr(4); list.Add(d); } catch (Exception ex) { ex._Debug(); } // グローバル IP からキーを生成 try { DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_global_ip"; d.KeyShortValue = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); d.KeyFullValue = IPUtil.GetHead2BytesIPString(recv.StatGlobalIp); list.Add(d); } catch (Exception ex) { ex._Debug(); } // グローバル FQDN からキーを生成 try { string shortKey, longKey; if (IPUtil.IsStrIP(recv.StatGlobalFqdn) == false) { // FQDN if (MasterData.DomainSuffixList.ParseDomainBySuffixList(recv.StatGlobalFqdn, out string tld, out string domain, out string hostname)) { // 正しい TLD 配下のドメイン // 例: 12345.abc.example.org の場合 // Short key は org.example.ab // Long key は org.example.abc.1 string domainReverse = domain._Split(StringSplitOptions.RemoveEmptyEntries, '.').Reverse()._Combine("."); string hostnameReverse = hostname._Split(StringSplitOptions.RemoveEmptyEntries, '.').Reverse()._Combine("."); shortKey = new string[] { domainReverse, hostnameReverse._TruncStr(2) }._Combine("."); longKey = new string[] { domainReverse, hostnameReverse._TruncStr(5) }._Combine("."); } else { // おかしなドメイン shortKey = recv.StatGlobalFqdn._TruncStr(2); longKey = recv.StatGlobalFqdn._TruncStr(4); } } else { // IP アドレス shortKey = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); longKey = IPUtil.GetHead1BytesIPString(recv.StatGlobalIp); } DataVaultData d = recv._CloneIfClonable(); d.KeyType = "by_global_fqdn"; d.KeyShortValue = shortKey; d.KeyFullValue = longKey; list.Add(d); }
// 実行スレッド void pingerThreadProc(object?param) { string optionsStr = this.DefaultOptions; // まずデフォルトのオプション文字列を読む string hostname = TargetHost; if (hostname._InStri("@")) { if (hostname._GetKeyAndValue(out string hostname2, out string tmp, "@")) { hostname = hostname2; // オプション文字列が個別に指定されていた場合は、それを先に付ける。同じ項目について上書きをすることになる、 optionsStr = tmp._NonNull() + "," + optionsStr; } } // オプション文字列のパース var options = QueryStringList.Parse(optionsStr, splitChar: ',', trimKeyAndValue: true); // IP アドレスバージョンの決定 AllowedIPVersions allowedIPVersions = AllowedIPVersions.All; string ipVerStr = options._GetStrFirst("ipver"); if (ipVerStr._InStr("4") && ipVerStr._InStr("6") == false) { allowedIPVersions = AllowedIPVersions.IPv4; } else if (ipVerStr._InStr("6") && ipVerStr._InStr("4") == false) { allowedIPVersions = AllowedIPVersions.IPv6; } bool preferV6 = false; string ipperfer = options._GetStrFirst("ipprefer"); if (ipperfer._InStri("6")) { preferV6 = true; } IPAddress GetIpAddress(string hostname, AllowedIPVersions allowedIPVersions) { var ip = hostname._ToIPAddress(allowedIPVersions, true); if (ip != null) { return(ip); } return(this.DnsClient.GetIpAddressAsync(hostname, allowedIPVersions, preferV6, noCache: true)._GetResult()); } if (TargetPort == 0) { // ping の実行 try { IPAddress ip = GetIpAddress(hostname, allowedIPVersions); SendPingReply ret = SendPing.Send(ip, null, Timeout); lock (lockObj) { ok = ret.Ok; finished = true; } } catch { lock (lockObj) { ok = false; finished = true; } } Console.Write(ok ? "+" : "-"); } else { int port = TargetPort; bool tcp_check = false; if (port >= 100000) { port -= 100000; tcp_check = true; } // TCP Connect の実行 try { if (tcp_check == false) { IPAddress ip = GetIpAddress(hostname, allowedIPVersions); Sock s = Sock.Connect(ip.ToString(), port, Timeout, true, true); try { if (TcpSendData) { s.SetTimeout(Timeout); long end_tick = Time.Tick64 + (long)Timeout; int num_packets = 0; while (true) { if (Time.Tick64 > end_tick) { break; } if (num_packets >= 16) { break; } byte[] data = new byte[1]; data[0] = (byte)'a'; if (s.SendAll(data) == false) { break; } ThreadObj.Sleep(1); num_packets++; } } s.Disconnect(); } catch { } } else { IPAddress ip = GetIpAddress(hostname, allowedIPVersions); if (tcp_check_do(ip.ToString(), port, Timeout) == false) { throw new ApplicationException(); } } lock (lockObj) { ok = true; finished = true; } } catch { lock (lockObj) { ok = false; finished = true; } } Console.Write(ok ? "*" : "-"); } //EndEvent.Set(); }