diff --git a/calendar/lib.php b/calendar/lib.php index dc56f91fd63..8200b980601 100644 --- a/calendar/lib.php +++ b/calendar/lib.php @@ -2866,8 +2866,7 @@ function calendar_process_subscription_row($subscriptionid, $pollinterval, $acti return "

".get_string('subscriptionupdated', 'calendar', $sub->name)."

" . calendar_update_subscription_events($subscriptionid); case $strremove: - $DB->delete_records('event', array('subscriptionid' => $subscriptionid)); - $DB->delete_records('event_subscriptions', array('id' => $subscriptionid)); + calendar_delete_subscription($subscriptionid); return get_string('subscriptionremoved', 'calendar', $sub->name); break; @@ -2877,6 +2876,21 @@ function calendar_process_subscription_row($subscriptionid, $pollinterval, $acti return ''; } +/** + * Delete subscription and all related events. + * + * @param int|stdClass $subscription subscription or it's id, which needs to be deleted. + */ +function calendar_delete_subscription($subscription) { + global $DB; + + if (is_object($subscription)) { + $subscription = $subscription->id; + } + // Delete subscription and related events. + $DB->delete_records('event', array('subscriptionid' => $subscription)); + $DB->delete_records('event_subscriptions', array('id' => $subscription)); +} /** * From a URL, fetch the calendar and return an iCalendar object. * diff --git a/calendar/managesubscriptions.php b/calendar/managesubscriptions.php index cc726f13d70..07265bc9213 100644 --- a/calendar/managesubscriptions.php +++ b/calendar/managesubscriptions.php @@ -75,7 +75,13 @@ if (!empty($formdata)) { $ical->unserialize($calendar); $importresults = calendar_import_icalendar_events($ical, $courseid, $subscriptionid); } else { - $importresults = calendar_update_subscription_events($subscriptionid); + try { + $importresults = calendar_update_subscription_events($subscriptionid); + } catch (moodle_exception $e) { + // Delete newly added subscription and show invalid url error. + calendar_delete_subscription($subscriptionid); + print_error($e->errorcode, $e->module, $PAGE->url); + } } // Redirect to prevent refresh issues. redirect($PAGE->url, $importresults); @@ -83,7 +89,12 @@ if (!empty($formdata)) { // The user is wanting to perform an action upon an existing subscription. require_sesskey(); // Must have sesskey for all actions. if (calendar_can_edit_subscription($subscriptionid)) { - $importresults = calendar_process_subscription_row($subscriptionid, $pollinterval, $action); + try { + $importresults = calendar_process_subscription_row($subscriptionid, $pollinterval, $action); + } catch (moodle_exception $e) { + // If exception caught, then user should be redirected to page where he/she came from. + print_error($e->errorcode, $e->module, $PAGE->url); + } } else { print_error('nopermissions', 'error', $PAGE->url, get_string('managesubscriptions', 'calendar')); } diff --git a/calendar/managesubscriptions_form.php b/calendar/managesubscriptions_form.php index 28344cd64ec..a969fbd4595 100644 --- a/calendar/managesubscriptions_form.php +++ b/calendar/managesubscriptions_form.php @@ -123,7 +123,9 @@ class calendar_addsubscription_form extends moodleform { } } } else if (($data['importfrom'] == CALENDAR_IMPORT_FROM_URL)) { - if (clean_param($data['url'], PARAM_URL) !== $data['url']) { + // Clean input calendar url. + $url = clean_param($data['url'], PARAM_URL); + if (empty($url) || ($url !== $data['url'])) { $errors['url'] = get_string('invalidurl', 'error'); } } else {