Viewing File: /usr/local/cpanel/whostmgr/docroot/js2/_sshkey_selection.js

/* jshint -W100 */
/* eslint-disable camelcase, no-undef */
(function(window) {
    "use strict";

    var EVENT = window.EVENT;
    var CPANEL = window.CPANEL;
    var YAHOO = window.YAHOO;
    var LOCALE = window.LOCALE;
    var DOM = YAHOO.util.Dom;

    var sshAnimation;

    var handleSshKey = function(e) {
        var authtype_publickey = CPANEL.Y.one("#authtype_publickey"),
            public_key_options = CPANEL.Y.one("#public_key_options"),
            public_key_password = CPANEL.Y.one("#public_key_password"),
            public_key_selector = CPANEL.Y.one("#sshkey_selector"),
            escmeth_su = CPANEL.Y.one("#escmeth_su"),
            auth_user = CPANEL.Y.one("#auth_user"),
            user_password = CPANEL.Y.one("#user_password");

        if (sshAnimation) {
            EVENT.preventDefault(e);
            return;
        }

        // If no key exists we don't want to do this
        if (public_key_selector) {
            var current_key = public_key_selector.value;
            var key_list = CPANEL.PAGE.key_list;
            var key_is_encrypted = 1;
            for (var i = 0; i < key_list.length; i++) {
                if (key_list[i].key === current_key) {
                    key_is_encrypted = parseInt(key_list[i].encrypted, 10);
                    break;
                }
            }

            CPANEL.Y.one("#sshkeypass").disabled = !key_is_encrypted;
            DOM.setStyle(public_key_password, "display", key_is_encrypted ? "" : "none");
        }

        // We only need to track one animation since they both have the same animate time and will finish at the same time.
        if (authtype_publickey.checked) {
            if (public_key_options.style.display === "none") {
                sshAnimation = CPANEL.animate.slide_down(public_key_options);
            }
            if (user_password.style.display !== "none") {
                if (escmeth_su.checked || !auth_user.checked) {
                    CPANEL.animate.slide_up(user_password);
                }
            } else {
                if (!escmeth_su.checked && auth_user.checked) {
                    CPANEL.animate.slide_down(user_password);
                }
            }
        } else {
            if (public_key_options.style.display !== "none") {
                sshAnimation = CPANEL.animate.slide_up(public_key_options);
            }
            if (user_password.style.display === "none") {
                CPANEL.animate.slide_down(user_password);
            }
        }
        if (sshAnimation) {
            sshAnimation.onComplete.subscribe(function() {
                sshAnimation = null;
            });
        }
    };

    var suPassAnimation;

    var handleSuSudo = function(e) {
        var escmeth_su = CPANEL.Y.one("#escmeth_su"),
            su_pass = CPANEL.Y.one("#su_pass");

        if ((escmeth_su.checked && su_pass.style.display !== "none") ||
            (!escmeth_su.checked && su_pass.style.display === "none")) {

            if (e) {
                EVENT.preventDefault(e);
            }
            return;
        }

        if (suPassAnimation) {
            EVENT.preventDefault(e);
            return;
        }

        handleSshKey();
        if (CPANEL.Y.one("#escmeth_su").checked) {
            suPassAnimation = CPANEL.animate.slide_down("su_pass");
        } else {
            suPassAnimation = CPANEL.animate.slide_up("su_pass");
        }
        suPassAnimation.onComplete.subscribe(function() {
            suPassAnimation = null;
        });
    };

    var escOptionsAnimation,
        authuserWrapperAnimation;

    var handleUserLabel = function(e) {
        var password_label = CPANEL.Y.one("#user_password_label"),
            auth_user = CPANEL.Y.one("#auth_user"),
            auth_username_field = CPANEL.Y.one("input[name='authuser']");

        password_label.innerHTML = auth_user.checked ?
            LOCALE.maketext("“[_1]” Password:", auth_username_field.value).html_encode() :
            LOCALE.maketext("Root Password:");
    };

    var handleAuthRadio = function(e) {
        var auth_user = CPANEL.Y.one("#auth_user"),
            esc_options = CPANEL.Y.one("#esc_options"),
            authuser_wrapper = CPANEL.Y.one("#authuser_wrapper");


        if ((auth_user.checked && esc_options.style.display !== "none" && authuser_wrapper.style.display !== "none") ||
            (!auth_user.checked && esc_options.style.display === "none" && authuser_wrapper.style.display === "none")) {
            return;
        }

        if (escOptionsAnimation) {
            EVENT.preventDefault(e);
            return;
        }

        if (authuserWrapperAnimation) {
            EVENT.preventDefault(e);
            return;
        }

        if (auth_user.checked) {
            escOptionsAnimation = CPANEL.animate.slide_down("esc_options");
            authuserWrapperAnimation = CPANEL.animate.slide_down("authuser_wrapper");
        } else {
            escOptionsAnimation = CPANEL.animate.slide_up("esc_options");
            authuserWrapperAnimation = CPANEL.animate.slide_up("authuser_wrapper");
        }
        escOptionsAnimation.onComplete.subscribe(function() {
            escOptionsAnimation = null;
        });
        authuserWrapperAnimation.onComplete.subscribe(function() {
            authuserWrapperAnimation = null;
        });
    };

    var validation_notice;
    var state = {};

    // CHECK CREDENTIALS
    window.setupSSHSession = function(e, withWSTransport) {

        EVENT.preventDefault(e);

        CPANEL.namespace("CPANEL.PAGE");

        var formSubmitButton = CPANEL.Y.one("#formSubmitButton");
        var formSubmitButtonTextDiv = CPANEL.Y.one("#formSubmitButton .button-text");
        var preChangeText = formSubmitButtonTextDiv.innerHTML;

        CPANEL.PAGE.sshProgressPanel = new CPANEL.ajax.Progress_Panel(null, {
            show_status: true,
            status_html: preChangeText
        });
        CPANEL.PAGE.sshProgressPanel.show_from_source(formSubmitButton);


        var setupSSHSessionFailed = function() {
            CPANEL.PAGE.sshProgressPanel.hide();
        };
        var updateStatusText = function(label) {
            var overlayText = CPANEL.Y.one(".cjt-progress-overlay-text");
            overlayText.innerHTML = label;
        };

        if (validation_notice) {
            validation_notice.fade_out();
        }

        if (state.checking_ssh || state.settingup_session) {
            setupSSHSessionFailed();
            return;
        }

        // Create appropriate package to send with api call
        var checkSshData = {},
            sessionSetupData = {},
            errors = [];
        sessionSetupData.host = CPANEL.Y.one("#host").value;
        checkSshData.host = sessionSetupData.host;
        if (!sessionSetupData.host.trim().length) {
            errors.push(LOCALE.maketext("You must specify a host name or IP address."));
        }
        sessionSetupData.port = CPANEL.Y.one("#server_port").value;
        checkSshData.port = sessionSetupData.port;
        if (!sessionSetupData.port.trim().length) {
            errors.push(LOCALE.maketext("You must specify a port number."));
        }
        sessionSetupData.user = CPANEL.Y.one("#auth_root").checked ? "root" : CPANEL.Y.one("#authuser").value;
        if (!sessionSetupData.user.trim().length) {
            errors.push(LOCALE.maketext("You must specify a user name."));
        }
        if (CPANEL.Y.one("#authtype_password").checked || (sessionSetupData.user !== "root" && sessionSetupData.root_escalation_method === "sudo")) {
            sessionSetupData.password = CPANEL.Y.one("#authpass").value;
            if (!sessionSetupData.password.trim().length) {
                errors.push(LOCALE.maketext("You must specify the password for your login."));
            }
        } else {
            var sshkey_name = CPANEL.Y.one("#sshkey_selector");
            if (!sshkey_name) {
                errors.push(LOCALE.maketext("No SSH key has been selected."));
            } else {
                sessionSetupData.sshkey_name = CPANEL.Y.one("#sshkey_selector").value;

                var sshKeyInput = CPANEL.Y.one("#sshkeypass");
                if (sshKeyInput.disabled === false) {
                    sessionSetupData.sshkey_passphrase = sshKeyInput.value;
                    if (!sessionSetupData.sshkey_passphrase.trim().length) {
                        errors.push(LOCALE.maketext("You must specify the key phrase for the selected SSH Key."));
                    }
                }
            }
        }
        if (sessionSetupData.user !== "root") {
            sessionSetupData.root_escalation_method = CPANEL.Y.one("#escmeth_su").checked ? "su" : "sudo";
            if (sessionSetupData.root_escalation_method === "su") {
                sessionSetupData.root_password = CPANEL.Y.one("#rootpass").value;
                if (!sessionSetupData.root_password.trim().length) {
                    errors.push(LOCALE.maketext("You must specify the root password for “su” access."));
                }
            } else if (sessionSetupData.root_escalation_method === "sudo") {
                sessionSetupData.password = CPANEL.Y.one("#authpass").value;
            }
        }

        if (errors.length) {
            validation_notice = new CPANEL.widgets.Dynamic_Page_Notice({
                level: "error",
                content: errors.join("<br />"),
                container: "callback_block"
            });
            setupSSHSessionFailed();
        } else {
            formSubmitButton.disabled = true;
            updateStatusText(LOCALE.maketext("Checking connection …"));

            var checkSSHConnection = function(resolveSSH, rejectSSH) {
                return CPANEL.api({
                    func: "check_remote_ssh_connection",
                    data: checkSshData,
                    callback: {
                        success: function(sshConn) {
                            var resp_data = sshConn.cpanel_data;

                            if (resp_data.server_software) {
                                resolveSSH({
                                    state: state,
                                    formSubmitButton: formSubmitButton,
                                    preChangeText: preChangeText,
                                    sessionSetupData: sessionSetupData,
                                    sshProgressPanel: CPANEL.PAGE.sshProgressPanel
                                });
                            } else {

                                var errorData = resp_data.received ? resp_data.received.html_encode() : LOCALE.maketext("Unknown error; No error sent.");

                                if (!withWSTransport) {
                                    state.checking_ssh = null;
                                    formSubmitButton.disabled = false;
                                    updateStatusText(preChangeText);
                                    var failError = LOCALE.maketext("There is no SSH server listening on “[_1]”: [_2]", checkSshData.host.html_encode() + ":" + checkSshData.port.html_encode(), errorData);
                                    setupSSHSessionFailed();
                                    new CPANEL.widgets.Dynamic_Page_Notice({
                                        content: failError,
                                        level: "warn",
                                        container: "callback_block"
                                    });
                                }

                                rejectSSH(errorData);
                            }

                            state.checking_ssh = null;
                        },
                        failure: function(err) {
                            if (!withWSTransport) {
                                setupSSHSessionFailed();
                                state.checking_ssh = null;
                                formSubmitButton.disabled = false;
                                updateStatusText(preChangeText);
                                new CPANEL.widgets.Dynamic_Page_Notice({
                                    content: err.cpanel_error,
                                    level: "error",
                                    container: "callback_block"
                                });
                            }
                            rejectSSH(err);
                        }
                    }
                });
            };
            if (errors.length) {
                return false;
            } else {
                var sshPromise = new Promise(checkSSHConnection);
                return sshPromise;
            }
        }
    };

    var init = function() {
        handleSshKey();
        handleSuSudo();
        handleAuthRadio();
        handleUserLabel();

        CPANEL.dom.normalize_select_arrows("sshkey_selector");

        EVENT.on(CPANEL.Y.all("input[name='authtype']"), "click", handleSshKey);
        EVENT.on(CPANEL.Y.all("#sshkey_selector"), "change", handleSshKey);
        EVENT.on(CPANEL.Y.all("input[name='escmeth']"), "click", handleSuSudo);
        EVENT.on(CPANEL.Y.all("input[name='auth']"), "click", handleAuthRadio);
        EVENT.on(CPANEL.Y.all("input[name='auth']"), "click", handleUserLabel);
        EVENT.on(CPANEL.Y.all("input[name='authuser']"), "keyup", handleUserLabel);

    };


    EVENT.onDOMReady(init);

})(window);
Back to Directory File Manager