示例#1
0
文件: RrDb.cs 项目: jsakamoto/bjd5
        //コンストラクタ
        //リソース定義(Dat)で初期化する場合
        public RrDb(Logger logger, Conf conf, IEnumerable<OneDat> dat, string dname,bool authority)
        {
            //ドメイン名の初期化
            SetDomainName(dname);

            //Ver6.1.0
            Authority = authority;

            //Datの読み込み
            if (dat != null){
                foreach (var o in dat){
                    if (o.Enable){
                        try{
                            AddOneDat(_domainName, o);
                        } catch (ValidObjException e){
                            logger.Set(LogKind.Error, null, 19, string.Format("domain={0} {1}", _domainName, e.Message));
                        }
                    }
                }
            }
            if (conf != null){
                //SOAレコードの追加
                var mail = (string) conf.Get("soaMail");
                var serial = (uint)((int) conf.Get("soaSerial"));
                var refresh = (uint)((int) conf.Get("soaRefresh"));
                var retry = (uint)((int) conf.Get("soaRetry"));
                _expire = (uint)((int) conf.Get("soaExpire")); //expireは、TTL=0のリソースが検索されたとき、TTLに使用するため、クラス変数に保存する
                var minimum = (uint)((int) conf.Get("soaMinimum"));
                if (!InitSoa(_domainName, mail, serial, refresh, retry, _expire, minimum)){
                    logger.Set(LogKind.Error, null, 20, string.Format("domain={0}", _domainName));
                }
            }
        }
示例#2
0
        //リストが無い場合は、allowList及びdenyListはnullでもよい
        //テスト用にlogger=nullも可
        public RelayList(IEnumerable<OneDat> dat,string name,Logger logger)
        {
            if (dat == null){ //リストなし
                return;
            }
            foreach (var o in dat) {
                if (!o.Enable){
                    continue;
                }
                var ipStr= o.StrList[0];

                if (ipStr.IndexOf('.') != -1) {//IPv4ルール
                    var acl = new AclV4(name,ipStr);
                    if (!acl.Status) {
                        if (logger != null){
                            logger.Set(LogKind.Error, null, 25, string.Format("{0} : {1}", name, ipStr));
                        }
                    } else {
                        _arV4.Add(acl);
                    }
                } else {//IPv6ルール
                    var acl = new AclV6(name,ipStr);
                    if (!acl.Status) {
                        if (logger != null){
                            logger.Set(LogKind.Error, null, 25, string.Format("{0} : {1}", name, ipStr));
                        }
                    } else {
                        _arV6.Add(acl);
                    }
                }
            }
        }
示例#3
0
文件: Alias.cs 项目: jsakamoto/bjd5
        //�e�X�g�p logger��null�ł��
        public void Add(String name, String alias, Logger logger)
        {
            System.Diagnostics.Debug.Assert(logger != null, "logger != null");

            //alias�̕�����ɖ������Ȃ����ǂ�����m�F����
            var tmp = alias.Split(',');
            var sb = new StringBuilder();
            foreach (var str in tmp){
                if (str.IndexOf('@') != -1){
                    //�O���[�o���A�h���X�̒lj�
                    sb.Append(str);
                    sb.Append(',');
                }else if (str.IndexOf('/') == 0){
                    //���[�J���t�@�C���̏ꍇ
                    sb.Append(str);
                    sb.Append(',');
                }else if (str.IndexOf('$') == 0){
                    //��`�̏ꍇ
                    if (str == "$ALL"){
                        if (_mailBox != null){
                            foreach (string user in _mailBox.UserList) {
                                sb.Append(string.Format("{0}@{1}", user, _domainList[0]));
                                sb.Append(',');
                            }
                        }
                    }else if (str == "$USER"){
                        //Ver5.4.3 $USER�lj�
                        sb.Append(string.Format("{0}@{1}", name, _domainList[0]));
                        sb.Append(',');
                    }else{
                        logger.Set(LogKind.Error, null, 45, string.Format("name:{0} alias:{1}", name, alias));
                    }
                }else{
                    if (_mailBox==null || !_mailBox.IsUser(str)){
                        //���[�U���͗L�����H
                        logger.Set(LogKind.Error, null, 19, string.Format("name:{0} alias:{1}", name, alias));
                    }else{
                        sb.Append(string.Format("{0}@{1}", str, _domainList[0]));
                        sb.Append(',');
                    }
                }
            }
            string buffer;
            if (_ar.TryGetValue(name, out buffer)){
                logger.Set(LogKind.Error, null, 30, string.Format("user:{0} alias:{1}", name, alias));
            }else{
                _ar.Add(name, sb.ToString());
            }
        }
示例#4
0
 //変換と追加
 public void Exec(Mail mail,Logger logger)
 {
     Debug.Assert(logger != null, "logger != null");
     //ヘッダ変換
     foreach (var a in _replace){
         if (mail.RegexHeader(a.Key,a.Value)){
             logger.Set(LogKind.Normal, null, 16, string.Format("{0} -> {1}", a.Key,a.Value));
         }
     }
     //ヘッダの追加
     foreach (var a in _append){
         mail.AddHeader(a.Key, a.Value);
         logger.Set(LogKind.Normal, null, 17, string.Format("{0}: {1}", a.Key, a.Value));
     }
 }
示例#5
0
文件: Cache.cs 项目: jsakamoto/bjd5
        public Cache(Kernel kernel, Logger logger, Conf conf)
            : base(logger)
        {
            this.logger = logger;
            //_oneOption = oneOption;
            _conf = conf;
            _useCache = (bool)conf.Get("useCache");

            if (!_useCache)
                return;

            _expires = (int)conf.Get("expires");
            _maxSize = (int)conf.Get("maxSize");
            _diskSize = (int)conf.Get("diskSize");
            _memorySize = (int)conf.Get("memorySize");

            //�L���b�V���Ώۃ��X�g
            _cacheTargetHost = new CacheTarget((Dat)conf.Get("cacheHost"), (int)conf.Get("enableHost"));
            _cacheTargetExt = new CacheTarget((Dat)conf.Get("cacheExt"), (int)conf.Get("enableExt"));

            //�f�B�X�N�L���b�V��
            var cacheDir = (string)conf.Get("cacheDir");//�L���b�V����ۑ�����f�B���N�g��
            if (cacheDir == "" || !Directory.Exists(cacheDir)) {
                logger.Set(LogKind.Error, null, 15, string.Format("dir = {0}", cacheDir));
                _diskSize = 0;
            }
            if (_diskSize != 0) {
                _diskCache = new DiskCache(cacheDir, logger);
            }

            if (_memorySize != 0)//�������L���b�V��
                _memoryCache = new MemoryCache(logger);
        }
示例#6
0
 /**
  * 溜まったログをloggerに送る
  * @param logger
  */
 public void Release(Logger logger)
 {
     foreach (var a in _ar){
         logger.Set(a.LogKind, a.SockObj, a.MessageNo, a.DetailInfomation);
     }
     _ar.Clear();
 }
示例#7
0
文件: Log.cs 项目: schifflee/bjd5
 public void Set(LogKind logKind, SockObj sockBase, int messageNo, string detailInfomation)
 {
     if (_logger != null)
     {
         _logger.Set(logKind, sockBase, messageNo, detailInfomation);
     }
 }
示例#8
0
        /**
         * 溜まったログをloggerに送る
         * @param logger
         */

        public void Release(Logger logger)
        {
            foreach (var a in _ar)
            {
                logger.Set(a.LogKind, a.SockObj, a.MessageNo, a.DetailInfomation);
            }
            _ar.Clear();
        }
示例#9
0
文件: Ssl.cs 项目: jsakamoto/bjd5
        //サーバ用コンストラクタ
        public Ssl(Logger logger, string fileName, string password)
        {
            //    this.logger = logger;

            Status = false;//初期化が成功しているかどうかのステータス
            if (!File.Exists(fileName)) {
                logger.Set(LogKind.Error, null, 9000026, fileName);
                return;
            }

            try {
                _x509Certificate2 = new X509Certificate2(fileName, password);
            } catch (Exception ex) {
                logger.Set(LogKind.Error, null, 9000023, ex.Message);
                return;
            }
            Status = true;//初期化が成功しているかどうかのステータス
        }
示例#10
0
        public RemoteClient(Kernel kernel)
            : base(kernel.CreateLogger("RemoteClient",true,null))
        {
            _kernel = kernel;

            var args = Environment.GetCommandLineArgs();

            //this.kernel = kernel;
            IsConected = false;
            _logger = _kernel.CreateLogger("RemoteClient", true, this);
            _optionFileName = string.Format("{0}\\{1}.ini", _kernel.ProgDir(), "$remote");

            //Java fix IsJp�͌����_�ł͕s��
            _kernel.Menu.InitializeRemote(true);//�ؒf���̌y�ʃ��j���[
            //_kernel.Menu.OnClick += Menu_OnClick;

            //�R�}���h���C�������̏���
            if (args.Length != 2 && args.Length !=3) {
                _logger.Set(LogKind.Error,null,1,string.Format("args.Length={0}",args.Length));
                return;
            }
            //�ڑ���A�h���X
            try{
                _ip = new Ip(args[1]);
            }catch(ValidObjException){
                _logger.Set(LogKind.Error,null,2,string.Format("ip={0}", args[1]));
                return;
            }
            //_ip = new Ip(args[1]);
            //if (_ip.ToString() == "0.0.0.0") {
            //    _logger.Set(LogKind.Error,null,2,string.Format("ip={0}", args[1]));
            //    return;
            //}
            //�ڑ���|�[�g�ԍ�
            if (args.Length == 3) {
                try {
                    _port = Convert.ToInt32(args[2]);
                } catch {
                    _logger.Set(LogKind.Error,null,3,string.Format("port={0}", args[2]));
                    _ip = new Ip(IpKind.V4_0);//���������s
                }
            }
        }
示例#11
0
        //(Dat)conf.Get("range")
        //(int)conf.Get("enableEsmtp")
        public SmtpAuthRange(IEnumerable<OneDat> range, int enableEsmtp,Logger logger)
        {
            _logger = logger;

            _enableEsmtp = enableEsmtp;

            if (range != null){
                foreach (var o in range){
                    if (o.Enable){//有効なデータだけを対象にする
                        var name = o.StrList[0];
                        var ipStr = o.StrList[1];

                        if (ipStr.IndexOf('.') != -1){//IPv4ルール
                            var acl = new AclV4(name, ipStr);
                            if (!acl.Status){
                                if (_logger != null){
                                    _logger.Set(LogKind.Error, null, 9000040,
                                                string.Format("Name:{0} Address{1}", name, ipStr));
                                }
                            }
                            else{
                                _arV4.Add(acl);
                            }
                        }else{//IPv6ルール
                            var acl = new AclV6(name, ipStr);
                            if (!acl.Status){
                                if (_logger != null){
                                    _logger.Set(LogKind.Error, null, 9000040,
                                                string.Format("Name:{0} Address{1}", name, ipStr));
                                }
                            }
                            else{
                                _arV6.Add(acl);
                            }
                        }
                    }
                }
            }
        }
示例#12
0
文件: MlCmd.cs 项目: jsakamoto/bjd5
 public MlCmd(Logger logger, Mail mail, MlOneUser mlOneUser)
 {
     //this.logger = logger;
     var lines = Inet.GetLines(mail.GetBody());
     foreach (var line in lines) {
         var str = mail.GetEncoding().GetString(line);
         str = Inet.TrimCrlf(str);
         //Ver5.6.4 前後の空白を除去する
         str = str.Trim();
         if (str == "")//空白行は無視する
             continue;
         if (!SetCmd(str, mlOneUser)) {
             logger.Set(LogKind.Error, null, 40, str);//解釈失敗
         }
     }
 }
示例#13
0
        public MlMailDb(Logger logger, string manageDir, string mlName)
        {
            Status = false;
            _logger = logger;

            _dir = string.Format("{0}\\{1}", manageDir, mlName);
            if (!Directory.Exists(_dir)) {
                try {
                    Directory.CreateDirectory(_dir);
                } catch {
                    if(logger!=null)
                        logger.Set(LogKind.Error, null,31, _dir);
                    return;
                }
            }
            Status = true;
        }
示例#14
0
        //RETRの後のメールの保存が完成したら、Job2をこちらに乗せ換えられる
        public bool Job(Logger logger,DateTime now,ILife iLife)
        {
            Debug.Assert(logger != null, "logger != null");

            var fetchDb = new FetchDb(_kernel.ProgDir(), _oneFetch.Name);
            var remoteUidList = new List<String>();
            var getList = new List<int>();//取得するメールのリスト
            var delList = new List<int>();//削除するメールのリスト

            //受信間隔を過ぎたかどうかの判断
            if (_dt.AddMinutes(_oneFetch.Interval) > now){
                return false;
            }

            logger.Set(LogKind.Normal, null, 1, _oneFetch.ToString());
            if (_oneFetch.Ip == null) {
                logger.Set(LogKind.Error, null, 2, "");
                return false;
            }
            var popClient = new PopClient(_kernel,_oneFetch.Ip,_oneFetch.Port,_timeout,iLife);
            //接続
            if (!popClient.Connect()){
                logger.Set(LogKind.Error, null, 3, popClient.GetLastError());
                return false;
            }
            //ログイン
            if (!popClient.Login(_oneFetch.User, _oneFetch.Pass)){
                logger.Set(LogKind.Error, null, 4, popClient.GetLastError());
                return false;
            }
            //UID
            var lines = new List<String>();
            if (!popClient.Uidl(lines)) {
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return false;
            }
            for (int i=0;i<lines.Count;i++){
                var tmp = lines[i].Split(' ');
                if (tmp.Length == 2){
                    var uid = tmp[1];
                    remoteUidList.Add(uid);

                    //既に受信が完了しているかどうかデータベースで確認する
                    if (fetchDb.IndexOf(uid) == -1) {
                        //存在しない場合
                        getList.Add(i);//受信対象とする
                    }
                }
            }
            if (_oneFetch.Synchronize == 0) { //サーバに残す
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (_oneFetch.KeepTime != 0){ //保存期間0の時は、削除しない
                        //保存期間が過ぎているかどうかを確認する
                        if (fetchDb.IsPast(remoteUidList[i], _oneFetch.KeepTime * 60)) { //サーバに残す時間(分)
                            delList.Add(i);
                        }
                    }
                }
            } else if (_oneFetch.Synchronize == 1) { //メールボックスと同期する
                //メールボックスの状態を取得する
                var localUidList = new List<string>();
                var folder = string.Format("{0}\\{1}", _kernel.MailBox.Dir, _oneFetch.LocalUser);
                foreach (var fileName in Directory.GetFiles(folder, "DF_*")) {
                    var mailInfo = new MailInfo(fileName);
                    localUidList.Add(mailInfo.Uid);
                }
                //メールボックスに存在しない場合、削除対象になる
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (localUidList.IndexOf(remoteUidList[i]) == -1) {
                        delList.Add(i);
                    }
                }
            } else if (_oneFetch.Synchronize == 2) { //サーバから削除
                //受信完了リストに存在する場合、削除対象になる
                for (var i = 0; i < remoteUidList.Count; i++) {
                    if (fetchDb.IndexOf(remoteUidList[i]) != -1) {
                        delList.Add(i);
                    }
                }
            }
            //RETR
            for (int i = 0; i < getList.Count;i++ ){
                var mail = new Mail();
                if (!popClient.Retr(getList[i], mail)) {
                    logger.Set(LogKind.Error, null, 6, popClient.GetLastError());
                    return false;
                }
                //Ver5.9.8
                var fromStr = mail.GetHeader("From");
                if (fromStr == null){
                    fromStr = string.Format("{0}@{1}_{2}", _oneFetch.User, _oneFetch.Host, _oneFetch.Port);
                }

                var from = new MailAddress(fromStr);
                mail.ConvertHeader("X-UIDL", remoteUidList[i]);
                var remoteAddr = _oneFetch.Ip;
                var remoteHost = _oneFetch.Host;

                var rcptList = new List<MailAddress>();
                rcptList.Add(new MailAddress(_oneFetch.LocalUser, _domainName));

                if (_mailSave != null){
                    if (!_mailSave.Save(from, rcptList, mail, remoteHost, remoteAddr)){
                        return false;
                    }
                }

                fetchDb.Add(remoteUidList[i]);
            }
            //DELE
            for (int i = 0; i < delList.Count;i++ ){
                if (!popClient.Dele(delList[i])){
                    logger.Set(LogKind.Error, null, 7, popClient.GetLastError());
                    return false;
                }
                fetchDb.Del(remoteUidList[i]);
            }
            //QUIT
            if (!popClient.Quit()){
                logger.Set(LogKind.Error, null, 5, popClient.GetLastError());
                return false;
            }
            fetchDb.Save();
            _dt = DateTime.Now;//最終処理時刻の更新
            return true;
        }
示例#15
0
文件: Request.cs 项目: jsakamoto/bjd5
        //�f�[�^�擾�i����f�[�^�́A�����������j
        public bool Recv(Logger logger, SockTcp tcpObj,int timeout,ILife iLife)
        {
            var buf= tcpObj.LineRecv(timeout,iLife);
            if (buf == null)
                return false;
            buf = Inet.TrimCrlf(buf);

            _urlEncoding = MLang.GetEncoding(buf);//URL�G���R�[�h�̌`����ۑ�����

            //Ver5.9.8
            if (_urlEncoding == null){
                var sb = new StringBuilder();
                for (int i = 0; i < buf.Length; i++) {
                    sb.Append(String.Format("0x{0:X},", buf[i]));
                }
                logger.Set(LogKind.Error, tcpObj, 9999, String.Format("_urlEncoding==null buf.Length={0} buf={1}", buf.Length,sb.ToString()));
                //���̂܂ܗ�O�֓˓�������
            }

            var str = _urlEncoding.GetString(buf);

            // ���\�b�h�EURI�E�o�[�W�����ɕ���
            //"GET http://hostname:port@user:pass/path/filename.ext?param HTTP/1.1"
            RequestStr = str;

            //(�󔒂ŕ�������)�@"GET <=> http://hostname:port@user:pass/path/filename.ext?param HTTP/1.1"
            var index = str.IndexOf(' ');
            if (index < 0) //Ver5.0.0-a8
                return false;

            //(�O��) "GET"
            var methodStr = str.Substring(0, index);
            foreach (HttpMethod m in Enum.GetValues(typeof(HttpMethod))) {
                if (methodStr.ToUpper() == m.ToString().ToUpper()) {
                    HttpMethod = m;
                    break;
                }
            }
            if (HttpMethod == HttpMethod.Unknown) {
                logger.Set(LogKind.Secure,tcpObj,1,string.Format("{0}",RequestStr));//�T�|�[�g�O�̃��\�b�h�ł��i������p���ł��܂���j
                return false;
            }
            if (HttpMethod == HttpMethod.Connect) {
                Protocol = ProxyProtocol.Ssl;
                Port = 443;//�f�t�H���g�̃|�[�g�ԍ���443�ɂȂ�
            }

            //(�㔼) "http://*****:*****@user:pass/path/filename.ext?param HTTP/1.1"
            str = str.Substring(index + 1);

            //(�󔒂ŕ�������)�@"http://*****:*****@user:pass/path/filename.ext?param <=> HTTP/1.1"
            index = str.IndexOf(' ');
            if (index < 0) //Ver5.0.0-a8
                return false;
            //(�㔼) "HTTP/1.1"
            HttpVer = str.Substring(index + 1);

            if(HttpVer != "HTTP/0.9" && HttpVer != "HTTP/1.0" && HttpVer != "HTTP/1.1") {
                logger.Set(LogKind.Secure,tcpObj,2,RequestStr);//�T�|�[�g�O�̃o�[�W�����ł��i������p���ł��܂���j
                return false;
            }

            //(�O��) "http://*****:*****@user:pass/path/filename.ext?param"
            str = str.Substring(0, index);

            if (Protocol == ProxyProtocol.Unknown) {//�v���g�R���擾
                //("://"�������)�@"http <=> hostname:port@user:pass/path/filename.ext?param <=> HTTP/1.1"
                index = str.IndexOf("://");
                if (index < 0) //Ver5.0.0-a8
                    return false;
                //(�O��) "http"
                var protocolStr = str.Substring(0, index);

                if (protocolStr.ToLower() == "ftp") {
                    Protocol = ProxyProtocol.Ftp;//�v���g�R����FTP�ɏC��
                    Port = 21;//FTP�ڑ��̃f�t�H���g�̃|�[�g�ԍ���21�ɂȂ�
                } else if(protocolStr.ToLower() != "http") {
                    //Ver5.6.7
                    //Msg.Show(MsgKind.Error,"�݌v�G���[�@Request.Recv()");
                    //�G���[�\����|�b�v�A�b�v���烍�O�ɕύX
                    logger.Set(LogKind.Error, tcpObj, 29, string.Format("protocolStr={0}", protocolStr));
                    return false;
                } else {
                    Protocol = ProxyProtocol.Http;
                }
                //(�㔼) "hostname:port@user:pass/path/filename.ext?param"
                str = str.Substring(index + 3);
            }
            //(�ŏ���"/"�ŕ�������)�@"hostname:port@user:pass <=> /path/filename.ext?param"
            index = str.IndexOf('/');
            HostName = str;
            if (0 <= index) {
                //(�O��) ""hostname:port@user:pass"
                HostName = str.Substring(0, index);

                //(�㔼) "/path/filename.ext?param"
                str = str.Substring(index);
            } else {
                // GET http://hostname HTTP/1.0 �̂悤�ɁA���[�g�f�B���N�g�����w�肳��Ă��Ȃ��ꍇ�̑Ώ�
                str = "/";
            }

            //�z�X�g�������Ƀ��[�U���F�p�X���[�h�������Ă���ꍇ�̏���
            index = HostName.IndexOf("@");
            if (0 <= index) {
                var userpass = HostName.Substring(0,index);

                //���[�U���F�p�X���[�h��j������
                HostName = HostName.Substring(index + 1);

                var i = userpass.IndexOf(':');
                if(i == -1) {
                    User = userpass;
                } else {
                    User = userpass.Substring(0,i);
                    Pass = userpass.Substring(i + 1);
                }
            }
            //Ver5.1.2 IPv6�A�h���X�\�L�̃z�X�g���ɑΉ�
            var tmp = HostName.Split(new[] { '[',']' });
            if(tmp.Length == 3) {//IPv6�A�h���X�\�L�ł���Ɣ��f����
                HostName = string.Format("[{0}]",tmp[1]);
                index = tmp[2].IndexOf(":");
                if(0 <= index) {
                    var s = tmp[2].Substring(index + 1);
                    Port = Convert.ToInt32(s);
                }
            }else{

                //�z�X�g�������Ƀ|�[�g�ԍ��������Ă���ꍇ�̏���
                index = HostName.IndexOf(":");
                if (0 <= index) {
                    var s = HostName.Substring(index + 1);
                    Port = Convert.ToInt32(s);
                    HostName = HostName.Substring(0, index);
                }
            }

            Uri = str;

            //CGI����
            if(-1!=Uri.LastIndexOf('?'))
                Cgi=true;

            //�g���q�擾
            if (!Cgi) {
                index = Uri.LastIndexOf('/');
                if (index != -1)
                    str = Uri.Substring(index + 1);
                index = str.LastIndexOf('.');
                if (index != -1) {
                    Ext = str.Substring(index + 1);
                }
            }
            return true;
        }
示例#16
0
文件: AclList.cs 项目: jsakamoto/bjd5
        //Dat dat==null で初期化された場合、全てenableNumで指定したものになる
        //dat=null enableNum=0(不許可) => All Deny
        //dat=null enableNum=1(許可) => All Allow
        public AclList(IEnumerable<OneDat> dat, int enableNum, Logger logger)
        {
            _enable = (enableNum == 1);
            _logger = logger;
            if (dat == null){
                return;
            }
            foreach (var o in dat){
                if (!o.Enable){
                    continue;
                }
                //有効なデータだけを対象にする
                var name = o.StrList[0];
                var ipStr = o.StrList[1];

                if (ipStr == "*"){
                    //全部
                    try{
                        var acl = new AclV4(name, ipStr);
                        _arV4.Add(acl);
                    } catch (ValidObjException){
                        logger.Set(LogKind.Error, null, 9000034, string.Format("Name:{0} Address {1}", name, ipStr));
                    }
                    try{
                        var acl = new AclV6(name, ipStr);
                        _arV6.Add(acl);
                    } catch (ValidObjException){
                        logger.Set(LogKind.Error, null, 9000034, string.Format("Name:{0} Address {1}", name, ipStr));
                    }
                } else{
                    //IPv4指定かどうかの判断
                    var isV4 = true;
                    foreach (var c in ipStr){
                        if (char.IsNumber(c)){
                            continue;
                        }
                        if (c=='*' || c=='.' || c=='/' || c=='-'){
                            continue;
                        }
                        isV4 = false;
                        break;
                    }
                    if (isV4){
                        //IPv4ルール
                        try{
                            var acl = new AclV4(name, ipStr);
                            _arV4.Add(acl);
                        } catch (ValidObjException){
                            logger.Set(LogKind.Error, null, 9000034, string.Format("Name:{0} Address {1}", name, ipStr));
                        }

                    } else{
                        //IPv6指定かどうかの判断
                        var isV6 = true;
                        foreach (var c in ipStr) {
                            if (char.IsNumber(c)) {
                                continue;
                            }
                            if (c == '*' || c == ':' || c == '[' || c == ']' || c == '-') {
                                continue;
                            }
                            isV6 = false;
                            break;
                        }
                        if (isV6){
                            //IPv6ルール
                            try{
                                var acl = new AclV6(name, ipStr);
                                _arV6.Add(acl);
                            } catch (ValidObjException){
                                logger.Set(LogKind.Error, null, 9000034, string.Format("Name:{0} Address {1}", name, ipStr));
                            }

                        }else{ //FQDN指定と判断する
                            _arFqdnAcls.Add(new FqdnAcl(name,ipStr));
                        }

                    }
                }
            }
        }
示例#17
0
文件: Data.cs 项目: jsakamoto/bjd5
        //通常はこれを使用する
        public bool Recv(SockTcp sockTcp, int sec,Logger logger, ILife iLife)
        {
            var dtLast = DateTime.Now; //受信が20秒無かった場合は、処理を中断する
            while (iLife.IsLife()){
                if (dtLast.AddSeconds(sec) < DateTime.Now){
                    return false; //タイムアウト
                }
                var len = sockTcp.Length();
                if (len == 0){
                    continue;
                }
                var buf = sockTcp.Recv(len, sec, iLife);
                if (buf == null){
                    return false; //切断された
                }
                dtLast = DateTime.Now;

                var recvStatus = Append(buf);

                if (recvStatus == RecvStatus.Limit){
                    //サイズ制限
                    if (logger != null){
                        logger.Set(LogKind.Secure, sockTcp, 7, string.Format("Limit:{0}KByte", _sizeLimit));
                    }
                    sockTcp.AsciiSend("552 Requested mail action aborted: exceeded storage allocation");
                    return false;
                }
                if (recvStatus == RecvStatus.Finish){
                    return true;
                }
            }
            return false;
        }
示例#18
0
文件: Alias.cs 项目: jsakamoto/bjd5
        //���惊�X�g�̕ϊ�
        //�e�X�g�p logger��null�ł��
        /*public RcptList Reflection(RcptList rcptList, Logger logger) {
            var ret = new RcptList();
            foreach(var mailAddress in rcptList){

                string buffer;
                if (mailAddress.IsLocal(_domainList) && _ar.TryGetValue(mailAddress.User, out buffer)) {
                    var lines = buffer.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach(var line in lines) {
                        if (logger != null){
                            logger.Set(LogKind.Normal, null, 27, string.Format("{0} -> {1}", mailAddress, line));
                        }
                        ret.Add(new MailAddress(line));
                    }
                }else{
                    ret.Add(mailAddress);
                }
            }
            return ret;
        }*/
        public List<MailAddress> Reflection(List<MailAddress> list, Logger logger)
        {
            System.Diagnostics.Debug.Assert(logger != null, "logger != null");

            //var ret = new RcptList();
            var ret = new List<MailAddress>();

            foreach (var mailAddress in list) {

                string buffer;
                if (mailAddress.IsLocal(_domainList) && _ar.TryGetValue(mailAddress.User, out buffer)) {
                    var lines = buffer.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var line in lines) {
                        logger.Set(LogKind.Normal, null, 27, string.Format("{0} -> {1}", mailAddress, line));
                        ret.Add(new MailAddress(line));
                    }
                } else {
                    ret.Add(mailAddress);
                }
            }
            return ret;
        }
示例#19
0
        //IPアドレスからホスト名を検索する(逆引き)
        //return 取得したIPアドレスの配列 検索に失敗した場合、検索した文字列がそのまま返される
        public String GetHostName(IPAddress ipaddress, Logger logger)
        {
            lock (this){

                String ipStr = ipaddress.ToString();
                if (ipStr[0] == '/'){
                    ipStr = ipStr.Substring(1);
                }

                foreach (OneDnsCache oneDnsCache in ar){
                    foreach (Ip ip in oneDnsCache.IpList){
                        if (ip.ToString() == ipStr){
                            return oneDnsCache.Name;
                        }
                    }
                }

                RemoveOldCache(); //古いものを整理する

                //DNSに問い合わせる
                //String hostName = ipaddress.ToString();//.getHostName();
                var hostName = "";
                try{
                    var hostInfo = Dns.GetHostByAddress(ipaddress.ToString());
                    hostName = hostInfo.HostName;
                }
                catch{
                    hostName = ipaddress.ToString();
                }

                if (hostName == ipStr){
                    if (logger != null){
                        logger.Set(LogKind.Normal, null, 9000052, string.Format("IP={0}", ipStr));
                    }
                }

                //データベースへの追加
                Ip[] ipList = new Ip[1];
                try{
                    ipList[0] = new Ip(ipStr);
                } catch (ValidObjException e){
                    //ここで失敗するのはおかしい
                    Util.RuntimeException(string.Format("new Ip({0}) => ValidObjException ({1})", ipStr,e.Message));
                }
                ar.Add(new OneDnsCache(hostName, ipList));
                return hostName;
            }
        }
示例#20
0
文件: SockObj.cs 项目: jsakamoto/bjd5
 //TODO メソッドの配置はここでよいか?
 public void Resolve(bool useResolve, Logger logger)
 {
     if (useResolve){
         RemoteHostname = "resolve error!";
         try{
             RemoteHostname = Kernel.DnsCache.GetHostName(RemoteAddress.Address, Kernel.CreateLogger("SockObj", true, null));
         } catch (Exception ex){
             logger.Set(LogKind.Error, null, 9000053, ex.Message);
         }
     } else{
         String ipStr = RemoteAddress.Address.ToString();
         if (ipStr[0] == '/'){
             ipStr = ipStr.Substring(1);
         }
         RemoteHostname = ipStr;
     }
 }