feat: create email verification (#1575)

* feat: create email verification

* Change setting toggle to config/phpvms.php

* Fix style

* Default verification enabled and verify first user

* Fix style

---------

Co-authored-by: Nabeel S <nabeelio@users.noreply.github.com>
This commit is contained in:
Arthur Hetem 2023-08-15 17:36:42 -03:00 committed by GitHub
parent 41758ed84a
commit 13fb14a787
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 23 deletions

View File

@ -0,0 +1,20 @@
<?php
use App\Models\User;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class() extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('email_verified_at')->nullable();
});
User::where('email_verified_at', null)->update(['email_verified_at' => now()]);
}
};

View File

@ -485,4 +485,4 @@
value: true
options: ''
type: boolean
description: Send out a discord notification when a user's rank is changed
description: Send out a discord notification when a user's rank is changed

View File

@ -24,7 +24,7 @@ class VerificationController extends Controller
*
* @var string
*/
protected $redirectTo = '/home';
protected $redirectTo = '/dashboard';
/**
* Create a new controller instance.

View File

@ -304,12 +304,13 @@ class InstallerController extends Controller
* KAUS, for giggles, though.
*/
$attrs = [
'name' => $request->get('name'),
'email' => $request->get('email'),
'api_key' => Utils::generateApiKey(),
'airline_id' => $airline->id,
'password' => Hash::make($request->get('password')),
'opt_in' => true,
'name' => $request->get('name'),
'email' => $request->get('email'),
'api_key' => Utils::generateApiKey(),
'airline_id' => $airline->id,
'password' => Hash::make($request->get('password')),
'opt_in' => true,
'email_verified_at' => now(),
];
$user = $this->userService->createUser($attrs, ['admin']);

View File

@ -13,6 +13,7 @@ use App\Http\Middleware\TrustProxies;
use App\Http\Middleware\UpdatePending;
use Illuminate\Auth\Middleware\Authenticate;
use Illuminate\Auth\Middleware\Authorize;
use Illuminate\Auth\Middleware\EnsureEmailIsVerified;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
@ -20,6 +21,7 @@ use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
use Illuminate\Foundation\Http\Middleware\TrimStrings;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Illuminate\Routing\Middleware\ValidateSignature;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\View\Middleware\ShareErrorsFromSession;
@ -61,5 +63,7 @@ class Kernel extends HttpKernel
'theme' => SetActiveTheme::class,
'throttle' => ThrottleRequests::class,
'update_pending' => UpdatePending::class,
'verified' => EnsureEmailIsVerified::class,
'signed' => ValidateSignature::class,
];
}

View File

@ -4,6 +4,7 @@ namespace App\Models;
use App\Models\Enums\JournalType;
use App\Models\Traits\JournalTrait;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -62,7 +63,7 @@ use Staudenmeir\EloquentHasManyDeep\HasRelationships;
* @mixin \Illuminate\Notifications\Notifiable
* @mixin \Laratrust\Traits\HasRolesAndPermissions
*/
class User extends Authenticatable implements LaratrustUser
class User extends Authenticatable implements LaratrustUser, MustVerifyEmail
{
use HasFactory;
use HasRelationships;
@ -109,6 +110,7 @@ class User extends Authenticatable implements LaratrustUser
'notes',
'created_at',
'updated_at',
'email_verified_at',
];
/**
@ -127,18 +129,19 @@ class User extends Authenticatable implements LaratrustUser
];
protected $casts = [
'id' => 'integer',
'pilot_id' => 'integer',
'flights' => 'integer',
'flight_time' => 'integer',
'transfer_time' => 'integer',
'balance' => 'double',
'state' => 'integer',
'status' => 'integer',
'toc_accepted' => 'boolean',
'opt_in' => 'boolean',
'lastlogin_at' => 'datetime',
'deleted_at' => 'datetime',
'id' => 'integer',
'pilot_id' => 'integer',
'flights' => 'integer',
'flight_time' => 'integer',
'transfer_time' => 'integer',
'balance' => 'double',
'state' => 'integer',
'status' => 'integer',
'toc_accepted' => 'boolean',
'opt_in' => 'boolean',
'lastlogin_at' => 'datetime',
'deleted_at' => 'datetime',
'email_verified_at' => 'datetime',
];
public static $rules = [

View File

@ -110,7 +110,7 @@ class RouteServiceProvider extends ServiceProvider
'namespace' => 'Frontend',
'prefix' => '',
'as' => 'frontend.',
'middleware' => ['auth'],
'middleware' => (config('phpvms.registration.email_verification', false) ? ['auth', 'verified'] : ['auth']),
], function () {
Route::resource('dashboard', 'DashboardController');

View File

@ -119,4 +119,11 @@ return [
'load_factor' => '/operations/flights#load-factor',
'subfleets' => '/concepts/basics#subfleets-and-aircraft',
],
/*
* Enable/disable email verification on registration
*/
'registration' => [
'email_verification' => true,
],
];

View File

@ -1,4 +1,4 @@
@extends('layouts.app')
@extends('app')
@section('content')
<div class="container">