Skip to content

Commit

Permalink
updates
Browse files Browse the repository at this point in the history
  • Loading branch information
arietimmerman committed Jul 4, 2024
1 parent af7009b commit b5bc551
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 80 deletions.
9 changes: 9 additions & 0 deletions src/Attribute/AbstractComplex.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,13 @@ public function getSubNode(string $key): ?Attribute
{
return collect($this->subAttributes)->first(fn ($element) => $element->name == $key);
}

public function generateSchema()
{
$base = parent::generateSchema();

$base['subAttributes'] = collect($this->subAttributes)->map(fn ($element) => $element->generateSchema())->toArray();

return $base;
}
}
6 changes: 4 additions & 2 deletions src/Attribute/Attribute.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class Attribute

protected $multiValued = false;
protected $mutability = 'readOnly';
protected $type = 'string';
protected $description = null;

public $dirty = false;

Expand Down Expand Up @@ -64,8 +66,8 @@ public function getValidations()
public function generateSchema(){
return [
'name' => $this->name,
'type' => 'string',
'mutability' => 'readWrite',
'type' => $this->type,
'mutability' => $this->mutability,
'returned' => 'default',
'uniqueness' => 'server',
'required' => $this->isRequired(),
Expand Down
6 changes: 5 additions & 1 deletion src/Attribute/Complex.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@ public function getSchemaNode(): ?Attribute
return collect($this->subAttributes)->first(fn ($element) => $element->schemaNode);
}

public function getSchemaNodes(){
return collect($this->subAttributes)->filter(fn ($element) => $element->schemaNode)->values()->toArray();
}

/**
* @return string[]
*/
public function getSchemas()
{
return collect($this->subAttributes)->filter(fn ($element) => $element->schemaNode)->map(fn ($element) => $element->name)->values()->toArray();
return $this->getSchemaNodes()->map(fn ($element) => $element->name)->values()->toArray();
}


Expand Down
29 changes: 29 additions & 0 deletions src/Attribute/Schema.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace ArieTimmerman\Laravel\SCIMServer\Attribute;

class Schema extends Complex
{

public function generateSchema()
{
return [
"schemas" => [
"urn:ietf:params:scim:schemas:core:2.0:Schema"
],
"id" => $this->name,
"meta" => [
"resourceType" => "Schema",
"created" => "2001-01-01T00:00:00+00:00",
"lastModified" => "2001-01-01T00:00:00+00:00",
"version" => 'W/"1"',
"location" => route('scim.schemas', ['id' => $this->name])
],
// name is substring after last occurence of :
"name" => substr($this->name, strrpos($this->name, ':') + 1),
"description" => $this->description,
"attributes" => collect($this->subAttributes)->map(fn ($element) => $element->generateSchema())->toArray()
];
}

}
23 changes: 7 additions & 16 deletions src/Http/Controllers/ResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,25 +118,17 @@ public function delete(Request $request, PolicyDecisionPoint $pdp, ResourceType
public function replace(Request $request, PolicyDecisionPoint $pdp, ResourceType $resourceType, Model $resourceObject, $isMe = false)
{
$originalRaw = Helper::objectToSCIMArray($resourceObject, $resourceType);
// $original = Helper::flatten($originalRaw, $resourceType->getSchema());

//TODO: get flattend from $resourceObject
// $flattened = Helper::flatten($request->input(), $resourceType->getSchema());
// $flattened = $this->validateScim($resourceType, $flattened, $resourceObject);

$resourceType->getMapping()->replace($request->input(), $resourceObject, null, true);

// $updated = [];
$newObject = Helper::flatten(Helper::objectToSCIMArray($resourceObject, $resourceType), $resourceType->getSchema());

// foreach ($flattened as $key => $value) {
// if (!isset($original[$key]) || json_encode($original[$key]) != json_encode($flattened[$key])) {
// $updated[$key] = $flattened[$key];
// }
// }
$flattened = $this->validateScim($resourceType, $newObject, $resourceObject);

// if (!self::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PUT, $updated, $resourceType, null)) {
// throw new SCIMException('This is not allowed');
// }
if (!self::isAllowed($pdp, $request, PolicyDecisionPoint::OPERATION_PATCH, $flattened, $resourceType, null)) {
throw new SCIMException('This is not allowed');
}

$resourceType->getMapping()->replace($request->input(), $resourceObject, null, true);
$resourceObject->save();

event(new Replace($resourceObject, $resourceType, $isMe, $request->input(), $originalRaw));
Expand Down Expand Up @@ -186,7 +178,6 @@ public function update(Request $request, PolicyDecisionPoint $pdp, ResourceType

$dirty = $resourceObject->getDirty();

// TODO: prevent something from getten written before ...
$newObject = Helper::flatten(Helper::objectToSCIMArray($resourceObject, $resourceType), $resourceType->getSchema());

$flattened = $this->validateScim($resourceType, $newObject, $resourceObject);
Expand Down
60 changes: 10 additions & 50 deletions src/Http/Controllers/SchemaController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,48 +9,29 @@

class SchemaController extends Controller
{
private $schemas = null;

public function getSchemas()
{

$this->generateSchema();
if ($this->schemas != null) {
return $this->schemas;
}

$config = resolve(SCIMConfig::class)->getConfig();

$schemaNodes = [];
$schemas = [];

foreach ($config as $key => $value) {
if ($key != 'Users' && $key != 'Groups') {
continue;
}

$value['map']->generateSchema();

foreach ($value['schema'] as $s) {
$schema = (new SchemaBuilderV2())->get($s);

if ($schema == null) {
continue;
throw new SCIMException("Schema not found");
}

$schema->getMeta()->setLocation(route('scim.schemas', ['id' => $schema->getId()]));

$schemas[] = $schema->serializeObject();
}
$schemaNodes = array_merge($schemaNodes, $value['map']->getSchemaNodes());
}

$this->schemas = collect($schemas);
foreach ($schemaNodes as $schemaNode) {
$schemas[] = $schemaNode->generateSchema();
}

return $this->schemas;
return $schemas;
}

public function show($id)
{
$result = $this->getSchemas()->first(
$result = collect($this->getSchemas())->first(
function ($value, $key) use ($id) {
return $value['id'] == $id;
}
Expand All @@ -65,28 +46,7 @@ function ($value, $key) use ($id) {

public function index()
{
return new ListResponse($this->getSchemas(), 1, $this->getSchemas()->count());
}

public function generateSchemaPart($value)
{
}

public function generateSchema()
{
$config = resolve(SCIMConfig::class)->getConfig();

$schemas = [];

foreach ($config as $key => $value) {
foreach ($value['mapping'] as $k => $v) {
// $key contains :
if (strpos($k, ':') !== false) {
foreach ($v as $attribute => $value) {
var_dump($attribute);
}
}
}
}
$schemas = collect($this->getSchemas());
return new ListResponse($schemas, 1, $schemas->count());
}
}
22 changes: 11 additions & 11 deletions src/SCIMConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use ArieTimmerman\Laravel\SCIMServer\Attribute\Constant;
use ArieTimmerman\Laravel\SCIMServer\Attribute\Eloquent;
use ArieTimmerman\Laravel\SCIMServer\Attribute\MutableCollection;
use ArieTimmerman\Laravel\SCIMServer\Attribute\Schema as AttributeSchema;
use ArieTimmerman\Laravel\SCIMServer\Exceptions\SCIMException;
use ArieTimmerman\Laravel\SCIMServer\Tests\Model\Group;
use Illuminate\Database\Eloquent\Model;
Expand All @@ -32,16 +33,15 @@ function eloquent($name, $attribute = null, $schemaNode = false): Attribute

class SCIMConfig
{

public function __construct()
{
}

public function getConfigForResource($name)
{
if ($name == 'Users') {
return $this->getUserConfig();
} elseif ($name == 'Groups') {
return $this->getGroupConfig();
} else {
$result = $this->getConfig();
return @$result[$name];
}
$result = $this->getConfig();
return @$result[$name];
}

public function getUserConfig()
Expand Down Expand Up @@ -90,7 +90,7 @@ public function read(&$object)
}),
new Constant('resourceType', 'User')
),
complex(Schema::SCHEMA_USER, true)->withSubAttributes(
(new AttributeSchema(Schema::SCHEMA_USER, true))->withSubAttributes(
eloquent('userName', 'name')->ensure('required'),
complex('name')->withSubAttributes(eloquent('formatted', 'name')),
eloquent('password')->ensure('nullable'),
Expand Down Expand Up @@ -136,7 +136,7 @@ public function read(&$object)
eloquent('display', 'name')
),
),
complex('urn:ietf:params:scim:schemas:extension:enterprise:2.0:User', true)->withSubAttributes(
(new AttributeSchema('urn:ietf:params:scim:schemas:extension:enterprise:2.0:User', true))->withSubAttributes(
eloquent('employeeNumber')->ensure('nullable')
)
),
Expand Down Expand Up @@ -188,7 +188,7 @@ public function read(&$object)
}),
new Constant('resourceType', 'User')
),
complex(Schema::SCHEMA_GROUP, true)->withSubAttributes(
(new AttributeSchema(Schema::SCHEMA_GROUP, true))->withSubAttributes(
eloquent('name')->ensure('required', 'min:3', function ($attribute, $value, $fail) {
// check if group does not exist or if it exists, it is the same group
$group = Group::where('name', $value)->first();
Expand Down

0 comments on commit b5bc551

Please sign in to comment.