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);
            }
        }
Пример #2
0
        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));
            }
        }
Пример #6
0
        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\")");
        }
Пример #7
0
        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();
                }
            }
        }
Пример #10
0
        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));
            }
        }
Пример #11
0
        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));
        }
Пример #12
0
 public List <MailModel> GetDeletedMessages()
 {
     return(GetMessages(SearchCondition.Deleted())
            .OrderByDescending(m => m.Date)
            .ToList());
 }