Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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'), sha1($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'), sha1($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' => sha1($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' => sha1($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' => sha1('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' => sha1('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' => sha1($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' => sha1($user->email)], false);

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