[FIX] website_mail: fixed is_follower controller, that could leak data about records.
authorThibault Delavallée <tde@openerp.com>
Wed, 28 May 2014 07:59:31 +0000 (09:59 +0200)
committerThibault Delavallée <tde@openerp.com>
Wed, 28 May 2014 07:59:31 +0000 (09:59 +0200)
Added instead a controller to get alias data. This controller is called by the
discussion group snippet to have the info about the alias.

addons/website_mail/controllers/main.py
addons/website_mail/static/src/js/website_mail.js

index 49caf20..8cdb730 100644 (file)
@@ -83,6 +83,7 @@ class WebsiteMail(http.Controller):
             'is_user': uid != public_id,
             'email': email,
             'is_follower': False,
+            'alias_name': False,
         }
 
         if not obj:
@@ -97,8 +98,22 @@ class WebsiteMail(http.Controller):
                             ('res_id', '=', obj_ids[0]),
                             ('partner_id', '=', partner_id.id)
                         ], context=context)) == 1
-            if post.get('fields'):
-                record = obj.read(cr, SUPERUSER_ID, obj_ids[0], fields=post.get('fields'), context=context)
-                values.update(record)
+
+        return values
+
+    @http.route(['/website_mail/get_alias_info'], type='json', auth='public', website=True)
+    def get_alias_info(self, model, id, **post):
+        id = int(id)
+        cr, uid, context = request.cr, request.uid, request.context
+        obj = request.registry.get(model)
+
+        values = {'alias_name': False}
+
+        if not obj:
+            return values
+        obj_ids = obj.exists(cr, SUPERUSER_ID, [id], context=context)
+        if obj_ids and 'alias_id' in obj._all_columns:
+            alias_id = obj.browse(cr, SUPERUSER_ID, obj_ids[0], context=context).alias_id
+            values['alias_name'] = alias_id and alias_id.alias_domain and '%s@%s' % (alias_id.alias_name, alias_id.alias_domain) or False
 
         return values
index d069f88..2a79bcc 100644 (file)
             openerp.jsonRpc('/website_mail/is_follower', 'call', {
                 model: this.$target.data('object'),
                 id: this.$target.data('id'),
-                fields: ['name', 'alias_id'],
+                get_alias_info: true,
             }).always(function (data) {
                 self.is_user = data.is_user;
-                self.$target.find('.js_mg_email').attr('href', 'mailto:' + data.alias_id[1]);
-                self.$target.find('.js_mg_link').attr('href', '/groups/' + data.id);
-                self.toggle_subscription(data.is_follower);
-                self.$target.find('input.js_follow_email')
-                    .val(data.email ? data.email : "")
-                    .attr("disabled", data.is_follower || (data.email.length && self.is_user) ? "disabled" : false);
+                self.email = data.email;
+                self.$target.find('.js_mg_link').attr('href', '/groups/' + self.$target.data('id'));
+                self.toggle_subscription(data.is_follower, data.email);
                 self.$target.removeClass("hidden");
             });
 
                 'message_is_follower': this.$target.attr("data-follow") || "off",
                 'email': $email.length ? $email.val() : false,
             }).then(function (follow) {
-                self.toggle_subscription(follow);
+                self.toggle_subscription(follow, self.email);
             });
         },
-        toggle_subscription: function(follow) {
+        toggle_subscription: function(follow, email) {
+            var alias_done = this.get_alias_info();
             if (follow) {
                 this.$target.find(".js_mg_follow_form").addClass("hidden");
                 this.$target.find(".js_mg_details").removeClass("hidden");
                 this.$target.find(".js_mg_follow_form").removeClass("hidden");
                 this.$target.find(".js_mg_details").addClass("hidden");
             }
-            this.$target.find('input.js_follow_email').attr("disabled", follow || this.is_user ? "disabled" : false);
+            this.$target.find('input.js_follow_email')
+                .val(email ? email : "")
+                .attr("disabled", follow || (email.length && this.is_user) ? "disabled" : false);
             this.$target.attr("data-follow", follow ? 'on' : 'off');
+            return $.when(alias_done);
         },
+        get_alias_info: function() {
+            var self = this;
+            return openerp.jsonRpc('/website_mail/get_alias_info', 'call', {
+                model: this.$target.data('object'),
+                id: this.$target.data('id'),
+            }).then(function (data) {
+                self.$target.find('.js_mg_email').attr('href', 'mailto:' + data.alias_name);
+            });
+        }
     });
 
     $(document).ready(function () {