| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -27,23 +27,10 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "use strict"; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        var ui = {}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        function loadActionsFromForm() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            var values = []; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            var inputs = $("#actionsForm :input[data-id=\"action\"]"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // Rspamd order: [spam, rewrite_subject, probable_spam, greylist]
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            values[0] = parseFloat(inputs[3].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            values[1] = parseFloat(inputs[2].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            values[2] = parseFloat(inputs[1].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            values[3] = parseFloat(inputs[0].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return JSON.stringify(values); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ui.getActions = function getActions(rspamd, checked_server) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            rspamd.query("actions", { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                success: function (data) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#actionsBody").empty(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#actionsForm").empty(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#actionsFormField").empty(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    var items = []; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $.each(data[0].data, function (i, item) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        var idx = -1; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -64,10 +51,12 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        if (idx >= 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            items.push({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                idx: idx, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                html: "<div class=\"form-group\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                "<label class=\"col-form-label col-md-2 float-left\">" + label + "</label>" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                "<div class=\"controls slider-controls col-md-10\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                "<input class=\"action-scores form-control\" data-id=\"action\" type=\"number\" value=\"" + item.value + "\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                html: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                '<div class="form-group">' + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    '<label class="col-form-label col-md-2 float-left">' + label + "</label>" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    '<div class="controls slider-controls col-md-10">' + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                        '<input class="action-scores form-control" data-id="action" type="number" value="' + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                          item.value + '">' + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                    "</div>" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                                "</div>" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            }); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -78,25 +67,43 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        return a.idx - b.idx; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#actionsBody").html("<form id=\"actionsForm\"><fieldset id=\"actionsFormField\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#actionsFormField").html( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        items.map(function (e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            return e.html; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }).join("") + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    "<div class=\"form-group\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    "<div class=\"btn-group\">" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    "<button class=\"btn btn-primary\" type=\"button\" id=\"saveActionsBtn\">Save actions</button>" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    "<button class=\"btn btn-primary\" type=\"button\" id=\"saveActionsClusterBtn\">Save cluster</button>" + | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    "</div></div></fieldset></form>"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (rspamd.read_only) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        $("#saveActionsClusterBtn").attr("disabled", true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        $("#saveActionsBtn").attr("disabled", true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        $("#actionsFormField").attr("disabled", true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        }).join("")); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                server: (checked_server === "All SERVERS") ? "local" : checked_server | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ui.saveActions = function (rspamd, server) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            function descending(arr) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                var desc = true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                var filtered = arr.filter(function (el) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    return el !== null; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                for (var i = 0; i < filtered.length - 1; i++) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    if (filtered[i + 1] >= filtered[i]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        desc = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        break; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return desc; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    function saveActions(server) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        var elts = loadActionsFromForm(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            var elts = (function () { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                var values = []; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                var inputs = $("#actionsForm :input[data-id=\"action\"]"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                // Rspamd order: [spam, rewrite_subject, probable_spam, greylist]
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                values[0] = parseFloat(inputs[3].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                values[1] = parseFloat(inputs[2].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                values[2] = parseFloat(inputs[1].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                values[3] = parseFloat(inputs[0].value); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                return JSON.stringify(values); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            // String to array for comparison
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        var eltsArray = JSON.parse(loadActionsFromForm()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            var eltsArray = JSON.parse(elts); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            if (eltsArray[0] < 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.alertMessage("alert-modal alert-error", "Spam can not be negative"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else if (eltsArray[1] < 0) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -105,11 +112,7 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.alertMessage("alert-modal alert-error", "Probable spam can not be negative"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else if (eltsArray[3] < 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.alertMessage("alert-modal alert-error", "Greylist can not be negative"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } else if ( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            (eltsArray[2] === null || eltsArray[3] < eltsArray[2]) && | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        (eltsArray[1] === null || eltsArray[2] < eltsArray[1]) && | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        (eltsArray[0] === null || eltsArray[1] < eltsArray[0]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        ) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else if (descending(eltsArray)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.query("saveactions", { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    method: "POST", | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    params: { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -119,19 +122,8 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    server: server | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                            rspamd.alertMessage("alert-modal alert-error", "Incorrect order of metric actions threshold"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.alertMessage("alert-modal alert-error", "Incorrect order of actions thresholds"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#saveActionsBtn").on("click", function () { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        saveActions(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    $("#saveActionsClusterBtn").on("click", function () { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                        saveActions("All SERVERS"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                server: (checked_server === "All SERVERS") ? "local" : checked_server | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ui.getMaps = function (rspamd, checked_server) { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -199,6 +191,13 @@ define(["jquery"], | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                $("#map-textarea").remove(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            $("#saveActionsBtn").on("click", function () { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ui.saveActions(rspamd); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            $("#saveActionsClusterBtn").on("click", function () { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                ui.saveActions(rspamd, "All SERVERS"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            function saveMap(server) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                rspamd.query("savemap", { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                    success: function () { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |