Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/Http/Controllers/AuthController.php
Original file line number Diff line number Diff line change
Expand Up @@ -344,20 +344,20 @@ public function fillEmail(Request $request)
return redirect('/user');
}

public function verify(Request $request)
public function verify(Request $request, User $user)
{
if (!option('require_verification')) {
throw new PrettyPageException(trans('user.verification.disabled'), 1);
}

abort_unless($request->hasValidSignature(false), 403, trans('auth.verify.invalid'));
abort_unless($request->hasValidSignature(false) && hash_equals((string)$request->route('hash'), hash('sha256', $user->email)), 403, trans('auth.verify.invalid'));

return view('auth.verify');
}

public function handleVerify(Request $request, User $user)
{
abort_unless($request->hasValidSignature(false), 403, trans('auth.verify.invalid'));
abort_unless($request->hasValidSignature(false) && hash_equals((string)$request->route('hash'), hash('sha256', $user->email)), 403, trans('auth.verify.invalid'));

['email' => $email] = $request->validate(['email' => 'required|email']);

Expand Down
2 changes: 1 addition & 1 deletion app/Http/Controllers/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public function sendVerificationEmail()
return json(trans('user.verification.verified'), 1);
}

$url = URL::signedRoute('auth.verify', ['user' => $user], null, false);
$url = URL::temporarySignedRoute('auth.verify', Carbon::now()->addHour(), ['user' => $user, 'hash' => hash('sha256', $user->email)], false);

try {
Mail::to($user->email)->send(new EmailVerification(url($url)));
Expand Down
3 changes: 2 additions & 1 deletion app/Listeners/SendEmailVerification.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use App\Mail\EmailVerification;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\URL;

Expand All @@ -12,7 +13,7 @@ class SendEmailVerification
public function handle(User $user)
{
if (option('require_verification')) {
$url = URL::signedRoute('auth.verify', ['user' => $user->uid], null, false);
$url = URL::temporarySignedRoute('auth.verify', Carbon::now()->addHour(), ['user' => $user, 'hash' => hash('sha256', $user->email)], false);

try {
Mail::to($user->email)->send(new EmailVerification(url($url)));
Expand Down
4 changes: 2 additions & 2 deletions routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@
Route::post('bind', 'AuthController@fillEmail')->name('verify');
});

Route::get('verify/{user}', 'AuthController@verify')->name('verify');
Route::post('verify/{user}', 'AuthController@handleVerify')->name('handle.verify');
Route::get('verify/{user}/{hash}', 'AuthController@verify')->name('verify');
Route::post('verify/{user}/{hash}', 'AuthController@handleVerify')->name('handle.verify');
});

Route::prefix('user')
Expand Down
8 changes: 4 additions & 4 deletions tests/HttpTest/ControllersTest/AuthControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -724,25 +724,25 @@ public function testFillEmail()

public function testVerify()
{
$url = URL::signedRoute('auth.verify', ['user' => 1], null, false);
$url = URL::temporarySignedRoute('auth.verify', Carbon::now()->addHour(), ['user' => 1, 'hash' => hash('sha256', 'a@b.c')], false);

// should be forbidden if account verification is disabled
option(['require_verification' => false]);
$this->get($url)->assertSee(trans('user.verification.disabled'));
option(['require_verification' => true]);

// invalid link
$this->get(route('auth.verify', ['user' => 1]))->assertForbidden();
$this->get(route('auth.verify', ['user' => 1, 'hash' => hash('sha256', 'a@b.c')]))->assertForbidden();

$user = User::factory()->create(['verified' => false]);
$url = URL::signedRoute('auth.verify', ['user' => $user], null, false);
$url = URL::temporarySignedRoute('auth.verify', Carbon::now()->addHour(), ['user' => $user, 'hash' => hash('sha256', $user->email)], false);
$this->get($url)->assertViewIs('auth.verify');
}

public function testHandleVerify()
{
$user = User::factory()->create(['verified' => false]);
$url = URL::signedRoute('auth.verify', ['user' => $user], null, false);
$url = URL::temporarySignedRoute('auth.verify', Carbon::now()->addHour(), ['user' => $user, 'hash' => hash('sha256', $user->email)], false);

// empty email
$this->post($url, [], ['Referer' => $url])->assertRedirect($url);
Expand Down
Loading