Skip to content

Commit ab4773c

Browse files
committed
Add IpAddress middleware for #519
1 parent 4b8ae24 commit ab4773c

File tree

4 files changed

+62
-33
lines changed

4 files changed

+62
-33
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ You can tune the middleware behavior using middleware specific configuration par
195195
- "authorization.columnHandler": Handler to implement column authorization rules ("")
196196
- "authorization.recordHandler": Handler to implement record authorization filter rules ("")
197197
- "validation.handler": Handler to implement validation rules for input values ("")
198-
- "ipAddress.column": Column to protect and override with the IP address on create ("")
198+
- "ipAddress.tables": Tables to search for columns to override with IP address ("")
199+
- "ipAddress.columns": Columns to protect and override with the IP address on create ("")
199200
- "sanitation.handler": Handler to implement sanitation rules for input values ("")
200201
- "multiTenancy.handler": Handler to implement simple multi-tenancy rules ("")
201202
- "pageLimits.pages": The maximum page number that a list operation allows ("100")

api.php

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3264,12 +3264,16 @@ public function __construct(Router $router, Responder $responder, array $propert
32643264
private function callHandler($record, String $operation, ReflectedTable $table) /*: object */
32653265
{
32663266
$context = (array) $record;
3267-
$columnName = $this->getProperty('column', '');
3268-
if ($table->hasColumn($columnName)) {
3269-
if ($operation == 'create') {
3270-
$context[$columnName] = $_SERVER['REMOTE_ADDR'];
3271-
} else {
3272-
unset($context[$columnName]);
3267+
$columnNames = $this->getProperty('columns', '');
3268+
if ($columnNames) {
3269+
foreach (explode(',', $columnNames) as $columnName) {
3270+
if ($table->hasColumn($columnName)) {
3271+
if ($operation == 'create') {
3272+
$context[$columnName] = $_SERVER['REMOTE_ADDR'];
3273+
} else {
3274+
unset($context[$columnName]);
3275+
}
3276+
}
32733277
}
32743278
}
32753279
return (object) $context;
@@ -3279,19 +3283,22 @@ public function handle(Request $request): Response
32793283
{
32803284
$operation = $this->utils->getOperation($request);
32813285
if (in_array($operation, ['create', 'update', 'increment'])) {
3286+
$tableNames = $this->getProperty('tables', '');
32823287
$tableName = $request->getPathSegment(2);
3283-
if ($this->reflection->hasTable($tableName)) {
3284-
$record = $request->getBody();
3285-
if ($record !== null) {
3286-
$table = $this->reflection->getTable($tableName);
3287-
if (is_array($record)) {
3288-
foreach ($record as &$r) {
3289-
$r = $this->callHandler($r, $operation, $table);
3288+
if (!$tableNames || in_array($tableName, explode(',', $tableNames))) {
3289+
if ($this->reflection->hasTable($tableName)) {
3290+
$record = $request->getBody();
3291+
if ($record !== null) {
3292+
$table = $this->reflection->getTable($tableName);
3293+
if (is_array($record)) {
3294+
foreach ($record as &$r) {
3295+
$r = $this->callHandler($r, $operation, $table);
3296+
}
3297+
} else {
3298+
$record = $this->callHandler($record, $operation, $table);
32903299
}
3291-
} else {
3292-
$record = $this->callHandler($record, $operation, $table);
3300+
$request->setBody($record);
32933301
}
3294-
$request->setBody($record);
32953302
}
32963303
}
32973304
}
@@ -3958,6 +3965,13 @@ private function setComponentSchema(String $tableName) /*: void*/
39583965
foreach ($properties as $key => $value) {
39593966
$this->openapi->set("$prefix|properties|$columnName|$key", $value);
39603967
}
3968+
if ($column->getPk()) {
3969+
$this->openapi->set("$prefix|properties|$columnName|x-primary-key", true);
3970+
}
3971+
$fk = $column->getFk();
3972+
if ($fk) {
3973+
$this->openapi->set("$prefix|properties|$columnName|x-references", $fk);
3974+
}
39613975
}
39623976
}
39633977
}

src/Tqdev/PhpCrudApi/Middleware/IpAddressMiddleware.php

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@ public function __construct(Router $router, Responder $responder, array $propert
2424
private function callHandler($record, String $operation, ReflectedTable $table) /*: object */
2525
{
2626
$context = (array) $record;
27-
$columnName = $this->getProperty('column', '');
28-
if ($table->hasColumn($columnName)) {
29-
if ($operation == 'create') {
30-
$context[$columnName] = $_SERVER['REMOTE_ADDR'];
31-
} else {
32-
unset($context[$columnName]);
27+
$columnNames = $this->getProperty('columns', '');
28+
if ($columnNames) {
29+
foreach (explode(',', $columnNames) as $columnName) {
30+
if ($table->hasColumn($columnName)) {
31+
if ($operation == 'create') {
32+
$context[$columnName] = $_SERVER['REMOTE_ADDR'];
33+
} else {
34+
unset($context[$columnName]);
35+
}
36+
}
3337
}
3438
}
3539
return (object) $context;
@@ -39,19 +43,22 @@ public function handle(Request $request): Response
3943
{
4044
$operation = $this->utils->getOperation($request);
4145
if (in_array($operation, ['create', 'update', 'increment'])) {
46+
$tableNames = $this->getProperty('tables', '');
4247
$tableName = $request->getPathSegment(2);
43-
if ($this->reflection->hasTable($tableName)) {
44-
$record = $request->getBody();
45-
if ($record !== null) {
46-
$table = $this->reflection->getTable($tableName);
47-
if (is_array($record)) {
48-
foreach ($record as &$r) {
49-
$r = $this->callHandler($r, $operation, $table);
48+
if (!$tableNames || in_array($tableName, explode(',', $tableNames))) {
49+
if ($this->reflection->hasTable($tableName)) {
50+
$record = $request->getBody();
51+
if ($record !== null) {
52+
$table = $this->reflection->getTable($tableName);
53+
if (is_array($record)) {
54+
foreach ($record as &$r) {
55+
$r = $this->callHandler($r, $operation, $table);
56+
}
57+
} else {
58+
$record = $this->callHandler($record, $operation, $table);
5059
}
51-
} else {
52-
$record = $this->callHandler($record, $operation, $table);
60+
$request->setBody($record);
5361
}
54-
$request->setBody($record);
5562
}
5663
}
5764
}

src/Tqdev/PhpCrudApi/OpenApi/OpenApiBuilder.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ private function setComponentSchema(String $tableName) /*: void*/
198198
foreach ($properties as $key => $value) {
199199
$this->openapi->set("$prefix|properties|$columnName|$key", $value);
200200
}
201+
if ($column->getPk()) {
202+
$this->openapi->set("$prefix|properties|$columnName|x-primary-key", true);
203+
}
204+
$fk = $column->getFk();
205+
if ($fk) {
206+
$this->openapi->set("$prefix|properties|$columnName|x-references", $fk);
207+
}
201208
}
202209
}
203210
}

0 commit comments

Comments
 (0)