aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-02-01 12:44:51 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-02-01 12:45:08 +0000
commitf0615c9cb4b72c25d32e818e86bc030810fa00e7 (patch)
tree97a59bccdb3e17265cb03df3ce88e275e101d236
parentc154108c89c345cb3ef6702200487cc9a81ae27c (diff)
downloadrspamd-f0615c9cb4b72c25d32e818e86bc030810fa00e7.tar.gz
rspamd-f0615c9cb4b72c25d32e818e86bc030810fa00e7.zip
[WebUI] Finish interface rework
-rw-r--r--interface/js/app/rspamd.js189
-rw-r--r--interface/js/app/upload.js214
2 files changed, 217 insertions, 186 deletions
diff --git a/interface/js/app/rspamd.js b/interface/js/app/rspamd.js
index b12f1d864..748c63d35 100644
--- a/interface/js/app/rspamd.js
+++ b/interface/js/app/rspamd.js
@@ -23,9 +23,9 @@
THE SOFTWARE.
*/
define(['jquery', 'd3pie', 'visibility', 'app/stats', 'app/graph', 'app/config',
- 'app/symbols', 'app/history'],
+ 'app/symbols', 'app/history', 'app/upload'],
function ($, d3pie, visibility, tab_stat, tab_graph, tab_config,
- tab_symbols, tab_history) {
+ tab_symbols, tab_history, tab_upload) {
// begin
var graphs = {};
var tables = {};
@@ -200,6 +200,7 @@ define(['jquery', 'd3pie', 'visibility', 'app/stats', 'app/graph', 'app/config',
tab_config.setup(interface);
tab_symbols.setup(interface, tables);
tab_history.setup(interface, tables);
+ tab_upload.setup(interface)
};
interface.alertMessage = function (alertState, alertText) {
@@ -475,188 +476,4 @@ define(['jquery', 'd3pie', 'visibility', 'app/stats', 'app/graph', 'app/config',
interface.getPassword = getPassword;
return interface;
-
-
- // @upload text
- function uploadText(data, source, headers) {
- var url;
- if (source === 'spam') {
- url = 'learnspam';
- } else if (source === 'ham') {
- url = 'learnham';
- } else if (source == 'fuzzy') {
- url = 'fuzzyadd';
- } else if (source === 'scan') {
- url = 'scan';
- }
- $.ajax({
- data: data,
- dataType: 'json',
- type: 'POST',
- url: url,
- processData: false,
- jsonp: false,
- beforeSend: function (xhr) {
- xhr.setRequestHeader('Password', getPassword());
- $.each(headers, function (name, value) {
- xhr.setRequestHeader(name, value);
- });
- },
- success: function (data) {
- cleanTextUpload(source);
- if (data.success) {
- alertMessage('alert-success', 'Data successfully uploaded');
- }
- },
- error: function (xhr, textStatus, errorThrown) {
- var errorMsg;
-
- try {
- var json = $.parseJSON(xhr.responseText);
- errorMsg = $('<a>').text(json.error).html();
- } catch (err) {
- errorMsg = $('<a>').text("Error: [" + textStatus + "] " + errorThrown).html();
- }
- alertMessage('alert-error', errorMsg);
- }
- });
- }
- // @upload text
- function scanText(data) {
- var url = 'scan';
- var items = [];
- $.ajax({
- data: data,
- dataType: 'json',
- type: 'POST',
- url: url,
- processData: false,
- jsonp: false,
- beforeSend: function (xhr) {
- xhr.setRequestHeader('Password', getPassword());
- },
- success: function (input) {
- var data = input['default'];
- if (data.action) {
- alertMessage('alert-success', 'Data successfully scanned');
- var action = '';
-
- if (data.action === 'clean' || 'no action') {
- action = 'label-success';
- }
- else if (data.action === 'rewrite subject' || 'add header' || 'probable spam') {
- action = 'label-warning';
- }
- else if (data.action === 'spam') {
- action = 'label-danger';
- }
-
- var score = '';
- if (data.score <= data.required_score) {
- score = 'label-success';
- }
- else if (data.score >= data.required_score) {
- score = 'label-danger';
- }
- $('<tbody id="tmpBody"><tr>' +
- '<td><span class="label ' + action + '">' + data.action + '</span></td>' +
- '<td><span class="label ' + score + '">' + data.score.toFixed(2) + '/' + data.required_score.toFixed(2) + '</span></td>' +
- '</tr></tbody>')
- .insertAfter('#scanOutput thead');
- var sym_desc = {};
- var nsym = 0;
-
- $.each(data, function (i, item) {
- if (typeof item == 'object') {
- var sym_id = "sym_" + nsym;
- if (item.description) {
- sym_desc[sym_id] = item.description;
- }
- items.push('<div class="cell-overflow" tabindex="1"><abbr id="' + sym_id +
- '">' + item.name + '</abbr>: ' + item.score.toFixed(2) + '</div>');
- nsym++;
- }
- });
- $('<td/>', {
- id: 'tmpSymbols',
- html: items.join('')
- }).appendTo('#scanResult');
- $('#tmpSymbols').insertAfter('#tmpBody td:last').removeAttr('id');
- $('#tmpBody').removeAttr('id');
- $('#scanResult').show();
- // Show tooltips
- $.each(sym_desc, function (k, v) {
- $('#' + k).tooltip({
- "placement": "bottom",
- "title": v
- });
- });
- $('html, body').animate({
- scrollTop: $('#scanResult').offset().top
- }, 1000);
- } else {
- alertMessage('alert-error', 'Cannot scan data');
- }
- },
- error: function (jqXHR, textStatus, errorThrown) {
- alertMessage('alert-error', 'Cannot upload data: ' +
- textStatus + ", " + errorThrown);
- },
- statusCode: {
- 404: function () {
- alertMessage('alert-error', 'Cannot upload data, no server found');
- },
- 500: function () {
- alertMessage('alert-error', 'Cannot tokenize message: no text data');
- },
- 503: function () {
- alertMessage('alert-error', 'Cannot tokenize message: no text data');
- }
- }
- });
- }
- // @close scan output
- $('#scanClean').on('click', function () {
- $('#scanTextSource').val("");
- $('#scanResult').hide();
- $('#scanOutput tbody').remove();
- $('html, body').animate({scrollTop: 0}, 1000);
- return false;
- });
- // @init upload
- $('[data-upload]').on('click', function () {
- var source = $(this).data('upload');
- var data;
- var headers = {};
- data = $('#' + source + 'TextSource').val();
- if (source == 'fuzzy') {
- //To access the proper
- headers.flag = $('#fuzzyFlagText').val();
- headers.weigth = $('#fuzzyWeightText').val();
- } else {
- data = $('#' + source + 'TextSource').val();
- }
- if (data.length > 0) {
- if (source == 'scan') {
- scanText(data);
- } else {
- uploadText(data, source, headers);
- }
- }
- return false;
- });
- // @empty textarea on upload complete
- function cleanTextUpload(source) {
- $('#' + source + 'TextSource').val('');
- }
- // @get acions
-
- // @watch textarea changes
- $('textarea').change(function () {
- if ($(this).val().length !== '') {
- $(this).closest('form').find('button').removeAttr('disabled').removeClass('disabled');
- } else {
- $(this).closest('form').find('button').attr('disabled').addClass('disabled');
- }
- });
});
diff --git a/interface/js/app/upload.js b/interface/js/app/upload.js
new file mode 100644
index 000000000..cdd114cb1
--- /dev/null
+++ b/interface/js/app/upload.js
@@ -0,0 +1,214 @@
+/*
+ The MIT License (MIT)
+
+ Copyright (C) 2017 Vsevolod Stakhov <vsevolod@highsecure.ru>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+
+define(['jquery', 'datatables'],
+function($) {
+ var interface = {}
+
+ function cleanTextUpload(source) {
+ $('#' + source + 'TextSource').val('');
+ }
+
+ // @upload text
+ function uploadText(rspamd, data, source, headers) {
+ var url;
+ if (source === 'spam') {
+ url = 'learnspam';
+ } else if (source === 'ham') {
+ url = 'learnham';
+ } else if (source == 'fuzzy') {
+ url = 'fuzzyadd';
+ } else if (source === 'scan') {
+ url = 'scan';
+ }
+ $.ajax({
+ data: data,
+ dataType: 'json',
+ type: 'POST',
+ url: url,
+ processData: false,
+ jsonp: false,
+ beforeSend: function (xhr) {
+ xhr.setRequestHeader('Password', rspamd.getPassword());
+ $.each(headers, function (name, value) {
+ xhr.setRequestHeader(name, value);
+ });
+ },
+ success: function (data) {
+ cleanTextUpload(source);
+ if (data.success) {
+ rspamd.alertMessage('alert-success', 'Data successfully uploaded');
+ }
+ },
+ error: function (xhr, textStatus, errorThrown) {
+ var errorMsg;
+
+ try {
+ var json = $.parseJSON(xhr.responseText);
+ errorMsg = $('<a>').text(json.error).html();
+ } catch (err) {
+ errorMsg = $('<a>').text("Error: [" + textStatus + "] " + errorThrown).html();
+ }
+ rspamd.alertMessage('alert-error', errorMsg);
+ }
+ });
+ }
+ // @upload text
+ function scanText(rspamd, data) {
+ var url = 'scan';
+ var items = [];
+ $.ajax({
+ data: data,
+ dataType: 'json',
+ type: 'POST',
+ url: url,
+ processData: false,
+ jsonp: false,
+ beforeSend: function (xhr) {
+ xhr.setRequestHeader('Password', rspamd.getPassword());
+ },
+ success: function (input) {
+ var data = input['default'];
+ if (data.action) {
+ rspamd.alertMessage('alert-success', 'Data successfully scanned');
+ var action = '';
+
+ if (data.action === 'clean' || 'no action') {
+ action = 'label-success';
+ }
+ else if (data.action === 'rewrite subject' || 'add header' || 'probable spam') {
+ action = 'label-warning';
+ }
+ else if (data.action === 'spam') {
+ action = 'label-danger';
+ }
+
+ var score = '';
+ if (data.score <= data.required_score) {
+ score = 'label-success';
+ }
+ else if (data.score >= data.required_score) {
+ score = 'label-danger';
+ }
+ $('<tbody id="tmpBody"><tr>' +
+ '<td><span class="label ' + action + '">' + data.action + '</span></td>' +
+ '<td><span class="label ' + score + '">' + data.score.toFixed(2) + '/' + data.required_score.toFixed(2) + '</span></td>' +
+ '</tr></tbody>')
+ .insertAfter('#scanOutput thead');
+ var sym_desc = {};
+ var nsym = 0;
+
+ $.each(data, function (i, item) {
+ if (typeof item == 'object') {
+ var sym_id = "sym_" + nsym;
+ if (item.description) {
+ sym_desc[sym_id] = item.description;
+ }
+ items.push('<div class="cell-overflow" tabindex="1"><abbr id="' + sym_id +
+ '">' + item.name + '</abbr>: ' + item.score.toFixed(2) + '</div>');
+ nsym++;
+ }
+ });
+ $('<td/>', {
+ id: 'tmpSymbols',
+ html: items.join('')
+ }).appendTo('#scanResult');
+ $('#tmpSymbols').insertAfter('#tmpBody td:last').removeAttr('id');
+ $('#tmpBody').removeAttr('id');
+ $('#scanResult').show();
+ // Show tooltips
+ $.each(sym_desc, function (k, v) {
+ $('#' + k).tooltip({
+ "placement": "bottom",
+ "title": v
+ });
+ });
+ $('html, body').animate({
+ scrollTop: $('#scanResult').offset().top
+ }, 1000);
+ } else {
+ rspamd.alertMessage('alert-error', 'Cannot scan data');
+ }
+ },
+ error: function (jqXHR, textStatus, errorThrown) {
+ rspamd.alertMessage('alert-error', 'Cannot upload data: ' +
+ textStatus + ", " + errorThrown);
+ },
+ statusCode: {
+ 404: function () {
+ rspamd.alertMessage('alert-error', 'Cannot upload data, no server found');
+ },
+ 500: function () {
+ rspamd.alertMessage('alert-error', 'Cannot tokenize message: no text data');
+ },
+ 503: function () {
+ rspamd.alertMessage('alert-error', 'Cannot tokenize message: no text data');
+ }
+ }
+ });
+ }
+
+ interface.setup = function(rspamd) {
+ $('textarea').change(function () {
+ if ($(this).val().length !== '') {
+ $(this).closest('form').find('button').removeAttr('disabled').removeClass('disabled');
+ } else {
+ $(this).closest('form').find('button').attr('disabled').addClass('disabled');
+ }
+ });
+
+ $('#scanClean').on('click', function () {
+ $('#scanTextSource').val("");
+ $('#scanResult').hide();
+ $('#scanOutput tbody').remove();
+ $('html, body').animate({scrollTop: 0}, 1000);
+ return false;
+ });
+ // @init upload
+ $('[data-upload]').on('click', function () {
+ var source = $(this).data('upload');
+ var data;
+ var headers = {};
+ data = $('#' + source + 'TextSource').val();
+ if (source == 'fuzzy') {
+ //To access the proper
+ headers.flag = $('#fuzzyFlagText').val();
+ headers.weigth = $('#fuzzyWeightText').val();
+ } else {
+ data = $('#' + source + 'TextSource').val();
+ }
+ if (data.length > 0) {
+ if (source == 'scan') {
+ scanText(rspamd, data);
+ } else {
+ uploadText(rspamd, data, source, headers);
+ }
+ }
+ return false;
+ });
+ };
+
+
+ return interface;
+});