summaryrefslogtreecommitdiffstats
path: root/core/js
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2018-02-26 17:13:23 +0100
committerChristoph Wurst <christoph@winzerhof-wurst.at>2018-03-08 16:48:50 +0100
commitb9720703e8afa26fd42d1bb7cc8fbf54ba2eeeae (patch)
treec5165cb03841c8d814a361d0fd41170474490711 /core/js
parentcccf6f4d5f18ad01ff5fcd296d7b8411c1e11139 (diff)
downloadnextcloud-server-b9720703e8afa26fd42d1bb7cc8fbf54ba2eeeae.tar.gz
nextcloud-server-b9720703e8afa26fd42d1bb7cc8fbf54ba2eeeae.zip
Add CSRF token controller to retrieve the current CSRF token
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'core/js')
-rw-r--r--core/js/js.js37
-rw-r--r--core/js/tests/specs/coreSpec.js12
2 files changed, 22 insertions, 27 deletions
diff --git a/core/js/js.js b/core/js/js.js
index 3c6ababf764..26dbbdb6e63 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1366,34 +1366,29 @@ function initCore() {
});
/**
- * Calls the server periodically to ensure that session doesn't
- * time out
+ * Calls the server periodically to ensure that session and CSRF
+ * token doesn't expire
*/
- function initSessionHeartBeat(){
- // max interval in seconds set to 24 hours
- var maxInterval = 24 * 3600;
+ function initSessionHeartBeat() {
// interval in seconds
var interval = 900;
if (oc_config.session_lifetime) {
interval = Math.floor(oc_config.session_lifetime / 2);
}
// minimum one minute
- if (interval < 60) {
- interval = 60;
- }
- if (interval > maxInterval) {
- interval = maxInterval;
- }
- var url = OC.generateUrl('/heartbeat');
- var heartBeatTimeout = null;
- var heartBeat = function() {
- clearInterval(heartBeatTimeout);
- heartBeatTimeout = setInterval(function() {
- $.post(url);
- }, interval * 1000);
- };
- $(document).ajaxComplete(heartBeat);
- heartBeat();
+ interval = Math.max(60, interval);
+ // max interval in seconds set to 24 hours
+ interval = Math.min(24 * 3600, interval);
+
+ var url = OC.generateUrl('/csrftoken');
+ setInterval(function() {
+ $.ajax(url).then(function(resp) {
+ oc_requesttoken = resp.token;
+ OC.requestToken = resp.token;
+ }).fail(function(e) {
+ console.error('session heartbeat failed', e);
+ });
+ }, interval * 1000);
}
// session heartbeat (defaults to enabled)
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index 616e7509f7c..6766fc2789c 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -351,14 +351,14 @@ describe('Core base tests', function() {
beforeEach(function() {
clock = sinon.useFakeTimers();
oldConfig = window.oc_config;
- routeStub = sinon.stub(OC, 'generateUrl').returns('/heartbeat');
+ routeStub = sinon.stub(OC, 'generateUrl').returns('/csrftoken');
counter = 0;
fakeServer.autoRespond = true;
fakeServer.autoRespondAfter = 0;
- fakeServer.respondWith(/\/heartbeat/, function(xhr) {
+ fakeServer.respondWith(/\/csrftoken/, function(xhr) {
counter++;
- xhr.respond(200, {'Content-Type': 'application/json'}, '{}');
+ xhr.respond(200, {'Content-Type': 'application/json'}, '{"token": "pgBEsb3MzTb1ZPd2mfDZbQ6/0j3OrXHMEZrghHcOkg8=:3khw5PSa+wKQVo4f26exFD3nplud9ECjJ8/Y5zk5/k4="}');
});
$(document).off('ajaxComplete'); // ignore previously registered heartbeats
});
@@ -377,7 +377,7 @@ describe('Core base tests', function() {
session_lifetime: 300
};
window.initCore();
- expect(routeStub.calledWith('/heartbeat')).toEqual(true);
+ expect(routeStub.calledWith('/csrftoken')).toEqual(true);
expect(counter).toEqual(0);
@@ -502,8 +502,8 @@ describe('Core base tests', function() {
});
describe('Generate Url', function() {
it('returns absolute urls', function() {
- expect(OC.generateUrl('heartbeat')).toEqual(OC.webroot + '/index.php/heartbeat');
- expect(OC.generateUrl('/heartbeat')).toEqual(OC.webroot + '/index.php/heartbeat');
+ expect(OC.generateUrl('csrftoken')).toEqual(OC.webroot + '/index.php/csrftoken');
+ expect(OC.generateUrl('/csrftoken')).toEqual(OC.webroot + '/index.php/csrftoken');
});
it('substitutes parameters which are escaped by default', function() {
expect(OC.generateUrl('apps/files/download/{file}', {file: '<">ImAnUnescapedString/!'})).toEqual(OC.webroot + '/index.php/apps/files/download/%3C%22%3EImAnUnescapedString%2F!');