From 037af6890fe6fdb84a08d3c86083e847c90ec0ad Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Tue, 22 Oct 2013 08:17:26 -0400
Subject: [PATCH] Fix vulnerability in handling _session argument of utils/save-prefs (#1489382)

---
 plugins/managesieve/managesieve.js |   33 ++++++++++++++++++++-------------
 1 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js
index 6bf99ac..da8da67 100644
--- a/plugins/managesieve/managesieve.js
+++ b/plugins/managesieve/managesieve.js
@@ -231,27 +231,34 @@
 
     // Delete filter row
     case 'del':
-      var i, list = this.filters_list, rows = list.rows;
+      var i = 0, list = this.filters_list;
 
       list.remove_row(this.managesieve_rowid(o.id));
       list.clear_selection();
       this.show_contentframe(false);
       this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', false);
 
-      // re-numbering filters
-      for (i=0; i<rows.length; i++) {
-        if (rows[i] != null && rows[i].uid > o.id)
-          rows[i].uid = rows[i].uid-1;
-      }
+      // filter identifiers changed, fix the list
+      $('tr', this.filters_list.list).each(function() {
+        // remove hidden (deleted) rows
+        if (this.style.display == 'none') {
+          $(this).detach();
+          return;
+        }
+
+        // modify ID and remove all attached events
+        $(this).attr('id', 'rcmrow'+(i++)).unbind();
+      });
+      list.init();
 
       break;
 
     // Update filter row
     case 'update':
-      var i, row = $('#rcmrow'+o.id);
+      var i, row = $('#rcmrow'+this.managesieve_rowid(o.id));
 
       if (o.name)
-        $('td', row).html(o.name);
+        $('td', row).text(o.name);
       if (o.disabled)
         row.addClass('disabled');
       else
@@ -266,7 +273,7 @@
       var list = this.filters_list,
         row = $('<tr><td class="name"></td></tr>');
 
-      $('td', row).html(o.name);
+      $('td', row).text(o.name);
       row.attr('id', 'rcmrow'+o.id);
       if (o.disabled)
         row.addClass('disabled');
@@ -290,7 +297,7 @@
         tr = document.createElement('TR');
         td = document.createElement('TD');
 
-        td.innerHTML = el.name;
+        $(td).text(el.name);
         td.className = 'name';
         tr.id = 'rcmrow' + el.id;
         if (el['class'])
@@ -339,7 +346,7 @@
         list = this.filtersets_list,
         row = $('<tr class="disabled"><td class="name"></td></tr>');
 
-      $('td', row).html(o.name);
+      $('td', row).text(o.name);
       row.attr('id', 'rcmrow'+id);
 
       this.env.filtersets[id] = o.name;
@@ -635,7 +642,7 @@
     enabled = {},
     elems = {
       mailbox: document.getElementById('action_mailbox' + id),
-      target: document.getElementById('action_target' + id),
+      target: document.getElementById('redirect_target' + id),
       target_area: document.getElementById('action_target_area' + id),
       flags: document.getElementById('action_flags' + id),
       vacation: document.getElementById('action_vacation' + id),
@@ -747,7 +754,7 @@
 
     // load form in the iframe
     var frame = $('<iframe>').attr({src: url, frameborder: 0})
-    dialog.empty().append(frame).dialog('dialog').resize();
+    dialog.empty().append(frame).dialog('widget').resize();
 
     // Change [Next Step] button with [Save] button
     buttons = {};

--
Gitblit v1.9.1