Beispiel #1
0
 private UriTemplateBuilder(SegmentList segments, QueryStringList queryString, Type controlledEntityType, bool isRegexMode = false)
 {
     _controlledEntityType = controlledEntityType;
     _isRegexMode          = isRegexMode;
     _segments             = segments;
     _queryString          = queryString;
 }
Beispiel #2
0
    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);
    }
Beispiel #3
0
    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);
                }
Beispiel #4
0
    // 実行スレッド
    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();
    }