X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Ffunctions.inc;h=f58ed2a2e60ab73da2d552bd8bbf1711abc85f30;hb=06cc53394cf695b3bc663073e526d7d94e4bb2d6;hp=736db99cf295c868f0089ad5ae7d1cded0446568;hpb=e2b2057cafeb1d962f55dd70f3cc4100e380699e;p=gosa.git diff --git a/gosa-core/include/functions.inc b/gosa-core/include/functions.inc index 736db99cf..f58ed2a2e 100644 --- a/gosa-core/include/functions.inc +++ b/gosa-core/include/functions.inc @@ -21,9 +21,27 @@ */ /* Configuration file location */ -define ("CONFIG_DIR", "/etc/gosa"); -define ("CONFIG_FILE", "gosa.conf"); -define ("CONFIG_TEMPLATE_DIR", "../contrib/"); + +/* Allow setting the config patj in the apache configuration + e.g. SetEnv CONFIG_FILE /etc/path + */ +if(!isset($_SERVER['CONFIG_DIR'])){ + define ("CONFIG_DIR", "/etc/gosa"); +}else{ + define ("CONFIG_DIR",$_SERVER['CONFIG_DIR']); +} + +/* Allow setting the config file in the apache configuration + e.g. SetEnv CONFIG_FILE gosa.conf.2.5 + */ +if(!isset($_SERVER['CONFIG_FILE'])){ + define ("CONFIG_FILE", "gosa.conf"); +}else{ + define ("CONFIG_FILE",$_SERVER['CONFIG_FILE']); +} + +define ("CONFIG_TEMPLATE_DIR", "../contrib"); +define ("TEMP_DIR","/var/cache/gosa/tmp"); /* Define get_list flags */ define("GL_NONE", 0); @@ -68,6 +86,7 @@ define ("DEBUG_POST", 16); define ("DEBUG_SESSION",32); define ("DEBUG_CONFIG", 64); define ("DEBUG_ACL", 128); +define ("DEBUG_SI", 256); /* Rewrite german 'umlauts' and spanish 'accents' to get better results */ @@ -174,8 +193,8 @@ function get_browser_language() } /* Check for global language settings in gosa.conf */ - if(isset($config->data['MAIN']['LANG']) && !empty($config->data['MAIN']['LANG'])) { - $lang = $config->data['MAIN']['LANG']; + if (isset ($config) && $config->get_cfg_value('language') != ""){ + $lang = $config->get_cfg_value('language'); if(!preg_match("/utf/i",$lang)){ $lang .= ".UTF-8"; } @@ -212,10 +231,11 @@ function get_template_path($filename= '', $plugin= FALSE, $path= "") { global $config, $BASE_DIR; - if (!@isset($config->data['MAIN']['THEME'])){ - $theme= 'default'; + /* Set theme */ + if (isset ($config)){ + $theme= $config->get_cfg_value("theme", "default"); } else { - $theme= $config->data['MAIN']['THEME']; + $theme= "default"; } /* Return path for empty filename */ @@ -274,6 +294,21 @@ function array_remove_entries($needles, $haystack) } +function array_remove_entries_ics($needles, $haystack) +{ + $tmp= array(); + + /* Loop through entries to be removed */ + foreach ($haystack as $entry){ + if (!in_array_ics($entry, $needles)){ + $tmp[]= $entry; + } + } + + return ($tmp); +} + + function gosa_array_merge($ar1,$ar2) { if(!is_array($ar1) || !is_array($ar2)){ @@ -314,7 +349,9 @@ function ldap_init ($server, $base, $binddn='', $pass='') /* Sadly we've no proper return values here. Use the error message instead. */ if (!$ldap->success()){ - echo sprintf(_("FATAL: Error when connecting the LDAP. Server said '%s'."), $ldap->get_error()); + msg_dialog::display(_("Fatal error"), + sprintf(_("FATAL: Error when connecting the LDAP. Server said '%s'."), $ldap->get_error()), + FATAL_ERROR_DIALOG); exit(); } @@ -333,17 +370,16 @@ function process_htaccess ($username, $kerberos= FALSE) $config->set_current($name); $mode= "kerberos"; - if (isset($config->current['KRBSASL']) && preg_match('/^true$/i', $config->current['KRBSASL'])){ + if ($config->get_cfg_value("krbsasl") == "true"){ $mode= "sasl"; } /* Look for entry or realm */ $ldap= $config->get_ldap_link(); if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "", LDAP_AUTH, ERROR_DIALOG)); - $smarty= get_smarty(); - $smarty->display(get_template_path('headers.tpl')); - echo "".session::get('errors').""; + msg_dialog::display(_("LDAP error"), + msgPool::ldaperror($ldap->get_error(), "", LDAP_AUTH)."

".session::get('errors'), + FATAL_ERROR_DIALOG); exit(); } $ldap->search("(&(objectClass=gosaAccount)(|(uid=$username)(userPassword={$mode}$username)))", array("uid")); @@ -367,10 +403,9 @@ function ldap_login_user_htaccess ($username) /* Look for entry or realm */ $ldap= $config->get_ldap_link(); if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "", LDAP_AUTH, FATAL_ERROR_DIALOG)); - $smarty= get_smarty(); - $smarty->display(get_template_path('headers.tpl')); - echo "".session::get('errors').""; + msg_dialog::display(_("LDAP error"), + msgPool::ldaperror($ldap->get_error(), "", LDAP_AUTH)."

".session::get('errors'), + FATAL_ERROR_DIALOG); exit(); } $ldap->search("(&(objectClass=gosaAccount)(uid=$username))", array("uid")); @@ -405,17 +440,16 @@ function ldap_login_user ($username, $password) /* look through the entire ldap */ $ldap = $config->get_ldap_link(); if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error()), FATAL_ERROR_DIALOG); - $smarty= get_smarty(); - $smarty->display(get_template_path('headers.tpl')); - echo "".session::get('errors').""; + msg_dialog::display(_("LDAP error"), + msgPool::ldaperror($ldap->get_error(), "", LDAP_AUTH)."

".session::get('errors'), + FATAL_ERROR_DIALOG); exit(); } $ldap->cd($config->current['BASE']); $allowed_attributes = array("uid","mail"); $verify_attr = array(); - if(isset($config->current['LOGIN_ATTRIBUTE'])){ - $tmp = split(",",$config->current['LOGIN_ATTRIBUTE']); + if($config->get_cfg_value("login_attribute") != ""){ + $tmp = split(",", $config->get_cfg_value("login_attribute")); foreach($tmp as $attr){ if(in_array($attr,$allowed_attributes)){ $verify_attr[] = $attr; @@ -597,7 +631,7 @@ function add_lock ($object, $user) /* Check for existing entries in lock area */ $ldap= $config->get_ldap_link(); - $ldap->cd ($config->current['CONFIG']); + $ldap->cd ($config->get_cfg_value("config")); $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$user)(gosaObject=".base64_encode($object)."))", array("gosaUser")); if (!$ldap->success()){ @@ -609,14 +643,14 @@ function add_lock ($object, $user) if ($ldap->count() == 0){ $attrs= array(); $name= md5($object); - $ldap->cd("cn=$name,".$config->current['CONFIG']); + $ldap->cd("cn=$name,".$config->get_cfg_value("config")); $attrs["objectClass"] = "gosaLockEntry"; $attrs["gosaUser"] = $user; $attrs["gosaObject"] = base64_encode($object); $attrs["cn"] = "$name"; $ldap->add($attrs); if (!$ldap->success()){ - msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "cn=$name,".$config->current['CONFIG'], 0, ERROR_DIALOG)); + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "cn=$name,".$config->get_cfg_value("config"), 0, ERROR_DIALOG)); return; } } @@ -641,7 +675,7 @@ function del_lock ($object) /* Check for existance and remove the entry */ $ldap= $config->get_ldap_link(); - $ldap->cd ($config->current['CONFIG']); + $ldap->cd ($config->get_cfg_value("config")); $ldap->search ("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaObject")); $attrs= $ldap->fetch(); if ($ldap->getDN() != "" && $ldap->success()){ @@ -661,7 +695,7 @@ function del_user_locks($userdn) /* Get LDAP ressources */ $ldap= $config->get_ldap_link(); - $ldap->cd ($config->current['CONFIG']); + $ldap->cd ($config->get_cfg_value("config")); /* Remove all objects of this user, drop errors silently in this case. */ $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$userdn))", array("gosaUser")); @@ -684,7 +718,7 @@ function get_lock ($object) /* Get LDAP link, check for presence of the lock entry */ $user= ""; $ldap= $config->get_ldap_link(); - $ldap->cd ($config->current['CONFIG']); + $ldap->cd ($config->get_cfg_value("config")); $ldap->search("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaUser")); if (!$ldap->success()){ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "", LDAP_SEARCH, ERROR_DIALOG)); @@ -729,7 +763,7 @@ function get_multiple_locks($objects) /* Get LDAP link, check for presence of the lock entry */ $user= ""; $ldap= $config->get_ldap_link(); - $ldap->cd ($config->current['CONFIG']); + $ldap->cd ($config->get_cfg_value("config")); $ldap->search($filter, array("gosaUser","gosaObject")); if (!$ldap->success()){ msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), "", LDAP_SEARCH, ERROR_DIALOG)); @@ -887,16 +921,14 @@ function get_sub_list($filter, $category,$sub_deps, $base= "", $attributes= arra }else{ /* Sort in every value that fits the permissions */ - if (is_array($category)){ - foreach ($category as $o){ - if ($ui->get_category_permissions($dn, $o) != ""){ - $result[]= $attrs; - break; - } - } - } else { - if ( $ui->get_category_permissions($dn, $category) != ""){ + if (!is_array($category)){ + $category = array($category); + } + foreach ($category as $o){ + if((preg_match("/\//",$o) && preg_match("/r/",$ui->get_permissions($dn,$o))) || + (!preg_match("/\//",$o) && preg_match("/r/",$ui->get_category_permissions($dn, $o)))){ $result[]= $attrs; + break; } } } @@ -957,19 +989,14 @@ function get_list($filter, $category, $base= "", $attributes= array(), $flags= G }else{ /* Sort in every value that fits the permissions */ - if (is_array($category)){ - foreach ($category as $o){ - if ($ui->get_category_permissions($dn, $o) != ""){ - - /* We found what we were looking for, break speeds things up */ - $result[]= $attrs; - } - } - } else { - if ($ui->get_category_permissions($dn, $category) != ""){ - - /* We found what we were looking for, break speeds things up */ + if (!is_array($category)){ + $category = array($category); + } + foreach ($category as $o){ + if((preg_match("/\//",$o) && preg_match("/r/",$ui->get_permissions($dn,$o))) || + (!preg_match("/\//",$o) && preg_match("/r/",$ui->get_category_permissions($dn, $o)))){ $result[]= $attrs; + break; } } } @@ -1087,31 +1114,27 @@ function &get_smarty() } -function convert_department_dn($dn) +function convert_department_dn($dn, $base = NULL) { - $dep= ""; + global $config; + + if($base == NULL){ + $base = $config->current['BASE']; + } /* Build a sub-directory style list of the tree level specified in $dn */ - global $config; - $dn = preg_replace("/".normalizePreg($config->current['BASE'])."$/i","",$dn); + $dn = preg_replace("/".normalizePreg($base)."$/i","",$dn); if(empty($dn)) return("/"); - foreach (split(',', $dn) as $rdn){ - - /* We're only interested in organizational units... */ - if (substr($rdn,0,3) == 'ou='){ - $dep= substr($rdn,3)."/$dep"; - } - /* ... and location objects */ - if (substr($rdn,0,2) == 'l='){ - $dep= substr($rdn,2)."/$dep"; - } + $dep= ""; + foreach (split(',', $dn) as $rdn){ + $dep = preg_replace("/^[^=]+=/","",$rdn)."/".$dep; } /* Return and remove accidently trailing slashes */ - return rtrim($dep, "/"); + return(trim($dep, "/")); } @@ -1127,6 +1150,8 @@ function get_ou($name) { global $config; + $name= strtolower($name); + $map = array( "ogroupou" => "ou=groups,", "applicationou" => "ou=apps,", @@ -1137,6 +1162,8 @@ function get_ou($name) "printerou" => "ou=printers,ou=systems,", "phoneou" => "ou=phones,ou=systems,", "componentou" => "ou=netdevices,ou=systems,", + "winstations" => "ou=winstation,", + "blocklistou" => "ou=gofax,ou=systems,", "incomingou" => "ou=incoming,", "aclroleou" => "ou=aclroles,", @@ -1156,8 +1183,8 @@ function get_ou($name) "mimetypeou" => "ou=mime,"); /* Preset ou... */ - if (isset($config->current[strtoupper($name)])){ - $ou= $config->current[strtoupper($name)]; + if ($config->get_cfg_value($name, "_not_set_") != "_not_set_"){ + $ou= $config->get_cfg_value($name); } elseif (isset($map[$name])) { $ou = $map[$name]; return($ou); @@ -1188,7 +1215,7 @@ function get_ou($name) function get_people_ou() { - return (get_ou("PEOPLE")); + return (get_ou("USERRDN")); } @@ -1224,7 +1251,10 @@ function strict_uid_mode() { global $config; - return !(isset($config->current['STRICT']) && preg_match('/^(no|false)$/i', $config->current['STRICT'])); + if (isset($config)){ + return ($config->get_cfg_value("strict") == "true"); + } + return (TRUE); } @@ -1955,34 +1985,32 @@ function progressbar($percentage,$width=100,$height=15,$showvalue=false) $progress = (int)(($percentage /100)*$width); - /* Abort printing out percentage, if divs are to small */ - - /* If theres a better solution for this, use it... */ - $str = " -
- -
- -
"; - + $str = "\n
"; + + $str.= "\n
"; + + if(($height >10)&&($showvalue)){ + $str.= "\n "; + $str.= "\n ".$percentage."% "; + $str.= "\n "; + } + + $str.= "\n
"; + $str.= "\n
"; + $str.= "\n
"; + $str.= "\n
"; - if(($height >10)&&($showvalue)){ - $str.= " - ".$percentage."% - "; - } - - $str.= "
"; - - return($str); + return($str); } @@ -2164,10 +2192,10 @@ function get_base_from_hook($dn, $attrib) { global $config; - if (isset($config->current['BASE_HOOK'])){ + if ($config->get_cfg_value("base_hook") != ""){ /* Call hook script - if present */ - $command= $config->current['BASE_HOOK']; + $command= $config->get_cfg_value("base_hook"); if ($command != ""){ $command.= " '".LDAP::fix($dn)."' $attrib"; @@ -2178,17 +2206,17 @@ function get_base_from_hook($dn, $attrib) return ($output[0]); } else { msg_dialog::display(_("Warning"), _("'base_hook' is not available. Using default base!"), WARNING_DIALOG); - return ($config->current['UIDBASE']); + return ($config->get_cfg_value("uidbase")); } } else { msg_dialog::display(_("Warning"), _("'base_hook' is not available. Using default base!"), WARNING_DIALOG); - return ($config->current['UIDBASE']); + return ($config->get_cfg_value("uidbase")); } } else { msg_dialog::display(_("Warning"), _("'base_hook' is not available. Using default base!"), WARNING_DIALOG); - return ($config->current['UIDBASE']); + return ($config->get_cfg_value("uidbase")); } } @@ -2347,6 +2375,7 @@ function get_languages($languages_in_own_language = FALSE,$strip_region_tag = FA "pl_PL" => "Polish", "sv_SE" => "Swedish", "zh_CN" => "Chinese", + "vi_VN" => "Vietnamese", "ru_RU" => "Russian"); $tmp2= array( @@ -2359,12 +2388,23 @@ function get_languages($languages_in_own_language = FALSE,$strip_region_tag = FA "pl_PL" => _("Polish"), "sv_SE" => _("Swedish"), "zh_CN" => _("Chinese"), + "vi_VN" => _("Vietnamese"), "ru_RU" => _("Russian")); $ret = array(); if($languages_in_own_language){ $old_lang = setlocale(LC_ALL, 0); + + /* If the locale wasn't correclty set before, there may be an incorrect + locale returned. Something like this: + C_CTYPE=de_DE.UTF-8;LC_NUMERIC=C;LC_TIME=de_DE.UTF-8;LC ... + Extract the locale name from this string and use it to restore old locale. + */ + if(preg_match("/LC_CTYPE/",$old_lang)){ + $old_lang = preg_replace("/^.*LC_CTYPE=([^;]*).*$/","\\1",$old_lang); + } + foreach($tmp as $key => $name){ $lang = $key.".UTF-8"; setlocale(LC_ALL, $lang); @@ -2514,7 +2554,9 @@ function change_password ($dn, $password, $mode=0, $hash= "") } else { /* Run backend method for change/create */ - $test->set_password($password); + if(!$test->set_password($password)){ + return(FALSE); + } /* Find postmodify entries for this class */ $command= $config->search("password", "POSTMODIFY",array('menu')); @@ -2533,6 +2575,7 @@ function change_password ($dn, $password, $mode=0, $hash= "") } } } + return(TRUE); } @@ -2542,7 +2585,7 @@ function generate_smb_nt_hash($password) global $config; # Try to use gosa-si? - if (isset($config->current['GOSA_SI'])){ + if ($config->get_cfg_value("gosa_si") != ""){ $res= gosaSupportDaemon::send("gosa_gen_smb_hash", "GOSA", array("password" => $password), TRUE); if (isset($res['XML']['HASH'])){ $hash= $res['XML']['HASH']; @@ -2550,7 +2593,7 @@ function generate_smb_nt_hash($password) $hash= ""; } } else { - $tmp= $config->data['MAIN']['SMBHASH']." ".escapeshellarg($password); + $tmp= $config->get_cfg_value('sambaHashHook')." ".escapeshellarg($password); @DEBUG (DEBUG_LDAP, __LINE__, __FUNCTION__, __FILE__, $tmp, "Execute"); exec($tmp, $ar); @@ -2566,7 +2609,7 @@ function generate_smb_nt_hash($password) list($lm,$nt)= split (":", trim($hash)); - if ($config->current['SAMBAVERSION'] == 3) { + if ($config->get_cfg_value("sambaversion") == 3) { $attrs['sambaLMPassword']= $lm; $attrs['sambaNTPassword']= $nt; $attrs['sambaPwdLastSet']= date('U'); @@ -2589,12 +2632,8 @@ function getEntryCSN($dn) } /* Get attribute that we should use as serial number */ - if(isset($config->current['UNIQ_IDENTIFIER'])){ - $attr = $config->current['UNIQ_IDENTIFIER']; - }elseif(isset($config->data['MAIN']['UNIQ_IDENTIFIER'])){ - $attr = $config->data['MAIN']['UNIQ_IDENTIFIER']; - } - if(!empty($attr)){ + $attr= $config->get_cfg_value("modificationDetectionAttribute"); + if($attr != ""){ $ldap = $config->get_ldap_link(); $ldap->cat($dn,array($attr)); $csn = $ldap->fetch(); @@ -2635,7 +2674,7 @@ function remove_objectClass($classes, &$attrs) $tmp= array(); foreach ($attrs['objectClass'] as $oc) { foreach ($list as $class){ - if ($oc != $class){ + if (strtolower($oc) != strtolower($class)){ $tmp[]= $oc; } } @@ -2658,6 +2697,13 @@ function send_binary_content($data,$name,$type = "application/octet-stream") header("Cache-Control: post-check=0, pre-check=0"); header("Content-type: ".$type.""); + $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT']; + + /* Strip name if it is a complete path */ + if (preg_match ("/\//", $name)) { + $name= basename($name); + } + /* force download dialog */ if (preg_match('/MSIE 5.5/', $HTTP_USER_AGENT) || preg_match('/MSIE 6.0/', $HTTP_USER_AGENT)) { header('Content-Disposition: filename="'.$name.'"'); @@ -2670,6 +2716,19 @@ function send_binary_content($data,$name,$type = "application/octet-stream") } +function reverse_html_entities($str,$type = ENT_QUOTES , $charset = "UTF-8") +{ + if(is_string($str)){ + return(htmlentities($str,$type,$charset)); + }elseif(is_array($str)){ + foreach($str as $name => $value){ + $str[$name] = reverse_html_entities($value,$type,$charset); + } + } + return($str); +} + + /*! \brief Encode special string characters so we can use the string in \ HTML output, without breaking quotes. @param The String we want to encode. @@ -2678,7 +2737,22 @@ function send_binary_content($data,$name,$type = "application/octet-stream") function xmlentities($str) { if(is_string($str)){ - return(htmlentities($str,ENT_QUOTES)); + + static $asc2uni= array(); + if (!count($asc2uni)){ + for($i=128;$i<256;$i++){ + # $asc2uni[chr($i)] = "&#x".dechex($i).";"; + } + } + + $str = str_replace("&", "&", $str); + $str = str_replace("<", "<", $str); + $str = str_replace(">", ">", $str); + $str = str_replace("'", "'", $str); + $str = str_replace("\"", """, $str); + $str = str_replace("\r", "", $str); + $str = strtr($str,$asc2uni); + return $str; }elseif(is_array($str)){ foreach($str as $name => $value){ $str[$name] = xmlentities($value);