From 689d1f1738a25aef008be4e8f719c2cd3e89397e Mon Sep 17 00:00:00 2001 From: Lewis Larsen Date: Sun, 7 Jul 2024 09:26:00 +0100 Subject: [PATCH] feat: added button to generate ssh keys --- app/Livewire/Other/GenerateSSHKeysButton.php | 45 +++++++++++++++++++ resources/views/layouts/app.blade.php | 1 + .../other/generate-ssh-keys-button.blade.php | 6 +++ .../Other/GenerateSSHKeysButtonTest.php | 45 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 app/Livewire/Other/GenerateSSHKeysButton.php create mode 100644 resources/views/livewire/other/generate-ssh-keys-button.blade.php create mode 100644 tests/Feature/Livewire/Other/GenerateSSHKeysButtonTest.php diff --git a/app/Livewire/Other/GenerateSSHKeysButton.php b/app/Livewire/Other/GenerateSSHKeysButton.php new file mode 100644 index 00000000..86637ebf --- /dev/null +++ b/app/Livewire/Other/GenerateSSHKeysButton.php @@ -0,0 +1,45 @@ +checkAdmin()) { + return; + } + + // All the key generation is handled in this command. + // We're providing a button as a wrapper to help. + Artisan::call('vanguard:generate-ssh-key'); + + Log::info('SSH key generation initiated via button.', ['user_id' => Auth::id()]); + + Toaster::success(__('SSH key generation started. Please reload the page.')); + } + + public function render(): View + { + return view('livewire.other.generate-ssh-keys-button'); + } + + private function checkAdmin(): bool + { + if (! Auth::user()?->isAdmin()) { + Toaster::error(__('You are not authorized to generate SSH keys.')); + Log::error('Non-admin user attempted to generate SSH keys.', ['user_id' => Auth::id()]); + + return false; + } + + return true; + } +} diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 4c7172af..427d479d 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -51,6 +51,7 @@ {{ __('to create your SSH key.') }} + @livewire('other.generate-ssh-keys-button') @endif diff --git a/resources/views/livewire/other/generate-ssh-keys-button.blade.php b/resources/views/livewire/other/generate-ssh-keys-button.blade.php new file mode 100644 index 00000000..dfb9f5a8 --- /dev/null +++ b/resources/views/livewire/other/generate-ssh-keys-button.blade.php @@ -0,0 +1,6 @@ +
+ +
diff --git a/tests/Feature/Livewire/Other/GenerateSSHKeysButtonTest.php b/tests/Feature/Livewire/Other/GenerateSSHKeysButtonTest.php new file mode 100644 index 00000000..340432f0 --- /dev/null +++ b/tests/Feature/Livewire/Other/GenerateSSHKeysButtonTest.php @@ -0,0 +1,45 @@ +assertStatus(200); +}); + +test('an administrator can click the button', function (): void { + Toaster::fake(); + Config::set('auth.admin_email_addresses', ['admin@email.com']); + + $user = User::factory()->create(['email' => 'admin@email.com']); + + $this->actingAs($user); + + Artisan::shouldReceive('call') + ->once() + ->with('vanguard:generate-ssh-key') + ->andReturn(0); + + Livewire::test(GenerateSSHKeysButton::class) + ->call('generateKeys'); + + $this->assertTrue($user->isAdmin()); + + Toaster::assertDispatched(__('SSH key generation started. Please reload the page.')); +}); + +test('a regular user cannot click the button', function (): void { + Toaster::fake(); + + $user = User::factory()->create(); + + $this->actingAs($user); + + Livewire::test(GenerateSSHKeysButton::class) + ->call('generateKeys'); + + Toaster::assertDispatched(__('You are not authorized to generate SSH keys.')); + $this->assertFalse($user->isAdmin()); +});