|
|
|
@ -173,8 +173,12 @@ function process_uploaded_file($uploaded_file, $show_output = true) |
|
|
|
|
* |
|
|
|
|
* @param array $courseInfo |
|
|
|
|
* @param array $uploadedFile ($_FILES) |
|
|
|
|
* @param string $documentDir |
|
|
|
|
* @param string $uploadPath |
|
|
|
|
* array( |
|
|
|
|
* 'name' => 'picture.jpg', |
|
|
|
|
* 'tmp_name' => '...', // absolute path |
|
|
|
|
* ); |
|
|
|
|
* @param string $documentDir Example: /var/www/chamilo/courses/ABC/document |
|
|
|
|
* @param string $uploadPath Example: /folder1/folder2/ |
|
|
|
|
* @param int $userId |
|
|
|
|
* @param int $groupId, 0 for everybody |
|
|
|
|
* @param int $toUserId, NULL for everybody |
|
|
|
@ -209,6 +213,8 @@ function handle_uploaded_document( |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$userInfo = api_get_user_info(); |
|
|
|
|
|
|
|
|
|
$uploadedFile['name'] = stripslashes($uploadedFile['name']); |
|
|
|
|
// Add extension to files without one (if possible) |
|
|
|
|
$uploadedFile['name'] = add_ext_on_mime($uploadedFile['name'], $uploadedFile['type']); |
|
|
|
@ -234,12 +240,15 @@ function handle_uploaded_document( |
|
|
|
|
// If the want to unzip, check if the file has a .zip (or ZIP,Zip,ZiP,...) extension |
|
|
|
|
if ($unzip == 1 && preg_match('/.zip$/', strtolower($uploadedFile['name']))) { |
|
|
|
|
return unzip_uploaded_document( |
|
|
|
|
$courseInfo, |
|
|
|
|
$userInfo, |
|
|
|
|
$uploadedFile, |
|
|
|
|
$uploadPath, |
|
|
|
|
$documentDir, |
|
|
|
|
$maxSpace, |
|
|
|
|
$output, |
|
|
|
|
$groupId |
|
|
|
|
$sessionId, |
|
|
|
|
$groupId, |
|
|
|
|
$output |
|
|
|
|
); |
|
|
|
|
} elseif ($unzip == 1 && !preg_match('/.zip$/', strtolower($uploadedFile['name']))) { |
|
|
|
|
// We can only unzip ZIP files (no gz, tar,...) |
|
|
|
@ -332,6 +341,7 @@ function handle_uploaded_document( |
|
|
|
|
|
|
|
|
|
// Example: /var/www/chamilo/courses/xxx/document/folder/picture.jpg |
|
|
|
|
$fullPath = $whereToSave.$fileSystemName; |
|
|
|
|
|
|
|
|
|
// Example: /folder/picture.jpg |
|
|
|
|
$filePath = $uploadPath.$fileSystemName; |
|
|
|
|
|
|
|
|
@ -661,6 +671,10 @@ function handle_uploaded_document( |
|
|
|
|
function moveUploadedFile($file, $storePath) |
|
|
|
|
{ |
|
|
|
|
$handleFromFile = isset($file['from_file']) && $file['from_file'] ? true : false; |
|
|
|
|
$moveFile = isset($file['move_file']) && $file['move_file'] ? true : false; |
|
|
|
|
if ($moveFile) { |
|
|
|
|
copy($file['tmp_name'], $storePath); |
|
|
|
|
} |
|
|
|
|
if ($handleFromFile) { |
|
|
|
|
return file_exists($file['tmp_name']); |
|
|
|
|
} else { |
|
|
|
@ -998,70 +1012,75 @@ function unzip_uploaded_file($uploaded_file, $upload_path, $base_work_dir, $max_ |
|
|
|
|
* @author Hugues Peeters <hugues.peeters@claroline.net> |
|
|
|
|
* @author Bert Vanderkimpen |
|
|
|
|
* |
|
|
|
|
* @param array $uploaded_file - follows the $_FILES Structure |
|
|
|
|
* @param string $upload_path - destination of the upload. |
|
|
|
|
* This path is to append to $base_work_dir |
|
|
|
|
* @param string $base_work_dir - base working directory of the module |
|
|
|
|
* @param int $max_filled_space - amount of bytes to not exceed in the base |
|
|
|
|
* @param array $courseInfo |
|
|
|
|
* @param array $userInfo |
|
|
|
|
* @param array $uploaded_file - follows the $_FILES Structure |
|
|
|
|
* @param string $upload_path - destination of the upload. |
|
|
|
|
* This path is to append to $base_work_dir |
|
|
|
|
* @param string $base_work_dir - base working directory of the module |
|
|
|
|
* @param int $maxFilledSpace - amount of bytes to not exceed in the base |
|
|
|
|
* working directory |
|
|
|
|
* @param boolean Output switch. Optional. If no output not wanted on success, set to false. |
|
|
|
|
* @param int $sessionId |
|
|
|
|
* @param int $groupId |
|
|
|
|
* @param boolean $output Optional. If no output not wanted on success, set to false. |
|
|
|
|
* |
|
|
|
|
* @return boolean true if it succeeds false otherwise |
|
|
|
|
*/ |
|
|
|
|
function unzip_uploaded_document( |
|
|
|
|
$courseInfo, |
|
|
|
|
$userInfo, |
|
|
|
|
$uploaded_file, |
|
|
|
|
$upload_path, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$max_filled_space, |
|
|
|
|
$output = true, |
|
|
|
|
$to_group_id = 0 |
|
|
|
|
$maxFilledSpace, |
|
|
|
|
$sessionId = 0, |
|
|
|
|
$groupId = 0, |
|
|
|
|
$output = true |
|
|
|
|
) { |
|
|
|
|
global $_course; |
|
|
|
|
global $_user; |
|
|
|
|
global $to_user_id; |
|
|
|
|
global $to_group_id; |
|
|
|
|
|
|
|
|
|
$zip_file = new PclZip($uploaded_file['tmp_name']); |
|
|
|
|
$zip = new PclZip($uploaded_file['tmp_name']); |
|
|
|
|
|
|
|
|
|
// Check the zip content (real size and file extension) |
|
|
|
|
$zip_content_array = (array)$zip_file->listContent(); |
|
|
|
|
$zip_content_array = (array)$zip->listContent(); |
|
|
|
|
|
|
|
|
|
$real_filesize = 0; |
|
|
|
|
$realSize = 0; |
|
|
|
|
foreach ($zip_content_array as & $this_content) { |
|
|
|
|
$real_filesize += $this_content['size']; |
|
|
|
|
$realSize += $this_content['size']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!DocumentManager::enough_space($real_filesize, $max_filled_space)) { |
|
|
|
|
if (!DocumentManager::enough_space($realSize, $maxFilledSpace)) { |
|
|
|
|
Display::display_error_message(get_lang('UplNotEnoughSpace')); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// It happens on Linux that $upload_path sometimes doesn't start with '/' |
|
|
|
|
if ($upload_path[0] != '/') { |
|
|
|
|
$upload_path='/'.$upload_path; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Uncompressing phase */ |
|
|
|
|
|
|
|
|
|
// Get into the right directory |
|
|
|
|
$save_dir = getcwd(); |
|
|
|
|
$folder = api_get_unique_id(); |
|
|
|
|
$destinationDir = api_get_path(SYS_ARCHIVE_PATH).$folder; |
|
|
|
|
mkdir($destinationDir, api_get_permissions_for_new_directories(), true); |
|
|
|
|
|
|
|
|
|
chdir($base_work_dir.$upload_path); |
|
|
|
|
/* Uncompress zip file*/ |
|
|
|
|
// We extract using a callback function that "cleans" the path |
|
|
|
|
$unzipping_state = $zip_file->extract( |
|
|
|
|
$zip->extract( |
|
|
|
|
PCLZIP_OPT_PATH, |
|
|
|
|
$destinationDir, |
|
|
|
|
PCLZIP_CB_PRE_EXTRACT, |
|
|
|
|
'clean_up_files_in_zip', |
|
|
|
|
PCLZIP_OPT_REPLACE_NEWER |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// Add all documents in the unzipped folder to the database |
|
|
|
|
add_all_documents_in_folder_to_database( |
|
|
|
|
$_course, |
|
|
|
|
$_user['user_id'], |
|
|
|
|
$courseInfo, |
|
|
|
|
$userInfo, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$upload_path == '/' ? '' : $upload_path, |
|
|
|
|
$to_group_id |
|
|
|
|
$destinationDir, |
|
|
|
|
$sessionId, |
|
|
|
|
$groupId, |
|
|
|
|
$output |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (is_dir($destinationDir)) { |
|
|
|
|
rmdirr($destinationDir); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1427,10 +1446,12 @@ function search_img_from_html($html_file) { |
|
|
|
|
* @param int $session_id |
|
|
|
|
* @param int $to_group_id |
|
|
|
|
* @param int $to_user_id |
|
|
|
|
* @param string $base_work_dir |
|
|
|
|
* @param string $base_work_dir /var/www/chamilo/courses/ABC/document |
|
|
|
|
* @param string $desired_dir_name complete path of the desired name |
|
|
|
|
* @param string $title |
|
|
|
|
* Example: /folder1/folder2 |
|
|
|
|
* @param string $title "folder2" |
|
|
|
|
* @param int $visibility (0 for invisible, 1 for visible, 2 for deleted) |
|
|
|
|
* @param bool $generateNewNameIfExists |
|
|
|
|
* @return string actual directory name if it succeeds, |
|
|
|
|
* boolean false otherwise |
|
|
|
|
*/ |
|
|
|
@ -1443,7 +1464,8 @@ function create_unexisting_directory( |
|
|
|
|
$base_work_dir, |
|
|
|
|
$desired_dir_name, |
|
|
|
|
$title = null, |
|
|
|
|
$visibility = null |
|
|
|
|
$visibility = null, |
|
|
|
|
$generateNewNameIfExists = false |
|
|
|
|
) { |
|
|
|
|
$course_id = $_course['real_id']; |
|
|
|
|
$session_id = intval($session_id); |
|
|
|
@ -1456,10 +1478,30 @@ function create_unexisting_directory( |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if ($folderExists == true) { |
|
|
|
|
return false; |
|
|
|
|
if ($generateNewNameIfExists) { |
|
|
|
|
$counter = 1; |
|
|
|
|
while (1) { |
|
|
|
|
$folderExists = DocumentManager::folderExists( |
|
|
|
|
$desired_dir_name.'_'.$counter, |
|
|
|
|
$_course, |
|
|
|
|
$session_id, |
|
|
|
|
$to_group_id |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if ($folderExists == false) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
$counter++; |
|
|
|
|
} |
|
|
|
|
$desired_dir_name = $desired_dir_name.'_'.$counter; |
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$systemFolderName = $desired_dir_name; |
|
|
|
|
|
|
|
|
|
// Adding suffix |
|
|
|
|
$suffix = DocumentManager::getDocumentSuffix( |
|
|
|
|
$_course, |
|
|
|
@ -1474,7 +1516,6 @@ function create_unexisting_directory( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!is_dir($base_work_dir.$systemFolderName)) { |
|
|
|
|
|
|
|
|
|
mkdir( |
|
|
|
|
$base_work_dir.$systemFolderName, |
|
|
|
|
api_get_permissions_for_new_directories(), |
|
|
|
@ -1562,9 +1603,11 @@ function create_unexisting_directory( |
|
|
|
|
|
|
|
|
|
/* This means the folder NOT exist in the filesystem |
|
|
|
|
(now this was created) but there is a record in the Database*/ |
|
|
|
|
|
|
|
|
|
return $documentData; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1948,95 +1991,111 @@ function build_missing_files_form($missing_files, $upload_path, $file_name) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* This recursive function can be used during the upgrade process form older versions of Chamilo |
|
|
|
|
* It crawls the given directory, checks if the file is in the DB and adds it if it's not |
|
|
|
|
* This recursive function can be used during the upgrade process form older |
|
|
|
|
* versions of Chamilo |
|
|
|
|
* It crawls the given directory, checks if the file is in the DB and adds |
|
|
|
|
* it if it's not |
|
|
|
|
* |
|
|
|
|
* @param array $courseInfo |
|
|
|
|
* @param array $userInfo |
|
|
|
|
* @param string $base_work_dir |
|
|
|
|
* @param string $current_path, needed for recursivity |
|
|
|
|
* @param string $folderPath |
|
|
|
|
* @param int $sessionId |
|
|
|
|
* @param int $groupId |
|
|
|
|
* @param bool $output |
|
|
|
|
* @param array $parent |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
function add_all_documents_in_folder_to_database( |
|
|
|
|
$_course, |
|
|
|
|
$user_id, |
|
|
|
|
$courseInfo, |
|
|
|
|
$userInfo, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$current_path = '', |
|
|
|
|
$to_group_id = 0 |
|
|
|
|
$folderPath, |
|
|
|
|
$sessionId = 0, |
|
|
|
|
$groupId = 0, |
|
|
|
|
$output = false, |
|
|
|
|
$parent = array() |
|
|
|
|
) { |
|
|
|
|
$current_session_id = api_get_session_id(); |
|
|
|
|
$path = $base_work_dir.$current_path; |
|
|
|
|
if (empty($userInfo) || empty($courseInfo)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$userId = $userInfo['user_id']; |
|
|
|
|
|
|
|
|
|
// Open dir |
|
|
|
|
$handle = opendir($path); |
|
|
|
|
if (is_dir($path)) { |
|
|
|
|
$handle = opendir($folderPath); |
|
|
|
|
$files = array(); |
|
|
|
|
|
|
|
|
|
if (is_dir($folderPath)) { |
|
|
|
|
// Run trough |
|
|
|
|
while ($file = readdir($handle)) { |
|
|
|
|
if ($file == '.' || $file == '..') continue; |
|
|
|
|
|
|
|
|
|
$completepath = "$path/$file"; |
|
|
|
|
// Directory? |
|
|
|
|
if (is_dir($completepath)) { |
|
|
|
|
$title = get_document_title($file); |
|
|
|
|
$safe_file = replace_dangerous_char($file); |
|
|
|
|
@rename($path.'/'.$file, $path.'/'.$safe_file); |
|
|
|
|
// If we can't find the file, add it |
|
|
|
|
if (!DocumentManager::get_document_id($_course, $current_path.'/'.$safe_file)) { |
|
|
|
|
$document_id = add_document($_course, $current_path.'/'.$safe_file, 'folder', 0, $title); |
|
|
|
|
api_item_property_update( |
|
|
|
|
$_course, |
|
|
|
|
TOOL_DOCUMENT, |
|
|
|
|
$document_id, |
|
|
|
|
'DocumentAdded', |
|
|
|
|
$user_id, |
|
|
|
|
$to_group_id, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
$current_session_id |
|
|
|
|
); |
|
|
|
|
//echo $current_path.'/'.$safe_file.' added!<br />'; |
|
|
|
|
} |
|
|
|
|
if ($file == '.' || $file == '..') { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$parentPath = null; |
|
|
|
|
if (!empty($parent)) { |
|
|
|
|
$parentPath = $parent['path']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$completePath = $parentPath.'/'.$file; |
|
|
|
|
$sysFolderPath = $folderPath.'/'.$file; |
|
|
|
|
|
|
|
|
|
// Is directory? |
|
|
|
|
if (is_dir($sysFolderPath)) { |
|
|
|
|
$newFolderData = create_unexisting_directory( |
|
|
|
|
$courseInfo, |
|
|
|
|
$userId, |
|
|
|
|
$sessionId, |
|
|
|
|
$groupId, |
|
|
|
|
null, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$completePath, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
true |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$files[$file] = $newFolderData; |
|
|
|
|
|
|
|
|
|
// Recursive |
|
|
|
|
add_all_documents_in_folder_to_database( |
|
|
|
|
$_course, |
|
|
|
|
$user_id, |
|
|
|
|
$courseInfo, |
|
|
|
|
$userInfo, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$current_path . '/' . $safe_file, |
|
|
|
|
$to_group_id |
|
|
|
|
$sysFolderPath, |
|
|
|
|
$sessionId, |
|
|
|
|
$groupId, |
|
|
|
|
$output, |
|
|
|
|
$newFolderData |
|
|
|
|
); |
|
|
|
|
} else { |
|
|
|
|
//Rename |
|
|
|
|
$safe_file = disable_dangerous_file(replace_dangerous_char($file, 'strict')); |
|
|
|
|
@rename($base_work_dir.$current_path.'/'.$file, $base_work_dir.$current_path.'/'.$safe_file); |
|
|
|
|
$document_id = DocumentManager::get_document_id($_course, $current_path.'/'.$safe_file); |
|
|
|
|
if (!$document_id) { |
|
|
|
|
$title = get_document_title($file); |
|
|
|
|
$size = filesize($base_work_dir.$current_path.'/'.$safe_file); |
|
|
|
|
$document_id = add_document($_course, $current_path.'/'.$safe_file, 'file', $size, $title); |
|
|
|
|
api_item_property_update( |
|
|
|
|
$_course, |
|
|
|
|
TOOL_DOCUMENT, |
|
|
|
|
$document_id, |
|
|
|
|
'DocumentAdded', |
|
|
|
|
$user_id, |
|
|
|
|
$to_group_id, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
$current_session_id |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
api_item_property_update( |
|
|
|
|
$_course, |
|
|
|
|
TOOL_DOCUMENT, |
|
|
|
|
$document_id, |
|
|
|
|
'DocumentUpdated', |
|
|
|
|
$user_id, |
|
|
|
|
$to_group_id, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
null, |
|
|
|
|
$current_session_id |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
// Rename |
|
|
|
|
$uploadedFile = array( |
|
|
|
|
'name' => $file, |
|
|
|
|
'tmp_name' => $sysFolderPath, |
|
|
|
|
'size' => filesize($sysFolderPath), |
|
|
|
|
'type' => null, |
|
|
|
|
'from_file' => true, |
|
|
|
|
'move_file' => true |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
handle_uploaded_document( |
|
|
|
|
$courseInfo, |
|
|
|
|
$uploadedFile, |
|
|
|
|
$base_work_dir, |
|
|
|
|
$parentPath, |
|
|
|
|
$userId, |
|
|
|
|
$groupId, |
|
|
|
|
null, |
|
|
|
|
0, |
|
|
|
|
'overwrite', |
|
|
|
|
$output, |
|
|
|
|
false, |
|
|
|
|
null, |
|
|
|
|
$sessionId |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|