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); } }
protected abstract void _DeleteMailbox(MailboxBase mailbox);
protected abstract void _UpdateMailbox(MailboxBase mailbox);
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; }
protected override void _DeleteMailbox(MailboxBase mailbox) { _serverData.Mailboxes.Remove(mailbox); }
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; }