import { useState } from 'react' import { Link } from 'react-router-dom' import { ChevronLeft, Terminal, ShieldCheck, ShieldOff } from 'lucide-react' import { api } from '../../api/client' import AccountPicker, { type PickedAccount } from './AccountPicker' export default function ShellAccess() { const [selected, setSelected] = useState(null) const [shell, setShell] = useState('/usr/sbin/nologin') const [loading, setLoading] = useState(false) const [message, setMessage] = useState('') const [error, setError] = useState('') const handleSelect = async (acc: PickedAccount) => { setSelected(acc); setMessage(''); setError('') try { const r = await api.get(`/nixserver/accounts/${acc.id}`) setShell(r.data.data.shell ?? '/usr/sbin/nologin') } catch { setShell('/usr/sbin/nologin') } } const toggle = async (enable: boolean) => { if (!selected) return setLoading(true); setMessage(''); setError('') try { const r = await api.put(`/nixserver/accounts/${selected.id}/shell`, { enabled: enable }) setShell(r.data.data.shell) setMessage(enable ? `Shell access enabled for "${selected.username}".` : `Shell access disabled for "${selected.username}".`) } catch (e: unknown) { setError((e as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Action failed') } finally { setLoading(false) } } const hasShell = shell === '/bin/bash' || shell === '/bin/sh' return (
Accounts / Manage Shell Access

Manage Shell Access

Grant or revoke SSH shell access for hosting accounts.

{selected && (

{selected.username}

shell: {shell}

{hasShell ? 'Shell enabled' : 'No shell'}
{hasShell ? (
This account has SSH access via {shell}. Disabling sets shell to /usr/sbin/nologin.
) : (
No shell access. Enabling will set the shell to /bin/bash.
)}
)} {message && (

{message}

)} {error && (

{error}

)}
) }