You are here

function imagepicker_files_validate in Image Picker 5.2

Same name and namespace in other branches
  1. 6.2 imagepicker.admin.inc \imagepicker_files_validate()
1 call to imagepicker_files_validate()
imagepicker_convert_form_submit in ./imagepicker.module

File

./imagepicker.module, line 3656
Enables permitted roles to upload images for insertion into configured nodes.

Code

function imagepicker_files_validate($dir) {
  $fstype = variable_get('imagepicker_fstype', '');
  $result = TRUE;
  $errlist = array();
  $uidlist = array();
  if ($fstype == 'numeric') {
    $baddirlist = array();
    $numericdirlist = file_scan_directory($dir, ".*", array(
      '.',
      '..',
      'CVS',
    ), 0, FALSE);
    foreach ($numericdirlist as $k => $v) {
      if (is_numeric($numericdirlist[$k]->basename)) {
        $numericdir = $numericdirlist[$k]->basename;
        $result = db_query("SELECT uid FROM {users} WHERE uid=%d AND status=1", array(
          $numericdir,
        ));
        $row = db_fetch_array($result);
        if ($row['uid']) {

          // build list of valid paths to images, use uid as key
          $uidlist[$row['uid']] = $numericdirlist[$k]->filename;
        }
        else {
          array_push($baduseridlist, $numericdir);
        }
      }
    }
    if (count($baduseridlist)) {
      $errlist['user ids do not exist'] = implode(',', $baduseridlist);
    }
  }
  elseif ($fstype == 'alpha') {

    // check that a-z and other exist, log errors
    $dirlist = range('a', 'z');
    array_push($dirlist, 'others');
    $baddirlist = array();
    $gooddirlist = array();
    foreach ($dirlist as $alphadir) {
      if (!is_dir($dir . DIRECTORY_SEPARATOR . $alphadir)) {
        array_push($baddirlist, $alphadir);
      }
      else {
        array_push($gooddirlist, $alphadir);
      }
    }
    if (count($baddirlist)) {
      $errlist['missing dirs'] = implode(',', $baddirlist);
    }

    // get the first level dirs actually present and check for unknowns
    $baddirlist = array();
    $alphadirlist = file_scan_directory($dir, ".*", array(
      '.',
      '..',
      'CVS',
    ), 0, FALSE);
    foreach ($alphadirlist as $k => $v) {
      $alphadir = $alphadirlist[$k]->basename;
      if (!in_array($alphadir, $dirlist)) {
        array_push($baddirlist, $alphadir);
      }
    }
    if (count($baddirlist)) {
      $errlist['Anomalous directories'] = implode(',', $baddirlist);
    }

    // search for usernames and validate them
    $userdirlist = array();
    $userdirlistpath = array();
    foreach ($gooddirlist as $alphadir) {
      $gooddir = $dir . DIRECTORY_SEPARATOR . $alphadir;
      $userdirlisttmp = file_scan_directory($gooddir, ".*", array(
        '.',
        '..',
        'CVS',
      ), 0, FALSE);
      if (count($userdirlisttmp)) {
        foreach ($userdirlisttmp as $k => $v) {
          array_push($userdirlist, $userdirlisttmp[$k]->basename);
          array_push($userdirlistpath, $userdirlisttmp[$k]->filename);
        }
      }
    }

    // we have usernames, now look them up
    $badusernamelist = array();
    foreach ($userdirlist as $k => $username) {
      $result = db_query("SELECT uid FROM {users} WHERE name='%s' AND status=1", array(
        $username,
      ));
      $row = db_fetch_array($result);
      if ($row['uid']) {

        // build list of valid paths to images, use uid as key
        $uidlist[$row['uid']] = $userdirlistpath[$k];
      }
      else {
        array_push($badusernamelist, $username);
      }
    }
    if (count($badusernamelist)) {
      $errlist['bad usernames'] = implode(',', $badusernamelist);
    }
  }

  // check valid uids against the imagepicker table, get the file list for each
  $badfiledirs = array();
  $badfilelist = array();
  $badthumbsfilelist = array();
  $badbrowserfilelist = array();
  $badfilelist2 = array();
  $badwritefiles = array();
  $files = array();
  $thumbsfiles = array();
  $browserfiles = array();
  foreach ($uidlist as $uid => $filepath) {
    $imgnames = array();
    $result = db_query("SELECT img_name FROM {imagepicker} WHERE uid=%d", array(
      $uid,
    ));
    while ($row = db_fetch_array($result)) {
      array_push($imgnames, $row['img_name']);
    }
    $filestmp = file_scan_directory($filepath, ".*", array(
      '.',
      '..',
      'CVS',
      IMAGEPICKER_THUMBS_DIR,
      IMAGEPICKER_BROWSER_DIR,
    ), 0, FALSE);
    if (count($filestmp)) {

      // compare files with db
      foreach ($filestmp as $k => $v) {
        $file = $filestmp[$k]->basename;
        array_push($files, $file);
        if (!is_writable($filestmp[$k]->filename)) {
          array_push($badwritefiles, $filestmp[$k]->filename);
        }
        $thumbsfile = $filepath . DIRECTORY_SEPARATOR . IMAGEPICKER_THUMBS_DIR . DIRECTORY_SEPARATOR . $file;
        array_push($thumbsfiles, $thumbsfile);
        $browserfile = $filepath . DIRECTORY_SEPARATOR . IMAGEPICKER_BROWSER_DIR . DIRECTORY_SEPARATOR . $file;
        array_push($browserfiles, $browserfile);

        // test for presence in db
        if (!in_array($file, $imgnames)) {
          array_push($badfilelist, $file);
        }
        if (!file_exists($thumbsfile)) {
          array_push($badthumbsfilelist, $thumbsfile);
        }
        elseif (!is_writable($thumbsfile)) {
          array_push($badwritefiles, $thumbsfile);
        }
        if (!file_exists($browserfile)) {
          array_push($badbrowserfilelist, $browserfile);
        }
        elseif (!is_writable($browserfile)) {
          array_push($badwritefiles, $browserfile);
        }
      }
    }
    else {
      array_push($badfiledirs, $uid);
    }

    // compare db to files
    if (count($imgnames)) {
      foreach ($imgnames as $imgname) {
        if (!in_array($imgname, $files)) {
          array_push($badfilelist2, $filepath . DIRECTORY_SEPARATOR . $imgname);
          $thumbsfile = $filepath . DIRECTORY_SEPARATOR . IMAGEPICKER_THUMBS_DIR . DIRECTORY_SEPARATOR . $imgname;
          if (!file_exists($thumbsfile)) {
            array_push($badthumbsfilelist, $thumbsfile);
          }
          $browserfile = $filepath . DIRECTORY_SEPARATOR . IMAGEPICKER_BROWSER_DIR . DIRECTORY_SEPARATOR . $imgname;
          if (!file_exists($browserfile)) {
            array_push($badbrowserfilelist, $browserfile);
          }
        }
      }
    }
  }
  if (count($badfilelist)) {
    $errlist[t('file not found in database')] = implode(',', $badfilelist);
  }
  if (count($badfilelist2)) {
    $errlist[t('database image name not found in files')] = implode(',', $badfilelist2);
  }
  if (count($badthumbsfilelist)) {
    $errlist[t('thumbs file does not exist')] = implode(',', $badthumbsfilelist);
  }
  if (count($badbrowserfilelist)) {
    $errlist[t('browser file does not exist')] = implode(',', $badbrowserfilelist);
  }
  if (count($badfiledirs)) {
    $errlist[t('uid has no files')] = implode(',', $badfiledirs);
  }
  if (count($badwritefiles)) {
    $errlist[t('file not writable')] = implode(',', $badwritefiles);
  }
  if (count($errlist)) {
    foreach ($errlist as $k => $v) {
      drupal_set_message("{$k}: {$v}", 'error');
    }
    drupal_set_message(t('Validation of directory structure failed, please correct the above errors before continuing.'), 'error');
    $result = FALSE;
  }
  else {
    drupal_set_message(t('Directory structure validated, %uidlist users found', array(
      '%uidlist' => count($uidlist),
    )));
  }
  return $result;
}