diff options
Diffstat (limited to 'js/lib/security.js')
| -rw-r--r-- | js/lib/security.js | 63 |
1 files changed, 47 insertions, 16 deletions
diff --git a/js/lib/security.js b/js/lib/security.js index def775c05..9c12f8586 100644 --- a/js/lib/security.js +++ b/js/lib/security.js @@ -5,7 +5,17 @@ elgg.provide('elgg.security'); elgg.security.token = {}; -elgg.security.setToken = function(json) { +elgg.security.tokenRefreshFailed = false; + +elgg.security.tokenRefreshTimer = null; + +/** + * Sets the currently active security token and updates all forms and links on the current page. + * + * @param {Object} json The json representation of a token containing __elgg_ts and __elgg_token + * @return {Void} + */ +elgg.security.setToken = function(json) { //update the convenience object elgg.security.token = json; @@ -13,8 +23,8 @@ elgg.security.setToken = function(json) { $('[name=__elgg_ts]').val(json.__elgg_ts); $('[name=__elgg_token]').val(json.__elgg_token); - //also update all links - $('[href]').each(function() { + // also update all links that contain tokens and time stamps + $('[href*="__elgg_ts"][href*="__elgg_token"]').each(function() { this.href = this.href .replace(/__elgg_ts=\d*/, '__elgg_ts=' + json.__elgg_ts) .replace(/__elgg_token=[0-9a-f]*/, '__elgg_token=' + json.__elgg_token); @@ -22,19 +32,23 @@ elgg.security.setToken = function(json) { }; /** - * Security tokens time out, so lets refresh those every so often + * Security tokens time out so we refresh those every so often. * - * @todo handle error and bad return data + * @private */ elgg.security.refreshToken = function() { elgg.action('security/refreshtoken', function(data) { - elgg.security.setToken(data.output); + if (data && data.output.__elgg_ts && data.output.__elgg_token) { + elgg.security.setToken(data.output); + } else { + clearInterval(elgg.security.tokenRefreshTimer); + } }); }; /** - * Add elgg action tokens to an object or string (assumed to be url data) + * Add elgg action tokens to an object, URL, or query string (with a ?). * * @param {Object|string} data * @return {Object} The new data object including action tokens @@ -44,14 +58,31 @@ elgg.security.addToken = function(data) { // 'http://example.com?data=sofar' if (elgg.isString(data)) { - var args = []; - if (data) { - args.push(data); + // is this a full URL, relative URL, or just the query string? + var parts = elgg.parse_url(data), + args = {}, + base = ''; + + if (parts['host'] == undefined) { + if (data.indexOf('?') === 0) { + // query string + base = '?'; + args = elgg.parse_str(parts['query']); + } + } else { + // full or relative URL + + if (parts['query'] != undefined) { + // with query string + args = elgg.parse_str(parts['query']); + } + var split = data.split('?'); + base = split[0] + '?'; } - args.push("__elgg_ts=" + elgg.security.token.__elgg_ts); - args.push("__elgg_token=" + elgg.security.token.__elgg_token); + args["__elgg_ts"] = elgg.security.token.__elgg_ts; + args["__elgg_token"] = elgg.security.token.__elgg_token; - return args.join('&'); + return base + jQuery.param(args); } // no input! acts like a getter @@ -69,8 +100,8 @@ elgg.security.addToken = function(data) { }; elgg.security.init = function() { - //refresh security token every 5 minutes - setInterval(elgg.security.refreshToken, elgg.security.interval); + // elgg.security.interval is set in the js/elgg PHP view. + elgg.security.tokenRefreshTimer = setInterval(elgg.security.refreshToken, elgg.security.interval); }; -elgg.register_event_handler('boot', 'system', elgg.security.init);
\ No newline at end of file +elgg.register_hook_handler('boot', 'system', elgg.security.init);
\ No newline at end of file |
