TRUE, 'message' => '');
$libpath = elfinder_lib_path();
$badfiles = array('connectors/php/connector.php', 'php/connector.php', 'php/connector.minimal.php');
$badpaths = array();
foreach ($badfiles as $badfile) {
$path = $libpath . '/' . $badfile;
if (file_exists($path)) {
$badpaths[] = $path;
}
}
if (count($badpaths) > 0) {
$message = t('elFinder library directory containing features test files :files. Please remove these files to avoid security hole.', array(':files' => implode(', ', $badpaths)));
watchdog('elfinder', $message, array(), WATCHDOG_ALERT);
drupal_set_message($message, 'error');
$ret['result'] = FALSE;
$ret['message'] = $message;
}
return $ret;
}
function elfinder_init() {
elfinder_check_badpaths();
}
/**
* Implements hook_menu().
*/
function elfinder_menu() {
$items = array();
$access = array('use file manager');
$items['admin/content/files'] = array(
'title' => 'Files',
'page callback' => 'elfinder_file_browser',
'page arguments' => array('backend'),
'description' => 'Manage media files.',
'access arguments' => array('administer file manager'),
);
$items['admin/content/files']['type'] = MENU_LOCAL_TASK;
$items['elfinder'] = array(
'title' => 'File browser',
'page callback' => 'elfinder_file_browser',
'page arguments' => array('default'),
'access arguments' => $access,
'type' => MENU_CALLBACK,
);
$items['elfinder/connector'] = array(
'title' => 'File browser',
'page callback' => 'elfinder_filesystemconnector',
'page arguments' => array(NULL),
'access arguments' => $access,
'type' => MENU_CALLBACK,
);
// Forced connector relative url mode. For filefield_sources support.
$items['elfinder/connector/relative'] = array(
'title' => 'File browser',
'page callback' => 'elfinder_filesystemconnector',
'page arguments' => array('relative'),
'access arguments' => $access,
'type' => MENU_CALLBACK,
);
$settings_page = array(
'title' => 'elFinder',
'description' => 'elFinder file manager settings',
'page callback' => 'elfinder_admin',
'access arguments' => array('administer file manager'),
'file' => 'inc/elfinder.admin.inc',
);
$items['admin/config/elfinder'] = $items['admin/config/media/elfinder'] = $settings_page;
$items['admin/config/elfinder']['type'] = MENU_CALLBACK;
$items['admin/config/media/elfinder/profile'] = array(
'title' => 'Add Profile',
'page callback' => 'elfinder_admin_profiles',
'page arguments' => array('profile_add'),
'access arguments' => array('administer file manager'),
'type' => MENU_CALLBACK,
'file' => 'inc/elfinder.admin.profiles.inc',
);
$items['admin/config/media/elfinder/profile/%/delete'] = array(
'title' => 'Delete Profile',
'page callback' => 'elfinder_admin_profiles',
'page arguments' => array('profile_delete', 5),
'access arguments' => array('administer file manager'),
'type' => MENU_CALLBACK,
'file' => 'inc/elfinder.admin.profiles.inc',
);
$items['admin/config/media/elfinder/profile/%/edit'] = array(
'title' => 'Edit Profile',
'page callback' => 'drupal_get_form',
'page arguments' => array('elfinder_admin_profile', 'profile_edit', 5),
'access arguments' => array('administer file manager'),
'type' => MENU_CALLBACK,
'file' => 'inc/elfinder.admin.profiles.inc',
);
$items['elfinder/ahah/dir'] = array(
'title' => 'JavaScript Volume Add Item',
'page callback' => 'elfinder_admin_form_dir_js',
'page arguments' => array('item_add'),
'access arguments' => array('administer file manager'),
'type' => MENU_CALLBACK,
'file' => 'inc/elfinder.admin.profiles.inc',
);
$items['elfinder/ahah/rmdir/%'] = array(
'title' => 'JavaScript Volume Remove Item',
'page callback' => 'elfinder_admin_form_dir_js',
'page arguments' => array('item_remove', 3),
'access arguments' => array('administer file manager'),
'type' => MENU_CALLBACK,
'file' => 'inc/elfinder.admin.profiles.inc',
);
$items['elfinder/upload/fckeditor'] = array(
'title' => 'FCKeditor Quick Upload',
'page callback' => 'elfinder_editor_upload_fckeditor',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'file' => 'editors/fckeditor/fckeditor.upload.inc',
);
$items['elfinder/upload/ckeditor'] = array(
'title' => 'CKeditor Quick Upload',
'page callback' => 'elfinder_editor_upload_ckeditor',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'file' => 'editors/ckeditor/ckeditor.upload.inc',
);
/* Getting updated menu items from hook_elfinder_menu */
$newitems = module_invoke_all('elfinder_menu', $items);
return ($newitems) ? $newitems : $items;
}
function elfinder_js_alter(&$javascript) {
//$javascript['misc/jquery.js']['data'] = drupal_get_path('module', 'elfinder') . '/js/elfinder.jquery.min.js';
}
/**
* File browser render
*/
function elfinder_file_browser($browser_mode = 'default') {
$libpath = elfinder_lib_path() . '/';
$p = elfinder_get_user_profile();
if (is_readable(elfinder_connector_path())) {
global $language;
$path = drupal_get_path('module', 'elfinder');
$editorApp = '';
$langCode = isset($language->language) ? $language->language : 'en';
if (isset($_GET['app'])) {
if (preg_match("/^[a-zA-Z]+$/", $_GET['app'])) {
$editorApp = $_GET['app'];
} elseif (preg_match("/^([a-zA-Z]+)|/", $_GET['app'], $m)) {
$editorApp = $m[1];
}
}
if (isset($_GET['langCode'])) {
if (preg_match("/^[a-zA-z]{2}$/", $_GET['langCode'])) {
$langCode = $_GET['langCode'];
}
}
/* Initial frontend settings */
$elfinder_js_settings = array(
'connectorUrl' => url('elfinder/connector'),
'moduleUrl' => url('elfinder'),
'editorApp' => $editorApp,
'langCode' => $langCode,
'rememberLastDir' => variable_get('elfinder_settings_misc_rememberlastdir', 'true') == 'true' ? TRUE : FALSE, // remember last opened directory
'disabledCommands' => elfinder_get_disabled_commands(),
'requestType' => variable_get('elfinder_settings_misc_requesttype', 'get') == 'get' ? 'get' : 'post',
'browserMode' => $browser_mode,
'token' => drupal_get_token('elFinder'),
'soundPath' => base_path() . elfinder_lib_path() . '/sounds',
'commandsOptions' => array('dummy' => array()),
);
if (variable_get('elfinder_settings_filesystem_external_preview', 'disabled') != 'disabled') {
$elfinder_js_settings['commandsOptions']['quicklook'] = array(
'sharecadMimes' => array('image/vnd.dwg', 'image/vnd.dxf', 'model/vnd.dwf', 'application/vnd.hp-hpgl', 'application/plt', 'application/step', 'model/iges', 'application/vnd.ms-pki.stl', 'application/sat', 'image/cgm', 'application/x-msmetafile'),
'googleDocsMimes' => array('application/pdf', 'image/tiff', 'application/vnd.ms-office', 'application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/postscript', 'application/rtf'),
'officeOnlineMimes' => array('application/msword', 'application/vnd.ms-word', 'application/vnd.ms-excel', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
);
}
if ($browser_mode == 'backend') {
//$elfinder_js_settings['commandsOptions']['help'] = array('view' => array('about', 'shortcuts', 'integrations'));
}
if (($mheight = variable_get('elfinder_settings_misc_manager_height', '')) != '') {
$elfinder_js_settings['height'] = (int)$mheight;
}
$elfinder_js_settings['resizable'] = ($browser_mode == 'backend');
if ($editorApp) {
$elfinder_js_settings['editorCallback'] = 'elfinder_' . $editorApp . '_callback';
}
$options = array(
'group' => CSS_DEFAULT,
'every_page' => FALSE,
);
$sysjqver = '1.4.4';
$sysuiver = '1.8.7';
$sys_ui_lib = drupal_get_library('system','ui');
$sys_jq_lib = drupal_get_library('system','jquery');
if ($sys_jq_lib != false) {
$sysjqver = $sys_jq_lib['version'];
}
if ($sys_ui_lib != false) {
$sysuiver = $sys_ui_lib['version'];
}
if (preg_match('/1\.(4|5|6|8|9|10|11|12)\.?/', $sysjqver) || preg_match('/1\.(8|9|10)\.?/', $sysuiver)) {
if (property_exists('elFinder', 'ApiVersion')) {
drupal_add_js($path . '/js/elfinder.jquery.min.js');
drupal_add_js($path . '/js/elfinder.jquery-ui.min.js');
} else {
drupal_add_js($path . '/js/elfinder.jquery.legacy.min.js');
drupal_add_js($path . '/js/elfinder.jquery-ui.legacy.min.js');
}
} else {
drupal_add_library('system', 'ui.button');
drupal_add_library('system', 'ui.dialog');
drupal_add_library('system', 'ui.draggable');
drupal_add_library('system', 'ui.droppable');
drupal_add_library('system', 'ui.resizable');
drupal_add_library('system', 'ui.selectable');
drupal_add_library('system', 'ui.slider');
}
elfinder_add_css($path . '/css/ui-themes/smoothness/jquery-ui.min.css', $options);
elfinder_add_css($path . '/css/elfinder.common.css', $options);
if (is_readable($libpath . 'css/elfinder.min.css') && is_readable($libpath . 'js/elfinder.min.js')) {
elfinder_add_css($libpath . 'css/elfinder.min.css');
drupal_add_js($libpath . 'js/elfinder.min.js');
} else if (is_readable($libpath . 'css/elfinder.full.css') && is_readable($libpath . 'js/elfinder.full.js')) {
elfinder_add_css($libpath . 'css/elfinder.full.css');
drupal_add_js($libpath . 'js/elfinder.full.js');
} else if (is_readable($libpath . 'css/common.css') && is_readable($libpath . 'js/elFinder.js')) {
elfinder_add_css($libpath . 'css/common.css');
elfinder_add_css($libpath . 'css/dialog.css');
elfinder_add_css($libpath . 'css/toolbar.css');
elfinder_add_css($libpath . 'css/navbar.css');
elfinder_add_css($libpath . 'css/statusbar.css');
elfinder_add_css($libpath . 'css/cwd.css');
elfinder_add_css($libpath . 'css/quicklook.css');
elfinder_add_css($libpath . 'css/commands.css');
elfinder_add_css($libpath . 'css/contextmenu.css');
elfinder_add_css($libpath . 'css/theme.css');
drupal_add_js($libpath . 'js/elFinder.js');
drupal_add_js($libpath . 'js/elFinder.version.js');
drupal_add_js($libpath . 'js/jquery.elfinder.js');
drupal_add_js($libpath . 'js/elFinder.resources.js');
drupal_add_js($libpath . 'js/elFinder.options.js');
drupal_add_js($libpath . 'js/elFinder.history.js');
drupal_add_js($libpath . 'js/elFinder.command.js');
drupal_add_js($libpath . 'js/ui/overlay.js');
drupal_add_js($libpath . 'js/ui/workzone.js');
drupal_add_js($libpath . 'js/ui/navbar.js');
drupal_add_js($libpath . 'js/ui/dialog.js');
drupal_add_js($libpath . 'js/ui/tree.js');
drupal_add_js($libpath . 'js/ui/cwd.js');
drupal_add_js($libpath . 'js/ui/toolbar.js');
drupal_add_js($libpath . 'js/ui/button.js');
drupal_add_js($libpath . 'js/ui/uploadButton.js');
drupal_add_js($libpath . 'js/ui/viewbutton.js');
drupal_add_js($libpath . 'js/ui/searchbutton.js');
drupal_add_js($libpath . 'js/ui/panel.js');
drupal_add_js($libpath . 'js/ui/contextmenu.js');
drupal_add_js($libpath . 'js/ui/path.js');
drupal_add_js($libpath . 'js/ui/stat.js');
drupal_add_js($libpath . 'js/ui/places.js');
drupal_add_js($libpath . 'js/commands/back.js');
drupal_add_js($libpath . 'js/commands/forward.js');
drupal_add_js($libpath . 'js/commands/reload.js');
drupal_add_js($libpath . 'js/commands/up.js');
drupal_add_js($libpath . 'js/commands/home.js');
drupal_add_js($libpath . 'js/commands/copy.js');
drupal_add_js($libpath . 'js/commands/cut.js');
drupal_add_js($libpath . 'js/commands/paste.js');
drupal_add_js($libpath . 'js/commands/open.js');
drupal_add_js($libpath . 'js/commands/rm.js');
drupal_add_js($libpath . 'js/commands/duplicate.js');
drupal_add_js($libpath . 'js/commands/rename.js');
drupal_add_js($libpath . 'js/commands/help.js');
drupal_add_js($libpath . 'js/commands/getfile.js');
drupal_add_js($libpath . 'js/commands/mkdir.js');
drupal_add_js($libpath . 'js/commands/mkfile.js');
drupal_add_js($libpath . 'js/commands/upload.js');
drupal_add_js($libpath . 'js/commands/download.js');
drupal_add_js($libpath . 'js/commands/edit.js');
drupal_add_js($libpath . 'js/commands/quicklook.js');
drupal_add_js($libpath . 'js/commands/quicklook.plugins.js');
drupal_add_js($libpath . 'js/commands/extract.js');
drupal_add_js($libpath . 'js/commands/archive.js');
drupal_add_js($libpath . 'js/commands/search.js');
drupal_add_js($libpath . 'js/commands/view.js');
drupal_add_js($libpath . 'js/commands/resize.js');
drupal_add_js($libpath . 'js/commands/info.js');
drupal_add_js($libpath . 'js/commands/sort.js');
drupal_add_js($libpath . 'js/commands/netmount.js');
drupal_add_js($libpath . 'js/proxy/elFinderSupportVer1.js');
drupal_add_js($libpath . 'js/jquery.dialogelfinder.js');
} else {
watchdog('Failed Requirement', 'elFinder unable to load required JS and CSS files', array(), WATCHDOG_ERROR);
}
$langfile = $libpath . 'js/i18n/elfinder.' . $langCode . '.js';
if (is_readable($libpath . 'css/theme.css')) {
elfinder_add_css($libpath . 'css/theme.css');
}
// thumbnail size hack
/*
$tmbSize = (int)variable_get('elfinder_settings_thumbnail_size', '48');
$tmbSizeFinal = $tmbSize . 'px';
$tmbWrapperSize = $tmbSize + 4;
$tmbWrapperSizeFinal = $tmbWrapperSize . 'px';
drupal_add_css(".elfinder-cwd-icon { width: $tmbSizeFinal; height: $tmbSizeFinal;} .elfinder-cwd-view-icons .elfinder-cwd-file-wrapper { width: $tmbWrapperSizeFinal; height: $tmbWrapperSizeFinal; }", array('type' => 'inline'));
*/
/* Adding localization */
if (is_readable($langfile)) {
drupal_add_js($langfile);
}
if (is_readable($libpath . 'js/extras/editors.default.min.js')) {
drupal_add_js($libpath . 'js/extras/editors.default.min.js');
}
if (is_readable($libpath . 'js/extras/quicklook.googledocs.min.js')) {
drupal_add_js($libpath . 'js/extras/quicklook.googledocs.min.js');
}
//drupal_add_js('http://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.min.js');
/* Getting updated frontend settings from hook_elfinder_js_settings */
$newjssettings = module_invoke_all('elfinder_js_settings', $elfinder_js_settings);
if (isset($newjssettings['all'])) {
$elfinder_js_settings = array_merge($elfinder_js_settings, (array)$newjssettings['all']);
}
if (isset($newjssettings[$editorApp])) {
$elfinder_js_settings = array_merge($elfinder_js_settings, (array)$newjssettings[$editorApp]);
}
/* Loading callbacks for returning url from file manager to caller */
$editor_plugins = elfinder_system_listing("$editorApp\.callback\.js\$", $path . '/editors', 'name', 0);
$callback_file = '';
if (isset($editorApp)) {
if (isset($editorApp) && isset($editor_plugins[$editorApp . '.callback'])) {
$callback_file = $editor_plugins[$editorApp . '.callback']->uri;
if (isset($callback_file)) {
drupal_add_js($callback_file);
}
}
if (isset($elfinder_js_settings['browserscripts'])) {
foreach ((array)$elfinder_js_settings['browserscripts'] as $script) {
drupal_add_js($script, array('weight' => 999));
}
unset($elfinder_js_settings['browserscripts']);
}
}
if (property_exists('elFinder', 'ApiVersion')) {
$elfinder_js_settings['api21'] = true;
} else {
drupal_add_js($path . '/js/info.js');
}
// drupal_add_js($path . '/js/mouseover.js');
drupal_add_js(array('elfinder' => $elfinder_js_settings), 'setting');
drupal_add_js($path . '/js/elfinder.callback.js');
//drupal_add_js(array('elfinder' => $elfinder_js_settings), 'setting');
$libs = elfinder_get_libraries('tinymce');
if (count($libs) > 0 && !empty($libs['tinymce'])) {
$path = $libs['tinymce'] . '/jscripts/tiny_mce/tiny_mce_popup.js';
$abspath = base_path() . "/$path";
drupal_add_js($path);
}
} else {
drupal_set_message(t('elFinder library was not found. Please download it from @url and install to @libpath.', array('@url' => elfinder_download_url(), '@libpath' => $libpath)), 'error');
}
if ($browser_mode && $browser_mode == 'backend') {
return theme('elfinder_page_backend');
} else {
print theme('elfinder_page');
}
module_invoke_all('exit');
exit();
}
function elfinder_get_disabled_commands() {
$disabled_commands = array();
$permissions = elfinder_permission();
$commands = elfinder_cmd_permissions();
// Disable not allowed commands
foreach ($permissions as $perm_name => $perm_data) {
if (array_key_exists($perm_name, $commands) && !user_access($perm_name)) {
array_push($disabled_commands, $commands[$perm_name]);
}
}
/* if (!user_access('download own uploaded files') && !user_access('download all uploaded files')) {
$disabled_commands[] = 'getfile';
}*/
return $disabled_commands;
}
function elfinder_user_roles() {
global $user;
return array_reverse(array_keys($user->roles));
}
function elfinder_get_user_profile() {
/* Get role id list sorted by weight descending */
$profiles = elfinder_admin_profile_get();
if (!is_array($profiles)) {
$profiles = array($profiles);
}
$first_profile = NULL;
$rids = elfinder_user_roles();
$rids[] = 1; // anonymous user
/* Get first matching profile for higest weight user role */
foreach ($rids as $rid) {
foreach ($profiles as $profile) {
if (isset($profile->settings['profile_role']) && in_array($rid, $profile->settings['profile_role'])) {
if (is_null($first_profile)) {
$first_profile = $profile;
} else if (isset($profile->settings['volume'])) {
/* Adding all available to current user volumes from other profiles */
$found = FALSE;
foreach ($profile->settings['volume'] as $volume) {
foreach ($first_profile->settings['volume'] as $fp_volume) {
if ($volume['path'] == $fp_volume['path'] && $volume['label'] == $fp_volume['label']) {
$found = TRUE;
}
}
if (!$found) {
$first_profile->settings['volume'][] = $volume;
}
}
}
}
}
}
return $first_profile;
}
/**
* File browser to filesystem php connector callback
*/
function elfinder_filesystemconnector($mode = 'default') {
global $base_root, $user;
$p = elfinder_get_user_profile();
$path = drupal_get_path('module', 'elfinder');
include_once dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'elFinderConnector.class.php';
include_once dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'elFinderVolumeDriver.class.php';
include_once dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'elFinderVolumeLocalFileSystem.class.php';
include_once $path . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'elfinder.drupalfs.driver.inc';
include_once $path . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'elfinder.drupalfs.acl.inc';
include_once $path . DIRECTORY_SEPARATOR . 'inc' . DIRECTORY_SEPARATOR . 'elfinder.admin.profiles.inc';
if (is_readable(dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'elFinderPlugin.php')) {
include_once dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'elFinderPlugin.php';
}
if (is_readable(dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'editors' . DIRECTORY_SEPARATOR . 'editor.php')) {
include_once dirname(elfinder_connector_path()) . DIRECTORY_SEPARATOR . 'editors' . DIRECTORY_SEPARATOR . 'editor.php';
}
/**
* Emulate json_encode required by filesystem connector for old php without JSON support
*/
if (!function_exists('json_encode')) {
function json_encode($arg) {
return drupal_json($arg);
}
}
/* Disabling incompartible devel module features */
if (module_exists('devel')) {
$devel_incompat = array('dev_timer', 'devel_query_display', 'dev_mem', 'devel_redirect_page');
$flag = FALSE;
foreach ($devel_incompat as $di) {
if (variable_get($di, 0)) {
$flag = TRUE;
variable_set($di, 0);
}
}
if ($flag) {
drupal_set_message(t('elFinder disabled incompatible devel module features.'), 'warning');
}
}
// Set absolute/relative url variable.
if (!isset($mode) && variable_get('elfinder_settings_filesystem_fileurl', 'true') == 'false') {
$mode = 'relative';
}
$disabled_commands = elfinder_get_disabled_commands();
$acl = new elFinderDrupalACL();
$pubFiles = file_stream_wrapper_get_instance_by_uri('public://');
$pvtFiles = file_stream_wrapper_get_instance_by_uri('private://');
$roots = array();
if ($p) {
$profile = $p->settings;
} else {
$profile = array();
}
$options_defs = array(
'disabled' => $disabled_commands, // list of not allowed commands
'debug' => FALSE,
'dirSize' => FALSE,
'tmbSize' => isset($profile['tmbsize']) ? (int)$profile['tmbsize'] : (int)variable_get('elfinder_settings_thumbnail_size', '48'), // thumbnail image size
'tmbPath' => variable_get('elfinder_settings_thumbnail_dirname', 'tmb'), // thumbnail images directory (tmbPath in 2.x)
'tmbCrop' => variable_get('elfinder_settings_thumbnail_tmbcrop', 'true') == 'true' ? TRUE : FALSE, // crop thumbnail image
'dateFormat' => variable_get('date_format_long', 'j M Y H:i'), // file modification date format
'mimeDetect' => isset($profile['mime_detect']) ? $profile['mime_detect'] : variable_get('elfinder_settings_filesystem_mimedetect', 'auto'), // file type detection method
'imgLib' => isset($profile['imglib']) ? $profile['imglib'] : variable_get('elfinder_settings_thumbnail_imglib', 'auto'), // image manipulation library
'fileMode' => isset($profile['file_perm']) ? octdec($profile['file_perm']) : octdec(variable_get('elfinder_settings_filesystem_fileperm', '0666')), // created file permissions
'dirMode' => isset($profile['dir_perm']) ? octdec($profile['dir_perm']) : octdec(variable_get('elfinder_settings_filesystem_dirperm', '0777')), // created directory permissions
'accessControlData' => array('uid' => $user->uid),
'acceptedName' => '/^[^\.]+/',
'uploadMaxSize' => parse_size(variable_get('elfinder_settings_filesystem_maxfilesize', '')),
'userProfile' => $p,
'jpgQuality' => variable_get('image_jpeg_quality', 75),
'dispInlineRegex' => variable_get('elfinder_settings_filesystem_inlinepreviewregex', '^$'),
'statCorrector' => 'elFinderVolumeDrupal::stat_corrector',
);
if (is_object($pubFiles) && user_access('access public files')) {
$roots[] = array_merge($options_defs, array(
'driver' => 'Drupal',
'path' => drupal_realpath('public://'), // path to root directory (named 'path' in elFinder 2.0)
'URL' => $mode == 'relative' ? base_path() . $pubFiles->getDirectoryPath() : $pubFiles->getExternalUrl(), // root directory URL
'alias' => variable_get('elfinder_settings_filesystem_public_root_label', '') != '' ? variable_get('elfinder_settings_filesystem_public_root_label', '') : t('Public Files'), // display this instead of root directory name (named 'alias' in elFinder 2.0)
'accessControl' => array($acl, 'fsAccessPublic'),
));
}
if (is_object($pvtFiles) && user_access('access private files')) {
$roots[] = array_merge($options_defs, array(
'driver' => 'Drupal',
'path' => drupal_realpath('private://'), // path to root directory (named 'path' in elFinder 2.0)
'URL' => $mode == 'relative' ? base_path() . $pvtFiles->getDirectoryPath() : $pvtFiles->getExternalUrl(), // root directory URL
'alias' => variable_get('elfinder_settings_filesystem_private_root_label', '') != '' ? variable_get('elfinder_settings_filesystem_private_root_label', '') : t('Private Files'), // display this instead of root directory name (named 'alias' in elFinder 2.0)
'accessControl' => array($acl, 'fsAccessPrivate'),
));
}
if (user_access('access unmanaged files')) {
$roots[] = array_merge($options_defs, array(
'driver' => 'LocalFileSystem',
'path' => elfinder_file_directory_path(TRUE), // path to root directory (named 'path' in elFinder 2.0)
'URL' => elfinder_file_directory_url($mode == 'relative' ? TRUE : FALSE), // root directory URL
'alias' => variable_get('elfinder_settings_filesystem_unmanaged_root_label', '') != '' ? variable_get('elfinder_settings_filesystem_unmanaged_root_label', '') : t('Unmanaged Files'), // display this instead of root directory name (named 'alias' in elFinder 2.0)
'accessControl' => array($acl, 'fsAccessUnmanaged'),
));
}
if (isset($profile['volume'])) {
foreach ($profile['volume'] as $volume) {
$root = array(
'alias' => $volume['label'],
);
$rootpath = '';
if (isset($volume['path']) && substr($volume['path'], 0, 1) != DIRECTORY_SEPARATOR) {
$root['driver'] = 'Drupal';
$scheme = file_uri_scheme($volume['path']);
if ($scheme == FALSE) {
if (is_object(file_stream_wrapper_get_instance_by_uri('private://'))) {
$scheme = 'private';
} else {
$scheme = 'public';
}
}
$rootpath = $volume['path'];
$rootpath = elfinder_parse_path_tokens($rootpath);
$relpath = '';
if ($pos = strpos($rootpath, '://')) {
$relpath = substr($rootpath, $pos + 3);
} else {
$relpath = $rootpath;
}
$streamWrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
$volpath = '';
if (is_object($streamWrapper)) {
$streamWrapper->setUri($streamWrapper->getUri() . $relpath);
$volpath = $streamWrapper->realpath();
$volurl = $mode == 'relative' ? base_path() . $streamWrapper->getDirectoryPath() : $streamWrapper->getExternalUrl();
$url = isset($volume['url']) && $volume['url'] != '' ? elfinder_parse_path_tokens($volume['url']) : $volurl;
}
$rootpath = $volpath;
$url = rtrim($url, '/');
if (!file_prepare_directory($rootpath, FILE_CREATE_DIRECTORY)) {
drupal_set_message(t('Error. Cannot initialize directory %dir', array('%dir' => $rootpath)), 'error');
}
$root['path'] = drupal_realpath($rootpath);
$root['URL'] = $url;
$root['tmbPath'] = $volpath . DIRECTORY_SEPARATOR . variable_get('elfinder_settings_thumbnail_dirname', 'tmb');
$root['tmbURL'] = $volurl . '/' . variable_get('elfinder_settings_thumbnail_dirname', 'tmb');
} else {
$rootpath = elfinder_parse_path_tokens($volume['path']);
$root['driver'] = 'LocalFileSystem';
$root['path'] = $rootpath;
if (isset($volume['url'])) {
$root['URL'] = elfinder_parse_path_tokens($volume['url']);
}
}
$root = array_merge($options_defs, $root);
$roots[] = $root;
}
}
$opts = array(
'roots' => $roots,
'driver_defaults' => $options_defs,
);
$newopts = module_invoke_all('elfinder_connector_config', $opts);
if ($newopts) {
$opts = $newopts;
}
class elFinderConnectorDrupal extends elFinderConnector {
public function test() {
}
}
try {
$elFinderObj = new elFinderDrupal($opts);
} catch (Exception $e) {
module_invoke_all('exit');
exit(drupal_json_encode(array('error' => array(t('Unable to initialize elFinder object. :msg', array(':msg' => basename($e->getFile()) . ": " . $e->getMessage()))))));
}
$bindcmds = module_invoke_all('elfinder_bind');
foreach ($bindcmds as $cmd => $cmdfunc) {
$elFinderObj->bind($cmd, $cmdfunc);
}
try {
$elFinderConnectorObj = new elFinderConnectorDrupal($elFinderObj);
} catch (Exception $e) {
module_invoke_all('exit');
exit(drupal_json_encode(array('error' => array(t('Unable to initialize elFinder connector object. :msg', array(':msg' => basename($e->getFile()) . ": " . $e->getMessage()))))));
}
module_invoke_all('elfinder_connector_init', $elFinderConnectorObj);
if (!drupal_valid_token($_REQUEST['token'], 'elFinder', TRUE)) {
module_invoke_all('exit');
exit(drupal_json_encode(array('error' => array(t('Access denied')))));
} else {
try {
$elFinderConnectorObj->run();
} catch (Exception $e) {
module_invoke_all('exit');
exit(drupal_json_encode(array('error' => array(t('Unable to run elFinder connector. :msg', array(':msg' => basename($e->getFile()) . ": " . $e->getMessage()))))));
}
module_invoke_all('exit');
exit();
}
}
function elfinder_elfinder_bind() {
return array('test' => 'test2');
}
/**
* Implements hook_theme().
*/
function elfinder_theme() {
$theme = array();
$theme['elfinder_page'] = array(
'template' => 'elfinder-page',
'arguments' => array('libPath' => '/' . elfinder_lib_path()),
'path' => drupal_get_path('module', 'elfinder') . '/tpl',
);
$theme['elfinder_page_backend'] = array(
'template' => 'elfinder-page-backend',
'arguments' => array('libPath' => '/' . elfinder_lib_path()),
'path' => drupal_get_path('module', 'elfinder') . '/tpl',
);
return $theme;
}
/**
* Implements hook_permission(), D7
*/
function elfinder_permission() {
$perm = array(
'use file manager' => array(
'title' => t('Use elFinder file manager'),
'description' => t('Allow accessing elFinder file manager module'),
),
'administer file manager' => array(
'title' => t('Administer file manager'),
'description' => t('Allow users to administer file manager'),
),
'create new directories' => array(
'title' => t('Create new directories'),
'description' => t('Allow users to create new directories'),
),
'create new files' => array(
'title' => t('Create new files'),
'description' => t('Allow users to create new files'),
),
'rename files and directories' => array(
'title' => t('Rename files and directories'),
'description' => t('Allow users to rename files and directories'),
),
'file uploads' => array(
'title' => t('File uploads'),
'description' => t('Allow users to upload files'),
),
'paste from clipboard' => array(
'title' => t('Paste from clipboard'),
'description' => t('Allow users to paste files from clipboard'),
),
'copy to clipboard' => array(
'title' => t('Copy to clipboard'),
'description' => t('Allow users to copy files to clipboard'),
),
'cut to clipboard' => array(
'title' => t('Cut to clipboard'),
'description' => t('Allow users to cut files to clipboard'),
),
'view file info' => array(
'title' => t('View file info'),
'description' => t('Allow users to view file info'),
),
'preview files' => array(
'title' => t('Preview files'),
'description' => t('Allow users to preview files'),
),
'delete files and directories' => array(
'title' => t('Delete files and directories'),
'description' => t('Allow users to delete files and directories'),
),
'duplicate files' => array(
'title' => t('Duplicate files'),
'description' => t('Allow users to duplicate files'),
),
'edit files' => array(
'title' => t('Edit files'),
'description' => t('Allow users to edit files'),
),
'add files to archive' => array(
'title' => t('Add files to archive'),
'description' => t('Allow users add files to archive'),
),
'extract files from archive' => array(
'title' => t('Extract files from archive'),
'description' => t('Allow users to extract files from archive'),
),
'resize images' => array(
'title' => t('Resize images'),
'description' => t('Allow users to resize images'),
),
'download own uploaded files' => array(
'title' => t('Download own uploaded files'),
'description' => t('Allow users to download own uploaded files'),
),
'download all uploaded files' => array(
'title' => t('Download all uploaded files'),
'description' => t('Allow users to download all uploaded files'),
),
'access public files' => array(
'title' => t('Access public files'),
'description' => t('Allow users to access public files directory'),
),
'access private files' => array(
'title' => t('Access private files'),
'description' => t('Allow users to access private files directory'),
),
'access unmanaged files' => array(
'title' => t('Access unmanaged files'),
'description' => t('Allow users to access unmanaged files in custom directory'),
),
'write public files' => array(
'title' => t('Write public files'),
'description' => t('Allow users write access to public files directory'),
),
'write private files' => array(
'title' => t('Write private files'),
'description' => t('Allow users write access to private files directory'),
),
'access unmanaged files' => array(
'title' => t('Access unmanaged files'),
'description' => t('Allow users write access to unmanaged files in custom directory'),
),
'view file description' => array(
'title' => t('View file descriptions'),
'description' => t('Allow users to view file descriptions'),
),
'edit file description' => array(
'title' => t('Edit file descriptions'),
'description' => t('Allow users to edit file descriptions'),
),
'view file owner' => array(
'title' => t('View file owner'),
'description' => t('Allow users to view file owner'),
),
'view file downloads' => array(
'title' => t('View file downloads'),
'description' => t('Allow users to view file downloads'),
),
'mount network volumes' => array(
'title' => t('Mount network volumes'),
'description' => t('Allow users to mount remote network volumes'),
),
);
$newperms = module_invoke_all('elfinder_perms', $perm);
return ($newperms) ? $newperms : $perm;
}
/**
* elFider commandsto permissions assignment
*/
function elfinder_cmd_permissions() {
$perm = array(
'create new directories' => 'mkdir',
'create new files' => 'mkfile',
'rename files and directories' => 'rename',
'file uploads' => 'upload',
'copy to clipboard' => 'copy',
'cut to clipboard' => 'cut',
'paste from clipboard' => 'paste',
'preview files' => 'quicklook',
'view file info' => 'info',
'delete files and directories' => 'rm',
'duplicate files' => 'duplicate',
'edit files' => 'edit',
'add files to archive' => 'archive',
'extract files from archive' => 'extract',
'resize images' => 'resize',
'download own uploaded files' => 'download',
'view file description' => 'desc',
'edit file description' => 'editdesc',
'view file owner' => 'owner',
'view file downloads' => 'downloadcount',
'mount network volumes' => 'netmount',
);
$newcperms = module_invoke_all('elfinder_cmd_perms', $perm);
return ($newcperms) ? $newcperms : $perm;
}
/**
* Implements hook_wysiwyg_plugin().
*/
function elfinder_wysiwyg_plugin($editor, $version) {
$path = drupal_get_path('module', 'elfinder');
drupal_add_js($path . '/js/elfinder.wysiwyg.init.js', array('group' => JS_LIBRARY));
$options = array(
'elfinder_url' => url('elfinder', array('query' => array('app' => $editor))),
'homepage_url' => elfinder_homepage_url(),
'path' => $path,
);
/* bueditor hack */
if (preg_match('/^(bueditor|bue)/', $editor)) {
$editor = 'bueditor';
}
$editor_plugins = elfinder_system_listing("$editor\.inc\$", $path . '/editors', 'name', 0);
/* loading editor plugin */
$plugin_file = '';
if (isset($editor_plugins[$editor])) {
$plugin_file = $editor_plugins[$editor]->uri;
if ($plugin_file) {
$options['plugin_url_base'] = "$path/editors/$editor";
require_once $plugin_file;
}
}
/* hook for adding another editor support */
//module_invoke_all('elfinder_editor_plugin');
/* wysiwyg plugin generation func for selected editor */
$pluginfunc = 'elfinder_' . $editor . '_elfinder_editor_plugin';
/* returning elFinder wysiwyg editor plugin for selected editor */
if (function_exists($pluginfunc)) {
return call_user_func_array($pluginfunc, array($options));
}
}
/**
* library homepage url
*/
function elfinder_homepage_url() {
return 'http://elfinder.org/';
}
/**
* library download url
*/
function elfinder_download_url() {
return 'http://sourceforge.net/projects/drupal-elfinder/files/Library/';
}
/**
* library files path
*/
function elfinder_lib_path($name = 'elfinder') {
$libraries = &drupal_static(__FUNCTION__);
if (!isset($libraries)) {
$libraries = elfinder_get_libraries();
}
$path = '';
if (!isset($libraries[$name])) {
return FALSE;
} else {
$path .= $libraries[$name];
}
return $path;
}
function elfinder_get_libraries() {
$directory = 'libraries';
$searchdir = array();
$profile = drupal_get_profile();
$config = conf_path();
// Similar to 'modules' and 'themes' directories in the root directory,
// certain distributions may want to place libraries into a 'libraries'
// directory in Drupal's root directory.
$searchdir[] = $directory;
// The 'profiles' directory contains pristine collections of modules and
// themes as organized by a distribution. It is pristine in the same way
// that /modules is pristine for core; users should avoid changing anything
// there in favor of sites/all or sites/ directories.
if (file_exists("profiles/$profile/$directory")) {
$searchdir[] = "profiles/$profile/$directory";
}
// Always search sites/all/*.
$searchdir[] = 'sites/all/' . $directory;
// Also search sites//*.
if (file_exists("$config/$directory")) {
$searchdir[] = "$config/$directory";
}
// Retrieve list of directories.
// @todo Core: Allow to scan for directories.
$directories = array();
$nomask = array('CVS');
foreach ($searchdir as $dir) {
if (is_dir($dir) && $handle = opendir($dir)) {
while (FALSE !== ($file = readdir($handle))) {
if (!in_array($file, $nomask) && $file[0] != '.') {
if (is_dir("$dir/$file")) {
$directories[$file] = "$dir/$file";
}
}
}
closedir($handle);
}
}
return $directories;
}
/**
* library to filesystem connector path
*/
function elfinder_connector_path() {
return elfinder_lib_path() . '/php/elFinder.class.php';
}
/**
* path to files directory
*/
function elfinder_file_directory_path($absolute = FALSE) {
$path = variable_get('elfinder_settings_filesystem_root_custom', '');
$path = elfinder_parse_path_tokens($path);
return $path;
}
/**
* Returning site document root
*/
function elfinder_document_root() {
return realpath('');
}
/**
* replace path tokens to its values (%uid, %user, etc)
*/
function elfinder_parse_path_tokens($unparsed_path) {
global $user, $language;
$path = $unparsed_path;
$uname = isset($user->name) ? preg_replace('/[[:^alnum:]]+/', '', $user->name) : '';
$langCode = isset($language->language) ? $language->language : 'en';
$path_tokens = array(
'%uid' => $user->uid,
'%name' => $uname,
'%user' => $uname,
'%files' => elfinder_default_directory_path(),
'%lang' => $langCode,
);
$path = strtr($path, $path_tokens);
if (function_exists('token_replace')) {
$node = null;
if (module_exists('og_context') AND isset($_SESSION['og_context']['gid'])) {
$gid = $_SESSION['og_context']['gid'];
$node = node_load($gid);
}
$path = token_replace($path, array('node' => $node, 'user' => $user));
}
return $path;
}
/**
* default path to files directory
*/
function elfinder_default_directory_path() {
$filepath = '';
$scheme = file_default_scheme();
if ($scheme == 'public') {
$filepath = variable_get('file_public_path', conf_path() . '/files');
} else {
$filepath = variable_get('file_private_path', conf_path());
}
return $filepath;
}
/**
* files directory url
*/
function elfinder_file_directory_url($force_relative = FALSE) {
global $base_root;
$fileurl = '';
$fileurl = variable_get('elfinder_settings_filesystem_url_custom', '') . '/';
if ($fileurl) {
$fileurl = elfinder_parse_path_tokens($fileurl);
}
// Cutting off absolute url prefix
if ($force_relative) {
$fileurl = str_replace($base_root, '', $fileurl);
}
return $fileurl;
}
/**
* prepare directory for files
*/
function elfinder_prepare_directory($directory) {
$rc = file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
return $rc;
}
/**
* Add css
*/
function elfinder_add_css($path, $options = array()) {
return drupal_add_css($path, $options);
}
/**
* Removing unwanted css
*/
function elfinder_browser_css() {
$css = drupal_add_css();
$rms = array();
if (module_exists('admin_menu')) {
$apath = drupal_get_path('module', 'admin_menu');
$atpath = drupal_get_path('module', 'admin_menu_toolbar');
$rms[] = isset($apath) ? $apath : '';
$rms[] = isset($atpath) ? $atpath : '';
foreach (array_keys($css) as $k) {
foreach ($rms as $rm) {
if (preg_match('|' . $rm . '|', $k) && $rm != '') {
unset($css[$k]);
}
}
}
}
return drupal_get_css($css);
}
/**
* Removing unwanted js
*/
function elfinder_browser_js() {
$js = drupal_add_js(NULL, array('scope' => 'header'));
if (module_exists('admin_menu')) {
$apath = drupal_get_path('module', 'admin_menu');
$atpath = drupal_get_path('module', 'admin_menu_toolbar');
$rms[] = isset($apath) ? $apath : '';
$rms[] = isset($atpath) ? $atpath : '';
foreach (array_keys($js) as $k) {
foreach ($rms as $rm) {
if (preg_match('|' . $rm . '|', $k) && $rm != '') {
unset($js[$k]);
}
}
}
}
return drupal_get_js('header', $js);
}
function elfinder_system_listing($matchexpr, $path, $arg1, $arg2) {
return drupal_system_listing("/$matchexpr/", $path, $arg1, $arg2);
}
function elfinder_get_drupal_file_obj($uri) {
global $user;
$file = NULL;
$fid = db_select('file_managed', 'f')
->condition('uri', rawurldecode($uri))
->fields('f', array('fid'))
->execute()
->fetchField();
if ($fid) {
$file = file_load($fid);
}
else {
$file = new StdClass;
$file->uid = $user->uid;
$file->filename = basename($uri);
$file->uri = $uri;
$file->filemime = file_get_mimetype($uri);
if (is_file(drupal_realpath($uri))) {
$file->filesize = filesize($uri);
// Use the file_entity module's mimetype to entity type
// functionality if we have that method available.
if (function_exists('file_entity_file_type')) {
$types = file_entity_file_type($file);
if (count($types) > 0) {
$file->type = $types[0];
} else {
$file->type = 'default';
}
} else {
list($type) = explode("/", $file->filemime);
switch($type) {
case 'image':
case 'video':
$file->type = $type;
break;
default:
$file->type = 'default';
break;
}
}
}
$file->timestamp = REQUEST_TIME;
$file->status = FILE_STATUS_PERMANENT;
}
return $file;
}
function elfinder_file_download($uri) {
if (variable_get('elfinder_settings_filesystem_handleprivate', 'true') == 'true') {
global $user;
$accessown = 'download own uploaded files';
$accessall = 'download all uploaded files';
$info = elfinder_get_drupal_file_obj($uri);
if (($info->uid == $user->uid && user_access($accessown)) || user_access($accessall)) {
$disposition = preg_match("/^(text|image)\//", $info->filemime) ? 'inline' : 'attachment';
return array(
'Content-Type' => $info->filemime,
'Content-Length' => $info->filesize,
'Content-Disposition' => elFinderDrupal::GetContentDisposition($info->filename, $info->filemime, FALSE),
);
}
return NULL;
}
}
function elfinder_admin_profile_get($name = '') {
$q = db_select('elfinder_profile', 'p')->fields('p', array('pid', 'name', 'description', 'settings'));
if ($name) {
$q->condition('p.name', $name);
}
$result = $q->execute();
$profile = array();
foreach ($result as $record) {
$row = $record;
$row->settings = unserialize($row->settings);
$profile[] = $row;
}
if (count($profile) == 1) {
$profile = $profile[0];
}
return $profile;
}
function elfinder_block_info() {
// Makes it show up on /admin/build/block page.
$blocks = array();
$blocks[0]['info'] = t('File Manager');
return $blocks;
}
function elfinder_block_view() {
// Show the block.
$block = array();
$block['subject'] = t('File Manager');
$block['content'] = elfinder_file_browser('backend');
return $block;
}
/**
* Implements hook_ckeditor_settings_alter().
*/
function elfinder_ckeditor_settings_alter(&$settings, $conf) {
$width = variable_get('elfinder_settings_misc_manager_width', '');
if (!$width) {
$width = ELFINDER_POPUP_WIDTH;
}
$height = variable_get('elfinder_settings_misc_manager_height', '');
if (!$height) {
$height = ELFINDER_POPUP_HEIGHT;
}
$settings['js_conf']['filebrowserWindowWidth'] = $width;
$settings['js_conf']['filebrowserWindowHeight'] = $height;
}
function elfinder_libraries_info() {
$libraries['elfinder'] = array(
'name' => 'elFinder File Manager',
'vendor url' => elfinder_homepage_url(),
'download url' => 'https://github.com/Studio-42/elFinder/archive/2.1.38.zip',
'version arguments' => array(
'file' => 'js/elfinder.min.js',
'pattern' => '@ \* Version\s+([0-9\.]+)@',
'lines' => 5,
),
'files' => array(
'js' => array(
'js/elfinder.min.js',
),
'css' => array(
'css/elfinder.min.css',
)
),
);
return $libraries;
}
function elfinder_get_installed_version() {
if (module_exists('libraries')) {
$library = libraries_detect('elfinder');
return $library['installed'] ? $library['version'] : FALSE;
} else {
$js_file = elfinder_lib_path() . '/js/elfinder.min.js';
$js_contents = @file_get_contents($js_file);
if (!$js_contents) {
return FALSE;
}
if (preg_match('@ \* Version\s+([0-9\.]+)@', $js_contents, $matches)) {
return $matches[1];
}
return 'unknown';
}
}