X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_ldap.inc;h=6ae00e89623831ee284932bf2f6f8a8f13cb2410;hb=2dd0610553775a07cd552ccdcbbf650a18794a8c;hp=911da4b003ab7b5d8ac93f7dcb4556ee7e89a326;hpb=c5fdf87c3b0f20e0f1c30e6915b2d605b5d11512;p=gosa.git diff --git a/include/class_ldap.inc b/include/class_ldap.inc index 911da4b00..6ae00e896 100644 --- a/include/class_ldap.inc +++ b/include/class_ldap.inc @@ -573,7 +573,7 @@ class LDAP{ } if($this->error != "Success"){ - /* Some error occured */ + /* Some error occurred */ print "---------------------------------------------"; print $this->get_error()."
"; print $sourcedn."
"; @@ -642,19 +642,26 @@ class LDAP{ function create_missing_trees($target) { - /* Ignore create_missing trees if the base equals target */ - if ($target == $this->basedn){ - return; - } + global $config; $real_path= substr($target, 0, strlen($target) - strlen($this->basedn) -1 ); - $l= array_reverse(gosa_ldap_explode_dn($real_path)); + + if ($target == $this->basedn){ + $l= array("dummy"); + } else { + $l= array_reverse(gosa_ldap_explode_dn($real_path)); + } unset($l['count']); $cdn= $this->basedn; $tag= ""; + /* Load schema if available... */ + $classes= $this->get_objectclasses(); + foreach ($l as $part){ - $cdn= "$part,$cdn"; + if ($part != "dummy"){ + $cdn= "$part,$cdn"; + } /* Ignore referrals */ $found= false; @@ -685,36 +692,98 @@ class LDAP{ $param= preg_replace('/^[^=]+=([^,]+),.*$/', '\\1', $cdn); $na= array(); - switch ($type){ - case 'ou': - if ($tag != ""){ - $na["objectClass"]= array("organizationalUnit", "gosaAdministrativeUnitTag"); - $na["gosaUnitTag"]= $tag; - } else { - $na["objectClass"]= "organizationalUnit"; - } - $na["ou"]= $param; - break; - case 'dc': - if ($tag != ""){ - $na["objectClass"]= array("dcObject", "top", "locality", "gosaAdministrativeUnitTag"); - $na["gosaUnitTag"]= $tag; - } else { - $na["objectClass"]= array("dcObject", "top", "locality"); + + /* Automatic or traditional? */ + if(count($classes)){ + + /* Get name of first matching objectClass */ + $ocname= ""; + foreach($classes as $class){ + if (isset($class['MUST']) && $class['MUST'] == "$type"){ + + /* Look for first classes that is structural... */ + if (isset($class['STRUCTURAL'])){ + $ocname= $class['NAME']; + break; + } + + /* Look for classes that are auxiliary... */ + if (isset($class['AUXILIARY'])){ + $ocname= $class['NAME']; + } } - $na["dc"]= $param; - break; - default: - print_red(sprintf(_("Autocreation of type '%s' is currently not supported. Please report to the GOsa team."), $type)); + } + + /* Bail out, if we've nothing to do... */ + if ($ocname == ""){ + print_red(sprintf(_("Autocreation of subtree failed. No objectClass found for attribute '%s'."), $type)); echo $_SESSION['errors']; exit; + } + + /* Assemble_entry */ + if ($tag != ""){ + $na['objectClass']= array($ocname, "gosaAdministrativeUnitTag"); + } else { + $na['objectClass']= array($ocname); + } + if (isset($classes[$ocname]['AUXILIARY'])){ + $na['objectClass'][]= $classes[$ocname]['SUP']; + } + if ($type == "dc"){ + /* This is bad actually, but - tell me a better way? */ + $na['objectClass'][]= 'locality'; + } + $na[$type]= $param; + if (is_array($classes[$ocname]['MUST'])){ + foreach($classes[$ocname]['MUST'] as $attr){ + $na[$attr]= "filled"; + } + } + + } else { + + /* Use alternative add... */ + switch ($type){ + case 'ou': + if ($tag != ""){ + $na["objectClass"]= array("organizationalUnit", "gosaAdministrativeUnitTag"); + $na["gosaUnitTag"]= $tag; + } else { + $na["objectClass"]= "organizationalUnit"; + } + $na["ou"]= $param; + break; + case 'dc': + if ($tag != ""){ + $na["objectClass"]= array("dcObject", "top", "locality", "gosaAdministrativeUnitTag"); + $na["gosaUnitTag"]= $tag; + } else { + $na["objectClass"]= array("dcObject", "top", "locality"); + } + $na["dc"]= $param; + break; + default: + print_red(sprintf(_("Autocreation of type '%s' is currently not supported. Please report to the GOsa team."), $type)); + echo $_SESSION['errors']; + exit; + } + } $this->cd($cdn); $this->add($na); + + show_ldap_error($this->get_error(), sprintf(_("Creating subtree '%s' failed."),$cdn)); + if (!preg_match('/success/i', $this->error)){ + return FALSE; + } } } + + return TRUE; } + function recursive_remove() { $delarray= array(); @@ -1043,6 +1112,13 @@ class LDAP{ */ function import_single_entry($str_attr,$modify,$delete) { + global $config; + + if(!$config){ + trigger_error("Can't import ldif, can't read config object."); + } + + if($this->reconnect) $this->connect(); $ret = false; @@ -1120,7 +1196,8 @@ class LDAP{ /* Create missing trees */ $this->cd ($this->basedn); - $this->create_missing_trees($data['dn']); + $this->cd($config->current['BASE']); + $this->create_missing_trees(preg_replace("/^[^,]+,/","",$data['dn'])); $this->cd($data['dn']); $dn = $data['dn']; @@ -1184,8 +1261,16 @@ class LDAP{ function get_objectclasses() { - $objectclasses = array(); - + $objectclasses = array(); + global $config; + + /* Only read schema if it is allowed */ + if(isset($config) && preg_match("/config/i",get_class($config))){ + if(!isset($config->data['MAIN']['SCHEMA_CHECK']) || !preg_match("/true/i",$config->data['MAIN']['SCHEMA_CHECK'])){ + return($objectclasses); + } + } + # Get base to look for schema $sr = @ldap_read ($this->cid, NULL, "objectClass=*", array("subschemaSubentry")); if(!$sr){ @@ -1197,7 +1282,7 @@ class LDAP{ return array(); } - # Get list of objectclasses + /* Get list of objectclasses and fill array */ $nb= $attr[0]['subschemasubentry'][0]; $objectclasses= array(); $sr= ldap_read ($this->cid, $nb, "objectClass=*", array("objectclasses")); @@ -1206,15 +1291,74 @@ class LDAP{ return array(); } foreach ($attrs[0]['objectclasses'] as $val){ - $name= preg_replace("/^.* NAME\s+\(*\s*'([^']+)'\s*\)*.*$/", '\\1', $val); - if ($name != $val){ - $objectclasses[$name]= $val; - } + if (preg_match('/^[0-9]+$/', $val)){ + continue; + } + $name= "OID"; + $pattern= split(' ', $val); + $ocname= preg_replace("/^.* NAME\s+\(*\s*'([^']+)'\s*\)*.*$/", '\\1', $val); + $objectclasses[$ocname]= array(); + + foreach($pattern as $chunk){ + switch($chunk){ + + case '(': + $value= ""; + break; + + case ')': if ($name != ""){ + $objectclasses[$ocname][$name]= $this->value2container($value); + } + $name= ""; + $value= ""; + break; + + case 'NAME': + case 'DESC': + case 'SUP': + case 'STRUCTURAL': + case 'ABSTRACT': + case 'AUXILIARY': + case 'MUST': + case 'MAY': + if ($name != ""){ + $objectclasses[$ocname][$name]= $this->value2container($value); + } + $name= $chunk; + $value= ""; + break; + + default: $value.= $chunk." "; + } + } + } - return $objectclasses; } + + function value2container($value) + { + /* Set emtpy values to "true" only */ + if (preg_match('/^\s*$/', $value)){ + return true; + } + + /* Remove ' and " if needed */ + $value= preg_replace('/^[\'"]/', '', $value); + $value= preg_replace('/[\'"] *$/', '', $value); + + /* Convert to array if $ is inside... */ + if (preg_match('/\$/', $value)){ + $container= preg_split('/\s*\$\s*/', $value); + } else { + $container= chop($value); + } + + return ($container); + } + + function log($string) { if (isset($_SESSION['config'])){ @@ -1238,6 +1382,7 @@ class LDAP{ } } + function get_naming_contexts($server, $admin= "", $password= "") { /* Build LDAP connection */ @@ -1249,13 +1394,43 @@ class LDAP{ $r= ldap_bind ($ds, $admin, $password); /* Get base to look for naming contexts */ - $sr = @ldap_read ($ds, "", "objectClass=*", array("namingContexts")); + $sr = @ldap_read ($ds, "", "objectClass=*", array("+")); $attr= @ldap_get_entries($ds,$sr); - + return ($attr[0]['namingcontexts']); } + function get_root_dse($server, $admin= "", $password= "") + { + /* Build LDAP connection */ + $ds= ldap_connect ($server); + if (!$ds) { + die ("Can't bind to LDAP. No check possible!"); + } + ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); + $r= ldap_bind ($ds, $admin, $password); + + /* Get base to look for naming contexts */ + $sr = @ldap_read ($ds, "", "objectClass=*", array("+")); + $attr= @ldap_get_entries($ds,$sr); + + /* Return empty array, if nothing was set */ + if (!isset($attr[0])){ + return array(); + } + + /* Rework array... */ + $result= array(); + for ($i= 0; $i<$attr[0]['count']; $i++){ + $result[$attr[0][$i]]= $attr[0][$attr[0][$i]]; + unset($result[$attr[0][$i]]['count']); + } + + return ($result); + } + + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: