Пример #1
0
        //ACCEPT
        //Ver5.9.2 Java fix
        //public SockTcp(Kernel kernel, Socket s) : base(kernel){
        public SockTcp(Kernel kernel, Ssl ssl, Socket s)
            : base(kernel)
        {
            //************************************************
            //selector/channel生成
            //************************************************
            _socket = s;
            _ssl = ssl;

            //既に接続を完了している
            if (_ssl != null){
                //SSL通信の場合は、SSLのネゴシエーションが行われる
                _oneSsl = _ssl.CreateServerStream(_socket);
                if (_oneSsl == null) {
                    SetError("_ssl.CreateServerStream() faild");
                    return;
                }
            }

            //************************************************
            //ここまでくると接続が完了している
            //************************************************
            //Set(SockState.Connect, (InetSocketAddress) channel.socket().getLocalSocketAddress(), (InetSocketAddress) channel.socket().getRemoteSocketAddress());

            //************************************************
            //read待機
            //************************************************
            BeginReceive(); //接続完了処理(受信待機開始)
        }
Пример #2
0
 //指定したアドレス・ポートで待ち受けて、接続されたら、そのソケットを返す
 //失敗した時nullが返る
 //Ver5.9.2 Java fix
 //public static SockTcp CreateConnection(Kernel kernel,Ip ip, int port,ILife iLife){
 public static SockTcp CreateConnection(Kernel kernel,Ip ip, int port, Ssl ssl,ILife iLife)
 {
     //Ver5.9.2 Java fix
     //var sockServer = new SockServer(kernel,ProtocolKind.Tcp);
     var sockServer = new SockServer(kernel, ProtocolKind.Tcp,ssl);
     if (sockServer.SockState != SockState.Error) {
         const int listenMax = 1;
         if (sockServer.Bind(ip, port, listenMax)){
             while (iLife.IsLife()){
                 var child = (SockTcp) sockServer.Select(iLife);
                 if (child == null){
                     break;
                 }
                 sockServer.Close(); //これ大丈夫?
                 return child;
             }
         }
     }
     sockServer.Close();
     return null;
 }
Пример #3
0
        //CLIENT
        public SockTcp(Kernel kernel, Ip ip, int port, int timeout, Ssl ssl)
            : base(kernel)
        {
            //SSL通信を使用する場合は、このオブジェクトがセットされる 通常の場合は、null
            _ssl = ssl;

            _socket = new Socket((ip.InetKind == InetKind.V4) ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
            try{
                //socket.Connect(ip.IPAddress, port);
                _socket.BeginConnect(ip.IPAddress, port, CallbackConnect, this);
            } catch{
                SetError("BeginConnect() faild");
            }
            //[C#] 接続が完了するまで待機する
            while (SockState == SockState.Idle){
                Thread.Sleep(10);

            }
            //************************************************
            //ここまでくると接続が完了している
            //************************************************
        }
Пример #4
0
 //�b��
 static public SockTcp Connect(Kernel kernel,Ip ip,int port,int timeout,Ssl ssl){
     return new SockTcp(kernel,ip,port,timeout,ssl);
 }
Пример #5
0
        //CLIENT
        public SockUdp(Kernel kernel,Ip ip, int port, Ssl ssl, byte[] buf)
            : base(kernel)
        {
            //SSL通信を使用する場合は、このオブジェクトがセットされる 通常の場合は、null
            _ssl = ssl;

            _sockKind = SockKind.CLIENT;

            _socket = new Socket((ip.InetKind == InetKind.V4) ? AddressFamily.InterNetwork : AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);

            Set(SockState.Connect, null, new IPEndPoint(ip.IPAddress, port));

            //************************************************
            //送信処理
            //************************************************
            Send(buf);
        }
Пример #6
0
 //Ver5.9.2 Java fix
 //private OneSsl _oneSsl;
 public SockServer(Kernel kernel,ProtocolKind protocolKind,Ssl ssl)
     : base(kernel)
 {
     ProtocolKind = protocolKind;
     _ssl = ssl;
 }
Пример #7
0
        protected override void OnRunThread()
        {
            //ログ用文字列の生成
            string mailStr = string.Format("{0} retry:{1}",
                _oneQueue.MailInfo,
                _oneQueue.MailInfo.RetryCounter);

            //[C#]
            ThreadBaseKind = ThreadBaseKind.Running;

            //開始ログ
            _logger.Set(LogKind.Normal, null, 10, mailStr);

            //ここで、1通のメールを1回処理する
            //成功か失敗かの処理は、この関数の最後にもってくるべき?
            //失敗の理由によって、再試行にまわしたり、リターンメールを作成したり・・・・
            //リターンのリターンはループの危険性がある

            var retryMax = (int)_conf.Get("retryMax");//リトライ回数
            var deleteTarget = false;//処理対象のメールを削除するかどうかのフラグ

            //0.サーバ検索が終わっていない状態からスタート
            var result = SmtpClientResult.Faild;

            //Ver5.7.3 無効データの削除
            if(_oneQueue.MailInfo.To.Domain==""){
                deleteTarget = true;
                goto end;
            }

            //サーバ(アドレス)検索
            List<OneSmtpServer> smtpServerList = GetSmtpServerList(_oneQueue.MailInfo.To.Domain);
            if (smtpServerList.Count == 0) {
                //サーバ(アドレス)検索失敗(リトライ対象)
                _logger.Set(LogKind.Error, null, 12, string.Format("domain={0}", _oneQueue.MailInfo.To.Domain));//失敗
            } else {
                //送信処理
                foreach (OneSmtpServer oneSmtpServer in smtpServerList) {
                    Ssl ssl = null;
                    if (oneSmtpServer.Ssl) {
                        //クライアント用SSLの初期化
                        //ssl = new Ssl(server.Logger,oneSmtpServer.TargetServer);
                        ssl = new Ssl(oneSmtpServer.TargetServer);
                    }
                    var timeout = 5;
                    var tcpObj = Inet.Connect(_kernel,oneSmtpServer.Ip, oneSmtpServer.Port, timeout,ssl);
                    if (tcpObj == null) {
                        //serverMain.Logger.Set(LogKind.Error, xx, string.Format("to={0} address={1}", oneQueue.MailInfo.To.ToString(), ip.IpStr));
                        continue;
                    }
                    //Ver5.9.8
                    if (tcpObj.SockState != SockState.Connect){
                        _logger.Set(LogKind.Error, tcpObj, 56, tcpObj.GetLastEror());//失敗
                        break;
                    }

                    string esmtpUser = null;
                    string esmtpPass = null;
                    if (oneSmtpServer.UseSmtp) {
                        esmtpUser = oneSmtpServer.User;
                        esmtpPass = oneSmtpServer.Pass;
                    }
                    result = _smtpClient2.Send(tcpObj, _kernel.ServerName, _oneQueue.Mail(_mailQueue), _oneQueue.MailInfo.From, _oneQueue.MailInfo.To, esmtpUser, esmtpPass, this);
                    tcpObj.Close();

                    if (result == SmtpClientResult.Success) {
                        //送信成功
                        _logger.Set(LogKind.Normal, tcpObj, 11, mailStr);//成功
                        deleteTarget = true;
                        break;
                    }
                    if (result == SmtpClientResult.ErrorCode) {
                        //明確なエラーの発生
                        _logger.Set(LogKind.Error, tcpObj, 14, mailStr);//失敗
                        break;
                    }
                }
                if (result == SmtpClientResult.Faild) {
                    _logger.Set(LogKind.Error, null, 13, mailStr);//失敗
                }
            }

            //エラーコードが返された場合及びリトライ回数を超えている場合、リターンメールを作成する
            if (result == SmtpClientResult.ErrorCode || retryMax <= _oneQueue.MailInfo.RetryCounter) {
                var from = new MailAddress((string)_conf.Get("errorFrom"));
                var to = _oneQueue.MailInfo.From;

                //Ver_Ml
                //メール本体からMLメールかどうかを確認する
                //List-Software: BlackJumboDog Ver 5.0.0-b13
                //List-Owner: <mailto:[email protected]>
                var orgMail = _oneQueue.Mail(_mailQueue);
                var listSoftware = orgMail.GetHeader("List-Software");
                if (listSoftware != null && listSoftware.IndexOf(Define.ApplicationName()) == 0) {
                    var listOwner = orgMail.GetHeader("List-Owner");
                    if (listOwner != null) {
                        //<mailto:[email protected]>
                        listOwner = listOwner.Trim(new char[] { '<', '>' });
                        //mailto:[email protected]
                        var admin = listOwner.Substring(7);
                        //[email protected]
                        to = new MailAddress(admin);//宛先をML管理者に変更する
                    }
                }
                const string reason = "550 Host unknown";
                var mail = MakeErrorMail(from, to, reason, _smtpClient2.LastLog);
                _logger.Set(LogKind.Normal, null, 15, string.Format("from:{0} to:{1}", from, to));
                if (_server.MailSave2(from, to, mail, _oneQueue.MailInfo.Host, _oneQueue.MailInfo.Addr)) {
                    deleteTarget = true; //メール削除
                }
            }
            end:
            if (deleteTarget)
                _oneQueue.Delete(_mailQueue); //メール削除
        }
Пример #8
0
        WebDavDb _webDavDb; //WevDAVのDethプロパテイを管理するクラス

        #endregion Fields

        #region Constructors

        //通常のServerThreadの子クラスと違い、オプションはリストで受け取る
        //親クラスは、そのリストの0番目のオブジェクトで初期化する
        //コンストラクタ
        public Server(Kernel kernel,Conf conf,OneBind oneBind)
            : base(kernel, conf,oneBind)
        {
            //同一ポートで待ち受けている仮想サーバのオプションをすべてリストする
            WebOptionList = new List<OneOption>();
            foreach (var o in kernel.ListOption) {
                if (o.NameTag.IndexOf("Web-") == 0) {
                    if((int)o.GetValue("port") == (int)Conf.Get("port")){
                        WebOptionList.Add(o);
                    }
                }
            }
            //WebDAVリストの初期化
            foreach (var o in WebOptionList) {
                if(o.UseServer) {
                    _webDavDbList.Add(new WebDavDb(kernel,NameTag));
                }
            }
            _webDavDb = _webDavDbList[0];

            //Ver5.1.2「Cgiパス」「WebDAVパス」「別名」のオプションの修正
            var tagList = new List<string> { "cgiPath", "webDavPath", "aliaseList" };
            foreach(string tag in tagList) {
                var dat = (Dat)Conf.Get(tag);
                var changed = false;
                foreach(var o in dat) {
                    var str = o.StrList[0];
                    if(str[0] != '/') {
                        changed = true;
                        str = '/' + str;
                    }
                    if(str.Length > 1 && str[str.Length - 1] != '/') {
                        changed = true;
                        str = str + '/';
                    }
                    o.StrList[0] = str;
                }
                if(changed)
                    Conf.Set(tag, dat);
            }

            //当初、opBase及びloggerは、weboptionList[0]で暫定的に初期化される
            var protocol = (int)Conf.Get("protocol");
            if (protocol==1) {//HTTPS
                var op = kernel.ListOption.Get("VirtualHost");
                var privateKeyPassword = (string)op.GetValue("privateKeyPassword");
                var certificate = (string)op.GetValue("certificate");

                //サーバ用SSLの初期化
                ssl = new Ssl(Logger, certificate, privateKeyPassword);
            }

            var useAutoAcl = (bool)Conf.Get("useAutoAcl");// ACL拒否リストへ自動追加する
            if (useAutoAcl) {
                const int max = 1; //発生回数
                const int sec = 120; // 対象期間(秒)
                _attackDb = new AttackDb(sec, max);
            }
        }