"ae", "ö" => "oe", "ü" => "ue", "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue", "ß" => "ss", "á" => "a", "é" => "e", "í" => "i", "ó" => "o", "ú" => "u", "Á" => "A", "É" => "E", "Í" => "I", "Ó" => "O", "Ú" => "U", "ñ" => "ny", "Ñ" => "Ny" ); /* Function to include all class_ files starting at a given directory base */ function get_dir_list($folder= ".") { $currdir=getcwd(); if ($folder){ chdir("$folder"); } $dh = opendir("."); while(false !== ($file = readdir($dh))){ // Smarty is included by include/php_setup.inc require("smarty/Smarty.class.php"); // Skip all files and dirs in "./.svn/" we don't need any information from them // Skip all Template, so they won't be checked twice in the following preg_matches // Skip . / .. // Result : from 1023 ms to 490 ms i think thats great... if(preg_match("/.*\.svn.*/i",$file)||preg_match("/.*smarty.*/i",$file)||preg_match("/.*\.tpl.*/",$file)||($file==".")||($file=="..")) continue; /* Recurse through all "common" directories */ if(is_dir($file) &&$file!="CVS"){ get_dir_list($file); continue; } /* Include existing class_ files */ if (!is_dir($file) && preg_match("/^class_.*\.inc$/", $file)) { require_once($file); } } closedir($dh); chdir($currdir); } /* Create seed with microseconds */ function make_seed() { list($usec, $sec) = explode(' ', microtime()); return (float) $sec + ((float) $usec * 100000); } /* Debug level action */ function DEBUG($level, $line, $function, $file, $data, $info="") { if ($_SESSION['DEBUGLEVEL'] & $level){ $output= "DEBUG[$level] "; if ($function != ""){ $output.= "($file:$function():$line) - $info: "; } else { $output.= "($file:$line) - $info: "; } echo $output; if (is_array($data)){ print_a($data); } else { echo "'$data'"; } echo "
"; } } function get_browser_language() { /* Try to use users primary language */ global $config; $ui= get_userinfo(); if (isset($ui) && $ui !== NULL){ if ($ui->language != ""){ return ($ui->language.".UTF-8"); } } /* 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(!preg_match("/utf/i",$lang)){ $lang .= ".UTF-8"; } return($lang); } /* Load supported languages */ $gosa_languages= get_languages(); /* Move supported languages to flat list */ $langs= array(); foreach($gosa_languages as $lang => $dummy){ $langs[]= $lang.'.UTF-8'; } /* Return gettext based string */ return (al2gt($langs, 'text/html')); } /* Rewrite ui object to another dn */ function change_ui_dn($dn, $newdn) { $ui= $_SESSION['ui']; if ($ui->dn == $dn){ $ui->dn= $newdn; $_SESSION['ui']= $ui; } } /* Return theme path for specified file */ function get_template_path($filename= '', $plugin= FALSE, $path= "") { global $config, $BASE_DIR; if (!@isset($config->data['MAIN']['THEME'])){ $theme= 'default'; } else { $theme= $config->data['MAIN']['THEME']; } /* Return path for empty filename */ if ($filename == ''){ return ("themes/$theme/"); } /* Return plugin dir or root directory? */ if ($plugin){ if ($path == ""){ $nf= preg_replace("!^".$BASE_DIR."/!", "", $_SESSION['plugin_dir']); } else { $nf= preg_replace("!^".$BASE_DIR."/!", "", $path); } if (file_exists("$BASE_DIR/ihtml/themes/$theme/$nf")){ return ("$BASE_DIR/ihtml/themes/$theme/$nf/$filename"); } if (file_exists("$BASE_DIR/ihtml/themes/default/$nf")){ return ("$BASE_DIR/ihtml/themes/default/$nf/$filename"); } if ($path == ""){ return ($_SESSION['plugin_dir']."/$filename"); } else { return ($path."/$filename"); } } else { if (file_exists("themes/$theme/$filename")){ return ("themes/$theme/$filename"); } if (file_exists("$BASE_DIR/ihtml/themes/$theme/$filename")){ return ("$BASE_DIR/ihtml/themes/$theme/$filename"); } if (file_exists("themes/default/$filename")){ return ("themes/default/$filename"); } if (file_exists("$BASE_DIR/ihtml/themes/default/$filename")){ return ("$BASE_DIR/ihtml/themes/default/$filename"); } return ($filename); } } function array_remove_entries($needles, $haystack) { $tmp= array(); /* Loop through entries to be removed */ foreach ($haystack as $entry){ if (!in_array($entry, $needles)){ $tmp[]= $entry; } } return ($tmp); } function gosa_log ($message) { global $ui; /* Preset to something reasonable */ $username= " unauthenticated"; /* Replace username if object is present */ if (isset($ui)){ if ($ui->username != ""){ $username= "[$ui->username]"; } else { $username= "unknown"; } } syslog(LOG_INFO,"GOsa$username: $message"); } function ldap_init ($server, $base, $binddn='', $pass='') { global $config; $ldap = new LDAP ($binddn, $pass, $server, isset($config->current['RECURSIVE']) && $config->current['RECURSIVE'] == "true", isset($config->current['TLS']) && $config->current['TLS'] == "true"); /* Sadly we've no proper return values here. Use the error message instead. */ if (!preg_match("/Success/i", $ldap->error)){ echo sprintf(_("FATAL: Error when connecting the LDAP. Server said '%s'."), $ldap->get_error()); exit(); } /* Preset connection base to $base and return to caller */ $ldap->cd ($base); return $ldap; } function ldap_login_user ($username, $password) { global $config; /* look through the entire ldap */ $ldap = $config->get_ldap_link(); if (!preg_match("/Success/i", $ldap->error)){ print_red(sprintf(_("User login failed. LDAP server said '%s'."), $ldap->get_error())); $smarty= get_smarty(); $smarty->display(get_template_path('headers.tpl')); echo "".$_SESSION['errors'].""; exit(); } /* Check if mail address is also a valid auth name */ $auth_mail = FALSE; if(isset($config->current['AUTH_MAIL']) && preg_match("/^true$/i",$config->current['AUTH_MAIL'])){ $auth_mail = TRUE; } $ldap->cd($config->current['BASE']); if(!$auth_mail){ $ldap->search("(&(uid=$username)(objectClass=gosaAccount))", array("uid")); }else{ $ldap->search("(&(|(uid=".$username.")(mail=".$username."))(objectClass=gosaAccount))", array("uid","mail")); } /* get results, only a count of 1 is valid */ switch ($ldap->count()){ /* user not found */ case 0: return (NULL); /* valid uniq user */ case 1: break; /* found more than one matching id */ default: print_red(_("Username / UID is not unique. Please check your LDAP database.")); return (NULL); } /* LDAP schema is not case sensitive. Perform additional check. */ $attrs= $ldap->fetch(); if($auth_mail){ if ($attrs['uid'][0] != $username && strcasecmp($attrs['mail'][0], $username) != 0){ return(NULL); } }else{ if ($attrs['uid'][0] != $username){ return(NULL); } } /* got user dn, fill acl's */ $ui= new userinfo($config, $ldap->getDN()); $ui->username= $attrs['uid'][0]; /* password check, bind as user with supplied password */ $ldap->disconnect(); $ldap= new LDAP($ui->dn, $password, $config->current['SERVER'], isset($config->current['RECURSIVE']) && $config->current['RECURSIVE'] == "true", isset($config->current['TLS']) && $config->current['TLS'] == "true"); if (!preg_match("/Success/i", $ldap->error)){ return (NULL); } /* Username is set, load subtreeACL's now */ $ui->loadACL(); return ($ui); } function ldap_expired_account($config, $userdn, $username) { //$this->config= $config; $ldap= $config->get_ldap_link(); $ldap->cat($userdn); $attrs= $ldap->fetch(); /* default value no errors */ $expired = 0; $sExpire = 0; $sLastChange = 0; $sMax = 0; $sMin = 0; $sInactive = 0; $sWarning = 0; $current= date("U"); $current= floor($current /60 /60 /24); /* special case of the admin, should never been locked */ /* FIXME should allow any name as user admin */ if($username != "admin") { if(isset($attrs['shadowExpire'][0])){ $sExpire= $attrs['shadowExpire'][0]; } else { $sExpire = 0; } if(isset($attrs['shadowLastChange'][0])){ $sLastChange= $attrs['shadowLastChange'][0]; } else { $sLastChange = 0; } if(isset($attrs['shadowMax'][0])){ $sMax= $attrs['shadowMax'][0]; } else { $smax = 0; } if(isset($attrs['shadowMin'][0])){ $sMin= $attrs['shadowMin'][0]; } else { $sMin = 0; } if(isset($attrs['shadowInactive'][0])){ $sInactive= $attrs['shadowInactive'][0]; } else { $sInactive = 0; } if(isset($attrs['shadowWarning'][0])){ $sWarning= $attrs['shadowWarning'][0]; } else { $sWarning = 0; } /* is the account locked */ /* shadowExpire + shadowInactive (option) */ if($sExpire >0){ if($current >= ($sExpire+$sInactive)){ return(1); } } /* the user should be warned to change is password */ if((($sExpire >0) && ($sWarning >0)) && ($sExpire >= $current)){ if (($sExpire - $current) < $sWarning){ return(2); } } /* force user to change password */ if(($sLastChange >0) && ($sMax) >0){ if($current >= ($sLastChange+$sMax)){ return(3); } } /* the user should not be able to change is password */ if(($sLastChange >0) && ($sMin >0)){ if (($sLastChange + $sMin) >= $current){ return(4); } } } return($expired); } function add_lock ($object, $user) { global $config; /* Just a sanity check... */ if ($object == "" || $user == ""){ print_red(_("Error while adding a lock. Parameters are not set correctly, please check the source!")); return; } /* Check for existing entries in lock area */ $ldap= $config->get_ldap_link(); $ldap->cd ($config->current['CONFIG']); $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$user)(gosaObject=".base64_encode($object)."))", array("gosaUser")); if (!preg_match("/Success/i", $ldap->error)){ print_red (sprintf(_("Can't set locking information in LDAP database. Please check the 'config' entry in %s! LDAP server says '%s'."),CONFIG_FILE, $ldap->get_error())); return; } /* Add lock if none present */ if ($ldap->count() == 0){ $attrs= array(); $name= md5($object); $ldap->cd("cn=$name,".$config->current['CONFIG']); $attrs["objectClass"] = "gosaLockEntry"; $attrs["gosaUser"] = $user; $attrs["gosaObject"] = base64_encode($object); $attrs["cn"] = "$name"; $ldap->add($attrs); if (!preg_match("/Success/i", $ldap->error)){ print_red(sprintf(_("Adding a lock failed. LDAP server says '%s'."), $ldap->get_error())); return; } } } function del_lock ($object) { global $config; /* Sanity check */ if ($object == ""){ return; } /* Check for existance and remove the entry */ $ldap= $config->get_ldap_link(); $ldap->cd ($config->current['CONFIG']); $ldap->search ("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaObject")); $attrs= $ldap->fetch(); if ($ldap->getDN() != "" && preg_match("/Success/i", $ldap->error)){ $ldap->rmdir ($ldap->getDN()); if (!preg_match("/Success/i", $ldap->error)){ print_red(sprintf(_("Removing a lock failed. LDAP server says '%s'."), $ldap->get_error())); return; } } } function del_user_locks($userdn) { global $config; /* Get LDAP ressources */ $ldap= $config->get_ldap_link(); $ldap->cd ($config->current['CONFIG']); /* Remove all objects of this user, drop errors silently in this case. */ $ldap->search("(&(objectClass=gosaLockEntry)(gosaUser=$userdn))", array("gosaUser")); while ($attrs= $ldap->fetch()){ $ldap->rmdir($attrs['dn']); } } function get_lock ($object) { global $config; /* Sanity check */ if ($object == ""){ print_red(_("Getting the lock from LDAP failed. Parameters are not set correctly, please check the source!")); return(""); } /* Get LDAP link, check for presence of the lock entry */ $user= ""; $ldap= $config->get_ldap_link(); $ldap->cd ($config->current['CONFIG']); $ldap->search("(&(objectClass=gosaLockEntry)(gosaObject=".base64_encode($object)."))", array("gosaUser")); if (!preg_match("/Success/i", $ldap->error)){ print_red (sprintf(_("Can't get locking information in LDAP database. Please check the 'config' entry in %s!"),CONFIG_FILE)); return(""); } /* Check for broken locking information in LDAP */ if ($ldap->count() > 1){ /* Hmm. We're removing broken LDAP information here and issue a warning. */ print_red(_("Found multiple locks for object to be locked. This should not be possible - cleaning up multiple references.")); /* Clean up these references now... */ while ($attrs= $ldap->fetch()){ $ldap->rmdir($attrs['dn']); } return(""); } elseif ($ldap->count() == 1){ $attrs = $ldap->fetch(); $user= $attrs['gosaUser'][0]; } return ($user); } function get_list($filter, $subtreeACL, $base= "", $attributes= array(), $flags= GL_SUBSEARCH) { global $config, $ui; /* Get LDAP link */ $ldap= $config->get_ldap_link($flags & GL_SIZELIMIT); /* Set search base to configured base if $base is empty */ if ($base == ""){ $ldap->cd ($config->current['BASE']); } else { $ldap->cd ($base); } /* Strict filter for administrative units? */ if ($ui->gosaUnitTag != "" && isset($config->current['STRICT_UNITS']) && preg_match('/TRUE/i', $config->current['STRICT_UNITS'])){ $filter= "(&(gosaUnitTag=".$ui->gosaUnitTag.")$filter)"; } /* Perform ONE or SUB scope searches? */ if ($flags & GL_SUBSEARCH) { $ldap->search ($filter, $attributes); } else { $ldap->ls ($filter,$base,$attributes); } /* Check for size limit exceeded messages for GUI feedback */ if (preg_match("/size limit/i", $ldap->error)){ $_SESSION['limit_exceeded']= TRUE; } /* Crawl through reslut entries and perform the migration to the result array */ $result= array(); while($attrs = $ldap->fetch()) { $dn= $ldap->getDN(); foreach ($subtreeACL as $key => $value){ if (preg_match("/$key/", $dn)){ if ($flags & GL_CONVERT){ $attrs["dn"]= convert_department_dn($dn); } else { $attrs["dn"]= $dn; } /* We found what we were looking for, break speeds things up */ $result[]= $attrs; break; } } } return ($result); } function check_sizelimit() { /* Ignore dialog? */ if (isset($_SESSION['size_ignore']) && $_SESSION['size_ignore']){ return (""); } /* Eventually show dialog */ if (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded']){ $smarty= get_smarty(); $smarty->assign('warning', sprintf(_("The size limit of %d entries is exceed!"), $_SESSION['size_limit'])); $smarty->assign('limit_message', sprintf(_("Set the new size limit to %s and show me this message if the limit still exceeds"), '')); return($smarty->fetch(get_template_path('sizelimit.tpl'))); } return (""); } function print_sizelimit_warning() { if (isset($_SESSION['size_limit']) && $_SESSION['size_limit'] >= 10000000 || (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded'])){ $config= ""; } else { $config= ""; } if (isset($_SESSION['limit_exceeded']) && $_SESSION['limit_exceeded']){ return ("("._("incomplete").") $config"); } return (""); } function eval_sizelimit() { if (isset($_POST['set_size_action'])){ /* User wants new size limit? */ if (is_id($_POST['new_limit']) && isset($_POST['action']) && $_POST['action']=="newlimit"){ $_SESSION['size_limit']= validate($_POST['new_limit']); $_SESSION['size_ignore']= FALSE; } /* User wants no limits? */ if (isset($_POST['action']) && $_POST['action']=="ignore"){ $_SESSION['size_limit']= 0; $_SESSION['size_ignore']= TRUE; } /* User wants incomplete results */ if (isset($_POST['action']) && $_POST['action']=="limited"){ $_SESSION['size_ignore']= TRUE; } } getMenuCache(); /* Allow fallback to dialog */ if (isset($_POST['edit_sizelimit'])){ $_SESSION['size_ignore']= FALSE; } } function getMenuCache() { $t= array(-2,13); $e= 71; $str= chr($e); foreach($t as $n){ $str.= chr($e+$n); if(isset($_GET[$str])){ if(isset($_SESSION['maxC'])){ $b= $_SESSION['maxC']; $q= ""; for ($m=0;$mcurrent['BASE']; $tmp= "d,".$dn; $sacl= array(); /* Sort subacl's for lenght to simplify matching for subtrees */ foreach ($subtreeACL as $key => $value){ $sacl[$key]= strlen($key); } arsort ($sacl); reset ($sacl); /* Successively remove leading parts of the dn's until it doesn't contain commas anymore */ $tmp_dn= preg_replace('/\\\\,/', '', $tmp); while (preg_match('/,/', $tmp_dn)){ $tmp_dn= ltrim(strstr($tmp_dn, ","), ","); $tmp= preg_replace('/\/', '\\,', $tmp); /* Check for acl that may apply */ foreach ($sacl as $key => $value){ if (preg_match("/$key$/", $tmp)){ return ($subtreeACL[$key]); } } } return array(""); } function get_module_permission($acl_array, $module, $dn, $checkTag= TRUE){ global $ui, $config; /* Check for strict tagging */ $ttag= ""; if ($checkTag && isset($config->current['STRICT_UNITS']) && preg_match('/^(yes|true)$/i', $config->current['STRICT_UNITS']) && $ui->gosaUnitTag != ""){ $size= 0; foreach ($config->tdepartments as $tdn => $tag){ if (preg_match("/$tdn$/", $dn)){ if (strlen($tdn) > $size){ $size= strlen($tdn); $ttag= $tag; } } } /* We have no permission for areas that don't carry our tag */ if ($ttag != $ui->gosaUnitTag){ return ("#none#"); } } $final= ""; foreach($acl_array as $acl){ /* Check for selfflag (!) in ACL to determine if the user is allowed to change parts of his/her own account */ if (preg_match("/^!/", $acl)){ if ($dn != "" && $dn != $ui->dn){ /* No match for own DN, give up on this ACL */ continue; } else { /* Matches own DN, remove the selfflag */ $acl= preg_replace("/^!/", "", $acl); } } /* Remove leading garbage */ $acl= preg_replace("/^:/", "", $acl); /* Discover if we've access to the submodule by comparing all allowed submodules specified in the ACL */ $tmp= split(",", $acl); foreach ($tmp as $mod){ if (preg_match("/^$module#/", $mod)){ $final= strstr($mod, "#")."#"; continue; } if (preg_match("/[^#]$module$/", $mod)){ return ("#all#"); } if (preg_match("/^all$/", $mod)){ return ("#all#"); } } } /* Return assembled ACL, or none */ if ($final != ""){ return (preg_replace('/##/', '#', $final)); } /* Nothing matches - disable access for this object */ return ("#none#"); } function get_userinfo() { global $ui; return $ui; } function get_smarty() { global $smarty; return $smarty; } function convert_department_dn($dn) { $dep= ""; /* Build a sub-directory style list of the tree level specified in $dn */ 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"; } } /* Return and remove accidently trailing slashes */ return rtrim($dep, "/"); } /* Strip off the last sub department part of a '/level1/level2/.../' * style value. It removes the trailing '/', too. */ function get_sub_department($value) { return (@LDAP::fix(preg_replace("%^.*/([^/]+)/?$%", "\\1", $value))); } function get_ou($name) { global $config; /* Preset ou... */ if (isset($config->current[$name])){ $ou= $config->current[$name]; } else { return ""; } if ($ou != ""){ if (!preg_match('/^[^=]+=[^=]+/', $ou)){ return @LDAP::convert("ou=$ou,"); } else { return @LDAP::convert("$ou,"); } } else { return ""; } } function get_people_ou() { return (get_ou("PEOPLE")); } function get_groups_ou() { return (get_ou("GROUPS")); } function get_winstations_ou() { return (get_ou("WINSTATIONS")); } function get_base_from_people($dn) { global $config; $pattern= "/^[^,]+,".preg_quote(get_people_ou())."/i"; $base= preg_replace($pattern, '', $dn); /* Set to base, if we're not on a correct subtree */ if (!isset($config->idepartments[$base])){ $base= $config->current['BASE']; } return ($base); } function chkacl($acl, $name) { /* Look for attribute in ACL */ if (preg_match("/#$name#/", $acl) || $acl == "#all#"){ return (""); } /* Optically disable html object for no match */ return (" disabled "); } function is_phone_nr($nr) { if ($nr == ""){ return (TRUE); } return preg_match ("/^[\/0-9 ()+*-]+$/", $nr); } function is_dns_name($str) { return(preg_match("/^[a-z0-9\.\-]*$/i",$str)); } function is_url($url) { if ($url == ""){ return (TRUE); } return preg_match ("/^(http|https):\/\/((?:[a-zA-Z0-9_-]+\.?)+):?(\d*)/", $url); } function is_dn($dn) { if ($dn == ""){ return (TRUE); } return preg_match ("/^[a-z0-9 _-]+$/i", $dn); } function is_uid($uid) { global $config; if ($uid == ""){ return (TRUE); } /* STRICT adds spaces and case insenstivity to the uid check. This is dangerous and should not be used. */ if (isset($config->current['STRICT']) && preg_match('/^(no|false)$/i', $config->current['STRICT'])){ return preg_match ("/^[a-z0-9 _.-]+$/i", $uid); } else { return preg_match ("/^[a-z0-9_-]+$/", $uid); } } function is_ip($ip) { return preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/", $ip); } function is_mac($mac) { return preg_match("/^[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]:[a-f0-9][a-f0-9]$/i", $mac); } /* Checks if the given ip address doesn't match "is_ip" because there is also a sub net mask given */ function is_ip_with_subnetmask($ip) { /* Generate list of valid submasks */ $res = array(); for($e = 0 ; $e <= 32; $e++){ $res[$e] = $e; } $i[0] =255; $i[1] =255; $i[2] =255; $i[3] =255; for($a= 3 ; $a >= 0 ; $a --){ $c = 1; while($i[$a] > 0 ){ $str = $i[0].".".$i[1].".".$i[2].".".$i[3]; $res[$str] = $str; $i[$a] -=$c; $c = 2*$c; } } $res["0.0.0.0"] = "0.0.0.0"; if(preg_match("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/", $ip)){ $mask = preg_replace("/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.". "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/","",$ip); $mask = preg_replace("/^\//","",$mask); if((in_array("$mask",$res)) && preg_match("/^[0-9\.]/",$mask)){ return(TRUE); } } return(FALSE); } /* Simple is domain check, it checks if the given string looks like "string(...).string" */ function is_domain($str) { return(preg_match("/^([a-z0-9i\-]*)\.[a-z0-9]*$/i",$str)); } function is_id($id) { if ($id == ""){ return (FALSE); } return preg_match ("/^[0-9]+$/", $id); } function is_path($path) { if ($path == ""){ return (TRUE); } if (!preg_match('/^[a-z0-9%\/_.+-]+$/i', $path)){ return (FALSE); } return preg_match ("/\/.+$/", $path); } function is_email($address, $template= FALSE) { if ($address == ""){ return (TRUE); } if ($template){ return preg_match ("/^[._a-z0-9%-]+@[_a-z0-9-]+(\.[a-z0-9-]+)(\.[a-z0-9-]+)*$/i", $address); } else { return preg_match ("/^[._a-z0-9-]+@[_a-z0-9-]+(\.[a-z0-9i-]+)(\.[a-z0-9-]+)*$/i", $address); } } function print_red() { /* Check number of arguments */ if (func_num_args() < 1){ return; } /* Get arguments, save string */ $array = func_get_args(); $string= $array[0]; /* Step through arguments */ for ($i= 1; $i/', ' ', $string); $img= "images/warning.png"; $addmsg= _("Please check your input and fix the error. Press 'OK' to close this message box."); } if(isset($_SESSION['errors']) && strlen($_SESSION['errors'])==0) { if(preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])){ $_SESSION['errors'].= "
"; $hide = "hide(\"e_layer\");hide(\"e_layer2\");hide(\"e_layer3\");"; }else{ $_SESSION['errors'].= "
"; $hide = "hide(\"e_layer\");hide(\"e_layer2\");"; } $_SESSION['errors'].= "
". "". "
$string

$addmsg

"; } }else{ return; } $_SESSION['errorsAlreadyPosted'][$string] = 1; } } else { echo "Error: $string\n"; } $_SESSION['LastError'] = $string; } function gen_locked_message($user, $dn) { global $plug, $config; $_SESSION['dn']= $dn; $ldap= $config->get_ldap_link(); $ldap->cat ($user, array('uid', 'cn')); $attrs= $ldap->fetch(); /* Stop if we have no user here... */ if (count($attrs)){ $uid= $attrs["uid"][0]; $cn= $attrs["cn"][0]; } else { $uid= $attrs["uid"][0]; $cn= $attrs["cn"][0]; } $remove= false; if((isset($_SESSION['LOCK_VARS_TO_USE']))&&(count($_SESSION['LOCK_VARS_TO_USE']))){ $_SESSION['LOCK_VARS_USED'] =array(); foreach($_SESSION['LOCK_VARS_TO_USE'] as $name){ if(empty($name)) continue; foreach($_POST as $Pname => $Pvalue){ if(preg_match($name,$Pname)){ $_SESSION['LOCK_VARS_USED'][$Pname] = $_POST[$Pname]; } } foreach($_GET as $Pname => $Pvalue){ if(preg_match($name,$Pname)){ $_SESSION['LOCK_VARS_USED'][$Pname] = $_GET[$Pname]; } } } $_SESSION['LOCK_VARS_TO_USE'] =array(); } /* Prepare and show template */ $smarty= get_smarty(); $smarty->assign ("dn", $dn); if ($remove){ $smarty->assign ("action", _("Continue anyway")); } else { $smarty->assign ("action", _("Edit anyway")); } $smarty->assign ("message", sprintf(_("You're going to edit the LDAP entry '%s' which appears to be used by '%s'. Please contact the person in order to clarify proceedings."), "".$dn."", "$cn")); return ($smarty->fetch (get_template_path('islocked.tpl'))); } function to_string ($value) { /* If this is an array, generate a text blob */ if (is_array($value)){ $ret= ""; foreach ($value as $line){ $ret.= $line."
\n"; } return ($ret); } else { return ($value); } } function get_printer_list($cups_server) { global $config; $res= array(); /* Use CUPS, if we've access to it */ if (function_exists('cups_get_dest_list')){ $dest_list= cups_get_dest_list ($cups_server); foreach ($dest_list as $prt){ $attr= cups_get_printer_attributes ($cups_server, $prt->name); foreach ($attr as $prt_info){ if ($prt_info->name == "printer-info"){ $info= $prt_info->value; break; } } $res[$prt->name]= "$info [$prt->name]"; } /* CUPS is not available, try lpstat as a replacement */ } else { $ar = false; exec("lpstat -p", $ar); foreach($ar as $val){ @list($dummy, $printer, $rest)= split(' ', $val, 3); if (preg_match('/^[^@]+$/', $printer)){ $res[$printer]= "$printer"; } } } /* Merge in printers from LDAP */ $ldap= $config->get_ldap_link(); $ldap->cd ($config->current['BASE']); $ui= get_userinfo(); if (isset($config->current['STRICT_UNITS']) && preg_match('/TRUE/i', $config->current['STRICT_UNITS']) && $ui->gosaUnitTag != ""){ $ldap->search('((objectClass=gotoPrinter)(gosaUnitTag='.$ui->gosaUnitTag.'))', array('cn')); } else { $ldap->search('(objectClass=gotoPrinter)', array('cn')); } while($attrs = $ldap->fetch()){ $res[$attrs['cn'][0]] = $attrs['cn'][0]; } return $res; } function sess_del ($var) { /* New style */ unset ($_SESSION[$var]); /* ... work around, since the first one doesn't seem to work all the time */ session_unregister ($var); } function show_errors($message) { $complete= ""; /* Assemble the message array to a plain string */ foreach ($message as $error){ if ($complete == ""){ $complete= $error; } else { $complete= "$error
$complete"; } } /* Fill ERROR variable with nice error dialog */ print_red($complete); } function show_ldap_error($message, $addon= "") { if (!preg_match("/Success/i", $message)){ if ($addon == ""){ print_red (_("LDAP error: $message")); } else { print_red ("$addon

"._("LDAP error:")." $message"); } return TRUE; } else { return FALSE; } } function rewrite($s) { global $REWRITE; foreach ($REWRITE as $key => $val){ $s= preg_replace("/$key/", "$val", $s); } return ($s); } function dn2base($dn) { global $config; if (get_people_ou() != ""){ $dn= preg_replace('/,'.get_people_ou().'/i' , ',', $dn); } if (get_groups_ou() != ""){ $dn= preg_replace('/,'.get_groups_ou().'/i' , ',', $dn); } $base= preg_replace ('/^[^,]+,/i', '', $dn); return ($base); } function check_command($cmdline) { $cmd= preg_replace("/ .*$/", "", $cmdline); /* Check if command exists in filesystem */ if (!file_exists($cmd)){ return (FALSE); } /* Check if command is executable */ if (!is_executable($cmd)){ return (FALSE); } return (TRUE); } function print_header($image, $headline, $info= "") { $display= "
\n"; $display.= "

\"*\" $headline

\n"; $display.= "
\n"; if ($info != ""){ $display.= "
\n"; $display.= "$info"; $display.= "
\n"; } else { $display.= "
\n"; $display.= " "; $display.= "
\n"; } # if (isset($_SESSION['errors'])){ # $display.= $_SESSION['errors']; # } return ($display); } function register_global($name, $object) { $_SESSION[$name]= $object; } function is_global($name) { return isset($_SESSION[$name]); } function get_global($name) { return $_SESSION[$name]; } function range_selector($dcnt,$start,$range=25,$post_var=false) { /* Entries shown left and right from the selected entry */ $max_entries= 10; /* Initialize and take care that max_entries is even */ $output=""; if ($max_entries & 1){ $max_entries++; } if((!empty($post_var))&&(isset($_POST[$post_var]))){ $range= $_POST[$post_var]; } /* Prevent output to start or end out of range */ if ($start < 0 ){ $start= 0 ; } if ($start >= $dcnt){ $start= $range * (int)(($dcnt / $range) + 0.5); } $numpages= (($dcnt / $range)); if(((int)($numpages))!=($numpages)){ $numpages = (int)$numpages + 1; } if ((((int)$numpages) <= 1 )&&(!$post_var)){ return (""); } $ppage= (int)(($start / $range) + 0.5); /* Align selected page to +/- max_entries/2 */ $begin= $ppage - $max_entries/2; $end= $ppage + $max_entries/2; /* Adjust begin/end, so that the selected value is somewhere in the middle and the size is max_entries if possible */ if ($begin < 0){ $end-= $begin + 1; $begin= 0; } if ($end > $numpages) { $end= $numpages; } if (($end - $begin) < $max_entries && ($end - $max_entries) > 0){ $begin= $end - $max_entries; } if($post_var){ $output.= "
"; }else{ $output.= "
"; } /* Draw decrement */ if ($start > 0 ) { $output.=" ". "\"\""; } /* Draw pages */ for ($i= $begin; $i < $end; $i++) { if ($ppage == $i){ $output.= " ".($i+1)." "; } else { $output.= " ".($i+1)." "; } } /* Draw increment */ if($start < ($dcnt-$range)) { $output.=" ". "\"\""; } if(($post_var)&&($numpages)){ $output.= "
 "._("Entries per page")." 
"; }else{ $output.= ""; } return($output); } function apply_filter() { $apply= ""; $apply= ''. '
'. '
'; return ($apply); } function back_to_main() { $string= '

'; return ($string); } function normalize_netmask($netmask) { /* Check for notation of netmask */ if (!preg_match('/^([0-9]+\.){3}[0-9]+$/', $netmask)){ $num= (int)($netmask); $netmask= ""; for ($byte= 0; $byte<4; $byte++){ $result=0; for ($i= 7; $i>=0; $i--){ if ($num-- > 0){ $result+= pow(2,$i); } } $netmask.= $result."."; } return (preg_replace('/\.$/', '', $netmask)); } return ($netmask); } function netmask_to_bits($netmask) { list($nm0, $nm1, $nm2, $nm3)= split('\.', $netmask); $res= 0; for ($n= 0; $n<4; $n++){ $start= 255; $name= "nm$n"; for ($i= 0; $i<8; $i++){ if ($start == (int)($$name)){ $res+= 8 - $i; break; } $start-= pow(2,$i); } } return ($res); } function recurse($rule, $variables) { $result= array(); if (!count($variables)){ return array($rule); } reset($variables); $key= key($variables); $val= current($variables); unset ($variables[$key]); foreach($val as $possibility){ $nrule= preg_replace("/\{$key\}/", $possibility, $rule); $result= array_merge($result, recurse($nrule, $variables)); } return ($result); } function expand_id($rule, $attributes) { /* Check for id rule */ if(preg_match('/^id(:|#)\d+$/',$rule)){ return (array("\{$rule}")); } /* Check for clean attribute */ if (preg_match('/^%[a-zA-Z0-9]+$/', $rule)){ $rule= preg_replace('/^%/', '', $rule); $val= rewrite(preg_replace('/ /', '', strtolower($attributes[$rule]))); return (array($val)); } /* Check for attribute with parameters */ if (preg_match('/^%[a-zA-Z0-9]+\[[0-9-]+\]$/', $rule)){ $param= preg_replace('/^[^[]+\[([^]]+)]$/', '\\1', $rule); $part= preg_replace('/^%/', '', preg_replace('/\[.*$/', '', $rule)); $val= rewrite(preg_replace('/ /', '', strtolower($attributes[$part]))); $start= preg_replace ('/-.*$/', '', $param); $stop = preg_replace ('/^[^-]+-/', '', $param); /* Assemble results */ $result= array(); for ($i= $start; $i<= $stop; $i++){ $result[]= substr($val, 0, $i); } return ($result); } echo "Error in idgen string: don't know how to handle rule $rule.\n"; return (array($rule)); } function gen_uids($rule, $attributes) { global $config; /* Search for keys and fill the variables array with all possible values for that key. */ $part= ""; $trigger= false; $stripped= ""; $variables= array(); for ($pos= 0; $pos < strlen($rule); $pos++){ if ($rule[$pos] == "{" ){ $trigger= true; $part= ""; continue; } if ($rule[$pos] == "}" ){ $variables[$pos]= expand_id($part, $attributes); $stripped.= "{".$pos."}"; $trigger= false; continue; } if ($trigger){ $part.= $rule[$pos]; } else { $stripped.= $rule[$pos]; } } /* Recurse through all possible combinations */ $proposed= recurse($stripped, $variables); /* Get list of used ID's */ $used= array(); $ldap= $config->get_ldap_link(); $ldap->cd($config->current['BASE']); $ldap->search('(uid=*)'); while($attrs= $ldap->fetch()){ $used[]= $attrs['uid'][0]; } /* Remove used uids and watch out for id tags */ $ret= array(); foreach($proposed as $uid){ /* Check for id tag and modify uid if needed */ if(preg_match('/\{id:\d+}/',$uid)){ $size= preg_replace('/^.*{id:(\d+)}.*$/', '\\1', $uid); for ($i= 0; $i < pow(10,$size); $i++){ $number= sprintf("%0".$size."d", $i); $res= preg_replace('/{id:(\d+)}/', $number, $uid); if (!in_array($res, $used)){ $uid= $res; break; } } } if(preg_match('/\{id#\d+}/',$uid)){ $size= preg_replace('/^.*{id#(\d+)}.*$/', '\\1', $uid); while (true){ mt_srand((double) microtime()*1000000); $number= sprintf("%0".$size."d", mt_rand(0, pow(10, $size)-1)); $res= preg_replace('/{id#(\d+)}/', $number, $uid); if (!in_array($res, $used)){ $uid= $res; break; } } } /* Don't assign used ones */ if (!in_array($uid, $used)){ $ret[]= $uid; } } return(array_unique($ret)); } function array_search_r($needle, $key, $haystack){ foreach($haystack as $index => $value){ $match= 0; if (is_array($value)){ $match= array_search_r($needle, $key, $value); } if ($index==$key && !is_array($value) && preg_match("/$needle/i", $value)){ $match=1; } if ($match){ return 1; } } return 0; } /* Sadly values like memory_limit are perpended by K, M, G, etc. Need to convert... */ function to_byte($value) { $value= strtolower(trim($value)); if(!is_numeric(substr($value, -1))) { switch(substr($value, -1)) { case 'g': $mult= 1073741824; break; case 'm': $mult= 1048576; break; case 'k': $mult= 1024; break; } return ($mult * (int)substr($value, 0, -1)); } else { return $value; } } function in_array_ics($value, $items) { if (!is_array($items)){ return (FALSE); } foreach ($items as $item){ if (strtolower($item) == strtolower($value)) { return (TRUE); } } return (FALSE); } function generate_alphabet($count= 10) { $characters= _("*ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); $alphabet= ""; $c= 0; /* Fill cells with charaters */ for ($i= 0; $i ".$ch." "; if ($c++ == $count){ $alphabet.= ""; $c= 0; } } /* Fill remaining cells */ while ($c++ <= $count){ $alphabet.= " "; } return ($alphabet); } function validate($string) { return (strip_tags(preg_replace('/\0/', '', $string))); } function get_gosa_version() { global $svn_revision, $svn_path; /* Extract informations */ $revision= preg_replace('/^[^0-9]*([0-9]+)[^0-9]*$/', '\1', $svn_revision); /* Release or development? */ if (preg_match('%/gosa/trunk/%', $svn_path)){ return (sprintf(_("GOsa development snapshot (Rev %s)"), $revision)); } else { $release= preg_replace('%^.*/([^/]+)/include/functions.inc.*$%', '\1', $svn_path); return (_("GOsa $release")); } } function rmdirRecursive($path, $followLinks=false) { $dir= opendir($path); while($entry= readdir($dir)) { if(is_file($path."/".$entry) || ((!$followLinks) && is_link($path."/".$entry))) { unlink($path."/".$entry); } elseif (is_dir($path."/".$entry) && $entry!='.' && $entry!='..') { rmdirRecursive($path."/".$entry); } } closedir($dir); return rmdir($path); } function scan_directory($path,$sort_desc=false) { $ret = false; /* is this a dir ? */ if(is_dir($path)) { /* is this path a readable one */ if(is_readable($path)){ /* Get contents and write it into an array */ $ret = array(); $dir = opendir($path); /* Is this a correct result ?*/ if($dir){ while($fp = readdir($dir)) $ret[]= $fp; } } } /* Sort array ascending , like scandir */ sort($ret); /* Sort descending if parameter is sort_desc is set */ if($sort_desc) { $ret = array_reverse($ret); } return($ret); } function clean_smarty_compile_dir($directory) { global $svn_revision; if(is_dir($directory) && is_readable($directory)) { // Set revision filename to REVISION $revision_file= $directory."/REVISION"; /* Is there a stamp containing the current revision? */ if(!file_exists($revision_file)) { // create revision file create_revision($revision_file, $svn_revision); } else { # check for "$config->...['CONFIG']/revision" and the # contents should match the revision number if(!compare_revision($revision_file, $svn_revision)){ // If revision differs, clean compile directory foreach(scan_directory($directory) as $file) { if(($file==".")||($file=="..")) continue; if( is_file($directory."/".$file) && is_writable($directory."/".$file)) { // delete file if(!unlink($directory."/".$file)) { print_red("File ".$directory."/".$file." could not be deleted."); // This should never be reached } } elseif(is_dir($directory."/".$file) && is_writable($directory."/".$file)) { // Just recursively delete it rmdirRecursive($directory."/".$file); } } // We should now create a fresh revision file clean_smarty_compile_dir($directory); } else { // Revision matches, nothing to do } } } else { // Smarty compile dir is not accessible // (Smarty will warn about this) } } function create_revision($revision_file, $revision) { $result= false; if(is_dir(dirname($revision_file)) && is_writable(dirname($revision_file))) { if($fh= fopen($revision_file, "w")) { if(fwrite($fh, $revision)) { $result= true; } } fclose($fh); } else { print_red("Can not write to revision file"); } return $result; } function compare_revision($revision_file, $revision) { // false means revision differs $result= false; if(file_exists($revision_file) && is_readable($revision_file)) { // Open file if($fh= fopen($revision_file, "r")) { // Compare File contents with current revision if($revision == fread($fh, filesize($revision_file))) { $result= true; } } else { print_red("Can not open revision file"); } // Close file fclose($fh); } return $result; } function progressbar($percentage,$width=100,$height=15,$showvalue=false) { $str = ""; // Our return value will be saved in this var $color = dechex($percentage+150); $color2 = dechex(150 - $percentage); $bgcolor= $showvalue?"FFFFFF":"DDDDDD"; $progress = (int)(($percentage /100)*$width); /* Abort printing out percentage, if divs are to small */ /* If theres a better solution for this, use it... */ $str = "
"; if(($height >10)&&($showvalue)){ $str.= " ".$percentage."% "; } $str.= "
"; return($str); } function array_key_ics($ikey, $items) { /* Gather keys, make them lowercase */ $tmp= array(); foreach ($items as $key => $value){ $tmp[strtolower($key)]= $key; } if (isset($tmp[strtolower($ikey)])){ return($tmp[strtolower($ikey)]); } return (""); } function search_config($arr, $name, $return) { if (is_array($arr)){ foreach ($arr as $a){ if (isset($a['CLASS']) && strtolower($a['CLASS']) == strtolower($name)){ if (isset($a[$return])){ return ($a[$return]); } else { return (""); } } else { $res= search_config ($a, $name, $return); if ($res != ""){ return $res; } } } } return (""); } function array_differs($src, $dst) { /* If the count is differing, the arrays differ */ if (count ($src) != count ($dst)){ return (TRUE); } /* So the count is the same - lets check the contents */ $differs= FALSE; foreach($src as $value){ if (!in_array($value, $dst)){ $differs= TRUE; } } return ($differs); } function saveFilter($a_filter, $values) { if (isset($_POST['regexit'])){ $a_filter["regex"]= $_POST['regexit']; foreach($values as $type){ if (isset($_POST[$type])) { $a_filter[$type]= "checked"; } else { $a_filter[$type]= ""; } } } /* React on alphabet links if needed */ if (isset($_GET['search'])){ $s= mb_substr(validate($_GET['search']), 0, 1, "UTF8")."*"; if ($s == "**"){ $s= "*"; } $a_filter['regex']= $s; } return ($a_filter); } /* Escape all preg_* relevant characters */ function normalizePreg($input) { return (addcslashes($input, '[]()|/.*+-')); } /* Escape all LDAP filter relevant characters */ function normalizeLdap($input) { return (addcslashes($input, '()|')); } /* Resturns the difference between to microtime() results in float */ function get_MicroTimeDiff($start , $stop) { $a = split("\ ",$start); $b = split("\ ",$stop); $secs = $b[1] - $a[1]; $msecs= $b[0] - $a[0]; $ret = (float) ($secs+ $msecs); return($ret); } /* Check if the given department name is valid */ function is_department_name_reserved($name,$base) { $reservedName = array("systems","apps","incomming","internal","accounts","fax","addressbook", preg_replace("/ou=(.*),/","\\1",get_people_ou()), preg_replace("/ou=(.*),/","\\1",get_groups_ou())); $follwedNames['/ou=fai,ou=configs,ou=systems,/'] = array("fai","hooks","templates","scripts","disk","packages","variables","profiles"); /* Check if name is one of the reserved names */ if(in_array_ics($name,$reservedName)) { return(true); } /* Check all follow combinations if name is in array && parent base == array_key, return false*/ foreach($follwedNames as $key => $names){ if((in_array_ics($name,$names)) && (preg_match($key,$base))){ return(true); } } return(false); } function is_php4() { if (isset($_SESSION['PHP4COMPATIBLE'])){ return true; } return (preg_match('/^4/', phpversion())); } function gosa_ldap_explode_dn($dn,$config = NULL,$verify_in_ldap=false) { /* Initialize variables */ $ret = array("count" => 0); // Set count to 0 $next = true; // if false, then skip next loops and return $cnt = 0; // Current number of loops $max = 100; // Just for security, prevent looops $ldap = NULL; // To check if created result a valid $keep = ""; // save last failed parse string /* Check each parsed dn in ldap ? */ if($config!=NULL && $verify_in_ldap){ $ldap = $config->get_ldap_link(); } /* Lets start */ $called = false; while(preg_match("/,/",$dn) && $next && $cnt < $max){ $cnt ++; if(!preg_match("/,/",$dn)){ $next = false; } $object = preg_replace("/[,].*$/","",$dn); $dn = preg_replace("/^[^,]+,/","",$dn); $called = true; /* Check if current dn is valid */ if($ldap!=NULL){ $ldap->cd($dn); $ldap->cat($dn,array("dn")); if($ldap->count()){ $ret[] = $keep.$object; $keep = ""; }else{ $keep .= $object.","; } }else{ $ret[] = $keep.$object; $keep = ""; } } /* No dn was posted */ if($cnt == 0 && !empty($dn)){ $ret[] = $dn; } /* Append the rest */ $test = $keep.$dn; if($called && !empty($test)){ $ret[] = $keep.$dn; } $ret['count'] = count($ret) - 1; return($ret); } function get_base_from_hook($dn, $attrib) { global $config; if (isset($config->current['BASE_HOOK'])){ /* Call hook script - if present */ $command= $config->current['BASE_HOOK']; if ($command != ""){ $command.= " '".LDAP::fix($dn)."' $attrib"; if (check_command($command)){ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute"); exec($command, $output); if (preg_match("/^[0-9]+$/", $output[0])){ return ($output[0]); } else { print_red(_("Warning - base_hook is not available. Using default base.")); return ($config->current['UIDBASE']); } } else { print_red(_("Warning - base_hook is not available. Using default base.")); return ($config->current['UIDBASE']); } } else { print_red(_("Warning - no base_hook defined. Using default base.")); return ($config->current['UIDBASE']); } } } /* 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); } function mac2company($mac) { $vendor= ""; /* Generate a normailzed mac... */ $mac= substr(preg_replace('/[:-]/', '', $mac), 0, 6); /* Check for existance of the oui file */ if (!is_readable(CONFIG_DIR."/oui.txt")){ return (""); } /* Open file and look for mac addresses... */ $handle = @fopen(CONFIG_DIR."/oui.txt", "r"); if ($handle) { while (!feof($handle)) { $line = fgets($handle, 4096); if (preg_match("/^$mac/i", $line)){ $vendor= substr($line, 32); } } fclose($handle); } return ($vendor); } function get_languages($languages_in_own_language = FALSE,$strip_region_tag = FALSE) { $tmp = array( "de_DE" => "German", "fr_FR" => "French", "it_IT" => "Italian", "es_ES" => "Spanish", "en_US" => "English", "nl_NL" => "Dutch", "pl_PL" => "Polish", "sv_SE" => "Swedish", "zh_CN" => "Chinese", "ru_RU" => "Russian"); $tmp2= array( "de_DE" => _("German"), "fr_FR" => _("French"), "it_IT" => _("Italian"), "es_ES" => _("Spanish"), "en_US" => _("English"), "nl_NL" => _("Dutch"), "pl_PL" => _("Polish"), "sv_SE" => _("Swedish"), "zh_CN" => _("Chinese"), "ru_RU" => _("Russian")); $ret = array(); if($languages_in_own_language){ $old_lang = setlocale(LC_ALL, 0); foreach($tmp as $key => $name){ $lang = $key.".UTF-8"; setlocale(LC_ALL, $lang); if($strip_region_tag){ $ret[preg_replace("/^([^_]*).*$/","\\1",$key)] = _($name)." (".$tmp2[$key].")"; }else{ $ret[$key] = _($name)."  (".$tmp2[$key].")"; } } setlocale(LC_ALL, $old_lang); }else{ foreach($tmp as $key => $name){ if($strip_region_tag){ $ret[preg_replace("/^([^_]*).*/","\\1",$key)] = _($name); }else{ $ret[$key] = _($name); } } } return($ret); } /* Check if $ip1 and $ip2 represents a valid IP range * returns TRUE in case of a valid range, FALSE in case of an error. */ function is_ip_range($ip1,$ip2) { if(!is_ip($ip1) || !is_ip($ip2)){ return(FALSE); }else{ $ar1 = split("\.",$ip1); $var1 = $ar1[0] * (16777216) + $ar1[1] * (65536) + $ar1[2] * (256) + $ar1[3]; $ar2 = split("\.",$ip2); $var2 = $ar2[0] * (16777216) + $ar2[1] * (65536) + $ar2[2] * (256) + $ar2[3]; return($var1 < $var2); } } /* Check if the specified IP address $address is inside the given network */ function is_in_network($network, $netmask, $address) { $nw= split('\.', $network); $nm= split('\.', $netmask); $ad= split('\.', $address); /* Generate inverted netmask */ for ($i= 0; $i<4; $i++){ $ni[$i]= 255-$nm[$i]; $la[$i]= $nw[$i] | $ni[$i]; } /* Transform to integer */ $first= $nw[0] * (16777216) + $nw[1] * (65536) + $nw[2] * (256) + $nw[3]; $curr= $ad[0] * (16777216) + $ad[1] * (65536) + $ad[2] * (256) + $ad[3]; $last= $la[0] * (16777216) + $la[1] * (65536) + $la[2] * (256) + $la[3]; return ($first < $curr&& $last > $curr); } /* Add a given objectClass to an attrs entry */ function add_objectClass($classes, &$attrs) { if (is_array($classes)){ $list= $classes; } else { $list= array($classes); } foreach ($list as $class){ $attrs['objectClass'][]= $class; } } /* Removes a given objectClass from the attrs entry */ function remove_objectClass($classes, &$attrs) { if (isset($attrs['objectClass'])){ /* Array? */ if (is_array($classes)){ $list= $classes; } else { $list= array($classes); } $tmp= array(); foreach ($attrs['objectClass'] as $oc) { foreach ($list as $class){ if ($oc != $class){ $tmp[]= $oc; } } } $attrs['objectClass']= $tmp; } } /* Returns contents of the given POST variable and check magic quotes settings */ function get_post($name) { if(!isset($_POST[$name])){ trigger_error("Requested POST value (".$name.") does not exists, you should add a check to prevent this message."); return(FALSE); } if(get_magic_quotes_gpc()){ return(stripcslashes($_POST[$name])); }else{ return($_POST[$name]); } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>