Пример #1
0
 public void Restore(string fileName, RestoreFlags_enum restoreFlags)
 {
     using (FileStream fileStream = File.OpenRead(fileName))
     {
         this.Restore(fileStream, restoreFlags);
     }
 }
Пример #2
0
        private void m_pRestore_Click(object sender, EventArgs e)
        {
            RestoreFlags_enum restoreFlags_enum = (RestoreFlags_enum)0;

            if (this.m_pRestoreFlagsAdd.Checked)
            {
                restoreFlags_enum |= RestoreFlags_enum.Add;
            }
            if (this.m_pRestoreFlagsReplace.Checked)
            {
                restoreFlags_enum |= RestoreFlags_enum.Replace;
            }
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = "DataSmart Mail Server backup (*.lsmbck)|*.lsmbck";
            if (openFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                this.m_pVirtualServer.Restore(openFileDialog.FileName, restoreFlags_enum);
            }
        }
Пример #3
0
        private void m_pRestore_Click(object sender, EventArgs e)
        {
            RestoreFlags_enum restoreFlags = 0;

            if (m_pRestoreFlagsAdd.Checked)
            {
                restoreFlags |= RestoreFlags_enum.Add;
            }
            if (m_pRestoreFlagsReplace.Checked)
            {
                restoreFlags |= RestoreFlags_enum.Replace;
            }

            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Filter = "LS Mail Server backup (*.lsmbck)|*.lsmbck";
            if (dlg.ShowDialog(this) == DialogResult.OK)
            {
                m_pVirtualServer.Restore(dlg.FileName, restoreFlags);
            }
        }
        /// <summary>
        /// Restores all virtual server settings from the specified stream.
        /// </summary>
        /// <param name="stream">Stream what conatins backup.</param>
        /// <param name="restoreFlags">Specifies restore options.</param>
        public void Restore(Stream stream,RestoreFlags_enum restoreFlags)
        {
            DataSet ds = new DataSet();
            ds.ReadXml(stream);

            #region Settings

            /* NOTE: Settings need special handling, we can't comapre settings, so just always overwrite it.
            */

            if(ds.Tables.Contains("Settings")){
                this.SystemSettings.LoadSettings(ds);
                this.SystemSettings.Commit();
            }

            #endregion

            #region Domains

            /* NOTE: Domains must act differenly compared other object, because deleting domain looses mailboxes.
                     We need to update domain, if ResoreFlags_enum.Replace, we can't delete domain !!!
            */

            if(ds.Tables.Contains("Domains")){
                foreach(DataRow dr in ds.Tables["Domains"].Rows){
                    // Update exisiting domain, if ResoreFlags_enum.Replace
                    if(this.Domains.Contains(dr["DomainName"].ToString())){
                        if((restoreFlags & RestoreFlags_enum.Replace) != 0){
                            // TODO:
                        }
                    }
                    // Add domain list, if ResoreFlags_enum.Add
                    else if((restoreFlags & RestoreFlags_enum.Add) != 0){
                        Domain domain = this.Domains.Add(
                            dr["DomainName"].ToString(),
                            dr["Description"].ToString()
                        );
                    }
                }
            }

            #endregion

            #region Users

            /* NOTE: Users must act differenly compared other object, because deleting user looses mailbox.
                     We need to update user, if ResoreFlags_enum.Replace, we can't delete user !!!
            */

            if(ds.Tables.Contains("Users")){
                foreach(DataRow dr in ds.Tables["Users"].Rows){
                    User user        = null;
                    bool userChanged = false;
                    // Update exisiting domain, if ResoreFlags_enum.Replace
                    if(this.Users.Contains(dr["UserName"].ToString())){
                        if((restoreFlags & RestoreFlags_enum.Replace) != 0){
                            user = this.Users.GetUserByName(dr["UserName"].ToString());
                            user.UserName           = dr["UserName"].ToString();
                            user.FullName           = dr["FullName"].ToString();
                            user.Password           = dr["Password"].ToString();
                            user.Description        = dr["Description"].ToString();
                            user.MaximumMailboxSize = ConvertEx.ToInt32(dr["Mailbox_Size"]);
                            user.Enabled            = ConvertEx.ToBoolean(dr["Enabled"]);
                            user.Permissions        = (UserPermissions_enum)ConvertEx.ToInt32(dr["Permissions"]);
                            user.Commit();

                            // Delete user email addresses
                            foreach(string emailAddress in user.EmailAddresses.ToArray()){
                                user.EmailAddresses.Remove(emailAddress);
                            }

                            // Delete user remote servers
                            foreach(UserRemoteServer server in user.RemoteServers.ToArray()){
                                user.RemoteServers.Remove(server);
                            }

                            // Delete user message rules
                            foreach(UserMessageRule rule in user.MessageRules.ToArray()){
                                user.MessageRules.Remove(rule);
                            }

                            userChanged = true;
                        }
                    }
                    // Add domain list, if ResoreFlags_enum.Add
                    else if((restoreFlags & RestoreFlags_enum.Add) != 0){
                        user = this.Users.Add(
                            dr["UserName"].ToString(),
                            dr["FullName"].ToString(),
                            dr["Password"].ToString(),
                            dr["Description"].ToString(),
                            ConvertEx.ToInt32(dr["Mailbox_Size"]),
                            ConvertEx.ToBoolean(dr["Enabled"]),
                            (UserPermissions_enum)ConvertEx.ToInt32(dr["Permissions"])
                        );
                        userChanged = true;
                    }

                    if(userChanged){
                        // Add user remote servers
                        if(ds.Tables.Contains("User_EmailAddresses")){
                            DataView dv = new DataView(ds.Tables["User_EmailAddresses"]);
                            dv.RowFilter = "UserID='" + dr["UserID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                user.EmailAddresses.Add(
                                    drV["EmailAddress"].ToString()
                                );
                            }
                        }

                        // Add user remote servers
                        if(ds.Tables.Contains("User_RemoteServers")){
                            DataView dv = new DataView(ds.Tables["User_RemoteServers"]);
                            dv.RowFilter = "UserID='" + dr["UserID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                user.RemoteServers.Add(
                                    drV["Description"].ToString(),
                                    drV["RemoteServer"].ToString(),
                                    ConvertEx.ToInt32(drV["RemotePort"]),
                                    ConvertEx.ToBoolean(drV["UseSSL"]),
                                    drV["RemoteUserName"].ToString(),
                                    drV["RemotePassword"].ToString(),
                                    ConvertEx.ToBoolean(drV["Enabled"])
                                );
                            }
                        }

                        // Add user message rules
                        if(ds.Tables.Contains("User_MessageRules")){
                            DataView dv = new DataView(ds.Tables["User_MessageRules"]);
                            dv.RowFilter = "UserID='" + dr["UserID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                UserMessageRule rule = user.MessageRules.Add(
                                    ConvertEx.ToBoolean(drV["Enabled"]),
                                    drV["Description"].ToString(),
                                    drV["MatchExpression"].ToString(),
                                    (GlobalMessageRule_CheckNextRule_enum)ConvertEx.ToInt32(drV["CheckNextRuleIf"])
                                );

                                // Add rule actions
                                if(ds.Tables.Contains("User_MessageRuleActions")){
                                    DataView dvRuleActions = new DataView(ds.Tables["User_MessageRuleActions"]);
                                    dvRuleActions.RowFilter = "UserID='" + dr["UserID"].ToString() + "' AND RuleID='" + drV["RuleID"].ToString() + "'";
                                    foreach(DataRowView drvAction in dvRuleActions){
                                        rule.Actions.Add(
                                            drvAction["ActionID"].ToString(),
                                            drvAction["Description"].ToString(),
                                            (UserMessageRuleAction_enum)Convert.ToInt32(drvAction["ActionType"]),
                                            Convert.FromBase64String(drvAction["ActionData"].ToString()),
                                            true
                                        );
                                    }
                                }
                            }
                        }
                    }
                }
            }

            #endregion

            #region Groups

            if(ds.Tables.Contains("Groups")){
                foreach(DataRow dr in ds.Tables["Groups"].Rows){
                    // Delete exisiting group, if ResoreFlags_enum.Replace
                    bool replaceAdd = false;
                    if(this.Groups.Contains(dr["GroupName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != 0){
                        this.Groups.Remove(this.Groups.GetGroupByName(dr["GroupName"].ToString()));
                        replaceAdd = true;
                    }

                    // Add group, if ResoreFlags_enum.Add or Replace group add
                    if(!this.Groups.Contains(dr["GroupName"].ToString()) && (replaceAdd || (restoreFlags & RestoreFlags_enum.Add) != 0)){
                        Group group = this.Groups.Add(
                            dr["GroupName"].ToString(),
                            dr["Description"].ToString(),
                            ConvertEx.ToBoolean(dr["Enabled"])
                        );

                        // Add group members
                        if(ds.Tables.Contains("Group_Members")){
                            DataView dv = new DataView(ds.Tables["Group_Members"]);
                            dv.RowFilter = "GroupID='" + dr["GroupID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                group.Members.Add(drV["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }

            #endregion

            #region Mailing lists

            if(ds.Tables.Contains("MailingLists")){
                foreach(DataRow dr in ds.Tables["MailingLists"].Rows){
                    // Delete exisiting mailing list, if ResoreFlags_enum.Replace
                    bool replaceAdd = false;
                    if(this.MailingLists.Contains(dr["MailingListName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != 0){
                        this.MailingLists.Remove(this.MailingLists.GetMailingListByName(dr["MailingListName"].ToString()));
                        replaceAdd = true;
                    }

                    // Add mailing list, if ResoreFlags_enum.Add or Replace mailing list add
                    if(!this.MailingLists.Contains(dr["MailingListName"].ToString()) && (replaceAdd || (restoreFlags & RestoreFlags_enum.Add) != 0)){
                        MailingList list = this.MailingLists.Add(
                            dr["MailingListName"].ToString(),
                            dr["Description"].ToString(),
                            ConvertEx.ToBoolean(dr["Enabled"])
                        );

                        // Add mailing list members
                        if(ds.Tables.Contains("MailingList_Members")){
                            DataView dv = new DataView(ds.Tables["MailingList_Members"]);
                            dv.RowFilter = "MailingListID='" + dr["MailingListID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                list.Members.Add(drV["Address"].ToString());
                            }
                        }

                        // Add mailing list ACL
                        if(ds.Tables.Contains("MailingList_ACL")){
                            DataView dv = new DataView(ds.Tables["MailingList_ACL"]);
                            dv.RowFilter = "MailingListID='" + dr["MailingListID"].ToString() + "'";
                            foreach(DataRowView drV in dv){
                                list.ACL.Add(drV["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }

            #endregion

            #region Routes

            if(ds.Tables.Contains("Routing")){
                foreach(DataRow dr in ds.Tables["Routing"].Rows){
                    // Delete exisiting route, if ResoreFlags_enum.Replace
                    bool replaceAdd = false;
                    if(this.Routes.ContainsPattern(dr["Pattern"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != 0){
                        this.Routes.Remove(this.Routes.GetRouteByPattern(dr["Pattern"].ToString()));
                        replaceAdd = true;
                    }

                    // Add route, if ResoreFlags_enum.Add or Replace route add
                    if(!this.Routes.ContainsPattern(dr["Pattern"].ToString()) && (replaceAdd || (restoreFlags & RestoreFlags_enum.Add) != 0)){
                        RouteAction_enum actionType = (RouteAction_enum)Convert.ToInt32(dr["Action"]);
                        RouteActionBase action = null;
                        if(actionType == RouteAction_enum.RouteToEmail){
                            action = new RouteAction_RouteToEmail(Convert.FromBase64String(dr["ActionData"].ToString()));
                        }
                        else if(actionType == RouteAction_enum.RouteToHost){
                            action = new RouteAction_RouteToHost(Convert.FromBase64String(dr["ActionData"].ToString()));
                        }
                        else if(actionType == RouteAction_enum.RouteToMailbox){
                            action = new RouteAction_RouteToMailbox(Convert.FromBase64String(dr["ActionData"].ToString()));
                        }

                        Route route = this.Routes.Add(
                            dr["Description"].ToString(),
                            dr["Pattern"].ToString(),
                            ConvertEx.ToBoolean(dr["Enabled"]),
                            action
                        );
                    }
                }
             }

            #endregion

            #region Global message rules

            // Add user message rules
            if(ds.Tables.Contains("GlobalMessageRules")){
                // Delete exisiting global message rules, if ResoreFlags_enum.Replace
                if((restoreFlags & RestoreFlags_enum.Replace) != 0){
                    foreach(GlobalMessageRule rule in this.GlobalMessageRules){
                        this.GlobalMessageRules.Remove(rule);
                    }
                }

                DataView dv = new DataView(ds.Tables["GlobalMessageRules"]);
                foreach(DataRowView drV in dv){
                    GlobalMessageRule rule = this.GlobalMessageRules.Add(
                        ConvertEx.ToBoolean(drV["Enabled"]),
                        drV["Description"].ToString(),
                        drV["MatchExpression"].ToString(),
                        (GlobalMessageRule_CheckNextRule_enum)ConvertEx.ToInt32(drV["CheckNextRuleIf"])
                     );

                     // Add rule actions
                     if(ds.Tables.Contains("GlobalMessageRuleActions")){
                         DataView dvRuleActions = new DataView(ds.Tables["GlobalMessageRuleActions"]);
                         dvRuleActions.RowFilter = "RuleID='" + drV["RuleID"].ToString() + "'";
                         foreach(DataRowView drvAction in dvRuleActions){
                             rule.Actions.Add(
                                 drvAction["ActionID"].ToString(),
                                 drvAction["Description"].ToString(),
                                 (GlobalMessageRuleAction_enum)Convert.ToInt32(drvAction["ActionType"]),
                                 Convert.FromBase64String(drvAction["ActionData"].ToString()),
                                 true
                             );
                         }
                     }
                 }
             }

            #endregion

            #region IP Security

            /* NOTE: IP security need special handling, we can't comapre values, so just always overwrite it.
            */

            if(ds.Tables.Contains("IP_Security")){
                // Delete filters
                foreach(IPSecurity entry in this.IpSecurity.ToArray()){
                    this.IpSecurity.Remove(entry);
                }

                foreach(DataRow dr in ds.Tables["IP_Security"].Rows){
                    this.IpSecurity.Add(
                        ConvertEx.ToBoolean(dr["Enabled"]),
                        dr["Description"].ToString(),
                        (Service_enum)ConvertEx.ToInt32(dr["Service"]),
                        (IPSecurityAction_enum)ConvertEx.ToInt32(dr["Action"]),
                        IPAddress.Parse(dr["StartIP"].ToString()),
                        IPAddress.Parse(dr["EndIP"].ToString())
                    );
                }
             }

            #endregion

            #region Filters

            /* NOTE: Filters need special handling, we can't comapre values, so just always overwrite it.
            */

            if(ds.Tables.Contains("Filters")){
                // Delete filters
                foreach(Filter filter in this.Filters.ToArray()){
                    this.Filters.Remove(filter);
                }

                foreach(DataRow dr in ds.Tables["Filters"].Rows){
                    this.Filters.Add(
                        ConvertEx.ToBoolean(dr["Enabled"]),
                        dr["Description"].ToString(),
                        dr["Assembly"].ToString(),
                        dr["ClassName"].ToString()
                    );
                }
             }

            #endregion

            #region Users Default Folders

            if(ds.Tables.Contains("UsersDefaultFolders")){
                foreach(DataRow dr in ds.Tables["UsersDefaultFolders"].Rows){
                    // Delete exisiting folder and add new, if ResoreFlags_enum.Replace
                    if(this.UsersDefaultFolders.Contains(dr["FolderName"].ToString())){
                        if((restoreFlags & RestoreFlags_enum.Replace) != 0){
                            this.UsersDefaultFolders.Remove(this.UsersDefaultFolders.GetFolderByName(dr["FolderName"].ToString()));

                            UsersDefaultFolder folder = this.UsersDefaultFolders.Add(
                                dr["FolderName"].ToString(),
                                ConvertEx.ToBoolean(dr["Permanent"])
                            );
                        }
                    }
                    // Add domain list, if ResoreFlags_enum.Add
                    else if((restoreFlags & RestoreFlags_enum.Add) != 0){
                        UsersDefaultFolder folder = this.UsersDefaultFolders.Add(
                            dr["FolderName"].ToString(),
                            ConvertEx.ToBoolean(dr["Permanent"])
                        );
                    }
                }
            }

            #endregion
        }
 /// <summary>
 /// Restores all virtual server settings from the specified file.
 /// </summary>
 /// <param name="fileName">File what conatins backup.</param>
 /// <param name="restoreFlags">Specifies restore options.</param>
 public void Restore(string fileName,RestoreFlags_enum restoreFlags)
 {
     using(FileStream fs = File.OpenRead(fileName)){
         Restore(fs,restoreFlags);
     }
 }
Пример #6
0
        public void Restore(Stream stream, RestoreFlags_enum restoreFlags)
        {
            DataSet dataSet = new DataSet();

            dataSet.ReadXml(stream);
            if (dataSet.Tables.Contains("Settings"))
            {
                this.SystemSettings.LoadSettings(dataSet);
                this.SystemSettings.Commit();
            }
            if (dataSet.Tables.Contains("Domains"))
            {
                foreach (DataRow dataRow in dataSet.Tables["Domains"].Rows)
                {
                    if (this.Domains.Contains(dataRow["DomainName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        this.Domains.Add(dataRow["DomainName"].ToString(), dataRow["Description"].ToString());
                    }
                }
            }
            if (dataSet.Tables.Contains("Users"))
            {
                foreach (DataRow dataRow2 in dataSet.Tables["Users"].Rows)
                {
                    User user = null;
                    bool flag = false;
                    if (this.Users.Contains(dataRow2["UserName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                            user                    = this.Users.GetUserByName(dataRow2["UserName"].ToString());
                            user.UserName           = dataRow2["UserName"].ToString();
                            user.FullName           = dataRow2["FullName"].ToString();
                            user.Password           = dataRow2["Password"].ToString();
                            user.Description        = dataRow2["Description"].ToString();
                            user.MaximumMailboxSize = ConvertEx.ToInt32(dataRow2["Mailbox_Size"]);
                            user.Enabled            = ConvertEx.ToBoolean(dataRow2["Enabled"]);
                            user.Permissions        = (UserPermissions)ConvertEx.ToInt32(dataRow2["Permissions"]);
                            user.Commit();
                            string[] array = user.EmailAddresses.ToArray();
                            for (int i = 0; i < array.Length; i++)
                            {
                                string emailAddress = array[i];
                                user.EmailAddresses.Remove(emailAddress);
                            }
                            UserRemoteServer[] array2 = user.RemoteServers.ToArray();
                            for (int j = 0; j < array2.Length; j++)
                            {
                                UserRemoteServer remoteServer = array2[j];
                                user.RemoteServers.Remove(remoteServer);
                            }
                            UserMessageRule[] array3 = user.MessageRules.ToArray();
                            for (int k = 0; k < array3.Length; k++)
                            {
                                UserMessageRule rule = array3[k];
                                user.MessageRules.Remove(rule);
                            }
                            flag = true;
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        user = this.Users.Add(dataRow2["UserName"].ToString(), dataRow2["FullName"].ToString(), dataRow2["Password"].ToString(), dataRow2["Description"].ToString(), ConvertEx.ToInt32(dataRow2["Mailbox_Size"]), ConvertEx.ToBoolean(dataRow2["Enabled"]), (UserPermissions)ConvertEx.ToInt32(dataRow2["Permissions"]));
                        flag = true;
                    }
                    if (flag)
                    {
                        if (dataSet.Tables.Contains("User_EmailAddresses"))
                        {
                            foreach (DataRowView dataRowView in new DataView(dataSet.Tables["User_EmailAddresses"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                user.EmailAddresses.Add(dataRowView["EmailAddress"].ToString());
                            }
                        }
                        if (dataSet.Tables.Contains("User_RemoteServers"))
                        {
                            foreach (DataRowView dataRowView2 in new DataView(dataSet.Tables["User_RemoteServers"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                user.RemoteServers.Add(dataRowView2["Description"].ToString(), dataRowView2["RemoteServer"].ToString(), ConvertEx.ToInt32(dataRowView2["RemotePort"]), ConvertEx.ToBoolean(dataRowView2["UseSSL"]), dataRowView2["RemoteUserName"].ToString(), dataRowView2["RemotePassword"].ToString(), ConvertEx.ToBoolean(dataRowView2["Enabled"]));
                            }
                        }
                        if (dataSet.Tables.Contains("User_MessageRules"))
                        {
                            foreach (DataRowView dataRowView3 in new DataView(dataSet.Tables["User_MessageRules"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                UserMessageRule userMessageRule = user.MessageRules.Add(ConvertEx.ToBoolean(dataRowView3["Enabled"]), dataRowView3["Description"].ToString(), dataRowView3["MatchExpression"].ToString(), (GlobalMessageRule_CheckNextRule)ConvertEx.ToInt32(dataRowView3["CheckNextRuleIf"]));
                                if (dataSet.Tables.Contains("User_MessageRuleActions"))
                                {
                                    foreach (DataRowView dataRowView4 in new DataView(dataSet.Tables["User_MessageRuleActions"])
                                    {
                                        RowFilter = string.Concat(new string[]
                                        {
                                            "UserID='",
                                            dataRow2["UserID"].ToString(),
                                            "' AND RuleID='",
                                            dataRowView3["RuleID"].ToString(),
                                            "'"
                                        })
                                    })
                                    {
                                        userMessageRule.Actions.Add(dataRowView4["ActionID"].ToString(), dataRowView4["Description"].ToString(), (UserMessageRuleActionType)Convert.ToInt32(dataRowView4["ActionType"]), Convert.FromBase64String(dataRowView4["ActionData"].ToString()), true);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("Groups"))
            {
                foreach (DataRow dataRow3 in dataSet.Tables["Groups"].Rows)
                {
                    bool flag2 = false;
                    if (this.Groups.Contains(dataRow3["GroupName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.Groups.Remove(this.Groups.GetGroupByName(dataRow3["GroupName"].ToString()));
                        flag2 = true;
                    }
                    if (!this.Groups.Contains(dataRow3["GroupName"].ToString()) && (flag2 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        Group group = this.Groups.Add(dataRow3["GroupName"].ToString(), dataRow3["Description"].ToString(), ConvertEx.ToBoolean(dataRow3["Enabled"]));
                        if (dataSet.Tables.Contains("Group_Members"))
                        {
                            foreach (DataRowView dataRowView5 in new DataView(dataSet.Tables["Group_Members"])
                            {
                                RowFilter = "GroupID='" + dataRow3["GroupID"].ToString() + "'"
                            })
                            {
                                group.Members.Add(dataRowView5["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("MailingLists"))
            {
                foreach (DataRow dataRow4 in dataSet.Tables["MailingLists"].Rows)
                {
                    bool flag3 = false;
                    if (this.MailingLists.Contains(dataRow4["MailingListName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.MailingLists.Remove(this.MailingLists.GetMailingListByName(dataRow4["MailingListName"].ToString()));
                        flag3 = true;
                    }
                    if (!this.MailingLists.Contains(dataRow4["MailingListName"].ToString()) && (flag3 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        MailingList mailingList = this.MailingLists.Add(dataRow4["MailingListName"].ToString(), dataRow4["Description"].ToString(), ConvertEx.ToBoolean(dataRow4["Enabled"]));
                        if (dataSet.Tables.Contains("MailingList_Members"))
                        {
                            foreach (DataRowView dataRowView6 in new DataView(dataSet.Tables["MailingList_Members"])
                            {
                                RowFilter = "MailingListID='" + dataRow4["MailingListID"].ToString() + "'"
                            })
                            {
                                mailingList.Members.Add(dataRowView6["Address"].ToString());
                            }
                        }
                        if (dataSet.Tables.Contains("MailingList_ACL"))
                        {
                            foreach (DataRowView dataRowView7 in new DataView(dataSet.Tables["MailingList_ACL"])
                            {
                                RowFilter = "MailingListID='" + dataRow4["MailingListID"].ToString() + "'"
                            })
                            {
                                mailingList.ACL.Add(dataRowView7["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("Routing"))
            {
                foreach (DataRow dataRow5 in dataSet.Tables["Routing"].Rows)
                {
                    bool flag4 = false;
                    if (this.Routes.ContainsPattern(dataRow5["Pattern"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.Routes.Remove(this.Routes.GetRouteByPattern(dataRow5["Pattern"].ToString()));
                        flag4 = true;
                    }
                    if (!this.Routes.ContainsPattern(dataRow5["Pattern"].ToString()) && (flag4 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        RouteAction     routeAction_enum = (RouteAction)Convert.ToInt32(dataRow5["Action"]);
                        RouteActionBase action           = null;
                        if (routeAction_enum == RouteAction.RouteToEmail)
                        {
                            action = new RouteAction_RouteToEmail(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        else if (routeAction_enum == RouteAction.RouteToHost)
                        {
                            action = new RouteAction_RouteToHost(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        else if (routeAction_enum == RouteAction.RouteToMailbox)
                        {
                            action = new RouteAction_RouteToMailbox(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        this.Routes.Add(dataRow5["Description"].ToString(), dataRow5["Pattern"].ToString(), ConvertEx.ToBoolean(dataRow5["Enabled"]), action);
                    }
                }
            }
            if (dataSet.Tables.Contains("GlobalMessageRules"))
            {
                IEnumerator enumerator;
                if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                {
                    enumerator = this.GlobalMessageRules.GetEnumerator();
                    try
                    {
                        while (enumerator.MoveNext())
                        {
                            GlobalMessageRule rule2 = (GlobalMessageRule)enumerator.Current;
                            this.GlobalMessageRules.Remove(rule2);
                        }
                    }
                    finally
                    {
                        IDisposable disposable = enumerator as IDisposable;
                        if (disposable != null)
                        {
                            disposable.Dispose();
                        }
                    }
                }
                DataView dataView = new DataView(dataSet.Tables["GlobalMessageRules"]);
                enumerator = dataView.GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        DataRowView       dataRowView8      = (DataRowView)enumerator.Current;
                        GlobalMessageRule globalMessageRule = this.GlobalMessageRules.Add(ConvertEx.ToBoolean(dataRowView8["Enabled"]), dataRowView8["Description"].ToString(), dataRowView8["MatchExpression"].ToString(), (GlobalMessageRule_CheckNextRule)ConvertEx.ToInt32(dataRowView8["CheckNextRuleIf"]));
                        if (dataSet.Tables.Contains("GlobalMessageRuleActions"))
                        {
                            foreach (DataRowView dataRowView9 in new DataView(dataSet.Tables["GlobalMessageRuleActions"])
                            {
                                RowFilter = "RuleID='" + dataRowView8["RuleID"].ToString() + "'"
                            })
                            {
                                globalMessageRule.Actions.Add(dataRowView9["ActionID"].ToString(), dataRowView9["Description"].ToString(), (GlobalMessageRuleActionType)Convert.ToInt32(dataRowView9["ActionType"]), Convert.FromBase64String(dataRowView9["ActionData"].ToString()), true);
                            }
                        }
                    }
                }
                finally
                {
                    IDisposable disposable = enumerator as IDisposable;
                    if (disposable != null)
                    {
                        disposable.Dispose();
                    }
                }
            }
            if (dataSet.Tables.Contains("IP_Security"))
            {
                IPSecurity[] array4 = this.IpSecurity.ToArray();
                for (int i = 0; i < array4.Length; i++)
                {
                    IPSecurity entry = array4[i];
                    this.IpSecurity.Remove(entry);
                }
                foreach (DataRow dataRow6 in dataSet.Tables["IP_Security"].Rows)
                {
                    this.IpSecurity.Add(ConvertEx.ToBoolean(dataRow6["Enabled"]), dataRow6["Description"].ToString(), (ServiceKind)ConvertEx.ToInt32(dataRow6["Service"]), (IPSecurityAction)ConvertEx.ToInt32(dataRow6["Action"]), IPAddress.Parse(dataRow6["StartIP"].ToString()), IPAddress.Parse(dataRow6["EndIP"].ToString()));
                }
            }
            if (dataSet.Tables.Contains("Filters"))
            {
                Filter[] array5 = this.Filters.ToArray();
                for (int i = 0; i < array5.Length; i++)
                {
                    Filter filter = array5[i];
                    this.Filters.Remove(filter);
                }
                foreach (DataRow dataRow7 in dataSet.Tables["Filters"].Rows)
                {
                    this.Filters.Add(ConvertEx.ToBoolean(dataRow7["Enabled"]), dataRow7["Description"].ToString(), dataRow7["Assembly"].ToString(), dataRow7["ClassName"].ToString());
                }
            }
            if (dataSet.Tables.Contains("UsersDefaultFolders"))
            {
                foreach (DataRow dataRow8 in dataSet.Tables["UsersDefaultFolders"].Rows)
                {
                    if (this.UsersDefaultFolders.Contains(dataRow8["FolderName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                            this.UsersDefaultFolders.Remove(this.UsersDefaultFolders.GetFolderByName(dataRow8["FolderName"].ToString()));
                            this.UsersDefaultFolders.Add(dataRow8["FolderName"].ToString(), ConvertEx.ToBoolean(dataRow8["Permanent"]));
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        this.UsersDefaultFolders.Add(dataRow8["FolderName"].ToString(), ConvertEx.ToBoolean(dataRow8["Permanent"]));
                    }
                }
            }
        }