Skip to content

Commit

Permalink
Simplified validation (#71)
Browse files Browse the repository at this point in the history
* dropped support for laravel 6
  • Loading branch information
arietimmerman authored Jun 26, 2024
1 parent 6a2b207 commit f72963d
Show file tree
Hide file tree
Showing 6 changed files with 18 additions and 69 deletions.
6 changes: 1 addition & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,8 @@ jobs:
strategy:
matrix:
php: [7.3, 7.4, 8.0, 8.1, 8.2]
laravel: [6.*, 7.*, 8.*, 9.*, 10.*, 11.*]
laravel: [7.*, 8.*, 9.*, 10.*, 11.*]
exclude:
- laravel: 6.*
php: 8.1
- laravel: 6.*
php: 8.2
- laravel: 7.*
php: 8.1
- laravel: 7.*
Expand Down
6 changes: 3 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
],
"require": {
"php": "^7.0|^8.0",
"illuminate/database": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/database": "^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/support": "^7.0|^8.0|^9.0|^10.0|^11.0",
"illuminate/console": "^7.0|^8.0|^9.0|^10.0|^11.0",
"tmilos/scim-schema": "^0.1.0",
"tmilos/scim-filter-parser": "^1.3"
},
Expand Down
2 changes: 1 addition & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 5 additions & 52 deletions src/Http/Controllers/ResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,72 +27,25 @@ protected static function isAllowed(PolicyDecisionPoint $pdp, Request $request,
return $pdp->isAllowed($request, $operation, $attributes, $resourceType, $resourceObject, $isMe);
}

protected static function replaceKeys(array $input)
{
$return = array();
foreach ($input as $key => $value) {
if (strpos($key, '_') > 0) {
$key = str_replace('___', '.', $key);
}

if (is_array($value)) {
$value = self::replaceKeys($value);
}

$return[$key] = $value;
}
return $return;
}

protected static function validateScim(ResourceType $resourceType, $flattened, ?Model $resourceObject)
{
$objectPreparedForValidation = [];
$validations = $resourceType->getValidations();
$simpleValidations = [];

/**
* Dots have a different meaning in SCIM and in Laravel's validation logic
*/
foreach ($flattened as $key => $value) {
$objectPreparedForValidation[preg_replace('/([^*])\.([^*])/', '${1}___${2}', $key)] = $value;
}

foreach ($validations as $key => $value) {
$simpleValidations[
preg_replace('/([^*])\.([^*])/', '${1}___${2}', $key)
] = !is_string($value) ? $value : ($resourceObject != null ? preg_replace('/,\[OBJECT_ID\]/', ',' . $resourceObject->id, $value) : str_replace(',[OBJECT_ID]', '', $value));
if (is_string($value)) {
$validations[$key] = $resourceObject ? preg_replace('/,\[OBJECT_ID\]/', ',' . $resourceObject->id, $value) : str_replace(',[OBJECT_ID]', '', $value);
}
}

$validator = Validator::make($objectPreparedForValidation, $simpleValidations);
$validator = Validator::make($flattened, $validations);

if ($validator->fails()) {
$e = $validator->errors();
$e = self::replaceKeys($e->toArray());

throw (new SCIMException('Invalid data!'))->setCode(400)->setScimType('invalidSyntax')->setErrors($e);
}

$validTemp = $validator->validate();
$valid = [];

$keys = collect($simpleValidations)->keys()->map(
function ($rule) {
return explode('.', $rule)[0];
}
)->unique()->toArray();

foreach ($keys as $key) {
if (array_key_exists($key, $validTemp)) {
$valid[$key] = $validTemp[$key];
}
}

$flattened = [];
foreach ($valid as $key => $value) {
$flattened[str_replace(['___'], ['.'], $key)] = $value;
}

return $flattened;
return $validator->validate();
}

public static function createFromSCIM($resourceType, $input, PolicyDecisionPoint $pdp = null, Request $request = null, $allowAlways = false, $isMe = false)
Expand Down
14 changes: 7 additions & 7 deletions src/SCIMConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ public function getUserConfig()

'validations' => [

'urn:ietf:params:scim:schemas:core:2.0:User:userName' => 'required',
'urn:ietf:params:scim:schemas:core:2.0:User:password' => 'nullable',
'urn:ietf:params:scim:schemas:core:2.0:User:active' => 'boolean',
'urn:ietf:params:scim:schemas:core:2.0:User:emails' => 'required|array',
'urn:ietf:params:scim:schemas:core:2.0:User:emails.*.value' => 'required|email',
'urn:ietf:params:scim:schemas:core:2.0:User:roles' => 'nullable|array',
'urn:ietf:params:scim:schemas:core:2.0:User:roles.*.value' => 'required',
'urn:ietf:params:scim:schemas:core:2\.0:User:userName' => 'required',
'urn:ietf:params:scim:schemas:core:2\.0:User:password' => 'nullable',
'urn:ietf:params:scim:schemas:core:2\.0:User:active' => 'boolean',
'urn:ietf:params:scim:schemas:core:2\.0:User:emails' => 'required|array',
'urn:ietf:params:scim:schemas:core:2\.0:User:emails.*.value' => 'required|email',
'urn:ietf:params:scim:schemas:core:2\.0:User:roles' => 'nullable|array',
'urn:ietf:params:scim:schemas:core:2\.0:User:roles.*.value' => 'required',

],

Expand Down
2 changes: 1 addition & 1 deletion tests/CustomSchemaTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public function getUserConfig()
$config = parent::getUserConfig();

$config['schemas'][] = 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User';
$config['validations']['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:employeeNumber'] = 'nullable';
$config['validations']['urn:ietf:params:scim:schemas:extension:enterprise:2\.0:User:employeeNumber'] = 'nullable';

$config['mapping']['urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'] = [
'employeeNumber' => AttributeMapping::eloquent("employeeNumber")
Expand Down

0 comments on commit f72963d

Please sign in to comment.