public bool SetMailBoxSettings(clientConfig config)
        {
            try
            {
                if (string.IsNullOrEmpty(config.emailProvider.id) ||
                    config.emailProvider.incomingServer == null ||
                    !config.emailProvider.incomingServer.Any() ||
                    config.emailProvider.outgoingServer == null ||
                    !config.emailProvider.outgoingServer.Any())
                    throw new Exception("Incorrect config");

                using (var db = GetDb())
                {
                    using (var tx = db.BeginTransaction())
                    {
                        var id_provider = db.ExecuteScalar<int>(
                            new SqlQuery(MAIL_MAILBOX_PROVIDER)
                                .Select(MailBoxProviderFields.id)
                                .Where(MailBoxProviderFields.name, config.emailProvider.id));

                        if (id_provider < 1)
                        {
                            id_provider = db.ExecuteScalar<int>(
                                new SqlInsert(MAIL_MAILBOX_PROVIDER)
                                    .InColumnValue(MailBoxProviderFields.id, 0)
                                    .InColumnValue(MailBoxProviderFields.name, config.emailProvider.id)
                                    .InColumnValue(MailBoxProviderFields.display_name, config.emailProvider.displayName)
                                    .InColumnValue(MailBoxProviderFields.display_short_name,
                                                   config.emailProvider.displayShortName)
                                    .InColumnValue(MailBoxProviderFields.documentation,
                                                   config.emailProvider.documentation.url)
                                    .Identity(0, 0, true));

                            if (id_provider < 1)
                                throw new Exception("id_provider not saved in DB");
                        }

                        var insert_query = new SqlInsert(MAIL_MAILBOX_DOMAIN)
                            .IgnoreExists(true)
                            .InColumns(MailBoxDomainFields.id_provider, MailBoxDomainFields.name);

                        config.emailProvider.domain
                              .ForEach(domain =>
                                       insert_query
                                           .Values(id_provider, domain));

                        db.ExecuteNonQuery(insert_query);

                        insert_query = new SqlInsert(MAIL_MAILBOX_SERVER)
                            .IgnoreExists(true)
                            .InColumns(
                                MailBoxServerFields.id_provider,
                                MailBoxServerFields.type,
                                MailBoxServerFields.hostname,
                                MailBoxServerFields.port,
                                MailBoxServerFields.socket_type,
                                MailBoxServerFields.username,
                                MailBoxServerFields.authentication
                            );

                        config.emailProvider.incomingServer
                              .ForEach(server =>
                                       insert_query
                                           .Values(id_provider,
                                                   server.type,
                                                   server.hostname,
                                                   server.port,
                                                   server.socketType,
                                                   server.username,
                                                   server.authentication));

                        config.emailProvider.outgoingServer
                              .ForEach(server =>
                                       insert_query
                                           .Values(id_provider,
                                                   server.type,
                                                   server.hostname,
                                                   server.port,
                                                   server.socketType,
                                                   server.username,
                                                   server.authentication));

                        db.ExecuteNonQuery(insert_query);

                        tx.Commit();
                    }
                }
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }
        public clientConfig GetMailBoxSettings(string host)
        {
            using (var db = GetDb())
            {
                var id_provider = db.ExecuteScalar<int>(
                                new SqlQuery(MAIL_MAILBOX_DOMAIN)
                                    .Select(MailBoxDomainFields.id_provider)
                                    .Where(MailBoxDomainFields.name, host));

                if (id_provider < 1)
                    return null;

                var config = new clientConfig();

                config.emailProvider.domain.Add(host);

                var provider = db.ExecuteList(
                    new SqlQuery(MAIL_MAILBOX_PROVIDER)
                        .Select(MailBoxProviderFields.name, MailBoxProviderFields.display_name,
                        MailBoxProviderFields.display_short_name, MailBoxProviderFields.documentation)
                        .Where(MailBoxProviderFields.id, id_provider))
                        .FirstOrDefault();

                if (provider == null)
                    return null;

                config.emailProvider.id = Convert.ToString(provider[0]);
                config.emailProvider.displayName = Convert.ToString(provider[1]);
                config.emailProvider.displayShortName = Convert.ToString(provider[2]);
                config.emailProvider.documentation.url = Convert.ToString(provider[3]);

                var servers = db.ExecuteList(
                    new SqlQuery(MAIL_MAILBOX_SERVER)
                        .Select(MailBoxServerFields.hostname, MailBoxServerFields.port, MailBoxServerFields.type,
                        MailBoxServerFields.socket_type, MailBoxServerFields.username, MailBoxServerFields.authentication)
                        .Where(MailBoxServerFields.id_provider, id_provider)
                        .Where(MailBoxServerFields.is_user_data, false)); //This condition excludes new data from mail_mailbox_server. That needed for resolving security issues.

                if (servers.Count == 0)
                    return null;

                servers.ForEach(serv =>
                {
                    var hostname = Convert.ToString(serv[0]);
                    var port = Convert.ToInt32(serv[1]);
                    var type = Convert.ToString(serv[2]);
                    var socket_type = Convert.ToString(serv[3]);
                    var username = Convert.ToString(serv[4]);
                    var authentication = Convert.ToString(serv[5]);

                    if (type == "smtp")
                    {
                        config.emailProvider.outgoingServer.Add(new clientConfigEmailProviderOutgoingServer
                            {
                                type = type,
                                socketType = socket_type,
                                hostname = hostname,
                                port = port,
                                username = username,
                                authentication = authentication
                            });
                    }
                    else
                    {
                        config.emailProvider.incomingServer.Add(new clientConfigEmailProviderIncomingServer
                            {
                                type = type,
                                socketType = socket_type,
                                hostname = hostname,
                                port = port,
                                username = username,
                                authentication = authentication
                            });
                    }

                });

                return config;
            }
        }
        private static List<MailServerSettings> GetImapSettingsVariants(string email, string password, MailBox mbox, clientConfig config)
        {
            var temp_list = new List<MailServerSettings>();
            if (config != null && config.emailProvider.incomingServer != null)
            {
                var address = new MailAddress(email);
                foreach (var imap_server in config.emailProvider.incomingServer.Where(x => x.type == "imap"))
                {
                    if(imap_server.hostname == null) continue;
                    temp_list.Add(new MailServerSettings
                    {
                        Url = FormatServerFromDb(imap_server.hostname, address.Host.ToLowerInvariant()),
                        Port = imap_server.port,
                        AccountName = FormatLoginFromDb(imap_server.username, address),
                        AccountPass = password,
                        AuthenticationType = ConvertToSaslMechanism(imap_server.authentication),
                        EncryptionType = ConvertToEncryptionType(imap_server.socketType)
                    });
                }

                if (temp_list.Any())
                {
                    //if settings was founded in db then we will finish settings tuning.
                    return temp_list;
                }
            }
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.Server,
                Port = 143,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.StartTLS
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.Server,
                Port = 993,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.SSL
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.Server,
                Port = 143,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.CramMd5,
                EncryptionType = EncryptionType.None
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.Server,
                Port = 143,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.None
            });
            return temp_list;
        }
        private static List<MailServerSettings> GetSmtpSettingsVariants(string email, string password, MailBox mbox, clientConfig config)
        {

            var temp_list = new List<MailServerSettings>();
            if (config != null && config.emailProvider.outgoingServer != null)
            {
                var address = new MailAddress(email);
                foreach (var mail_server_settingse in config.emailProvider.outgoingServer)
                {

                    temp_list.Add(new MailServerSettings
                        {
                            Url = FormatServerFromDb(mail_server_settingse.hostname, address.Host.ToLowerInvariant()),
                            Port = mail_server_settingse.port,
                            AccountName = FormatLoginFromDb(mail_server_settingse.username, address),
                            AccountPass = password,
                            AuthenticationType = ConvertToSaslMechanism(mail_server_settingse.authentication),
                            EncryptionType = ConvertToEncryptionType(mail_server_settingse.socketType)
                        });
                }

                if (temp_list.Any())
                {
                    //if settings was founded in db then we will finish settings tuning.
                    return temp_list;
                }
            }
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 587,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.StartTLS
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 465,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.SSL
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 25,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.CramMd5,
                EncryptionType = EncryptionType.None
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 587,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.CramMd5,
                EncryptionType = EncryptionType.None
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 25,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.None
            });
            temp_list.Add(new MailServerSettings
            {
                Url = mbox.SmtpServer,
                Port = 587,
                AccountName = email,
                AccountPass = password,
                AuthenticationType = SaslMechanism.Login,
                EncryptionType = EncryptionType.None
            });
            return temp_list;
        }
Exemplo n.º 5
0
        static bool ParseXml(string filepath, out clientConfig obj)
        {
            obj = null;

            try
            {
                obj = clientConfig.LoadFromFile(filepath);
            }
            catch (Exception)
            {
                return false;
            }

            return true;
        }