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

/*
# templates/tls_wizard_redirect/services/indexService.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: false */
/* jshint -W100 */

define(
    'app/services/indexService',[
        "angular",
        "cjt/io/api",
        "cjt/util/query",   // XXX FIXME remove when batch is in
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1", // IMPORTANT: Load the driver so its ready
    ],
    function(angular, API, QUERY, APIREQUEST) {

        var app = angular.module("App");
        var NO_MODULE = "";

        function indexServiceFactory($q, PAGE) {
            var indexService = {};
            indexService.get_domains = function() {
                return PAGE.data.domains;
            };

            indexService.get_enabled_provider_count = function() {
                return PAGE.data.enabled_provider_count;
            };

            indexService.get_default_theme = function() {
                return PAGE.data.default_theme;
            };

            indexService.check_account_has_feature = function(username, feature) {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "verify_user_has_feature");
                apiCall.addArgument("user", username);
                apiCall.addArgument("feature", feature);
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.check_user_has_features = function(user, features) {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();
                apiCall.initialize(NO_MODULE, "batch");

                var calls = {};
                features.forEach( function(p, i) {
                    calls["command-" + i] = {
                        feature: p,
                    };
                } );

                for (var query_key in calls) {
                    if ( calls.hasOwnProperty(query_key) ) {
                        calls[query_key].user = user;

                        var this_call_query = QUERY.make_query_string( calls[query_key] );
                        apiCall.addArgument(query_key, "verify_user_has_feature?" + this_call_query);
                    }
                }

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.force_enable_features_for_user = function(user, features) {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "add_override_features_for_user");
                apiCall.addArgument("user", user);
                apiCall.addArgument("features", JSON.stringify(features));
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.create_user_session = function(user) {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "create_user_session");
                apiCall.addArgument("user", user);
                apiCall.addArgument("service", "cpaneld");
                apiCall.addArgument("app", "SSL_TLS_Wizard");
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.enable_cpstore_provider = function() {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "enable_market_provider");
                apiCall.addArgument("name", "cPStore");
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.set_user_theme_to_default_theme = function(user) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                var defaultTheme = PAGE.data.default_theme;

                apiCall.initialize(NO_MODULE, "modifyacct");
                apiCall.addArgument("user", user);
                apiCall.addArgument("RS", defaultTheme);
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            indexService.set_user_style_to_retro = function(user) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "cpanel");
                apiCall.addArgument("user", user);
                apiCall.addArgument("cpanel_jsonapi_apiversion", "3");
                apiCall.addArgument("cpanel_jsonapi_module", "Styles");
                apiCall.addArgument("cpanel_jsonapi_func", "update");
                apiCall.addArgument("name", "retro");
                apiCall.addArgument("type", "default");
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };


            indexService.get_user_account_info = function(user) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();

                apiCall.initialize(NO_MODULE, "accountsummary");
                apiCall.addArgument("user", user);
                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            return indexService;
        }

        indexServiceFactory.$inject = ["$q", "PAGE"];
        return app.factory("indexService", indexServiceFactory);
    });

/*
# templates/tls_wizard_redirect/views/purchaseRedirectController.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: false */
/* jshint -W100 */

define(
    'app/views/purchaseRedirectController',[
        "lodash",
        "angular",
        "cjt/util/locale",
        "uiBootstrap",
        "cjt/directives/toggleSortDirective",
        "cjt/directives/searchDirective",
        "cjt/directives/pageSizeDirective",
        "cjt/filters/startFromFilter",
        "cjt/decorators/paginationDecorator",
    ],
    function(_, angular, LOCALE) {

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

        // Setup the controller
        var controller = app.controller(
            "purchaseRedirectController", [
                "$scope",
                "$filter",
                "indexService",
                "growl",
                function($scope, $filter, indexService, growl) {
                    var _growl_error = function(err) {
                        growl.error(_.escape(err));
                    };
                    var defaultTheme = indexService.get_default_theme();

                    var domains = indexService.get_domains();
                    var accounts = [];
                    var need_to_enable_provider = indexService.get_enabled_provider_count() ? false : true;
                    angular.forEach(domains, function(value, key) {
                        accounts.push( { "username": value, "domain": key } );
                    });

                    $scope.accounts = accounts;

                    $scope.meta = {

                        // sort settings
                        sortReverse: false,
                        sortBy: "username",
                        sortDirection: "desc",

                        // pager settings
                        maxPages: 5,
                        totalItems: $scope.accounts.length,
                        currentPage: 1,
                        pageSize: 10,
                        pageSizes: [10, 20, 50, 100],
                        start: 0,
                        limit: 10,

                        filterValue: "",
                    };
                    $scope.showPager = true;

                    var filters = {
                        filter: $filter("filter"),
                        orderBy: $filter("orderBy"),
                        startFrom: $filter("startFrom"),
                        limitTo: $filter("limitTo"),
                    };

                    // update the table on sort
                    $scope.sortList = function() {
                        $scope.fetch();
                    };

                    // update table on pagination changes
                    $scope.selectPage = function() {
                        $scope.fetch();
                    };

                    // update table on page size changes
                    $scope.selectPageSize = function() {
                        $scope.fetch();
                    };

                    $scope.searchList = function() {
                        $scope.fetch();
                    };

                    var min_value_in_array = function(arr) {
                        var min_value = arr[0];
                        for (var x = 0; x < arr.length; x++) {
                            min_value = arr[x] < min_value ? arr[x] : min_value;
                        }

                        return min_value;
                    };

                    // update table
                    $scope.fetch = function() {
                        var filteredList = [];

                        // filter list based on search text
                        if ($scope.meta.filterValue !== "") {
                            filteredList = filters.filter($scope.accounts, $scope.meta.filterValue, false);
                        } else {
                            filteredList = $scope.accounts;
                        }

                        // sort the filtered list
                        if ($scope.meta.sortDirection !== "" && $scope.meta.sortBy !== "") {
                            filteredList = filters.orderBy(filteredList, $scope.meta.sortBy, $scope.meta.sortDirection === "asc" ? true : false);
                        }

                        // update the total items after search
                        $scope.meta.totalItems = filteredList.length;

                        // filter list based on page size and pagination
                        if ($scope.meta.totalItems > min_value_in_array($scope.meta.pageSizes)) {
                            var start = ($scope.meta.currentPage - 1) * $scope.meta.pageSize;
                            var limit = ( $scope.meta.pageSize > 0 ) ? $scope.meta.pageSize : $scope.meta.totalItems;

                            filteredList = filters.limitTo(filters.startFrom(filteredList, start), limit);
                            $scope.showPager = true;

                            // table statistics
                            $scope.meta.start = start + 1;
                            $scope.meta.limit = start + filteredList.length;

                        } else {

                            // hide pager and pagination
                            $scope.showPager = false;

                            if (filteredList.length === 0) {
                                $scope.meta.start = 0;
                            } else {

                                // table statistics
                                $scope.meta.start = 1;
                            }

                            $scope.meta.limit = filteredList.length;
                        }

                        $scope.filteredAccounts = filteredList;

                        return filteredList;
                    };

                    // first page load
                    $scope.fetch();

                    $scope.process_user_and_generate_login_url = function(user, domain) {

                        if (need_to_enable_provider) {

                            // Do this immediately so fast clickers don't trigger multiple updates
                            need_to_enable_provider = false;
                            return indexService.enable_cpstore_provider().then(function(success) {
                                growl.success(LOCALE.maketext("Because no other providers are enabled, the system enabled the [asis,cPanel Store] provider."));
                                return check_user_has_features_then_generate_session(user, domain);
                            }, function(error) {
                                need_to_enable_provider = true;
                                _growl_error(error);
                            });
                        } else {
                            return check_user_has_features_then_generate_session(user, domain);
                        }
                    };

                    $scope.get_pagination_msg = function() {
                        return LOCALE.maketext("Displaying [numf,_1] to [numf,_2] out of [quant,_3,item,items]", $scope.meta.start, $scope.meta.limit, $scope.meta.totalItems);
                    };

                    var check_user_has_features_then_generate_session = function(user, domain) {
                        var required_features = ["market", "tls_wizard", "sslinstall"];
                        var features_to_enable = {};

                        return indexService.check_user_has_features(user, required_features).then(function(success) {
                            for (var x = 0; x < success.data.length; x++) {
                                var return_data = success.data[x].parsedResponse.data;
                                if (!return_data.has_feature) {

                                    // For every query push the feature we asked about into a store if the user doesn't have it
                                    features_to_enable[return_data.query_feature] = 1;
                                    features_to_enable["should_be_set"] = true;
                                }
                            }
                            if (features_to_enable.should_be_set) {
                                delete features_to_enable.should_be_set;
                                return indexService.force_enable_features_for_user(user, features_to_enable).then(function(success) {
                                    var features = Object.keys(features_to_enable).sort();

                                    growl.success(LOCALE.maketext("The system enabled the [numerate,_1,feature,features] [list_and_quoted,_2] for the user “[_3]” to ensure access to the “[_4]”.", features.length, features, user, LOCALE.maketext("[asis,SSL]/[asis,TLS] Wizard")));
                                    return get_user_session(user, domain);
                                }, _growl_error);
                            } else {
                                return get_user_session(user, domain);
                            }
                        }, _growl_error);
                    };

                    var get_user_session = function(user, domain) {

                        var _create_user_session = function() {
                            return indexService.create_user_session(user).then(function(success) {
                                var generated_url = success.data.url + "#/purchase-certificates/" + domain;

                                // Try to open but will most likely be blocked by browser default pop-up blocker - that's ok!
                                window.open(generated_url, "_blank");
                                growl.success(LOCALE.maketext("Click to continue as the “[_1]” user and purchase an [asis,SSL] certificate.", _.escape(user)), {
                                    ttl: -1,
                                    variables: {
                                        buttonLabel: "Purchase SSL",
                                        showAction: true,
                                        action: function() {

                                            // your callback function goes here
                                            window.open(generated_url, "_blank");
                                        },
                                    },
                                });
                            }, _growl_error);
                        };

                        return indexService.get_user_account_info(user).then(function(success) {

                            // if theme is x3 we should set the theme to retro so the redirect works properly
                            if (success.data[0].theme === "x3") {

                                // set the theme to the default theme
                                return indexService.set_user_theme_to_default_theme(user).then(function(success) {

                                    // ...and the style to retro
                                    return indexService.set_user_style_to_retro(user).then(function(success) {

                                        // if we succeed let the user know we updated the targeted users styles/theme
                                        growl.success(LOCALE.maketext("The system changed the theme for user “[_1]” to “[_2]”, with the “[asis,Retro]” style, to support this feature.", _.escape(user)), {
                                            ttl: -1,
                                        }, defaultTheme);

                                        // ...and make a call to create the user session
                                        return _create_user_session();
                                    }, function(error) {

                                        // failed to set the style but we have an updated theme, should roll back theme to x3 then give an error
                                        growl.error(LOCALE.maketext("You cannot redirect to this account because it does not have theme support for this feature."));
                                    });
                                }, function(error) {

                                    // we were unable to set the user theme to the default theme so lets let them know why we won't proceed
                                    growl.error(LOCALE.maketext("You cannot redirect to this account because it does not have theme support for this feature."));
                                });
                            } else {

                                // if they don't have x3 we assume they have support
                                return _create_user_session();
                            }
                        }, function(error) {

                            // ...if we fail to fetch user info there is probably something bad going on so lets bail out early
                            growl.error(LOCALE.maketext("The system failed to fetch the user’s account information because of the following error: [_1]", _.escape(error)));
                            return;
                        });
                    };
                },
            ]
        );

        return controller;
    }
);

/*
# templates/tls_wizard_redirect/index.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, require, PAGE */
/* jshint -W100 */


define(
    'app/index',[
        "angular",
        "cjt/core",
        "cjt/modules",
        "uiBootstrap",
        "ngRoute"
    ],
    function(angular, CJT) {

        CJT.config.html5Mode = false;

        return function() {

            angular.module("App", [
                "cjt2.config.whm.configProvider", // This needs to load first
                "ui.bootstrap",
                "angular-growl",
                "cjt2.whm"
            ]);

            var app = require(
                [
                    "cjt/bootstrap",

                    // Application Modules
                    "uiBootstrap",
                    "app/services/indexService",
                    "app/views/purchaseRedirectController",
                ], function(BOOTSTRAP) {

                    var app = angular.module("App");

                    app.value("PAGE", PAGE);

                    // If using views
                    app.controller("BaseController", ["$rootScope", "$scope", "$route", "$location",
                        function($rootScope, $scope, $route, $location) {

                            $scope.loading = false;

                            // Convenience functions so we can track changing views for loading purposes
                            $rootScope.$on("$routeChangeStart", function() {
                                $scope.loading = true;
                            });
                            $rootScope.$on("$routeChangeSuccess", function() {
                                $scope.loading = false;
                            });
                            $rootScope.$on("$routeChangeError", function() {
                                $scope.loading = false;
                            });
                            $scope.current_route_matches = function(key) {
                                return $location.path().match(key);
                            };
                            $scope.go = function(path) {
                                $location.path(path);
                            };
                        }
                    ]);

                    // viewName

                    app.config(["$routeProvider",
                        function($routeProvider) {

                            // Setup a route - copy this to add additional routes as necessary
                            $routeProvider.when("/purchaseRedirect", {
                                controller: "purchaseRedirectController",
                                templateUrl: CJT.buildFullPath("tls_wizard_redirect/views/purchaseRedirectView.ptt"),
                                resolve: {}
                            });

                            // default route
                            $routeProvider.otherwise({
                                "redirectTo": "/purchaseRedirect"
                            });

                        }
                    ]);

                    // end of using views

                    BOOTSTRAP();

                });

            return app;
        };
    }
);

Back to Directory File Manager