Exemplo n.º 1
0
        public void ClearAllHits()
        {
            Func <string> keyGenerator = () => { return("ClearAllHits" + GetRandomKey()); };
            var           keys         = new List <string>();
            var           random       = new Random((int)DateTime.Now.Ticks);
            var           startTime    = DateTime.Now;

            Parallel.For(0, 10,
                         hit =>
            {
                var key = keyGenerator();
                keys.Add(key);

                var hits = 1 + random.Next(Hacker.Config.MaxHitsPerKey - 1);

                for (var i = 0; i < hits; i++)
                {
                    Assert.AreEqual(
                        Hacker.Result.Allowed,
                        Hacker.DefendAsync(key, GetRandomIP()).Run(),
                        "Request must be allowed for a hit on a key");
                }

                Assert.AreEqual(hits, Hacker.GetHitsForKey(key).Run(),
                                "Number of hits must be " + hits + " for key: " + key);
            });

            Hacker.ClearAllHitsAsync().Run();

            foreach (var key in keys)
            {
                Assert.AreEqual(0, Hacker.GetHitsForKey(key).Run(),
                                "After clearing hits Number of hits must be 0 for key: " + key);
            }
        }
Exemplo n.º 2
0
        public void TestMaxHitsOnKeyPerOrigin()
        {
            Hacker.Config.MaxHitsPerKey          = 20;
            Hacker.Config.MaxHitsPerOrigin       = 20;
            Hacker.Config.MaxHitsPerKeyPerOrigin = 10;

            Func <string> keyGenerator = () => { return("TestMaxHitsOnKeyPerOrigin" + GetRandomKey()); };
            var           key          = keyGenerator();
            var           ip           = GetRandomIP();

            var startTime = DateTime.Now;

            Parallel.For(0, Hacker.Config.MaxHitsPerKeyPerOrigin,
                         hit =>
            {
                Assert.AreEqual(
                    Hacker.Result.Allowed,
                    Hacker.DefendAsync(key, ip).Run(),
                    "Allow hits on same key and IP");
            });

            Assert.AreEqual(
                Hacker.Config.MaxHitsPerKeyPerOrigin,
                Hacker.GetHitsForKey(key).Run(),
                "Number of hits recorded must match");

            // No more requests from same key and IP
            Assert.AreEqual(
                Hacker.Result.TooManyHitsOnKeyFromOrigin,
                Hacker.DefendAsync(key, ip).Run());

            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(keyGenerator(), ip).Run(),
                "From different key, same IP, allow");

            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(key, GetRandomIP()).Run(),
                "From different IP, same key, allow");

            WaitForIntervalToElapse(Hacker.Config.MaxHitsPerOriginInterval, startTime);

            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(key, ip).Run(),
                "Allow hits on same key and IP after expiration");
        }
Exemplo n.º 3
0
        public void TestMaxHitsPerKey()
        {
            Hacker.Config.MaxHitsPerKey          = 10;
            Hacker.Config.MaxHitsPerOrigin       = 20;
            Hacker.Config.MaxHitsPerKeyPerOrigin = 20;

            Func <string> keyGenerator = () => { return("TestMaxHitsPerKey" + GetRandomKey()); };
            var           fixedKey     = keyGenerator();

            var startTime = DateTime.Now;

            Parallel.For(0, Hacker.Config.MaxHitsPerKey,
                         hit =>
            {
                Assert.AreEqual(
                    Hacker.Result.Allowed,
                    Hacker.DefendAsync(fixedKey, GetRandomIP()).Run());
            });

            Assert.AreEqual(
                Hacker.Config.MaxHitsPerKey,
                Hacker.GetHitsForKey(fixedKey).Run(),
                "Number of hits recorded must match");

            Assert.AreEqual(
                Hacker.Result.TooManyHitsOnKey,
                Hacker.DefendAsync(fixedKey, GetRandomIP()).Run());

            var ip = GetRandomIP();

            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(keyGenerator(), ip).Run(),
                "Allow traffic from aonther key on same IP");

            WaitForIntervalToElapse(Hacker.Config.MaxHitsPerKeyInterval, startTime);

            // Hit from another IP using same key should be allowed
            Assert.AreEqual(
                Hacker.Result.Allowed,
                Hacker.DefendAsync(fixedKey, GetRandomIP()).Run(),
                "After expiration time, key must be unblocked");
        }