+ * 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 mixed $extension The file extension filter - either
+ * an array of desired extension(s),
+ * or a comma-separated list of same
+ * (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).
+ * @param boolean $only_sm When TRUE, a security check will
+ * limit directory access to only
+ * paths within the SquirrelMail
+ * installation currently being used
+ * (optional; default TRUE)
+ *
+ * @return array The requested file/directory list(s).
+ *
+ * @since 1.5.2
+ *
+ */
+function list_files($directory_path, $extensions='', $return_filenames_only=TRUE,
+ $include_directories=TRUE, $directories_only=FALSE,
+ $separate_files_and_directories=FALSE, $only_sm=TRUE) {
+
+ $files = array();
+ $directories = array();
+
+
+ // make sure requested path is under SM_PATH if needed
+ //
+ if ($only_sm) {
+ if (strpos(realpath($directory_path), realpath(SM_PATH)) !== 0) {
+ //plain_error_message(_("Illegal filesystem access was requested"));
+ echo _("Illegal filesystem access was requested");
+ exit;
+ }
+ }
+
+
+ // validate given directory
+ //
+ if (empty($directory_path)
+ || !is_dir($directory_path)
+ || !($DIR = opendir($directory_path))) {
+ return $files;
+ }
+
+
+ // ensure extensions is an array and is properly formatted
+ //
+ if (!empty($extensions)) {
+ if (!is_array($extensions))
+ $extensions = explode(',', $extensions);
+ $temp_extensions = array();
+ foreach ($extensions as $ext)
+ $temp_extensions[] = '.' . trim(trim($ext), '.');
+ $extensions = $temp_extensions;
+ } else $extensions = array();
+
+
+ $directory_path = rtrim($directory_path, '/');