123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- /**
- * @file
- *
- * elFinder conenctor class
- */
- class elFinderDrupal extends elFinder {
- public function __construct($opts) {
- if (is_callable(array($this, 'version'))) {
-
- $ver = floatval($this->version());
-
- if (isset(elFinder::$ApiVersion)) {
- $ver = elFinder::$ApiVersion;
- }
-
- if ($ver == 2.1 && is_callable(array($this, 'revision')) && $this->revision() < 37) {
- $this->connector_unsupported_error();
- }
- parent::__construct($opts);
-
- $this->commands['desc'] = array('target' => TRUE, 'content' => FALSE);
- $this->commands['owner'] = array('target' => TRUE, 'content' => FALSE);
- $this->commands['downloadcount'] = array('target' => TRUE);
-
- } else {
- $this->connector_unsupported_error();
- }
-
- }
- public function connector_unsupported_error() {
- $this->connector_error(t('Unsupported elFinder library version. Please upgrade.'));
- }
-
- public function connector_error($message) {
- exit(drupal_json_encode(array('error' => array(strip_tags($message)))));
- }
- /* Overriding search query argument name 'q' since it's already used in Drupal */
- public function commandArgsList($cmd) {
- $this->commands['search']['elfinder_search_q'] = TRUE;
- return $this->commandExists($cmd) ? $this->commands[$cmd] : array();
- }
- protected function search($args) {
- $q = trim($args['elfinder_search_q']);
- $mimes = !empty($args['mimes']) && is_array($args['mimes']) ? $args['mimes'] : array();
- $target = !empty($args['target']) ? $args['target'] : null;
- $result = array();
- $errors = array();
- if ($target) {
- if ($volume = $this->volume($target)) {
- $result = $volume->search($q, $mimes, $target);
- $errors = array_merge($errors, $volume->error());
- }
- } else {
- foreach ($this->volumes as $volume) {
- $result = array_merge($result, $volume->search($q, $mimes));
- $errors = array_merge($errors, $volume->error());
- }
- }
- // Exclude hidden folders from search results.
- $hidden_folders = variable_get('elfinder_settings_misc_hidden_folders', '');
- if($hidden_folders) {
- $hidden_folders = explode(',', $hidden_folders);
- foreach($result AS $key => $file) {
- $parts = explode('/', $file['path']);
- if(in_array($parts[1], $hidden_folders)) {
- unset($result[$key]);
- }
- }
- }
- $result = array('files' => $result);
- if ($errors) {
- $result['warning'] = $errors;
- }
- return $result;
- }
- protected function desc($args) {
- $target = $args['target'];
- $desc = $args['content'];
- $error = array(self::ERROR_UNKNOWN, '#' . $target);
- if (($volume = $this->volume($target)) == FALSE
- || ($file = $volume->file($target)) == FALSE) {
- return array('error' => $this->error($error, self::ERROR_FILE_NOT_FOUND));
- }
- $error[1] = $file['name'];
-
- if ($volume->driverId() == 'f') {
- return array('desc' => '');
- }
- if ($volume->commandDisabled('desc')) {
- return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED));
- }
- if (($desc = $volume->desc($target, $desc)) == -1) {
- return array('error' => $this->error($error, $volume->error()));
- }
- return array('desc' => $desc);
- }
- protected function owner($args) {
- $target = $args['target'];
- $error = array(self::ERROR_UNKNOWN, '#' . $target);
- if (($volume = $this->volume($target)) == FALSE
- || ($file = $volume->file($target)) == FALSE) {
- return array('error' => $this->error($error, self::ERROR_FILE_NOT_FOUND));
- }
- $error[1] = $file['name'];
-
- if ($volume->driverId() == 'f') {
- return array('owner' => '');
- }
- if ($volume->commandDisabled('owner')) {
- return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED));
- }
- if (($owner = $volume->owner($target)) == FALSE) {
- return array('error' => $this->error($error, $volume->error()));
- }
- return array('owner' => $owner);
- }
- protected function downloadcount($args) {
- $target = $args['target'];
- $error = array(self::ERROR_UNKNOWN, '#' . $target);
- if (($volume = $this->volume($target)) == FALSE
- || ($file = $volume->file($target)) == FALSE) {
- return array('error' => $this->error($error, self::ERROR_FILE_NOT_FOUND));
- }
- $error[1] = $file['name'];
-
- if ($volume->driverId() == 'f') {
- return array('downloadcount' => '');
- }
- if ($volume->commandDisabled('downloadcount')) {
- return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED));
- }
- if (($downloadcount = $volume->downloadcount($target)) == FALSE) {
- return array('error' => $this->error($error, $volume->error()));
- }
- return array('downloadcount' => $downloadcount);
- }
- /**
- * Required to output file in browser when volume URL is not set
- * Return array contains opened file pointer, root itself and required headers
- *
- * @param array command arguments
- * @return array
- * @author Dmitry (dio) Levashov
- * */
- protected function file($args) {
- $target = $args['target'];
- $download = !empty($args['download']);
- $h403 = 'HTTP/1.x 403 Access Denied';
- $h404 = 'HTTP/1.x 404 Not Found';
- if (($volume = $this->volume($target)) == FALSE) {
- return array('error' => self::$errors[self::ERROR_FILE_NOT_FOUND], 'header' => $h404, 'raw' => TRUE);
- }
- if (($file = $volume->file($target)) == FALSE) {
- return array('error' => self::$errors[self::ERROR_FILE_NOT_FOUND], 'header' => $h404, 'raw' => TRUE);
- }
- if (!$file['read']) {
- return array('error' => self::$errors[self::ERROR_ACCESS_DENIED], 'header' => $h403, 'raw' => TRUE);
- }
- if ($volume->driverId() != 'f' && (($fp = $volume->open($target)) == FALSE)) {
- return array('error' => self::$errors[self::ERROR_FILE_NOT_FOUND], 'header' => $h404, 'raw' => TRUE);
- }
- $mime = ($download) ? 'application/octet-stream' : $file['mime'];
- $result = array(
- 'volume' => $volume,
- 'pointer' => $fp,
- 'info' => $file,
- 'header' => array(
- "Content-Type: " . $mime,
- "Content-Disposition: " . $this->GetContentDisposition($file['name'], $mime, $download),
- "Content-Location: " . $file['name'],
- 'Content-Transfer-Encoding: binary',
- "Content-Length: " . $file['size'],
- "Connection: close"
- )
- );
-
- $real_path = $this->realpath($target);
- module_invoke_all('file_download', $volume->drupalpathtouri($real_path));
-
- return $result;
- }
- /**
- * Generating Content-Disposition HTTP header
- *
- * @param string $file Filename
- * @param string $filemime MIME Type
- * @param bool $download Disposition type (true = download file, false = open file in browser)
- * @return string
- * @author Dmitry (dio) Levashov, Alexey Sukhotin
- * */
- public static function GetContentDisposition($file, $filemime, $download = FALSE) {
- $disp = '';
- $filename = $file;
- $ua = $_SERVER["HTTP_USER_AGENT"];
- $mime = $filemime;
- if ($download) {
- $disp = 'attachment';
- $mime = 'application/octet-stream';
- } else {
- $disp = preg_match('/^(image|text)/i', $mime)
- || $mime == 'application/x-shockwave-flash' ? 'inline' : 'attachment';
- }
- $disp .= '; ';
- if (preg_match("/MSIE ([0-9]{1,}[\.0-9]{0,})/", $ua)) {
- $filename = rawurlencode($filename);
- $filename = str_replace("+", "%20", $filename);
- //$filename = str_replace(" ", "%20", $filename);
- $disp .= "filename=" . $filename;
- } elseif (preg_match("/Firefox\/(\d+)/", $ua, $m)) {
- if ($m[1] >= 8) {
- $disp .= "filename*=?UTF-8''" . rawurlencode($filename);
- } else {
- $disp .= "filename*=\"?UTF-8''" . rawurlencode($filename) . "\";";
- }
- } else {
- $disp .= "filename=" . $filename;
- }
- return $disp;
- }
- }
|