protected MailboxProvider ToMailboxProvider(object[] r)
        {
            var p = new MailboxProvider
            {
                Id               = Convert.ToInt32(r[0]),
                Name             = Convert.ToString(r[1]),
                DisplayName      = Convert.ToString(r[2]),
                DisplayShortName = Convert.ToString(r[3]),
                Url              = Convert.ToString(r[4])
            };

            return(p);
        }
        public int SaveProvider(MailboxProvider mailboxProvider)
        {
            var query = new SqlInsert(MailboxProviderTable.TABLE_NAME, true)
                        .InColumnValue(MailboxProviderTable.Columns.Id, mailboxProvider.Id)
                        .InColumnValue(MailboxProviderTable.Columns.ProviderName, mailboxProvider.Name)
                        .InColumnValue(MailboxProviderTable.Columns.DisplayName, mailboxProvider.DisplayName)
                        .InColumnValue(MailboxProviderTable.Columns.DisplayShortName,
                                       mailboxProvider.DisplayShortName)
                        .InColumnValue(MailboxProviderTable.Columns.Documentation,
                                       mailboxProvider.Url)
                        .Identity(0, 0, true);

            var idProvider = Db.ExecuteScalar <int>(query);

            return(idProvider);
        }
Пример #3
0
        public bool SaveMailBox(MailBoxData mailbox, AuthorizationServiceType authType = AuthorizationServiceType.None)
        {
            if (mailbox == null)
            {
                throw new ArgumentNullException("mailbox");
            }

            if (mailbox.IsTeamlab)
            {
                throw new ArgumentException("Mailbox with specified email can't be updated");
            }

            using (var daoFactory = new DaoFactory())
            {
                using (var tx = daoFactory.DbManager.BeginTransaction())
                {
                    var daoMailbox         = daoFactory.CreateMailboxDao();
                    var daoMailboxServer   = daoFactory.CreateMailboxServerDao();
                    var daoMailboxDomain   = daoFactory.CreateMailboxDomainDao();
                    var daoMailboxProvider = daoFactory.CreateMailboxProviderDao();

                    var existingMailbox = daoMailbox.GetMailBox(
                        new СoncreteUserMailboxExp(
                            mailbox.EMail,
                            mailbox.TenantId, mailbox.UserId));

                    int newInServerId, newOutServerId;

                    var mailboxId   = 0;
                    var dateCreated = DateTime.UtcNow;
                    var enabled     = true;
                    var host        = authType == AuthorizationServiceType.Google ? Defines.GOOGLE_HOST : mailbox.EMail.Host;

                    // Get new imap/pop3 server from MailBoxData
                    var newInServer = new MailboxServer
                    {
                        Hostname       = mailbox.Server,
                        Port           = mailbox.Port,
                        Type           = mailbox.Imap ? Defines.IMAP : Defines.POP3,
                        Username       = mailbox.EMail.ToLoginFormat(mailbox.Account) ?? mailbox.Account,
                        SocketType     = mailbox.Encryption.ToNameString(),
                        Authentication = mailbox.Authentication.ToNameString()
                    };

                    // Get new smtp server from MailBoxData
                    var newOutServer = new MailboxServer
                    {
                        Hostname = mailbox.SmtpServer,
                        Port     = mailbox.SmtpPort,
                        Type     = Defines.SMTP,
                        Username =
                            mailbox.SmtpAuthentication != SaslMechanism.None
                                ? mailbox.EMail.ToLoginFormat(mailbox.SmtpAccount) ?? mailbox.SmtpAccount
                                : "",
                        SocketType     = mailbox.SmtpEncryption.ToNameString(),
                        Authentication = mailbox.SmtpAuthentication.ToNameString()
                    };

                    if (existingMailbox != null)
                    {
                        mailboxId   = existingMailbox.Id;
                        enabled     = existingMailbox.Enabled;
                        dateCreated = existingMailbox.DateCreated;

                        // Get existing settings by existing ids
                        var dbInServer  = daoMailboxServer.GetServer(existingMailbox.ServerId);
                        var dbOutServer = daoMailboxServer.GetServer(existingMailbox.SmtpServerId);

                        // Compare existing settings with new
                        if (!dbInServer.Equals(newInServer) || !dbOutServer.Equals(newOutServer))
                        {
                            var domain = daoMailboxDomain.GetDomain(host);

                            List <MailboxServer> trustedServers = null;
                            if (domain != null)
                            {
                                trustedServers = daoMailboxServer.GetServers(domain.ProviderId);
                            }

                            newInServerId  = GetMailboxServerId(daoMailboxServer, dbInServer, newInServer, trustedServers);
                            newOutServerId = GetMailboxServerId(daoMailboxServer, dbOutServer, newOutServer,
                                                                trustedServers);
                        }
                        else
                        {
                            newInServerId  = existingMailbox.ServerId;
                            newOutServerId = existingMailbox.SmtpServerId;
                        }
                    }
                    else
                    {
                        //Find settings by host

                        var domain = daoMailboxDomain.GetDomain(host);

                        if (domain != null)
                        {
                            //Get existing servers with isUserData = 0
                            var trustedServers = daoMailboxServer.GetServers(domain.ProviderId);

                            //Compare existing settings with new

                            var foundInServer  = trustedServers.FirstOrDefault(ts => ts.Equals(newInServer));
                            var foundOutServer = trustedServers.FirstOrDefault(ts => ts.Equals(newOutServer));

                            //Use existing or save new servers
                            newInServerId = foundInServer != null
                                ? foundInServer.Id
                                : SaveMailboxServer(daoMailboxServer, newInServer, domain.ProviderId);

                            newOutServerId = foundOutServer != null
                                ? foundOutServer.Id
                                : SaveMailboxServer(daoMailboxServer, newOutServer, domain.ProviderId);
                        }
                        else
                        {
                            //Save new servers
                            var newProvider = new MailboxProvider
                            {
                                Id               = 0,
                                Name             = host,
                                DisplayShortName = "",
                                DisplayName      = "",
                                Url              = ""
                            };

                            newProvider.Id = daoMailboxProvider.SaveProvider(newProvider);

                            var newDomain = new MailboxDomain
                            {
                                Id         = 0,
                                Name       = host,
                                ProviderId = newProvider.Id
                            };

                            daoMailboxDomain.SaveDomain(newDomain);

                            newInServerId  = SaveMailboxServer(daoMailboxServer, newInServer, newProvider.Id);
                            newOutServerId = SaveMailboxServer(daoMailboxServer, newOutServer, newProvider.Id);
                        }
                    }

                    var loginDelayTime = GetLoginDelayTime(mailbox);

                    //Save Mailbox to DB
                    var mb = new Mailbox
                    {
                        Id           = mailboxId,
                        Tenant       = mailbox.TenantId,
                        User         = mailbox.UserId,
                        Address      = mailbox.EMail.Address.ToLowerInvariant(),
                        Name         = mailbox.Name,
                        Password     = mailbox.Password,
                        MsgCountLast = mailbox.MessagesCount,
                        SmtpPassword = mailbox.SmtpPassword,
                        SizeLast     = mailbox.Size,
                        LoginDelay   = loginDelayTime,
                        Enabled      = enabled,
                        Imap         = mailbox.Imap,
                        BeginDate    = mailbox.BeginDate,
                        OAuthType    = mailbox.OAuthType,
                        OAuthToken   = mailbox.OAuthToken,
                        ServerId     = newInServerId,
                        SmtpServerId = newOutServerId,
                        DateCreated  = dateCreated
                    };

                    var mailBoxId = daoMailbox.SaveMailBox(mb);

                    mailbox.MailBoxId = mailBoxId;

                    if (mailBoxId < 1)
                    {
                        tx.Rollback();
                        return(false);
                    }

                    tx.Commit();
                }
            }

            return(true);
        }
Пример #4
0
        public void UpdateDataFromInternalDatabase(string hostname, MailServerInfo mailServer)
        {
            DemandPermission();

            using var transaction = MailDbContext.Database.BeginTransaction();

            var mailboxProvider = new MailboxProvider
            {
                Id   = 0,
                Name = hostname
            };

            var pReq = MailDbContext.MailboxProvider.Add(mailboxProvider);

            MailDbContext.SaveChanges();
            mailboxProvider = pReq.Entity;

            var providerId = mailboxProvider.Id;

            var mailboxServer = new MailboxServer
            {
                Id             = 0,
                IdProvider     = providerId,
                Type           = "smtp",
                Hostname       = hostname,
                Port           = 587,
                SocketType     = "STARTTLS",
                UserName       = "******",
                Authentication = "",
                IsUserData     = false
            };

            var req = MailDbContext.MailboxServer.Add(mailboxServer);

            MailDbContext.SaveChanges();

            mailboxServer = req.Entity;

            var smtpServerId = mailboxServer.Id;

            mailboxServer = new MailboxServer
            {
                Id             = 0,
                IdProvider     = providerId,
                Type           = "imap",
                Hostname       = hostname,
                Port           = 143,
                SocketType     = "STARTTLS",
                UserName       = "******",
                Authentication = "",
                IsUserData     = false
            };

            req = MailDbContext.MailboxServer.Add(mailboxServer);
            MailDbContext.SaveChanges();

            mailboxServer = req.Entity;

            var imapServerId = mailboxServer.Id;

            var mailServerData = MailDbContext.ServerServer.FirstOrDefault();

            var connectionString = Newtonsoft.Json.JsonConvert.SerializeObject(mailServer);

            var server = new ServerServer
            {
                Id               = 0,
                MxRecord         = hostname,
                ConnectionString = connectionString,
                ServerType       = 2,
                SmtpSettingsId   = smtpServerId,
                ImapSettingsId   = imapServerId
            };

            MailDbContext.ServerServer.Add(server);
            MailDbContext.SaveChanges();

            if (mailServerData != null)
            {
                server = MailDbContext.ServerServer.Where(r => r.Id == mailServerData.Id).FirstOrDefault();
                MailDbContext.ServerServer.Remove(server);
                MailDbContext.SaveChanges();

                providerId = MailDbContext.MailboxServer
                             .Where(r => r.Id == mailServerData.SmtpSettingsId)
                             .Select(r => r.IdProvider)
                             .FirstOrDefault();

                var providers = MailDbContext.MailboxProvider.Where(r => r.Id == providerId).ToList();
                MailDbContext.MailboxProvider.RemoveRange(providers);
                MailDbContext.SaveChanges();

                var servers = MailDbContext.MailboxServer
                              .Where(r => new[] { mailServerData.SmtpSettingsId, mailServerData.ImapSettingsId }.Any(a => a == r.Id))
                              .ToList();

                MailDbContext.MailboxServer.RemoveRange(servers);
                MailDbContext.SaveChanges();

                var mailboxId = MailDbContext.Mailbox
                                .Where(r => r.IdSmtpServer == mailServerData.SmtpSettingsId)
                                .Where(r => r.IdInServer == mailServerData.ImapSettingsId)
                                .ToArray();

                foreach (var m in mailboxId)
                {
                    m.IdSmtpServer = smtpServerId;
                    m.IdInServer   = imapServerId;
                }
                MailDbContext.SaveChanges();
            }

            transaction.Commit();

            MailServiceHelperStorage.Remove();
        }
Пример #5
0
        public bool SetMailBoxSettings(ClientConfig config, bool isUserData)
        {
            try
            {
                if (string.IsNullOrEmpty(config.EmailProvider.Id) ||
                    !config.EmailProvider.Domain.Any() ||
                    config.EmailProvider.IncomingServer == null ||
                    !config.EmailProvider.IncomingServer.Any() ||
                    config.EmailProvider.OutgoingServer == null ||
                    !config.EmailProvider.OutgoingServer.Any())
                {
                    throw new Exception("Incorrect config");
                }

                using (var daoFactory = new DaoFactory())
                {
                    using (var tx = daoFactory.DbManager.BeginTransaction())
                    {
                        var daoMbProvider = daoFactory.CreateMailboxProviderDao();

                        var provider = daoMbProvider.GetProvider(config.EmailProvider.Id);

                        if (provider == null)
                        {
                            provider = new MailboxProvider
                            {
                                Id               = 0,
                                Name             = config.EmailProvider.Id,
                                DisplayName      = config.EmailProvider.DisplayName,
                                DisplayShortName = config.EmailProvider.DisplayShortName,
                                Url              = config.EmailProvider.Documentation.Url
                            };

                            provider.Id = daoMbProvider.SaveProvider(provider);

                            if (provider.Id < 0)
                            {
                                tx.Rollback();
                                throw new Exception("id_provider not saved into DB");
                            }
                        }

                        var daoMbDomain = daoFactory.CreateMailboxDomainDao();

                        foreach (var domainName in config.EmailProvider.Domain)
                        {
                            var domain = daoMbDomain.GetDomain(domainName);

                            if (domain != null)
                            {
                                continue;
                            }

                            domain = new MailboxDomain
                            {
                                Id         = 0,
                                ProviderId = provider.Id,
                                Name       = domainName
                            };

                            domain.Id = daoMbDomain.SaveDomain(domain);

                            if (domain.Id < 0)
                            {
                                tx.Rollback();
                                throw new Exception("id_domain not saved into DB");
                            }
                        }

                        var daoMbServer = daoFactory.CreateMailboxServerDao();

                        var existingServers = daoMbServer.GetServers(provider.Id);

                        var newServers = config.EmailProvider
                                         .IncomingServer
                                         .ConvertAll(s => new MailboxServer
                        {
                            Id             = 0,
                            Username       = s.Username,
                            Type           = s.Type,
                            ProviderId     = provider.Id,
                            Hostname       = s.Hostname,
                            Port           = s.Port,
                            SocketType     = s.SocketType,
                            Authentication = s.Authentication,
                            IsUserData     = isUserData
                        });

                        newServers.AddRange(config.EmailProvider
                                            .OutgoingServer
                                            .ConvertAll(s => new MailboxServer
                        {
                            Id             = 0,
                            Username       = s.Username,
                            Type           = s.Type,
                            ProviderId     = provider.Id,
                            Hostname       = s.Hostname,
                            Port           = s.Port,
                            SocketType     = s.SocketType,
                            Authentication = s.Authentication,
                            IsUserData     = isUserData
                        }));

                        foreach (var s in newServers)
                        {
                            var existing =
                                existingServers.FirstOrDefault(
                                    es =>
                                    es.Type.Equals(s.Type) && es.Port == s.Port &&
                                    es.SocketType.Equals(s.SocketType));

                            if (existing != null)
                            {
                                if (existing.Equals(s))
                                {
                                    continue;
                                }

                                s.Id = existing.Id;
                            }

                            s.Id = daoMbServer.SaveServer(s);

                            if (s.Id < 0)
                            {
                                tx.Rollback();
                                throw new Exception("id_server not saved into DB");
                            }
                        }

                        tx.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error("SetMailBoxSettings failed", ex);

                return(false);
            }

            return(true);
        }