You are here

function webfm_build_dir_list::webfm_build_dir_list in Web File Manager 5

Same name and namespace in other branches
  1. 5.2 webfm.module \webfm_build_dir_list::webfm_build_dir_list()

File

./webfm.module, line 2080

Class

webfm_build_dir_list
Class to build the directory, file and breadcrumb listings ..for the directory at $path for javascript Load_dirlist()

Code

function webfm_build_dir_list($root, $path, $perm) {
  global $user;
  $bl = array(
    '.',
    '..',
    '.htaccess',
  );
  $_dirs = array();
  $_files = array();
  $full_path = $root . $path;
  if (is_dir($full_path)) {
    chdir($full_path);
    if ($handle = opendir('.')) {

      // breadcrumb keeps file-sys root hidden
      $non_root_arr = explode('/', trim($path, '/'));
      foreach ($non_root_arr as $piece) {
        $this->breadcrumb[] = $piece;
      }
      while (($readdir = readdir($handle)) !== false) {

        // check that directory element is readable and not in black list
        if (!in_array(strtolower($readdir), $bl)) {
          if (is_dir($readdir)) {
            $_dirs[] = $readdir;
          }
          if (is_file($readdir)) {
            $_files[] = $readdir;
          }
        }
      }
      closedir($handle);
    }
    if (is_array($_dirs)) {
      foreach ($_dirs as $dir) {
        $dd = new stdClass();
        $dd->n = $dir;
        $dd->p = $path . "/" . $dir;
        $dd->m = filemtime($dir) ? @filemtime($dir) : "";
        $this->dirs[] = $dd;
      }
    }
    if (is_array($_files)) {
      foreach ($_files as $file) {
        if ($_file = webfm_get_file_record('', $full_path . '/' . $file)) {
          if ($perm == WEBFM_ADMIN || $_file->uid == $user->uid || (int) $_file->perm & WEBFM_FILE_ACCESS_ROLE_FULL || (int) $_file->perm & WEBFM_FILE_ACCESS_ROLE_VIEW) {
            $fd = new stdClass();
            $fd->id = $_file->fid;
            if ((int) $_file->perm & WEBFM_FILE_ACCESS_ROLE_FULL) {

              // A bit of a hack for js functionality but safe since this is
              // always validated on server side
              $fd->u = $user->uid;
            }
            else {
              $fd->u = $_file->uid;
            }
            $_query = 'SELECT name FROM {users} WHERE uid = %d';
            $fd->un = db_result(db_query($_query, $_file->uid));
            $fd->m = @filemtime($file);
            $fd->s = @filesize($file);
          }
          else {

            // permission denied to view this file
            continue;
          }
        }
        else {
          if ($perm == WEBFM_ADMIN) {
            $fd = new stdClass();
            $fd->id = 0;

            //invalid fid signals no db entry
            $fd->u = 0;

            //file has no owner
            $_query = 'SELECT name FROM {users} WHERE uid = %d';
            $fd->un = db_result(db_query($_query, $fd->u));
            $fd->m = @filemtime($file);
            $fd->s = @filesize($file);
          }
          else {

            // permission denied to view this file
            continue;
          }
        }
        if (variable_get('webfm_display_title', '') && $_file->ftitle) {
          $fd->ftitle = urldecode($_file->ftitle);
        }
        $fd->n = $file;
        $fd->p = $path;
        $fd->i = 0;
        if (strpos($file, ".") === FALSE) {
          $fd->e = "";
        }
        else {
          $fd->e = array_pop(explode('.', $file));
          $mime_type = webfm_mime_type($file);
          if (preg_match('/^image/', $mime_type)) {
            if (!function_exists('exif_imagetype')) {
              if ($i = @getimagesize($file)) {

                //if valid width/height...
                if ($i[0] != 0 && $i[1] != 0) {

                  //return type
                  $fd->i = $i[2];
                }
              }
            }
            else {
              if ($i = @exif_imagetype($file)) {
                $fd->i = $i;
              }
            }
          }
        }
        $this->files[] = $fd;
      }
    }
  }
}