email verification review

This commit is contained in:
Peter Papp
2021-07-15 13:55:49 +02:00
parent edfcf8e1bd
commit 157427c750
21 changed files with 323 additions and 12247 deletions

View File

@@ -51,7 +51,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -250,7 +250,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -449,7 +449,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -648,7 +648,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -847,7 +847,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1046,7 +1046,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1245,7 +1245,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1444,7 +1444,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1643,7 +1643,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -1842,7 +1842,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,
@@ -2041,7 +2041,7 @@ namespace PHPSTORM_META {
'Illuminate\Session\Middleware\StartSession' => \Illuminate\Session\Middleware\StartSession::class,
'Illuminate\Testing\ParallelTesting' => \Illuminate\Testing\ParallelTesting::class,
'LaravelCrawlerDetect' => \Jaybizzle\CrawlerDetect\CrawlerDetect::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUser::class,
'Laravel\Fortify\Contracts\CreatesNewUsers' => \App\Actions\Fortify\CreateNewUserAction::class,
'Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse' => \Laravel\Fortify\Http\Responses\FailedPasswordConfirmationResponse::class,
'Laravel\Fortify\Contracts\FailedTwoFactorLoginResponse' => \Laravel\Fortify\Http\Responses\FailedTwoFactorLoginResponse::class,
'Laravel\Fortify\Contracts\LockoutResponse' => \Laravel\Fortify\Http\Responses\LockoutResponse::class,

View File

@@ -1,106 +0,0 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use App\Models\Setting;
use App\Models\UserSettings;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Auth\StatefulGuard;
use Laravel\Fortify\Contracts\CreatesNewUsers;
use Laravel\Fortify\Contracts\RegisterResponse;
class CreateNewUser implements CreatesNewUsers
{
use PasswordValidationRules;
/**
* The guard implementation.
*
* @var \Illuminate\Contracts\Auth\StatefulGuard
*/
protected $guard;
/**
* Create a new controller instance.
*
* @param \Illuminate\Contracts\Auth\StatefulGuard $guard
* @return void
*/
public function __construct(StatefulGuard $guard)
{
$this->guard = $guard;
}
/**
* Validate and create a newly registered user.
*
* @param array $input
* @return \App\Models\User
*/
public function create(array $input)
{
$settings = Setting::whereIn('name', ['storage_default', 'registration'])
->pluck('value', 'name');
// Check if account registration is enabled
if (! intval($settings['registration'])) {
abort(401);
}
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
$user = User::create([
'email' => $input['email'],
'password' => bcrypt($input['password']),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $input['name'],
'storage_capacity' => $settings['storage_default'],
]);
if(!get_setting('user_verification')) {
$user->markEmailAsVerified();
}
UserSettings::reguard();
return $user;
}
/**
* Create a new registered user.
*
* @param \Illuminate\Http\Request $request
* @param \Laravel\Fortify\Contracts\CreatesNewUsers $creator
* @return \Laravel\Fortify\Contracts\RegisterResponse
*/
public function store(Request $request,
CreatesNewUsers $creator): RegisterResponse
{
event(new Registered($user = $creator->create($request->all())));
if(! get_setting('user_verification')) {
$this->guard->login($user);
};
return app(RegisterResponse::class);
}
}

View File

@@ -0,0 +1,79 @@
<?php
namespace App\Actions\Fortify;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Setting;
use App\Models\UserSettings;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Validation\Rule;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\Auth\StatefulGuard;
class CreateNewUserAction extends Controller
{
use PasswordValidationRules;
public function __construct(
protected StatefulGuard $guard
) {}
/**
* Validate and create a newly registered user.
*/
public function __invoke(Request $request): Response
{
$settings = Setting::whereIn('name', [
'storage_default', 'registration'
])
->pluck('value', 'name');
// Check if account registration is enabled
if (!intval($settings['registration'])) {
abort(401);
}
Validator::make($request->all(), [
'name' => ['required', 'string', 'max:255'],
'email' => [
'required',
'string',
'email',
'max:255',
Rule::unique(User::class),
],
'password' => $this->passwordRules(),
])->validate();
$user = User::create([
'email' => $request->email,
'password' => bcrypt($request->password),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $request->name,
'storage_capacity' => $settings['storage_default'],
]);
if (!get_setting('user_verification')) {
$user->markEmailAsVerified();
}
UserSettings::reguard();
event(new Registered($user));
if (!get_setting('user_verification')) {
$this->guard->login($user);
}
return response('User registered successfully', 201);
}
}

View File

@@ -43,7 +43,7 @@ class Kernel extends ConsoleKernel
$schedule->call(function () use ($scheduler) {
$scheduler->delete_unverified_users();
})->everySixHours();
})->daily();
// Run queue jobs every minute
$schedule->command('queue:work --stop-when-empty')

View File

@@ -1,10 +1,10 @@
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Lang;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{

View File

@@ -1,11 +1,14 @@
<?php
namespace App\Http\Controllers\User;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use App\Services\DemoService;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\InvoiceCollection;
use Illuminate\Support\Facades\Validator;
@@ -13,6 +16,7 @@ use App\Http\Resources\UserStorageResource;
use Illuminate\Contracts\Routing\ResponseFactory;
use App\Http\Requests\User\UpdateUserPasswordRequest;
use App\Http\Requests\User\UserCreateAccessTokenRequest;
use Illuminate\Support\Str;
use Laravel\Sanctum\PersonalAccessToken;
class AccountController extends Controller
@@ -131,10 +135,8 @@ class AccountController extends Controller
/**
* Get all user tokens
*
* @return Collection
*/
public function tokens_index()
public function tokens(): Response
{
return response(
Auth::user()->tokens()->get(),
@@ -142,35 +144,30 @@ class AccountController extends Controller
);
}
/**
* Create token
*
* @param Request $request
* @return Collection
*/
public function create_token(UserCreateAccessTokenRequest $request)
public function create_token(UserCreateAccessTokenRequest $request): Response
{
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
abort_if(is_demo_account('howdy@hi5ve.digital'), 201, [
"name" => "token",
"token" => Str::random(40),
"abilities" => '["*"]',
"tokenable_id" => Str::uuid(),
"updated_at" => now(),
"created_at" => now(),
"id" => Str::random(40),
]);
return response(
Auth::user()->createToken($request->input('name')),
201
);
$token = Auth::user()->createToken($request->input('name'));
return response($token, 201);
}
/**
* Revoke token
*
* @param $id
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function revoke_token(PersonalAccessToken $token)
public function revoke_token(PersonalAccessToken $token): Response
{
// Check if is demo
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Deleted!');
if(Auth::user()->id !== $token->tokenable_id) {
if (Auth::id() !== $token->tokenable_id) {
return response('Unauthorized', 401);
}
@@ -179,17 +176,10 @@ class AccountController extends Controller
return response('Deleted!', 204);
}
/**
* Email verification
*
* @param Request $request
* @param User $user
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function email_verify($id, Request $request)
public function email_verification(string $id, Request $request): RedirectResponse|Response
{
if (!$request->hasValidSignature()) {
return response("Invalid/Expired url provided.", 401);
return response("Invalid or expired url provided.", 401);
}
$user = User::find($id);
@@ -201,21 +191,16 @@ class AccountController extends Controller
return redirect()->to('/successfully-verified');
}
/**
* Resend verification email
*
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function resend_verify_email(Request $request)
public function resend_verification_email(Request $request): Response
{
$user = User::whereEmail($request->input('email'))->first();
if ($user->hasVerifiedEmail()) {
return response("Email already verified.", 204);
return response("Email was already verified.", 204);
}
$user->sendEmailVerificationNotification();
return response("Email verification link sent on your email", 200);
return response("Email verification link sent to your email", 204);
}
}

View File

@@ -3,7 +3,7 @@ namespace App\Providers;
use Illuminate\Http\Request;
use Laravel\Fortify\Fortify;
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\CreateNewUserAction;
use Illuminate\Support\ServiceProvider;
use Illuminate\Cache\RateLimiting\Limit;
use App\Actions\Fortify\ResetUserPassword;
@@ -29,7 +29,6 @@ class FortifyServiceProvider extends ServiceProvider
*/
public function boot()
{
Fortify::createUsersUsing(CreateNewUser::class);
Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
Fortify::resetUserPasswordsUsing(ResetUserPassword::class);

View File

@@ -13,7 +13,7 @@ class RouteServiceProvider extends ServiceProvider
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
protected $namespace = null;
/**
* The path to the "home" route for your application.
@@ -22,16 +22,6 @@ class RouteServiceProvider extends ServiceProvider
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
parent::boot();
}
/**
* Define the routes for the application.
*

View File

@@ -77,17 +77,13 @@ class SchedulerService
}
/**
* Delete unverified users older as 30 days
* Delete unverified users older than 30 days
*/
public function delete_unverified_users(): void
{
User::where('created_at', '<=', now()->subDay(30)->toDateString())
User::where('created_at', '<=', now()->subDays(30)->toDateString())
->where('email_verified_at', null)
->get()
->each(function ($user) {
// Delete users
$user->delete();
});
->each(fn ($user) => $user->delete());
}
}

View File

@@ -10,39 +10,39 @@
"require": {
"php": "^8.0",
"ext-json": "*",
"brianium/paratest": "^6.2",
"brianium/paratest": "^6.3",
"cartalyst/stripe-laravel": "^13.1",
"doctrine/dbal": "^2.12.1",
"doctrine/dbal": "^2.13.2",
"fideloper/proxy": "^4.4.1",
"fruitcake/laravel-cors": "^2.0.3",
"fruitcake/laravel-cors": "^2.0.4",
"gabrielelana/byte-units": "^0.5.0",
"guzzlehttp/guzzle": "^7.2.0",
"intervention/image": "^2.5.1",
"guzzlehttp/guzzle": "^7.3.0",
"intervention/image": "^2.6.0",
"jaybizzle/laravel-crawler-detect": "^1.2",
"kyslik/column-sortable": "^6.4",
"laravel/cashier": "^12.9.1",
"laravel/fortify": "^1.7.7",
"laravel/framework": "^8.30.1",
"laravel/sanctum": "^2.9",
"kyslik/column-sortable": "^6.4.1",
"laravel/cashier": "^12.15.0",
"laravel/fortify": "^1.7.14",
"laravel/framework": "^8.50.0",
"laravel/sanctum": "^2.11.2",
"laravel/tinker": "^2.6.1",
"laravel/ui": "^3.2.0",
"league/flysystem-aws-s3-v3": "^1.0.29",
"league/flysystem-cached-adapter": "^1.1.0",
"madnest/madzipper": "^1.1.0",
"spatie/laravel-backup": "^6.15",
"spatie/laravel-tail": "^4.3",
"teamtnt/laravel-scout-tntsearch-driver": "^11.1.0",
"vimeo/psalm": "^4.7"
"spatie/laravel-backup": "^6.16.1",
"spatie/laravel-tail": "^4.3.3",
"teamtnt/laravel-scout-tntsearch-driver": "^11.5.0.0",
"vimeo/psalm": "^4.8.1"
},
"require-dev": {
"ext-json": "*",
"friendsofphp/php-cs-fixer": "^3.0",
"barryvdh/laravel-ide-helper": "^2.9",
"facade/ignition": "^2.5.14",
"fakerphp/faker": "^1.14.1",
"barryvdh/laravel-ide-helper": "^2.10",
"facade/ignition": "^2.11.0",
"fakerphp/faker": "^1.15.0",
"mockery/mockery": "^1.4.3",
"nunomaduro/collision": "^5.3.0",
"phpunit/phpunit": "^9.5.2"
"nunomaduro/collision": "^5.5.0",
"phpunit/phpunit": "^9.5.6"
},
"config": {
"optimize-autoloader": true,

11931
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -480,8 +480,8 @@ return [
'page_not_verified.resend_button' => 'Resend verification email.',
'page_email_successfully_verified.title' => 'Your account was successfully verified!',
'page_email_successfully_verified.subtitle' => 'Now you can log in.',
'page_email_successfully_send.title' => 'Email was successfully send!',
'page_email_successfully_send.subtitle' => 'Check your email address where was the email send.',
'page_email_successfully_send.title' => 'Verification email was successfully send!',
'page_email_successfully_send.subtitle' => 'Check your email address where the email was send.',
'popup_create_folder.folder_default_name' => 'New Folder',
'popup_create_folder.label' => 'Type Name',
'popup_create_folder.placeholder' => 'Type your name',
@@ -686,5 +686,6 @@ return [
'app_touch_icon' => 'App Touch Icon',
'app_touch_icon_description' => 'If user store bookmark on his phone screen, this icon appear in app thumbnail. Preferred size is 156x156',
'select_search_placeholder' => 'Search in list...',
'go_home' => 'Go to the homepage',
],
];

View File

@@ -1,95 +1,102 @@
{
"/js/main.js": "/js/main.js",
"/css/app.css": "/css/app.css",
"/chunks/admin.js": "/chunks/admin.js?id=db23a3d539fec4b03c65",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=ca3bdda58d0bb26a896c",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=789a8508d6219be0904d",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~7d45cb3e.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~7d45cb3e.js?id=6c5491727f3a920ce38d",
"/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js?id=1d83683f5afa0abb114d",
"/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=e1f223fd5412173ed827",
"/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js?id=2647d05d2a105cac3f0f",
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=ae0bb7e684c857693aa8",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=ea0cb4ec8487af4776eb",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=3b66bd631241fe5466ed",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=69d6fefe404b9ec4f0de",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=07a6859a69c14d4bc289",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=b8f2628bc5946089d58a",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=8db305db2a42878cb243",
"/chunks/app-email.js": "/chunks/app-email.js?id=21f1982949085b513cd4",
"/chunks/app-index.js": "/chunks/app-index.js?id=ed459a1ea3fa89d3de30",
"/chunks/app-language.js": "/chunks/app-language.js?id=3e30d578c3d751351eb9",
"/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js": "/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js?id=53e545b823ce2e687b31",
"/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js?id=e3df08bfa100e0216a95",
"/chunks/app-others.js": "/chunks/app-others.js?id=28f3ddde79d9fac1d6c0",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=54d9bf8fc371179f295b",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=7036abc45d63af4fe972",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=94f462aaa7a7e7dcd03d",
"/chunks/billings-detail.js": "/chunks/billings-detail.js?id=d25da896180b673d0ff1",
"/chunks/contact-us.js": "/chunks/contact-us.js?id=f317578eda4c05b98d7f",
"/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js?id=023e6b0ad58fa1dc5bc6",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=86c558e2cb256bda86c3",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=e2a93e2ceb83cab77b77",
"/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=8e86179595c935837731",
"/chunks/database.js": "/chunks/database.js?id=b86430381b515d8d220a",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=2167671fe3099f75ecfe",
"/chunks/email-verified.js": "/chunks/email-verified.js?id=3166a561f7fac48f4a66",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=575db3cd8ad3a9ce6c37",
"/chunks/files.js": "/chunks/files.js?id=b852156f00c07bcd55aa",
"/chunks/files~chunks/platform~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared/file-browser.js?id=c1af7637432594f4a242",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=e5133c50af3101591521",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=39824e4246c795c46ed9",
"/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js": "/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js?id=fdeb2974fe93fe48a7c0",
"/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=ba95a545dbdf9a00995d",
"/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js?id=eb1d55596ca638768696",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=ebcbbc0115c1589dcca5",
"/chunks/homepage.js": "/chunks/homepage.js?id=b62a9ad724d34bcbc44d",
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=63a8701083fa67e7c689",
"/chunks/invoices.js": "/chunks/invoices.js?id=b1ba41c331f013837e2d",
"/chunks/not-found.js": "/chunks/not-found.js?id=e795bd0f98216a25dc06",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=88b6d026ec4d3794aa1a",
"/chunks/pages.js": "/chunks/pages.js?id=2373f18eb236bf6775fa",
"/chunks/plan.js": "/chunks/plan.js?id=fd5882a90b4705a172f2",
"/chunks/plan-create.js": "/chunks/plan-create.js?id=47c71e0ae08db8d11c52",
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=0e8ea332703dcae2fbdd",
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=2b856bf8204afcea4078",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=bc757f00e838ebeddad0",
"/chunks/plans.js": "/chunks/plans.js?id=36ebc380b6e7773a04ff",
"/chunks/platform.js": "/chunks/platform.js?id=5a0101097d87433a7986",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=2224a6de276a2edc346b",
"/chunks/profile.js": "/chunks/profile.js?id=20236b41dd811bfd492c",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=f532862b4c362de67360",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=f708db10063dd6c0a864",
"/chunks/settings.js": "/chunks/settings.js?id=862f21eca40d822b2190",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=aa81750b0d9e206d5ee9",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=3810f765b5305c2ce25c",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=82b0855d47725e3af2df",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=c3c536eec45ffbbc77f4",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=ee860273cc027ffa83c1",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=d15d2096bcf308b21a50",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=d90814559910a424902d",
"/chunks/shared.js": "/chunks/shared.js?id=de5b7595a352f2614b55",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=238c362399a4018549bd",
"/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=d630c473dc6b751ec50f",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=040a7241ea133456200c",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=7400cf64cbdf59ff0e65",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=4145fb89140eac0c34a4",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=20721ca146c27a67bccd",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=d21cbdb1cee9197323c3",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=de43eac3b1627e00424d",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=114cd615807f23990197",
"/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=75510b0f500e49b263d1",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=e75ca6ec0b01b9bead51",
"/chunks/user.js": "/chunks/user.js?id=a73470995a4ae3fd2881",
"/chunks/user-create.js": "/chunks/user-create.js?id=b051dfa4977253898319",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=a0782d05787effe95383",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=ff37a70a549fccc51dfc",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=fb09652ecb27af5f3b10",
"/chunks/user-password.js": "/chunks/user-password.js?id=c6b39bbd4e2cf6175864",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=bef79e67371f255f883e",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=c64145dfa85586f564b0",
"/chunks/users.js": "/chunks/users.js?id=0652fa00a2b955a7c591",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js?id=57c854adb91ed9a9d088",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js?id=170765b4fd923b62195c",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=ca01bfe1656f58710763",
"/vendors~chunks/platform~chunks/shared.js": "/vendors~chunks/platform~chunks/shared.js?id=eb141834bc24b72d8e92"
"/chunks/admin.js": "/chunks/admin.js?id=baf8a45b3c1d04f09229",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=61bd29aac87199e45174",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=d21b5946c88a87e9099d",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a7b1c983.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a7b1c983.js?id=b80fc9fc5b08a9c60e2e",
"/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js?id=b26eff2899df7f85229d",
"/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=146db62ff2aa25c39386",
"/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared/file-browser.js?id=e23621e57bab3e9e349a",
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=4da2e03f6f01c274a7cc",
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=7611512975ed49edb61f",
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=b709bf1d7c3cd24f9529",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=075ff381293e1a20d167",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=5f27527c258dada4aeb9",
"/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=b6c9565875974d8c350c",
"/chunks/app-billings.js": "/chunks/app-billings.js?id=b23ac97d9e65beff5fc6",
"/chunks/app-email.js": "/chunks/app-email.js?id=35afede5ea121718e2cc",
"/chunks/app-index.js": "/chunks/app-index.js?id=0d8a74f6041001c36ab3",
"/chunks/app-language.js": "/chunks/app-language.js?id=8f77e8eebf32943fdf4b",
"/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js": "/chunks/app-language~chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pag~824d674f.js?id=2551061f37c2a8056921",
"/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~934b6779.js?id=cecfc7ab2626eb4e988f",
"/chunks/app-others.js": "/chunks/app-others.js?id=a16de82f2298df235166",
"/chunks/app-payments.js": "/chunks/app-payments.js?id=245920077be074208693",
"/chunks/app-settings.js": "/chunks/app-settings.js?id=d57e806c59d1aef2eb3a",
"/chunks/app-setup.js": "/chunks/app-setup.js?id=526bb7b757956f6c70c3",
"/chunks/billings-detail.js": "/chunks/billings-detail.js?id=3805f23ba0a474ce7b4e",
"/chunks/contact-us.js": "/chunks/contact-us.js?id=67b977184f0744593de9",
"/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js?id=2a8def187ec322eb760e",
"/chunks/create-new-password.js": "/chunks/create-new-password.js?id=72d02c781aa8e6295069",
"/chunks/dashboard.js": "/chunks/dashboard.js?id=a7aef88def02bf2fec08",
"/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=1027aa9c1e090b196d29",
"/chunks/database.js": "/chunks/database.js?id=27ab279a8b380da7a0e8",
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=1141f8e183483da82e8a",
"/chunks/email-verified.js": "/chunks/email-verified.js?id=60a7eabffc13b2fe48e0",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=3e657a9476a8596396b3",
"/chunks/files.js": "/chunks/files.js?id=54c6dddb471986e202f3",
"/chunks/files~chunks/platform~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared/file-browser.js?id=b5e21d1b7386c6551aa2",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser.js?id=3b96cba1e5482e4c33d4",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=48f4f2c0aa3064162ad9",
"/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js": "/chunks/files~chunks/settings-subscription~chunks/shared/file-browser~chunks/user-subscription.js?id=1b96ff16168a192ea787",
"/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=221f9578098058fc4c4a",
"/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared/file-browser~chunks/shared/single-file.js?id=a6be7116bbdadfb8b1cc",
"/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=96019e230f0c5b59478a",
"/chunks/homepage.js": "/chunks/homepage.js?id=5a299216398f59a4947b",
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=12cbea54eb6f5b94606c",
"/chunks/invoices.js": "/chunks/invoices.js?id=35179ba2b74cdaf74492",
"/chunks/not-found.js": "/chunks/not-found.js?id=3f0c127b00d113541acc",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=761c916a5efdee5ffddd",
"/chunks/pages.js": "/chunks/pages.js?id=7b3c7ee8c586e73fe65a",
"/chunks/plan.js": "/chunks/plan.js?id=c4cc3da1bedaa9139087",
"/chunks/plan-create.js": "/chunks/plan-create.js?id=2a672b390de82eb8cef6",
"/chunks/plan-delete.js": "/chunks/plan-delete.js?id=f00946b7df419813f099",
"/chunks/plan-settings.js": "/chunks/plan-settings.js?id=dbc08f8cdc23900ef40a",
"/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=8c4b655b9286e06894c5",
"/chunks/plans.js": "/chunks/plans.js?id=2b26173a02ed9f86e875",
"/chunks/platform.js": "/chunks/platform.js?id=5d4ed2751b809310e23b",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=be3d7cf51585313cf53b",
"/chunks/profile.js": "/chunks/profile.js?id=41b536880e846017d2d0",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=93ffe6eca4dcafbe8234",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=b35e751cdc1946a4fb60",
"/chunks/settings.js": "/chunks/settings.js?id=84f0716dc70fb1ab5de5",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=7404a1125aee6014b72a",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=094eb70eb2fa6b7c8dd2",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=31e3562551bfc4907b5b",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=47ad97b554fcc1564685",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=b06d4a1d504b2a6cbeed",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=1bffa4ae7d545af08355",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=41d3478184ec24644a1c",
"/chunks/shared.js": "/chunks/shared.js?id=7524b7a783d4aed23794",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=bfdf9bb904d354bdcbd1",
"/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=0f6c34512740fca7e007",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=7886247bb35deada28a2",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=fb2de6069de0669b0e02",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=b30b10ca09b115efc6ca",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=b2bc73016f0811f6838d",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=e12081daec0f6ea047ab",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=a09dc140a3914fb64a1a",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=3fe276a31a66ba244d10",
"/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=43888143d0a6afe67d7a",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=5979a154f760a992e617",
"/chunks/user.js": "/chunks/user.js?id=41076be9126702330159",
"/chunks/user-create.js": "/chunks/user-create.js?id=c65b1718b207ae7b678e",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=ecebc7e50b64744420c3",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=7ae038f6b4a4683c5bdb",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=1395c30e08946026fbc4",
"/chunks/user-password.js": "/chunks/user-password.js?id=f5fa3532fb7f4f5f2707",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=e19c7dee4ef5eb38a075",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=c6ec1b7215530cfdbceb",
"/chunks/users.js": "/chunks/users.js?id=71de2e012c4c566a8ec3",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~2fac28cc.js?id=5007f400f6b506ab23f4",
"/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~d5e36d91.js?id=2b11dd8f37c3c2421f2f",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared/file-browser~chunks/shared/single-file.js?id=9d10953d3b088324dfe3",
"/vendors~chunks/platform~chunks/shared.js": "/vendors~chunks/platform~chunks/shared.js?id=7d09e0b0658e140a7ffa",
"/chunks/sign-up.975b48abd4874d2d4701.hot-update.js": "/chunks/sign-up.975b48abd4874d2d4701.hot-update.js",
"/chunks/email-verified.51f60246090cc58fa13c.hot-update.js": "/chunks/email-verified.51f60246090cc58fa13c.hot-update.js",
"/chunks/email-verified.793fadba4eec7baa97de.hot-update.js": "/chunks/email-verified.793fadba4eec7baa97de.hot-update.js",
"/chunks/email-verified.e34f4263892542caa617.hot-update.js": "/chunks/email-verified.e34f4263892542caa617.hot-update.js",
"/chunks/email-verified.b1f4240b7eb52aea68c7.hot-update.js": "/chunks/email-verified.b1f4240b7eb52aea68c7.hot-update.js",
"/chunks/app-others.a134296fc107b0a807e3.hot-update.js": "/chunks/app-others.a134296fc107b0a807e3.hot-update.js",
"/chunks/sign-up.e3dc2f848ca66fd4b8ea.hot-update.js": "/chunks/sign-up.e3dc2f848ca66fd4b8ea.hot-update.js"
}

View File

@@ -205,7 +205,7 @@
storageLimitation: parseInt(response.data.storage_limitation),
mimetypesBlacklist : response.data.mimetypes_blacklist,
uploadLimit: response.data.upload_limit,
userVerification: response.data.user_verification
userVerification: parseInt(response.data.user_verification)
}
})
}

View File

@@ -138,15 +138,15 @@
// End loading
this.isLoading = false
if(! config.userVerification) {
if(! this.config.userVerification) {
// Set login state
this.$store.commit('SET_AUTHORIZED', true)
// Go to files page
this.$router.push({name: 'Files'})
} else {
// Go to sign-in page
this.$router.push({name: 'SignIn'})
// Go to SuccessfullySend page
this.$router.push({name: 'SuccessfullySend'})
}
})

View File

@@ -7,6 +7,12 @@
<h1>{{ $t('page_email_successfully_send.title') }}</h1>
<h2>{{ $t('page_email_successfully_send.subtitle') }}</h2>
<span class="additional-link">
<router-link :to="{name: 'Homepage'}" class="text-theme">
{{ $t('go_home') }}
</router-link>
</span>
</AuthContent>
</AuthContentWrapper>
</template>

View File

@@ -1,6 +1,6 @@
<?php
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\CreateNewUserAction;
use App\Http\Controllers\App\AppFunctionsController;
use App\Http\Controllers\FileManager\ShareController;
use App\Http\Controllers\FileManager\TrashController;
@@ -23,7 +23,7 @@ Route::group(['prefix' => 'password'], function () {
});
// Register user
Route::post('/register', [CreateNewUser::class, 'store']);
Route::post('/register', CreateNewUserAction::class);
// User master Routes
Route::group(['middleware' => ['auth:sanctum']], function () {

View File

@@ -8,8 +8,8 @@ use App\Http\Controllers\User\PaymentMethodsController;
Route::post('/check', [AuthController::class, 'check_account']);
// Email verification
Route::get('/email/verify/{id}', [AccountController::class, 'email_verify'])->name('verification.verify');
Route::post('/email/resend/verify', [AccountController::class, 'resend_verify_email'])->name('verification.send');
Route::get('/email/verify/{id}', [AccountController::class, 'email_verification'])->name('verification.verify');
Route::post('/email/resend/verify', [AccountController::class, 'resend_verification_email'])->name('verification.send');
Route::group(['middleware' => ['auth:sanctum']], function () {
// Account
@@ -18,7 +18,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () {
Route::post('/token/create', [AccountController::class, 'create_token']);
Route::post('/password', [AccountController::class, 'change_password']);
Route::get('/subscription', [SubscriptionController::class, 'show']);
Route::get('/tokens', [AccountController::class, 'tokens_index']);
Route::get('/tokens', [AccountController::class, 'tokens']);
Route::get('/invoices', [AccountController::class, 'invoices']);
Route::get('/storage', [AccountController::class, 'storage']);
Route::get('/', [AccountController::class, 'user']);

View File

@@ -266,7 +266,7 @@ class UserAccountTest extends TestCase
/**
* @test
*/
public function it_user_email_verify()
public function it_verify_user_email()
{
$user = User::factory(User::class)
->create([
@@ -279,9 +279,9 @@ class UserAccountTest extends TestCase
['id' => $user->id, 'hash' => sha1($user->email)]
);
$response = $this->getJson($verificationUrl);
$response->assertRedirect('successfully-verified');
$this
->getJson($verificationUrl)
->assertRedirect('successfully-verified');
$this->assertNotNull(User::find($user->id)->get('email_verified_at'));
}

View File

@@ -2,12 +2,11 @@
namespace Tests\Feature\App;
use App\Models\File;
use App\Models\Share;
use App\Models\User;
use App\Models\Zip;
use App\Services\SchedulerService;
use App\Services\SetupService;
use Carbon\Carbon;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Http\UploadedFile;
use Storage;
@@ -20,8 +19,8 @@ class SchedulerTest extends TestCase
public function __construct()
{
parent::__construct();
$this->setup = app()->make(SetupService::class);
$this->scheduler = app()->make(SchedulerService::class);
$this->setup = resolve(SetupService::class);
$this->scheduler = resolve(SchedulerService::class);
}
/**
@@ -99,4 +98,42 @@ class SchedulerTest extends TestCase
});
}
/**
* @test
*/
public function it_delete_non_verified_users_after_30_days()
{
$expiredUser = User::factory(User::class)
->create([
'email_verified_at' => null,
'created_at' => now()->subDays(31)
]);
$nonExpiredUser = User::factory(User::class)
->create([
'email_verified_at' => null,
'created_at' => now()->subDays(14)
]);
$verifiedUser = User::factory(User::class)
->create([
'email_verified_at' => now()->subDays(15),
'created_at' => now()->subDays(31)
]);
$this->scheduler->delete_unverified_users();
$this->assertDatabaseMissing('users', [
'id' => $expiredUser->id,
]);
$this->assertDatabaseHas('users', [
'id' => $nonExpiredUser->id,
]);
$this->assertDatabaseHas('users', [
'id' => $verifiedUser->id,
]);
}
}

View File

@@ -2,9 +2,22 @@
namespace Tests;
use Carbon\Carbon;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Support\Facades\Notification;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
public function setUp(): void
{
parent::setUp();
Carbon::setTestNow('1. January 2021');
Notification::fake();
$this->withoutExceptionHandling();
}
}