public void ToStringによる文字列化() { //setUp var sut = new MailInfo(_dfFile); var expected = "from:[email protected] to:[email protected] size:310 uid:bjd.00634712193942765633.000"; //exercise var actual = sut.ToString(); //verify Assert.That(actual, Is.EqualTo(expected)); }
public void パラメータ指定によるコンストラクタの動作確認() { //setUp var a = new MailInfo(_dfFile); //var sut = new MailInfo(a.Uid, a.Size, a.Host, a.Addr, a.Date,a.From, a.To); var sut = new MailInfo(a.Uid, a.Size, a.Host, a.Addr, a.From, a.To); var expected = "from:[email protected] to:[email protected] size:310 uid:bjd.00634712193942765633.000"; //exercise var actual = sut.ToString(); //verify Assert.That(actual, Is.EqualTo(expected)); }
//�ڑ��P�ʂ̏��� protected override void OnSubThread(SockObj sockObj) { var sockTcp = (SockTcp)sockObj; var pop3LoginState = Pop3LoginState.User; var authType = (int)Conf.Get("authType"); // 0=USER/PASS 1=APOP 2=���� var useChps = (bool)Conf.Get("useChps"); //�p�X���[�h�ύX[CPHS]�̎g�p�E���g�p string user = null; //�O���[�e�B���O���b�Z�[�W�̕\�� var bannerMessage = Kernel.ChangeTag((string)Conf.Get("bannerMessage")); var authStr = ""; //APOP�p�̔F�ؕ����� if (authType == 0) { //USER/PASS sockTcp.AsciiSend("+OK " + bannerMessage); } else { //APOP authStr = APop.CreateAuthStr(Kernel.ServerName); sockTcp.AsciiSend("+OK " + bannerMessage + " " + authStr); } //���[���{�b�N�X�Ƀ��O�C�����āA���̎��_�̃��[�����X�g��擾���� //���ۂ̃��[���̍폜�́AQUIT��M���ɁAmailList.Update()�ŏ������� MessageList messageList = null; while (IsLife()) { //���̃��[�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 str = ""; var cmdStr = ""; var remoteIp = new Ip(sockTcp.RemoteAddress.Address.ToString()); var paramStr2 = ""; if (!RecvCmd(sockTcp, ref str, ref cmdStr, ref paramStr2)) { break; //�ؒf���ꂽ } if (str == "waiting") { Thread.Sleep(100); //��M�ҋ@�� continue; } //�R�}���h������̉�� var cmd = Pop3Cmd.Unknown; foreach (Pop3Cmd n in Enum.GetValues(typeof(Pop3Cmd))) { if (n.ToString().ToUpper() == cmdStr.ToUpper()) { cmd = n; break; } } if (cmd == Pop3Cmd.Unknown) { //�����R�}���h goto UNKNOWN; } //�p�����[�^���� var paramList = new List <string>(); if (paramStr2 != null) { paramList.AddRange( paramStr2.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim(' '))); } //���ł�t���� if (cmd == Pop3Cmd.Quit) { if (messageList != null) { messageList.Update(); //�����ō폜���������s����� } goto END; } if (pop3LoginState == Pop3LoginState.User) { if (cmd == Pop3Cmd.User && (authType == 0 || authType == 2)) { if (paramList.Count < 1) { goto FEW; } user = paramList[0]; pop3LoginState = Pop3LoginState.Pass; sockTcp.AsciiSend(string.Format("+OK Password required for {0}.", user)); } else if (cmd == Pop3Cmd.Apop && (authType == 1 || authType == 2)) { //APOP if (paramList.Count < 2) { goto FEW; } user = paramList[0]; //�F��(APOP�Ή�) var success = APop.Auth(user, Kernel.MailBox.GetPass(user), authStr, paramList[1]); //var success = APopAuth(user, authStr, paramList[1]); AutoDeny(success, remoteIp); //�u���[�g�t�H�[�X�� if (success) { if ( !Login(sockTcp, ref pop3LoginState, ref messageList, user, new Ip(sockObj.RemoteAddress.Address.ToString()))) { goto END; } } else { AuthError(sockTcp, user, paramList[1]); goto END; } } else { goto UNKNOWN; } } else if (pop3LoginState == Pop3LoginState.Pass) { if (cmd != Pop3Cmd.Pass) { goto UNKNOWN; } if (paramList.Count < 1) { goto FEW; } string pass = paramList[0]; var success = Kernel.MailBox.Auth(user, pass); //�F�� AutoDeny(success, remoteIp); //�u���[�g�t�H�[�X�� if (success) { //�F�� if ( !Login(sockTcp, ref pop3LoginState, ref messageList, user, new Ip(sockObj.RemoteAddress.Address.ToString()))) { goto END; } } else { AuthError(sockTcp, user, pass); goto END; } } else if (pop3LoginState == Pop3LoginState.Login) { if (cmd == Pop3Cmd.Dele || cmd == Pop3Cmd.Retr) { if (paramList.Count < 1) { goto FEW; } } if (cmd == Pop3Cmd.Top) { if (paramList.Count < 2) { goto FEW; } } int index = -1; //���[���A�� if (cmd != Pop3Cmd.Chps && 1 <= paramList.Count) { try{ index = Convert.ToInt32(paramList[0]); } catch (Exception) { sockTcp.AsciiSend("-ERR Invalid message number."); continue; } index--; if (index < 0 || messageList.Max <= index) { sockTcp.AsciiSend(string.Format("-ERR Message {0} does not exist.", index + 1)); continue; } } int count = -1; //TOP �s�� if (cmd != Pop3Cmd.Chps && 2 <= paramList.Count) { try{ count = Convert.ToInt32(paramList[1]); } catch (Exception) { sockTcp.AsciiSend("-ERR Invalid line number."); continue; } if (count < 0) { sockTcp.AsciiSend(string.Format("-ERR Linenumber range over: {0}", count)); continue; } } if (cmd == Pop3Cmd.Noop) { sockTcp.AsciiSend("+OK"); continue; } if (cmd == Pop3Cmd.Stat) { sockTcp.AsciiSend(string.Format("+OK {0} {1}", messageList.Count, messageList.Size)); continue; } if (cmd == Pop3Cmd.Rset) { messageList.Rset(); sockTcp.AsciiSend(string.Format("+OK {0} has {1} message ({2} octets).", user, messageList.Count, messageList.Size)); continue; } if (cmd == Pop3Cmd.Dele) { if (messageList[index].Del) { sockTcp.AsciiSend(string.Format("-ERR Message {0} has been markd for delete.", index + 1)); continue; } messageList[index].Del = true; //Ver5.0.3 //sockTcp.AsciiSend(string.Format("+OK {0} octets",messageList.Size),OPERATE_CRLF.YES); sockTcp.AsciiSend(string.Format("+OK {0} octets", messageList[index].Size)); continue; } if (cmd == Pop3Cmd.Uidl || cmd == Pop3Cmd.List) { if (paramList.Count < 1) { sockTcp.AsciiSend(string.Format("+OK {0} message ({1} octets)", messageList.Count, messageList.Size)); for (int i = 0; i < messageList.Max; i++) { if (!messageList[i].Del) { if (cmd == Pop3Cmd.Uidl) { sockTcp.AsciiSend(string.Format("{0} {1}", i + 1, messageList[i].Uid)); } else //LIST { sockTcp.AsciiSend(string.Format("{0} {1}", i + 1, messageList[i].Size)); } } } sockTcp.AsciiSend("."); continue; } if (cmd == Pop3Cmd.Uidl) { sockTcp.AsciiSend(string.Format("+OK {0} {1}", index + 1, messageList[index].Uid)); } else //LIST { sockTcp.AsciiSend(string.Format("+OK {0} {1}", index + 1, messageList[index].Size)); } } if (cmd == Pop3Cmd.Top || cmd == Pop3Cmd.Retr) { //OneMessage oneMessage = messageList[index]; sockTcp.AsciiSend(string.Format("+OK {0} octets", messageList[index].Size)); if (!messageList[index].Send(sockTcp, count)) { //���[���̑��M break; } MailInfo mailInfo = messageList[index].GetMailInfo(); Logger.Set(LogKind.Normal, sockTcp, 5, mailInfo.ToString()); sockTcp.AsciiSend("."); continue; } if (cmd == Pop3Cmd.Chps) { if (!useChps) { goto UNKNOWN; } if (paramList.Count < 1) { goto FEW; } var password = paramList[0]; //�Œᕶ���� var minimumLength = (int)Conf.Get("minimumLength"); if (password.Length < minimumLength) { sockTcp.AsciiSend("-ERR The number of letter is not enough."); continue; } //���[�U���Ɠ���̃p�X���[�h������Ȃ� if ((bool)Conf.Get("disableJoe")) { if (user.ToUpper() == password.ToUpper()) { sockTcp.AsciiSend("-ERR Don't admit a JOE."); continue; } } //�K���܂܂Ȃ���Ȃ�Ȃ������̃`�F�b�N bool checkNum = false; bool checkSmall = false; bool checkLarge = false; bool checkSign = false; foreach (char c in password) { if ('0' <= c && c <= '9') { checkNum = true; } else if ('a' <= c && c <= 'z') { checkSmall = true; } else if ('A' <= c && c <= 'Z') { checkLarge = true; } else { checkSign = true; } } if (((bool)Conf.Get("useNum") && !checkNum) || ((bool)Conf.Get("useSmall") && !checkSmall) || ((bool)Conf.Get("useLarge") && !checkLarge) || ((bool)Conf.Get("useSign") && !checkSign)) { sockTcp.AsciiSend("-ERR A required letter is not included."); continue; } var conf = new Conf(Kernel.ListOption.Get("MailBox")); if (!Chps.Change(user, password, Kernel.MailBox, conf)) { //if (!Kernel.MailBox.Chps(user, password, conf)){ sockTcp.AsciiSend("-ERR A problem occurred to a mailbox."); continue; } sockTcp.AsciiSend("+OK Password changed."); } } continue; UNKNOWN: sockTcp.AsciiSend(string.Format("-ERR Invalid command.")); continue; FEW: sockTcp.AsciiSend(string.Format("-ERR Too few arguments for the {0} command.", str)); continue; END: sockTcp.AsciiSend(string.Format("+OK Pop Server at {0} signing off.", Kernel.ServerName)); break; } Kernel.MailBox.Logout(user); if (sockTcp != null) { sockTcp.Close(); } }
//Server及びMlから使用される //メールの保存(宛先はML以外であることが確定してから使用する) //テスト用のモックオブジェクト(TsMailSaveでSave()をオーバーライドできるようにvirtualにする virtual public bool Save(MailAddress from, MailAddress to, Mail orgMail, string host, Ip addr) { //Mailのヘッダ内容等を変更するので、この関数内だけの変更にとどめるため、テンポラリを作成する var mail = new Mail(); //orgMail.CreateClone(); mail.Init2(orgMail.GetBytes()); //ユニークなID文字列の生成 var uidStr = string.Format("bjd.{0:D20}.{1:D3}", DateTime.Now.Ticks, _idCounter++); //日付文字列の生成 //var date = Util.LocalTime2Str(DateTime.Now); //Receivedヘッダの追加 mail.AddHeader("Received", _receivedHeader.Get(to, host, addr)); // //Message-Idの追加 // if (null == mail.GetHeader("Message-ID")) // mail.AddHeader("Message-ID", string.Format("<{0}@{1}>", uidStr, _domainList[0])); // //Fromの追加 // if (null == mail.GetHeader("From")) // mail.AddHeader("From", string.Format("<{0}>", @from)); // //Dateの追加 // if (null == mail.GetHeader("Date")) // mail.AddHeader("Date", string.Format("{0}", date)); //ローカル宛(若しくはローカルファイル) if (to.IsLocal(_domainList)) { //ローカル保存の場合は、X-UIDLを追加する mail.AddHeader("X-UIDL", uidStr); //ヘッダを追加してサイズが変わるので、ここで初期化する var mailInfo = new MailInfo(uidStr, mail.Length, host, addr, from, to); if (to.IsFile()) //ローカルファイルの場合(直接ファイルにAppendする) { if (!_localBox.Save(to, mail, mailInfo)) { return(false); } } else //ローカルユーザの場合(メールボックスへSaveする) { if (!_mailBox.Save(to.User, mail, mailInfo)) { return(false); } } _logger.Set(LogKind.Normal, null, 8, mailInfo.ToString()); } else { //Toの追加 // if (null == mail.GetHeader("To")) { // mail.AddHeader("To", string.Format("<{0}>", to)); // } //ヘッダを追加してサイズが変わるので、ここで初期化する var mailInfo = new MailInfo(uidStr, mail.Length, host, addr, from, to); if (!_mailQueue.Save(mail, mailInfo)) { _logger.Set(LogKind.Error, null, 9000059, mail.GetLastError()); return(false); } _logger.Set(LogKind.Normal, null, 9, mailInfo.ToString()); } return(true); }