For the schema browser, highlight structural object classes when showing attributes. Expose objectclass objects instead of names for objectclasses of a DN

This commit is contained in:
Deon George 2025-01-19 22:01:20 +11:00
parent 05012c9e6c
commit 4dfebe9053
4 changed files with 29 additions and 18 deletions

View File

@ -5,27 +5,31 @@ namespace App\Classes\LDAP\Attribute;
use Illuminate\Contracts\View\View; use Illuminate\Contracts\View\View;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use App\Classes\LDAP\{Attribute,Server}; use App\Classes\LDAP\Attribute;
/** /**
* Represents an ObjectClass Attribute * Represents an ObjectClass Attribute
*/ */
final class ObjectClass extends Attribute final class ObjectClass extends Attribute
{ {
// Which of the values is the structural object class // The schema ObjectClasses for this objectclass of a DN
protected Collection $structural; protected Collection $oc_schema;
public function __construct(string $name,array $values) public function __construct(string $name,array $values)
{ {
parent::__construct($name,$values); parent::__construct($name,$values);
$this->structural = collect(); $this->oc_schema = config('server')
->schema('objectclasses')
->filter(fn($item)=>$this->values->contains($item->name));
}
// Determine which of the values is the structural objectclass public function __get(string $key): mixed
foreach ($values as $oc) { {
if ((new Server)->schema('objectclasses',$oc)->isStructural()) return match ($key) {
$this->structural->push($oc); 'structural' => $this->oc_schema->filter(fn($item) => $item->isStructural()),
} default => parent::__get($key),
};
} }
/** /**
@ -36,7 +40,9 @@ final class ObjectClass extends Attribute
*/ */
public function isStructural(string $value): bool public function isStructural(string $value): bool
{ {
return $this->structural->contains($value); return $this->structural
->map(fn($item)=>$item->name)
->contains($value);
} }
public function render(bool $edit=FALSE,bool $old=FALSE,bool $new=FALSE): View public function render(bool $edit=FALSE,bool $old=FALSE,bool $new=FALSE): View

View File

@ -334,10 +334,10 @@ final class AttributeType extends Base {
* *
* @param string $name The name of the objectClass to add. * @param string $name The name of the objectClass to add.
*/ */
public function addUsedInObjectClass(string $name): void public function addUsedInObjectClass(string $name,bool $structural): void
{ {
if (! $this->used_in_object_classes->contains($name)) if (! $this->used_in_object_classes->has($name))
$this->used_in_object_classes->push($name); $this->used_in_object_classes->put($name,$structural);
} }
/** /**

View File

@ -442,7 +442,7 @@ final class Server
// Add Used In. // Add Used In.
foreach ($oclass_attrs as $attr_name) foreach ($oclass_attrs as $attr_name)
if ($this->attributetypes->has(strtolower($attr_name))) if ($this->attributetypes->has(strtolower($attr_name)))
$this->attributetypes[strtolower($attr_name)]->addUsedInObjectClass($object_class->name); $this->attributetypes[strtolower($attr_name)]->addUsedInObjectClass($object_class->name,$object_class->isStructural());
// Add Required By. // Add Required By.
foreach ($must_attrs as $attr_name) foreach ($must_attrs as $attr_name)

View File

@ -90,16 +90,21 @@
</tr> </tr>
<tr> <tr>
<td>@lang('Used by ObjectClasses')</td> <td>@lang('Used by ObjectClasses')</td>
<td><strong> <td>
@if ($o->used_in_object_classes->count()) @if ($o->used_in_object_classes->count())
@foreach ($o->used_in_object_classes as $class) @foreach ($o->used_in_object_classes as $class => $structural)
@if ($loop->index)</strong> <strong>@endif @if($structural)
<strong>
@endif
<a class="objectclass" id="{{ strtolower($class) }}" href="#{{ strtolower($class) }}">{{ $class }}</a> <a class="objectclass" id="{{ strtolower($class) }}" href="#{{ strtolower($class) }}">{{ $class }}</a>
@if($structural)
</strong>
@endif
@endforeach @endforeach
@else @else
@lang('(none)') @lang('(none)')
@endif @endif
</strong></td> </td>
</tr> </tr>
<tr> <tr>
<td>@lang('Force as MAY by config')</td><td><strong>@lang($o->forced_as_may ? 'Yes' : 'No')</strong></td> <td>@lang('Force as MAY by config')</td><td><strong>@lang($o->forced_as_may ? 'Yes' : 'No')</strong></td>