Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/mod_security/views/massEditRuleController.js

/*
# templates/mod_security/views/massEditRuleController.js Copyright(c) 2020 cPanel, L.L.C.
#                                                           All rights reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
*/

/* global define */

define(
    [
        "angular",
        "lodash",
        "cjt/util/locale",
        "jquery",
        "cjt/jquery/plugins/rangeSelection",
        "uiBootstrap",
        "cjt/directives/autoFocus",
        "cjt/directives/spinnerDirective",
        "cjt/services/alertService",
        "app/services/ruleService",
    ],
    function(angular, _, LOCALE) {
        "use strict";

        // Retrieve the current application
        var app = angular.module("App");

        var controller = app.controller(
            "massEditRuleController",
            ["$scope", "$location", "$anchorScroll", "$routeParams", "$q", "$timeout", "ruleService", "alertService", "spinnerAPI", "PAGE",
                function($scope, $location, $anchorScroll, $routeParams, $q, $timeout, ruleService, alertService, spinnerAPI, PAGE) {

                    // CONSTANTS
                    var ANIMATION_INTER_STEP_DELAY = 500; // in milliseconds.

                    /**
                 * Disable the save button based on form state
                 *
                 * @method disableSave
                 * @param  {FormController} form
                 * @return {Boolean}
                 */
                    $scope.disableSave = function(form) {
                        return $scope.cantEdit || form.txtRules.$pristine || (form.$dirty && form.$invalid);
                    };

                    /**
                 * Clear the form
                 *
                 * @method clearForm
                 */
                    $scope.clearForm = function() {
                        $scope.enabled = true;
                        $scope.rules = "";
                        $scope.deploy = false;
                        $scope.clearNotices();
                        $scope.cantEdit = false;
                    };

                    /**
                 * Clear the notices
                 *
                 * @method clearNotices
                 */
                    $scope.clearNotices = function() {
                        alertService.clear();
                        $scope.notice = "";
                    };

                    /**
                 * Navigate to the previous view.
                 *
                 * @method  cancel
                 */
                    $scope.cancel = function() {
                        $scope.clearNotices();
                        $scope.loadView("rulesList");
                    };

                    /**
                 * Save the form and navigate or clean depending on the users choices.
                 *
                 * @method save
                 * @param  {FormController} form
                 * @return {Promise}
                 */
                    $scope.save = function(form) {
                        $scope.clearNotices();

                        if (!form.$valid) {
                            return;
                        }

                        spinnerAPI.start("loadingSpinner");
                        $scope.progress = 0;
                        $scope.cantEdit = true;
                        return ruleService
                            .setCustomConfigText($scope.rules, $scope.deploy)
                            .then(function() {

                                // on success, update alert and load the view
                                spinnerAPI.stop("loadingSpinner");
                                $timeout(function() {
                                    $scope.progress = 100;
                                    $timeout(function() {

                                        // success
                                        if ($scope.deploy) {
                                            alertService.add({
                                                type: "success",
                                                message: LOCALE.maketext("You have successfully saved and deployed your [asis,ModSecurity™] rules."),
                                                id: "alertSaveSuccess",
                                            });
                                        } else {
                                            alertService.add({
                                                type: "success",
                                                message: LOCALE.maketext("You have successfully saved your [asis,ModSecurity™] rules."),
                                                id: "alertSaveSuccess",
                                            });
                                        }

                                        $timeout(function() {
                                            $scope.loadView("rulesList");
                                            $scope.showProgress = false;
                                        }, 2 * ANIMATION_INTER_STEP_DELAY);
                                    }, 2 * ANIMATION_INTER_STEP_DELAY);
                                }, 2 * ANIMATION_INTER_STEP_DELAY);
                            }, function(error) {
                                spinnerAPI.stop("loadingSpinner");
                                $scope.cantEdit = false;
                                if (error) {

                                    // failures like timeout, lost connection, etc.
                                    alertService.add({
                                        type: "danger",
                                        message: _.escape(error),
                                        id: "errorFetchRules",
                                    });
                                }

                                // ensure the any notifications and/or the final error is in view and focus is in the rule field
                                $timeout(function() {
                                    $scope.scrollTo("top");
                                    document.getElementById("txtRules").focus();
                                }, 2 * ANIMATION_INTER_STEP_DELAY);

                            }, function(data) {

                                switch (data.type) {
                                    case "post":

                                        // Only show the progress if there are more then 2 pages
                                        if (data.totalPages > 2) {
                                            $scope.showProgress = true;
                                        }

                                        // Update the progress
                                        $scope.progress = Math.floor(data.page / data.totalPages * 100);
                                        break;
                                    case "error":

                                        // api related failures.
                                        alertService.add({
                                            type: "danger",
                                            message: _.escape(data.error),
                                            id: "errorSaveRules",
                                        });
                                        break;
                                }
                            });
                    };

                    /**
                 * Fetch the config text from the user defined rules file
                 * @return {Promise} Promise that will fulfill the request.
                 */
                    var fetchRules = function() {
                        spinnerAPI.start("loadingSpinner");
                        $scope.progress = 0;
                        $scope.cantEdit = true;
                        return ruleService
                            .getCustomConfigText()
                            .then(angular.noop, function(error) {
                                if (error) {

                                    // failures like timeout, lost connection, etc.
                                    alertService.add({
                                        type: "danger",
                                        message: _.escape(error),
                                        id: "errorFetchRules",
                                    });
                                }
                            }, function(data) {
                                switch (data.type) {
                                    case "page":

                                        // Only show the progress if there are more then 2 pages
                                        if (data.totalPages > 2) {
                                            $scope.showProgress = true;
                                        }

                                        if (data.text) {

                                            // Update the progress
                                            $scope.progress = Math.floor(data.page / data.totalPages * 100);

                                            // Append
                                            $scope.rules += data.text.join("");
                                        }
                                        break;
                                    case "error":

                                        // api related failures.
                                        alertService.add({
                                            type: "danger",
                                            message: _.escape(data.error),
                                            id: "errorFetchRules",
                                        });
                                        break;
                                }
                            })
                            .finally(function() {
                                spinnerAPI.stop("loadingSpinner");
                                $timeout(function() {
                                    $scope.progress = 100;
                                    $timeout(function() {

                                        // delayed for a little so the progress bar can finish
                                        $scope.cantEdit = false;
                                        $scope.showProgress = false;
                                        $timeout(function() {
                                            $scope.progress = 0;
                                            angular.element(document.querySelector( "#txtRules" )).selectRange(0);
                                        }, ANIMATION_INTER_STEP_DELAY);
                                    }, ANIMATION_INTER_STEP_DELAY);
                                }, ANIMATION_INTER_STEP_DELAY);

                            });
                    };

                    // Setup the installed bit...
                    $scope.isInstalled = PAGE.installed;

                    if (!$scope.isInstalled) {
                        $scope.loadView("hitList");
                    }

                    // Initialize the form on first load.
                    $scope.showProgress = false;
                    $scope.cantEdit = true;
                    $scope.clearForm();
                    fetchRules();
                },
            ]);

        return controller;
    }
);
Back to Directory File Manager