Beispiel #1
0
        public bool Update(int patternID, string name, string description, int?virtualMTA, OutboundMxPatternType type, string patternValue, int maxConnections, int maxMessagesConn, int maxMessagesHour)
        {
            if (virtualMTA == -1)
            {
                virtualMTA = null;
            }

            OutboundMxPattern pattern = null;

            if (patternID == WebInterfaceLib.WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
            {
                pattern = new OutboundMxPattern();
            }
            else
            {
                pattern = MantaMTA.Core.DAL.OutboundRuleDB.GetOutboundRulePatterns().SingleOrDefault(p => p.ID == patternID);
            }
            if (pattern == null)
            {
                return(false);
            }

            pattern.Description = description.Trim();
            pattern.LimitedToOutboundIpAddressID = virtualMTA;
            pattern.Name  = name.Trim();
            pattern.Type  = type;
            pattern.Value = patternValue;
            pattern.ID    = OutboundRuleWebManager.Save(pattern);

            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxConnections, maxConnections.ToString()));
            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxMessagesConnection, maxMessagesConn.ToString()));
            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxMessagesPerHour, maxMessagesHour.ToString()));

            return(true);
        }
Beispiel #2
0
        public bool Update(UpdateOutboundRuleViewModel viewModel)
        {
            if (viewModel.VirtualMTA == -1)
            {
                viewModel.VirtualMTA = null;
            }

            OutboundMxPattern pattern = null;

            if (viewModel.PatternID == WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
            {
                pattern = new OutboundMxPattern();
            }
            else
            {
                pattern = OutboundRuleDB.GetOutboundRulePatterns().SingleOrDefault(p => p.ID == viewModel.PatternID);
            }
            if (pattern == null)
            {
                return(false);
            }

            pattern.Description = viewModel.Description.Trim();
            pattern.LimitedToOutboundIpAddressID = viewModel.VirtualMTA;
            pattern.Name  = viewModel.Name.Trim();
            pattern.Type  = viewModel.Type;
            pattern.Value = viewModel.PatternValue;
            pattern.ID    = OutboundRuleWebManager.Save(pattern);

            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxConnections, viewModel.MaxConnections.ToString()));
            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxMessagesConnection, viewModel.MaxMessagesConn.ToString()));
            OutboundRuleWebManager.Save(new OutboundRule(pattern.ID, OutboundRuleType.MaxMessagesPerHour, viewModel.MaxMessagesHour.ToString()));

            return(true);
        }
Beispiel #3
0
        /// <summary>
        /// Saves the specified OutboundMxPattern to the database.
        /// </summary>
        /// <param name="mxPattern">The OutboundMxPattern to save.</param>
        /// <returns>ID of the OutboundMxPattern.</returns>
        public static int Save(OutboundMxPattern mxPattern)
        {
            using (SqlConnection conn = MantaDB.GetSqlConnection())
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"
IF EXISTS (SELECT 1 FROM man_rle_mxPattern WHERE rle_mxPattern_id = @mxPatternID)
	BEGIN
		UPDATE man_rle_mxPattern
		SET rle_mxPattern_name = @name,
		rle_mxPattern_description = @description,
		rle_patternType_id = @type,
		rle_mxPattern_value = @value,
		ip_ipAddress_id = @ipAddressID
		WHERE rle_mxPattern_id = @mxPatternID

		SELECT @mxPatternID
	END
ELSE
	BEGIN
		INSERT INTO man_rle_mxPattern(rle_mxPattern_name, rle_mxPattern_description, rle_patternType_id, rle_mxPattern_value, ip_ipAddress_id)
		VALUES(@name, @description, @type, @value, @ipAddressID)

		SELECT @@IDENTITY
	END
";
                cmd.Parameters.AddWithValue("@mxPatternID", mxPattern.ID);
                cmd.Parameters.AddWithValue("@name", mxPattern.Name);
                if (mxPattern.Description == null)
                {
                    cmd.Parameters.AddWithValue("@description", DBNull.Value);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@description", mxPattern.Description);
                }
                cmd.Parameters.AddWithValue("@type", (int)mxPattern.Type);
                cmd.Parameters.AddWithValue("@value", mxPattern.Value);
                if (mxPattern.LimitedToOutboundIpAddressID.HasValue)
                {
                    cmd.Parameters.AddWithValue("@ipAddressID", mxPattern.LimitedToOutboundIpAddressID.Value);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@ipAddressID", DBNull.Value);
                }
                conn.Open();
                return(Convert.ToInt32(cmd.ExecuteScalar()));
            }
        }
Beispiel #4
0
        /// <summary>
        /// Create and fill an OutboundMxPattern object from the Data Record.
        /// </summary>
        /// <param name="record">Datarecord containing values for the new object.</param>
        /// <returns>OutboundMxPattern object.</returns>
        private static OutboundMxPattern CreateAndFillOutboundMxPattern(IDataRecord record)
        {
            OutboundMxPattern mxPattern = new OutboundMxPattern();

            mxPattern.Description = record.GetStringOrEmpty("rle_mxPattern_description");
            mxPattern.ID          = record.GetInt32("rle_mxPattern_id");
            mxPattern.Name        = record.GetString("rle_mxPattern_name");
            if (!record.IsDBNull("ip_ipAddress_id"))
            {
                mxPattern.LimitedToOutboundIpAddressID = record.GetInt32("ip_ipAddress_id");
            }
            mxPattern.Type  = (OutboundMxPatternType)record.GetInt32("rle_patternType_id");
            mxPattern.Value = record.GetString("rle_mxPattern_value");
            return(mxPattern);
        }
        /// <summary>
        /// Creates a new MX Pattern and it's default rules.
        /// </summary>
        /// <param name="name">Name of the pattern.</param>
        /// <param name="description">Description of the pattern.</param>
        /// <param name="type">The Type of the pattern.</param>
        /// <param name="pattern">The pattern value.</param>
        /// <param name="ipAddress">IP Address to limit the outbound rule to, or null if applies to all IP's.</param>
        /// <returns>ID of the MX Pattern.</returns>
        public static int CreatePattern(string name, string description, OutboundMxPatternType type, string pattern, int?ipAddress)
        {
            OutboundMxPattern mxPattern = new OutboundMxPattern
            {
                Description = description,
                Name        = name,
                Type        = type,
                Value       = pattern,
                LimitedToOutboundIpAddressID = ipAddress
            };

            mxPattern.ID = Save(mxPattern);

            // Create the three types of rule.
            Save(new OutboundRule(mxPattern.ID, OutboundRuleType.MaxConnections, "-1"));
            Save(new OutboundRule(mxPattern.ID, OutboundRuleType.MaxMessagesConnection, "-1"));
            Save(new OutboundRule(mxPattern.ID, OutboundRuleType.MaxMessagesPerHour, "-1"));

            return(mxPattern.ID);
        }
        //
        // GET: /OutboundRules/Edit?id=
        public ActionResult Edit(int id = WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
        {
            OutboundMxPattern    pattern = null;
            IList <OutboundRule> rules   = null;

            if (id != WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
            {
                pattern = OutboundRuleDB.GetOutboundRulePatterns().Single(p => p.ID == id);
                rules   = OutboundRuleDB.GetOutboundRules().Where(r => r.OutboundMxPatternID == id).ToList();
            }
            else
            {
                pattern = new OutboundMxPattern();
                rules   = OutboundRuleDB.GetOutboundRules().Where(r => r.OutboundMxPatternID == MtaParameters.OUTBOUND_RULES_DEFAULT_PATTERN_ID).ToList();
            }


            IList <VirtualMTA> vMtas = VirtualMtaDB.GetVirtualMtas();

            return(View(new OutboundRuleModel(rules, pattern, vMtas)));
        }
Beispiel #7
0
        //
        // GET: /OutboundRules/Edit?id=
        public ActionResult Edit(int id = WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
        {
            OutboundMxPattern      pattern = null;
            OutboundRuleCollection rules   = null;

            if (id != WebInterfaceParameters.OUTBOUND_RULES_NEW_PATTERN_ID)
            {
                pattern = OutboundRuleDB.GetOutboundRulePatterns().Single(p => p.ID == id);
                rules   = new OutboundRuleCollection(OutboundRuleDB.GetOutboundRules().Where(r => r.OutboundMxPatternID == id).ToArray());
            }
            else
            {
                pattern = new OutboundMxPattern();
                rules   = new OutboundRuleCollection(OutboundRuleDB.GetOutboundRules().Where(r => r.OutboundMxPatternID == MantaMTA.Core.MtaParameters.OUTBOUND_RULES_DEFAULT_PATTERN_ID));
            }


            VirtualMTACollection vMtas = MantaMTA.Core.DAL.VirtualMtaDB.GetVirtualMtas();

            return(View(new OutboundRuleModel(rules, pattern, vMtas)));
        }
 /// <summary>
 /// Saves the OutboundMxPattern.
 /// </summary>
 /// <param name="pattern">Pattern to save.</param>
 /// <returns>ID of the pattern.</returns>
 public static int Save(OutboundMxPattern pattern)
 {
     return(DAL.OutboundRulesDB.Save(pattern));
 }
Beispiel #9
0
        /// <summary>
        /// Gets the MxPatternID that matches the MX Record, Outbound IP Address combo.
        /// </summary>
        /// <param name="record"></param>
        /// <param name="ipAddress"></param>
        /// <returns></returns>
        private static int GetMxPatternID(MXRecord record, VirtualMTA ipAddress)
        {
            if (_matchedPatterns == null)
            {
                _matchedPatterns = new ConcurrentDictionary <string, MatchedMxPatternCollection>();
            }

            MatchedMxPatternCollection matchedPatterns = null;

            if (!_matchedPatterns.TryGetValue(record.Host, out matchedPatterns))
            {
                matchedPatterns = new MatchedMxPatternCollection();
                _matchedPatterns.AddOrUpdate(record.Host, matchedPatterns, (string s, MatchedMxPatternCollection p) => matchedPatterns);
            }

            MatchedMxPattern matchedPattern = matchedPatterns.GetMatchedMxPattern(ipAddress);

            if (matchedPattern != null &&
                matchedPattern.MatchedUtc.AddMinutes(MtaParameters.MTA_CACHE_MINUTES) > DateTime.UtcNow)
            {
                // Found a valid cached pattern ID so return it.
                return(matchedPattern.MxPatternID);
            }

            // Loop through all of the patterns
            for (int i = 0; i < _MXPatterns.Count; i++)
            {
                // The current pattern we're working with.
                OutboundMxPattern pattern = _MXPatterns[i];

                // If the pattern applies only to a specified IP address then
                // only check for a match if getting rules for that IP.
                if (pattern.LimitedToOutboundIpAddressID.HasValue &&
                    pattern.LimitedToOutboundIpAddressID.Value != ipAddress.ID)
                {
                    continue;
                }

                if (pattern.Type == OutboundMxPatternType.CommaDelimited)
                {
                    // Pattern is a comma delimited list, so split the values
                    string[] strings = pattern.Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

                    // Loop though the values in the split string array.
                    for (int c = 0; c < strings.Length; c++)
                    {
                        try
                        {
                            // If they are a match return the rules.
                            if (strings[c].Equals(record.Host, StringComparison.OrdinalIgnoreCase))
                            {
                                if (pattern.LimitedToOutboundIpAddressID.HasValue)
                                {
                                    matchedPatterns.Add(pattern.ID, ipAddress);
                                }
                                else
                                {
                                    matchedPatterns.Add(pattern.ID, null);
                                }

                                return(pattern.ID);
                            }
                        }
                        catch (Exception) { }
                    }

                    continue;
                }
                else if (pattern.Type == OutboundMxPatternType.Regex)
                {
                    // Pattern is Regex so just need to do an IsMatch
                    if (Regex.IsMatch(record.Host, pattern.Value, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture))
                    {
                        // Found pattern match.
                        if (pattern.LimitedToOutboundIpAddressID.HasValue)
                        {
                            matchedPatterns.Add(pattern.ID, ipAddress);
                        }
                        else
                        {
                            matchedPatterns.Add(pattern.ID, null);
                        }

                        return(pattern.ID);
                    }
                    else
                    {
                        continue;
                    }
                }
                else
                {
                    // Don't know what to do with this pattern so move on to the next.
                    Logging.Error("Unknown OutboundMxPatternType : " + pattern.Type.ToString());
                    continue;
                }
            }

            // Should have been found by default at least, but hasn't.
            Logging.Fatal("No MX Pattern Rules! Default Deleted?");
            MantaCoreEvents.InvokeMantaCoreStopping();
            Environment.Exit(0);
            return(-1);
        }
Beispiel #10
0
 public OutboundRuleModel(IList <OutboundRule> outboundRuleCollection, OutboundMxPattern pattern, IList <VirtualMTA> virtualMtaCollection)
 {
     OutboundRules        = outboundRuleCollection;
     Pattern              = pattern;
     VirtualMtaCollection = virtualMtaCollection;
 }
Beispiel #11
0
 public OutboundRuleModel(OutboundRuleCollection outboundRuleCollection, OutboundMxPattern pattern, VirtualMTACollection virtualMtaCollection)
 {
     OutboundRules        = outboundRuleCollection;
     Pattern              = pattern;
     VirtualMtaCollection = virtualMtaCollection;
 }