View source
<?php
require_once 'webfm_file.inc';
define('FLUSH', -1);
define('REPLACE_RENAME', 0);
define('REPLACE_DELETE', 1);
define('RENAME_NEW', 2);
define('CANCEL', 3);
define('WEBFM_ADMIN', 1);
define('WEBFM_USER', 2);
function webfm_help($section) {
switch ($section) {
case 'admin/help#webfm':
$output = '<p>' . t('Webfm is a hierarchical file system manager.
Webfm does not use a flat file system (a single directory indexed by a
database). Webfm allows users to arrange files on the server in the
same way they do on their local storage drives. This ability to
heirarchically arrange files greatly enhances the managability of large
collections of data.') . '</p>' . '<p>' . t('Note that webfm uses <b>includes/file.inc</b> which manages the
file system path. The <b>Root Directory</b> and <b>Ftp root directory
</b> paths are relative to the file system path set at %file-sys and
must be prefaced with a "/".', array(
'%file-sys' => url('admin/settings/file-system'),
)) . '</p>' . '<p>' . t('Webfm uses ajax and javascript extensively to provide
application intensive functionality such as file/dir move and ordering
of attachments via drag-and-drop. The context menuing provided by the
right mouse button click provides context sensitive menus for user
selection. Javascript must be enabled for webfm to function.') . '</p>' . '<p>' . t('Webfm presents left hand blocks to represent directory
trees and a right hand block to list the contents of the current
directory. The upper left block represents the directory structure of
file data enumerated in the database and available to the site for
metadata/attachment to content.') . '</p>' . '<p>' . t('File uploads via the UI that overwrite existing files present
version options to allow the user to transfer the existing fid and
metadata to the newer file. This allows content to be updated
such that attachments and metadata are preserved.') . '</p>';
return $output;
case 'admin/modules#description':
return t('Enable the Web File Manager.');
}
}
function webfm_link($type, $node = NULL, $teaser = FALSE) {
$links = array();
if ($teaser && $type == 'node' && isset($node->webfm_files) && user_access('view webfm attachments')) {
if ($num_files = count($node->webfm_files)) {
$links['webfm_attachments'] = array(
'title' => format_plural($num_files, '1 attachment', '@count attachments'),
'href' => "node/{$node->nid}",
'attributes' => array(
'title' => t('Read full article to view attachments.'),
),
'fragment' => 'attachments',
);
}
}
return $links;
}
function webfm_admin_settings_validate($form_id, $form_values) {
$valid_webfm_root = FALSE;
$webfm_root_dir_name = $form_values['webfm_root_dir'];
if (!empty($webfm_root_dir_name)) {
if (!preg_match('/^[0-9a-zA-Z]/', $webfm_root_dir_name)) {
form_set_error('webfm_root_dir' . $rid, t('The leading character of the webfm root directory name must be alphanumeric.'));
}
else {
if (preg_match('[\\.]', $webfm_root_dir_name)) {
form_set_error('webfm_root_dir' . $rid, t('The webfm root directory name is not valid.'));
}
else {
$webfm_root_dir = file_directory_path() . "/" . $webfm_root_dir_name;
$valid_webfm_root = file_check_directory($webfm_root_dir, FILE_CREATE_DIRECTORY, 'webfm_root_dir');
}
}
}
if ($form_values['webfm_max_resolution'] != '0') {
if (!preg_match('/^[0-9]+[xX][0-9]+$/', $form_values['webfm_max_resolution'])) {
form_set_error('webfm_max_resolution', t('The maximum allowed image size expressed as WIDTHxHEIGHT (e.g. 640x480). Set to 0 for no restriction.'));
}
}
$exceed_max_msg = t('Your PHP settings limit the maximum file size per upload to %size MB.', array(
'%size' => file_upload_max_size(),
)) . '<br/>';
$more_info = t("Depending on your sever environment, these settings may be changed in the system-wide php.ini file, a php.ini file in your Drupal root directory, in your Drupal site's settings.php file, or in the .htaccess file in your Drupal root directory.");
$max_upload_size = file_upload_max_size() / (1024 * 1024);
foreach ($form_values['roles'] as $rid => $role) {
$uploadsize = $form_values['webfm_uploadsize_' . $rid];
$usersize = $form_values['webfm_usersize_' . $rid];
$role_root_dir_name = $form_values['root_dir_' . $rid];
if (!empty($role_root_dir_name)) {
if ($valid_webfm_root) {
if (!preg_match('/^[0-9a-zA-Z]/', $role_root_dir_name)) {
form_set_error('root_dir_' . $rid, t('The leading character of the %role root directory must be alphanumeric.', array(
'%role' => $role,
)));
}
else {
if (preg_match('[\\.]', $role_root_dir_name)) {
form_set_error('root_dir_' . $rid, t('The %role root directory name is not valid.', array(
'%role' => $role,
)));
}
else {
$role_root_dir = $webfm_root_dir . "/" . $role_root_dir_name;
file_check_directory($role_root_dir, FILE_CREATE_DIRECTORY, 'root_dir_' . $rid);
}
}
}
else {
form_set_error('root_dir_' . $rid, t('The WebFM root directory must be valid for the %role root directory name to be valid.', array(
'%role' => $role,
)));
}
}
if (!is_numeric($uploadsize) || $uploadsize <= 0) {
form_set_error('webfm_uploadsize_' . $rid, t('The %role file size limit must be a number and greater than zero.', array(
'%role' => $role,
)));
}
if (!is_numeric($usersize) || $usersize <= 0) {
form_set_error('webfm_usersize_' . $rid, t('The %role file size limit must be a number and greater than zero.', array(
'%role' => $role,
)));
}
if ($uploadsize > $max_upload_size) {
form_set_error('webfm_uploadsize_' . $rid, $exceed_max_msg . $more_info);
$more_info = '';
}
if ($uploadsize > $usersize) {
form_set_error('webfm_uploadsize_' . $rid, t('The %role maximum file size per upload is greater than the total file size allowed per user', array(
'%role' => $role,
)));
}
}
}
function webfm_admin_settings() {
global $user;
$modulepath = drupal_get_path('module', 'webfm');
$form['webfm_root_dir'] = array(
'#type' => 'textfield',
'#title' => t('WebFM root directory'),
'#default_value' => variable_get('webfm_root_dir', ''),
'#maxlength' => '100',
'#size' => '70',
'#description' => t('Root directory used to present the filebrowser interface.
<br />This path is relative to "File system path" set in admin/settings/file-system.
<br />If this directory path is compound (ie: path/to/root) then the path must already
<br />exist for this setting to validate (ie: path/to).'),
);
$form['webfm_icon_dir'] = array(
'#type' => 'textfield',
'#title' => t('Icon directory'),
'#default_value' => variable_get('webfm_icon_dir', $modulepath . '/image/icon'),
'#maxlength' => '100',
'#size' => '70',
'#description' => t('Name of directory where file type icons are stored (relative to base url).'),
);
$form['webfm_max_resolution'] = array(
'#type' => 'textfield',
'#title' => t('Maximum resolution for uploaded images'),
'#default_value' => variable_get('webfm_max_resolution', 0),
'#size' => 15,
'#maxlength' => 10,
'#description' => t('The maximum allowed image size (e.g. 640x480). Set to 0 for no restriction.'),
'#field_suffix' => '<kbd>' . t('WIDTHxHEIGHT') . '</kbd>',
);
$roles = user_roles(0, 'access webfm');
$form['roles'] = array(
'#type' => 'value',
'#value' => $roles,
);
webfm_get_extensions_regex(FLUSH);
foreach ($roles as $rid => $role) {
$form["settings_role_" . $rid] = array(
'#type' => 'fieldset',
'#title' => t('Settings for @role role', array(
'@role' => $role,
)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form["settings_role_" . $rid]["root_dir_" . $rid] = array(
'#type' => 'textfield',
'#title' => t('Role Root directory'),
'#default_value' => variable_get("root_dir_" . $rid, ''),
'#maxlength' => '100',
'#size' => '70',
'#description' => t('Root directory for this role.
<br />This path is relative to "WebFM Root directory" set above.
<br />If this directory path is compound then the path must already exist for this
<br />setting to validate.'),
);
$form["settings_role_" . $rid]["webfm_extensions_" . $rid] = array(
'#type' => 'textfield',
'#title' => t('Permitted file extensions'),
'#default_value' => variable_get("webfm_extensions_" . $rid, "jpg jpeg gif png txt html htm doc xls pdf ppt pps"),
'#maxlength' => 255,
'#description' => t('Extensions that users in this role can upload. Separate extensions with a space
<br />and do not include the leading dot.'),
);
$form["settings_role_" . $rid]["webfm_uploadsize_" . $rid] = array(
'#type' => 'textfield',
'#title' => t('Maximum file size per upload'),
'#default_value' => variable_get("webfm_uploadsize_" . $rid, 1),
'#size' => 5,
'#maxlength' => 5,
'#description' => t('The maximum size of a file a user can upload (in megabytes).
<br />Cannot exceed %size limit set in php.ini.', array(
'%size' => format_size(file_upload_max_size()),
)),
);
$form["settings_role_" . $rid]["webfm_usersize_" . $rid] = array(
'#type' => 'textfield',
'#title' => t('Total file size per user'),
'#default_value' => variable_get("webfm_usersize_" . $rid, 10),
'#size' => 5,
'#maxlength' => 5,
'#description' => t('The maximum size of all files a user can have on the site (in megabytes).'),
);
}
$form['attach'] = array(
'#type' => 'fieldset',
'#title' => t('WebFM attachments'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['attach']['webfm_attach_body'] = array(
'#type' => 'checkbox',
'#title' => t('Append file links to Node Body'),
'#default_value' => variable_get('webfm_attach_body', ''),
'#description' => t('Check this box to append file attachments table to the node body.
<br />This setting does not affect the attachment block.'),
);
$form['attach']['attrib'] = array(
'#type' => 'fieldset',
'#title' => t('Attachment List Properties'),
);
$form['attach']['attrib']['webfm_attach_desc'] = array(
'#type' => 'checkbox',
'#title' => t('Include file description metadata'),
'#default_value' => variable_get('webfm_attach_desc', ''),
'#description' => t('Check this box to add file description metadata beneath the attachment title.'),
);
$form['attach']['attrib']['webfm_attach_date'] = array(
'#type' => 'checkbox',
'#title' => t('Enable file date column'),
'#default_value' => variable_get('webfm_attach_date', ''),
'#description' => t('Check this box to add a create date column to the attachment table.'),
);
$form['attach']['attrib']['webfm_attach_size'] = array(
'#type' => 'checkbox',
'#title' => t('Enable file size column'),
'#default_value' => variable_get('webfm_attach_size', ''),
'#description' => t('Check this box to add a file size column to the attachment table.'),
);
if ($user->uid == 1) {
$form['ie'] = array(
'#type' => 'fieldset',
'#title' => t('IE Drag-and-Drop Normalization'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('number of pixels to offset drag objects from cursor position in IE browser.<br />This quantity is usually related to relative positioning used by the css.'),
);
$form['ie']['webfm_ie_dd_list_offset'] = array(
'#type' => 'textfield',
'#title' => t('IE drag and drop x-axis offset for right hand listing draggables'),
'#default_value' => variable_get('webfm_ie_dd_list_offset', '-190'),
'#maxlength' => '10',
'#size' => '10',
);
$form['ie']['webfm_ie_dd_tree_offset'] = array(
'#type' => 'textfield',
'#title' => t('IE drag and drop x-axis offset for directory tree draggables'),
'#default_value' => variable_get('webfm_ie_dd_tree_offset', '-34'),
'#maxlength' => '10',
'#size' => '10',
);
}
$form['debug'] = array(
'#type' => 'fieldset',
'#title' => t('WebFM debug'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['debug']['webfm_debug'] = array(
'#type' => 'checkbox',
'#title' => t('WebFM javascript debug'),
'#default_value' => variable_get('webfm_debug', ''),
'#description' => t('Check this box for javascript debug messaging. This feature is enabled only
<br />users with "administer WebFM" rights.'),
);
if ($user->uid == 1) {
$form['debug']['webfm_cron'] = array(
'#type' => 'checkbox',
'#title' => t('WebFM cron'),
'#default_value' => variable_get('webfm_cron', ''),
'#description' => t('Check this box to enable cleanup of orphaned file records in the database.
<br />NOTE: Use with caution - behaviour is to delete all file records without a
<br />valid file path. Manually renaming a WebFM directory (ie: via OS shell)
<br />and then running cron will delete all webfm_file table entries for that
<br />directory and it\'s sub-directories.'),
);
}
return system_settings_form($form);
}
function webfm_perm() {
return array(
'access webfm',
'view webfm attachments',
'administer webfm',
);
}
function webfm_menu($maycache) {
$items = array();
if ($maycache) {
$items[] = array(
'title' => t('Web File Manager'),
'path' => 'webfm',
'access' => user_access('access webfm'),
'callback' => 'webfm_main',
);
$items[] = array(
'title' => t('Web File Manager'),
'path' => 'webfm_js',
'access' => user_access('access webfm'),
'callback' => 'webfm_ajax',
'type' => MENU_CALLBACK,
);
$items[] = array(
'title' => t('Web File Manager'),
'path' => 'webfm/upload',
'access' => user_access('access webfm'),
'callback' => 'webfm_upload',
'type' => MENU_CALLBACK,
);
$items[] = array(
'title' => t('File Not Found'),
'path' => 'webfm_send',
'access' => user_access('view webfm attachments'),
'callback' => 'webfm_send_file',
'type' => MENU_CALLBACK,
);
$items[] = array(
'path' => 'admin/settings/webfm',
'title' => t('Webfm Settings'),
'description' => t('Configure WebFM.'),
'callback' => 'drupal_get_form',
'callback arguments' => array(
'webfm_admin_settings',
),
'access' => user_access('administer webfm'),
'type' => MENU_NORMAL_ITEM,
);
}
return $items;
}
function webfm_block($op = 'list', $delta = 0) {
if ($op == 'list') {
$blocks[0]['info'] = t('Webfm File Attachments');
return $blocks;
}
else {
if ($op == 'view' && user_access('access content') && user_access('view webfm attachments')) {
$block['content'] = webfm_attach_box();
$block['subject'] = t('Attachments');
return $block;
}
}
}
function webfm_cron() {
if (variable_get('webfm_cron', '')) {
$result = db_query('SELECT fpath, fid FROM {webfm_file}');
while ($f = db_fetch_array($result)) {
if (!is_file($f['fpath'])) {
_webfm_dbdelete_file_fid($f['fid']);
}
}
}
}
function webfm_nodeapi(&$node, $op, $teaser) {
switch ($op) {
case 'load':
if (variable_get("wfm_attach_{$node->type}", 1) == 1 && user_access('view webfm attachments')) {
$output['webfm_files'] = webfm_get_attachments($node->nid);
}
return $output;
break;
case 'view':
if (is_array($node->webfm_files) && variable_get('webfm_attach_body', '')) {
if (count($node->webfm_files) && !$teaser) {
$node->content['webfm_attachments'] = array(
'#value' => theme('webfm_attachments', $node->webfm_files),
'#weight' => 10,
);
drupal_add_css(drupal_get_path('module', 'webfm') . '/css/webfm.css');
}
}
break;
case 'insert':
if ($_POST['attachlist']) {
$files = explode(',', $_POST['attachlist']);
$i = 0;
foreach ($files as $fid) {
if ($fid) {
webfm_dbinsert_attach($node->nid, $fid, $i++);
}
}
}
break;
case 'update':
$files = explode(',', $_POST['attachlist']);
webfm_dbupdate_attach($node->nid, $files);
break;
}
}
function webfm_form_alter($form_id, &$form) {
global $base_url;
global $user;
if ($user->uid == 1 || user_access('administer webfm') || user_access('access webfm')) {
$access = TRUE;
}
else {
$access = FALSE;
}
if ($form_id == 'node_type_form' && $access) {
$form['workflow']['webfm_attach'] = array(
'#type' => 'radios',
'#title' => t('WebFM Attachments'),
'#default_value' => variable_get('webfm_attach_' . $form['#node_type']->type, 0),
'#options' => array(
0 => t('Disabled'),
1 => t('Enabled'),
),
'#description' => t('Should this content type allow upload & file attachment via WebFM?'),
);
}
if (isset($form['type'])) {
$node = $form['#node'];
if ($access && $form['type']['#value'] . '_node_form' == $form_id && variable_get('webfm_attach_' . $node->type, 0)) {
$modulepath = drupal_get_path('module', 'webfm');
drupal_add_js($modulepath . '/js/webfm.js');
drupal_add_css($modulepath . '/css/webfm.css');
if (is_null($inline_js)) {
$clean_url = variable_get('clean_url', 0);
$clean = $clean_url == 0 || $clean_url == '0' ? FALSE : TRUE;
$inline_js = webfm_inline_js($base_url, $clean, $user->uid);
}
$form['webfm-attach']['#theme'] = 'webfm_upload_form';
$form['webfm-attach']['attach'] = array(
'#type' => 'fieldset',
'#title' => t('WebFM Attachments'),
'#description' => t('Drag attachments to set order.<br />Changes made to the attachments are not permanent until you save this post.'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 29,
);
$form['webfm-attach']['attach']['attachedfiles'] = array(
'#prefix' => '<div id="webfm-attach">',
'#suffix' => '</div>',
);
$form['webfm-attach']['attach']['attachedfiles'] += webfm_attach_attached_form($node);
$form['webfm-attach']['attach']['browser'] = array(
'#type' => 'fieldset',
'#title' => t('File Browser'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['webfm-attach']['attach']['browser']['wrapper'] = array(
'#type' => 'fieldset',
'#title' => t('File Upload'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Uploaded file will be saved to the current directory.'),
'#prefix' => '<div id="webfm-inline">',
'#suffix' => '</div>',
);
$form['webfm-attach']['attach']['browser']['wrapper']['wrapper'] = array(
'#prefix' => '<div id="wfmatt-wrapper">',
'#suffix' => '</div>',
);
$form['webfm-attach']['attach']['browser']['wrapper']['wrapper'] += webfm_upload_form('webfm/upload');
$form['#attributes']['enctype'] = 'multipart/form-data';
}
}
}
function webfm_attach_attached_form($node) {
$form['#theme'] = 'webfm_attach_attached_form';
$form['new']['attachlist'] = array(
'#type' => 'hidden',
'#value' => '',
);
return $form;
}
function theme_webfm_attach_attached_form($form) {
$output = drupal_render($form);
return $output;
}
function webfm_attach_box() {
if (arg(0) == 'node' && is_numeric(arg(1)) && !arg(2)) {
$node = node_load(arg(1));
}
$files = webfm_get_attachments($node->nid);
return theme('webfm_attachments', $files);
}
function theme_webfm_attachments($files) {
global $base_url;
$header = array(
t('Attachment'),
);
if ($enable_date = variable_get('webfm_attach_date', '')) {
array_push($header, t('Date'));
}
if ($enable_size = variable_get('webfm_attach_size', '')) {
array_push($header, t('Size'));
}
$rows = array();
foreach ($files as $file) {
$icon_path = $base_url . '/' . variable_get('webfm_icon_dir', '') . '/' . _webfm_get_icon($file->e);
$description = '';
if (variable_get('webfm_attach_desc', '') && !empty($file->fdesc)) {
$description = '<div class="att-fdesc">' . $file->fdesc . '</div>';
}
$filename = $file->ftitle ? $file->ftitle : $file->n;
$href = array(
'data' => l('<img src="' . $icon_path . '" alt="[file]" title="Download ' . $filename . '"/> ', 'webfm_send/' . $file->id . '/1', array(
'title' => 'Download ' . $filename,
), '', '', '', TRUE) . l($filename, 'webfm_send/' . $file->id, array(
'title' => 'Open ' . $filename,
)) . $description,
'class' => 'att-title',
);
$row = array();
array_push($row, $href);
if ($enable_date) {
$time = $file->fcreatedate ? date('d/m/y g:i a', $file->fcreatedate) : date('d/m/y g:i a', @filemtime($file->p . '/' . $file->n));
array_push($row, array(
'data' => $time,
'class' => 'att-time',
));
}
if ($enable_size) {
array_push($row, array(
'data' => format_size($file->s),
'class' => 'att-size',
));
}
array_push($rows, $row);
}
if (count($rows)) {
return theme('table', $header, $rows, array(
'id' => 'webfm-attach-list',
));
}
}
function _webfm_get_icon($ext) {
switch (strtolower($ext)) {
case 'image/gif':
case 'image/png':
case 'image/jpg':
case 'image/jpeg':
case 'image/bmp':
case 'image/tiff':
case 'jpg':
case 'gif':
case 'png':
case 'jpeg':
case 'bmp':
case 'tiff':
$icon = 'i.gif';
break;
case 'video/mpeg':
case 'video/quicktime':
case 'video/x-msvideo':
case 'avi':
$icon = 'avi.gif';
break;
case 'audio/mpeg':
case 'mpeg':
case 'mp3':
$icon = 'mp3.gif';
break;
case 'application/pdf':
case 'pdf':
$icon = 'pdf.gif';
break;
case 'application/zip':
case 'application/x-zip':
case 'application/x-gzip':
case 'zip':
$icon = 'zip.gif';
break;
case 'application/msword':
case 'doc':
case 'odt':
$icon = 'doc.gif';
break;
case 'application/vnd.ms-excel':
case 'xls':
$icon = 'xls.gif';
break;
default:
$icon = 'f.gif';
break;
}
return $icon;
}
function webfm_roles_alter($rid, $name, $op) {
if ($op == t('Save role')) {
drupal_set_message(t('The webfm role has been renamed.'));
}
else {
if ($op == t('Delete role')) {
drupal_set_message(t('The webfm role has been deleted.'));
}
else {
if ($op == t('Add role')) {
drupal_set_message(t('The webfm role has been added.'));
}
}
}
}
function _webfm_image(&$file) {
$info = image_get_info($file->filepath);
if ($info) {
$res = variable_get('webfm_max_resolution', 0);
if ($res != 0) {
list($width, $height) = explode('x', strtolower($res));
if ($info['width'] > $width || $info['height'] > $height) {
if (image_get_toolkit() && image_scale($file->filepath, $file->filepath, $width, $height)) {
drupal_set_message(t('The image was resized to fit within the maximum allowed resolution of %resolution pixels.', array(
'%resolution' => variable_get('webfm_max_resolution', 0),
)));
clearstatcache();
$info = image_get_info($file->filepath);
$file->filesize = $info['file_size'];
}
else {
drupal_set_message(t('The image is too large.'));
}
}
}
}
}
function webfm_upload() {
$json_data = array();
if ($_POST['webfmuploadpath']) {
$dest = file_directory_path() . $_POST['webfmuploadpath'];
$db_check = TRUE;
if (($file = file_check_upload('webfm_upload')) != FALSE) {
_webfm_image($file);
if (webfm_upload_validate($file, $err) === TRUE) {
$check_file_exist = $dest . '/' . $file->filename;
if (is_file($check_file_exist)) {
if (webfm_get_file_record('', $check_file_exist)) {
$file->db_check = $db_check;
}
$file->dest = $dest;
$_SESSION['temp_upload'] = $file;
$json_data['file'] = $file->filename;
$json_data['html'] = webfm_reload_upload('webfm/upload', webfm_version_form($file->filename));
}
else {
if (file_move($file, $dest)) {
if ($db_check == TRUE) {
if (webfm_dbinsert_file($file, $err)) {
drupal_set_message(t('Upload Success'));
}
else {
file_delete($file->filepath);
drupal_set_message(t('Insertion into database fail'), error);
}
}
else {
drupal_set_message(t('Upload success'));
}
}
else {
drupal_set_message(t('file_move to %path failed', array(
'%path' => $dest,
)), error);
}
}
}
else {
drupal_set_message(t('file %s is not valid for upload', array(
'%s' => $file->filename,
)), error);
}
}
else {
drupal_set_message(t('file_check_upload() failed: Check your php configuration to ensure that "max_file_upload" is greater than the file size you are attempting to upload.'), error);
}
}
else {
drupal_set_message(t('Invalid upload path'), error);
}
if (!isset($json_data['html'])) {
$json_data['html'] = webfm_reload_upload('webfm/upload');
}
print drupal_to_js(array(
'status' => TRUE,
'data' => $json_data,
));
exit;
}
function webfm_reload_upload($url, $confirm_form = '') {
$form = array();
if ($confirm_form) {
array_push($form, $confirm_form);
}
array_push($form, webfm_upload_form($url));
$form = form_builder('upload_js', $form);
$output = theme('status_messages') . drupal_render($form);
return $output;
}
function webfm_ajax() {
global $user;
static $webfm_root_path;
static $webfm_access_roles = array();
static $webfm_roots = array();
if ($user->uid == 1 || user_access('administer webfm')) {
$webfm_perm = WEBFM_ADMIN;
}
else {
if (user_access('access webfm')) {
$webfm_perm = WEBFM_USER;
if (!count($webfm_access_roles)) {
$webfm_access_roles = user_roles(TRUE, 'access webfm');
$webfm_roots = array();
foreach ($user->roles as $key => $role) {
if (in_array($role, $webfm_access_roles)) {
$path = variable_get("root_dir_" . $key, '');
$webfm_roots[$key] = empty($path) ? NULL : "/" . $path;
}
}
}
}
else {
exit;
}
}
if (empty($webfm_root_path)) {
$webfm_root_path = variable_get('webfm_root_dir', '');
if (empty($webfm_root_path)) {
webfm_json(array(
'status' => FALSE,
'err' => t('WebFM root not set'),
));
exit;
}
else {
$webfm_root_path = '/' . $webfm_root_path;
}
}
if (isset($_POST["action"])) {
switch (trim(strtolower($_POST["action"]))) {
case "readtrees":
$trees = array();
$err = '';
if ($webfm_perm == WEBFM_ADMIN) {
unset($_SESSION['tree_' . $webfm_root_path]);
$trees[0] = webfm_tree($webfm_root_path);
}
else {
foreach ($webfm_roots as $key => $sub_root) {
if (!empty($sub_root)) {
$sub_root_path = file_directory_path() . $webfm_root_path . $sub_root;
if (is_dir($sub_root_path)) {
$current = $webfm_root_path . $sub_root;
unset($_SESSION['tree_' . $current]);
$trees[$key] = webfm_tree($current);
}
}
else {
$err .= t('root directory not set for @role role ', array(
'@role' => $webfm_access_roles[$key],
));
}
}
}
$webfm_access_roles = array();
if (count($trees)) {
webfm_json(array(
'status' => TRUE,
'tree' => $trees,
'current' => $webfm_root_path,
'admin' => $webfm_perm == WEBFM_ADMIN,
'err' => $err,
));
}
else {
webfm_json(array(
'status' => FALSE,
'err' => $err,
));
}
exit;
break;
case "readtree":
$tree = '';
unset($current);
if ($webfm_perm == WEBFM_ADMIN) {
$current = $webfm_root_path;
}
else {
if (isset($_POST["param0"])) {
if ($root = variable_get("root_dir_" . trim(rawurldecode($_POST["param0"])), '')) {
$root = "/" . $root;
$current = $webfm_root_path . $root;
}
}
}
if (!isset($current)) {
webfm_json(array(
'status' => FALSE,
'data' => 'unknown tree',
));
exit;
break;
}
if (isset($_POST["param1"])) {
unset($_SESSION['tree_' . $current]);
}
if (!is_dir(file_directory_path() . $current)) {
webfm_json(array(
'status' => FALSE,
'data' => 'unknown role',
));
}
else {
$tree = webfm_tree($current);
webfm_json(array(
'status' => isset($tree) ? TRUE : FALSE,
'tree' => $tree,
'current' => $current,
'admin' => $webfm_perm == WEBFM_ADMIN,
));
}
exit;
break;
case "read":
if (isset($_POST["param0"])) {
$read_dir = trim(rawurldecode($_POST["param0"]));
if (ereg('\\.\\.', $read_dir)) {
webfm_json(array(
'status' => FALSE,
'data' => 'illegal read dir',
));
exit;
}
$perm_flag = FALSE;
if ($webfm_perm == WEBFM_ADMIN) {
if (webfm_check_path($read_dir, $webfm_root_path)) {
$perm_flag = TRUE;
}
}
else {
foreach ($webfm_roots as $key => $sub_root) {
if ($sub_root && webfm_check_path($read_dir, $webfm_root_path . $sub_root)) {
$perm_flag = TRUE;
break;
}
}
}
if ($perm_flag) {
if (!is_dir(file_directory_path() . $read_dir)) {
webfm_json(array(
'status' => FALSE,
'data' => file_directory_path() . $read_dir . ' path does not exist - refresh required',
));
exit;
}
$dirlist = new webfm_build_dir_list(file_directory_path(), $read_dir, $webfm_perm);
if ($dirlist
->get_breadcrumb()) {
webfm_json(array(
'status' => TRUE,
'current' => $read_dir,
'bcrumb' => $dirlist
->get_breadcrumb(),
'dirs' => $dirlist
->get_dir_listing(),
'files' => $dirlist
->get_file_listing(),
'user' => $user->uid,
'admin' => $webfm_perm == WEBFM_ADMIN,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'invalid dir',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'forbidden dir',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "delete":
if (isset($_POST["param0"])) {
$source = file_directory_path() . trim(rawurldecode($_POST["param0"]));
if (is_dir($source) && $webfm_perm != WEBFM_ADMIN) {
webfm_json(array(
'status' => FALSE,
'data' => 'permission denied',
));
exit;
break;
}
if ($source && !ereg('\\.\\.', $source)) {
$err_arr[] = array();
$ret = webfm_delete($source, $webfm_perm == WEBFM_USER ? $user->uid : 1, $err_arr);
webfm_json(array(
'status' => $ret,
'data' => $err_arr,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'illegal dirname',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "mkdir":
if ($webfm_perm == WEBFM_ADMIN) {
if (isset($_POST["param0"])) {
$source = file_directory_path() . trim(rawurldecode($_POST["param0"]));
$dest = t("New_Folder");
$err_arr[] = array();
$ret = webfm_mkdir($source, $dest, TRUE, $err_arr);
webfm_json(array(
'status' => $ret,
'data' => $err_arr,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'permission denied',
));
}
exit;
break;
case "move":
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$source = file_directory_path() . trim(rawurldecode($_POST["param0"]));
$dest = file_directory_path() . trim(rawurldecode($_POST["param1"]));
if (is_dir($source) && $webfm_perm != WEBFM_ADMIN) {
webfm_json(array(
'status' => FALSE,
'data' => 'permission denied',
));
exit;
break;
}
if ($source != $dest) {
if (!ereg('\\.\\.', $dest)) {
$err_arr[] = array();
$ret = webfm_move($source, $dest, $webfm_perm == WEBFM_USER ? $user->uid : 1, $err_arr);
webfm_json(array(
'status' => $ret,
'data' => $err_arr,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'illegal destination path',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'move operation not permitted',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "rename":
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$source = file_directory_path() . trim(rawurldecode($_POST["param0"]));
$dest = file_directory_path() . trim(rawurldecode($_POST["param1"]));
if (!ereg('\\.\\.', $dest)) {
$err_arr[] = array();
$ret = webfm_rename($source, $dest, $webfm_perm == WEBFM_USER ? $user->uid : 1, $err_arr);
webfm_json(array(
'status' => $ret,
'data' => $err_arr,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'illegal name',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "search":
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$source = trim(rawurldecode($_POST["param0"]));
$searchpattern = trim(rawurldecode($_POST["param1"]));
if ($searchpattern != "") {
$regexpsearch = '';
@clearstatcache();
$search = new webfm_searchFiles($source, $searchpattern, $regexpsearch, $webfm_perm == WEBFM_USER ? $user->uid : 1);
webfm_json(array(
'files' => $search
->get_files(),
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "getmeta":
if (isset($_POST["param0"])) {
$fid = rawurldecode($_POST["param0"]);
if (($file = webfm_get_file_record($fid)) !== FALSE) {
$meta = array();
if ($webfm_perm == WEBFM_ADMIN || $user->uid == $file->uid) {
$meta['id'] = $file->fid;
}
$meta['u'] = $file->uid;
$meta['n'] = strrev(substr(strrev($file->fpath), 0, strpos(strrev($file->fpath), '/')));
$meta['t'] = $file->ftitle;
$meta['d'] = $file->fdesc;
$meta['l'] = $file->flang;
$meta['p'] = $file->fpublisher;
$meta['f'] = $file->fformat;
if ($i = @getimagesize($file->fpath)) {
if ($i[0] != 0 && $i[1] != 0) {
$meta['i'] = (int) $i[2];
$meta['w'] = (int) $i[0];
$meta['h'] = (int) $i[1];
}
}
webfm_json(array(
'status' => TRUE,
'meta' => $meta,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file record not found',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "putmeta":
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$ret = webfm_putmeta(rawurldecode($_POST["param0"]), rawurldecode($_POST["param1"]), $webfm_perm == WEBFM_ADMIN ? 1 : $user->uid, $err);
webfm_json(array(
'status' => $ret,
'data' => $err,
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'unknown action',
));
}
exit;
break;
case "attach":
global $node;
$node_str = trim(strtolower(rawurldecode($_POST["param0"])));
if (($node_num = strstr($node_str, 'node/')) !== FALSE) {
$node_arr = explode("/", $node_num);
webfm_json(array(
'status' => TRUE,
'attach' => webfm_get_attachments($node_arr[1]),
'admin' => 'attach',
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'illegal path',
));
}
exit;
break;
case "attachfile":
if (isset($_POST["param0"])) {
$fid = rawurldecode($_POST["param0"]);
if (($_file = webfm_get_file_record($fid)) !== FALSE) {
$file = new webfm_fdesc($_file);
if ($file->result != FALSE) {
webfm_json(array(
'status' => TRUE,
'attach' => $file,
'admin' => 'attach',
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file ' . $fid . ' path not found',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file ' . $fid . ' record not found',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
exit;
break;
case "insert":
if ($webfm_perm == WEBFM_ADMIN) {
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$source = file_directory_path() . trim(rawurldecode($_POST["param0"]));
$err_arr[] = array();
$result = FALSE;
switch (trim(rawurldecode($_POST["param1"]))) {
case "file":
$ret = webfm_insert_file($source, $err_arr);
$result = new stdClass();
$result->cnt = 0;
$result->errcnt = 0;
$result->err = '';
if (!$ret) {
$result->errcnt = 1;
$result->err = $err_arr;
webfm_json(array(
'status' => FALSE,
'data' => $result,
));
}
else {
$result->cnt = 1;
webfm_json(array(
'status' => TRUE,
'data' => $result,
));
}
break;
case "dir":
$result = webfm_insert_dir($source, FALSE, $err_arr);
if ($result->errcnt) {
$result->err = $err_arr;
}
webfm_json(array(
'status' => $result->cnt > 0,
'data' => $result,
));
break;
case "recur":
$result = webfm_insert_dir($source, TRUE, $err_arr);
if ($result->errcnt) {
$result->err = $err_arr;
}
webfm_json(array(
'status' => $result->cnt > 0,
'data' => $result,
));
break;
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'permission denied',
));
}
exit;
break;
case "dbrem":
if ($webfm_perm == WEBFM_ADMIN) {
if (isset($_POST["param0"])) {
if ($ret = trim(rawurldecode($_POST["param0"]))) {
$ret = webfm_dbdelete_file($ret);
webfm_json(array(
'status' => $ret,
'data' => 'webfm_dbdelete_file() success',
));
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file not in db',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'permission denied',
));
}
exit;
break;
case "version":
if (isset($_POST["param0"]) && isset($_POST["param1"])) {
$op = trim(rawurldecode($_POST["param0"]));
$filename = trim(rawurldecode($_POST["param1"]));
if (strcmp($_SESSION['temp_upload']->filename, $filename) === 0) {
switch ($op) {
case CANCEL:
webfm_json(array(
'status' => FALSE,
'data' => 'Upload Cancelled',
));
break;
case RENAME_NEW:
if (file_move($_SESSION['temp_upload'], $_SESSION['temp_upload']->dest)) {
if ($_SESSION['temp_upload']->db_check == TRUE) {
if (webfm_dbinsert_file($_SESSION['temp_upload'], $err)) {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
}
else {
file_delete($_SESSION['temp_upload']->filepath);
webfm_json(array(
'status' => FALSE,
'data' => 'file insertion failed',
));
}
}
else {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file_move to ' . $_SESSION['temp_upload']->dest . 'failed',
));
}
break;
case REPLACE_RENAME:
$path = $_SESSION['temp_upload']->dest . '/' . $_SESSION['temp_upload']->filename;
if ($_SESSION['temp_upload']->db_check == TRUE) {
if (($record = webfm_get_file_record('', $path)) === FALSE) {
webfm_json(array(
'status' => FALSE,
'data' => 'Replace-Delete webfm_get_file_record fail',
));
break;
}
}
if ($pos = strrpos($path, '.')) {
$name = substr($path, 0, $pos);
$ext = substr($path, $pos);
}
else {
$name = $basename;
}
$counter = 0;
do {
$temp_path = $name . '_' . $counter++ . $ext;
} while (file_exists($temp_path));
rename($path, $temp_path);
if (file_move($_SESSION['temp_upload'], $_SESSION['temp_upload']->dest)) {
if ($_SESSION['temp_upload']->db_check == TRUE) {
$time = @filemtime($_SESSION['temp_upload']->filepath);
$row = db_query("UPDATE {webfm_file} SET fsize = %d, fcreatedate = %d, fversion = %d WHERE fid = %d", $_SESSION['temp_upload']->filesize, $time, $record->fversion + 1, $record->fid);
if ($row === FALSE) {
webfm_json(array(
'status' => FALSE,
'data' => 'Replace-Delete update fail',
));
file_delete($path);
rename($temp_path, $path);
}
else {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
$newfile = new stdClass();
$newfile->filepath = $temp_path;
$newfile->filesize = $record->fsize ? $record->fsize : filesize($temp_path);
$newfile->filemime = $record->fmime;
webfm_dbinsert_file($newfile, $err, (array) $record);
}
}
else {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file_move fail',
));
rename($temp_path, $path);
}
break;
case REPLACE_DELETE:
$path = $_SESSION['temp_upload']->dest . '/' . $_SESSION['temp_upload']->filename;
if ($_SESSION['temp_upload']->db_check == TRUE) {
if (($record = webfm_get_file_record('', $path)) === FALSE) {
webfm_json(array(
'status' => FALSE,
'data' => 'Replace-Delete webfm_get_file_record fail',
));
break;
}
}
$temp_path = $path . '~';
rename($path, $temp_path);
if (file_move($_SESSION['temp_upload'], $_SESSION['temp_upload']->dest)) {
if ($_SESSION['temp_upload']->db_check == TRUE) {
$time = @filemtime($_SESSION['temp_upload']->filepath);
$row = db_query("UPDATE {webfm_file} SET fsize = %d, fcreatedate = %d, fversion = %d WHERE fid = %d", $_SESSION['temp_upload']->filesize, $time, $record->fversion + 1, $record->fid);
if ($row === FALSE) {
webfm_json(array(
'status' => FALSE,
'data' => 'Replace-Delete update fail',
));
file_delete($path);
rename($temp_path, $path);
}
else {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
file_delete($temp_path);
}
}
else {
webfm_json(array(
'status' => TRUE,
'data' => 'Upload success',
));
file_delete($temp_path);
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'file_move fail',
));
rename($temp_path, $path);
}
break;
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'invalid file name',
));
}
}
else {
webfm_json(array(
'status' => FALSE,
'data' => 'insufficient params',
));
}
unset($_SESSION['temp_upload']);
exit;
break;
default:
webfm_json(array(
'status' => FALSE,
'data' => 'illegal operation',
));
exit;
break;
}
exit;
}
exit;
}
function webfm_json($var = NULL) {
drupal_set_header('Content-Type: text/javascript; charset=utf-8');
if (isset($var)) {
echo drupal_to_js($var);
}
}
function webfm_main() {
global $base_url;
global $user;
$modulepath = drupal_get_path('module', 'webfm');
drupal_add_js($modulepath . '/js/webfm.js');
drupal_add_js('misc/collapse.js');
drupal_add_css($modulepath . '/css/webfm.css');
module_invoke_all('webfm_extend_js');
if (is_null($inline_js)) {
global $user;
$clean_url = variable_get('clean_url', 0);
$clean = $clean_url == 0 || $clean_url == '0' ? FALSE : TRUE;
$inline_js = webfm_inline_js($base_url, $clean, $user->uid);
}
$debug_link = ($user->uid == 1 || user_access('administer webfm')) && drupal_to_js(variable_get('webfm_debug', '')) ? t('[<a href=# id="webfm-debug-link">debug</a>]') : '';
$settings_link = $user->uid == 1 || user_access('administer webfm') ? t('[<a href="@link">settings...</a>]', array(
'@link' => url("admin/settings/webfm"),
)) : '';
$output = '<div class="more-help-link">' . $debug_link . $settings_link . t('[<a href="@link">more help...</a>]', array(
'@link' => url("admin/help/webfm"),
)) . '</div>';
$output .= '<noscript><p class="err">JavaScript must be enabled in order to use webfm!</p></noscript>' . "\n";
$output .= '<div id="webfm">' . "\n";
$output .= drupal_get_form('webfm_upload_fieldset');
$output .= '</div>' . "\n";
return $output;
}
function webfm_upload_fieldset() {
$form = array();
$form['webfm_uploads'] = array(
'#type' => 'fieldset',
'#title' => t('File Upload'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Uploaded file will be saved to the current directory.'),
'#prefix' => '<div class="attachments">',
'#suffix' => '</div>',
'#weight' => 30,
);
$form['webfm_uploads']['wrapper'] = array(
'#prefix' => '<div id="wfmatt-wrapper">',
'#suffix' => '</div>',
);
$form['webfm_uploads']['wrapper'] += webfm_upload_form('webfm/upload');
$form['#attributes'] = array(
'enctype' => "multipart/form-data",
);
return $form;
}
function webfm_upload_form($upload_url) {
$form['#theme'] = 'webfm_upload_form';
$form['new'] = array(
'#prefix' => '<div id="wfmatt-hide">',
'#suffix' => '</div>',
);
$form['new']['webfm_upload'] = array(
'#type' => 'file',
'#title' => t('Upload file'),
'#size' => 40,
);
$form['new']['wfmatt'] = array(
'#type' => 'button',
'#value' => t('Upload'),
'#name' => 'attach',
'#id' => 'wfmatt-button',
);
$form['webfmuploadpath'] = array(
'#type' => 'hidden',
'#value' => '',
);
$form['wfmatt-url'] = array(
'#type' => 'hidden',
'#value' => url($upload_url, NULL, NULL, TRUE),
'#attributes' => array(
'class' => 'webfmupload',
),
);
return $form;
}
function webfm_version_form($filename) {
$form['select'] = array(
'#prefix' => '<div id="replace-options">',
'#suffix' => '</div>',
'#type' => 'radios',
'#title' => t('Select File Versioning Option'),
'#options' => array(
'Replace and rename original copy of ' . $filename,
'Replace and delete original copy of ' . $filename,
'Rename new copy of ' . $filename,
'Cancel',
),
'#required' => TRUE,
);
return $form;
}
function theme_webfm_upload_form($form) {
$output = drupal_render($form);
return $output;
}
function webfm_inline_js($base_url, $clean_url, $uid) {
$js = '<script type="text/javascript">function getBaseUrl(){return ' . drupal_to_js($base_url) . ';} function getIconDir(){return ' . drupal_to_js($base_url . "/" . variable_get('webfm_icon_dir', '')) . ';} function getCleanUrl(){return ' . drupal_to_js($clean_url) . '; }function getIETreeOffset(){return ' . drupal_to_js(variable_get('webfm_ie_dd_tree_offset', '')) . ';}function getIEListOffset(){return ' . drupal_to_js(variable_get('webfm_ie_dd_list_offset', '')) . ';} function getUid(){return ' . drupal_to_js($uid) . ';}</script>';
drupal_set_html_head($js);
return $js;
}
function webfm_check_path($path, $root) {
if (strncmp($path, $root, strlen($root)) == 0) {
if (strlen($path) == strlen($root) || substr($path, strlen($root), 1) == '/') {
return $path;
}
}
return '';
}
class webfm_build_dir_list {
var $dirs = array();
var $files = array();
var $breadcrumb = array();
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('.')) {
if (variable_get('webfm_root_dir', '')) {
$non_root_arr = explode('/', trim($path, '/'));
foreach ($non_root_arr as $piece) {
$this->breadcrumb[] = $piece;
}
}
while (($readdir = readdir($handle)) !== false) {
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) ? date('d/m/y g:i a', @filemtime($dir)) : "";
$this->dirs[] = $dd;
}
}
if (is_array($_files)) {
foreach ($_files as $file) {
if ($_file = webfm_get_file_record('', $full_path . '/' . $file)) {
$fd = new stdClass();
$fd->id = $_file->fid;
$fd->u = $_file->uid;
$fd->m = $_file->fcreatedate ? date('d/m/y g:i a', $_file->fcreatedate) : date('d/m/y g:i a', @filemtime($file));
$fd->s = $_file->fsize ? $_file->fsize : @filesize($file);
}
else {
if ($perm == WEBFM_ADMIN) {
$fd = new stdClass();
$fd->id = 0;
$fd->u = 0;
$fd->m = filemtime($file) ? date('d/m/y g:i a', @filemtime($file)) : "";
$fd->s = @filesize($file);
}
else {
continue;
}
}
$fd->n = $file;
$fd->p = $path;
if ($i = @getimagesize($file)) {
if ($i[0] != 0 && $i[1] != 0) {
$fd->i = $i[2];
}
}
else {
$fd->i = 0;
}
if (strpos($file, ".") === false) {
$fd->e = "";
}
else {
$fd->e = strtolower(substr($file, strrpos($file, ".") + 1));
}
$this->files[] = $fd;
}
}
}
}
function get_dir_listing() {
return $this->dirs;
}
function get_file_listing() {
return $this->files;
}
function get_breadcrumb() {
return $this->breadcrumb;
}
}
function webfm_tree($rootpath) {
if (!isset($_SESSION['tree_' . $rootpath])) {
$tree = array();
$rt = file_directory_path() . $rootpath;
$tree[$rootpath] = recurse_build_tree($rt, false);
$_SESSION['tree_' . $rootpath] = $tree;
return $tree;
}
return $_SESSION['tree_' . $rootpath];
}
function recurse_build_tree($dir, $full) {
if ($handle = opendir($dir)) {
while (false !== ($readdir = readdir($handle))) {
if ($readdir != '.' && $readdir != '..') {
$path = $dir . '/' . $readdir;
if (is_dir($path)) {
$tree[$readdir] = recurse_build_tree($path, $full);
}
if ($full == true) {
if (is_file($path)) {
$tree[] = $readdir;
}
}
}
}
closedir($handle);
}
return isset($tree) ? $tree : '';
}
function webfm_get_attachments($nid) {
$files = array();
$file_result = db_query('SELECT * FROM {webfm_file} f INNER JOIN {webfm_attach} a ON f.fid = a.fid WHERE a.nid = %d ORDER BY a.weight', $nid);
while ($file_record = db_fetch_object($file_result)) {
$_file = new webfm_fdesc($file_record);
if ($_file->result == TRUE) {
$files[] = $_file;
}
}
return $files;
}
class webfm_fdesc {
var $result;
function webfm_fdesc($file) {
$cwd = getcwd();
$this->result = FALSE;
$dir = dirname($file->fpath);
if (is_dir($dir)) {
if (chdir($dir)) {
if ($handle = opendir('.')) {
while (($readdir = readdir($handle)) !== false) {
if (is_dir($readdir)) {
continue;
}
if (is_file($readdir) && $readdir == basename($file->fpath)) {
$this->id = $file->fid;
$this->n = strrev(substr(strrev($file->fpath), 0, strpos(strrev($file->fpath), '/')));
$this->p = $dir;
$this->e = $file->fmime;
$this->s = $file->fsize;
$this->uid = $file->uid;
$this->ftitle = $file->ftitle;
$this->fdesc = $file->fdesc;
$this->fcreatedate = $file->fcreatedate;
$this->flang = $file->flang;
$this->fpublisher = $file->fpublisher;
$this->fformat = $file->fformat;
$this->fversion = $file->fversion;
$this->m = filemtime($readdir) ? date('d/m/y g:i a', @filemtime($readdir)) : "";
if ($i = @getimagesize($readdir)) {
$this->w = (int) $i[0];
$this->h = (int) $i[1];
$this->i = $i[2];
if ($i[0] == 0 || $i[1] == 0) {
$this->i = 0;
}
}
else {
$this->i = 0;
}
$this->result = TRUE;
break;
}
}
closedir($handle);
}
chdir($cwd);
}
}
}
}
function webfm_sanlen($x) {
if (strlen($x) > 80) {
return substr($x, 0, 40) . "..." . substr($x, -40, 40);
}
return $x;
}
class webfm_searchFiles {
var $count = 0;
var $files = array();
var $hidefilepattern;
var $uid = 0;
function webfm_searchFiles($dir, $searchpattern, $regexpsearch = FALSE, $user) {
$this->hidefilepattern = "^(CVS|\\..*)\$";
$this->uid = $user;
$this
->searchFilesRecur($dir, $searchpattern);
}
function get_files() {
return $this->files;
}
function get_count() {
return $this->count;
}
function build_file_list($name, $path, $id) {
$sfd = new stdClass();
$sfd->n = $name;
$sfd->p = $path;
$sfd->id = $id;
$this->files[] = $sfd;
$this->count++;
}
function searchFilesRecur($dir, $searchpattern) {
$dir = rtrim($dir, '/');
$full_dir = file_directory_path() . $dir;
$handle = @opendir($full_dir);
while ($file = @readdir($handle)) {
if (@is_dir($full_dir . "/" . $file) && $file != "." && $file != "..") {
$this
->searchFilesRecur($dir . "/" . $file, $searchpattern);
}
else {
if (ereg(strtolower($searchpattern), strtolower($file)) && !ereg($this->hidefilepattern, $file)) {
if ($frec = webfm_get_file_record('', $full_dir . "/" . $file)) {
$this
->build_file_list($file, $dir, $frec->fid);
}
else {
if ($this->uid == 1) {
$this
->build_file_list($file, $dir, 0);
}
}
}
}
}
@closedir($handle);
}
}
function webfm_send_file($fid, $attach = false) {
if (is_numeric($fid)) {
if (($f = webfm_get_file_record($fid)) === FALSE) {
print theme('page', "");
return;
}
}
else {
$f = new stdClass();
$f->fpath = file_directory_path() . base64_decode($fid);
if (!is_file($f->fpath)) {
print theme('page', "");
return;
}
}
$name = basename($f->fpath);
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$name = preg_replace('/\\./', '%2e', $name, substr_count($name, '.') - 1);
}
$ext = explode('.', $name);
$extension = $ext[count($ext) - 1];
switch (strtolower($extension)) {
case 'txt':
$type = 'text/plain';
break;
case "pdf":
$type = 'application/pdf';
break;
case "exe":
$type = 'application/octet-stream';
break;
case "zip":
$type = 'application/zip';
break;
case "doc":
$type = 'application/msword';
break;
case "xls":
$type = 'application/vnd.ms-excel';
break;
case "ppt":
$type = 'application/vnd.ms-powerpoint';
break;
case "gif":
$type = 'image/gif';
break;
case "png":
$type = 'image/png';
break;
case "jpg":
$type = 'image/jpeg';
break;
case "jpeg":
$type = 'image/jpeg';
break;
case "html":
$type = 'text/html';
break;
default:
$type = 'application/force-download';
}
$header = array();
if ($attach === '1') {
$header[] = 'Pragma: no-cache';
$header[] = 'Cache-Control: no-cache, must-revalidate';
$header[] = 'Content-Disposition: attachment; filename="' . $name . '";';
}
else {
$header[] = 'Pragma: public';
$header[] = 'Expires: 0';
$header[] = 'Cache-Control: must-revalidate, post-check=0, pre-check=0';
$header[] = 'Content-Transfer-Encoding: binary';
$header[] = 'Content-Disposition: inline; filename="' . $name . '";';
}
$header[] = 'Content-Type: ' . $type;
$header[] = 'Content-Length: ' . (string) filesize($f->fpath);
$header[] = 'Connection: close';
file_transfer($f->fpath, $header);
}
function webfm_dbinsert_file($file, &$error, $metadata = array()) {
global $user;
unset($metadata['fid']);
$metadata['uid'] = $user->uid;
$metadata['fpath'] = $file->filepath;
$metadata['fname'] = strrev(substr(strrev($file->filepath), 0, strpos(strrev($file->filepath), '/')));
$metadata['fsize'] = $file->filesize ? $file->filesize : filesize($file->filepath);
$metadata['fcreatedate'] = @filemtime($file->filepath);
if ($file->filemime) {
$metadata['fmime'] = $file->filemime;
}
else {
if ($pos = strrpos($file->filepath, '.')) {
$ext = substr($file->filepath, $pos + 1);
}
else {
$ext = '';
}
$metadata['fmime'] = $ext;
}
$metadata['fdesc'] = $file->fdesc ? $file->fdesc : '';
$fields = implode(', ', array_keys($metadata));
foreach ($metadata as $key => $value) {
if (is_numeric($value)) {
$printfvalues[] = '%d';
}
else {
$printfvalues[] = "'%s'";
}
}
$printfvalues = implode(', ', $printfvalues);
$values = array_values($metadata);
$query = "INSERT INTO {webfm_file} ({$fields}) VALUES ({$printfvalues})";
$result = db_query($query, $values);
if ($result === FALSE) {
$error = $file->filepath . ' could not be inserted into db';
drupal_set_message(t('Could not insert %file into the database', array(
'%file' => $file->filepath,
)), error);
return FALSE;
}
else {
return TRUE;
}
}
function webfm_dbupdate_file($fid, $path = FALSE, $metadata = array()) {
if ($path) {
$metadata['fpath'] = $path;
}
foreach ($metadata as $key => $value) {
if (is_numeric($value)) {
$printfvalues[] = $key . '=%d';
}
else {
$printfvalues[] = $key . "='%s'";
}
}
$printfvalues = implode(', ', $printfvalues);
$values = array_values($metadata);
$values[] = $fid;
$query = "UPDATE {webfm_file} SET {$printfvalues} WHERE fid = %d";
$result = db_query($query, $values);
if ($result === FALSE) {
drupal_set_message(t('webfm_dbupdate_file() err: fid=%fid', array(
'%fid' => $fid,
)), error);
return FALSE;
}
return TRUE;
}
function webfm_get_extensions_regex($rid) {
static $role_ext_regex = array();
if ($rid == FLUSH) {
$role_ext_regex = array();
return '';
}
if (!$role_ext_regex[$rid]) {
$extensions = variable_get("webfm_extensions_" . $rid, '');
$role_ext_regex[$rid] = '/\\.(' . ereg_replace(' +', '|', preg_quote($extensions)) . ')$/i';
}
return $role_ext_regex[$rid];
}
function webfm_enum_validate($file, &$err_msg) {
global $user;
if ($user->uid == 1) {
return TRUE;
}
$name = $file->filename ? $file->filename : strrev(substr(strrev($file->filepath), 0, strpos(strrev($file->filepath), '/')));
if (strlen($name) > 255) {
$err_msg[] = $name . ' has invalid length';
return FALSE;
}
$num_roles = count($user->roles);
$error = 0;
foreach ($user->roles as $rid => $rname) {
$regex = webfm_get_extensions_regex($rid);
if (!preg_match($regex, $name)) {
$err_msg[] = $file->filepath . ' has invalid extension for ' . $rname . ' role.';
$error++;
}
}
return $error == $num_roles ? FALSE : TRUE;
}
function webfm_upload_validate($file, &$err_arr) {
global $user;
if ($user->uid == 1) {
return TRUE;
}
$copy_err = is_array($err_arr);
foreach ($user->roles as $rid => $name) {
$regex = webfm_get_extensions_regex($rid);
$uploadsize = variable_get("webfm_uploadsize_" . $rid, 1) * 1024 * 1024;
$usersize = variable_get("webfm_usersize_" . $rid, 1) * 1024 * 1024;
if (!preg_match($regex, $file->filename)) {
$error['extension']++;
}
if ($uploadsize && $file->filesize > $uploadsize) {
$error['uploadsize']++;
}
if ($usersize && $total_usersize + $file->filesize > $usersize) {
$error['usersize']++;
}
}
$user_roles = count($user->roles);
$valid = TRUE;
if ($error['extension'] == $user_roles) {
if ($copy_err) {
$err_arr[] = $file->filepath . " has an invalid extension";
}
form_set_error('webfm_uploads', t('%name can not be uploaded because it does not have one of the following extensions: %files-allowed.', array(
'%name' => $file->filename,
'%files-allowed' => $extensions,
)));
$valid = FALSE;
}
elseif ($error['uploadsize'] == $user_roles) {
if ($copy_err) {
$err_arr[] = $file->filepath . " exceeds the max filesize";
}
form_set_error('webfm_uploads', t('%name can not be attached to this post, because it exceeded the maximum filesize of %maxsize.', array(
'%name' => $file->filename,
'%maxsize' => format_size($uploadsize),
)));
$valid = FALSE;
}
elseif ($error['usersize'] == $user_roles) {
if ($copy_err) {
$err_arr[] = $file->filepath . " exceeds the max disk quota";
}
form_set_error('webfm_uploads', t('%name can not be attached to this post, because the disk quota of %quota has been reached.', array(
'%name' => $file->filename,
'%quota' => format_size($usersize),
)));
$valid = FALSE;
}
elseif (strlen($file->filename) > 255) {
if ($copy_err) {
$err_arr[] = $file->filepath . " exceeds the max name length";
}
form_set_error('webfm_uploads', t('The selected file can not be attached to this post, because the filename is too long.'));
$valid = FALSE;
}
return $valid ? TRUE : FALSE;
}
function webfm_get_fid($path) {
$query = "SELECT fid FROM {webfm_file} WHERE fpath = '%s'";
$result = db_query($query, $path);
if ($result !== FALSE) {
if ($row = db_fetch_object($result)) {
return $row->fid;
}
}
return FALSE;
}
function webfm_get_file_record($fid = '', $path = '') {
if (is_numeric($fid)) {
$query = "SELECT * FROM {webfm_file} WHERE fid = %d";
if (($result = db_query($query, $fid)) !== FALSE) {
if ($row = db_fetch_object($result)) {
return $row;
}
}
}
else {
if (is_string($path)) {
$query = "SELECT * FROM {webfm_file} WHERE fpath = '%s'";
if (($result = db_query($query, $path)) !== FALSE) {
if ($row = db_fetch_object($result)) {
return $row;
}
}
}
}
return FALSE;
}
function webfm_putmeta($fid, $metadata, $user, &$err) {
static $metadata_key_arr = array();
if (!count($metadata_key_arr)) {
$metadata_key_arr = array(
't' => array(
'field' => 'ftitle',
'size' => 255,
),
'd' => array(
'field' => 'fdesc',
'size' => 1024,
),
'l' => array(
'field' => 'flang',
'size' => 16,
),
'p' => array(
'field' => 'fpublisher',
'size' => 255,
),
'f' => array(
'field' => 'fformat',
'size' => 255,
),
);
}
if (($file = webfm_get_file_record($fid)) != false) {
if ($user == 1 || $user == $file->uid) {
$fields = explode(',', $metadata);
$metadata = array();
foreach ($fields as $field) {
trim($field);
$key = substr($field, 0, 1);
$separator = substr($field, 1, 1);
$value = substr($field, 2, min(strlen($field) - 2, $metadata_key_arr[$key]['size']));
if (array_key_exists($key, $metadata_key_arr) && $separator == ":") {
$metadata[$metadata_key_arr[$key]['field']] = strval($value);
}
}
if (count($metadata)) {
$ret = webfm_dbupdate_file($fid, '', $metadata);
if (!$ret) {
$err = "webfm_dbupdate_file fail";
}
return $ret;
}
else {
$err = "empty";
return TRUE;
}
}
else {
$err = "permission denied";
}
}
else {
$err = "file not found";
}
return FALSE;
}
function webfm_dbdelete_file($fid) {
if (_webfm_dbdelete_file_fid($fid)) {
_webfm_dbdelete_attach_fid($fid);
return TRUE;
}
return FALSE;
}
function _webfm_dbdelete_file_fid($fid) {
$query = 'DELETE FROM {webfm_file} WHERE fid = %d';
$result = db_query($query, $fid);
if ($result === FALSE) {
drupal_set_message(t('Query Failed: Could not delete file %fid .', array(
'%fid' => $fid,
), error));
return FALSE;
}
return TRUE;
}
function webfm_dbupdate_attach($nid, $fids) {
$i = 0;
if (!webfm_check_attach_order($nid, $fids)) {
$query = "DELETE FROM {webfm_attach} WHERE nid = %d";
if ($result = db_query($query, $nid)) {
foreach ($fids as $fid) {
if ($fid) {
webfm_dbinsert_attach($nid, $fid, $i++);
}
$flag = TRUE;
}
if ($flag === TRUE) {
return TRUE;
}
}
}
}
function webfm_check_attach_order($nid, $fids) {
$query = "SELECT fid FROM {webfm_attach} WHERE nid = %d ORDER BY weight";
$result = db_query($query, $nid);
$match = TRUE;
$i = 0;
while ($dbfid = db_fetch_array($result)) {
if ($dbfid['fid'] != $fids[$i]) {
$match = FALSE;
break;
}
$i++;
}
if ($i < count($fids)) {
$match = FALSE;
}
return $match;
}
function webfm_dbinsert_attach($nid, $fid, $weight) {
$query = 'SELECT * FROM {webfm_attach} WHERE nid = %d AND fid = %d';
$result = db_query($query, $nid, $fid);
if (db_num_rows($result) !== 0) {
drupal_set_message(t('File is already attached to this node.'));
return FALSE;
}
else {
$query = 'INSERT INTO {webfm_attach} (nid, fid, weight) VALUES (%d, %d, %d)';
$result = db_query($query, $nid, $fid, $weight);
if ($result === FALSE) {
drupal_set_message(t('Query Failed: Could not attach files to node ') . $nid);
return FALSE;
}
else {
return TRUE;
}
}
}
function webfm_dbdelete_attach($nid, $fid) {
$query = 'DELETE FROM {webfm_attach} WHERE nid = %d AND fid = %d';
$result = db_query($query, $nid, $fid);
if ($result === FALSE) {
drupal_set_message(t('Query Failed: Could not detach file %fid from node %nid', array(
'%fid' => $fid,
'%nid' => $nid,
)));
return FALSE;
}
return TRUE;
}
function _webfm_dbdelete_attach_fid($fid) {
$query = 'DELETE FROM {webfm_attach} WHERE fid = %d';
$result = db_query($query, $fid);
if ($result === FALSE) {
return FALSE;
}
return TRUE;
}
if (module_exists('views')) {
require_once 'webfm_views.inc';
}