Exemple #1
0
        private bool JobPasv(Session session, FtpCmd ftpCmd)
        {
            var port = session.Port;
            var ip   = session.SockCtrl.LocalIp;

            // �f�[�^�X�g���[���̃\�P�b�g�̍쐬
            for (int i = 0; i < 100; i++)
            {
                port++;
                if (port >= 9999)
                {
                    port = 2000;
                }
                //�o�C���h�”\���ǂ����̊m�F
                if (SockServer.IsAvailable(Kernel, ip, port))
                {
                    //����
                    if (ftpCmd == FtpCmd.Epsv)
                    {
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port));
                        session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port));
                    }
                    else
                    {
                        var ipStr = ip.ToString();
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256));
                        session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256));
                    }
                    //�w�肵���A�h���X�E�|�[�g�ő҂��󂯂�
                    var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this);
                    if (sockData == null)
                    {
                        //�ڑ����s
                        return(false);
                    }
                    if (sockData.SockState != Bjd.sock.SockState.Error)
                    {
                        //�Z�b�V�������̕ۑ�
                        session.Port     = port;
                        session.SockData = sockData;
                        return(true);
                    }
                }
            }
            session.StringSend("500 command not understood:");
            return(true);
        }
Exemple #2
0
        private bool JobPasv(Session session, FtpCmd ftpCmd)
        {
            var port = session.Port;
            var ip   = session.SockCtrl.LocalIp;

            // データストリームのソケットの作成
            for (int i = 0; i < 100; i++)
            {
                port++;
                if (port >= 9999)
                {
                    port = 2000;
                }
                //バインド可能かどうかの確認
                if (SockServer.IsAvailable(Kernel, ip, port))
                {
                    //成功
                    if (ftpCmd == FtpCmd.Epsv)
                    {
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("229 Entering Extended Passive Mode. (|||{0}|)", port));
                        session.StringSend(string.Format("229 Entering Extended Passive Mode (|||{0}|)", port));
                    }
                    else
                    {
                        var ipStr = ip.ToString();
                        //Java fix Ver5.8.3
                        //session.StringSend(string.Format("227 Entering Passive Mode. ({0},{1},{2})", ipStr.Replace('.',','), port/256, port%256));
                        session.StringSend(string.Format("227 Entering Passive Mode ({0},{1},{2})", ipStr.Replace('.', ','), port / 256, port % 256));
                    }
                    //指定したアドレス・ポートで待ち受ける
                    var sockData = SockServer.CreateConnection(Kernel, ip, port, null, this);
                    if (sockData == null)
                    {
                        //接続失敗
                        return(false);
                    }
                    if (sockData.SockState != Bjd.sock.SockState.Error)
                    {
                        //セッション情報の保存
                        session.Port     = port;
                        session.SockData = sockData;
                        return(true);
                    }
                }
            }
            session.StringSend("500 command not understood:");
            return(true);
        }
Exemple #3
0
        //protected override byte[] AssumptionLine(byte[] buf,ILife iLife) {
        byte[] AssumptionLine(byte[] buf, ILife iLife)
        {
            //stringに変換してから処理する
            var str = Encoding.ASCII.GetString(buf);

            Logger.Set(LogKind.Detail, null, 7, str);

            var index = str.IndexOf(" ");

            if (index < 0)
            {
                goto end;
            }

            var cmdStr   = str.Substring(0, index);
            var paramStr = str.Substring(index + 1);

            if (cmdStr == "227")
            {
                //PASVに対するレスポンス

                //**********************************************************************
                // 「PASV 192.168.22.102,23,15」コマンドからサーバ側の情報を取得する
                //**********************************************************************
                var tmp2 = paramStr.Split('(', ')');
                if (tmp2.Length != 3)
                {
                    Logger.Set(LogKind.Error, null, 5, str);
                    goto end;
                }
                string[] tmp = tmp2[1].Split(',');
                if (tmp.Length != 6)
                {
                    Logger.Set(LogKind.Error, null, 6, str);
                    goto end;
                }
                var connectIp   = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3]));
                var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]);

                //**********************************************************************
                // クライアント側用のListenソケットを生成する
                //**********************************************************************
                var listenIp = Sock[CS.Client].LocalIp;
                // 利用可能なデータポートの選定
                int listenPort = 0;
                while (iLife.IsLife())
                {
                    _dataPort++;
                    if (SockServer.IsAvailable(_kernel, listenIp, _dataPort))
                    {
                        listenPort = _dataPort;
                        break;
                    }
                }

                //**********************************************************************
                // クライアント側に送る227レスポンスを生成する
                //**********************************************************************
                str = string.Format("227 Entering Passive Mode ({0},{1},{2},{3},{4},{5})\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256);
                buf = Encoding.ASCII.GetBytes(str);

                //データスレッドの準備
                if (_dataTunnel != null)
                {
                    _dataTunnel.Dispose();
                }
                _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this);
                _dataTunnel.Start();
                Thread.Sleep(3);      //Listenが完了してから 227を送信する
            }
            else if (cmdStr == "226") //Transfer complete.
            //_dataTunnel.WaitComplate();
            //Thread.Sleep(10);
            //_dataTunnel.Stop();
            {
            }
            else if (cmdStr.ToUpper() == "PORT")
            {
                //**********************************************************************
                //「PORT 192.168.22.102,23,15」コマンドからクライアント側の情報を取得する
                //**********************************************************************
                var tmp = paramStr.Split(',');
                if (tmp.Length != 6)
                {
                    Logger.Set(LogKind.Error, null, 4, str);
                    goto end;
                }
                var connectIp   = new Ip(string.Format("{0}.{1}.{2}.{3}", tmp[0], tmp[1], tmp[2], tmp[3]));
                var connectPort = Convert.ToInt32(tmp[4]) * 256 + Convert.ToInt32(tmp[5]);

                //**********************************************************************
                // サーバ側用のListenソケットを生成する
                //**********************************************************************
                var listenIp = Sock[CS.Server].LocalIp;
                // 利用可能なデータポートの選定
                int listenPort = 0;
                while (iLife.IsLife())
                {
                    _dataPort++;
                    if (SockServer.IsAvailable(_kernel, listenIp, _dataPort))
                    {
                        listenPort = _dataPort;
                        break;
                    }
                }
                //**********************************************************************
                // サーバ側に送るPORTコマンドを生成する
                //**********************************************************************
                //置き換えたPORTコマンドをセットする
                str = string.Format("PORT {0},{1},{2},{3},{4},{5}\r\n", listenIp.IpV4[0], listenIp.IpV4[1], listenIp.IpV4[2], listenIp.IpV4[3], listenPort / 256, listenPort % 256);
                buf = Encoding.ASCII.GetBytes(str);

                //データスレッドの準備
                if (_dataTunnel != null)
                {
                    _dataTunnel.Dispose();
                }
                _dataTunnel = new DataTunnel(_kernel, Logger, listenIp, listenPort, connectIp, connectPort, this);
                _dataTunnel.Start();
                Thread.Sleep(3); //Listenが完了してから PORTを送信する
            }
end:
            return(buf);
        }
Exemple #4
0
        //プロキシ処理
        override public bool Pipe(ILife iLife)
        {
            DataThread dataThread = null;
            var        paramStr   = "";

            //サーバ側との接続処理
            if (!Proxy.Connect(iLife, _oneObj.Request.HostName, _oneObj.Request.Port, _oneObj.Request.RequestStr, _oneObj.Request.Protocol))
            {
                Proxy.Logger.Set(LogKind.Debug, null, 999, "□Break proxy.Connect()==false");
                return(false);
            }


            //wait 220 welcome
            if (!WaitLine("220", ref paramStr, iLife))
            {
                return(false);
            }

            Proxy.Sock(CS.Server).AsciiSend(string.Format("USER {0}", _user));
            if (!WaitLine("331", ref paramStr, iLife))
            {
                return(false);
            }

            Proxy.Sock(CS.Server).AsciiSend(string.Format("PASS {0}", _pass));
            if (!WaitLine("230", ref paramStr, iLife))
            {
                return(false);
            }

            //Ver5.6.6
            if (_path == "/")
            {
                Proxy.Sock(CS.Server).AsciiSend("PWD");
                if (!WaitLine("257", ref paramStr, iLife))
                {
                    return(false);
                }
                var tmp = paramStr.Split(' ');
                if (tmp.Length >= 1)
                {
                    _path = tmp[0].Trim(new[] { '"' });
                    if (_path[_path.Length - 1] != '/')
                    {
                        _path = _path + "/";
                    }
                }
            }


            //リクエスト
            if (_path != "")
            {
                Proxy.Sock(CS.Server).AsciiSend(string.Format("CWD {0}", _path));
                if (!WaitLine("250", ref paramStr, iLife))
                {
                    goto end;
                }
            }

            Proxy.Sock(CS.Server).AsciiSend(_file == "" ? "TYPE A" : "TYPE I");
            if (!WaitLine("200", ref paramStr, iLife))
            {
                goto end;
            }

            //PORTコマンド送信
            var bindAddr = Proxy.Sock(CS.Server).LocalIp;

            // 利用可能なデータポートの選定
            while (iLife.IsLife())
            {
                DataPort++;
                if (DataPort >= 9999)
                {
                    DataPort = 2000;
                }
                if (SockServer.IsAvailable(_kernel, bindAddr, DataPort))
                {
                    break;
                }
            }
            int listenPort = DataPort;

            //データスレッドの生成
            dataThread = new DataThread(_kernel, bindAddr, listenPort);

            // サーバ側に送るPORTコマンドを生成する
            string str = string.Format("PORT {0},{1},{2},{3},{4},{5}", bindAddr.IpV4[0], bindAddr.IpV4[1], bindAddr.IpV4[2], bindAddr.IpV4[3], listenPort / 256, listenPort % 256);



            Proxy.Sock(CS.Server).AsciiSend(str);
            if (!WaitLine("200", ref paramStr, iLife))
            {
                goto end;
            }

            if (_file == "")
            {
                Proxy.Sock(CS.Server).AsciiSend("LIST");
                if (!WaitLine("150", ref paramStr, iLife))
                {
                    goto end;
                }
            }
            else
            {
                Proxy.Sock(CS.Server).AsciiSend("RETR " + _file);
                if (!WaitLine("150", ref paramStr, iLife))
                {
                    goto end;
                }
            }

            //Ver5.0.2
            while (iLife.IsLife())
            {
                if (!dataThread.IsRecv)
                {
                    break;
                }
            }

            if (!WaitLine("226", ref paramStr, iLife))
            {
                goto end;
            }

            byte[] doc;
            if (_file == "")
            {
                //受信結果をデータスレッドから取得する
                List <string> lines = Inet.GetLines(dataThread.ToString());
                //FTPサーバから取得したLISTの情報をHTMLにコンバートする
                doc = ConvFtpList(lines, _path);
            }
            else
            {
                doc = dataThread.ToBytes();
            }

            //クライアントへリプライ及びヘッダを送信する
            var header = new Header();

            header.Replace("Server", Util.SwapStr("$v", _kernel.Ver.Version(), (string)_conf.Get("serverHeader")));

            header.Replace("MIME-Version", "1.0");

            if (_file == "")
            {
                header.Replace("Date", Util.UtcTime2Str(DateTime.UtcNow));
                header.Replace("Content-Type", "text/html");
            }
            else
            {
                header.Replace("Content-Type", "none/none");
            }
            header.Replace("Content-Length", doc.Length.ToString());

            Proxy.Sock(CS.Client).AsciiSend("HTTP/1.0 200 OK");     //リプライ送信
            Proxy.Sock(CS.Client).SendUseEncode(header.GetBytes()); //ヘッダ送信
            Proxy.Sock(CS.Client).SendNoEncode(doc);                //ボディ送信
end:
            if (dataThread != null)
            {
                dataThread.Dispose();
            }

            return(false);
        }