143 lines
3.4 KiB
PHP
143 lines
3.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Classes\LDAP\Schema;
|
||
|
|
||
|
use Illuminate\Support\Collection;
|
||
|
use Illuminate\Support\Facades\Log;
|
||
|
|
||
|
/**
|
||
|
* Represents an LDAP MatchingRule
|
||
|
*
|
||
|
* @package phpLDAPadmin
|
||
|
* @subpackage Schema
|
||
|
*/
|
||
|
class MatchingRule extends Base {
|
||
|
// This rule's syntax OID
|
||
|
private ?string $syntax = NULL;
|
||
|
|
||
|
// An array of attribute names who use this MatchingRule
|
||
|
private Collection $used_by_attrs;
|
||
|
|
||
|
/**
|
||
|
* Creates a new MatchingRule object from a raw LDAP MatchingRule string.
|
||
|
*/
|
||
|
function __construct(string $line) {
|
||
|
Log::debug(sprintf('Parsing MatchingRule [%s]',$line));
|
||
|
|
||
|
parent::__construct($line);
|
||
|
|
||
|
$strings = preg_split('/[\s,]+/',$line,-1,PREG_SPLIT_DELIM_CAPTURE);
|
||
|
|
||
|
// Init
|
||
|
$this->used_by_attrs = collect();
|
||
|
|
||
|
for ($i=0; $i<count($strings); $i++) {
|
||
|
switch ($strings[$i]) {
|
||
|
case '(':
|
||
|
case ')':
|
||
|
break;
|
||
|
|
||
|
case 'NAME':
|
||
|
if ($strings[$i+1] != '(') {
|
||
|
do {
|
||
|
$this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
|
||
|
|
||
|
} while (! preg_match("/\'$/s",$strings[$i]));
|
||
|
|
||
|
} else {
|
||
|
$i++;
|
||
|
|
||
|
do {
|
||
|
$this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
|
||
|
|
||
|
} while (! preg_match("/\'$/s",$strings[$i]));
|
||
|
|
||
|
do {
|
||
|
$i++;
|
||
|
|
||
|
} while (! preg_match('/\)+\)?/',$strings[$i]));
|
||
|
}
|
||
|
|
||
|
$this->name = preg_replace("/^\'/",'',$this->name);
|
||
|
$this->name = preg_replace("/\'$/",'',$this->name);
|
||
|
|
||
|
Log::debug(sprintf(sprintf('- Case NAME returned (%s)',$this->name)));
|
||
|
break;
|
||
|
|
||
|
case 'DESC':
|
||
|
do {
|
||
|
$this->description .= (strlen($this->description) ? ' ' : '').$strings[++$i];
|
||
|
|
||
|
} while (! preg_match("/\'$/s",$strings[$i]));
|
||
|
|
||
|
$this->description = preg_replace("/^\'(.*)\'$/",'$1',$this->description);
|
||
|
|
||
|
Log::debug(sprintf('- Case DESC returned (%s)',$this->description));
|
||
|
break;
|
||
|
|
||
|
case 'OBSOLETE':
|
||
|
$this->is_obsolete = TRUE;
|
||
|
|
||
|
Log::debug(sprintf('- Case OBSOLETE returned (%s)',$this->is_obsolete));
|
||
|
break;
|
||
|
|
||
|
case 'SYNTAX':
|
||
|
$this->syntax = $strings[++$i];
|
||
|
|
||
|
Log::debug(sprintf('- Case SYNTAX returned (%s)',$this->syntax));
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
|
||
|
$this->oid = $strings[$i];
|
||
|
Log::debug(sprintf('- Case default returned (%s)',$this->oid));
|
||
|
|
||
|
} elseif ($strings[$i])
|
||
|
Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function __get(string $key): mixed
|
||
|
{
|
||
|
switch ($key) {
|
||
|
case 'syntax': return $this->syntax;
|
||
|
case 'used_by_attrs': return $this->used_by_attrs;
|
||
|
|
||
|
default: return parent::__get($key);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an attribute name to the list of attributes who use this MatchingRule
|
||
|
*/
|
||
|
public function addUsedByAttr(string $name): void
|
||
|
{
|
||
|
$name = trim($name);
|
||
|
|
||
|
if ($this->used_by_attrs->search($name) === FALSE)
|
||
|
$this->used_by_attrs->push($name);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets an array of attribute names (strings) which use this MatchingRule
|
||
|
*
|
||
|
* @return array The array of attribute names (strings).
|
||
|
* @deprecated use $this->used_by_attrs
|
||
|
*/
|
||
|
public function getUsedByAttrs()
|
||
|
{
|
||
|
return $this->used_by_attrs;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the list of used_by_attrs to the array specified by $attrs;
|
||
|
*
|
||
|
* @param Collection $attrs The array of attribute names (strings) which use this MatchingRule
|
||
|
*/
|
||
|
public function setUsedByAttrs(Collection $attrs): void
|
||
|
{
|
||
|
$this->used_by_attrs = $attrs;
|
||
|
}
|
||
|
}
|