84d2c02a09
Matching whitelisted bridges using a case-insensitive match makes sense for following reasons: - Wrong upper/lower case spelling in the whitelist is not easily discovered. Example: Misspelling 'Youtube' as 'YouTube' will not show the 'Youtube' bridge (while it is expected to show) - Two bridges with the same name but different letter casing are discouraged to prevent confusion and keep the project compatible with Windows machines
105 lines
2.6 KiB
PHP
105 lines
2.6 KiB
PHP
<?php
|
|
require_once(__DIR__ . '/BridgeInterface.php');
|
|
class Bridge {
|
|
|
|
static protected $dirBridge;
|
|
|
|
public function __construct(){
|
|
throw new \LogicException('Please use ' . __CLASS__ . '::create for new object.');
|
|
}
|
|
|
|
/**
|
|
* Checks if a bridge is an instantiable bridge.
|
|
* @param string $nameBridge name of the bridge that you want to use
|
|
* @return true if it is an instantiable bridge, false otherwise.
|
|
*/
|
|
static public function isInstantiable($nameBridge){
|
|
$re = new ReflectionClass($nameBridge);
|
|
return $re->IsInstantiable();
|
|
}
|
|
|
|
/**
|
|
* Create a new bridge object
|
|
* @param string $nameBridge Defined bridge name you want use
|
|
* @return Bridge object dedicated
|
|
*/
|
|
static public function create($nameBridge){
|
|
if(!preg_match('@^[A-Z][a-zA-Z0-9-]*$@', $nameBridge)) {
|
|
$message = <<<EOD
|
|
'nameBridge' must start with one uppercase character followed or not by
|
|
alphanumeric or dash characters!
|
|
EOD;
|
|
throw new \InvalidArgumentException($message);
|
|
}
|
|
|
|
$nameBridge = $nameBridge . 'Bridge';
|
|
$pathBridge = self::getDir() . $nameBridge . '.php';
|
|
|
|
if(!file_exists($pathBridge)) {
|
|
throw new \Exception('The bridge you looking for does not exist. It should be at path '
|
|
. $pathBridge);
|
|
}
|
|
|
|
require_once $pathBridge;
|
|
|
|
if(Bridge::isInstantiable($nameBridge)) {
|
|
return new $nameBridge();
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static public function setDir($dirBridge){
|
|
if(!is_string($dirBridge)) {
|
|
throw new \InvalidArgumentException('Dir bridge must be a string.');
|
|
}
|
|
|
|
if(!file_exists($dirBridge)) {
|
|
throw new \Exception('Dir bridge does not exist.');
|
|
}
|
|
|
|
self::$dirBridge = $dirBridge;
|
|
}
|
|
|
|
static public function getDir(){
|
|
$dirBridge = self::$dirBridge;
|
|
|
|
if(is_null($dirBridge)) {
|
|
throw new \LogicException(__CLASS__ . ' class need to know bridge path !');
|
|
}
|
|
|
|
return $dirBridge;
|
|
}
|
|
|
|
/**
|
|
* Lists the available bridges.
|
|
* @return array List of the bridges
|
|
*/
|
|
static public function listBridges(){
|
|
$pathDirBridge = self::getDir();
|
|
$listBridge = array();
|
|
$dirFiles = scandir($pathDirBridge);
|
|
|
|
if($dirFiles !== false) {
|
|
foreach($dirFiles as $fileName) {
|
|
if(preg_match('@^([^.]+)Bridge\.php$@U', $fileName, $out)) {
|
|
$listBridge[] = $out[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
return $listBridge;
|
|
}
|
|
|
|
static public function isWhitelisted($whitelist, $name){
|
|
if(in_array($name, $whitelist)
|
|
|| in_array($name . '.php', $whitelist)
|
|
|| in_array($name . 'bridge', $whitelist) // DEPRECATED
|
|
|| in_array($name . 'bridge.php', $whitelist) // DEPRECATED
|
|
|| (count($whitelist) === 1 && trim($whitelist[0]) === '*')) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|