private MailMessage Draft(MailMessage msg, string uid = null) { try { using (var imap = EnsureConnection()) { imap.SelectMailbox("Drafts"); var messageid = Guid.NewGuid() + "@" + DOMAIN; msg.MessageID = messageid; imap.AppendMail(msg); // delete the old message and upload the new one to drafts if (!String.IsNullOrEmpty(uid)) { imap.DeleteMessage(uid); } var messages = imap .Search(SearchCondition.Deleted().Not().And(SearchCondition.Header("Message-ID", msg.MessageID))) .Select(x => imap.GetMessage(x, true, true)); return(messages.FirstOrDefault() ?? msg); } } catch { throw new HttpException(500, Support.Error_Drafting); } }
private void bDeletedMessage_Click(object sender, RoutedEventArgs e) { try { Cursor = Cursors.Wait; sub = new ObservableCollection <LetterContainer>(); ListOfLetters.ItemsSource = null; ListOfLetters.Items.Clear(); uids = client.Search(SearchCondition.Deleted()); uids = uids.Reverse(); enumerator = uids.GetEnumerator(); count_letters = 30; while ((count_letters != 0) & (enumerator.MoveNext())) { MailMessage m = client.GetMessage(enumerator.Current); sub.Add(new LetterContainer(m, enumerator.Current)); count_letters--; } ListOfLetters.ItemsSource = sub; Cursor = Cursors.Arrow; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
public void User_Can_Enter_New_Password() { User_Can_Reset_Password(); // must requery here to get UserEntity with associate restriction. var user = new LinqMetaData().User.FirstOrDefault(x => x.Username == TestData.OrgAdminUsername); Assert.IsNotNull(user); Thread.Sleep(5000); // wait for exchange to deliver the e-mail // check the inbox for the e-mail var imap = SupportController.EnsureConnection(user); var msgCount = imap.SelectMailbox("INBOX").NumMsg; Assert.IsTrue(msgCount > 0); var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true, new[] { "date", "subject", "from", "content-type", "to", "cc", "message-id" })); var message = msgs.Where(x => x.Subject.Contains(ControllerRes.Account.Email_SubjectPasswordReset)). OrderByDescending(x => x.Date).FirstOrDefault(); Assert.IsNotNull(message); message = imap.GetMessage(message.Uid, false, false); // make sure the link matches the current test user in the database var match = Regex.Match(message.Body, "ResetKey=(([a-zA-Z0-9]{2})+)", RegexOptions.IgnoreCase); Assert.IsTrue(match.Success); var restriction = user.UserAccountRestrictions.Select(x => x.AccountRestriction).SingleOrDefault( x => x.RestrictionKey == match.Groups[1].Value); Assert.IsNotNull(restriction); // make sure key is unique restriction = new LinqMetaData().AccountRestriction.SingleOrDefault(x => x.RestrictionKey == match.Groups[1].Value); Assert.IsNotNull(restriction); // submit a new password var controller = Mock(); controller.Invoke(x => x.ResetCompletion(new ResetCompletionModel { UserName = user.Username, OriginalEmail = user.EmailAddress, Password = "******", ConfirmPassword = "******", ResetKey = match.Groups[1].Value, Step = 2 })); Assert.AreEqual("/Account/ResetCompletionSuccess", controller.Response.RedirectLocation); }
public void User_Creation_Sends_Email() { // create a user to use during the test Create_Edit_User(TestData.ServiceAdminUsername, true); var user = TestData.ServiceAdminUser; var testUser = new LinqMetaData().User.FirstOrDefault(x => x.FirstName == TestValues["FirstName"]); Assert.IsNotNull(testUser); Thread.Sleep(5000); // wait for exchange to deliver the e-mail // check the inbox for the e-mail var imap = SupportController.EnsureConnection(user); var msgCount = imap.SelectMailbox("INBOX").NumMsg; Assert.IsTrue(msgCount > 0); var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true, new[] { "date", "subject", "from", "content-type", "to", "cc", "message-id" })); var message = msgs.Where(x => x.Subject.Contains(ControllerRes.Account.Email_SubjectUserRegistration)). OrderByDescending(x => x.Date).FirstOrDefault(); Assert.IsNotNull(message); message = imap.GetMessage(message.Uid, false, false); // make sure the link matches the current test user in the database var match = Regex.Match(message.Body, "RegistrationKey=(([a-zA-Z0-9]{2})+)"); Assert.IsTrue(match.Success); var restriction = testUser.UserAccountRestrictions.Select(x => x.AccountRestriction).SingleOrDefault( x => x.RestrictionKey == match.Groups[1].Value); Assert.IsNotNull(restriction); // make sure key is unique restriction = new LinqMetaData().AccountRestriction.Single(x => x.RestrictionKey == match.Groups[1].Value); Assert.IsNotNull(restriction); var ars = testUser.UserAccountRestrictions.Select(y => y.AccountRestriction).ToList(); testUser.UserAccountRestrictions.DeleteMulti(); ars.ForEach(y => y.Delete()); // finally delete the test user testUser.Delete(); }
public void User_Can_Delete_Message() { // pick two users to send to var users = new LinqMetaData().Organization.First(x => x.Users.Count(y => y.Settings.Any(z => z.Name == "SupportUser")) > 1).Users; Assert.IsTrue(users.Count() > 1); var fromUser = users.First(x => x.Settings.Any(y => y.Name == "SupportUser")); var toUser = users.Last(x => x.Settings.Any(y => y.Name == "SupportUser")); var controller = Mock(); var request = controller.Mock(x => x.HttpContext.Request); request.SetupGet(x => x["Send"]).Returns("true"); controller.HttpContext.User = new RolePrincipal(new GenericIdentity(fromUser.Username)); controller.Invoke(x => x.Compose(new ComposeMail { Body = "This is a test.", Subject = "Test Subject", To = toUser.Settings.First(y => y.Name == "SupportUser").Value + '@' + SupportController.DOMAIN })); Thread.Sleep(5000); // give exchange time to deliver it // check the inbox of the receiver using (var imap = SupportController.EnsureConnection(toUser)) { var msgCount = imap.SelectMailbox("INBOX").NumMsg; Assert.IsTrue(msgCount > 0); var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true, new[] { "date", "subject", "from", "content-type", "to", "cc", "message-id" })); var message = msgs.Where(x => x.Subject.Contains("Test Subject")). OrderByDescending(x => x.Date).FirstOrDefault(); Assert.IsNotNull(message); message = imap.GetMessage(message.Uid, false, false); Assert.IsTrue(message.Body.Contains("This is a test.")); controller = Mock(); controller.Invoke(x => x.Delete("INBOX", message.Uid)); } }
public void Search_Conditions() { var deleted = SearchCondition.Deleted(); var seen = SearchCondition.Seen(); var text = SearchCondition.Text("andy"); deleted.ToString().Should().Equal("DELETED"); deleted.Or(seen).ToString().Should().Equal("OR (DELETED) (SEEN)"); seen.And(text).ToString().Should().Equal("(SEEN) (TEXT \"andy\")"); var since = new DateTime(2000, 1, 1); SearchCondition.Undeleted().And( SearchCondition.From("david"), SearchCondition.SentSince(since) ).Or(SearchCondition.To("andy")) .ToString() .Should().Equal("OR ((UNDELETED) (FROM \"david\") (SENTSINCE \"" + Utilities.GetRFC2060Date(since) + "\")) (TO \"andy\")"); }
public void Search_Conditions_Operators() { var deleted = SearchCondition.Deleted(); var seen = SearchCondition.Seen(); var text = SearchCondition.Text("andy"); deleted.ToString().ShouldBe("DELETED"); (deleted | seen).ToString().ShouldBe("OR (DELETED) (SEEN)"); (seen & text).ToString().ShouldBe("(SEEN) (TEXT \"andy\")"); var since = new DateTime(2000, 1, 1); ((SearchCondition.Undeleted() & SearchCondition.From("david") & SearchCondition.SentSince(since) ) | SearchCondition.To("andy")) .ToString() .ShouldBe("OR ((UNDELETED) (FROM \"david\") (SENTSINCE \"" + Utilities.GetRFC2060Date(since) + "\")) (TO \"andy\")"); }
public ActionResult Messages(string folderPath = "INBOX", [ModelBinder(typeof(DataTablesRequestModelBinder))] DataTablesRequestModel dtRequestModel = null) { using (var imap = EnsureConnection()) { var messages = new List <MailMessage>(); var msgCount = imap.SelectMailbox(folderPath).NumMsg; if (msgCount > 0) { var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true, new[] { "date", "subject", "from", "content-type", "to", "cc", "message-id" })); if (folderPath == "INBOX") { UpdateInboxCount( msgs.Count(x => (x.Flags & Flags.Recent) == Flags.Recent || (x.Flags & Flags.Seen) == 0), Membership.GetUser().GetUserEntity()); } messages.AddRange(msgs); } var result = View("Index", new SupportModel { Mailboxes = new List <Mailbox>().AsQueryable(), Messages = messages.AsQueryable(), CurrentFolder = folderPath, AccountSetup = true }); if (dtRequestModel != null) { return(Query(result, dtRequestModel, ControllerContext)); } return(result); } }
public static void UpdateInboxCount(ImapClient imap, UserEntity user) { var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true)).ToList(); var count = msgs.Count( x => (x.Flags & Flags.Recent) == Flags.Recent || (x.Flags & Flags.Seen) == 0); var transaction = UpdateInboxCount(count, user); if (transaction != null) { try { // service admins get an extra daily count used on the operations page if (user.Roles.Any(x => x.Role.Name == "Service Administrator")) { // get the number of messages received today var daily = msgs.Count(x => x.Date >= DateTime.UtcNow.Date); var todaySetting = new UserSettingEntity(user.UserId, "SupportInboxToday") { UserId = user.UserId, Name = "SupportInboxToday", Value = daily.ToString(CultureInfo.InvariantCulture) }; transaction.Add(todaySetting); todaySetting.Save(); } transaction.Commit(); } catch { transaction.Rollback(); } finally { transaction.Dispose(); } } }
private void MailPoller(object state) { var client = state as ImapParams; while (client != null && !_closing) { // wait for the synchronizer to unpause _tryingToPoll = true; _syncBreak.WaitOne(); // search for new messages in inbox string[] search; if (!Connect(client) || !Login(client) || !Select("INBOX") || !(search = Search(SearchCondition.Deleted().Not().And(SearchCondition.Unseen()))).Any()) { Thread.Sleep(TimeSpan.FromSeconds(_seconds)); continue; } // trigger event when new messages arrive if (search != null) { var msgs = search.Select(x => Fetch(int.Parse(x), false, true)) .Where(x => x != null).ToList(); OnResulted(msgs, client.Queue); } if (_seconds == 0) { break; } // drop in to synchronization _tryingToPoll = false; ThreadPool.QueueUserWorkItem(SynchronizeMail, state); Thread.Sleep(TimeSpan.FromSeconds(_seconds)); } }
public void Service_Administrator_Can_Assign_Any_Role() { // create a test user Create_Edit_User(TestData.ServiceAdminUsername, true); var user = TestData.ServiceAdminUser; var testUser = new LinqMetaData().User.FirstOrDefault(x => x.FirstName == TestValues["FirstName"]); var profile = new UserSettingEntity(user.UserId, "SupportUser") { UserId = user.UserId, Name = "SupportUser" }; Assert.IsFalse(profile.IsNew); Assert.IsNotNull(testUser); Thread.Sleep(5000); // wait for exchange to deliver the e-mail // check the inbox for the e-mail var imap = SupportController.EnsureConnection(user); var msgCount = imap.SelectMailbox("INBOX").NumMsg; Assert.IsTrue(msgCount > 0); var msgs = imap.Search(SearchCondition.Deleted().Not()).Select( x => imap.GetMessage(x, true, true, new[] { "date", "subject", "from", "content-type", "to", "cc", "message-id" })); var message = msgs.Where(x => x.Subject.Contains(ControllerRes.Account.Email_SubjectUserRegistration)). OrderByDescending(x => x.Date).FirstOrDefault(); Assert.IsNotNull(message); message = imap.GetMessage(message.Uid, false, false); // make sure the link matches the current test user in the database var match = Regex.Match(message.Body, "RegistrationKey=([a-zA-Z0-9]*)"); Assert.IsTrue(match.Success); // register the test user var controller = Mock <AccountController>(); var request = controller.Mock(x => x.ControllerContext.HttpContext.Request); request.Setup(x => x.HttpMethod).Returns("POST"); // mock global forms authentication var mockformsAuthenticationService = new Mock <Global.FormsAuthenticationService>(); mockformsAuthenticationService.Setup( service => service.SetAuthCookie(It.IsAny <string>(), It.IsAny <bool>())).Callback <string, bool>( (s, b) => new RolePrincipal(new GenericIdentity(s))); mockformsAuthenticationService.Setup(x => x.SignOut()).Callback(() => { }); Global.FormsAuthentication = mockformsAuthenticationService.Object; // submit test values request.SetupGet(x => x.Form).Returns(() => new NameValueCollection { { "UserName", TestValues["FirstName"] }, { "Email", profile.Value + '@' + SupportController.DOMAIN }, { "Password", "Th1s|sAV4lidPa$$w0rd" }, { "ConfirmPassword", "Th1s|sAV4lidPa$$w0rd" }, { "Pin", "1234" }, { "OriginalEmail", profile.Value + '@' + SupportController.DOMAIN }, { "RegistrationKey", match.Groups[1].Value } }); controller.Invoke("Register"); testUser = new LinqMetaData().User.FirstOrDefault(x => x.Username == TestValues["FirstName"]); Assert.IsNotNull(testUser); // change the role var userController = Mock(); userController.HttpContext.User = new RolePrincipal(new GenericIdentity(TestData.ServiceAdminUsername)); request = userController.Mock(x => x.ControllerContext.HttpContext.Request); request.Setup(x => x.HttpMethod).Returns("POST"); // set the userId userController.RouteData.Values.Add("userId", testUser.UserId); TestValues["Role"] = OrganizationUtils.GetAllowedRoles(testUser.OrganizationId) .First(x => !testUser.Roles.Any(y => y.RoleId == x.RoleId)).RoleId.ToString(CultureInfo.InvariantCulture); request.SetupGet(x => x.Form).Returns(() => TestValues); userController.Invoke("Edit"); testUser = new LinqMetaData().User.FirstOrDefault(x => x.FirstName == TestValues["FirstName"]); Assert.IsNotNull(testUser); Assert.AreEqual(TestValues["Role"], testUser.Roles.Single().RoleId.ToString(CultureInfo.InvariantCulture)); }
public List <MailModel> GetDeletedMessages() { return(GetMessages(SearchCondition.Deleted()) .OrderByDescending(m => m.Date) .ToList()); }