//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(); //接続完了処理(受信待機開始) }
//指定したアドレス・ポートで待ち受けて、接続されたら、そのソケットを返す //失敗した時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; }
//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); } //************************************************ //ここまでくると接続が完了している //************************************************ }
//�b�� static public SockTcp Connect(Kernel kernel,Ip ip,int port,int timeout,Ssl ssl){ return new SockTcp(kernel,ip,port,timeout,ssl); }
//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); }
//Ver5.9.2 Java fix //private OneSsl _oneSsl; public SockServer(Kernel kernel,ProtocolKind protocolKind,Ssl ssl) : base(kernel) { ProtocolKind = protocolKind; _ssl = ssl; }
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); //メール削除 }
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); } }