From b1d153aa9f54a4a901bbd9c4162dfa37782ef23e Mon Sep 17 00:00:00 2001 From: Deon George Date: Thu, 10 Apr 2025 22:08:18 +1000 Subject: [PATCH] Change Attribute/UserCertificate into Syntax/Certificate for any Certificate attributes. Add Syntax/CertificateList. --- app/Classes/LDAP/Attribute.php | 26 +++++++++++--- .../{UserCertificate.php => Certificate.php} | 7 +--- .../LDAP/Attribute/CertificateList.php | 17 ++++++++++ app/Classes/LDAP/Attribute/Factory.php | 5 ++- public/js/custom.js | 2 ++ .../attribute/widget/options.blade.php | 34 ++++++++++--------- .../certificate.blade.php} | 7 ++-- .../syntax/certificatelist.blade.php | 7 ++++ 8 files changed, 76 insertions(+), 29 deletions(-) rename app/Classes/LDAP/Attribute/{UserCertificate.php => Certificate.php} (84%) create mode 100644 app/Classes/LDAP/Attribute/CertificateList.php rename resources/views/components/{attribute/usercertificate.blade.php => syntax/certificate.blade.php} (82%) create mode 100644 resources/views/components/syntax/certificatelist.blade.php diff --git a/app/Classes/LDAP/Attribute.php b/app/Classes/LDAP/Attribute.php index 85c3d56d..2d8a8bc9 100644 --- a/app/Classes/LDAP/Attribute.php +++ b/app/Classes/LDAP/Attribute.php @@ -37,6 +37,9 @@ class Attribute implements \Countable, \ArrayAccess // The objectclasses of the entry that has this attribute protected(set) Collection $oc; + private const SYNTAX_CERTIFICATE = '1.3.6.1.4.1.1466.115.121.1.8'; + private const SYNTAX_CERTIFICATE_LIST = '1.3.6.1.4.1.1466.115.121.1.9'; + /* # Has the attribute been modified protected $modified = false; @@ -123,6 +126,11 @@ class Attribute implements \Countable, \ArrayAccess */ } + public function __call(string $name,array $arguments) + { + abort(555,'Method not handled: '.$name); + } + public function __get(string $key): mixed { return match ($key) { @@ -303,9 +311,14 @@ class Attribute implements \Countable, \ArrayAccess */ public function render(bool $edit=FALSE,bool $old=FALSE,bool $new=FALSE): View { - $view = view()->exists($x='components.attribute.'.$this->name_lc) - ? view($x) - : view('components.attribute'); + $view = match ($this->schema->syntax_oid) { + self::SYNTAX_CERTIFICATE => view('components.syntax.certificate'), + self::SYNTAX_CERTIFICATE_LIST => view('components.syntax.certificatelist'), + + default => view()->exists($x = 'components.attribute.' . $this->name_lc) + ? view($x) + : view('components.attribute'), + }; return $view ->with('o',$this) @@ -316,7 +329,12 @@ class Attribute implements \Countable, \ArrayAccess public function render_item_old(string $dotkey): ?string { - return Arr::get($this->values_old->dot(),$dotkey); + return match ($this->schema->syntax_oid) { + self::SYNTAX_CERTIFICATE => join("\n",str_split(base64_encode(Arr::get($this->values_old->dot(),$dotkey)),80)), + self::SYNTAX_CERTIFICATE_LIST => join("\n",str_split(base64_encode(Arr::get($this->values_old->dot(),$dotkey)),80)), + + default => Arr::get($this->values_old->dot(),$dotkey), + }; } public function render_item_new(string $dotkey): ?string diff --git a/app/Classes/LDAP/Attribute/UserCertificate.php b/app/Classes/LDAP/Attribute/Certificate.php similarity index 84% rename from app/Classes/LDAP/Attribute/UserCertificate.php rename to app/Classes/LDAP/Attribute/Certificate.php index eba299bb..95908db8 100644 --- a/app/Classes/LDAP/Attribute/UserCertificate.php +++ b/app/Classes/LDAP/Attribute/Certificate.php @@ -11,7 +11,7 @@ use App\Traits\MD5Updates; /** * Represents an attribute whose values is a binary user certificate */ -final class UserCertificate extends Attribute +final class Certificate extends Attribute { use MD5Updates; @@ -38,11 +38,6 @@ final class UserCertificate extends Attribute return Carbon::createFromTimestampUTC($this->cert_info('validTo_time_t',$key)); } - public function render_item_old(string $dotkey): ?string - { - return join("\n",str_split(base64_encode(parent::render_item_old($dotkey)),80)); - } - public function subject($key=0): string { $subject = collect($this->cert_info('subject',$key))->reverse(); diff --git a/app/Classes/LDAP/Attribute/CertificateList.php b/app/Classes/LDAP/Attribute/CertificateList.php new file mode 100644 index 00000000..8a56beaf --- /dev/null +++ b/app/Classes/LDAP/Attribute/CertificateList.php @@ -0,0 +1,17 @@ + CertificateList::class, + 'cacertificate' => Certificate::class, + 'certificaterevocationlist' => CertificateList::class, 'createtimestamp' => Internal\Timestamp::class, 'creatorsname' => Internal\DN::class, 'configcontext' => Schema\Generic::class, @@ -52,7 +55,7 @@ class Factory 'supportedfeatures' => Schema\OID::class, 'supportedldapversion' => Schema\Generic::class, 'supportedsaslmechanisms' => Schema\Mechanisms::class, - 'usercertificate' => UserCertificate::class, + 'usercertificate' => Certificate::class, 'userpassword' => Password::class, ]; diff --git a/public/js/custom.js b/public/js/custom.js index 0fa1e07f..75c1af3f 100644 --- a/public/js/custom.js +++ b/public/js/custom.js @@ -44,8 +44,10 @@ function getNode(item) { location.reload(); break; case 500: + case 555: // Missing Method $('.main-content').empty().append(e.responseText); break; + default: alert('Well that didnt work? Code ['+e.status+']'); } diff --git a/resources/views/components/attribute/widget/options.blade.php b/resources/views/components/attribute/widget/options.blade.php index 2b0d32e7..5fad0b42 100644 --- a/resources/views/components/attribute/widget/options.blade.php +++ b/resources/views/components/attribute/widget/options.blade.php @@ -1,12 +1,29 @@ +@use(App\Classes\LDAP\Attribute\Certificate) +@use(App\Classes\LDAP\Attribute\CertificateList) @use(App\Classes\LDAP\Attribute\Binary\JpegPhoto) @use(App\Classes\LDAP\Attribute\ObjectClass) -@use(App\Classes\LDAP\Attribute\UserCertificate) @php($clone=FALSE) @if($o->is_rdn) @elseif($edit && $o->can_addvalues) @switch(get_class($o)) + @case(Certificate::class) + @case(CertificateList::class) + (! $new)]) id="{{ $o->name }}-replace" disabled> @lang('Replace') + @section('page-scripts') + + @append + @break + @case(ObjectClass::class) (! $new)]) data-bs-toggle="modal" data-bs-target="#new_objectclass-modal"> @lang('Add Objectclass') @@ -230,21 +247,6 @@ @append @break - @case(UserCertificate::class) - (! $new)]) id="{{ $o->name }}-replace" disabled> @lang('Replace Certificate') - @section('page-scripts') - - @append - @break - @default @if($o->isDynamic()) @break @endif diff --git a/resources/views/components/attribute/usercertificate.blade.php b/resources/views/components/syntax/certificate.blade.php similarity index 82% rename from resources/views/components/attribute/usercertificate.blade.php rename to resources/views/components/syntax/certificate.blade.php index c0e991df..a8ec4155 100644 --- a/resources/views/components/attribute/usercertificate.blade.php +++ b/resources/views/components/syntax/certificate.blade.php @@ -1,7 +1,10 @@ - +@use(App\Classes\LDAP\Attribute\Certificate) + + @foreach($o->tagValuesOld('binary') as $key => $value) - @if($edit) + + @if(($o instanceof Certificate) && $edit)
diff --git a/resources/views/components/syntax/certificatelist.blade.php b/resources/views/components/syntax/certificatelist.blade.php new file mode 100644 index 00000000..11686ca9 --- /dev/null +++ b/resources/views/components/syntax/certificatelist.blade.php @@ -0,0 +1,7 @@ + + + @foreach($o->tagValuesOld('binary') as $key => $value) + +
{{ $o->render_item_old('binary.'.$key) }}
+ @endforeach +
\ No newline at end of file