Beispiel #1
0
        private bool JobSize(Session session, String param, FtpCmd ftpCmd)
        {
            // Version. 6.2.0+(6.2.1) RFC:3659
            var path = session.CurrentDir.CreatePath(null, param, false);

            if (path == null)
            {
                // session.StringSend("550 Permission denied.");
                session.StringSend("550 Permission denied.");

                return(false);
            }

            if (Util.Exists(path) == ExistsKind.File)
            {
                var dirName  = Path.GetDirectoryName(path);
                var fileName = Path.GetFileName(path);
                var di       = new DirectoryInfo(dirName);
                var files    = di.GetFiles(fileName);
                session.StringSend(string.Format("213 {0}", files[0].Length));
                return(true);
            }
            session.StringSend(string.Format("550 {0}: No such file or directory.", param));
            return(true);
        }
Beispiel #2
0
        private bool JobDir(Session session, String param, FtpCmd ftpCmd)
        {
            bool isDir   = !(ftpCmd == FtpCmd.Dele);
            int  retCode = -1;
            //�p�����[�^����V�����p�X���𐶐�����
            var path = session.CurrentDir.CreatePath(null, param, isDir);

            if (path == null)
            {
                //TODO �G���[���O�擾�͂��K�v
            }
            else
            {
                if (ftpCmd == FtpCmd.Mkd)
                {
                    //�f�B���N�g���͖�����?
                    if (!Directory.Exists(path))  //�f�B���N�g���͖�����?
                    {
                        Directory.CreateDirectory(path);
                        retCode = 257;
                    }
                }
                else if (ftpCmd == FtpCmd.Rmd)
                {
                    if (Directory.Exists(path))  //�f�B���N�g���͗L�邩?
                    {
                        try{
                            Directory.Delete(path);
                            retCode = 250;
                        } catch (Exception) {
                        }
                    }
                }
                else if (ftpCmd == FtpCmd.Dele)
                {
                    if (File.Exists(path))  //�t�@�C���͗L�邩?
                    {
                        File.Delete(path);
                        retCode = 250;
                    }
                }

                if (retCode != -1)
                {
                    //����
                    Logger.Set(LogKind.Normal, session.SockCtrl, 7, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
                    session.StringSend(string.Format("{0} {1} command successful.", retCode, ftpCmd));
                    return(true);
                }
                //���s
                //�R�}���h�����ŃG���[���������܂���
                Logger.Set(LogKind.Error, session.SockCtrl, 3, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #3
0
        private bool JobDir(Session session, String param, FtpCmd ftpCmd)
        {
            bool isDir   = !(ftpCmd == FtpCmd.Dele);
            int  retCode = -1;
            //パラメータから新しいパス名を生成する
            var path = session.CurrentDir.CreatePath(null, param, isDir);

            if (path == null)
            {
                //TODO エラーログ取得力が必要
            }
            else
            {
                if (ftpCmd == FtpCmd.Mkd)
                {
                    //ディレクトリは無いか?
                    if (!Directory.Exists(path))  //ディレクトリは無いか?
                    {
                        Directory.CreateDirectory(path);
                        retCode = 257;
                    }
                }
                else if (ftpCmd == FtpCmd.Rmd)
                {
                    if (Directory.Exists(path))  //ディレクトリは有るか?
                    {
                        try{
                            Directory.Delete(path);
                            retCode = 250;
                        } catch (Exception) {
                        }
                    }
                }
                else if (ftpCmd == FtpCmd.Dele)
                {
                    if (File.Exists(path))  //ファイルは有るか?
                    {
                        File.Delete(path);
                        retCode = 250;
                    }
                }

                if (retCode != -1)
                {
                    //成功
                    Logger.Set(LogKind.Normal, session.SockCtrl, 7, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
                    session.StringSend(string.Format("{0} {1} command successful.", retCode, ftpCmd));
                    return(true);
                }
                //失敗
                //コマンド処理でエラーが発生しました
                Logger.Set(LogKind.Error, session.SockCtrl, 3, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #4
0
 private static bool JobCwd(Session session, String param)
 {
     if (session.CurrentDir.Cwd(param))
     {
         session.StringSend("250 CWD command successful.");
     }
     else
     {
         session.StringSend(string.Format("550 {0}: No such file or directory.", param));
     }
     return(true);
 }
Beispiel #5
0
        private bool JobStor(Session session, String param, FtpCmd ftpCmd)
        {
            String path = session.CurrentDir.CreatePath(null, param, false);

            //Ver6.0.3 �f�B���N�g���g���o�[�T��
            if (path == null)
            {
                session.StringSend("550 Permission denied.");
                return(true);
            }

            ExistsKind exists = Util.Exists(path);

            if (exists != ExistsKind.Dir)
            {
                //File file = new File(path);
                if (exists == ExistsKind.File)
                {
                    // �A�b�v���[�h���[�U�́A�����̃t�@�C����㏑���ł��Ȃ�
                    if (session.OneUser.FtpAcl == FtpAcl.Up && File.Exists(path))
                    {
                        session.StringSend("550 Permission denied.");
                        return(true);
                    }
                }
                //String str = string.Format("150 Opening {0} mode data connection for {1}.", session.getFtpType(), param);
                session.SockCtrl.StringSend(string.Format("150 Opening {0} mode data connection for {1}.", session.FtpType.ToString().ToUpper(), param), "shift-jis");

                //Up start
                Logger.Set(LogKind.Normal, session.SockCtrl, 9, string.Format("{0} {1}", session.OneUser.UserName, param));

                try{
                    int size = RecvBinary(session.SockData, path);
                    session.StringSend("226 Transfer complete.");
                    //Up end
                    Logger.Set(LogKind.Normal, session.SockCtrl, 10, string.Format("{0} {1} {2}bytes", session.OneUser.UserName, param, size));
                } catch (IOException) {
                    session.StringSend("426 Transfer abort.");
                    //Up end
                    Logger.Set(LogKind.Error, session.SockCtrl, 17, string.Format("{0} {1}", session.OneUser.UserName, param));
                }

                session.SockData.Close();
                session.SockData = null;

                return(true);
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #6
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);
        }
Beispiel #7
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);
        }
Beispiel #8
0
        private bool JobRnto(Session session, String param, FtpCmd ftpCmd)
        {
            //Ver6.0.4
            //if (session.RnfrName != "") {
            if (!string.IsNullOrEmpty(session.RnfrName))
            {
                var path = session.CurrentDir.CreatePath(null, param, false);

                //Ver6.0.3 �f�B���N�g���g���o�[�T��
                if (path == null)
                {
                    session.StringSend("550 Permission denied.");
                    return(false);
                }

                var existsKind = Util.Exists(path);
                if (existsKind == ExistsKind.Dir)
                {
                    session.StringSend("550 rename: Is a derectory name.");
                    return(true);
                }
                if (existsKind == ExistsKind.File)
                {
                    File.Delete(path);
                }
                if (Directory.Exists(session.RnfrName))  //�ύX�̑Ώۂ��f�B���N�g���ł���ꍇ
                {
                    Directory.Move(session.RnfrName, path);
                }
                else    //�ύX�̑Ώۂ��t�@�C���ł���ꍇ
                //Ver6.0.4
                {
                    if (!Directory.Exists(Path.GetDirectoryName(path)))
                    {
                        //�w���̃f�B���N�g�������݂��Ȃ��ꍇ�̃G���[
                        session.StringSend("550 Permission denied.");
                        return(false);
                    }
                    File.Move(session.RnfrName, path);
                }
                Logger.Set(LogKind.Normal, session.SockCtrl, 8, string.Format("{0} {1} -> {2}", session.OneUser.UserName, session.RnfrName, path));
                session.StringSend("250 RNTO command successful.");
                return(true);
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #9
0
        private bool JobRnto(Session session, String param, FtpCmd ftpCmd)
        {
            //Ver6.0.4
            //if (session.RnfrName != "") {
            if (!string.IsNullOrEmpty(session.RnfrName))
            {
                var path = session.CurrentDir.CreatePath(null, param, false);

                //Ver6.0.3 ディレクトリトラバーサル
                if (path == null)
                {
                    session.StringSend("550 Permission denied.");
                    return(false);
                }

                var existsKind = Util.Exists(path);
                if (existsKind == ExistsKind.Dir)
                {
                    session.StringSend("550 rename: Is a derectory name.");
                    return(true);
                }
                if (existsKind == ExistsKind.File)
                {
                    File.Delete(path);
                }
                if (Directory.Exists(session.RnfrName))  //変更の対象がディレクトリである場合
                {
                    Directory.Move(session.RnfrName, path);
                }
                else    //変更の対象がファイルである場合
                //Ver6.0.4
                {
                    if (!Directory.Exists(Path.GetDirectoryName(path)))
                    {
                        //指定先のディレクトリが存在しない場合のエラー
                        session.StringSend("550 Permission denied.");
                        return(false);
                    }
                    File.Move(session.RnfrName, path);
                }
                Logger.Set(LogKind.Normal, session.SockCtrl, 8, string.Format("{0} {1} -> {2}", session.OneUser.UserName, session.RnfrName, path));
                session.StringSend("250 RNTO command successful.");
                return(true);
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #10
0
        private bool JobRetr(Session session, String param)
        {
            var path = session.CurrentDir.CreatePath(null, param, false);

            //Ver6.0.3 ディレクトリトラバーサル
            if (path == null)
            {
                // session.StringSend("550 Permission denied.");
                session.StringSend(string.Format("550 {0}", param));
                Logger.Set(LogKind.Detail, session.SockCtrl, 13, string.Format("{0}", param));
                return(false);
            }

            if (Util.Exists(path) == ExistsKind.File)
            {
                var dirName  = Path.GetDirectoryName(path);
                var fileName = Path.GetFileName(path);
                var di       = new DirectoryInfo(dirName);
                var files    = di.GetFiles(fileName);

                if (files.Length == 1)
                {
                    String str = string.Format("150 Opening {0} mode data connection for {1} ({2} bytes).", session.FtpType.ToString().ToUpper(), param, files[0].Length);
                    session.StringSend(str); //Shift-jisである必要がある?

                    //DOWN start
                    Logger.Set(LogKind.Normal, session.SockCtrl, 11, string.Format("{0} {1}", session.OneUser.UserName, param));
                    try{
                        int size = SendBinary(session.SockData, path);
                        session.StringSend("226 Transfer complete.");
                        //DOWN end
                        Logger.Set(LogKind.Normal, session.SockCtrl, 12, string.Format("{0} {1} {2}bytes", session.OneUser.UserName, param, size));
                    } catch (IOException) {
                        session.StringSend("426 Transfer abort.");
                        //DOWN end
                        Logger.Set(LogKind.Error, session.SockCtrl, 16, string.Format("{0} {1}", session.OneUser.UserName, param));
                    }
                    session.SockData.Close();
                    session.SockData = null;

                    return(true);
                }
            }
            session.StringSend(string.Format("550 {0}: No such file or directory.", param));
            return(true);
        }
Beispiel #11
0
        private static bool JobUser(Session session, String userName)
        {
            //���M���ꂽ���[�U����L������
            //���[�U�����݂��邩�ǂ����́APASS�R�}���h�̎��_�ŕ]�������
            session.UserName = userName;

            //���[�U���̗L���E�����Ɋ֌W�Ȃ��p�X���[�h�̓��͂𑣂�
            session.StringSend(string.Format("331 Password required for {0}.", userName));
            return(true);
        }
Beispiel #12
0
        private static bool JobUser(Session session, String userName)
        {
            //送信されたユーザ名を記憶する
            //ユーザが存在するかどうかは、PASSコマンドの時点で評価される
            session.UserName = userName;

            //ユーザ名の有効・無効に関係なくパスワードの入力を促す
            session.StringSend(string.Format("331 Password required for {0}.", userName));
            return(true);
        }
Beispiel #13
0
        private bool JobPort(Session session, String param, FtpCmd ftpCmd)
        {
            String resStr = "500 command not understood:";

            Ip  ip   = null;
            int port = 0;

            if (ftpCmd == FtpCmd.Eprt)
            {
                var tmpBuf = param.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                if (tmpBuf.Length == 3)
                {
                    port = Convert.ToInt32(tmpBuf[2]);
                    try{
                        ip = new Ip(tmpBuf[1]);
                    } catch (ValidObjException) {
                        ip = null;
                    }
                }
                if (ip == null)
                {
                    resStr = "501 Illegal EPRT command.";
                }
            }
            else
            {
                var tmpBuf = param.Split(',');
                if (tmpBuf.Length == 6)
                {
                    try{
                        ip = new Ip(tmpBuf[0] + "." + tmpBuf[1] + "." + tmpBuf[2] + "." + tmpBuf[3]);
                    } catch (ValidObjException) {
                        ip = null;
                    }
                    port = Convert.ToInt32(tmpBuf[4]) * 256 + Convert.ToInt32(tmpBuf[5]);
                }
                if (ip == null)
                {
                    resStr = "501 Illegal PORT command.";
                }
            }
            if (ip != null)
            {
                Thread.Sleep(10);
                var sockData = Inet.Connect(Kernel, ip, port, Timeout, null);
                if (sockData != null)
                {
                    resStr = string.Format("200 {0} command successful.", ftpCmd.ToString().ToUpper());
                }
                session.SockData = sockData;
            }
            session.StringSend(resStr);
            return(true);
        }
Beispiel #14
0
        private bool jobRnfr(Session session, String param, FtpCmd ftpCmd)
        {
            var path = session.CurrentDir.CreatePath(null, param, false);

            //Ver6.0.3 �f�B���N�g���g���o�[�T��
            if (path == null)
            {
                session.StringSend("550 Permission denied.");
                return(false);
            }

            if (Util.Exists(path) != ExistsKind.None)
            {
                session.RnfrName = path;
                session.StringSend("350 File exists, ready for destination name.");
                return(true);
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return(true);
        }
Beispiel #15
0
        private bool JobType(Session session, String param)
        {
            String resStr;

            switch (param.ToUpper()[0])
            {
            case 'A':
                session.FtpType = FtpType.Ascii;
                resStr          = "200 Type set 'A'";
                break;

            case 'I':
                session.FtpType = FtpType.Binary;
                resStr          = "200 Type set 'I'";
                break;

            default:
                resStr = "500 command not understood.";
                break;
            }
            session.StringSend(resStr);
            return(true);
        }
Beispiel #16
0
        private bool JobPort(Session session, String param, FtpCmd ftpCmd)
        {
            String resStr = "500 command not understood:";

            Ip ip = null;
            int port = 0;

            if (ftpCmd == FtpCmd.Eprt){
                var tmpBuf = param.Split(new[]{'|'},StringSplitOptions.RemoveEmptyEntries);
                if (tmpBuf.Length == 3){
                    port = Convert.ToInt32(tmpBuf[2]);
                    try{
                        ip = new Ip(tmpBuf[1]);
                    } catch (ValidObjException){
                        ip = null;
                    }
                }
                if (ip == null){
                    resStr = "501 Illegal EPRT command.";
                }
            } else{
                var tmpBuf = param.Split(',');
                if (tmpBuf.Length == 6){
                    try{
                        ip = new Ip(tmpBuf[0] + "." + tmpBuf[1] + "." + tmpBuf[2] + "." + tmpBuf[3]);
                    } catch (ValidObjException ){
                        ip = null;
                    }
                    port = Convert.ToInt32(tmpBuf[4]) * 256 + Convert.ToInt32(tmpBuf[5]);
                }
                if (ip == null){
                    resStr = "501 Illegal PORT command.";
                }
            }
            if (ip != null){

                Thread.Sleep(10);
                var sockData = Inet.Connect(Kernel,ip, port, Timeout, null);
                if (sockData != null){
                    resStr = string.Format("200 {0} command successful.", ftpCmd.ToString().ToUpper());
                }
                session.SockData = sockData;
            }
            session.StringSend(resStr);
            return true;
        }
Beispiel #17
0
        private bool JobNlist(Session session, String param, FtpCmd ftpCmd)
        {
            // �Z�k���X�g���ǂ���
            var wideMode = (ftpCmd == FtpCmd.List);
            var mask     = "*.*";

            //�p�����[�^���w�肳��Ă���ꍇ�A�}�X�N��擾����
            if (param != "")
            {
                foreach (var p in param.Split(' '))
                {
                    if (p == "")
                    {
                        continue;
                    }
                    if (p.ToUpper().IndexOf("-L") == 0)
                    {
                        wideMode = true;
                    }
                    else if (p.ToUpper().IndexOf("-A") == 0)
                    {
                        wideMode = true;
                    }
                    else
                    {
                        //���C���h�J�[�h�w��
                        if (p.IndexOf('*') != -1 || p.IndexOf('?') != -1)
                        {
                            mask = param;
                        }
                        else
                        {
                            //�t�H���_�w��
                            //Ver5.9.0
                            try {
                                var existsKind = Util.Exists(session.CurrentDir.CreatePath(null, param, false));
                                switch (existsKind)
                                {
                                case ExistsKind.Dir:
                                    mask = param + "\\*.*";
                                    break;

                                case ExistsKind.File:
                                    mask = param;
                                    break;

                                default:
                                    session.StringSend(string.Format("500 {0}: command requires a parameter.", param));
                                    session.SockData = null;
                                    return(true);
                                }
                            } catch (Exception ex) {
                                Logger.Set(LogKind.Error, session.SockCtrl, 18, String.Format("param={0} Exception.message={1}", param, ex.Message));
                                session.StringSend(string.Format("500 {0}: command requires a parameter.", param));
                                session.SockData = null;
                                return(true);
                            }
                        }
                    }
                }
            }
            session.StringSend(string.Format("150 Opening {0} mode data connection for ls.", session.FtpType.ToString().ToUpper()));
            //�t�@�C���ꗗ�擾
            foreach (var s in session.CurrentDir.List(mask, wideMode))
            {
                session.SockData.StringSend(s, "Shift-Jis");
            }
            session.StringSend("226 Transfer complete.");

            session.SockData.Close();
            session.SockData = null;
            return(true);
        }
Beispiel #18
0
        private bool JobDir(Session session, String param, FtpCmd ftpCmd)
        {
            bool isDir = !(ftpCmd == FtpCmd.Dele);
            int retCode = -1;
            //�p�����[�^����V�����p�X���𐶐�����
            var path = session.CurrentDir.CreatePath(null, param, isDir);
            if (path == null){
                //TODO �G���[���O�擾�͂��K�v
            } else{
                if (ftpCmd == FtpCmd.Mkd){
                    //�f�B���N�g���͖�����?
                    if (!Directory.Exists(path)) {//�f�B���N�g���͖�����?
                        Directory.CreateDirectory(path);
                        retCode = 257;
                    }
                } else if (ftpCmd == FtpCmd.Rmd) {
                    if (Directory.Exists(path)) {//�f�B���N�g���͗L�邩?
                        try{
                            Directory.Delete(path);
                            retCode = 250;
                        } catch (Exception) {

                        }
                    }
                } else if (ftpCmd == FtpCmd.Dele) {
                    if (File.Exists(path)) {//�t�@�C���͗L�邩?
                        File.Delete(path);
                        retCode = 250;
                    }
                }

                if (retCode != -1){
                    //����
                    Logger.Set(LogKind.Normal, session.SockCtrl, 7, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
                    session.StringSend(string.Format("{0} {1} command successful.", retCode, ftpCmd));
                    return true;
                }
                //���s
                //�R�}���h�����ŃG���[���������܂���
                Logger.Set(LogKind.Error, session.SockCtrl, 3, string.Format("User:{0} Cmd:{1} Path:{2}", session.OneUser.UserName, ftpCmd, path));
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return true;
        }
Beispiel #19
0
        private bool JobNlist(Session session, String param, FtpCmd ftpCmd)
        {
            // �Z�k���X�g���ǂ���
            var wideMode = (ftpCmd == FtpCmd.List);
            var mask = "*.*";

            //�p�����[�^���w�肳��Ă���ꍇ�A�}�X�N��擾����
            if (param != ""){
                foreach (var p in param.Split(' ')){
                    if (p == ""){
                        continue;
                    }
                    if (p.ToUpper().IndexOf("-L") == 0){
                        wideMode = true;
                    }else if(p.ToUpper().IndexOf("-A") == 0) {
                        wideMode = true;
                    } else{
                        //���C���h�J�[�h�w��
                        if (p.IndexOf('*') != -1 || p.IndexOf('?') != -1){
                            mask = param;
                        } else{
                            //�t�H���_�w��
                            //Ver5.9.0
                            try {
                                var existsKind = Util.Exists(session.CurrentDir.CreatePath(null, param, false));
                                switch (existsKind) {
                                    case ExistsKind.Dir:
                                        mask = param + "\\*.*";
                                        break;
                                    case ExistsKind.File:
                                        mask = param;
                                        break;
                                    default:
                                        session.StringSend(string.Format("500 {0}: command requires a parameter.", param));
                                        session.SockData = null;
                                        return true;
                                }
                            } catch (Exception ex) {
                                Logger.Set(LogKind.Error, session.SockCtrl, 18,String.Format("param={0} Exception.message={1}",param,ex.Message));
                                session.StringSend(string.Format("500 {0}: command requires a parameter.", param));
                                session.SockData = null;
                                return true;
                            }
                        }
                    }
                }
            }
            session.StringSend(string.Format("150 Opening {0} mode data connection for ls.", session.FtpType.ToString().ToUpper()));
            //�t�@�C���ꗗ�擾
            foreach (var s in session.CurrentDir.List(mask, wideMode)){
                session.SockData.StringSend(s, "Shift-Jis");
            }
            session.StringSend("226 Transfer complete.");

            session.SockData.Close();
            session.SockData = null;
            return true;
        }
Beispiel #20
0
        protected override void OnSubThread(SockObj sockObj)
        {
            //�Z�b�V�������Ƃ̏��
            var session = new Session((SockTcp)sockObj);

            //���̃R�l�N�V�����̊ԁA�P�‚ƒC���N�����g���Ȃ���g�p�����
            //�{���́A�ؒf�����|�[�g�ԍ��͍ė��p�”\�Ȃ̂ŁA�C���N�������g�̕K�v�͖������A
            //�Z���Ԃōė��p���悤�Ƃ���ƃG���[����������ꍇ������̂ŁA���������ړI�ŃC���N�������g���Ďg�p���Ă���

            //�O���[�e�B���O���b�Z�[�W�̑��M
            session.StringSend(string.Format("220 {0}", _bannerMessage));

            //�R�l�N�V������p�����邩�ǂ����̃t���O
            var result = true;

            while (IsLife() && result)
            {
                //���̃��[�v�͍ŏ��ɃN���C�A���g����̃R�}���h��P�s��M���A�Ō�ɁA
                //sockCtrl.LineSend(resStr)���X�|���X������s��
                //continue��w�肵���ꍇ�́A���X�|���X��Ԃ����Ɏ��̃R�}���h��M�ɓ���i��O�����p�j
                //break��w�肵���ꍇ�́A�R�l�N�V�����̏I����Ӗ�����iQUIT ABORT �y�уG���[�̏ꍇ�j

                Thread.Sleep(0);

                var cmd = recvCmd(session.SockCtrl);
                if (cmd == null)
                {
                    //�ؒf����Ă���
                    break;
                }

                if (cmd.Str == "")
                {
                    session.StringSend("500 Invalid command: try being more creative.");
                    //��M�ҋ@��
                    //Thread.Sleep(100);
                    continue;
                }

                //�R�}���h������̉��
                //var ftpCmd = (FtpCmd) Enum.Parse(typeof (FtpCmd), cmd.CmdStr);
                var ftpCmd = FtpCmd.Unknown;
                foreach (FtpCmd n in Enum.GetValues(typeof(FtpCmd)))
                {
                    if (n.ToString().ToUpper() != cmd.CmdStr.ToUpper())
                    {
                        continue;
                    }
                    ftpCmd = n;
                    break;
                }


                //FtpCmd ftpCmd = FtpCmd.parse(cmd.CmdStr);
                var param = cmd.ParamStr;

                //SYST�R�}���h���L�����ǂ����̔��f
                if (ftpCmd == FtpCmd.Syst)
                {
                    if (!(bool)Conf.Get("useSyst"))
                    {
                        ftpCmd = FtpCmd.Unknown;
                    }
                }
                //�R�}���h�������ȏꍇ�̏���
                if (ftpCmd == FtpCmd.Unknown)
                {
                    //session.StringSend("502 Command not implemented.");
                    session.StringSend("500 Command not understood.");
                }

                //QUIT�͂��‚ł�󂯕t����
                if (ftpCmd == FtpCmd.Quit)
                {
                    session.StringSend("221 Goodbye.");
                    break;
                }

                if (ftpCmd == FtpCmd.Abor)
                {
                    session.StringSend("250 ABOR command successful.");
                    break;
                }

                //			//����́A���O�C���������󂯕t���Ȃ��R�}���h����H
                //			//RNFR�Ŏw�肳�ꂽ�p�X�̖�����
                //			if (ftpCmd != FtpCmd.Rnfr) {
                //				session.setRnfrName("");
                //			}

                // �R�}���h�g�ւ�
                if (ftpCmd == FtpCmd.Cdup)
                {
                    param  = "..";
                    ftpCmd = FtpCmd.Cwd;
                }

                //�s���A�N�Z�X�Ώ� �p�����[�^�ɋɒ[�ɒ���������𑗂荞�܂ꂽ�ꍇ
                if (param.Length > 128)
                {
                    Logger.Set(LogKind.Secure, session.SockCtrl, 1, string.Format("{0} Length={1}", ftpCmd, param.Length));
                    break;
                }

                //�f�t�H���g�̃��X�|���X������
                //���������ׂĒʉ߂��Ă��܂����ꍇ�A���̕����񂪕Ԃ����
                //String resStr2 = string.Format("451 {0} error", ftpCmd);

                // ���O�C���O�̏���
                if (session.CurrentDir == null)
                {
                    //ftpCmd == FTP_CMD.PASS
                    //������
                    //PASS�̑O��USER�R�}���h��K�v�Ƃ���
                    //sockCtrl.LineSend("503 Login with USER first.");

                    if (ftpCmd == FtpCmd.User)
                    {
                        if (param == "")
                        {
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                        result = JobUser(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Pass)
                    {
                        result = JobPass(session, param);
                    }
                    else
                    {
                        //USER�APASS�ȊO�̓G���[��Ԃ�
                        session.StringSend("530 Please login with USER and PASS.");
                    }
                    // ���O�C����̏���
                }
                else
                {
                    // �p�����[�^�̊m�F(�p�����[�^�������ꍇ�̓G���[��Ԃ�)
                    if (param == "")
                    {
                        if (ftpCmd == FtpCmd.Cwd || ftpCmd == FtpCmd.Type || ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr)
                        {
                            //session.StringSend("500 command not understood:");
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                    }

                    // �f�[�^�R�l�N�V�����������ƃG���[�ƂȂ�R�}���h
                    if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr)
                    {
                        if (session.SockData == null || session.SockData.SockState != Bjd.sock.SockState.Connect)
                        {
                            session.StringSend("226 data connection close.");
                            continue;
                        }
                    }
                    // ���[�U�̃A�N�Z�X���ɃG���[�ƂȂ�R�}���h
                    if (session.OneUser != null)
                    {
                        if (session.OneUser.FtpAcl == FtpAcl.Down)
                        {
                            if (ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd)
                            {
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        }
                        else if (session.OneUser.FtpAcl == FtpAcl.Up)
                        {
                            if (ftpCmd == FtpCmd.Retr || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd)
                            {
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        }
                    }

                    // ���O�C����(�F�؊����j���́AUSER�APASS ��󂯕t���Ȃ�
                    if (ftpCmd == FtpCmd.User || ftpCmd == FtpCmd.Pass)
                    {
                        session.StringSend("530 Already logged in.");
                        continue;
                    }

                    if (ftpCmd == FtpCmd.Noop)
                    {
                        session.StringSend("200 NOOP command successful.");
                    }
                    else if (ftpCmd == FtpCmd.Pwd || ftpCmd == FtpCmd.Xpwd)
                    {
                        session.StringSend(string.Format("257 \"{0}\" is current directory.", session.CurrentDir.GetPwd()));
                    }
                    else if (ftpCmd == FtpCmd.Cwd)
                    {
                        result = JobCwd(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Syst)
                    {
                        var os = Environment.OSVersion;
                        session.StringSend(string.Format("215 {0}", os.VersionString));
                    }
                    else if (ftpCmd == FtpCmd.Type)
                    {
                        result = JobType(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele)
                    {
                        result = JobDir(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List)
                    {
                        result = JobNlist(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Eprt)
                    {
                        result = JobPort(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Pasv || ftpCmd == FtpCmd.Epsv)
                    {
                        result = JobPasv(session, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Rnfr)
                    {
                        result = jobRnfr(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Rnto)
                    {
                        result = JobRnto(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Stor)
                    {
                        result = JobStor(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Retr)
                    {
                        result = JobRetr(session, param);
                    }
                }
            }
            //���O�C�����Ă���ꍇ�́A���O�A�E�g�̃��O��o�͂���
            if (session.CurrentDir != null)
            {
                //logout
                Logger.Set(LogKind.Normal, session.SockCtrl, 13, string.Format("{0}", session.OneUser.UserName));
            }
            session.SockCtrl.Close();
            if (session.SockData != null)
            {
                session.SockData.Close();
            }
        }
Beispiel #21
0
        private bool JobPass(Session session, String password)
        {
            //�܂�USER�R�}���h���������Ă��Ȃ��ꍇ
            if (session.UserName == null)
            {
                session.StringSend("503 Login with USER first.");
                return(true);
            }

            //���[�U��񌟍�
            session.OneUser = _listUser.Get(session.UserName);

            if (session.OneUser == null)
            {
                //�����ȃ��[�U�̏ꍇ
                Logger.Set(LogKind.Secure, session.SockCtrl, 14, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            }
            else
            {
                //�p�X���[�h�m�F
                bool success = false;
                // *�̏ꍇ�AAnonymous�ڑ��Ƃ��ď�������
                if (session.OneUser.Password == "*")
                {
                    //oneUser.UserName = string.Format("{0}(ANONYMOUS)",oneUser.UserName);
                    Logger.Set(LogKind.Normal, session.SockCtrl, 5, string.Format("{0}(ANONYMOUS) {1}", session.OneUser.UserName, password));
                    success = true;
                }
                else if (session.OneUser.Password == password)
                {
                    Logger.Set(LogKind.Secure, session.SockCtrl, 6, string.Format("{0}", session.OneUser.UserName));
                    success = true;
                }

                if (success)
                {
                    //�ȉ��A�p�X���[�h�F�؂ɐ��������ꍇ�̏���
                    //�z�[���f�B���N�g���̑��݊m�F
                    //�T�[�o�N���i�^�c�j���Ƀf�B���N�g�����폜����Ă���”\��������̂ŁA���̎��_�Ŋm�F����
                    if (Util.Exists(session.OneUser.HomeDir) != ExistsKind.Dir)
                    {
                        //�z�[���f�B���N�g�������݂��܂���i�������p���ł��Ȃ����ߐؒf���܂���
                        Logger.Set(LogKind.Error, session.SockCtrl, 2, string.Format("userName={0} hoemDir={1}", session.OneUser.UserName, session.OneUser.HomeDir));
                        return(false);
                    }

                    //���O�C������ �i�J�����g�f�B���N�g���́A�z�[���f�B���N�g���ŏ����������j
                    session.CurrentDir = new CurrentDir(session.OneUser.HomeDir, _listMount);

                    session.StringSend(string.Format("230 User {0} logged in.", session.UserName));
                    return(true);
                }
                //�ȉ��F�؎��s����
                Logger.Set(LogKind.Secure, session.SockCtrl, 15, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            }
            var reservationTime = (int)Conf.Get("reservationTime");

            //�u���[�g�t�H�[�X�h�~�̂��߂̃E�G�C�g(5�b)
            for (int i = 0; i < reservationTime / 100 && IsLife(); i++)
            {
                Thread.Sleep(100);
            }
            //�F�؂Ɏ��s�����ꍇ�̏���
            session.StringSend("530 Login incorrect.");
            return(true);
        }
Beispiel #22
0
        private bool JobStor(Session session, String param, FtpCmd ftpCmd)
        {
            String path = session.CurrentDir.CreatePath(null, param, false);

            //Ver6.0.3 �f�B���N�g���g���o�[�T��
            if (path==null){
                session.StringSend("550 Permission denied.");
                return true;
            }

            ExistsKind exists = Util.Exists(path);
            if (exists != ExistsKind.Dir){
                //File file = new File(path);
                if (exists == ExistsKind.File){
                    // �A�b�v���[�h���[�U�́A�����̃t�@�C����㏑���ł��Ȃ�
                    if (session.OneUser.FtpAcl == FtpAcl.Up && File.Exists(path)){
                        session.StringSend("550 Permission denied.");
                        return true;
                    }
                }
                //String str = string.Format("150 Opening {0} mode data connection for {1}.", session.getFtpType(), param);
                session.SockCtrl.StringSend(string.Format("150 Opening {0} mode data connection for {1}.", session.FtpType.ToString().ToUpper(), param),"shift-jis");

                //Up start
                Logger.Set(LogKind.Normal, session.SockCtrl, 9, string.Format("{0} {1}", session.OneUser.UserName, param));

                try{
                    int size = RecvBinary(session.SockData, path);
                    session.StringSend("226 Transfer complete.");
                    //Up end
                    Logger.Set(LogKind.Normal, session.SockCtrl, 10, string.Format("{0} {1} {2}bytes", session.OneUser.UserName, param, size));
                } catch (IOException){
                    session.StringSend("426 Transfer abort.");
                    //Up end
                    Logger.Set(LogKind.Error, session.SockCtrl, 17, string.Format("{0} {1}", session.OneUser.UserName, param));
                }

                session.SockData.Close();
                session.SockData = null;

                return true;
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return true;
        }
Beispiel #23
0
        private bool JobRnto(Session session, String param, FtpCmd ftpCmd)
        {
            //Ver6.0.4
            //if (session.RnfrName != "") {
            if (!string.IsNullOrEmpty(session.RnfrName)) {
                var path = session.CurrentDir.CreatePath(null, param, false);

                //Ver6.0.3 �f�B���N�g���g���o�[�T��
                if (path == null) {
                    session.StringSend("550 Permission denied.");
                    return false;
                }

                var existsKind = Util.Exists(path);
                if (existsKind == ExistsKind.Dir){
                    session.StringSend("550 rename: Is a derectory name.");
                    return true;
                }
                if (existsKind == ExistsKind.File){
                    File.Delete(path);
                }
                if (Directory.Exists(session.RnfrName)) {//�ύX�̑Ώۂ��f�B���N�g���ł���ꍇ
                    Directory.Move(session.RnfrName, path);
                } else {//�ύX�̑Ώۂ��t�@�C���ł���ꍇ
                    //Ver6.0.4
                    if (!Directory.Exists(Path.GetDirectoryName(path))){
                        //�w���̃f�B���N�g�������݂��Ȃ��ꍇ�̃G���[
                        session.StringSend("550 Permission denied.");
                        return false;
                    }
                    File.Move(session.RnfrName, path);
                }
                Logger.Set(LogKind.Normal, session.SockCtrl, 8, string.Format("{0} {1} -> {2}", session.OneUser.UserName, session.RnfrName, path));
                session.StringSend("250 RNTO command successful.");
                return true;
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return true;
        }
Beispiel #24
0
        private bool JobRetr(Session session, String param)
        {
            var path = session.CurrentDir.CreatePath(null, param, false);
            //Ver6.0.3 �f�B���N�g���g���o�[�T��
            if (path == null) {
                session.StringSend("550 Permission denied.");
                return false;
            }

            if (Util.Exists(path) == ExistsKind.File){

                var dirName = Path.GetDirectoryName(path);
                var fileName = Path.GetFileName(path);
                var di = new DirectoryInfo(dirName);
                var files = di.GetFiles(fileName);

                if (files.Length == 1){
                    String str = string.Format("150 Opening {0} mode data connection for {1} ({2} bytes).", session.FtpType.ToString().ToUpper(), param, files[0].Length);
                    session.StringSend(str); //Shift-jis�ł���K�v������H

                    //DOWN start
                    Logger.Set(LogKind.Normal, session.SockCtrl, 11, string.Format("{0} {1}", session.OneUser.UserName, param));
                    try{
                        int size = SendBinary(session.SockData, path);
                        session.StringSend("226 Transfer complete.");
                        //DOWN end
                        Logger.Set(LogKind.Normal, session.SockCtrl, 12, string.Format("{0} {1} {2}bytes", session.OneUser.UserName, param, size));
                    } catch (IOException){
                        session.StringSend("426 Transfer abort.");
                        //DOWN end
                        Logger.Set(LogKind.Error, session.SockCtrl, 16, string.Format("{0} {1}", session.OneUser.UserName, param));
                    }
                    session.SockData.Close();
                    session.SockData = null;

                    return true;
                }
            }
            session.StringSend(string.Format("550 {0}: No such file or directory.", param));
            return true;
        }
Beispiel #25
0
        protected override void OnSubThread(SockObj sockObj)
        {
            //�Z�b�V�������Ƃ̏��
            var session = new Session((SockTcp) sockObj);

            //���̃R�l�N�V�����̊ԁA�P�‚ƒC���N�����g���Ȃ���g�p�����
            //�{���́A�ؒf�����|�[�g�ԍ��͍ė��p�”\�Ȃ̂ŁA�C���N�������g�̕K�v�͖������A
            //�Z���Ԃōė��p���悤�Ƃ���ƃG���[����������ꍇ������̂ŁA���������ړI�ŃC���N�������g���Ďg�p���Ă���

            //�O���[�e�B���O���b�Z�[�W�̑��M
            session.StringSend(string.Format("220 {0}", _bannerMessage));

            //�R�l�N�V������p�����邩�ǂ����̃t���O
            var result = true;

            while (IsLife() && result){
                //���̃��[�v�͍ŏ��ɃN���C�A���g����̃R�}���h��P�s��M���A�Ō�ɁA
                //sockCtrl.LineSend(resStr)���X�|���X������s��
                //continue��w�肵���ꍇ�́A���X�|���X��Ԃ����Ɏ��̃R�}���h��M�ɓ���i��O�����p�j
                //break��w�肵���ꍇ�́A�R�l�N�V�����̏I����Ӗ�����iQUIT ABORT �y�уG���[�̏ꍇ�j

                Thread.Sleep(0);

                var cmd = recvCmd(session.SockCtrl);
                if (cmd == null){
                    //�ؒf����Ă���
                    break;
                }

                if (cmd.Str == ""){
                    session.StringSend("500 Invalid command: try being more creative.");
                    //��M�ҋ@��
                    //Thread.Sleep(100);
                    continue;
                }

                //�R�}���h������̉��
                //var ftpCmd = (FtpCmd) Enum.Parse(typeof (FtpCmd), cmd.CmdStr);
                var ftpCmd = FtpCmd.Unknown;
                foreach (FtpCmd n in Enum.GetValues(typeof(FtpCmd))) {
                    if (n.ToString().ToUpper() != cmd.CmdStr.ToUpper())
                        continue;
                    ftpCmd = n;
                    break;
                }

                //FtpCmd ftpCmd = FtpCmd.parse(cmd.CmdStr);
                var param = cmd.ParamStr;

                //SYST�R�}���h���L�����ǂ����̔��f
                if (ftpCmd == FtpCmd.Syst){
                    if (!(bool) Conf.Get("useSyst")){
                        ftpCmd = FtpCmd.Unknown;
                    }
                }
                //�R�}���h�������ȏꍇ�̏���
                if (ftpCmd == FtpCmd.Unknown){
                    //session.StringSend("502 Command not implemented.");
                    session.StringSend("500 Command not understood.");
                }

                //QUIT�͂��‚ł�󂯕t����
                if (ftpCmd == FtpCmd.Quit){
                    session.StringSend("221 Goodbye.");
                    break;
                }

                if (ftpCmd == FtpCmd.Abor){
                    session.StringSend("250 ABOR command successful.");
                    break;
                }

                //			//����́A���O�C���������󂯕t���Ȃ��R�}���h����H
                //			//RNFR�Ŏw�肳�ꂽ�p�X�̖�����
                //			if (ftpCmd != FtpCmd.Rnfr) {
                //				session.setRnfrName("");
                //			}

                // �R�}���h�g�ւ�
                if (ftpCmd == FtpCmd.Cdup){
                    param = "..";
                    ftpCmd = FtpCmd.Cwd;
                }

                //�s���A�N�Z�X�Ώ� �p�����[�^�ɋɒ[�ɒ���������𑗂荞�܂ꂽ�ꍇ
                if (param.Length > 128){
                    Logger.Set(LogKind.Secure, session.SockCtrl, 1, string.Format("{0} Length={1}", ftpCmd, param.Length));
                    break;
                }

                //�f�t�H���g�̃��X�|���X������
                //���������ׂĒʉ߂��Ă��܂����ꍇ�A���̕����񂪕Ԃ����
                //String resStr2 = string.Format("451 {0} error", ftpCmd);

                // ���O�C���O�̏���
                if (session.CurrentDir == null){
                    //ftpCmd == FTP_CMD.PASS
                    //������
                    //PASS�̑O��USER�R�}���h��K�v�Ƃ���
                    //sockCtrl.LineSend("503 Login with USER first.");

                    if (ftpCmd == FtpCmd.User){
                        if (param == ""){
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                        result = JobUser(session, param);
                    } else if (ftpCmd == FtpCmd.Pass){
                        result = JobPass(session, param);
                    } else{
                        //USER�APASS�ȊO�̓G���[��Ԃ�
                        session.StringSend("530 Please login with USER and PASS.");
                    }
                    // ���O�C����̏���
                } else{
                    // �p�����[�^�̊m�F(�p�����[�^�������ꍇ�̓G���[��Ԃ�)
                    if (param == ""){
                        if (ftpCmd == FtpCmd.Cwd || ftpCmd == FtpCmd.Type || ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr){
                            //session.StringSend("500 command not understood:");
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                    }

                    // �f�[�^�R�l�N�V�����������ƃG���[�ƂȂ�R�}���h
                    if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr){
                        if (session.SockData == null || session.SockData.SockState !=Bjd.sock.SockState.Connect){
                            session.StringSend("226 data connection close.");
                            continue;
                        }
                    }
                    // ���[�U�̃A�N�Z�X���ɃG���[�ƂȂ�R�}���h
                    if (session.OneUser != null){
                        if (session.OneUser.FtpAcl == FtpAcl.Down){
                            if (ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd){
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        } else if (session.OneUser.FtpAcl == FtpAcl.Up){
                            if (ftpCmd == FtpCmd.Retr || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd){
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        }
                    }

                    // ���O�C����(�F�؊����j���́AUSER�APASS ��󂯕t���Ȃ�
                    if (ftpCmd == FtpCmd.User || ftpCmd == FtpCmd.Pass){
                        session.StringSend("530 Already logged in.");
                        continue;
                    }

                    if (ftpCmd == FtpCmd.Noop){
                        session.StringSend("200 NOOP command successful.");
                    } else if (ftpCmd == FtpCmd.Pwd || ftpCmd == FtpCmd.Xpwd){
                        session.StringSend(string.Format("257 \"{0}\" is current directory.", session.CurrentDir.GetPwd()));
                    } else if (ftpCmd == FtpCmd.Cwd){
                        result = JobCwd(session, param);
                    } else if (ftpCmd == FtpCmd.Syst){
                        var os = Environment.OSVersion;
                        session.StringSend(string.Format("215 {0}", os.VersionString));
                    } else if (ftpCmd == FtpCmd.Type){
                        result = JobType(session, param);
                    } else if (ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele){
                        result = JobDir(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List){
                        result = JobNlist(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Eprt){
                        result = JobPort(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Pasv || ftpCmd == FtpCmd.Epsv){
                        result = JobPasv(session, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Rnfr){
                        result = jobRnfr(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Rnto){
                        result = JobRnto(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Stor){
                        result = JobStor(session, param, ftpCmd);
                    } else if (ftpCmd == FtpCmd.Retr){
                        result = JobRetr(session, param);
                    }
                }
            }
            //���O�C�����Ă���ꍇ�́A���O�A�E�g�̃��O��o�͂���
            if (session.CurrentDir != null){
                //logout
                Logger.Set(LogKind.Normal, session.SockCtrl, 13, string.Format("{0}", session.OneUser.UserName));
            }
            session.SockCtrl.Close();
            if (session.SockData != null){
                session.SockData.Close();
            }
        }
Beispiel #26
0
        private static bool JobUser(Session session, String userName)
        {
            //���M���ꂽ���[�U����L������
            //���[�U�����݂��邩�ǂ����́APASS�R�}���h�̎��_�ŕ]�������
            session.UserName = userName;

            //���[�U���̗L���E�����Ɋ֌W�Ȃ��p�X���[�h�̓��͂𑣂�
            session.StringSend(string.Format("331 Password required for {0}.", userName));
            return true;
        }
Beispiel #27
0
        protected override void OnSubThread(SockObj sockObj)
        {
            //セッションごとの情報
            var session = new Session((SockTcp)sockObj);

            //このコネクションの間、1つづつインクメントしながら使用される
            //本来は、切断したポート番号は再利用可能なので、インクリメントの必要は無いが、
            //短時間で再利用しようとするとエラーが発生する場合があるので、これを避ける目的でインクリメントして使用している

            //グリーティングメッセージの送信
            session.StringSend(string.Format("220 {0}", _bannerMessage));

            //コネクションを継続するかどうかのフラグ
            var result = true;

            while (IsLife() && result)
            {
                //このループは最初にクライアントからのコマンドを1行受信し、最後に、
                //sockCtrl.LineSend(resStr)でレスポンス処理を行う
                //continueを指定した場合は、レスポンスを返さずに次のコマンド受信に入る(例外処理用)
                //breakを指定した場合は、コネクションの終了を意味する(QUIT ABORT 及びエラーの場合)

                Thread.Sleep(0);

                var cmd = recvCmd(session.SockCtrl);
                if (cmd == null)
                {
                    //切断されている
                    break;
                }

                if (cmd.Str == "")
                {
                    session.StringSend("500 Invalid command: try being more creative.");
                    //受信待機中
                    //Thread.Sleep(100);
                    continue;
                }

                //コマンド文字列の解釈
                //var ftpCmd = (FtpCmd) Enum.Parse(typeof (FtpCmd), cmd.CmdStr);
                var ftpCmd = FtpCmd.Unknown;
                foreach (FtpCmd n in Enum.GetValues(typeof(FtpCmd)))
                {
                    if (n.ToString().ToUpper() != cmd.CmdStr.ToUpper())
                    {
                        continue;
                    }
                    ftpCmd = n;
                    break;
                }


                //FtpCmd ftpCmd = FtpCmd.parse(cmd.CmdStr);
                var param = cmd.ParamStr;

                //SYSTコマンドが有効かどうかの判断
                if (ftpCmd == FtpCmd.Syst)
                {
                    if (!(bool)Conf.Get("useSyst"))
                    {
                        ftpCmd = FtpCmd.Unknown;
                    }
                }
                //コマンドが無効な場合の処理
                if (ftpCmd == FtpCmd.Unknown)
                {
                    //session.StringSend("502 Command not implemented.");
                    session.StringSend("500 Command not understood.");
                }

                //QUITはいつでも受け付ける
                if (ftpCmd == FtpCmd.Quit)
                {
                    session.StringSend("221 Goodbye.");
                    break;
                }

                if (ftpCmd == FtpCmd.Abor)
                {
                    session.StringSend("250 ABOR command successful.");
                    break;
                }

                //			//これは、ログイン中しか受け付けないコマンドかも?
                //			//RNFRで指定されたパスの無効化
                //			if (ftpCmd != FtpCmd.Rnfr) {
                //				session.setRnfrName("");
                //			}

                // コマンド組替え
                if (ftpCmd == FtpCmd.Cdup)
                {
                    param  = "..";
                    ftpCmd = FtpCmd.Cwd;
                }

                //不正アクセス対処 パラメータに極端に長い文字列を送り込まれた場合
                if (param.Length > 128)
                {
                    Logger.Set(LogKind.Secure, session.SockCtrl, 1, string.Format("{0} Length={1}", ftpCmd, param.Length));
                    break;
                }

                //デフォルトのレスポンス文字列
                //処理がすべて通過してしまった場合、この文字列が返される
                //String resStr2 = string.Format("451 {0} error", ftpCmd);

                // ログイン前の処理
                if (session.CurrentDir == null)
                {
                    //ftpCmd == FTP_CMD.PASS
                    //未実装
                    //PASSの前にUSERコマンドを必要とする
                    //sockCtrl.LineSend("503 Login with USER first.");

                    if (ftpCmd == FtpCmd.User)
                    {
                        if (param == "")
                        {
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                        result = JobUser(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Pass)
                    {
                        result = JobPass(session, param);
                    }
                    else
                    {
                        //USER、PASS以外はエラーを返す
                        session.StringSend("530 Please login with USER and PASS.");
                    }
                    // ログイン後の処理
                }
                else
                {
                    // パラメータの確認(パラメータが無い場合はエラーを返す)
                    if (param == "")
                    {
                        if (ftpCmd == FtpCmd.Cwd || ftpCmd == FtpCmd.Type || ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr)
                        {
                            //session.StringSend("500 command not understood:");
                            session.StringSend(string.Format("500 {0}: command requires a parameter.", ftpCmd.ToString().ToUpper()));
                            continue;
                        }
                    }

                    // データコネクションが無いとエラーとなるコマンド
                    if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List || ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Retr)
                    {
                        if (session.SockData == null || session.SockData.SockState != Bjd.sock.SockState.Connect)
                        {
                            session.StringSend("226 data connection close.");
                            continue;
                        }
                    }
                    // ユーザのアクセス権にエラーとなるコマンド
                    if (session.OneUser != null)
                    {
                        if (session.OneUser.FtpAcl == FtpAcl.Down)
                        {
                            if (ftpCmd == FtpCmd.Stor || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd)
                            {
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        }
                        else if (session.OneUser.FtpAcl == FtpAcl.Up)
                        {
                            if (ftpCmd == FtpCmd.Retr || ftpCmd == FtpCmd.Dele || ftpCmd == FtpCmd.Rnfr || ftpCmd == FtpCmd.Rnto || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Mkd)
                            {
                                session.StringSend("550 Permission denied.");
                                continue;
                            }
                        }
                    }

                    // ログイン中(認証完了)時は、USER、PASS を受け付けない
                    if (ftpCmd == FtpCmd.User || ftpCmd == FtpCmd.Pass)
                    {
                        session.StringSend("530 Already logged in.");
                        continue;
                    }

                    if (ftpCmd == FtpCmd.Noop)
                    {
                        session.StringSend("200 NOOP command successful.");
                    }
                    else if (ftpCmd == FtpCmd.Pwd || ftpCmd == FtpCmd.Xpwd)
                    {
                        session.StringSend(string.Format("257 \"{0}\" is current directory.", session.CurrentDir.GetPwd()));
                    }
                    else if (ftpCmd == FtpCmd.Cwd)
                    {
                        result = JobCwd(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Syst)
                    {
                        var os = Environment.OSVersion;
                        session.StringSend(string.Format("215 {0}", os.VersionString));
                    }
                    else if (ftpCmd == FtpCmd.Type)
                    {
                        result = JobType(session, param);
                    }
                    else if (ftpCmd == FtpCmd.Mkd || ftpCmd == FtpCmd.Rmd || ftpCmd == FtpCmd.Dele)
                    {
                        result = JobDir(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Nlst || ftpCmd == FtpCmd.List)
                    {
                        result = JobNlist(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Port || ftpCmd == FtpCmd.Eprt)
                    {
                        result = JobPort(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Pasv || ftpCmd == FtpCmd.Epsv)
                    {
                        result = JobPasv(session, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Size)
                    // 6.2.0.1 ローカルでSIZEコマンドが必要なので追加した(RFC:3659)
                    {
                        result = JobSize(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Rnfr)
                    {
                        result = jobRnfr(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Rnto)
                    {
                        result = JobRnto(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Stor)
                    {
                        result = JobStor(session, param, ftpCmd);
                    }
                    else if (ftpCmd == FtpCmd.Retr)
                    {
                        result = JobRetr(session, param);
                    }
                }
            }
            //ログインしている場合は、ログアウトのログを出力する
            if (session.CurrentDir != null)
            {
                //logout
                Logger.Set(LogKind.Normal, session.SockCtrl, 13, string.Format("{0}", session.OneUser.UserName));
            }
            session.SockCtrl.Close();
            if (session.SockData != null)
            {
                session.SockData.Close();
            }
        }
Beispiel #28
0
        private bool JobPass(Session session, String password)
        {
            //まだUSERコマンドが到着していない場合
            if (session.UserName == null)
            {
                session.StringSend("503 Login with USER first.");
                return(true);
            }

            //ユーザ情報検索
            session.OneUser = _listUser.Get(session.UserName);

            if (session.OneUser == null)
            {
                //無効なユーザの場合
                Logger.Set(LogKind.Secure, session.SockCtrl, 14, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            }
            else
            {
                //パスワード確認
                bool success = false;
                // *の場合、Anonymous接続として処理する
                if (session.OneUser.Password == "*")
                {
                    //oneUser.UserName = string.Format("{0}(ANONYMOUS)",oneUser.UserName);
                    Logger.Set(LogKind.Normal, session.SockCtrl, 5, string.Format("{0}(ANONYMOUS) {1}", session.OneUser.UserName, password));
                    success = true;
                }
                else if (session.OneUser.Password == password)
                {
                    Logger.Set(LogKind.Secure, session.SockCtrl, 6, string.Format("{0}", session.OneUser.UserName));
                    success = true;
                }

                if (success)
                {
                    //以下、パスワード認証に成功した場合の処理
                    //ホームディレクトリの存在確認
                    //サーバ起動(運営)中にディレクトリが削除されている可能性があるので、この時点で確認する
                    if (Util.Exists(session.OneUser.HomeDir) != ExistsKind.Dir)
                    {
                        //ホームディレクトリが存在しません(処理が継続できないため切断しました
                        Logger.Set(LogKind.Error, session.SockCtrl, 2, string.Format("userName={0} hoemDir={1}", session.OneUser.UserName, session.OneUser.HomeDir));
                        return(false);
                    }

                    //ログイン成功 (カレントディレクトリは、ホームディレクトリで初期化される)
                    session.CurrentDir = new CurrentDir(session.OneUser.HomeDir, _listMount);

                    session.StringSend(string.Format("230 User {0} logged in.", session.UserName));
                    return(true);
                }
                //以下認証失敗処理
                Logger.Set(LogKind.Secure, session.SockCtrl, 15, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            }
            var reservationTime = (int)Conf.Get("reservationTime");

            //ブルートフォース防止のためのウエイト(5秒)
            for (int i = 0; i < reservationTime / 100 && IsLife(); i++)
            {
                Thread.Sleep(100);
            }
            //認証に失敗した場合の処理
            session.StringSend("530 Login incorrect.");
            return(true);
        }
Beispiel #29
0
 private bool JobType(Session session, String param)
 {
     String resStr;
     switch (param.ToUpper()[0]){
         case 'A':
             session.FtpType = FtpType.Ascii;
             resStr = "200 Type set 'A'";
             break;
         case 'I':
             session.FtpType = FtpType.Binary;
             resStr = "200 Type set 'I'";
             break;
         default:
             resStr = "500 command not understood.";
             break;
     }
     session.StringSend(resStr);
     return true;
 }
Beispiel #30
0
        private bool JobPass(Session session, String password)
        {
            //�܂�USER�R�}���h���������Ă��Ȃ��ꍇ
            if (session.UserName == null){
                session.StringSend("503 Login with USER first.");
                return true;
            }

            //���[�U��񌟍�
            session.OneUser = _listUser.Get(session.UserName);

            if (session.OneUser == null){
                //�����ȃ��[�U�̏ꍇ
                Logger.Set(LogKind.Secure, session.SockCtrl, 14, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            } else{
                //�p�X���[�h�m�F
                bool success = false;
                // *�̏ꍇ�AAnonymous�ڑ��Ƃ��ď�������
                if (session.OneUser.Password == "*"){
                    //oneUser.UserName = string.Format("{0}(ANONYMOUS)",oneUser.UserName);
                    Logger.Set(LogKind.Normal, session.SockCtrl, 5, string.Format("{0}(ANONYMOUS) {1}", session.OneUser.UserName, password));
                    success = true;
                } else if (session.OneUser.Password == password){
                    Logger.Set(LogKind.Secure, session.SockCtrl, 6, string.Format("{0}", session.OneUser.UserName));
                    success = true;
                }

                if (success){
                    //�ȉ��A�p�X���[�h�F�؂ɐ��������ꍇ�̏���
                    //�z�[���f�B���N�g���̑��݊m�F
                    //�T�[�o�N���i�^�c�j���Ƀf�B���N�g�����폜����Ă���”\��������̂ŁA���̎��_�Ŋm�F����
                    if (Util.Exists(session.OneUser.HomeDir) != ExistsKind.Dir){
                        //�z�[���f�B���N�g�������݂��܂���i�������p���ł��Ȃ����ߐؒf���܂���
                        Logger.Set(LogKind.Error, session.SockCtrl, 2, string.Format("userName={0} hoemDir={1}", session.OneUser.UserName, session.OneUser.HomeDir));
                        return false;
                    }

                    //���O�C������ �i�J�����g�f�B���N�g���́A�z�[���f�B���N�g���ŏ����������j
                    session.CurrentDir = new CurrentDir(session.OneUser.HomeDir, _listMount);

                    session.StringSend(string.Format("230 User {0} logged in.", session.UserName));
                    return true;
                }
                //�ȉ��F�؎��s����
                Logger.Set(LogKind.Secure, session.SockCtrl, 15, string.Format("USER:{0} PASS:{1}", session.UserName, password));
            }
            var reservationTime = (int) Conf.Get("reservationTime");

            //�u���[�g�t�H�[�X�h�~�̂��߂̃E�G�C�g(5�b)
            for (int i = 0; i < reservationTime/100 && IsLife(); i++){
                Thread.Sleep(100);
            }
            //�F�؂Ɏ��s�����ꍇ�̏���
            session.StringSend("530 Login incorrect.");
            return true;
        }
Beispiel #31
0
        private bool jobRnfr(Session session, String param, FtpCmd ftpCmd)
        {
            var path = session.CurrentDir.CreatePath(null, param, false);
            //Ver6.0.3 �f�B���N�g���g���o�[�T��
            if (path == null) {
                session.StringSend("550 Permission denied.");
                return false;
            }

            if (Util.Exists(path) != ExistsKind.None){
                session.RnfrName = path;
                session.StringSend("350 File exists, ready for destination name.");
                return true;
            }
            session.StringSend(string.Format("451 {0} error.", ftpCmd));
            return true;
        }
Beispiel #32
0
 private static bool JobCwd(Session session, String param)
 {
     if (session.CurrentDir.Cwd(param)){
         session.StringSend("250 CWD command successful.");
     } else{
         session.StringSend(string.Format("550 {0}: No such file or directory.", param));
     }
     return true;
 }
Beispiel #33
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;
 }