From cea29e0c0176657f094ab80b460be503affe8a1b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 23 Sep 2015 15:55:24 +0200 Subject: [PATCH] [ADD] client-side CSRF support * add CSRF token as core.csrf_token * add CSRF tokens to client-generated and/or JS-submitted forms * remove broken "compatibility" mode of web.ajax.post /cc @dmo-odoo I've no idea how that was supposed to work, from looking things up all modern browsers seem to support FormData, and old IEs which don't don't support fallbacks either and would require submitting an actual form as fallback so... --- addons/base_import/static/src/xml/import.xml | 1 + addons/web/static/src/js/framework/ajax.js | 17 ++++++++++------- addons/web/static/src/xml/base.xml | 3 ++- addons/web/views/webclient_templates.xml | 7 +++++++ addons/web_editor/static/src/xml/editor.xml | 3 +-- addons/website/static/src/js/website.js | 17 ++++++++++++----- addons/website/views/website_templates.xml | 7 +++++++ 7 files changed, 40 insertions(+), 15 deletions(-) diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index ae5c78c497d..7723f7b5266 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -2,6 +2,7 @@
+ diff --git a/addons/web/static/src/js/framework/ajax.js b/addons/web/static/src/js/framework/ajax.js index f8392287b26..d6619449a0f 100644 --- a/addons/web/static/src/js/framework/ajax.js +++ b/addons/web/static/src/js/framework/ajax.js @@ -1,6 +1,7 @@ odoo.define('web.ajax', function (require) { "use strict"; +var core = require('web.core'); var time = require('web.time'); var utils = require('web.utils'); @@ -238,6 +239,11 @@ function get_file(options) { method: 'POST' }).appendTo(document.body); } + if (core.csrf_token) { + $('') + .val(core.csrf_token) + .appendTo($form_data); + } var hparams = _.extend({}, options.data || {}, {token: token}); _.each(hparams, function (value, key) { @@ -292,19 +298,16 @@ function post (controller_url, data) { }; var Def = $.Deferred(); - var compatibility = !(typeof(FormData)); - var postData = compatibility ? new FormDataCompatibility() : new FormData(); + var postData = new FormData(); $.each(data, function(i,val) { postData.append(i, val); }); - - var xhr = new XMLHttpRequest(); - if(compatibility) { - postData.setContentTypeHeader(xhr); - postData = postData.buildBody(); + if (core.csrf_token) { + postData.append('csrf_token', core.csrf_token); } + var xhr = new XMLHttpRequest(); if(xhr.upload) xhr.upload.addEventListener('progress', progressHandler(Def), false); var ajaxDef = $.ajax(controller_url, { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index cae5392cf3b..0ce2ab0f08f 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -988,7 +988,8 @@
+ method="post" enctype="multipart/form-data" t-att-action="fileupload_action || '/web/binary/upload'"> + diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index 6147e3d3a04..03723cf9a24 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -301,6 +301,13 @@ + <!--[if lte IE 9]> <![endif]-->