| Server IP : 195.130.67.5 / Your IP : 216.73.217.154 Web Server : Microsoft-IIS/10.0 System : Windows NT WEBSERVER1 10.0 build 17763 (Windows Server 2016) i586 User : IUSR ( 0) PHP Version : 7.4.19 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /inetpub/wwwroot/icd/administrator/components/com_attachments/ |
Upload File : |
<?php
/**
* Attachments component
*
* @package Attachments
* @subpackage Attachments_Component
*
* @copyright Copyright (C) 2007-2011 Jonathan M. Cameron, All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
* @link http://joomlacode.org/gf/project/attachments/frs/
* @author Jonathan M. Cameron
*/
defined('_JEXEC') or die('Restricted access');
global $mainframe;
$mainframe->isAdmin() or die('Must be admin to execute!');
/**
* A class for update functions
*
* @package Attachments
*/
class AttachmentsUpdate
{
/**
* Add icon filenames for all attachments missing an icon
*/
function add_icon_filenames()
{
require_once(JPATH_COMPONENT_SITE.DS.'file_types.php');
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id, filename, file_type, icon_filename FROM #__attachments "
. "WHERE file_type IS NULL";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_FILE_TYPE_FIELDS_NEED_UPDATING');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Update the icon file_types all the attachments (that do not have one already)
$row =& JTable::getInstance('Attachments', 'Table');
$numUpdated = 0;
foreach ($IDs as $id) {
$row->load($id);
// Only update those attachment records that don't already have an icon_filename
if ( JString::strlen( $row->icon_filename ) == 0 ) {
$new_icon_filename = AttachmentsFileTypes::icon_filename($row->filename,
$row->file_type);
if ( JString::strlen( $new_icon_filename) > 0 ) {
$row->icon_filename = $new_icon_filename;
if (!$row->store()) {
$errmsg = JText::sprintf('ERROR_ADDING_ICON_FILENAME_FOR_ATTACHMENT_S', $row->filename) .
' ' . $row->getError() . ' (ERR 0)';
JError::raiseError(500, $errsmg);
}
$numUpdated++;
}
}
}
return JText::sprintf( 'ADDED_ICON_FILENAMES_TO_N_ATTACHMENTS', $numUpdated );
}
/**
* Update dates for all attachments with null dates
*/
function update_null_dates()
{
global $mainframe;
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT * FROM #__attachments";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return 0;
}
// Update the dates for all the attachments
$numUpdated = 0;
foreach ($rows as $row) {
// Update the new create and update dates if they are null
$updated = false;
$create_date = $row->create_date;
if ( is_null($create_date) OR $create_date == '' ) {
jimport( 'joomla.utilities.date' );
$cdate = new JDate(filemtime($row->filename_sys), $mainframe->getCfg('offset'));
$create_date = $cdate->toMySQL();
$updated = true;
}
$mod_date = $row->modification_date;
if ( is_null($mod_date) OR $mod_date == '' ) {
jimport( 'joomla.utilities.date' );
$mdate = new JDate(filemtime($row->filename_sys), $mainframe->getCfg('offset'));
$mod_date = $mdate->toMySQL();
$updated = true;
}
// Update the record
if ( $updated ) {
$query = "UPDATE #__attachments set modification_date='{$mod_date}', " .
"create_date='{$create_date}' WHERE id='".(int)$row->id."'";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_UPDATING_NULL_DATE_FOR_ATTACHMENT_FILE_S',
$row->filename) . " ";
echo $errmsg . $db->stderr();
}
$numUpdated++;
}
}
return $numUpdated;
}
/**
* Update the attachments table to the current release
*
* This function is called during installation to update the attachments
* table. This function adds/renames fields and applies other changes to
* the attachments table to make it work with this release.
*/
function update_attachments_table()
{
// NOTE: It should be harmless to run this function multiple times
$db =& JFactory::getDBO();
$indent = " ";
// Make sure the table is unicode compatible
$query = "ALTER TABLE #__attachments "
. "CONVERT TO CHARACTER SET `utf8` COLLATE `utf8_general_ci`";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::_('ERROR_CHANGING_TABLE_TO_UTF8_UNICODE') . ' ' . $db->stderr() . ' (ERR 1)';
JError::raiseError( 500, $errmsg );
return false;
}
echo $indent .
JText::_('CONVERTED_ATTACHMENTS_TABLE_TO_UTF8_WITH_COLLATION_UTF8_GENERAL_CI') .
"<br />";
echo $indent .
JText::_('YOU_MAY_CHANGE_TO_ANOTHER_COLLATION_WITH_MYSQL') . "<br /> <br />";
// Get the existing field names
$query = "explain #__attachments";
$db->setQuery($query);
$rows = $db->loadObjectList();
$fields = array();
$types = array();
$nullable = array();
$default = array();
foreach ($rows as $row) {
$fields[] = $row->Field;
$types[$row->Field] = $row->Type;
$nullable[$row->Field] = $row->Null;
$default[$row->Field] = $row->Default;
}
// Rename fields as necessary
$num_renamed_fields = 0;
$rename_fields = Array();
$rename_fields['article_id'] =
Array( 'new_name' => 'parent_id',
'col_def' => "INT(11) UNSIGNED DEFAULT NULL" );
$rename_fields['display_filename'] =
Array( 'new_name' => 'display_name',
'col_def' => "VARCHAR(80) NOT NULL DEFAULT ''" );
// Fix the article ID (NB: LEAVE FIRST ONE AS `article_id` on the next line!)
foreach ( $rename_fields as $old_name => $arr ) {
if ( in_array( $old_name, $fields ) ) {
// Change the field name
$query = "ALTER TABLE #__attachments CHANGE `{$old_name}` `{$arr['new_name']}` "
. $arr['col_def'];
echo $indent . JText::sprintf('RENAMING_COLUMN_S_TO_S', $old_name, $arr['new_name']) . "<br />";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_RENAMING_FIELD_S_TO_S',
$old_name, $arr['new_name'] ) . ' ' . $db->stderr() . ' (ERR 2)';
JError::raiseError(500, $errmsg);
}
$num_renamed_fields++;
}
}
// Get the existing field names again (with renamed fields)
if ( $num_renamed_fields > 0 ) {
$query = "explain #__attachments";
$db->setQuery($query);
$rows = $db->loadObjectList();
$fields = array();
$types = array();
$nullable = array();
$default = array();
foreach ($rows as $row) {
$fields[] = $row->Field;
$types[$row->Field] = $row->Type;
$nullable[$row->Field] = $row->Null;
$default[$row->Field] = $row->Default;
}
}
// Prepare data to add any missing columns/fields
$new_fields = Array();
$new_fields['display_name'] =
"ALTER TABLE #__attachments ADD `display_name` VARCHAR(80) NOT NULL DEFAULT ''";
$new_fields['uri_type'] =
"ALTER TABLE #__attachments ADD `uri_type` ENUM('file', 'url') DEFAULT 'file'";
$new_fields['url_valid'] =
"ALTER TABLE #__attachments ADD `url_valid` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0'";
$new_fields['user_field_1'] =
"ALTER TABLE #__attachments ADD `user_field_1` VARCHAR(100) NOT NULL DEFAULT ''";
$new_fields['user_field_2'] =
"ALTER TABLE #__attachments ADD `user_field_2` VARCHAR(100) NOT NULL DEFAULT ''";
$new_fields['user_field_3'] =
"ALTER TABLE #__attachments ADD `user_field_3` VARCHAR(100) NOT NULL DEFAULT ''";
$new_fields['create_date'] =
"ALTER TABLE #__attachments ADD `create_date` DATETIME DEFAULT NULL";
$new_fields['modification_date'] =
"ALTER TABLE #__attachments ADD `modification_date` DATETIME DEFAULT NULL";
$new_fields['download_count'] =
"ALTER TABLE #__attachments ADD `download_count` INT(11) UNSIGNED DEFAULT '0'";
$new_fields['parent_type'] =
"ALTER TABLE #__attachments ADD `parent_type` VARCHAR(100) NOT NULL DEFAULT 'com_content'";
$new_fields['parent_entity'] =
"ALTER TABLE #__attachments ADD `parent_entity` VARCHAR(100) NOT NULL DEFAULT 'default'";
// Add any missing fields
$num_fields_added = 0;
$dates_added = false;
foreach ($new_fields as $field => $query) {
if ( !in_array( $field , $fields ) ) {
echo $indent . JText::sprintf('ADDING_MISSING_COLUMN_S', $field) . "<br />";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_INSTALLING_FIELD_S', $field) .
' ' . $db->stderr() . ' (ERR 3)';
JError::raiseError( 500, $errmsg );
return false;
}
if ( $field == 'create_date' )
$dates_added = true;
$num_fields_added++;
}
}
if ( $num_fields_added != 0 )
echo "<br />";
// Fix any null dates
if ( $dates_added ) {
echo $indent . JText::_('ADDING_MISSING_CREATE_OR_MODIFICATION_DATES') . "<br />";
$num = AttachmentsUpdate::update_null_dates();
if ( $num == 0 )
echo $indent . $indent . JText::_('NO_ATTACHMENTS_NEEDED_UPDATING') . "<br />";
elseif ( $num == 1 )
echo $indent . $indent . JText::_('ONE_ATTACHMENT_UPDATED') . "<br />";
else
echo $indent . $indent . JText::sprintf('N_ATTACHMENTS_UPDATED', $num) . "<br />";
}
// Resize any fields that need resizing
$resize_fields = Array(
'description' => "VARCHAR(255) NOT NULL DEFAULT ''",
'file_type' => "VARCHAR(128) NOT NULL",
'url' => "TEXT NOT NULL DEFAULT ''",
);
foreach ($resize_fields as $field => $new_size) {
if ( $types[$field] != strtolower($new_size) ) {
echo $indent . JText::sprintf('RESIZING_COLUMN_S', $field) . "<br />";
$query = "ALTER TABLE #__attachments MODIFY `$field` $new_size";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_MODIFYING_FIELD_S', 'description') .
' ' . $db->stderr() . ' (ERR 4)';
JError::raiseError(500, $errmsg);
return false;
}
}
}
// Drop the default values for fields that are not supposed to be nullable
$default_null_fields =
Array( 'filename', 'filename_sys', 'file_size', 'icon_filename',
'parent_id', 'uploader_id' );
foreach ($default_null_fields as $field) {
if ( $default[$field] != 'NULL' ) {
$query = "ALTER TABLE `#__attachments` ALTER `$field` DROP DEFAULT";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = Text::sprintf('ERROR MODIFYING FIELD S', $field) .
' ' . $db->stderr() . ' (ERR 5)';
JError::raiseError( 500, $errmsg );
return false;
}
}
}
// If there are any old attachments, make sure they correspond with the new DB scheme
$query = "UPDATE `#__attachments` SET `parent_entity` = 'ARTICLE' " .
"WHERE `parent_type` = 'com_content' AND `parent_entity` = 'default'";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_UPDATING_EXISTING_ATTACHMENTS') .
' ' . $db->stderr() . ' (ERR 6)';
JError::raiseError( 500, $errmsg );
return false;
}
// Get the existing indexed column names
$query = "show index from #__attachments";
$db->setQuery($query);
$rows = $db->loadObjectList();
$indexes = array();
foreach ($rows as $row) {
$indexes[] = $row->Key_name;
}
// Define the indexes that may need to get added
$new_indexes = Array();
$new_indexes['attachment_parent_id_index'] =
"CREATE INDEX attachment_parent_id_index ON `#__attachments` (`parent_id`)";
// NOTE: Adding indeces to `filename`, `file_size`, `create_data`, and
// modification_date` probably does not add much benefit.
// SEE: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
// Add any missing indexes
echo "<br />";
$num_indexes_added = 0;
foreach ($new_indexes as $index => $query) {
if ( !in_array( $index , $indexes ) ) {
echo $indent . JText::sprintf('ADDING_INDEX_S', $index) . "<br />";
$db->setQuery($query);
if (!$db->query()) {
$errmsg = JText::sprintf('ERROR_INSTALLING_INDEX_S', $index) .
' ' . $db->stderr() . ' (ERR 7)';
JError::raiseError(500, $errmsg);
return false;
}
$num_indexes_added++;
}
}
echo "<h3>" . JText::_('THE_ATTACHMENTS_TABLE_IS_NOW_UP_TO_DATE') . "</h3>\n";
return true;
}
/**
* Disable uninstallation of attachments when the Attachments component is
* uninstalled.
*
* This is accomplished by modifying the uninstall.mysql.sql table to
* comment out the line that deletes the attachments table. Note that
* this only affects the table, not the attachments files.
*/
function disable_sql_uninstall($dbtype = 'mysql')
{
jimport('joomla.filesystem.file');
// Construct the filenames
$filename = JPATH_COMPONENT_ADMINISTRATOR.DS."uninstall.$dbtype.sql";
$tempfilename = $filename.'.tmp';
$msg = '';
// Read the content of the old version of the uninstall sql file
$contents = JFile::read($filename);
$lines = explode("\n", $contents);
$new_lines = Array();
for ($i=0; $i < count($lines); $i++) {
$line = JString::trim($lines[$i]);
if ( JString::strlen($line) != 0 ) {
if ( $line[0] != '#' ) {
$line = '# ' . $line;
}
$new_lines[] = $line;
}
}
// Overwrite the old file with a commented out version
$new_contents = implode("\n", $new_lines);
JFile::write($tempfilename, $new_contents);
if ( ! JFile::copy( $tempfilename, $filename) ) {
$msg = JText::_('ERROR_UPDATING_FILE') . ": $filename!";
}
// Let the user know what happened
if ( $msg == '' ) {
$msg = JText::_('DISABLED_UNINSTALLING_MYSQL_ATTACHMENTS_TABLE');
}
return $msg;
}
/**
* Check an attachment filename and return relevant info
*/
function checkFilename($filename)
{
$finfo = new JObject();
// If it is a windows filename, convert to Linux format for analysis
$winfile = false;
$win_file_re = "|^(?P<drive>[a-zA-Z]{1}):(?P<filename>.*)$|";
if ( preg_match($win_file_re, $filename, $match) ) {
$winfile = true;
$filename = str_replace("\\", '/', $match['drive'] . ':' . $match['filename']);
}
$finfo->winfile = $winfile;
// Split the file into parts
$parts = explode('/', $filename);
$finfo->parts = $parts;
// See if it is old-style (pre Attachments 2.0)
$finfo->oldstyle = false;
$attachments_dir_name = 'attachments';
if ( $parts[count($parts)-2] == $attachments_dir_name ) {
$finfo->oldstyle = true;
}
// Get the path info
$pathinfo = pathinfo($filename);
$finfo->basename = $pathinfo['basename'];
$finfo->extension = $pathinfo['extension'];
// Construct the relative path for the current OS
$start = array_search($attachments_dir_name, $parts);
$relfile = '';
for ($i = $start; $i < count($parts); $i++) {
$relfile .= $parts[$i];
if ( $i < count($parts) - 1 ) {
$relfile .= DS;
}
}
$finfo->relfile = $relfile;
// Construct the non-prefix version of the filename (if oldstyle)
if ( $finfo->oldstyle ) {
$finfo->prefix = false;
if ( preg_match('|^[0-9]{3}_(?P<filename>.+\..+$)|', $finfo->basename, $match) ) {
$finfo->prefix = true;
$finfo->basename_no_prefix = $match['filename'];
}
}
return $finfo;
}
/**
* Update the system filenames for all attachments to attachments-2.0 format
*
* ??? Consolidate the update_system_filenames() and regenerate_system_filenames() functions
*
* When upgrading from Attachments 1.3.4 to 2.0+, you should run this
* function to update the filenames appropriately.
*/
function update_system_filenames()
{
require_once(JPATH_COMPONENT_SITE.DS.'helper.php');
// Get the component parameters
jimport('joomla.application.component.helper');
$params =& JComponentHelper::getParams('com_attachments');
// Define where the attachments go
$upload_url = $params->get('attachments_subdir', 'attachments');
$upload_dir = JPATH_SITE . DS . $upload_url;
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='file'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_FILES');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Get the parent plugin manager
JPluginHelper::importPlugin('attachments', 'attachments_plugin_framework');
$apm =& getAttachmentsPluginManager();
// Update the system filenames for all the attachments
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$attachment =& JTable::getInstance('Attachments', 'Table');
$msg = '';
$numUpdated = 0;
$numMissing = 0;
foreach ($IDs as $id) {
$attachment->load($id);
// Get the actual parent id for this attachment
// (Needed because orphaned parent_id is null, which the Table loads as 1)
$query = "SELECT parent_id FROM #__attachments WHERE id='".(int)$id."' LIMIT 1";
$db->setQuery($query);
$parent_id = $db->loadResult();
if ( $db->getErrorNum() ) {
$errmsg = JText::sprintf('ERROR_INVALID_PARENT_S_ID_N',
$attachment->parent_entity, $parent_id) . ' (ERR 113)';
JError::raiseError(500, $errmsg);
}
// Construct the updated system filename
$old_filename_sys = $attachment->filename_sys;
// Get info about the system filename
$finfo =& AttachmentsUpdate::checkFilename($old_filename_sys);
$basename = $finfo->basename;
// Reconstruct the current system filename (in case of migrations)
$current_filename_sys = JPATH_SITE.DS.$finfo->relfile;
// Get the parent object
$parent = $apm->getAttachmentsPlugin($attachment->parent_type);
if ( !JFile::exists($current_filename_sys) ) {
$msg .= JText::sprintf('ERROR_MISSING_ATTACHMENT_FILE_S',
$current_filename_sys) . "<br/>";
$numMissing++;
}
elseif ( !is_numeric($parent_id) OR
!$parent->parentExists($attachment->parent_id, $attachment->parent_entity ) ) {
$msg .= JText::sprintf('ERROR_MISSING_PARENT_FOR_ATTACHMENT_S',
$current_filename_sys) . "<br/>";
$numMissing++;
}
else {
// Construct the new system filename and url (based on entities, etc)
$newdir = $parent->getAttachmentPath($attachment->parent_entity,
$attachment->parent_id, null);
$new_path = $upload_dir.DS.$newdir;
if ( $finfo->oldstyle AND $finfo->prefix ) {
$new_filename_sys = $new_path . $finfo->basename_no_prefix;
$attachment->filename = $finfo->basename_no_prefix;
$new_url = JString::str_ireplace(DS, '/', $upload_url . '/' .
$newdir . $finfo->basename_no_prefix);
}
else {
$new_filename_sys = $new_path . $basename;
$new_url = JString::str_ireplace(DS, '/', $upload_url . '/' .
$newdir . $basename);
}
// Make sure the target directory exists
if ( !JFile::exists($new_path) ) {
if ( !JFolder::create($new_path) ) {
$errmsg = JText::sprintf('ERROR_UNABLE_TO_SETUP_UPLOAD_DIR_S', $new_path) . ' (ERR 97)';
JError::raiseError(500, $errmsg);
}
AttachmentsHelper::write_empty_index_html($new_path);
}
// Move the file!
if ( !JFile::move($current_filename_sys, $new_filename_sys) ) {
$errmsg = JText::sprintf('ERROR_RENAMING_FILE_S_TO_S',
$old_filename_sys, $new_filename_sys) . ' (ERR 98)';
JError::raiseError(500, $errmsg);
}
// Verify the new system filename exists!
if ( !JFile::exists($new_filename_sys) ) {
$errmsg = JText::sprintf('ERROR_NEW_SYSTEM_FILENAME_S_NOT_FOUND',
$new_filename_sys) . ' (ERR 110)';
JError::raiseError(500, $errmsg);
}
// Update the record
$attachment->filename_sys = $new_filename_sys;
$attachment->url = $new_url;
if (!$attachment->store()) {
$errmsg = $attachment->getError() . ' (ERR 99)';
JError::raiseError(500, $errmsg);
}
$numUpdated++;
}
}
// Add warning if there are problem files
if ( $numMissing > 0 ) {
$msg = JText::sprintf('ERROR_N_FILES_MISSING', $numMissing) . "<br/>" . $msg . " <br/>";
}
return $msg . JText::sprintf( 'UPDATED_SYSTEM_FILENAMES_FOR_N_ATTACHMENTS', $numUpdated );
}
/**
* Regenerate the system filenames for all attachments.
*
* This function may need to run if the admin has moved the attachments
* from one computer to another and the actual file paths need to be
* updated.
*/
function regenerate_system_filenames()
{
require_once(JPATH_COMPONENT_SITE.DS.'helper.php');
// Get the component parameters
jimport('joomla.application.component.helper');
$params =& JComponentHelper::getParams('com_attachments');
// Define where the attachments go
$upload_url = $params->get('attachments_subdir', 'attachments');
$upload_dir = JPATH_SITE . DS . $upload_url;
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='file'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_FILES');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Get the parent plugin manager
JPluginHelper::importPlugin('attachments', 'attachments_plugin_framework');
$apm =& getAttachmentsPluginManager();
// Update the system filenames for all the attachments
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
$attachment =& JTable::getInstance('Attachments', 'Table');
$msg = '';
$numUpdated = 0;
$numMissing = 0;
foreach ($IDs as $id) {
$attachment->load($id);
// Get the actual parent id for this attachment
// (Needed because orphaned parent_id is null, which the Table loads as 1)
$query = "SELECT parent_id FROM #__attachments WHERE id='".(int)$id."' LIMIT 1";
$db->setQuery($query);
$parent_id = $db->loadResult();
if ( $db->getErrorNum() ) {
$errmsg = JText::sprintf('ERROR_INVALID_PARENT_S_ID_N',
$attachment->parent_entity, $parent_id) . ' (ERR 114)';
JError::raiseError(500, $errmsg);
}
// Construct the updated system filename
$old_filename_sys = $attachment->filename_sys;
// Get info about the system filename
$finfo =& AttachmentsUpdate::checkFilename($old_filename_sys);
$basename = $finfo->basename;
// Reconstruct the current system filename (in case of migrations)
$current_filename_sys = JPATH_SITE.DS.$finfo->relfile;
// Get the parent object
$parent = $apm->getAttachmentsPlugin($attachment->parent_type);
if ( !JFile::exists($current_filename_sys) ) {
$msg .= JText::sprintf('ERROR_MISSING_ATTACHMENT_FILE_S',
$current_filename_sys) . "<br/>";
$numMissing++;
}
elseif ( !is_numeric($parent_id) OR
!$parent->parentExists($attachment->parent_id, $attachment->parent_entity ) ) {
$msg .= JText::sprintf('ERROR_MISSING_PARENT_FOR_ATTACHMENT_S',
$current_filename_sys) . "<br/>";
$numMissing++;
}
else {
// Construct the new system filename and url (based on entities, etc)
$newdir = $parent->getAttachmentPath($attachment->parent_entity,
$attachment->parent_id, null);
$new_path = $upload_dir.DS.$newdir;
if ( $finfo->oldstyle AND $finfo->prefix ) {
$new_filename_sys = $new_path . $finfo->basename_no_prefix;
$attachment->filename = $finfo->basename_no_prefix;
$new_url = JString::str_ireplace(DS, '/', $upload_url . '/' .
$newdir . $finfo->basename_no_prefix);
}
else {
$new_filename_sys = $new_path . $basename;
$new_url = JString::str_ireplace(DS, '/', $upload_url . '/' .
$newdir . $basename);
}
// Make sure the target directory exists
if ( !JFile::exists($new_path) ) {
if ( !JFolder::create($new_path) ) {
$errmsg = JText::sprintf('ERROR_UNABLE_TO_SETUP_UPLOAD_DIR_S', $new_path) . ' (ERR 100)';
JError::raiseError(500, $errmsg);
}
AttachmentsHelper::write_empty_index_html($new_path);
}
// Move the file!
if ( !JFile::move($current_filename_sys, $new_filename_sys) ) {
$errmsg = JText::sprintf('ERROR_RENAMING_FILE_S_TO_S',
$old_filename_sys, $new_filename_sys) . ' (ERR 101)';
JError::raiseError(500, $errmsg);
}
// Verify the new system filename exists!
if ( !JFile::exists($new_filename_sys) ) {
$errmsg = JText::sprintf('ERROR_NEW_SYSTEM_FILENAME_S_NOT_FOUND',
$new_filename_sys) . ' (ERR 111)';
JError::raiseError(500, $errmsg);
}
// Update the record
$attachment->filename_sys = $new_filename_sys;
$attachment->url = $new_url;
if (!$attachment->store()) {
$errmsg = $attachment->getError() . ' (ERR 112)';
JError::raiseError(500, $errmsg);
}
$numUpdated++;
}
}
// Add warning if there are problem files
if ( $numMissing > 0 ) {
$msg = JText::sprintf('ERROR_N_FILES_MISSING', $numMissing) . "<br/>" . $msg . " <br/>";
}
return $msg . JText::sprintf( 'REGENERATED_SYSTEM_FILENAMES_FOR_N_ATTACHMENTS',
$numUpdated );
}
/**
* Remove spaces from the system filenames for all attachments
*
* The spaces are replaces with underscores '_'
*/
function remove_spaces_from_system_filenames()
{
// Get the component parameters
jimport('joomla.application.component.helper');
$params = JComponentHelper::getParams('com_attachments');
// Define where the attachments go
$upload_url = $params->get('attachments_subdir', 'attachments');
$upload_dir = JPATH_SITE . DS . $upload_url;
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='file'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_FILES');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Get ready to rename files
jimport( 'joomla.filesystem.file' );
// Update the system filenames for all the attachments
$attachment =& JTable::getInstance('Attachments', 'Table');
$numUpdated = 0;
foreach ($IDs as $id) {
$attachment->load($id);
// Make sure the file exists
$old_filename_sys = $attachment->filename_sys;
if ( !JFile::exists( $old_filename_sys ) ) {
echo JText::sprintf('ERROR_FILE_S_NOT_FOUND_ON_SERVER', $old_filename_sys);
exit();
}
// Construct the new system filename
$filename_info = pathinfo($old_filename_sys);
$basename = $filename_info['basename'];
$filename_sys = $upload_dir.DS.$basename;
$new_basename = JString::str_ireplace(' ', '_', $basename);
$new_filename_sys = $filename_info['dirname'].DS.$new_basename;
// If the filename has not changed, do not change anything
if ( $new_filename_sys == $old_filename_sys ) {
continue;
}
// Rename the file
if ( !JFile::move($old_filename_sys, $new_filename_sys) ) {
echo JText::sprintf('ERROR_RENAMING_FILE_S_TO_S',
$old_filename_sys, $new_filename_sys);
exit();
}
// Construct the new URL (figuire it out from the system filename)
$attachments_dir = JString::str_ireplace(JPATH_SITE, '', $filename_info['dirname']);
$attachments_dir = JString::trim($attachments_dir, DS);
$attachments_dir = JString::str_ireplace(DS, '/', $attachments_dir);
$new_url = $attachments_dir . '/' . $new_basename;
// Update the record
$attachment->filename_sys = $new_filename_sys;
$attachment->filename = $new_basename;
$attachment->url = $new_url;
if (!$attachment->store()) {
$errmsg = $attachment->getError() . ' (ERR 9)';
JError::raiseError(500, $errmsg);
}
$numUpdated++;
}
return JText::sprintf( 'UPDATED_N_ATTACHMENTS', $numUpdated );
}
/**
* Update the file sizes for all attachments (only applies to files)
*/
function update_file_sizes()
{
// Get the component parameters
jimport('joomla.application.component.helper');
$params =& JComponentHelper::getParams('com_attachments');
// Define where the attachments go
$upload_url = $params->get('attachments_subdir', 'attachments');
$upload_dir = JPATH_SITE . DS . $upload_url;
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='file'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_FILES');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Update the system filenames for all the attachments
$attachment =& JTable::getInstance('Attachments', 'Table');
$numUpdated = 0;
foreach ($IDs as $id) {
$attachment->load($id);
// Update the file size
$attachment->file_size = filesize($attachment->filename_sys);
// Update the record
if (!$attachment->store()) {
$errmsg = $attachment->getError() . ' (ERR 10)';
JError::raiseError(500, $errmsg);
}
$numUpdated++;
}
return JText::sprintf( 'UPDATED_FILE_SIZES_FOR_N_ATTACHMENTS', $numUpdated );
}
/**
* Check all files and make sure they exist
*/
function check_files_existance()
{
jimport('joomla.filesystem.file');
$msg = '';
// Get the component parameters
jimport('joomla.application.component.helper');
$params = JComponentHelper::getParams('com_attachments');
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='file'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_FILES');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Update the system filenames for all the attachments
$attachment =& JTable::getInstance('Attachments', 'Table');
$numMissing = 0;
$numChecked = 0;
foreach ($IDs as $id) {
$attachment->load($id);
if ( !JFile::exists($attachment->filename_sys) ) {
$msg .= ' ' .
$attachment->filename_sys . '<br >';
$numMissing++;
}
$numChecked++;
}
if ( $msg ) {
$msg = ':<br />' . $msg;
}
$msg = JText::sprintf( 'CHECKED_N_ATTACHMENT_FILES_M_MISSING', $numChecked, $numMissing ) . $msg;
return $msg;
}
/**
* Validate all URLS and update their "valid" status
*/
function validate_urls()
{
// Get the component parameters
jimport('joomla.application.component.helper');
$params = JComponentHelper::getParams('com_attachments');
// Get all the attachment IDs
$db =& JFactory::getDBO();
$query = "SELECT id FROM #__attachments WHERE uri_type='url'";
$db->setQuery($query);
$rows = $db->loadObjectList();
if ( count($rows) == 0 ) {
return JText::_('NO_ATTACHMENTS_WITH_URLS');
}
$IDs = array();
foreach ($rows as $row) {
$IDs[] = $row->id;
}
// Update the system filenames for all the attachments
$attachment =& JTable::getInstance('Attachments', 'Table');
$numUpdated = 0;
$numChecked = 0;
foreach ($IDs as $id) {
require_once(JPATH_COMPONENT_SITE.DS.'helper.php');
$attachment->load($id);
$a = new JObject();
AttachmentsHelper::get_url_info($attachment->url, $a, false, false);
if ( $attachment->url_valid != $a->url_valid ) {
$attachment->url_valid = $a->url_valid;
// Maybe update the file info with fresh info
if ( $a->url_valid ) {
$attachment->file_size = $a->file_size;
$attachment->file_type = $a->file_type;
}
// Update the record
if (!$attachment->store()) {
$errmsg = $attachment->getError() . ' (ERR 11)';
JError::raiseError(500, $errmsg);
}
$numUpdated++;
}
$numChecked++;
}
return JText::sprintf( 'VALIDATED_N_URL_ATTACHMENTS_M_CHANGED', $numChecked, $numUpdated );
}
}
?>