88 lines
2.4 KiB
PHP
88 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Modals;
|
|
|
|
use App\Models\Server;
|
|
use App\Services\SshKeyProvisioner;
|
|
use Livewire\Attributes\Locked;
|
|
use LivewireUI\Modal\ModalComponent;
|
|
|
|
/**
|
|
* Confirm + run the safe "generate key → install → verify → switch credential → disable
|
|
* password login" flow (R5). On success the freshly generated private key is revealed ONCE
|
|
* (download client-side; it is never re-fetchable). The key is also kept encrypted in the vault.
|
|
*/
|
|
class SshKeyProvision extends ModalComponent
|
|
{
|
|
#[Locked]
|
|
public int $serverId;
|
|
|
|
public string $serverName = '';
|
|
|
|
public bool $done = false;
|
|
|
|
public bool $ok = false;
|
|
|
|
public ?string $privateKey = null;
|
|
|
|
public ?string $publicKey = null;
|
|
|
|
public ?string $error = null;
|
|
|
|
public function mount(int $serverId): void
|
|
{
|
|
$this->serverId = $serverId;
|
|
$this->serverName = Server::find($serverId)?->name ?? '';
|
|
}
|
|
|
|
public static function modalMaxWidth(): string
|
|
{
|
|
return 'lg';
|
|
}
|
|
|
|
public function run(SshKeyProvisioner $provisioner): void
|
|
{
|
|
if ($this->done) {
|
|
return;
|
|
}
|
|
|
|
$server = Server::find($this->serverId);
|
|
if (! $server) {
|
|
$this->error = __('common.server_not_found');
|
|
|
|
return;
|
|
}
|
|
|
|
try {
|
|
$result = $provisioner->enableKeyOnlyAccess($server);
|
|
} catch (\Throwable $e) {
|
|
$this->done = true;
|
|
$this->ok = false;
|
|
$this->error = $e->getMessage();
|
|
$this->dispatch('hardeningApplied');
|
|
$this->dispatch('credentialChanged');
|
|
$this->dispatch('notify', message: __('modals.ssh_key_provision.notify_failed'));
|
|
|
|
return;
|
|
}
|
|
|
|
$this->done = true;
|
|
$this->ok = $result['ok'];
|
|
$this->privateKey = $result['privateKey'] ?? null;
|
|
$this->publicKey = $result['publicKey'] ?? null;
|
|
$this->error = $result['ok'] ? null : ($result['error'] ?? __('modals.ssh_key_provision.error_unknown'));
|
|
|
|
$this->dispatch('hardeningApplied');
|
|
$this->dispatch('credentialChanged');
|
|
|
|
$this->dispatch('notify', message: $this->ok
|
|
? __('modals.ssh_key_provision.notify_ok', ['server' => $this->serverName])
|
|
: __('modals.ssh_key_provision.notify_failed'));
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.modals.ssh-key-provision');
|
|
}
|
|
}
|