UNPKG

cisco-vpn-rdp-connecter

Version:

Connect to Cisco AnyConnect VPN and open a Microsoft Remote Desktop (RDP) window

130 lines (129 loc) 5.63 kB
import { Text, Box, useStdin, useInput, } from 'ink'; import React, { useState, useEffect } from 'react'; import SelectInput from 'ink-select-input'; import { getAllCiscoVpnGroups } from '../index.js'; import SuccessMessage from './SuccessMessage.js'; import TextAndInputBox from './TextAndInputBox.js'; import LoadingMessage from './LoadingMessage.js'; const STEPS = { VPN_SERVER: 0, GROUP: 1, USERNAME: 2, PASSWORD: 3, ONLY_VPN: 4, RDP_SERVER: 5, }; const yesNoOptions = [ { label: 'No', value: 'no', }, { label: 'Yes', value: 'yes', }, ]; const isMacOs = process.platform === 'darwin'; export default function SetupCredentials({ onComplete, defaultCredentials }) { const [vpnServer, setVpnServer] = useState(''); const [group, setGroup] = useState({ label: '', value: '' }); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [rdpServer, setRdpServer] = useState(defaultCredentials?.rdp.server || ''); const [onlyVpn, setOnlyVpn] = useState(false); const [step, setStep] = useState(STEPS.VPN_SERVER); const [vpnGroups, setVpnGroups] = useState([]); const { setRawMode } = useStdin(); const [isRetrievingVpnGroups, setIsRetrievingVpnGroups] = useState(false); useEffect(() => { if (step <= STEPS.RDP_SERVER) return; onComplete({ vpn: { server: vpnServer, group: group.value, groupName: group.label, username, password, }, rdp: { server: rdpServer, }, onlyVpn, }); }, [step]); const goToNextStep = () => { setStep(step + 1); /* TODO: without this it moves the input down a line after the `SelectInput` field. It also requires another `enter` keypress to continue. Remove this when fixed. */ setRawMode(true); }; const goToPreviousStep = () => { setStep(step - 1); }; useInput((_input, key) => { const hasPressedBackspace = key.backspace || (isMacOs && key.delete); const canGoBack = step > STEPS.VPN_SERVER; if (hasPressedBackspace && canGoBack) { goToPreviousStep(); } }); const onServerSet = async (inputServer) => { setVpnServer(inputServer); // Show loader when fetching Cisco groups setIsRetrievingVpnGroups(true); const fetchedCiscoGroups = await getAllCiscoVpnGroups(inputServer); const ciscoGroups = fetchedCiscoGroups.map(vpnGroup => ({ value: vpnGroup.number, label: vpnGroup.name, })); setVpnGroups(ciscoGroups); setIsRetrievingVpnGroups(false); goToNextStep(); }; const handleGroupSet = (inputGroup) => { setGroup(inputGroup); goToNextStep(); }; const onUsernameSet = (inputUsername) => { setUsername(inputUsername); goToNextStep(); }; const onPasswordSet = (inputPassword) => { setPassword(inputPassword); goToNextStep(); }; const handleOnlyVpnSet = (inputOnlyVpn) => { setOnlyVpn(inputOnlyVpn.value === 'yes'); // If user only wants VPN, skip RDP server step if (inputOnlyVpn.value === 'yes') { setStep(step + 2); return; } goToNextStep(); }; const onRdpServerSet = (inputRdpServer) => { setRdpServer(inputRdpServer); goToNextStep(); }; // If all steps are completed show "completed" message if (step > STEPS.RDP_SERVER) { return React.createElement(SuccessMessage, { message: "Setup completed" }); } return (React.createElement(React.Fragment, null, step >= STEPS.VPN_SERVER && (React.createElement(React.Fragment, null, React.createElement(TextAndInputBox, { text: "VPN server", defaultText: defaultCredentials?.vpn.server, onSubmit: onServerSet, newCompletionState: step >= STEPS.GROUP }), isRetrievingVpnGroups && (React.createElement(LoadingMessage, { isCompleted: false, loadingMessage: "Retrieving VPN groups for given server", loadedMessage: "" })))), step >= STEPS.GROUP && (step === STEPS.GROUP ? (React.createElement(Box, null, React.createElement(Text, null, "Group: "), React.createElement(SelectInput, { items: vpnGroups, initialIndex: Math.min(Number(defaultCredentials?.vpn.group), vpnGroups.length - 1), onSelect: handleGroupSet }))) : (React.createElement(Text, null, `Group: ${group.label}`))), step >= STEPS.USERNAME && (React.createElement(TextAndInputBox, { text: "Username", defaultText: defaultCredentials?.vpn.username, onSubmit: onUsernameSet, newCompletionState: step >= STEPS.PASSWORD })), step >= STEPS.PASSWORD && (React.createElement(TextAndInputBox, { text: "Password", defaultText: defaultCredentials?.vpn.password, onSubmit: onPasswordSet, mask: "*", newCompletionState: step >= STEPS.RDP_SERVER })), step >= STEPS.ONLY_VPN && (React.createElement(Box, null, React.createElement(Text, null, "Only connect to VPN: "), React.createElement(SelectInput, { items: yesNoOptions, initialIndex: defaultCredentials?.onlyVpn === true ? 1 : 0, onSelect: handleOnlyVpnSet }))), step >= STEPS.RDP_SERVER && (React.createElement(TextAndInputBox, { text: "RDP server", defaultText: defaultCredentials?.rdp.server, onSubmit: onRdpServerSet, newCompletionState: step >= STEPS.ONLY_VPN })))); }