Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/api_tokens/services/api_tokens.js

/*
# cpanel - whostmgr/docroot/templates/api_tokens/services/api_tokens.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(
    [
        "angular",
        "lodash",
        "cjt/util/locale",
        "cjt/io/whm-v1-request",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1",
        "cjt/services/APIService"
    ],
    function(angular, _, LOCALE, APIREQUEST, PARSE) {

        "use strict";

        var app = angular.module("whm.apiTokens.apiCallService", []);
        app.factory(
            "Tokens",
            ["$q", "APIService", function($q, APIService) {

                var TokensService = function() {};
                TokensService.prototype = new APIService();

                var isEmptyObject = function(obj) {
                    for (var key in obj) {
                        if (Object.prototype.hasOwnProperty.call(obj, key)) {
                            return false;
                        }
                    }
                    return true;
                };

                var addAclsTo = function addAclsTo(apiCall, acls) {
                    if (typeof acls !== "undefined") {
                        var i = 0, apiCount = acls.length;
                        for (; i < apiCount; i++) {
                            apiCall.addArgument("acl-" + i, acls[i]);
                        }
                    }
                };

                var tokensData = {};
                var userPrivileges = {};

                angular.extend(TokensService.prototype, {
                    getTokens: function getTokens(force) {
                        if (force || isEmptyObject(tokensData)) {
                            var apiCall = new APIREQUEST.Class();
                            apiCall.initialize("", "api_token_list");

                            return this.deferred(apiCall).promise
                                .then(function(response) {
                                    tokensData = response.data.tokens;
                                    return tokensData;
                                })
                                .catch(function(error) {
                                    return $q.reject(error);
                                });
                        } else {
                            return $q.when(tokensData);
                        }
                    },

                    createToken: function createToken(name, acls, expiresAt, whitelistIps) {
                        var apiCall = new APIREQUEST.Class();
                        apiCall.initialize("", "api_token_create");
                        apiCall.addArgument("token_name", name);

                        if (expiresAt) {
                            apiCall.addArgument("expires_at", expiresAt);
                        }

                        if (whitelistIps && whitelistIps.length) {
                            whitelistIps.forEach(function(ip, index) {
                                apiCall.addArgument("whitelist_ip-" + index, ip);
                            });
                        }

                        addAclsTo(apiCall, acls);

                        return this.deferred(apiCall).promise
                            .then(function(data) {
                                return data;
                            })
                            .catch(function(error) {
                                return $q.reject(error);
                            });
                    },

                    updateToken: function updateToken(name, newName, acls, expiresAt, whitelistIps) {
                        var apiCall = new APIREQUEST.Class();
                        apiCall.initialize("", "api_token_update");
                        apiCall.addArgument("token_name", name);
                        if (expiresAt) {
                            apiCall.addArgument("expires_at", expiresAt);
                        }

                        if (whitelistIps && whitelistIps.length) {
                            whitelistIps.forEach(function(ip, index) {
                                apiCall.addArgument("whitelist_ip-" + index, ip);
                            });
                        }

                        if (whitelistIps && !whitelistIps.length) {
                            apiCall.addArgument("whitelist_ip", "any");
                        }

                        if (newName !== name) {
                            apiCall.addArgument("new_name", newName);
                        }

                        addAclsTo(apiCall, acls);

                        return this.deferred(apiCall).promise
                            .then(function(data) {
                                return data;
                            })
                            .catch(function(error) {
                                return $q.reject(error);
                            });
                    },

                    revokeToken: function revokeToken(name) {
                        var apiCall = new APIREQUEST.Class();
                        apiCall.initialize("", "api_token_revoke");
                        if (typeof (name) === "string") {
                            apiCall.addArgument("token_name", name);
                        } else if (Array.isArray(name)) {
                            var i = 0, nameCount = name.length;
                            for (; i < nameCount; i++) {
                                apiCall.addArgument("token_name-" + i, name[i]);
                            }
                        }

                        return this.deferred(apiCall).promise
                            .then(function(data) {
                                return data;
                            })
                            .catch(function(error) {
                                return $q.reject(error);
                            });
                    },

                    getPrivileges: function getPrivileges(force) {
                        if (force || isEmptyObject(userPrivileges)) {

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

                            return this.deferred(apiCall).promise
                                .then(function(result) {
                                    var obj = {};
                                    var hasAll = false;

                                    if (result.data) {
                                        obj = result.data[0];

                                        if (obj !== null && typeof obj !== "undefined") {
                                            hasAll = Object.prototype.hasOwnProperty.call(obj, "all") && obj.all === 1;

                                            // Remove the "demo" acl since it is not a real acl
                                            delete obj.demo;

                                            var keys = Object.keys(obj);
                                            for (var i = 0, len = keys.length; i < len; i++) {
                                                if (keys[i] !== "all" && (hasAll || obj[keys[i]] === 1)) {
                                                    userPrivileges[keys[i]] = true;
                                                }
                                            }
                                            if (hasAll) {
                                                userPrivileges["all"] = false;
                                            }
                                        }
                                    }

                                    return userPrivileges;
                                })
                                .catch(function(error) {
                                    return $q.reject(error);
                                });
                        } else {
                            return $q.when(userPrivileges);
                        }
                    },

                    getDetailsFor: function getDetailsFor(tokenName) {
                        return this.getTokens(false)
                            .then(function(data) {
                                if (data !== null &&
                                    typeof data !== "undefined" &&
                                    Object.prototype.hasOwnProperty.call(data, tokenName)) {
                                    if (data[tokenName] && Object.prototype.hasOwnProperty.call(data[tokenName], "acls")) {
                                        var acls = data[tokenName].acls;

                                        // Remove the "demo" acl since it is not a real acl
                                        delete acls.demo;

                                        for (var acl in acls) {
                                            if (Object.prototype.hasOwnProperty.call(acls, acl)) {
                                                acls[acl] = PARSE.parsePerlBoolean(acls[acl]);
                                            }
                                        }
                                    }
                                    return data[tokenName];
                                }

                                return $q.reject(LOCALE.maketext("The [asis,API] token “[_1]” does not exist.", _.escape(tokenName)));
                            });
                    }
                });


                return new TokensService();
            }
            ]);
    });
Back to Directory File Manager