Added IpBlackListComponent

refs #4
This commit is contained in:
Chris Boden 2012-04-29 12:35:46 -04:00
parent b0d5274985
commit 6be16bea4a
3 changed files with 124 additions and 0 deletions

View File

@ -0,0 +1,81 @@
<?php
namespace Ratchet\Component\Server;
use Ratchet\Component\MessageComponentInterface;
use Ratchet\Resource\ConnectionInterface;
use Ratchet\Resource\Command\Action\CloseConnection;
class IpBlackListComponent implements MessageComponentInterface {
/**
* @var array
*/
protected $_blacklist = array();
/**
* @var Ratchet\Component\MessageComponentInterface
*/
protected $_decorating;
public function __construct(MessageComponentInterface $component) {
$this->_decorating = $component;
}
/**
* @param string IP address to block from connecting to yoru application
* @return IpBlackList
*/
public function blockAddress($ip) {
$this->_blacklist[$ip] = true;
return $this;
}
/**
* @param string IP address to unblock from connecting to yoru application
* @return IpBlackList
*/
public function unblockAddress($ip) {
unset($this->_blacklist[$ip]);
return $this;
}
/**
* Get an array of all the addresses blocked
* @return array
*/
public function getBlockedAddresses() {
return array_keys($this->_blacklist);
}
/**
* {@inheritdoc}
*/
function onOpen(ConnectionInterface $conn) {
if (isset($this->_blacklist[$conn->remoteAddress])) {
return new CloseConnection($conn);
}
return $this->_decorating->onOpen($conn);
}
/**
* {@inheritdoc}
*/
function onMessage(ConnectionInterface $from, $msg) {
return $this->_decorating->onMessage($from, $msg);
}
/**
* {@inheritdoc}
*/
function onClose(ConnectionInterface $conn) {
return $this->_decorating->onClose($conn);
}
/**
* {@inheritdoc}
*/
function onError(ConnectionInterface $conn, \Exception $e) {
return $this->_decorating->onError($conn, $e);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace Ratchet\Tests\Component\Server;
use Ratchet\Component\Server\IpBlackListComponent;
use Ratchet\Tests\Mock\Connection;
use Ratchet\Tests\Mock\Component as MockComponent;
/**
* @covers Ratchet\Component\Server\IpBlackList
*/
class IpBlackListComponentTest extends \PHPUnit_Framework_TestCase {
protected $_comp;
public function setUp() {
$this->_comp = new IpBlackListComponent(new MockComponent);
}
public function testBlockAndCloseOnOpen() {
$conn = new Connection;
$this->_comp->blockAddress($conn->remoteAddress);
$ret = $this->_comp->onOpen($conn);
$this->assertInstanceOf('\\Ratchet\\Resource\\Command\\Action\\CloseConnection', $ret);
}
public function testAddAndRemoveWithFluentInterfaces() {
$blockOne = '127.0.0.1';
$blockTwo = '192.168.1.1';
$unblock = '75.119.207.140';
$this->_comp->blockAddress($unblock)->blockAddress($blockOne)->unblockAddress($unblock)->blockAddress($blockTwo);
$this->assertEquals(array($blockOne, $blockTwo), $this->_comp->getBlockedAddresses());
}
}

View File

@ -0,0 +1,7 @@
<?php
namespace Ratchet\Tests\Mock;
use Ratchet\Resource\ConnectionInterface;
class Connection implements ConnectionInterface {
public $remoteAddress = '127.0.0.1';
}