X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fglobal.php;h=47625ac8429b382af8bb91461520c3b8647500bc;hb=482956f2594e185bf7fa3ba7c2efbb674525943f;hp=b04a5adb2cf7e88069181e636f29825025789030;hpb=6c99d1de81366bceab6c9d6cf12179eedc81f9bc;p=squirrelmail.git diff --git a/functions/global.php b/functions/global.php index b04a5adb..47625ac8 100644 --- a/functions/global.php +++ b/functions/global.php @@ -129,6 +129,91 @@ function sqsession_is_registered ($name) { return $result; } + +/** + * Retrieves a form variable, from a set of possible similarly named + * form variables, based on finding a different, single field. This + * is intended to allow more than one same-named inputs in a single + *
, where the submit button that is clicked tells us which + * input we should retrieve. An example is if we have: + * + * + * + * and we want to know which one of the select inputs should be + * returned as $startMessage (without the suffix!), this function + * decides by looking for either "form_submit_1" or "form_submit_2" + * (both should not appear). In this example, $name should be + * "startMessage" and $indicator_field should be "form_submit". + * + * NOTE that form widgets must be named with the suffix "_1", "_2", "_3" + * and so on, or this function will not work. + * + * If more than one of the indicator fields is found, the first one + * (numerically) will win. + * + * If an indicator field is found without a matching input ($name) + * field, FALSE is returned. + * + * If no indicator fields are found, a field of $name *without* any + * suffix is searched for (but only if $fallback_no_suffix is TRUE), + * and if not found, FALSE is ultimately returned. + * + * It should also be possible to use the same string for both + * $name and $indicator_field to look for the first possible + * widget with a suffix that can be found (and possibly fallback + * to a widget without a suffix). + * + * @param string name the name of the var to search + * @param mixed value the variable to return + * @param string indicator_field the name of the field upon which to base + * our decision upon (see above) + * @param int search constant defining where to look + * @param bool fallback_no_suffix whether or not to look for $name with + * no suffix when nothing else is found + * @param mixed default the value to assign to $value when nothing is found + * @param int typecast force variable to be cast to given type (please + * use SQ_TYPE_XXX constants or set to FALSE (default) + * to leave variable type unmolested) + * + * @return bool whether variable is found. + */ +function sqGetGlobalVarMultiple($name, &$value, $indicator_field, + $search = SQ_INORDER, + $fallback_no_suffix=TRUE, $default=NULL, + $typecast=FALSE) { + + // Set arbitrary max limit -- should be much lower except on the + // search results page, if there are many (50 or more?) mailboxes + // shown, this may not be high enough. Is there some way we should + // automate this value? + // + $max_form_search = 100; + + for ($i = 1; $i <= $max_form_search; $i++) { + if (sqGetGlobalVar($indicator_field . '_' . $i, $temp, $search)) { + return sqGetGlobalVar($name . '_' . $i, $value, $search, $default, $typecast); + } + } + + + // no indicator field found; just try without suffix if allowed + // + if ($fallback_no_suffix) { + return sqGetGlobalVar($name, $value, $search, $default, $typecast); + } + + + // no dice, set default and return FALSE + // + if (!is_null($default)) { + $value = $default; + } + return FALSE; + +} + + /** * Search for the var $name in $_SESSION, $_POST, $_GET, $_COOKIE, or $_SERVER * and set it in provided var. @@ -147,6 +232,11 @@ function sqsession_is_registered ($name) { * @param string name the name of the var to search * @param mixed value the variable to return * @param int search constant defining where to look + * @param mixed default the value to assign to $value when nothing is found + * @param int typecast force variable to be cast to given type (please + * use SQ_TYPE_XXX constants or set to FALSE (default) + * to leave variable type unmolested) + * * @return bool whether variable is found. */ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER, $default = NULL, $typecast = false) { @@ -201,11 +291,12 @@ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER, $default = NULL, $ } if ($result && $typecast) { switch ($typecast) { - case 'int': $value = (int) $value; break; - case 'bool': $value = (bool) $value; break; + case SQ_TYPE_INT: $value = (int) $value; break; + case SQ_TYPE_STRING: $value = (string) $value; break; + case SQ_TYPE_BOOL: $value = (bool) $value; break; default: break; } - } else if (!is_null($default)) { + } else if (!$result && !is_null($default)) { $value = $default; } return $result; @@ -214,6 +305,13 @@ function sqgetGlobalVar($name, &$value, $search = SQ_INORDER, $default = NULL, $ /** * Deletes an existing session, more advanced than the standard PHP * session_destroy(), it explicitly deletes the cookies and global vars. + * + * WARNING: Older PHP versions have some issues with session management. + * See http://bugs.php.net/11643 (warning, spammed bug tracker) and + * http://bugs.php.net/13834. SID constant is not destroyed in PHP 4.1.2, + * 4.2.3 and maybe other versions. If you restart session after session + * is destroyed, affected PHP versions produce PHP notice. Bug should + * be fixed only in 4.3.0 */ function sqsession_destroy() { @@ -418,3 +516,153 @@ function php_self () { return ''; } + + +/** + * Find files and/or directories in a given directory optionally + * limited to only those with the given file extension. If the + * directory is not found or cannot be opened, no error is generated; + * only an empty file list is returned. +FIXME: do we WANT to throw an error or a notice or... or return FALSE? + * + * @param string $directory_path The path (relative or absolute) + * to the desired directory. + * @param string $extension The file extension filter (optional; + * default is to return all files (dirs). + * @param boolean $return_filenames_only When TRUE, only file/dir names + * are returned, otherwise the + * $directory_path string is + * prepended to each file/dir in + * the returned list (optional; + * default is filename/dirname only) + * @param boolean $include_directories When TRUE, directories are + * included (optional; default + * DO include directories). + * @param boolean $directories_only When TRUE, ONLY directories + * are included (optional; default + * is to include files too). + * @param boolean $separate_files_and_directories When TRUE, files and + * directories are returned + * in separate lists, so + * the return value is + * formatted as a two-element + * array with the two keys + * "FILES" and "DIRECTORIES", + * where corresponding values + * are lists of either all + * files or all directories + * (optional; default do not + * split up return array). + * + * + * @return array The requested file/directory list(s). + * + * @since 1.5.2 + * + */ +function list_files($directory_path, $extension='', $return_filenames_only=TRUE, + $include_directories=TRUE, $directories_only=FALSE, + $separate_files_and_directories=FALSE) { + + $files = array(); + $directories = array(); + +//FIXME: do we want to place security restrictions here like only allowing +// directories under SM_PATH? + // validate given directory + // + if (empty($directory_path) + || !is_dir($directory_path) + || !($DIR = opendir($directory_path))) { + return $files; + } + + + if (!empty($extension)) $extension = '.' . trim($extension, '.'); + $directory_path = rtrim($directory_path, '/'); + + + // parse through the files + // + while (($file = readdir($DIR)) !== false) { + + if ($file == '.' || $file == '..') continue; + + if (!empty($extension) + && strrpos($file, $extension) !== (strlen($file) - strlen($extension))) + continue; + + // only use is_dir() if we really need to (be as efficient as possible) + // + $is_dir = FALSE; + if (!$include_directories || $directories_only + || $separate_files_and_directories) { + if (is_dir($directory_path . '/' . $file)) { + if (!$include_directories) continue; + $is_dir = TRUE; + $directories[] = ($return_filenames_only + ? $file + : $directory_path . '/' . $file); + } + if ($directories_only) continue; + } + + if (!$separate_files_and_directories + || ($separate_files_and_directories && !$is_dir)) { + $files[] = ($return_filenames_only + ? $file + : $directory_path . '/' . $file); + } + + } + closedir($DIR); + + + if ($directories_only) return $directories; + if ($separate_files_and_directories) return array('FILES' => $files, + 'DIRECTORIES' => $directories); + return $files; + +} + + +/** + * Print variable + * + * sm_print_r($some_variable, [$some_other_variable [, ...]]); + * + * Debugging function - does the same as print_r, but makes sure special + * characters are converted to htmlentities first. This will allow + * values like to be displayed. + * The output is wrapped in <
> and <
> tags. + * Since 1.4.2 accepts unlimited number of arguments. + * @since 1.4.1 + * @return void + */ +function sm_print_r() { + ob_start(); // Buffer output + foreach(func_get_args() as $var) { + print_r($var); + echo "\n"; + // php has get_class_methods function that can print class methods + if (is_object($var)) { + // get class methods if $var is object + $aMethods=get_class_methods(get_class($var)); + // make sure that $aMethods is array and array is not empty + if (is_array($aMethods) && $aMethods!=array()) { + echo "Object methods:\n"; + foreach($aMethods as $method) { + echo '* ' . $method . "\n"; + } + } + echo "\n"; + } + } + $buffer = ob_get_contents(); // Grab the print_r output + ob_end_clean(); // Silently discard the output & stop buffering + print '
';
+    print htmlentities($buffer);
+    print '
'; +} + +