public void TestRangeCount2()
        {
            List <PortOrRange> input = new List <PortOrRange> {
                new PortOrRange(80), new PortOrRange(81), new PortOrRange(82, 83), new PortOrRange(85), new PortOrRange(86, 90), new PortOrRange(180)
            };

            Assert.AreEqual(1, PortRangeHelpers.CountRequiredMultiports(input));
        }
        public void TestRangeCount5()
        {
            List <PortOrRange> input = new List <PortOrRange> {
            };

            for (int i = 0; i < 8; i++)
            {
                input.Add(new PortOrRange((uint)(100 * i), (uint)((100 * i) + 1)));
            }

            Assert.AreEqual(2, PortRangeHelpers.CountRequiredMultiports(input));
        }
        public void TestCompress6()
        {
            List <PortOrRange> input = new List <PortOrRange> {
                new PortOrRange(80), new PortOrRange(81), new PortOrRange(82, 83), new PortOrRange(85), new PortOrRange(86, 90)
            };
            List <PortOrRange> output = new List <PortOrRange> {
                new PortOrRange(80, 83), new PortOrRange(85, 90)
            };

            List <PortOrRange> actual = PortRangeHelpers.CompressRanges(input);

            CollectionAssert.AreEqual(output, actual);
        }
Exemple #4
0
        /// <summary>
        /// Add the rules
        /// </summary>
        /// <param name="ruleSet"></param>
        /// <param name="system"></param>
        /// <param name="rules"></param>
        /// <param name="chainName"></param>
        /// <param name="key"></param>
        /// <returns>an IPTables rule if the output is singular</returns>
        private IpTablesRule OutputRulesForGroup(IpTablesRuleSet ruleSet, IpTablesSystem system, List <IpTablesRule> rules, string chainName, TKey key)
        {
            if (rules.Count == 0)
            {
                return(null);
            }

            int count = 0, ruleCount = 0;
            List <PortOrRange> ranges = new List <PortOrRange>();
            IpTablesRule       rule1  = null;
            var firstCore             = rules[0].GetModule <CoreModule>("core");
            int ruleIdx               = 1;

            Action buildRule = () =>
            {
                //Console.WriteLine("t2");
                if (ranges.Count == 0)
                {
                    throw new IpTablesNetException("this should not happen");
                }

                rule1 = IpTablesRule.Parse(_baseRule, system, ruleSet.Chains);

                //Core Module
                var ruleCore = rule1.GetModuleOrLoad <CoreModule>("core");
                ruleCore.Protocol = firstCore.Protocol;
                if (firstCore.TargetMode == TargetMode.Goto && !String.IsNullOrEmpty(firstCore.Goto))
                {
                    ruleCore.Goto = firstCore.Goto;
                }
                else if (firstCore.TargetMode == TargetMode.Jump && !String.IsNullOrEmpty(firstCore.Jump))
                {
                    ruleCore.Jump = firstCore.Jump;
                }

                //Comment Module
                var ruleComment = rule1.GetModuleOrLoad <CommentModule>("comment");
                ruleComment.CommentText = _commentPrefix + "|" + chainName + "|" + ruleIdx;

                // Create just one rule if there is only one set of multiports
                if (ruleCount == 1 && ranges.Count == 1 && _setJump != null)
                {
                    _setJump(rule1, key);
                    rule1.Chain = ruleSet.Chains.GetChainOrDefault(_chain, _table);
                }
                else
                {
                    rule1.Chain = ruleSet.Chains.GetChainOrDefault(chainName, _table);
                }

                //Console.WriteLine(rule1.GetActionCommandParamters());

                _setPort(rule1, new List <PortOrRange>(ranges));
                ruleSet.AddRule(rule1);
                ruleIdx++;
            };

            List <PortOrRange> ports = rules.Select(rule => _extractPort(rule)).ToList();

            PortRangeHelpers.SortRangeFirstLowHigh(ports);
            ports     = PortRangeHelpers.CompressRanges(ports);
            ruleCount = PortRangeHelpers.CountRequiredMultiports(ports);

            foreach (var e in ports)
            {
                if (!_ipset && (count == 14 && e.IsRange() || count == 15))
                {
                    buildRule();
                    count = 0;
                    ranges.Clear();
                }
                ranges.Add(e);

                if (e.IsRange())
                {
                    count += 2;
                }
                else
                {
                    count++;
                }
            }

            if (ranges.Count != 0)
            {
                buildRule();
            }

            if (ruleCount != 1 || ranges.Count != 1)
            {
                return(null);
            }

            return(rule1);
        }