From 7215013b5309698e938e5667917559ca158246ff Mon Sep 17 00:00:00 2001 From: Martin Fischer Date: Thu, 10 Nov 2016 12:05:04 +0100 Subject: [PATCH] implemented raw editor for sieve filter sets (#5473) * implemented raw editor for sieve filter sets Signed-off-by: Martin Fischer * updated according to comments --- .../lib/Roundcube/rcube_sieve_engine.php | 68 +++++++++++++++++-- plugins/managesieve/localization/de_CH.inc | 2 + plugins/managesieve/localization/de_DE.inc | 2 + plugins/managesieve/localization/en_CA.inc | 2 + plugins/managesieve/localization/en_GB.inc | 2 + plugins/managesieve/localization/en_US.inc | 2 + plugins/managesieve/managesieve.js | 34 ++++++++-- plugins/managesieve/managesieve.php | 16 +++++ .../managesieve/skins/classic/managesieve.css | 8 +++ .../skins/classic/templates/managesieve.html | 1 + .../skins/classic/templates/seteditraw.html | 23 +++++++ .../managesieve/skins/larry/managesieve.css | 7 ++ .../skins/larry/templates/managesieve.html | 1 + .../skins/larry/templates/seteditraw.html | 23 +++++++ 14 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 plugins/managesieve/skins/classic/templates/seteditraw.html create mode 100644 plugins/managesieve/skins/larry/templates/seteditraw.html diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php index 7e3b0c7fa..452f9a24d 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php @@ -84,11 +84,12 @@ class rcube_sieve_engine { // register UI objects $this->rc->output->add_handlers(array( - 'filterslist' => array($this, 'filters_list'), - 'filtersetslist' => array($this, 'filtersets_list'), - 'filterframe' => array($this, 'filter_frame'), - 'filterform' => array($this, 'filter_form'), - 'filtersetform' => array($this, 'filterset_form'), + 'filterslist' => array($this, 'filters_list'), + 'filtersetslist' => array($this, 'filtersets_list'), + 'filterframe' => array($this, 'filter_frame'), + 'filterform' => array($this, 'filter_form'), + 'filtersetform' => array($this, 'filterset_form'), + 'filterseteditraw' => array($this, 'filterset_editraw'), )); // connect to managesieve server @@ -487,10 +488,30 @@ class rcube_sieve_engine ); } } - + $this->send(); } + function saveraw() + { + // Init plugin and handle managesieve connection + $error = $this->start(); + + $this->rc->request_security_check(rcube_utils::INPUT_POST); + + $script_name = rcube_utils::get_input_value('_set', rcube_utils::INPUT_POST); + + $result = $this->sieve->save_script($script_name, $_POST['rawsetcontent']); + + if ($result == true) { + $this->rc->output->show_message('managesieve.setupdated', 'confirmation'); + $this->send(); + } else { + $this->rc->output->show_message('managesieve.filtersaveerror', 'error'); + $this->send(); + } + } + function save() { // Init plugin and handle managesieve connection @@ -1160,6 +1181,9 @@ class rcube_sieve_engine if (isset($_GET['_newset']) || isset($_POST['_newset'])) { $this->rc->output->send('managesieve.setedit'); } + else if (isset($_GET['_seteditraw']) || isset($_POST['_seteditraw'])) { + $this->rc->output->send('managesieve.seteditraw'); + } else { $this->rc->output->send('managesieve.filteredit'); } @@ -1254,6 +1278,38 @@ class rcube_sieve_engine { return $this->rc->output->frame($attrib, true); } + + function filterset_editraw($attrib) + { + $scriptName = isset($_GET['_set']) ? $_GET['_set'] : $_POST['_set']; + $script = $this->sieve->get_script($scriptName); + + if ($script != false) { + $out = '
'."\n"; + + $hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task)); + $hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-saveraw')); + $hiddenfields->add(array('name' => '_set', 'value' => $scriptName)); + $hiddenfields->add(array('name' => '_seteditraw', 'value' => 1)); + $hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0))); + + $out .= $hiddenfields->show(); + + $txtarea = new html_textarea(array( + 'id' => 'rawfiltersettxt', + 'name' => 'rawsetcontent', + 'rows' => '15' + )); + $out .= $txtarea->show($script); + //$out .= ''; + + $this->rc->output->add_gui_object('sievesetrawform', 'filtersetrawform'); + return $out; + } else { + $this->rc->output->show_message('managesieve.filterunknownerror', 'error'); + return ''; + } + } function filterset_form($attrib) { diff --git a/plugins/managesieve/localization/de_CH.inc b/plugins/managesieve/localization/de_CH.inc index 196755480..1c5650db6 100644 --- a/plugins/managesieve/localization/de_CH.inc +++ b/plugins/managesieve/localization/de_CH.inc @@ -70,6 +70,7 @@ $labels['filtersetadd'] = 'Filtersatz anlegen'; $labels['filtersetdel'] = 'Aktuellen Filtersatz löschen'; $labels['filtersetact'] = 'Aktuellen Filtersatz aktivieren'; $labels['filtersetdeact'] = 'Aktuellen Filtersatz deaktivieren'; +$labels['filterseteditraw'] = 'Filtersatz bearbeiten'; $labels['filterdef'] = 'Filterdefinition'; $labels['filtersetname'] = 'Filtersatzname'; $labels['newfilterset'] = 'Neuer Filtersatz'; @@ -216,6 +217,7 @@ $messages['setdeleteerror'] = 'Serverfehler beim Löschen des gewählten Filters $messages['setactivated'] = 'Filtersatz erfolgreich aktiviert.'; $messages['setdeactivated'] = 'Filtersatz erfolgreich deaktiviert.'; $messages['setdeleted'] = 'Filtersatz erfolgreich gelöscht.'; +$messages['setupdated'] = 'Filtersatz wurde erfolgreich aktualisiert'; $messages['setdeleteconfirm'] = 'Sind Sie sicher, dass Sie den ausgewählten Filtersatz löschen möchten?'; $messages['setcreateerror'] = 'Serverfehler beim Erstellen des Filtersatzes.'; $messages['setcreated'] = 'Filter erfolgreich erstellt.'; diff --git a/plugins/managesieve/localization/de_DE.inc b/plugins/managesieve/localization/de_DE.inc index 6e31beeba..0fcdf81e5 100644 --- a/plugins/managesieve/localization/de_DE.inc +++ b/plugins/managesieve/localization/de_DE.inc @@ -70,6 +70,7 @@ $labels['filtersetadd'] = 'Filtersatz anlegen'; $labels['filtersetdel'] = 'Aktuellen Filtersatz löschen'; $labels['filtersetact'] = 'Aktuellen Filtersatz aktivieren'; $labels['filtersetdeact'] = 'Aktuellen Filtersatz deaktivieren'; +$labels['filterseteditraw'] = 'Filtersatz bearbeiten'; $labels['filterdef'] = 'Filterdefinition'; $labels['filtersetname'] = 'Filtersatzname'; $labels['newfilterset'] = 'Neuer Filtersatz'; @@ -217,6 +218,7 @@ $messages['setdeleteerror'] = 'Kann ausgewählten Filtersatz nicht löschen. Ser $messages['setactivated'] = 'Filtersatz wurde erfolgreich aktiviert'; $messages['setdeactivated'] = 'Filtersatz wurde erfolgreich deaktiviert'; $messages['setdeleted'] = 'Filtersatz wurde erfolgreich gelöscht'; +$messages['setupdated'] = 'Filtersatz wurde erfolgreich aktualisiert'; $messages['setdeleteconfirm'] = 'Sind Sie sicher, dass Sie den ausgewählten Filtersatz löschen möchten?'; $messages['setcreateerror'] = 'Erstellen von Filter Sätzen nicht möglich. Es ist ein Serverfehler aufgetreten.'; $messages['setcreated'] = 'Filtersatz wurde erfolgreich erstellt'; diff --git a/plugins/managesieve/localization/en_CA.inc b/plugins/managesieve/localization/en_CA.inc index 1850bbb01..e4291623b 100644 --- a/plugins/managesieve/localization/en_CA.inc +++ b/plugins/managesieve/localization/en_CA.inc @@ -68,6 +68,7 @@ $labels['filtersetadd'] = 'Add filters set'; $labels['filtersetdel'] = 'Delete current filters set'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Deactivate current filters set'; +$labels['filterseteditraw'] = 'Edit filter set'; $labels['filterdef'] = 'Filter definition'; $labels['filtersetname'] = 'Filters set name'; $labels['newfilterset'] = 'New filters set'; @@ -188,6 +189,7 @@ $messages['setdeleteerror'] = 'Unable to delete selected filters set. Server err $messages['setactivated'] = 'Filters set activated successfully.'; $messages['setdeactivated'] = 'Filters set deactivated successfully.'; $messages['setdeleted'] = 'Filters set deleted successfully.'; +$messages['setupdated'] = 'Filters set updated successfully.'; $messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filters set?'; $messages['setcreateerror'] = 'Unable to create filters set. Server error occurred.'; $messages['setcreated'] = 'Filters set created successfully.'; diff --git a/plugins/managesieve/localization/en_GB.inc b/plugins/managesieve/localization/en_GB.inc index 0a0fbba57..472ba974c 100644 --- a/plugins/managesieve/localization/en_GB.inc +++ b/plugins/managesieve/localization/en_GB.inc @@ -70,6 +70,7 @@ $labels['filtersetadd'] = 'Add filters set'; $labels['filtersetdel'] = 'Delete current filters set'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Deactivate current filters set'; +$labels['filterseteditraw'] = 'Edit filter set'; $labels['filterdef'] = 'Filter definition'; $labels['filtersetname'] = 'Filters set name'; $labels['newfilterset'] = 'New filters set'; @@ -216,6 +217,7 @@ $messages['setdeleteerror'] = 'Unable to delete selected filters set. Server err $messages['setactivated'] = 'Filters set activated successfully.'; $messages['setdeactivated'] = 'Filters set deactivated successfully.'; $messages['setdeleted'] = 'Filters set deleted successfully.'; +$messages['setupdated'] = 'Filters set updated successfully.'; $messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filters set?'; $messages['setcreateerror'] = 'Unable to create filters set. Server error occurred.'; $messages['setcreated'] = 'Filters set created successfully.'; diff --git a/plugins/managesieve/localization/en_US.inc b/plugins/managesieve/localization/en_US.inc index a1d36698b..0b7cd74f1 100644 --- a/plugins/managesieve/localization/en_US.inc +++ b/plugins/managesieve/localization/en_US.inc @@ -72,6 +72,7 @@ $labels['filtersetadd'] = 'Add filters set'; $labels['filtersetdel'] = 'Delete current filters set'; $labels['filtersetact'] = 'Activate current filters set'; $labels['filtersetdeact'] = 'Deactivate current filters set'; +$labels['filterseteditraw'] = 'Edit filter set'; $labels['filterdef'] = 'Filter definition'; $labels['filtersetname'] = 'Filters set name'; $labels['newfilterset'] = 'New filters set'; @@ -221,6 +222,7 @@ $messages['setdeleteerror'] = 'Unable to delete selected filters set. Server err $messages['setactivated'] = 'Filters set activated successfully.'; $messages['setdeactivated'] = 'Filters set deactivated successfully.'; $messages['setdeleted'] = 'Filters set deleted successfully.'; +$messages['setupdated'] = 'Filters set updated successfully.'; $messages['setdeleteconfirm'] = 'Are you sure, you want to delete selected filters set?'; $messages['setcreateerror'] = 'Unable to create filters set. Server error occurred.'; $messages['setcreated'] = 'Filters set created successfully.'; diff --git a/plugins/managesieve/managesieve.js b/plugins/managesieve/managesieve.js index 17cfa158c..33c4d320e 100644 --- a/plugins/managesieve/managesieve.js +++ b/plugins/managesieve/managesieve.js @@ -44,12 +44,16 @@ if (window.rcmail) { rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }); rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }); rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }); + rcmail.register_command('plugin.managesieve-seteditraw', function() { rcmail.managesieve_seteditraw() }); if (rcmail.env.action.startsWith('plugin.managesieve')) { if (rcmail.gui_objects.sieveform) { rcmail.enable_command('plugin.managesieve-save', true); sieve_form_init(); } + else if (rcmail.gui_objects.sievesetrawform) { + rcmail.enable_command('plugin.managesieve-save', true); + } else { rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror); } @@ -89,6 +93,7 @@ if (window.rcmail) { rcmail.enable_command('plugin.managesieve-set', true); rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', setcnt); rcmail.enable_command('plugin.managesieve-setdel', setcnt > 1); + rcmail.enable_command('plugin.managesieve-seteditraw', true); // Fix dragging filters over sets list $('tr', rcmail.gui_objects.filtersetslist).each(function (i, e) { rcmail.managesieve_fixdragend(e); }); @@ -208,6 +213,19 @@ rcube_webmail.prototype.managesieve_setdel = function() this.http_post('plugin.managesieve-action', '_act=setdel&_set='+urlencode(script), lock); }; +// Set edit raw request +rcube_webmail.prototype.managesieve_seteditraw = function() +{ + var id = this.filtersets_list.get_single_selection(), + script = this.env.filtersets[id]; + + if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { + var lock = this.set_busy(true, 'loading'); + target = window.frames[this.env.contentframe]; + target.location.href = this.env.comm_path+'&_action=plugin.managesieve-action&_framed=1&_seteditraw=1&_unlock='+lock+'&_set='+urlencode(script); + } +} + // Set add request rcube_webmail.prototype.managesieve_setadd = function() { @@ -453,12 +471,18 @@ rcube_webmail.prototype.managesieve_save = function() return; } - if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') { - var id = parent.rcmail.filters_list.get_single_selection(); - if (id != null) - this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid; + if (this.gui_objects.sieveform) { + if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') { + var id = parent.rcmail.filters_list.get_single_selection(); + if (id != null) + this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid; + } + this.gui_objects.sieveform.submit(); + } + + if (this.gui_objects.sievesetrawform) { + this.gui_objects.sievesetrawform.submit(); } - this.gui_objects.sieveform.submit(); }; // Operations on filters form diff --git a/plugins/managesieve/managesieve.php b/plugins/managesieve/managesieve.php index 336479a97..43615afa3 100644 --- a/plugins/managesieve/managesieve.php +++ b/plugins/managesieve/managesieve.php @@ -43,6 +43,7 @@ class managesieve extends rcube_plugin $this->register_action('plugin.managesieve-action', array($this, 'managesieve_actions')); $this->register_action('plugin.managesieve-vacation', array($this, 'managesieve_actions')); $this->register_action('plugin.managesieve-save', array($this, 'managesieve_save')); + $this->register_action('plugin.managesieve-saveraw', array($this, 'managesieve_saveraw')); if ($this->rc->task == 'settings') { $this->add_hook('settings_actions', array($this, 'settings_actions')); @@ -224,6 +225,21 @@ class managesieve extends rcube_plugin $engine = $this->get_engine(); $engine->save(); } + + /** + * Raw form save action handler + */ + function managesieve_saveraw() + { + // load localization + $this->add_texts('localization/', array('filters','managefilters')); + + // include main js script + $this->include_script('managesieve.js'); + + $engine = $this->get_engine(); + $engine->saveraw(); + } /** * Initializes engine object diff --git a/plugins/managesieve/skins/classic/managesieve.css b/plugins/managesieve/skins/classic/managesieve.css index 81654e3ca..c74bd596e 100644 --- a/plugins/managesieve/skins/classic/managesieve.css +++ b/plugins/managesieve/skins/classic/managesieve.css @@ -332,6 +332,14 @@ a.button.disabled vertical-align: middle; } +#filter-form #rawfiltersettxt { + width: 98%; + min-height: 400px; + max-width: none; + font-family: monospace; +} + + /* smart multi-row input field */ .listarea { diff --git a/plugins/managesieve/skins/classic/templates/managesieve.html b/plugins/managesieve/skins/classic/templates/managesieve.html index 6489d23b4..2f76cfdb7 100644 --- a/plugins/managesieve/skins/classic/templates/managesieve.html +++ b/plugins/managesieve/skins/classic/templates/managesieve.html @@ -64,6 +64,7 @@
  • +
diff --git a/plugins/managesieve/skins/classic/templates/seteditraw.html b/plugins/managesieve/skins/classic/templates/seteditraw.html new file mode 100644 index 000000000..7e6fa47ac --- /dev/null +++ b/plugins/managesieve/skins/classic/templates/seteditraw.html @@ -0,0 +1,23 @@ + + + +<roundcube:object name="pagetitle" /> + + + + +
+ +
+ + +

+ +

+ + +
+ + + + diff --git a/plugins/managesieve/skins/larry/managesieve.css b/plugins/managesieve/skins/larry/managesieve.css index 2545ca406..f5f80c52c 100644 --- a/plugins/managesieve/skins/larry/managesieve.css +++ b/plugins/managesieve/skins/larry/managesieve.css @@ -318,6 +318,13 @@ a.button.disabled max-width: 280px; } +#filter-form #rawfiltersettxt { + width: 98%; + min-height: 400px; + max-width: none; + font-family: monospace; +} + /* revert larry style button */ #filter-form input.button { diff --git a/plugins/managesieve/skins/larry/templates/managesieve.html b/plugins/managesieve/skins/larry/templates/managesieve.html index 494af6ae2..b3e1f0f4e 100644 --- a/plugins/managesieve/skins/larry/templates/managesieve.html +++ b/plugins/managesieve/skins/larry/templates/managesieve.html @@ -52,6 +52,7 @@ diff --git a/plugins/managesieve/skins/larry/templates/seteditraw.html b/plugins/managesieve/skins/larry/templates/seteditraw.html new file mode 100644 index 000000000..7e6fa47ac --- /dev/null +++ b/plugins/managesieve/skins/larry/templates/seteditraw.html @@ -0,0 +1,23 @@ + + + +<roundcube:object name="pagetitle" /> + + + + +
+ +
+ + +

+ +

+ + +
+ + + +