From 0bcd181f7d57146d1547b893b81b60782136cf22 Mon Sep 17 00:00:00 2001 From: Julio Date: Mon, 1 Apr 2019 14:07:32 +0200 Subject: [PATCH] Minor - Partial merge from 1.11.x --- main/document/document.php | 9 +- main/exercise/exercise.class.php | 15 +- main/exercise/exercise.php | 24 +- main/exercise/overview.php | 19 +- main/exercise/question.class.php | 8 +- main/gradebook/lib/fe/displaygradebook.php | 8 +- main/group/group.php | 2 +- main/group/group_category.php | 2 +- main/group/member_settings.php | 2 +- main/group/tutor_settings.php | 2 +- main/inc/ajax/lang.ajax.php | 2 +- main/inc/ajax/model.ajax.php | 4 +- main/inc/ajax/session.ajax.php | 191 ++ main/inc/ajax/social.ajax.php | 16 +- main/inc/lib/add_course.lib.inc.php | 2 +- main/inc/lib/agenda.lib.php | 40 +- main/inc/lib/api.lib.php | 4 +- main/inc/lib/display.lib.php | 32 +- main/inc/lib/document.lib.php | 170 +- main/inc/lib/elfinder/connectorAction.php | 11 + main/inc/lib/events.lib.php | 89 +- main/inc/lib/exercise.lib.php | 44 +- main/inc/lib/exercise_show_functions.lib.php | 179 +- main/inc/lib/extra_field.lib.php | 2 +- main/inc/lib/fileUpload.lib.php | 4 + main/inc/lib/fixlinks.js | 2 +- main/inc/lib/formvalidator/Element/Color.php | 2 +- .../lib/formvalidator/Element/DatePicker.php | 23 +- .../formvalidator/Element/DateTimePicker.php | 23 +- .../Element/DateTimeRangePicker.php | 24 +- .../lib/formvalidator/FormValidator.class.php | 9 +- main/inc/lib/internationalization.lib.php | 9 +- main/inc/lib/message.lib.php | 40 +- main/inc/lib/myspace.lib.php | 99 +- main/inc/lib/nusoap/class.soap_server.php | 3 +- main/inc/lib/pdf.lib.php | 15 +- .../pear/HTML/QuickForm/advmultiselect.php | 2 +- main/inc/lib/pear/HTML/QuickForm/button.php | 17 +- main/inc/lib/pear/HTML/QuickForm/checkbox.php | 17 +- main/inc/lib/pear/HTML/QuickForm/element.php | 50 + main/inc/lib/pear/HTML/QuickForm/file.php | 21 +- main/inc/lib/pear/HTML/QuickForm/group.php | 17 +- main/inc/lib/pear/HTML/QuickForm/radio.php | 2 +- main/inc/lib/pear/HTML/QuickForm/select.php | 18 +- main/inc/lib/pear/HTML/QuickForm/text.php | 42 +- main/inc/lib/sessionmanager.lib.php | 542 +++--- main/inc/lib/skill.lib.php | 36 +- main/inc/lib/social.lib.php | 1682 +++++++++++++---- main/inc/lib/sortable_table.class.php | 12 + main/inc/lib/statistics.lib.php | 4 +- main/inc/lib/tracking.lib.php | 57 +- main/inc/lib/usergroup.lib.php | 13 +- main/inc/lib/usermanager.lib.php | 234 ++- main/link/link.php | 2 +- main/lp/aicc.class.php | 66 +- main/lp/aicc_api.php | 3 +- main/lp/aicc_hacp.php | 6 +- main/lp/learnpath.class.php | 90 +- main/lp/learnpathItem.class.php | 2 +- main/lp/lp_add_item.php | 2 +- main/lp/lp_ajax_switch_item.php | 7 +- main/lp/lp_controller.php | 7 +- main/lp/lp_edit.php | 17 +- main/lp/lp_edit_item.php | 4 +- main/lp/lp_list.php | 5 +- main/lp/lp_update_scorm.php | 6 +- main/lp/lp_view.php | 7 +- main/lp/lp_view_item.php | 2 +- main/lp/scorm.class.php | 200 +- main/lp/scorm_api.php | 25 +- main/messages/inbox.php | 82 +- main/messages/new_message.php | 86 +- main/messages/outbox.php | 83 +- main/messages/view_message.php | 56 +- main/mySpace/exercise_category_report.php | 4 +- main/mySpace/index.php | 2 - main/mySpace/myStudents.php | 4 +- main/mySpace/my_career.php | 5 +- main/mySpace/session.php | 10 +- main/mySpace/slider.js | 4 +- main/mySpace/user_import.php | 28 +- main/notebook/index.php | 5 +- main/session/add_edit_users_to_session.php | 138 +- main/session/add_users_to_session_course.php | 63 +- main/session/resume_session.php | 101 +- main/session/session_add.php | 2 +- main/session/session_course_user_list.php | 16 +- main/session/session_edit.php | 4 +- main/session/session_import.php | 4 +- main/session/session_list.php | 12 +- 90 files changed, 3140 insertions(+), 1916 deletions(-) diff --git a/main/document/document.php b/main/document/document.php index ade212cc27..fd60e04658 100755 --- a/main/document/document.php +++ b/main/document/document.php @@ -222,6 +222,7 @@ switch ($action) { case 'delete_item': if ($isAllowedToEdit || $groupMemberWithUploadRights || + DocumentManager::isBasicCourseFolder($curdirpath, $sessionId) || DocumentManager::is_my_shared_folder(api_get_user_id(), $curdirpath, $sessionId) || DocumentManager::is_my_shared_folder(api_get_user_id(), $moveTo, $sessionId) ) { @@ -787,7 +788,7 @@ function confirmation (name) { } } -$(document).ready(function() { +$(function() { $(".convertAction").click(function() { var id = $(this).attr("data-documentId"); var format = $(this).attr("data-formatType"); @@ -953,7 +954,7 @@ if (!empty($documentAndFolders)) { $htmlHeadXtra[] = ' "; } else { - //For LPs - $url = api_get_path(WEB_AJAX_PATH).'lp.ajax.php?a=get_documents&lp_id='.$lp_id.'&'.api_get_cidreq(); - $return .= ""; - } if (!$user_in_course) { $return = ''; @@ -4976,6 +4950,9 @@ class DocumentManager $path = $document_data['path']; $url_path = urlencode($document_data['path']); + $basePageUrl = api_get_path(WEB_CODE_PATH).'document/'; + $pageUrl = $basePageUrl.'document.php'; + // Add class="invisible" on invisible files $visibility_class = $visibility == false ? ' class="muted"' : ''; $forcedownload_link = ''; @@ -4985,7 +4962,9 @@ class DocumentManager if (!$show_as_icon) { // Build download link (icon) - $forcedownload_link = $filetype == 'folder' ? api_get_self().'?'.$courseParams.'&action=downloadfolder&id='.$document_data['id'] : api_get_self().'?'.$courseParams.'&action=download&id='.$document_data['id']; + $forcedownload_link = $filetype == 'folder' + ? $pageUrl.'?'.$courseParams.'&action=downloadfolder&id='.$document_data['id'] + : $pageUrl.'?'.$courseParams.'&action=download&id='.$document_data['id']; // Folder download or file download? $forcedownload_icon = $filetype == 'folder' ? 'save_pack.png' : 'save.png'; // Prevent multiple clicks on zipped folder download @@ -5004,9 +4983,9 @@ class DocumentManager $is_browser_viewable_file = self::isBrowserViewable($ext); if ($is_browser_viewable_file) { if ($ext == 'pdf' || in_array($ext, $webODFList)) { - $url = api_get_self().'?'.$courseParams.'&action=download&id='.$document_data['id']; + $url = $pageUrl.'?'.$courseParams.'&action=download&id='.$document_data['id']; } else { - $url = 'showinframes.php?'.$courseParams.'&id='.$document_data['id']; + $url = $basePageUrl.'showinframes.php?'.$courseParams.'&id='.$document_data['id']; } } else { // url-encode for problematic characters (we may not call them dangerous characters...) @@ -5014,7 +4993,7 @@ class DocumentManager $url = $www.str_replace('%2F', '/', $url_path).'?'.$courseParams; } } else { - $url = api_get_self().'?'.$courseParams.'&id='.$document_data['id']; + $url = $pageUrl.'?'.$courseParams.'&id='.$document_data['id']; } if ($isCertificateMode) { @@ -5092,7 +5071,7 @@ class DocumentManager if (api_get_setting('allow_my_files') === 'true' && api_get_setting('users_copy_files') === 'true' && api_is_anonymous() === false ) { - $copy_myfiles_link = $filetype == 'file' ? api_get_self().'?'.$courseParams.'&action=copytomyfiles&id='.$document_data['id'] : api_get_self().'?'.$courseParams; + $copy_myfiles_link = $filetype == 'file' ? $pageUrl.'?'.$courseParams.'&action=copytomyfiles&id='.$document_data['id'] : api_get_self().'?'.$courseParams; if ($filetype == 'file') { /*$copyToMyFiles = ''. Display::return_icon('briefcase.png', get_lang('CopyToMyFiles'), [], ICON_SIZE_SMALL).'  '; @@ -5109,7 +5088,7 @@ class DocumentManager $filetype == 'file' && in_array($extension, ['html', 'htm']) ) { - $pdf_icon = ' '. + $pdf_icon = ' '. Display::return_icon('pdf.png', get_lang('Export2PDF'), [], ICON_SIZE_SMALL).' '; } @@ -5160,7 +5139,7 @@ class DocumentManager // For a "PDF Download" of the file. $pdfPreview = null; if ($ext != 'pdf' && !in_array($ext, $webODFList)) { - $url = 'showinframes.php?'.$courseParams.'&id='.$document_data['id']; + $url = $basePageUrl.'showinframes.php?'.$courseParams.'&id='.$document_data['id']; } else { $pdfPreview = Display::url( Display::return_icon('preview.png', get_lang('Preview'), null, ICON_SIZE_SMALL), @@ -5201,7 +5180,7 @@ class DocumentManager preg_match('/bmp$/i', urldecode($checkExtension)) || preg_match('/svg$/i', urldecode($checkExtension)) ) { - $url = 'showinframes.php?'.$courseParams.'&id='.$document_data['id']; + $url = $basePageUrl.'showinframes.php?'.$courseParams.'&id='.$document_data['id']; return ''. self::build_document_icon_tag($filetype, $path, $isAllowedToEdit). @@ -5240,7 +5219,7 @@ class DocumentManager preg_match('/bmp$/i', urldecode($checkExtension)) || preg_match('/svg$/i', urldecode($checkExtension)) ) { - $url = 'showinframes.php?'.$courseParams.'&id='.$document_data['id']; //without preview + $url = $basePageUrl.'showinframes.php?'.$courseParams.'&id='.$document_data['id']; //without preview return ''. self::build_document_icon_tag($filetype, $path, $isAllowedToEdit). ''; @@ -5583,7 +5562,7 @@ class DocumentManager // Cannot copy dir into his own subdir $path_displayed = self::get_titles_of_path($folder); $display_folder = substr($path_displayed, strlen($group_dir)); - $display_folder = ($display_folder == '') ? get_lang('Documents') : $display_folder; + $display_folder = $display_folder == '' ? get_lang('Documents') : $display_folder; $options[$folder] = $display_folder; } } @@ -5802,6 +5781,14 @@ class DocumentManager } } + public static function isBasicCourseFolder($path, $sessionId) + { + $cleanPath = Security::remove_XSS($path); + $basicCourseFolder = '/basic-course-documents__'.$sessionId.'__0'; + + return $cleanPath == $basicCourseFolder; + } + /** * Check if the file name or folder searched exist. * @@ -6772,15 +6759,14 @@ class DocumentManager if ($lp_id) { // LP URL $url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=add_item&type='.TOOL_DOCUMENT.'&file='.$documentId.'&lp_id='.$lp_id; - if (!empty($overwrite_url)) { - $url = $overwrite_url.'&cidReq='.$course_info['code'].'&id_session='.$session_id.'&document_id='.$documentId.''; - } } else { // Direct document URL $url = $web_code_path.'document/document.php?cidReq='.$course_info['code'].'&id_session='.$session_id.'&id='.$documentId; - if (!empty($overwrite_url)) { - $url = $overwrite_url.'&cidReq='.$course_info['code'].'&id_session='.$session_id.'&document_id='.$documentId; - } + } + + if (!empty($overwrite_url)) { + $overwrite_url = Security::remove_XSS($overwrite_url); + $url = $overwrite_url.'&cidReq='.$course_info['code'].'&id_session='.$session_id.'&document_id='.$documentId; } $img = Display::returnIconPath($icon); @@ -6861,15 +6847,15 @@ class DocumentManager return null; } - $onclick = ''; + //$onclick = ''; // if in LP, hidden folder are displayed in grey $folder_class_hidden = ''; if ($lp_id) { if (isset($resource['visible']) && $resource['visible'] == 0) { - $folder_class_hidden = "doc_folder_hidden"; // in base.css + $folder_class_hidden = ' doc_folder_hidden'; // in base.css } - $onclick = 'onclick="javascript: testResources(\'res_'.$resource['id'].'\',\'img_'.$resource['id'].'\')"'; } + $onclick = 'onclick="javascript: testResources(\'res_'.$resource['id'].'\',\'img_'.$resource['id'].'\')"'; $return = null; if (empty($path)) { diff --git a/main/inc/lib/elfinder/connectorAction.php b/main/inc/lib/elfinder/connectorAction.php index ed92537d78..ec11b0192f 100644 --- a/main/inc/lib/elfinder/connectorAction.php +++ b/main/inc/lib/elfinder/connectorAction.php @@ -20,6 +20,17 @@ if (empty($driverList)) { //'CourseUserDriver', //'HomeDriver' ]; + $block = api_get_configuration_value('block_editor_file_manager_for_students'); + $newDriverList = []; + if ($block && !api_is_allowed_to_edit()) { + foreach ($driverList as $driver) { + if ($driver === 'CourseDriver') { + continue; + } + $newDriverList[] = $driver; + } + $driverList = $newDriverList; + } } $connector->setDriverList($driverList); diff --git a/main/inc/lib/events.lib.php b/main/inc/lib/events.lib.php index ca9f6cf729..ea7c9dc8d5 100644 --- a/main/inc/lib/events.lib.php +++ b/main/inc/lib/events.lib.php @@ -2021,7 +2021,6 @@ class Event * @param int $sessionId The session in which to add the time (if any) * @param string $virtualTime The amount of time to be added, * in a hh:mm:ss format. If int, we consider it is expressed in hours. - * @param string $ip IP address to go on record for this time record * * @return true on successful insertion, false otherwise */ @@ -2029,80 +2028,32 @@ class Event $courseId, $userId, $sessionId, - $virtualTime = '', - $ip = '' + $virtualTime = '' ) { - $courseTrackingTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); - $time = $loginDate = $logoutDate = api_get_utc_datetime(); - $courseId = (int) $courseId; $userId = (int) $userId; $sessionId = (int) $sessionId; - $ip = Database::escape_string($ip); - - // Get the current latest course connection register. We need that - // record to re-use the data and create a new record. - $sql = "SELECT * - FROM $courseTrackingTable - WHERE - user_id = $userId AND - c_id = $courseId AND - session_id = $sessionId AND - login_course_date > '$time' - INTERVAL 3600 SECOND - ORDER BY login_course_date DESC - LIMIT 0,1"; - $result = Database::query($sql); - - // Ignore if we didn't find any course connection record in the last - // hour. In this case it wouldn't be right to add a "fake" time record. - if (Database::num_rows($result) > 0) { - // Found the latest connection - $row = Database::fetch_array($result); - $courseAccessId = $row['course_access_id']; - $courseAccessLoginDate = $row['login_course_date']; - $counter = $row['counter']; - $counter = $counter ? $counter : 0; - // Insert a new record, copy of the current one (except the logout - // date that we update to the current time) - $sql = "INSERT INTO $courseTrackingTable( - c_id, - user_ip, - user_id, - login_course_date, - logout_course_date, - counter, - session_id - ) VALUES( - $courseId, - '$ip', - $userId, - '$courseAccessLoginDate', - '$logoutDate', - $counter, - $sessionId - )"; - Database::query($sql); - $loginDate = ChamiloApi::addOrSubTimeToDateTime( - $virtualTime, - $courseAccessLoginDate, - false - ); - // We update the course tracking table - $sql = "UPDATE $courseTrackingTable - SET - login_course_date = '$loginDate', - logout_course_date = '$courseAccessLoginDate', - counter = 0 - WHERE - course_access_id = ".intval($courseAccessId)." AND - session_id = ".$sessionId; - Database::query($sql); + $logoutDate = api_get_utc_datetime(); + $loginDate = ChamiloApi::addOrSubTimeToDateTime( + $virtualTime, + $logoutDate, + false + ); - return true; - } + $params = [ + 'login_course_date' => $loginDate, + 'logout_course_date' => $logoutDate, + 'session_id' => $sessionId, + 'user_id' => $userId, + 'counter' => 0, + 'c_id' => $courseId, + 'user_ip' => api_get_real_ip(), + ]; + $courseTrackingTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); + Database::insert($courseTrackingTable, $params); - return false; + return true; } /** @@ -2134,8 +2085,6 @@ class Event return false; } $courseTrackingTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); - $time = $loginDate = $logoutDate = api_get_utc_datetime(); - $courseId = (int) $courseId; $userId = (int) $userId; $sessionId = (int) $sessionId; diff --git a/main/inc/lib/exercise.lib.php b/main/inc/lib/exercise.lib.php index 1cfffe69d0..feaa7e960d 100644 --- a/main/inc/lib/exercise.lib.php +++ b/main/inc/lib/exercise.lib.php @@ -1,6 +1,7 @@ addHtml(''; break; case FormValidator::LAYOUT_HORIZONTAL: - if (isset($attributes['custom']) && $attributes['custom'] == true) { + if (isset($attributes['custom']) && $attributes['custom']) { $template = '
{element} @@ -449,12 +447,13 @@ class HTML_QuickForm_file extends HTML_QuickForm_input '; } else { $template = ' -
-