Skip to content

Commit 92b425c

Browse files
committed
feat: add more feedback to UI on inactive and/or unverified accounts
Signed-off-by: romanetar <roman_ag@hotmail.com>
1 parent 4d901b3 commit 92b425c

7 files changed

Lines changed: 202 additions & 30 deletions

File tree

app/Http/Controllers/UserController.php

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
use App\ModelSerializers\SerializerRegistry;
2222
use Auth\Exceptions\AuthenticationException;
2323
use Auth\Exceptions\UnverifiedEmailMemberException;
24+
use App\Services\Auth\IUserService as AuthUserService;
2425
use Exception;
26+
use Illuminate\Http\Request as LaravelRequest;
2527
use Illuminate\Support\Facades\Request;
2628
use Illuminate\Support\Facades\Log;
2729
use Illuminate\Support\Facades\Redirect;
@@ -86,6 +88,10 @@ final class UserController extends OpenIdController
8688
* @var IUserService
8789
*/
8890
private $user_service;
91+
/**
92+
* @var AuthUserService
93+
*/
94+
private $auth_user_service;
8995
/**
9096
* @var IUserActionService
9197
*/
@@ -132,6 +138,7 @@ final class UserController extends OpenIdController
132138
* @param ITrustedSitesService $trusted_sites_service
133139
* @param DiscoveryController $discovery
134140
* @param IUserService $user_service
141+
* @param AuthUserService $auth_user_service
135142
* @param IUserActionService $user_action_service
136143
* @param IClientRepository $client_repository
137144
* @param IApiScopeRepository $scope_repository
@@ -150,6 +157,7 @@ public function __construct
150157
ITrustedSitesService $trusted_sites_service,
151158
DiscoveryController $discovery,
152159
IUserService $user_service,
160+
AuthUserService $auth_user_service,
153161
IUserActionService $user_action_service,
154162
IClientRepository $client_repository,
155163
IApiScopeRepository $scope_repository,
@@ -160,15 +168,14 @@ public function __construct
160168
LoginHintProcessStrategy $login_hint_process_strategy
161169
)
162170
{
163-
164-
165171
$this->openid_memento_service = $openid_memento_service;
166172
$this->oauth2_memento_service = $oauth2_memento_service;
167173
$this->auth_service = $auth_service;
168174
$this->server_configuration_service = $server_configuration_service;
169175
$this->trusted_sites_service = $trusted_sites_service;
170176
$this->discovery = $discovery;
171177
$this->user_service = $user_service;
178+
$this->auth_user_service = $auth_user_service;
172179
$this->user_action_service = $user_action_service;
173180
$this->client_repository = $client_repository;
174181
$this->scope_repository = $scope_repository;
@@ -263,7 +270,8 @@ public function getAccount()
263270

264271
return $this->ok(
265272
[
266-
'can_login' => $user->canLogin(),
273+
'is_active' => $user->isActive(),
274+
'is_verified' => $user->isEmailVerified(),
267275
'pic' => $user->getPic(),
268276
'full_name' => $user->getFullName(),
269277
'has_password_set' => $user->hasPasswordSet(),
@@ -351,6 +359,37 @@ public function emitOTP()
351359
}
352360
}
353361

362+
/**
363+
* @return \Illuminate\Http\JsonResponse|mixed
364+
*/
365+
public function resendVerificationEmail(LaravelRequest $request)
366+
{
367+
try {
368+
$payload = $request->all();
369+
$validator = Validator::make($payload, [
370+
'email' => 'required|string|email|max:255'
371+
]);
372+
373+
if (!$validator->passes()) {
374+
return $this->error412($validator->getMessageBag()->getMessages());
375+
}
376+
$this->auth_user_service->resendVerificationEmail($payload);
377+
return $this->ok();
378+
}
379+
catch (ValidationException $ex) {
380+
Log::warning($ex);
381+
return $this->error412($ex->getMessages());
382+
}
383+
catch (EntityNotFoundException $ex) {
384+
Log::warning($ex);
385+
return $this->error404();
386+
}
387+
catch (Exception $ex) {
388+
Log::error($ex);
389+
return $this->error500($ex);
390+
}
391+
}
392+
354393
public function postLogin()
355394
{
356395
$max_login_attempts_2_show_captcha = $this->server_configuration_service->getConfigValue("MaxFailed.LoginAttempts.2ShowCaptcha");

app/Services/Auth/UserService.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,10 @@ public function verifyEmail(string $token): User
224224
{
225225
return $this->tx_service->transaction(function () use ($token) {
226226
$user = $this->user_repository->getByVerificationEmailToken($token);
227-
if (is_null($user))
227+
228+
if (is_null($user) || !$user->isActive())
228229
throw new EntityNotFoundException();
230+
229231
$user->verifyEmail();
230232

231233
try {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from 'react';
2+
import { Snackbar } from '@material-ui/core';
3+
import MuiAlert from '@material-ui/lab/Alert';
4+
5+
function Alert(props) {
6+
return <MuiAlert elevation={6} variant="filled" {...props} />;
7+
}
8+
9+
const CustomSnackbar = ({ message, severity = 'info', onClose }) => {
10+
return (
11+
<Snackbar open={message !== null} autoHideDuration={8000} onClose={onClose}>
12+
<Alert onClose={onClose} severity={severity}>
13+
{message}
14+
</Alert>
15+
</Snackbar>
16+
);
17+
};
18+
export default CustomSnackbar;

resources/js/login/actions.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,11 @@ export const emitOTP = (email, token, connection = 'email', send='code') => {
1919

2020
return postRawRequest(window.EMIT_OTP_ENDPOINT)(params, {'X-CSRF-TOKEN': token});
2121
}
22+
23+
export const resendVerificationEmail = (email, token) => {
24+
const params = {
25+
email: email
26+
};
27+
28+
return postRawRequest(window.RESEND_VERIFICATION_EMAIL_ENDPOINT)(params, {'X-CSRF-TOKEN': token});
29+
}

0 commit comments

Comments
 (0)