Esempio n. 1
0
        /// <summary> Populates this IP_Restriction range information with all of the IP Restriction ranges for this library </summary>
        /// <param name="All_Ranges"> DataTable containing all of the IP ranges </param>
        public void Populate_IP_Ranges(DataTable All_Ranges)
        {
            lock (thisLock)
            {
                DataColumn startColumn = All_Ranges.Columns["StartIP"];
                DataColumn endColumn   = All_Ranges.Columns["EndIP"];

                rangeDictionary.Clear();
                IpRanges.Clear();
                IP_Restriction_Range currentRange = null;
                foreach (DataRow thisRow in All_Ranges.Rows)
                {
                    // Check if this is the same range, or add a new one
                    int ipRangeId = Convert.ToInt32(thisRow[1]);
                    if ((currentRange == null) || (currentRange.RangeID != ipRangeId))
                    {
                        currentRange = new IP_Restriction_Range(ipRangeId, thisRow[0].ToString(), thisRow[2].ToString(), thisRow[5].ToString());
                        IpRanges.Add(currentRange);

                        rangeDictionary[currentRange.RangeID] = currentRange;
                    }

                    // Add all the IP addresses to this
                    string start = thisRow[startColumn].ToString().Trim();
                    if (start.Length > 0)
                    {
                        currentRange.Add_IP_Address(start, thisRow[endColumn].ToString().Trim());
                    }
                }
            }
        }
Esempio n. 2
0
        public void HowManyAvailable_ReturnsCountInRange_LessBlocks()
        {
            var sut = new IpRanges();

            sut.Block(new Range(2, 5));

            Assert.Equal(4294967292, sut.HowManyAvailable);
        }
Esempio n. 3
0
        private void AddIpRange()
        {
            const byte maxIpRanges = byte.MaxValue;

            if (IpRanges.Count < maxIpRanges)
            {
                IpRanges.Add(new IpRangeViewModel());
            }
        }
Esempio n. 4
0
        public void ReturnsNumbersStartingAt0_WhenIpRange_IsEmpty()
        {
            var expected = new Range(0, 4294967295);

            var sut = new IpRanges();

            var actual = sut.Lowest();

            Assert.Equal(expected, actual);
        }
Esempio n. 5
0
        public void ReturnsValues_Exclusive_OfRange()
        {
            var expected = new[] { new Range(0, 1), new Range(5, 4294967295) };

            var sut = new IpRanges();

            sut.Block(new Range(2, 4));

            var actual = sut.AvailableRanges();

            Assert.Equal(expected, actual);
        }
Esempio n. 6
0
        private void RemoveIpRange(object obj)
        {
            if (IpRanges.Count <= 1)
            {
                _dialogCoordinator.ShowMessageAsync(this, "Oops..", "You can't remove the last ip range.");
                return;
            }

            var ipRange = (IpRangeViewModel)obj;

            IpRanges.Remove(ipRange);
        }
Esempio n. 7
0
        public ContestSettings CreateSettings(IContestInformation contest)
        {
            var defaultCat = RegisterCategory?
                             .Where(k => k.Value != 0)
                             .ToDictionary(k => k.Key, v => v.Value);

            if (defaultCat?.Count == 0)
            {
                defaultCat = null;
            }

            if (RestrictToIpRanges)
            {
                IpRanges ??= string.Empty;
            }
            else
            {
                IpRanges = null;
            }
            int restriction =
                (RestrictToIpRanges ? 1 : 0)
                | (RestrictToMinimalSite ? 2 : 0)
                | (RestrictToLastLoginIp ? 4 : 0);

            var penaltyTime =
                contest.RankingStrategy == CcsDefaults.RuleXCPC &&
                PenaltyTime != 20
                ? PenaltyTime : default(int?);

            var scoreboardPagingEnabled =
                UseScoreboardPaging switch
            {
                1 => true,
                2 => false,
                _ => default(bool?),
            };

            var settings = contest.Settings.Clone();

            settings.BalloonAvailable  = contest.Kind == CcsDefaults.KindDom && UseBalloon;
            settings.EventAvailable    = contest.Kind == CcsDefaults.KindDom && UseEvents;
            settings.Languages         = Languages;
            settings.PrintingAvailable = contest.Kind == CcsDefaults.KindDom && UsePrintings;
            settings.RegisterCategory  = defaultCat;
            settings.StatusAvailable   = StatusAvailable;
            settings.PenaltyTime       = penaltyTime;
            settings.ScoreboardPaging  = scoreboardPagingEnabled;
            settings.PreferGymUI       = contest.Kind == CcsDefaults.KindDom && PreferGymUI ? true : default(bool?);
            settings.RestrictIp        = contest.Kind != CcsDefaults.KindDom || restriction == 0 ? default(int?) : restriction;
            settings.IpRanges          = IpRanges?.Split(';', StringSplitOptions.RemoveEmptyEntries);
            return(settings);
        }
Esempio n. 8
0
        public void HowManyAvailable_ReturnsCountInRange_LessAllBlocks()
        {
            var expectedAvailable = new[] { new Range(3, 3), new Range(9, 9) };

            var sut = new IpRanges(9);

            sut.Block(new Range(5, 8));
            sut.Block(new Range(0, 2));
            sut.Block(new Range(4, 7));

            Assert.Equal(2, sut.HowManyAvailable);
            Assert.Equal(8, sut.HowManyBlocked);
            Assert.Equal(expectedAvailable, sut.AvailableRanges());
        }
Esempio n. 9
0
        public void ReturnsValues_AfterMultipleOverlappedHaveToMerge()
        {
            var expected = new[] { new Range(0, 0), new Range(9, 4294967295) };

            var sut = new IpRanges();

            sut.Block(new Range(2, 4));
            sut.Block(new Range(5, 8));
            sut.Block(new Range(1, 7));

            var actual = sut.AvailableRanges();

            Assert.Equal(expected, actual);
        }
Esempio n. 10
0
        public static void Problem20()
        {
            var ips = new IpRanges();

            foreach (var range in FileStringReader.Read("P20.txt"))
            {
                ips.Block(Range.From(range));
            }

            ips.AvailableRanges().ToList().ForEach(a => Console.WriteLine(string.Format("{0} == {1}", a, a.HowManyInRange)));

            Console.WriteLine("\nLowest Available = {0}", ips.Lowest());
            Console.WriteLine("Number Blocked = {0}", ips.HowManyBlocked);
            Console.WriteLine("Number Available = {0}", ips.HowManyAvailable);
        }
Esempio n. 11
0
        /// <summary> Gets the bitwise mask of IP restrictive ranges to which this IP address belongs </summary>
        /// <param name="IP_Address"> IP Address to verify against all IP restrictive ranges </param>
        /// <returns>Restrictive ranges to which this IP address belongs, as a bitwise mask </returns>
        public int Restrictive_Range_Membership(string IP_Address)
        {
            lock (thisLock)
            {
                int returnMask = 0;

                // Split the IP address
                string[] ipSplitString = IP_Address.Split(new[] { '.' });

                // Currently only support IP 4
                if (ipSplitString.Length == 4)
                {
                    // Get the IP address as an unsigned integer
                    uint ipAsNumber  = (Convert.ToUInt32(ipSplitString[0]) * 169476096) + (Convert.ToUInt32(ipSplitString[1]) * 65536) + (Convert.ToUInt32(ipSplitString[2]) * 256) + Convert.ToUInt32(ipSplitString[3]);
                    byte firstIpByte = Convert.ToByte(ipSplitString[0]);

                    // Step through each IP Restrictive range
                    returnMask += IpRanges.Where(ThisRange => ThisRange.Contains(ipAsNumber, firstIpByte)).Sum(ThisRange => (int)Math.Pow(2, ThisRange.RangeID - 1));
                }

                return(returnMask);
            }
        }
Esempio n. 12
0
 public virtual bool IsInIpRange(string ip)
 {
     return(IpRanges.Count == 0 || IpRanges.Cast <IpRange>().Any(ipRange => ipRange.IsInRange(ip)));
 }