Skip to content

Commit c78eb0c

Browse files
Updated: updating MFA according to vaahcms 1 commit
Updated: check mfa middleware and user model code synced Updated: verify auth middleware Updated: security columns in user table Updated: multifactor code email template Updated: mfa condition Updated: migration merged and issue fixed Updated: verification completed. research on inside button countdown
1 parent fc3c9e8 commit c78eb0c

File tree

15 files changed

+573
-205
lines changed

15 files changed

+573
-205
lines changed

Database/Migrations/2023_04_11_111356_add_security_columns_to_vh_users_table.php

Whitespace-only changes.

Database/Seeders/VaahCmsTableSeeder.php

+5-6
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,12 @@ public function seedSettings()
208208
->where( 'key', $item['key'] )
209209
->first();
210210

211-
if (!$exist){
212-
213-
if(isset($item['type']) && $item['type']=='json')
214-
{
215-
$item['value']=json_encode($item['value']);
216-
}
211+
if(isset($item['type']) && $item['type']=='json')
212+
{
213+
$item['value']=json_encode($item['value']);
214+
}
217215

216+
if (!$exist){
218217
\DB::table( 'vh_settings' )->insert( $item );
219218
} else{
220219
\DB::table( 'vh_settings' )

Database/Seeders/json/settings.json

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
{"category": "global", "key": "is_new_device_verification_enabled", "value": 0 },
3535
{"category": "global", "key": "mfa_status", "value": "disable" },
3636
{"category": "global", "key": "mfa_methods","type":"json", "value": ["email-otp-verification"] },
37+
{"category": "global", "key": "is_new_device_verification_enabled", "value": 0 },
38+
{"category": "global", "key": "mfa_status", "value": "disable" },
39+
{"category": "global", "key": "mfa_methods","type":"json", "value": ["email-otp-verification"] },
3740
{"category": "sample", "key": "sample", "value": 0 },
3841
{"category": "user_setting", "label":"field", "type":"json", "key": "display_name", "value": {"is_hidden": false, "to_registration": false} },
3942
{"category": "user_setting", "label":"field", "type":"json", "key": "title", "value": {"is_hidden": false, "to_registration": false} },

Http/Controllers/Backend/Settings/GeneralController.php

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use WebReinvent\VaahCms\Models\Language;
1111
use WebReinvent\VaahCms\Models\Role;
1212
use WebReinvent\VaahCms\Models\Setting;
13+
use WebReinvent\VaahCms\Libraries\VaahHelper;
1314

1415
class GeneralController extends Controller
1516
{

Http/Controllers/PublicController.php

+36-20
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public function postLogin(Request $request)
120120
if ( $validator->fails() ) {
121121

122122
$errors = errorsToArray($validator->errors());
123-
$response['success'] = false;
123+
$response['status'] = 'failed';
124124
$response['errors'] = $errors;
125125
return response()->json($response);
126126
}
@@ -135,7 +135,7 @@ public function postLogin(Request $request)
135135
$response = User::login($request, $permission_to_check);
136136
}
137137

138-
if(isset($response['success']) && !$response['success'])
138+
if(isset($response['status']) && $response['status'] == 'failed')
139139
{
140140
return response()->json($response);
141141
}
@@ -148,12 +148,16 @@ public function postLogin(Request $request)
148148
$redirect_url = \URL::route('vh.backend');
149149
}
150150

151-
151+
$check_mfa = Auth::user()->verifySecurityAuthentication();
152+
$message = 'Login Successful';
153+
if($check_mfa['status'] == 'success'){
154+
$message = 'Otp sent';
155+
}
152156

153157
$response = [];
154158

155-
$response['success'] = true;
156-
$response['messages'][] = 'Login Successful';
159+
$response['status'] = 'success';
160+
$response['messages'][] = $message;
157161
$response['data']['redirect_url'] = $redirect_url;
158162
$response['data']['verification_response'] = Auth::user()->verifySecurityAuthentication();
159163

@@ -163,15 +167,14 @@ public function postLogin(Request $request)
163167
//----------------------------------------------------------
164168
public function postVerify(Request $request)
165169
{
166-
167170
$inputs = [
168171
'otp_code' => null
169172
];
170173

171-
if(is_array($request->verify_otp))
174+
if($request->verification_otp)
172175
{
173176
$inputs = [
174-
'otp_code' => implode("", $request->verify_otp)
177+
'otp_code' => $request->verification_otp
175178
];
176179

177180
}
@@ -184,48 +187,48 @@ public function postVerify(Request $request)
184187
if ( $validator->fails() ) {
185188

186189
$errors = errorsToArray($validator->errors());
187-
$response['success'] = false;
190+
$response['status'] = 'failed';
188191
$response['errors'] = $errors;
189192
return response()->json($response);
190193
}
191194

192195

193196
$user = auth()->user();
194197

195-
if($user && !$user->mfa_code && !$user->mfa_code_expired_at){
196-
$response['success'] = true;
198+
if($user && !$user->security_code && !$user->security_code_expired_at){
199+
$response['status'] = 'success';
197200
$response['messages'][] = 'Login Successful';
198201
$response['data']['redirect_url'] = route('vh.backend').'#/vaah';
199202
return $response;
200203
}
201204

202-
if($user && $user->mfa_code_expired_at && $user->mfa_code_expired_at->lt(now()))
205+
if($user && $user->security_code_expired_at && $user->security_code_expired_at->lt(now()))
203206
{
204-
$user->mfa_code = null;
205-
$user->mfa_code_expired_at = null;
207+
$user->security_code = null;
208+
$user->security_code_expired_at = null;
206209
$user->save();
207210
auth()->logout();
208211

209-
$response['success'] = false;
212+
$response['status'] = 'failed';
210213
$response['errors'][] = 'The code has expired. Please login again.';
211214
$response['data']['redirect_url'] = route('vh.backend');
212215

213216
return response()->json($response);
214217
}
215218

216219

217-
if($user && $inputs['otp_code'] == $user->mfa_code)
220+
if($user && $inputs['otp_code'] == $user->security_code)
218221
{
219-
$user->mfa_code = null;
220-
$user->mfa_code_expired_at = null;
222+
$user->security_code = null;
223+
$user->security_code_expired_at = null;
221224
$user->save();
222225

223-
$response['success'] = true;
226+
$response['status'] = 'success';
224227
$response['messages'][] = 'Login Successful';
225228
$response['data']['redirect_url'] = route('vh.backend').'#/vaah';
226229

227230
}else{
228-
$response['success'] = false;
231+
$response['status'] = 'failed';
229232
$response['errors'][] = 'Code is not correct.';
230233
}
231234

@@ -235,6 +238,19 @@ public function postVerify(Request $request)
235238

236239
}
237240
//----------------------------------------------------------
241+
public function signinResendSecurityOtp(Request $request)
242+
{
243+
244+
Auth::user()->verifySecurityAuthentication();
245+
246+
$response = [];
247+
248+
$response['status'] = 'success';
249+
$response['data'] = '{}';
250+
251+
return response()->json($response);
252+
}
253+
//----------------------------------------------------------
238254
public function postSendResetCode(Request $request)
239255
{
240256
$response = User::sendResetPasswordEmail($request, 'can-login-in-backend');

Http/Middleware/CheckMfa.php

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php
2+
3+
namespace WebReinvent\VaahCms\Http\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
use Session;
8+
use Illuminate\Support\Facades\Auth;
9+
use WebReinvent\VaahCms\Entities\Theme;
10+
11+
class VerifyAuth
12+
{
13+
/**
14+
* Handle an incoming request.
15+
*
16+
* @param \Illuminate\Http\Request $request
17+
* @param \Closure $next
18+
* @return mixed
19+
*/
20+
public function handle(Request $request, Closure $next)
21+
{
22+
23+
if(auth()->check()){
24+
25+
$user = auth()->user();
26+
27+
28+
if($user->mfa_code)
29+
{
30+
31+
if($user->mfa_code_expired_at->lt(now()))
32+
{
33+
34+
auth()->logout();
35+
36+
return redirect()->route('vh.backend');
37+
}
38+
39+
if(config('settings.global.mfa_status') !== 'disable'){
40+
41+
if(config('settings.global.mfa_status') == 'all-users'){
42+
43+
auth()->logout();
44+
45+
return redirect()->route('vh.backend');
46+
}
47+
48+
if(config('settings.global.mfa_status') == 'user-will-have-option'
49+
&& is_array($user->mfa_methods) && count($user->mfa_methods) >= 0){
50+
51+
auth()->logout();
52+
53+
return redirect()->route('vh.backend');
54+
55+
}
56+
57+
}
58+
59+
}
60+
61+
}
62+
63+
return $next($request);
64+
65+
}
66+
}

Http/Middleware/VerifyAuth.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Illuminate\Http\Request;
77
use Session;
88
use Illuminate\Support\Facades\Auth;
9-
use WebReinvent\VaahCms\Models\Theme;
9+
use WebReinvent\VaahCms\Entities\Theme;
1010

1111
class VerifyAuth
1212
{
@@ -25,10 +25,10 @@ public function handle(Request $request, Closure $next)
2525
$user = auth()->user();
2626

2727

28-
if($user->mfa_code)
28+
if($user->security_code)
2929
{
3030

31-
if($user->mfa_code_expired_at->lt(now()))
31+
if($user->security_code_expired_at->lt(now()))
3232
{
3333

3434
auth()->logout();

Jobs/SecurityOtpJob.php

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace WebReinvent\VaahCms\Jobs;
4+
5+
use Illuminate\Bus\Batchable;
6+
use Illuminate\Bus\Queueable;
7+
use Illuminate\Contracts\Queue\ShouldBeUnique;
8+
use Illuminate\Contracts\Queue\ShouldQueue;
9+
use Illuminate\Foundation\Bus\Dispatchable;
10+
use Illuminate\Http\Request;
11+
use Illuminate\Queue\InteractsWithQueue;
12+
use Illuminate\Queue\SerializesModels;
13+
use Throwable;
14+
use WebReinvent\VaahCms\Entities\Notification;
15+
use WebReinvent\VaahCms\Entities\User;
16+
use WebReinvent\VaahCms\Mail\SecurityOtpMail;
17+
18+
class SecurityOtpJob implements ShouldQueue
19+
{
20+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
21+
22+
protected $details;
23+
24+
/**
25+
* Create a new job instance.
26+
*
27+
* @return void
28+
*/
29+
public function __construct($details)
30+
{
31+
$this->details = $details;
32+
}
33+
34+
/**
35+
* Execute the job.
36+
*
37+
* @return void
38+
*/
39+
public function handle()
40+
{
41+
$email = new SecurityOtpMail($this->details);
42+
\Mail::to($this->details['email'])->send($email);
43+
}
44+
45+
}

Mail/SecurityOtpMail.php

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace WebReinvent\VaahCms\Mail;
4+
5+
use Illuminate\Bus\Queueable;
6+
use Illuminate\Contracts\Queue\ShouldQueue;
7+
use Illuminate\Mail\Mailable;
8+
use Illuminate\Queue\SerializesModels;
9+
10+
class SecurityOtpMail extends Mailable
11+
{
12+
use Queueable, SerializesModels;
13+
14+
public $content;
15+
16+
/**
17+
* Create a new message instance.
18+
*
19+
* @return void
20+
*/
21+
public function __construct($content)
22+
{
23+
$this->content = $content;
24+
}
25+
26+
/**
27+
* Build the message.
28+
*
29+
* @return $this
30+
*/
31+
public function build()
32+
{
33+
return $this->subject(config('app.name').': Two Step Authentication')
34+
->view('vaahcms::mails.security-otp');
35+
}
36+
}

0 commit comments

Comments
 (0)