Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/mail_blocked_domains/index.cmb.js

/*
# mail_blocked_domains/services/parser.js
#                                                  Copyright 2022 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
*/

define(
    'app/services/parser',[
        "punycode",
        "cjt/util/locale",
        "cjt/validator/domain-validators",
        "cjt/validator/validator-utils",
    ],
    function mailBlockedDomainsParser(PUNYCODE, LOCALE, domainValidators, valUtils) {
        "use strict";

        var _validateDomain = domainValidators.methods.wildcardFqdnAllowTld;

        function _discardEmpty(a) {
            return !!a.length;
        }

        /**
        * @function parseDomainsFromText
        * @param txt String The text input to parse.
        * @returns Array The array of domains parsed from the string.
        *
        * On failure, this throws an array:
        *
        *   [
        *       [ domain1, failureReason ],
        *       [ domain2, failureReason ],
        *       ...
        *   ]
        */

        function parseDomainsFromText(txt) {
            var domains = txt.
                trim().
                split(/\s*\n\s*/).
                filter(_discardEmpty)
            ;

            var failures = [];

            var appear = {};

            domains.forEach( function(d, di) {
                var result = _validateDomain(d);

                if (result.isValid) {
                    var uvalue = PUNYCODE.toUnicode(d);

                    if (!appear[uvalue]) {
                        appear[uvalue] = 1;
                    } else {
                        if (appear[uvalue] === 1) {
                            var vresult = valUtils.initializeValidationResult();
                            vresult.addError( "duplicate", LOCALE.maketext("You may not enter any domain more than once.") );
                            failures.push( [uvalue, vresult] );
                        }

                        appear[uvalue]++;
                    }

                    domains[di] = uvalue;
                } else {
                    failures.push( [d, result] );
                }
            } );

            if (failures.length) {
                throw failures;
            }

            return domains;
        }

        return {
            parseDomainsFromText: parseDomainsFromText,
        };
    }
);

/*
# templates/mail_blocked_domains/services/manageService.js
#                                                  Copyright 2022 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 */
/* jshint -W100 */
/* jshint -W089 */

define(
    'app/services/manageService',[
        "lodash",
        "angular",
        "punycode",
        "cjt/util/locale",
        "cjt/io/batch-request",
        "cjt/io/whm-v1-request",
        "cjt/services/APICatcher",
        "cjt/services/alertService",
        "cjt/io/whm-v1", // IMPORTANT: Load the driver so its ready
    ],
    function mailBlockedDomainsService(_, angular, PUNYCODE, LOCALE, BATCH, APIREQUEST) {
        "use strict";

        var NO_MODULE = "";

        // ----------------------------------------------------------------------

        var app = angular.module("whm.mailBlockedDomains.Service", ["cjt2.services.apicatcher", "cjt2.services.api"]);

        function manageServiceFactory(api, alertService) {
            var savedDomains;

            function setSavedDomains(domains) {
                savedDomains = domains.map( PUNYCODE.toUnicode ).sort();
            }

            return {
                setSavedDomains: setSavedDomains,

                getSavedDomains: function getSavedDomains() {
                    return savedDomains.slice();
                },

                saveBlockedDomains: function saveBlockedDomains(domains) {
                    domains = domains.map( PUNYCODE.toASCII );
                    var oldDomains = savedDomains.map( PUNYCODE.toASCII );

                    var apicalls = [];

                    // It’s inefficient to do each addition and removal
                    // in its own transaction, but hopefully there won’t
                    // be much need for optimizing it.

                    var adds = _.difference(domains, oldDomains);
                    if (adds.length) {
                        apicalls.push( new APIREQUEST.Class().initialize( NO_MODULE, "block_incoming_email_from_domain", { domain: adds } ) );
                    }

                    var removes = _.difference(oldDomains, domains);
                    if (removes.length) {
                        apicalls.push( new APIREQUEST.Class().initialize( NO_MODULE, "unblock_incoming_email_from_domain", { domain: removes } ) );
                    }

                    // Last batch call is a re-fetch of the data.
                    apicalls.push( new APIREQUEST.Class().initialize(NO_MODULE, "list_blocked_incoming_email_domains") );

                    var batch = new BATCH.Class( apicalls );

                    alertService.add( {
                        type: "info",
                        message: LOCALE.maketext("Submitting updates …"),
                        replace: true,
                    } );

                    return api.promise(batch).then( function(result) {
                        var newDomains = result.data[ result.data.length - 1 ].data;
                        newDomains = newDomains.map( function(o) {
                            return PUNYCODE.toUnicode(o.domain);
                        } );

                        setSavedDomains(newDomains);

                        alertService.success(LOCALE.maketext("Success!"));
                    } );
                },
            };
        }

        manageServiceFactory.$inject = ["APICatcher", "alertService"];
        return app.factory("manageService", manageServiceFactory);
    }
);

define(
    'app/validators/domainList',[
        "lodash",
        "angular",
        "cjt/validator/validator-utils",
        "app/services/parser",
        "cjt/validator/validateDirectiveFactory",
    ],
    function domainListValidator(_, angular, validationUtils, PARSER) {
        "use strict";

        var methods = {
            domainList: function domainList(input) {
                var result = validationUtils.initializeValidationResult();

                try {
                    PARSER.parseDomainsFromText(input);
                } catch (e) {
                    var errorHTMLs = e.map( function(o) {
                        return ( "<span class='code'>" + _.escape(o[0]) + "</span>: " + _.escape(o[1]) );
                    } );

                    var errorHTML;

                    if (errorHTMLs.length === 1) {
                        errorHTML = errorHTMLs[0];
                    } else {
                        errorHTML = "<ul><li>";
                        errorHTML += errorHTMLs.join("</li><li>");
                        errorHTML += "</li></ul>";
                    }

                    result.addError("domainList", errorHTML);
                }

                return result;
            },
        };

        var validatorModule = angular.module("cjt2.validate");

        validatorModule.run(["validatorFactory", function(validatorFactory) {
            validatorFactory.generate(methods);
        } ] );

        return {
            methods: methods,
            name: "domain-list",
            description: "Validate a list of domains, allowing wildcard.",
            version: 1.0,
        };
    }
);

/*
# whostmgr/docroot/templates/mail_blocked_tlds/index.js
                                                   Copyright 2022 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, require, PAGE */
/* jshint -W100 */

define(
    'app/index',[
        "lodash",
        "angular",
        "punycode",
        "cjt/util/locale",
        "app/services/parser",
        "cjt/core",
        "cjt/util/parse",
        "cjt/modules",
        "uiBootstrap",
        "cjt/directives/validationContainerDirective",
    ],
    function mailBlockedDomainsDefine(_, angular, PUNYCODE, LOCALE, PARSER) {
        "use strict";

        var PAGE = window.PAGE;

        return function inDefine() {
            angular.module("whm.mailBlockedDomains", [
                "cjt2.config.whm.configProvider", // This needs to load before any of its configured services are used.
                "ui.bootstrap",
                "cjt2.whm",
                "cjt2.services.alert",
                "whm.mailBlockedDomains.Service",
            ] );

            return require(
                [
                    "cjt/bootstrap",
                    "uiBootstrap",
                    "app/services/manageService",
                    "app/validators/domainList",
                ],
                function toRequire(BOOTSTRAP) {
                    var app = angular.module("whm.mailBlockedDomains");

                    app.controller("BaseController", [
                        "$rootScope",
                        "$scope",
                        "manageService",
                        function($rootScope, $scope, manageService) {
                            manageService.setSavedDomains(PAGE.initial_blocked_domains);

                            var state = {
                                viewPunycodeYN: PAGE.initial_view_punycode,
                            };

                            function _parseDomainsFromView() {
                                return PARSER.parseDomainsFromText(state.domainsText);
                            }

                            function _pushDomainsToView(domains) {
                                state.domainsText = domains.join("\n");
                            }

                            function _syncDomainsText() {
                                var domains = manageService.getSavedDomains();

                                if (state.viewPunycodeYN) {
                                    domains = domains.map( PUNYCODE.toASCII );
                                }

                                _pushDomainsToView(domains);
                            }

                            _syncDomainsText();

                            _.assign(
                                $scope,
                                {
                                    updateViewPunycode: function updateViewPunycode() {
                                        var domains = _parseDomainsFromView();
                                        var xform = PUNYCODE[ state.viewPunycodeYN ? "toASCII" : "toUnicode" ];

                                        _pushDomainsToView(domains.map(xform));
                                    },

                                    domainsAreChanged: function domainsAreChanged() {
                                        var domains = _parseDomainsFromView();
                                        var saved = manageService.getSavedDomains();

                                        return !!_.xor(domains, saved).length;
                                    },

                                    submit: function submit() {
                                        var domains = PARSER.parseDomainsFromText(state.domainsText);

                                        $scope.inProgress = true;

                                        return manageService.saveBlockedDomains(domains).then( _syncDomainsText ).finally( function() {
                                            $scope.inProgress = false;
                                        } );
                                    },

                                    state: state,
                                }
                            );
                        },
                    ] );

                    BOOTSTRAP(document, "whm.mailBlockedDomains");
                }
            );
        };
    }
);

Back to Directory File Manager