<?php
require_once(realpath(dirname(__FILE__).'/../../lib/php/nb.php'));
+require_once(NB_ROOT.'/lib/php/ldap.php');
require_once(NB_ROOT.'/lib/php/http.php');
if (isset($_SERVER['HTTP_HOST'])) {
$user = Http::user();
} else {
$filter = 'cn='.Http::user();
}
-
$filter = '(&('.$filter.')(userPassword=*))';
+
$DBQ['ldap'] = $GLOBALS['DBQ_LDAP'] + [
'name' => $base,
'title' => 'nbdom.net',
'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']);
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); };
} # < while rows
- if (!empty($st)) $st->closeCursor();
+ if (!empty($st) and !$fct_rows_prepare) $st->closeCursor();
if (!empty($cursor)) $cursor->closeCursor();
if (!$count) return;
'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);
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'],
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;
}
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'],
+ ];
+ }
}
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';