Exemple #1
0
        public Server(Kanel kanel,OpBase opBase)
            : base(kanel, opBase, PROTOCOL_KIND.TCP, USE_ACL.ON)
        {
            cache = new Cache(this.Logger,this.OpBase);

            // 上位プロキシを経由しないサーバのリスト
            Dat dat = opBase.ValDat("disableAddress");
            foreach (OneLine oneLine in dat.Lines) {
                if (oneLine.Enabled) {//有効なデータだけを対象にする
                    disableAddressList.Add((string)oneLine.ValList[0].Obj);
                }
            }
            //URL制限
            limitUrl = new LimitUrl(opBase.ValDat("limitUrl"),(opBase.ValRadio("enableUrl")==0)?true:false);

            //リクエストを通常ログで表示する
            useRequestLog = opBase.ValBool("useRequestLog");

            //コンテンツ制限
            limitString = new LimitString(opBase.ValDat("limitString"));
            if (limitString.Length == 0)
                limitString = null;

            dataPort = dataPortMin;

            //初期化成功(isInitSuccess==trueでないとStart()を実行してもスレッド開始できない)
            isInitSuccess = true;
        }
Exemple #2
0
        public Server(Kanel kanel, OpBase opBase)
            : base(kanel, opBase, PROTOCOL_KIND.TCP, USE_ACL.ON)
        {
            cache = new Cache(this.Logger, this.OpBase);

            // 上位プロキシを経由しないサーバのリスト
            Dat dat = opBase.ValDat("disableAddress");

            foreach (OneLine oneLine in dat.Lines)
            {
                if (oneLine.Enabled)  //有効なデータだけを対象にする
                {
                    disableAddressList.Add((string)oneLine.ValList[0].Obj);
                }
            }
            //URL制限
            limitUrl = new LimitUrl(opBase.ValDat("limitUrl"), (opBase.ValRadio("enableUrl") == 0)?true:false);


            //リクエストを通常ログで表示する
            useRequestLog = opBase.ValBool("useRequestLog");

            //コンテンツ制限
            limitString = new LimitString(opBase.ValDat("limitString"));
            if (limitString.Length == 0)
            {
                limitString = null;
            }

            dataPort = dataPortMin;

            //初期化成功(isInitSuccess==trueでないとStart()を実行してもスレッド開始できない)
            isInitSuccess = true;
        }
Exemple #3
0
 public void AllowTest(string str, LimitKind limitKind, string target, bool isAllow)
 {
     var allow = new Dat(new[]{CtrlType.TextBox, CtrlType.Int });
     var deny = new Dat(new[] { CtrlType.TextBox, CtrlType.Int });
     allow = AddDat(allow, limitKind, str);
     var limitUrl = new LimitUrl(allow, deny);
     var errorStr = "";
     Assert.AreEqual(limitUrl.IsAllow(target, ref errorStr), isAllow);
 }
Exemple #4
0
        public Server(Kernel kernel, Conf conf, OneBind oneBind)
            : base(kernel, conf, oneBind)
        {
            _cache = new Cache(kernel, this.Logger, conf);

            // 上位プロキシを経由しないサーバのリスト
            foreach (var o in (Dat)Conf.Get("disableAddress"))
            {
                if (o.Enable)  //有効なデータだけを対象にする
                {
                    _disableAddressList.Add(o.StrList[0]);
                }
            }
            //URL制限
            var allow = (Dat)Conf.Get("limitUrlAllow");
            var deny  = (Dat)Conf.Get("limitUrlDeny");

            //Ver5.4.5正規表現の誤りをチェックする
            for (var i = 0; i < 2; i++)
            {
                foreach (var a in (i == 0) ? allow : deny)
                {
                    if (a.Enable && a.StrList[1] == "3")  //正規表現
                    {
                        try {
                            var regex = new Regex(a.StrList[0]);
                        } catch {
                            Logger.Set(LogKind.Error, null, 28, a.StrList[0]);
                        }
                    }
                }
            }
            _limitUrl = new LimitUrl(allow, deny);

            //アクセス元プログラム制限
            var allowProg = (Dat)Conf.Get("limitSrcProgAllow");
            var denyProg  = (Dat)Conf.Get("limitSrcProgDeny");

            _limitSrcProg = new LimitSrcProg(this.Logger, allowProg, denyProg);

            //リクエストを通常ログで表示する
            _useRequestLog = (bool)Conf.Get("useRequestLog");

            //コンテンツ制限
            _limitString = new LimitString((Dat)Conf.Get("limitString"));
            if (_limitString.Length == 0)
            {
                _limitString = null;
            }

            _dataPort = DataPortMin;
        }
Exemple #5
0
        public Server(Kernel kernel, Conf conf,OneBind oneBind)
            : base(kernel, conf,oneBind)
        {
            _cache = new Cache(kernel,this.Logger,conf);

            // 上位プロキシを経由しないサーバのリスト
            foreach (var o in (Dat)Conf.Get("disableAddress")) {
                if (o.Enable) {//有効なデータだけを対象にする
                    _disableAddressList.Add(o.StrList[0]);
                }
            }
            //URL制限
            var allow = (Dat)Conf.Get("limitUrlAllow");
            var deny = (Dat)Conf.Get("limitUrlDeny");
            //Ver5.4.5正規表現の誤りをチェックする
            for (var i = 0; i < 2; i++) {
                foreach (var a in (i == 0) ? allow : deny) {
                    if (a.Enable && a.StrList[1] == "3") {//正規表現
                        try {
                            var regex = new Regex(a.StrList[0]);
                        } catch {
                            Logger.Set(LogKind.Error, null, 28, a.StrList[0]);
                        }
                    }
                }
            }
            _limitUrl = new LimitUrl(allow,deny);

            //リクエストを通常ログで表示する
            _useRequestLog = (bool)Conf.Get("useRequestLog");

            //コンテンツ制限
            _limitString = new LimitString((Dat)Conf.Get("limitString"));
            if (_limitString.Length == 0)
                _limitString = null;

            _dataPort = DataPortMin;
        }
Exemple #6
0
        //リクエスト行・ヘッダ・POSTデータ
        public bool RecvRequest(bool useRequestLog, LimitUrl limitUrl, ILife iLife)
        {
            //リクエスト取得(内部データは初期化される)ここのタイムアウト値は、大きすぎるとブラウザの切断を取得できないでブロックしてしまう
            if (!Request.Recv(Proxy.Logger, Proxy.Sock(CS.Client), /*timeout*/ 3, iLife))
            {
                return(false);
            }
            //ヘッダの取得
            if (!Header[CS.Client].Recv(Proxy.Sock(CS.Client), Proxy.OptionTimeout, iLife))
            {
                return(false);
            }
            //POSTの場合は、更にクライアントからのデータを読み込む
            if (Request.Protocol == ProxyProtocol.Http && Request.HttpMethod == HttpMethod.Post)  //POSTの場合
            {
                string strContentLength = Header[CS.Client].GetVal("Content-Length");
                if (strContentLength != null)
                {
                    try {
                        var len = Convert.ToInt32(strContentLength);
                        //Ver5.9.7
//                        if(0 < len) {
//                            Body[CS.Client].Set(Proxy.Sock(CS.Client).Recv(len,Proxy.OptionTimeout,iLife));
//                        }
                        if (0 < len)
                        {
                            var buf = new byte[0];
                            while (iLife.IsLife())
                            {
                                var size = len - buf.Length;
                                var b    = Proxy.Sock(CS.Client).Recv(size, Proxy.OptionTimeout, iLife);
                                buf = Bytes.Create(buf, b);
                                if (len <= buf.Length)
                                {
                                    break;
                                }
                            }
                            Body[CS.Client].Set(buf);
                        }
                    } catch {
                        Proxy.Logger.Set(LogKind.Error, null, 22, Request.Uri);
                        return(false);
                    }
                }
            }

            //bool useRequestLog リクエストを通常ログで表示する
            //proxy.Logger.Set(useRequestLog ? LogKind.Normal : LogKind.Detail,null,0,string.Format("{0}",Request.RequestStr));
            Proxy.Logger.Set(useRequestLog ? LogKind.Normal : LogKind.Detail, Proxy.Sock(CS.Client), 0, string.Format("{0}", Request.RequestStr));

            //URL制限
            string[] tmp = Request.RequestStr.Split(' ');
            if (tmp.Length != 3)
            {
                Proxy.Logger.Set(LogKind.Normal, null, 10, "a parameter includes a problem");
                return(false);
            }
            string errorStr = "";

            if (!limitUrl.IsAllow(tmp[1], ref errorStr))
            {
                Proxy.Logger.Set(LogKind.Normal, null, 10, errorStr);
                return(false);
            }
            return(true);
        }
Exemple #7
0
        //リクエスト行・ヘッダ・POSTデータ
        public bool RecvRequest(bool useRequestLog,LimitUrl limitUrl,ILife iLife)
        {
            //リクエスト取得(内部データは初期化される)ここのタイムアウト値は、大きすぎるとブラウザの切断を取得できないでブロックしてしまう
            if(!Request.Recv(Proxy.Logger,Proxy.Sock(CS.Client),/*timeout*/3,iLife)) {
                return false;
            }
            //ヘッダの取得
            if(!Header[CS.Client].Recv(Proxy.Sock(CS.Client),Proxy.OptionTimeout,iLife)) {
                return false;
            }
            //POSTの場合は、更にクライアントからのデータを読み込む
            if (Request.Protocol == ProxyProtocol.Http && Request.HttpMethod == HttpMethod.Post) {//POSTの場合
                string strContentLength = Header[CS.Client].GetVal("Content-Length");
                if(strContentLength != null) {
                    try {
                        var len = Convert.ToInt32(strContentLength);
                        //Ver5.9.7
            //                        if(0 < len) {
            //                            Body[CS.Client].Set(Proxy.Sock(CS.Client).Recv(len,Proxy.OptionTimeout,iLife));
            //                        }
                        if (0 < len) {
                            var buf = new byte[0];
                            while (iLife.IsLife()) {
                                var size = len - buf.Length;
                                var b = Proxy.Sock(CS.Client).Recv(size, Proxy.OptionTimeout, iLife);
                                buf = Bytes.Create(buf, b);
                                if (len <= buf.Length) {
                                    break;
                                }
                            }
                            Body[CS.Client].Set(buf);
                        }

                    } catch {
                        Proxy.Logger.Set(LogKind.Error,null,22,Request.Uri);
                        return false;
                    }
                }
            }

            //bool useRequestLog リクエストを通常ログで表示する
            //proxy.Logger.Set(useRequestLog ? LogKind.Normal : LogKind.Detail,null,0,string.Format("{0}",Request.RequestStr));
            Proxy.Logger.Set(useRequestLog ? LogKind.Normal : LogKind.Detail,Proxy.Sock(CS.Client),0,string.Format("{0}",Request.RequestStr));

            //URL制限
            string[] tmp = Request.RequestStr.Split(' ');
            if (tmp.Length != 3) {
                Proxy.Logger.Set(LogKind.Normal, null, 10, "a parameter includes a problem");
                return false;
            }
            string errorStr = "";
            if (!limitUrl.IsAllow(tmp[1], ref errorStr)) {
                Proxy.Logger.Set(LogKind.Normal, null, 10, errorStr);
                return false;
            }
            return true;
        }