MDL-54551 core: AJAX call redirects to login page when session expired
authorThom Rawson <thomw@tallthom.com>
Sun, 6 May 2018 05:25:39 +0000 (14:25 +0900)
committerMark Nelson <markn@moodle.com>
Wed, 18 Jul 2018 10:07:16 +0000 (18:07 +0800)
lang/en/webservice.php
lib/amd/build/ajax.min.js
lib/amd/src/ajax.js
lib/externallib.php

index b6cf1de..20af1fe 100644 (file)
@@ -186,6 +186,7 @@ $string['service'] = 'Service';
 $string['servicehelpexplanation'] = 'A service is a set of functions. A service can be accessed by all users or just specified users.';
 $string['servicename'] = 'Service name';
 $string['servicenotavailable'] = 'Web service is not available (it doesn\'t exist or might be disabled)';
 $string['servicehelpexplanation'] = 'A service is a set of functions. A service can be accessed by all users or just specified users.';
 $string['servicename'] = 'Service name';
 $string['servicenotavailable'] = 'Web service is not available (it doesn\'t exist or might be disabled)';
+$string['servicerequireslogin'] = 'Web service requires login (the session has been logged out or has expired. Please save any work on the current page before continuing)';
 $string['servicesbuiltin'] = 'Built-in services';
 $string['servicescustom'] = 'Custom services';
 $string['serviceusers'] = 'Authorised users';
 $string['servicesbuiltin'] = 'Built-in services';
 $string['servicescustom'] = 'Custom services';
 $string['serviceusers'] = 'Authorised users';
index 8247f32..8a6dfe4 100644 (file)
Binary files a/lib/amd/build/ajax.min.js and b/lib/amd/build/ajax.min.js differ
index 481247c..3130fdc 100644 (file)
@@ -25,7 +25,7 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  * @since      2.9
  */
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  * @since      2.9
  */
-define(['jquery', 'core/config', 'core/log'], function($, config, Log) {
+define(['jquery', 'core/config', 'core/log', 'core/yui', 'core/url'], function($, config, Log, Y, URL) {
 
     // Keeps track of when the user leaves the page so we know not to show an error.
     var unloading = false;
 
     // Keeps track of when the user leaves the page so we know not to show an error.
     var unloading = false;
@@ -79,9 +79,20 @@ define(['jquery', 'core/config', 'core/log'], function($, config, Log) {
         }
         // Something failed, reject the remaining promises.
         if (exception !== null) {
         }
         // Something failed, reject the remaining promises.
         if (exception !== null) {
-            for (; i < requests.length; i++) {
-                request = requests[i];
-                request.deferred.reject(exception);
+            // If the user isn't doing anything too important, redirect to the login page.
+            if (exception.errorcode === "servicerequireslogin") {
+                Y.use('moodle-core-formchangechecker', function() {
+                    if (!M.core_formchangechecker.get_form_dirty_state()) {
+                        // If we reach here, the user isn't editing anything on the page.
+                        var loginUrl = URL.relativeUrl("/login/index.php");
+                        window.location.replace(loginUrl);
+                    }
+                });
+            } else {
+                for (; i < requests.length; i++) {
+                    request = requests[i];
+                    request.deferred.reject(exception);
+                }
             }
         }
     };
             }
         }
     };
index 667eed8..44fbd29 100644 (file)
@@ -208,10 +208,10 @@ class external_api {
             // Do not allow access to write or delete webservices as a public user.
             if ($externalfunctioninfo->loginrequired) {
                 if (defined('NO_MOODLE_COOKIES') && NO_MOODLE_COOKIES && !PHPUNIT_TEST) {
             // Do not allow access to write or delete webservices as a public user.
             if ($externalfunctioninfo->loginrequired) {
                 if (defined('NO_MOODLE_COOKIES') && NO_MOODLE_COOKIES && !PHPUNIT_TEST) {
-                    throw new moodle_exception('servicenotavailable', 'webservice');
+                    throw new moodle_exception('servicerequireslogin', 'webservice');
                 }
                 if (!isloggedin()) {
                 }
                 if (!isloggedin()) {
-                    throw new moodle_exception('servicenotavailable', 'webservice');
+                    throw new moodle_exception('servicerequireslogin', 'webservice');
                 } else {
                     require_sesskey();
                 }
                 } else {
                     require_sesskey();
                 }