111 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
			
		
		
	
	
			111 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
<?php
 | 
						|
 | 
						|
require_once dirname(__DIR__, 3) . '/app/classes/database.php';
 | 
						|
require_once dirname(__DIR__, 3) . '/app/classes/ratelimiter.php';
 | 
						|
require_once dirname(__DIR__, 3) . '/app/classes/log.php';
 | 
						|
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
 | 
						|
class RateLimiterTest extends TestCase
 | 
						|
{
 | 
						|
    private $rateLimiter;
 | 
						|
    private $db;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
 | 
						|
        // Set up in-memory SQLite database
 | 
						|
        $this->db = new Database([
 | 
						|
            'type' => 'sqlite',
 | 
						|
            'dbFile' => ':memory:'
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->rateLimiter = new RateLimiter($this->db);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testGetRecentAttempts()
 | 
						|
    {
 | 
						|
        $ip = '127.0.0.1';
 | 
						|
        $username = 'testuser';
 | 
						|
 | 
						|
        // Clean up any existing attempts first
 | 
						|
        $stmt = $this->db->getConnection()->prepare("DELETE FROM {$this->rateLimiter->authRatelimitTable} WHERE ip_address = ?");
 | 
						|
        $stmt->execute([$ip]);
 | 
						|
 | 
						|
        // Initially should have no attempts
 | 
						|
        $attempts = $this->rateLimiter->getRecentAttempts($ip);
 | 
						|
        $this->assertEquals(0, $attempts);
 | 
						|
 | 
						|
        // Add a login attempt
 | 
						|
        $stmt = $this->db->getConnection()->prepare("INSERT INTO {$this->rateLimiter->authRatelimitTable} (ip_address, username) VALUES (?, ?)");
 | 
						|
        $stmt->execute([$ip, $username]);
 | 
						|
 | 
						|
        // Should now have 1 attempt
 | 
						|
        $attempts = $this->rateLimiter->getRecentAttempts($ip);
 | 
						|
        $this->assertEquals(1, $attempts);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testIpBlacklisting()
 | 
						|
    {
 | 
						|
        $ip = '192.0.2.1'; // Using TEST-NET-1 range
 | 
						|
 | 
						|
        // Should be blacklisted by default (TEST-NET-1 range)
 | 
						|
        $this->assertTrue($this->rateLimiter->isIpBlacklisted($ip));
 | 
						|
 | 
						|
        // Test with non-blacklisted IP
 | 
						|
        $nonBlacklistedIp = '8.8.8.8'; // Google DNS
 | 
						|
        $this->assertFalse($this->rateLimiter->isIpBlacklisted($nonBlacklistedIp));
 | 
						|
 | 
						|
        // Add IP to blacklist
 | 
						|
        $stmt = $this->db->getConnection()->prepare("INSERT INTO {$this->rateLimiter->blacklistTable} (ip_address, reason) VALUES (?, ?)");
 | 
						|
        $stmt->execute([$nonBlacklistedIp, 'Test blacklist']);
 | 
						|
 | 
						|
        // IP should now be blacklisted
 | 
						|
        $this->assertTrue($this->rateLimiter->isIpBlacklisted($nonBlacklistedIp));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testIpWhitelisting()
 | 
						|
    {
 | 
						|
        $ip = '127.0.0.1'; // Localhost
 | 
						|
 | 
						|
        // Clean up any existing whitelist entries
 | 
						|
        $stmt = $this->db->getConnection()->prepare("DELETE FROM {$this->rateLimiter->whitelistTable} WHERE ip_address = ?");
 | 
						|
        $stmt->execute([$ip]);
 | 
						|
 | 
						|
        // Add to whitelist
 | 
						|
        $stmt = $this->db->getConnection()->prepare("INSERT INTO {$this->rateLimiter->whitelistTable} (ip_address, description) VALUES (?, ?)");
 | 
						|
        $stmt->execute([$ip, 'Test whitelist']);
 | 
						|
 | 
						|
        // Should be whitelisted
 | 
						|
        $this->assertTrue($this->rateLimiter->isIpWhitelisted($ip));
 | 
						|
 | 
						|
        // Test with non-whitelisted IP
 | 
						|
        $nonWhitelistedIp = '8.8.8.8'; // Google DNS
 | 
						|
        $this->assertFalse($this->rateLimiter->isIpWhitelisted($nonWhitelistedIp));
 | 
						|
 | 
						|
        // Add to whitelist
 | 
						|
        $stmt = $this->db->getConnection()->prepare("INSERT INTO {$this->rateLimiter->whitelistTable} (ip_address, description) VALUES (?, ?)");
 | 
						|
        $stmt->execute([$nonWhitelistedIp, 'Test whitelist']);
 | 
						|
 | 
						|
        // Should now be whitelisted
 | 
						|
        $this->assertTrue($this->rateLimiter->isIpWhitelisted($nonWhitelistedIp));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testIpRangeBlacklisting()
 | 
						|
    {
 | 
						|
        $ip = '8.8.8.8'; // Google DNS
 | 
						|
        $networkIp = '8.8.8.0/24'; // Network containing Google DNS
 | 
						|
 | 
						|
        // Initially IP should not be blacklisted
 | 
						|
        $this->assertFalse($this->rateLimiter->isIpBlacklisted($ip));
 | 
						|
 | 
						|
        // Add network to blacklist
 | 
						|
        $stmt = $this->db->getConnection()->prepare("INSERT INTO {$this->rateLimiter->blacklistTable} (ip_address, is_network, reason) VALUES (?, 1, ?)");
 | 
						|
        $stmt->execute([$networkIp, 'Test network blacklist']);
 | 
						|
 | 
						|
        // IP in range should now be blacklisted
 | 
						|
        $this->assertTrue($this->rateLimiter->isIpBlacklisted($ip));
 | 
						|
    }
 | 
						|
}
 |