X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_config.inc;h=e50de7e22e022610ba36d91feb7e65cc632abcb2;hb=c9bd6c4d92532063a9dd8df3cfd20740d43e5841;hp=e47586ff8667ceca6b3495beee7b7efa56a875a0;hpb=3cab42f378c95a0ee58ef0cb62dea7baaced83ff;p=gosa.git diff --git a/gosa-core/include/class_config.inc b/gosa-core/include/class_config.inc index e47586ff8..e50de7e22 100644 --- a/gosa-core/include/class_config.inc +++ b/gosa-core/include/class_config.inc @@ -20,6 +20,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/*! \brief Configuration class + * \ingroup coreclasses + * + * The configuration class, responsible for parsing and querying the + * gosa configuration file. + */ + class config { /* XML parser */ @@ -31,14 +38,17 @@ class config { var $section= ""; var $currentLocation= ""; - /* Selected connection */ - var $current= array(); + /*! \brief Store configuration for current location */ + var $current= array(); /* Link to LDAP-server */ var $ldap= NULL; var $referrals= array(); - /* Configuration data */ + /* \brief Configuration data + * + * - $data['SERVERS'] contains server informations. + * */ var $data= array( 'TABS' => array(), 'LOCATIONS' => array(), 'SERVERS' => array(), 'MAIN' => array(), 'MENU' => array(), 'SERVICE' => array()); @@ -50,9 +60,18 @@ class config { var $idepartments= array(); var $adepartments= array(); var $tdepartments= array(); + var $department_info= array(); var $filename = ""; var $last_modified = 0; + public $configRegistry = NULL; + + /*! \brief Class constructor of the config class + * + * \param string 'filename' path to the configuration file + * \param string 'basedir' base directory + * + * */ function config($filename, $basedir= "") { $this->parser = xml_parser_create(); @@ -65,9 +84,19 @@ class config { if ($filename != ""){ $this->parse($filename); } + + // Load configuration registry + $this->configRegistry = new configRegistry($this); } - + + /*! \brief Check and reload the configuration + * + * This function checks if the configuration has changed, since it was + * read the last time and reloads it. It uses the file mtime to check + * weither the file changed or not. + * + * */ function check_and_reload() { global $ui; @@ -84,8 +113,6 @@ class config { $tmp = stat("../include/class_location.inc"); session::global_set("class_location.inc:timestamp",$tmp['mtime']); - - if($this->filename != "" && filemtime($this->filename) != $this->last_modified){ $this->config_found= FALSE; @@ -99,17 +126,24 @@ class config { xml_set_object($this->parser, $this); xml_set_element_handler($this->parser, "tag_open", "tag_close"); $this->parse($this->filename); + $this->set_current($this->current['NAME']); } } + /*! \brief Parse the given configuration file + * + * Parses the configuration file and displays errors if there + * is something wrong with it. + * + * \param string 'filename' The filename of the configuration file. + * */ + function parse($filename) { - $this->data = array( "TABS" => array(), "LOCATIONS" => array(), - "SERVERS" => array(), "MAIN" => array(), "MENU" => array(), "SERVICE" => array()); @@ -121,8 +155,8 @@ class config { fclose($fh); if(!xml_parse($this->parser, chop($xmldata))){ $msg = sprintf(_("XML error in gosa.conf: %s at line %d"), - xml_error_string(xml_get_error_code($this->parser)), - xml_get_current_line_number($this->parser)); + bold(xml_error_string(xml_get_error_code($this->parser))), + bold(xml_get_current_line_number($this->parser))); msg_dialog::display(_("Configuration error"), $msg, FATAL_ERROR_DIALOG); exit; } @@ -213,6 +247,10 @@ class config { } break; + case 'PATHMENU': + $this->data['PATHMENU']= array(); ; + break; + /* Inser plugins */ case 'PLUGIN': if ($this->tags[$this->level-3] == 'MENU' && @@ -220,6 +258,9 @@ class config { $this->data['MENU'][$this->section][$this->gpc++]= $attrs; } + if ($this->tags[$this->level-2] == 'PATHMENU'){ + $this->data['PATHMENU'][$this->gpc++]= $attrs; + } if ($this->tags[$this->level-2] == 'SERVICEMENU'){ $this->data['SERVICE'][$attrs['CLASS']]= $attrs; } @@ -240,12 +281,36 @@ class config { function get_credentials($creds) { if (isset($_SERVER['HTTP_GOSA_KEY'])){ - return (cred_decrypt($creds, $_SERVER['HTTP_GOSA_KEY'])); + if (!session::global_is_set('HTTP_GOSA_KEY_CACHE')){ + session::global_set('HTTP_GOSA_KEY_CACHE',array()); + } + $cache = session::global_get('HTTP_GOSA_KEY_CACHE'); + if(!isset($cache[$creds])){ + $cache[$creds] = cred_decrypt($creds, $_SERVER['HTTP_GOSA_KEY']); + session::global_set('HTTP_GOSA_KEY_CACHE',$cache); + } + return ($cache[$creds]); } return ($creds); } + /*! \brief Get a LDAP link object + * + * This function can be used to get an ldap object, which in turn can + * be used to query the LDAP. See the LDAP class for more information + * on how to use it. + * + * Example usage: + * \code + * $ldap = $this->config->get_ldap_link(); + * \endcode + * + * \param boolean sizelimit Weither to impose a sizelimit on the LDAP object or not. + * Defaults to false. If set to true, the size limit in the configuration + * file will be used to set the option LDAP_OPT_SIZELIMIT. + * \return ldapMultiplexer object + */ function get_ldap_link($sizelimit= FALSE) { if($this->ldap === NULL || !is_resource($this->ldap->cid)){ @@ -257,7 +322,7 @@ class config { /* Check for connection */ if (is_null($this->ldap) || (is_int($this->ldap) && $this->ldap == 0)){ $smarty= get_smarty(); - msg_dialog::display(_("LDAP error"), _("Cannot bind to LDAP. Please contact the system administrator."), FATAL_ERROR_DIALOG); + msg_dialog::display(_("LDAP error"), _("Cannot bind to LDAP!"), FATAL_ERROR_DIALOG); exit(); } @@ -269,8 +334,8 @@ class config { } if (!session::global_is_set('size_limit')){ - session::global_set('size_limit',$this->current['LDAPSIZELIMIT']); - session::global_set('size_ignore',$this->current['LDAPSIZEIGNORE']); + session::global_set('size_limit', $this->get_cfg_value('core', 'ldapSizeLimit')); + session::global_set('size_ignore', $this->boolValueIsTrue('core', 'ldapSizeIgnore')); } } @@ -283,57 +348,25 @@ class config { return($obj); } + /*! \brief Set the current location + * + * \param string name the name of the location + */ function set_current($name) { $this->current= $this->data['LOCATIONS'][$name]; - if (!isset($this->current['SAMBAVERSION'])){ - $this->current['SAMBAVERSION']= 3; - } - if (!isset($this->current['USERRDN'])){ - $this->current['USERRDN']= "ou=people"; - } - if (!isset($this->current['GROUPRDN'])){ - $this->current['GROUPS']= "ou=groups"; - } - if (isset($this->current['INITIAL_BASE'])){ session::global_set('CurrentMainBase',$this->current['INITIAL_BASE']); } - /* Remove possibly added ',' from end of group and people ou */ - $this->current['GROUPS'] = preg_replace("/,*$/","",$this->current['GROUPRDN']); - $this->current['USERRDN'] = preg_replace("/,*$/","",$this->current['USERRDN']); - - if (!isset($this->current['SAMBAMACHINEACCOUNTRDN'])){ - $this->current['SAMBAMACHINEACCOUNTRDN']= "ou=winstations,ou=systems"; - } - if (!isset($this->current['ACCOUNTPRIMARYATTRIBUTE'])){ - $this->current['ACCOUNTPRIMARYATTRIBUTE']= "cn"; - } - if (!isset($this->current['MINID'])){ - $this->current['MINID']= 100; - } - if (!isset($this->current['LDAPSIZELIMIT'])){ - $this->current['LDAPSIZELIMIT']= 200; - } - if (!isset($this->current['SIZEINGORE'])){ - $this->current['LDAPSIZEIGNORE']= TRUE; - } else { - if (preg_match("/true/i", $this->current['LDAPSIZEIGNORE'])){ - $this->current['LDAPSIZEIGNORE']= TRUE; - } else { - $this->current['LDAPSIZEIGNORE']= FALSE; - } - } - /* Sort referrals, if present */ if (isset ($this->current['REFERRAL'])){ $bases= array(); $servers= array(); foreach ($this->current['REFERRAL'] as $ref){ - $server= preg_replace('%^(.*)/[^/]+$%', '\\1', $ref['URI']); - $base= preg_replace('%^.*/([^/]+)$%', '\\1', $ref['URI']); + $server= preg_replace('%^(.*://[^/]+)/.*$%', '\\1', $ref['URI']); + $base= preg_replace('%^.*://[^/]+/(.*)$%', '\\1', $ref['URI']); $bases[$base]= strlen($base); $servers[$base]= $server; } @@ -366,6 +399,13 @@ class config { $this->load_servers(); } + + /*! \brief Load server information from config/LDAP + * + * This function searches the LDAP for servers (e.g. goImapServer, goMailServer etc.) + * and stores information about them $this->data['SERVERS']. In the case of mailservers + * the main section of the configuration file is searched, too. + */ function load_servers () { /* Only perform actions if current is set */ @@ -379,11 +419,8 @@ class config { /* Search mailMethod konfiguration in main section too */ - $this->current['MAILMETHOD'] = $this->get_cfg_value("mailMethod",""); - if (!isset($this->current['MAILMETHOD'])){ - $this->current['MAILMETHOD']= ""; - } - if ($this->current['MAILMETHOD'] == ""){ + $tmp = $this->get_cfg_value("core","mailMethod"); + if ($tmp){ $ldap->search ("(objectClass=goMailServer)", array('cn')); $this->data['SERVERS']['IMAP']= array(); while ($attrs= $ldap->fetch()){ @@ -524,12 +561,12 @@ class config { $ldap->search ("(objectClass=goLogDBServer)"); if ($ldap->count()){ $attrs= $ldap->fetch(); - if(!isset($attrs['goLogDB'][0])){ - $attrs['goLogDB'][0] = "gomon"; + if(!isset($attrs['gosaLogDB'][0])){ + $attrs['gosaLogDB'][0] = "gomon"; } $this->data['SERVERS']['LOG']= array( 'SERVER' => $attrs['cn'][0], 'LOGIN' => $attrs['goLogAdmin'][0], - 'DB' => $attrs['goLogDB'][0], + 'DB' => $attrs['gosaLogDB'][0], 'PASSWORD' => $attrs['goLogPassword'][0]); } @@ -610,31 +647,30 @@ class config { } /* Get samba servers from LDAP, in case of samba3 */ - if ($this->current['SAMBAVERSION'] == 3){ - $this->data['SERVERS']['SAMBA']= array(); - $ldap->cd ($this->current['BASE']); - $ldap->search ("(objectClass=sambaDomain)"); - while ($attrs= $ldap->fetch()){ - $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]= array( "SID" =>"","RIDBASE" =>""); - if(isset($attrs["sambaSID"][0])){ - $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]["SID"] = $attrs["sambaSID"][0]; - } - if(isset($attrs["sambaAlgorithmicRidBase"][0])){ - $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]["RIDBASE"] = $attrs["sambaAlgorithmicRidBase"][0]; - } + $this->data['SERVERS']['SAMBA']= array(); + $ldap->cd ($this->current['BASE']); + $ldap->search ("(objectClass=sambaDomain)"); + while ($attrs= $ldap->fetch()){ + $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]= array( "SID" =>"","RIDBASE" =>""); + if(isset($attrs["sambaSID"][0])){ + $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]["SID"] = $attrs["sambaSID"][0]; + } + if(isset($attrs["sambaAlgorithmicRidBase"][0])){ + $this->data['SERVERS']['SAMBA'][$attrs['sambaDomainName'][0]]["RIDBASE"] = $attrs["sambaAlgorithmicRidBase"][0]; } + } - /* If no samba servers are found, look for configured sid/ridbase */ - if (count($this->data['SERVERS']['SAMBA']) == 0){ - if (!isset($this->current["SAMBASID"]) || !isset($this->current["SAMBARIDBASE"])){ - msg_dialog::display(_("Configuration error"), _("sambaSID and/or sambaRidBase missing in the configuration!"), ERROR_DIALOG); - } else { - $this->data['SERVERS']['SAMBA']['DEFAULT']= array( - "SID" => $this->current["SAMBASID"], - "RIDBASE" => $this->current["SAMBARIDBASE"]); - } + /* If no samba servers are found, look for configured sid/ridbase */ + if (count($this->data['SERVERS']['SAMBA']) == 0){ + if (!isset($this->current["SAMBASID"]) || !isset($this->current["SAMBARIDBASE"])){ + msg_dialog::display(_("Configuration error"), _("sambaSID and/or sambaRidBase missing in the configuration!"), ERROR_DIALOG); + } else { + $this->data['SERVERS']['SAMBA']['DEFAULT']= array( + "SID" => $this->current["SAMBASID"], + "RIDBASE" => $this->current["SAMBARIDBASE"]); } } + } @@ -656,7 +692,7 @@ class config { $types = departmentManagement::get_support_departments(); /* Create a list of attributes to fetch */ - $ldap_values = array("objectClass","gosaUnitTag"); + $ldap_values = array("objectClass","gosaUnitTag", "description"); $filter = ""; foreach($types as $type){ $ldap_values[] = $type['ATTR']; @@ -675,16 +711,18 @@ class config { foreach($types as $t => $data){ if(in_array($data['OC'],$attrs['objectClass'])){ $type_data = $data; - break; + break; } } - /* Unknown department type -> skip - */ + /* Unknown department type -> skip */ if(!count($type_data)) continue; $dn= $ldap->getDN(); $this->tdepartments[$dn]= ""; + $this->department_info[$dn]= array("img" => $type_data['IMG'], + "description" => isset($attrs['description'][0])?$attrs['description'][0]:"", + "name" => $attrs[$type_data['ATTR']][0]); /* Save administrative departments */ if (in_array_ics("gosaAdministrativeUnit", $attrs['objectClass']) && @@ -701,7 +739,6 @@ class config { if ($dn == $ignore_dn){ continue; } - $c_dn = convert_department_dn($dn)." (".$type_data['ATTR'].")"; /* Only assign non-root departments */ @@ -741,7 +778,7 @@ class config { } /* Split dn into single department pieces */ - $elements = array_reverse(split(',',preg_replace("/$qbase$/",'',$val))); + $elements = array_reverse(explode(',',preg_replace("/$qbase$/",'',$val))); /* Add last ou element of current dn to our array */ $last = &$arr; @@ -819,10 +856,13 @@ class config { return($ret); } - /* This function returns all available Shares defined in this ldap - * There are two ways to call this function, if listboxEntry is true - * only name and path are attached to the array, in it is false, the whole - * entry will be parsed an atached to the result. + /*! \brief Get all available shares defined in the current LDAP + * + * This function returns all available Shares defined in this ldap + * + * \param boolean listboxEntry If set to TRUE, only name and path are + * attached to the array. If FALSE, the whole entry will be parsed an atached to the result. + * \return array */ function getShareList($listboxEntry = false) { @@ -836,7 +876,7 @@ class config { } if(isset($entry['goExportEntry'])){ foreach($entry['goExportEntry'] as $export){ - $shareAttrs = split("\|",$export); + $shareAttrs = explode("|",$export); if($listboxEntry) { $return[$shareAttrs[0]."|".$entry['cn'][0]] = $shareAttrs[0]." - ".$entry['cn'][0]; }else{ @@ -855,7 +895,12 @@ class config { } - /* This function returns all available ShareServer */ + /*! \brief Return al available share servers + * + * This function returns all available ShareServers. + * + * \return array + * */ function getShareServerList() { global $config; @@ -872,7 +917,7 @@ class config { unset($entry['goExportEntry']['count']); } foreach($entry['goExportEntry'] as $share){ - $a_share = split("\|",$share); + $a_share = explode("|",$share); $sharename = $a_share[0]; $data= array(); $data['NAME'] = $sharename; @@ -887,21 +932,26 @@ class config { } - /* Check if there's the specified bool value set in the configuration */ - function boolValueIsTrue($section, $value) + /*! \brief Checks if there's a bool property set in the configuration. + * + * The function checks, weither the specified bool value is set to a true + * value in the configuration file. + * + * Example usage: + * \code + * if ($this->config->boolValueIsTrue("core", "copyPaste")) { + * echo "Copy Paste Handling is enabled"; + * } + * \endcode + * + * \param string 'class' The properties class. e.g. 'core','user','sudo',... + * \param string 'value' Key in the given section, which is subject to check + * + * + * */ + function boolValueIsTrue($class, $name) { - $section= strtoupper($section); - $value= strtoupper($value); - if (isset($this->data[$section][$value])){ - - $data= $this->data[$section][$value]; - if (preg_match("/^true$/i", $data) || preg_match("/yes/i", $data)){ - return TRUE; - } - - } - - return FALSE; + return(preg_match("/true/i", $this->get_cfg_value($class,$name))); } @@ -924,6 +974,21 @@ class config { } + /*! Outdated - try to use pluginEnabled, boolValueIsTrue or get_cfg_value instead. + * + * (Search for a configuration setting in different categories + * + * Searches for the value of a given key in the configuration data. + * Optionally the list of categories to search (tabs, main, locations) can + * be specified. The first value that matches is returned. + * + * Example usage: + * \code + * $postcmd = $this->config->search(get_class($this), "POSTCOMMAND", array("menu", "tabs")); + * \endcode + * ) + * + * */ function search($class, $value, $categories= "") { if (is_array($categories)){ @@ -944,8 +1009,39 @@ class config { return (""); } + + /*! \brief Check whether a plugin is activated or not + */ + function pluginEnabled($class){ + $tmp = $this->search($class, "CLASS",array('menu','tabs')); + return(!empty($tmp)); + } + + + /*! \brief Get a configuration value from the config + * + * This returns a configuration value from the config. It either + * uses the data of the current location ($this->current), + * if it contains the value (e.g. current['BASE']) or otherwise + * uses the data from the main configuration section. + * + * If no value is found and an optional default has been specified, + * then the default is returned. + * + * \param string 'name' the configuration key (case-insensitive) + * \param string 'default' a default that is returned, if no value is found + * + * + */ + function get_cfg_value($class,$name, $default= "") + { + + if($this->configRegistry->propertyExists($class,$name)){ + return($this->configRegistry->getPropertyValue($class,$name)); + } + + syslog(1, $name); - function get_cfg_value($name, $default= "") { $name= strtoupper($name); /* Check if we have a current value for $name */ @@ -962,6 +1058,13 @@ class config { } + /*! \brief Check if current configuration version matches the GOsa version + * + * This function checks if the configuration file version matches the + * version of the gosa version, by comparing it with the configuration + * file version of the example gosa.conf that comes with GOsa. + * If a version mismatch occurs an error is triggered. + * */ function check_config_version() { /* Skip check, if we've already mentioned the mismatch @@ -977,16 +1080,22 @@ class config { /* Check contributed config version and current config version. */ if(($this->config_version == "NOT SET") || ($this->config_version != $current && !empty($this->config_version))){ - msg_dialog::display(_("Configuration"),_("The configuration file you are using seems to be outdated. Please move the GOsa configuration file away to run the GOsa setup again.")); + msg_dialog::display(_("Configuration"),_("The configuration file you are using is outdated. Please move the GOsa configuration file away to run the GOsa setup again.")); } } - /* On debian systems the session files are deleted with + /*! \brief Check if session lifetime matches session.gc_maxlifetime + * + * On debian systems the session files are deleted with * a cronjob, which detects all files older than specified * in php.ini:'session.gc_maxlifetime' and removes them. - * This function checks if the gosa.conf value matches the range + * This function checks if the gosa.conf value matches the range * defined by session.gc_maxlifetime. + * + * \return boolean TRUE or FALSE depending on weither the settings match + * or not. If SESSIONLIFETIME is not configured in GOsa it always returns + * TRUE. */ function check_session_lifetime() { @@ -999,6 +1108,63 @@ class config { return(TRUE); } } + + /* Returns true if snapshots are enabled, and false if it is disalbed + There will also be some errors psoted, if the configuration failed */ + function snapshotEnabled() + { + if($this->get_cfg_value("core","enableSnapshots") == "true"){ + + /* Check if the snapshot_base is defined */ + if ($this->get_cfg_value("core","snapshotBase") == ""){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable %s is not set."), + bold("snapshotBase")), ERROR_DIALOG); + } + return(FALSE); + } + + /* Check if the snapshot_base is defined */ + if (!is_callable("gzcompress")){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required compression module is missing. Please install %s."), bold("php5-zip / php5-gzip")), ERROR_DIALOG); + } + return(FALSE); + } + + /* check if there are special server configurations for snapshots */ + if ($this->get_cfg_value("core","snapshotURI") != ""){ + + /* check if all required vars are available to create a new ldap connection */ + $missing = ""; + foreach(array("snapshotURI","snapshotAdminDn","snapshotAdminPassword","snapshotBase") as $var){ + if($this->get_cfg_value("core",$var) == ""){ + $missing .= $var." "; + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable %s is not set."), + bold($missing)), ERROR_DIALOG); + } + return(FALSE); + } + } + } + return(TRUE); + } + return(FALSE); + } + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: