summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/framework/session.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/framework/session.js')
-rw-r--r--addons/web/static/src/js/framework/session.js411
1 files changed, 0 insertions, 411 deletions
diff --git a/addons/web/static/src/js/framework/session.js b/addons/web/static/src/js/framework/session.js
deleted file mode 100644
index 516436af93c..00000000000
--- a/addons/web/static/src/js/framework/session.js
+++ /dev/null
@@ -1,411 +0,0 @@
-odoo.define('web.Session', function (require) {
-"use strict";
-
-var ajax = require('web.ajax');
-var core = require('web.core');
-var utils = require('web.utils');
-
-var _t = core._t;
-var qweb = core.qweb;
-var mixins = core.mixins;
-
-// To do: refactor session. Session accomplishes several concerns (rpc,
-// configuration, currencies (wtf?), user permissions...). They should be
-// clarified and separated.
-
-var Session = core.Class.extend(mixins.EventDispatcherMixin, {
- /**
-
- @param parent The parent of the newly created object.
- or `null` if the server to contact is the origin server.
- @param {Dict} options A dictionary that can contain the following options:
-
- * "override_session": Default to false. If true, the current session object will
- not try to re-use a previously created session id stored in a cookie.
- * "session_id": Default to null. If specified, the specified session_id will be used
- by this session object. Specifying this option automatically implies that the option
- "override_session" is set to true.
- */
- init: function(parent, origin, options) {
- mixins.EventDispatcherMixin.init.call(this, parent);
- options = options || {};
- this.module_list = (options.modules && options.modules.slice()) || (window.odoo._modules && window.odoo._modules.slice()) || [];
- this.server = null;
- this.session_id = options.session_id || null;
- this.override_session = options.override_session || !!options.session_id || false;
- this.avoid_recursion = false;
- this.use_cors = options.use_cors || false;
- this.setup(origin);
- var debug_param = $.deparam($.param.querystring()).debug;
- this.debug = (debug_param !== undefined ? debug_param || 1 : false);
-
- // for historic reasons, the session requires a name to properly work
- // (see the methods get_cookie and set_cookie). We should perhaps
- // remove it totally (but need to make sure the cookies are properly set)
- this.name = "instance0";
- // TODO: session store in cookie should be optional
- this.qweb_mutex = new utils.Mutex();
- this.currencies = {};
- this._groups_def = {};
- },
- setup: function(origin, options) {
- // must be able to customize server
- var window_origin = location.protocol + "//" + location.host;
- origin = origin ? origin.replace( /\/+$/, '') : window_origin;
- if (!_.isUndefined(this.origin) && this.origin !== origin)
- throw new Error('Session already bound to ' + this.origin);
- else
- this.origin = origin;
- this.prefix = this.origin;
- this.server = this.origin; // keep chs happy
- this.origin_server = this.origin === window_origin;
- options = options || {};
- if ('use_cors' in options) {
- this.use_cors = options.use_cors;
- }
- },
- /**
- * Setup a session
- */
- session_bind: function(origin) {
- var self = this;
- this.setup(origin);
- qweb.default_dict._s = this.origin;
- this.uid = null;
- this.username = null;
- this.user_context= {};
- this.db = null;
- this.module_loaded = {};
- _(this.module_list).each(function (mod) {
- self.module_loaded[mod] = true;
- });
- this.active_id = null;
- return this.session_init();
- },
- /**
- * Init a session, reloads from cookie, if it exists
- */
- session_init: function () {
- var def = this.session_reload();
- if (this.is_frontend) return def;
-
- var self = this;
- return def.then(function() {
- var modules = self.module_list.join(',');
- var deferred = self.load_qweb(modules);
- if(self.session_is_valid()) {
- return deferred.then(function() { return self.load_modules(); });
- }
- return $.when(
- deferred,
- self.rpc('/web/webclient/bootstrap_translations', {mods: self.module_list}).then(function(trans) {
- _t.database.set_bundle(trans);
- })
- );
- });
- },
- session_is_valid: function() {
- var db = $.deparam.querystring().db;
- if (db && this.db !== db) {
- return false;
- }
- return !!this.uid;
- },
- /**
- * The session is validated by restoration of a previous session
- */
- session_authenticate: function() {
- var self = this;
- return $.when(this._session_authenticate.apply(this, arguments)).then(function() {
- return self.load_modules();
- });
- },
- /**
- * The session is validated either by login or by restoration of a previous session
- */
- _session_authenticate: function(db, login, password) {
- var self = this;
- var params = {db: db, login: login, password: password};
- return this.rpc("/web/session/authenticate", params).then(function(result) {
- if (!result.uid) {
- return $.Deferred().reject();
- }
- delete result.session_id;
- _.extend(self, result);
- });
- },
- session_logout: function() {
- $.bbq.removeState();
- return this.rpc("/web/session/destroy", {});
- },
- user_has_group: function(group) {
- if (!this.uid) {
- return $.when(false);
- }
- var def = this._groups_def[group];
- if (!def) {
- def = this._groups_def[group] = this.rpc('/web/dataset/call_kw/res.users/has_group', {
- "model": "res.users",
- "method": "has_group",
- "args": [group],
- "kwargs": {}
- });
- }
- return def;
- },
- get_cookie: function (name) {
- if (!this.name) { return null; }
- var nameEQ = this.name + '|' + name + '=';
- var cookies = document.cookie.split(';');
- for(var i=0; i<cookies.length; ++i) {
- var cookie = cookies[i].replace(/^\s*/, '');
- if(cookie.indexOf(nameEQ) === 0) {
- try {
- return JSON.parse(decodeURIComponent(cookie.substring(nameEQ.length)));
- } catch(err) {
- // wrong cookie, delete it
- this.set_cookie(name, '', -1);
- }
- }
- }
- return null;
- },
- /**
- * Create a new cookie with the provided name and value
- *
- * @private
- * @param name the cookie's name
- * @param value the cookie's value
- * @param ttl the cookie's time to live, 1 year by default, set to -1 to delete
- */
- set_cookie: function (name, value, ttl) {
- if (!this.name) { return; }
- ttl = ttl || 24*60*60*365;
- utils.set_cookie(this.name + '|' + name, value, ttl);
- },
- /**
- * Load additional web addons of that instance and init them
- *
- */
- load_modules: function() {
- var self = this;
- var modules = odoo._modules;
- var all_modules = _.uniq(self.module_list.concat(modules));
- var to_load = _.difference(modules, self.module_list).join(',');
- this.module_list = all_modules;
-
- var loaded = $.when(self.load_translations());
- var locale = "/web/webclient/locale/" + self.user_context.lang || 'en_US';
- var file_list = [ locale ];
- if(to_load.length) {
- loaded = $.when(
- loaded,
- self.rpc('/web/webclient/csslist', {mods: to_load}).done(self.load_css.bind(self)),
- self.load_qweb(to_load),
- self.rpc('/web/webclient/jslist', {mods: to_load}).done(function(files) {
- file_list = file_list.concat(files);
- })
- );
- }
- return loaded.then(function () {
- return self.load_js(file_list);
- }).done(function() {
- self.on_modules_loaded();
- self.trigger('module_loaded');
- });
- },
- load_translations: function() {
- return _t.database.load_translations(this, this.module_list, this.user_context.lang);
- },
- load_css: function (files) {
- var self = this;
- _.each(files, function (file) {
- ajax.loadCSS(self.url(file, null));
- });
- },
- load_js: function(files) {
- var self = this;
- var d = $.Deferred();
- if (files.length !== 0) {
- var file = files.shift();
- var url = self.url(file, null);
- ajax.loadJS(url).done(d.resolve);
- } else {
- d.resolve();
- }
- return d;
- },
- load_qweb: function(mods) {
- this.qweb_mutex.exec(function () {
- return $.get('/web/webclient/qweb?mods=' + mods).then(function (doc) {
- if (!doc) { return; }
- qweb.add_template(doc);
- });
- });
- return this.qweb_mutex.def;
- },
- on_modules_loaded: function() {
- var openerp = window.openerp;
- for(var j=0; j<this.module_list.length; j++) {
- var mod = this.module_list[j];
- if(this.module_loaded[mod])
- continue;
- openerp[mod] = {};
- // init module mod
- var fct = openerp._openerp[mod];
- if(typeof(fct) === "function") {
- openerp._openerp[mod] = {};
- for (var k in fct) {
- openerp._openerp[mod][k] = fct[k];
- }
- fct(openerp, openerp._openerp[mod]);
- }
- this.module_loaded[mod] = true;
- }
- },
- get_currency: function(currency_id) {
- return this.currencies[currency_id];
- },
- get_file: function (options) {
- if (this.override_session){
- options.data.session_id = this.session_id;
- }
- options.session = this;
- ajax.get_file(options);
- },
- /**
- * (re)loads the content of a session: db name, username, user id, session
- * context and status of the support contract
- *
- * @returns {$.Deferred} deferred indicating the session is done reloading
- */
- session_reload: function () {
- var result = _.extend({}, window.odoo.session_info);
- delete result.session_id;
- _.extend(this, result);
- return $.when();
- },
- check_session_id: function() {
- var self = this;
- if (this.avoid_recursion)
- return $.when();
- if (this.session_id)
- return $.when(); // we already have the session id
- if (!this.use_cors && (this.override_session || ! this.origin_server)) {
- // If we don't use the origin server we consider we should always create a new session.
- // Even if some browsers could support cookies when using jsonp that behavior is
- // not consistent and the browser creators are tending to removing that feature.
- this.avoid_recursion = true;
- return this.rpc("/gen_session_id", {}).then(function(result) {
- self.session_id = result;
- }).always(function() {
- self.avoid_recursion = false;
- });
- } else {
- // normal use case, just use the cookie
- self.session_id = utils.get_cookie("session_id");
- return $.when();
- }
- },
- /**
- * Executes an RPC call, registering the provided callbacks.
- *
- * Registers a default error callback if none is provided, and handles
- * setting the correct session id and session context in the parameter
- * objects
- *
- * @param {String} url RPC endpoint
- * @param {Object} params call parameters
- * @param {Object} options additional options for rpc call
- * @param {Function} success_callback function to execute on RPC call success
- * @param {Function} error_callback function to execute on RPC call failure
- * @returns {jQuery.Deferred} jquery-provided ajax deferred
- */
- rpc: function(url, params, options) {
- var self = this;
- options = _.clone(options || {});
- var shadow = options.shadow || false;
- options.headers = _.extend({}, options.headers)
- if (odoo.debug) {
- options.headers["X-Debug-Mode"] = $.deparam($.param.querystring()).debug;
- }
-
- delete options.shadow;
-
- return self.check_session_id().then(function() {
- // TODO: remove
- if (! _.isString(url)) {
- _.extend(options, url);
- url = url.url;
- }
- // TODO correct handling of timeouts
- if (! shadow)
- self.trigger('request');
- var fct;
- if (self.origin_server) {
- fct = ajax.jsonRpc;
- if (self.override_session) {
- options.headers["X-Openerp-Session-Id"] = self.session_id || '';
- }
- } else if (self.use_cors) {
- fct = ajax.jsonRpc;
- url = self.url(url, null);
- options.session_id = self.session_id || '';
- if (self.override_session) {
- options.headers["X-Openerp-Session-Id"] = self.session_id || '';
- }
- } else {
- fct = ajax.jsonpRpc;
- url = self.url(url, null);
- options.session_id = self.session_id || '';
- }
- var p = fct(url, "call", params, options);
- p = p.then(function (result) {
- if (! shadow)
- self.trigger('response');
- return result;
- }, function(type, error, textStatus, errorThrown) {
- if (type === "server") {
- if (! shadow)
- self.trigger('response');
- if (error.code === 100) {
- self.uid = false;
- }
- return $.Deferred().reject(error, $.Event());
- } else {
- if (! shadow)
- self.trigger('response_failed');
- var nerror = {
- code: -32098,
- message: "XmlHttpRequestError " + errorThrown,
- data: {type: "xhr"+textStatus, debug: error.responseText, objects: [error, errorThrown] }
- };
- return $.Deferred().reject(nerror, $.Event());
- }
- });
- return p.fail(function() { // Allow deferred user to disable rpc_error call in fail
- p.fail(function(error, event) {
- if (!event.isDefaultPrevented()) {
- self.trigger('error', error, event);
- }
- });
- });
- });
- },
- url: function(path, params) {
- params = _.extend(params || {});
- if (this.override_session || (! this.origin_server))
- params.session_id = this.session_id;
- var qs = $.param(params);
- if (qs.length > 0)
- qs = "?" + qs;
- var prefix = _.any(['http://', 'https://', '//'], function(el) {
- return path.length >= el.length && path.slice(0, el.length) === el;
- }) ? '' : this.prefix;
- return prefix + path + qs;
- },
-});
-
-return Session;
-
-});