Skip to content

Commit b66808c

Browse files
authored
Merge pull request #6038 from christianbeeznest/GH-2043
Session: Ensure complete session data cleanup with cascade and explicit deletes - refs #2043
2 parents ca97c4c + eccabd6 commit b66808c

File tree

3 files changed

+47
-49
lines changed

3 files changed

+47
-49
lines changed

public/main/inc/lib/sessionmanager.lib.php

+45-47
Original file line numberDiff line numberDiff line change
@@ -1971,31 +1971,31 @@ public static function edit_session(
19711971
*
19721972
* @author Carlos Vargas from existing code
19731973
*
1974-
* @param array $id_checked an array to delete sessions
1975-
* @param bool $from_ws optional, true if the function is called
1974+
* @param array $idChecked an array to delete sessions
1975+
* @param bool $fromWs optional, true if the function is called
19761976
* by a webservice, false otherwise
19771977
*
19781978
* @return bool
19791979
* */
1980-
public static function delete($id_checked, $from_ws = false)
1980+
public static function delete($idChecked, $fromWs = false)
19811981
{
19821982
$sessionId = null;
1983-
if (is_array($id_checked)) {
1984-
foreach ($id_checked as $sessionId) {
1983+
if (is_array($idChecked)) {
1984+
foreach ($idChecked as $sessionId) {
19851985
self::delete($sessionId);
19861986
}
19871987
} else {
1988-
$sessionId = (int) $id_checked;
1988+
$sessionId = (int) $idChecked;
19891989
}
19901990

19911991
if (empty($sessionId)) {
19921992
return false;
19931993
}
19941994

1995-
$tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
1996-
$tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
1997-
$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
1998-
$tbl_url_session = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
1995+
$tblSessionRelCourse = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
1996+
$tblSessionRelCourseRelUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
1997+
$tblSessionRelUser = Database::get_main_table(TABLE_MAIN_SESSION_USER);
1998+
$tblUrlSession = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
19991999
$userGroupSessionTable = Database::get_main_table(TABLE_USERGROUP_REL_SESSION);
20002000
$trackCourseAccess = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);
20012001
$trackAccess = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ACCESS);
@@ -2027,7 +2027,7 @@ public static function delete($id_checked, $from_ws = false)
20272027
return false;
20282028
}
20292029

2030-
if (self::allowed($sessionEntity) && !$from_ws) {
2030+
if (self::allowed($sessionEntity) && !$fromWs) {
20312031
if (!$sessionEntity->hasUserAsSessionAdmin($user) && !api_is_platform_admin()) {
20322032
api_not_allowed(true);
20332033
}
@@ -2036,47 +2036,45 @@ public static function delete($id_checked, $from_ws = false)
20362036
// Delete Picture Session
20372037
SessionManager::deleteAsset($sessionId);
20382038

2039-
// Delete documents inside a session
2040-
$courses = self::getCoursesInSession($sessionId);
2041-
foreach ($courses as $courseId) {
2042-
$courseInfo = api_get_course_info_by_id($courseId);
2043-
/*DocumentManager::deleteDocumentsFromSession($courseInfo, $sessionId);
2044-
$works = Database::select(
2045-
'*',
2046-
$tbl_student_publication,
2047-
[
2048-
'where' => ['session_id = ? AND c_id = ?' => [$sessionId, $courseId]],
2049-
]
2050-
);
2051-
2052-
$currentCourseRepositorySys = api_get_path(SYS_COURSE_PATH).$courseInfo['path'].'/';
2053-
foreach ($works as $index => $work) {
2054-
if ($work['filetype'] = 'folder') {
2055-
Database::query("DELETE FROM $tbl_student_publication_assignment WHERE publication_id = $index");
2056-
}
2057-
my_delete($currentCourseRepositorySys.'/'.$work['url']);
2058-
}*/
2059-
}
2060-
20612039
$sessionName = $sessionEntity->getTitle();
20622040
$em->remove($sessionEntity);
20632041
$em->flush();
20642042

2065-
// Class
2066-
$sql = "DELETE FROM $userGroupSessionTable
2067-
WHERE session_id = $sessionId";
2068-
Database::query($sql);
2043+
// Delete explicitly from tables not directly related to 'session'
2044+
$tables = [
2045+
'track_e_lastaccess',
2046+
'track_e_default',
2047+
'track_e_exercise_confirmation',
2048+
'track_e_links',
2049+
'track_e_online',
2050+
'track_e_attempt_qualify',
2051+
'track_e_access_complete',
2052+
'track_e_uploads',
2053+
'track_course_ranking',
2054+
'c_dropbox_file',
2055+
'c_forum_thread_qualify_log',
2056+
'c_dropbox_post',
2057+
'c_survey_answer',
2058+
'c_wiki_mailcue',
2059+
'c_dropbox_category',
2060+
'skill_rel_item',
2061+
'scheduled_announcements',
2062+
'sequence_row_entity',
2063+
];
20692064

2070-
//Database::query("DELETE FROM $tbl_student_publication WHERE session_id = $sessionId");
2071-
Database::query("DELETE FROM $tbl_session_rel_course WHERE session_id = $sessionId");
2072-
Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE session_id = $sessionId");
2073-
Database::query("DELETE FROM $tbl_session_rel_user WHERE session_id = $sessionId");
2074-
//Database::query("DELETE FROM $tbl_item_properties WHERE session_id = $sessionId");
2075-
Database::query("DELETE FROM $tbl_url_session WHERE session_id = $sessionId");
2076-
Database::query("DELETE FROM $trackCourseAccess WHERE session_id = $sessionId");
2077-
Database::query("DELETE FROM $trackAccess WHERE session_id = $sessionId");
2078-
$sql = "UPDATE $ticket SET session_id = NULL WHERE session_id = $sessionId";
2079-
Database::query($sql);
2065+
foreach ($tables as $table) {
2066+
Database::delete($table, ['session_id = ?' => $sessionId]);
2067+
}
2068+
2069+
// Delete other related tables
2070+
Database::delete($userGroupSessionTable, ['session_id = ?' => $sessionId]);
2071+
Database::delete($tblSessionRelCourse, ['session_id = ?' => $sessionId]);
2072+
Database::delete($tblSessionRelCourseRelUser, ['session_id = ?' => $sessionId]);
2073+
Database::delete($tblSessionRelUser, ['session_id = ?' => $sessionId]);
2074+
Database::delete($tblUrlSession, ['session_id = ?' => $sessionId]);
2075+
Database::delete($trackCourseAccess, ['session_id = ?' => $sessionId]);
2076+
Database::delete($trackAccess, ['session_id = ?' => $sessionId]);
2077+
Database::update($ticket, ['session_id' => null], ['session_id = ?' => $sessionId]);
20802078

20812079
$extraFieldValue = new ExtraFieldValue('session');
20822080
$extraFieldValue->deleteValuesByItem($sessionId);

src/CoreBundle/Entity/Session.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ class Session implements ResourceWithAccessUrlInterface, Stringable
370370
* Image illustrating the session (was extra field 'image' in 1.11).
371371
*/
372372
#[Groups(['user_subscriptions:sessions'])]
373-
#[ORM\ManyToOne(targetEntity: Asset::class, cascade: ['remove'])]
373+
#[ORM\ManyToOne(targetEntity: Asset::class, cascade: ['persist', 'remove'])]
374374
#[ORM\JoinColumn(name: 'image_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
375375
protected ?Asset $image = null;
376376

src/CoreBundle/Entity/Ticket.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class Ticket
4545
protected Course $course;
4646

4747
#[ORM\ManyToOne(targetEntity: Session::class)]
48-
#[ORM\JoinColumn(name: 'session_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
48+
#[ORM\JoinColumn(name: 'session_id', referencedColumnName: 'id', onDelete: 'SET NULL')]
4949
protected Session $session;
5050

5151
#[Assert\NotBlank]

0 commit comments

Comments
 (0)