fix: better invitation errors

This commit is contained in:
Andras Bacsai
2024-11-07 12:32:23 +01:00
parent 4ce8d04a13
commit a297c9fcab
5 changed files with 36 additions and 9 deletions

View File

@@ -110,13 +110,19 @@ class Controller extends BaseController
return redirect()->route('login')->with('error', 'Invalid credentials.'); return redirect()->route('login')->with('error', 'Invalid credentials.');
} }
public function accept_invitation() public function acceptInvitation()
{ {
$resetPassword = request()->query('reset-password'); $resetPassword = request()->query('reset-password');
$invitationUuid = request()->route('uuid'); $invitationUuid = request()->route('uuid');
$invitation = TeamInvitation::whereUuid($invitationUuid)->firstOrFail(); $invitation = TeamInvitation::whereUuid($invitationUuid)->firstOrFail();
$user = User::whereEmail($invitation->email)->firstOrFail(); $user = User::whereEmail($invitation->email)->firstOrFail();
if (Auth::id() !== $user->id) {
abort(400, 'You are not allowed to accept this invitation.');
}
$invitationValid = $invitation->isValid(); $invitationValid = $invitation->isValid();
if ($invitationValid) { if ($invitationValid) {
if ($resetPassword) { if ($resetPassword) {
$user->update([ $user->update([
@@ -131,14 +137,12 @@ class Controller extends BaseController
} }
$user->teams()->attach($invitation->team->id, ['role' => $invitation->role]); $user->teams()->attach($invitation->team->id, ['role' => $invitation->role]);
$invitation->delete(); $invitation->delete();
if (Auth::id() !== $user->id) {
return redirect()->route('login');
}
refreshSession($invitation->team); refreshSession($invitation->team);
return redirect()->route('team.index'); return redirect()->route('team.index');
} else { } else {
abort(401); abort(400, 'Invitation expired.');
} }
} }

View File

@@ -28,8 +28,8 @@ class TeamInvitation extends Model
public function isValid() public function isValid()
{ {
$createdAt = $this->created_at; $createdAt = $this->created_at;
$diff = $createdAt->diffInMinutes(now()); $diff = $createdAt->diffInDays(now());
if ($diff <= config('constants.invitation.link.expiration')) { if ($diff <= config('constants.invitation.link.expiration_days')) {
return true; return true;
} else { } else {
$this->delete(); $this->delete();

View File

@@ -19,7 +19,7 @@ return [
'invitation' => [ 'invitation' => [
'link' => [ 'link' => [
'base_url' => '/invitations/', 'base_url' => '/invitations/',
'expiration' => 10, 'expiration_days' => 0,
], ],
], ],
'services' => [ 'services' => [

View File

@@ -0,0 +1,23 @@
@extends('layouts.base')
<div class="flex flex-col items-center justify-center h-full">
<div>
<p class="font-mono font-semibold text-7xl dark:text-warning">400</p>
<h1 class="mt-4 font-bold tracking-tight dark:text-white">Bad Request</h1>
@if ($exception->getMessage())
<p class="text-base leading-7 text-red-500">{{ $exception->getMessage() }}</p>
@else
<p class="text-base leading-7 text-neutral-300">The request could not be understood by the server due to
malformed syntax.
</p>
@endif
<div class="flex items-center mt-10 gap-x-6">
<a href="/">
<x-forms.button>Go back home</x-forms.button>
</a>
<a target="_blank" class="text-xs" href="{{ config('coolify.contact') }}">Contact
support
<x-external-link />
</a>
</div>
</div>
</div>

View File

@@ -164,7 +164,7 @@ Route::middleware(['auth', 'verified'])->group(function () {
})->name('terminal.auth'); })->name('terminal.auth');
Route::prefix('invitations')->group(function () { Route::prefix('invitations')->group(function () {
Route::get('/{uuid}', [Controller::class, 'accept_invitation'])->name('team.invitation.accept'); Route::get('/{uuid}', [Controller::class, 'acceptInvitation'])->name('team.invitation.accept');
Route::get('/{uuid}/revoke', [Controller::class, 'revoke_invitation'])->name('team.invitation.revoke'); Route::get('/{uuid}/revoke', [Controller::class, 'revoke_invitation'])->name('team.invitation.revoke');
}); });