From 2fe999137d0152503860dc0ba9c85563daf16b2e Mon Sep 17 00:00:00 2001 From: hickert Date: Thu, 10 May 2007 09:08:02 +0000 Subject: [PATCH] updated schema check in trunk git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@6335 594d385d-05f5-0310-b6e9-bd551577e9d8 --- html/index.php | 36 ++++---- include/class_ldap.inc | 1 - include/functions.inc | 140 +++++++++++++++++++++++++++++++ setup/class_setupStep_Ldap.inc | 2 +- setup/class_setupStep_Schema.inc | 137 +----------------------------- 5 files changed, 163 insertions(+), 153 deletions(-) diff --git a/html/index.php b/html/index.php index 38c847ba9..5468b8d9a 100644 --- a/html/index.php +++ b/html/index.php @@ -221,22 +221,26 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['login'])){ $recursive = (isset($config->current['RECURSIVE']) && $config->current['RECURSIVE'] == "true"); $tls = (isset($config->current['TLS']) && $config->current['TLS'] == "true"); -# if(!is_schema_readable($config->current['SERVER'], $config->current['ADMIN'], $config->current['PASSWORD'], $recursive, $tls)){ -# -# print_red(_("GOsa cannot retrieve information about the installed schema files. Please make sure, that this is possible.")); -# displayLogin(); -# exit() ; -# }else{ -# $str = (schema_check($config->current['SERVER'],$config->current['ADMIN'],$config->current['PASSWORD'], $recursive, $tls, 0, TRUE)); -# $checkarr = array(); -# foreach($str as $tr){ -# if(isset($tr['needonstartup'])){ -# print_red($tr['msg']."
"._("Your ldap setup contains old schema definitions. Please re-run the setup.")); -# displayLogin(); -# exit() ; -# } -# } -# } + if(!count($ldap->get_objectclasses())){ + print_red(_("GOsa cannot retrieve information about the installed schema files. Please make sure, that this is possible.")); + displayLogin(); + exit() ; + }else{ + $cfg = array(); + $cfg['admin'] = $config->current['ADMIN']; + $cfg['password'] = $config->current['PASSWORD']; + $cfg['connection']= $config->current['SERVER']; + $cfg['tls'] = $tls; + $str = check_schema($cfg,isset($config->current['RFC2307BIS']) && preg_match("/(true|yes|on|1)/i",$config->current['RFC2307BIS'])); + $checkarr = array(); + foreach($str as $tr){ + if(isset($tr['IS_MUST_HAVE']) && !$tr['STATUS']){ + print_red($tr['MSG']."
"._("Your ldap setup contains old schema definitions. Please re-run the setup.")); + displayLogin(); + exit(); + } + } + } } /* Check for locking area */ $ldap->cat($config->current['CONFIG'], array("dn")); diff --git a/include/class_ldap.inc b/include/class_ldap.inc index c1869a9f9..126aabbad 100644 --- a/include/class_ldap.inc +++ b/include/class_ldap.inc @@ -1316,7 +1316,6 @@ class LDAP{ } } - return $objectclasses; } diff --git a/include/functions.inc b/include/functions.inc index 835d6636e..ef1139f16 100644 --- a/include/functions.inc +++ b/include/functions.inc @@ -2186,5 +2186,145 @@ function get_base_from_hook($dn, $attrib) } } +/* Schema validation functions */ + +function check_schema_version($class, $version) +{ + return preg_match("/\(v$version\)/", $class['DESC']); +} + +function check_schema($cfg,$rfc2307bis = FALSE) +{ + $messages= array(); + + /* Get objectclasses */ + $ldap = new LDAP($cfg['admin'],$cfg['password'],$cfg['connection'] ,FALSE,$cfg['tls']); + $objectclasses = $ldap->get_objectclasses(); + if(count($objectclasses) == 0){ + print_red(_("Can't get schema information from server. No schema check possible!")); + } + + /* This is the default block used for each entry. + * to avoid unset indexes. + */ + $def_check = array("REQUIRED_VERSION" => "0", + "SCHEMA_FILES" => array(), + "CLASSES_REQUIRED" => array(), + "STATUS" => FALSE, + "IS_MUST_HAVE" => FALSE, + "MSG" => "", + "INFO" => "");#_("There is currently no information specified for this schema extension.")); + + /* The gosa base schema */ + $checks['gosaObject'] = $def_check; + $checks['gosaObject']['REQUIRED_VERSION'] = "2.4"; + $checks['gosaObject']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); + $checks['gosaObject']['CLASSES_REQUIRED'] = array("gosaObject"); + $checks['gosaObject']['IS_MUST_HAVE'] = TRUE; + + /* GOsa Account class */ + $checks["gosaAccount"]["REQUIRED_VERSION"]= "2.4"; + $checks["gosaAccount"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); + $checks["gosaAccount"]["CLASSES_REQUIRED"]= array("gosaAccount"); + $checks["gosaAccount"]["IS_MUST_HAVE"] = TRUE; + $checks["gosaAccount"]["INFO"] = _("Used to store account specific informations."); + + /* GOsa lock entry, used to mark currently edited objects as 'in use' */ + $checks["gosaLockEntry"]["REQUIRED_VERSION"] = "2.4"; + $checks["gosaLockEntry"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); + $checks["gosaLockEntry"]["CLASSES_REQUIRED"] = array("gosaLockEntry"); + $checks["gosaLockEntry"]["IS_MUST_HAVE"] = TRUE; + $checks["gosaLockEntry"]["INFO"] = _("Used to lock currently edited entries to avoid multiple changes at the same time."); + + /* Some other checks */ + foreach(array( + "gosaCacheEntry" => array("version" => "2.4"), + "gosaDepartment" => array("version" => "2.4"), + "goFaxAccount" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "goFaxSBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "goFaxRBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), + "gosaUserTemplate" => array("version" => "2.4", "class" => "posixAccount","file" => "nis.schema"), + "gosaMailAccount" => array("version" => "2.4", "class" => "mailAccount","file" => "gosa+samba3.schema"), + "gosaProxyAccount" => array("version" => "2.4", "class" => "proxyAccount","file" => "gosa+samba3.schema"), + "gosaApplication" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), + "gosaApplicationGroup" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), + "GOhard" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), + "gotoTerminal" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), + "goServer" => array("version" => "2.4","class" => "server","file" => "goserver.schema"), + "goTerminalServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goShareServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goNtpServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goSyslogServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), + "goLdapServer" => array("version" => "2.4"), + "goCupsServer" => array("version" => "2.4", "class" => array("posixAccount", "terminals"),), + "goImapServer" => array("version" => "2.4", "class" => array("mailAccount", "mailgroup"),"file" => "gosa+samba3. schema"), + "goKrbServer" => array("version" => "2.4"), + "goFaxServer" => array("version" => "2.4", "class" => "gofaxAccount","file" => "gofax.schema"), + ) as $name => $values){ + + $checks[$name] = $def_check; + if(isset($values['version'])){ + $checks[$name]["REQUIRED_VERSION"] = $values['version']; + } + if(isset($values['file'])){ + $checks[$name]["SCHEMA_FILES"] = array($values['file']); + } + $checks[$name]["CLASSES_REQUIRED"] = array($name); + } + foreach($checks as $name => $value){ + foreach($value['CLASSES_REQUIRED'] as $class){ + + if(!isset($objectclasses[$name])){ + $checks[$name]['STATUS'] = FALSE; + if($value['IS_MUST_HAVE']){ + $checks[$name]['MSG'] = sprintf(_("The required objectClass '%s' is not present in your schema setup"),$class); + }else{ + $checks[$name]['MSG'] = sprintf(_("The optional objectClass '%s' is not present in your schema setup"),$class); + } + }elseif(!check_schema_version($objectclasses[$name],$value['REQUIRED_VERSION'])){ + $checks[$name]['STATUS'] = FALSE; + + if($value['IS_MUST_HAVE']){ + $checks[$name]['MSG'] = sprintf(_("The required objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); + }else{ + $checks[$name]['MSG'] = sprintf(_("The optional objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); + } + }else{ + $checks[$name]['STATUS'] = TRUE; + $checks[$name]['MSG'] = sprintf(_("Class(es) available")); + } + } + } + + $tmp = $objectclasses; + + /* The gosa base schema */ + $checks['posixGroup'] = $def_check; + $checks['posixGroup']['REQUIRED_VERSION'] = "2.4"; + $checks['posixGroup']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); + $checks['posixGroup']['CLASSES_REQUIRED'] = array("posixGroup"); + $checks['posixGroup']['STATUS'] = TRUE; + $checks['posixGroup']['IS_MUST_HAVE'] = TRUE; + $checks['posixGroup']['MSG'] = ""; + $checks['posixGroup']['INFO'] = ""; + + /* Depending on selected rfc2307bis mode, we need different schema configurations */ + if(isset($tmp['posixGroup'])){ + + if($rfc2307bis && isset($tmp['posixGroup']['STRUCTURAL'])){ + $checks['posixGroup']['STATUS'] = FALSE; + $checks['posixGroup']['MSG'] = _("You have enabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); + $checks['posixGroup']['INFO'] = _("In order to use rfc2307bis conform groups the objectClass 'posixGroup' must be AUXILIARY"); + } + if(!$rfc2307bis && !isset($tmp['posixGroup']['STRUCTURAL'])){ + $checks['posixGroup']['STATUS'] = FALSE; + $checks['posixGroup']['MSG'] = _("You have disabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); + $checks['posixGroup']['INFO'] = _("The objectClass 'posixGroup' must be STRUCTURAL"); + } + } + + return($checks); +} + // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?> diff --git a/setup/class_setupStep_Ldap.inc b/setup/class_setupStep_Ldap.inc index c982eec68..c5365ff59 100644 --- a/setup/class_setupStep_Ldap.inc +++ b/setup/class_setupStep_Ldap.inc @@ -134,7 +134,7 @@ class Step_Ldap extends setup_step if(isset($_POST[$attr])){ if(in_array($attr,array("base","connection")) && $this->$attr != get_post($attr)){ - $this->parent->disable_steps_from($this->parent->step_name_to_id(get_class($this))); + $this->parent->disable_steps_from(($this->parent->step_name_to_id(get_class($this))) +1); } $this->$attr = get_post($attr); } diff --git a/setup/class_setupStep_Schema.inc b/setup/class_setupStep_Schema.inc index 8d22f6ed6..2008128a4 100644 --- a/setup/class_setupStep_Schema.inc +++ b/setup/class_setupStep_Schema.inc @@ -69,12 +69,6 @@ class Step_Schema extends setup_step return($smarty -> fetch (get_template_path("../setup/setup_schema.tpl"))); } - function check_schema_version($class, $version) - { - return preg_match("/\(v$version\)/", $class['DESC']); - } - - function save_object() { if(isset($_POST['step7_posted'])){ @@ -88,11 +82,11 @@ class Step_Schema extends setup_step } } - function check_schema() { $cfg = $this->parent->captured_values; - $messages= array(); + $rfc2307bis = $cfg['rfc2307bis']; + $this->checked = check_schema($cfg,$rfc2307bis); /* Get objectclasses */ $ldap = new LDAP($cfg['admin'],$cfg['password'],$cfg['connection'] ,FALSE,$cfg['tls']); @@ -101,7 +95,6 @@ class Step_Schema extends setup_step print_red(_("Can't get schema information from server. No schema check possible!")); } - /* Which samba version do we use? */ if(isset($objectclasses['sambaSamAccount'])){ $this->samba_version = 3; @@ -110,132 +103,6 @@ class Step_Schema extends setup_step }else{ $this->samba_version = 0; } - - /* This is the default block used for each entry. - * to avoid unset indexes. - */ - $def_check = array("REQUIRED_VERSION" => "0", - "SCHEMA_FILES" => array(), - "CLASSES_REQUIRED" => array(), - "STATUS" => FALSE, - "IS_MUST_HAVE" => FALSE, - "MSG" => "", - "INFO" => "");#_("There is currently no information specified for this schema extension.")); - - - /* The gosa base schema */ - $checks['gosaObject'] = $def_check; - $checks['gosaObject']['REQUIRED_VERSION'] = "2.4"; - $checks['gosaObject']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); - $checks['gosaObject']['CLASSES_REQUIRED'] = array("gosaObject"); - $checks['gosaObject']['IS_MUST_HAVE'] = TRUE; - - /* GOsa Account class */ - $checks["gosaAccount"]["REQUIRED_VERSION"]= "2.4"; - $checks["gosaAccount"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); - $checks["gosaAccount"]["CLASSES_REQUIRED"]= array("gosaAccount"); - $checks["gosaAccount"]["IS_MUST_HAVE"] = TRUE; - $checks["gosaAccount"]["INFO"] = _("Used to store account specific informations."); - - /* GOsa lock entry, used to mark currently edited objects as 'in use' */ - $checks["gosaLockEntry"]["REQUIRED_VERSION"] = "2.4"; - $checks["gosaLockEntry"]["SCHEMA_FILES"] = array("gosa+samba3.schema","gosa.schema"); - $checks["gosaLockEntry"]["CLASSES_REQUIRED"] = array("gosaLockEntry"); - $checks["gosaLockEntry"]["IS_MUST_HAVE"] = TRUE; - $checks["gosaLockEntry"]["INFO"] = _("Used to lock currently edited entries to avoid multiple changes at the same time."); - - /* Some other checks */ - foreach(array( - "gosaCacheEntry" => array("version" => "2.4"), - "gosaDepartment" => array("version" => "2.4"), - "goFaxAccount" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), - "goFaxSBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), - "goFaxRBlock" => array("version" => "1.0.4", "class" => "gofaxAccount","file" => "gofax.schema"), - "gosaUserTemplate" => array("version" => "2.4", "class" => "posixAccount","file" => "nis.schema"), - "gosaMailAccount" => array("version" => "2.4", "class" => "mailAccount","file" => "gosa+samba3.schema"), - "gosaProxyAccount" => array("version" => "2.4", "class" => "proxyAccount","file" => "gosa+samba3.schema"), - "gosaApplication" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), - "gosaApplicationGroup" => array("version" => "2.4", "class" => "appgroup","file" => "gosa.schema"), - "GOhard" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), - "gotoTerminal" => array("version" => "2.5", "class" => "terminals","file" => "goto.schema"), - "goServer" => array("version" => "2.4","class" => "server","file" => "goserver.schema"), - "goTerminalServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), - "goShareServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), - "goNtpServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), - "goSyslogServer" => array("version" => "2.4", "class" => "terminals","file" => "goto.schema"), - "goLdapServer" => array("version" => "2.4"), - "goCupsServer" => array("version" => "2.4", "class" => array("posixAccount", "terminals"),), - "goImapServer" => array("version" => "2.4", "class" => array("mailAccount", "mailgroup"),"file" => "gosa+samba3.schema"), - "goKrbServer" => array("version" => "2.4"), - "goFaxServer" => array("version" => "2.4", "class" => "gofaxAccount","file" => "gofax.schema"), - ) as $name => $values){ - - $checks[$name] = $def_check; - if(isset($values['version'])){ - $checks[$name]["REQUIRED_VERSION"] = $values['version']; - } - if(isset($values['file'])){ - $checks[$name]["SCHEMA_FILES"] = array($values['file']); - } - $checks[$name]["CLASSES_REQUIRED"] = array($name); - } - - foreach($checks as $name => $value){ - foreach($value['CLASSES_REQUIRED'] as $class){ - - if(!isset($objectclasses[$name])){ - $checks[$name]['STATUS'] = FALSE; - if($value['IS_MUST_HAVE']){ - $checks[$name]['MSG'] = sprintf(_("The required objectClass '%s' is not present in your schema setup"),$class); - }else{ - $checks[$name]['MSG'] = sprintf(_("The optional objectClass '%s' is not present in your schema setup"),$class); - } - }elseif(!$this->check_schema_version($objectclasses[$name],$value['REQUIRED_VERSION'])){ - $checks[$name]['STATUS'] = FALSE; - - if($value['IS_MUST_HAVE']){ - $checks[$name]['MSG'] = sprintf(_("The required objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); - }else{ - $checks[$name]['MSG'] = sprintf(_("The optional objectclass '%s' does not have version %s"), $class, $value['REQUIRED_VERSION']); - } - }else{ - $checks[$name]['STATUS'] = TRUE; - $checks[$name]['MSG'] = sprintf(_("Class(es) available")); - } - } - } - - $tmp = $objectclasses; - - /* Depending on selected rfc2307bis mode, we need different schema configurations */ - $rfc2307bis = $this->parent->captured_values['rfc2307bis']; - - - /* The gosa base schema */ - $checks['posixGroup'] = $def_check; - $checks['posixGroup']['REQUIRED_VERSION'] = "2.4"; - $checks['posixGroup']['SCHEMA_FILES'] = array("gosa+samba3.schema","gosa.schema"); - $checks['posixGroup']['CLASSES_REQUIRED'] = array("posixGroup"); - $checks['posixGroup']['STATUS'] = TRUE; - $checks['posixGroup']['IS_MUST_HAVE'] = TRUE; - $checks['posixGroup']['MSG'] = ""; - $checks['posixGroup']['INFO'] = ""; - - if(isset($tmp['posixGroup'])){ - - if($rfc2307bis && isset($tmp['posixGroup']['STRUCTURAL'])){ - $checks['posixGroup']['STATUS'] = FALSE; - $checks['posixGroup']['MSG'] = _("You have enabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); - $checks['posixGroup']['INFO'] = _("In order to use rfc2307bis conform groups the objectClass 'posixGroup' must be AUXILIARY"); - } - if(!$rfc2307bis && !isset($tmp['posixGroup']['STRUCTURAL'])){ - $checks['posixGroup']['STATUS'] = FALSE; - $checks['posixGroup']['MSG'] = _("You have disabled the rfc2307bis option on the 'ldap setup' step, but your schema configuration do not support this option."); - $checks['posixGroup']['INFO'] = _("The objectClass 'posixGroup' must be STRUCTURAL"); - } - } - - $this->checked = $checks; } } -- 2.30.2