. * */ /** * set_memory_limit * This function attempts to change the php memory limit using init_set. * Will never reduce it below the current setting. */ function set_memory_limit($new_limit) { $current_limit = ini_get('memory_limit'); if ($current_limit == -1) { return; } $current_limit = UI::unformat_bytes($current_limit); $new_limit = UI::unformat_bytes($new_limit); if ($current_limit < $new_limit) { ini_set(memory_limit, $new_limit); } } // set_memory_limit /** * generate_password * This generates a random password of the specified length */ function generate_password($length) { $vowels = 'aAeEuUyY12345'; $consonants = 'bBdDgGhHjJmMnNpPqQrRsStTvVwWxXzZ6789'; $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $consonants[(rand(0, strlen($consonants)-1))]; $alt = 0; } else { $password .= $vowels[(rand(0, strlen($vowels)-1))]; $alt = 1; } } return $password; } // generate_password /** * scrub_in * Run on inputs, stuff that might get stuck in our db */ function scrub_in($input) { if (!is_array($input)) { return stripslashes(htmlspecialchars(strip_tags($input), ENT_QUOTES, AmpConfig::get('site_charset'))); } else { $results = array(); foreach ($input as $item) { $results[] = scrub_in($item); } return $results; } } // scrub_in /** * scrub_out * This function is used to escape user data that is getting redisplayed * onto the page, it htmlentities the mojo * This is the inverse of the scrub_in function */ function scrub_out($string) { return htmlentities($string, ENT_QUOTES, AmpConfig::get('site_charset')); } // scrub_out /** * unhtmlentities * Undoes htmlentities() */ function unhtmlentities($string) { return html_entity_decode($string, ENT_QUOTES, AmpConfig::get('site_charset')); } //unhtmlentities /** * scrub_arg * * This function behaves like escapeshellarg, but isn't broken */ function scrub_arg($arg) { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { return '"' . str_replace(array('"', '%'), array('', ''), $arg) . '"'; } else { return "'" . str_replace("'", "'\\''", $arg) . "'"; } } /** * make_bool * This takes a value and returns what we consider to be the correct boolean * value. We need a special function because PHP considers "false" to be true. */ function make_bool($string) { if (strcasecmp($string, 'false') == 0 || $string == '0') { return false; } return (bool) $string; } // make_bool /** * invert_bool * This returns the opposite of what you've got */ function invert_bool($value) { return make_bool($value) ? false : true; } // invert_bool /** * get_languages * This function does a dir of ./locale and pulls the names of the * different languages installed, this means that all you have to do * is drop one in and it will show up on the context menu. It returns * in the form of an array of names */ function get_languages() { /* Open the locale directory */ $handle = @opendir(AmpConfig::get('prefix') . '/locale'); if (!is_resource($handle)) { debug_event('language', 'Error unable to open locale directory', '1'); } $results = array(); while (false !== ($file = readdir($handle))) { $full_file = AmpConfig::get('prefix') . '/locale/' . $file; /* Check to see if it's a directory */ if (is_dir($full_file) and substr($file, 0, 1) != '.' and $file != 'base') { switch ($file) { case 'af_ZA'; $name = 'Afrikaans'; break; /* Afrikaans */ case 'bg_BG'; $name = 'Български'; break; /* Bulgarian */ case 'ca_ES'; $name = 'Català'; break; /* Catalan */ case 'cs_CZ'; $name = 'Česky'; break; /* Czech */ case 'da_DK'; $name = 'Dansk'; break; /* Danish */ case 'de_DE'; $name = 'Deutsch'; break; /* German */ case 'el_GR'; $name = 'Greek'; break; /* Greek */ case 'en_GB'; $name = 'English (UK)'; break; /* English */ case 'en_US'; $name = 'English (US)'; break; /* English */ case 'es_AR'; $name = 'Español (AR)'; break; /* Spanish */ case 'es_ES'; $name = 'Español'; break; /* Spanish */ case 'es_MX'; $name = 'Español (MX)'; break; /* Spanish */ case 'et_EE'; $name = 'Eesti'; break; /* Estonian */ case 'eu_ES'; $name = 'Euskara'; break; /* Basque */ case 'fi_FI'; $name = 'Suomi'; break; /* Finnish */ case 'fr_FR'; $name = 'Français'; break; /* French */ case 'ga_IE'; $name = 'Gaeilge'; break; /* Irish */ case 'hu_HU'; $name = 'Magyar'; break; /* Hungarian */ case 'is_IS'; $name = 'Icelandic'; break; /* Icelandic */ case 'it_IT'; $name = 'Italiano'; break; /* Italian */ case 'ja_JP'; $name = '日本語'; break; /* Japanese */ case 'ko_KR'; $name = '한국말'; break; /* Korean */ case 'lt_LT'; $name = 'Lietuvių'; break; /* Lithuanian */ case 'lv_LV'; $name = 'Latviešu'; break; /* Latvian */ case 'nb_NO'; $name = 'Norsk'; break; /* Norwegian */ case 'nl_NL'; $name = 'Nederlands'; break; /* Dutch */ case 'no_NO'; $name = 'Norsk bokmål'; break; /* Norwegian */ case 'pl_PL'; $name = 'Polski'; break; /* Polish */ case 'pt_BR'; $name = 'Português Brasileiro'; break; /* Portuguese */ case 'pt_PT'; $name = 'Português'; break; /* Portuguese */ case 'ro_RO'; $name = 'Română'; break; /* Romanian */ case 'ru_RU'; $name = 'Русский'; break; /* Russian */ case 'sk_SK'; $name = 'Slovenčina'; break; /* Slovak */ case 'sl_SI'; $name = 'Slovenščina'; break; /* Slovenian */ case 'sr_CS'; $name = 'Srpski'; break; /* Serbian */ case 'sv_SE'; $name = 'Svenska'; break; /* Swedish */ case 'tr_TR'; $name = 'Türkçe'; break; /* Turkish */ case 'uk_UA'; $name = 'Українська'; break; /* Ukrainian */ case 'vi_VN'; $name = 'Tiếng Việt'; break; /* Vietnamese */ case 'zh_CN'; $name = '简体中文'; break; /* Chinese (simplified)*/ case 'zh_TW'; $name = '繁體中文'; break; /* Chinese (traditional)*/ /* These languages are right to left. */ case 'ar_SA'; $name = 'العربية'; break; /* Arabic */ case 'he_IL'; $name = 'עברית'; break; /* Hebrew */ case 'fa_IR'; $name = 'فارسي'; break; /* Farsi */ default: $name = sprintf(T_('Unknown %s'), ' (' . $file . ')'); break; } // end switch $results[$file] = $name; } } // end while // Sort the list of languages by country code ksort($results); // Prepend English (US) $results = array( "en_US" => "English (US)" ) + $results; return $results; } // get_languages /** * is_rtl * This checks whether to be a rtl language. */ function is_rtl($locale) { return in_array($locale, array("he_IL", "fa_IR", "ar_SA")); } /** * translate_pattern_code * This just contains a keyed array which it checks against to give you the * 'tag' name that said pattern code corrasponds to. It returns false if nothing * is found. */ function translate_pattern_code($code) { $code_array = array('%A'=>'album', '%a'=>'artist', '%c'=>'comment', '%g'=>'genre', '%T'=>'track', '%t'=>'title', '%y'=>'year', '%d'=>'disk', '%o'=>'zz_other'); if (isset($code_array[$code])) { return $code_array[$code]; } return false; } // translate_pattern_code /** * generate_config * * This takes an array of results and re-generates the config file * this is used by the installer and by the admin/system page */ function generate_config($current) { // Start building the new config file $distfile = AmpConfig::get('prefix') . '/config/ampache.cfg.php.dist'; $handle = fopen($distfile, 'r'); $dist = fread($handle, filesize($distfile)); fclose($handle); $data = explode("\n", $dist); $final = ""; foreach ($data as $line) { if (preg_match("/^;?([\w\d]+)\s+=\s+[\"]{1}(.*?)[\"]{1}$/", $line, $matches) || preg_match("/^;?([\w\d]+)\s+=\s+[\']{1}(.*?)[\']{1}$/", $line, $matches) || preg_match("/^;?([\w\d]+)\s+=\s+[\'\"]{0}(.*)[\'\"]{0}$/", $line, $matches)) { $key = $matches[1]; $value = $matches[2]; // Put in the current value if ($key == 'config_version') { $line = $key . ' = ' . escape_ini($value); } elseif ($key == 'secret_key' && !isset($current[$key])) { $secret_key = Core::gen_secure_token(31); if ($secret_key !== false) { $line = $key . ' = "' . escape_ini($secret_key) . '"'; } // Else, unable to generate a cryptographically secure token, use the default one } elseif (isset($current[$key])) { $line = $key . ' = "' . escape_ini($current[$key]) . '"'; unset($current[$key]); } } $final .= $line . "\n"; } return $final; } /** * write_config * * Write new configuration into the current configuration file by keeping old values. */ function write_config($current_file_path) { $new_data = generate_config(parse_ini_file($current_file_path)); // Start writing into the current config file $handle = fopen($current_file_path, 'w+'); fwrite($handle, $new_data, strlen($new_data)); fclose($handle); } /** * escape_ini * * Escape a value used for inserting into an ini file. * Won't quote ', like addslashes does. */ function escape_ini($str) { return str_replace('"', '\"', $str); } // Declare apache_request_headers and getallheaders if it don't exists (PHP <= 5.3 + FastCGI) if (!function_exists('apache_request_headers')) { function apache_request_headers() { $headers = array(); foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); $headers[$name] = $value; } else { if ($name == "CONTENT_TYPE") { $headers["Content-Type"] = $value; } else { if ($name == "CONTENT_LENGTH") { $headers["Content-Length"] = $value; } } } } return $headers; } function getallheaders() { return apache_request_headers(); } } function get_current_path() { if (strlen($_SERVER['PHP_SELF'])) { $root = $_SERVER['PHP_SELF']; } else { $root = $_SERVER['REQUEST_URI']; } return $root; } function get_web_path() { $root = get_current_path(); //$root = rtrim(dirname($root),"/\\"); $root = preg_replace('#(.*)/(\w+\.php)$#', '$1', $root); return $root; }