From 0fe4148600c2ad8d6d5a1b950b9ff8556efad6b1 Mon Sep 17 00:00:00 2001 From: Nicolas Boisselier Date: Tue, 6 Mar 2018 03:51:54 +0000 Subject: [PATCH] etc/dbq/ldap.php --- etc/dbq/ldap.php | 61 ++++----------------------- lib/php/db/table.php | 6 +-- lib/php/db/types/ldap.php | 6 +-- lib/php/ldap.php | 88 ++++++++++++++++++++++++++++++++++++++- www/dbq/dbq.php | 23 ++++++---- 5 files changed, 115 insertions(+), 69 deletions(-) diff --git a/etc/dbq/ldap.php b/etc/dbq/ldap.php index 5cee7fd8..3e248564 100644 --- a/etc/dbq/ldap.php +++ b/etc/dbq/ldap.php @@ -1,5 +1,6 @@ $base, 'title' => 'nbdom.net', @@ -63,58 +64,12 @@ $DBQ['ldap'] = $GLOBALS['DBQ_LDAP'] + [ 'sql' => 'objectClass=*', 'fields' => ['!dn','objectClass','cn'], ], - 'person' => [ - 'type' => 'table', - 'sql' => 'objectClass=person', - 'fields' => ['!dn', 'cn', 'sn', 'userPassword','telephoneNumber', 'description', 'seeAlso'], - ], - 'inetOrgPerson' => [ - 'type' => 'table', - 'sql' => 'objectClass=inetOrgPerson', - 'fields' => [ - '!dn', - 'cn', - 'dn', - 'sn', - 'displayName', - 'givenName', - #'audio', - #'businessCategory', - 'carLicense', - #'departmentNumber', - #'employeeNumber', - #'employeeType', - 'homePhone', - 'homePostalAddress', - 'initials', - 'jpegPhoto', - #'labeledURI', - 'mail', - #'manager', - 'mobile', - 'o', - #'pager', - #'photo', - #'roomNumber', - #'secretary', - #'userCertificate', - #'x500uniqueIdentifier', - #'preferredLanguage', - #'userSMIMECertificate', - #'userPKCS12', - ], - ], - 'posixAccount' => [ - 'type' => 'table', - 'sql' => 'objectClass=posixAccount', - 'fields' => ['!dn', 'cn', 'uid', 'gidNumber', 'homeDirectory','loginShell', 'description', 'userPassword'], - ], - 'posixGroup' => [ - 'type' => 'table', - 'sql' => 'objectClass=posixGroup', - 'fields' => ['!dn', 'cn', 'gidNumber', 'memberUid', 'description', 'userPassword'], - ], - ], + 'person' => Ldap::person(), + 'inetOrgPerson' => Ldap::inetOrgPerson(), + 'posixAccount' => Ldap::posixAccount(), + 'posixGroup' => Ldap::posixGroup(), + ] + , 'default_table' => 'me', ]; #debug($GLOBALS['DBQ_LDAP']); diff --git a/lib/php/db/table.php b/lib/php/db/table.php index 2e8df04c..9f3eea6f 100644 --- a/lib/php/db/table.php +++ b/lib/php/db/table.php @@ -1135,8 +1135,8 @@ Class Table extends nb { if ($nosql) { $sql = empty($this->sql) ? $this->name : $this->sql; - $fct = $this->db()->conf_type('rows_prepare'); - if ($fct) $st = $fct($this,$sql); + $fct_rows_prepare = $this->db()->conf_type('rows_prepare'); + if ($fct_rows_prepare) $st = $fct_rows_prepare($this,$sql); if (!$fct = $this->db()->conf_type('rows_fetch')) { $fct = function() use($st) { return $st->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT); }; @@ -1286,7 +1286,7 @@ Class Table extends nb { } # < while rows - if (!empty($st)) $st->closeCursor(); + if (!empty($st) and !$fct_rows_prepare) $st->closeCursor(); if (!empty($cursor)) $cursor->closeCursor(); if (!$count) return; diff --git a/lib/php/db/types/ldap.php b/lib/php/db/types/ldap.php index c059165e..354825bd 100644 --- a/lib/php/db/types/ldap.php +++ b/lib/php/db/types/ldap.php @@ -22,13 +22,9 @@ $DB_TYPES['ldap'] = [ 'rows_prepare' => function($table,$sql) { $fields = (empty($table->fields_only) ? array_keys($table->fields()) : $table->fields_only); $table->replace_fields($fields); - #debug(array_keys($table->fields())); - #foreach (array_keys($table->fields) as $k) { if (!in_array($k,$fields)) unset($table->fields[$k]); } $table->db()->ldap->prepare($sql,['attrs'=>$fields]); return $table->db()->ldap; }, 'rows_fetch' => function($table) { - #debug($table->fields_only); - #debug($table->fields_only); $row = $table->db()->ldap->fetch(); if (!$row) return []; $fields = (empty($table->fields_only) ? array_keys($table->fields()) : $table->fields_only); @@ -62,7 +58,7 @@ $DB_TYPES['ldap'] = [ foreach ($m[1] as $v) { $row['objectClass'][] = $v; } - $row['dn'] = 'cn=,'.$table->db()->name; + $row['dn'] = 'cn=CHANGEME,'.$table->db()->ldap->base(); } else { $table->db()->ldap->prepare([ 'base' => $values['dn'], diff --git a/lib/php/ldap.php b/lib/php/ldap.php index 7937be6d..de8e9595 100644 --- a/lib/php/ldap.php +++ b/lib/php/ldap.php @@ -14,6 +14,8 @@ class Ldap { private $read; private $entry; + public function base() { return $this->base; } + public function __construct($opt = []) { foreach ($opt as $k => $v) if ((string)$v !== '') $this->$k = $v; } @@ -211,5 +213,89 @@ class Ldap { public function _fields_keys(&$others=[]) { return $this->fields('dn'); } - public function closeCursor() {} + + public function parseDn($dn) { + // From https://secure.php.net/manual/en/function.ldap-explode-dn.php + $parsr=ldap_explode_dn($dn, 0); + //$parsr[] = 'EE=Sôme Krazï string'; + //$parsr[] = 'AndBogusOne'; + $out = array(); + foreach($parsr as $key=>$value){ + if(FALSE !== strstr($value, '=')){ + list($prefix,$data) = explode("=",$value); + $data=preg_replace("/\\\\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\\\1')).''", $data); + if(isset($current_prefix) && $prefix == $current_prefix){ + $out[$prefix][] = $data; + } else { + $current_prefix = $prefix; + $out[$prefix][] = $data; + } + } + } + return $out; + } + +# NB 06.03.18 public function closeCursor() {} + public static function posixGroup() { + return [ + 'type' => 'table', + 'sql' => 'objectClass=posixGroup', + 'fields' => ['!dn', 'cn', 'gidNumber', 'memberUid', 'description', 'userPassword'], + ]; + } + + public static function posixAccount() { + return [ + 'type' => 'table', + 'sql' => 'objectClass=posixAccount', + 'fields' => ['!dn', 'cn', 'uid', 'gidNumber', 'homeDirectory','loginShell', 'description', 'userPassword'], + ]; + } + + public static function inetOrgPerson() { + return [ + 'type' => 'table', + 'sql' => 'objectClass=inetOrgPerson', + 'fields' => [ + '!dn', + 'cn', + 'dn', + 'sn', + 'displayName', + 'givenName', + #'audio', + #'businessCategory', + 'carLicense', + #'departmentNumber', + #'employeeNumber', + #'employeeType', + 'homePhone', + 'homePostalAddress', + 'initials', + 'jpegPhoto', + #'labeledURI', + 'mail', + #'manager', + 'mobile', + 'o', + #'pager', + #'photo', + #'roomNumber', + #'secretary', + #'userCertificate', + #'x500uniqueIdentifier', + #'preferredLanguage', + #'userSMIMECertificate', + #'userPKCS12', + ], + ]; + } + + public static function person() { + return [ + 'type' => 'table', + 'sql' => 'objectClass=person', + 'fields' => ['!dn', 'cn', 'sn', 'userPassword','telephoneNumber', 'description', 'seeAlso'], + ]; + } } diff --git a/www/dbq/dbq.php b/www/dbq/dbq.php index a63c2f86..20b52a7c 100644 --- a/www/dbq/dbq.php +++ b/www/dbq/dbq.php @@ -24,16 +24,25 @@ class DbQ extends nb { const ACTIONS_NO_TITLE = ['ls','vi']; const PARAM_DB_DEFAULT = 'ls'; - const READ = 1; - const WRITE = 3; - const DELETE = 4; - const ADMIN = 9; + const READ = 9; + + const ADD = 13; + const UPDATE = 15; + const WRITE = 19; + + const DELETE = 29; + + const ADMIN = 99; public $perm = self::ADMIN; public $perms = [ # keys in lowercase !!!! - 'admin' => self::ADMIN, - 'delete' => self::DELETE, - 'write' => self::WRITE, 'read' => self::READ, + + 'add' => self::ADD, + 'update' => self::UPDATE, + 'write' => self::WRITE, + + 'delete' => self::DELETE, + 'admin' => self::ADMIN, ]; public $title = 'Dbq'; -- 2.47.3