Beispiel #1
0
        public MockServer(ServerSetup setup)
            : base(setup)
        {
            _serverData = MockServerData.GetInstance();

            _serverData.Domains.Clear();
            _serverData.Mailboxes.Clear();
            _serverData.Groups.Clear();

            _domainDal = new WebDomainDal(setup.Tenant);
            _mailboxDal = new MailboxDal(setup.Tenant, SetupInfo.Limits.MailboxMaxCountPerUser);
            _mailgroupDal = new MailGroupDal(setup.Tenant);
            _mailaddressDal = new MailAddressDal(setup.Tenant);

            var domains = _domainDal.GetTenantDomains();

            foreach (var domain in domains)
            {
                _serverData.Domains.Add(new WebDomainBase(domain.name));
            }

            var mailboxesDto = _mailboxDal.GetMailboxes();
            foreach (var mailboxDto in mailboxesDto)
            {
                var aliasList =
                    _mailaddressDal.GetMailboxAliases(mailboxDto.mailbox.id)
                                   .Select(
                                       aliasDto =>
                                       new MailAddressBase(aliasDto.name, new WebDomainBase(aliasDto.domain.name)))
                                   .ToList();

                var resultMailbox = new MailboxBase(
                    new MailAccountBase(mailboxDto.mailbox.address),
                    //Its not login. It adress. Needed only for testing
                    new MailAddressBase(mailboxDto.mailbox_address.name,
                                        new WebDomainBase(mailboxDto.mailbox_address.domain.name)), aliasList);

                _serverData.Mailboxes.Add(resultMailbox);
            }

            var groupsDto = _mailgroupDal.GetMailGroups();
            foreach (var resultGroup in from groupDto in groupsDto
                                        let groupAddresses = groupDto.addresses.Select(address =>
                                                                                       new MailAddressBase(address.name,
                                                                                                           new WebDomainBase
                                                                                                               (
                                                                                                               address
                                                                                                                   .domain
                                                                                                                   .name)))
                                                                     .ToList()
                                        select new MailGroupBase(
                                            new MailAddressBase(groupDto.address.name,
                                                                new WebDomainBase(groupDto.address.domain.name)),
                                            groupAddresses))
            {
                _serverData.Groups.Add(resultGroup);
            }
        }
Beispiel #2
0
 protected abstract void _DeleteMailbox(MailboxBase mailbox);
Beispiel #3
0
 protected abstract void _UpdateMailbox(MailboxBase mailbox);
Beispiel #4
0
        public override IMailbox CreateMailbox(string localpart, string password, IWebDomain domain, IMailAccount account, IMailServerFactory factory)
        {
            if (string.IsNullOrEmpty(localpart))
                throw new ArgumentNullException("localpart");

            if(domain == null)
                throw new ArgumentNullException("domain");

            if (account == null)
                throw new ArgumentNullException("account");

            if (localpart.Length + domain.Name.Length > 318) // 318 because of @ sign
                throw new ArgumentException("Address of mailbox exceed limitation of 319 characters.", "localpart");

            var mailboxBase = new MailboxBase(new MailAccountBase(account.Login),
                                   new MailAddressBase(localpart, new WebDomainBase(domain)),
                                   new List<MailAddressBase>())
                {
                    DateCreated = DateTime.UtcNow
                };

            MailboxWithAddressDto mailboxWithAddressDto;

            using (var dbContextWithTran = TeamlabMailboxDal.CreateMailDbContext(true))
            {
                mailboxWithAddressDto = TeamlabMailboxDal.CreateMailbox(account.TeamlabAccount,
                                                                           mailboxBase.Address.ToString(), password,
                                                                           mailboxBase.Address.LocalPart,
                                                                           mailboxBase.Address.DateCreated,
                                                                           domain.Id, domain.Name, domain.IsVerified, dbContextWithTran.DbManager);
                _CreateMailbox(account.Login, password, localpart, domain.Name);

                dbContextWithTran.CommitTransaction();
            }

            var mailboxAddress = factory.CreateMailAddress(mailboxWithAddressDto.mailbox_address.id, mailboxWithAddressDto.mailbox_address.tenant, mailboxWithAddressDto.mailbox_address.name, domain) ;

            var mailbox = factory.CreateMailbox(mailboxWithAddressDto.mailbox.id, mailboxWithAddressDto.mailbox.tenant,
                mailboxAddress, account, new List<IMailAddress>(), this);

            return mailbox;

        }
        protected override void _DeleteMailbox(MailboxBase mailbox)
        {
            //Todo: think about free space in maildir
            var deleteMailboxQuery = new SqlDelete(MailboxTable.name).Where(MailboxTable.Columns.username, mailbox.Address.ToString());
            var deleteMailboxAliases = new SqlDelete(AliasTable.name).Where(AliasTable.Columns.redirect, mailbox.Address.ToString());
            using (var db = _dbManager.GetAdminDb())
            {
                using (var t = db.BeginTransaction())
                {
                    ClearMailboxStorageSpace(mailbox.Address.LocalPart, mailbox.Address.Domain.Name);
                    
                    db.ExecuteNonQuery(deleteMailboxQuery);
                    db.ExecuteNonQuery(deleteMailboxAliases);

                    t.Commit();
                }
            }
        }
 protected override void _UpdateMailbox(MailboxBase mailbox)
 {
     throw new NotSupportedException();
 }
        protected override List<MailboxBase> _GetMailboxes(ICollection<string> mailboxNames)
        {
            var namesArg = mailboxNames.Cast<object>().ToArray();

            const string mailbox_ns = "msm";
            const string domain_ns = "msd";
            const string address_ns = "msa";

            var mailboxQuery = new SqlQuery(MailboxTable.name.Alias(mailbox_ns))
                .InnerJoin(AliasTable.name.Alias(address_ns),
                           Exp.EqColumns(MailboxTable.Columns.domain.Prefix(mailbox_ns),
                                         AliasTable.Columns.domain.Prefix(address_ns)))
                .InnerJoin(DomainTable.name.Alias(domain_ns),
                           Exp.EqColumns(MailboxTable.Columns.domain.Prefix(mailbox_ns),
                                         DomainTable.Columns.domain.Prefix(domain_ns)))
                .Select(MailboxTable.Columns.username.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.password.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.name.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.maildir.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.quota.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.local_part.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.domain.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.created.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.modified.Prefix(mailbox_ns))
                .Select(MailboxTable.Columns.active.Prefix(mailbox_ns))
                .Select(AliasTable.Columns.address.Prefix(address_ns))
                .Select(AliasTable.Columns.redirect.Prefix(address_ns))
                .Select(AliasTable.Columns.domain.Prefix(address_ns))
                .Select(AliasTable.Columns.created.Prefix(address_ns))
                .Select(AliasTable.Columns.modified.Prefix(address_ns))
                .Select(AliasTable.Columns.active.Prefix(address_ns))
                .Select(DomainTable.Columns.domain.Prefix(domain_ns))
                .Select(DomainTable.Columns.description.Prefix(domain_ns))
                .Select(DomainTable.Columns.aliases.Prefix(domain_ns))
                .Select(DomainTable.Columns.mailboxes.Prefix(domain_ns))
                .Select(DomainTable.Columns.maxquota.Prefix(domain_ns))
                .Select(DomainTable.Columns.quota.Prefix(domain_ns))
                .Select(DomainTable.Columns.transport.Prefix(domain_ns))
                .Select(DomainTable.Columns.backupmx.Prefix(domain_ns))
                .Select(DomainTable.Columns.created.Prefix(domain_ns))
                .Select(DomainTable.Columns.modified.Prefix(domain_ns))
                .Select(DomainTable.Columns.active.Prefix(domain_ns))
                .Where(MailboxTable.Columns.active.Prefix(mailbox_ns), 1)
                .Where(AliasTable.Columns.active.Prefix(address_ns), true)
                .Where(AliasTable.Columns.is_group.Prefix(address_ns), false)
                .Where(Exp.In(MailboxTable.Columns.username.Prefix(mailbox_ns), namesArg))
                .Where(Exp.EqColumns(AliasTable.Columns.redirect.Prefix(address_ns),
                                     MailboxTable.Columns.username.Prefix(mailbox_ns)));

            var mailboxList = new List<MailboxBase>();

            List<object[]> dbResult;

            using (var db = _dbManager.GetAdminDb())
            {
                dbResult = db.ExecuteList(mailboxQuery).ToList();
            }

            if (!dbResult.Any())
                return mailboxList;

            var groupedResult = dbResult.GroupBy(r => r[0]).ToDictionary(g => g.Key, g => g.ToList());

            const int domain_start_index = ToDtoConverters.MAILBOX_COLUMNS_COUNT + ToDtoConverters.MAIL_ADDRESS_COLUMNS_COUNT;

            foreach (var group in groupedResult)
            {
                var mailboxDto = group.Value[0].SubArray(0, ToDtoConverters.MAILBOX_COLUMNS_COUNT).ToMailboxDto();

                var aliasList = new List<MailAddressBase>();

                foreach (var groupVal in group.Value)
                {
                    var addressDto = groupVal.SubArray(ToDtoConverters.MAILBOX_COLUMNS_COUNT, ToDtoConverters.MAIL_ADDRESS_COLUMNS_COUNT).ToAddressDto();
                    var domainDto = groupVal.SubArray(domain_start_index, groupVal.Length - domain_start_index).ToWebDomainDto();
                    addressDto.Domain = domainDto;

                    var addr = addressDto.ToPostfixAddress();

                    if (addr.ToString() != mailboxDto.username)
                        aliasList.Add(addr);
                }

                var mailbox = new MailboxBase(
                    new MailAccountBase(mailboxDto.username),
                    new MailAddressBase(mailboxDto.local_part,
                        new WebDomainBase(mailboxDto.domain)), aliasList);

                mailboxList.Add(mailbox);
            }

            return mailboxList;
        }
Beispiel #8
0
 protected override void _DeleteMailbox(MailboxBase mailbox)
 {
     _serverData.Mailboxes.Remove(mailbox);
 }
Beispiel #9
0
        protected override MailboxBase _CreateMailbox(string login, string password, string localpart, string domain)
        {
            var resultMailbox = new MailboxBase(new MailAccountBase(login),
                                   new MailAddressBase(localpart, new WebDomainBase(domain)),
                                   new List<MailAddressBase>());

            if (_serverData.Mailboxes.Any(r => r.Address.ToString().Equals(resultMailbox.Address.ToString())))
            {
                throw new DuplicateNameException("You want to create mailbox with already existing address");
            }

            _serverData.Mailboxes.Add(resultMailbox);
            return resultMailbox;
        }