Skip to content

Commit bc6b746

Browse files
committed
Fix for #850
1 parent ae7250f commit bc6b746

20 files changed

+313
-307
lines changed

api.include.php

Lines changed: 101 additions & 99 deletions
Large diffs are not rendered by default.

api.php

Lines changed: 101 additions & 99 deletions
Large diffs are not rendered by default.

src/Tqdev/PhpCrudApi/Api.php

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,69 +64,69 @@ public function __construct(Config $config)
6464
$reflection = new ReflectionService($db, $cache, $config->getCacheTime());
6565
$responder = new JsonResponder($config->getJsonOptions(), $config->getDebug());
6666
$router = new SimpleRouter($config->getBasePath(), $responder, $cache, $config->getCacheTime());
67-
foreach ($config->getMiddlewares() as $middleware => $properties) {
67+
foreach ($config->getMiddlewares() as $middleware) {
6868
switch ($middleware) {
6969
case 'sslRedirect':
70-
new SslRedirectMiddleware($router, $responder, $properties);
70+
new SslRedirectMiddleware($router, $responder, $config, $middleware);
7171
break;
7272
case 'cors':
73-
new CorsMiddleware($router, $responder, $properties, $config->getDebug());
73+
new CorsMiddleware($router, $responder, $config, $middleware);
7474
break;
7575
case 'firewall':
76-
new FirewallMiddleware($router, $responder, $properties);
76+
new FirewallMiddleware($router, $responder, $config, $middleware);
7777
break;
7878
case 'apiKeyAuth':
79-
new ApiKeyAuthMiddleware($router, $responder, $properties);
79+
new ApiKeyAuthMiddleware($router, $responder, $config, $middleware);
8080
break;
8181
case 'apiKeyDbAuth':
82-
new ApiKeyDbAuthMiddleware($router, $responder, $properties, $reflection, $db);
82+
new ApiKeyDbAuthMiddleware($router, $responder, $config, $middleware, $reflection, $db);
8383
break;
8484
case 'basicAuth':
85-
new BasicAuthMiddleware($router, $responder, $properties);
85+
new BasicAuthMiddleware($router, $responder, $config, $middleware);
8686
break;
8787
case 'jwtAuth':
88-
new JwtAuthMiddleware($router, $responder, $properties);
88+
new JwtAuthMiddleware($router, $responder, $config, $middleware);
8989
break;
9090
case 'dbAuth':
91-
new DbAuthMiddleware($router, $responder, $properties, $reflection, $db);
91+
new DbAuthMiddleware($router, $responder, $config, $middleware, $reflection, $db);
9292
break;
9393
case 'reconnect':
94-
new ReconnectMiddleware($router, $responder, $properties, $reflection, $db);
94+
new ReconnectMiddleware($router, $responder, $config, $middleware, $reflection, $db);
9595
break;
9696
case 'validation':
97-
new ValidationMiddleware($router, $responder, $properties, $reflection);
97+
new ValidationMiddleware($router, $responder, $config, $middleware, $reflection);
9898
break;
9999
case 'ipAddress':
100-
new IpAddressMiddleware($router, $responder, $properties, $reflection);
100+
new IpAddressMiddleware($router, $responder, $config, $middleware, $reflection);
101101
break;
102102
case 'sanitation':
103-
new SanitationMiddleware($router, $responder, $properties, $reflection);
103+
new SanitationMiddleware($router, $responder, $config, $middleware, $reflection);
104104
break;
105105
case 'multiTenancy':
106-
new MultiTenancyMiddleware($router, $responder, $properties, $reflection);
106+
new MultiTenancyMiddleware($router, $responder, $config, $middleware, $reflection);
107107
break;
108108
case 'authorization':
109-
new AuthorizationMiddleware($router, $responder, $properties, $reflection);
109+
new AuthorizationMiddleware($router, $responder, $config, $middleware, $reflection);
110110
break;
111111
case 'xsrf':
112-
new XsrfMiddleware($router, $responder, $properties);
112+
new XsrfMiddleware($router, $responder, $config, $middleware);
113113
break;
114114
case 'pageLimits':
115-
new PageLimitsMiddleware($router, $responder, $properties, $reflection);
115+
new PageLimitsMiddleware($router, $responder, $config, $middleware, $reflection);
116116
break;
117117
case 'joinLimits':
118-
new JoinLimitsMiddleware($router, $responder, $properties, $reflection);
118+
new JoinLimitsMiddleware($router, $responder, $config, $middleware, $reflection);
119119
break;
120120
case 'customization':
121-
new CustomizationMiddleware($router, $responder, $properties, $reflection);
121+
new CustomizationMiddleware($router, $responder, $config, $middleware, $reflection);
122122
break;
123123
case 'xml':
124-
new XmlMiddleware($router, $responder, $properties, $reflection);
124+
new XmlMiddleware($router, $responder, $config, $middleware, $reflection);
125125
break;
126126
case 'json':
127-
new JsonMiddleware($router, $responder, $properties);
127+
new JsonMiddleware($router, $responder, $config, $middleware);
128128
break;
129-
}
129+
}
130130
}
131131
foreach ($config->getControllers() as $controller) {
132132
switch ($controller) {
@@ -152,7 +152,7 @@ public function __construct(Config $config)
152152
break;
153153
case 'status':
154154
new StatusController($router, $responder, $cache, $db);
155-
break;
155+
break;
156156
}
157157
}
158158
foreach ($config->getCustomControllers() as $className) {

src/Tqdev/PhpCrudApi/Config.php

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -71,60 +71,44 @@ private function getDriverDefaults(string $driver): array
7171
];
7272
}
7373

74-
private function applyEnvironmentVariables(array $values, string $prefix = 'PHP_CRUD_API'): array
74+
private function getEnvironmentVariableName(string $key): string
7575
{
76-
$result = [];
77-
foreach ($values as $key => $value) {
78-
$suffix = strtoupper(preg_replace('/(?<!^)[A-Z]/', '_$0', str_replace('.', '_', $key)));
79-
$newPrefix = $prefix . "_" . $suffix;
80-
if (is_array($value)) {
81-
$newPrefix = str_replace('PHP_CRUD_API_MIDDLEWARES_','PHP_CRUD_API_',$newPrefix);
82-
$result[$key] = $this->applyEnvironmentVariables($value, $newPrefix);
83-
} else {
84-
$result[$key] = getenv($newPrefix, true) ?: $value;
85-
}
86-
}
87-
return $result;
76+
$prefix = "PHP_CRUD_API_";
77+
$suffix = strtoupper(preg_replace('/(?<!^)[A-Z]/', '_$0', str_replace('.', '_', $key)));
78+
return $prefix . $suffix;
8879
}
89-
90-
public function __construct(array $values)
80+
81+
public function getProperty(string $key, $default = '')
9182
{
92-
$driver = $this->getDefaultDriver($values);
93-
$defaults = $this->getDriverDefaults($driver);
94-
$newValues = array_merge($this->values, $defaults, $values);
95-
$newValues['middlewares'] = getenv('PHP_CRUD_API_MIDDLEWARES', true) ?: $newValues['middlewares'];
96-
$newValues = $this->parseMiddlewares($newValues);
97-
$diff = array_diff_key($newValues, $this->values);
98-
if (!empty($diff)) {
99-
$key = array_keys($diff)[0];
100-
throw new \Exception("Config has invalid value '$key'");
83+
if (strpos($key, 'Handler')) {
84+
return $this->values[$key] ?? $default;
10185
}
102-
$newValues = $this->applyEnvironmentVariables($newValues);
103-
$this->values = $newValues;
86+
$variableName = $this->getEnvironmentVariableName($key);
87+
return getenv($variableName, true) ?: ($this->values[$key] ?? $default);
10488
}
10589

106-
private function parseMiddlewares(array $values): array
90+
public function __construct(array $values)
10791
{
108-
$newValues = array();
109-
$properties = array();
110-
$middlewares = array_map('trim', explode(',', $values['middlewares']));
111-
foreach ($middlewares as $middleware) {
112-
$properties[$middleware] = [];
92+
$defaults = array_merge($this->values, $this->getDriverDefaults($this->getDefaultDriver($values)));
93+
foreach ($defaults as $key => $default) {
94+
$this->values[$key] = $values[$key] ?? $default;
95+
$this->values[$key] = $this->getProperty($key);
11396
}
97+
$this->values['middlewares'] = array_map('trim', explode(',', $this->values['middlewares']));
11498
foreach ($values as $key => $value) {
11599
if (strpos($key, '.') === false) {
116-
$newValues[$key] = $value;
100+
if (!isset($defaults[$key])) {
101+
throw new \Exception("Config has invalid key '$key'");
102+
}
117103
} else {
118-
list($middleware, $key2) = explode('.', $key, 2);
119-
if (isset($properties[$middleware])) {
120-
$properties[$middleware][$key2] = $value;
104+
$middleware = substr($key, 0, strpos($key, '.'));
105+
if (!in_array($middleware, $this->values['middlewares'])) {
106+
throw new \Exception("Config has invalid middleware key '$key'");
121107
} else {
122-
throw new \Exception("Config has invalid value '$key'");
108+
$this->values[$key] = $value;
123109
}
124110
}
125111
}
126-
$newValues['middlewares'] = array_reverse($properties, true);
127-
return $newValues;
128112
}
129113

130114
public function getDriver(): string
@@ -164,8 +148,10 @@ public function getTables(): array
164148

165149
public function getMapping(): array
166150
{
167-
$mapping = array_map(function($v){ return explode('=', $v); }, array_filter(array_map('trim', explode(',', $this->values['mapping']))));
168-
return array_combine(array_column($mapping,0),array_column($mapping,1));
151+
$mapping = array_map(function ($v) {
152+
return explode('=', $v);
153+
}, array_filter(array_map('trim', explode(',', $this->values['mapping']))));
154+
return array_combine(array_column($mapping, 0), array_column($mapping, 1));
169155
}
170156

171157
public function getMiddlewares(): array

src/Tqdev/PhpCrudApi/Middleware/ApiKeyDbAuthMiddleware.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Psr\Http\Message\ServerRequestInterface;
77
use Psr\Http\Server\RequestHandlerInterface;
88
use Tqdev\PhpCrudApi\Column\ReflectionService;
9+
use Tqdev\PhpCrudApi\Config;
910
use Tqdev\PhpCrudApi\Controller\Responder;
1011
use Tqdev\PhpCrudApi\Database\GenericDB;
1112
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
@@ -21,9 +22,9 @@ class ApiKeyDbAuthMiddleware extends Middleware
2122
private $db;
2223
private $ordering;
2324

24-
public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection, GenericDB $db)
25+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware, ReflectionService $reflection, GenericDB $db)
2526
{
26-
parent::__construct($router, $responder, $properties);
27+
parent::__construct($router, $responder, $config, $middleware);
2728
$this->reflection = $reflection;
2829
$this->db = $db;
2930
$this->ordering = new OrderingInfo();

src/Tqdev/PhpCrudApi/Middleware/AuthorizationMiddleware.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Psr\Http\Message\ServerRequestInterface;
77
use Psr\Http\Server\RequestHandlerInterface;
88
use Tqdev\PhpCrudApi\Column\ReflectionService;
9+
use Tqdev\PhpCrudApi\Config;
910
use Tqdev\PhpCrudApi\Controller\Responder;
1011
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
1112
use Tqdev\PhpCrudApi\Middleware\Communication\VariableStore;
@@ -18,9 +19,9 @@ class AuthorizationMiddleware extends Middleware
1819
{
1920
private $reflection;
2021

21-
public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
22+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware, ReflectionService $reflection)
2223
{
23-
parent::__construct($router, $responder, $properties);
24+
parent::__construct($router, $responder, $config, $middleware);
2425
$this->reflection = $reflection;
2526
}
2627

src/Tqdev/PhpCrudApi/Middleware/Base/Middleware.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@
33
namespace Tqdev\PhpCrudApi\Middleware\Base;
44

55
use Psr\Http\Server\MiddlewareInterface;
6+
use Tqdev\PhpCrudApi\Config;
67
use Tqdev\PhpCrudApi\Controller\Responder;
78
use Tqdev\PhpCrudApi\Middleware\Router\Router;
89

910
abstract class Middleware implements MiddlewareInterface
1011
{
1112
protected $next;
1213
protected $responder;
13-
private $properties;
14+
private $middleware;
15+
private $config;
1416

15-
public function __construct(Router $router, Responder $responder, array $properties)
17+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware)
1618
{
1719
$router->load($this);
1820
$this->responder = $responder;
19-
$this->properties = $properties;
21+
$this->middleware = $middleware;
22+
$this->config = $config;
2023
}
2124

2225
protected function getArrayProperty(string $key, string $default): array
@@ -41,6 +44,6 @@ protected function getMapProperty(string $key, string $default): array
4144

4245
protected function getProperty(string $key, $default)
4346
{
44-
return isset($this->properties[$key]) ? $this->properties[$key] : $default;
47+
return $this->config->getProperty($this->middleware . '.' . $key, $default);
4548
}
4649
}

src/Tqdev/PhpCrudApi/Middleware/CorsMiddleware.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Psr\Http\Message\ResponseInterface;
66
use Psr\Http\Message\ServerRequestInterface;
77
use Psr\Http\Server\RequestHandlerInterface;
8+
use Tqdev\PhpCrudApi\Config;
89
use Tqdev\PhpCrudApi\Controller\Responder;
910
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
1011
use Tqdev\PhpCrudApi\Middleware\Router\Router;
@@ -16,17 +17,17 @@ class CorsMiddleware extends Middleware
1617
{
1718
private $debug;
1819

19-
public function __construct(Router $router, Responder $responder, array $properties, bool $debug)
20+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware)
2021
{
21-
parent::__construct($router, $responder, $properties);
22-
$this->debug = $debug;
22+
parent::__construct($router, $responder, $config, $middleware);
23+
$this->debug = $config->getDebug();
2324
}
2425

2526
private function isOriginAllowed(string $origin, string $allowedOrigins): bool
2627
{
2728
$found = false;
2829
foreach (explode(',', $allowedOrigins) as $allowedOrigin) {
29-
$hostname = preg_quote(strtolower(trim($allowedOrigin)),'/');
30+
$hostname = preg_quote(strtolower(trim($allowedOrigin)), '/');
3031
$regex = '/^' . str_replace('\*', '.*', $hostname) . '$/';
3132
if (preg_match($regex, $origin)) {
3233
$found = true;

src/Tqdev/PhpCrudApi/Middleware/CustomizationMiddleware.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Psr\Http\Message\ServerRequestInterface;
77
use Psr\Http\Server\RequestHandlerInterface;
88
use Tqdev\PhpCrudApi\Column\ReflectionService;
9+
use Tqdev\PhpCrudApi\Config;
910
use Tqdev\PhpCrudApi\Controller\Responder;
1011
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
1112
use Tqdev\PhpCrudApi\Middleware\Router\Router;
@@ -15,9 +16,9 @@ class CustomizationMiddleware extends Middleware
1516
{
1617
private $reflection;
1718

18-
public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
19+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware, ReflectionService $reflection)
1920
{
20-
parent::__construct($router, $responder, $properties);
21+
parent::__construct($router, $responder, $config, $middleware);
2122
$this->reflection = $reflection;
2223
}
2324

src/Tqdev/PhpCrudApi/Middleware/DbAuthMiddleware.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Psr\Http\Message\ServerRequestInterface;
77
use Psr\Http\Server\RequestHandlerInterface;
88
use Tqdev\PhpCrudApi\Column\ReflectionService;
9+
use Tqdev\PhpCrudApi\Config;
910
use Tqdev\PhpCrudApi\Controller\Responder;
1011
use Tqdev\PhpCrudApi\Database\GenericDB;
1112
use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
@@ -21,9 +22,9 @@ class DbAuthMiddleware extends Middleware
2122
private $db;
2223
private $ordering;
2324

24-
public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection, GenericDB $db)
25+
public function __construct(Router $router, Responder $responder, Config $config, string $middleware, ReflectionService $reflection, GenericDB $db)
2526
{
26-
parent::__construct($router, $responder, $properties);
27+
parent::__construct($router, $responder, $config, $middleware);
2728
$this->reflection = $reflection;
2829
$this->db = $db;
2930
$this->ordering = new OrderingInfo();
@@ -113,7 +114,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
113114
return $this->responder->error(ErrorCode::PASSWORD_TOO_SHORT, $passwordLength);
114115
}
115116
$userColumns = $columnNames;
116-
if(!in_array($pkName, $columnNames)){
117+
if (!in_array($pkName, $columnNames)) {
117118
array_push($userColumns, $pkName);
118119
}
119120
$users = $this->db->selectAll($table, $userColumns, $condition, $columnOrdering, 0, 1);
@@ -125,7 +126,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
125126
$data = [$passwordColumnName => password_hash($newPassword, PASSWORD_DEFAULT)];
126127
$this->db->updateSingle($table, $data, $user[$pkName]);
127128
unset($user[$passwordColumnName]);
128-
if(!in_array($pkName, $columnNames)){
129+
if (!in_array($pkName, $columnNames)) {
129130
unset($user[$pkName]);
130131
}
131132
return $this->responder->success($user);

0 commit comments

Comments
 (0)