index 192a0bb1b54b7858f53b6b590f18c98b0faa3bde..c7acab6c24524d2180e2d1ff481f6b58189ecb94 100644 (file)
/*! \file
* Common functions and named definitions. */
+/* Define globals for revision comparing */
+$svn_path = '$HeadURL$';
+$svn_revision = '$Revision$';
+
/* Configuration file location */
if(!isset($_SERVER['CONFIG_DIR'])){
define ("CONFIG_DIR", "/etc/gosa");
define('DES3_CBC_MD5',5);
define('DES3_CBC_SHA1',16);
-/* Define globals for revision comparing */
-$svn_path = '$HeadURL$';
-$svn_revision = '$Revision$';
-
/* Include required files */
-require_once("class_location.inc");
+include_once("class_location.inc");
require_once ("functions_debug.inc");
require_once ("accept-to-gettext.inc");
"ñ" => "ny",
"Ñ" => "Ny" );
+/*! \brief Cyrillic (russian) fonetic transliteration (converts russian letters to ASCII and backward according to GOST 7.79-2000 )
+ * \param string 'str' Source string in russian codepage
+ * \return string Translitered string value.
+ */
+function cyrillic2ascii($str) {
+ $ru = array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я',
+ 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'H', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
+ 'ґ', 'є', 'ї', 'Ґ', 'Є', 'Ї'
+ );
+ $en = array('a', 'b', 'v', 'g', 'd', 'e', 'jo','zh','z', 'i', 'jj','k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'kh','c', 'ch','sh','shh','"', 'y', '\'','eh','ju','ja',
+ 'A', 'B', 'V', 'G', 'D', 'E', 'Jo','Je','Z', 'I', 'Jj','K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'Kh','C', 'CH','SH','Shh','"', 'Y', '\'','Eh','Ju','Ja',
+ 'g', 'ye','yi','G', 'Ye','Yi'
+ );
+
+ return str_replace($ru, $en, $str);
+}
+
/*! \brief Does autoloading for classes used in GOsa.
*
}
-/*! \brief Debug level action
+/*! \brief DEBUG level action
*
- * Print a DEBUG level if specified debug level of the level matches the
+ * print a DEBUG level if specified debug level of the level matches the
* the configured debug level.
*
* \param int 'level' The log level of the message (should use the constants,
if($config->get_cfg_value("core","loginAttribute") != ""){
$tmp = explode(",", $config->get_cfg_value("core","loginAttribute"));
foreach($tmp as $attr){
- if(in_array($attr,$allowed_attributes)){
+ if(in_array_strict($attr,$allowed_attributes)){
$verify_attr[] = $attr;
}
}
// Fetch required attributes
foreach(array('shadowExpire','shadowLastChange','shadowMax','shadowMin',
- 'shadowInactive','shadowWarning') as $attr){
+ 'shadowInactive','shadowWarning','sambaKickoffTime') as $attr){
$$attr = (isset($attrs[$attr][0]))? $attrs[$attr][0] : null;
}
+ // Check if the account has reached its kick off limitations.
+ // ---------------------------------------------------------
+ // Once the accout reaches the kick off limit it has expired.
+ if($sambaKickoffTime !== null){
+ if(time() >= $sambaKickoffTime){
+ return(POSIX_ACCOUNT_EXPIRED);
+ }
+ }
+
+
// Check if the account has expired.
// ---------------------------------
// An account is locked/expired once its expiration date has reached (shadowExpire).
// If the optional attribute (shadowInactive) is set, we've to postpone
// the account expiration by the amount of days specified in (shadowInactive).
- if($shadowExpire != null && $shadowExpire >= $current){
+ if($shadowExpire != null && $shadowExpire <= $current){
// The account seems to be expired, but we've to check 'shadowInactive' additionally.
// ShadowInactive specifies an amount of days we've to reprieve the user.
global $config;
if(!$config->configRegistry->propertyExists($class,$name)){
- trigger_error("No department mapping found for type ".$name);
+ if($config->boolValueIsTrue("core","developmentMode")){
+ trigger_error("No department mapping found for type ".$name);
+ }
return "";
}
}
-/*! \brief Recursion helper for gen_id() */
-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= str_replace("{$key}", $possibility, $rule);
- $result= array_merge($result, recurse($nrule, $variables));
- }
-
- return ($result);
-}
-
-
-/*! \brief Expands user ID based on possible rules
- *
- * Unroll given rule string by filling in attributes.
- *
- * \param string 'rule' The rule string from gosa.conf.
- * \param array 'attributes' A dictionary of attribute/value mappings
- * \return string Expanded string, still containing the id keyword.
- */
-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(str_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(str_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 idGenerator string: don't know how to handle rule $rule.\n";
- return (array($rule));
-}
-
-
-/*! \brief Generate a list of uid proposals based on a rule
- *
- * Unroll given rule string by filling in attributes and replacing
- * all keywords.
- *
- * \param string 'rule' The rule string from gosa.conf.
- * \param array 'attributes' A dictionary of attribute/value mappings
- * \return array List of valid not used uids
- */
-function gen_uids($rule, $attributes)
-{
- global $config;
-
- // Strip out non ascii chars
- foreach($attributes as $name => $value){
- $value = iconv('UTF-8', 'US-ASCII//TRANSLIT', $value);
- $value = preg_replace('/[^(\x20-\x7F)]*/','',$value);
- $attributes[$name] = $value;
- }
-
- /* Search for keys and fill the variables array with all
- possible values for that key. */
- $part= "";
- $trigger= false;
- $stripped= "";
- $variables= array();
-
- for ($pos= 0, $l= strlen($rule); $pos < $l; $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 */
- $ldap= $config->get_ldap_link();
- $ldap->cd($config->current['BASE']);
-
- /* 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, $m)){
- $size= preg_replace('/^.*{id(:|!)(\d+)}.*$/', '\\2', $uid);
-
- $start= $m[1]==":"?0:-1;
- for ($i= $start, $p= pow(10,$size)-1; $i < $p; $i++){
- if ($i == -1) {
- $number= "";
- } else {
- $number= sprintf("%0".$size."d", $i+1);
- }
- $res= preg_replace('/{id(:|!)\d+}/', $number, $uid);
-
- $ldap->search("(uid=".preg_replace('/[{}]/', '', $res).")",array('dn'));
- if($ldap->count() == 0){
- $uid= $res;
- break;
- }
- }
-
- /* Remove link if nothing has been found */
- $uid= preg_replace('/{id(:|!)\d+}/', '', $uid);
- }
-
- 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);
- $ldap->search("(uid=".preg_replace('/[{}]/', '', $res).")",array('dn'));
- if($ldap->count() == 0){
- $uid= $res;
- break;
- }
- }
-
- /* Remove link if nothing has been found */
- $uid= preg_replace('/{id#\d+}/', '', $uid);
- }
-
- /* Don't assign used ones */
- $ldap->search("(uid=".preg_replace('/[{}]/', '', $uid).")",array('dn'));
- if($ldap->count() == 0){
- /* Add uid, but remove {} first. These are invalid anyway. */
- $ret[]= preg_replace('/[{}]/', '', $uid);
- }
- }
-
- return(array_unique($ret));
-}
-
-
/*! \brief Convert various data sizes to bytes
*
* Given a certain value in the format n(g|m|k), where n
@@ -2901,7 +2750,7 @@ function get_languages($languages_in_own_language = FALSE,$strip_region_tag = FA
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.");
+ trigger_error("Requested POST value (".$name.") does not exist, you should add a check to prevent this message.");
return(FALSE);
}
@@ -3058,9 +2907,14 @@ function change_password ($dn, $password, $mode=FALSE, $hash= "", $old_password
$attrs= array();
if (!$mode && !empty($tmp)){
$attrs= generate_smb_nt_hash($password);
- $shadow = (isset($attrs["shadowLastChange"][0]))?(int)(date("U") / 86400):0;
- if ($shadow != 0){
- $attrs['shadowLastChange']= $shadow;
+ if(!count($attrs) || !is_array($attrs)){
+ msg_dialog::display(_("Error"),_("Cannot generate SAMBA hash!"),ERROR_DIALOG);
+ return(FALSE);
+ }else{
+ $shadow = (isset($attrs["shadowLastChange"][0]))?(int)(date("U") / 86400):0;
+ if ($shadow != 0){
+ $attrs['shadowLastChange']= $shadow;
+ }
}
}
$hash = $rpc->mksmbhash($password);
if(!$rpc->success()){
msg_dialog::display(_("Error"),msgPool::rpcError($rpc->get_error()),ERROR_DIALOG);
- return("");
+ return(array());
}
}elseif ($config->get_cfg_value("core","gosaSupportURI") != ""){
if ($hash == "") {
msg_dialog::display(_("Configuration error"), sprintf(_("Generating SAMBA hash by running %s failed: check %s!"), bold($config->get_cfg_value("core",'sambaHashHook'), bold("sambaHashHook"))), ERROR_DIALOG);
- return ("");
+ return(array());
}
}
$base= get_base_from_hook($dn, $attrib);
}
for ($id= $base; $id++; $id < pow(2,32)){
- if (!in_array($id, $ids)){
+ if (!in_array_strict($id, $ids)){
return ($id);
}
}
$label= null;
// Bail out, if there's no style file
+ if(!class_exists('session')){
+ return "";
+ }
if(!session::global_is_set("img-styles")){
// Get theme
/*! \brief Detect the special character handling for the currently used ldap database.
+ * For example some convert , to \2C or " to \22.
+ *
* @param Config The GOsa configuration object.
* @return Array An array containing a character mapping the use.
*/
global $config;
if(!$config) return(NULL);
- $testChars = array(',','"');
-
// In the DN we've to use escaped characters, but the object name (o)
// has the be un-escaped.
- $dnName = $name = "GOsaLdapEncoding_";
- foreach($testChars as $char){
- $dnName .= "\\{$char}_";
- $name .= "{$char}_";
- }
-
+ $name = 'GOsaLdapEncoding_,_"_(_)_+_/';
+ $dnName = 'GOsaLdapEncoding_\,_\"_(_)_\+_/';
+
+ // Prapare name to be useable in filters
+ $fixed= normalizeLdap(str_replace('\\\\', '\\\\\\', $name));
+ $filterName = str_replace('\\,', '\\\\,', $fixed);
+
// Create the target dn
- $oDN = "o=".LDAP::convert($dnName).",".$config->current['BASE'];
-
- // Create the object on demand.
- $ldap = $config->get_ldap_link();
- $ldap->cd($config->current['BASE']);
- if(!$ldap->dn_exists($oDN)){
+ $oDN = "o={$dnName},".$config->current['BASE'];
+
+ // Get ldap connection and check if we've already created the character
+ // detection object.
+ $ldapCID = ldap_connect($config->current['SERVER']);
+ ldap_set_option($ldapCID, LDAP_OPT_PROTOCOL_VERSION, 3);
+ ldap_bind($ldapCID, $config->current['ADMINDN'],$config->current['ADMINPASSWORD']);
+ $res = ldap_list($ldapCID, $config->current['BASE'],
+ "(&(o=".$filterName.")(objectClass=organization))",
+ array('dn'));
+
+ // If we haven't created the character-detection object, then create it now.
+ $cnt = ldap_count_entries($ldapCID, $res);
+ if(!$cnt){
$obj = array();
$obj['objectClass'] = array('top','organization');
$obj['o'] = $name;
$obj['description'] = 'GOsa character encoding test-object.';
- $ldap->cd($oDN);
- $ldap->add($obj);
+ if(!@ldap_add($ldapCID, $oDN, $obj)){
+ trigger_error("GOsa couldn't detect the special character handling used by your ldap!");
+ return(NULL);
+ }
}
-
- // Read the encoding instruction set.
- $ldap->cd($config->current['BASE']);
- $ldap->ls("(&(o={$name})(objectClass=organization))");
-
- if(!$ldap->count() == 1){
- trigger_error("GOsa couldn't detect the special character encoding used by your ldap!");
+ // Read the character-handling detection entry from the ldap.
+ $res = ldap_list($ldapCID, $config->current['BASE'],
+ "(&(o=".$filterName.")(objectClass=organization))",
+ array('dn','o'));
+ $cnt = ldap_count_entries($ldapCID, $res);
+ if($cnt != 1 || !$res){
+ trigger_error("GOsa couldn't detect the special character handling used by your ldap!");
return(NULL);
}else{
- $re = ldap_first_entry($ldap->cid, $ldap->getSearchResultHandle());
- $attrs= ldap_get_attributes($ldap->cid, $re);
- $attrs['dn']= trim(ldap_get_dn($ldap->cid, $re));
- $o = $attrs['o'][0];
- $dn = $attrs['dn'];
- $mapOstr = preg_replace("/^GOsaLdapEncoding_/","",$o);
- $mapO = preg_split("/_/", $mapOstr,0, PREG_SPLIT_NO_EMPTY);
- $mapDNstr = preg_replace("/^o=GOsaLdapEncoding_([^,]*),.*$/","\\1",$dn);
+ // Get the character handling entry from the ldap and check how the
+ // values were written. Compare them with what
+ // we've initially intended to write and create a mapping out
+ // of the results.
+ $re = ldap_first_entry($ldapCID, $res);
+ $attrs = ldap_get_attributes($ldapCID, $re);
+
+ // Extract the interessting characters out of the dn and the
+ // initially used $name for the entry.
+ $mapDNstr = preg_replace("/^o=GOsaLdapEncoding_([^,]*),.*$/","\\1", trim(ldap_get_dn($ldapCID, $re)));
$mapDN = preg_split("/_/", $mapDNstr,0, PREG_SPLIT_NO_EMPTY);
+ $mapNameStr = preg_replace("/^GOsaLdapEncoding_/","",$dnName);
+ $mapName = preg_split("/_/", $mapNameStr,0, PREG_SPLIT_NO_EMPTY);
+
+ // Create a mapping out of the results.
$map = array();
- foreach($mapO as $key => $entry){
+ foreach($mapName as $key => $entry){
$map[$entry] = $mapDN[$key];
- $map[$mapDN[$key]] = $entry;
}
return($map);
}
return(NULL);
}
+
+/*! \brief Replaces placeholder in a given string.
+ * For example:
+ * '%uid@gonicus.de' Replaces '%uid' with 'uid'.
+ * '{%uid[0]@gonicus.de}' Replaces '%uid[0]' with the first char of 'uid'.
+ * '%uid[2-4]@gonicus.de' Replaces '%uid[2-4]' with three chars from 'uid' starting from the second.
+ *
+ * The surrounding {} in example 2 are optional.
+ *
+ * @param String The string to perform the action on.
+ * @param Array An array of replacements.
+ * @return The resulting string.
+ */
+function fillReplacements($str, $attrs, $shellArg = FALSE, $default = "")
+{
+ // Search for '{%...[n-m]}
+ // Get all matching parts of the given string and sort them by
+ // length, to avoid replacing strings like '%uidNumber' with 'uid'
+ // instead of 'uidNumber'; The longest tring at first.
+ preg_match_all('/(\{?%([a-z0-9_]+)(\[(([0-9_]+)(\-([0-9_]+))?)\])?\}?)/i', $str ,$matches, PREG_SET_ORDER);
+ $hits = array();
+ foreach($matches as $match){
+ $hits[strlen($match[2]).$match[0]] = $match;
+ }
+ krsort($hits);
+
+ // Add lower case placeholders to avoid errors
+ foreach($attrs as $key => $attr) $attrs[strtolower($key)] = $attr;
+
+ // Replace the placeholder in the given string now.
+ foreach($hits as $match){
+
+ // Avoid errors about undefined index.
+ $name = strtolower($match[2]);
+ if(!isset($attrs[$name])) $attrs[$name] = $default;
+
+ // Calculate the replacement
+ $start = (isset($match[5])) ? $match[5] : 0;
+ $end = strlen($attrs[$name]);
+ if(isset($match[5]) && !isset($match[7])){
+ $end = 1;
+ }elseif(isset($match[5]) && isset($match[7])){
+ $end = ($match[7]-$start+1);
+ }
+ $value = substr($attrs[$name], $start, $end);
+
+ // Use values which are valid for shell execution?
+ if($shellArg) $value = escapeshellarg($value);
+
+ // Replace the placeholder within the string.
+ $str = preg_replace("/".preg_quote($match[0],'/')."/", $value, $str);
+ }
+ return($str);
+}
+
+
+/*! \brief Generate a list of uid proposals based on a rule
+ *
+ * Unroll given rule string by filling in attributes and replacing
+ * all keywords.
+ *
+ * \param string 'rule' The rule string from gosa.conf.
+ * \param array 'attributes' A dictionary of attribute/value mappings
+ * \return array List of valid not used uids
+ */
+function gen_uids($rule, $attributes)
+{
+ global $config;
+ $ldap = $config->get_ldap_link();
+ $ldap->cd($config->current['BASE']);
+
+ @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $rule, "Processing");
+
+ // Strip out non ascii chars
+ foreach($attributes as $name => $value){
+ if ( $config->get_cfg_value("core", "forceTranslit") == "true" ) {
+ $value = cyrillic2ascii($value);
+ } else {
+ $value = iconv('UTF-8', 'US-ASCII//TRANSLIT', $value);
+ }
+ $value = preg_replace('/[^(\x20-\x7F)]*/','',$value);
+ $attributes[$name] = strtolower($value);
+ }
+
+ @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $attributes, "Prepare");
+
+ // Search for '{%...[n-m]}
+ // Get all matching parts of the given string and sort them by
+ // length, to avoid replacing strings like '%uidNumber' with 'uid'
+ // instead of 'uidNumber'; The longest tring at first.
+ preg_match_all('/(\{?%([a-z0-9]+)(\[(([0-9]+)(\-([0-9]+))?)\])?\}?)/i', $rule ,$matches, PREG_SET_ORDER);
+ $replacements = array();
+ foreach($matches as $match){
+
+ // No start position given, then add the complete value
+ if(!isset($match[5])){
+ $replacements[$match[0]][] = $attributes[$match[2]];
+
+ // Start given but no end, so just add a single character
+ }elseif(!isset($match[7])){
+ if(isset($attributes[$match[2]][$match[5]])){
+ $tmp = " ".$attributes[$match[2]];
+ $replacements[$match[0]][] = trim($tmp[$match[5]]);
+ }
+
+ // Add all values in range
+ }else{
+ $str = "";
+ for($i=$match[5]; $i<= $match[7]; $i++){
+ if(isset($attributes[$match[2]][$i])){
+ $tmp = " ".$attributes[$match[2]];
+ $str .= $tmp[$i];
+ $replacements[$match[0]][] = trim($str);
+ }
+ }
+ }
+ }
+
+ // Create proposal array
+ $rules = array($rule);
+ foreach($replacements as $tag => $values){
+ $rules = gen_uid_proposals($rules, $tag, $values);
+ }
+
+
+ // Search for id tags {id:3} / {id#3}
+ preg_match_all('/\{id(#|:)([0-9])+\}/i', $rule, $matches, PREG_SET_ORDER);
+ $idReplacements = array();
+ foreach($matches as $match){
+ if(count($match) != 3) continue;
+
+ // Generate random number
+ if($match[1] == '#'){
+ foreach($rules as $id => $ruleStr){
+ $genID = rand(pow(10,$match[2] -1),pow(10, ($match[2])) - 1);
+ $rules[$id] = preg_replace("/".preg_quote($match[0],'/')."/", $genID,$ruleStr);
+ }
+ }
+
+ // Search for next free id
+ if($match[1] == ':'){
+
+ // Walk through rules and replace all occurences of {id:..}
+ foreach($rules as $id => $ruleStr){
+ $genID = 0;
+ $start = TRUE;
+ while($start || $ldap->count()){
+ $start = FALSE;
+ $number= sprintf("%0".$match[2]."d", $genID);
+ $testRule = preg_replace("/".preg_quote($match[0],'/')."/",$number,$ruleStr);
+ $ldap->search('uid='.normalizeLdap($testRule));
+ $genID ++;
+ }
+ $rules[$id] = preg_replace("/".preg_quote($match[0],'/')."/",$number,$ruleStr);
+ }
+ }
+ }
+
+ // Create result set by checking which uid is already used and which is free.
+ $ret = array();
+ foreach($rules as $rule){
+ $ldap->search('uid='.normalizeLdap($rule));
+ if(!$ldap->count()){
+ $ret[] = $rule;
+ }
+ }
+
+ return($ret);
+}
+
+
+function gen_uid_proposals(&$rules, $tag, $values)
+{
+ $newRules = array();
+ foreach($rules as $rule){
+ foreach($values as $value){
+ $newRules[] = preg_replace("/".preg_quote($tag,'/')."/", $value, $rule);
+ }
+ }
+ return($newRules);
+}
+
+
+function gen_uuid()
+{
+ return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
+ // 32 bits for "time_low"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_mid"
+ mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_hi_and_version",
+ // four most significant bits holds version number 4
+ mt_rand( 0, 0x0fff ) | 0x4000,
+
+ // 16 bits, 8 bits for "clk_seq_hi_res",
+ // 8 bits for "clk_seq_low",
+ // two most significant bits holds zero and one for variant DCE1.1
+ mt_rand( 0, 0x3fff ) | 0x8000,
+
+ // 48 bits for "node"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
+ );
+}
+
+function gosa_file_name($filename)
+{
+ $tempfile = tempnam(sys_get_temp_dir(), 'GOsa');
+ if(move_uploaded_file($filename, $tempfile)){
+ return( $tempfile);
+ }
+}
+
+function gosa_file($filename)
+{
+ $tempfile = tempnam(sys_get_temp_dir(), 'GOsa');
+ if(move_uploaded_file($filename, $tempfile)){
+ return file( $tempfile );
+ }
+}
+
+function gosa_fopen($filename, $mode)
+{
+ $tempfile = tempnam(sys_get_temp_dir(), 'GOsa');
+ if(move_uploaded_file($filename, $tempfile)){
+ return fopen( $tempfile, $mode );
+ }
+}
+
+
+/*\brief Our own in_array method which defaults to a strict mode.
+ */
+function in_array_strict($needle, $haystack, $strict = TRUE)
+{
+ return(in_array($needle, $haystack, $strict));
+}
+
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>