Google Authenticator – WordPress Two Factor Authentication (2FA) - Version 5.5.1

Version Description

  • Google Authenticator - Two factor Authentication (2FA, OTP) :
  • Updated Pricing page UI
Download this release

Release Info

Developer cyberlord92
Plugin Icon 128x128 Google Authenticator – WordPress Two Factor Authentication (2FA)
Version 5.5.1
Comparing to
See all releases

Code changes from version 5.4.33 to 5.5.1

Files changed (76) hide show
  1. api/Mo2f_OnPremRedirect.php +3 -3
  2. api/class-customer-common-setup.php +63 -1
  3. changelog.txt +718 -0
  4. controllers/account.php +2 -2
  5. controllers/content-protection.php +1 -0
  6. controllers/dashboard.php +1 -1
  7. controllers/duo_authenticator/duo_authenticator_ajax.php +3 -3
  8. controllers/feedback_footer.php +35 -25
  9. controllers/login-security.php +20 -22
  10. controllers/main_controller.php +54 -84
  11. controllers/malware_scanner/malware_scan_ajax.php +8 -0
  12. controllers/navbar.php +2 -1
  13. controllers/request_christmas_offer.php +48 -0
  14. controllers/request_offer.php +1 -1
  15. controllers/support.php +3 -22
  16. controllers/tour-model.php +1 -1
  17. controllers/trial.php +91 -0
  18. controllers/two-fa-intro.php +3 -3
  19. controllers/twofa/mo2fa_common_login.php +120 -17
  20. controllers/twofa/mo2fa_inline_registration.php +35 -56
  21. controllers/twofa/two_factor_ajax.php +818 -1
  22. controllers/upgrade.php +2 -1
  23. controllers/wpns-loginsecurity-ajax.php +72 -19
  24. database/database_functions_2fa.php +5 -1
  25. database/mo2f_db_options.php +3 -0
  26. handler/ajax.php +13 -1
  27. handler/feedback_form.php +38 -0
  28. handler/logger.php +2 -0
  29. handler/login.php +48 -34
  30. handler/malware_scanner.php +3 -3
  31. handler/malware_scanner/malware_scanner_cron.php +6 -6
  32. handler/malware_scanner/scanner_set_cron.php +2 -2
  33. handler/recaptcha.php +66 -12
  34. handler/registration.php +8 -2
  35. handler/twofa/class_miniorange_2fa_strong_password.php +1 -1
  36. handler/twofa/gaonprem.php +9 -3
  37. handler/twofa/setup_twofa.php +150 -124
  38. handler/twofa/two_fa_constants.php +16 -0
  39. handler/twofa/two_fa_login.php +20 -26
  40. handler/twofa/two_fa_pass2login.php +334 -272
  41. handler/twofa/two_fa_settings.php +1521 -312
  42. handler/twofa/two_fa_utility.php +99 -27
  43. handler/user-profile-2fa-update.php +213 -0
  44. handler/user-profile-2fa.php +276 -0
  45. helper/constants.php +1 -1
  46. helper/curl.php +18 -1
  47. helper/messages.php +35 -1
  48. helper/utility.php +28 -5
  49. includes/css/bootstrap.min.css +14 -1
  50. includes/css/button_styles.css +4 -4
  51. includes/css/christmas.gif +0 -0
  52. includes/css/datetime-style-settings.css +0 -576
  53. includes/css/datetime-style-settings.min.css +0 -1
  54. includes/css/hide-login-form.css +3 -0
  55. includes/css/jquery-ui.min.css +1 -4
  56. includes/css/jquery.ui.css +0 -175
  57. includes/css/popup.css +2 -2
  58. includes/css/style_settings.css +525 -359
  59. includes/css/twofa_style_settings.css +13 -1
  60. includes/css/upgrade.css +734 -53
  61. includes/css/user-profile.css +179 -0
  62. includes/email-New-release.php +553 -243
  63. includes/images/2fa-on-login-page.png +0 -0
  64. includes/images/authmethods/miniOrangeAuthenticator.png +0 -0
  65. includes/images/firebase.png +0 -0
  66. includes/images/{hide_login_form.png → hide_login_form.PNG} +0 -0
  67. includes/images/{login-with-password-and-2fa.png → login-with-password-and-2fa.PNG} +0 -0
  68. includes/js/login_with_ajax.js +65 -0
  69. includes/js/mo2fa_elementor.js +122 -0
  70. includes/js/pointers.js +3 -3
  71. includes/js/settings_page.js +37 -4
  72. includes/js/setup-wizard-2fa.js +6572 -0
  73. includes/js/user-profile-twofa.js +194 -0
  74. includes/lib/mo-2fa-options-enum.php +0 -435
  75. miniorange_2_factor_settings.php +89 -34
  76. readme.txt +58 -35
api/Mo2f_OnPremRedirect.php CHANGED
@@ -68,7 +68,7 @@ class Mo2f_OnPremRedirect {
68
  return $content;
69
  case "EMAIL":
70
 
71
- case "OTP Over Email": $content = $this->OnpremOTPOverEMail($currentuser);
72
  return $content;
73
  case "KBA": $content = $this->OnpremSecurityQuestions($currentuser);
74
  return $content;
@@ -104,9 +104,9 @@ class Mo2f_OnPremRedirect {
104
  $content=$gauth_obj->verifyCode($secret, $otpToken);
105
  return $content;
106
  }
107
- function OnpremOTPOverEMail($current_user)
108
  {
109
- return $this->OnpremSendOTPEMail($current_user,'mo2f_otp_email_code','mo2f_otp_email_time');
110
  }
111
  function OnpremSendOTPEMail($current_user,$tokenName,$timeName,$email=null)
112
  {
68
  return $content;
69
  case "EMAIL":
70
 
71
+ case "OTP Over Email": $content = $this->OnpremOTPOverEMail($currentuser,$useremail);
72
  return $content;
73
  case "KBA": $content = $this->OnpremSecurityQuestions($currentuser);
74
  return $content;
104
  $content=$gauth_obj->verifyCode($secret, $otpToken);
105
  return $content;
106
  }
107
+ function OnpremOTPOverEMail($current_user,$useremail=false)
108
  {
109
+ return $this->OnpremSendOTPEMail($current_user,'mo2f_otp_email_code','mo2f_otp_email_time',$useremail);
110
  }
111
  function OnpremSendOTPEMail($current_user,$tokenName,$timeName,$email=null)
112
  {
api/class-customer-common-setup.php CHANGED
@@ -301,6 +301,69 @@ class Customer_Cloud_Setup {
301
  return $content;
302
  }
303
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
 
305
  function validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null) {
306
  $content='';
@@ -361,7 +424,6 @@ class Customer_Cloud_Setup {
361
 
362
 
363
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
364
-
365
  return $content;
366
  }
367
 
301
  return $content;
302
  }
303
 
304
+ public function mo_2f_generate_backup_codes($mo2f_user_email,$site_url){
305
+
306
+
307
+ $url = 'https://sitestats.xecurify.com/backupcodeservice/index.php';
308
+
309
+ $headers = array('header' => "Authorization:Basic" . base64_encode("$mo2f_user_email:$site_url") );
310
+
311
+ $postdata = array('mo2f_email'=> $mo2f_user_email,
312
+ 'mo2f_domain' =>$site_url,
313
+ 'headers'=>$headers['header'],
314
+ 'mo2f_generate_backup_codes'=>'initiated_backup_codes');
315
+
316
+ $handle = curl_init();
317
+
318
+ curl_setopt_array($handle,
319
+ array(
320
+ CURLOPT_URL => $url,
321
+ CURLOPT_POST => true,
322
+ CURLOPT_POSTFIELDS => $postdata,
323
+ CURLOPT_RETURNTRANSFER => true,
324
+ CURLOPT_SSL_VERIFYHOST => FALSE,
325
+ CURLOPT_SSL_VERIFYPEER => FALSE,
326
+ )
327
+ );
328
+
329
+ $data = curl_exec($handle);
330
+
331
+ curl_close($handle);
332
+ return $data;
333
+
334
+ }
335
+
336
+ public function mo2f_validate_backup_codes($mo2f_backup_code,$mo2f_user_email){
337
+ $url = 'https://sitestats.xecurify.com/backupcodeservice/backup_code_validation.php';
338
+
339
+ $site_url = site_url();
340
+ $headers = array('header' => "Authorization:Basic" . base64_encode("$mo2f_user_email:$site_url") );
341
+
342
+ $postdata = array('mo2f_otp_token' => $mo2f_backup_code,
343
+ 'mo2f_user_email'=> $mo2f_user_email,
344
+ 'headers'=>$headers['header'],
345
+ 'mo2f_site_url' => $site_url);
346
+
347
+ $handle = curl_init();
348
+
349
+ curl_setopt_array($handle,
350
+ array(
351
+ CURLOPT_URL => $url,
352
+ CURLOPT_POST => true,
353
+ CURLOPT_POSTFIELDS => $postdata,
354
+ CURLOPT_RETURNTRANSFER => true,
355
+ CURLOPT_SSL_VERIFYHOST => FALSE,
356
+ CURLOPT_SSL_VERIFYPEER => FALSE,
357
+ )
358
+ );
359
+
360
+ $data = curl_exec($handle);
361
+
362
+ curl_close($handle);
363
+
364
+ return $data;
365
+ }
366
+
367
 
368
  function validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null) {
369
  $content='';
424
 
425
 
426
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
 
427
  return $content;
428
  }
429
 
changelog.txt ADDED
@@ -0,0 +1,718 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === miniOrange's Google Authenticator - WordPress Two Factor Authentication (2FA , MFA, OTP SMS and Email) | Passwordless login ===
2
+
3
+ == Archived Changelog Entries ==
4
+
5
+ This file contains older changelog entries, so we can keep the size of the standard WordPress readme.txt file reasonable.
6
+ For the latest changes, please refer to the "Changelog" section in the [readme.txt file](https://plugins.svn.wordpress.org/miniorange-2-factor-authentication/trunk/readme.txt).
7
+
8
+ = 5.5.1 =
9
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
10
+ * Updated Pricing page UI
11
+
12
+ = 5.5 =
13
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
14
+ * Updated Network Security UI
15
+
16
+ = 5.4.52 =
17
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
18
+ * Updated Trial Request Form
19
+
20
+ = 5.4.51 =
21
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
22
+ * Trial notification visibility issue fixed
23
+
24
+ = 5.4.50 =
25
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
26
+ * Bug fix - Headers already sent
27
+
28
+ = 5.4.49 =
29
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
30
+ * Trial Notification for Premium Plugins
31
+ * CSRF Fix
32
+
33
+ = 5.4.48 =
34
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
35
+ * Close button on offer banner
36
+
37
+ = 5.4.47 =
38
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
39
+ * Christmas offer
40
+
41
+ = 5.4.46 =
42
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
43
+ * Black friday offer
44
+ * Get email notification on the plugin's new release
45
+
46
+ = 5.4.45 =
47
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
48
+ * Added login with the any configured methods
49
+ * Minor bug fix
50
+
51
+ = 5.4.44 =
52
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
53
+ * Added link to WordPress forum in support form
54
+ * Minor bug fix
55
+
56
+ = 5.4.43 =
57
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
58
+ * Special offer - Special discount for limited time
59
+
60
+ = 5.4.42 =
61
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
62
+ * Backup Code as a cloud service
63
+
64
+ = 5.4.41 =
65
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
66
+ * Minor UI Changes and Bug Fixes
67
+
68
+ = 5.4.40 =
69
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
70
+ * XSS Vulnerability fix
71
+ * Added video link for miniOrange Authenticator
72
+
73
+ = 5.4.39 =
74
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
75
+ * Added 2FA setup using user profile option
76
+ * Support Form UI
77
+ * 2FA Form support for login with ajax, Elementor Pro, UserPro login forms
78
+ * Minor bug fixes
79
+
80
+ = 5.4.38 =
81
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
82
+ * Added 2FA setup using user profile option
83
+ * Setup Wizard for configuring 2FA
84
+ * 2FA Form support for login with ajax, Elementor Pro, UserPro login forms
85
+ * Minor bug fixes
86
+
87
+ = 5.4.37 =
88
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
89
+ * Minor bug fixes
90
+
91
+ = 5.4.36 =
92
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
93
+ * Remove extra comma
94
+
95
+ = 5.4.35 =
96
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
97
+ * Minor bug fixes
98
+
99
+ = 5.4.34 =
100
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
101
+ * New User Interface for easy setup
102
+ * Added developers logs
103
+ * Minor fixes
104
+
105
+ = 5.4.33 =
106
+ * Google Authenticator – Two Factor Authentication (2FA, TFA) :
107
+ * New pricing page for two factor authentication
108
+ * Added Duo Authenticator push notification method.
109
+ * WooCommerce redirect issue fix.
110
+
111
+ = 5.4.32 =
112
+ * Google Authenticator – Two Factor Authentication (2FA, TFA) :
113
+ * Replaced sessions with transient.
114
+
115
+ = 5.4.31 =
116
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
117
+ * OTP over Email as two factor fix
118
+ * Low Email transaction alert fix
119
+
120
+ = 5.4.30 =
121
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
122
+ * Feedback changes
123
+
124
+ = 5.4.29 =
125
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
126
+ * Session independent Google Authenticator
127
+ * Session independent KBA
128
+ * Feedback improvement for two factor authentication plugin
129
+
130
+ = 5.4.28 =
131
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
132
+ * New year sale update
133
+
134
+ = 5.4.27 =
135
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
136
+ * New year sale
137
+ * WordPress 5.6 compatibility fix
138
+ * WAF fixes
139
+ * Real time IP blocking
140
+ * IP based user login
141
+ * New feature release notification
142
+
143
+ = 5.4.26 =
144
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
145
+ * Christmas Offer
146
+
147
+ = 5.4.25 =
148
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
149
+ * OTP over Telegram Fixes
150
+
151
+ = 5.4.24 =
152
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
153
+ * OTP over Whatsapp
154
+ * OTP over Telegram
155
+ * Feedback form changes
156
+
157
+ = 5.4.23 =
158
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
159
+ * Call support with technical team
160
+ * Email and SMS transaction sync
161
+ * Feedback form on network deactivate
162
+ * Enable/Disable 2FA fix
163
+ * 2FA added for super admin role
164
+
165
+ = 5.4.22 =
166
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
167
+ * Backup Codes
168
+ * Sanitization and JS improvements
169
+ * SMS and Email Sync
170
+ * Whatsapp based Two factor in Premium plugin
171
+ * Telegram based Two factor in Premium plugin
172
+
173
+ = 5.4.21 =
174
+ * Google Authenticator - Two Factor Authentication (2FA, SMS) :
175
+ * Sanitization of some input values.
176
+
177
+ = 5.4.20 =
178
+ * Google Authenticator - Two Factor Authentication (2FA, SMS) :
179
+ * Google Authenticator Qr code fix.
180
+ * My theme login Login fix.
181
+
182
+ = 5.4.19 =
183
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) : Google Authenticator cloud fix.
184
+
185
+ = 5.4.18 =
186
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
187
+ * Added missing file
188
+
189
+ = 5.4.17 =
190
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
191
+ *Digimember Form Support
192
+ *Memberpress Form Support
193
+ *SMS Verification Support
194
+ *OTP Verification on WooCommerce Registration
195
+
196
+ = 5.4.16 =
197
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) : Quick form fix.
198
+
199
+ = 5.4.15 =
200
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) :
201
+ * Theme My Login plugin Support
202
+ * Ultimate Member Registration Support
203
+ * WooCommerce Registration Support
204
+ * Ultimate Member Redirect
205
+ * Restrict Content Pro Login and Registration
206
+
207
+ = 5.4.14 =
208
+ * Google Authenticator - Two Factor Authentication (2FA, MFA) : Performance improvement with fixes in Security Questions. And User Email verification and Phone Verification issues resolved.
209
+
210
+ = 5.4.13 =
211
+ * Google Authenticator - Two Factor Authentication (2FA, TFA) : Support Form Improvement.
212
+
213
+ = 5.4.11 =
214
+ * Google Authenticator - Two Factor Authentication (2FA, MFA) : Feedback Issue fix.
215
+
216
+ = 5.4.9 =
217
+ * Google Authenticator - Two Factor Authentication (2FA, TFA) : User Experience, new support form and Security disabled by default. Added New Methods for users to choose.
218
+
219
+ = 5.4.8 =
220
+ * Google Authenticator - Two Factor Authentication (2FA, OTP Verification) : Learning Management System support, Microsoft Authenticator and Duo Authenticator support and restrict account sharing add-on.
221
+
222
+ = 5.4.7 =
223
+ * Google Authenticator - Two Factor Authentication (2FA, SMS Verification) : Fixing warnings and adding minor changes in the plans.
224
+
225
+ = 5.4.6 =
226
+ * Google Authenticator - Two Factor Authentication (2FA) : Improving Google Authenticator and adding Payment options.
227
+
228
+ = 5.4.5 =
229
+ * Google Authenticator - Two Factor Authentication (2FA, OTP) : Security and MFA UI updates.
230
+
231
+ = 5.4.4 =
232
+ * Google Authenticator - Two Factor Authentication (2FA, TFA) : Two Factor : WooCommerce login page integration.
233
+
234
+ = 5.4.3 =
235
+ * Google Authenticator - Two Factor Authentication (2FA, MFA) : Session issue fix for customers using Two Factor.
236
+
237
+ = 5.4.2 =
238
+ * Google Authenticator - Two Factor Authentication (2FA, MFA) : Warning for cloud customer moving to on-premise Two factor
239
+
240
+ = 5.4.1 =
241
+ * Google Authenticator - Two Factor Authentication (2FA) : Headers sent issue is security firewall.
242
+
243
+ = 5.4.0 =
244
+ * Google Authenticator - Two Factor Authentication (2FA) : Two Factor FAQ Fix and OTP code convenience.
245
+
246
+ = 5.3.26 =
247
+ * Google Authenticator - Two Factor Authentication (2FA) : Two Factor On-premise FAQ update.
248
+
249
+ = 5.3.25 =
250
+ * Google Authenticator - Two Factor Authentication (2FA) : Two Factor On-premise support form.
251
+
252
+ = 5.3.24 =
253
+ * Google Authenticator - Two Factor Authentication (2FA) : On-premise two factor released with multiple user support for some authentication methods.
254
+
255
+ = 5.3.23 =
256
+ * Google Authenticator - Two Factor Authentication (2FA) : Scanner : Timing and caching issue fix.
257
+ * Disable 2fa on WooCommerce login.
258
+ * Login with Username only fix.
259
+
260
+ = 5.3.22 =
261
+ * Google Authenticator - Two Factor Authentication (2FA) : Antivirus : Fixing Cache issues and adding nonce.
262
+
263
+ = 5.3.21 =
264
+ * Google Authenticator - Two Factor Authentication (2FA) : Two Factor : Choice between Two factor and Security.
265
+
266
+ = 5.3.20 =
267
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti Malware : Fixing issue faced by users during scan.
268
+
269
+ = 5.3.19 =
270
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Giving users choice of two factor.
271
+
272
+ = 5.3.18 =
273
+ * Google Authenticator - Two Factor Authentication (2FA) : Antivirus and Firewall : Fix Scan.
274
+
275
+ = 5.3.17 =
276
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti-Virus : Improved Stop Scan.
277
+
278
+ = 5.3.16 =
279
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti-Virus : Stop Scan.
280
+
281
+ = 5.3.15 =
282
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti-Malware : schedule scan.
283
+
284
+ = 5.3.14 =
285
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti-Malware : Adding more signatures.
286
+
287
+ = 5.3.13 =
288
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : fix UI Issue and improving 2fa.
289
+
290
+ = 5.3.12 =
291
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : backup table fix.
292
+
293
+ = 5.3.11 =
294
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Limiting Firewall, Malware, backup and login security for users not needing it.
295
+
296
+ = 5.3.10 =
297
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Moved to Old WAF version minor issues..
298
+
299
+ = 5.3.9 =
300
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Web application Firewall Sql Injections report and monitoring.
301
+
302
+ = 5.3.8 =
303
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Malware Scanner Fix.
304
+
305
+ = 5.3.7 =
306
+ * Google Authenticator - Two Factor Authentication (2FA) : Security : Two factor login with username fix.
307
+
308
+ = 5.3.6 =
309
+ * Google Authenticator - Two Factor Authentication (2FA) : Anti virus zip file fix.
310
+
311
+ = 5.3.5 =
312
+ * Google Authenticator - Two Factor Authentication (2FA) : Backup URL Fix and space issue in google authenticator.
313
+
314
+ = 5.3.4 =
315
+ * Google Authenticator - Two Factor Authentication (2FA) : CSS fix for Malware Scanner, Security and firewall.
316
+
317
+ = 5.3.3 =
318
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor Malware Scanner issues fix.
319
+
320
+ = 5.3.2 =
321
+ * Google Authenticator - Two Factor Authentication (2FA) : File Changes.
322
+
323
+ = 5.3.1 =
324
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix.
325
+
326
+ = 5.3.0 =
327
+ * Google Authenticator - Two Factor Authentication (2FA) : Releasing Firewall with Two Factor.
328
+
329
+ = 5.2.6 =
330
+ * Google Authenticator - Two Factor Authentication (2FA) : Fixed conflict and filter issues.
331
+
332
+ = 5.2.5 =
333
+ * Google Authenticator - Two Factor Authentication (2FA) : Some warnings in remote posts.
334
+
335
+ = 5.2.4 =
336
+ * Google Authenticator - Two Factor Authentication (2FA) : Removed curl calls and unnecessary files.
337
+
338
+ = 5.2.3 =
339
+ * Google Authenticator - Two Factor Authentication (2FA) : Fix for some users facing issues in api calls.
340
+
341
+ = 5.2.2 =
342
+ * Google Authenticator - Two Factor Authentication (2FA) : Adding File Protection and Strong Password feature.
343
+ :
344
+ = 5.2.1 =
345
+ * Google Authenticator - Two Factor Authentication (2FA) : UI changes for description.
346
+
347
+ = 5.2.0 =
348
+ * Google Authenticator - Two Factor Authentication (2FA) : UI changes with more description.
349
+
350
+ = 5.1.22 =
351
+ * Google Authenticator - Two Factor Authentication (2FA) : UI Fixes.
352
+
353
+ = 5.1.21 =
354
+ * Google Authenticator - Two Factor Authentication (2FA) : Login Redirect.
355
+
356
+ = 5.1.20 =
357
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor Bug fix.
358
+
359
+ = 5.1.19 =
360
+ * Google Authenticator - Two Factor Authentication (2FA) : Adding basic Security Features Monitoring, IP blocking and login transaction report.
361
+
362
+ = 5.1.18 =
363
+ * Google Authenticator - Two Factor Authentication (2FA) : Object access error for lower PHP versions.
364
+
365
+ = 5.1.17 =
366
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor Bug fix and Documentation changes.
367
+
368
+ = 5.1.16 =
369
+ * Google Authenticator - Two Factor Authentication (2FA) : Login redirect fix.
370
+
371
+ = 5.1.15 =
372
+ * Google Authenticator - Two Factor Authentication (2FA) : UI Fixes.
373
+
374
+ = 5.1.14 =
375
+ * Google Authenticator - Two Factor Authentication (2FA) : Database Error Fix and Custom Redirect.
376
+
377
+ = 5.1.12 =
378
+ * Google Authenticator - Two Factor Authentication (2FA) : Removing redundant code.
379
+
380
+ = 5.1.11 =
381
+ * Google Authenticator - Two Factor Authentication (2FA) : Password Pattern Fix.
382
+
383
+ = 5.1.10 =
384
+ * Google Authenticator - Two Factor Authentication (2FA) : Javascript Error fixes.
385
+
386
+ = 5.1.9 =
387
+ * Google Authenticator - Two Factor Authentication (2FA) : Added visual tour and security fixes.
388
+
389
+ = 5.1.8 =
390
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix for Validation.
391
+
392
+ = 5.1.7 =
393
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix for DB error after Update.
394
+
395
+ = 5.1.6 =
396
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix for DB error.
397
+
398
+ = 5.1.5 =
399
+ * Google Authenticator - Two Factor Authentication (2FA) : UI changes.
400
+
401
+ = 5.1.4 =
402
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fixes for redirect to login page issues.
403
+
404
+ = 5.1.3 =
405
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor bug fixes.
406
+
407
+ = 5.1.2 =
408
+ * Google Authenticator - Two Factor Authentication (2FA) : Changes in registration flow.
409
+
410
+ = 5.1.1 =
411
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor changes.
412
+
413
+ = 5.1.0 =
414
+ * Google Authenticator - Two Factor Authentication (2FA) : Added new user plans
415
+
416
+ = 5.0.17 =
417
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor Bug fix.
418
+
419
+ = 5.0.16 =
420
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fixes.
421
+
422
+ = 5.0.15 =
423
+ * Google Authenticator - Two Factor Authentication (2FA) : Added Google Authenticator option in the WP login page itself.
424
+
425
+ = 5.0.14 =
426
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug Fixes.
427
+
428
+ = 5.0.13 =
429
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug Fix and code optimization.
430
+
431
+ = 5.0.12 =
432
+ * Google Authenticator - Two Factor Authentication (2FA) : Added GDPR Compliance.
433
+
434
+ = 5.0.11 =
435
+ * Google Authenticator - Two Factor Authentication (2FA) : Readme Update.
436
+
437
+ = 5.0.10 =
438
+ * Google Authenticator - Two Factor Authentication (2FA) : Added Proxy Setup feature.
439
+
440
+ = 5.0.9 =
441
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug Fix for "The loopback request to your site failed." error.
442
+
443
+ = 5.0.8 =
444
+ * Google Authenticator - Two Factor Authentication (2FA) : Changes for 2FA Free plugin for 1 user forever.
445
+
446
+ = 5.0.7 =
447
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug Fix for User Registration and other plugin conflicts in Dashboard.
448
+
449
+ = 5.0.6 =
450
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug Fix for existing customers who upgraded from 4.5.x version to versions between 5.0.0 and 5.0.4 and are facing issues with the Account Setup Tab.
451
+
452
+ = 5.0.5 =
453
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix for user entry during plugin update.
454
+
455
+ = 5.0.4 =
456
+ * Google Authenticator - Two Factor Authentication (2FA) : Workaround for errors during sending of OTP during registration.
457
+
458
+ = 5.0.3 =
459
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor fix for removing warings.
460
+
461
+ = 5.0.2 =
462
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix.
463
+
464
+ = 5.0.1 =
465
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fix.
466
+
467
+ = 5.0.0 =
468
+ * Google Authenticator - Two Factor Authentication (2FA) : New UI Interface, 2-factor authentication for Unlimited Users.
469
+ * This is a major release.
470
+
471
+ = 4.6.2 =
472
+ * Google Authenticator - Two Factor Authentication (2FA) : Plugin registration fixes and minor warning fixes.
473
+
474
+ = 4.6.1 =
475
+ * Google Authenticator - Two Factor Authentication (2FA) : Login error fix. Please skip version 4.5.9 and update to version 4.6.1
476
+
477
+ = 4.5.9 =
478
+ * Google Authenticator - Two Factor Authentication (2FA) : Bug fixes for customers who were getting redirected to the login page after the two factor authentication.
479
+
480
+ = 4.5.8 =
481
+ * Google Authenticator - Two Factor Authentication (2FA) : Tested up to 4.9.4 and Removed External links.
482
+
483
+ = 4.5.7 =
484
+ * Google Authenticator - Two Factor Authentication (2FA) : Minor bug fixes.
485
+
486
+ = 4.5.6 =
487
+ * Google Authenticator - Two Factor Authentication (2FA) : Tested up to Wordpress 4.9.
488
+
489
+ = 4.5.5 =
490
+ * Google Authenticator - Two Factor Authentication (2FA) : 404 bug fixes.
491
+
492
+ = 4.5.4 =
493
+ * Google Authenticator - Two Factor Authentication (2FA) : Better UI of Login Pages, Fixed Redirection issue. Fixed the error in the last version (4.5.3) for the customers who were getting undefined action errors.
494
+
495
+ = 4.5.3 =
496
+ * Google Authenticator - Two Factor Authentication (2FA) : Changed UI of the Login Pages, Redirect to Login Page bug fixes.
497
+
498
+ = 4.5.2 =
499
+ * Google Authenticator - Two Factor Authentication (2FA) : Readme Update: Description Update
500
+
501
+ = 4.5.1 =
502
+ * Google Authenticator - Two Factor Authentication (2FA) : Updated the new Google Authenticator App's link and the 'How to Setup Tab' tab.
503
+
504
+ = 4.5.0 =
505
+ * Google Authenticator - Two Factor Authentication (2FA) : Fix Google Authenticator configuration issue.
506
+
507
+ = 4.4.9 =
508
+ * Google Authenticator - Two Factor Authentication (2FA) : Added Alert Message for SMS Transactions only when authentication method is OTP over SMS.
509
+
510
+ = 4.4.8 =
511
+ * Google Authenticator - Two Factor Authentication (2FA) : Added Alert Message for SMS Transactions. Fixed Remember Device flow and confliction with themes. Added support for multiple instances of wordpress.
512
+
513
+ = 4.4.7 =
514
+ * Google Authenticator - Two Factor Authentication (2FA) : Updated the error message for 2 factor configuration.
515
+
516
+ = 4.4.6 =
517
+ * Google Authenticator - Two Factor Authentication (2FA) : Instructions for login in case user get locked out.
518
+
519
+ = 4.4.5 =
520
+ * Google Authenticator - Two Factor Authentication (2FA) : Fixed the issue of session variable on the login with username page.
521
+
522
+ = 4.4.4 =
523
+ * Google Authenticator - Two Factor Authentication (2FA) : Added alert messages for OTP over SMS usages.
524
+
525
+ = 4.4.3 =
526
+ * Google Authenticator - Two Factor Authentication (2FA) : Fixed the login flow for third party Apps that supports XML-RPC.
527
+
528
+ = 4.4 =
529
+ * Google Authenticator - Two Factor Authentication (2FA):
530
+ * Note: This is a very important update having altogether a new UI and compatibility with Limit Login Attempts. After updating, please do not logout from your admin dashboard. Try to login from another browser and if you face any issue , please contact us at info@xecurify.com
531
+ * Compatibility with Limit Login Attempts.
532
+ * New User Interface for login.
533
+
534
+ = 4.3.2 =
535
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Revised licensing cost for users.
536
+
537
+ = 4.3.1 =
538
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Compatible upto 4.7
539
+
540
+ = 4.3.0 =
541
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Updated miniOrange APIs.
542
+
543
+ = 4.2.9 =
544
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Tested up to WordPress 4.6.
545
+
546
+ = 4.2.7 =
547
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Session Warning fix in the last version for some of the users.
548
+
549
+ = 4.2.6 =
550
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Compatible with wordpress caching.
551
+
552
+ = 4.2.5 =
553
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Improved the session handler.
554
+
555
+ = 4.2.4 =
556
+ * Google Authenticator - Two Factor Authentication (2FA, MFA): Updated faq for limit login attempt type of plugins.
557
+
558
+ = 4.2.3 =
559
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
560
+ * Improved Error handling during Account Creation.
561
+
562
+ = 4.2.2 =
563
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
564
+ * Registration Flow fixes
565
+
566
+ = 4.2.1 =
567
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
568
+ * Change of status during login with phone flow and tested with WP 4.5
569
+
570
+ = 4.2.0 =
571
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
572
+ * Mark as tested on Wordpress 4.5
573
+
574
+ = 4.1.8 =
575
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
576
+ * Changed the location of images used for the demo. Now being loaded from the site having SSL certificate.
577
+
578
+ = 4.1.7 =
579
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
580
+ * Improved Error Handling for Remember Device.
581
+
582
+ = 4.1.6 =
583
+ * Google Authenticator - Two Factor Authentication ( 2 Factor ):
584
+ * Licensing Plan Updated.
585
+
586
+ = 4.1.5 =
587
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
588
+ * Added Forgot Password functionality for miniOrange customer admin.
589
+ * Added warning message for the users who are using lower version of php.
590
+ * Added functionality to change the customer email.
591
+
592
+ = 4.1.4 =
593
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
594
+ * Added an option for admin to enable or disable login for XML-RPC supported applications.
595
+
596
+ = 4.1.3 =
597
+ * Google Authenticator - Two Factor Authentication ( 2FA ):
598
+ * Fixed CSS Conflict with the plugins in the admin dashboard.
599
+ * More intuitive UI for WooCommerce login.
600
+ * Tested front-end login with themes like wordpress default theme,
601
+ customize theme,zerif-lite theme,accesspress store theme,ishop theme and many more.
602
+
603
+ = 4.1.2 =
604
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Google Authenticator for Windows phone
605
+ * Fixed CSS conflict with front-end of site if WooCommerce is not enabled.
606
+
607
+ = 4.1.1 =
608
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Adding Validation in choosing Security Questions (KBA).
609
+
610
+ = 4.1.0 =
611
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Features added.
612
+ multisite support
613
+ Custom login redirection
614
+ Authy 2-Factor Authentication as separate authentication method
615
+
616
+ = 4.0.6 = Google Authenticator - Two Factor Authentication Added multisite support and custom redirection after login feature.
617
+
618
+ = 4.0.5 = Google Authenticator - Two Factor Authentication Login into third party apps which support XML-RPC.
619
+
620
+ = 4.0.4 = Google Authenticator - Two Factor Authentication Added a check of KBA configuration from mobile login.
621
+
622
+ = 4.0.3 = Google Authenticator - Two Factor Authentication Added Support for Authy 2-Factor Authentication App.
623
+
624
+ = 4.0.2 = Google Authenticator - Two Factor Authentication Added a check for selection of unique questions during KBA setup .
625
+
626
+ = 4.0.1 = Bug Fix Google Authenticator - 2 Factor
627
+
628
+ = 4.0 =
629
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Features added.
630
+ * KBA as backup method.
631
+ * mobile browser support.
632
+ * more intuitive UI for WooCommerce login.
633
+
634
+ = 3.8 =
635
+ * Google Authenticator - Two Factor Authentication ( 2 Factor ): Bug Fix for roles.
636
+
637
+ = 3.7 =
638
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Activation of two factor role wise.
639
+
640
+ = 3.6 =
641
+ * Google Authenticator - Two Factor Authentication ( 2FA ): email verification in inline registration flow for all users.
642
+ More descriptive setup messages and UI changes.
643
+
644
+ = 3.5 =
645
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Provided mobile login support.
646
+
647
+ = 3.4 =
648
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Features added
649
+ * Inline registration flow for users.
650
+ * Security Questions (KBA) as additional method
651
+ * Alternate way of user identification in customer creation.
652
+ * premium customizable features.
653
+
654
+ = 3.3 =
655
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Fix the issue of session for some versions of php.
656
+
657
+ = 3.2 =
658
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Fix for device-id compatibility.
659
+
660
+ = 3.1 =
661
+ * Google Authenticator - Two Factor Authentication ( 2 Factor ): Fix for 2FA ShortCode.
662
+
663
+ = 3.0 =
664
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Features added
665
+ * Google Authenticator.
666
+ * Device Id (Remember device).
667
+ * Choice given to admin to enable specific authentication methods for users.
668
+ * Two Factor support for WooCommerce theme.
669
+ * Short Code for various customized fronted login.
670
+ * More intuitive UI and descriptive instructions.
671
+
672
+ = 2.6 =
673
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Fix the compatibility issues of user session with other security plugins.
674
+
675
+ = 2.5 =
676
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Fix the compatibility issues with All In One WP Security & Firewall plugin.
677
+
678
+ = 2.4 =
679
+ * Google Authenticator - Two Factor Authentication ( 2FA ): UI fixes for admin media library dashboard.
680
+
681
+ = 2.3 =
682
+ * Google Authenticator - Two Factor Authentication ( 2FA ): More descriptive setup messages, more intuitive UI.
683
+
684
+ = 2.2 =
685
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Fixed css issues for existing users
686
+
687
+ = 2.1 =
688
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Added support for multiple Two Factor Choices like OTP Over SMS, Phone Call Verification, Push Notification, Soft Token (like Google Authenticator Code), Email Verification, etc.
689
+
690
+ = 2.0 =
691
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Added login with password plus second factor feature.
692
+
693
+ = 1.8 =
694
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Added feature of different login form choice,test authentication and help for configuration and setup.
695
+
696
+ = 1.7 =
697
+ * Bug Fixes Google Authenticator - Two Factor Authentication ( 2FA ): Modifying login screen adaptable to user's login form
698
+
699
+ = 1.6 =
700
+ * Bug Fixes Google Authenticator - Two Factor Authentication ( 2FA ): fetching 2 factor configuration when activating the plugin after deactivating it.
701
+
702
+ = 1.5 =
703
+ * Bug Fixes Google Authenticator - Two Factor Authentication ( 2FA ): Login issues and password save issues resolved
704
+
705
+ = 1.4 =
706
+ * Bug Fixes Google Authenticator - Two Factor Authentication ( 2FA ): Authentication was not working on some version of php.
707
+
708
+ = 1.3 =
709
+ * Google Authenticator - Two Factor Authentication Bug Fixes
710
+
711
+ = 1.2 =
712
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Added 2 factor for all users along with forgot phone functionality.
713
+
714
+ = 1.1 =
715
+ * Google Authenticator - Two Factor Authentication ( 2FA ): Added email ID verification during registration.
716
+
717
+ = 1.0.0 =
718
+ * First version of Google Authenticator - Two Factor Authentication ( 2FA ) plugin supported with mobile authentication for admins only.
controllers/account.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  global $moWpnsUtility,$mo2f_dirName,$Mo2fdbQueries;
4
 
5
- if ( current_user_can( 'manage_options' ) and isset( $_POST['option'] ) )
6
  {
7
  $option = trim($_POST['option']);
8
  switch($option)
@@ -280,7 +280,7 @@
280
  if ( ! empty( $mo2f_customer_selected_plan ) ) {
281
  delete_option( 'mo2f_customer_selected_plan' );
282
 
283
- if (MoWpnsUtility::get_mo2f_db_option('mo2f_planname', 'get_option') == 'addon_plan')
284
  {
285
  ?><script>window.location.href="admin.php?page=mo_2fa_addons";</script><?php
286
  }
2
 
3
  global $moWpnsUtility,$mo2f_dirName,$Mo2fdbQueries;
4
 
5
+ if(isset($_POST['option']))
6
  {
7
  $option = trim($_POST['option']);
8
  switch($option)
280
  if ( ! empty( $mo2f_customer_selected_plan ) ) {
281
  delete_option( 'mo2f_customer_selected_plan' );
282
 
283
+ if (MoWpnsUtility::get_mo2f_db_option('mo2f_planname', 'site_option') == 'addon_plan')
284
  {
285
  ?><script>window.location.href="admin.php?page=mo_2fa_addons";</script><?php
286
  }
controllers/content-protection.php CHANGED
@@ -25,6 +25,7 @@ $enable_recaptcha = get_option('mo_wpns_enable_comment_recaptcha') ? "chec
25
  $htaccess_file = get_option('mo2f_htaccess_file') ? "checked" : "";
26
  $restAPI = get_site_option('mo2f_restrict_restAPI') ? "checked" : "";
27
  $test_recaptcha_url = "";
 
28
  $wp_config = site_url().'/wp-config.php';
29
  $wp_uploads = get_site_url().'/wp-content/uploads';
30
  $plugin_editor = get_site_url().'/wp-admin/plugin-editor.php';
25
  $htaccess_file = get_option('mo2f_htaccess_file') ? "checked" : "";
26
  $restAPI = get_site_option('mo2f_restrict_restAPI') ? "checked" : "";
27
  $test_recaptcha_url = "";
28
+ $test_recaptcha_url_v3 = "";
29
  $wp_config = site_url().'/wp-config.php';
30
  $wp_uploads = get_site_url().'/wp-content/uploads';
31
  $plugin_editor = get_site_url().'/wp-admin/plugin-editor.php';
controllers/dashboard.php CHANGED
@@ -20,4 +20,4 @@
20
  $total_malicious=($total_malicious/1000);
21
  $total_malicious= round($total_malicious,1)."k";
22
  }
23
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'dashboard.php';
20
  $total_malicious=($total_malicious/1000);
21
  $total_malicious= round($total_malicious,1)."k";
22
  }
23
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'dashboard.php';
controllers/duo_authenticator/duo_authenticator_ajax.php CHANGED
@@ -53,10 +53,10 @@ class Mo_2f_duo_authenticator
53
  $user_email = $current_user->user_email;
54
 
55
  $device['device'] = 'auto';
56
-
57
- $auth_response = mo2f_duo_auth( $user_email,'push',$device , $skey, $ikey, $host,true);
58
-
59
 
 
 
 
60
  if(isset($auth_response['response']['response']['result']) && $auth_response['response']['response']['result'] == 'allow'){
61
 
62
  wp_send_json('SUCCESS');
53
  $user_email = $current_user->user_email;
54
 
55
  $device['device'] = 'auto';
 
 
 
56
 
57
+ $auth_response = mo2f_duo_auth( $user_email,'push',$device , $skey, $ikey, $host,true);
58
+
59
+
60
  if(isset($auth_response['response']['response']['result']) && $auth_response['response']['response']['result'] == 'allow'){
61
 
62
  wp_send_json('SUCCESS');
controllers/feedback_footer.php CHANGED
@@ -7,7 +7,8 @@
7
  switch($_POST['option'])
8
  {
9
  case "mo_wpns_send_query":
10
- wpns_handle_feedback_footer_form($_POST['query_email'],$_POST['query'],$_POST['query_phone']); break;
 
11
  }
12
  }
13
 
@@ -19,29 +20,38 @@
19
  /* SUPPORT FORM RELATED FUNCTIONS */
20
 
21
  //Function to handle support form submit
22
- function wpns_handle_feedback_footer_form($email,$query,$phone)
23
- {
24
-
25
- if( empty($email) || empty($query) )
26
- {
27
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'ERROR');
28
- return;
29
- }
30
-
31
-
32
- $query = sanitize_text_field( $query );
33
- $email = sanitize_text_field( $email );
34
- $phone = sanitize_text_field( $phone );
35
- $contact_us = new MocURL();
36
- $submited = json_decode($contact_us->submit_contact_us($email, $phone, $query),true);
37
-
38
- if(json_last_error() == JSON_ERROR_NONE && $submited)
39
- {
40
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
41
- return;
42
- }
43
-
44
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
45
- }
46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_footer.php';
7
  switch($_POST['option'])
8
  {
9
  case "mo_wpns_send_query":
10
+ wpns_handle_support_form_new($_POST['query_email'],$_POST['query'],$_POST['query_phone']);
11
+ break;
12
  }
13
  }
14
 
20
  /* SUPPORT FORM RELATED FUNCTIONS */
21
 
22
  //Function to handle support form submit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
+ if(empty($email))
25
+ $email = $current_user->user_email;
26
+
27
+ function wpns_handle_support_form_new($email,$query,$phone)
28
+ {
29
+ $send_configuration = (isset($_POST['mo2f_send_configuration'])?$_POST['mo2f_send_configuration']:0);
30
+
31
+ if(empty($email) || empty($query)){
32
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'ERROR');
33
+ return;
34
+ }
35
+
36
+ $query = sanitize_text_field( $query );
37
+ $email = sanitize_text_field( $email );
38
+ $phone = sanitize_text_field( $phone );
39
+ $contact_us = new MocURL();
40
+
41
+ if($send_configuration)
42
+ $query = $query.MoWpnsUtility::mo_2fa_send_configuration(true);
43
+ else
44
+ $query = $query.MoWpnsUtility::mo_2fa_send_configuration();
45
+
46
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
47
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
48
+ } else {
49
+ $submited = json_decode($contact_us->submit_contact_us( $email, $phone, $query),true);
50
+ }
51
+ if(json_last_error() == JSON_ERROR_NONE && $submited){
52
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
53
+ }else{
54
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
55
+ }
56
+ }
57
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_footer.php';
controllers/login-security.php CHANGED
@@ -27,9 +27,6 @@
27
  wpns_handle_enable_strong_password($_POST); break;
28
  case "mo_wpns_rba_enable_2fa":
29
  wpns_handle_enable_rba(); break;
30
-
31
- case "mo_wpns_activate_recaptcha":
32
- wpns_handle_enable_recaptcha($_POST); break;
33
  case "mo_wpns_recaptcha_settings":
34
  wpns_handle_recaptcha_configuration($_POST); break;
35
  case "mo_wpns_enable_rename_login_url":
@@ -48,12 +45,26 @@
48
 
49
  $enforce_strong_password= MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option') ? "checked" : "";
50
  $attack_delay = get_option('mo_wpns_slow_down_attacks_delay') ? get_option('mo_wpns_slow_down_attacks_delay'): 2 ;
51
- $google_recaptcha = get_option('mo_wpns_activate_recaptcha') ? "checked" : "";
52
- $test_recaptcha_url = "";
 
 
53
  $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
54
- $captcha_url = 'https://www.google.com/recaptcha/admin#list';
 
 
 
 
 
 
55
  $captcha_site_key = get_option('mo_wpns_recaptcha_site_key');
56
- $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');
 
 
 
 
 
 
57
  $captcha_login = get_option('mo_wpns_activate_recaptcha_for_login') ? "checked" : "";
58
  $captcha_reg = get_option('mo_wpns_activate_recaptcha_for_registration') ? "checked" : "";
59
 
@@ -183,21 +194,8 @@
183
 
184
 
185
  //Function to handle recaptcha configuration
186
- function wpns_handle_recaptcha_configuration($postData)
187
- {
188
- $enable_login= isset($postData['mo_wpns_activate_recaptcha_for_login']) ? true : false;
189
- $enable_reg = isset($postData['mo_wpns_activate_recaptcha_for_registration']) ? true : false;
190
- $site_key = sanitize_text_field($_POST['mo_wpns_recaptcha_site_key']);
191
- $secret_key = sanitize_text_field($_POST['mo_wpns_recaptcha_secret_key']);
192
-
193
- update_option( 'mo_wpns_activate_recaptcha_for_login' , $enable_login );
194
- update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
195
- update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
196
- update_option( 'mo_wpns_activate_recaptcha_for_registration', $enable_reg );
197
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login' , $enable_login );
198
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration', $enable_reg );
199
- do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
200
- }
201
 
202
 
203
  function wpns_handle_enable_rename_login_url($postData){
27
  wpns_handle_enable_strong_password($_POST); break;
28
  case "mo_wpns_rba_enable_2fa":
29
  wpns_handle_enable_rba(); break;
 
 
 
30
  case "mo_wpns_recaptcha_settings":
31
  wpns_handle_recaptcha_configuration($_POST); break;
32
  case "mo_wpns_enable_rename_login_url":
45
 
46
  $enforce_strong_password= MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option') ? "checked" : "";
47
  $attack_delay = get_option('mo_wpns_slow_down_attacks_delay') ? get_option('mo_wpns_slow_down_attacks_delay'): 2 ;
48
+ $google_recaptcha = get_option('mo_wpns_activate_recaptcha') ? "checked": "";
49
+
50
+
51
+
52
  $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
53
+
54
+
55
+ $test_recaptcha_url_v3 = add_query_arg( array('option'=>'testrecaptchaconfig3'), $_SERVER['REQUEST_URI'] );
56
+ $captcha_url_v2 = 'https://www.google.com/recaptcha/admin#list';
57
+ $captcha_url_v3 = 'https://www.google.com/recaptcha/admin/create';
58
+
59
+ if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v2'){
60
  $captcha_site_key = get_option('mo_wpns_recaptcha_site_key');
61
+ $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');}
62
+
63
+ else if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v3'){
64
+ $captcha_site_key = get_option('mo_wpns_recaptcha_site_key_v3');
65
+ $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key_v3');
66
+ }
67
+
68
  $captcha_login = get_option('mo_wpns_activate_recaptcha_for_login') ? "checked" : "";
69
  $captcha_reg = get_option('mo_wpns_activate_recaptcha_for_registration') ? "checked" : "";
70
 
194
 
195
 
196
  //Function to handle recaptcha configuration
197
+
198
+
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
 
201
  function wpns_handle_enable_rename_login_url($postData){
controllers/main_controller.php CHANGED
@@ -4,63 +4,57 @@
4
 
5
  $controller = $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR;
6
 
7
-
8
- if(current_user_can('administrator'))
9
- {
10
- include $controller . 'navbar.php';
11
- include $controller . 'newtork_security_features.php';
12
 
13
- $tour_started=get_option('mo2f_tour_started',0);
14
-
15
 
16
- if($tour_started<1)
17
- include $controller . 'two-fa-intro.php';
18
- else if($tour_started != 0)
19
- include $controller . 'tour-model.php';
20
-
21
- if( isset( $_GET[ 'page' ]))
22
- {
23
- switch($_GET['page'])
24
  {
25
- case 'mo_2fa_dashboard':
26
- include $controller . 'dashboard.php'; break;
27
- case 'mo_2fa_login_and_spam':
28
- include $controller . 'login-spam.php'; break;
29
- case 'default':
30
- include $controller . 'login-security.php'; break;
31
- case 'mo_2fa_account':
32
- include $controller . 'account.php'; break;
33
- case 'mo_2fa_backup':
34
- include $controller . 'backup'.DIRECTORY_SEPARATOR.'backup.php'; break;
35
- case 'mo_2fa_upgrade':
36
- include $controller . 'upgrade.php'; break;
37
- case 'mo_2fa_waf':
38
- include $controller . 'waf.php'; break;
39
- case 'mo_2fa_blockedips':
40
- include $controller . 'ip-blocking.php'; break;
41
- case 'mo_2fa_advancedblocking':
42
- include $controller . 'advanced-blocking.php'; break;
43
- case 'mo_2fa_notifications':
44
- include $controller . 'notification-settings.php'; break;
45
- case 'mo_2fa_reports':
46
- include $controller . 'reports.php'; break;
47
- case 'mo_2fa_licensing':
48
- include $controller . 'licensing.php'; break;
49
- case 'mo_2fa_troubleshooting':
50
- include $controller . 'troubleshooting.php'; break;
51
- case 'mo_2fa_addons':
52
- include $controller . 'addons.php'; break;
53
- case 'mo_2fa_malwarescan':
54
- include $controller . 'malware_scanner'.DIRECTORY_SEPARATOR.'scan_malware.php'; break;
55
- case 'mo_2fa_two_fa':
56
- include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
57
- case 'mo_2fa_request_demo':
58
- include $controller . 'request_demo.php'; break;
59
- case 'mo_2fa_request_offer':
60
- include $controller . 'request_offer.php';
61
- }
62
- }
 
 
63
 
 
 
64
  }
65
  else
66
  {
@@ -69,7 +63,7 @@
69
  switch($_GET['page'])
70
  {
71
  case 'mo_2fa_two_fa':
72
- include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
73
 
74
  }
75
 
@@ -78,36 +72,12 @@
78
  }
79
  if (isset( $_GET[ 'page' ])) {
80
 
81
- if ($_GET[ 'page' ] == "mo_2fa_upgrade" || $_GET[ 'page' ] == "mo_2fa_addons")
82
- {
83
- include $controller . 'feedback_footer.php';
84
- }
85
- else
86
- {
87
- include $controller . 'support.php';
88
- }
89
  }
 
90
  ?>
91
 
92
- <!-- <script>
93
- jQuery(document).ready(function(){
94
- var nonce = "<?php //echo wp_create_nonce('wpns-quick-scan');?>";
95
- var data={
96
- 'action':'mo_wpns_malware_redirect',
97
- 'call_type':'malware_scan_initiate',
98
- 'scan':'scan_start',
99
- 'scantype':'quick_scan',
100
- 'nonce': nonce
101
- };
102
- jQuery.post(ajaxurl, data, function(response){
103
- jQuery('input[name="quick_scan_button"]').removeAttr('disabled');
104
- document.getElementById('quick_scan_button').style.backgroundColor = '#20b2aa';
105
- jQuery('input[name="standard_scan_button"]').removeAttr('disabled');
106
- document.getElementById('standard_scan_button').style.backgroundColor = '#20b2aa';
107
- jQuery('input[name="custom_scan_button"]').removeAttr('disabled');
108
- document.getElementById('custom_scan_button').style.backgroundColor = '#20b2aa';
109
- document.getElementById("quick_scan_button").value = "Quick Scan";
110
- });
111
- });
112
- </script> -->
113
-
4
 
5
  $controller = $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR;
6
 
7
+ include_once $controller . 'navbar.php';
8
+ if(current_user_can('administrator'))
9
+ {
 
 
10
 
11
+ include_once $controller . 'newtork_security_features.php';
 
12
 
13
+ if( isset( $_GET[ 'page' ]))
 
 
 
 
 
 
 
14
  {
15
+ switch($_GET['page'])
16
+ {
17
+ case 'mo_2fa_dashboard':
18
+ include_once $controller . 'dashboard.php'; break;
19
+ case 'mo_2fa_login_and_spam':
20
+ include_once $controller . 'login-spam.php'; break;
21
+ case 'default':
22
+ include_once $controller . 'login-security.php'; break;
23
+ case 'mo_2fa_account':
24
+ include_once $controller . 'account.php'; break;
25
+ case 'mo_2fa_backup':
26
+ include_once $controller . 'backup'.DIRECTORY_SEPARATOR.'backup.php'; break;
27
+ case 'mo_2fa_upgrade':
28
+ include_once $controller . 'upgrade.php'; break;
29
+ case 'mo_2fa_waf':
30
+ include_once $controller . 'waf.php'; break;
31
+ case 'mo_2fa_blockedips':
32
+ include_once $controller . 'ip-blocking.php'; break;
33
+ case 'mo_2fa_advancedblocking':
34
+ include_once $controller . 'advanced-blocking.php'; break;
35
+ case 'mo_2fa_notifications':
36
+ include_once $controller . 'notification-settings.php'; break;
37
+ case 'mo_2fa_reports':
38
+ include_once $controller . 'reports.php'; break;
39
+ case 'mo_2fa_licensing':
40
+ include_once $controller . 'licensing.php'; break;
41
+ case 'mo_2fa_troubleshooting':
42
+ include_once $controller . 'troubleshooting.php'; break;
43
+ case 'mo_2fa_addons':
44
+ include_once $controller . 'addons.php'; break;
45
+ case 'mo_2fa_malwarescan':
46
+ include_once $controller . 'malware_scanner'.DIRECTORY_SEPARATOR.'scan_malware.php'; break;
47
+ case 'mo_2fa_two_fa':
48
+ include_once $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
49
+ case 'mo_2fa_request_demo':
50
+ include_once $controller . 'request_demo.php'; break;
51
+ case 'mo_2fa_request_offer':
52
+ include_once $controller . 'request_offer.php'; break;
53
+ case 'mo2f_trial':
54
+ include_once $controller . 'trial.php'; break;
55
 
56
+ }
57
+ }
58
  }
59
  else
60
  {
63
  switch($_GET['page'])
64
  {
65
  case 'mo_2fa_two_fa':
66
+ include_once $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
67
 
68
  }
69
 
72
  }
73
  if (isset( $_GET[ 'page' ])) {
74
 
75
+
76
+ if (MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option') || $_GET[ 'page' ] == "mo_2fa_upgrade" || $_GET[ 'page' ] == "mo_2fa_addons" || $_GET['page'] == "mo_2fa_account"
77
+ || $_GET['page']=="mo_2fa_waf" || $_GET['page']=="mo_2fa_login_and_spam" || $_GET['page']=="mo_2fa_dashboard")
78
+ {
79
+ include_once $controller . 'feedback_footer.php';
 
 
 
80
  }
81
+ }
82
  ?>
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
controllers/malware_scanner/malware_scan_ajax.php CHANGED
@@ -8,6 +8,8 @@ class Mo_wpns_scan_malware
8
 
9
  public function mo_wpns_malware_scanner_functions(){
10
  add_action('wp_ajax_mo_wpns_malware_redirect', array( $this, 'mo_wpns_malware_redirect' ));
 
 
11
  }
12
 
13
  public function mo_wpns_malware_redirect(){
@@ -34,6 +36,7 @@ class Mo_wpns_scan_malware
34
  case "malware_scan_terminate":
35
  $this->mo_wpns_stop_scan();
36
  break;
 
37
  }
38
  }
39
 
@@ -363,6 +366,11 @@ class Mo_wpns_scan_malware
363
  wp_send_json('success');
364
  }
365
 
 
 
 
 
 
366
  function mo_wpns_get_scan_result(){
367
  $decoded_scan_configuration=json_decode(get_site_option('mo_wpns_scan_status'));
368
  $status=$decoded_scan_configuration->scan_progress;
8
 
9
  public function mo_wpns_malware_scanner_functions(){
10
  add_action('wp_ajax_mo_wpns_malware_redirect', array( $this, 'mo_wpns_malware_redirect' ));
11
+
12
+
13
  }
14
 
15
  public function mo_wpns_malware_redirect(){
36
  case "malware_scan_terminate":
37
  $this->mo_wpns_stop_scan();
38
  break;
39
+
40
  }
41
  }
42
 
366
  wp_send_json('success');
367
  }
368
 
369
+
370
+
371
+
372
+
373
+
374
  function mo_wpns_get_scan_result(){
375
  $decoded_scan_configuration=json_decode(get_site_option('mo_wpns_scan_status'));
376
  $status=$decoded_scan_configuration->scan_progress;
controllers/navbar.php CHANGED
@@ -68,7 +68,8 @@
68
  $dashboard_url = add_query_arg(array('page' => 'mo_2fa_dashboard' ), $_SERVER['REQUEST_URI']);
69
  $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
70
  $request_demo_url = add_query_arg(array('page' => 'mo_2fa_request_demo' ), $_SERVER['REQUEST_URI']);
71
- $request_offer_url = add_query_arg(array('page' => 'mo_2fa_request_offer' ), $_SERVER['REQUEST_URI']);
 
72
 
73
  //dynamic
74
  $logo_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/miniorange_logo.png';
68
  $dashboard_url = add_query_arg(array('page' => 'mo_2fa_dashboard' ), $_SERVER['REQUEST_URI']);
69
  $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
70
  $request_demo_url = add_query_arg(array('page' => 'mo_2fa_request_demo' ), $_SERVER['REQUEST_URI']);
71
+ $request_offer_url = add_query_arg(array('page' => 'mo_2fa_request_offer' ), $_SERVER['REQUEST_URI']);
72
+ $trial_url = add_query_arg( array('page' => 'mo2f_trial' ), $_SERVER['REQUEST_URI'] );
73
 
74
  //dynamic
75
  $logo_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/miniorange_logo.png';
controllers/request_christmas_offer.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
5
+ {
6
+ switch($_POST['option'])
7
+ {
8
+ case "mo_2FA_christmas_request_form":
9
+ wpns_handle_christmas_request_form($_POST); break;
10
+ }
11
+ }
12
+
13
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'request_christmas_offer.php';
14
+
15
+ function wpns_handle_christmas_request_form($post){
16
+ $nonce = isset($post['nonce'])?$post['nonce']:NULL;
17
+ $usecase = isset($post['mo_2FA_christmas_usecase'])? $post['mo_2FA_christmas_usecase']: NULL;
18
+ $email = isset($post['mo_2FA_christmas_email'])? $post['mo_2FA_christmas_email'] : NULL;
19
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-Request-christmas' ) ){
20
+ return;
21
+ }
22
+ if(empty($usecase) || empty($email) )
23
+ {
24
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DEMO_FORM_ERROR'),'SUCCESS');
25
+ return;
26
+ }
27
+ else{
28
+
29
+ $usecase = sanitize_text_field( $usecase );
30
+ $email = sanitize_text_field( $email );
31
+ $query = 'REQUEST FOR CHRISTMAS OFFERS';
32
+ $query .= ' =>';
33
+ $query .= ' : ';
34
+ $query .= $usecase;
35
+ $contact_us = new MocURL();
36
+ $submited = json_decode($contact_us->submit_contact_us($email, '', $query),true);
37
+
38
+ if(json_last_error() == JSON_ERROR_NONE && $submited)
39
+ {
40
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
41
+ return;
42
+ }
43
+ else{
44
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
45
+ }
46
+ }
47
+ }
48
+ ?>
controllers/request_offer.php CHANGED
@@ -26,7 +26,7 @@
26
  }
27
  else{
28
 
29
- $query = 'REQUEST FOR NEW YEAR OFFERS';
30
  $query .= ' =>';
31
  $query .= ' : ';
32
  $query .= $usecase;
26
  }
27
  else{
28
 
29
+ $query = 'REQUEST FOR SPECIAL OFFERS';
30
  $query .= ' =>';
31
  $query .= ' : ';
32
  $query .= $usecase;
controllers/support.php CHANGED
@@ -4,6 +4,8 @@
4
 
5
  if(current_user_can( 'manage_options' ) && isset($_POST['option']))
6
  {
 
 
7
  switch($_POST['option'])
8
  {
9
  case "mo_wpns_send_query":
@@ -27,13 +29,7 @@
27
  //Function to handle support form submit
28
  function wpns_handle_support_form($email,$query,$phone)
29
  {
30
- $call_setup = false;
31
- if(array_key_exists('2fa_setup_call',$_POST)===true){
32
- $time_zone = sanitize_text_field($_POST['mo_2fa_setup_call_timezone']);
33
- $call_date = sanitize_text_field($_POST['mo_2fa_setup_call_date']);
34
- $call_time = sanitize_text_field($_POST['mo_2fa_setup_call_time']);
35
- $call_setup = true;
36
- }
37
  $send_configuration = (isset($_POST['mo2f_send_configuration'])?$_POST['mo2f_send_configuration']:0);
38
  if(empty($email) || empty($query)){
39
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'ERROR');
@@ -49,26 +45,11 @@
49
  else
50
  $query = $query.MoWpnsUtility::mo_2fa_send_configuration();
51
 
52
- if($call_setup == false) {
53
- $query = $query.'<br><br>';
54
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
55
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
56
  } else {
57
  $submited = json_decode($contact_us->submit_contact_us( $email, $phone, $query),true);
58
  }
59
- } else {
60
-
61
- $local_timezone='Asia/Kolkata';
62
- $call_datetime=$call_date.$call_time;
63
- $convert_datetime = strtotime ( $call_datetime );
64
- $ist_date = new DateTime(date ( 'Y-m-d H:i:s' , $convert_datetime ), new DateTimeZone($time_zone));
65
- $ist_date->setTimezone(new DateTimeZone($local_timezone));
66
-
67
-
68
- $query = $query . '<br><br>' .'Meeting Details: '.'('.$time_zone.') '. date('d M, Y H:i',$convert_datetime). ' [IST Time -> '. $ist_date->format('d M, Y H:i').']'.'<br><br>';
69
- $submited = json_decode($contact_us->submit_contact_us( $email, $phone, $query, true),true);
70
-
71
- }
72
  if(json_last_error() == JSON_ERROR_NONE && $submited){
73
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
74
  }else{
4
 
5
  if(current_user_can( 'manage_options' ) && isset($_POST['option']))
6
  {
7
+
8
+
9
  switch($_POST['option'])
10
  {
11
  case "mo_wpns_send_query":
29
  //Function to handle support form submit
30
  function wpns_handle_support_form($email,$query,$phone)
31
  {
32
+
 
 
 
 
 
 
33
  $send_configuration = (isset($_POST['mo2f_send_configuration'])?$_POST['mo2f_send_configuration']:0);
34
  if(empty($email) || empty($query)){
35
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'ERROR');
45
  else
46
  $query = $query.MoWpnsUtility::mo_2fa_send_configuration();
47
 
 
 
48
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
49
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
50
  } else {
51
  $submited = json_decode($contact_us->submit_contact_us( $email, $phone, $query),true);
52
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  if(json_last_error() == JSON_ERROR_NONE && $submited){
54
  do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
55
  }else{
controllers/tour-model.php CHANGED
@@ -290,7 +290,7 @@
290
  </tr>
291
  <tr>
292
  <td>
293
- <textarea id="query" name="query" class="mo_wpns_settings_textarea" style="resize: vertical;width:100%" cols="52" rows="7" onkeyup="mo_wpns_valid(this)" onblur="mo_wpns_valid(this)" onkeypress="mo_wpns_valid(this)" placeholder="Write your query here"></textarea>
294
  </td>
295
  </tr>
296
  </table>
290
  </tr>
291
  <tr>
292
  <td>
293
+ <textarea id="query" name="query" class="mo_wpns_settings_textarea" style="resize: vertical;width:100%" cols="52" rows="7" placeholder="Write your query here"></textarea>
294
  </td>
295
  </tr>
296
  </table>
controllers/trial.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
5
+ {
6
+ switch(sanitize_text_field($_POST['option']))
7
+ {
8
+ case "mo2f_trial_request_form":
9
+ mo2f_handle_trial_request_form($_POST); break;
10
+ }
11
+ }
12
+ global $mo2f_dirName;
13
+ $current_user = wp_get_current_user();
14
+ $email = isset($current_user->user_email)?$current_user->user_email:null;
15
+ $url = get_site_url();
16
+ $user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $current_user->ID );
17
+
18
+
19
+ echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/style_settings.css', dirname(__FILE__)) . '" />';
20
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'trial.php';
21
+
22
+ function mo2f_handle_trial_request_form($post){
23
+ $nonce = isset($post['nonce'])?sanitize_text_field($post['nonce']):NULL;
24
+ if ( ! wp_verify_nonce( $nonce, 'mo2f_trial-nonce' ) ){
25
+ return;
26
+ }
27
+
28
+ $email = isset($post['mo2f_trial_email'])? $post['mo2f_trial_email'] : NULL;
29
+ $phone = isset($post['mo2f_trial_phone'])? $post['mo2f_trial_phone'] : ( $user_phone ? $user_phone : NULL );
30
+ $trial_plan = isset($post['mo2f_trial_plan'])? $post['mo2f_trial_plan']: NULL;
31
+
32
+ if(get_site_option('mo2f_trial_query_sent')){
33
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TRIAL_REQUEST_ALREADY_SENT'),'ERROR');
34
+ return;
35
+ }
36
+
37
+ if(empty($email) || empty($phone) || empty($trial_plan))
38
+ {
39
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('REQUIRED_FIELDS'),'ERROR');
40
+ return;
41
+ }
42
+ if(!preg_match("/^[\+][0-9]{1,4}\s?[0-9]{7,12}$/", $phone)){
43
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_PHONE'),'ERROR');
44
+ return;
45
+ }
46
+ else{
47
+ $email = filter_var( $email,FILTER_VALIDATE_EMAIL );
48
+ $phone = preg_replace('/[^0-9]/', '', $phone);
49
+ $trial_plan = sanitize_text_field($trial_plan);
50
+ $query = 'REQUEST FOR TRIAL';
51
+ $query .= ' [ Plan Name => ';
52
+ $query .= $trial_plan;
53
+ $query .= ' | Email => ';
54
+ $query .= get_option('mo2f_email').' ]';
55
+ $current_user = wp_get_current_user();
56
+
57
+
58
+ $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/contact-us";
59
+ global $mowafutility;
60
+ $query = '[WordPress 2 Factor Authentication Plugin: OV3 - '.MO2F_VERSION.']: ' . $query;
61
+
62
+ $fields = array(
63
+ 'firstName' => $current_user->user_firstname,
64
+ 'lastName' => $current_user->user_lastname,
65
+ 'company' => $_SERVER['SERVER_NAME'],
66
+ 'email' => $email,
67
+ 'ccEmail' => '2fasupport@xecurify.com',
68
+ 'phone' => $phone,
69
+ 'query' => $query
70
+ );
71
+ $field_string = json_encode( $fields );
72
+
73
+ $mo2fApi= new Mo2f_Api();
74
+ $response = $mo2fApi->make_curl_call($url, $field_string);
75
+
76
+ $submitted = $response;
77
+
78
+ if(json_last_error() == JSON_ERROR_NONE && $submitted)
79
+ {
80
+ update_site_option('mo2f_trial_query_sent', true);
81
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TRIAL_REQUEST_SENT'),'SUCCESS');
82
+ return;
83
+ }
84
+ else{
85
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
86
+ }
87
+
88
+ }
89
+ }
90
+
91
+ ?>
controllers/two-fa-intro.php CHANGED
@@ -24,9 +24,9 @@
24
  </div>
25
 
26
  <div class="modal-footer" style="border: 0px;">
27
- <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button readytogo mo2f_advance_setting" onclick="skipintro();">Advance Settings</button>
28
- <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button " style="margin-left: 5%;width: 40%;background-color:#2EB150;float: left;min-height: 54px;border: 2px solid black;" title="Logout and check the user experience" onclick="mo2f_userlogout()">Logout and Configure</button>
29
- <div class="mo2f_tooltip_addon logout mo_wpns_button mo_wpns_button1 modal-button " style="float: left;border: 2px solid black;border-left:none;width: 6%;box-shadow: none;text-decoration:none;background-color: #2EB150;margin-left: -5px;min-height: 50px;">
30
  <span class="dashicons dashicons-info mo2f_info_tab" style="color: white;font-size: 27px;margin-top: 14px;margin-left: -12px;"></span>
31
  <span class="mo2f_tooltiptext_addon mo2f_logout_and_configure_info" style="font-size: 20px;font-family: auto; text-align: justify;font-weight: lighter;background-color: #2EB150; font-size: 20px;">
32
  <ul style="list-style-type:square;margin: 10px 18px 10px 18px;"><li>This will logout you and will ask you to set your 2FA on next login.</li><li> New and existing users can set their 2FA on next login.</li></ul>
24
  </div>
25
 
26
  <div class="modal-footer" style="border: 0px;">
27
+ <button type="button" class="button button-primary button-large modal-button readytogo mo2f_advance_setting" onclick="skipintro();">Advance Settings</button>
28
+ <button type="button" class="button button-primary button-large modal-button mo2fa_tour_button" title="Logout and check the user experience" onclick="mo2f_userlogout()">Logout and Configure</button>
29
+ <div class="mo2f_tooltip_addon logout button button-primary button-large modal-button " style="float: left;border: 2px solid black;border-left:none;width: 6%;box-shadow: none;text-decoration:none;background-color: #2271b1;margin-left: -5px;min-height: 50px;">
30
  <span class="dashicons dashicons-info mo2f_info_tab" style="color: white;font-size: 27px;margin-top: 14px;margin-left: -12px;"></span>
31
  <span class="mo2f_tooltiptext_addon mo2f_logout_and_configure_info" style="font-size: 20px;font-family: auto; text-align: justify;font-weight: lighter;background-color: #2EB150; font-size: 20px;">
32
  <ul style="list-style-type:square;margin: 10px 18px 10px 18px;"><li>This will logout you and will ask you to set your 2FA on next login.</li><li> New and existing users can set their 2FA on next login.</li></ul>
controllers/twofa/mo2fa_common_login.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- function mo2f_collect_device_attributes_handler( $redirect_to = null,$session_id_encrypt ) {
3
  ?>
4
  <html>
5
  <head>
@@ -40,7 +40,79 @@ function mo2f_collect_device_attributes_handler( $redirect_to = null,$session_id
40
  </html>
41
  <?php
42
  }
43
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  function miniorange_get_user_role( $user ) {
45
  return $user->roles;
46
  }
@@ -257,10 +329,12 @@ function mo2f_get_forgotphone_form( $login_status, $login_message, $redirect_to,
257
  <?php }
258
 
259
  function mo2f_get_kba_authentication_prompt($login_status, $login_message, $redirect_to, $session_id_encrypt , $cookievalue) {
 
260
  $mo_wpns_config = new MoWpnsHandler();
261
  $mo2f_login_option = MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option');
262
  $mo2f_remember_device_enabled = get_option( 'mo2f_remember_device' );
263
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
 
264
  ?>
265
  <html>
266
  <head>
@@ -482,11 +556,11 @@ function mo2f_backup_form($login_status, $login_message, $redirect_to, $session_
482
  <?php
483
  }
484
 
485
- function mo2f_get_duo_push_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id ){
486
-
487
  $mo_wpns_config = new MoWpnsHandler();
488
 
489
- global $Mo2fdbQueries,$txid;
490
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
491
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $user_id );
492
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
@@ -494,6 +568,7 @@ function mo2f_backup_form($login_status, $login_message, $redirect_to, $session_
494
  $user_id = MO2f_Utility::mo2f_get_transient( $session_id_encrypt, 'mo2f_current_user_id' );
495
 
496
  $current_user = get_user_by('id',$user_id);
 
497
  update_user_meta($user_id,'current_user_email',$current_user->user_email);
498
 
499
 
@@ -688,14 +763,15 @@ function mo2f_backup_form($login_status, $login_message, $redirect_to, $session_
688
  }
689
 
690
  function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_message, $redirect_to, $session_id_encrypt, $cookievalue ) {
 
691
  $mo_wpns_config = new MoWpnsHandler();
692
-
693
- global $Mo2fdbQueries,$txid;
694
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
695
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $id );
696
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
697
  $mo2f_EV_txid = get_user_meta($id,'mo2f_EV_txid',true);
698
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
 
699
  ?>
700
  <html>
701
  <head>
@@ -1103,14 +1179,16 @@ function mo2f_get_qrcode_authentication_prompt( $login_status, $login_message, $
1103
  <?php
1104
  }
1105
 
1106
- function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to,$session_id_encrypt,$user_id,$show_back_button =null ) {
1107
- global $Mo2fdbQueries;
1108
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
1109
  $mo_wpns_config = new MoWpnsHandler();
1110
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
1111
  $attempts = get_option('mo2f_attempts_before_redirect', 3);
1112
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
1113
  $mo2f_otp_over_email_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_OTPOverEmail_config_status', $user_id );
 
 
1114
  ?>
1115
  <html>
1116
  <head>
@@ -1176,6 +1254,9 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
1176
  <input type="hidden" name="option" value="miniorange_soft_token">
1177
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
1178
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
 
 
 
1179
  </form>
1180
  <?php
1181
  $Kbaset = get_user_meta( $user_id ,'Security Questions' );
@@ -1412,11 +1493,12 @@ function mo2f_customize_logo() { ?>
1412
  function echo_js_css_files() {
1413
  echo '<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>';
1414
  echo '<script src="' . plugins_url( 'includes/js/bootstrap.min.js', dirname(dirname(__FILE__)) ) . '" ></script>';
1415
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/twofa_style_settings.css?version=5.1.21', dirname(dirname(__FILE__))) . '" />';
1416
  }
1417
 
1418
  function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1419
  global $Mo2fdbQueries;
 
1420
  if(get_user_meta($id, 'mo_backup_code_generated', true) && !get_user_meta($id, 'mo_backup_code_downloaded', true)){
1421
  $encrypted_codes =get_user_meta($id, 'chqwetcsdvnvd', true);
1422
  $key = get_option( 'mo2f_encryption_key' );
@@ -1425,16 +1507,25 @@ function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1425
  delete_user_meta($id, 'chqwetcsdvnvd');
1426
  $result = true;
1427
  }else{
1428
- $codes = MO2f_Utility::mo_2f_generate_backup_codes();
1429
- $codes_hash = MO2f_Utility::mo2f_get_codes_hash($codes);
1430
- update_user_meta($id,'mo2f_backup_codes', $codes_hash);
1431
- $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
1432
  if(empty($mo2f_user_email)){
1433
  $currentuser = get_user_by( 'id', $id );
1434
  $mo2f_user_email = $currentuser->user_email;
1435
  }
1436
- $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
 
 
 
 
 
1437
  update_user_meta($id, 'mo_backup_code_generated', 1);
 
 
 
 
 
 
 
1438
  }
1439
  update_user_meta($id, 'mo_backup_code_screen_shown', 1);
1440
  ?>
@@ -1465,6 +1556,7 @@ function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1465
  <h4 class="mo2f_modal-title"><button type="button" class="mo2f_close" data-dismiss="modal" aria-label="Close" title="<?php echo __('Back to login', 'miniorange-2-factor-authentication'); ?>" onclick="mologinback();"><span aria-hidden="true">&times;</span></button>
1466
  <?php echo __('Two Factor Setup Complete', 'miniorange-2-factor-authentication'); ?></h4>
1467
  </div>
 
1468
  <div class="mo2f_modal-body center">
1469
 
1470
 
@@ -1480,13 +1572,13 @@ function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1480
  <div style="display: inline-flex;width: 350px; ">
1481
  <div id="clipboard" style="border: solid;width: 55%;float: left;">
1482
  <?php
1483
- for ($x = 0; $x < 5; $x++) {
1484
  $str = $codes[$x];
1485
  echo("<br>".$str." <br>");
1486
  }
1487
 
1488
  $str1="";
1489
- for ($x = 0; $x < 5; $x++) {
1490
  $str = $codes[$x];
1491
  $str1.=$str;
1492
  if($x != 4){
@@ -1519,6 +1611,17 @@ function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1519
  <?php
1520
  mo2f_customize_logo() ?>
1521
  </div>
 
 
 
 
 
 
 
 
 
 
 
1522
  </div>
1523
  </div>
1524
  </div>
1
  <?php
2
+ function mo2f_collect_device_attributes_handler( $session_id_encrypt,$redirect_to = null ) {
3
  ?>
4
  <html>
5
  <head>
40
  </html>
41
  <?php
42
  }
43
+ function mo2fa_prompt_mfa_form_for_user($configure_array_method,$session_id_encrypt,$redirect_to)
44
+ {
45
+ ?>
46
+ <html>
47
+ <head>
48
+ <meta charset="utf-8"/>
49
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
50
+ <meta name="viewport" content="width=device-width, initial-scale=1">
51
+ <?php
52
+ mo2f_inline_css_and_js();
53
+ ?>
54
+ </head>
55
+ <body>
56
+ <div class="mo2f_modal1" tabindex="-1" role="dialog" id="myModal51">
57
+ <div class="mo2f-modal-backdrop"></div>
58
+ <div class="mo_customer_validation-modal-dialog mo_customer_validation-modal-md">
59
+ <div class="login mo_customer_validation-modal-content">
60
+ <div class="mo2f_modal-header">
61
+ <h3 class="mo2f_modal-title"><button type="button" class="mo2f_close" data-dismiss="modal" aria-label="Close" title="<?php echo __('Back to login','miniorange-2-factor-authentication');?>" onclick="mologinback();"><span aria-hidden="true">&times;</span></button>
62
+
63
+ <?php echo __('Select 2 Factor method for authentication', 'miniorange-2-factor-authentication'); ?></h3>
64
+ </div>
65
+ <div class="mo2f_modal-body">
66
+ <?php
67
+ foreach ($configure_array_method as $key => $value)
68
+ {
69
+ echo'<span >
70
+ <label>
71
+ <input type="radio" name="mo2f_selected_mfactor_method" class ="mo2f-styled-radio_conf" value="'.$value.'"/>';
72
+ echo'<span class="mo2f-styled-radio-text_conf">';
73
+ echo __($value, 'miniorange-2-factor-authentication');
74
+ echo ' </span> </label>
75
+ <br>
76
+ <br>
77
+ </span>';
78
+
79
+ }
80
+
81
+ ?>
82
+
83
+ <?php mo2f_customize_logo() ?>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
89
+ <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
90
+ <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
91
+ <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
92
+ </form>
93
+ <form name="f" method="post" action="" id="mo2f_select_mfa_methods_form" style="display:none;">
94
+ <input type="hidden" name="mo2f_selected_mfactor_method" />
95
+ <input type="hidden" name="mo2f_miniorange_2factor_method_nonce" value="<?php echo wp_create_nonce('mo2f_miniorange-2factor-method-nonce'); ?>" />
96
+ <input type="hidden" name="option" value="miniorange_mfactor_method" />
97
+ <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
98
+ <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
99
+ </form>
100
+
101
+ <script>
102
+ function mologinback(){
103
+ jQuery('#mo2f_backto_mo_loginform').submit();
104
+ }
105
+ jQuery('input:radio[name=mo2f_selected_mfactor_method]').click(function() {
106
+ var selectedMethod = jQuery(this).val();
107
+ document.getElementById("mo2f_select_mfa_methods_form").elements[0].value = selectedMethod;
108
+ jQuery('#mo2f_select_mfa_methods_form').submit();
109
+ });
110
+
111
+ </script>
112
+ </body>
113
+ </html>
114
+ <?php
115
+ }
116
  function miniorange_get_user_role( $user ) {
117
  return $user->roles;
118
  }
329
  <?php }
330
 
331
  function mo2f_get_kba_authentication_prompt($login_status, $login_message, $redirect_to, $session_id_encrypt , $cookievalue) {
332
+ global $moWpnsUtility;
333
  $mo_wpns_config = new MoWpnsHandler();
334
  $mo2f_login_option = MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option');
335
  $mo2f_remember_device_enabled = get_option( 'mo2f_remember_device' );
336
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
337
+ MO2f_Utility::mo2f_debug_file('Prompted KBA validation screen'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
338
  ?>
339
  <html>
340
  <head>
556
  <?php
557
  }
558
 
559
+ function mo2f_get_duo_push_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id ){
560
+
561
  $mo_wpns_config = new MoWpnsHandler();
562
 
563
+ global $Mo2fdbQueries,$txid,$moWpnsUtility;
564
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
565
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $user_id );
566
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
568
  $user_id = MO2f_Utility::mo2f_get_transient( $session_id_encrypt, 'mo2f_current_user_id' );
569
 
570
  $current_user = get_user_by('id',$user_id);
571
+ MO2f_Utility::mo2f_debug_file('Waiting for duo push notification validation'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$current_user->ID.' Email-'.$current_user->user_email);
572
  update_user_meta($user_id,'current_user_email',$current_user->user_email);
573
 
574
 
763
  }
764
 
765
  function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_message, $redirect_to, $session_id_encrypt, $cookievalue ) {
766
+
767
  $mo_wpns_config = new MoWpnsHandler();
768
+ global $Mo2fdbQueries,$txid,$moWpnsUtility;
 
769
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
770
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $id );
771
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
772
  $mo2f_EV_txid = get_user_meta($id,'mo2f_EV_txid',true);
773
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
774
+ MO2f_Utility::mo2f_debug_file('Waiting for push notification validation '.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
775
  ?>
776
  <html>
777
  <head>
1179
  <?php
1180
  }
1181
 
1182
+ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to,$session_id_encrypt,$user_id,$show_back_button =null ,$mo2fa_transaction_id = null ) {
1183
+ global $Mo2fdbQueries,$moWpnsUtility;
1184
  $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
1185
  $mo_wpns_config = new MoWpnsHandler();
1186
  $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
1187
  $attempts = get_option('mo2f_attempts_before_redirect', 3);
1188
  $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
1189
  $mo2f_otp_over_email_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_OTPOverEmail_config_status', $user_id );
1190
+
1191
+ MO2f_Utility::mo2f_debug_file('Prompted 2fa validation screen '.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1192
  ?>
1193
  <html>
1194
  <head>
1254
  <input type="hidden" name="option" value="miniorange_soft_token">
1255
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
1256
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
1257
+ <?php if($mo2fa_transaction_id!=null){ ?>
1258
+ <input type="hidden" name="mo2fa_transaction_id" id="mo2fa_transaction_id" value="<?php echo $mo2fa_transaction_id; ?>"/>
1259
+ <?php }?>
1260
  </form>
1261
  <?php
1262
  $Kbaset = get_user_meta( $user_id ,'Security Questions' );
1493
  function echo_js_css_files() {
1494
  echo '<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>';
1495
  echo '<script src="' . plugins_url( 'includes/js/bootstrap.min.js', dirname(dirname(__FILE__)) ) . '" ></script>';
1496
+ echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/twofa_style_settings.css?version=5.5', dirname(dirname(__FILE__))) . '" />';
1497
  }
1498
 
1499
  function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1500
  global $Mo2fdbQueries;
1501
+ update_site_option('mo2f_is_inline_used','1');
1502
  if(get_user_meta($id, 'mo_backup_code_generated', true) && !get_user_meta($id, 'mo_backup_code_downloaded', true)){
1503
  $encrypted_codes =get_user_meta($id, 'chqwetcsdvnvd', true);
1504
  $key = get_option( 'mo2f_encryption_key' );
1507
  delete_user_meta($id, 'chqwetcsdvnvd');
1508
  $result = true;
1509
  }else{
1510
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
 
 
 
1511
  if(empty($mo2f_user_email)){
1512
  $currentuser = get_user_by( 'id', $id );
1513
  $mo2f_user_email = $currentuser->user_email;
1514
  }
1515
+ $generate_backup_code = new Customer_Cloud_Setup();
1516
+ $codes = $generate_backup_code->mo_2f_generate_backup_codes($mo2f_user_email, site_url());
1517
+
1518
+ if($codes != 'DBConnectionIssue' && $codes != 'UnableToFetchData' && $codes != 'UserLimitReached' && $codes != 'ERROR' && $codes != 'LimitReached' && $codes != 'AllUsed' && $codes != 'invalid_request' ){
1519
+ $codes = explode(' ', $codes);
1520
+ $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
1521
  update_user_meta($id, 'mo_backup_code_generated', 1);
1522
+ $code_generated = 'code_generation_successful';
1523
+ }else{
1524
+ $code_generated = 'code_generation_failed';
1525
+ update_user_meta($id, 'error_during_code_generation',$codes);
1526
+ }
1527
+
1528
+
1529
  }
1530
  update_user_meta($id, 'mo_backup_code_screen_shown', 1);
1531
  ?>
1556
  <h4 class="mo2f_modal-title"><button type="button" class="mo2f_close" data-dismiss="modal" aria-label="Close" title="<?php echo __('Back to login', 'miniorange-2-factor-authentication'); ?>" onclick="mologinback();"><span aria-hidden="true">&times;</span></button>
1557
  <?php echo __('Two Factor Setup Complete', 'miniorange-2-factor-authentication'); ?></h4>
1558
  </div>
1559
+ <?php if($code_generated == 'code_generation_successful') { ?>
1560
  <div class="mo2f_modal-body center">
1561
 
1562
 
1572
  <div style="display: inline-flex;width: 350px; ">
1573
  <div id="clipboard" style="border: solid;width: 55%;float: left;">
1574
  <?php
1575
+ for ($x = 0; $x < sizeof($codes); $x++) {
1576
  $str = $codes[$x];
1577
  echo("<br>".$str." <br>");
1578
  }
1579
 
1580
  $str1="";
1581
+ for ($x = 0; $x < sizeof($codes); $x++) {
1582
  $str = $codes[$x];
1583
  $str1.=$str;
1584
  if($x != 4){
1611
  <?php
1612
  mo2f_customize_logo() ?>
1613
  </div>
1614
+ <?php } else { ?>
1615
+ <div style="text-align:center;">
1616
+ <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url();?>" >
1617
+ <input type="hidden" name="option" value="mo2f_goto_wp_dashboard" />
1618
+ <input type="hidden" name="mo2f_inline_wp_dashboard_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-inline-wp-dashboard-nonce'); ?>" />
1619
+ <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
1620
+ <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
1621
+ <input type="submit" name="login_page" id="login_page" style ="margin-top: 7px" class="button button-primary button-large" value="<?php echo __('Finish','miniorange-2-factor-authentication');?>" /><br>
1622
+ </form>
1623
+ </div>
1624
+ <?php } ?>
1625
  </div>
1626
  </div>
1627
  </div>
controllers/twofa/mo2fa_inline_registration.php CHANGED
@@ -1,6 +1,9 @@
1
  <?php
2
- function fetch_methods(){
3
- $methods = array("SMS","SOFT TOKEN","MOBILE AUTHENTICATION","PUSH NOTIFICATIONS","GOOGLE AUTHENTICATOR","KBA","OTP_OVER_EMAIL","OTP OVER TELEGRAM","OTP OVER WHATSAPP");
 
 
 
4
  if(get_site_option('duo_credentials_save_successfully'))
5
  array_push($methods,"DUO");
6
  return $methods;
@@ -27,11 +30,7 @@ function prompt_user_to_select_2factor_mthod_inline($current_user_id, $login_sta
27
  $current_selected_method = 'OTP Over Telegram';
28
  prompt_user_for_phone_setup($current_user_id, $login_status, $login_message,$current_selected_method,$redirect_to,$session_id);
29
  }
30
- else if($current_selected_method == 'OTP Over Whatsapp' or $current_selected_method == 'OTP OVER WHATSAPP')
31
- {
32
- $current_selected_method == 'OTP Over Whatsapp';
33
- prompt_user_for_phone_setup($current_user_id, $login_status, $login_message,$current_selected_method,$redirect_to,$session_id);
34
- }else if($current_selected_method == 'Duo Authenticator'){
35
  prompt_user_for_duo_authenticator_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id);
36
  }
37
  else if($current_selected_method == 'GOOGLE AUTHENTICATOR' ){
@@ -336,7 +335,7 @@ function mo2f_inline_email_form($email,$current_user_id)
336
  <br>
337
  <input type="hidden" name="miniorange_emailChange_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-email-change-nonce'); ?>" />
338
  <input type="text" name="current_user_id" hidden id="current_user_id" value="<?php echo $current_user_id;?>" />
339
- <button type="submit" class="mo_wpns_button mo_wpns_button1" style ="margin-left: 165px;" id="save_entered_email_inlinecloud">Save</button>
340
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
341
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
342
  </form>
@@ -619,7 +618,31 @@ function prompt_user_for_duo_authenticator_setup($current_user_id, $login_status
619
  function prompt_user_for_google_authenticator_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id){
620
  $ga_secret = MO2f_Utility::mo2f_get_transient($session_id, 'secret_ga');
621
  $data = MO2f_Utility::mo2f_get_transient($session_id, 'ga_qrCode');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
622
 
 
 
623
  ?>
624
  <html>
625
  <head> <meta charset="utf-8"/>
@@ -938,7 +961,7 @@ function initialize_inline_duo_auth_registration($current_user,$session_id_encry
938
  <img src="<?php echo plugins_url( 'includes/images/ajax-loader-login.gif', dirname(dirname(__FILE__)) ); ?>"/>
939
  </center>
940
 
941
- <input type="button" name="back" id="go_back" class="mo_wpns_button mo_wpns_button1"
942
  value="<?php echo mo2f_lt( 'Back' ); ?>"
943
  style="margin-top:100px;margin-left:10px;"/>
944
  </div>
@@ -1003,7 +1026,7 @@ function initialize_inline_duo_auth_registration($current_user,$session_id_encry
1003
  </script>
1004
 
1005
  <?php
1006
- }
1007
  function prompt_user_for_kba_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id){
1008
  $current_user = get_userdata($current_user_id);
1009
  $opt=fetch_methods($current_user);
@@ -1316,7 +1339,7 @@ function prompt_user_for_setup_success($id, $login_status, $login_message,$redir
1316
  }else{
1317
  $redirect_to = isset($_POST[ 'redirect_to' ]) ? $_POST[ 'redirect_to' ] : null;
1318
  $mo_enable_rem = new Miniorange_Password_2Factor_Login();
1319
- mo2f_collect_device_attributes_handler($redirect_to,$session_id);
1320
  }
1321
  }
1322
  mo2f_customize_logo() ?>
@@ -1375,10 +1398,6 @@ $current_user = get_userdata($current_user_id);
1375
  {
1376
  echo __('Verify Your Telegram Details', 'miniorange-2-factor-authentication');
1377
  }
1378
- else if($current_selected_method == 'OTP Over Whatsapp')
1379
- {
1380
- echo __('Verify Your Whatsapp Details', 'miniorange-2-factor-authentication');
1381
- }
1382
  else if($current_selected_method == 'OTP OVER EMAIL'){
1383
  ?>
1384
  <?php echo __('Verify Your EMAIL', 'miniorange-2-factor-authentication'); ?></h4>
@@ -1423,46 +1442,6 @@ $current_user = get_userdata($current_user_id);
1423
  <?php
1424
  echo "<br>";
1425
 
1426
- }
1427
- else if($current_selected_method == 'OTP Over Whatsapp')
1428
- {
1429
- echo __('1. Add the given phone number (+34 644 17 94 64) in your phone with any name of your choice.', 'miniorange-2-factor-authentication');
1430
- echo "<br><br>";
1431
- echo __('2. Open the Whatsapp app in your phone and send the below text to the given phone number. <b>Message:</b> I allow callmebot to send me messages', 'miniorange-2-factor-authentication');
1432
-
1433
- echo "<br><br>";
1434
- echo '<table><tr><th>';
1435
- echo __('3a. Enter the recieved API Key :', 'miniorange-2-factor-authentication');
1436
- echo '</th>';
1437
- $whatsapp_id = get_user_meta($current_user_id,'mo2f_whatsapp_id',true);
1438
- $whatsapp_number = get_user_meta($current_user_id,'mo2f_whatsapp_num',true);
1439
-
1440
- if($whatsapp_id == '' or empty($whatsapp_id))
1441
- $whatsapp_id = get_user_meta($current_user_id,'mo2f_temp_whatsappID',true);
1442
-
1443
- if($whatsapp_number == '')
1444
- $whatsapp_number = get_user_meta($current_user_id,'mo2f_temp_whatsapp_num',true);
1445
- ?>
1446
- <th>
1447
- <input type="text" name="whatsapp_id" id="whatsapp_id"
1448
- value="<?php echo $whatsapp_id; ?>" required="true" pattern="[0-9]+" title="<?php echo __('Enter chat ID without any space or dashes', 'miniorange-2-factor-authentication'); ?>" /><br />
1449
-
1450
- </th>
1451
- </tr>
1452
- <tr>
1453
- <td>
1454
- <?php
1455
- echo "<br>";
1456
- echo __('<b>3b. Enter your phone number :</b>', 'miniorange-2-factor-authentication');
1457
- ?>
1458
- </td><td>
1459
- <input type="text" name="whatsapp_number" id="whatsapp_number"
1460
- value="<?php echo $whatsapp_number; ?>" required="true" pattern="[\+]?[0-9]{1,4}\s?[0-9]{7,12}" title="<?php echo __('Enter Phone number with country code', 'miniorange-2-factor-authentication'); ?>" /><br />
1461
- </td></tr></table>
1462
- <?php
1463
-
1464
- echo "<br>";
1465
-
1466
  }
1467
  else{
1468
  ?>
@@ -1500,7 +1479,7 @@ $current_user = get_userdata($current_user_id);
1500
  <?php if ($current_selected_method == 'PHONE VERIFICATION'){ ?>
1501
  <span style="color:#1F618D;"><?php echo mo2f_lt('Didn\'t get code?');?></span> &nbsp;
1502
  <a href="#resendsmslink" style="color:#F4D03F ;font-weight:bold;"><?php echo __('CALL AGAIN', 'miniorange-2-factor-authentication'); ?></a>
1503
- <?php } else if($current_selected_method != 'OTP Over Whatsapp' and $current_selected_method != 'OTP Over Telegram'){
1504
  ?>
1505
  <span style="color:#1F618D;"><?php echo mo2f_lt('Didn\'t get code?');?></span> &nbsp;
1506
  <a href="#resendsmslink" style="color:#F4D03F ;font-weight:bold;"><?php echo __('RESEND IT', 'miniorange-2-factor-authentication'); ?></a>
1
  <?php
2
+ function fetch_methods($current_user = null){
3
+ $methods = array("SMS","SOFT TOKEN","MOBILE AUTHENTICATION","PUSH NOTIFICATIONS","GOOGLE AUTHENTICATOR","KBA","OTP_OVER_EMAIL","OTP OVER TELEGRAM");
4
+ if(!is_null($current_user) && ($current_user->roles[0] != 'administrator') && !mo2f_is_customer_registered()){
5
+ $methods = array("GOOGLE AUTHENTICATOR","KBA","OTP_OVER_EMAIL","OTP OVER TELEGRAM");
6
+ }
7
  if(get_site_option('duo_credentials_save_successfully'))
8
  array_push($methods,"DUO");
9
  return $methods;
30
  $current_selected_method = 'OTP Over Telegram';
31
  prompt_user_for_phone_setup($current_user_id, $login_status, $login_message,$current_selected_method,$redirect_to,$session_id);
32
  }
33
+ else if($current_selected_method == 'Duo Authenticator'){
 
 
 
 
34
  prompt_user_for_duo_authenticator_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id);
35
  }
36
  else if($current_selected_method == 'GOOGLE AUTHENTICATOR' ){
335
  <br>
336
  <input type="hidden" name="miniorange_emailChange_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-email-change-nonce'); ?>" />
337
  <input type="text" name="current_user_id" hidden id="current_user_id" value="<?php echo $current_user_id;?>" />
338
+ <button type="submit" class="button button-primary button-large" style ="margin-left: 165px;" id="save_entered_email_inlinecloud">Save</button>
339
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
340
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
341
  </form>
618
  function prompt_user_for_google_authenticator_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id){
619
  $ga_secret = MO2f_Utility::mo2f_get_transient($session_id, 'secret_ga');
620
  $data = MO2f_Utility::mo2f_get_transient($session_id, 'ga_qrCode');
621
+ global $Mo2fdbQueries;
622
+ if(empty($data)){
623
+ $user = get_user_by('ID',$current_user_id);
624
+ if(!MO2F_IS_ONPREM){
625
+ if(!get_user_meta($user->ID, 'mo2f_google_auth', true)){
626
+ Miniorange_Authentication::mo2f_get_GA_parameters($user);
627
+ }
628
+ $mo2f_google_auth = get_user_meta($user->ID, 'mo2f_google_auth', true);
629
+ $data = isset($mo2f_google_auth['ga_qrCode']) ? $mo2f_google_auth['ga_qrCode'] : null;
630
+ $ga_secret = isset($mo2f_google_auth['ga_secret']) ? $mo2f_google_auth['ga_secret'] : null;
631
+ MO2f_Utility::mo2f_set_transient($session_id, 'secret_ga', $mo2f_google_auth['ga_secret']);
632
+ MO2f_Utility::mo2f_set_transient($session_id, 'ga_qrCode', $mo2f_google_auth['ga_qrCode']);
633
+ }else{
634
+ include_once dirname(dirname(dirname( __FILE__ ))) .DIRECTORY_SEPARATOR . 'handler'.DIRECTORY_SEPARATOR . 'twofa'. DIRECTORY_SEPARATOR . 'gaonprem.php';
635
+ $gauth_obj = new Google_auth_onpremise();
636
+ $email = $Mo2fdbQueries->get_user_detail('mo2f_user_email',$user->ID);
637
+ $onpremise_secret = $gauth_obj->createSecret();
638
+ $issuer = get_site_option( 'mo2f_GA_account_name', 'miniOrangeAu' );
639
+ $url = $gauth_obj->geturl( $onpremise_secret, $issuer, $email );
640
+ $data = $url;
641
+ MO2f_Utility::mo2f_set_transient($session_id, 'secret_ga', $onpremise_secret);
642
+ MO2f_Utility::mo2f_set_transient($session_id, 'ga_qrCode', $url);
643
 
644
+ }
645
+ }
646
  ?>
647
  <html>
648
  <head> <meta charset="utf-8"/>
961
  <img src="<?php echo plugins_url( 'includes/images/ajax-loader-login.gif', dirname(dirname(__FILE__)) ); ?>"/>
962
  </center>
963
 
964
+ <input type="button" name="back" id="go_back" class="button button-primary button-large"
965
  value="<?php echo mo2f_lt( 'Back' ); ?>"
966
  style="margin-top:100px;margin-left:10px;"/>
967
  </div>
1026
  </script>
1027
 
1028
  <?php
1029
+ }
1030
  function prompt_user_for_kba_setup($current_user_id, $login_status, $login_message,$redirect_to,$session_id){
1031
  $current_user = get_userdata($current_user_id);
1032
  $opt=fetch_methods($current_user);
1339
  }else{
1340
  $redirect_to = isset($_POST[ 'redirect_to' ]) ? $_POST[ 'redirect_to' ] : null;
1341
  $mo_enable_rem = new Miniorange_Password_2Factor_Login();
1342
+ mo2f_collect_device_attributes_handler($session_id,$redirect_to);
1343
  }
1344
  }
1345
  mo2f_customize_logo() ?>
1398
  {
1399
  echo __('Verify Your Telegram Details', 'miniorange-2-factor-authentication');
1400
  }
 
 
 
 
1401
  else if($current_selected_method == 'OTP OVER EMAIL'){
1402
  ?>
1403
  <?php echo __('Verify Your EMAIL', 'miniorange-2-factor-authentication'); ?></h4>
1442
  <?php
1443
  echo "<br>";
1444
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1445
  }
1446
  else{
1447
  ?>
1479
  <?php if ($current_selected_method == 'PHONE VERIFICATION'){ ?>
1480
  <span style="color:#1F618D;"><?php echo mo2f_lt('Didn\'t get code?');?></span> &nbsp;
1481
  <a href="#resendsmslink" style="color:#F4D03F ;font-weight:bold;"><?php echo __('CALL AGAIN', 'miniorange-2-factor-authentication'); ?></a>
1482
+ <?php } else if($current_selected_method != 'OTP Over Telegram'){
1483
  ?>
1484
  <span style="color:#1F618D;"><?php echo mo2f_lt('Didn\'t get code?');?></span> &nbsp;
1485
  <a href="#resendsmslink" style="color:#F4D03F ;font-weight:bold;"><?php echo __('RESEND IT', 'miniorange-2-factor-authentication'); ?></a>
controllers/twofa/two_factor_ajax.php CHANGED
@@ -8,10 +8,14 @@ class mo_2f_ajax
8
 
9
  function mo_2f_two_factor(){
10
  add_action( 'wp_ajax_mo_two_factor_ajax', array($this,'mo_two_factor_ajax') );
 
11
  }
12
 
13
  function mo_two_factor_ajax(){
 
14
  switch ($_POST['mo_2f_two_factor_ajax']) {
 
 
15
  case 'mo2f_save_email_verification':
16
  $this->mo2f_save_email_verification(); break;
17
  case 'mo2f_unlimitted_user':
@@ -28,6 +32,8 @@ class mo_2f_ajax
28
  $this->mo2f_enable_disable_twofactor(); break;
29
  case 'mo2f_enable_disable_inline':
30
  $this->mo2f_enable_disable_inline(); break;
 
 
31
  case 'mo2f_shift_to_onprem':
32
  $this->mo2f_shift_to_onprem();break;
33
  case 'mo2f_enable_disable_twofactor_prompt_on_login':
@@ -35,8 +41,760 @@ class mo_2f_ajax
35
  case 'mo2f_save_custom_form_settings':
36
  $this ->mo2f_save_custom_form_settings();
37
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
 
 
 
 
 
 
 
 
 
 
 
40
  function mo2f_save_custom_form_settings()
41
  {
42
 
@@ -185,6 +943,48 @@ function mo2f_shift_to_onprem(){
185
 
186
  }
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
 
189
  function mo2f_enable_disable_twofactor(){
190
  $nonce = sanitize_text_field($_POST['mo2f_nonce_enable_2FA']);
@@ -253,6 +1053,23 @@ function mo2f_shift_to_onprem(){
253
  wp_send_json('false');
254
  }
255
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
 
257
  function mo2f_role_based_2_factor(){
258
  if ( !wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce') ){
@@ -342,7 +1159,6 @@ function mo2f_shift_to_onprem(){
342
  }
343
  }
344
  }
345
-
346
 
347
  function mo2f_save_email_verification()
348
  {
@@ -426,6 +1242,7 @@ function mo2f_save_email_verification()
426
  exit;
427
 
428
  }
 
429
  update_user_meta( $user_id, 'configure_2FA', 1 );
430
  update_user_meta($user_id,'Mo2fOtpOverEmailtxId',$decoded['txId']);
431
 
8
 
9
  function mo_2f_two_factor(){
10
  add_action( 'wp_ajax_mo_two_factor_ajax', array($this,'mo_two_factor_ajax') );
11
+ add_action( 'wp_ajax_nopriv_mo_two_factor_ajax', array($this,'mo_two_factor_ajax') );
12
  }
13
 
14
  function mo_two_factor_ajax(){
15
+ $GLOBALS['mo2f_is_ajax_request'] = true;
16
  switch ($_POST['mo_2f_two_factor_ajax']) {
17
+ case 'mo2f_ajax_login_redirect':
18
+ $this->mo2f_ajax_login_redirect(); break;
19
  case 'mo2f_save_email_verification':
20
  $this->mo2f_save_email_verification(); break;
21
  case 'mo2f_unlimitted_user':
32
  $this->mo2f_enable_disable_twofactor(); break;
33
  case 'mo2f_enable_disable_inline':
34
  $this->mo2f_enable_disable_inline(); break;
35
+ case 'mo2f_enable_disable_configurd_methods':
36
+ $this->mo2f_enable_disable_configurd_methods(); break;
37
  case 'mo2f_shift_to_onprem':
38
  $this->mo2f_shift_to_onprem();break;
39
  case 'mo2f_enable_disable_twofactor_prompt_on_login':
41
  case 'mo2f_save_custom_form_settings':
42
  $this ->mo2f_save_custom_form_settings();
43
  break;
44
+ case 'mo2f_enable_disable_debug_log':
45
+ $this ->mo2f_enable_disable_debug_log();
46
+ break;
47
+ case 'mo2f_delete_log_file':
48
+ $this->mo2f_delete_log_file();
49
+ break;
50
+ case 'select_method_setup_wizard':
51
+ $this->mo2f_select_method_setup_wizard();
52
+ break;
53
+ case 'mo_wpns_register_verify_customer':
54
+ $this->mo_wpns_register_verify_customer();
55
+ break;
56
+ case 'mo_2fa_configure_GA_setup_wizard':
57
+ $this->mo_2fa_configure_GA_setup_wizard();
58
+ break;
59
+ case 'mo_2fa_verify_GA_setup_wizard':
60
+ $this->mo_2fa_verify_GA_setup_wizard();
61
+ break;
62
+ case 'mo_2fa_configure_OTPOverSMS_setup_wizard':
63
+ $this->mo_2fa_configure_OTPOverSMS_setup_wizard();
64
+ break;
65
+ case 'mo_2fa_configure_OTPOverEmail_setup_wizard':
66
+ $this->mo_2fa_configure_OTPOverEmail_setup_wizard();
67
+ break;
68
+ case 'mo_2fa_verify_OTPOverEmail_setup_wizard':
69
+ $this->mo_2fa_verify_OTPOverEmail_setup_wizard();
70
+ break;
71
+ case 'mo_2fa_verify_OTPOverSMS_setup_wizard':
72
+ $this->mo_2fa_verify_OTPOverSMS_setup_wizard();
73
+ break;
74
+ case 'mo_2fa_configure_KBA_setup_wizard':
75
+ $this->mo_2fa_configure_KBA_setup_wizard();
76
+ break;
77
+ case 'mo_2fa_verify_KBA_setup_wizard':
78
+ $this->mo_2fa_verify_KBA_setup_wizard();
79
+ break;
80
+ case 'mo_2fa_send_otp_token':
81
+ $this->mo_2fa_send_otp_token();
82
+ break;
83
+ case "mo2f_set_otp_over_sms":
84
+ $this->mo2f_set_otp_over_sms(); break;
85
+ case "mo2f_set_miniorange_methods":
86
+ $this->mo2f_set_miniorange_methods(); break;
87
+ case "mo2f_set_GA":
88
+ $this->mo2f_set_GA(); break;
89
+ }
90
+ }
91
+ function mo_2fa_verify_KBA_setup_wizard()
92
+ {
93
+ global $Mo2fdbQueries;
94
+ $kba_q1 = sanitize_text_field($_POST['mo2f_kbaquestion_1']);
95
+ $kba_a1 = sanitize_text_field( $_POST['mo2f_kba_ans1'] );
96
+ $kba_q2 = sanitize_text_field($_POST['mo2f_kbaquestion_2']);
97
+ $kba_a2 = sanitize_text_field( $_POST['mo2f_kba_ans2'] );
98
+ $kba_q3 = sanitize_text_field( $_POST['mo2f_kbaquestion_3'] );
99
+ $kba_a3 = sanitize_text_field( $_POST['mo2f_kba_ans3'] );
100
+ $user = wp_get_current_user();
101
+ $this->mo2f_check_and_create_user($user->ID);
102
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $kba_q1 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a1 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_q2 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a2) || MO2f_Utility::mo2f_check_empty_or_null( $kba_q3) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a3) ) {
103
+ echo "Invalid Questions or Answers";
104
+ exit;
105
+ }
106
+ if ( strcasecmp( $kba_q1, $kba_q2 ) == 0 || strcasecmp( $kba_q2, $kba_q3 ) == 0 || strcasecmp( $kba_q3, $kba_q1 ) == 0 ) {
107
+ echo "The questions you select must be unique.";
108
+ exit;
109
+ }
110
+ $kba_q1 = addcslashes( stripslashes( $kba_q1 ), '"\\' );
111
+ $kba_q2 = addcslashes( stripslashes( $kba_q2 ), '"\\' );
112
+ $kba_q3 = addcslashes( stripslashes( $kba_q3 ), '"\\' );
113
+ $kba_a1 = addcslashes( stripslashes( $kba_a1 ), '"\\' );
114
+ $kba_a2 = addcslashes( stripslashes( $kba_a2 ), '"\\' );
115
+ $kba_a3 = addcslashes( stripslashes( $kba_a3 ), '"\\' );
116
+ $email = $user->user_email;
117
+ $kba_registration = new Two_Factor_Setup();
118
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
119
+ 'mo2f_SecurityQuestions_config_status' => true,
120
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
121
+ 'mo2f_user_email' => $email
122
+ ));
123
+ $kba_reg_reponse = json_decode( $kba_registration->register_kba_details( $email, $kba_q1, $kba_a1, $kba_q2, $kba_a2, $kba_q3, $kba_a3, $user->ID ), true );
124
+
125
+ if($kba_reg_reponse['status']=='SUCCESS')
126
+ {
127
+ echo "SUCCESS";
128
+ exit;
129
+ }
130
+ else
131
+ {
132
+ echo "An error has occured while saving KBA details. Please try again.";
133
+ exit;
134
+ }
135
+ }
136
+ function mo_2fa_send_otp_token()
137
+ {
138
+ $enduser = new Customer_Setup();
139
+ $email = sanitize_text_field($_POST['phone']);
140
+ $customer_key = get_site_option('mo2f_customerKey');
141
+ $api_key = get_site_option('mo2f_api_key');
142
+ $selected_2FA_method = sanitize_text_field($_POST['selected_2FA_method']);
143
+ $user_id = wp_get_current_user()->ID;
144
+
145
+ if($selected_2FA_method == 'OTP Over Email')
146
+ {
147
+ update_user_meta($user_id,'tempRegEmail',$email);
148
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
149
+ $emailErr = "Invalid email format";
150
+ echo $emailErr;
151
+ exit;
152
+ }
153
+ }
154
+ else if($selected_2FA_method == 'OTP Over SMS')
155
+ {
156
+
157
+ }
158
+ $content = $enduser->send_otp_token($email,$selected_2FA_method,$customer_key,$api_key);
159
+ $content = json_decode($content);
160
+
161
+ if($content->status =='SUCCESS')
162
+ {
163
+ echo 'SUCCESS';
164
+ update_user_meta($user_id,'txId',$content->txId);
165
+ update_user_meta($user_id,'tempRegPhone',$email);
166
+ exit;
167
+ }
168
+ else
169
+ echo "An error has occured while sending the OTP.";
170
+ exit;
171
+ }
172
+ function mo2f_check_and_create_user($user_id)
173
+ {
174
+ global $Mo2fdbQueries;
175
+ $twofactor_transactions = new Mo2fDB;
176
+ $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user_id);
177
+ if($exceeded){
178
+ echo 'User Limit has been exceeded';
179
+ exit;
180
+ }
181
+ $Mo2fdbQueries->insert_user( $user_id );
182
+ }
183
+ function mo_2fa_verify_OTPOverSMS_setup_wizard()
184
+ {
185
+ global $Mo2fdbQueries;
186
+ $enduser = new Customer_Setup();
187
+ $current_user = wp_get_current_user();
188
+ $otpToken = sanitize_text_field($_POST['mo2f_otp_token']);
189
+ $user_id = wp_get_current_user()->ID;
190
+ $email = get_user_meta($user_id,'tempRegPhone',true);
191
+ $content = json_decode($enduser->validate_otp_token( 'SMS', null, get_user_meta($user_id,'txId',true), $otpToken, get_site_option('mo2f_customerKey'), get_site_option('mo2f_api_key') ),true);
192
+
193
+ if($content['status'] == 'SUCCESS')
194
+ {
195
+ $this->mo2f_check_and_create_user($user_id);
196
+ $Mo2fdbQueries->update_user_details( $user_id, array(
197
+ 'mo2f_OTPOverSMS_config_status' => true,
198
+ 'mo2f_configured_2FA_method' => "OTP Over SMS",
199
+ 'mo2f_user_phone' => $email,
200
+ 'user_registration_with_miniorange' => 'SUCCESS',
201
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
202
+ ) );
203
+ echo "SUCCESS";
204
+ }
205
+ else
206
+ {
207
+ echo "Invalid OTP";
208
+ }
209
+ exit;
210
+
211
+ }
212
+ function mo_2fa_verify_OTPOverEmail_setup_wizard()
213
+ {
214
+ global $Mo2fdbQueries;
215
+ $enduser = new Customer_Setup();
216
+ $current_user = wp_get_current_user();
217
+ $otpToken = sanitize_text_field($_POST['mo2f_otp_token']);
218
+ $user_id = wp_get_current_user()->ID;
219
+ $email = get_user_meta($user_id,'tempRegEmail',true);
220
+ $content = json_decode($enduser->validate_otp_token( 'OTP_OVER_EMAIL', null, get_user_meta($current_user->ID,'mo2f_transactionId',true), $otpToken, get_site_option('mo2f_customerKey'), get_site_option('mo2f_api_key') ),true);
221
+
222
+ if($content['status'] == 'SUCCESS')
223
+ {
224
+ $this->mo2f_check_and_create_user($user_id);
225
+ $Mo2fdbQueries->update_user_details( $user_id, array(
226
+ 'mo2f_OTPOverEmail_config_status' => true,
227
+ 'mo2f_configured_2FA_method' => "OTP Over Email",
228
+ 'mo2f_user_email' => $email,
229
+ 'user_registration_with_miniorange' => 'SUCCESS',
230
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
231
+ ) );
232
+ echo "SUCCESS";
233
+ }
234
+ else
235
+ {
236
+ echo "Invalid OTP";
237
+ }
238
+ exit;
239
+ }
240
+ function mo_2fa_verify_GA_setup_wizard()
241
+ {
242
+ global $Mo2fdbQueries;
243
+ $path = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'handler'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'gaonprem.php';
244
+ include_once $path;
245
+ $obj_google_auth = new Google_auth_onpremise();
246
+ $user_id = wp_get_current_user()->ID;
247
+ $otpToken = sanitize_text_field($_POST['mo2f_google_auth_code']);
248
+ $session_id_encrypt = isset($_POST['mo2f_session_id']) ? sanitize_text_field($_POST['mo2f_session_id']) : null;
249
+ $secret= $obj_google_auth->mo_GAuth_get_secret($user_id);
250
+ if($session_id_encrypt){
251
+ $secret = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'secret_ga');
252
+ }
253
+ $content = $obj_google_auth->verifyCode($secret, $otpToken);
254
+ $content = json_decode($content);
255
+ if($content->status== 'false')
256
+ echo "Invalid One time Passcode. Please enter again";
257
+ else
258
+ {
259
+ $obj_google_auth->mo_GAuth_set_secret($user_id,$secret);
260
+ $this->mo2f_check_and_create_user($user_id);
261
+ $Mo2fdbQueries->update_user_details( $user_id, array(
262
+ 'mo2f_GoogleAuthenticator_config_status' => true,
263
+ 'mo2f_AuthyAuthenticator_config_status' => false,
264
+ 'mo2f_configured_2FA_method' => "Google Authenticator",
265
+ 'user_registration_with_miniorange' => 'SUCCESS',
266
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
267
+ ) );
268
+
269
+ echo 'SUCCESS';
270
+ }
271
+ exit;
272
+ }
273
+ function mo_2fa_configure_GA_setup_wizard()
274
+ {
275
+ $path = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'handler'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'gaonprem.php';
276
+ include_once $path;
277
+ $obj_google_auth = new Google_auth_onpremise();
278
+ update_option('mo2f_google_appname',$_SERVER['SERVER_NAME']);
279
+ $res = $obj_google_auth->mo_GAuth_get_details(true);
280
+ return $res;
281
+ }
282
+ function mo_2fa_configure_OTPOverSMS_setup_wizard()
283
+ {
284
+ global $Mo2fdbQueries;
285
+ $user = wp_get_current_user();
286
+ $mo2f_user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
287
+ $user_phone = $mo2f_user_phone ? $mo2f_user_phone : get_option( 'user_phone_temp' );
288
+ $session_id_encrypt = MO2f_Utility::random_str(20);
289
+
290
+ ?>
291
+ <h4 style="padding:10px; background-color: #a7c5eb;font-weight:normal"> Remaining SMS Transactions: <b><?php echo get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z');?> </b></h4>
292
+ <form name="f" method="post" action="" id="mo2f_verifyphone_form">
293
+ <input type="hidden" name="option" value="mo2f_configure_otp_over_sms_send_otp"/>
294
+ <input type="hidden" name="mo2f_session_id" value="<?php echo $session_id_encrypt ?>"/>
295
+ <input type="hidden" name="mo2f_configure_otp_over_sms_send_otp_nonce"
296
+ value="<?php echo wp_create_nonce( "mo2f-configure-otp-over-sms-send-otp-nonce" ) ?>"/>
297
+
298
+ <div style="display:inline;">
299
+ <input class="mo2f_table_textbox_phone" style="width:200px;height: 30px;" type="text" name="phone" id="phone"
300
+ value="<?php echo $user_phone ?>" pattern="[\+]?[0-9]{1,4}\s?[0-9]{7,12}"
301
+ title="<?php echo mo2f_lt( 'Enter phone number without any space or dashes' ); ?>"/><br>
302
+ <input type="button" name="mo2f_send_otp" id="mo2f_send_otp" class="miniorange_button"
303
+ value="<?php echo mo2f_lt( 'Send OTP' ); ?>"/>
304
+ </div>
305
+ </form>
306
+ <br>
307
+ <form name="f" method="post" action="" id="mo2f_validateotp_form">
308
+ <input type="hidden" name="option" value="mo2f_configure_otp_over_sms_validate"/>
309
+ <input type="hidden" name="mo2f_session_id" value="<?php echo $session_id_encrypt ?>"/>
310
+ <input type="hidden" name="mo2f_configure_otp_over_sms_validate_nonce"
311
+ value="<?php echo wp_create_nonce( "mo2f-configure-otp-over-sms-validate-nonce" ) ?>"/>
312
+ <p><?php echo mo2f_lt( 'Enter One Time Passcode' ); ?></p>
313
+ <input class="mo2f_table_textbox_phone" style="width:200px;height: 30px" autofocus="true" type="text" name="mo2f_otp_token" id="mo2f_otp_token"
314
+ placeholder="<?php echo mo2f_lt( 'Enter OTP' ); ?>" style="width:95%;"/>
315
+ <br><br>
316
+ </form><br>
317
+
318
+ <?php
319
+ exit;
320
+ }
321
+ function mo_2fa_configure_OTPOverEmail_setup_wizard()
322
+ {
323
+ $session_id_encrypt = MO2f_Utility::random_str(20);
324
+ $user_email = wp_get_current_user()->user_email;
325
+ ?>
326
+ <h4 style="padding:10px; background-color: #f1f3f5"> Remaining Email Transactions: <b><?php echo get_site_option('cmVtYWluaW5nT1RQ');?> </b></h4>
327
+ <form name="f" method="post" action="" id="mo2f_verifyemail_form">
328
+ <input type="hidden" name="option" value="mo2f_configure_otp_over_email_send_otp"/>
329
+ <input type="hidden" name="mo2f_session_id" value="<?php echo $session_id_encrypt ?>"/>
330
+ <input type="hidden" name="mo2f_configure_otp_over_email_send_otp_nonce"
331
+ value="<?php echo wp_create_nonce( "mo2f-configure-otp-over-email-send-otp-nonce" ) ?>"/>
332
+
333
+ <div style="display:inline;">
334
+ <b>Email Address: </b>
335
+ <input class="mo2f_table_textbox" style="width:280px;height: 30px;" type="email" name="verify_phone" id="phone"
336
+ value="<?php echo $user_email ?>"
337
+ title="<?php echo mo2f_lt( 'Enter your email address without any space or dashes' ); ?>"/><br><br>
338
+ <input type="button" name="mo2f_send_otp" id="mo2f_send_otp" class="miniorange_button"
339
+ value="<?php echo mo2f_lt( 'Send OTP' ); ?>"/>
340
+ </div>
341
+ </form>
342
+ <br><br>
343
+ <form name="f" method="post" action="" id="mo2f_validateotp_form">
344
+ <input type="hidden" name="option" value="mo2f_configure_otp_over_sms_validate"/>
345
+ <input type="hidden" name="mo2f_session_id" value="<?php echo $session_id_encrypt ?>"/>
346
+ <input type="hidden" name="mo2f_configure_otp_over_email_validate_nonce"
347
+ value="<?php echo wp_create_nonce( "mo2f-configure-otp-over-email-validate-nonce" ) ?>"/>
348
+ <b><?php echo mo2f_lt( 'Enter One Time Passcode:' ); ?>
349
+ <input class="mo2f_table_textbox" style="width:200px;height: 30px;" autofocus="true" type="text" name="mo2f_otp_token" id ="mo2f_otp_token"
350
+ placeholder="<?php echo mo2f_lt( 'Enter OTP' ); ?>" style="width:95%;"/></b>
351
+ <br><br>
352
+ </form><br>
353
+
354
+ <?php
355
+ exit;
356
+ }
357
+ function mo_2fa_configure_KBA_setup_wizard()
358
+ {
359
+ ?>
360
+ <div class="mo2f_kba_header"><?php echo mo2f_lt( 'Please choose 3 questions' ); ?></div>
361
+ <br>
362
+ <table cellspacing="10">
363
+ <tr class="mo2f_kba_header">
364
+ <th style="width: 10%;">
365
+ <?php echo mo2f_lt( 'Sr. No.' ); ?>
366
+ </th>
367
+ <th class="mo2f_kba_tb_data">
368
+ <?php echo mo2f_lt( 'Questions' ); ?>
369
+ </th>
370
+ <th>
371
+ <?php echo mo2f_lt( 'Answers' ); ?>
372
+ </th>
373
+ </tr>
374
+ <tr class="mo2f_kba_body">
375
+ <td>
376
+ <center>1.</center>
377
+ </td>
378
+ <td class="mo2f_kba_tb_data">
379
+ <select name="mo2f_kbaquestion_1" id="mo2f_kbaquestion_1" class="mo2f_kba_ques" required="true"
380
+ >
381
+ <option value="" selected="selected">
382
+ -------------------------<?php echo mo2f_lt( 'Select your question' ); ?>
383
+ -------------------------
384
+ </option>
385
+ <option id="mq1_1"
386
+ value="What is your first company name?"><?php echo mo2f_lt( 'What is your first company name?' ); ?></option>
387
+ <option id="mq2_1"
388
+ value="What was your childhood nickname?"><?php echo mo2f_lt( 'What was your childhood nickname?' ); ?></option>
389
+ <option id="mq3_1"
390
+ value="In what city did you meet your spouse/significant other?"><?php echo mo2f_lt( 'In what city did you meet your spouse/significant other?' ); ?></option>
391
+ <option id="mq4_1"
392
+ value="What is the name of your favorite childhood friend?"><?php echo mo2f_lt( 'What is the name of your favorite childhood friend?' ); ?></option>
393
+ <option id="mq5_1"
394
+ value="What school did you attend for sixth grade?"><?php echo mo2f_lt( 'What school did you attend for sixth grade?' ); ?></option>
395
+ <option id="mq6_1"
396
+ value="In what city or town was your first job?"><?php echo mo2f_lt( 'In what city or town was your first job?' ); ?></option>
397
+ <option id="mq7_1"
398
+ value="What is your favourite sport?"><?php echo mo2f_lt( 'What is your favourite sport?' ); ?></option>
399
+ <option id="mq8_1"
400
+ value="Who is your favourite sports player?"><?php echo mo2f_lt( 'Who is your favourite sports player?' ); ?></option>
401
+ <option id="mq9_1"
402
+ value="What is your grandmother's maiden name?"><?php echo mo2f_lt( "What is your grandmother's maiden name?" ); ?></option>
403
+ <option id="mq10_1"
404
+ value="What was your first vehicle's registration number?"><?php echo mo2f_lt( "What was your first vehicle's registration number?" ); ?></option>
405
+ </select>
406
+ </td>
407
+ <td style="text-align: end;">
408
+ <input class="mo2f_table_textbox_KBA" type="password" name="mo2f_kba_ans1" id="mo2f_kba_ans1"
409
+ title="<?php echo mo2f_lt( 'Only alphanumeric letters with special characters(_@.$#&amp;+-) are allowed.' ); ?>"
410
+ pattern="(?=\S)[A-Za-z0-9_@.$#&amp;+\-\s]{1,100}" required="true" autofocus="true"
411
+ placeholder="<?php echo mo2f_lt( 'Enter your answer' ); ?>"/>
412
+ </td>
413
+ </tr>
414
+ <tr class="mo2f_kba_body">
415
+ <td>
416
+ <center>2.</center>
417
+ </td>
418
+ <td class="mo2f_kba_tb_data">
419
+ <select name="mo2f_kbaquestion_2" id="mo2f_kbaquestion_2" class="mo2f_kba_ques" required="true"
420
+ >
421
+ <option value="" selected="selected">
422
+ -------------------------<?php echo mo2f_lt( 'Select your question' ); ?>
423
+ -------------------------
424
+ </option>
425
+ <option id="mq1_2"
426
+ value="What is your first company name?"><?php echo mo2f_lt( 'What is your first company name?' ); ?></option>
427
+ <option id="mq2_2"
428
+ value="What was your childhood nickname?"><?php echo mo2f_lt( 'What was your childhood nickname?' ); ?></option>
429
+ <option id="mq3_2"
430
+ value="In what city did you meet your spouse/significant other?"><?php echo mo2f_lt( 'In what city did you meet your spouse/significant other?' ); ?></option>
431
+ <option id="mq4_2"
432
+ value="What is the name of your favorite childhood friend?"><?php echo mo2f_lt( 'What is the name of your favorite childhood friend?' ); ?></option>
433
+ <option id="mq5_2"
434
+ value="What school did you attend for sixth grade?"><?php echo mo2f_lt( 'What school did you attend for sixth grade?' ); ?></option>
435
+ <option id="mq6_2"
436
+ value="In what city or town was your first job?"><?php echo mo2f_lt( 'In what city or town was your first job?' ); ?></option>
437
+ <option id="mq7_2"
438
+ value="What is your favourite sport?"><?php echo mo2f_lt( 'What is your favourite sport?' ); ?></option>
439
+ <option id="mq8_2"
440
+ value="Who is your favourite sports player?"><?php echo mo2f_lt( 'Who is your favourite sports player?' ); ?></option>
441
+ <option id="mq9_2"
442
+ value="What is your grandmother's maiden name?"><?php echo mo2f_lt( 'What is your grandmother\'s maiden name?' ); ?></option>
443
+ <option id="mq10_2"
444
+ value="What was your first vehicle's registration number?"><?php echo mo2f_lt( 'What was your first vehicle\'s registration number?' ); ?></option>
445
+ </select>
446
+ </td>
447
+ <td style="text-align: end;">
448
+ <input class="mo2f_table_textbox_KBA" type="password" name="mo2f_kba_ans2" id="mo2f_kba_ans2"
449
+ title="<?php echo mo2f_lt( 'Only alphanumeric letters with special characters(_@.$#&amp;+-) are allowed.' ); ?>"
450
+ pattern="(?=\S)[A-Za-z0-9_@.$#&amp;+\-\s]{1,100}" required="true"
451
+ placeholder="<?php echo mo2f_lt( 'Enter your answer' ); ?>"/>
452
+ </td>
453
+ </tr>
454
+ <tr class="mo2f_kba_body">
455
+ <td>
456
+ <center>3.</center>
457
+ </td>
458
+ <td class="mo2f_kba_tb_data">
459
+ <input class="mo2f_kba_ques" type="text" style="width: 100%;"name="mo2f_kbaquestion_3" id="mo2f_kbaquestion_3"
460
+ required="true"
461
+ placeholder="<?php echo mo2f_lt( 'Enter your custom question here' ); ?>"/>
462
+ </td>
463
+ <td style="text-align: end;">
464
+ <input class="mo2f_table_textbox_KBA" type="password" name="mo2f_kba_ans3" id="mo2f_kba_ans3"
465
+ title="<?php echo mo2f_lt( 'Only alphanumeric letters with special characters(_@.$#&amp;+-) are allowed.' ); ?>"
466
+ pattern="(?=\S)[A-Za-z0-9_@.$#&amp;+\-\s]{1,100}" required="true"
467
+ placeholder="<?php echo mo2f_lt( 'Enter your answer' ); ?>"/>
468
+ </td>
469
+ </tr>
470
+ </table>
471
+ <script type="text/javascript">
472
+ var mo_option_to_hide1;
473
+ //hidden element in dropdown list 2
474
+ var mo_option_to_hide2;
475
+
476
+ function mo_option_hide(list) {
477
+ //grab the team selected by the user in the dropdown list
478
+ var list_selected = document.getElementById("mo2f_kbaquestion_" + list).selectedIndex;
479
+ //if an element is currently hidden, unhide it
480
+ if (typeof (mo_option_to_hide1) != "undefined" && mo_option_to_hide1 !== null && list == 2) {
481
+ mo_option_to_hide1.style.display = 'block';
482
+ } else if (typeof (mo_option_to_hide2) != "undefined" && mo_option_to_hide2 !== null && list == 1) {
483
+ mo_option_to_hide2.style.display = 'block';
484
+ }
485
+ //select the element to hide and then hide it
486
+ if (list == 1) {
487
+ if (list_selected != 0) {
488
+ mo_option_to_hide2 = document.getElementById("mq" + list_selected + "_2");
489
+ mo_option_to_hide2.style.display = 'none';
490
+ }
491
+ }
492
+ if (list == 2) {
493
+ if (list_selected != 0) {
494
+ mo_option_to_hide1 = document.getElementById("mq" + list_selected + "_1");
495
+ mo_option_to_hide1.style.display = 'none';
496
+ }
497
+ }
498
+ }
499
+
500
+
501
+ </script>
502
+
503
+ <?php
504
+ exit;
505
+ }
506
+
507
+ function mo2f_register_customer($post)
508
+ {
509
+ //validate and sanitize
510
+ global $moWpnsUtility, $Mo2fdbQueries;
511
+ $user = wp_get_current_user();
512
+ $email = sanitize_email($post['email']);
513
+ $company = $_SERVER["SERVER_NAME"];
514
+
515
+ $password = $post['password'];
516
+ $confirmPassword = $post['confirmPassword'];
517
+
518
+ if( strlen( $password ) < 6 || strlen( $confirmPassword ) < 6)
519
+ {
520
+ return "Password length is less then expected";
521
+ }
522
+
523
+ if( $password != $confirmPassword )
524
+ {
525
+ return "Password and confirm Password does not match.";
526
+ }
527
+ if( MoWpnsUtility::check_empty_or_null( $email ) || MoWpnsUtility::check_empty_or_null( $password )
528
+ || MoWpnsUtility::check_empty_or_null( $confirmPassword ) )
529
+ {
530
+ return "Unknown Error has occured.";
531
+ }
532
+
533
+ update_option( 'mo2f_email', $email );
534
+
535
+ update_option( 'mo_wpns_company' , $company );
536
+
537
+ update_option( 'mo_wpns_password' , $password );
538
+
539
+ $customer = new MocURL();
540
+ $content = json_decode($customer->check_customer($email), true);
541
+ $Mo2fdbQueries->insert_user( $user->ID );
542
+
543
+ switch ($content['status'])
544
+ {
545
+ case 'CUSTOMER_NOT_FOUND':
546
+ $customerKey = json_decode($customer->create_customer($email, $company, $password, $phone = '', $first_name = '', $last_name = ''), true);
547
+
548
+ if(strcasecmp($customerKey['status'], 'SUCCESS') == 0)
549
+ {
550
+ update_site_option(base64_encode("totalUsersCloud"),get_site_option(base64_encode("totalUsersCloud"))+1);
551
+ update_option( 'mo2f_email', $email );
552
+ $this->save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
553
+ $this->_get_current_customer($email,$password);
554
+ return "SUCCESS";
555
+ }
556
+
557
+ break;
558
+ default:
559
+ $res = $this->_get_current_customer($email,$password);
560
+ if($res == "SUCCESS")
561
+ return $res;
562
+ return "Email is already registered in miniOrange. Please try to login to your account.";
563
+
564
+ }
565
+
566
+ }
567
+ function _verify_customer($post)
568
+ {
569
+ global $moWpnsUtility;
570
+ $email = sanitize_email( $post['email'] );
571
+ $password = sanitize_text_field( $post['password'] );
572
+
573
+ if( $moWpnsUtility->check_empty_or_null( $email ) || $moWpnsUtility->check_empty_or_null( $password ) )
574
+ {
575
+ return "Username or Password is missing.";
576
+ }
577
+ return $this->_get_current_customer($email,$password);
578
+ }
579
+ function _get_current_customer($email,$password)
580
+ {
581
+ global $Mo2fdbQueries;
582
+ $user = wp_get_current_user();
583
+ $customer = new MocURL();
584
+ $content = $customer->get_customer_key($email, $password);
585
+ $customerKey = json_decode($content, true);
586
+ if(json_last_error() == JSON_ERROR_NONE)
587
+ {
588
+ if(isset($customerKey['phone'])){
589
+ update_option( 'mo_wpns_admin_phone', $customerKey['phone'] );
590
+ }
591
+ update_option('mo2f_email',$email);
592
+
593
+ $this->save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
594
+ update_site_option(base64_encode("totalUsersCloud"),get_site_option(base64_encode("totalUsersCloud"))+1);
595
+ $customerT = new Customer_Cloud_Setup();
596
+ $content = json_decode( $customerT->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),'PREMIUM' ), true );
597
+ if($content['status'] == 'SUCCESS')
598
+ {
599
+ update_site_option('mo2f_license_type','PREMIUM');
600
+ }
601
+ else
602
+ {
603
+ update_site_option('mo2f_license_type','DEMO');
604
+ $content = json_decode( $customerT->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),'DEMO' ), true );
605
+ }
606
+ if(isset($content['smsRemaining']))
607
+ update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',$content['smsRemaining']);
608
+ else if($content['status'] =='SUCCESS')
609
+ update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',0);
610
+
611
+ if(isset($content['emailRemaining']))
612
+ {
613
+ if($content['emailRemaining']>30)
614
+ {
615
+ $currentTransaction = $content['emailRemaining'];
616
+ update_site_option('cmVtYWluaW5nT1RQ',$currentTransaction);
617
+ update_site_option('EmailTransactionCurrent',$content['emailRemaining']);
618
+ }
619
+ else if($content['emailRemaining'] == 10 and get_site_option('cmVtYWluaW5nT1RQ')>30)
620
+ {
621
+ update_site_option('cmVtYWluaW5nT1RQ',30);
622
+ }
623
+ }
624
+ return "SUCCESS";
625
+ }
626
+ else
627
+ {
628
+ update_option('mo_2factor_user_registration_status','MO_2_FACTOR_VERIFY_CUSTOMER' );
629
+ update_option('mo_wpns_verify_customer', 'true');
630
+ delete_option('mo_wpns_new_registration');
631
+ return "Invalid Username or Password";
632
+ }
633
+ }
634
+
635
+
636
+ function save_success_customer_config($email, $id, $apiKey, $token, $appSecret)
637
+ {
638
+ global $Mo2fdbQueries;
639
+
640
+ $user = wp_get_current_user();
641
+ update_option( 'mo2f_customerKey' , $id );
642
+ update_option( 'mo2f_api_key' , $apiKey );
643
+ update_option( 'mo2f_customer_token' , $token );
644
+ update_option( 'mo2f_app_secret' , $appSecret );
645
+ update_option( 'mo_wpns_enable_log_requests' , true );
646
+ update_option( 'mo2f_miniorange_admin', $user->ID );
647
+ update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
648
+ update_option( 'mo_2factor_user_registration_status', 'MO_2_FACTOR_PLUGIN_SETTINGS' );
649
+
650
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
651
+ 'mo2f_user_email' => $email,
652
+ 'user_registration_with_miniorange' => 'SUCCESS'
653
+ ) );
654
+ $enduser = new Two_Factor_Setup();
655
+ $userinfo = json_decode( $enduser->mo2f_get_userinfo( $email ), true );
656
+
657
+
658
+ delete_option( 'mo_wpns_verify_customer' );
659
+ delete_option( 'mo_wpns_registration_status' );
660
+ delete_option( 'mo_wpns_password' );
661
+ }
662
+
663
+ function mo_wpns_register_verify_customer()
664
+ {
665
+ $res ="";
666
+ if(isset($_POST['Login_and_Continue']) && $_POST['Login_and_Continue'] =='Login and Continue')
667
+ $res = $this->_verify_customer($_POST);
668
+
669
+ else
670
+ $res = $this->mo2f_register_customer($_POST);
671
+ wp_send_json($res);
672
+ }
673
+ function mo2f_select_method_setup_wizard()
674
+ {
675
+ global $Mo2fdbQueries;
676
+ if(!wp_verify_nonce(sanitize_text_field($_POST['nonce']),'miniorange-select-method-setup-wizard'))
677
+ {
678
+ wp_send_json("ERROR");
679
+ }
680
+
681
+ $current_user = wp_get_current_user();
682
+ $selected_2FA_method = sanitize_text_field($_POST['mo2f_method']);
683
+
684
+ if(!MO2F_IS_ONPREM)
685
+ {
686
+ update_option('mo_2factor_user_registration_status','REGISTRATION_STARTED');
687
+ update_user_meta( $current_user->ID, 'register_account_popup', 1 );
688
+ update_user_meta( $current_user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
689
+ wp_send_json("SUCCESS");
690
+
691
+ }
692
+
693
+
694
+ $exceeded = $Mo2fdbQueries->check_alluser_limit_exceeded($current_user->ID);
695
+ if(!$exceeded)
696
+ $Mo2fdbQueries->insert_user( $current_user->ID );
697
+
698
+ if($selected_2FA_method == 'OTP Over Email')
699
+ {
700
+ wp_send_json("SUCCESS");
701
+ }
702
+ update_user_meta( $current_user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
703
+
704
+ $mo_2factor_admin_registration_status = get_option('mo_2factor_admin_registration_status');
705
+ if($selected_2FA_method == 'OTP Over SMS' && $mo_2factor_admin_registration_status != 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS')
706
+ {
707
+ update_option('mo_2factor_user_registration_status','REGISTRATION_STARTED');
708
+ update_user_meta( $current_user->ID, 'register_account_popup', 1 );
709
  }
710
+ else
711
+ update_user_meta( $current_user->ID, 'configure_2FA', 1);
712
+ wp_send_json("SUCCESS");
713
+ }
714
+ function mo2f_set_miniorange_methods(){
715
+ $nonce = sanitize_text_field($_POST['nonce']);
716
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-update-mobile-nonce' ) ) {
717
+ $error = new WP_Error();
718
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
719
+ wp_send_json_error($error);
720
+ exit;
721
+ }
722
+ global $Mo2fdbQueries;
723
+ $transient_id=sanitize_text_field($_POST['transient_id']);
724
+ $user_id = MO2f_Utility::mo2f_get_transient($transient_id, 'mo2f_user_id');
725
+ if(empty($user_id)){
726
+ wp_send_json('UserIdNotFound');
727
+ }
728
+ $user = get_user_by('id',$user_id);
729
+ $email = !empty($Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id ))?$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id ):$user->user_email;
730
+ $otpToken=sanitize_text_field($_POST['code']);
731
+ $customer = new Customer_Setup();
732
+ $content = json_decode( $customer->validate_otp_token( 'SOFT TOKEN', $email, null, $otpToken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
733
+ wp_send_json($content);
734
+ }
735
+ function mo2f_set_otp_over_sms(){
736
+ $nonce = sanitize_text_field($_POST['nonce']);
737
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-update-mobile-nonce' ) ) {
738
+ $error = new WP_Error();
739
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
740
+ wp_send_json_error($error);
741
+ exit;
742
+ }
743
+ global $Mo2fdbQueries;
744
+ $transient_id=sanitize_text_field($_POST['transient_id']);
745
+ $user_id = MO2f_Utility::mo2f_get_transient($transient_id, 'mo2f_user_id');
746
+ if(empty($user_id)){
747
+ wp_send_json('UserIdNotFound');
748
+ }
749
+ $user = get_user_by('id',$user_id);
750
+ $new_phone = sanitize_text_field($_POST['phone']);
751
+ $new_phone = str_replace(' ','',$new_phone);
752
+ $Mo2fdbQueries->update_user_details($user_id, array("mo2f_user_phone" => $new_phone) );
753
+ $user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user_id );
754
+ wp_send_json($user_phone);
755
+ }
756
+ function mo2f_set_GA(){
757
+ $nonce = sanitize_text_field($_POST['nonce']);
758
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-update-mobile-nonce' ) ) {
759
+ $error = new WP_Error();
760
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
761
+ wp_send_json_error($error);
762
+ exit;
763
+ }
764
+ include_once dirname(dirname(dirname( __FILE__ ))) .DIRECTORY_SEPARATOR.'handler'. DIRECTORY_SEPARATOR.'twofa'. DIRECTORY_SEPARATOR. 'gaonprem.php';
765
+ global $Mo2fdbQueries;
766
+ $transient_id=sanitize_text_field($_POST['transient_id']);
767
+ $user_id = MO2f_Utility::mo2f_get_transient($transient_id, 'mo2f_user_id');
768
+ if(empty($user_id)){
769
+ wp_send_json('UserIdNotFound');
770
+ }
771
+ $google_auth = new Miniorange_Rba_Attributes();
772
+ $user = get_user_by('id',$user_id);
773
+ $email = !empty($Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id ))?$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id ):$user->user_email;
774
+ $otpToken = sanitize_text_field($_POST['code']);
775
+ $ga_secret = sanitize_text_field($_POST['ga_secret']);
776
+ if(MO2F_IS_ONPREM){
777
+ $gauth_obj = new Google_auth_onpremise();
778
+ $gauth_obj->mo_GAuth_set_secret($user_id, $ga_secret);
779
+ }else{
780
+
781
+ $google_auth = new Miniorange_Rba_Attributes();
782
+ $google_response = json_decode( $google_auth->mo2f_google_auth_service( $email, 'miniOrangeAu' ), true );
783
+ }
784
+ $google_response = json_decode($google_auth->mo2f_validate_google_auth($email,$otpToken,$ga_secret),true);
785
+ wp_send_json($google_response['status']);
786
  }
787
+ function mo2f_ajax_login_redirect()
788
+ {
789
+ if(!wp_verify_nonce(sanitize_text_field($_POST['nonce']),'miniorange-2-factor-login-nonce'))
790
+ {
791
+ wp_send_json("ERROR");
792
+ exit;
793
+ }
794
+ $username = sanitize_text_field($_POST['username']);
795
+ $password = $_POST['password'];
796
+ apply_filters( 'authenticate', null, $username, $password );
797
+ }
798
  function mo2f_save_custom_form_settings()
799
  {
800
 
943
 
944
  }
945
 
946
+
947
+ function mo2f_delete_log_file(){
948
+ $nonce = sanitize_text_field($_POST['mo2f_nonce_delete_log']);
949
+
950
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-delete-log' ) ) {
951
+ $error = new WP_Error();
952
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
953
+
954
+ }else{
955
+ $debug_log_path = wp_upload_dir();
956
+ $debug_log_path = $debug_log_path['basedir'];
957
+ $file_name = 'miniorange_debug_log.txt';
958
+ $status = file_exists( $debug_log_path.DIRECTORY_SEPARATOR.$file_name);
959
+ if($status){
960
+ unlink($debug_log_path.DIRECTORY_SEPARATOR.$file_name);
961
+ wp_send_json('true');
962
+ }
963
+ else{
964
+ wp_send_json('false');
965
+ }
966
+ }
967
+ }
968
+ function mo2f_enable_disable_debug_log(){
969
+
970
+ $nonce = sanitize_text_field($_POST['mo2f_nonce_enable_debug_log']);
971
+
972
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-enable-debug-log' ) ) {
973
+ $error = new WP_Error();
974
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
975
+
976
+ }
977
+
978
+ $enable = sanitize_text_field($_POST['mo2f_enable_debug_log']);
979
+ if($enable == 'true'){
980
+ update_site_option('mo2f_enable_debug_log' , 1);
981
+ wp_send_json('true');
982
+ }
983
+ else{
984
+ update_site_option('mo2f_enable_debug_log' , 0);
985
+ wp_send_json('false');
986
+ }
987
+ }
988
 
989
  function mo2f_enable_disable_twofactor(){
990
  $nonce = sanitize_text_field($_POST['mo2f_nonce_enable_2FA']);
1053
  wp_send_json('false');
1054
  }
1055
  }
1056
+ function mo2f_enable_disable_configurd_methods(){
1057
+ $nonce = sanitize_text_field($_POST['nonce']);
1058
+
1059
+ if ( ! wp_verify_nonce( $nonce, 'WAFsettingNonce_configurd_methods' ) ) {
1060
+ wp_send_json_error("error");
1061
+ }
1062
+ $enable = sanitize_text_field($_POST['mo2f_nonce_enable_configured_methods']);
1063
+
1064
+ if($enable == 'true'){
1065
+ update_site_option('mo2f_nonce_enable_configured_methods' ,true);
1066
+ wp_send_json('true');
1067
+ }
1068
+ else{
1069
+ update_site_option('mo2f_nonce_enable_configured_methods' , false);
1070
+ wp_send_json('false');
1071
+ }
1072
+ }
1073
 
1074
  function mo2f_role_based_2_factor(){
1075
  if ( !wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce') ){
1159
  }
1160
  }
1161
  }
 
1162
 
1163
  function mo2f_save_email_verification()
1164
  {
1242
  exit;
1243
 
1244
  }
1245
+ MO2f_Utility::mo2f_debug_file('OTP has been sent successfully over Email');
1246
  update_user_meta( $user_id, 'configure_2FA', 1 );
1247
  update_user_meta($user_id,'Mo2fOtpOverEmailtxId',$decoded['txId']);
1248
 
controllers/upgrade.php CHANGED
@@ -1,4 +1,5 @@
1
  <?php
2
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'upgrade.php';
3
  MoWpnsUtility::checkSecurity();
4
- update_site_option("mo_2fa_pnp",time());
 
1
  <?php
2
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'upgrade.php';
3
  MoWpnsUtility::checkSecurity();
4
+ update_site_option("mo_2fa_pnp",time());
5
+ update_site_option("mo2fa_visit",intval(get_site_option("mo2fa_visit",0))+1);
controllers/wpns-loginsecurity-ajax.php CHANGED
@@ -4,6 +4,7 @@ class wpns_ajax
4
  function __construct(){
5
  //add comment here
6
  add_action( 'admin_init' , array( $this, 'mo_login_security_ajax' ) );
 
7
  }
8
 
9
  function mo_login_security_ajax(){
@@ -24,7 +25,27 @@ class wpns_ajax
24
  $this->mo2f_ajax_otp(); break;
25
  }
26
  }
27
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  function wpns_login_security(){
29
  switch($_POST['wpns_loginsecurity_ajax'])
30
  {
@@ -64,15 +85,15 @@ class wpns_ajax
64
  function update_plan(){
65
  $mo2f_all_plannames = $_POST['planname'];
66
  $mo_2fa_plan_type = $_POST['planType'];
67
- update_option('mo2f_planname', $mo2f_all_plannames);
68
  if ($mo2f_all_plannames == 'addon_plan')
69
  {
70
- update_option('mo2f_planname', 'addon_plan');
71
  update_site_option('mo_2fa_addon_plan_type',$mo_2fa_plan_type);
72
  }
73
  elseif ($mo2f_all_plannames == '2fa_plan')
74
  {
75
- update_option('mo2f_planname', '2fa_plan');
76
  update_site_option('mo_2fa_plan_type',$mo_2fa_plan_type);
77
  }
78
  }
@@ -195,15 +216,15 @@ class wpns_ajax
195
  {
196
  $mo2f_all_plannames = $_POST['planname'];
197
  $mo_2fa_plan_type = $_POST['planType'];
198
- update_option('mo2f_planname', $mo2f_all_plannames);
199
  if ($mo2f_all_plannames == 'addon_plan')
200
  {
201
- update_option('mo2f_planname', 'addon_plan');
202
  update_site_option('mo_2fa_addon_plan_type',$mo_2fa_plan_type);
203
  }
204
  elseif ($mo2f_all_plannames == '2fa_plan')
205
  {
206
- update_option('mo2f_planname', '2fa_plan');
207
  update_site_option('mo_2fa_plan_type',$mo_2fa_plan_type);
208
  }
209
  }
@@ -1278,28 +1299,60 @@ class wpns_ajax
1278
 
1279
 
1280
  function wpns_captcha_settings(){
1281
- $nonce = $_POST['nonce'];
 
1282
  if ( ! wp_verify_nonce( $nonce, 'wpns-captcha' ) ){
1283
  wp_send_json('ERROR');
1284
  return;
1285
  }
 
1286
  $site_key = sanitize_text_field($_POST['site_key']);
1287
  $secret_key = sanitize_text_field($_POST['secret_key']);
1288
- $enable_captcha = $_POST['enable_captcha'];
1289
- if($enable_captcha == 'true'){$enable_captcha = "on";}else if($enable_captcha == 'false') {$enable_captcha = "";}
1290
- $login_form_captcha = $_POST['login_form'];
1291
- if($login_form_captcha == 'true'){$login_form_captcha = "on";}else if($login_form_captcha == 'false') {$login_form_captcha = "";}
1292
- $reg_form_captcha = $_POST['registeration_form'];
1293
- if($reg_form_captcha == 'true'){$reg_form_captcha = "on";}else if($reg_form_captcha == 'false') {$reg_form_captcha = "";}
1294
-
1295
- if(($site_key == "" || $secret_key == "") and $enable_captcha == 'true'){
 
 
 
 
 
 
 
 
 
 
 
 
1296
  wp_send_json('empty');
1297
  return;
1298
- }
 
1299
 
1300
- update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
1301
- update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1302
  update_option( 'mo_wpns_activate_recaptcha' , $enable_captcha );
 
 
1303
 
1304
  if($enable_captcha == "on"){
1305
  update_option( 'mo_wpns_activate_recaptcha_for_login' , $login_form_captcha );
4
  function __construct(){
5
  //add comment here
6
  add_action( 'admin_init' , array( $this, 'mo_login_security_ajax' ) );
7
+ add_action('init', array( $this, 'mo2fa_elementor_ajax_fun' ));
8
  }
9
 
10
  function mo_login_security_ajax(){
25
  $this->mo2f_ajax_otp(); break;
26
  }
27
  }
28
+ function mo2fa_elementor_ajax_fun()
29
+ {
30
+
31
+ if (isset( $_POST['miniorange_elementor_login_nonce'])){
32
+ $nonce = sanitize_text_field($_POST['miniorange_elementor_login_nonce']);
33
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-login-nonce' ) ){
34
+ wp_send_json('ERROR');
35
+ }
36
+ if(isset($_POST['mo2fa_elementor_user_password']) && !empty($_POST['mo2fa_elementor_user_password']) && isset($_POST['mo2fa_elementor_user_name']))
37
+ {
38
+ $info = array();
39
+ $info['user_login'] = sanitize_text_field($_POST['mo2fa_elementor_user_name']);
40
+ $info['user_password'] = $_POST['mo2fa_elementor_user_password'];
41
+ $info['remember'] = false;
42
+ $user_signon = wp_signon($info, false);
43
+ if (is_wp_error($user_signon)) {
44
+ wp_send_json(array('loggedin'=>false, 'message'=>__('Wrong username or password.')));
45
+ }
46
+ }
47
+ }
48
+ }
49
  function wpns_login_security(){
50
  switch($_POST['wpns_loginsecurity_ajax'])
51
  {
85
  function update_plan(){
86
  $mo2f_all_plannames = $_POST['planname'];
87
  $mo_2fa_plan_type = $_POST['planType'];
88
+ update_site_option('mo2f_planname', $mo2f_all_plannames);
89
  if ($mo2f_all_plannames == 'addon_plan')
90
  {
91
+ update_site_option('mo2f_planname', 'addon_plan');
92
  update_site_option('mo_2fa_addon_plan_type',$mo_2fa_plan_type);
93
  }
94
  elseif ($mo2f_all_plannames == '2fa_plan')
95
  {
96
+ update_site_option('mo2f_planname', '2fa_plan');
97
  update_site_option('mo_2fa_plan_type',$mo_2fa_plan_type);
98
  }
99
  }
216
  {
217
  $mo2f_all_plannames = $_POST['planname'];
218
  $mo_2fa_plan_type = $_POST['planType'];
219
+ update_site_option('mo2f_planname', $mo2f_all_plannames);
220
  if ($mo2f_all_plannames == 'addon_plan')
221
  {
222
+ update_site_option('mo2f_planname', 'addon_plan');
223
  update_site_option('mo_2fa_addon_plan_type',$mo_2fa_plan_type);
224
  }
225
  elseif ($mo2f_all_plannames == '2fa_plan')
226
  {
227
+ update_site_option('mo2f_planname', '2fa_plan');
228
  update_site_option('mo_2fa_plan_type',$mo_2fa_plan_type);
229
  }
230
  }
1299
 
1300
 
1301
  function wpns_captcha_settings(){
1302
+
1303
+ $nonce=sanitize_text_field($_POST['nonce']);
1304
  if ( ! wp_verify_nonce( $nonce, 'wpns-captcha' ) ){
1305
  wp_send_json('ERROR');
1306
  return;
1307
  }
1308
+
1309
  $site_key = sanitize_text_field($_POST['site_key']);
1310
  $secret_key = sanitize_text_field($_POST['secret_key']);
1311
+ $enable_captcha = sanitize_text_field($_POST['enable_captcha']);
1312
+ $login_form_captcha = sanitize_text_field($_POST['login_form']);
1313
+ $reg_form_captcha = sanitize_text_field($_POST['registeration_form']);
1314
+
1315
+ if((isset($_POST['version'])))
1316
+ {
1317
+ $mo2f_g_version = sanitize_text_field($_POST['version']);
1318
+ }
1319
+ else $mo2f_g_version='reCAPTCHA_v3';
1320
+
1321
+ if($enable_captcha == 'true') $enable_captcha = "on";
1322
+ else if($enable_captcha == 'false') $enable_captcha = "";
1323
+
1324
+ if($login_form_captcha == 'true') $login_form_captcha = "on";
1325
+ else if($login_form_captcha == 'false') $login_form_captcha = "";
1326
+
1327
+ if($reg_form_captcha == 'true') $reg_form_captcha = "on";
1328
+ else if($reg_form_captcha == 'false') $reg_form_captcha = "";
1329
+
1330
+ if(($site_key == "" || $secret_key == "") and $enable_captcha == 'on'){
1331
  wp_send_json('empty');
1332
  return;
1333
+ }
1334
+
1335
 
1336
+ if((($login_form_captcha == "on") || ($enable_captcha=="on")) && $mo2f_g_version==""){
1337
+ wp_send_json('version_select');
1338
+ return;
1339
+ }
1340
+ if($mo2f_g_version=='reCAPTCHA_v2')
1341
+ {
1342
+
1343
+ update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
1344
+ update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
1345
+ }
1346
+ if($mo2f_g_version=='reCAPTCHA_v3')
1347
+ {
1348
+
1349
+ update_option( 'mo_wpns_recaptcha_site_key_v3' , $site_key );
1350
+ update_option( 'mo_wpns_recaptcha_secret_key_v3' , $secret_key );
1351
+ }
1352
+
1353
  update_option( 'mo_wpns_activate_recaptcha' , $enable_captcha );
1354
+ update_option( 'mo_wpns_recaptcha_version' , $mo2f_g_version );
1355
+
1356
 
1357
  if($enable_captcha == "on"){
1358
  update_option( 'mo_wpns_activate_recaptcha_for_login' , $login_form_captcha );
database/database_functions_2fa.php CHANGED
@@ -211,7 +211,6 @@ class Mo2fDB {
211
  );
212
  return $count;
213
  }
214
-
215
  function get_all_user_2fa_methods() {
216
  global $wpdb;
217
  $all_methods = [];
@@ -322,6 +321,11 @@ class Mo2fDB {
322
 
323
  return $value == '' ? '' : $value[ $column_name ];
324
  }
 
 
 
 
 
325
 
326
  function delete_user_login_sessions($session_id ) {
327
  global $wpdb;
211
  );
212
  return $count;
213
  }
 
214
  function get_all_user_2fa_methods() {
215
  global $wpdb;
216
  $all_methods = [];
321
 
322
  return $value == '' ? '' : $value[ $column_name ];
323
  }
324
+ function get_user_configured_methods( $user_id ) {
325
+ global $wpdb;
326
+ $user_methods_detail = $wpdb->get_results( "SELECT * FROM " . $this->userDetailsTable . " WHERE user_id = " . $user_id . ";" );
327
+ return $user_methods_detail;
328
+ }
329
 
330
  function delete_user_login_sessions($session_id ) {
331
  global $wpdb;
database/mo2f_db_options.php CHANGED
@@ -21,6 +21,7 @@ $GLOBALS['scheduled_db_backup'] = 0;
21
  $GLOBALS['file_backup_created_time'] = 0;
22
  $GLOBALS['db_backup_created_time'] = 0;
23
  $GLOBALS['mo2f_inline_registration'] = 1;
 
24
  $GLOBALS['mo_database_backup'] = 1;
25
  $GLOBALS['mo_wpns_scan_initialize'] = 1;
26
  $GLOBALS['mo_file_manual_backup_plugins'] = 1;
@@ -35,3 +36,5 @@ $GLOBALS['bGltaXRSZWFjaGVk'] = 0;
35
  $GLOBALS['mo2f_is_NC'] = 1;
36
  $GLOBALS['mo2f_is_NNC'] = 1;
37
  $GLOBALS['mo2f_enforce_strong_passswords'] = false;
 
 
21
  $GLOBALS['file_backup_created_time'] = 0;
22
  $GLOBALS['db_backup_created_time'] = 0;
23
  $GLOBALS['mo2f_inline_registration'] = 1;
24
+ $GLOBALS['mo2f_nonce_enable_configured_methods'] = true;
25
  $GLOBALS['mo_database_backup'] = 1;
26
  $GLOBALS['mo_wpns_scan_initialize'] = 1;
27
  $GLOBALS['mo_file_manual_backup_plugins'] = 1;
36
  $GLOBALS['mo2f_is_NC'] = 1;
37
  $GLOBALS['mo2f_is_NNC'] = 1;
38
  $GLOBALS['mo2f_enforce_strong_passswords'] = false;
39
+ $GLOBALS['mo2f_enable_debug_log'] = 0;
40
+ $GLOBALS['mo2f_trial_query_sent'] = false;
handler/ajax.php CHANGED
@@ -41,6 +41,10 @@ class AjaxHandler
41
  case "plugin_warning_never_show_again":
42
  $this->wpns_plugin_warning_never_show_again();
43
  break;
 
 
 
 
44
 
45
  case "dismissSms":
46
  $this->wpns_sms_notice(); break;
@@ -56,6 +60,8 @@ class AjaxHandler
56
 
57
  case "dismisscodeswarning":
58
  $this->mo2f_backup_codes_dismiss(); break;
 
 
59
  }
60
  }
61
  }
@@ -138,6 +144,12 @@ class AjaxHandler
138
  wp_send_json('success');
139
  }
140
 
 
 
 
 
 
 
141
  function wpns_dismiss_firewall_notice(){
142
  update_site_option('waf_notification_option', 1);
143
  update_site_option('notice_dismiss_time',time());
@@ -169,7 +181,7 @@ class AjaxHandler
169
  update_user_meta($user_id, 'donot_show_backup_code_notice' , 1);
170
  wp_send_json('success');
171
  }
172
-
173
 
174
 
175
  }new AjaxHandler;
41
  case "plugin_warning_never_show_again":
42
  $this->wpns_plugin_warning_never_show_again();
43
  break;
44
+
45
+ case "mo2f_banner_never_show_again":
46
+ $this->wpns_mo2f_banner_never_show_again();
47
+ break;
48
 
49
  case "dismissSms":
50
  $this->wpns_sms_notice(); break;
60
 
61
  case "dismisscodeswarning":
62
  $this->mo2f_backup_codes_dismiss(); break;
63
+
64
+
65
  }
66
  }
67
  }
144
  wp_send_json('success');
145
  }
146
 
147
+ function wpns_mo2f_banner_never_show_again(){
148
+ update_site_option('mo2f_banner_never_show_again', 1);
149
+ wp_send_json('success');
150
+ }
151
+
152
+
153
  function wpns_dismiss_firewall_notice(){
154
  update_site_option('waf_notification_option', 1);
155
  update_site_option('notice_dismiss_time',time());
181
  update_user_meta($user_id, 'donot_show_backup_code_notice' , 1);
182
  wp_send_json('success');
183
  }
184
+
185
 
186
 
187
  }new AjaxHandler;
handler/feedback_form.php CHANGED
@@ -20,6 +20,10 @@ class FeedbackHandler
20
  case "mo_wpns_backup_download":
21
  $this->mo2f_backup_download($_POST);
22
  break;
 
 
 
 
23
 
24
  }
25
  }
@@ -127,6 +131,40 @@ class FeedbackHandler
127
  }
128
  }
129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  function mo2f_backup_download($postdata){
131
  global $wpnsDbQueries;
132
 
20
  case "mo_wpns_backup_download":
21
  $this->mo2f_backup_download($_POST);
22
  break;
23
+ case "log_file_download":
24
+ $this->mo2f_download_log_file();
25
+ break;
26
+
27
 
28
  }
29
  }
131
  }
132
  }
133
 
134
+ function mo2f_download_log_file(){
135
+ ob_start();
136
+ $nonce = sanitize_text_field($_POST['mo2f_nonce_download_log']);
137
+
138
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-download-log' ) ) {
139
+ $error = new WP_Error();
140
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
141
+
142
+ }else{
143
+
144
+
145
+ $debug_log_path = wp_upload_dir();
146
+ $debug_log_path = $debug_log_path['basedir'];
147
+ $file_name = 'miniorange_debug_log.txt';
148
+ $status = file_exists($debug_log_path.DIRECTORY_SEPARATOR.$file_name);
149
+ if($status){
150
+ header("Pragma: public");
151
+ header("Expires: 0");
152
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
153
+ header("Content-Type: application/octet-stream");
154
+ header("Content-Disposition: attachment; filename=".$file_name);
155
+ header("Content-Transfer-Encoding: binary");
156
+ header("Content-Length: ".filesize($debug_log_path.DIRECTORY_SEPARATOR.$file_name));
157
+ while (ob_get_level()) {
158
+ ob_end_clean();
159
+ @readfile($debug_log_path.DIRECTORY_SEPARATOR.$file_name);
160
+ exit;
161
+ }
162
+ }else{
163
+ do_action('wpns_show_message','File does not exist.','ERROR');
164
+ }
165
+ }
166
+ }
167
+
168
  function mo2f_backup_download($postdata){
169
  global $wpnsDbQueries;
170
 
handler/logger.php CHANGED
@@ -14,6 +14,7 @@ class mo2f_Logger
14
  global $moWpnsUtility;
15
  $mo_wpns_config = new MoWpnsHandler();
16
  $userIp = $moWpnsUtility->get_client_ip();
 
17
  $url = $moWpnsUtility->get_current_url();
18
  $user = wp_get_current_user();
19
  $username = is_user_logged_in() ? $user->user_login : 'GUEST';
@@ -28,6 +29,7 @@ class mo2f_Logger
28
  return;
29
  $mo_wpns_config = new MoWpnsHandler();
30
  $userIp = $moWpnsUtility->get_client_ip();
 
31
  $url = $moWpnsUtility->get_current_url();
32
  $user = wp_get_current_user();
33
  $username = is_user_logged_in() ? $user->user_login : 'GUEST';
14
  global $moWpnsUtility;
15
  $mo_wpns_config = new MoWpnsHandler();
16
  $userIp = $moWpnsUtility->get_client_ip();
17
+ $userIp = sanitize_text_field( $userIp );
18
  $url = $moWpnsUtility->get_current_url();
19
  $user = wp_get_current_user();
20
  $username = is_user_logged_in() ? $user->user_login : 'GUEST';
29
  return;
30
  $mo_wpns_config = new MoWpnsHandler();
31
  $userIp = $moWpnsUtility->get_client_ip();
32
+ $userIp = sanitize_text_field( $userIp );
33
  $url = $moWpnsUtility->get_current_url();
34
  $user = wp_get_current_user();
35
  $username = is_user_logged_in() ? $user->user_login : 'GUEST';
handler/login.php CHANGED
@@ -35,7 +35,10 @@ class LoginHandler
35
 
36
  function mo_wpns_init()
37
  {
38
-
 
 
 
39
  global $moWpnsUtility,$mo2f_dirName;
40
  $WAFEnabled = get_option('WAFEnabled');
41
  $WAFLevel = get_option('WAF');
@@ -51,15 +54,12 @@ class LoginHandler
51
  {
52
  if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php'))
53
  include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php');
54
- else
55
- {
56
- //UNable to find file. Please reconfigure.
57
- }
58
  }
59
  }
60
 
61
 
62
  $userIp = $moWpnsUtility->get_client_ip();
 
63
  $mo_wpns_config = new MoWpnsHandler();
64
  $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
65
  $isIpBlocked = false;
@@ -113,39 +113,44 @@ class LoginHandler
113
  }
114
 
115
  }
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
  function mo2f_IP_email_send()
118
  {
119
- global $moWpnsUtility;
120
  $userIp = $moWpnsUtility->get_client_ip();
121
-
122
- if(!get_site_option('mo2f_user_IP'))
123
- {
124
- update_site_option('mo2f_user_IP',$userIp );
125
- }
126
- $check_Ip = get_site_option('mo2f_user_IP');
 
 
 
 
127
 
128
  if ($check_Ip != $userIp)
129
- {
130
-
131
- $email = get_option('admin_email');
132
  $subject ="Alert: New IP Detected";
133
  $message = mo_IP_template();
134
  $headers=array('Content-Type: text/html; charset=UTF-8');
135
- if(empty($email))
136
- {
137
- $user = wp_get_current_user();
138
- $email = $user->user_email;
139
- }
140
- if(is_email($email))
141
- {
142
-
143
- wp_mail( $email,$subject,$message,$headers);
144
-
145
- }
146
-
147
- }
148
-
149
  }
150
 
151
  function wooc_validate_user_captcha_register($username, $email, $validation_errors) {
@@ -222,8 +227,17 @@ class LoginHandler
222
 
223
  if($user)
224
  {
 
225
  if(get_option('mo_wpns_activate_recaptcha_for_login'))
226
- $recaptchaError = $moWpnsUtility->verify_recaptcha(sanitize_text_field($_POST['g-recaptcha-response']));
 
 
 
 
 
 
 
 
227
 
228
  if(!empty($recaptchaError->errors))
229
  $error = $recaptchaError;
@@ -237,11 +251,11 @@ class LoginHandler
237
  }
238
  else
239
  $error->add('empty_password', __('<strong>ERROR</strong>: Invalid Username or password.'));
 
240
 
241
  }
242
 
243
- return $error;
244
- }
245
 
246
 
247
  //Function to check user password
@@ -277,7 +291,7 @@ class LoginHandler
277
 
278
  $mo_wpns_config = new MoWpnsHandler();
279
  $userIp = $moWpnsUtility->get_client_ip();
280
-
281
  $mo_wpns_config->move_failed_transactions_to_past_failed($userIp);
282
 
283
  if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
@@ -321,7 +335,7 @@ class LoginHandler
321
  {
322
  global $moWpnsUtility;
323
  $userIp = $moWpnsUtility->get_client_ip();
324
-
325
  if(empty($userIp) || empty($username) || !MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
326
  return;
327
 
35
 
36
  function mo_wpns_init()
37
  {
38
+ add_action( 'show_user_profile', array($this,'twofa_on_user_profile') ,10,3);
39
+ add_action( 'edit_user_profile', array($this,'twofa_on_user_profile') ,10,3);
40
+ add_action( 'personal_options_update', array( $this, 'user_two_factor_options_update' ) ,10,3);
41
+ add_action( 'edit_user_profile_update', array( $this, 'user_two_factor_options_update' ) ,10,3);
42
  global $moWpnsUtility,$mo2f_dirName;
43
  $WAFEnabled = get_option('WAFEnabled');
44
  $WAFLevel = get_option('WAF');
54
  {
55
  if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php'))
56
  include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php');
 
 
 
 
57
  }
58
  }
59
 
60
 
61
  $userIp = $moWpnsUtility->get_client_ip();
62
+ $userIp = sanitize_text_field( $userIp );
63
  $mo_wpns_config = new MoWpnsHandler();
64
  $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
65
  $isIpBlocked = false;
113
  }
114
 
115
  }
116
+ function twofa_on_user_profile( $user ) {
117
+ global $mo2f_dirName;
118
+ if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'user-profile-2fa.php')){
119
+ include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'user-profile-2fa.php');
120
+ }
121
+ }
122
+ function user_two_factor_options_update( $user ) {
123
+ global $mo2f_dirName;
124
+ if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'user-profile-2fa-update.php')){
125
+ include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'user-profile-2fa-update.php');
126
+ }
127
+ }
128
 
129
  function mo2f_IP_email_send()
130
  {
131
+ global $moWpnsUtility, $Mo2fdbQueries;
132
  $userIp = $moWpnsUtility->get_client_ip();
133
+ $userIp = sanitize_text_field( $userIp );
134
+ $user = wp_get_current_user();
135
+ $user_id = $user->ID;
136
+ $meta_key = 'mo2f_user_IP';
137
+ add_user_meta($user->ID, $meta_key,$userIp);
138
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID);
139
+ if (empty($email)) {
140
+ $email = $user->user_email;
141
+ }
142
+ $check_Ip = get_user_meta($user->ID,$meta_key)[0];
143
 
144
  if ($check_Ip != $userIp)
145
+ {
 
 
146
  $subject ="Alert: New IP Detected";
147
  $message = mo_IP_template();
148
  $headers=array('Content-Type: text/html; charset=UTF-8');
149
+ if(is_email($email))
150
+ {
151
+ wp_mail( $email,$subject,$message,$headers);
152
+ }
153
+ }
 
 
 
 
 
 
 
 
 
154
  }
155
 
156
  function wooc_validate_user_captcha_register($username, $email, $validation_errors) {
227
 
228
  if($user)
229
  {
230
+ $moCURL=new MocURL;
231
  if(get_option('mo_wpns_activate_recaptcha_for_login'))
232
+ {
233
+ $captcha_version=get_option('mo_wpns_recaptcha_version');
234
+ if($captcha_version=='reCAPTCHA_v3')
235
+ $recaptchaError = $moWpnsUtility->verify_recaptcha_3(sanitize_text_field($_POST['g-recaptcha-response']));
236
+ else if($captcha_version=='reCAPTCHA_v2')
237
+ $recaptchaError = $moWpnsUtility->verify_recaptcha(sanitize_text_field($_POST['g-recaptcha-response']));
238
+
239
+ }
240
+ }
241
 
242
  if(!empty($recaptchaError->errors))
243
  $error = $recaptchaError;
251
  }
252
  else
253
  $error->add('empty_password', __('<strong>ERROR</strong>: Invalid Username or password.'));
254
+ return $error;
255
 
256
  }
257
 
258
+
 
259
 
260
 
261
  //Function to check user password
291
 
292
  $mo_wpns_config = new MoWpnsHandler();
293
  $userIp = $moWpnsUtility->get_client_ip();
294
+ $userIp = sanitize_text_field( $userIp );
295
  $mo_wpns_config->move_failed_transactions_to_past_failed($userIp);
296
 
297
  if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
335
  {
336
  global $moWpnsUtility;
337
  $userIp = $moWpnsUtility->get_client_ip();
338
+ $userIp = sanitize_text_field( $userIp );
339
  if(empty($userIp) || empty($username) || !MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
340
  return;
341
 
handler/malware_scanner.php CHANGED
@@ -338,7 +338,7 @@ class Mo_wpns_Scan_Handler{
338
  $cfile=curl_file_create($source_file_path, 'test/plain', time().basename($source_file_path));
339
  $postdata = array('file' => $cfile);
340
  $content_type = 'multipart/form-data';
341
- $issues = $this->mo_wpns_malware_scan_request($postdata, $host, $content_type);
342
  if ($issues) {
343
  $scan_malware_count++;
344
  $scanresult['scan'] = $issues;
@@ -409,7 +409,7 @@ class Mo_wpns_Scan_Handler{
409
  $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/data';
410
  $postdata = http_build_query(array('fileCount' => $nooffiles, 'maliciousCount' => $scan_malware_count));
411
  $content_type = 'application/x-www-form-urlencoded';
412
- $lastRequest = $this->mo_wpns_malware_scan_request($postdata, $host, $content_type);
413
  }
414
  update_option('mo_wpns_files_scanned', $nooffiles);
415
  return array('file_count'=> $nooffiles, 'malware_count'=>$scan_malware_count, 'repo_issues'=>$repo_issue_count, 'malicious_link'=>$malicious_link_count, 'scan'=>$scanresults);
@@ -431,7 +431,7 @@ class Mo_wpns_Scan_Handler{
431
  }
432
  }
433
 
434
- function mo_wpns_malware_scan_request($postdata = array(), $host, $content_type){
435
  $response = null;
436
  $ch=curl_init($host);
437
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
338
  $cfile=curl_file_create($source_file_path, 'test/plain', time().basename($source_file_path));
339
  $postdata = array('file' => $cfile);
340
  $content_type = 'multipart/form-data';
341
+ $issues = $this->mo_wpns_malware_scan_request( $host, $content_type,$postdata);
342
  if ($issues) {
343
  $scan_malware_count++;
344
  $scanresult['scan'] = $issues;
409
  $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/data';
410
  $postdata = http_build_query(array('fileCount' => $nooffiles, 'maliciousCount' => $scan_malware_count));
411
  $content_type = 'application/x-www-form-urlencoded';
412
+ $lastRequest = $this->mo_wpns_malware_scan_request( $host, $content_type,$postdata);
413
  }
414
  update_option('mo_wpns_files_scanned', $nooffiles);
415
  return array('file_count'=> $nooffiles, 'malware_count'=>$scan_malware_count, 'repo_issues'=>$repo_issue_count, 'malicious_link'=>$malicious_link_count, 'scan'=>$scanresults);
431
  }
432
  }
433
 
434
+ function mo_wpns_malware_scan_request( $host, $content_type,$postdata = array()){
435
  $response = null;
436
  $ch=curl_init($host);
437
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
handler/malware_scanner/malware_scanner_cron.php CHANGED
@@ -193,7 +193,7 @@ class Mo_wpns_Scan_Handler_Cron{
193
  }
194
  }
195
  }
196
- $result = $this->iterator_plugins_themes($all_plugins, $wp_plugin_repo_file, 'plugins', $start_time, $time_limit,$scan_config,$reportid, $scanverification);
197
  if($result === -99){
198
  $scan_config['check_repo'] = 0;
199
  $repo_check_status_code = -99;
@@ -264,7 +264,7 @@ class Mo_wpns_Scan_Handler_Cron{
264
  }
265
  update_site_option('mo2f_download_info', $download_info);
266
 
267
- $result = $this->iterator_plugins_themes($all_themes, $wp_theme_repo_file, 'themes', $start_time, $time_limit,$scan_config,$reportid,$scanverification);
268
  if($result === -99){
269
  $scan_config['check_repo'] = 0;
270
  $repo_check_status_code = -99;
@@ -297,7 +297,7 @@ class Mo_wpns_Scan_Handler_Cron{
297
  $response=$Mo_wpns_Scan_Handler_Cron->mo2f_wp_remote_get($scan_config['type_scan'], $reportid, $scanverification, $scan_stage_complete);
298
  }
299
 
300
- function iterator_plugins_themes($themes_or_plugins, $path, $type='', $start_time, $time_limit, $scan_config,$reportid, $scanverification){
301
  $downloaded_already= get_site_option('mo2f_download_done');
302
  if($downloaded_already == false){
303
  $downloaded_already=0;
@@ -488,7 +488,7 @@ class Mo_wpns_Scan_Handler_Cron{
488
  }
489
  }
490
 
491
- function mo_wpns_malware_scan_request($postdata = array(), $host, $content_type){
492
  $response = null;
493
  $ch=curl_init($host);
494
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
@@ -785,7 +785,7 @@ class Mo_wpns_Scan_Handler_Cron{
785
  return $avergaeTimeEachFile;
786
  }
787
 
788
- function get_scan_result_parts($mo2f_malware_db_handler=null, $folderpaths=array(), $scan_config, $start_time, $time_limit){
789
  if(!empty($folderpaths)){
790
  if ( in_array( 'curl', get_loaded_extensions() ) ) {
791
  $scanresults=array();
@@ -883,7 +883,7 @@ class Mo_wpns_Scan_Handler_Cron{
883
  $postdata = array('file' => $cfile);
884
 
885
  $content_type = 'multipart/form-data';
886
- $issues = $this->mo_wpns_malware_scan_request($postdata, $host, $content_type);
887
  if ($issues) {
888
  $scan_malware_count++;
889
  $scanresult['scan'] = $issues;
193
  }
194
  }
195
  }
196
+ $result = $this->iterator_plugins_themes($all_plugins, $wp_plugin_repo_file, $start_time, $time_limit,$scan_config,$reportid, $scanverification, 'plugins');
197
  if($result === -99){
198
  $scan_config['check_repo'] = 0;
199
  $repo_check_status_code = -99;
264
  }
265
  update_site_option('mo2f_download_info', $download_info);
266
 
267
+ $result = $this->iterator_plugins_themes($all_themes, $wp_theme_repo_file, $start_time, $time_limit,$scan_config,$reportid,$scanverification, 'themes');
268
  if($result === -99){
269
  $scan_config['check_repo'] = 0;
270
  $repo_check_status_code = -99;
297
  $response=$Mo_wpns_Scan_Handler_Cron->mo2f_wp_remote_get($scan_config['type_scan'], $reportid, $scanverification, $scan_stage_complete);
298
  }
299
 
300
+ function iterator_plugins_themes($themes_or_plugins, $path, $start_time, $time_limit, $scan_config,$reportid, $scanverification, $type=''){
301
  $downloaded_already= get_site_option('mo2f_download_done');
302
  if($downloaded_already == false){
303
  $downloaded_already=0;
488
  }
489
  }
490
 
491
+ function mo_wpns_malware_scan_request( $host, $content_type,$postdata = array()){
492
  $response = null;
493
  $ch=curl_init($host);
494
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
785
  return $avergaeTimeEachFile;
786
  }
787
 
788
+ function get_scan_result_parts( $scan_config, $start_time, $time_limit,$mo2f_malware_db_handler=null, $folderpaths=array()){
789
  if(!empty($folderpaths)){
790
  if ( in_array( 'curl', get_loaded_extensions() ) ) {
791
  $scanresults=array();
883
  $postdata = array('file' => $cfile);
884
 
885
  $content_type = 'multipart/form-data';
886
+ $issues = $this->mo_wpns_malware_scan_request($host, $content_type,$postdata);
887
  if ($issues) {
888
  $scan_malware_count++;
889
  $scanresult['scan'] = $issues;
handler/malware_scanner/scanner_set_cron.php CHANGED
@@ -124,7 +124,7 @@ class mo2f_scanner_parts
124
  $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/data';
125
  $postdata = http_build_query(array('fileCount' => $last_scan, 'maliciousCount' => $scan_malware_count));
126
  $content_type = 'application/x-www-form-urlencoded';
127
- $lastRequest = $mo_wpns_scan_handler->mo_wpns_malware_scan_request($postdata, $host, $content_type);
128
  }
129
  $Mo_wpns_Scan_Handler_Cron = new Mo_wpns_Scan_Handler_Cron();
130
  $response=$Mo_wpns_Scan_Handler_Cron->mo2f_wp_remote_get($scan_config['type_scan'], $reportid, $scanverification, 2);
@@ -132,7 +132,7 @@ class mo2f_scanner_parts
132
  }else{//sending next 100 files
133
  $current_time= time();
134
  $time_limit= ini_get('max_execution_time');
135
- $result=$mo_wpns_scan_handler->get_scan_result_parts($mo2f_malware_db_handler, $files_to_scan, $scan_config, $current_time, $time_limit);
136
 
137
  if($result['scan']){
138
  foreach ($result['scan'] as $key => $value) {
124
  $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/data';
125
  $postdata = http_build_query(array('fileCount' => $last_scan, 'maliciousCount' => $scan_malware_count));
126
  $content_type = 'application/x-www-form-urlencoded';
127
+ $lastRequest = $mo_wpns_scan_handler->mo_wpns_malware_scan_request($host, $content_type,$postdata);
128
  }
129
  $Mo_wpns_Scan_Handler_Cron = new Mo_wpns_Scan_Handler_Cron();
130
  $response=$Mo_wpns_Scan_Handler_Cron->mo2f_wp_remote_get($scan_config['type_scan'], $reportid, $scanverification, 2);
132
  }else{//sending next 100 files
133
  $current_time= time();
134
  $time_limit= ini_get('max_execution_time');
135
+ $result=$mo_wpns_scan_handler->get_scan_result_parts($scan_config, $current_time, $time_limit,$mo2f_malware_db_handler, $files_to_scan);
136
 
137
  if($result['scan']){
138
  foreach ($result['scan'] as $key => $value) {
handler/recaptcha.php CHANGED
@@ -24,6 +24,7 @@
24
  if(array_key_exists('g-recaptcha-response',$_POST))
25
  {
26
  $userIp = $moWpnsUtility->get_client_ip();
 
27
  $mocURL = new MocURL;
28
  $response = $mocURL->validate_recaptcha($userIp,sanitize_text_field($_POST['g-recaptcha-response']));
29
  $content = json_decode($response, true);
@@ -34,30 +35,70 @@
34
  else
35
  echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
36
  }
37
- show_google_recaptcha_form();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  }
39
  }
40
  }
41
 
42
 
43
- function custom_login_fields()
 
 
 
44
  {
45
- if(get_option('mo_wpns_activate_recaptcha_for_login') && MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option'))
46
- {
 
 
47
  echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
48
  echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
49
  echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
50
  }
51
  }
52
-
53
- function register_with_captcha(){
54
- if(get_option('mo_wpns_activate_recaptcha_for_registration'))
55
- {
56
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
57
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
58
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
59
- }
 
 
 
60
  }
 
61
 
62
  function woocommerce_register_with_captcha(){
63
  if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
@@ -95,6 +136,7 @@
95
  {
96
  global $moWpnsUtility;
97
  $userIp = $moWpnsUtility->get_client_ip();
 
98
  $mocURL = new MocURL;
99
  $response = $mocURL->validate_recaptcha($userIp,$response);
100
  $content = json_decode($response, true);
@@ -102,5 +144,17 @@
102
  return $isvalid;
103
  }
104
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
  new mo2f_ReCaptcha;
24
  if(array_key_exists('g-recaptcha-response',$_POST))
25
  {
26
  $userIp = $moWpnsUtility->get_client_ip();
27
+ $userIp = sanitize_text_field( $userIp );
28
  $mocURL = new MocURL;
29
  $response = $mocURL->validate_recaptcha($userIp,sanitize_text_field($_POST['g-recaptcha-response']));
30
  $content = json_decode($response, true);
35
  else
36
  echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
37
  }
38
+ show_google_recaptcha_form_v2();
39
+ }
40
+ if(isset($_REQUEST['option']) && $_REQUEST['option']=='testrecaptchaconfig3')
41
+ {
42
+ if(array_key_exists('g-recaptcha-response',$_REQUEST))
43
+ {
44
+ $userIp = $moWpnsUtility->get_client_ip();
45
+ $userIp = sanitize_text_field( $userIp );
46
+ $mocURL = new MocURL;
47
+
48
+ $response = $mocURL->get_Captcha_v3($_REQUEST['g-recaptcha-response']);
49
+
50
+ $content = json_decode($response, true);
51
+ if(isset($content['error-codes']) && in_array("invalid-input-secret", $content['error-codes']))
52
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid Secret Key.</h2>";
53
+ else if(isset($content['success']) && $content['success']==1)
54
+ {
55
+
56
+ if($content['success']==1)
57
+ {
58
+ if($content['score']>=0.9)
59
+ {
60
+ echo "<br><br><h2 style=color:green;text-align:center>Welcome!</h2>";
61
+ echo "<h2 style=color:green;text-align:center>Test was successful and captcha verified.</h2>";
62
+ }
63
+ else echo "<br><br><h2 style=color:red;text-align:center>Captcha verification failed! Permission denied.</h2>";
64
+ }
65
+ }
66
+ else
67
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
68
+ }
69
+ show_google_recaptcha_form_v3();
70
  }
71
  }
72
  }
73
 
74
 
75
+ function custom_login_fields()
76
+ {
77
+ global $moWpnsUtility,$mo2f_dirName;
78
+ if(get_option('mo_wpns_activate_recaptcha_for_login') && MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option'))
79
  {
80
+ if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v3')
81
+ show_google_recaptcha_form_v3_login();
82
+ else if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v2')
83
+ {
84
  echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
85
  echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
86
  echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
87
  }
88
  }
89
+ }
90
+
91
+
92
+ function register_with_captcha(){
93
+ global $moWpnsUtility,$mo2f_dirName;
94
+ if(get_option('mo_wpns_activate_recaptcha_for_registration'))
95
+ {
96
+ if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v3')
97
+ show_google_recaptcha_form_v3_login();
98
+ else if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v2')
99
+ show_google_recaptcha_form_v2_login();
100
  }
101
+ }
102
 
103
  function woocommerce_register_with_captcha(){
104
  if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
136
  {
137
  global $moWpnsUtility;
138
  $userIp = $moWpnsUtility->get_client_ip();
139
+ $userIp = sanitize_text_field( $userIp );
140
  $mocURL = new MocURL;
141
  $response = $mocURL->validate_recaptcha($userIp,$response);
142
  $content = json_decode($response, true);
144
  return $isvalid;
145
  }
146
 
147
+ public static function recaptcha_verify_3($response)
148
+ {
149
+ global $moWpnsUtility;
150
+ $userIp = $moWpnsUtility->get_client_ip();
151
+ $userIp = sanitize_text_field( $userIp );
152
+ $mocURL = new MocURL;
153
+ $response = $mocURL->get_Captcha_v3($response);
154
+ $content = json_decode($response, true);
155
+ $isvalid = isset($content['success']) && $content['success']==1 && $content['score']>=0.9? true : false;
156
+ return $isvalid;
157
+ }
158
+
159
  }
160
  new mo2f_ReCaptcha;
handler/registration.php CHANGED
@@ -43,8 +43,14 @@ class RegistrationHandler
43
  {
44
 
45
  global $moWpnsUtility;
46
- if(get_option('mo_wpns_activate_recaptcha_for_registration'))
47
- $recaptchaError = $moWpnsUtility->verify_recaptcha(sanitize_text_field($_POST['g-recaptcha-response']));
 
 
 
 
 
 
48
  if(get_site_option('mo_wpns_enable_fake_domain_blocking')){
49
  if($moWpnsUtility->check_if_valid_email($user_email) && empty($recaptchaError->errors))
50
  $errors->add( 'blocked_email_error', __( '<strong>ERROR</strong>: Your email address is not allowed to register. Please select different email address.') );
43
  {
44
 
45
  global $moWpnsUtility;
46
+ if(get_option('mo_wpns_activate_recaptcha_for_registration')){
47
+ if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v3')
48
+ $recaptchaError = $moWpnsUtility->verify_recaptcha_3(sanitize_text_field($_POST['g-recaptcha-response']));
49
+ else if(get_option('mo_wpns_recaptcha_version')=='reCAPTCHA_v2')
50
+ $recaptchaError = $moWpnsUtility->verify_recaptcha(sanitize_text_field($_POST['g-recaptcha-response']));
51
+ if(!empty($recaptchaError->errors))
52
+ $errors = $recaptchaError;
53
+ }
54
  if(get_site_option('mo_wpns_enable_fake_domain_blocking')){
55
  if($moWpnsUtility->check_if_valid_email($user_email) && empty($recaptchaError->errors))
56
  $errors->add( 'blocked_email_error', __( '<strong>ERROR</strong>: Your email address is not allowed to register. Please select different email address.') );
handler/twofa/class_miniorange_2fa_strong_password.php CHANGED
@@ -20,7 +20,7 @@ class class_miniorange_2fa_strong_password {
20
  }
21
  public static function validatePassword($errors, $update, $userData){
22
  $Users = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option');
23
- $UserRole = $_POST['role'];
24
  if(is_null($UserRole) and $Users == 'user')
25
  {
26
  return true;
20
  }
21
  public static function validatePassword($errors, $update, $userData){
22
  $Users = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option');
23
+ $UserRole = isset($_POST['role'])?sanitize_text_field($_POST['role']):NULL;
24
  if(is_null($UserRole) and $Users == 'user')
25
  {
26
  return true;
handler/twofa/gaonprem.php CHANGED
@@ -6,7 +6,7 @@ class Google_auth_onpremise{
6
 
7
  }
8
 
9
- function mo_GAuth_get_details()
10
  {
11
 
12
  $user=wp_get_current_user();
@@ -28,10 +28,16 @@ class Google_auth_onpremise{
28
  $email=$user->user_email;
29
  $otpcode=$this->getCode($secret_ga);
30
  $url=$this->geturl($secret_ga ,$issuer,$email);
31
- echo '<div class="mo_wpns_setting_layout">';
 
 
32
  mo2f_configure_google_authenticator_onprem( $secret_ga ,$url,$otpcode, $session_id_encrypt );
33
  echo '</div>';
34
-
 
 
 
 
35
  }
36
 
37
  function mo_GAuth_set_secret($user_id,$secret){
6
 
7
  }
8
 
9
+ function mo_GAuth_get_details($setupWizard = false)
10
  {
11
 
12
  $user=wp_get_current_user();
28
  $email=$user->user_email;
29
  $otpcode=$this->getCode($secret_ga);
30
  $url=$this->geturl($secret_ga ,$issuer,$email);
31
+ if(!$setupWizard)
32
+ {
33
+ echo '<div class="mo2f_table_layout">';
34
  mo2f_configure_google_authenticator_onprem( $secret_ga ,$url,$otpcode, $session_id_encrypt );
35
  echo '</div>';
36
+ }
37
+ else
38
+ {
39
+ mo2f_configure_google_authenticator_setupWizard($secret_ga ,$url,$otpcode, $session_id_encrypt);
40
+ }
41
  }
42
 
43
  function mo_GAuth_set_secret($user_id,$secret){
handler/twofa/setup_twofa.php CHANGED
@@ -8,7 +8,6 @@
8
  include $setup_dirName.'setup_miniorange_authenticator.php';
9
  include $setup_dirName.'setup_otp_over_sms.php';
10
  include $setup_dirName.'setup_otp_over_telegram.php';
11
- include $setup_dirName.'setup_otp_over_whatsapp.php';
12
  include $setup_dirName.'setup_duo_authenticator.php';
13
  include $test_dirName.'test_twofa_email_verification.php';
14
  include $test_dirName.'test_twofa_duo_authenticator.php';
@@ -19,8 +18,7 @@
19
  include $test_dirName.'test_twofa_miniorange_soft_token.php';
20
  include $test_dirName.'test_twofa_otp_over_sms.php';
21
  include $test_dirName.'test_twofa_otp_over_Telegram.php';
22
- include $test_dirName.'test_twofa_otp_over_Whatsapp.php';
23
-
24
  function mo2f_decode_2_factor( $selected_2_factor_method, $decode_type ) {
25
 
26
  if ( $selected_2_factor_method == 'NONE' ) {
@@ -83,16 +81,19 @@
83
 
84
  function mo2f_create_2fa_form( $user, $category, $auth_methods, $can_display_admin_features='' ) {
85
  global $Mo2fdbQueries;
 
 
 
 
 
 
86
  $all_two_factor_methods = array(
87
- "miniOrange QR Code Authentication",
88
- "miniOrange Soft Token",
89
- "miniOrange Push Notification",
90
  "Google Authenticator",
91
  "Security Questions",
92
  "OTP Over SMS",
93
  "OTP Over Email",
94
  "OTP Over Telegram",
95
- "OTP Over Whatsapp",
96
  "Duo Authenticator",
97
  "Authy Authenticator",
98
  "Email Verification",
@@ -101,25 +102,24 @@
101
  );
102
  $two_factor_methods_descriptions = array(
103
  ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
104
- "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
105
- "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
106
- "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
107
- "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
108
- "Security Questions" => "Answer the three security questions you had set, to login.",
109
- "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
110
- "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
111
- "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
112
- "Email Verification" => "Accept the verification link sent to your email to login.",
113
- "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
114
- "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login.",
115
- "OTP Over Whatsapp" => "Enter the One Time Passcode sent to your Whatsapp account to login. This method is supported with twillio",
116
- "OTP Over Telegram" => "Enter the One Time Passcode sent to your Telegram account to login.",
117
- "Duo Authenticator" => "Scan the QR code from the account in your Duo Authenticator App to login."
118
- );
119
  $two_factor_methods_doc = array(
120
  "Security Questions" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-security-question",
121
  "Google Authenticator" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/google-authenticator",
122
- "miniOrange QR Code Authentication" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-QR-code",
123
  "Email Verification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/email_verification",
124
  "miniOrange Soft Token" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-soft-token",
125
  "miniOrange Push Notification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-push-notification",
@@ -134,7 +134,7 @@
134
  $two_factor_methods_video = array(
135
  "Security Questions" => "https://www.youtube.com/watch?v=pXPqQ047o-0",
136
  "Google Authenticator" => "https://www.youtube.com/watch?v=BS6tY-Goa1Q",
137
- "miniOrange QR Code Authentication" => "https://www.youtube.com/watch?v=IPYizmgzTd8",
138
  "Email Verification" => "https://www.youtube.com/watch?v=OacJWBYx_AE",
139
  "miniOrange Soft Token" => "https://www.youtube.com/watch?v=9HV8V4f80k8",
140
  "miniOrange Push Notification" => "https://www.youtube.com/watch?v=it_dAhFcxvw",
@@ -147,17 +147,15 @@
147
 
148
  );
149
 
150
- $two_factor_methods_EC = array_slice( $all_two_factor_methods, 0, 11 );
151
- $two_factor_methods_NC = array_slice( $all_two_factor_methods, 0, 10 );
152
  if(MO2F_IS_ONPREM or $category != 'free_plan')
153
  {
154
  $all_two_factor_methods = array(
155
  "Security Questions",
156
  "Google Authenticator",
157
  "Email Verification",
158
- "miniOrange QR Code Authentication",
159
- "miniOrange Soft Token",
160
- "miniOrange Push Notification",
161
  "Authy Authenticator",
162
  "OTP Over SMS",
163
  "OTP Over Email",
@@ -169,21 +167,23 @@
169
  );
170
  $two_factor_methods_descriptions = array(
171
  ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
172
- "Security Questions" => "Answer the three security questions you had set, to login.",
173
- "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
174
- "Email Verification" => "Accept the verification link sent to your email to login.",
175
- "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
176
- "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
177
- "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
178
- "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
179
- "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
180
- "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
181
- "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
182
- "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login.",
183
- "OTP Over Whatsapp" => "Enter the One Time Passcode sent to your Whatsapp account to login. This method is supported with twillio",
184
- "OTP Over Telegram" => "Enter the One Time Passcode sent to your Telegram account to login.",
185
- "Duo Authenticator" => "Scan the QR code from the account in your Duo Authenticator App to login."
186
- );
 
 
187
  }
188
 
189
  $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
@@ -197,6 +197,11 @@
197
  <br>
198
  <table class="mo2f_auth_methods_table">';
199
 
 
 
 
 
 
200
  for ( $i = 0; $i < count( $auth_methods ); $i ++ ) {
201
 
202
  $form .= '<tr>';
@@ -213,7 +218,8 @@
213
  $auth_method_abr = str_replace( ' ', '', $auth_method );
214
  $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
215
  $is_auth_method_selected = ( $configured_auth_method == $auth_method ? true : false );
216
-
 
217
  $is_auth_method_av = false;
218
  if ( ( $is_EC && in_array( $auth_method, $two_factor_methods_EC ) ) ||
219
  ( $is_NC && in_array( $auth_method, $two_factor_methods_NC ) ) ) {
@@ -223,8 +229,8 @@
223
  $thumbnail_height = $is_auth_method_av && $category == 'free_plan' ? 190 : 160;
224
  $is_image = $auth_method == "" ? 0 :1;
225
 
226
- $form .= '<td style="width:33%;height: 203px;">
227
- <div class="mo2f_thumbnail" id="'.$auth_method_abr.'_thumbnail_2_factor" style="height:' . $thumbnail_height . 'px;border:1px solid ';
228
  if(MO2F_IS_ONPREM)
229
  {
230
  $iscurrentMethod = 0;
@@ -232,39 +238,35 @@
232
  if($currentMethod == $auth_method)
233
  $iscurrentMethod = 1;
234
 
235
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
236
- $form .= ';border-top:3px solid ';
237
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
238
  $form .= ';">';
239
  }
240
  else
241
  {
242
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
243
- $form .= ';border-top:3px solid ';
244
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
245
  $form .= ';">';
246
 
247
  }
248
  $form .= '<div>
249
  <div class="mo2f_thumbnail_method" style="width:100%";>
250
- <div style="width: 17%; float:left;padding-top:5px;padding-left:5px;">';
251
 
252
  if($is_image){
253
- $form .= '<img src="' . plugins_url( "includes/images/authmethods/" . $auth_method_abr . ".png", dirname(dirname(__FILE__ ))) . '" style="width: 40px;height: 40px !important; " line-height: 80px;" />';
254
  }
255
 
256
  $form .= '</div>
257
- <div class="mo2f_thumbnail_method_desc" style="padding: 8px;width: 83%;">';
258
  switch ($auth_method) {
259
  case 'Google Authenticator':
260
  $form .=' <span style="float:right">
261
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
262
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
263
-
264
  </a>
265
-
266
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
267
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
268
  </a>
269
  </span>';
270
  break;
@@ -272,10 +274,10 @@
272
  case 'Security Questions':
273
  $form .=' <span style="float:right">
274
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
275
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
276
  </a>
277
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
278
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
279
  </a>
280
 
281
 
@@ -285,11 +287,11 @@
285
  case 'OTP Over SMS':
286
  $form .=' <span style="float:right">
287
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
288
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
289
 
290
  </a>
291
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
292
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
293
  </a>
294
 
295
  </span>';
@@ -299,25 +301,42 @@
299
  case 'miniOrange Soft Token':
300
  $form .=' <span style="float:right">
301
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
302
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
303
 
304
  </a>
305
 
306
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
307
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
308
  </a>
309
  </span>';
310
 
311
  break;
312
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
313
  case 'miniOrange QR Code Authentication':
314
  $form .=' <span style="float:right">
315
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
316
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
317
 
318
  </a>
319
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
320
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
321
  </a>
322
 
323
  </span>';
@@ -327,11 +346,11 @@
327
  case 'miniOrange Push Notification':
328
  $form .=' <span style="float:right">
329
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
330
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
331
 
332
  </a>
333
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
334
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
335
  </a>
336
 
337
  </span>';
@@ -340,27 +359,19 @@
340
  case 'Email Verification':
341
  $form .=' <span style="float:right">
342
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
343
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
344
 
345
  </a>
346
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
347
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
348
  </a>
349
 
350
  </span>';
351
  break;
352
- case 'OTP Over Whatsapp':
353
- $form .=' <span style="float:right">
354
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
355
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
356
- </a>
357
-
358
- </span>';
359
- break;
360
- case 'OTP Over Telegram':
361
  $form .=' <span style="float:right">
362
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
363
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
364
  </a>
365
 
366
  </span>';
@@ -368,7 +379,7 @@
368
  case 'OTP Over Email':
369
  $form .=' <span style="float:right">
370
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
371
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
372
  </a>
373
 
374
  </span>';
@@ -388,22 +399,25 @@
388
 
389
  if ( $is_auth_method_av && $category == 'free_plan' ) {
390
  $is_auth_method_configured = 0;
391
- $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_' . $auth_method_abr . '_config_status', $user->ID );
 
 
 
 
392
  if(($auth_method == 'OUT OF BAND EMAIL' or $auth_method == 'OTP Over Email') and !MO2F_IS_ONPREM )
393
  $is_auth_method_configured = 1;
394
  $chat_id = get_user_meta($user->ID,'mo2f_chat_id',true);
395
- $WhatsappID = get_user_meta($user->ID,'mo2f_whatsapp_id',true);
396
  $form .= '<div style="height:40px;width:100%;position: absolute;bottom: 0;background-color:';
397
  $iscurrentMethod = 0;
398
  if(MO2F_IS_ONPREM)
399
  {
400
  $currentMethod = $configured_auth_method;
401
- if($currentMethod == $auth_method)
402
  $iscurrentMethod = 1;
403
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
404
  }
405
  else
406
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
407
  if(MO2F_IS_ONPREM)
408
  {
409
  $twofactor_transactions = new Mo2fDB;
@@ -428,9 +442,9 @@
428
 
429
 
430
 
431
- $cloud_methods = array('miniOrange QR Code Authentication' , 'miniOrange Soft Token','miniOrange Push Notification');
432
 
433
- if($auth_method == 'Email Verification' || $auth_method == 'Security Questions' || $auth_method == 'Google Authenticator' || $auth_method == 'miniOrange QR Code Authentication' || $auth_method =='miniOrange Soft Token' || $auth_method == 'miniOrange Push Notification' || $auth_method == 'OTP Over SMS' || $auth_method == 'OTP Over Email' || $auth_method == 'OTP Over Telegram' || $auth_method == 'OTP Over Whatsapp' || $auth_method == 'Duo Authenticator')
434
  {
435
  $show = 1;
436
  }
@@ -451,13 +465,16 @@
451
  <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\');"';
452
  $form .= $can_user_configure_2fa_method ? "" : " disabled ";
453
  $form .= $show==1 ? "" : " disabled ";
454
- if($show == 1 and $is_auth_method_configured and $iscurrentMethod == 0)
455
- $form .= '>Set as 2-factor</button>
456
- </div>';
 
 
 
 
 
457
  }
458
-
459
- $form .= '</div>';
460
-
461
  }
462
  else
463
  {
@@ -490,8 +507,19 @@
490
  </div>';
491
  }
492
 
493
- $form .= '</div>';
494
  }
 
 
 
 
 
 
 
 
 
 
 
 
495
  }
496
  $form .= '</div></div></td>';
497
  }
@@ -507,13 +535,19 @@
507
  <p style="font-size:16px;margin-left: 1%">In addition to these authentication methods, for other features in this plan, <a href="admin.php?page=mo_2fa_upgrade"><i>Click here.</i></a></p>
508
  </div>';
509
  }
510
-
511
  $form .= '</div> <input type="hidden" name="miniorange_save_form_auth_methods_nonce"
512
  value="'. wp_create_nonce( "miniorange-save-form-auth-methods-nonce" ) .'"/>
513
  <input type="hidden" name="option" value="mo2f_save_' . $category . '_auth_methods" />
514
  <input type="hidden" name="mo2f_configured_2FA_method_' . $category . '" id="mo2f_configured_2FA_method_' . $category . '" />
515
  <input type="hidden" name="mo2f_selected_action_' . $category . '" id="mo2f_selected_action_' . $category . '" />
516
- </form>';
 
 
 
 
 
 
517
 
518
  return $form;
519
  }
@@ -696,64 +730,59 @@ function mo2f_show_2FA_configuration_screen( $user, $selected2FAmethod ) {
696
  if(!get_user_meta($user->ID, 'mo2f_google_auth', true)){
697
  Miniorange_Authentication::mo2f_get_GA_parameters($user);
698
  }
699
- echo '<div class="mo_wpns_setting_layout">';
700
  mo2f_configure_google_authenticator( $user );
701
  echo '</div>';
702
  }
703
  break;
704
  case "Authy Authenticator":
705
- echo '<div class="mo_wpns_setting_layout">';
706
  mo2f_configure_authy_authenticator( $user );
707
  echo '</div>';
708
  break;
709
  case "Security Questions":
710
- echo '<div class="mo_wpns_setting_layout">';
711
  mo2f_configure_for_mobile_suppport_kba( $user );
712
  echo '</div>';
713
  break;
714
  case "Email Verification":
715
- echo '<div class="mo_wpns_setting_layout">';
716
  mo2f_configure_for_mobile_suppport_kba( $user );
717
  echo '</div>';
718
  break;
719
  case "OTP Over SMS":
720
- echo '<div class="mo_wpns_setting_layout">';
721
  mo2f_configure_otp_over_sms( $user );
722
  echo '</div>';
723
  break;
724
  case "miniOrange Soft Token":
725
- echo '<div class="mo_wpns_setting_layout">';
726
  mo2f_configure_miniorange_authenticator( $user );
727
  echo '</div>';
728
  break;
729
  case "miniOrange QR Code Authentication":
730
- echo '<div class="mo_wpns_setting_layout">';
731
  mo2f_configure_miniorange_authenticator( $user );
732
  echo '</div>';
733
  break;
734
  case "miniOrange Push Notification":
735
- echo '<div class="mo_wpns_setting_layout">';
736
  mo2f_configure_miniorange_authenticator( $user );
737
  echo '</div>';
738
  break;
739
  case "OTP Over Email":
740
- echo '<div class="mo_wpns_setting_layout">';
741
  mo2f_test_otp_over_email($user,$selected2FAmethod);
742
  echo '</div>';
743
  break;
744
  case "OTP Over Telegram":
745
- echo '<div class="mo_wpns_setting_layout">';
746
  mo2f_configure_otp_over_Telegram($user);
747
  echo '</div>';
748
  break;
749
- case "OTP Over Whatsapp":
750
- echo '<div class="mo_wpns_setting_layout">';
751
- mo2f_configure_otp_over_Whatsapp($user);
752
- echo '</div>';
753
- break;
754
  case "DuoAuthenticator":
755
  case "Duo Authenticator":
756
- echo '<div class="mo_wpns_setting_layout">';
757
  mo2f_configure_duo_authenticator($user);
758
  echo '</div>';
759
  break;
@@ -783,9 +812,6 @@ function mo2f_show_2FA_test_screen( $user, $selected2FAmethod ) {
783
  case "OTP Over Telegram":
784
  mo2f_test_otp_over_Telegram( $user );
785
  break;
786
- case "OTP Over Whatsapp":
787
- mo2f_test_otp_over_Whatsapp( $user );
788
- break;
789
  case "Security Questions":
790
  mo2f_test_kba_security_questions( $user );
791
  break;
@@ -829,12 +855,12 @@ function mo2f_rba_description($mo2f_user_email) {?>
829
  <div id="mo2f_rba_addon">
830
  <?php if ( get_option( 'mo2f_rba_installed' ) ) { ?>
831
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_rba_addon"
832
- class="mo_wpns_button mo_wpns_button1"
833
  style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
834
  <?php } ?>
835
  <?php if ( ! get_option( 'mo2f_rba_purchased' ) ) { ?>
836
  <a onclick="mo2f_addonform('wp_2fa_addon_rba')" id="mo2f_purchase_rba_addon"
837
- class="mo_wpns_button mo_wpns_button1"
838
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a><?php } ?>
839
  <div id="mo2f_rba_addon_hide">
840
 
@@ -892,12 +918,12 @@ function mo2f_personalization_description($mo2f_user_email) {?>
892
  <div id="mo2f_custom_addon">
893
  <?php if ( get_option( 'mo2f_personalization_installed' ) ) { ?>
894
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_custom_addon"
895
- class="mo_wpns_button mo_wpns_button1"
896
  style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
897
  <?php } ?>
898
  <?php if ( ! get_option( 'mo2f_personalization_purchased' ) ) { ?> <a
899
  onclick="mo2f_addonform('wp_2fa_addon_shortcode')" id="mo2f_purchase_custom_addon"
900
- class="mo_wpns_button mo_wpns_button1"
901
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
902
  <?php } ?>
903
  <div id="mo2f_custom_addon_hide">
@@ -948,11 +974,11 @@ function mo2f_shortcode_description($mo2f_user_email) { ?>
948
  <div id="mo2f_Shortcode_addon_hide">
949
  <?php if ( get_option( 'mo2f_shortcode_installed' ) ) { ?>
950
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_shortcode_addon"
951
- class="mo_wpns_button mo_wpns_button1" style="float:right; margin-top:2%;"><?php echo __( 'Activate
952
  Plugin', 'miniorange-2-factor-authentication' ); ?></a>
953
  <?php } if ( ! get_option( 'mo2f_shortcode_purchased' ) ) { ?>
954
  <a onclick="mo2f_addonform('wp_2fa_addon_personalization')" id="mo2f_purchase_shortcode_addon"
955
- class="mo_wpns_button mo_wpns_button1"
956
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
957
  <?php } ?>
958
 
8
  include $setup_dirName.'setup_miniorange_authenticator.php';
9
  include $setup_dirName.'setup_otp_over_sms.php';
10
  include $setup_dirName.'setup_otp_over_telegram.php';
 
11
  include $setup_dirName.'setup_duo_authenticator.php';
12
  include $test_dirName.'test_twofa_email_verification.php';
13
  include $test_dirName.'test_twofa_duo_authenticator.php';
18
  include $test_dirName.'test_twofa_miniorange_soft_token.php';
19
  include $test_dirName.'test_twofa_otp_over_sms.php';
20
  include $test_dirName.'test_twofa_otp_over_Telegram.php';
21
+
 
22
  function mo2f_decode_2_factor( $selected_2_factor_method, $decode_type ) {
23
 
24
  if ( $selected_2_factor_method == 'NONE' ) {
81
 
82
  function mo2f_create_2fa_form( $user, $category, $auth_methods, $can_display_admin_features='' ) {
83
  global $Mo2fdbQueries;
84
+
85
+ $miniorange_authenticator = array(
86
+ "miniOrange QR Code Authentication",
87
+ "miniOrange Soft Token",
88
+ "miniOrange Push Notification",
89
+ );
90
  $all_two_factor_methods = array(
91
+ "miniOrange Authenticator",
 
 
92
  "Google Authenticator",
93
  "Security Questions",
94
  "OTP Over SMS",
95
  "OTP Over Email",
96
  "OTP Over Telegram",
 
97
  "Duo Authenticator",
98
  "Authy Authenticator",
99
  "Email Verification",
102
  );
103
  $two_factor_methods_descriptions = array(
104
  ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
105
+ "miniOrange Authenticator" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
106
+ "miniOrange Soft Token" => "Use One Time Password / Soft Token shown in the miniOrange Authenticator App",
107
+ "miniOrange Push Notification" => "A Push notification will be sent to the miniOrange Authenticator App for your account,
108
+ Accept it to log in",
109
+ "Google Authenticator" => "Use One Time Password shown in <b>Google/Authy/LastPass Authenticator App</b> to login",
110
+ "Security Questions" => "Configure and Answer Three Security Questions to login",
111
+ "OTP Over SMS" => "A One Time Passcode (OTP) will be sent to your Phone number",
112
+ "OTP Over Email" => "A One Time Passcode (OTP) will be sent to your Email address",
113
+ "Authy Authenticator" => "Enter Soft Token/ One Time Password from the Authy Authenticator App",
114
+ "Email Verification" => "Accept the verification link sent to your email address",
115
+ "OTP Over SMS and Email" => "A One Time Passcode (OTP) will be sent to your Phone number and Email address",
116
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token",
117
+ "OTP Over Whatsapp" => "Enter the One Time Passcode sent to your WhatsApp account. This method is supported with twillio",
118
+ "OTP Over Telegram" => "Enter the One Time Passcode sent to your Telegram account",
119
+ "Duo Authenticator" => "A Push notification will be sent to the Duo Authenticator App");
120
  $two_factor_methods_doc = array(
121
  "Security Questions" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-security-question",
122
  "Google Authenticator" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/google-authenticator",
 
123
  "Email Verification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/email_verification",
124
  "miniOrange Soft Token" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-soft-token",
125
  "miniOrange Push Notification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-push-notification",
134
  $two_factor_methods_video = array(
135
  "Security Questions" => "https://www.youtube.com/watch?v=pXPqQ047o-0",
136
  "Google Authenticator" => "https://www.youtube.com/watch?v=BS6tY-Goa1Q",
137
+ "miniOrange Authenticator" => "https://www.youtube.com/watch?v=oRaGtKxouiI",
138
  "Email Verification" => "https://www.youtube.com/watch?v=OacJWBYx_AE",
139
  "miniOrange Soft Token" => "https://www.youtube.com/watch?v=9HV8V4f80k8",
140
  "miniOrange Push Notification" => "https://www.youtube.com/watch?v=it_dAhFcxvw",
147
 
148
  );
149
 
150
+ $two_factor_methods_EC = array_slice( $all_two_factor_methods, 0, 10 );
151
+ $two_factor_methods_NC = array_slice( $all_two_factor_methods, 0, 9 );
152
  if(MO2F_IS_ONPREM or $category != 'free_plan')
153
  {
154
  $all_two_factor_methods = array(
155
  "Security Questions",
156
  "Google Authenticator",
157
  "Email Verification",
158
+ "miniOrange Authenticator",
 
 
159
  "Authy Authenticator",
160
  "OTP Over SMS",
161
  "OTP Over Email",
167
  );
168
  $two_factor_methods_descriptions = array(
169
  ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
170
+ "miniOrange QR Code Authentication" => "A QR Code will be displayed in the miniOrange Authenticator App for your account,
171
+ scan it to log in",
172
+ "miniOrange Authenticator" => 'Supports methods like soft token, QR code Authentication, Push Notification',
173
+ "miniOrange Push Notification" => "A Push notification will be sent to the miniOrange Authenticator App for your account,
174
+ Accept it to log in",
175
+ "Google Authenticator" => "Use One Time Password shown in <b>Google/Authy/LastPass Authenticator App</b> to login",
176
+ "Security Questions" => "Configure and Answer Three Security Questions to login",
177
+ "OTP Over SMS" => "A One Time Passcode (OTP) will be sent to your Phone number",
178
+ "OTP Over Email" => "A One Time Passcode (OTP) will be sent to your Email address",
179
+ "Authy Authenticator" => "Enter Soft Token/ One Time Password from the Authy Authenticator App",
180
+ "Email Verification" => "Accept the verification link sent to your email address",
181
+ "OTP Over SMS and Email" => "A One Time Passcode (OTP) will be sent to your Phone number and Email address",
182
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token",
183
+ "OTP Over Whatsapp" => "Enter the One Time Passcode sent to your WhatsApp account. This method is supported with twillio",
184
+ "OTP Over Telegram" => "Enter the One Time Passcode sent to your Telegram account",
185
+ "Duo Authenticator" => "A Push notification will be sent to the Duo Authenticator App"
186
+ );
187
  }
188
 
189
  $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
197
  <br>
198
  <table class="mo2f_auth_methods_table">';
199
 
200
+ $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
201
+ $selected_miniorange_method = false;
202
+ if(in_array($configured_auth_method, $miniorange_authenticator)){
203
+ $selected_miniorange_method = true;
204
+ }
205
  for ( $i = 0; $i < count( $auth_methods ); $i ++ ) {
206
 
207
  $form .= '<tr>';
218
  $auth_method_abr = str_replace( ' ', '', $auth_method );
219
  $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
220
  $is_auth_method_selected = ( $configured_auth_method == $auth_method ? true : false );
221
+ if($auth_method == 'miniOrange Authenticator' && $selected_miniorange_method )
222
+ $is_auth_method_selected = true;
223
  $is_auth_method_av = false;
224
  if ( ( $is_EC && in_array( $auth_method, $two_factor_methods_EC ) ) ||
225
  ( $is_NC && in_array( $auth_method, $two_factor_methods_NC ) ) ) {
229
  $thumbnail_height = $is_auth_method_av && $category == 'free_plan' ? 190 : 160;
230
  $is_image = $auth_method == "" ? 0 :1;
231
 
232
+ $form .= '<td style="width:25%;">
233
+ <div class="mo2f_thumbnail" id="'.$auth_method_abr.'_thumbnail_2_factor" style="height:' . $thumbnail_height . 'px; ';
234
  if(MO2F_IS_ONPREM)
235
  {
236
  $iscurrentMethod = 0;
238
  if($currentMethod == $auth_method)
239
  $iscurrentMethod = 1;
240
 
241
+ $form .= $iscurrentMethod ? '#413c69' : '#a7c5eb';
242
+ $form .= $iscurrentMethod ? '#413c69' : '#a7c5eb';
 
243
  $form .= ';">';
244
  }
245
  else
246
  {
247
+ $form .= $is_auth_method_selected ? '#413c69' : '#a7c5eb';
248
+ $form .= $is_auth_method_selected ? '#413c69' : '#a7c5eb';
 
249
  $form .= ';">';
250
 
251
  }
252
  $form .= '<div>
253
  <div class="mo2f_thumbnail_method" style="width:100%";>
254
+ <div style="width: 17%; float:left;padding-top:20px;padding-left:20px;">';
255
 
256
  if($is_image){
257
+ $form .= '<img src="' . plugins_url( "includes/images/authmethods/" . $auth_method_abr . ".png", dirname(dirname(__FILE__ ))) . '" style="width: 50px;height: 50px !important; " line-height: 80px;" />';
258
  }
259
 
260
  $form .= '</div>
261
+ <div class="mo2f_thumbnail_method_desc" style="width: 75%;">';
262
  switch ($auth_method) {
263
  case 'Google Authenticator':
264
  $form .=' <span style="float:right">
265
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
266
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
 
267
  </a>
 
268
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
269
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
270
  </a>
271
  </span>';
272
  break;
274
  case 'Security Questions':
275
  $form .=' <span style="float:right">
276
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
277
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
278
  </a>
279
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
280
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
281
  </a>
282
 
283
 
287
  case 'OTP Over SMS':
288
  $form .=' <span style="float:right">
289
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
290
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
291
 
292
  </a>
293
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
294
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
295
  </a>
296
 
297
  </span>';
301
  case 'miniOrange Soft Token':
302
  $form .=' <span style="float:right">
303
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
304
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
305
 
306
  </a>
307
 
308
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
309
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
310
  </a>
311
  </span>';
312
 
313
  break;
314
 
315
+ case 'miniOrange Authenticator':
316
+ $form .=' <span style="float:right">';
317
+ if(isset($two_factor_methods_doc[$auth_method])){
318
+ $form .='<a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
319
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
320
+ </a>';
321
+ }
322
+
323
+ if(isset($two_factor_methods_video[$auth_method])){
324
+ $form .='<a href='.$two_factor_methods_video[$auth_method].' target="_blank">
325
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right;margin-right: 5px;"></span>
326
+ </a>';
327
+ }
328
+
329
+ $form .='</span>';
330
+ break;
331
+
332
  case 'miniOrange QR Code Authentication':
333
  $form .=' <span style="float:right">
334
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
335
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
336
 
337
  </a>
338
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
339
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
340
  </a>
341
 
342
  </span>';
346
  case 'miniOrange Push Notification':
347
  $form .=' <span style="float:right">
348
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
349
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
350
 
351
  </a>
352
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
353
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
354
  </a>
355
 
356
  </span>';
359
  case 'Email Verification':
360
  $form .=' <span style="float:right">
361
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
362
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
363
 
364
  </a>
365
  <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
366
+ <span title="Watch Setup Video" class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
367
  </a>
368
 
369
  </span>';
370
  break;
371
+ case 'OTP Over Telegram':
 
 
 
 
 
 
 
 
372
  $form .=' <span style="float:right">
373
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
374
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
375
  </a>
376
 
377
  </span>';
379
  case 'OTP Over Email':
380
  $form .=' <span style="float:right">
381
  <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
382
+ <span title="View Setup Guide" class="dashicons dashicons-text-page" style="font-size:19px;color:#413c69;float: right;"></span>
383
  </a>
384
 
385
  </span>';
399
 
400
  if ( $is_auth_method_av && $category == 'free_plan' ) {
401
  $is_auth_method_configured = 0;
402
+ if($auth_method_abr == 'miniOrangeAuthenticator'){
403
+ $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_miniOrangeSoftToken_config_status', $user->ID );
404
+ }else{
405
+ $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_' . $auth_method_abr . '_config_status', $user->ID );
406
+ }
407
  if(($auth_method == 'OUT OF BAND EMAIL' or $auth_method == 'OTP Over Email') and !MO2F_IS_ONPREM )
408
  $is_auth_method_configured = 1;
409
  $chat_id = get_user_meta($user->ID,'mo2f_chat_id',true);
 
410
  $form .= '<div style="height:40px;width:100%;position: absolute;bottom: 0;background-color:';
411
  $iscurrentMethod = 0;
412
  if(MO2F_IS_ONPREM)
413
  {
414
  $currentMethod = $configured_auth_method;
415
+ if($currentMethod == $auth_method || ($auth_method=='miniOrange Authenticator' && $selected_miniorange_method ) )
416
  $iscurrentMethod = 1;
417
+ $form .= $iscurrentMethod ? '#413c69' : '#a7c5eb';
418
  }
419
  else
420
+ $form .= $is_auth_method_selected ? '#413c69' : '#a7c5eb';
421
  if(MO2F_IS_ONPREM)
422
  {
423
  $twofactor_transactions = new Mo2fDB;
442
 
443
 
444
 
445
+ $cloud_methods = array('miniOrange Authenticator' , 'miniOrange Soft Token','miniOrange Push Notification');
446
 
447
+ if($auth_method == 'Email Verification' || $auth_method == 'Security Questions' || $auth_method == 'Google Authenticator' || $auth_method == 'miniOrange Authenticator' || $auth_method == 'OTP Over SMS' || $auth_method == 'OTP Over Email' || $auth_method == 'OTP Over Telegram' || $auth_method == 'Duo Authenticator')
448
  {
449
  $show = 1;
450
  }
465
  <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\');"';
466
  $form .= $can_user_configure_2fa_method ? "" : " disabled ";
467
  $form .= $show==1 ? "" : " disabled ";
468
+ if($show == 1 and $is_auth_method_configured and $iscurrentMethod == 0){
469
+ $form .= '>Set as 2-factor</button>
470
+ </div>';
471
+ }else{
472
+ $form .= '
473
+ </button>
474
+ </div>';
475
+ }
476
  }
477
+
 
 
478
  }
479
  else
480
  {
507
  </div>';
508
  }
509
 
 
510
  }
511
+ if($is_auth_method_selected && $auth_method == 'miniOrange Authenticator'){
512
+ $form .='<select name="mo2fa_MO_methods" id="mo2fa_MO_methods" class="mo2f_set_2_factor mo2f_configure_switch_2_factor mo2f_kba_ques" style="color: white;font-weight: 700;background: #48b74b;background-size: 16px 16px;border: 1px solid #48b74b;padding: 0px 0px 0px 17px;min-height: 30px;max-width: 9em;max-width: 9em;" onchange="show_3_minorange_methods();">
513
+ <option value="" selected disabled hidden style="color:white!important;">Switch to >></option>
514
+ <option value="miniOrangeSoftToken">Soft Token</option>
515
+ <option value="miniOrangeQRCodeAuthentication">QR Code</option>
516
+ <option value="miniOrangePushNotification">Push Notification</option>
517
+ </select></div>
518
+ <br><br>
519
+
520
+ ';
521
+ }
522
+ $form .= '</div>';
523
  }
524
  $form .= '</div></div></td>';
525
  }
535
  <p style="font-size:16px;margin-left: 1%">In addition to these authentication methods, for other features in this plan, <a href="admin.php?page=mo_2fa_upgrade"><i>Click here.</i></a></p>
536
  </div>';
537
  }
538
+ $configured_auth_method_abr = str_replace(' ', '',$configured_auth_method);
539
  $form .= '</div> <input type="hidden" name="miniorange_save_form_auth_methods_nonce"
540
  value="'. wp_create_nonce( "miniorange-save-form-auth-methods-nonce" ) .'"/>
541
  <input type="hidden" name="option" value="mo2f_save_' . $category . '_auth_methods" />
542
  <input type="hidden" name="mo2f_configured_2FA_method_' . $category . '" id="mo2f_configured_2FA_method_' . $category . '" />
543
  <input type="hidden" name="mo2f_selected_action_' . $category . '" id="mo2f_selected_action_' . $category . '" />
544
+ </form><script>
545
+ var selected_miniorange_method = "'.$selected_miniorange_method.'";
546
+ if(selected_miniorange_method)
547
+ jQuery("<input>").attr({type: "hidden",id: "miniOrangeAuthenticator",value: "'.$configured_auth_method_abr.'"}).appendTo("form");
548
+ else
549
+ jQuery("<input>").attr({type: "hidden",id: "miniOrangeAuthenticator",value: "miniOrangeSoftToken"}).appendTo("form");
550
+ </script>';
551
 
552
  return $form;
553
  }
730
  if(!get_user_meta($user->ID, 'mo2f_google_auth', true)){
731
  Miniorange_Authentication::mo2f_get_GA_parameters($user);
732
  }
733
+ echo '<div class="mo2f_table_layout">';
734
  mo2f_configure_google_authenticator( $user );
735
  echo '</div>';
736
  }
737
  break;
738
  case "Authy Authenticator":
739
+ echo '<div class="mo2f_table_layout">';
740
  mo2f_configure_authy_authenticator( $user );
741
  echo '</div>';
742
  break;
743
  case "Security Questions":
744
+ echo '<div class="mo2f_table_layout">';
745
  mo2f_configure_for_mobile_suppport_kba( $user );
746
  echo '</div>';
747
  break;
748
  case "Email Verification":
749
+ echo '<div class="mo2f_table_layout">';
750
  mo2f_configure_for_mobile_suppport_kba( $user );
751
  echo '</div>';
752
  break;
753
  case "OTP Over SMS":
754
+ echo '<div class="mo2f_table_layout">';
755
  mo2f_configure_otp_over_sms( $user );
756
  echo '</div>';
757
  break;
758
  case "miniOrange Soft Token":
759
+ echo '<div class="mo2f_table_layout">';
760
  mo2f_configure_miniorange_authenticator( $user );
761
  echo '</div>';
762
  break;
763
  case "miniOrange QR Code Authentication":
764
+ echo '<div class="mo2f_table_layout">';
765
  mo2f_configure_miniorange_authenticator( $user );
766
  echo '</div>';
767
  break;
768
  case "miniOrange Push Notification":
769
+ echo '<div class="mo2f_table_layout">';
770
  mo2f_configure_miniorange_authenticator( $user );
771
  echo '</div>';
772
  break;
773
  case "OTP Over Email":
774
+ echo '<div class="mo2f_table_layout">';
775
  mo2f_test_otp_over_email($user,$selected2FAmethod);
776
  echo '</div>';
777
  break;
778
  case "OTP Over Telegram":
779
+ echo '<div class="mo2f_table_layout">';
780
  mo2f_configure_otp_over_Telegram($user);
781
  echo '</div>';
782
  break;
 
 
 
 
 
783
  case "DuoAuthenticator":
784
  case "Duo Authenticator":
785
+ echo '<div class="mo2f_table_layout">';
786
  mo2f_configure_duo_authenticator($user);
787
  echo '</div>';
788
  break;
812
  case "OTP Over Telegram":
813
  mo2f_test_otp_over_Telegram( $user );
814
  break;
 
 
 
815
  case "Security Questions":
816
  mo2f_test_kba_security_questions( $user );
817
  break;
855
  <div id="mo2f_rba_addon">
856
  <?php if ( get_option( 'mo2f_rba_installed' ) ) { ?>
857
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_rba_addon"
858
+ class="button button-primary button-large"
859
  style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
860
  <?php } ?>
861
  <?php if ( ! get_option( 'mo2f_rba_purchased' ) ) { ?>
862
  <a onclick="mo2f_addonform('wp_2fa_addon_rba')" id="mo2f_purchase_rba_addon"
863
+ class="button button-primary button-large"
864
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a><?php } ?>
865
  <div id="mo2f_rba_addon_hide">
866
 
918
  <div id="mo2f_custom_addon">
919
  <?php if ( get_option( 'mo2f_personalization_installed' ) ) { ?>
920
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_custom_addon"
921
+ class="button button-primary button-large"
922
  style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
923
  <?php } ?>
924
  <?php if ( ! get_option( 'mo2f_personalization_purchased' ) ) { ?> <a
925
  onclick="mo2f_addonform('wp_2fa_addon_shortcode')" id="mo2f_purchase_custom_addon"
926
+ class="button button-primary button-large"
927
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
928
  <?php } ?>
929
  <div id="mo2f_custom_addon_hide">
974
  <div id="mo2f_Shortcode_addon_hide">
975
  <?php if ( get_option( 'mo2f_shortcode_installed' ) ) { ?>
976
  <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_shortcode_addon"
977
+ class="button button-primary button-large" style="float:right; margin-top:2%;"><?php echo __( 'Activate
978
  Plugin', 'miniorange-2-factor-authentication' ); ?></a>
979
  <?php } if ( ! get_option( 'mo2f_shortcode_purchased' ) ) { ?>
980
  <a onclick="mo2f_addonform('wp_2fa_addon_personalization')" id="mo2f_purchase_shortcode_addon"
981
+ class="button button-primary button-large"
982
  style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
983
  <?php } ?>
984
 
handler/twofa/two_fa_constants.php CHANGED
@@ -273,6 +273,22 @@ class Mo2fConstants {
273
  case 'ANSWER_SECURITY_QUESTIONS':
274
  Return mo2f_lt( 'Please answer the following security questions.' );
275
  break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  case 'ERROR_FETCHING_QUESTIONS':
277
  Return mo2f_lt( 'There was an error fetching security questions. Please try again.' );
278
  break;
273
  case 'ANSWER_SECURITY_QUESTIONS':
274
  Return mo2f_lt( 'Please answer the following security questions.' );
275
  break;
276
+
277
+ case 'BACKUP_CODE_LIMIT_REACH':
278
+ Return mo2f_lt( 'You have already downloaded the backup codes for this domain.' );
279
+ break;
280
+ case 'BACKUP_CODE_DOMAIN_LIMIT_REACH':
281
+ Return mo2f_lt( 'User Limit is reached for your domain.' );
282
+ break;
283
+ case 'BACKUP_CODE_INVALID_REQUEST':
284
+ Return mo2f_lt( 'Invalid request.' );
285
+ break;
286
+ case 'USED_ALL_BACKUP_CODES':
287
+ Return mo2f_lt( 'You have used all of the backup codes' );
288
+ break;
289
+ case 'RESET_DUO_CONFIGURATON':
290
+ Return mo2f_lt( 'Your Duo configuration has been reset successfully.' );
291
+ break;
292
  case 'ERROR_FETCHING_QUESTIONS':
293
  Return mo2f_lt( 'There was an error fetching security questions. Please try again.' );
294
  break;
handler/twofa/two_fa_login.php CHANGED
@@ -173,7 +173,7 @@ class Miniorange_Mobile_Login {
173
  function mo_2_factor_hide_login() {
174
  $bootstrappath = plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', dirname(dirname(__FILE__)) );
175
  $bootstrappath = str_replace('/handler/includes/css', '/includes/css', $bootstrappath);
176
- $hidepath = plugins_url( 'includes/css/hide-login-form.css?version=5.1.21', dirname(dirname(__FILE__)) );
177
  $hidepath = str_replace('/handler/includes/css', '/includes/css', $hidepath);
178
 
179
  wp_register_style( 'hide-login', $hidepath );
@@ -270,7 +270,7 @@ class Miniorange_Mobile_Login {
270
  }
271
 
272
  function mo_2_factor_show_login_with_password_when_phonelogin_enabled() {
273
- wp_register_style( 'show-login', plugins_url( 'includes/css/show-login.css?version=5.1.21', dirname(dirname(__FILE__ ))) );
274
  wp_enqueue_style( 'show-login' );
275
  }
276
 
@@ -291,9 +291,9 @@ class Miniorange_Mobile_Login {
291
  }
292
 
293
  function mo_2_factor_show_login() {
294
- $hidepath = plugins_url( 'includes/css/hide-login-form.css?version=5.1.21', dirname(dirname(__FILE__)) );
295
 
296
- $showpath = plugins_url( 'includes/css/show-login.css?version=5.1.21', dirname(dirname(__FILE__ )));
297
 
298
  if ( get_option( 'mo2f_enable_login_with_2nd_factor' ) ) {
299
  wp_register_style( 'show-login', $hidepath );
@@ -317,20 +317,11 @@ class Miniorange_Mobile_Login {
317
  <?php } ?>
318
 
319
  <br>
320
- <div class="mo2f-button-container" id="mo2f_button_container">
321
- <input type="text" name="mo2fa_usernamekey" id="mo2fa_usernamekey" autofocus="true"
322
- placeholder="<?php echo mo2f_lt( 'Username' ); ?>"/>
323
- <p>
324
- <?php
325
- if(get_option('mo_wpns_activate_recaptcha_for_login'))
326
- {
327
-
328
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
329
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
330
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
331
- }
332
-
333
- ?>
334
  <input type="button" name="miniorange_login_submit" style="width:100% !important;"
335
  onclick="mouserloginsubmit();" id="miniorange_login_submit"
336
  class="button button-primary button-large"
@@ -347,20 +338,22 @@ class Miniorange_Mobile_Login {
347
  function mouserloginsubmit() {
348
  var username = jQuery('#mo2fa_usernamekey').val();
349
  var recap = jQuery('#g-recaptcha-response').val();
350
-
351
- document.getElementById("mo2f_show_qrcode_loginform").elements[0].value = username;
352
- document.getElementById("mo2f_show_qrcode_loginform").elements[1].value = recap;
353
 
354
- jQuery('#mo2f_show_qrcode_loginform').submit();
355
-
356
  }
357
 
358
  jQuery('#mo2fa_usernamekey').keypress(function (e) {
359
  if (e.which == 13) {//Enter key pressed
360
  e.preventDefault();
361
  var username = jQuery('#mo2fa_usernamekey').val();
362
- document.getElementById("mo2f_show_qrcode_loginform").elements[0].value = username;
363
- jQuery('#mo2f_show_qrcode_loginform').submit();
 
 
364
  }
365
 
366
  });
@@ -384,7 +377,7 @@ class Miniorange_Mobile_Login {
384
  <input type="hidden" id="sessids" name="session_id"
385
  value="<?php echo $session_id_encrypt; ?>"/>
386
  </form>
387
- <form name="f" id="mo2f_show_qrcode_loginform" method="post" action="" hidden>
388
  <input type="text" name="mo2fa_username" id="mo2fa_username" hidden/>
389
  <input type="text" name="g-recaptcha-response" id = 'g-recaptcha-response' hidden/>
390
  <input type="hidden" name="miniorange_login_nonce"
@@ -397,6 +390,7 @@ class Miniorange_Mobile_Login {
397
  var session_ids="<?php echo $session_id_encrypt; ?>";
398
  if (document.getElementById('loginform') != null) {
399
  jQuery("#user_pass").after( "<input type='hidden' id='sessid' name='session_id' value='"+session_ids+"'/>");
 
400
 
401
  }
402
  });
173
  function mo_2_factor_hide_login() {
174
  $bootstrappath = plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', dirname(dirname(__FILE__)) );
175
  $bootstrappath = str_replace('/handler/includes/css', '/includes/css', $bootstrappath);
176
+ $hidepath = plugins_url( 'includes/css/hide-login-form.css?version=5.5.1', dirname(dirname(__FILE__)) );
177
  $hidepath = str_replace('/handler/includes/css', '/includes/css', $hidepath);
178
 
179
  wp_register_style( 'hide-login', $hidepath );
270
  }
271
 
272
  function mo_2_factor_show_login_with_password_when_phonelogin_enabled() {
273
+ wp_register_style( 'show-login', plugins_url( 'includes/css/show-login.css?version=5.5.1', dirname(dirname(__FILE__ ))) );
274
  wp_enqueue_style( 'show-login' );
275
  }
276
 
291
  }
292
 
293
  function mo_2_factor_show_login() {
294
+ $hidepath = plugins_url( 'includes/css/hide-login-form.css?version=5.5.1', dirname(dirname(__FILE__)) );
295
 
296
+ $showpath = plugins_url( 'includes/css/show-login.css?version=5.5.1', dirname(dirname(__FILE__ )));
297
 
298
  if ( get_option( 'mo2f_enable_login_with_2nd_factor' ) ) {
299
  wp_register_style( 'show-login', $hidepath );
317
  <?php } ?>
318
 
319
  <br>
320
+ <div class="mo2f-button-container" id="mo2f_button_container">
321
+ <input type="text" name="mo2fa_usernamekey" id="mo2fa_usernamekey" autofocus="true"
322
+ placeholder="<?php echo mo2f_lt( 'Username' ); ?>"/>
323
+ <p>
324
+
 
 
 
 
 
 
 
 
 
325
  <input type="button" name="miniorange_login_submit" style="width:100% !important;"
326
  onclick="mouserloginsubmit();" id="miniorange_login_submit"
327
  class="button button-primary button-large"
338
  function mouserloginsubmit() {
339
  var username = jQuery('#mo2fa_usernamekey').val();
340
  var recap = jQuery('#g-recaptcha-response').val();
341
+ if(document.getElementById("mo2fa-g-recaptcha-response-form") !== null){
342
+ document.getElementById("mo2fa-g-recaptcha-response-form").elements[0].value = username;
343
+ document.getElementById("mo2fa-g-recaptcha-response-form").elements[1].value = recap;
344
 
345
+ jQuery('#mo2fa-g-recaptcha-response-form').submit();
346
+ }
347
  }
348
 
349
  jQuery('#mo2fa_usernamekey').keypress(function (e) {
350
  if (e.which == 13) {//Enter key pressed
351
  e.preventDefault();
352
  var username = jQuery('#mo2fa_usernamekey').val();
353
+ if(document.getElementById("mo2fa-g-recaptcha-response-form") !== null){
354
+ document.getElementById("mo2fa-g-recaptcha-response-form").elements[0].value = username;
355
+ jQuery('#mo2fa-g-recaptcha-response-form').submit();
356
+ }
357
  }
358
 
359
  });
377
  <input type="hidden" id="sessids" name="session_id"
378
  value="<?php echo $session_id_encrypt; ?>"/>
379
  </form>
380
+ <form name="f" id="mo2fa-g-recaptcha-response-form" method="post" action="" hidden>
381
  <input type="text" name="mo2fa_username" id="mo2fa_username" hidden/>
382
  <input type="text" name="g-recaptcha-response" id = 'g-recaptcha-response' hidden/>
383
  <input type="hidden" name="miniorange_login_nonce"
390
  var session_ids="<?php echo $session_id_encrypt; ?>";
391
  if (document.getElementById('loginform') != null) {
392
  jQuery("#user_pass").after( "<input type='hidden' id='sessid' name='session_id' value='"+session_ids+"'/>");
393
+ jQuery(".wp-hide-pw").addClass('mo2fa_visible');
394
 
395
  }
396
  });
handler/twofa/two_fa_pass2login.php CHANGED
@@ -174,40 +174,67 @@ class Miniorange_Password_2Factor_Login {
174
  }
175
  $backup_codes=get_user_meta($currentuser_id,'mo2f_backup_codes',true);
176
  $mo2f_backup_code= sanitize_text_field($POSTED[ 'mo2f_backup_code' ]);
177
- $mo2f_backup_code=md5($mo2f_backup_code);
178
- if(!empty($backup_codes)){
 
 
179
  if(in_array($mo2f_backup_code,$backup_codes)){
180
  foreach ($backup_codes as $key => $value) {
181
  if($value==$mo2f_backup_code){
182
  unset($backup_codes[$key]);
183
  update_user_meta($currentuser_id,'mo2f_backup_codes', $backup_codes);
 
184
  }
185
  }
186
-
187
- if(sizeof($backup_codes) <= 2){
188
- $codes_remaining = sizeof($backup_codes);
189
- $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser_id );
190
- if(empty($mo2f_user_email)){
191
- $currentuser = get_user_by( 'id', $currentuser_id );
192
- $mo2f_user_email = $currentuser->user_email;
193
- }
194
- $subject = '2-Factor Authentication(Backup Codes)';
195
- $headers = array('Content-Type: text/html; charset=UTF-8');
196
- $message = MO2f_Utility::get_codes_warning_email_content($codes_remaining);
197
- $result = wp_mail($mo2f_user_email,$subject,$message,$headers);
198
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
 
200
- $this->mo2fa_pass2login($redirect_to, $session_id_encrypt);
201
- }else{
202
- $mo2fa_login_message = __('The codes you have provided are either expired or incorrect.','miniorange-2-factor-authentication');
203
- $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
204
- $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
205
- }
206
- }else{
207
- $mo2fa_login_message = __('There are no codes left.','miniorange-2-factor-authentication');
208
- $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
209
- $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
210
- }
211
  }else{
212
  $this->remove_current_activity($session_id_encrypt);
213
  return new WP_Error('invalid_username', '<strong>'. __('ERROR','miniorange-2-factor-authentication') . '</strong>: ' . __('Please try again..', 'miniorange-2-factor-authentication'));
@@ -227,18 +254,41 @@ class Miniorange_Password_2Factor_Login {
227
  $redirect_to = esc_url_raw($_POST['redirect_to']);
228
  $session_id = sanitize_text_field($_POST['session_id']);
229
  $id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id, 'mo2f_current_user_id');
230
-
231
- $codes=MO2f_Utility::mo_2f_generate_backup_codes();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
  $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
233
  $str1="";
234
- for ($x = 0; $x < 5; $x++) {
235
  $str = $codes[$x];
236
  $str1.=$str;
237
  if($x != 4){
238
  $str1.=',';
239
  }
240
  }
241
- update_user_meta($id,'mo2f_backup_codes', $codes_hash);
242
  $key = get_option( 'mo2f_encryption_key' );
243
  $codes_encrypt = MO2f_Utility::encrypt_data($str1, $key);
244
  update_user_meta($id,'chqwetcsdvnvd', $codes_encrypt);
@@ -326,47 +376,7 @@ class Miniorange_Password_2Factor_Login {
326
 
327
 
328
  $selected_2factor_method = $Mo2fdbQueries->get_user_detail('mo2f_configured_2FA_method',$current_user);
329
- if($selected_2factor_method == 'OTP Over Whatsapp')
330
- {
331
-
332
- $userID = $current_user;
333
- $otp = $otp_token;
334
- $otpToken = get_user_meta($userID,'mo2f_otp_token_wa',true);
335
- $time = get_user_meta($userID,'mo2f_whatsapp_time',true);
336
- $accepted_time = time()-600;
337
- $time = (int)$time;
338
-
339
-
340
- if($otp == $otpToken)
341
- {
342
- if($accepted_time<$time){
343
- update_user_meta( $userID, 'mo2f_whatsapp_id',get_user_meta($userID,'mo2f_temp_whatsappID',true));
344
- update_user_meta( $userID, 'mo2f_whatsapp_num',get_user_meta($userID,'mo2f_temp_whatsapp_num',true));
345
- delete_user_meta( $userID, 'mo2f_temp_whatsappID' );
346
- delete_user_meta( $userID, 'mo2f_temp_whatsapp_num' );
347
- delete_user_meta( $userID, 'mo2f_otp_token_wa');
348
- delete_user_meta( $userID, 'mo2f_whatsapp_time');
349
-
350
- $Mo2fdbQueries->update_user_details($userID, array(
351
- "mo2f_configured_2FA_method" => 'OTP Over Whatsapp',
352
- 'mo2f_OTPOverWhatsapp_config_status' => true,
353
- 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
354
- ) );
355
- $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
356
- }
357
- else
358
- {
359
- delete_user_meta($userID,'mo2f_otp_token_wa');
360
- delete_user_meta($userID,'mo2f_whatsapp_time');
361
- $mo2fa_login_message = __('OTP has been expired please initiate a new transaction by clicking on Send OTP Button.','miniorange-2-factor-authentication');
362
- }
363
- }
364
- else
365
- {
366
- $mo2fa_login_message = __('Invalid OTP. Please try again.','miniorange-2-factor-authentication');
367
- }
368
- $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message,$redirect_to,null,$session_id_encrypt);
369
- }
370
  if($selected_2factor_method == 'OTP Over Telegram')
371
  {
372
 
@@ -492,53 +502,6 @@ class Miniorange_Password_2Factor_Login {
492
  }else if($selected_2factor_method == 'OTP OVER EMAIL'){
493
  $currentMethod = "OTP_OVER_EMAIL";
494
  $parameters = $email;
495
- }else if($selected_2factor_method == 'OTP Over Whatsapp')
496
- {
497
- $currentMethod = "OTP Over Whatsapp";
498
- $user_id = $current_user;
499
- $whatsapp_number = sanitize_text_field($_POST['whatsapp_number']);
500
- $whatsapp_id = sanitize_text_field($_POST['whatsapp_id']);
501
-
502
- $otpToken = '';
503
- $dnvjn = get_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=');
504
- $dnvjn = (int)$dnvjn;
505
-
506
- if($dnvjn<=0)
507
- {
508
- $mo2fa_login_message = 'Your Free transactions limit has been exceeded. Please contact miniOrange for more transactions.';
509
- $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message,$redirect_to,null,$session_id_encrypt);
510
- }
511
-
512
- for($i=1;$i<7;$i++)
513
- {
514
- $otpToken .= rand(0,9);
515
- }
516
-
517
- update_user_meta($user_id,'mo2f_otp_token_wa',$otpToken);
518
- update_user_meta($user_id,'mo2f_whatsapp_time',time());
519
-
520
- $whatsapp_id = str_replace( ' ', '', $whatsapp_id );
521
- $whatsapp_number = str_replace( ' ', '', $whatsapp_number );
522
-
523
-
524
- update_user_meta($user_id,'mo2f_temp_whatsappID',$whatsapp_id);
525
- update_user_meta($user_id,'mo2f_temp_whatsapp_num',$whatsapp_number);
526
-
527
- $url = 'https://api.callmebot.com/whatsapp.php?phone='.$whatsapp_number.'&text=Please+find+your+one+time+passcode:+'.$otpToken.'&apikey='.$whatsapp_id;
528
-
529
- $data = file_get_contents($url);
530
- if(strpos($data, 'Message queued') !== false)
531
- {
532
- update_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=',$dnvjn-1);
533
- $mo2fa_login_message = 'An OTP has been sent to your given Whatsapp Number. It can take a couple of minutes to arrive.';
534
-
535
- }
536
-
537
- else
538
- $mo2fa_login_message = 'There were an error while sending the OTP. Please confirm your API Key and phone number and try again. Make sure to add country code in phone number';
539
-
540
- $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message,$redirect_to,null,$session_id_encrypt);
541
-
542
  }
543
 
544
  else if($selected_2factor_method == 'OTP Over Telegram')
@@ -993,8 +956,21 @@ class Miniorange_Password_2Factor_Login {
993
  }
994
  update_user_meta($current_user->ID,'mo2f_external_app_type','GOOGLE AUTHENTICATOR');
995
  $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
 
 
 
 
 
 
 
 
 
 
 
 
 
996
  }else{
997
- $mo2fa_login_message = __('An error occured while processing your request. Please Try again.','miniorange-2-factor-authentication');
998
  }
999
  }else{
1000
  $mo2fa_login_message = __('An error occured while processing your request. Please Try again.','miniorange-2-factor-authentication');
@@ -1312,21 +1288,13 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1312
  {
1313
  $selected_method = 'OTP Over Telegram';
1314
  }
1315
- if($selected_method == 'OTP OVER WHATSAPP')
1316
- {
1317
- $selected_method = 'OTP Over Whatsapp';
1318
- }
1319
- $Mo2fdbQueries->update_user_details( $current_user->ID, array('mo2f_configured_2FA_method' =>$selected_method) );
1320
  }
1321
  }else{
1322
  if($selected_method == 'OTP OVER TELEGRAM')
1323
  {
1324
  $selected_method = 'OTP Over Telegram';
1325
  }
1326
- if($selected_method == 'OTP OVER WHATSAPP')
1327
- {
1328
- $selected_method = 'OTP Over Whatsapp';
1329
- }
1330
  $Mo2fdbQueries->update_user_details( $current_user->ID, array(
1331
  'mo2f_configured_2FA_method' =>$selected_method,
1332
  ) );
@@ -1341,6 +1309,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1341
  }
1342
 
1343
  function check_kba_validation($POSTED){
 
1344
  if ( isset( $POSTED['miniorange_kba_nonce'] ) ) { /*check kba validation*/
1345
  $nonce = $POSTED['miniorange_kba_nonce'];
1346
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-kba-nonce' ) ) {
@@ -1354,6 +1323,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1354
  $redirect_to = isset( $_POST['redirect_to'] ) ? esc_url_raw($_POST['redirect_to']) : null;
1355
  if ( isset( $user_id ) ) {
1356
  if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_1'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_2'] ) ) {
 
1357
  $mo2fa_login_message = 'Please provide both the answers.';
1358
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_KBA_AUTHENTICATION';
1359
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
@@ -1367,6 +1337,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1367
  $check_trust_device = isset( $_POST['mo2f_trust_device'] ) ? sanitize_text_field($_POST['mo2f_trust_device']) : 'false';
1368
  //if the php session folder has insufficient permissions, cookies to be used
1369
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId', $session_id_encrypt );
 
1370
  $mo2f_rba_status = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_rba_status',$session_id_encrypt );
1371
  $kba_validate = new Customer_Setup();
1372
  $kba_validate_response = json_decode( $kba_validate->validate_otp_token( 'KBA', null, $mo2f_login_transaction_id, $otpToken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
@@ -1379,16 +1350,20 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1379
  } catch ( Exception $e ) {
1380
  echo $e->getMessage();
1381
  }
 
1382
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1383
  } else {
 
1384
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1385
  }
1386
  } else {
 
1387
  $mo2fa_login_message = 'The answers you have provided are incorrect.';
1388
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_KBA_AUTHENTICATION';
1389
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt);
1390
  }
1391
  } else {
 
1392
  $this->remove_current_activity($session_id_encrypt);
1393
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
1394
  }
@@ -1511,6 +1486,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1511
  }
1512
 
1513
  function check_miniorange_duo_push_validation($POSTED){
 
1514
  $nonce = $POSTED['miniorange_duo_push_validation_nonce'];
1515
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-duo-validation-nonce' ) ) {
1516
  $error = new WP_Error();
@@ -1519,13 +1495,16 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1519
  } else {
1520
  $this->miniorange_pass2login_start_session();
1521
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1522
- //if the php session folder has insufficient permissions, cookies to be used
1523
- // $mo2f_login_transaction_id = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId',$session_id_encrypt );
1524
  $redirect_to = isset( $POSTED['redirect_to'] ) ? esc_url_raw($POSTED['redirect_to']) : null;
1525
  if ( get_option( 'mo2f_remember_device' ) ) {
 
 
1526
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1527
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to, null,$session_id_encrypt );
1528
  } else {
 
1529
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1530
  }
1531
 
@@ -1533,13 +1512,14 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1533
  }
1534
 
1535
  function check_miniorange_duo_push_validation_failed($POSTED){
1536
-
1537
  $nonce = $POSTED['miniorange_duo_push_validation_failed_nonce'];
1538
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-duo-push-validation-failed-nonce' ) ) {
1539
  $error = new WP_Error();
1540
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1541
  return $error;
1542
  } else {
 
1543
  $this->miniorange_pass2login_start_session();
1544
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1545
  $this->remove_current_activity($session_id_encrypt);
@@ -1550,7 +1530,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1550
 
1551
  function check_miniorange_mobile_validation($POSTED){
1552
  /*check mobile validation */
1553
-
1554
  $nonce = $POSTED['miniorange_mobile_validation_nonce'];
1555
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
1556
  $error = new WP_Error();
@@ -1573,27 +1553,33 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1573
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1574
  //if the php session folder has insufficient permissions, cookies to be used
1575
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_transactionId');
 
1576
  $redirect_to = isset( $POSTED['redirect_to'] ) ? esc_url_raw($POSTED['redirect_to']) : null;
1577
  $checkMobileStatus = new Two_Factor_Setup();
1578
  $content = $checkMobileStatus->check_mobile_status( $mo2f_login_transaction_id );
1579
  $response = json_decode( $content, true );
1580
  if(MO2F_IS_ONPREM)
1581
  {
 
1582
  $this->mo2fa_pass2login($redirect_to,$session_id_encrypt);
1583
  }
1584
  if ( json_last_error() == JSON_ERROR_NONE ) {
1585
  if ( $response['status'] == 'SUCCESS' ) {
1586
  if ( get_option( 'mo2f_remember_device' ) ) {
1587
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
 
1588
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to, null,$session_id_encrypt );
1589
  } else {
 
1590
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1591
  }
1592
  } else {
 
1593
  $this->remove_current_activity($session_id_encrypt);
1594
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again.' ) );
1595
  }
1596
  } else {
 
1597
  $this->remove_current_activity($session_id_encrypt);
1598
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again.' ) );
1599
  }
@@ -1607,6 +1593,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1607
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1608
  return $error;
1609
  } else {
 
1610
  $this->miniorange_pass2login_start_session();
1611
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? $POSTED['session_id'] : null;
1612
  $this->remove_current_activity($session_id_encrypt);
@@ -1739,6 +1726,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1739
  }
1740
  function check_miniorange_soft_token($POSTED){
1741
  /*Validate Soft Token,OTP over SMS,OTP over EMAIL,Phone verification */
 
1742
  $nonce = sanitize_text_field($_POST['miniorange_soft_token_nonce']);
1743
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-soft-token-nonce' ) ) {
1744
  $error = new WP_Error();
@@ -1757,10 +1745,12 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1757
  {
1758
  update_option('mo2f_attempts_before_redirect', $attempts-1 );
1759
  $mo2fa_login_message = 'Please enter OTP to proceed.';
 
1760
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
1761
  }else{
1762
  $session_id_encrypt = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
1763
  $this->remove_current_activity($session_id_encrypt);
 
1764
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1765
  }
1766
  } else {
@@ -1770,6 +1760,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1770
  {
1771
  update_option('mo2f_attempts_before_redirect', $attempts-1 );
1772
  $mo2fa_login_message = 'Invalid OTP. Only digits within range 4-8 are allowed. Please try again.';
 
1773
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
1774
  }else{
1775
  $session_id_encrypt = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
@@ -1779,8 +1770,10 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1779
  $data = array('reload' => "reload", );
1780
  wp_send_json_success($data);
1781
  }
1782
- else
 
1783
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
 
1784
  }
1785
  }
1786
  }
@@ -1793,7 +1786,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1793
  $current_user = get_userdata($user_id);
1794
  //if the php session folder has insufficient permissions, cookies to be used
1795
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_transactionId');
1796
-
 
1797
  if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) {
1798
  $content = json_decode( $customer->validate_otp_token( 'EMAIL', null, $mo2f_login_transaction_id, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),$current_user ), true );
1799
  }elseif (isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_WHATSAPP' ) {
@@ -1810,20 +1804,25 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1810
  update_option('mo2f_attempts_before_redirect', 3);
1811
  if ( get_option( 'mo2f_remember_device' ) ) {
1812
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
 
1813
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1814
  }
1815
- else
 
1816
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
 
1817
  }
1818
  else
1819
  {
1820
  $this->remove_current_activity($session_id_encrypt);
 
1821
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: OTP has been Expired please reinitiate another transaction.' ) );
1822
 
1823
  }
1824
  }
1825
  else
1826
- {
 
1827
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1828
  $message = 'Invalid OTP please enter again.';
1829
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
@@ -1844,20 +1843,25 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1844
  update_option('mo2f_attempts_before_redirect', 3);
1845
  if ( get_option( 'mo2f_remember_device' ) ) {
1846
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
 
1847
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1848
  }
1849
- else
 
1850
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
 
1851
  }
1852
  else
1853
  {
1854
  $this->remove_current_activity($session_id_encrypt);
 
1855
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: OTP has been Expired please reinitiate another transaction.' ) );
1856
 
1857
  }
1858
  }
1859
  else
1860
  {
 
1861
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1862
  $message = 'Invalid OTP please enter again.';
1863
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
@@ -1876,11 +1880,11 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1876
  $this->remove_current_activity($session_id_encrypt);
1877
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
1878
  }
1879
-
1880
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1881
  update_option('mo2f_attempts_before_redirect', 3);
1882
  if ( get_option( 'mo2f_remember_device' ) ) {
1883
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
 
1884
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1885
  } else {
1886
  if($mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL')
@@ -1891,11 +1895,13 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1891
  $enduser->mo2f_update_userinfo( $user_email, 'OTP Over Email', null, null, null );
1892
 
1893
  }
 
1894
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1895
  }
1896
  } else {
1897
  if($attempts>1 || $attempts=='disabled')
1898
  {
 
1899
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1900
  $message = $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN' ? 'You have entered an invalid OTP.<br>Please click on <b>Sync Time</b> in the miniOrange Authenticator app to sync your phone time with the miniOrange servers and try again.' : 'Invalid OTP. Please try again.';
1901
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
@@ -1907,12 +1913,16 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1907
  $data = array('reload' => "reload", );
1908
  wp_send_json_success($data);
1909
  }
1910
- else
1911
- return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
 
 
 
1912
  }
1913
  }
1914
  } else {
1915
  $this->remove_current_activity($session_id_encrypt);
 
1916
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
1917
  }
1918
  }
@@ -1960,8 +1970,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
1960
  $this->miniorange_pass2login_start_session();
1961
  $mobile_login = new Miniorange_Mobile_Login();
1962
  //validation and sanitization
1963
- $username = '';
1964
- if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2fa_username'] ) ) {
1965
  MO2f_Utility::set_user_values($session_id, 'mo2f_login_message', 'Please enter username to proceed' );
1966
  $mobile_login->mo_auth_show_error_message();
1967
  return;
@@ -2037,7 +2047,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2037
  else if($mo2f_second_factor == 'Email Verification'){
2038
  $this->mo2f_pass2login_push_oobemail_verification( $user, $mo2f_second_factor, $redirect_to, $session_id );
2039
  }
2040
- else if ( $mo2f_second_factor == 'SOFT TOKEN' || $mo2f_second_factor == 'SMS' || $mo2f_second_factor == 'PHONE VERIFICATION' || $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' || $mo2f_second_factor == 'OTP Over Telegram'|| $mo2f_second_factor == 'OTP Over Whatsapp' || $mo2f_second_factor == 'EMAIL' || $mo2f_second_factor == "OTP Over Email") {
2041
  $this->mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to, $session_id );
2042
  } else if ( $mo2f_second_factor == 'KBA' ) {
2043
  $this->mo2f_pass2login_kba_verification( $user->ID, $redirect_to, $session_id );
@@ -2068,6 +2078,28 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2068
  }
2069
 
2070
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2071
  if(isset($_GET['Txid'])&&isset($_GET['accessToken']))
2072
  {
2073
  $userIDGet = sanitize_text_field($_GET['userID']);
@@ -2155,6 +2187,11 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2155
  case 'miniorange_rba_validate':
2156
  $this->check_rba_validation($_POST);
2157
  break;
 
 
 
 
 
2158
 
2159
  case 'miniorange_rba_cancle':
2160
 
@@ -2376,7 +2413,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2376
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
2377
  $session_path = ini_get('session.save_path');
2378
  if( is_writable($session_path) && is_readable($session_path) ) {
2379
- session_start();
 
2380
  }
2381
  }
2382
  }
@@ -2437,7 +2475,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2437
  }
2438
  }
2439
 
2440
- function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt=null,$show_back_button =null ) {
2441
 
2442
  $login_status = $mo2fa_login_status;
2443
  $login_message = $mo2fa_login_message;
@@ -2457,7 +2495,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2457
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL':
2458
  $user_id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
2459
 
2460
- mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id,$show_back_button );
2461
  exit;
2462
  break;
2463
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_TELEGRAM':
@@ -2671,6 +2709,11 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2671
  wp_localize_script( 'tmlajax_script', 'my_ajax_object',
2672
  array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
2673
  }
 
 
 
 
 
2674
  ?>
2675
  <p><input type="hidden" name="miniorange_login_nonce"
2676
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-login-nonce' ); ?>"/>
@@ -2713,12 +2756,13 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2713
  }
2714
 
2715
  function mo2f_pass2login_mobile_verification( $user, $redirect_to, $session_id_encrypt=null ) {
2716
- global $Mo2fdbQueries;
2717
  if (is_null($session_id_encrypt)){
2718
  $session_id_encrypt=$this->create_session();
2719
  }
2720
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2721
  $useragent = $_SERVER['HTTP_USER_AGENT'];
 
2722
  if ( MO2f_Utility::check_if_request_is_from_mobile_device( $useragent ) ) {
2723
  $session_cookie_variables = array( 'mo2f-login-qrCode', 'mo2f_transactionId' );
2724
 
@@ -2728,6 +2772,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2728
 
2729
  $mo2fa_login_message = 'Please enter the one time passcode shown in the miniOrange<b> Authenticator</b> app.';
2730
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN';
 
2731
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
2732
  } else {
2733
  $challengeMobile = new Customer_Setup();
@@ -2742,15 +2787,18 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2742
  $this->mo2f_transactionid=$response['txId'];
2743
  $mo2fa_login_message = '';
2744
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_MOBILE_AUTHENTICATION';
 
2745
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, $qrCode,$session_id_encrypt );
2746
  } else if ( $response['status'] == 'ERROR' ) {
2747
  $this->remove_current_activity($session_id_encrypt);
 
2748
  $error = new WP_Error();
2749
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
2750
 
2751
  return $error;
2752
  }
2753
  } else {
 
2754
  $this->remove_current_activity($session_id_encrypt);
2755
  $error = new WP_Error();
2756
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
@@ -2776,13 +2824,14 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2776
 
2777
  function mo2f_pass2login_push_oobemail_verification( $current_user, $mo2f_second_factor, $redirect_to, $session_id=null ) {
2778
 
2779
- global $Mo2fdbQueries;
2780
  if(is_null($session_id)){
2781
  $session_id=$this->create_session();
2782
  }
2783
  $challengeMobile = new Customer_Setup();
2784
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
2785
  if(MO2F_IS_ONPREM && $mo2f_second_factor != "PUSH NOTIFICATIONS"){
 
2786
  include_once dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'api'.DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
2787
  $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
2788
  $content = $mo2fOnPremRedirect->mo2f_pass2login_push_email_onpremise($current_user, $redirect_to, $session_id );
@@ -2796,7 +2845,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2796
  MO2f_Utility::mo2f_set_transient($session_id, 'mo2f_transactionId', $response['txId']);
2797
  update_user_meta($current_user->ID,'mo2f_EV_txid',$response['txId']);
2798
 
2799
-
2800
  $this->mo2f_transactionid=$response['txId'];
2801
 
2802
  $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'A Push Notification has been sent to your phone. We are waiting for your approval.' : 'An email has been sent to ' . MO2f_Utility::mo2f_get_hidden_email( $user_email ) . '. We are waiting for your approval.';
@@ -2806,13 +2855,14 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2806
  MO2f_Utility::mo2f_set_transient($session_id, 'mo2f_transactionId', $response['txId']);
2807
  update_user_meta($current_user->ID,'mo2f_EV_txid',$response['txId']);
2808
 
2809
-
2810
  $this->mo2f_transactionid=$response['txId'];
2811
  $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'An error occured while sending push notification to your app. You can click on <b>Phone is Offline</b> button to enter soft token from app or <b>Forgot your phone</b> button to receive OTP to your registered email.' : 'An error occured while sending email. Please try again.';
2812
  $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
2813
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2814
  }
2815
  } else {
 
2816
  $this->remove_current_activity($session_id);
2817
  $error = new WP_Error();
2818
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
@@ -2822,7 +2872,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2822
  }
2823
 
2824
  function mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to,$session_id=null ) {
2825
- global $Mo2fdbQueries;
 
2826
  if(is_null($session_id)){
2827
  $session_id=$this->create_session();
2828
  }
@@ -2841,52 +2892,14 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2841
  if ( $mo2f_second_factor == 'SOFT TOKEN' ) {
2842
  $mo2fa_login_message = 'Please enter the one time passcode shown in the miniOrange<b> Authenticator</b> app.';
2843
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN';
 
2844
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2845
  } else if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
2846
  $mo2fa_login_message ='Please enter the one time passcode shown in the <b> Authenticator</b> app.';
2847
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_GOOGLE_AUTHENTICATION';
 
2848
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2849
- }elseif ($mo2f_second_factor == 'OTP Over Whatsapp') {
2850
- $whatsappID = get_user_meta($user->ID,'mo2f_whatsapp_id',true);
2851
- $whatsappNum = get_user_meta($user->ID,'mo2f_whatsapp_num',true);
2852
- $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_WHATSAPP';
2853
-
2854
- $dnvjn = get_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=');
2855
- $dnvjn = (int)$dnvjn;
2856
-
2857
- if($dnvjn<=0)
2858
- {
2859
- $mo2fa_login_message ='Your Free transacions limit has been exceeded. Please contact miniOrange for more transacions.';
2860
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id );
2861
- }
2862
-
2863
- $otpToken = '';
2864
- for($i=1;$i<7;$i++)
2865
- {
2866
- $otpToken .= rand(0,9);
2867
- }
2868
-
2869
- update_user_meta($user->ID,'mo2f_otp_token_wa',$otpToken);
2870
- update_user_meta($user->ID,'mo2f_whatsapp_time',time());
2871
-
2872
- $url = 'https://api.callmebot.com/whatsapp.php?phone='.$whatsappNum.'&text=Please+find+your+one+time+passcode:+'.$otpToken.'&apikey='.$whatsappID;
2873
-
2874
- $data = file_get_contents($url);
2875
- if(strpos($data, 'Message queued') !== false)
2876
- {
2877
- update_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=',$dnvjn-1);
2878
- $mo2fa_login_message ='Please enter the one time passcode sent on your<b> Whatsapp</b> app.';
2879
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id );
2880
- }
2881
- else
2882
- {
2883
- $mo2fa_login_message ='There was an error occured while sending OTP on your<b> Whatsapp</b> app.';
2884
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id );
2885
-
2886
- }
2887
-
2888
- }
2889
- elseif ($mo2f_second_factor == 'OTP Over Telegram') {
2890
  $chatID = get_user_meta($user->ID,'mo2f_chat_id',true);
2891
  $otpToken = '';
2892
  for($i=1;$i<7;$i++)
@@ -2922,6 +2935,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2922
  {
2923
  $mo2fa_login_message ='Please enter the one time passcode sent on your<b> Telegram</b> app.';
2924
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_TELEGRAM';
 
2925
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id );
2926
  }
2927
 
@@ -2941,6 +2955,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2941
  }
2942
  else
2943
  {
 
2944
  $response['status'] = 'FAILED';
2945
  $response['message'] = '<p style = "color:red;">OTP limit has been exceeded</p>';
2946
  $otpLIMiTE = 1;
@@ -2949,12 +2964,14 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2949
  if ( $response['status'] == 'SUCCESS' ) {
2950
  if($mo2f_second_factor == 'EMAIL')
2951
  {
 
2952
  $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
2953
  if($cmVtYWluaW5nT1RQ>0)
2954
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2955
  }
2956
  elseif($mo2f_second_factor == 'SMS')
2957
  {
 
2958
  $mo2f_sms = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z');
2959
  if($mo2f_sms>0)
2960
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',$mo2f_sms-1);
@@ -2969,8 +2986,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2969
  $this->mo2f_transactionid=$response['txId'];
2970
  $mo2fa_login_message = $message;
2971
  $currentMethod = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
2972
-
2973
- if($currentMethod == 'OTP Over Email')
2974
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL';
2975
  else
2976
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS';
@@ -3030,6 +3046,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3030
  $mobile_login->remove_current_activity($session_id_encrypted);
3031
 
3032
  delete_expired_transients( true );
 
3033
 
3034
  wp_set_auth_cookie( $user_id, true );
3035
  do_action( 'wp_login', $currentuser->user_login, $currentuser );
@@ -3050,8 +3067,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3050
  }
3051
 
3052
  function miniorange_initiate_2nd_factor( $currentuser, $attributes = null, $redirect_to = null, $otp_token = "",$session_id_encrypt=null ) {
3053
-
3054
- global $Mo2fdbQueries;
3055
  $this->miniorange_pass2login_start_session();
3056
  if(is_null($session_id_encrypt)) {
3057
  $session_id_encrypt=$this->create_session();
@@ -3059,6 +3076,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3059
 
3060
  if(class_exists('UM_Functions'))
3061
  {
 
3062
  if(!isset($_POST['wp-submit']) and isset($_POST['um_request']))
3063
  {
3064
  $meta = get_option('um_role_'.$currentuser->roles[0].'_meta');
@@ -3150,80 +3168,20 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3150
 
3151
  $mo2f_second_factor = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $currentuser->ID );
3152
 
3153
- if(!MO2F_IS_ONPREM and $mo2f_second_factor!= 'OTP Over Telegram' and $mo2f_second_factor!= 'OTP Over Whatsapp' )
3154
  $mo2f_second_factor = mo2f_get_user_2ndfactor( $currentuser );
3155
 
3156
- if($mo2f_second_factor == 'miniOrange Soft Token')
3157
- $mo2f_second_factor = "SOFT TOKEN";
3158
- else if($mo2f_second_factor == "miniOrange Push Notification")
3159
- $mo2f_second_factor = "PUSH NOTIFICATIONS";
3160
- else if($mo2f_second_factor == "miniOrange QR Code Authentication")
3161
- $mo2f_second_factor = "MOBILE AUTHENTICATION";
3162
- else if($mo2f_second_factor == 'Security Questions')
3163
- $mo2f_second_factor = 'KBA';
3164
- else if($mo2f_second_factor == 'Google Authenticator')
3165
- $mo2f_second_factor = 'GOOGLE AUTHENTICATOR';
3166
- else if($mo2f_second_factor == 'OTP Over SMS')
3167
- $mo2f_second_factor = 'SMS';
3168
- else if($mo2f_second_factor == 'Duo Authenticator' || $mo2f_second_factor == 'DUO AUTHENTICATOR')
3169
- $mo2f_second_factor = 'Duo Authenticator';
3170
- else if($mo2f_second_factor == 'OTP Over Email' || $mo2f_second_factor == 'OTP OVER EMAIL' || $mo2f_second_factor == "EMAIL") {
3171
- $mo2f_second_factor = "EMAIL";
3172
-
3173
- if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')<=0)
3174
- {
3175
- update_site_option("bGltaXRSZWFjaGVk",1);
3176
-
3177
- }
3178
- }
3179
-
3180
-
3181
- if((($mo2f_second_factor == 'GOOGLE AUTHENTICATOR') || ($mo2f_second_factor =='SOFT TOKEN') || ($mo2f_second_factor =='AUTHY AUTHENTICATOR')) && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'site_option')&& !get_option('mo2f_remember_device') && !isset($_POST['mo_woocommerce_login_prompt']) )
3182
- {
3183
- $error=$this->mo2f_validate_soft_token($currentuser, $redirect_to, $mo2f_second_factor, $otp_token,$session_id_encrypt);
3184
- if(is_wp_error( $error))
3185
- {
3186
- return $error;
3187
- }
3188
- }
3189
- else{
3190
-
3191
- if ( MO2f_Utility::check_if_request_is_from_mobile_device( $_SERVER['HTTP_USER_AGENT'] ) && $kba_configuration_status ) {
3192
- $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to, $session_id_encrypt );
3193
- } else {
3194
-
3195
- if ( $mo2f_second_factor == 'MOBILE AUTHENTICATION' ) {
3196
- $this->mo2f_pass2login_mobile_verification( $currentuser, $redirect_to, $session_id_encrypt );
3197
- } else if ( $mo2f_second_factor == 'PUSH NOTIFICATIONS' || $mo2f_second_factor == 'OUT OF BAND EMAIL' || $mo2f_second_factor == 'Email Verification') {
3198
- $this->mo2f_pass2login_push_oobemail_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3199
- } else if ( $mo2f_second_factor == 'SOFT TOKEN' || $mo2f_second_factor == 'SMS' || $mo2f_second_factor == 'PHONE VERIFICATION' || $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' || $mo2f_second_factor == 'EMAIL' ||$mo2f_second_factor == 'OTP Over Telegram'|| $mo2f_second_factor == 'OTP Over Whatsapp') {
3200
- $this->mo2f_pass2login_otp_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3201
- } else if ( $mo2f_second_factor == 'KBA' or $mo2f_second_factor == 'Security Questions') {
3202
- $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to , $session_id_encrypt );
3203
- }else if ( $mo2f_second_factor == 'Duo Authenticator') {
3204
-
3205
- $this->mo2f_pass2login_duo_push_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3206
-
3207
- }else if ( $mo2f_second_factor == 'NONE' ) {
3208
- if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request'))
3209
- $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
3210
- else
3211
- return $currentuser;
3212
- } else {
3213
- $this->remove_current_activity($session_id_encrypt);
3214
- $error = new WP_Error();
3215
- if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
3216
- $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Two Factor method has not been configured.', );
3217
- wp_send_json_success($data);
3218
- }
3219
- else{
3220
- $error->add( 'empty_username', __( '<strong>ERROR</strong>: Two Factor method has not been configured.' ) );
3221
- return $error;
3222
- }
3223
- }
3224
- }
3225
- }
3226
-
3227
  }
3228
  }else if(!$exceeded && MoWpnsUtility::get_mo2f_db_option('mo2f_inline_registration', 'site_option')){
3229
  $this->mo2fa_inline( $currentuser, $redirect_to, $session_id_encrypt );
@@ -3240,7 +3198,105 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3240
  }
3241
 
3242
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3243
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3244
  function mo2fa_inline($currentuser,$redirect_to,$session_id){
3245
 
3246
  global $Mo2fdbQueries;
@@ -3259,7 +3315,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3259
  $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message,$redirect_to,null,$session_id);
3260
  }
3261
 
3262
- function mo2f_validate_soft_token($currentuser, $redirect_to = null, $mo2f_second_factor, $softtoken,$session_id_encrypt){
3263
  global $Mo2fdbQueries;
3264
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
3265
  $customer = new Customer_Setup();
@@ -3313,7 +3369,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3313
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
3314
  $mo2fa_login_message = 'An OTP has been sent to '.$email.' please verify to set the two-factor';
3315
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL';
3316
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id_encrypt, 1 );
 
3317
  }
3318
  else
3319
  {
@@ -3340,7 +3397,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3340
  $this->miniorange_pass2login_start_session();
3341
  MO2f_Utility::set_user_values( $session_id, "mo2f_current_user_id", $currentuser->ID );
3342
  $this->mo2f_userID=$currentuser->ID;
3343
- mo2f_collect_device_attributes_handler( $redirect_to,$session_id );
3344
  exit;
3345
  } else {
3346
  $this->miniorange_initiate_2nd_factor( $currentuser, null, $redirect_to ,null ,$session_id );
@@ -3348,6 +3405,7 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3348
  }
3349
 
3350
  function mo2f_check_username_password( $user, $username, $password, $redirect_to = null ) {
 
3351
  if ( is_a( $user, 'WP_Error' ) && ! empty( $user ) ) {
3352
  if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
3353
  $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp;Invalid User Credentials', );
@@ -3380,13 +3438,15 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3380
  }
3381
  else{
3382
  $currentuser->add( 'invalid_username_password', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Username or password.' ) );
 
3383
  return $currentuser;
3384
  }
3385
  } else {
3386
- global $Mo2fdbQueries;
3387
-
3388
  $session_id = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
 
3389
  if(isset($_REQUEST['woocommerce-login-nonce'])){
 
3390
  if ( ! empty( $_REQUEST[ 'redirect_to' ] ) ) {
3391
  $redirect_to = wp_unslash( $_REQUEST[ 'redirect_to' ] );
3392
  } elseif ( isset($_REQUEST[ '_wp_http_referer' ]) ) {
@@ -3402,10 +3462,12 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3402
  $cloud_methods = array("MOBILE AUTHENTICATION","PUSH NOTIFICATIONS","SOFT TOKEN");
3403
  if (MO2F_IS_ONPREM && $mo2f_configured_2FA_method=='Security Questions')
3404
  {
 
3405
  $this->miniorange_initiate_2nd_factor($currentuser, null , $redirect_to , "" , $session_id );
3406
  }
3407
  else if(MO2F_IS_ONPREM && $mo2f_configured_2FA_method =='Email Verification')
3408
  {
 
3409
  $this->miniorange_initiate_2nd_factor($currentuser, null , $redirect_to , null ,$session_id );
3410
  }
3411
  else
174
  }
175
  $backup_codes=get_user_meta($currentuser_id,'mo2f_backup_codes',true);
176
  $mo2f_backup_code= sanitize_text_field($POSTED[ 'mo2f_backup_code' ]);
177
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser_id );
178
+
179
+ if(!empty($backup_codes)){
180
+ $mo2f_backup_code = md5($mo2f_backup_code);
181
  if(in_array($mo2f_backup_code,$backup_codes)){
182
  foreach ($backup_codes as $key => $value) {
183
  if($value==$mo2f_backup_code){
184
  unset($backup_codes[$key]);
185
  update_user_meta($currentuser_id,'mo2f_backup_codes', $backup_codes);
186
+ $this->mo2fa_pass2login($redirect_to, $session_id_encrypt);
187
  }
188
  }
189
+ }else{
190
+ $mo2fa_login_message = __('The code you provided is already used or incorrect.','miniorange-2-factor-authentication');
191
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
192
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
 
 
 
 
 
 
 
 
193
  }
194
+ }else{
195
+
196
+ if(isset($mo2f_backup_code)){
197
+ $generate_backup_code = new Customer_Cloud_Setup();
198
+ $data = $generate_backup_code->mo2f_validate_backup_codes($mo2f_backup_code,$mo2f_user_email);
199
+
200
+ if( $data == 'success'){
201
+ $this->mo2fa_pass2login($redirect_to, $session_id_encrypt);
202
+ }else if($data == 'error_in_validation'){
203
+ $mo2fa_login_message = __('Error occurred while validating the backup codes.','miniorange-2-factor-authentication');
204
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
205
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
206
+ }else if($data == 'used_code'){
207
+ $mo2fa_login_message = __('The code you provided is already used or incorrect.','miniorange-2-factor-authentication');
208
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
209
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
210
+ }else if($data == 'total_code_used'){
211
+ $mo2fa_login_message = __('You have used all the backup codes. Please contact <a herf="mailto:2fasupport@xecurify.com">2fasupport@xecurify.com</a>','miniorange-2-factor-authentication');
212
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
213
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
214
+ }else if($data == 'backup_code_not_generated'){
215
+ $mo2fa_login_message = __('Backup code has not generated for you.','miniorange-2-factor-authentication');
216
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
217
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
218
+ }else if($data == 'DBConnectionerror'){
219
+ $mo2fa_login_message = __('Error occurred while establising connection.','miniorange-2-factor-authentication');
220
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
221
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
222
+
223
+ }else if($data == 'missingparameter'){
224
+ $mo2fa_login_message = __('Some parameters are missing while validating backup codes.');
225
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
226
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
227
+ }
228
+
229
+
230
+ }else{
231
+ $mo2fa_login_message = __('Please enter backup code.','miniorange-2-factor-authentication');
232
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
233
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
234
+ }
235
+ }
236
+
237
 
 
 
 
 
 
 
 
 
 
 
 
238
  }else{
239
  $this->remove_current_activity($session_id_encrypt);
240
  return new WP_Error('invalid_username', '<strong>'. __('ERROR','miniorange-2-factor-authentication') . '</strong>: ' . __('Please try again..', 'miniorange-2-factor-authentication'));
254
  $redirect_to = esc_url_raw($_POST['redirect_to']);
255
  $session_id = sanitize_text_field($_POST['session_id']);
256
  $id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id, 'mo2f_current_user_id');
257
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
258
+ if(empty($mo2f_user_email)){
259
+ $currentuser = get_user_by( 'id', $id );
260
+ $mo2f_user_email = $currentuser->user_email;
261
+ }
262
+ $generate_backup_code = new Customer_Cloud_Setup();
263
+ $codes=$generate_backup_code->mo_2f_generate_backup_codes($mo2f_user_email, site_url());
264
+ if($codes == 'AllUsed'){
265
+ $mo2fa_login_message = "You have already used all the backup codes for this user and domain.";
266
+ $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
267
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
268
+ }else if($codes == 'UserLimitReached') {
269
+ $mo2fa_login_message = "Backup code generation limit has reached for this domain.";
270
+ $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
271
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
272
+ }else if($codes == 'LimitReached'){
273
+ $mo2fa_login_message = "backup code generation limit has reached for this user.";
274
+ $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
275
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
276
+ }else if($codes == 'invalid_request'){
277
+ $mo2fa_login_message = "Invalid request.";
278
+ $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
279
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
280
+ }
281
+ $codes = explode(' ', $codes);
282
  $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
283
  $str1="";
284
+ for ($x = 0; $x < sizeof($codes); $x++) {
285
  $str = $codes[$x];
286
  $str1.=$str;
287
  if($x != 4){
288
  $str1.=',';
289
  }
290
  }
291
+
292
  $key = get_option( 'mo2f_encryption_key' );
293
  $codes_encrypt = MO2f_Utility::encrypt_data($str1, $key);
294
  update_user_meta($id,'chqwetcsdvnvd', $codes_encrypt);
376
 
377
 
378
  $selected_2factor_method = $Mo2fdbQueries->get_user_detail('mo2f_configured_2FA_method',$current_user);
379
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
380
  if($selected_2factor_method == 'OTP Over Telegram')
381
  {
382
 
502
  }else if($selected_2factor_method == 'OTP OVER EMAIL'){
503
  $currentMethod = "OTP_OVER_EMAIL";
504
  $parameters = $email;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
505
  }
506
 
507
  else if($selected_2factor_method == 'OTP Over Telegram')
956
  }
957
  update_user_meta($current_user->ID,'mo2f_external_app_type','GOOGLE AUTHENTICATOR');
958
  $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
959
+
960
+ //When user sets method of another admin from USers section.
961
+ if(!empty(get_user_meta($current_user->ID,'mo2fa_set_Authy_inline'))){
962
+ $Mo2fdbQueries->update_user_details( $current_user->ID, array(
963
+ 'mo2f_GoogleAuthenticator_config_status' => false,
964
+ 'mo2f_AuthyAuthenticator_config_status' => true,
965
+ 'mo2f_configured_2FA_method' => "Authy Authenticator",
966
+ 'user_registration_with_miniorange' => 'SUCCESS',
967
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
968
+ ) );
969
+ update_user_meta( $current_user->ID, 'mo2f_external_app_type', "Authy Authenticator" );
970
+ delete_user_meta($current_user->ID ,'mo2fa_set_Authy_inline');
971
+ }
972
  }else{
973
+ $mo2fa_login_message = __('An error occured while setting up Google/Authy Authenticator. Please Try again.','miniorange-2-factor-authentication');
974
  }
975
  }else{
976
  $mo2fa_login_message = __('An error occured while processing your request. Please Try again.','miniorange-2-factor-authentication');
1288
  {
1289
  $selected_method = 'OTP Over Telegram';
1290
  }
1291
+ $Mo2fdbQueries->update_user_details( $current_user->ID, array('mo2f_configured_2FA_method' =>$selected_method) );
 
 
 
 
1292
  }
1293
  }else{
1294
  if($selected_method == 'OTP OVER TELEGRAM')
1295
  {
1296
  $selected_method = 'OTP Over Telegram';
1297
  }
 
 
 
 
1298
  $Mo2fdbQueries->update_user_details( $current_user->ID, array(
1299
  'mo2f_configured_2FA_method' =>$selected_method,
1300
  ) );
1309
  }
1310
 
1311
  function check_kba_validation($POSTED){
1312
+ global $moWpnsUtility;
1313
  if ( isset( $POSTED['miniorange_kba_nonce'] ) ) { /*check kba validation*/
1314
  $nonce = $POSTED['miniorange_kba_nonce'];
1315
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-kba-nonce' ) ) {
1323
  $redirect_to = isset( $_POST['redirect_to'] ) ? esc_url_raw($_POST['redirect_to']) : null;
1324
  if ( isset( $user_id ) ) {
1325
  if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_1'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_2'] ) ) {
1326
+ MO2f_Utility::mo2f_debug_file('Please provide both the answers of KBA'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1327
  $mo2fa_login_message = 'Please provide both the answers.';
1328
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_KBA_AUTHENTICATION';
1329
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
1337
  $check_trust_device = isset( $_POST['mo2f_trust_device'] ) ? sanitize_text_field($_POST['mo2f_trust_device']) : 'false';
1338
  //if the php session folder has insufficient permissions, cookies to be used
1339
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId', $session_id_encrypt );
1340
+ MO2f_Utility::mo2f_debug_file('Transaction Id-'.$mo2f_login_transaction_id.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1341
  $mo2f_rba_status = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_rba_status',$session_id_encrypt );
1342
  $kba_validate = new Customer_Setup();
1343
  $kba_validate_response = json_decode( $kba_validate->validate_otp_token( 'KBA', null, $mo2f_login_transaction_id, $otpToken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1350
  } catch ( Exception $e ) {
1351
  echo $e->getMessage();
1352
  }
1353
+ MO2f_Utility::mo2f_debug_file('Remeber device logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1354
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1355
  } else {
1356
+ MO2f_Utility::mo2f_debug_file('Logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1357
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1358
  }
1359
  } else {
1360
+ MO2f_Utility::mo2f_debug_file('The answers you have provided for KBA are incorrect'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1361
  $mo2fa_login_message = 'The answers you have provided are incorrect.';
1362
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_KBA_AUTHENTICATION';
1363
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt);
1364
  }
1365
  } else {
1366
+ MO2f_Utility::mo2f_debug_file('User id not found'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1367
  $this->remove_current_activity($session_id_encrypt);
1368
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
1369
  }
1486
  }
1487
 
1488
  function check_miniorange_duo_push_validation($POSTED){
1489
+ global $moWpnsUtility;
1490
  $nonce = $POSTED['miniorange_duo_push_validation_nonce'];
1491
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-duo-validation-nonce' ) ) {
1492
  $error = new WP_Error();
1495
  } else {
1496
  $this->miniorange_pass2login_start_session();
1497
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1498
+ $user_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
1499
+
1500
  $redirect_to = isset( $POSTED['redirect_to'] ) ? esc_url_raw($POSTED['redirect_to']) : null;
1501
  if ( get_option( 'mo2f_remember_device' ) ) {
1502
+
1503
+ MO2f_Utility::mo2f_debug_file('Remember device- Duo push notification logged in successfully'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1504
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1505
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to, null,$session_id_encrypt );
1506
  } else {
1507
+ MO2f_Utility::mo2f_debug_file('Duo push notification - Logged in successfully'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1508
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1509
  }
1510
 
1512
  }
1513
 
1514
  function check_miniorange_duo_push_validation_failed($POSTED){
1515
+ global $moWpnsUtility;
1516
  $nonce = $POSTED['miniorange_duo_push_validation_failed_nonce'];
1517
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-duo-push-validation-failed-nonce' ) ) {
1518
  $error = new WP_Error();
1519
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1520
  return $error;
1521
  } else {
1522
+ MO2f_Utility::mo2f_debug_file('Denied duo push notification'.' User_IP-'.$moWpnsUtility->get_client_ip());
1523
  $this->miniorange_pass2login_start_session();
1524
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1525
  $this->remove_current_activity($session_id_encrypt);
1530
 
1531
  function check_miniorange_mobile_validation($POSTED){
1532
  /*check mobile validation */
1533
+ global $moWpnsUtility;
1534
  $nonce = $POSTED['miniorange_mobile_validation_nonce'];
1535
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
1536
  $error = new WP_Error();
1553
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? sanitize_text_field($POSTED['session_id']) : null;
1554
  //if the php session folder has insufficient permissions, cookies to be used
1555
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_transactionId');
1556
+ MO2f_Utility::mo2f_debug_file('Transaction_id-'.$mo2f_login_transaction_id.' User_IP-'.$moWpnsUtility->get_client_ip());
1557
  $redirect_to = isset( $POSTED['redirect_to'] ) ? esc_url_raw($POSTED['redirect_to']) : null;
1558
  $checkMobileStatus = new Two_Factor_Setup();
1559
  $content = $checkMobileStatus->check_mobile_status( $mo2f_login_transaction_id );
1560
  $response = json_decode( $content, true );
1561
  if(MO2F_IS_ONPREM)
1562
  {
1563
+ MO2f_Utility::mo2f_debug_file('MO QR-code/push notification auth logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip());
1564
  $this->mo2fa_pass2login($redirect_to,$session_id_encrypt);
1565
  }
1566
  if ( json_last_error() == JSON_ERROR_NONE ) {
1567
  if ( $response['status'] == 'SUCCESS' ) {
1568
  if ( get_option( 'mo2f_remember_device' ) ) {
1569
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1570
+ MO2f_Utility::mo2f_debug_file('Remember device flow prompted'.' User_IP-'.$moWpnsUtility->get_client_ip());
1571
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to, null,$session_id_encrypt );
1572
  } else {
1573
+ MO2f_Utility::mo2f_debug_file('MO QR-code/push notification auth logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip());
1574
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1575
  }
1576
  } else {
1577
+ MO2f_Utility::mo2f_debug_file('Invalid_username'.' User_IP-'.$moWpnsUtility->get_client_ip());
1578
  $this->remove_current_activity($session_id_encrypt);
1579
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again.' ) );
1580
  }
1581
  } else {
1582
+ MO2f_Utility::mo2f_debug_file('Invalid_username'.' User_IP-'.$moWpnsUtility->get_client_ip());
1583
  $this->remove_current_activity($session_id_encrypt);
1584
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again.' ) );
1585
  }
1593
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1594
  return $error;
1595
  } else {
1596
+ MO2f_Utility::mo2f_debug_file('MO QR-code/push notification auth denied.');
1597
  $this->miniorange_pass2login_start_session();
1598
  $session_id_encrypt = isset( $POSTED['session_id'] ) ? $POSTED['session_id'] : null;
1599
  $this->remove_current_activity($session_id_encrypt);
1726
  }
1727
  function check_miniorange_soft_token($POSTED){
1728
  /*Validate Soft Token,OTP over SMS,OTP over EMAIL,Phone verification */
1729
+ global $moWpnsUtility;
1730
  $nonce = sanitize_text_field($_POST['miniorange_soft_token_nonce']);
1731
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-soft-token-nonce' ) ) {
1732
  $error = new WP_Error();
1745
  {
1746
  update_option('mo2f_attempts_before_redirect', $attempts-1 );
1747
  $mo2fa_login_message = 'Please enter OTP to proceed.';
1748
+ MO2f_Utility::mo2f_debug_file('Please enter OTP to proceed'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1749
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
1750
  }else{
1751
  $session_id_encrypt = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
1752
  $this->remove_current_activity($session_id_encrypt);
1753
+ MO2f_Utility::mo2f_debug_file('Number of attempts exceeded'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1754
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1755
  }
1756
  } else {
1760
  {
1761
  update_option('mo2f_attempts_before_redirect', $attempts-1 );
1762
  $mo2fa_login_message = 'Invalid OTP. Only digits within range 4-8 are allowed. Please try again.';
1763
+ MO2f_Utility::mo2f_debug_file('Invalid OTP. Only digits within range 4-8 are allowed'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1764
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
1765
  }else{
1766
  $session_id_encrypt = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
1770
  $data = array('reload' => "reload", );
1771
  wp_send_json_success($data);
1772
  }
1773
+ else{
1774
+ MO2f_Utility::mo2f_debug_file('Number of attempts exceeded'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id);
1775
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1776
+ }
1777
  }
1778
  }
1779
  }
1786
  $current_user = get_userdata($user_id);
1787
  //if the php session folder has insufficient permissions, cookies to be used
1788
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_transactionId');
1789
+ $mo2f_login_transaction_id = isset($_POST['mo2fa_transaction_id'])?sanitize_text_field($_POST['mo2fa_transaction_id']):MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_transactionId');
1790
+ MO2f_Utility::mo2f_debug_file('Transaction_id-'.$mo2f_login_transaction_id.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1791
  if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) {
1792
  $content = json_decode( $customer->validate_otp_token( 'EMAIL', null, $mo2f_login_transaction_id, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),$current_user ), true );
1793
  }elseif (isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_WHATSAPP' ) {
1804
  update_option('mo2f_attempts_before_redirect', 3);
1805
  if ( get_option( 'mo2f_remember_device' ) ) {
1806
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1807
+ MO2f_Utility::mo2f_debug_file('Remeber device setup'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1808
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1809
  }
1810
+ else{
1811
+
1812
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1813
+ }
1814
  }
1815
  else
1816
  {
1817
  $this->remove_current_activity($session_id_encrypt);
1818
+
1819
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: OTP has been Expired please reinitiate another transaction.' ) );
1820
 
1821
  }
1822
  }
1823
  else
1824
+ {
1825
+
1826
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1827
  $message = 'Invalid OTP please enter again.';
1828
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
1843
  update_option('mo2f_attempts_before_redirect', 3);
1844
  if ( get_option( 'mo2f_remember_device' ) ) {
1845
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1846
+ MO2f_Utility::mo2f_debug_file('Remember device flow'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1847
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1848
  }
1849
+ else{
1850
+ MO2f_Utility::mo2f_debug_file('OTP over Telegram - Logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1851
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1852
+ }
1853
  }
1854
  else
1855
  {
1856
  $this->remove_current_activity($session_id_encrypt);
1857
+ MO2f_Utility::mo2f_debug_file('OTP has been Expired please reinitiate another transaction'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1858
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: OTP has been Expired please reinitiate another transaction.' ) );
1859
 
1860
  }
1861
  }
1862
  else
1863
  {
1864
+ MO2f_Utility::mo2f_debug_file('OTP over Telegram - Invalid OTP'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1865
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1866
  $message = 'Invalid OTP please enter again.';
1867
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
1880
  $this->remove_current_activity($session_id_encrypt);
1881
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
1882
  }
 
1883
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1884
  update_option('mo2f_attempts_before_redirect', 3);
1885
  if ( get_option( 'mo2f_remember_device' ) ) {
1886
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1887
+ MO2f_Utility::mo2f_debug_file('Remember device flow'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1888
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1889
  } else {
1890
  if($mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL')
1895
  $enduser->mo2f_update_userinfo( $user_email, 'OTP Over Email', null, null, null );
1896
 
1897
  }
1898
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' Logged in successfully'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1899
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1900
  }
1901
  } else {
1902
  if($attempts>1 || $attempts=='disabled')
1903
  {
1904
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' Enter wrong OTP'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1905
  update_option('mo2f_attempts_before_redirect', $attempts-1);
1906
  $message = $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN' ? 'You have entered an invalid OTP.<br>Please click on <b>Sync Time</b> in the miniOrange Authenticator app to sync your phone time with the miniOrange servers and try again.' : 'Invalid OTP. Please try again.';
1907
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $message, $redirect_to,null,$session_id_encrypt );
1913
  $data = array('reload' => "reload", );
1914
  wp_send_json_success($data);
1915
  }
1916
+ else{
1917
+ MO2f_Utility::mo2f_debug_file('Number of attempts exceeded'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1918
+ return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1919
+ }
1920
+
1921
  }
1922
  }
1923
  } else {
1924
  $this->remove_current_activity($session_id_encrypt);
1925
+ MO2f_Utility::mo2f_debug_file('User id not found'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user_id.' Email-'.$user_email);
1926
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
1927
  }
1928
  }
1970
  $this->miniorange_pass2login_start_session();
1971
  $mobile_login = new Miniorange_Mobile_Login();
1972
  //validation and sanitization
1973
+ $username = isset( $_POST['mo2fa_username'] ) ? sanitize_text_field($_POST['mo2fa_username']) : '';
1974
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $username ) ) {
1975
  MO2f_Utility::set_user_values($session_id, 'mo2f_login_message', 'Please enter username to proceed' );
1976
  $mobile_login->mo_auth_show_error_message();
1977
  return;
2047
  else if($mo2f_second_factor == 'Email Verification'){
2048
  $this->mo2f_pass2login_push_oobemail_verification( $user, $mo2f_second_factor, $redirect_to, $session_id );
2049
  }
2050
+ else if ( $mo2f_second_factor == 'SOFT TOKEN' || $mo2f_second_factor == 'SMS' || $mo2f_second_factor == 'PHONE VERIFICATION' || $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' || $mo2f_second_factor == 'OTP Over Telegram'|| $mo2f_second_factor == 'EMAIL' || $mo2f_second_factor == "OTP Over Email") {
2051
  $this->mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to, $session_id );
2052
  } else if ( $mo2f_second_factor == 'KBA' ) {
2053
  $this->mo2f_pass2login_kba_verification( $user->ID, $redirect_to, $session_id );
2078
  }
2079
 
2080
  }
2081
+ if(isset($_GET['reconfigureMethod']) && is_user_logged_in()){
2082
+ $userIDGet = get_current_user_id();
2083
+ $txidGet = isset($_GET['transactionId'])?sanitize_text_field($_GET['transactionId']):'';
2084
+ $methodGet = isset($_GET['reconfigureMethod'])?sanitize_text_field($_GET['reconfigureMethod']):'';
2085
+ if(get_site_option($txidGet) === $userIDGet && ctype_xdigit($txidGet) && ctype_xdigit($methodGet)){
2086
+ $method = get_site_option($methodGet);
2087
+ $Mo2fdbQueries->update_user_details( $userIDGet, array(
2088
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS',
2089
+ 'mo2f_configured_2FA_method' => $method
2090
+ ) );
2091
+ $is_Authy_configured = $Mo2fdbQueries->get_user_detail('mo2f_AuthyAuthenticator_config_status',$userIDGet);
2092
+ if($method == 'Google Authenticator' || $is_Authy_configured){
2093
+ update_user_meta($userIDGet,'mo2fa_set_Authy_inline',true);
2094
+ }
2095
+ delete_site_option($txidGet);
2096
+ }else{
2097
+ $head = "You are not authorized to perform this action";
2098
+ $body = "Please contact to your admin";
2099
+ $this->display_email_verification($head,$body,'red');
2100
+ exit();
2101
+ }
2102
+ }
2103
  if(isset($_GET['Txid'])&&isset($_GET['accessToken']))
2104
  {
2105
  $userIDGet = sanitize_text_field($_GET['userID']);
2187
  case 'miniorange_rba_validate':
2188
  $this->check_rba_validation($_POST);
2189
  break;
2190
+ case 'miniorange_mfactor_method':
2191
+ $current_userID= MO2f_Utility::mo2f_get_transient($_POST['session_id'], 'mo2f_current_user_id');
2192
+ $currentuser = get_user_by('id',$current_userID);
2193
+ $this->mo2fa_select_method($currentuser, sanitize_text_field($_POST['mo2f_selected_mfactor_method']), null,sanitize_text_field($_POST['session_id']), esc_url_raw($_POST['redirect_to']),null);
2194
+ break;
2195
 
2196
  case 'miniorange_rba_cancle':
2197
 
2413
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
2414
  $session_path = ini_get('session.save_path');
2415
  if( is_writable($session_path) && is_readable($session_path) ) {
2416
+ if(session_status() != PHP_SESSION_DISABLED )
2417
+ session_start();
2418
  }
2419
  }
2420
  }
2475
  }
2476
  }
2477
 
2478
+ function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt=null,$show_back_button =null ,$mo2fa_transaction_id =false ) {
2479
 
2480
  $login_status = $mo2fa_login_status;
2481
  $login_message = $mo2fa_login_message;
2495
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL':
2496
  $user_id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
2497
 
2498
+ mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id,$show_back_button ,$mo2fa_transaction_id );
2499
  exit;
2500
  break;
2501
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_TELEGRAM':
2709
  wp_localize_script( 'tmlajax_script', 'my_ajax_object',
2710
  array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
2711
  }
2712
+ if(class_exists('LoginWithAjax')){
2713
+ wp_enqueue_script( 'login_with_ajax_script', plugins_url( 'includes/js/login_with_ajax.js', dirname(dirname(__FILE__))));
2714
+ wp_localize_script( 'login_with_ajax_script', 'my_ajax_object',
2715
+ array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
2716
+ }
2717
  ?>
2718
  <p><input type="hidden" name="miniorange_login_nonce"
2719
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-login-nonce' ); ?>"/>
2756
  }
2757
 
2758
  function mo2f_pass2login_mobile_verification( $user, $redirect_to, $session_id_encrypt=null ) {
2759
+ global $Mo2fdbQueries,$moWpnsUtility;
2760
  if (is_null($session_id_encrypt)){
2761
  $session_id_encrypt=$this->create_session();
2762
  }
2763
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2764
  $useragent = $_SERVER['HTTP_USER_AGENT'];
2765
+ MO2f_Utility::mo2f_debug_file('Check user agent to check request from mobile device '.$useragent);
2766
  if ( MO2f_Utility::check_if_request_is_from_mobile_device( $useragent ) ) {
2767
  $session_cookie_variables = array( 'mo2f-login-qrCode', 'mo2f_transactionId' );
2768
 
2772
 
2773
  $mo2fa_login_message = 'Please enter the one time passcode shown in the miniOrange<b> Authenticator</b> app.';
2774
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN';
2775
+ MO2f_Utility::mo2f_debug_file('Request from mobile device so promting soft token'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2776
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id_encrypt );
2777
  } else {
2778
  $challengeMobile = new Customer_Setup();
2787
  $this->mo2f_transactionid=$response['txId'];
2788
  $mo2fa_login_message = '';
2789
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_MOBILE_AUTHENTICATION';
2790
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' Sent miniOrange QR code Authentication successfully'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2791
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, $qrCode,$session_id_encrypt );
2792
  } else if ( $response['status'] == 'ERROR' ) {
2793
  $this->remove_current_activity($session_id_encrypt);
2794
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' An error occured while processing your request'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2795
  $error = new WP_Error();
2796
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
2797
 
2798
  return $error;
2799
  }
2800
  } else {
2801
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' An error occured while processing your request'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2802
  $this->remove_current_activity($session_id_encrypt);
2803
  $error = new WP_Error();
2804
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
2824
 
2825
  function mo2f_pass2login_push_oobemail_verification( $current_user, $mo2f_second_factor, $redirect_to, $session_id=null ) {
2826
 
2827
+ global $Mo2fdbQueries,$moWpnsUtility;
2828
  if(is_null($session_id)){
2829
  $session_id=$this->create_session();
2830
  }
2831
  $challengeMobile = new Customer_Setup();
2832
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
2833
  if(MO2F_IS_ONPREM && $mo2f_second_factor != "PUSH NOTIFICATIONS"){
2834
+ MO2f_Utility::mo2f_debug_file('Push notification has sent successfully for '.$mo2f_second_factor.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$current_user->ID.' Email-'.$current_user->user_email);
2835
  include_once dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'api'.DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
2836
  $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
2837
  $content = $mo2fOnPremRedirect->mo2f_pass2login_push_email_onpremise($current_user, $redirect_to, $session_id );
2845
  MO2f_Utility::mo2f_set_transient($session_id, 'mo2f_transactionId', $response['txId']);
2846
  update_user_meta($current_user->ID,'mo2f_EV_txid',$response['txId']);
2847
 
2848
+ MO2f_Utility::mo2f_debug_file('Push notification has sent successfully for '.$mo2f_second_factor.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$current_user->ID.' Email-'.$current_user->user_email);
2849
  $this->mo2f_transactionid=$response['txId'];
2850
 
2851
  $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'A Push Notification has been sent to your phone. We are waiting for your approval.' : 'An email has been sent to ' . MO2f_Utility::mo2f_get_hidden_email( $user_email ) . '. We are waiting for your approval.';
2855
  MO2f_Utility::mo2f_set_transient($session_id, 'mo2f_transactionId', $response['txId']);
2856
  update_user_meta($current_user->ID,'mo2f_EV_txid',$response['txId']);
2857
 
2858
+ MO2f_Utility::mo2f_debug_file('An error occured while sending push notification-'.$mo2f_second_factor.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$current_user->ID.' Email-'.$current_user->user_email);
2859
  $this->mo2f_transactionid=$response['txId'];
2860
  $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'An error occured while sending push notification to your app. You can click on <b>Phone is Offline</b> button to enter soft token from app or <b>Forgot your phone</b> button to receive OTP to your registered email.' : 'An error occured while sending email. Please try again.';
2861
  $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
2862
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2863
  }
2864
  } else {
2865
+ MO2f_Utility::mo2f_debug_file('An error occured while processing your request.'. 'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$current_user->ID.' Email-'.$current_user->user_email);
2866
  $this->remove_current_activity($session_id);
2867
  $error = new WP_Error();
2868
  $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
2872
  }
2873
 
2874
  function mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to,$session_id=null ) {
2875
+ global $Mo2fdbQueries,$moWpnsUtility;
2876
+
2877
  if(is_null($session_id)){
2878
  $session_id=$this->create_session();
2879
  }
2892
  if ( $mo2f_second_factor == 'SOFT TOKEN' ) {
2893
  $mo2fa_login_message = 'Please enter the one time passcode shown in the miniOrange<b> Authenticator</b> app.';
2894
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN';
2895
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2896
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2897
  } else if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
2898
  $mo2fa_login_message ='Please enter the one time passcode shown in the <b> Authenticator</b> app.';
2899
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_GOOGLE_AUTHENTICATION';
2900
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2901
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
2902
+ } elseif ($mo2f_second_factor == 'OTP Over Telegram') {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2903
  $chatID = get_user_meta($user->ID,'mo2f_chat_id',true);
2904
  $otpToken = '';
2905
  for($i=1;$i<7;$i++)
2935
  {
2936
  $mo2fa_login_message ='Please enter the one time passcode sent on your<b> Telegram</b> app.';
2937
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_TELEGRAM';
2938
+ MO2f_Utility::mo2f_debug_file($mo2fa_login_status.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2939
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id );
2940
  }
2941
 
2955
  }
2956
  else
2957
  {
2958
+ MO2f_Utility::mo2f_debug_file('Error in sending OTP over Email or SMS.'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2959
  $response['status'] = 'FAILED';
2960
  $response['message'] = '<p style = "color:red;">OTP limit has been exceeded</p>';
2961
  $otpLIMiTE = 1;
2964
  if ( $response['status'] == 'SUCCESS' ) {
2965
  if($mo2f_second_factor == 'EMAIL')
2966
  {
2967
+ MO2f_Utility::mo2f_debug_file(' OTP has been sent successfully over email.'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2968
  $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
2969
  if($cmVtYWluaW5nT1RQ>0)
2970
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2971
  }
2972
  elseif($mo2f_second_factor == 'SMS')
2973
  {
2974
+ MO2f_Utility::mo2f_debug_file(' OTP has been sent successfully over phone.'.' User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$user->ID.' Email-'.$user->user_email);
2975
  $mo2f_sms = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z');
2976
  if($mo2f_sms>0)
2977
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',$mo2f_sms-1);
2986
  $this->mo2f_transactionid=$response['txId'];
2987
  $mo2fa_login_message = $message;
2988
  $currentMethod = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
2989
+ if($mo2f_second_factor == 'EMAIL')
 
2990
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL';
2991
  else
2992
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS';
3046
  $mobile_login->remove_current_activity($session_id_encrypted);
3047
 
3048
  delete_expired_transients( true );
3049
+ delete_site_option($session_id_encrypted);
3050
 
3051
  wp_set_auth_cookie( $user_id, true );
3052
  do_action( 'wp_login', $currentuser->user_login, $currentuser );
3067
  }
3068
 
3069
  function miniorange_initiate_2nd_factor( $currentuser, $attributes = null, $redirect_to = null, $otp_token = "",$session_id_encrypt=null ) {
3070
+ global $Mo2fdbQueries,$moWpnsUtility;
3071
+ MO2f_Utility::mo2f_debug_file('MO initiate 2nd factor'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3072
  $this->miniorange_pass2login_start_session();
3073
  if(is_null($session_id_encrypt)) {
3074
  $session_id_encrypt=$this->create_session();
3076
 
3077
  if(class_exists('UM_Functions'))
3078
  {
3079
+ MO2f_Utility::mo2f_debug_file('Using UM login form.');
3080
  if(!isset($_POST['wp-submit']) and isset($_POST['um_request']))
3081
  {
3082
  $meta = get_option('um_role_'.$currentuser->roles[0].'_meta');
3168
 
3169
  $mo2f_second_factor = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $currentuser->ID );
3170
 
3171
+ if(!MO2F_IS_ONPREM and $mo2f_second_factor!= 'OTP Over Telegram')
3172
  $mo2f_second_factor = mo2f_get_user_2ndfactor( $currentuser );
3173
 
3174
+ // adding function for the mfa call
3175
+
3176
+ $configure_array_method = $this->mo2fa_return_methods_value($currentuser->ID);
3177
+
3178
+ if (sizeof( $configure_array_method) >1 && get_site_option('mo2f_nonce_enable_configured_methods') == true) {
3179
+ update_site_option('mo2f_login_with_mfa_use','1');
3180
+ mo2fa_prompt_mfa_form_for_user($configure_array_method,$session_id_encrypt,$redirect_to);
3181
+ exit;
3182
+ }
3183
+ else
3184
+ $this->mo2fa_select_method($currentuser, $mo2f_second_factor, $otp_token,$session_id_encrypt, $redirect_to,$kba_configuration_status);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3185
  }
3186
  }else if(!$exceeded && MoWpnsUtility::get_mo2f_db_option('mo2f_inline_registration', 'site_option')){
3187
  $this->mo2fa_inline( $currentuser, $redirect_to, $session_id_encrypt );
3198
  }
3199
 
3200
  }
3201
+ function mo2fa_return_methods_value($currentuserid)
3202
+ {
3203
+ global $Mo2fdbQueries;
3204
+ $count_methods = $Mo2fdbQueries->get_user_configured_methods($currentuserid );
3205
+ $value = empty( $count_methods ) ? '' : get_object_vars( $count_methods[0] );
3206
+ $configured_methods_arr=array();
3207
+ foreach ($value as $config_status_option => $config_status) {
3208
+ if(strpos($config_status_option, 'config_status')){
3209
+ $config_status_string_array =explode('_',$config_status_option);
3210
+ $config_method = MO2f_Utility::mo2f_decode_2_factor($config_status_string_array[1],'wpdb');
3211
+ if(1 == $value[$config_status_option])
3212
+ array_push($configured_methods_arr,$config_method);
3213
+
3214
+ }
3215
+ }
3216
 
3217
+ return $configured_methods_arr;
3218
+ }
3219
+ function mo2fa_select_method($currentuser, $mo2f_second_factor, $otp_token,$session_id_encrypt, $redirect_to,$kba_configuration_status)
3220
+ {
3221
+ global $moWpnsUtility;
3222
+
3223
+ if($mo2f_second_factor == 'OTP Over Email' || $mo2f_second_factor == 'OTP OVER EMAIL' || $mo2f_second_factor == "EMAIL") {
3224
+ $mo2f_second_factor = "EMAIL";
3225
+ if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')<=0)
3226
+ {
3227
+ update_site_option("bGltaXRSZWFjaGVk",1);
3228
+ }
3229
+ }
3230
+ else
3231
+ $mo2f_second_factor = MO2f_Utility::mo2f_decode_2_factor($mo2f_second_factor, "server" );
3232
+
3233
+ if($mo2f_second_factor == 'OTPOverTelegram')
3234
+ $mo2f_second_factor = "OTP Over Telegram";
3235
+
3236
+ if((($mo2f_second_factor == 'GOOGLE AUTHENTICATOR') || ($mo2f_second_factor =='SOFT TOKEN') || ($mo2f_second_factor =='AUTHY AUTHENTICATOR')) && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'site_option')&& !get_option('mo2f_remember_device') && !isset($_POST['mo_woocommerce_login_prompt']) )
3237
+ {
3238
+ $error=$this->mo2f_validate_soft_token($currentuser, $mo2f_second_factor, $otp_token,$session_id_encrypt, $redirect_to);
3239
+ if(is_wp_error( $error))
3240
+ {
3241
+ return $error;
3242
+ }
3243
+ }
3244
+ else
3245
+ {
3246
+ if ( MO2f_Utility::check_if_request_is_from_mobile_device( $_SERVER['HTTP_USER_AGENT'] ) && $kba_configuration_status )
3247
+ {
3248
+ $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to, $session_id_encrypt );
3249
+ }
3250
+ else
3251
+ {
3252
+ if ( $mo2f_second_factor == 'MOBILE AUTHENTICATION' )
3253
+ {
3254
+ $this->mo2f_pass2login_mobile_verification( $currentuser, $redirect_to, $session_id_encrypt );
3255
+ }
3256
+ else if ( $mo2f_second_factor == 'PUSH NOTIFICATIONS' || $mo2f_second_factor == 'OUT OF BAND EMAIL' || $mo2f_second_factor == 'Email Verification')
3257
+ {
3258
+ MO2f_Utility::mo2f_debug_file('Initiating 2fa validation template for '.$mo2f_second_factor.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3259
+ $this->mo2f_pass2login_push_oobemail_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3260
+ }
3261
+ else if ( $mo2f_second_factor == 'SOFT TOKEN' || $mo2f_second_factor == 'SMS' || $mo2f_second_factor == 'PHONE VERIFICATION' || $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' || $mo2f_second_factor == 'EMAIL' ||$mo2f_second_factor == 'OTP Over Telegram'|| $mo2f_second_factor == 'OTP Over Whatsapp') {
3262
+ MO2f_Utility::mo2f_debug_file('Initiating 2fa validation template for '.$mo2f_second_factor.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3263
+ $this->mo2f_pass2login_otp_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3264
+ }
3265
+ else if ( $mo2f_second_factor == 'KBA' or $mo2f_second_factor == 'Security Questions') {
3266
+ MO2f_Utility::mo2f_debug_file('Initiating 2fa validation template for '.$mo2f_second_factor.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3267
+ $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to , $session_id_encrypt );
3268
+ }
3269
+ else if ( $mo2f_second_factor == 'Duo Authenticator') {
3270
+ MO2f_Utility::mo2f_debug_file('Initiating 2fa validation template for '.$mo2f_second_factor.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3271
+ $this->mo2f_pass2login_duo_push_verification( $currentuser, $mo2f_second_factor, $redirect_to, $session_id_encrypt );
3272
+
3273
+ }
3274
+ else if ( $mo2f_second_factor == 'NONE' ) {
3275
+ MO2f_Utility::mo2f_debug_file('mo2f_second_factor is NONE'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3276
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request'))
3277
+ $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
3278
+ else
3279
+ return $currentuser;
3280
+ }
3281
+ else
3282
+ {
3283
+ $this->remove_current_activity($session_id_encrypt);
3284
+ $error = new WP_Error();
3285
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
3286
+ MO2f_Utility::mo2f_debug_file('Two factor method has not been configured '.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3287
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Two Factor method has not been configured.', );
3288
+ wp_send_json_success($data);
3289
+ }
3290
+ else
3291
+ {
3292
+ MO2f_Utility::mo2f_debug_file('Two factor method has not been configured '.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3293
+ $error->add( 'empty_username', __( '<strong>ERROR</strong>: Two Factor method has not been configured.' ) );
3294
+ return $error;
3295
+ }
3296
+ }
3297
+ }
3298
+ }
3299
+ }
3300
  function mo2fa_inline($currentuser,$redirect_to,$session_id){
3301
 
3302
  global $Mo2fdbQueries;
3315
  $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message,$redirect_to,null,$session_id);
3316
  }
3317
 
3318
+ function mo2f_validate_soft_token($currentuser, $mo2f_second_factor, $softtoken,$session_id_encrypt,$redirect_to = null){
3319
  global $Mo2fdbQueries;
3320
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
3321
  $customer = new Customer_Setup();
3369
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
3370
  $mo2fa_login_message = 'An OTP has been sent to '.$email.' please verify to set the two-factor';
3371
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL';
3372
+ $mo2fa_transaction_id = isset($response['txId'])?$response['txId']:null;
3373
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id_encrypt, 1 ,$mo2fa_transaction_id);
3374
  }
3375
  else
3376
  {
3397
  $this->miniorange_pass2login_start_session();
3398
  MO2f_Utility::set_user_values( $session_id, "mo2f_current_user_id", $currentuser->ID );
3399
  $this->mo2f_userID=$currentuser->ID;
3400
+ mo2f_collect_device_attributes_handler($session_id,$redirect_to );
3401
  exit;
3402
  } else {
3403
  $this->miniorange_initiate_2nd_factor( $currentuser, null, $redirect_to ,null ,$session_id );
3405
  }
3406
 
3407
  function mo2f_check_username_password( $user, $username, $password, $redirect_to = null ) {
3408
+ global $Mo2fdbQueries,$moWpnsUtility;
3409
  if ( is_a( $user, 'WP_Error' ) && ! empty( $user ) ) {
3410
  if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
3411
  $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp;Invalid User Credentials', );
3438
  }
3439
  else{
3440
  $currentuser->add( 'invalid_username_password', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Username or password.' ) );
3441
+ MO2f_Utility::mo2f_debug_file('Invalid username and password.'.'User_IP-'.$moWpnsUtility->get_client_ip());
3442
  return $currentuser;
3443
  }
3444
  } else {
3445
+
 
3446
  $session_id = isset( $_POST['session_id'] ) ? sanitize_text_field($_POST['session_id']) : null;
3447
+ MO2f_Utility::mo2f_debug_file('Username and password validate successfully'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3448
  if(isset($_REQUEST['woocommerce-login-nonce'])){
3449
+ MO2f_Utility::mo2f_debug_file('It is a woocommerce login form. Get woocommerce redirectUrl');
3450
  if ( ! empty( $_REQUEST[ 'redirect_to' ] ) ) {
3451
  $redirect_to = wp_unslash( $_REQUEST[ 'redirect_to' ] );
3452
  } elseif ( isset($_REQUEST[ '_wp_http_referer' ]) ) {
3462
  $cloud_methods = array("MOBILE AUTHENTICATION","PUSH NOTIFICATIONS","SOFT TOKEN");
3463
  if (MO2F_IS_ONPREM && $mo2f_configured_2FA_method=='Security Questions')
3464
  {
3465
+ MO2f_Utility::mo2f_debug_file('Initiating 2nd factor for KBA'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3466
  $this->miniorange_initiate_2nd_factor($currentuser, null , $redirect_to , "" , $session_id );
3467
  }
3468
  else if(MO2F_IS_ONPREM && $mo2f_configured_2FA_method =='Email Verification')
3469
  {
3470
+ MO2f_Utility::mo2f_debug_file('Initiating 2nd factor for email verification'.'User_IP-'.$moWpnsUtility->get_client_ip() .' User_Id-'.$currentuser->ID.' Email-'.$currentuser->user_email);
3471
  $this->miniorange_initiate_2nd_factor($currentuser, null , $redirect_to , null ,$session_id );
3472
  }
3473
  else
handler/twofa/two_fa_settings.php CHANGED
@@ -25,6 +25,7 @@ class Miniorange_Authentication {
25
  add_action( 'init', array( $pass2fa_login, 'miniorange_pass2login_redirect' ) );
26
  //for shortcode addon
27
  $mo2f_ns_config = new MoWpnsUtility();
 
28
 
29
  //strong password file
30
  $mo2f_strong_password = new class_miniorange_2fa_strong_password();
@@ -36,7 +37,8 @@ class Miniorange_Authentication {
36
  }
37
  add_filter( 'woocommerce_process_registration_errors', array($mo2f_strong_password,'woocommerce_password_protection'),1,4);
38
  add_filter( 'woocommerce_registration_errors', array($mo2f_strong_password,'woocommerce_password_registration_protection'),1,3);
39
-
 
40
  add_filter( 'mo2f_shortcode_rba_gauth', array( $mo2f_rba_attributes, 'mo2f_validate_google_auth' ), 10, 3 );
41
  add_filter( 'mo2f_shortcode_kba', array( $mo2f_2factor_setup, 'register_kba_details' ), 10, 7 );
42
  add_filter( 'mo2f_update_info', array( $mo2f_2factor_setup, 'mo2f_update_userinfo' ), 10, 5 );
@@ -44,6 +46,9 @@ class Miniorange_Authentication {
44
  $pass2fa_login,
45
  'miniorange_pass2login_form_fields'
46
  ), 10, 5 );
 
 
 
47
  add_filter( 'mo2f_gauth_service', array( $mo2f_rba_attributes, 'mo2f_google_auth_service' ), 10, 1 );
48
  if ( MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') ) { //password + 2nd factor enabled
49
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' or MO2F_IS_ONPREM) {
@@ -123,6 +128,16 @@ class Miniorange_Authentication {
123
  $Mo2fdbQueries = new Mo2fDB();
124
  }
125
 
 
 
 
 
 
 
 
 
 
 
126
  function mo2f_update_db_check() {
127
 
128
  $userid = wp_get_current_user()->ID;
@@ -276,7 +291,11 @@ class Miniorange_Authentication {
276
  function feedback_request() {
277
  display_feedback_form();
278
  }
 
279
 
 
 
 
280
  function get_customer_SMS_transactions() {
281
 
282
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' && MoWpnsUtility::get_mo2f_db_option('mo2f_show_sms_transaction_message', 'get_option') ) {
@@ -425,15 +444,1418 @@ class Miniorange_Authentication {
425
  wp_enqueue_script( 'mo2f_ns_admin_datatable_script', plugins_url('includes/js/jquery.dataTables.min.js', __FILE__ ), array('jquery'));
426
 
427
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
 
429
  function miniorange_auth_save_settings() {
430
  if (get_site_option('mo2f_plugin_redirect')) {
431
  delete_site_option('mo2f_plugin_redirect');
432
- wp_redirect(admin_url() . 'admin.php?page=mo_2fa_two_fa');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
433
  exit;
434
  }
435
  if ( array_key_exists( 'page', $_REQUEST ) && $_REQUEST['page'] == 'mo_2fa_two_fa' ) {
436
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
 
437
  session_start();
438
  }
439
  }
@@ -628,48 +2050,6 @@ class Miniorange_Authentication {
628
  }
629
  }
630
  }
631
- }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo2f_goto_verifycustomer" ) {
632
- $nonce = $_POST['mo2f_goto_verifycustomer_nonce'];
633
- if ( ! wp_verify_nonce( $nonce, 'mo2f-goto-verifycustomer-nonce' ) ) {
634
- $error = new WP_Error();
635
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
636
- return $error;
637
- } else {
638
- $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
639
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_YOUR_EMAIL_PASSWORD" ) );
640
- update_option('mo_2factor_user_registration_status','MO_2_FACTOR_VERIFY_CUSTOMER');
641
- }
642
- }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_2factor_gobackto_registration_page' ) { //back to registration page for admin
643
- $nonce = $_POST['mo_2factor_gobackto_registration_page_nonce'];
644
- if ( ! wp_verify_nonce( $nonce, 'mo-2factor-gobackto-registration-page-nonce' ) ) {
645
- $error = new WP_Error();
646
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
647
- return $error;
648
- } else {
649
- delete_option( 'mo2f_email' );
650
- delete_option( 'mo2f_password' );
651
- update_option( 'mo2f_message', "" );
652
-
653
- MO2f_Utility::unset_session_variables( 'mo2f_transactionId' );
654
- delete_option( 'mo2f_transactionId' );
655
- delete_user_meta( $user->ID, 'mo2f_sms_otp_count' );
656
- delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
657
- delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
658
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'REGISTRATION_STARTED' ) );
659
- }
660
-
661
- }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
662
- $nonce = $_POST['mo2f_registration_closed_nonce'];
663
- if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
664
- $error = new WP_Error();
665
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
666
- return $error;
667
- } else {
668
- delete_user_meta( $user->ID, 'register_account_popup' );
669
- $mo2f_message = 'Please set up the second-factor by clicking on Configure button.';
670
- update_option( 'mo2f_message', $mo2f_message );
671
- $this->mo_auth_show_success_message();
672
- }
673
  }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_verify_customer" ) { //register the admin to miniOrange if already exist
674
 
675
  $nonce = $_POST['miniorange_verify_customer_nonce'];
@@ -1090,6 +2470,48 @@ class Miniorange_Authentication {
1090
  $Mo2fdbQueries->database_table_issue();
1091
 
1092
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1093
  }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_skip_feedback' ) {
1094
 
1095
  $nonce = $_POST['mo2f_skip_feedback_nonce'];
@@ -1217,7 +2639,7 @@ class Miniorange_Authentication {
1217
  MO2f_Utility::unset_session_variables( $session_variables );
1218
 
1219
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1220
- $TwoFA_method_to_configure = get_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', true );
1221
  $enduser = new Two_Factor_Setup();
1222
  $current_method = MO2f_Utility::mo2f_decode_2_factor( $TwoFA_method_to_configure, "server" );
1223
 
@@ -1465,50 +2887,7 @@ class Miniorange_Authentication {
1465
  }
1466
  }
1467
  }
1468
- else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_otp_over_Whatsapp' ) { //validate otp over Telegram
1469
-
1470
- $nonce = $_POST['mo2f_validate_otp_over_Whatsapp_nonce'];
1471
-
1472
- if ( ! wp_verify_nonce( $nonce, 'mo2f-validate-otp-over-Whatsapp-nonce' ) ) {
1473
- $error = new WP_Error();
1474
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1475
-
1476
- return $error;
1477
- } else {
1478
-
1479
- $otp = sanitize_text_field($_POST['otp_token']);
1480
- $otpToken = get_user_meta($user->ID,'mo2f_otp_token_wa',true);
1481
-
1482
- $time = get_user_meta($user->ID,'mo2f_whatsapp_time',true);
1483
- $accepted_time = time()-600;
1484
- $time = (int)$time;
1485
- global $Mo2fdbQueries;
1486
- if($otp == $otpToken)
1487
- {
1488
- if($accepted_time<$time){
1489
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1490
- delete_user_meta( $user->ID, 'test_2FA' );
1491
- delete_user_meta($user->ID,'mo2f_whatsapp_time');
1492
-
1493
- $this->mo_auth_show_success_message();
1494
-
1495
- }
1496
- else
1497
- {
1498
- update_option( 'mo2f_message', 'OTP has been expired please initiate another transaction for verification' );
1499
- delete_user_meta( $user->ID, 'test_2FA' );
1500
- $this->mo_auth_show_error_message();
1501
-
1502
- }
1503
- }
1504
- else
1505
- {
1506
- update_option( 'mo2f_message', 'Wrong OTP Please try again.' );
1507
- $this->mo_auth_show_error_message();
1508
-
1509
- }
1510
- }
1511
- }
1512
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_otp_over_Telegram' ) { //validate otp over Telegram
1513
 
1514
  $nonce = $_POST['mo2f_validate_otp_over_Telegram_nonce'];
@@ -1786,14 +3165,9 @@ class Miniorange_Authentication {
1786
 
1787
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //Google OTP validated
1788
 
1789
- if ( current_user_can( 'manage_options' ) ) {
1790
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1791
- delete_user_meta( $user->ID, 'configure_2FA');
1792
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => 'OTP Over Email','mo2f_OTPOverEmail_config_status'=>true ) );
1793
- } else {
1794
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1795
- }
1796
-
1797
  delete_user_meta( $user->ID, 'test_2FA' );
1798
  $this->mo_auth_show_success_message();
1799
 
@@ -2162,71 +3536,6 @@ class Miniorange_Authentication {
2162
  }
2163
  }
2164
  }
2165
- else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Whatsapp_send_otp' ) { // sendin otp for configuring OTP over Whatsapp
2166
-
2167
- $nonce = $_POST['mo2f_configure_otp_over_Whatsapp_send_otp_nonce'];
2168
-
2169
- if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-otp-over-Whatsapp-send-otp-nonce' ) ) {
2170
- $error = new WP_Error();
2171
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2172
-
2173
- return $error;
2174
- } else {
2175
- $verify_whatsappID = sanitize_text_field( $_POST['verify_whatsappID'] );
2176
- $verify_whatsappNum = sanitize_text_field( $_POST['verify_whatsappNum'] );
2177
- if ( MO2f_Utility::mo2f_check_empty_or_null( $verify_whatsappID ) or MO2f_Utility::mo2f_check_empty_or_null( $verify_whatsappNum ) ) {
2178
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
2179
- $this->mo_auth_show_error_message();
2180
-
2181
- return;
2182
- }
2183
-
2184
- $verify_whatsappID = str_replace( ' ', '', $verify_whatsappID );
2185
- $verify_whatsappNum = str_replace( ' ', '', $verify_whatsappNum );
2186
-
2187
- $user = wp_get_current_user();
2188
-
2189
- update_user_meta($user->ID, 'mo2f_temp_whatsappID', $verify_whatsappID );
2190
- update_user_meta($user->ID, 'mo2f_temp_whatsapp_num', $verify_whatsappNum );
2191
-
2192
- $dnvjn = get_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=');
2193
- $dnvjn = (int)$dnvjn;
2194
- if($dnvjn<=0)
2195
- {
2196
- update_option( 'mo2f_message','Your Free transacions limit has been exceeded. Please contact miniOrange for more transacions.');
2197
- $this->mo_auth_show_error_message();
2198
- }
2199
- else
2200
- {
2201
-
2202
- $customer = new Customer_Setup();
2203
- $currentMethod = "OTP Over Whatsapp";
2204
-
2205
- $otpToken = '';
2206
- for($i=1;$i<7;$i++)
2207
- {
2208
- $otpToken .= rand(0,9);
2209
- }
2210
- update_user_meta($user->ID,'mo2f_otp_token_wa',$otpToken);
2211
- update_user_meta($user->ID,'mo2f_whatsapp_time',time());
2212
- $url = 'https://api.callmebot.com/whatsapp.php?phone='.$verify_whatsappNum.'&text=Please+find+your+one+time+passcode:+'.$otpToken.'&apikey='.$verify_whatsappID;
2213
-
2214
- $data = file_get_contents($url);
2215
- if(strpos($data, 'Message queued') !== false)
2216
- {
2217
- update_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=',$dnvjn-1);
2218
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . 'your Whatsapp number. It can take a couple of minutes. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2219
- $this->mo_auth_show_success_message();
2220
- }
2221
- else
2222
- {
2223
- update_option( 'mo2f_message', 'An Error has occured while sending the OTP. Please verify your phone number and API key.');
2224
- $this->mo_auth_show_error_message();
2225
-
2226
- }
2227
- }
2228
- }
2229
- }
2230
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Telegram_send_otp' ) { // sendin otp for configuring OTP over Telegram
2231
 
2232
  $nonce = $_POST['mo2f_configure_otp_over_Telegram_send_otp_nonce'];
@@ -2352,83 +3661,6 @@ class Miniorange_Authentication {
2352
  }
2353
  }
2354
  }
2355
- else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Whatsapp_validate' ) {
2356
- $nonce = $_POST['mo2f_configure_otp_over_Whatsapp_validate_nonce'];
2357
-
2358
- if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-otp-over-Whatsapp-validate-nonce' ) ) {
2359
- $error = new WP_Error();
2360
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2361
-
2362
- return $error;
2363
- } else {
2364
-
2365
- $twofactor_transactions = new Mo2fDB;
2366
- $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user_id);
2367
-
2368
- if($exceeded){
2369
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "USER_LIMIT_EXCEEDED" ) );
2370
- $this->mo_auth_show_error_message();
2371
- return;
2372
- }
2373
- $otp_token = '';
2374
- if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
2375
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
2376
- $this->mo_auth_show_error_message();
2377
-
2378
- return;
2379
- } else {
2380
- $otp_token = sanitize_text_field( $_POST['otp_token'] );
2381
- }
2382
-
2383
- $otp = get_user_meta($user->ID,'mo2f_otp_token_wa',true);
2384
- $time = get_user_meta($user->ID,'mo2f_whatsapp_time',true);
2385
- $accepted_time = time()-600;
2386
- $time = (int)$time;
2387
- global $Mo2fdbQueries;
2388
- if($otp == $otp_token)
2389
- {
2390
- if($accepted_time<$time){
2391
- if(MO2F_IS_ONPREM)
2392
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => 'OTP Over Whatsapp',
2393
- 'mo2f_OTPOverWhatsapp_config_status' => true,
2394
- 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
2395
- ) );
2396
- else
2397
- { $Mo2fdbQueries->update_user_details( $user->ID, array(
2398
- 'mo2f_configured_2FA_method' => 'OTP Over Whatsapp',
2399
- 'user_registration_with_miniorange' => 'SUCCESS',
2400
- 'mo2f_OTPOverWhatsapp_config_status' => true,
2401
- 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
2402
- ) );
2403
- }
2404
- delete_user_meta( $user->ID, 'configure_2FA' );
2405
- update_user_meta( $user->ID, 'mo2f_whatsapp_id',get_user_meta($user->ID,'mo2f_temp_whatsappID',true));
2406
- update_user_meta( $user->ID, 'mo2f_whatsapp_num',get_user_meta($user->ID,'mo2f_temp_whatsapp_num',true));
2407
-
2408
- delete_user_meta( $user->ID, 'mo2f_temp_whatsappID' );
2409
- delete_user_meta( $user->ID, 'mo2f_temp_whatsapp_num' );
2410
-
2411
- delete_user_meta( $user->ID, 'mo2f_otp_token_wa');
2412
- delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
2413
- mo2f_display_test_2fa_notification($user);
2414
- update_option( 'mo2f_message','OTP Over Whatsapp is set as the second-factor. Enjoy the unlimited service.');
2415
- $this->mo_auth_show_success_message();
2416
- delete_user_meta($user->ID,'mo2f_whatsapp_time');
2417
- }
2418
- else
2419
- {
2420
- update_option( 'mo2f_message','OTP has been expired please reinitiate another transaction.');
2421
- $this->mo_auth_show_error_message();
2422
- delete_user_meta($user->ID,'mo2f_whatsapp_time');
2423
- }
2424
- }
2425
- else
2426
- {
2427
- update_option( 'mo2f_message','Invalid OTP. Please try again.');
2428
- $this->mo_auth_show_error_message();
2429
- }
2430
-
2431
- }}
2432
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Telegram_validate' ) {
2433
  $nonce = $_POST['mo2f_configure_otp_over_Telegram_validate_nonce'];
2434
 
@@ -2732,6 +3964,7 @@ class Miniorange_Authentication {
2732
  }
2733
 
2734
  }else if ( ( isset( $_POST['option'] ) && sanitize_text_field($_POST['option']) == 'mo2f_save_free_plan_auth_methods' ) ) {// user clicks on Set 2-Factor method
 
2735
  $nonce = sanitize_text_field($_POST['miniorange_save_form_auth_methods_nonce']);
2736
  if ( ! wp_verify_nonce( $nonce, 'miniorange-save-form-auth-methods-nonce' ) ) {
2737
  $error = new WP_Error();
@@ -2756,7 +3989,7 @@ class Miniorange_Authentication {
2756
  }
2757
  $selected_2FA_method = MO2f_Utility::mo2f_decode_2_factor( isset( $_POST['mo2f_configured_2FA_method_free_plan'] ) ? $_POST['mo2f_configured_2FA_method_free_plan'] : $_POST['mo2f_selected_action_standard_plan'], "wpdb" );
2758
  $selected_2FA_method = sanitize_text_field($selected_2FA_method);
2759
- $onprem_methods = array('Google Authenticator','Security Questions','OTPOverTelegram','OTPOverWhatsapp','DuoAuthenticator');
2760
  $Mo2fdbQueries->insert_user( $user->ID );
2761
  if(MO2F_IS_ONPREM && ! in_array($selected_2FA_method, $onprem_methods) ){
2762
  foreach ($cloud_methods as $cloud_method) {
@@ -2836,13 +4069,10 @@ class Miniorange_Authentication {
2836
  $selected_2FA_method = 'OTP Over SMS';
2837
  if($selected_2FA_method == 'OTPOverTelegram')
2838
  $selected_2FA_method = 'OTP Over Telegram';
2839
- if($selected_2FA_method == 'OTPOverWhatsapp')
2840
- $selected_2FA_method = 'OTP Over Whatsapp';
2841
- if($selected_2FA_method == 'DuoAuthenticator')
2842
- $selected_2FA_method = 'Duo Authenticator';
2843
  }
2844
-
2845
- if(MO2F_IS_ONPREM and ($selected_2FA_method =='Google Authenticator' or $selected_2FA_method == 'Security Questions' or $selected_2FA_method =='OTP Over Email' or $selected_2FA_method == 'Email Verification' or $selected_2FA_method == 'OTP Over Whatsapp' or $selected_2FA_method == 'OTP Over Telegram' or $selected_2FA_method == 'Duo Authenticator' ))
2846
  $is_customer_registered = 1;
2847
 
2848
  if ( $is_customer_registered ) {
@@ -2859,10 +4089,8 @@ class Miniorange_Authentication {
2859
  $enduser = new Customer_Setup();
2860
  if($selected_2FA_method == 'OTPOverTelegram')
2861
  $selected_2FA_method = 'OTP Over Telegram';
2862
- if($selected_2FA_method == 'OTPOverWhatsapp')
2863
- $selected_2FA_method = 'OTP Over Whatsapp';
2864
- if($selected_2FA_method == 'DuoAuthenticator')
2865
- $selected_2FA_method = 'Duo Authenticator';
2866
  if ( $selected_action == "select2factor" ) {
2867
 
2868
  if ( $selected_2FA_method == 'OTP Over SMS' && $user_phone == 'false' ) {
@@ -2952,18 +4180,6 @@ class Miniorange_Authentication {
2952
  } else {
2953
  update_option( 'mo2f_enable_2fa', isset( $_POST['mo2f_enable_2fa'] ) ? $_POST['mo2f_enable_2fa'] : 0 );
2954
  }
2955
- // }else if( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_enable_2FA_on_login_page_option' ) {
2956
- // $nonce = $_POST['mo2f_enable_2FA_on_login_page_option_nonce'];
2957
-
2958
- // if ( ! wp_verify_nonce( $nonce, 'mo2f-enable-2FA-on-login-page-option-nonce' ) ) {
2959
- // $error = new WP_Error();
2960
- // $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2961
-
2962
- // return $error;
2963
- // } else {
2964
- // if(!class_exists("UM_functions"))
2965
- // update_site_option('mo2f_enable_2fa_prompt_on_login_page', isset( $_POST['mo2f_enable_2fa_prompt_on_login_page'] ) ? $_POST['mo2f_enable_2fa_prompt_on_login_page'] : 0 );
2966
- // }
2967
  }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo_2factor_test_authentication_method' ) {
2968
  //network security feature
2969
  $nonce = $_POST['mo_2factor_test_authentication_method_nonce'];
@@ -3044,47 +4260,6 @@ class Miniorange_Authentication {
3044
  $this->mo_auth_show_error_message();
3045
 
3046
  }
3047
- }else if($selected_2FA_method =='OTP Over Whatsapp')
3048
- {
3049
-
3050
- $user = wp_get_current_user();
3051
- $whatsappID = get_user_meta($user->ID,'mo2f_whatsapp_id',true);
3052
- $whatsappNum = get_user_meta($user->ID,'mo2f_whatsapp_num',true);
3053
-
3054
- $dnvjn = get_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=');
3055
- $dnvjn = (int)$dnvjn;
3056
- if($dnvjn<=0)
3057
- {
3058
- update_option( 'mo2f_message','Your Free transacions limit has been exceeded. Please contact miniOrange for more transacions.');
3059
- $this->mo_auth_show_error_message();
3060
- }
3061
- else
3062
- {
3063
- $otpToken = '';
3064
- for($i=1;$i<7;$i++)
3065
- {
3066
- $otpToken .= rand(0,9);
3067
- }
3068
-
3069
- update_user_meta($user->ID,'mo2f_otp_token_wa',$otpToken);
3070
- update_user_meta($user->ID,'mo2f_whatsapp_time',time());
3071
-
3072
- $url = 'https://api.callmebot.com/whatsapp.php?phone='.$whatsappNum.'&text=Please+find+your+one+time+passcode:+'.$otpToken.'&apikey='.$whatsappID;
3073
-
3074
- $data = file_get_contents($url);
3075
- if(strpos($data, 'Message queued') !== false)
3076
- {
3077
- update_site_option('cmVtYWluaW5nV2hhdHNhcHB0cmFuc2FjdGlvbnM=',$dnvjn-1);
3078
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . 'your Whatsapp number. This can take a couple of minutes. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
3079
- $this->mo_auth_show_success_message();
3080
- }
3081
- else
3082
- {
3083
- update_option( 'mo2f_message', 'An Error has occured while sending the OTP. Please verify your configuration.');
3084
- $this->mo_auth_show_error_message();
3085
-
3086
- }
3087
- }
3088
  }
3089
  else if($selected_2FA_method =='OTP Over Telegram')
3090
  {
@@ -3249,6 +4424,22 @@ class Miniorange_Authentication {
3249
  delete_user_meta( $user->ID, 'configure_2FA' );
3250
 
3251
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3252
  }
3253
 
3254
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_2factor_generate_backup_codes' ) {
@@ -3258,7 +4449,25 @@ class Miniorange_Authentication {
3258
  $error->add('empty_username', '<strong>'. __('ERROR','miniorange-2-factor-authentication') .'</strong>: '. __('Invalid Request.', 'miniorange-2-factor-authentication'));
3259
  return $error;
3260
  }else {
3261
- MO2f_Utility::mo2f_mail_and_download_codes();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3262
  }
3263
  }
3264
 
@@ -3300,13 +4509,13 @@ class Miniorange_Authentication {
3300
  <!-- Modal content -->
3301
  <div class="modal-content">
3302
  <div class="modal-header">
3303
- <h3 class="modal-title" style="text-align: center; font-size: 20px; color: #20b2aa">Email Address for miniOrange</h3><span id="closeEnterEmailCloud" class="modal-span-close">X</span>
3304
  </div>
3305
  <div class="modal-body" style="height: auto">
3306
  <h2><i>Enter your Email:&nbsp;&nbsp;&nbsp; <input type ='email' id='emailEnteredCloud' name='emailEnteredCloud' size= '40' required value="<?php echo $email;?>"/></i></h2>
3307
  </div>
3308
  <div class="modal-footer">
3309
- <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button" id="save_entered_email_cloud">Save</button>
3310
  </div>
3311
  </div>
3312
  </div>
@@ -3692,18 +4901,18 @@ class Miniorange_Authentication {
3692
  $url = get_site_option('siteurl').'/wp-login.php?'; //login page can change
3693
  $message = '<table cellpadding="25" style="margin:0px auto">
3694
  <tbody>
3695
- <tr>
3696
  <td>
3697
  <table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
3698
  <tbody>
3699
- <tr>
3700
  <td><img src="https://ci5.googleusercontent.com/proxy/10EQeM1udyBOkfD2dwxGhIaMXV4lOwCRtUecpsDkZISL0JIkOL2JhaYhVp54q6Sk656rW2rpAFJFEgGQiAOVcYIIKxXYMHHMNSNB=s0-d-e1-ft#https://login.xecurify.com/moas/images/xecurify-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px" class="CToWUd"></td>
3701
  </tr>
3702
  </tbody>
3703
  </table>
3704
  <table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
3705
  <tbody>
3706
- <tr>
3707
  <td>
3708
  <p style="margin-top:0;margin-bottom:20px">Dear Customers,</p>
3709
  <p style="margin-top:0;margin-bottom:10px">You initiated a transaction <b>WordPress 2 Factor Authentication Plugin</b>:</p>
@@ -3784,18 +4993,18 @@ class Miniorange_Authentication {
3784
  $headers[] = 'Cc: 2fasupport <2fasupport@xecurify.com>';
3785
  $message = '<table cellpadding="25" style="margin:0px auto">
3786
  <tbody>
3787
- <tr>
3788
  <td>
3789
  <table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
3790
  <tbody>
3791
- <tr>
3792
  <td><img src="https://ci5.googleusercontent.com/proxy/10EQeM1udyBOkfD2dwxGhIaMXV4lOwCRtUecpsDkZISL0JIkOL2JhaYhVp54q6Sk656rW2rpAFJFEgGQiAOVcYIIKxXYMHHMNSNB=s0-d-e1-ft#https://login.xecurify.com/moas/images/xecurify-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px" class="CToWUd"></td>
3793
  </tr>
3794
  </tbody>
3795
  </table>
3796
  <table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
3797
  <tbody>
3798
- <tr>
3799
  <td>
3800
  <p style="margin-top:0;margin-bottom:20px">Dear Customer,</p>
3801
  <p style="margin-top:0;margin-bottom:20px"> You are going to exhaust all your '.$string.'. You have only <b>'.$count.'</b> '.$string.' remaining. You can recharge or add '.$string.' to your account: <a href='.MoWpnsConstants::rechargeLink.'>Recharge</a></p>
25
  add_action( 'init', array( $pass2fa_login, 'miniorange_pass2login_redirect' ) );
26
  //for shortcode addon
27
  $mo2f_ns_config = new MoWpnsUtility();
28
+ add_action( 'login_form', array( $pass2fa_login, 'mo_2_factor_pass2login_show_wp_login_form' ),10 );
29
 
30
  //strong password file
31
  $mo2f_strong_password = new class_miniorange_2fa_strong_password();
37
  }
38
  add_filter( 'woocommerce_process_registration_errors', array($mo2f_strong_password,'woocommerce_password_protection'),1,4);
39
  add_filter( 'woocommerce_registration_errors', array($mo2f_strong_password,'woocommerce_password_registration_protection'),1,3);
40
+ add_action( 'mo2f_admin_setup_wizard_load_setup_wizard_before', [ $this, 'disable_admin_bar' ] );
41
+
42
  add_filter( 'mo2f_shortcode_rba_gauth', array( $mo2f_rba_attributes, 'mo2f_validate_google_auth' ), 10, 3 );
43
  add_filter( 'mo2f_shortcode_kba', array( $mo2f_2factor_setup, 'register_kba_details' ), 10, 7 );
44
  add_filter( 'mo2f_update_info', array( $mo2f_2factor_setup, 'mo2f_update_userinfo' ), 10, 5 );
46
  $pass2fa_login,
47
  'miniorange_pass2login_form_fields'
48
  ), 10, 5 );
49
+
50
+ add_action( 'delete_user', array( $this, 'mo2f_delete_user' ) );
51
+
52
  add_filter( 'mo2f_gauth_service', array( $mo2f_rba_attributes, 'mo2f_google_auth_service' ), 10, 1 );
53
  if ( MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') ) { //password + 2nd factor enabled
54
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' or MO2F_IS_ONPREM) {
128
  $Mo2fdbQueries = new Mo2fDB();
129
  }
130
 
131
+ function mo2f_delete_user($user_id){
132
+ global $Mo2fdbQueries;
133
+ delete_user_meta($user_id,'mo2f_kba_challenge');
134
+ delete_user_meta($user_id,'mo2f_2FA_method_to_configure');
135
+ delete_user_meta($user_id,'Security Questions');
136
+ delete_user_meta($user_id,'mo2f_chat_id');
137
+ $Mo2fdbQueries->delete_user_details( $user_id);
138
+ delete_user_meta($user_id,'mo2f_2FA_method_to_test');
139
+ }
140
+
141
  function mo2f_update_db_check() {
142
 
143
  $userid = wp_get_current_user()->ID;
291
  function feedback_request() {
292
  display_feedback_form();
293
  }
294
+ public function disable_admin_bar() {
295
 
296
+ global $wp_admin_bar;
297
+ $wp_admin_bar = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
298
+ }
299
  function get_customer_SMS_transactions() {
300
 
301
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' && MoWpnsUtility::get_mo2f_db_option('mo2f_show_sms_transaction_message', 'get_option') ) {
444
  wp_enqueue_script( 'mo2f_ns_admin_datatable_script', plugins_url('includes/js/jquery.dataTables.min.js', __FILE__ ), array('jquery'));
445
 
446
  }
447
+ public function setup_wizard_header() {
448
+ ?>
449
+ <!DOCTYPE html>
450
+ <html <?php language_attributes(); ?>>
451
+ <head>
452
+ <meta name="viewport" content="width=device-width"/>
453
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
454
+ <title><?php esc_html_e( 'miniOrange 2-factor Setup Wizard', 'miniorange 2-factor-authentication' ); ?></title>
455
+ <?php do_action( 'admin_print_styles' ); ?>
456
+ <?php do_action( 'admin_print_scripts' ); ?>
457
+ <?php do_action( 'admin_head' ); ?>
458
+ </head>
459
+ <body class="mo2f-setup-setup-wizard">
460
+ <?php
461
+ }
462
+
463
+ /**
464
+ * Outputs the content of the current step.
465
+ *
466
+ * @since 2.6.0
467
+ */
468
+
469
+ private function settings_error_page( $id = 'mo2f-setup-vue-site-settings', $footer = '' ) {
470
+
471
+ $contact_url = 'https://wordpress.org/plugins/miniorange-2-factor-authentication/';
472
+ echo '<head>';
473
+ echo '<script type="text/javascript" src="'.plugins_url( "/includes/jquery-qrcode/jquery-qrcode.js", dirname(dirname(__FILE__ ))).'"></script>';
474
+ echo '<script type="text/javascript" src="'.plugins_url( "/includes/jquery-qrcode/jquery-qrcode.min.js", dirname(dirname(__FILE__ ))).'"></script>';
475
+ echo '<script type="text/javascript" src="'.plugins_url( "/includes/js/phone.js", dirname(dirname(__FILE__ ))).'"></script>';
476
+
477
+ echo '<link rel="stylesheet" type="text/css" href="' . plugins_url('includes/css/phone.css', dirname(dirname(__FILE__))). '" />';
478
+ // echo '<link rel="stylesheet" type="text/css" href="' . plugins_url('includes/css/twofa_style_settings.css', dirname(dirname(__FILE__))). '" />';
479
+ // echo '<link rel="stylesheet" type="text/css" href="' . plugins_url('includes/css/style_settings.css', dirname(dirname(__FILE__))). '" />';
480
+
481
+
482
+ echo '</head>';
483
+
484
+
485
+ ?>
486
+ <style type="text/css">
487
+ #mo2f-setup-wizard-settings-area {
488
+ visibility: hidden;
489
+ animation: loadWpMOTFASettingsNoJSView 0s 2s forwards;
490
+ }
491
+
492
+ @keyframes loadWpMOTFASettingsNoJSView{
493
+ to { visibility: visible; }
494
+ }
495
+
496
+ body {
497
+ background: #F1F1F1;
498
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
499
+ margin: 0;
500
+ }
501
+
502
+ #mo2f-setup-wizard-settings-area .mo2f-setup-wizard-header {
503
+ text-align: center;
504
+ border-top: 4px solid #E27730;
505
+ }
506
+
507
+ #mo2f-setup-wizard-settings-area .mo2f-setup-wizard-header h1 {
508
+ margin: 0;
509
+ }
510
+
511
+ #mo2f-setup-wizard-settings-area .mo2f-setup-logo {
512
+ display: inline-block;
513
+ width: 320px;
514
+ margin-top: 10px;
515
+ padding: 0 10px;
516
+ }
517
+
518
+
519
+ #mo2f-setup-wizard-settings-area .mo2f-setup-logo img {
520
+ width: 100%;
521
+ height: 100%;
522
+ }
523
+
524
+ #mo2f-setup-settings-error-loading-area {
525
+ box-sizing: border-box;
526
+ max-width: 90%;
527
+ width: auto;
528
+ margin: 0 auto;
529
+ background: #fff;
530
+ border: 1px solid #DDDDDD;
531
+ border-radius: 6px;
532
+ webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
533
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
534
+ padding: 20px 30px;
535
+ }
536
+ #mo2f-setup-settings-error-loading-area2 {
537
+ box-sizing: border-box;
538
+ max-width: 90%;
539
+ width: auto;
540
+ margin: 0 auto;
541
+ background: #fff;
542
+ border: 1px solid #DDDDDD;
543
+ border-radius: 6px;
544
+ webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
545
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
546
+ padding: 20px 30px;
547
+ }
548
+ #mo2f-setup-settings-error-loading-area3 {
549
+ box-sizing: border-box;
550
+ max-width: 90%;
551
+ width: auto;
552
+ margin: 0 auto;
553
+ background: #fff;
554
+ border: 1px solid #DDDDDD;
555
+ border-radius: 6px;
556
+ webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
557
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
558
+ padding: 20px 30px;
559
+ }
560
+ #mo2f-setup-settings-error-loading-area4 {
561
+ box-sizing: border-box;
562
+ max-width: 90%;
563
+ width: auto;
564
+ margin: 0 auto;
565
+ background: #fff;
566
+ border: 1px solid #DDDDDD;
567
+ border-radius: 6px;
568
+ webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
569
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
570
+ padding: 20px 30px;
571
+ }
572
+ #mo2f-setup-settings-error-loading-area1 {
573
+ box-sizing: border-box;
574
+ max-width: 90%;
575
+ width: auto;
576
+ margin: 0 auto;
577
+ background: #fff;
578
+ border: 1px solid #DDDDDD;
579
+ border-radius: 6px;
580
+ webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
581
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.05);
582
+ padding: 20px 30px;
583
+ }
584
+ #mo2f-setup-wizard-settings-area .mo2f-setup-error-footer {
585
+ text-align: center;
586
+ margin-top: 20px;
587
+ font-size: 14px;
588
+ }
589
+
590
+ #mo2f-setup-wizard-settings-area .mo2f-setup-error-footer a {
591
+ color: #999999;
592
+ }
593
+
594
+ #mo2f-setup-error-js h3 {
595
+ font-size: 24px;
596
+ font-weight: 500;
597
+ line-height: 23px;
598
+ margin: 0 0 15px;
599
+ color: #444444;
600
+ }
601
+
602
+ #mo2f-setup-error-js p.info,
603
+ #mo2f-setup-error-js ul.info {
604
+ color: #777777;
605
+ font-size: 16px;
606
+ line-height: 23px;
607
+ margin: 0 0 10px;
608
+ }
609
+
610
+ #mo2f-setup-error-js ul.info {
611
+ margin: -10px 0 20px;
612
+ }
613
+ .mo2f-input-radios-with-icons label {
614
+ width: 90%;
615
+ height: 40px;
616
+ color: #444;
617
+ border: 1px solid #ddd;
618
+ background: #fff;
619
+ border-radius: 3px;
620
+ font-size: 16px;
621
+ display: block;
622
+ margin-bottom: 20px;
623
+ padding: 24px 9px 9px 9px;
624
+ cursor: pointer
625
+ }
626
+
627
+ .mo2f-input-radios-with-icons label:hover {
628
+ border: 1px solid #999;
629
+ -webkit-box-shadow: 0 0 0 1px #999;
630
+ box-shadow: 0 0 0 1px #999
631
+ }
632
+
633
+ .mo2f-styled-radio {
634
+ width: 32px;
635
+ height: 32px;
636
+ position: relative;
637
+ display: inline-block;
638
+ border-radius: 50%;
639
+ background-color: #e6e6e6
640
+ float: left;
641
+ margin-top: -4px;
642
+ }
643
+ .mo_wpns_table_textbox {
644
+ width:100%;
645
+ height:30px;
646
+ }
647
+
648
+ #mo2f-setup-error-js a.button {
649
+ display: inline-block;
650
+ background-color: #E27730;
651
+ color: #ffffff;
652
+ line-height: 22px;
653
+ font-size: 16px;
654
+ padding: 14px 30px;
655
+ font-weight: 500;
656
+ border-radius: 3px;
657
+ border: none;
658
+ cursor: pointer;
659
+ text-decoration: none;
660
+ margin-top: 7px;
661
+ }
662
+
663
+ #mo2f-setup-error-js a.button:hover {
664
+ background-color: #c45e1b;
665
+ }
666
+
667
+ #mo2f-setup-error-js .medium-bold {
668
+ font-weight: 500;
669
+ }
670
+
671
+ #mo2f-setup-nojs-error-message > div {
672
+ border: 1px solid #DDDDDD;
673
+ border-left: 4px solid #DC3232;
674
+ color: #777777;
675
+ font-size: 14px;
676
+ padding: 18px 18px 18px 21px;
677
+ font-weight: 300;
678
+ text-align: left;
679
+ }
680
+ table {
681
+ table-layout: fixed ;
682
+ width: 100% ;
683
+ }
684
+ td {
685
+ width: 48% ;
686
+ }
687
+ @media (min-width: 782px) {
688
+ #mo2f-setup-wizard-settings-area .mo2f-setup-logo {
689
+ margin-top: 50px;
690
+ padding: 0;
691
+ }
692
+
693
+ #mo2f-setup-settings-error-loading-area {
694
+ width: 650px;
695
+ margin-top: 40px;
696
+ padding: 52px 67px 49px;
697
+ }
698
+ #mo2f-setup-settings-error-loading-area1 {
699
+ width: 650px;
700
+ margin-top: 40px;
701
+ padding: 52px 67px 49px;
702
+ }
703
+ #mo2f-setup-settings-error-loading-area2 {
704
+ width: 650px;
705
+ margin-top: 40px;
706
+ padding: 52px 67px 49px;
707
+ }
708
+ #mo2f-setup-settings-error-loading-area3 {
709
+ width: 650px;
710
+ margin-top: 40px;
711
+ padding: 52px 67px 49px;
712
+ }
713
+ #mo2f-setup-settings-error-loading-area4 {
714
+ width: 650px;
715
+ margin-top: 40px;
716
+ padding: 52px 67px 49px;
717
+ }
718
+ .mo2f-styled-radio {
719
+ width: 32px;
720
+ height: 32px;
721
+ position: relative;
722
+ display: inline-block;
723
+ border-radius: 50%;
724
+ background-color: #e6e6e6;
725
+ float: left;
726
+ margin-top: -4px;
727
+ }
728
+
729
+ #mo2f-setup-wizard-settings-area .mo2f-setup-error-footer {
730
+ margin-top: 50px;
731
+ }
732
+
733
+ #mo2f-setup-error-js p.info {
734
+ margin: 0 0 20px;
735
+ }
736
+ .mo2f-setup-button.mo2f-setup-button-large {
737
+ line-height: 22px;
738
+ font-size: 18px;
739
+ padding: 19px 39px
740
+ }
741
+ .mo2f-setup-button.mo2f-setup-button-large {
742
+ line-height: 22px;
743
+ font-size: 18px;
744
+ padding: 19px 39px;
745
+ }
746
+ .mo2f-styled-radio-text {
747
+ margin-left: 10px
748
+ }
749
+ .mo2f-setup-button.mo2f-setup-button-main:hover {
750
+ background-color: #c45e1b;
751
+ }
752
+ .mo2f-setup-button.mo2f-setup-button-main {
753
+ background-color: #e27730;
754
+ color: #fff;
755
+ font-weight: 500;
756
+ }
757
+ .mo2f-setup-wizard-timeline {
758
+ -webkit-box-align: center;
759
+ -ms-flex-align: center;
760
+ align-items: center;
761
+ display: -webkit-box;
762
+ display: -ms-flexbox;
763
+ display: flex;
764
+ margin: 41px auto 0;
765
+ max-width: 650px;
766
+ padding: 0 20px
767
+ }
768
+
769
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step-line {
770
+ background: #ddd;
771
+ height: 2px;
772
+ margin: 0 6px;
773
+ width: 100%
774
+ }
775
+
776
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step-line.mo2f-setup-wizard-timeline-line-active {
777
+ background: #6aa08b
778
+ }
779
+
780
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step {
781
+ border: none;
782
+ background-color: #b6b6b6;
783
+ border-radius: 50%;
784
+ -ms-flex-negative: 0;
785
+ flex-shrink: 0;
786
+ height: 16px;
787
+ width: 16px
788
+ }
789
+
790
+ .mo2f-setup-wizard-step-footer {
791
+ display: block;
792
+ text-align: center;
793
+ min-height: 110px;
794
+ padding: 0 20px;
795
+ margin-top: 30px
796
+ }
797
+ .popup_text
798
+ {
799
+ color:black;
800
+ margin-top: 2%;
801
+ font-weight: 600;
802
+ font-size: 12px !important;
803
+ }
804
+ .overlay{
805
+ position: fixed;
806
+ top: 0;
807
+ left: 0;
808
+ right: 0;
809
+ bottom: 0;
810
+ width: 100%;
811
+ height: 100%;
812
+ background: #000;
813
+ opacity: .5;
814
+ z-index: 0;
815
+ }
816
+ .overlay_success {
817
+ width: min-content;
818
+ height: 40px;
819
+ float: left;
820
+ z-index: 1;
821
+ top: 0;
822
+ right: 0;
823
+ text-align: center;
824
+ margin-bottom: 4%
825
+ background-color:#bcffb4 !important ;
826
+ /* overflow-x: hidden; */
827
+ background: #b1ffb1;
828
+ border-left: 4px solid #46b450;
829
+ }
830
+ .overlay_error {
831
+ width: min-content;
832
+ height: min-content;
833
+ padding-bottom: 1%;
834
+ float: left;
835
+ z-index: 1;
836
+ top: 0;
837
+ right: 0;
838
+ margin-bottom: 4%;
839
+ text-align: center;
840
+ background-color:bisque !important ;
841
+ /* overflow-x: hidden; */
842
+ border-left: 4px solid red;
843
+ }
844
+
845
+ .mo2f-setup-wizard-step-footer a {
846
+ font-size: 14px;
847
+ display: block;
848
+ color: #999;
849
+ margin: 20px 0
850
+ }
851
+
852
+ .mo2f-setup-wizard-step-footer a:active,
853
+ .mo2f-setup-wizard-step-footer a:hover {
854
+ color: #777;
855
+ text-decoration: underline
856
+ }
857
+
858
+
859
+ .mo2f-button.mo2f-button-main {
860
+ background-color: #e27730;
861
+ color: #fff;
862
+ font-weight: 500;
863
+ -webkit-box-flex: 11;
864
+ -ms-flex: 11;
865
+ flex: 11;
866
+ padding: 12px 25px;
867
+ font-size: 16px;
868
+ }
869
+
870
+ .mo2f-button.mo2f-button-main:focus,
871
+ .mo2f-button.mo2f-button-main:hover {
872
+ background-color: #c45e1b
873
+ }
874
+
875
+ .mo2f-button.mo2f-button-main:disabled {
876
+ opacity: .65;
877
+ cursor: not-allowed;
878
+ background-color: #e27730;
879
+ -webkit-box-flex: 11;
880
+ -ms-flex: 11;
881
+ flex: 11;
882
+ margin-right: 30px
883
+ }
884
+
885
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step .icon {
886
+ display: none
887
+ }
888
+
889
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step.mo2f-setup-wizard-timeline-step-active,
890
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step.mo2f-setup-wizard-timeline-step-completed {
891
+ background-color: #6aa08b;
892
+ position: relative
893
+ }
894
+
895
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step.mo2f-setup-wizard-timeline-step-failed {
896
+ background-color: #d83638;
897
+ position: relative
898
+ }
899
+
900
+ .mo2f-step-show{
901
+ margin: 0 0 16px;
902
+ font-size: 14px;
903
+ line-height: 18px;
904
+ color: #b6b6b6;
905
+ }
906
+ .mo2f_table_textbox {
907
+ width: 200px;
908
+ height: 20px !important;
909
+ font-size: 14px !important;
910
+ }
911
+ .mo2f_table_textbox_phone {
912
+ width: 200px;
913
+ height: 40px !important;
914
+ font-size: 14px !important;
915
+ }
916
+ .mo2f_kba_ques {
917
+ width: 394px !important;
918
+ border-radius: 4px !important;
919
+ height: 40px !important;
920
+ font-size: 14px !important;
921
+ }
922
+
923
+ .mo2f_kba_tb_data {
924
+ padding-left: 15px;
925
+ }
926
+
927
+ .mo2f_kba_table {
928
+ padding: 0 10px;
929
+ width: 100%;
930
+ }
931
+ .mo2f_kba_body {
932
+ border: hidden !important;
933
+ }
934
+
935
+
936
+ .mo2f_table_textbox_KBA {
937
+ width: 200px;
938
+ height: 40px !important;
939
+ font-size: 14px !important;
940
+ }
941
+
942
+
943
+ .mo2f_kba_header {
944
+ font-weight: bold;
945
+ }
946
+
947
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step.mo2f-setup-wizard-timeline-step-completed .icon-success,
948
+ .mo2f-setup-wizard-timeline .mo2f-setup-wizard-timeline-step.mo2f-setup-wizard-timeline-step-failed .icon-failed {
949
+ color: #fff;
950
+ display: block;
951
+ position: absolute;
952
+ left: 3px;
953
+ top: 3px
954
+ }
955
+ .mo2f-setup-wizard-step-footer {
956
+ display: -webkit-box;
957
+ display: -ms-flexbox;
958
+ display: flex;
959
+ -webkit-box-pack: justify;
960
+ -ms-flex-pack: justify;
961
+ justify-content: space-between;
962
+ -webkit-box-align: center;
963
+ -ms-flex-align: center;
964
+ align-items: center;
965
+ padding: 0;
966
+ margin-top: 0
967
+ }
968
+ .mo2f_blur {
969
+ filter: blur(5px);
970
+ -webkit-filter: blur(5px);
971
+ -moz-filter: blur(5px);
972
+ -o-filter: blur(5px);
973
+ -ms-filter: blur(5px);
974
+ }
975
+ .mo2f_loader {
976
+ border: 16px solid #b9acac;
977
+ border-radius: 50%;
978
+ border-top: 16px solid #fb540b;
979
+ width: 50px;
980
+ height: 50px;
981
+ -webkit-animation: spin 2s linear infinite; /* Safari */
982
+ animation: spin 2s linear infinite;
983
+ position: fixed;
984
+ left: 50%;
985
+ top: 50%;
986
+ z-index: 100;
987
+ }
988
+
989
+ /* Safari */
990
+ @-webkit-keyframes spin {
991
+ 0% { -webkit-transform: rotate(0deg); }
992
+ 100% { -webkit-transform: rotate(360deg); }
993
+ }
994
+
995
+ @keyframes spin {
996
+ 0% { transform: rotate(0deg); }
997
+ 100% { transform: rotate(360deg); }
998
+ }
999
+ .mo2f-setup-wizard-step-footer-buttons {
1000
+ margin-bottom: 0;
1001
+ }
1002
+ .mo2f-setup-wizard-step-footer-buttons button {
1003
+ margin-bottom: 0;
1004
+ margin-right: 15px;
1005
+ width: inherit
1006
+ }
1007
+ .miniorange_button
1008
+ {
1009
+ background:#00A0D2!important;
1010
+ border-color:#0073AA!important;
1011
+ box-shadow:0 1px 0 rgba(120,200,230,.5) inset,0 1px 0 rgba(0,0,0,.15)!important;
1012
+ color:#FFF!important;
1013
+ text-decoration:none!important;
1014
+ cursor:pointer!important;
1015
+ border-width:1px!important;
1016
+ border-style:solid!important;
1017
+ border-radius:3px!important;
1018
+ white-space:nowrap!important;
1019
+ box-sizing:border-box!important;
1020
+ line-height:28px!important;
1021
+ padding:0 12px!important;
1022
+ font-size:13px!important;
1023
+ }
1024
+
1025
+
1026
+ .mo2f_IR_phone_OTP{
1027
+ font-size:15px;
1028
+ width:150px !important;
1029
+ color:#212F3C;
1030
+ border:none;
1031
+ display:block;
1032
+ border-bottom-style: solid;
1033
+ border-width: 2px;
1034
+ border-color:#D0D3D4;
1035
+ border-radius:0px;
1036
+ outline:none;
1037
+ padding:5px;
1038
+
1039
+ }
1040
+ .mo2f-setup-wizard-step-footer-buttons button:last-child {
1041
+ margin-right: 0
1042
+ }
1043
+ a .text-with-arrow-left .icon {
1044
+ margin-right: 10px
1045
+ }
1046
+
1047
+ a .text-with-arrow {
1048
+ display: -webkit-box;
1049
+ display: -ms-flexbox;
1050
+ display: flex;
1051
+ -webkit-box-pack: center;
1052
+ -ms-flex-pack: center;
1053
+ justify-content: center
1054
+ }
1055
+
1056
+ }
1057
+ </style>
1058
+ <!--[if IE]>
1059
+ <style>
1060
+ #mo2f-setup-wizard-settings-area{
1061
+ visibility: visible !important;
1062
+ }
1063
+ </style>
1064
+
1065
+ <![endif]-->
1066
+ <div class="mo2f_loader" id="mo2f_loader" style="display: none;"></div>
1067
+
1068
+ <div id="mo2f-setup-wizard-settings-area" class="mo2f-setup-wizard-settings-area wpms-container">
1069
+ <header class="mo2f-setup-wizard-header">
1070
+ <h1 >
1071
+ <div>
1072
+ <img width="70px" height="auto" src="<?php echo plugin_dir_url(dirname(dirname(__FILE__))) . 'includes/images/miniorange_logo.png'; ?>" alt="<?php esc_attr_e( 'miniOrange 2-factor Logo', 'miniorange-2-factor-authentication' ); ?>" >
1073
+ <p> miniOrange 2-factor authentication Setup</p>
1074
+ </div>
1075
+ </h1>
1076
+ </header>
1077
+ <div id="mo2f-setup-settings-error-loading-area-container">
1078
+ <div id="mo2f-setup-settings-error-loading-area">
1079
+ <div>
1080
+ <div id="mo2f-setup-error-js">
1081
+ <p class="subtitle" style="text-align:center;" > This setup guide will take you through all the steps you need to follow to enable the two-factor authentication for your website.</p>
1082
+
1083
+ <br><br>
1084
+ <button type="button" style="text-align:center;display: flex;margin: auto;" class="mo2f-setup-button mo2f-setup-button-main mo2f-setup-button-large" id ='mo2f_get_started' target="_blank" class="button" rel="noopener noreferrer"> <?php esc_html_e("Let's Get Started", 'mo2f-setup'); ?></button>
1085
+
1086
+ <br><br>
1087
+ <div style="text-align:center;display: flex;margin: auto;flex-direction: column;">
1088
+ <a href="<?php echo esc_url( $contact_url ); ?>" target="_blank" rel="noopener noreferrer">
1089
+ <?php esc_html_e( 'Facing issues? Contact Us', 'mo2f-setup' ); ?>
1090
+ </a>
1091
+ </div>
1092
+ </div>
1093
+ </div>
1094
+ </div>
1095
+ <div class="mo2f-setup-error-footer">
1096
+ <?php echo wp_kses_post( $footer ); ?>
1097
+ </div>
1098
+ </div>
1099
+ <div id = "mo2f_methods_setup_wizard">
1100
+ <div class="mo2f-setup-wizard-timeline">
1101
+
1102
+ <div class="mo2f-setup-wizard-timeline-step mo2f-setup-wizard-timeline-step-active" id="mo2f-setup-wizard-step1"></div>
1103
+ <div class="mo2f-setup-wizard-timeline-step-line" id="mo2f-setup-wizard-line1"></div>
1104
+ <div class="mo2f-setup-wizard-timeline-step" id="mo2f-setup-wizard-step2"> </div>
1105
+ <div class="mo2f-setup-wizard-timeline-step-line" id="mo2f-setup-wizard-line2"></div>
1106
+ <div class="mo2f-setup-wizard-timeline-step"id="mo2f-setup-wizard-step3"> </div>
1107
+ <div class="mo2f-setup-wizard-timeline-step-line" id="mo2f-setup-wizard-line3"></div>
1108
+ <div class="mo2f-setup-wizard-timeline-step" id="mo2f-setup-wizard-step4"> </div>
1109
+
1110
+ </div>
1111
+ <div id="mo2f-setup-settings-error-loading-area1" style="width: 900px">
1112
+
1113
+ <p class="mo2f-step-show"> Step 1 of 4</p>
1114
+ <h3 style="text-align:center;font-size:xx-large;"> Select the Authentication method you want to configure </h3>
1115
+ <br>
1116
+ <div class="mo2f-input-radios-with-icons">
1117
+ <table>
1118
+ <tr>
1119
+ <td>
1120
+ <label title="<?php echo __('You have to enter 6 digits code generated by google Authenticator App to login. Supported in Smartphones only.', 'miniorange-2-factor-authentication'); ?>">
1121
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="Google Authenticator" />
1122
+ <span class="mo2f-styled-radio-text"> Google Authenticator</span>
1123
+ </label>
1124
+ </td>
1125
+ <td>
1126
+ <label title="<?php echo __('You will receive a one time passcode via SMS on your phone. You have to enter the otp on your screen to login. Supported in Smartphones, Feature Phones.', 'miniorange-2-factor-authentication'); ?>">
1127
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="OTP Over SMS" />
1128
+ <span class="mo2f-styled-radio-text">
1129
+ <?php echo __('OTP Over SMS (Registration required)', 'miniorange-2-factor-authentication'); ?>
1130
+ </span>
1131
+ </label></td>
1132
+ </tr>
1133
+ <tr>
1134
+ <td>
1135
+
1136
+ <label title="<?php echo __('You will receive a one time passcode on your email. You have to enter the otp on your screen to login. Supported in Smartphones, Feature Phones.', 'miniorange-2-factor-authentication'); ?>" >
1137
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="OTP Over Email" />
1138
+ <span class="mo2f-styled-radio-text">
1139
+ <?php echo __('OTP Over Email', 'miniorange-2-factor-authentication'); ?>
1140
+ </span>
1141
+ </label>
1142
+ </td>
1143
+
1144
+ <td>
1145
+ <label title="<?php echo __('You have to answers some knowledge based security questions which are only known to you to authenticate yourself. Supported in Desktops,Laptops,Smartphones.', 'miniorange-2-factor-authentication'); ?>" >
1146
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="Security Questions" />
1147
+ <span class="mo2f-styled-radio-text">
1148
+ <?php echo __('Security Questions ( KBA )', 'miniorange-2-factor-authentication'); ?>
1149
+ </span>
1150
+ </label>
1151
+ </td>
1152
+ </tr>
1153
+ <tr>
1154
+ <td>
1155
+
1156
+ <label title="<?php echo __('You have to enter 6 digits code generated by Microsoft Authenticator App to login. Supported in Smartphones only.', 'miniorange-2-factor-authentication'); ?>">
1157
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="Google Authenticator" />
1158
+ <span class="mo2f-styled-radio-text">
1159
+ <?php echo __('Microsoft Authenticator', 'miniorange-2-factor-authentication'); ?>
1160
+ </span>
1161
+ </label>
1162
+ </td>
1163
+ <td>
1164
+ <label title="<?php echo __('You have to enter 6 digits code generated by Authy 2-Factor Authentication App to login. Supported in Smartphones only.', 'miniorange-2-factor-authentication'); ?>">
1165
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="Google Authenticator" />
1166
+ <span class="mo2f-styled-radio-text">
1167
+ <?php echo __('Authy 2-Factor Authentication', 'miniorange-2-factor-authentication'); ?>
1168
+ </span>
1169
+ </label>
1170
+ </td></tr>
1171
+ <tr><td>
1172
+
1173
+ <label title="<?php echo __('You will receive a push notification on your phone. You have to ACCEPT or DENY it to login. Supported in Smartphones only.', 'miniorange-2-factor-authentication'); ?>">
1174
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="Duo Authenticator" />
1175
+ <span class="mo2f-styled-radio-text">
1176
+ <?php echo __('Duo Push Notification', 'miniorange-2-factor-authentication'); ?>
1177
+ </span>
1178
+ </label>
1179
+ </td>
1180
+ <td>
1181
+ <label title="<?php echo __('You will get an OTP on your TELEGRAM app from miniOrange Bot.', 'miniorange-2-factor-authentication'); ?>" >
1182
+ <input type="radio" name="mo2f_selected_2factor_method" class="mo2f-styled-radio" value="OTP Over Telegram" />
1183
+ <span class="mo2f-styled-radio-text">
1184
+ <?php echo __('OTP Over Telegram', 'miniorange-2-factor-authentication'); ?>
1185
+ </span>
1186
+ </label>
1187
+ </td>
1188
+ </table>
1189
+ </div>
1190
+
1191
+ <br><a href="#skiptwofactor" style="color:#F4D03F ;font-weight:bold;margin-left:45%;"><?php echo __('Skip Setup', 'miniorange-2-factor-authentication'); ?></a>
1192
+ <br />
1193
+
1194
+
1195
+ <div class="mo2f-setup-wizard-step-footer">
1196
+ <a href="#previousStep1"><span class="text-with-arrow text-with-arrow-left"><svg viewBox="0 0 448 512" role="img" class="icon" data-icon="long-arrow-alt-left" data-prefix="far" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="18"><path xmlns="http://www.w3.org/2000/svg" fill="currentColor" d="M107.515 150.971L8.485 250c-4.686 4.686-4.686 12.284 0 16.971L107.515 366c7.56 7.56 20.485 2.206 20.485-8.485v-71.03h308c6.627 0 12-5.373 12-12v-32c0-6.627-5.373-12-12-12H128v-71.03c0-10.69-12.926-16.044-20.485-8.484z"></path></svg> Previous Step </span></a>
1197
+ <div class="mo2f-setup-wizard-step-footer-buttons">
1198
+ <input type="button" name="mo2f_next_step1" id="mo2f_next_step1" class="mo2f-button mo2f-button-main" value="Save and Continue" />
1199
+
1200
+ </div>
1201
+ </div>
1202
+ </div>
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+ <div id="mo2f-setup-settings-error-loading-area2" style="width: 900px; display: none;">
1209
+ <p class="mo2f-step-show"> Step 2 of 4</p>
1210
+
1211
+ <h4 style="text-align:center;font-size: xx-large;"> Register with miniOrange </h4>
1212
+
1213
+ <form name="f" id="mo2f_registration_form" method="post" action="">
1214
+ <input type="hidden" name="option" value="mo_wpns_register_customer" />
1215
+ <div class="mo2f_table_layout">
1216
+ <div style="margin-bottom:30px;">
1217
+ <div class="overlay_error" style="width:760px; display: none;" id= "mo2f_Error_block">
1218
+ <p class ="popup_text" id="mo2f_Error_message" style="color: red;" >Seems like email is already registered. Please click on 'Already have an account'</p></div>
1219
+ <p> Please enter a valid email id that you have access to and select a password</p>
1220
+ <table class="mo_wpns_settings_table">
1221
+ <tr>
1222
+ <td><b><font color="#FF0000">*</font>Email:</b></td>
1223
+ <td><input style="padding: 5px;" class="mo_wpns_table_textbox" type="email" id="mo2f_email" name="email"
1224
+ required placeholder="person@example.com" /></td>
1225
+ </tr>
1226
+
1227
+ <tr>
1228
+ <td><b><font color="#FF0000">*</font>Password:</b></td>
1229
+ <td><input style="padding: 5px;" class="mo_wpns_table_textbox" required id= "mo2f_password" type="password"
1230
+ name="password" placeholder="Choose your password (Min. length 6)" /></td>
1231
+ </tr>
1232
+ <tr>
1233
+ <td><b><font color="#FF0000">*</font>Confirm Password:</b></td>
1234
+ <td><input style="padding: 5px;" class="mo_wpns_table_textbox" id= "mo2f_confirmPassword" required type="password"
1235
+ name="confirmPassword" placeholder="Confirm your password" /></td>
1236
+ </tr>
1237
+ <tr>
1238
+ <td>&nbsp;</td>
1239
+ <td><br>
1240
+ <a href="#mo2f_account_exist">Already have an account?</a>
1241
+
1242
+ </tr>
1243
+ </table>
1244
+ </div>
1245
+ </div>
1246
+ </form>
1247
+ <form name="f" id="mo2f_login_form" style="display: none;" method="post" action="">
1248
+ <input type="hidden" name="option" value="mo_wpns_verify_customer" />
1249
+ <div class="mo2f_table_layout">
1250
+ <div style="margin-bottom:30px;">
1251
+ <div class="overlay_error" style="width:760px; display: none;" id= "mo2f_Error_block">
1252
+ <p class ="popup_text" id="mo2f_Error_message" style="color: red;" >Invalid Credentials</p></div>
1253
+
1254
+ <p>Please enter your miniOrange email and password. <a target="_blank" href="https://login.xecurify.com/moas/idp/resetpassword"> Click here if you forgot your password?</a></p>
1255
+ <table class="mo_wpns_settings_table">
1256
+ <tr>
1257
+ <td><b><font color="#FF0000">*</font>Email:</b></td>
1258
+ <td><input style="padding: 5px;" class="mo_wpns_table_textbox" type="email" id="mo2f_email_login" name="email"
1259
+ required placeholder="person@example.com" /></td>
1260
+ </tr>
1261
+ <tr>
1262
+ <td><b><font color="#FF0000">*</font>Password:</b></td>
1263
+ <td><input style="padding: 5px;" class="mo_wpns_table_textbox" required id= "mo2f_password_login" type="password"
1264
+ name="password" placeholder="Enter your miniOrange password" /></td>
1265
+ </tr>
1266
+ <tr>
1267
+ <td>&nbsp;</td>
1268
+ <td><br>
1269
+ <a href="#mo2f_register_new_account">Go Back to Registration Page</a>
1270
+
1271
+ </tr>
1272
+
1273
+ </table>
1274
+ </div>
1275
+ </div>
1276
+ </form>
1277
+
1278
+
1279
+ <br><a href="#skiptwofactor" style="color:#F4D03F ;font-weight:bold;margin-left:45%;"><?php echo __('Skip Setup', 'miniorange-2-factor-authentication'); ?></a>
1280
+ <br/>
1281
+
1282
+
1283
+ <div class="mo2f-setup-wizard-step-footer">
1284
+ <a href="#previousStep2"><span class="text-with-arrow text-with-arrow-left"><svg viewBox="0 0 448 512" role="img" class="icon" data-icon="long-arrow-alt-left" data-prefix="far" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="18"><path xmlns="http://www.w3.org/2000/svg" fill="currentColor" d="M107.515 150.971L8.485 250c-4.686 4.686-4.686 12.284 0 16.971L107.515 366c7.56 7.56 20.485 2.206 20.485-8.485v-71.03h308c6.627 0 12-5.373 12-12v-32c0-6.627-5.373-12-12-12H128v-71.03c0-10.69-12.926-16.044-20.485-8.484z"></path></svg> Previous Step </span></a>
1285
+ <div class="mo2f-setup-wizard-step-footer-buttons">
1286
+ <input type="button" name="mo2f_next_step2" id="mo2f_next_step2" class="mo2f-button mo2f-button-main" value="Create Account and continue" />
1287
+
1288
+ </div>
1289
+ </div>
1290
+
1291
+
1292
+ </div>
1293
+
1294
+ <div id="mo2f-setup-settings-error-loading-area3" style="width: 900px; display: none;">
1295
+ <p class="mo2f-step-show"> Step 3 of 4</p>
1296
+
1297
+ <h3 style="text-align:center;font-size: xx-large;" id="mo2f_setup_method_title"> Configure 2-factor authentication </h3>
1298
+
1299
+ <div class="overlay_success" style="width:760px; display: none;" id= "mo2f_success_block_configuration">
1300
+ <p class ="popup_text" id="mo2f_configure_success_message" >An OTP has been sent to the below email.</p>
1301
+ <br><br></div>
1302
+
1303
+ <div class="overlay_error" style="width:760px; display: none;" id= "mo2f_Error_block_configuration">
1304
+ <p class ="popup_text" id="mo2f_configure_Error_message" style="color: red;" >Invalid OTP</p>
1305
+ </div>
1306
+ <div id="mo2f_main_content"> </div>
1307
+
1308
+ <br><a href="#skiptwofactor" style="color:#F4D03F ;font-weight:bold;margin-left:45%;"><?php echo __('Skip Setup', 'miniorange-2-factor-authentication'); ?></a>
1309
+ <br/>
1310
+
1311
+
1312
+
1313
+ <div class="mo2f-setup-wizard-step-footer">
1314
+ <a href="#previousStep3"><span class="text-with-arrow text-with-arrow-left"><svg viewBox="0 0 448 512" role="img" class="icon" data-icon="long-arrow-alt-left" data-prefix="far" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="18"><path xmlns="http://www.w3.org/2000/svg" fill="currentColor" d="M107.515 150.971L8.485 250c-4.686 4.686-4.686 12.284 0 16.971L107.515 366c7.56 7.56 20.485 2.206 20.485-8.485v-71.03h308c6.627 0 12-5.373 12-12v-32c0-6.627-5.373-12-12-12H128v-71.03c0-10.69-12.926-16.044-20.485-8.484z"></path></svg> Previous Step </span></a>
1315
+ <div class="mo2f-setup-wizard-step-footer-buttons">
1316
+ <input type="button" name="mo2f_next_step3" id="mo2f_next_step3" class="mo2f-button mo2f-button-main" value="Save and Continue" />
1317
+
1318
+ </div>
1319
+ </div>
1320
+
1321
+
1322
+ </div>
1323
+
1324
+ <div id="mo2f-setup-settings-error-loading-area4" style="width: 900px; display: none;">
1325
+ <p class="mo2f-step-show"> Step 4 of 4</p>
1326
+ <div style="text-align: center;">
1327
+ <h3 style="text-align:center;font-size: xx-large;"> Congratulations! </h3>
1328
+ <br>
1329
+ You have successfully configured the two-factor authentication.
1330
+ <br><br><br>
1331
+ <input type="button" name="mo2f_next_step4" id="mo2f_next_step4" class="mo2f-button mo2f-button-main" value="Advance Settings" />
1332
+
1333
+ </div>
1334
+ </div>
1335
+
1336
+ </div>
1337
+
1338
+
1339
+ </div>
1340
+ </div>
1341
+
1342
+
1343
+
1344
+ <script type="text/javascript">
1345
+
1346
+ var selected_2FA_method = '';
1347
+ var ele = document.getElementsByName('mo2f_selected_2factor_method');
1348
+ for(i = 0; i < ele.length; i++) {
1349
+ if(ele[i].checked)
1350
+ selected_2FA_method = ele[i].value;
1351
+ }
1352
+ jQuery("#mo2f_setup_method_title").text(selected_2FA_method);
1353
+
1354
+ jQuery('#mo2f_next_step4').click(function(e){
1355
+ localStorage.setItem("last_tab", 'unlimittedUser_2fa');
1356
+ window.location.href = '<?php echo (admin_url()."admin.php?page=mo_2fa_two_fa"); ?>';
1357
+
1358
+ });
1359
+
1360
+
1361
+ jQuery('#mo2f_methods_setup_wizard').css('display', 'none');
1362
+ jQuery("#mo2f_get_started").click(function(e){
1363
+ jQuery('#mo2f-setup-settings-error-loading-area-container').css('display', 'none');
1364
+ jQuery('#mo2f_methods_setup_wizard').css('display', 'block');
1365
+
1366
+ });
1367
+
1368
+ jQuery('a[href="#previousStep3"]').click(function(e){
1369
+ document.getElementById('mo2f_success_block_configuration').style.display = "none";
1370
+ document.getElementById('mo2f_Error_block_configuration').style.display = "none";
1371
+
1372
+ var selected_2FA_method = '';
1373
+ var ele = document.getElementsByName('mo2f_selected_2factor_method');
1374
+ for(i = 0; i < ele.length; i++) {
1375
+ if(ele[i].checked)
1376
+ selected_2FA_method = ele[i].value;
1377
+ }
1378
+ if(selected_2FA_method =='OTP Over SMS')
1379
+ {
1380
+ document.getElementById('mo2f-setup-settings-error-loading-area3').style.display = "none";
1381
+ document.getElementById('mo2f-setup-settings-error-loading-area2').style.display = "block";
1382
+ var lineElement = document.getElementById("mo2f-setup-wizard-line2");
1383
+ lineElement.classList.remove("mo2f-setup-wizard-timeline-line-active");
1384
+ var stepElement = document.getElementById("mo2f-setup-wizard-step3");
1385
+ stepElement.classList.remove("mo2f-setup-wizard-timeline-step-active");
1386
+ }
1387
+ else
1388
+ {
1389
+ var lineElement = document.getElementById("mo2f-setup-wizard-line2");
1390
+ lineElement.classList.remove("mo2f-setup-wizard-timeline-line-active");
1391
+ var stepElement = document.getElementById("mo2f-setup-wizard-step3");
1392
+ stepElement.classList.remove("mo2f-setup-wizard-timeline-step-active");
1393
+ var lineElement = document.getElementById("mo2f-setup-wizard-line1");
1394
+ lineElement.classList.remove("mo2f-setup-wizard-timeline-line-active");
1395
+ var stepElement = document.getElementById("mo2f-setup-wizard-step2");
1396
+ stepElement.classList.remove("mo2f-setup-wizard-timeline-step-active");
1397
+ document.getElementById('mo2f-setup-settings-error-loading-area3').style.display = "none";
1398
+ document.getElementById('mo2f-setup-settings-error-loading-area1').style.display = "block";
1399
+
1400
+ }
1401
+ });
1402
+
1403
+ jQuery('a[href="#previousStep2"]').click(function(e){
1404
+ document.getElementById('mo2f-setup-settings-error-loading-area2').style.display = "none";
1405
+ document.getElementById('mo2f-setup-settings-error-loading-area1').style.display = "block";
1406
+ var lineElement = document.getElementById("mo2f-setup-wizard-line1");
1407
+ lineElement.classList.remove("mo2f-setup-wizard-timeline-line-active");
1408
+ var stepElement = document.getElementById("mo2f-setup-wizard-step2");
1409
+ stepElement.classList.remove("mo2f-setup-wizard-timeline-step-active");
1410
+
1411
+ });
1412
+
1413
+ jQuery('a[href="#previousStep1"]').click(function(e){
1414
+ jQuery('#mo2f-setup-settings-error-loading-area-container').css('display', 'block');
1415
+ jQuery('#mo2f_methods_setup_wizard').css('display', 'none');
1416
+
1417
+ });
1418
+
1419
+ jQuery('a[href=\"#mo2f_account_exist\"]').click(function (e) {
1420
+ document.getElementById('mo2f_registration_form').style.display = "none";
1421
+ document.getElementById('mo2f_login_form').style.display = "block";
1422
+ document.getElementById('mo2f_next_step2').value = 'Login and Continue';
1423
+ });
1424
+
1425
+ jQuery('a[href=\"#mo2f_register_new_account\"]').click(function (e) {
1426
+ document.getElementById('mo2f_registration_form').style.display = "block";
1427
+ document.getElementById('mo2f_login_form').style.display = "none";
1428
+ document.getElementById('mo2f_next_step2').value = 'Create Account and Continue';
1429
+ });
1430
+
1431
+ jQuery('#mo2f_next_step3').click(function(e){
1432
+ document.getElementById('mo2f_loader').style.display = "block";
1433
+ document.getElementById('mo2f_success_block_configuration').style.display = "none";
1434
+ document.getElementById('mo2f_Error_block_configuration').style.display = "none";
1435
+ document.getElementById('mo2f-setup-wizard-settings-area').className = ' overlay';
1436
+
1437
+ var selected_2FA_method = '';
1438
+ var ele = document.getElementsByName('mo2f_selected_2factor_method');
1439
+ for(i = 0; i < ele.length; i++) {
1440
+ if(ele[i].checked)
1441
+ selected_2FA_method = ele[i].value;
1442
+ }
1443
+ var data ='';
1444
+ if(selected_2FA_method == 'Google Authenticator')
1445
+ {
1446
+ data= { 'action':'mo_two_factor_ajax',
1447
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_verify_GA_setup_wizard',
1448
+ 'mo2f_google_auth_code' : jQuery('#mo2f_google_auth_code').val(),
1449
+ 'mo2f_session_id' : jQuery('#mo2f_session_id').val()
1450
+ };
1451
+
1452
+ }
1453
+ else if (selected_2FA_method =='OTP Over SMS')
1454
+ {
1455
+ data= { 'action':'mo_two_factor_ajax',
1456
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_verify_OTPOverSMS_setup_wizard',
1457
+ 'mo2f_otp_token' : jQuery('#mo2f_otp_token').val()
1458
+ };
1459
+
1460
+ }
1461
+ else if(selected_2FA_method == 'OTP Over Email')
1462
+ {
1463
+ data= { 'action':'mo_two_factor_ajax',
1464
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_verify_OTPOverEmail_setup_wizard',
1465
+ 'mo2f_otp_token' : jQuery('#mo2f_otp_token').val()
1466
+ };
1467
+
1468
+ }
1469
+ else if(selected_2FA_method == 'Security Questions')
1470
+ {
1471
+ data= { 'action':'mo_two_factor_ajax',
1472
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_verify_KBA_setup_wizard',
1473
+ 'mo2f_kbaquestion_1' : jQuery('#mo2f_kbaquestion_1').val(),
1474
+ 'mo2f_kbaquestion_2' : jQuery('#mo2f_kbaquestion_2').val(),
1475
+ 'mo2f_kbaquestion_3' : jQuery('#mo2f_kbaquestion_3').val(),
1476
+ 'mo2f_kba_ans1' : jQuery('#mo2f_kba_ans1').val(),
1477
+ 'mo2f_kba_ans2' : jQuery('#mo2f_kba_ans2').val(),
1478
+ 'mo2f_kba_ans3' : jQuery('#mo2f_kba_ans3').val()
1479
+ };
1480
+
1481
+ }
1482
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1483
+ jQuery.post(ajax_url, data, function(response){
1484
+ document.getElementById('mo2f_loader').style.display = "none";
1485
+ document.getElementById('mo2f-setup-wizard-settings-area').classList.remove('overlay');
1486
+
1487
+ if(response =='SUCCESS')
1488
+ {
1489
+ var lineElement = document.getElementById("mo2f-setup-wizard-line3");
1490
+ lineElement.className += " mo2f-setup-wizard-timeline-line-active";
1491
+ var stepElement = document.getElementById("mo2f-setup-wizard-step4");
1492
+ stepElement.className += " mo2f-setup-wizard-timeline-step-active";
1493
+ document.getElementById('mo2f-setup-settings-error-loading-area3').style.display = "none";
1494
+ jQuery('#mo2f-setup-settings-error-loading-area4').css('display','block');
1495
+
1496
+ }
1497
+ else
1498
+ {
1499
+ document.getElementById('mo2f_configure_Error_message').innerHTML = response;
1500
+ document.getElementById('mo2f_Error_block_configuration').style.display = "block";
1501
+ }
1502
+ });
1503
+
1504
+ });
1505
+
1506
+ jQuery("#mo2f_next_step2").click(function(e){
1507
+ document.getElementById('mo2f-setup-wizard-settings-area').className = ' overlay';
1508
+ document.getElementById('mo2f_loader').style.display = "block";
1509
+ document.getElementById('mo2f_Error_block').style.display = "none";
1510
+ document.getElementById('mo2f_next_step2').disabled = true;
1511
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1512
+ var email = jQuery("#mo2f_email").val();
1513
+ var password = jQuery("#mo2f_password").val();
1514
+ if(jQuery("#mo2f_next_step2").val() == 'Login and Continue')
1515
+ {
1516
+ email = jQuery("#mo2f_email_login").val();
1517
+ password = jQuery("#mo2f_password_login").val();
1518
+ }
1519
+ var data= { 'action':'mo_two_factor_ajax',
1520
+ 'mo_2f_two_factor_ajax' : 'mo_wpns_register_verify_customer',
1521
+ 'email': email,
1522
+ 'password':password,
1523
+ 'confirmPassword' : jQuery("#mo2f_confirmPassword").val(),
1524
+ 'Login and Continue' : jQuery("#mo2f_next_step2").val()
1525
+ };
1526
+
1527
+ jQuery.post(ajax_url, data, function(response){
1528
+ document.getElementById('mo2f-setup-wizard-settings-area').classList.remove('overlay');
1529
+
1530
+ document.getElementById('mo2f_next_step2').disabled = false;
1531
+ if(response == 'SUCCESS')
1532
+ {
1533
+ var lineElement = document.getElementById("mo2f-setup-wizard-line2");
1534
+ lineElement.className += " mo2f-setup-wizard-timeline-line-active";
1535
+ var stepElement = document.getElementById("mo2f-setup-wizard-step3");
1536
+ stepElement.className += " mo2f-setup-wizard-timeline-step-active";
1537
+ document.getElementById('mo2f-setup-settings-error-loading-area2').style.display = "none";
1538
+ jQuery('#mo2f-setup-settings-error-loading-area3').css('display','block');
1539
+
1540
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1541
+ var data= { 'action':'mo_two_factor_ajax',
1542
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_configure_OTPOverSMS_setup_wizard'
1543
+ };
1544
+ jQuery.post(ajax_url, data, function(response){
1545
+
1546
+ document.getElementById('mo2f_loader').style.display = "none";
1547
+ document.getElementById('mo2f_main_content').innerHTML = response;
1548
+ jQuery("#phone").intlTelInput();
1549
+
1550
+ jQuery('#mo2f_send_otp').click(function(e){
1551
+ document.getElementById('mo2f_loader').style.display = "block";
1552
+ document.getElementById('mo2f-setup-wizard-settings-area').className = ' overlay';
1553
+
1554
+ document.getElementById('mo2f_success_block_configuration').style.display = "none";
1555
+ document.getElementById('mo2f_Error_block_configuration').style.display = "none";
1556
+
1557
+ var data = { 'action':'mo_two_factor_ajax',
1558
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_send_otp_token',
1559
+ 'phone' : jQuery('#phone').val(),
1560
+ 'selected_2FA_method' : 'SMS'
1561
+ };
1562
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1563
+ jQuery.post(ajax_url, data, function(response){
1564
+ document.getElementById('mo2f_loader').style.display = "none";
1565
+ document.getElementById('mo2f-setup-wizard-settings-area').classList.remove('overlay');
1566
+
1567
+ if(response == 'SUCCESS')
1568
+ {
1569
+ $message = 'An OTP has been sent to the below phone number. Please enter the OTP to set the 2FA';
1570
+ document.getElementById('mo2f_configure_success_message').innerHTML = $message;
1571
+ document.getElementById('mo2f_success_block_configuration').style.display = "block";
1572
+
1573
+ }
1574
+ else
1575
+ {
1576
+ document.getElementById('mo2f_configure_Error_message').innerHTML = response;
1577
+ document.getElementById('mo2f_Error_block_configuration').style.display = "block";
1578
+
1579
+ }
1580
+ });
1581
+
1582
+ });
1583
+
1584
+ });
1585
+ }
1586
+ else
1587
+ {
1588
+ document.getElementById('mo2f_loader').style.display = "none";
1589
+ document.getElementById('mo2f_Error_message').innerHTML = response;
1590
+ document.getElementById('mo2f_Error_block').style.display = "block";
1591
+ }
1592
+
1593
+ });
1594
+
1595
+ });
1596
+
1597
+ jQuery("#mo2f_next_step1").click(function(e){
1598
+ var ele = document.getElementsByName('mo2f_selected_2factor_method');
1599
+ var selected_2FA_method = '';
1600
+ for(i = 0; i < ele.length; i++) {
1601
+ if(ele[i].checked)
1602
+ selected_2FA_method = ele[i].value;
1603
+ }
1604
+ var configMessage = 'Configure '+selected_2FA_method;
1605
+ jQuery("#mo2f_setup_method_title").text(configMessage);
1606
+
1607
+ if(selected_2FA_method == '')
1608
+ {
1609
+ return '';
1610
+ }
1611
+
1612
+
1613
+
1614
+ document.getElementById('mo2f-setup-settings-error-loading-area1').style.display = "none";
1615
+ var lineElement = document.getElementById("mo2f-setup-wizard-line1");
1616
+ lineElement.className += " mo2f-setup-wizard-timeline-line-active";
1617
+ var stepElement = document.getElementById("mo2f-setup-wizard-step2");
1618
+ stepElement.className += " mo2f-setup-wizard-timeline-step-active";
1619
+
1620
+ if(selected_2FA_method !="OTP Over SMS" && selected_2FA_method != '')
1621
+ {
1622
+ var lineElement = document.getElementById("mo2f-setup-wizard-line2");
1623
+ lineElement.className += " mo2f-setup-wizard-timeline-line-active";
1624
+ var stepElement = document.getElementById("mo2f-setup-wizard-step3");
1625
+ stepElement.className += " mo2f-setup-wizard-timeline-step-active";
1626
+ jQuery('#mo2f-setup-settings-error-loading-area3').css('display','block');
1627
+
1628
+ document.getElementById('mo2f_loader').style.display = "block";
1629
+
1630
+ var mo2f_setup_call = "";
1631
+ if(selected_2FA_method == "Google Authenticator")
1632
+ {
1633
+ mo2f_setup_call = "mo_2fa_configure_GA_setup_wizard";
1634
+ }
1635
+ else if(selected_2FA_method =="OTP Over Email")
1636
+ {
1637
+ mo2f_setup_call ="mo_2fa_configure_OTPOverEmail_setup_wizard";
1638
+ }
1639
+ else if (selected_2FA_method == "Security Questions")
1640
+ {
1641
+ mo2f_setup_call = "mo_2fa_configure_KBA_setup_wizard";
1642
+ }
1643
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1644
+ var data= { 'action':'mo_two_factor_ajax',
1645
+ 'mo_2f_two_factor_ajax' : mo2f_setup_call
1646
+ };
1647
+ jQuery.post(ajax_url, data, function(response){
1648
+ document.getElementById('mo2f_loader').style.display = "none";
1649
+ document.getElementById('mo2f_main_content').innerHTML = response;
1650
+
1651
+ if(selected_2FA_method == 'Google Authenticator')
1652
+ {
1653
+ jQuery('.mo2f_gauth').qrcode({
1654
+ 'render': 'image',
1655
+ size: 175,
1656
+ 'text': jQuery('.mo2f_gauth').data('qrcode')
1657
+ });
1658
+ jQuery('a[href="#mo2f_scanbarcode_a"]').click(function(e){
1659
+ var element = document.getElementById('mo2f_scanbarcode_a');
1660
+ if(element.style.display === 'none')
1661
+ element.style.display = 'block';
1662
+
1663
+ else
1664
+ element.style.display = "none";
1665
+ });
1666
+
1667
+ }
1668
+ else if(selected_2FA_method =='OTP Over Email')
1669
+ {
1670
+ jQuery('#mo2f_send_otp').click(function(e){
1671
+ document.getElementById('mo2f_loader').style.display = "block";
1672
+ document.getElementById('mo2f-setup-wizard-settings-area').className = ' overlay';
1673
+
1674
+ document.getElementById('mo2f_success_block_configuration').style.display = "none";
1675
+ document.getElementById('mo2f_Error_block_configuration').style.display = "none";
1676
+
1677
+ var data = { 'action':'mo_two_factor_ajax',
1678
+ 'mo_2f_two_factor_ajax' : 'mo_2fa_send_otp_token',
1679
+ 'phone' : jQuery('#phone').val(),
1680
+ 'mo2f_session_id' : jQuery('#mo2f_session_id').val(),
1681
+ 'selected_2FA_method' : 'OTP Over Email'
1682
+ };
1683
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1684
+ jQuery.post(ajax_url, data, function(response){
1685
+ document.getElementById('mo2f_loader').style.display = "none";
1686
+ document.getElementById('mo2f-setup-wizard-settings-area').classList.remove('overlay');
1687
+
1688
+ if(response == 'SUCCESS')
1689
+ {
1690
+ $message = 'An OTP has been sent to the below email please enter the OTP to set the 2FA';
1691
+ document.getElementById('mo2f_configure_success_message').innerHTML = $message;
1692
+ document.getElementById('mo2f_success_block_configuration').style.display = "block";
1693
+
1694
+ }
1695
+ else
1696
+ {
1697
+ document.getElementById('mo2f_configure_Error_message').innerHTML = response;
1698
+ document.getElementById('mo2f_Error_block_configuration').style.display = "block";
1699
+
1700
+ }
1701
+ });
1702
+
1703
+ });
1704
+ }
1705
+ else if (selected_2FA_method =='Security Questions')
1706
+ {
1707
+
1708
+ var mo_option_to_hide1;
1709
+ //hidden element in dropdown list 2
1710
+ var mo_option_to_hide2;
1711
+
1712
+ jQuery('#mo2f_kbaquestion_1').change(function(){
1713
+ list = 1;
1714
+ var list_selected = document.getElementById("mo2f_kbaquestion_" + list).selectedIndex;
1715
+ //if an element is currently hidden, unhide it
1716
+ if (typeof (mo_option_to_hide1) != "undefined" && mo_option_to_hide1 !== null && list == 2) {
1717
+ mo_option_to_hide1.style.display = 'block';
1718
+ } else if (typeof (mo_option_to_hide2) != "undefined" && mo_option_to_hide2 !== null && list == 1) {
1719
+ mo_option_to_hide2.style.display = 'block';
1720
+ }
1721
+ //select the element to hide and then hide it
1722
+ if (list == 1) {
1723
+ if (list_selected != 0) {
1724
+ mo_option_to_hide2 = document.getElementById("mq" + list_selected + "_2");
1725
+ mo_option_to_hide2.style.display = 'none';
1726
+ }
1727
+ }
1728
+ });
1729
+ jQuery('#mo2f_kbaquestion_2').change(function(){
1730
+ list = 2;
1731
+ var list_selected = document.getElementById("mo2f_kbaquestion_" + list).selectedIndex;
1732
+ //if an element is currently hidden, unhide it
1733
+ if (typeof (mo_option_to_hide1) != "undefined" && mo_option_to_hide1 !== null && list == 2) {
1734
+ mo_option_to_hide1.style.display = 'block';
1735
+ } else if (typeof (mo_option_to_hide2) != "undefined" && mo_option_to_hide2 !== null && list == 1) {
1736
+ mo_option_to_hide2.style.display = 'block';
1737
+ }
1738
+ //select the element to hide and then hide it
1739
+ if (list == 2) {
1740
+ if (list_selected != 0) {
1741
+ mo_option_to_hide1 = document.getElementById("mq" + list_selected + "_1");
1742
+ mo_option_to_hide1.style.display = 'none';
1743
+ }
1744
+ }
1745
+ });
1746
+
1747
+ }
1748
+ });
1749
+
1750
+
1751
+ }
1752
+ else if(selected_2FA_method == 'OTP Over SMS')
1753
+ {
1754
+ jQuery('#mo2f-setup-settings-error-loading-area2').css('display','block');
1755
+ }
1756
+
1757
+
1758
+ });
1759
+ jQuery('input:radio[name=mo2f_selected_2factor_method]').click(function() {
1760
+
1761
+
1762
+ localStorage.setItem("last_tab", 'setup_2fa');
1763
+ var selectedMethod = jQuery(this).val();
1764
+ var ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
1765
+ var nonce = "<?php echo wp_create_nonce( 'miniorange-select-method-setup-wizard' ); ?>";
1766
+
1767
+ if(selectedMethod == 'Duo Authenticator' || selectedMethod =='OTP Over Telegram')
1768
+ {
1769
+ var data= { 'action':'mo_two_factor_ajax',
1770
+ 'mo_2f_two_factor_ajax' : 'select_method_setup_wizard',
1771
+ 'mo2f_method': selectedMethod,
1772
+ 'nonce': nonce };
1773
+
1774
+ jQuery.post(ajax_url, data, function(response){
1775
+ window.location.href = '<?php echo (admin_url()."admin.php?page=mo_2fa_two_fa"); ?>';
1776
+ });
1777
+ }
1778
+
1779
+ });
1780
+
1781
+ jQuery('a[href="#skiptwofactor"]').click(function(e){
1782
+ localStorage.setItem("last_tab", 'setup_2fa');
1783
+ window.location.href = '<?php echo (admin_url()."admin.php?page=mo_2fa_two_fa"); ?>';
1784
+ });
1785
+
1786
+
1787
+ </script>
1788
+ <?php
1789
+ }
1790
+
1791
+ /**
1792
+ * Attempt to catch the js error preventing the Vue app from loading and displaying that message for better support.
1793
+ *
1794
+ * @since 2.6.0
1795
+ */
1796
+ private function settings_inline_js() {
1797
+ ?>
1798
+ <script type="text/javascript">
1799
+ window.onerror = function myErrorHandler( errorMsg, url, lineNumber ) {
1800
+ /* Don't try to put error in container that no longer exists post-vue loading */
1801
+ var message_container = document.getElementById( 'mo2f-setup-nojs-error-message' );
1802
+ if ( ! message_container ) {
1803
+ return false;
1804
+ }
1805
+ var message = document.getElementById( 'mo2f-setup-alert-message' );
1806
+ message.innerHTML = errorMsg;
1807
+ message_container.style.display = 'block';
1808
+ return false;
1809
+ }
1810
+ </script>
1811
+ <?php
1812
+ }
1813
+
1814
+
1815
+ public function setup_wizard_content() {
1816
+ $admin_url = is_network_admin() ? network_admin_url() : admin_url();
1817
+
1818
+ $this->settings_error_page( 'mo2f-setup-vue-setup-wizard', '<a href="' . $admin_url . '">' . esc_html__( 'Go back to the Dashboard', 'mo2f-setup' ) . '</a>' );
1819
+ $this->settings_inline_js();
1820
+ }
1821
+
1822
+ /**
1823
+ * Outputs the simplified footer used for the Setup Wizard.
1824
+ *
1825
+ * @since 2.6.0
1826
+ */
1827
+ public function setup_wizard_footer() {
1828
+ ?>
1829
+ <?php wp_print_scripts( 'mo2f-setup-vue-script' ); ?>
1830
+ </body>
1831
+ </html>
1832
+ <?php
1833
+ }
1834
+
1835
 
1836
  function miniorange_auth_save_settings() {
1837
  if (get_site_option('mo2f_plugin_redirect')) {
1838
  delete_site_option('mo2f_plugin_redirect');
1839
+
1840
+ do_action( 'mo2f_admin_setup_wizard_load_setup_wizard_before', $this );
1841
+ wp_enqueue_script('jquery');
1842
+ wp_enqueue_script('wp-mo2f-setup-wizard',plugins_url( 'includes/js/setup-wizard-2fa.js', dirname(dirname(__FILE__))));
1843
+
1844
+ wp_localize_script(
1845
+ 'wp-mo2f-setup-wizard',
1846
+ 'mo2f_setup_wizard',[
1847
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
1848
+ 'plugin_url' => get_site_option('siteurl'),
1849
+ 'nonce' => wp_create_nonce( 'mo2f-setup-wizard-nonce' )]
1850
+ );
1851
+ $this->setup_wizard_header();
1852
+ $this->setup_wizard_content();
1853
+ $this->setup_wizard_footer();
1854
  exit;
1855
  }
1856
  if ( array_key_exists( 'page', $_REQUEST ) && $_REQUEST['page'] == 'mo_2fa_two_fa' ) {
1857
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
1858
+ if(session_status() != PHP_SESSION_DISABLED )
1859
  session_start();
1860
  }
1861
  }
2050
  }
2051
  }
2052
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2053
  }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_verify_customer" ) { //register the admin to miniOrange if already exist
2054
 
2055
  $nonce = $_POST['miniorange_verify_customer_nonce'];
2470
  $Mo2fdbQueries->database_table_issue();
2471
 
2472
  }
2473
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
2474
+ $nonce = $_POST['mo2f_registration_closed_nonce'];
2475
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
2476
+ $error = new WP_Error();
2477
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2478
+ return $error;
2479
+ } else {
2480
+ delete_user_meta( $user->ID, 'register_account_popup' );
2481
+ $mo2f_message = 'Please set up the second-factor by clicking on Configure button.';
2482
+ update_option( 'mo2f_message', $mo2f_message );
2483
+ $this->mo_auth_show_success_message();
2484
+ }
2485
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo2f_goto_verifycustomer" ) {
2486
+ $nonce = $_POST['mo2f_goto_verifycustomer_nonce'];
2487
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-goto-verifycustomer-nonce' ) ) {
2488
+ $error = new WP_Error();
2489
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2490
+ return $error;
2491
+ } else {
2492
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
2493
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_YOUR_EMAIL_PASSWORD" ) );
2494
+ update_option('mo_2factor_user_registration_status','MO_2_FACTOR_VERIFY_CUSTOMER');
2495
+ }
2496
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_2factor_gobackto_registration_page' ) { //back to registration page for admin
2497
+ $nonce = $_POST['mo_2factor_gobackto_registration_page_nonce'];
2498
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-gobackto-registration-page-nonce' ) ) {
2499
+ $error = new WP_Error();
2500
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2501
+ return $error;
2502
+ } else {
2503
+ delete_option( 'mo2f_email' );
2504
+ delete_option( 'mo2f_password' );
2505
+ update_option( 'mo2f_message', "" );
2506
+
2507
+ MO2f_Utility::unset_session_variables( 'mo2f_transactionId' );
2508
+ delete_option( 'mo2f_transactionId' );
2509
+ delete_user_meta( $user->ID, 'mo2f_sms_otp_count' );
2510
+ delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
2511
+ delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
2512
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'REGISTRATION_STARTED' ) );
2513
+ }
2514
+
2515
  }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_skip_feedback' ) {
2516
 
2517
  $nonce = $_POST['mo2f_skip_feedback_nonce'];
2639
  MO2f_Utility::unset_session_variables( $session_variables );
2640
 
2641
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2642
+ $TwoFA_method_to_configure = sanitize_text_field($_POST['mo2f_method']);
2643
  $enduser = new Two_Factor_Setup();
2644
  $current_method = MO2f_Utility::mo2f_decode_2_factor( $TwoFA_method_to_configure, "server" );
2645
 
2887
  }
2888
  }
2889
  }
2890
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2891
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_otp_over_Telegram' ) { //validate otp over Telegram
2892
 
2893
  $nonce = $_POST['mo2f_validate_otp_over_Telegram_nonce'];
3165
 
3166
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //Google OTP validated
3167
 
3168
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
3169
+ delete_user_meta( $user->ID, 'configure_2FA');
3170
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => 'OTP Over Email','mo2f_OTPOverEmail_config_status'=>true ) );
 
 
 
 
 
3171
  delete_user_meta( $user->ID, 'test_2FA' );
3172
  $this->mo_auth_show_success_message();
3173
 
3536
  }
3537
  }
3538
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3539
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Telegram_send_otp' ) { // sendin otp for configuring OTP over Telegram
3540
 
3541
  $nonce = $_POST['mo2f_configure_otp_over_Telegram_send_otp_nonce'];
3661
  }
3662
  }
3663
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3664
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_Telegram_validate' ) {
3665
  $nonce = $_POST['mo2f_configure_otp_over_Telegram_validate_nonce'];
3666
 
3964
  }
3965
 
3966
  }else if ( ( isset( $_POST['option'] ) && sanitize_text_field($_POST['option']) == 'mo2f_save_free_plan_auth_methods' ) ) {// user clicks on Set 2-Factor method
3967
+
3968
  $nonce = sanitize_text_field($_POST['miniorange_save_form_auth_methods_nonce']);
3969
  if ( ! wp_verify_nonce( $nonce, 'miniorange-save-form-auth-methods-nonce' ) ) {
3970
  $error = new WP_Error();
3989
  }
3990
  $selected_2FA_method = MO2f_Utility::mo2f_decode_2_factor( isset( $_POST['mo2f_configured_2FA_method_free_plan'] ) ? $_POST['mo2f_configured_2FA_method_free_plan'] : $_POST['mo2f_selected_action_standard_plan'], "wpdb" );
3991
  $selected_2FA_method = sanitize_text_field($selected_2FA_method);
3992
+ $onprem_methods = array('Google Authenticator','Security Questions','OTPOverTelegram','DuoAuthenticator');
3993
  $Mo2fdbQueries->insert_user( $user->ID );
3994
  if(MO2F_IS_ONPREM && ! in_array($selected_2FA_method, $onprem_methods) ){
3995
  foreach ($cloud_methods as $cloud_method) {
4069
  $selected_2FA_method = 'OTP Over SMS';
4070
  if($selected_2FA_method == 'OTPOverTelegram')
4071
  $selected_2FA_method = 'OTP Over Telegram';
4072
+ if($selected_2FA_method == 'DuoAuthenticator')
4073
+ $selected_2FA_method = 'Duo Authenticator';
 
 
4074
  }
4075
+ if(MO2F_IS_ONPREM and ($selected_2FA_method =='Google Authenticator' or $selected_2FA_method == 'Security Questions' or $selected_2FA_method =='OTP Over Email' or $selected_2FA_method == 'Email Verification' or $selected_2FA_method == 'OTP Over Telegram' or $selected_2FA_method == 'Duo Authenticator' ))
 
4076
  $is_customer_registered = 1;
4077
 
4078
  if ( $is_customer_registered ) {
4089
  $enduser = new Customer_Setup();
4090
  if($selected_2FA_method == 'OTPOverTelegram')
4091
  $selected_2FA_method = 'OTP Over Telegram';
4092
+ if($selected_2FA_method == 'DuoAuthenticator')
4093
+ $selected_2FA_method = 'Duo Authenticator';
 
 
4094
  if ( $selected_action == "select2factor" ) {
4095
 
4096
  if ( $selected_2FA_method == 'OTP Over SMS' && $user_phone == 'false' ) {
4180
  } else {
4181
  update_option( 'mo2f_enable_2fa', isset( $_POST['mo2f_enable_2fa'] ) ? $_POST['mo2f_enable_2fa'] : 0 );
4182
  }
 
 
 
 
 
 
 
 
 
 
 
 
4183
  }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo_2factor_test_authentication_method' ) {
4184
  //network security feature
4185
  $nonce = $_POST['mo_2factor_test_authentication_method_nonce'];
4260
  $this->mo_auth_show_error_message();
4261
 
4262
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4263
  }
4264
  else if($selected_2FA_method =='OTP Over Telegram')
4265
  {
4424
  delete_user_meta( $user->ID, 'configure_2FA' );
4425
 
4426
  }
4427
+ }
4428
+ else if(isset($_POST['option']) && $_POST['option'] == 'mo2f_reset_duo_configuration'){
4429
+ $nonce = sanitize_text_field($_POST['mo2f_duo_reset_configuration_nonce']);
4430
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-duo-reset-configuration-nonce' ) ) {
4431
+ $error = new WP_Error();
4432
+ $error->add('empty_username', '<strong>'. __('ERROR','miniorange-2-factor-authentication') .'</strong>: '. __('Invalid Request.', 'miniorange-2-factor-authentication'));
4433
+ return $error;
4434
+ }else{
4435
+ delete_site_option('duo_credentials_save_successfully');
4436
+ delete_user_meta($user->ID,'user_not_enroll');
4437
+ delete_site_option('mo2f_d_integration_key');
4438
+ delete_site_option('mo2f_d_secret_key');
4439
+ delete_site_option('mo2f_d_api_hostname');
4440
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate("RESET_DUO_CONFIGURATON"));
4441
+ $this->mo_auth_show_success_message();
4442
+ }
4443
  }
4444
 
4445
  else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_2factor_generate_backup_codes' ) {
4449
  $error->add('empty_username', '<strong>'. __('ERROR','miniorange-2-factor-authentication') .'</strong>: '. __('Invalid Request.', 'miniorange-2-factor-authentication'));
4450
  return $error;
4451
  }else {
4452
+ $codes = MO2f_Utility::mo2f_mail_and_download_codes();
4453
+
4454
+ if($codes == 'LimitReached' || $codes == 'UserLimitReached' || $codes == 'AllUsed' || $codes == 'invalid_request'){
4455
+ $id = get_current_user_id();
4456
+ update_user_meta($id, 'mo_backup_code_generated', 1);
4457
+ update_user_meta($id, 'mo_backup_code_downloaded', 1);
4458
+ if($codes == 'AllUsed'){
4459
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate("USED_ALL_BACKUP_CODES"));
4460
+ }else if($codes == 'LimitReached'){
4461
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate("BACKUP_CODE_LIMIT_REACH"));
4462
+ }else if($codes == 'UserLimitReached'){
4463
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate("BACKUP_CODE_DOMAIN_LIMIT_REACH"));
4464
+ }else if($codes == 'invalid_request'){
4465
+ update_user_meta($id, 'mo_backup_code_generated', 0);
4466
+ update_user_meta($id, 'mo_backup_code_downloaded', 0);
4467
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate("BACKUP_CODE_INVALID_REQUEST"));
4468
+ }
4469
+ $this->mo_auth_show_error_message();
4470
+ }
4471
  }
4472
  }
4473
 
4509
  <!-- Modal content -->
4510
  <div class="modal-content">
4511
  <div class="modal-header">
4512
+ <h3 class="modal-title" style="text-align: center; font-size: 20px; color: #2271b1">Email Address for miniOrange</h3><span id="closeEnterEmailCloud" class="modal-span-close">X</span>
4513
  </div>
4514
  <div class="modal-body" style="height: auto">
4515
  <h2><i>Enter your Email:&nbsp;&nbsp;&nbsp; <input type ='email' id='emailEnteredCloud' name='emailEnteredCloud' size= '40' required value="<?php echo $email;?>"/></i></h2>
4516
  </div>
4517
  <div class="modal-footer">
4518
+ <button type="button" class="button button-primary button-large modal-button" id="save_entered_email_cloud">Save</button>
4519
  </div>
4520
  </div>
4521
  </div>
4901
  $url = get_site_option('siteurl').'/wp-login.php?'; //login page can change
4902
  $message = '<table cellpadding="25" style="margin:0px auto">
4903
  <tbody>
4904
+ <td>
4905
  <td>
4906
  <table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
4907
  <tbody>
4908
+ <td>
4909
  <td><img src="https://ci5.googleusercontent.com/proxy/10EQeM1udyBOkfD2dwxGhIaMXV4lOwCRtUecpsDkZISL0JIkOL2JhaYhVp54q6Sk656rW2rpAFJFEgGQiAOVcYIIKxXYMHHMNSNB=s0-d-e1-ft#https://login.xecurify.com/moas/images/xecurify-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px" class="CToWUd"></td>
4910
  </tr>
4911
  </tbody>
4912
  </table>
4913
  <table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
4914
  <tbody>
4915
+ <td>
4916
  <td>
4917
  <p style="margin-top:0;margin-bottom:20px">Dear Customers,</p>
4918
  <p style="margin-top:0;margin-bottom:10px">You initiated a transaction <b>WordPress 2 Factor Authentication Plugin</b>:</p>
4993
  $headers[] = 'Cc: 2fasupport <2fasupport@xecurify.com>';
4994
  $message = '<table cellpadding="25" style="margin:0px auto">
4995
  <tbody>
4996
+ <td>
4997
  <td>
4998
  <table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
4999
  <tbody>
5000
+ <td>
5001
  <td><img src="https://ci5.googleusercontent.com/proxy/10EQeM1udyBOkfD2dwxGhIaMXV4lOwCRtUecpsDkZISL0JIkOL2JhaYhVp54q6Sk656rW2rpAFJFEgGQiAOVcYIIKxXYMHHMNSNB=s0-d-e1-ft#https://login.xecurify.com/moas/images/xecurify-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px" class="CToWUd"></td>
5002
  </tr>
5003
  </tbody>
5004
  </table>
5005
  <table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
5006
  <tbody>
5007
+ <td>
5008
  <td>
5009
  <p style="margin-top:0;margin-bottom:20px">Dear Customer,</p>
5010
  <p style="margin-top:0;margin-bottom:20px"> You are going to exhaust all your '.$string.'. You have only <b>'.$count.'</b> '.$string.' remaining. You can recharge or add '.$string.' to your account: <a href='.MoWpnsConstants::rechargeLink.'>Recharge</a></p>
handler/twofa/two_fa_utility.php CHANGED
@@ -233,13 +233,51 @@ class MO2f_Utility {
233
 
234
  public static function mo2f_set_transient( $session_id, $key, $value, $expiration = 300 ) {
235
  set_transient($session_id.$key, $value, $expiration);
236
- }
237
-
 
 
 
 
 
 
 
 
238
  public static function mo2f_get_transient( $session_id, $key) {
239
- $transient_value = get_transient($session_id.$key);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  return $transient_value;
 
 
 
241
  }
 
 
 
 
242
 
 
 
 
 
 
 
 
 
 
243
  /**
244
  * The function returns the session variables, and if not, retrieves the cookie values set in case the right permissions are not aassigned for the sessions folder in the server.
245
  *
@@ -351,11 +389,20 @@ class MO2f_Utility {
351
  $key = get_option( 'mo2f_encryption_key' );
352
  if ( isset( $_COOKIE[ $cookiename ] ) ) {
353
  $decrypted_data = MO2f_Utility::decrypt_data( base64_decode( $_COOKIE[ $cookiename ] ), $key );
 
 
 
 
354
  if ( $decrypted_data ) {
355
  $decrypted_data_array = explode( '&', $decrypted_data );
356
 
357
  $cookie_value = $decrypted_data_array[0];
358
- $cookie_creation_time = new DateTime( $decrypted_data_array[1] );
 
 
 
 
 
359
  $current_time = new DateTime( 'now' );
360
 
361
  $interval = $cookie_creation_time->diff( $current_time );
@@ -372,7 +419,10 @@ class MO2f_Utility {
372
  return false;
373
  }
374
  }
375
-
 
 
 
376
  /**
377
  * The function sets the cookie value after encryption and encoding.
378
  *
@@ -391,7 +441,7 @@ class MO2f_Utility {
391
 
392
  $cookievalue_encrypted = MO2f_Utility::encrypt_data( $cookievalue, $key );
393
  // setcookie( $cookiename, base64_encode( $cookievalue_encrypted ) );
394
- setcookie( $cookiename, base64_encode( $cookievalue_encrypted ),NULL,NULL,NULL,NULL, TRUE );
395
  $_COOKIE[$cookiename] = base64_encode( $cookievalue_encrypted );
396
  }
397
 
@@ -501,7 +551,8 @@ class MO2f_Utility {
501
  "SecurityQuestions" => "Security Questions",
502
  "EmailVerification" => "Email Verification",
503
  "OTPOverSMS" => "OTP Over SMS",
504
- "OTPOverEmail" => "OTP Over Email"
 
505
  );
506
 
507
  $server_2fa_methods = array(
@@ -514,7 +565,12 @@ class MO2f_Utility {
514
  "Email Verification" => "OUT OF BAND EMAIL",
515
  "OTP Over SMS" => "SMS",
516
  "EMAIL" => "OTP Over Email",
517
- "OTPOverEmail" => "OTP Over Email"
 
 
 
 
 
518
  );
519
 
520
  $server_to_wpdb_2fa_methods = array(
@@ -544,6 +600,11 @@ class MO2f_Utility {
544
  return $methodname;
545
 
546
  }
 
 
 
 
 
547
 
548
  public static function get_plugin_name_by_identifier( $plugin_identitifier ){
549
  $all_plugins = get_plugins();
@@ -590,8 +651,12 @@ class MO2f_Utility {
590
  <p style="margin-top:0;margin-bottom:10px">You initiated a transaction from <b>WordPress 2 Factor Authentication Plugin</b>:</p>
591
  <p style="margin-top:0;margin-bottom:10px">Your backup codes are:-
592
  <table cellspacing="10">
593
- <tr><td>'.$codes[0].'</td><td>'.$codes[1].'</td><td>'.$codes[2].'</td><td>'.$codes[3].'</td><td>'.$codes[4].'</td>
594
- </table></p>
 
 
 
 
595
  <p style="margin-top:0;margin-bottom:10px">Please use this carefully as each code can only be used once. Please do not share these codes with anyone.</p>
596
  <p style="margin-top:0;margin-bottom:10px">Also, we would highly recommend you to reconfigure your two-factor after logging in.</p>
597
  <p style="margin-top:0;margin-bottom:15px">Thank you,<br>miniOrange Team</p>
@@ -638,18 +703,9 @@ class MO2f_Utility {
638
  return $message;
639
  }
640
 
641
- public static function mo_2f_generate_backup_codes(){
642
- $codes=array();
643
- for ($x = 0; $x < 5; $x++) {
644
- $str = MO2f_Utility::random_str(10);
645
- array_push($codes,$str);
646
- }
647
- return $codes;
648
- }
649
-
650
  public static function mo2f_get_codes_hash($codes){
651
  $codes_hash=array();
652
- for ($x = 0; $x < 5; $x++) {
653
  $str = $codes[$x];
654
  array_push($codes_hash,md5($str));
655
  }
@@ -668,8 +724,8 @@ class MO2f_Utility {
668
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
669
  header('Content-Disposition: attachment; filename=miniOrange2-factor-BackupCodes.txt');
670
  echo "Two Factor Backup Codes:".PHP_EOL.PHP_EOL;
671
- echo "These are the codes which can be used incase you lose your phone or cannot access your email. Please reconfigure you authentication method after login.".PHP_EOL."Please use this carefully as each code can only be used once. Please do not share these codes with anyone.".PHP_EOL.PHP_EOL;
672
- for ($x = 0; $x < 5; $x++){
673
  $str1= $codes[$x];
674
  echo(($x+1).". ".$str1." ");
675
  }
@@ -677,23 +733,39 @@ class MO2f_Utility {
677
  exit;
678
  }
679
 
680
-
 
 
 
 
 
 
 
 
 
 
681
 
682
 
683
  public static function mo2f_mail_and_download_codes(){
684
- global $Mo2fdbQueries;
685
- $codes=MO2f_Utility::mo_2f_generate_backup_codes();
686
- $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
687
  $id = get_current_user_id();
688
  $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
689
  if(empty($mo2f_user_email)){
690
  $currentuser = get_user_by( 'id', $id );
691
  $mo2f_user_email = $currentuser->user_email;
692
  }
 
 
 
 
 
 
 
 
693
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
694
  update_user_meta($id, 'mo_backup_code_generated', 1);
695
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
696
- update_user_meta($id,'mo2f_backup_codes', $codes_hash);
697
  MO2f_Utility::mo2f_download_backup_codes($id, $codes);
698
  }
699
 
233
 
234
  public static function mo2f_set_transient( $session_id, $key, $value, $expiration = 300 ) {
235
  set_transient($session_id.$key, $value, $expiration);
236
+ $transient_array = get_site_option($session_id);
237
+ $transient_array[$key] = $value;
238
+ update_site_option($session_id, $transient_array);
239
+ MO2f_Utility::mo2f_set_session_value($session_id, $transient_array);
240
+ if(is_array($value))
241
+ $value = json_encode($value) ;
242
+
243
+ MO2f_Utility::mo2f_set_cookie_values(base64_encode($session_id),$value);
244
+
245
+ }
246
  public static function mo2f_get_transient( $session_id, $key) {
247
+ MO2f_Utility::mo2f_start_session();
248
+
249
+ if(isset($_SESSION[$session_id])){
250
+ $transient_array = $_SESSION[$session_id];
251
+ $transient_value = isset($transient_array[$key]) ? $transient_array[$key] : null;
252
+ return $transient_value;
253
+ }else if(isset($_COOKIE[base64_decode($session_id)])){
254
+ $transient_value = MO2f_Utility::mo2f_get_cookie_values(base64_decode($session_id));
255
+ return $transient_value;
256
+ }else{
257
+ $transient_value = get_transient($session_id.$key);
258
+ if(!$transient_value){
259
+ $transient_array = get_site_option($session_id);
260
+ $transient_value = isset($transient_array[$key]) ? $transient_array[$key] : null;
261
+ }
262
  return $transient_value;
263
+ }
264
+
265
+
266
  }
267
+ public static function mo2f_set_session_value($session_id, $transient_array){
268
+ MO2f_Utility::mo2f_start_session();
269
+ $_SESSION[ $session_id ] = $transient_array ;
270
+ }
271
 
272
+ public static function mo2f_start_session() {
273
+ if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
274
+ $session_path = ini_get('session.save_path');
275
+ if( is_writable($session_path) && is_readable($session_path) && !headers_sent() ) {
276
+ if(session_status() != PHP_SESSION_DISABLED )
277
+ session_start();
278
+ }
279
+ }
280
+ }
281
  /**
282
  * The function returns the session variables, and if not, retrieves the cookie values set in case the right permissions are not aassigned for the sessions folder in the server.
283
  *
389
  $key = get_option( 'mo2f_encryption_key' );
390
  if ( isset( $_COOKIE[ $cookiename ] ) ) {
391
  $decrypted_data = MO2f_Utility::decrypt_data( base64_decode( $_COOKIE[ $cookiename ] ), $key );
392
+
393
+ if(MO2f_Utility::isJSON($decrypted_data))
394
+ $decrypted_data = json_decode($decrypted_data);
395
+
396
  if ( $decrypted_data ) {
397
  $decrypted_data_array = explode( '&', $decrypted_data );
398
 
399
  $cookie_value = $decrypted_data_array[0];
400
+ if(sizeof($decrypted_data_array) == 2 ){
401
+ $cookie_creation_time = new DateTime( $decrypted_data_array[1] );
402
+ }else{
403
+ $cookie_creation_time = new DateTime( array_pop($decrypted_data_array) );
404
+ $cookie_value = implode('&', $decrypted_data_array);
405
+ }
406
  $current_time = new DateTime( 'now' );
407
 
408
  $interval = $cookie_creation_time->diff( $current_time );
419
  return false;
420
  }
421
  }
422
+
423
+ public static function isJSON($string){
424
+ return is_string($string) && is_array(json_decode($string, true)) ? true : false;
425
+ }
426
  /**
427
  * The function sets the cookie value after encryption and encoding.
428
  *
441
 
442
  $cookievalue_encrypted = MO2f_Utility::encrypt_data( $cookievalue, $key );
443
  // setcookie( $cookiename, base64_encode( $cookievalue_encrypted ) );
444
+ // setcookie( $cookiename, base64_encode( $cookievalue_encrypted ),NULL,NULL,NULL,NULL, TRUE );
445
  $_COOKIE[$cookiename] = base64_encode( $cookievalue_encrypted );
446
  }
447
 
551
  "SecurityQuestions" => "Security Questions",
552
  "EmailVerification" => "Email Verification",
553
  "OTPOverSMS" => "OTP Over SMS",
554
+ "OTPOverEmail" => "OTP Over Email",
555
+ "DuoAuthenticator" => "Duo Authenticator"
556
  );
557
 
558
  $server_2fa_methods = array(
565
  "Email Verification" => "OUT OF BAND EMAIL",
566
  "OTP Over SMS" => "SMS",
567
  "EMAIL" => "OTP Over Email",
568
+ "OTPOverEmail" => "OTP Over Email",
569
+ "Duo Authenticator" => "Duo Authenticator",
570
+ "DUO AUTHENTICATOR" => "Duo Authenticator",
571
+ "OTP Over Email" => "EMAIL",
572
+ "OTP OVER EMAIL" => "EMAIL"
573
+
574
  );
575
 
576
  $server_to_wpdb_2fa_methods = array(
600
  return $methodname;
601
 
602
  }
603
+ public static function is_same_method($method,$current_method){
604
+ if($method == $current_method || $method == MO2f_Utility::mo2f_decode_2_factor($current_method,'wpdb') || $method == MO2f_Utility::mo2f_decode_2_factor($current_method,'') || MO2f_Utility::mo2f_decode_2_factor($current_method,'server') == $method)
605
+ return true;
606
+ return false;
607
+ }
608
 
609
  public static function get_plugin_name_by_identifier( $plugin_identitifier ){
610
  $all_plugins = get_plugins();
651
  <p style="margin-top:0;margin-bottom:10px">You initiated a transaction from <b>WordPress 2 Factor Authentication Plugin</b>:</p>
652
  <p style="margin-top:0;margin-bottom:10px">Your backup codes are:-
653
  <table cellspacing="10">
654
+ <tr>';
655
+ for ($x = 0; $x < sizeof($codes); $x++) {
656
+ $message = $message.'<td>'.$codes[$x].'</td>';
657
+
658
+ }
659
+ $message = $message.'</table></p>
660
  <p style="margin-top:0;margin-bottom:10px">Please use this carefully as each code can only be used once. Please do not share these codes with anyone.</p>
661
  <p style="margin-top:0;margin-bottom:10px">Also, we would highly recommend you to reconfigure your two-factor after logging in.</p>
662
  <p style="margin-top:0;margin-bottom:15px">Thank you,<br>miniOrange Team</p>
703
  return $message;
704
  }
705
 
 
 
 
 
 
 
 
 
 
706
  public static function mo2f_get_codes_hash($codes){
707
  $codes_hash=array();
708
+ for ($x = 0; $x < sizeof($codes); $x++) {
709
  $str = $codes[$x];
710
  array_push($codes_hash,md5($str));
711
  }
724
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
725
  header('Content-Disposition: attachment; filename=miniOrange2-factor-BackupCodes.txt');
726
  echo "Two Factor Backup Codes:".PHP_EOL.PHP_EOL;
727
+ echo "These are the codes that can be used in case you lose your phone or cannot access your email. Please reconfigure your authentication method after login.".PHP_EOL."Please use this carefully as each code can only be used once. Please do not share these codes with anyone..".PHP_EOL.PHP_EOL;
728
+ for ($x = 0; $x < sizeof($codes); $x++){
729
  $str1= $codes[$x];
730
  echo(($x+1).". ".$str1." ");
731
  }
733
  exit;
734
  }
735
 
736
+ public static function mo2f_debug_file($text){
737
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_enable_debug_log', 'site_option') == 1){
738
+ $debug_log_path = wp_upload_dir();
739
+ $debug_log_path = $debug_log_path['basedir'].DIRECTORY_SEPARATOR;
740
+ $filename = 'miniorange_debug_log.txt';
741
+ $data = '[' . date("Y/m/d").' '. time().']:'.$text."\n";
742
+ $handle = fopen($debug_log_path.DIRECTORY_SEPARATOR.$filename,'a+');
743
+ fwrite($handle,$data);
744
+ fclose($handle);
745
+ }
746
+ }
747
 
748
 
749
  public static function mo2f_mail_and_download_codes(){
750
+ global $Mo2fdbQueries;
751
+
 
752
  $id = get_current_user_id();
753
  $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
754
  if(empty($mo2f_user_email)){
755
  $currentuser = get_user_by( 'id', $id );
756
  $mo2f_user_email = $currentuser->user_email;
757
  }
758
+ $generate_backup_code = new Customer_Cloud_Setup();
759
+ $codes=$generate_backup_code->mo_2f_generate_backup_codes($mo2f_user_email, site_url());
760
+
761
+ if($codes == 'LimitReached'|| $codes == 'UserLimitReached' || $codes == 'AllUsed' || $codes == 'invalid_request')
762
+ return $codes;
763
+
764
+ $codes = explode(' ', $codes);
765
+ $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
766
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
767
  update_user_meta($id, 'mo_backup_code_generated', 1);
768
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
 
769
  MO2f_Utility::mo2f_download_backup_codes($id, $codes);
770
  }
771
 
handler/user-profile-2fa-update.php ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(isset($_POST['method']))
3
+ $method = sanitize_text_field($_POST['method']);
4
+ else
5
+ return;
6
+ global $Mo2fdbQueries;
7
+ $email = $Mo2fdbQueries->get_user_detail('mo2f_user_email',$user);
8
+ $method = MO2f_Utility::mo2f_decode_2_factor($method,'wpdb');
9
+ $email = ($email=='')?filter_var($_POST['email'], FILTER_SANITIZE_EMAIL):$email;
10
+ $enduser = new Two_Factor_Setup();
11
+ if(isset($_POST['verify_phone']))
12
+ $phone = strlen($_POST['verify_phone']>4)?sanitize_text_field($_POST['verify_phone']):null;
13
+ else
14
+ $phone = null;
15
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email,MO2f_Utility::mo2f_decode_2_factor($method,'server') , $phone, null, null ), true );
16
+ if($response['status']!= 'SUCCESS')
17
+ return;
18
+ $id = get_current_user_id();
19
+ $method = MO2f_Utility::mo2f_decode_2_factor($method,'wpdb');
20
+ switch ($method) {
21
+ case "miniOrange QR Code Authentication":
22
+ case "miniOrange Push Notification":
23
+ case "miniOrange Soft Token":
24
+ if($id != $user){
25
+ send_reconfiguration_on_email($email,$user,$method);
26
+ }else if($_POST['mo2f_configuration_status']!='SUCCESS')
27
+ return;
28
+ delete_user_meta( $user, 'configure_2FA' );
29
+ update_user_meta($user,'mo2f_2FA_method_to_configure',$method);
30
+ $Mo2fdbQueries->update_user_details($user, array(
31
+ 'mobile_registration_status' =>true,
32
+ 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
33
+ 'mo2f_miniOrangeSoftToken_config_status' => true,
34
+ 'mo2f_miniOrangePushNotification_config_status' => true,
35
+ "mo2f_configured_2FA_method" => $method,
36
+ 'user_registration_with_miniorange' => 'SUCCESS',
37
+ 'mo2f_2factor_enable_2fa_byusers'=> '1',
38
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
39
+ ) );
40
+ break;
41
+ case "Google Authenticator":
42
+ if($id!= $user){
43
+ send_reconfiguration_on_email($email,$user,$method);
44
+ }else if($_POST['mo2f_configuration_status']!='SUCCESS')
45
+ return;
46
+ $Mo2fdbQueries->update_user_details( $user, array(
47
+ 'mo2f_GoogleAuthenticator_config_status' => true,
48
+ 'mo2f_configured_2FA_method' => 'Google Authenticator',
49
+ 'mo2f_AuthyAuthenticator_config_status' => false,
50
+ 'user_registration_with_miniorange' => 'SUCCESS',
51
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
52
+ 'mo2f_2factor_enable_2fa_byusers' => 1,
53
+ 'mo2f_user_email' => $email
54
+ ) );
55
+ if(!MO2F_IS_ONPREM){
56
+ update_user_meta( $user ,'mo2f_external_app_type', "Google Authenticator" );
57
+ }
58
+ break;
59
+ case "Authy Authenticator":
60
+ if($id!= $user){
61
+ send_reconfiguration_on_email($email,$user,$method);
62
+ }else if($_POST['mo2f_configuration_status']!='SUCCESS')
63
+ return;
64
+ $Mo2fdbQueries->update_user_details( $user, array(
65
+ 'mo2f_GoogleAuthenticator_config_status' => false,
66
+ 'mo2f_configured_2FA_method' => 'Authy Authenticator',
67
+ 'mo2f_AuthyAuthenticator_config_status' => true,
68
+ 'user_registration_with_miniorange' => 'SUCCESS',
69
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
70
+ 'mo2f_2factor_enable_2fa_byusers' => 1,
71
+ 'mo2f_user_email' => $email
72
+ ) );
73
+ if(!MO2F_IS_ONPREM){
74
+ update_user_meta( $user ,'mo2f_external_app_type', "Authy Authenticator" );
75
+ }
76
+ break;
77
+ case "OTP Over SMS":
78
+ $Mo2fdbQueries->update_user_details($user, array(
79
+ "mo2f_configured_2FA_method" => 'OTP Over SMS',
80
+ 'mo2f_OTPOverSMS_config_status' => true,
81
+ 'user_registration_with_miniorange' => 'SUCCESS',
82
+ 'mo2f_2factor_enable_2fa_byusers'=> '1',
83
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
84
+ ) );
85
+ break;
86
+ case "Security Questions":
87
+ $obj = new Miniorange_Authentication();
88
+ $kba_q1 = sanitize_text_field($_POST['mo2f_kbaquestion_1']);
89
+ $kba_a1 = sanitize_text_field( $_POST['mo2f_kba_ans1'] );
90
+ $kba_q2 = sanitize_text_field($_POST['mo2f_kbaquestion_2']);
91
+ $kba_a2 = sanitize_text_field( $_POST['mo2f_kba_ans2'] );
92
+ $kba_q3 = sanitize_text_field( $_POST['mo2f_kbaquestion_3'] );
93
+ $kba_a3 = sanitize_text_field( $_POST['mo2f_kba_ans3'] );
94
+
95
+ $kba_q1 = addcslashes( stripslashes( $kba_q1 ), '"\\' );
96
+ $kba_q2 = addcslashes( stripslashes( $kba_q2 ), '"\\' );
97
+ $kba_q3 = addcslashes( stripslashes( $kba_q3 ), '"\\' );
98
+
99
+ $kba_a1 = addcslashes( stripslashes( $kba_a1 ), '"\\' );
100
+ $kba_a2 = addcslashes( stripslashes( $kba_a2 ), '"\\' );
101
+ $kba_a3 = addcslashes( stripslashes( $kba_a3 ), '"\\' );
102
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $kba_q1 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a1 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_q2 ) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a2) || MO2f_Utility::mo2f_check_empty_or_null( $kba_q3) || MO2f_Utility::mo2f_check_empty_or_null( $kba_a3) ) {
103
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
104
+ return;
105
+ }
106
+
107
+ if ( strcasecmp( $kba_q1, $kba_q2 ) == 0 || strcasecmp( $kba_q2, $kba_q3 ) == 0 || strcasecmp( $kba_q3, $kba_q1 ) == 0 ) {
108
+ update_option( 'mo2f_message', 'The questions you select must be unique.' );
109
+ return;
110
+ }
111
+ $kba_registration = new Two_Factor_Setup();
112
+ $kba_reg_reponse = json_decode( $kba_registration->register_kba_details( $email, $kba_q1, $kba_a1, $kba_q2, $kba_a2, $kba_q3, $kba_a3, $user ), true );
113
+
114
+ if ( json_last_error() == JSON_ERROR_NONE ) {
115
+ if ( $response['status'] == 'SUCCESS' ) {
116
+ $Mo2fdbQueries->update_user_details( $user, array(
117
+ 'mo2f_configured_2FA_method' => 'Security Questions' ,
118
+ 'user_registration_with_miniorange' => 'SUCCESS',
119
+ 'mo2f_SecurityQuestions_config_status' => true,
120
+ 'mo2f_2factor_enable_2fa_byusers'=> '1',
121
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
122
+ ), true);
123
+
124
+ }else {
125
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
126
+ $obj->mo_auth_show_error_message();
127
+
128
+ }
129
+ }
130
+
131
+ break;
132
+ case "OTP Over Email":
133
+ $Mo2fdbQueries->update_user_details($user, array(
134
+ "mo2f_configured_2FA_method" => 'OTP Over Email',
135
+ 'mo2f_OTPOverEmail_config_status' => true,
136
+ 'mo2f_user_email' => $email,
137
+ 'mo2f_2factor_enable_2fa_byusers'=> '1',
138
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
139
+ 'user_registration_with_miniorange' => 'SUCCESS',
140
+ ) );
141
+ delete_user_meta( $user, 'configure_2FA');
142
+ delete_user_meta( $user, 'test_2FA');
143
+ break;
144
+ case "Email Verification":
145
+ $Mo2fdbQueries->update_user_details($user, array(
146
+ "mo2f_configured_2FA_method" => 'Email Verification',
147
+ 'mo2f_user_email' => $email,
148
+ 'user_registration_with_miniorange' => 'SUCCESS',
149
+ 'mo2f_2factor_enable_2fa_byusers'=> '1',
150
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
151
+ 'mo2f_EmailVerification_config_status' => true
152
+ ) );
153
+ break;
154
+ }
155
+ if(isset($_POST['mo2fa_count']) && sanitize_text_field($_POST['mo2fa_count']) != '1')
156
+ update_option('mo2fa_userProfile_method',$method);
157
+ function send_reconfiguration_on_email($email,$user,$method){
158
+ global $mo2f_dirName;
159
+ $method = MO2f_Utility::mo2f_decode_2_factor($method,'server');
160
+ $reconfiguraion_method = hash('sha512',$method);
161
+ update_site_option($reconfiguraion_method,$method);
162
+ $txid = bin2hex(openssl_random_pseudo_bytes(32));
163
+ update_site_option($txid, get_current_user_id());
164
+ update_user_meta($user,'mo2f_EV_txid',$txid);
165
+ $subject = '2fa-reconfiguration : Scan QR';
166
+ $headers = array('Content-Type: text/html; charset=UTF-8');
167
+ update_option('mo2fa_reconfiguration_via_email',json_encode(array($user,$email,$method)));
168
+ $path = plugins_url(DIRECTORY_SEPARATOR. 'views'.DIRECTORY_SEPARATOR. 'qr_over_email.php',dirname( __FILE__ )).'?email='.$email.'&amp;user_id='.$user_id;
169
+ $url = get_site_option('siteurl').'/wp-login.php?';
170
+ $path = $url.'&amp;reconfigureMethod='.$reconfiguraion_method.'&amp;transactionId='.$txid;
171
+ $message = '
172
+ <table>
173
+ <tbody>
174
+ <tr>
175
+ <td>
176
+ <table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
177
+ <tbody>
178
+ <tr>
179
+ <td><img src="https://ci5.googleusercontent.com/proxy/10EQeM1udyBOkfD2dwxGhIaMXV4lOwCRtUecpsDkZISL0JIkOL2JhaYhVp54q6Sk656rW2rpAFJFEgGQiAOVcYIIKxXYMHHMNSNB=s0-d-e1-ft#https://login.xecurify.com/moas/images/xecurify-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px" class="CToWUd"></td>
180
+ </tr>
181
+ </tbody>
182
+ </table>
183
+ <table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
184
+ <tbody>
185
+ <tr>
186
+ <td>
187
+ <input type="hidden" name="user_id" id="user_id" value="'.$user_id.'">
188
+ <input type="hidden" name="email" id="email" value="'.$email.'">
189
+ <p style="margin-top:0;margin-bottom:20px">Dear Customer,</p>
190
+ <p style="margin-top:0;margin-bottom:10px">Please scan the QR code from given link to set <b>2FA method</b>:</p>
191
+ <p><a href="'.$path.'" > Click to reconfigure 2nd factor</a></p>
192
+ <p style="margin-top:0;margin-bottom:15px">Thank you,<br>miniOrange Team</p>
193
+ <p style="margin-top:0;margin-bottom:0px;font-size:11px">Disclaimer: This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed.</p>
194
+ </div></div></td>
195
+ </tr>
196
+ </tbody>
197
+ </table>
198
+ </td>
199
+ </tr>
200
+ </tbody>
201
+ </table>';
202
+ $result = wp_mail($email,$subject,$message,$headers);
203
+ if($result){
204
+ update_site_option( 'mo2f_message', 'A OTP has been sent to you on' .'<b> ' . $email . '</b>. ' . Mo2fConstants::langTranslate("ACCEPT_LINK_TO_VERIFY_EMAIL"));
205
+ $arr = array('status' => 'SUCCESS','message'=>'Successfully validated.' ,'txId' => '' );
206
+
207
+ }else{
208
+ $arr = array('status' => 'FAILED','message'=>'TEST FAILED.');
209
+ update_site_option( 'mo2f_message', Mo2fConstants::langTranslate("ERROR_DURING_PROCESS_EMAIL"));
210
+ }
211
+ $content = json_encode($arr);
212
+ }
213
+ ?>
handler/user-profile-2fa.php ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $is_registered = empty(get_option('mo2f_customerkey'))?false:true;
3
+ $role = $user->roles;
4
+ $roles = ( array ) $user->roles;
5
+ $flag = 0;
6
+ foreach ( $roles as $role ) {
7
+ if(get_option('mo2fa_'.$role)=='1')
8
+ $flag=1;
9
+ }
10
+ if(!current_user_can( 'administrator', $user->ID) || (!MO2F_IS_ONPREM && !$is_registered) || $flag==0)
11
+ return;
12
+ else if(!MO2F_IS_ONPREM && !$is_registered)
13
+ return;
14
+ $cloud_methods = array("miniOrange QR Code Authentication", "miniOrange Soft Token","miniOrange Push Notification","OTP Over SMS");
15
+ $id = get_current_user_id();
16
+ $available_methods = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option')?get_site_option('mo2fa_free_plan_new_user_methods'):get_site_option('mo2fa_free_plan_existing_user_methods');
17
+ if(!$available_methods)
18
+ return;
19
+ $transient_id = MO2f_Utility::random_str(20);
20
+
21
+ MO2f_Utility::mo2f_set_transient($transient_id, 'mo2f_user_id', $user->ID);
22
+ $same_user = $user->ID == $id?true:false;
23
+ global $Mo2fdbQueries;
24
+ $current_method = $Mo2fdbQueries->get_user_detail('mo2f_configured_2FA_method',$user->ID);
25
+ if($current_method == "miniOrange QR Code Authentication" || $current_method == "miniOrange Soft Token" || $current_method == "miniOrange Push Notification")
26
+ $current_method = "miniOrange Authenticator";
27
+ $twofactor_transactions = new Mo2fDB;
28
+ $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user->ID);
29
+ if($exceeded){
30
+ return;
31
+ }
32
+ $user_column_exists = $Mo2fdbQueries->check_if_user_column_exists( $user->ID );
33
+ $email=$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
34
+ if($email == ''){
35
+ $Mo2fdbQueries->update_user_details($user->ID,array('mo2f_user_email'=>$user->user_email));
36
+ }
37
+ $email = !empty($Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID ))?$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID ):$user->user_email;
38
+ $pass_2fa_login_session = new Miniorange_Password_2Factor_Login();
39
+ if(!$user_column_exists){
40
+ $Mo2fdbQueries->insert_user( $user->ID );
41
+ $content = $pass_2fa_login_session->create_user_in_miniOrange($user->ID,$email,'SOFT TOKEN');
42
+ }
43
+ $registerMobile = new Two_Factor_Setup();
44
+ $content = $registerMobile->register_mobile($email);
45
+ update_user_meta($user->ID,'registered_mobile',$content);
46
+ $two_factor_methods_descriptions = array(
47
+ "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
48
+ "miniOrange Authenticator" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
49
+ "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
50
+ "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
51
+ "Google Authenticator" => "Enter the soft token from the account in your Google Authenticator App to login.",
52
+ "Security Questions" => "Answer the three security questions you had set, to login.",
53
+ "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
54
+ "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
55
+ "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
56
+ "Email Verification" => "Accept the verification link sent to your email to login.",
57
+ "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
58
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
59
+ );
60
+ global $mainDir;
61
+ wp_enqueue_style( 'mo2f_user-profile_style', $mainDir.'/includes/css/user-profile.css');
62
+ ?>
63
+ <h3><?php esc_html_e( 'Set 2-Factor Authentication', 'miniorange 2-factor-authentication' ); ?></h3>
64
+ <table class="form-table" id="mo2fa_form-table-user-profile">
65
+ <tr>
66
+ <th style="text-align: left;">
67
+ <?php echo mo2f_lt( '2-Factor Options' ); ?>
68
+ </th>
69
+ <td>
70
+ <form name="f" method="post" action="" id="mo2f_update_2fa">
71
+ <div class="mo2fa_tab">
72
+ <?php foreach ( $two_factor_methods_descriptions as $method => $description ){
73
+ if(in_array($method, $available_methods)){
74
+ $trimmed_method = str_replace(' ','',$method);?>
75
+ <button class="mo2fa_tablinks" type="button"
76
+ <?php if((!empty($current_method) && MO2f_Utility::is_same_method($method,$current_method)) || (empty($current_method) && MO2f_Utility::is_same_method($method,'miniOrange Authenticator')) ){?>
77
+ id="defaultOpen"
78
+ <?php }?>
79
+ onclick='mo2fa_viewMethod(event, "<?php echo esc_attr( $trimmed_method );?>")'><?php echo esc_attr( $method );?>
80
+ </button>
81
+ <?php }}?>
82
+ </div>
83
+ </form>
84
+ <?php foreach ( $two_factor_methods_descriptions as $method => $description ){
85
+ if(in_array($method, $available_methods)){
86
+ $trimmed_method = str_replace(' ','',$method);?>
87
+ <div id="<?php echo esc_attr( $trimmed_method );?>" class="mo2fa_tabcontent">
88
+ <p><?php echo esc_attr( $description );?></p>
89
+ <p><?php methods_on_user_profile($method,$user,$transient_id);?></p>
90
+ </div>
91
+ <?php }}?>
92
+ </td>
93
+ </tr>
94
+ </table>
95
+ <div id="wpns_nav_message"></div>
96
+ <input type="hidden" name="MO2F_IS_ONPREM" value="<?php echo MO2F_IS_ONPREM;?>">
97
+ <input type="hidden" name="same_user" value="<?php echo $same_user;?>">
98
+ <input type="hidden" name="is_registered" value="<?php echo $is_registered;?>">
99
+ <input type="hidden" name="mo2f-update-mobile-nonce" value="<?php echo wp_create_nonce("mo2f-update-mobile-nonce");?>">
100
+ <input type="hidden" name="mo2fa_count" id="mo2fa_count" value="1">
101
+ <input type="hidden" name="transient_id" value="<?php echo $transient_id;?>">
102
+ <input type="hidden" name='method' id="method" value="NONE">
103
+ <input type="hidden" name='mo2f_configuration_status' id="mo2f_configuration_status" value="Configuration">
104
+ <?php
105
+ wp_enqueue_script( 'user-profile-2fa-script', $mainDir.'/includes/js/user-profile-twofa.js');
106
+
107
+ function methods_on_user_profile($method,$user,$transient_id){
108
+ global $Mo2fdbQueries,$mainDir;
109
+ $email=$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
110
+ $pass_2fa_login_session = new Miniorange_Password_2Factor_Login();
111
+ $trimmed_method = str_replace(' ','',$method);
112
+ $is_registered = get_option('mo2f_customerkey');
113
+ $id = get_current_user_id();
114
+ if($email == ''){
115
+ $Mo2fdbQueries->update_user_details($user->ID,array('mo2f_user_email'=>$user->user_email));
116
+ }
117
+ $email = !empty($Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID ))?$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID ):$user->user_email;
118
+ switch($method){
119
+ case "miniOrange Authenticator":
120
+ if(!$is_registered){
121
+ $message = "Please register with miniOrange for using this method.";
122
+ echo mo2f_lt( $message );
123
+ }
124
+ else{
125
+ ?>
126
+ <div id="mo2fa_display_mo_methods">
127
+ <h4 class="mo2fa_select_method">
128
+ Select Authentication method :
129
+ </h4>
130
+ <input type="button" name="mo2f_method" id="miniOrangeSoftTokenButton" class="mo2f_miniAuthApp" value="Soft Token" />
131
+ <input type="button" name="mo2f_method" id="miniOrangeQRCodeAuthenticationButton" class="mo2f_miniAuthApp" value="QR Code Authentication" />
132
+ <input type="button" name="mo2f_method" id="miniOrangePushNotificationButton" class="mo2f_miniAuthApp" value="Push Notification" />
133
+ </div>
134
+ <?php
135
+ if($id == $user->ID)
136
+ {
137
+ $content = get_user_meta($user->ID,'registered_mobile',true);
138
+ $response = json_decode($content, true);
139
+ $message = '';
140
+
141
+ if(json_last_error() == JSON_ERROR_NONE) {
142
+ if($response['status'] == 'ERROR'){
143
+ $mo_qr_details['message'] = Mo2fConstants::langTranslate($response['message']);
144
+ delete_user_meta( $user->ID, 'miniorageqr' );
145
+ }else{
146
+ if($response['status'] == 'IN_PROGRESS'){
147
+
148
+ $mo_qr_details['message'] = '';
149
+ $mo_qr_details['mo2f-login-qrCode']=$response['qrCode'];
150
+ update_user_meta($user->ID,'miniorageqr',$mo_qr_details);
151
+ }else{
152
+ $mo_qr_details['message'] = __('An error occured while processing your request. Please Try again.','miniorange-2-factor-authentication');
153
+ delete_user_meta( $user->ID, 'miniorageqr' );
154
+ }
155
+ }
156
+ }
157
+ ?>
158
+
159
+ <div class="mcol-2" id='mo2f_qrcode'>
160
+ <table class="mo2f_settings_table">
161
+ <br><?php
162
+ echo (isset($mo_qr_details['mo2f-login-qrCode'])?'<img style="width:165px;" src="data:image/jpg;base64,' .$mo_qr_details['mo2f-login-qrCode']. '" />':'Please register with miniOrange for using this method') ;
163
+ ?>
164
+ </table>
165
+ <?php
166
+ if(isset($mo_qr_details['mo2f-login-qrCode'])){
167
+ ?>
168
+ <form name="f" method="post" action="" id="<?php echo 'mo2f_verify_form-'.mo2f_lt($trimmed_method); ?>">
169
+
170
+ <table id="mo2f_setup_mo_methods">
171
+ <td class="bg-none"><?php echo mo2f_lt( 'Enter Code:' )?></td>
172
+ <td><input type="tel" class="mo2f_table_textbox" style="margin-left: 1%; margin-right: 1%; width:200px;" name="mo_qr_auth_code" id="<?php echo 'textbox-'.mo2f_lt($trimmed_method); ?>" value="" pattern="[0-9]{4,8}" title="<?php echo mo2f_lt('Enter OTP:'); ?>"/></td>
173
+ <td><a id="<?php echo 'save-'.mo2f_lt($trimmed_method); ?>" name="save_qr" class="button button1" ><?php echo mo2f_lt( 'Verify and Save' ); ?></a></td>
174
+ </table>
175
+
176
+ </form>
177
+ <?php } ?>
178
+ </div>
179
+
180
+ <?php
181
+ }
182
+ else{
183
+ $message= "Link to reconfigure 2nd factor will be sent to ".$email;
184
+ echo mo2f_lt( $message );
185
+ }
186
+ }
187
+ break;
188
+ case "Authy Authenticator":
189
+ case "Google Authenticator":
190
+ if($user->ID == $id){
191
+ if(MO2F_IS_ONPREM){
192
+ include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'twofa'. DIRECTORY_SEPARATOR. 'gaonprem.php';
193
+ $gauth_obj= new Google_auth_onpremise();
194
+
195
+ $ga_secret = $gauth_obj->createSecret();
196
+ $issuer = get_site_option( 'mo2f_GA_account_name', 'miniOrangeAu' );
197
+ $url = $gauth_obj->geturl( $ga_secret, $issuer, $email );
198
+ $mo2f_google_auth = array('ga_qrCode'=> $url,'ga_secret'=>$ga_secret);
199
+ update_user_meta( $user->ID, 'mo2f_google_auth', json_encode( $mo2f_google_auth ) );
200
+ $otpcode = $gauth_obj->getCode($ga_secret);
201
+ $data = isset($mo2f_google_auth) ? $mo2f_google_auth['ga_qrCode'] : null;
202
+ wp_enqueue_script( 'mo_wpns_qrcode_script', $mainDir.'/includes/jquery-qrcode/jquery-qrcode.js' );
203
+ wp_enqueue_script( 'mo_wpns_min_qrcode_script', $mainDir.'/includes/jquery-qrcode/jquery-qrcode.min.js');
204
+ echo '<div class="mo2f_gauth_column mo2f_gauth_left" >';
205
+ echo '<div class="mo2f_gauth" data-qrcode='.$data.'></div>';
206
+ echo '</div>';
207
+ }else{
208
+ if(!get_user_meta($user->ID, 'mo2f_google_auth', true)){
209
+ Miniorange_Authentication::mo2f_get_GA_parameters($user);
210
+ }
211
+ $mo2f_google_auth = get_user_meta($user->ID, 'mo2f_google_auth', true);
212
+ $data = isset($mo2f_google_auth['ga_qrCode']) ? $mo2f_google_auth['ga_qrCode'] : null;
213
+ $ga_secret = isset($mo2f_google_auth['ga_secret']) ? $mo2f_google_auth['ga_secret'] : null;
214
+ echo '<br><div id="displayQrCode">
215
+ <img id="mo2f_gauth" style="line-height: 0;background:white;" src="data:image/jpg;base64,' . $data . '" />
216
+ </div>';
217
+ }
218
+ ?>
219
+
220
+ <div class="mcol-2">
221
+ <br>
222
+ <form name="f" method="post" action="" id="<?php echo 'mo2f_verify_form-'.mo2f_lt($trimmed_method); ?>">
223
+
224
+ <table id="mo2f_setup_ga">
225
+ <td class="bg-none"><?php echo mo2f_lt( 'Enter Code:' )?></td>
226
+ <td><input type="tel" class="mo2f_table_textbox" style="margin-left: 1%; margin-right: 1%; width:200px;" name="google_auth_code" id="<?php echo 'textbox-'.mo2f_lt($trimmed_method); ?>" value="" pattern="[0-9]{4,8}" title="<?php echo mo2f_lt('Enter OTP:'); ?>"/></td>
227
+ <td><a id="<?php echo 'save-'.mo2f_lt($trimmed_method); ?>" name="save_GA" class="button button1" ><?php echo mo2f_lt( 'Verify and Save' ); ?></a></td>
228
+ </table>
229
+
230
+ <input type="hidden" name="ga_secret" value="<?php echo $ga_secret;?>">
231
+ </form>
232
+
233
+ </div>
234
+ <?php
235
+ }else{
236
+ $message= "Link to reconfigure 2nd factor will be sent to ".$email;
237
+ echo mo2f_lt( $message );
238
+ }
239
+ break;
240
+ case "OTP Over SMS":
241
+ if(!$is_registered){
242
+ $message = "Please register with miniOrange for using this method.";
243
+ echo mo2f_lt( $message );
244
+ }
245
+ else{
246
+ $mo2f_user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
247
+ $user_phone = $mo2f_user_phone ? $mo2f_user_phone : get_option( 'user_phone_temp' );
248
+ ?>
249
+ <form name="f" method="post" action="" id="<?php echo 'mo2f_verify_form-'.mo2f_lt($trimmed_method); ?>">
250
+
251
+ <table id="mo2f_setup_sms">
252
+ <td class="bg-none"><?php echo mo2f_lt( 'Authentication codes will be sent to ' )?></td>
253
+ <td><input type="text" class="mo2f_table_textbox" style="margin-left: 1%; margin-right: 1%; width:200px;" name="verify_phone" id="<?php echo 'textbox-'.mo2f_lt($trimmed_method); ?>" value="<?php echo $user_phone ?>" pattern="[\+]?[0-9]{1,4}\s?[0-9]{7,12}" required="true" title="<?php echo mo2f_lt( 'Enter phone number without any space or dashes' ); ?>"/></td>
254
+ <td><a id="<?php echo 'save-'.mo2f_lt($trimmed_method); ?>" name="save" class="button button1" ><?php echo mo2f_lt( 'Save' ); ?></a></td>
255
+ </table>
256
+
257
+ </form>
258
+ <?php
259
+ }
260
+ break;
261
+ case "Security Questions":
262
+ mo2f_configure_kba_questions($user);
263
+ break;
264
+ case "OTP Over Email":
265
+ case "Email Verification":
266
+ if(!$Mo2fdbQueries->check_if_user_column_exists($user->ID)){
267
+ $content = $pass_2fa_login_session->create_user_in_miniOrange($user->ID,$email,$method);
268
+ }
269
+ $email = ($email=='')?$user->user_email:$email;
270
+ $message = "Authentication codes will be sent to ".$email;
271
+ echo mo2f_lt( $message );
272
+ break;
273
+ $Mo2fdbQueries->delete_user_login_sessions($user->ID);
274
+ }
275
+ }
276
+ ?>
helper/constants.php CHANGED
@@ -12,7 +12,7 @@
12
  const DEFAULT_CUSTOMER_KEY = "16555";
13
  const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
  const DB_VERSION = 155;
15
- const DB_FEATURE_MAIL = 1;
16
  const SUPPORT_EMAIL = 'info@xecurify.com';
17
  const REAL_TIME_IP_HOST = 'https://firewall.xecurify.com/';
18
  const IP_LOOKUP_TEMPLATE = '<span style="font-size:14px;font-weight:bold">GENERAL INFORMATION</span><table style="margin-left:2%;"><tr><td style="width:100px;">Response</td><td >:</td><td>{{status}}</td></tr><tr><td style="width:100px;">IP Address</td><td>:</td><td>{{ip}}</td></tr><tr><td>HostName</td><td>:</td><td>{{hostname}}</td></tr><tr><td>TimeZone</td><td>:</td><td>{{timezone}}</td></tr><tr><td>Time Difference</td><td>:</td><td>{{offset}}</td></tr></table><hr><span style="font-size:14px;font-weight:bold">LOCATION INFORMATION</span><table style="margin-left:2%;"><tr><td>Latitude</td><td>:</td><td>{{latitude}}</td></tr><tr><td>Longitude</td><td>:</td><td>{{longitude}}</td></tr><tr><td>Region</td><td>:</td><td>{{region}}</td></tr><tr><td>Country</td><td>:</td><td>{{country}}</td></tr><tr><td>City</td><td>:</td><td>{{city}}</td></tr><tr><td>Continent</td><td>:</td><td>{{continent}}</td></tr><tr><td>Curreny Code</td><td>:</td><td>{{curreny_code}}</td></tr><tr><td>Curreny Symbol</td><td>:</td><td>{{curreny_symbol}}</td></tr><tr><td>Per Dollar Value</td><td>:</td><td>{{per_dollar_value}}</td></tr></table>';
12
  const DEFAULT_CUSTOMER_KEY = "16555";
13
  const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
  const DB_VERSION = 155;
15
+ const DB_FEATURE_MAIL = 2;
16
  const SUPPORT_EMAIL = 'info@xecurify.com';
17
  const REAL_TIME_IP_HOST = 'https://firewall.xecurify.com/';
18
  const IP_LOOKUP_TEMPLATE = '<span style="font-size:14px;font-weight:bold">GENERAL INFORMATION</span><table style="margin-left:2%;"><tr><td style="width:100px;">Response</td><td >:</td><td>{{status}}</td></tr><tr><td style="width:100px;">IP Address</td><td>:</td><td>{{ip}}</td></tr><tr><td>HostName</td><td>:</td><td>{{hostname}}</td></tr><tr><td>TimeZone</td><td>:</td><td>{{timezone}}</td></tr><tr><td>Time Difference</td><td>:</td><td>{{offset}}</td></tr></table><hr><span style="font-size:14px;font-weight:bold">LOCATION INFORMATION</span><table style="margin-left:2%;"><tr><td>Latitude</td><td>:</td><td>{{latitude}}</td></tr><tr><td>Longitude</td><td>:</td><td>{{longitude}}</td></tr><tr><td>Region</td><td>:</td><td>{{region}}</td></tr><tr><td>Country</td><td>:</td><td>{{country}}</td></tr><tr><td>City</td><td>:</td><td>{{city}}</td></tr><tr><td>Continent</td><td>:</td><td>{{continent}}</td></tr><tr><td>Curreny Code</td><td>:</td><td>{{curreny_code}}</td></tr><tr><td>Curreny Symbol</td><td>:</td><td>{{curreny_symbol}}</td></tr><tr><td>Per Dollar Value</td><td>:</td><td>{{per_dollar_value}}</td></tr></table>';
helper/curl.php CHANGED
@@ -117,6 +117,23 @@ class MocURL
117
  return $response;
118
  }
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  function validate_otp_token($transactionId,$otpToken)
121
  {
122
  $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/validate';
@@ -186,7 +203,7 @@ class MocURL
186
  $fromEmail = 'no-reply@xecurify.com';
187
  $Di = get_site_option('No_of_days_active_work');
188
  $Di = intval($Di);
189
- if ($feedback_option == 'mo_wpns_skip_feedback')
190
  {
191
  $subject = "Deactivate [Feedback Skipped]: WordPress miniOrange 2-Factor Plugin :" .$Di ;
192
 
117
  return $response;
118
  }
119
 
120
+ function get_Captcha_v3($Secretkey)
121
+ {
122
+
123
+ $json = "";
124
+ $url = "https://www.google.com/recaptcha/api/siteverify";
125
+ $fields = array(
126
+ 'response' => $Secretkey,
127
+ 'secret' => get_option('mo_wpns_recaptcha_secret_key_v3'),
128
+ 'remoteip' => $_SERVER['REMOTE_ADDR']
129
+ );
130
+ foreach($fields as $key=>$value) { $json .= $key.'='.$value.'&'; }
131
+ json_encode($json);
132
+ $result = $this->callAPI($url, $json, null);
133
+
134
+ return $result;
135
+ }
136
+
137
  function validate_otp_token($transactionId,$otpToken)
138
  {
139
  $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/validate';
203
  $fromEmail = 'no-reply@xecurify.com';
204
  $Di = get_site_option('No_of_days_active_work');
205
  $Di = intval($Di);
206
+ if ($feedback_option == 'mo_wpns_skip_feedback')
207
  {
208
  $subject = "Deactivate [Feedback Skipped]: WordPress miniOrange 2-Factor Plugin :" .$Di ;
209
 
helper/messages.php CHANGED
@@ -63,6 +63,8 @@
63
  //support form
64
  const SUPPORT_FORM_VALUES = "Please submit your query along with email.";
65
  const SUPPORT_FORM_SENT = "Thanks for getting in touch! We shall get back to you shortly.";
 
 
66
  const SUPPORT_FORM_ERROR = "Your query could not be submitted. Please try again.";
67
  // request demo form
68
  const DEMO_FORM_ERROR = "Please fill out all the fields.";
@@ -73,6 +75,7 @@
73
  const UNKNOWN_ERROR = "Error processing your request. Please try again.";
74
  const CONFIG_SAVED = "Configuration saved successfully.";
75
  const REQUIRED_FIELDS = "Please enter all the required fields";
 
76
  const RESET_PASS = "You password has been reset successfully and sent to your registered email. Please check your mailbox.";
77
  const TEMPLATE_SAVED = "Email template saved.";
78
  const GET_BACKUP_CODES = "<div class='custom-notice notice notice-warning backupcodes-notice'><p><p class='notice-message'><b>Please download backup codes using the 'Get backup codes' button to avoid getting locked out. Backup codes will be emailed as well as downloaded.</b></p><button class='backup_codes_dismiss notice-button'><i>NEVER SHOW AGAIN</i></button></p></div>";
@@ -91,7 +94,7 @@
91
  const INVALID_CRED = 'Invalid username or password. Please try again.';
92
  const REQUIRED_OTP = 'Please enter a value in OTP field.';
93
  const INVALID_OTP = 'Invalid one time passcode. Please enter a valid passcode.';
94
- const INVALID_PHONE = 'Please enter the phone number in the following format: <b>+##country code## ##phone number##';
95
  const PASS_MISMATCH = 'Password and Confirm Password do not match.';
96
  const CRON_DB_BACKUP_ENABLE = 'Scheduled Database Backup enabled';
97
  const CRON_DB_BACKUP_DISABLE = 'Scheduled Database Backup disabled';
@@ -141,6 +144,37 @@
141
  const LOW_EMAIL_TRANSACTIONS = "<div class='custom-notice notice notice-warning low_email-notice MOWrn'><p><p class='notice-message'><img style='width:15px;' src='".MO2F_PLUGIN_URL.'/includes/images/miniorange_icon.png'."'>&nbsp&nbspYou have left very few Email transaction. We advise you to recharge or change 2FA method before you have no Email left.</p><a class='notice-button' href='".MoWpnsConstants::rechargeLink."' target='_blank' style='margin-right: 15px;'>RECHARGE</a><a class='notice-button' href='admin.php?page=mo_2fa_two_fa'id='setuptwofa_redirect' style='margin-right: 15px;'>SET UP ANOTHER 2FA</a><button class='email_low_dismiss notice-button' style='margin-right: 15px;'><i>DISMISS</i></button><button class='email_low_dismiss_always notice-button'><i>NEVER SHOW AGAIN</i></button></p></div>";
142
 
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
 
146
 
63
  //support form
64
  const SUPPORT_FORM_VALUES = "Please submit your query along with email.";
65
  const SUPPORT_FORM_SENT = "Thanks for getting in touch! We shall get back to you shortly.";
66
+ const TRIAL_REQUEST_SENT = "Thanks for getting in touch! We shall provide you the trial plugin on your email shortly.";
67
+ const TRIAL_REQUEST_ALREADY_SENT = "You have already sent a trial request for premium plugin. We will get back to you on your email soon.";
68
  const SUPPORT_FORM_ERROR = "Your query could not be submitted. Please try again.";
69
  // request demo form
70
  const DEMO_FORM_ERROR = "Please fill out all the fields.";
75
  const UNKNOWN_ERROR = "Error processing your request. Please try again.";
76
  const CONFIG_SAVED = "Configuration saved successfully.";
77
  const REQUIRED_FIELDS = "Please enter all the required fields";
78
+ CONST SELECT_A_PLAN = "Please select a plan";
79
  const RESET_PASS = "You password has been reset successfully and sent to your registered email. Please check your mailbox.";
80
  const TEMPLATE_SAVED = "Email template saved.";
81
  const GET_BACKUP_CODES = "<div class='custom-notice notice notice-warning backupcodes-notice'><p><p class='notice-message'><b>Please download backup codes using the 'Get backup codes' button to avoid getting locked out. Backup codes will be emailed as well as downloaded.</b></p><button class='backup_codes_dismiss notice-button'><i>NEVER SHOW AGAIN</i></button></p></div>";
94
  const INVALID_CRED = 'Invalid username or password. Please try again.';
95
  const REQUIRED_OTP = 'Please enter a value in OTP field.';
96
  const INVALID_OTP = 'Invalid one time passcode. Please enter a valid passcode.';
97
+ const INVALID_PHONE = 'Please enter a valid phone number.';
98
  const PASS_MISMATCH = 'Password and Confirm Password do not match.';
99
  const CRON_DB_BACKUP_ENABLE = 'Scheduled Database Backup enabled';
100
  const CRON_DB_BACKUP_DISABLE = 'Scheduled Database Backup disabled';
144
  const LOW_EMAIL_TRANSACTIONS = "<div class='custom-notice notice notice-warning low_email-notice MOWrn'><p><p class='notice-message'><img style='width:15px;' src='".MO2F_PLUGIN_URL.'/includes/images/miniorange_icon.png'."'>&nbsp&nbspYou have left very few Email transaction. We advise you to recharge or change 2FA method before you have no Email left.</p><a class='notice-button' href='".MoWpnsConstants::rechargeLink."' target='_blank' style='margin-right: 15px;'>RECHARGE</a><a class='notice-button' href='admin.php?page=mo_2fa_two_fa'id='setuptwofa_redirect' style='margin-right: 15px;'>SET UP ANOTHER 2FA</a><button class='email_low_dismiss notice-button' style='margin-right: 15px;'><i>DISMISS</i></button><button class='email_low_dismiss_always notice-button'><i>NEVER SHOW AGAIN</i></button></p></div>";
145
 
146
 
147
+ const FREE_TRIAL_MESSAGE_TRIAL_PAGE = "
148
+ <div class='notice notice-warning mo2f-notice-warning trial-notice MOWrn' id='mo2f_is-dismissible'>
149
+ <form id='MO2F_FREE_TRIAL_MESSAGE_TRIAL_PAGE' method='post' action=''>
150
+ <p>
151
+ <img style='width:15px;' src='".MO2F_PLUGIN_URL.'includes/images/miniorange_icon.png'."'>&nbsp&nbspInterested in the Trial of<b> 2 Factor Authentication Premium Plugins?</b> Click on the button below to get trial for <strong>7 days</strong>.
152
+ (<em>No credit card required</em>)
153
+ </p>
154
+ <p style='height:25px; padding: 10px;'>
155
+ <a class='button button-primary notice-button' href='admin.php?page=mo2f_trial' id='mo2f_trial_redirect'>Get Trial</a>
156
+ <input type='hidden' name='mo2f_dismiss_trial' value='mo2f_dismiss_trial'/>
157
+ <button type='submit' class='mo2f-trial-dismiss notice-button'><i>DISMISS</i></button>
158
+ </p>
159
+ </form>
160
+ </div>
161
+ ";
162
+
163
+ const FREE_TRIAL_MESSAGE_ACCOUNT_PAGE = "
164
+ <div class='notice notice-warning mo2f-notice-warning trial-notice MOWrn'>
165
+ <form id='MO2F_FREE_TRIAL_MESSAGE_TRIAL_PAGE' method='post' action=''>
166
+ <p>
167
+ <img style='width:15px;' src='".MO2F_PLUGIN_URL.'includes/images/miniorange_icon.png'."'>&nbsp&nbspInterested in the Trial of<b> 2 Factor Authentication Premium Plugins?</b> Click on the button below to get trial for <strong>7 days</strong>.
168
+ (<em>No credit card required</em>)
169
+ </p>
170
+ <p style='height:25px; padding: 10px;'>
171
+ <a class='button button-primary notice-button' href='admin.php?page=mo_2fa_account' id='mo2f_trial_redirect'>Get Trial</a>
172
+ <input type='hidden' name='mo2f_dismiss_trial' value='mo2f_dismiss_trial'/>
173
+ <button type='submit' class='mo2f-trial-dismiss notice-button'><i>DISMISS</i></button>
174
+ </p>
175
+ </form>
176
+ </div>
177
+ ";
178
 
179
 
180
 
helper/utility.php CHANGED
@@ -69,11 +69,11 @@ class MoWpnsUtility
69
  public static function get_client_ip()
70
  {
71
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
72
- return $_SERVER['HTTP_CLIENT_IP'];
73
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
74
- return $_SERVER['HTTP_X_FORWARDED_FOR'];
75
  } else {
76
- return $_SERVER['REMOTE_ADDR'];
77
  }
78
  return '';
79
  }
@@ -128,7 +128,7 @@ class MoWpnsUtility
128
  return $url;
129
  }
130
 
131
- //Function to handle recptcha
132
  function verify_recaptcha($response)
133
  {
134
  $error = new WP_Error();
@@ -144,6 +144,23 @@ class MoWpnsUtility
144
  return $error;
145
  }
146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
  function sendIpBlockedNotification($ipAddress, $reason)
149
  {
@@ -344,11 +361,15 @@ class MoWpnsUtility
344
  $is_plugin_active_for_network = is_plugin_active_for_network( MoWpnsConstants::TWO_FACTOR_SETTINGS);
345
  $is_onprem = get_option('is_onprem');
346
  $WAFEnabled = get_site_option('WAFEnabled');
 
347
  $WAFLevel = get_site_option('WAF');
348
  $NoOf2faUsers = $Mo2fdbQueries->get_no_of_2fa_users();
 
 
349
  $EmailTransactions = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
350
  $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
351
  $SQLInjection = get_option('SQLInjection');
 
352
  $XSSAttack = get_option('XSSAttack');
353
  $RFIAttack = get_option('RFIAttack');
354
  $LFIAttack = get_option('LFIAttack');
@@ -359,6 +380,7 @@ class MoWpnsUtility
359
  $mo2f_enable_brute_force = get_option('mo2f_enable_brute_force');
360
  $space = "<span>&nbsp;&nbsp;&nbsp;</span>";
361
  $browser = $moWpnsUtility->getCurrentBrowser();
 
362
  $specific_plugins = array('UM_Functions'=>'Ultimate Member', 'wc_get_product'=>'WooCommerce','pmpro_gateways'=>'Paid MemberShip Pro');
363
  $backup_codes_remaining = get_user_meta($user_object->ID, 'mo2f_backup_codes', true);
364
  if(is_array($backup_codes_remaining)){
@@ -366,7 +388,7 @@ class MoWpnsUtility
366
  }else{
367
  $backup_codes_remaining = 0;
368
  }
369
- $plugin_configuration ="<br><br><I>Plugin Configuration :-</I>".$space."On-premise:".($is_onprem?"Yes":"No"). $space."2FA method:" . ($mo2f_configured_2FA_method==''?"Not selected":$mo2f_configured_2FA_method).$space."No. of 2FA users :".$NoOf2faUsers.$space."Methods of users:".($other_methods==''?"NONE":$other_methods).$space."Email transactions:".$EmailTransactions.$space."SMS Transactions:".$SMSTransactions.$space.(is_multisite()?"Multisite:Yes":"Single-site:Yes").((mo2f_is_customer_registered())?($space."Customer Key:".$key):($space."Customer Registered:'No")).$space."Browser:".$browser;
370
  if(get_user_meta($user_object->ID, 'mo_backup_code_generated', true) || get_user_meta($user_object->ID, 'mo_backup_code_downloaded', true))
371
  $plugin_configuration=$plugin_configuration.$space."Backup Codes:".$backup_codes_remaining."/5";
372
  $plugins='';
@@ -381,6 +403,7 @@ class MoWpnsUtility
381
  if(is_multisite()){
382
  $plugin_configuration = $plugin_configuration.$space.($is_plugin_active_for_network?"Network activated:'Yes":"Site activated:'Yes");
383
  }
 
384
  if(time()-get_site_option("mo_2fa_pnp")<2592000 && (get_site_option('mo_2fa_plan_type')|| get_site_option('mo_2fa_addon_plan_type'))){
385
  $plugin_configuration=$plugin_configuration.$space."Checked plans:'";
386
  if(get_site_option('mo_2fa_plan_type'))
69
  public static function get_client_ip()
70
  {
71
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
72
+ return sanitize_text_field($_SERVER['HTTP_CLIENT_IP']);
73
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
74
+ return sanitize_text_field($_SERVER['HTTP_X_FORWARDED_FOR']);
75
  } else {
76
+ return sanitize_text_field($_SERVER['REMOTE_ADDR']);
77
  }
78
  return '';
79
  }
128
  return $url;
129
  }
130
 
131
+ //Function to handle recaptcha
132
  function verify_recaptcha($response)
133
  {
134
  $error = new WP_Error();
144
  return $error;
145
  }
146
 
147
+ function verify_recaptcha_3($response)
148
+ {
149
+ $error = new WP_Error();
150
+ if(!empty($response))
151
+ {
152
+ if(!mo2f_ReCaptcha::recaptcha_verify_3($response))
153
+ $error->add('recaptcha_error', __( '<strong>ERROR</strong> : Access Denied.'));
154
+ else
155
+ return true;
156
+ }
157
+ else{
158
+
159
+ $error->add('recaptcha_error', __( '<strong>ERROR</strong> : Please verify the captcha.'));
160
+ }
161
+ return $error;
162
+ }
163
+
164
 
165
  function sendIpBlockedNotification($ipAddress, $reason)
166
  {
361
  $is_plugin_active_for_network = is_plugin_active_for_network( MoWpnsConstants::TWO_FACTOR_SETTINGS);
362
  $is_onprem = get_option('is_onprem');
363
  $WAFEnabled = get_site_option('WAFEnabled');
364
+ $pricing_page_visits = get_site_option('mo2fa_visit',0);
365
  $WAFLevel = get_site_option('WAF');
366
  $NoOf2faUsers = $Mo2fdbQueries->get_no_of_2fa_users();
367
+ $is_inline_used = get_site_option('mo2f_is_inline_used');
368
+ $login_with_mfa_use = get_site_option('mo2f_login_with_mfa_use');
369
  $EmailTransactions = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
370
  $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
371
  $SQLInjection = get_option('SQLInjection');
372
+ $user_profile = get_option('mo2fa_userProfile_method');
373
  $XSSAttack = get_option('XSSAttack');
374
  $RFIAttack = get_option('RFIAttack');
375
  $LFIAttack = get_option('LFIAttack');
380
  $mo2f_enable_brute_force = get_option('mo2f_enable_brute_force');
381
  $space = "<span>&nbsp;&nbsp;&nbsp;</span>";
382
  $browser = $moWpnsUtility->getCurrentBrowser();
383
+ $user_count = isset((count_users())['total_users'])?(count_users())['total_users']:'';
384
  $specific_plugins = array('UM_Functions'=>'Ultimate Member', 'wc_get_product'=>'WooCommerce','pmpro_gateways'=>'Paid MemberShip Pro');
385
  $backup_codes_remaining = get_user_meta($user_object->ID, 'mo2f_backup_codes', true);
386
  if(is_array($backup_codes_remaining)){
388
  }else{
389
  $backup_codes_remaining = 0;
390
  }
391
+ $plugin_configuration ="<br><br><I>Plugin Configuration :-</I>".$space."On-premise:".($is_onprem?"Yes":"No"). $space."User Profile 2fa:".($user_profile?$user_profile:"No"). $space."Login with MFA:".($login_with_mfa_use == '1'?"Yes":"No"). $space."Inline Registration:".($is_inline_used == '1'?"Yes":"No"). $space."2FA method:" . ($mo2f_configured_2FA_method==''?"Not selected":$mo2f_configured_2FA_method).$space."No. of 2FA users :".$NoOf2faUsers.$space."Total users : ".$user_count.$space."Methods of users:".($other_methods==''?"NONE":$other_methods).$space."Email transactions:".$EmailTransactions.$space."SMS Transactions:".$SMSTransactions.$space.(is_multisite()?"Multisite:Yes":"Single-site:Yes").((mo2f_is_customer_registered())?($space."Customer Key:".$key):($space."Customer Registered:'No")).$space."Browser:".$browser;
392
  if(get_user_meta($user_object->ID, 'mo_backup_code_generated', true) || get_user_meta($user_object->ID, 'mo_backup_code_downloaded', true))
393
  $plugin_configuration=$plugin_configuration.$space."Backup Codes:".$backup_codes_remaining."/5";
394
  $plugins='';
403
  if(is_multisite()){
404
  $plugin_configuration = $plugin_configuration.$space.($is_plugin_active_for_network?"Network activated:'Yes":"Site activated:'Yes");
405
  }
406
+ $plugin_configuration=$plugin_configuration.$space."Pricing Page visits : ".$pricing_page_visits;
407
  if(time()-get_site_option("mo_2fa_pnp")<2592000 && (get_site_option('mo_2fa_plan_type')|| get_site_option('mo_2fa_addon_plan_type'))){
408
  $plugin_configuration=$plugin_configuration.$space."Checked plans:'";
409
  if(get_site_option('mo_2fa_plan_type'))
includes/css/bootstrap.min.css CHANGED
@@ -1246,8 +1246,21 @@ button.mo2f_close {
1246
  }
1247
 
1248
 
 
 
 
 
 
 
 
 
 
 
1249
 
1250
-
 
 
 
1251
 
1252
  .mo2f-modal-backdrop {
1253
 
1246
  }
1247
 
1248
 
1249
+ .mo2f-styled-radio_conf {
1250
+ width: 25px;
1251
+ height: 32px;
1252
+ position: relative;
1253
+ display: inline-block;
1254
+ border-radius: 51%;
1255
+ background-color: #e6e6e6;
1256
+ float: left;
1257
+ margin-top: -7px;
1258
+ }
1259
 
1260
+ .mo2f-styled-radio-text_conf {
1261
+ margin-left: 10px;
1262
+ font-size: medium;
1263
+ }
1264
 
1265
  .mo2f-modal-backdrop {
1266
 
includes/css/button_styles.css CHANGED
@@ -36,11 +36,11 @@
36
  }
37
 
38
  input:checked + .mo_wpns_slider {
39
- background-color: #20b2aa;
40
  }
41
 
42
  input:focus + .mo_wpns_slider {
43
- box-shadow: 0 0 1px #20b2aa;
44
  }
45
 
46
  input:checked + .mo_wpns_slider:before {
@@ -91,10 +91,10 @@ input:checked + .mo_wpns_slider:before {
91
  transition: .4s;
92
  }
93
  input:checked + .mo_wpns_slider_small {
94
- background-color: #20b2aa;
95
  }
96
  input:focus + .mo_wpns_slider_small {
97
- box-shadow: 0 0 1px #20b2aa;
98
  }
99
 
100
  input:checked + .mo_wpns_slider_small:before {
36
  }
37
 
38
  input:checked + .mo_wpns_slider {
39
+ background-color: #413c69;
40
  }
41
 
42
  input:focus + .mo_wpns_slider {
43
+ box-shadow: 0 0 1px #4a47a3;
44
  }
45
 
46
  input:checked + .mo_wpns_slider:before {
91
  transition: .4s;
92
  }
93
  input:checked + .mo_wpns_slider_small {
94
+ background-color: #2271b1;
95
  }
96
  input:focus + .mo_wpns_slider_small {
97
+ box-shadow: 0 0 1px #2271b1;
98
  }
99
 
100
  input:checked + .mo_wpns_slider_small:before {
includes/css/christmas.gif ADDED
Binary file
includes/css/datetime-style-settings.css DELETED
@@ -1,576 +0,0 @@
1
- /**
2
- * jQuery Timepicker
3
- * http://timepicker.co
4
- * https://cdnjs.cloudflare.com/ajax/libs/timepicker/1.3.5/jquery.timepicker.min.css
5
- * Enhances standard form input fields helping users to select (or type) times.
6
- *
7
- * Copyright (c) 2016 Willington Vega; Licensed MIT, GPL
8
- */
9
-
10
- .ui-timepicker-container {
11
- position: absolute;
12
- overflow: hidden;
13
- box-sizing: border-box;
14
- }
15
-
16
- .ui-timepicker {
17
- box-sizing: content-box;
18
- display: block;
19
- height: 205px;
20
- list-style: none outside none;
21
- margin: 0;
22
- padding: 0 1px;
23
- text-align: center;
24
- }
25
-
26
- .ui-timepicker-viewport {
27
- box-sizing: content-box;
28
- display: block;
29
- height: 148px;
30
- margin: 0;
31
- padding: 0;
32
- overflow: auto;
33
- overflow-x: hidden; /* IE */
34
- }
35
-
36
- .ui-timepicker-standard {
37
- /* overwrites .ui-widget */
38
- font-family: Verdana,Arial,sans-serif;
39
- font-size: 1.1em;
40
- /* overwrites .ui-widget-content */
41
- background-color: #FFF;
42
- border: 1px solid #AAA;
43
- color: #222;
44
- /* overwrites .ui-menu */
45
- margin: 0;
46
- padding: 2px;
47
- height: 155px !important;
48
- }
49
- .ui-timepicker-standard a {
50
- border: 1px solid transparent;
51
- color: #222;
52
- display: block;
53
- padding: 0.2em 0.4em;
54
- text-decoration: none;
55
- }
56
- .ui-timepicker-standard .ui-state-hover {
57
- /* overwrites .ui-state-hover */
58
- background-color: #DADADA;
59
- border: 1px solid #999;
60
- font-weight: normal;
61
- color: #212121;
62
- }
63
- .ui-timepicker-standard .ui-menu-item {
64
- /* overwrites .ui-menu and .ui-menu-item */
65
- /*clear: left;
66
- float: left;*/
67
- margin: 0;
68
- padding: 0;
69
- }
70
-
71
- .ui-timepicker-corners,
72
- .ui-timepicker-corners .ui-corner-all {
73
- -moz-border-radius: 4px;
74
- -webkit-border-radius: 4px;
75
- border-radius: 4px;
76
- }
77
-
78
- .ui-timepicker-hidden {
79
- /* overwrites .ui-helper-hidden */
80
- display: none;
81
- }
82
-
83
- .ui-timepicker-no-scrollbar .ui-timepicker {
84
- border: none;
85
- }
86
-
87
-
88
-
89
- /* ADDED FOR TIMEZONE DROPDOWN - https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css */
90
-
91
- .select2-container {
92
- box-sizing: border-box;
93
- display: inline-block;
94
- margin: 0;
95
- width: 90% !important;
96
- position: relative;
97
- vertical-align: middle; }
98
- .select2-container .select2-selection--single {
99
- box-sizing: border-box;
100
- cursor: pointer;
101
- display: block;
102
- height: 28px;
103
- user-select: none;
104
- -webkit-user-select: none; }
105
- .select2-container .select2-selection--single .select2-selection__rendered {
106
- display: block;
107
- padding-left: 8px;
108
- padding-right: 20px;
109
- overflow: hidden;
110
- text-overflow: ellipsis;
111
- white-space: nowrap; }
112
- .select2-container .select2-selection--single .select2-selection__clear {
113
- position: relative; }
114
- .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
115
- padding-right: 8px;
116
- padding-left: 20px; }
117
- .select2-container .select2-selection--multiple {
118
- box-sizing: border-box;
119
- cursor: pointer;
120
- display: block;
121
- min-height: 32px;
122
- user-select: none;
123
- -webkit-user-select: none; }
124
- .select2-container .select2-selection--multiple .select2-selection__rendered {
125
- display: inline-block;
126
- overflow: hidden;
127
- padding-left: 8px;
128
- text-overflow: ellipsis;
129
- white-space: nowrap; }
130
- .select2-container .select2-search--inline {
131
- float: left; }
132
- .select2-container .select2-search--inline .select2-search__field {
133
- box-sizing: border-box;
134
- border: none;
135
- font-size: 100%;
136
- margin-top: 5px;
137
- padding: 0; }
138
- .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
139
- -webkit-appearance: none; }
140
-
141
- .select2-dropdown {
142
- background-color: white;
143
- border: 1px solid #aaa;
144
- border-radius: 4px;
145
- box-sizing: border-box;
146
- display: block;
147
- position: absolute;
148
- left: -100000px;
149
- width: 100%;
150
- z-index: 1051; }
151
-
152
- .select2-results {
153
- display: block; }
154
-
155
- .select2-results__options {
156
- list-style: none;
157
- margin: 0;
158
- padding: 0; }
159
-
160
- .select2-results__option {
161
- padding: 6px;
162
- user-select: none;
163
- -webkit-user-select: none; }
164
- .select2-results__option[aria-selected] {
165
- cursor: pointer; }
166
-
167
- .select2-container--open .select2-dropdown {
168
- left: 0; }
169
-
170
- .select2-container--open .select2-dropdown--above {
171
- border-bottom: none;
172
- border-bottom-left-radius: 0;
173
- border-bottom-right-radius: 0; }
174
-
175
- .select2-container--open .select2-dropdown--below {
176
- border-top: none;
177
- border-top-left-radius: 0;
178
- border-top-right-radius: 0; }
179
-
180
- .select2-search--dropdown {
181
- display: block;
182
- padding: 4px; }
183
- .select2-search--dropdown .select2-search__field {
184
- padding: 4px;
185
- width: 100%;
186
- box-sizing: border-box; }
187
- .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
188
- -webkit-appearance: none; }
189
- .select2-search--dropdown.select2-search--hide {
190
- display: none; }
191
-
192
- .select2-close-mask {
193
- border: 0;
194
- margin: 0;
195
- padding: 0;
196
- display: block;
197
- position: fixed;
198
- left: 0;
199
- top: 0;
200
- min-height: 100%;
201
- min-width: 100%;
202
- height: auto;
203
- width: auto;
204
- opacity: 0;
205
- z-index: 99;
206
- background-color: #fff;
207
- filter: alpha(opacity=0); }
208
-
209
- .select2-hidden-accessible {
210
- border: 0 !important;
211
- clip: rect(0 0 0 0) !important;
212
- height: 1px !important;
213
- margin: -1px !important;
214
- overflow: hidden !important;
215
- padding: 0 !important;
216
- position: absolute !important;
217
- width: 1px !important; }
218
-
219
- .select2-container--default .select2-selection--single {
220
- background-color: #fff;
221
- border: 1px solid #aaa;
222
- border-radius: 4px; }
223
- .select2-container--default .select2-selection--single .select2-selection__rendered {
224
- color: #444;
225
- line-height: 28px; }
226
- .select2-container--default .select2-selection--single .select2-selection__clear {
227
- cursor: pointer;
228
- float: right;
229
- font-weight: bold; }
230
- .select2-container--default .select2-selection--single .select2-selection__placeholder {
231
- color: #999; }
232
- .select2-container--default .select2-selection--single .select2-selection__arrow {
233
- height: 26px;
234
- position: absolute;
235
- top: 1px;
236
- right: 1px;
237
- width: 20px; }
238
- .select2-container--default .select2-selection--single .select2-selection__arrow b {
239
- border-color: #888 transparent transparent transparent;
240
- border-style: solid;
241
- border-width: 5px 4px 0 4px;
242
- height: 0;
243
- left: 50%;
244
- margin-left: -4px;
245
- margin-top: -2px;
246
- position: absolute;
247
- top: 50%;
248
- width: 0; }
249
-
250
- .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
251
- float: left; }
252
-
253
- .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
254
- left: 1px;
255
- right: auto; }
256
-
257
- .select2-container--default.select2-container--disabled .select2-selection--single {
258
- background-color: #eee;
259
- cursor: default; }
260
- .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
261
- display: none; }
262
-
263
- .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
264
- border-color: transparent transparent #888 transparent;
265
- border-width: 0 4px 5px 4px; }
266
-
267
- .select2-container--default .select2-selection--multiple {
268
- background-color: white;
269
- border: 1px solid #aaa;
270
- border-radius: 4px;
271
- cursor: text; }
272
- .select2-container--default .select2-selection--multiple .select2-selection__rendered {
273
- box-sizing: border-box;
274
- list-style: none;
275
- margin: 0;
276
- padding: 0 5px;
277
- width: 100%; }
278
- .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
279
- list-style: none; }
280
- .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
281
- color: #999;
282
- margin-top: 5px;
283
- float: left; }
284
- .select2-container--default .select2-selection--multiple .select2-selection__clear {
285
- cursor: pointer;
286
- float: right;
287
- font-weight: bold;
288
- margin-top: 5px;
289
- margin-right: 10px; }
290
- .select2-container--default .select2-selection--multiple .select2-selection__choice {
291
- background-color: #e4e4e4;
292
- border: 1px solid #aaa;
293
- border-radius: 4px;
294
- cursor: default;
295
- float: left;
296
- margin-right: 5px;
297
- margin-top: 5px;
298
- padding: 0 5px; }
299
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
300
- color: #999;
301
- cursor: pointer;
302
- display: inline-block;
303
- font-weight: bold;
304
- margin-right: 2px; }
305
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
306
- color: #333; }
307
-
308
- .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
309
- float: right; }
310
-
311
- .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
312
- margin-left: 5px;
313
- margin-right: auto; }
314
-
315
- .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
316
- margin-left: 2px;
317
- margin-right: auto; }
318
-
319
- .select2-container--default.select2-container--focus .select2-selection--multiple {
320
- border: solid black 1px;
321
- outline: 0; }
322
-
323
- .select2-container--default.select2-container--disabled .select2-selection--multiple {
324
- background-color: #eee;
325
- cursor: default; }
326
-
327
- .select2-container--default.select2-container--disabled .select2-selection__choice__remove {
328
- display: none; }
329
-
330
- .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
331
- border-top-left-radius: 0;
332
- border-top-right-radius: 0; }
333
-
334
- .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
335
- border-bottom-left-radius: 0;
336
- border-bottom-right-radius: 0; }
337
-
338
- .select2-container--default .select2-search--dropdown .select2-search__field {
339
- border: 1px solid #aaa; }
340
-
341
- .select2-container--default .select2-search--inline .select2-search__field {
342
- background: transparent;
343
- border: none;
344
- outline: 0;
345
- box-shadow: none;
346
- -webkit-appearance: textfield; }
347
-
348
- .select2-container--default .select2-results > .select2-results__options {
349
- max-height: 200px;
350
- overflow-y: auto; }
351
-
352
- .select2-container--default .select2-results__option[role=group] {
353
- padding: 0; }
354
-
355
- .select2-container--default .select2-results__option[aria-disabled=true] {
356
- color: #999; }
357
-
358
- .select2-container--default .select2-results__option[aria-selected=true] {
359
- background-color: #ddd; }
360
-
361
- .select2-container--default .select2-results__option .select2-results__option {
362
- padding-left: 1em; }
363
- .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
364
- padding-left: 0; }
365
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
366
- margin-left: -1em;
367
- padding-left: 2em; }
368
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
369
- margin-left: -2em;
370
- padding-left: 3em; }
371
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
372
- margin-left: -3em;
373
- padding-left: 4em; }
374
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
375
- margin-left: -4em;
376
- padding-left: 5em; }
377
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
378
- margin-left: -5em;
379
- padding-left: 6em; }
380
-
381
- .select2-container--default .select2-results__option--highlighted[aria-selected] {
382
- background-color: #5897fb;
383
- color: white; }
384
-
385
- .select2-container--default .select2-results__group {
386
- cursor: default;
387
- display: block;
388
- padding: 6px; }
389
-
390
- .select2-container--classic .select2-selection--single {
391
- background-color: #f7f7f7;
392
- border: 1px solid #aaa;
393
- border-radius: 4px;
394
- outline: 0;
395
- background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
396
- background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
397
- background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
398
- background-repeat: repeat-x;
399
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
400
- .select2-container--classic .select2-selection--single:focus {
401
- border: 1px solid #5897fb; }
402
- .select2-container--classic .select2-selection--single .select2-selection__rendered {
403
- color: #444;
404
- line-height: 28px; }
405
- .select2-container--classic .select2-selection--single .select2-selection__clear {
406
- cursor: pointer;
407
- float: right;
408
- font-weight: bold;
409
- margin-right: 10px; }
410
- .select2-container--classic .select2-selection--single .select2-selection__placeholder {
411
- color: #999; }
412
- .select2-container--classic .select2-selection--single .select2-selection__arrow {
413
- background-color: #ddd;
414
- border: none;
415
- border-left: 1px solid #aaa;
416
- border-top-right-radius: 4px;
417
- border-bottom-right-radius: 4px;
418
- height: 26px;
419
- position: absolute;
420
- top: 1px;
421
- right: 1px;
422
- width: 20px;
423
- background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
424
- background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
425
- background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
426
- background-repeat: repeat-x;
427
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
428
- .select2-container--classic .select2-selection--single .select2-selection__arrow b {
429
- border-color: #888 transparent transparent transparent;
430
- border-style: solid;
431
- border-width: 5px 4px 0 4px;
432
- height: 0;
433
- left: 50%;
434
- margin-left: -4px;
435
- margin-top: -2px;
436
- position: absolute;
437
- top: 50%;
438
- width: 0; }
439
-
440
- .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
441
- float: left; }
442
-
443
- .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
444
- border: none;
445
- border-right: 1px solid #aaa;
446
- border-radius: 0;
447
- border-top-left-radius: 4px;
448
- border-bottom-left-radius: 4px;
449
- left: 1px;
450
- right: auto; }
451
-
452
- .select2-container--classic.select2-container--open .select2-selection--single {
453
- border: 1px solid #5897fb; }
454
- .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
455
- background: transparent;
456
- border: none; }
457
- .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
458
- border-color: transparent transparent #888 transparent;
459
- border-width: 0 4px 5px 4px; }
460
-
461
- .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
462
- border-top: none;
463
- border-top-left-radius: 0;
464
- border-top-right-radius: 0;
465
- background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
466
- background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
467
- background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
468
- background-repeat: repeat-x;
469
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
470
-
471
- .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
472
- border-bottom: none;
473
- border-bottom-left-radius: 0;
474
- border-bottom-right-radius: 0;
475
- background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
476
- background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
477
- background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
478
- background-repeat: repeat-x;
479
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
480
-
481
- .select2-container--classic .select2-selection--multiple {
482
- background-color: white;
483
- border: 1px solid #aaa;
484
- border-radius: 4px;
485
- cursor: text;
486
- outline: 0; }
487
- .select2-container--classic .select2-selection--multiple:focus {
488
- border: 1px solid #5897fb; }
489
- .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
490
- list-style: none;
491
- margin: 0;
492
- padding: 0 5px; }
493
- .select2-container--classic .select2-selection--multiple .select2-selection__clear {
494
- display: none; }
495
- .select2-container--classic .select2-selection--multiple .select2-selection__choice {
496
- background-color: #e4e4e4;
497
- border: 1px solid #aaa;
498
- border-radius: 4px;
499
- cursor: default;
500
- float: left;
501
- margin-right: 5px;
502
- margin-top: 5px;
503
- padding: 0 5px; }
504
- .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
505
- color: #888;
506
- cursor: pointer;
507
- display: inline-block;
508
- font-weight: bold;
509
- margin-right: 2px; }
510
- .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
511
- color: #555; }
512
-
513
- .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
514
- float: right; }
515
-
516
- .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
517
- margin-left: 5px;
518
- margin-right: auto; }
519
-
520
- .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
521
- margin-left: 2px;
522
- margin-right: auto; }
523
-
524
- .select2-container--classic.select2-container--open .select2-selection--multiple {
525
- border: 1px solid #5897fb; }
526
-
527
- .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
528
- border-top: none;
529
- border-top-left-radius: 0;
530
- border-top-right-radius: 0; }
531
-
532
- .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
533
- border-bottom: none;
534
- border-bottom-left-radius: 0;
535
- border-bottom-right-radius: 0; }
536
-
537
- .select2-container--classic .select2-search--dropdown .select2-search__field {
538
- border: 1px solid #aaa;
539
- outline: 0; }
540
-
541
- .select2-container--classic .select2-search--inline .select2-search__field {
542
- outline: 0;
543
- box-shadow: none; }
544
-
545
- .select2-container--classic .select2-dropdown {
546
- background-color: white;
547
- border: 1px solid transparent; }
548
-
549
- .select2-container--classic .select2-dropdown--above {
550
- border-bottom: none; }
551
-
552
- .select2-container--classic .select2-dropdown--below {
553
- border-top: none; }
554
-
555
- .select2-container--classic .select2-results > .select2-results__options {
556
- max-height: 200px;
557
- overflow-y: auto; }
558
-
559
- .select2-container--classic .select2-results__option[role=group] {
560
- padding: 0; }
561
-
562
- .select2-container--classic .select2-results__option[aria-disabled=true] {
563
- color: grey; }
564
-
565
- .select2-container--classic .select2-results__option--highlighted[aria-selected] {
566
- background-color: #3875d7;
567
- color: white; }
568
-
569
- .select2-container--classic .select2-results__group {
570
- cursor: default;
571
- display: block;
572
- padding: 6px; }
573
-
574
- .select2-container--classic.select2-container--open .select2-dropdown {
575
- border-color: #5897fb; }
576
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/datetime-style-settings.min.css DELETED
@@ -1 +0,0 @@
1
- .ui-timepicker-container{position:absolute;overflow:hidden;box-sizing:border-box}.ui-timepicker{box-sizing:content-box;display:block;height:205px;list-style:none outside none;margin:0;padding:0 1px;text-align:center}.ui-timepicker-viewport{box-sizing:content-box;display:block;height:148px;margin:0;padding:0;overflow:auto;overflow-x:hidden}.ui-timepicker-standard{font-family:Verdana,Arial,sans-serif;font-size:1.1em;background-color:#fff;border:1px solid #aaa;color:#222;margin:0;padding:2px;height:155px!important}.ui-timepicker-standard a{border:1px solid transparent;color:#222;display:block;padding:.2em .4em;text-decoration:none}.ui-timepicker-standard .ui-state-hover{background-color:#dadada;border:1px solid #999;font-weight:400;color:#212121}.ui-timepicker-standard .ui-menu-item{margin:0;padding:0}.ui-timepicker-corners,.ui-timepicker-corners .ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-timepicker-hidden{display:none}.ui-timepicker-no-scrollbar .ui-timepicker{border:none}.select2-container{box-sizing:border-box;display:inline-block;margin:0;width:90%!important;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
 
includes/css/hide-login-form.css CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  body.login div#login {
2
  display: block;
3
  }
1
+ .mo2fa_visible{
2
+ top: 20px !important;
3
+ }
4
  body.login div#login {
5
  display: block;
6
  }
includes/css/jquery-ui.min.css CHANGED
@@ -1,4 +1 @@
1
- * http://jqueryui.com
2
- * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
3
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px
4
- * Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;max-height:100px;overflow-y:auto;overflow-x:hidden}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==);height:100%;opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:700}.ui-widget-header a{color:#333}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:400;color:#454545}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#454545;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:#ededed;font-weight:400;color:#2b2b2b}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #003eff;background:#007fff;font-weight:400;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:3px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}
1
+ * http: //jqueryui.com * Includes: core.css,.ui-helper-hidden,accordion.css,autocomplete.css,button.css,checkboxradio.css,controlgroup.css,dialog.css,draggable.css,menu.css,progressbar.css,resizable.css,selectable.css,selectmenu.css,slider.css,sortable.css,spinner.css,tabs.css,theme.css * To view and modify this theme,tooltip.css{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default;max-height:100px;overflow-y:auto;overflow-x:hidden}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==);height:100%;opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:700}.ui-widget-header a{color:#333}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:400;color:#454545}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#454545;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:#ededed;font-weight:400;color:#2b2b2b}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #003eff;background:#007fff;font-weight:400;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:3px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}
 
 
 
includes/css/jquery.ui.css CHANGED
@@ -741,178 +741,3 @@ button.ui-button::-moz-focus-inner {
741
  filter: Alpha(Opacity=30); /* support: IE8 */
742
  border-radius: 8px;
743
  }
744
- .ui-datepicker {
745
- width: 17em;
746
- padding: .2em .2em 0;
747
- display: none;
748
- }
749
- .ui-datepicker .ui-datepicker-header {
750
- position: relative;
751
- padding: .2em 0;
752
- }
753
- .ui-datepicker .ui-datepicker-prev,
754
- .ui-datepicker .ui-datepicker-next {
755
- position: absolute;
756
- top: 2px;
757
- width: 1.8em;
758
- height: 1.8em;
759
- }
760
- .ui-datepicker .ui-datepicker-prev-hover,
761
- .ui-datepicker .ui-datepicker-next-hover {
762
- top: 1px;
763
- }
764
- .ui-datepicker .ui-datepicker-prev {
765
- left: 2px;
766
- }
767
- .ui-datepicker .ui-datepicker-next {
768
- right: 2px;
769
- }
770
- .ui-datepicker .ui-datepicker-prev-hover {
771
- left: 1px;
772
- }
773
- .ui-datepicker .ui-datepicker-next-hover {
774
- right: 1px;
775
- }
776
- .ui-datepicker .ui-datepicker-prev span,
777
- .ui-datepicker .ui-datepicker-next span {
778
- display: block;
779
- position: absolute;
780
- left: 50%;
781
- margin-left: -8px;
782
- top: 50%;
783
- margin-top: -8px;
784
- }
785
- .ui-datepicker .ui-datepicker-title {
786
- margin: 0 2.3em;
787
- line-height: 1.8em;
788
- text-align: center;
789
- }
790
- .ui-datepicker .ui-datepicker-title select {
791
- font-size: 1em;
792
- margin: 1px 0;
793
- }
794
- .ui-datepicker select.ui-datepicker-month,
795
- .ui-datepicker select.ui-datepicker-year {
796
- width: 45%;
797
- }
798
- .ui-datepicker table {
799
- width: 100%;
800
- font-size: .9em;
801
- border-collapse: collapse;
802
- margin: 0 0 .4em;
803
- }
804
- .ui-datepicker th {
805
- padding: .7em .3em;
806
- text-align: center;
807
- font-weight: bold;
808
- border: 0;
809
- }
810
- .ui-datepicker td {
811
- border: 0;
812
- padding: 1px;
813
- }
814
- .ui-datepicker td span,
815
- .ui-datepicker td a {
816
- display: block;
817
- padding: .2em;
818
- text-align: right;
819
- text-decoration: none;
820
- }
821
- .ui-datepicker .ui-datepicker-buttonpane {
822
- background-image: none;
823
- margin: .7em 0 0 0;
824
- padding: 0 .2em;
825
- border-left: 0;
826
- border-right: 0;
827
- border-bottom: 0;
828
- }
829
- .ui-datepicker .ui-datepicker-buttonpane button {
830
- float: right;
831
- margin: .5em .2em .4em;
832
- cursor: pointer;
833
- padding: .2em .6em .3em .6em;
834
- width: auto;
835
- overflow: visible;
836
- }
837
- .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
838
- float: left;
839
- }
840
-
841
- /* with multiple calendars */
842
- .ui-datepicker.ui-datepicker-multi {
843
- width: auto;
844
- }
845
- .ui-datepicker-multi .ui-datepicker-group {
846
- float: left;
847
- }
848
- .ui-datepicker-multi .ui-datepicker-group table {
849
- width: 95%;
850
- margin: 0 auto .4em;
851
- }
852
- .ui-datepicker-multi-2 .ui-datepicker-group {
853
- width: 50%;
854
- }
855
- .ui-datepicker-multi-3 .ui-datepicker-group {
856
- width: 33.3%;
857
- }
858
- .ui-datepicker-multi-4 .ui-datepicker-group {
859
- width: 25%;
860
- }
861
- .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
862
- .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
863
- border-left-width: 0;
864
- }
865
- .ui-datepicker-multi .ui-datepicker-buttonpane {
866
- clear: left;
867
- }
868
- .ui-datepicker-row-break {
869
- clear: both;
870
- width: 100%;
871
- font-size: 0;
872
- }
873
-
874
- /* RTL support */
875
- .ui-datepicker-rtl {
876
- direction: rtl;
877
- }
878
- .ui-datepicker-rtl .ui-datepicker-prev {
879
- right: 2px;
880
- left: auto;
881
- }
882
- .ui-datepicker-rtl .ui-datepicker-next {
883
- left: 2px;
884
- right: auto;
885
- }
886
- .ui-datepicker-rtl .ui-datepicker-prev:hover {
887
- right: 1px;
888
- left: auto;
889
- }
890
- .ui-datepicker-rtl .ui-datepicker-next:hover {
891
- left: 1px;
892
- right: auto;
893
- }
894
- .ui-datepicker-rtl .ui-datepicker-buttonpane {
895
- clear: right;
896
- }
897
- .ui-datepicker-rtl .ui-datepicker-buttonpane button {
898
- float: left;
899
- }
900
- .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
901
- .ui-datepicker-rtl .ui-datepicker-group {
902
- float: right;
903
- }
904
- .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
905
- .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
906
- border-right-width: 0;
907
- border-left-width: 1px;
908
- }
909
-
910
- /* Icons */
911
- .ui-datepicker .ui-icon {
912
- display: block;
913
- text-indent: -99999px;
914
- overflow: hidden;
915
- background-repeat: no-repeat;
916
- left: .5em;
917
- top: .3em;
918
- }
741
  filter: Alpha(Opacity=30); /* support: IE8 */
742
  border-radius: 8px;
743
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/popup.css CHANGED
@@ -24,7 +24,7 @@
24
  height: 80%;
25
  display: block;
26
  background: white;
27
- border: 2px solid #20b2aa;
28
  border-radius: 20px;
29
  padding: 1rem;
30
  padding-top: 0px;
@@ -36,7 +36,7 @@
36
  }
37
 
38
  #mo_popup_id input[type="radio"]:checked + label {
39
- background: #20b2aa;
40
  color: hsla(215, 0%, 100%, 1);
41
  &::after {
42
  color: hsla(215, 5%, 25%, 1);
24
  height: 80%;
25
  display: block;
26
  background: white;
27
+ border: 2px solid #2271b1;
28
  border-radius: 20px;
29
  padding: 1rem;
30
  padding-top: 0px;
36
  }
37
 
38
  #mo_popup_id input[type="radio"]:checked + label {
39
+ background: #2271b1;
40
  color: hsla(215, 0%, 100%, 1);
41
  &::after {
42
  color: hsla(215, 5%, 25%, 1);
includes/css/style_settings.css CHANGED
@@ -1,10 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  .mo2f-chat-popup {
2
  display: none;
3
  position: fixed;
4
  bottom: 0;
5
  right: 15px;
6
  border: 3px solid #f1f1f1;
7
- z-index: 9;
8
  }
9
  .mo2f-open-button {
10
  background-color: #555;
@@ -27,6 +57,22 @@
27
  float: left;
28
  }
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  .mo2f-form-container textarea {
32
  width: 100%;
@@ -77,23 +123,22 @@
77
  text-decoration: none;
78
  cursor: pointer;
79
  }
 
 
80
  .mo-2fa-help-button-text {
81
  cursor: pointer;
82
  font-size: 16px;
83
- background-color: #002ab6;
84
- box-shadow: 1px 1px 10px 3px #8e8e9c;
85
  bottom: 3%;
86
  right: 7%;
87
  position: fixed;
88
  font-weight: 700;
89
  color: #fff;
90
- border-top-left-radius: 15px;
91
- border-top-right-radius: 15px;
92
- border-bottom-right-radius: 15px;
93
- border-bottom-left-radius: 15px;
94
- border: 3px solid #002ab6;
95
  padding: 9px;
96
  transition: all 3s ease-in-out;
 
97
  }
98
  .mo_support_input_label {
99
  color: #999;
@@ -108,7 +153,7 @@
108
  height: 0;
109
  position: absolute;
110
  border-top: 15px solid transparent;
111
- border-left: 30px solid #002ab6;
112
  border-bottom: 15px solid transparent;
113
  right: -32px;
114
  top: 16px;
@@ -169,6 +214,11 @@
169
  right:13%!important
170
  }
171
  }
 
 
 
 
 
172
  .mo-2fa-mail-button
173
  {
174
  bottom: 2.5%;
@@ -184,22 +234,21 @@
184
  box-shadow: 1px 1px 10px 3px #8e8e9c;
185
  }
186
  .mo2f_blue_premium_features{
187
- cursor: pointer;
188
  margin: 2px;
189
- color:#20b2aa;
190
- border: 2px solid #20b2aa;
 
191
  text-decoration: none;
192
  padding: 5px;
193
  font-size: 15px;
194
  }
195
  .mo2f_btn_premium_features
196
  {
197
- background-color: #20b2aa;
198
  color: #fff;
199
  cursor: pointer;
200
  margin: 2px;
201
- border-radius: 3px;
202
- border: 2px solid #20b2aa;
203
  text-decoration: none;
204
  padding: 5px;
205
  font-size: 12px;
@@ -254,8 +303,8 @@
254
  }
255
  .mo2f_2fa_plan_title
256
  {
257
- background-color: #20b2aa;
258
- border: 2px solid #20b2aa;
259
  }
260
  .mo2f_padding_style
261
  {
@@ -280,7 +329,7 @@
280
  .mo2f_tooltip .mo2f_tooltiptext {
281
  visibility: hidden;
282
  width: 200px;
283
- background-color: #20b2aa;
284
  color: white;
285
  text-align: center;
286
  border-radius: 6px;
@@ -297,13 +346,14 @@
297
  }
298
  .mo2f_tooltip_addon .mo2f_tooltiptext_addon {
299
  visibility: hidden;
300
- width: 342px;
301
- background-color: #20b2aa;
 
302
  color: white;
303
  text-align: center;
304
  border-radius: 6px;
305
  font-size: 14px;
306
- padding: 5px 7px 6px 7px;
307
  /* Position the tooltip */
308
  position: absolute;
309
  z-index: 9999;
@@ -314,9 +364,9 @@
314
  }*/
315
  .mo2f_info_tab
316
  {
317
- font-size:16px;
318
- color:#20b2aa;
319
- cursor: pointer;
320
  }
321
  .mo2f_info_tab:hover
322
  {
@@ -356,15 +406,15 @@
356
  border-radius: 50em;
357
  border-width: 1px;
358
  border-style: solid;
359
- border-color: #20b2aa;
360
  border-image: initial;
361
  }
362
- .mo_upgrade_toggle_2fa_lable
363
  {
364
  position: relative;
365
  z-index: 1;
366
  display: inline-block;
367
- float: left;
368
  width: 210px;
369
  height: 44px;
370
  line-height: 40px;
@@ -595,7 +645,7 @@
595
  background-color: white;
596
  }
597
  .mo_wpns_button_info_tab {
598
- background-color: #20b2aa;
599
  border: none;
600
  color: white;
601
  height: 1.8em;
@@ -761,7 +811,7 @@
761
  font-size: 103%;
762
  margin-top: 20px;
763
  margin-bottom: 20px;
764
- border: solid 1px #20b2aa;
765
  background-color: white;
766
  color: black;
767
  width :162px;
@@ -770,16 +820,16 @@
770
 
771
  /* Change background color of buttons on hover */
772
  .mo_wpns_tab button:hover {
773
- background-color: #20b2aa;
774
  color: white;
775
  }
776
 
777
  /* Create an active/current tablink class */
778
  .mo_wpns_tab button.active {
779
- background-color: #20b2aa;
780
  color: white;
781
  width: 20%;
782
- border: solid 1px #20b2aa;
783
  /*border-bottom: none;*/
784
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
785
  font-weight: 600;
@@ -793,7 +843,7 @@
793
  border-top: none;
794
  }
795
  .mo_wpsn_button {
796
- background-color: #20b2aa; /* Green */
797
  border: none;
798
  color: white;
799
  padding: 11px 32px;
@@ -816,22 +866,26 @@
816
  padding:0px 24px 10px 10px;
817
  min-height:220px;
818
  }
819
- .mo_wpns_divided_layout_tab{
820
  margin-bottom: 10px;
821
  margin-top: 10px;
822
- height:auto;
823
  width:100%;
824
  float:left;
825
 
 
 
 
 
 
826
 
827
  }
828
  .mo_wpns_divided_layout{
829
  margin-bottom: 10px;
830
  margin-top: 10px;
831
  height:auto;
832
- width:70%;
833
  float:left;
834
-
835
 
836
  }
837
  .mo_wpns_divided_layout_2
@@ -852,7 +906,7 @@
852
  min-height: 222px;
853
  overflow: hidden;
854
  text-align: center;
855
- border-top: 6px solid lightseagreen;
856
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
857
  }
858
  .mo_wpns_small_layout{
@@ -864,18 +918,23 @@
864
  margin: 10px;
865
  padding: 5px 20px;
866
  background-color: #FFFFFF;
867
- /*border: 1px solid #CCCCCC;*/
868
  float: left;
869
- width: 42%;
870
  margin-left: 1%;
871
- min-height: 220px;
872
- overflow: hidden;
873
  text-align: center;
874
- border-top: 6px solid lightseagreen;
875
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
876
  /*font-style: italic;*/
877
 
878
  }
 
 
 
 
 
879
  .mo_wpns_method_layout{
880
  margin: 10px;
881
  padding: 5px 20px;
@@ -887,7 +946,7 @@
887
  min-height: 222px;
888
  overflow: hidden;
889
  text-align: center;
890
- border-top: 6px solid lightseagreen;
891
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
892
  /*font-style: italic;*/
893
 
@@ -900,34 +959,40 @@
900
  /*border: 1px solid #CCCCCC;*/
901
  float: left;
902
  width: 47%;
903
- margin-left: 1%;
904
- height: 222px;
905
  text-align: center;
 
906
  }
907
 
908
 
909
  .mo_wpns_small_3_layout
910
  {
911
- float: left;
 
 
 
912
  width: 64%;
913
- height: 222px;
914
  text-align: center;
915
- margin-top: 35px;
 
 
916
  }
917
  .mo_wpns_line
918
  {
919
- border: 1.2px solid #20b2aa;
920
  }
921
  .mo_wpns_dashboard_layout
922
  {
923
  margin: 10px;
924
- /*padding: 5px 20px;*/
925
- background-color: none;
926
- /*border: 1px solid #CCCCCC;*/
927
  float: left;
928
- width: 94%;
929
- height: auto;
930
- margin-left: 1%;
 
 
 
931
  }
932
  .mo_wpns_inside_dashboard_layout
933
  {
@@ -940,7 +1005,7 @@
940
  height: 100px;
941
  margin-left: 1%;
942
  font-weight: 600;
943
- border-top: 2px solid lightseagreen;
944
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
945
  }
946
  .mo_wpns_sub_dashboards_layout
@@ -948,13 +1013,15 @@
948
  margin-top: 10px;
949
  padding: 5px 0px;
950
  background-color: #FFFFFF;
951
- border: 1px solid lightseagreen;
952
  float: left;
953
  width: 34%;
954
- height: 170px;
955
  margin-left: 1%;
956
  font-weight: 600;
957
- border-top: 4px solid lightseagreen;
 
 
958
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
959
  /*font-style: italic;*/
960
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
@@ -964,14 +1031,15 @@
964
  margin-top: 10px;
965
  padding: 5px 0px;
966
  background-color: #FFFFFF;
967
- border: 1px solid lightseagreen;
968
  float: left;
969
  width: 45%;
970
- min-height: 56px;
 
971
  overflow: hidden;
972
  margin-left: 1%;
973
  font-weight: 600;
974
- border-top: 3px solid lightseagreen;
975
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
976
  /*font-style: italic;*/
977
  }
@@ -1046,7 +1114,7 @@ h2.mo_wpns_nav-tab-wrapper
1046
  margin-left: 0.3%;
1047
  float: left;
1048
  text-align: center;
1049
- border: 2px solid lightseagreen;
1050
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1051
  }
1052
 
@@ -1058,7 +1126,7 @@ h2.mo_wpns_nav-tab-wrapper
1058
  margin-left: 1%;
1059
  float: left;
1060
  /*text-align: center;*/
1061
- border: 2px solid lightseagreen;
1062
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1063
  }
1064
  .mo_wpns_settings_textarea
@@ -1098,7 +1166,7 @@ h2.mo_wpns_nav-tab-wrapper
1098
  margin: 10px;
1099
  padding: 5px 20px;
1100
  background-color: #FFFFFF;
1101
- border: 2px solid #20b2aa;
1102
  float: left;
1103
  width: 593px;
1104
  min-height: 200px;
@@ -1119,21 +1187,20 @@ h2.mo_wpns_nav-tab-wrapper
1119
  margin: 5px;
1120
  margin-left: 0px;
1121
  padding: 5px 20px 30px 20px;
1122
- background-color: #FFFFFF;
1123
- border: 2px solid #20b2aa;
1124
- float: left;
1125
- width: 94%;
1126
-
1127
- overflow: hidden;
1128
- text-align: left;
1129
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1130
  }
1131
  .mo_wpns_setting_layout_scan
1132
  {
1133
  margin: 5px;
1134
  padding: 5px 20px 30px 20px;
1135
  background-color: #FFFFFF;
1136
- border: 2px solid #20b2aa;
1137
  float: left;
1138
  width: 80%;
1139
  margin-left: 10%;
@@ -1172,7 +1239,7 @@ h2.mo_wpns_nav-tab-wrapper
1172
 
1173
  /* Create an active/current tablink class */
1174
  .mo_wpns_sub_nav_tab button.mo_wpns_sub_nav_active {
1175
- background-color: #20b2aa;
1176
  color: white;
1177
  }
1178
 
@@ -1211,12 +1278,12 @@ h2.mo_wpns_nav-tab-wrapper
1211
  width:23.3%;
1212
  float:left;
1213
  background-color: white;
1214
- border-top: 4px solid lightseagreen;
1215
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1216
  font-style: italic;
1217
  }
1218
  .mo_wpns_button {
1219
- background-color: #20b2aa; /* Green */
1220
  border: none;
1221
  color: white;
1222
  padding: 11px 28px;
@@ -1247,7 +1314,7 @@ h2.mo_wpns_nav-tab-wrapper
1247
 
1248
 
1249
  .mo_wpns_dashboard_button {
1250
- background-color: #20b2aa; /* Green */
1251
  border: none;
1252
  color: white;
1253
  padding-top: 10px;
@@ -1282,7 +1349,7 @@ h2.mo_wpns_nav-tab-wrapper
1282
  }*/
1283
  .mo_wpns_upgrade_page_button
1284
  {
1285
- border: 2px solid ##2a80ca;
1286
  background-color: #2a80ca;
1287
  color: white;
1288
  padding: 12px 0px;
@@ -1351,7 +1418,7 @@ h2.mo_wpns_nav-tab-wrapper
1351
  min-height: 222px;
1352
  overflow: hidden;
1353
  text-align: center;
1354
- border-top: 6px solid lightseagreen;
1355
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1356
  }
1357
 
@@ -1366,7 +1433,7 @@ h2.mo_wpns_nav-tab-wrapper
1366
  height: 220px;
1367
  overflow: hidden;
1368
  text-align: center;
1369
- /*border-top: 6px solid lightseagreen;*/
1370
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1371
  }
1372
 
@@ -1429,7 +1496,7 @@ h2.mo_wpns_nav-tab-wrapper
1429
  background-color: #dddddd;
1430
  }
1431
  .mo_wpns_free_feature_button {
1432
- /*background-color: green; /* Green */*/
1433
  border: none;
1434
  color: black;
1435
  padding: 11px 12px;
@@ -1500,15 +1567,7 @@ h2.mo_wpns_nav-tab-wrapper
1500
  width: 100%;
1501
 
1502
  }
1503
- .mo_wpns_divided_layout_tab{
1504
- margin-bottom: 10px;
1505
- margin-top: 10px;
1506
- height:auto;
1507
- width:100%;
1508
- float:left;
1509
-
1510
 
1511
- }
1512
  .mo_wpns_small_layout{
1513
  /*background-color:#FFFFFF;
1514
  border:1px solid #CCCCCC;
@@ -1527,7 +1586,7 @@ h2.mo_wpns_nav-tab-wrapper
1527
  text-align: center;
1528
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1529
  /*font-style: italic;*/
1530
- border-top: 6px solid lightseagreen;
1531
  }
1532
 
1533
  .mo_wpns_small_layout_test{
@@ -1551,39 +1610,7 @@ h2.mo_wpns_nav-tab-wrapper
1551
 
1552
  }
1553
 
1554
- .mo_wpns_small_2_layout
1555
- {
1556
- /*margin: 10px;*/
1557
- /*padding: 5px 20px;*/
1558
- /*background-color: yellow;*/
1559
- /*border: 1px solid #CCCCCC;*/
1560
- float: left;
1561
- width: 100%;
1562
- margin-left: 1%;
1563
- height: 120px;
1564
- text-align: center;
1565
- }
1566
- .mo_wpns_small_3_layout
1567
- {
1568
- float: left;
1569
- width: 68%;
1570
- height: 222px;
1571
- text-align: center;
1572
- margin-top: 26px;
1573
- }
1574
- .mo_wpns_dashboard_layout
1575
- {
1576
- /*margin: 10px;*/
1577
- padding: 5px 20px;
1578
- background-color: none;
1579
-
1580
- float: left;
1581
- width: 90%;
1582
- height: auto;
1583
- /*margin-left: 1%;*/
1584
-
1585
- }
1586
- .mo_wpns_inside_dashboard_layout
1587
  {
1588
  margin-top: 10px;
1589
  padding: 5px 0px;
@@ -1592,10 +1619,10 @@ h2.mo_wpns_nav-tab-wrapper
1592
  float: left;
1593
  width: 18.5%;
1594
  height: 100px;
1595
- border-top: 2px solid lightseagreen;
1596
  font-weight: 600;
1597
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1598
- }
1599
 
1600
  /*.wpns_font_size {
1601
  font-size: 30px;
@@ -1625,7 +1652,7 @@ h2.mo_wpns_nav-tab-wrapper
1625
 
1626
  .mo_wpns_dashboard_button
1627
  {
1628
- background-color: #20b2aa; /* Green */
1629
  border: none;
1630
  color: white;
1631
  padding-top: 10px;
@@ -1658,52 +1685,16 @@ h2.mo_wpns_nav-tab-wrapper
1658
  text-align: center;
1659
  color: black;
1660
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1661
- /*margin-top: 20px;
1662
- padding: 5px 20px;
1663
- background-color: #20b2aa;
1664
- border: 1px solid #CCCCCC;
1665
- float: left;
1666
- width: 227px;
1667
- height: 170px;
1668
- margin-left: 1%;
1669
- color: white;
1670
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1671
  }
1672
- .mo_wpns_sub_dashboards_layout
1673
- {
1674
- margin-top: 10px;
1675
- padding: 5px 0px;
1676
- background-color: #FFFFFF;
1677
- border: 1px solid lightseagreen;
1678
- float: left;
1679
- width: 30%;
1680
- height: 100px;
1681
- margin-left: 1%;
1682
- font-weight: 600;
1683
- border-top: 4px solid lightseagreen;
1684
 
1685
- /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1686
- }
1687
- .mo_wpns_sub_sub_dashboard_layout
1688
- {
1689
- margin-top: 10px;
1690
- padding: 5px 0px;
1691
- background-color: #FFFFFF;
1692
- border: 1px solid lightseagreen;
1693
- float: left;
1694
- width: 22%;
1695
- min-height: 74px;
1696
- overflow: hidden;
1697
- margin-left: 1%;
1698
- font-weight: 600;
1699
- border-top: 3px solid lightseagreen;
1700
- }
1701
  .mo_wpns_container{
1702
  /*padding:10px;*/
1703
  width: 100%;
1704
  /*background-color: yellow;*/
1705
  height: auto;
1706
  }
 
1707
  .mo_wpns_details_layout
1708
  {
1709
  margin:10px;
@@ -1719,7 +1710,7 @@ h2.mo_wpns_nav-tab-wrapper
1719
  float:left;
1720
  border: 1px solid;
1721
  background-color: white;
1722
- border-top: 4px solid lightseagreen;
1723
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1724
  font-style: italic;
1725
  }
@@ -1733,35 +1724,22 @@ h2.mo_wpns_nav-tab-wrapper
1733
  font-size: 103%;
1734
  margin-top: 20px;
1735
  margin-bottom: 20px;
1736
- border: solid 1px #20b2aa;
1737
  background-color: white;
1738
  color: black;
1739
  width: 129px;
1740
  height: 55%;
1741
  }
1742
  .mo_wpns_tab button.active {
1743
- background-color: #20b2aa;
1744
  color: white;
1745
  width: 130px;
1746
- border: solid 1px #20b2aa;
1747
  /*border-bottom: none;*/
1748
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1749
  font-weight: 600;
1750
  }
1751
 
1752
-
1753
- /* background-color: #4CAF50;
1754
- border: none;
1755
- color: white;
1756
- padding: 15px 32px;
1757
- text-align: center;
1758
- text-decoration: none;
1759
- display: inline-block;
1760
- font-size: 16px;
1761
- margin: 10px 14px;
1762
- cursor: pointer;
1763
- width: 20%;*/
1764
- }
1765
  .mo_wpns_third_layout{
1766
  margin-top: 10px;
1767
  padding: 5px 20px;
@@ -1792,7 +1770,7 @@ h2.mo_wpns_nav-tab-wrapper
1792
  margin: 10px;
1793
  padding: 5px 20px;
1794
  background-color: #FFFFFF;
1795
- border: 2px solid #20b2aa;
1796
  float: left;
1797
  width: 90%;
1798
  min-height: 200px;
@@ -1800,7 +1778,9 @@ h2.mo_wpns_nav-tab-wrapper
1800
  text-align: center;
1801
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1802
  }
1803
-
 
 
1804
  h1 .nav-tab, a .nav-tab{
1805
  font-size : auto;
1806
  background-color: none; /* Green
@@ -1813,7 +1793,6 @@ h2.mo_wpns_nav-tab-wrapper
1813
 
1814
  font-size: 20px;
1815
  margin: 5px 0px;
1816
- cursor: pointer;
1817
  /*border-radius: 23px;*/
1818
  width: 07.5%;
1819
  border: 1px solid gray;
@@ -1825,20 +1804,20 @@ h2.mo_wpns_nav-tab-wrapper
1825
  /*background-color: #4CAF50;*/
1826
  font-size: 150%;
1827
  box-shadow: 3px 4px 3px #888888;
1828
- background-color: #20b2aa;
1829
  color: white;
1830
 
1831
  }
1832
  h1 .nav-tab:hover , a .nav-tab:hover
1833
  {
1834
- background-color: #20b2aa;
1835
  color: white;
1836
  /*border-bottom: none;*/
1837
  }
1838
  h1 .nav-tab-active:hover , a .nav-tab-active:hover
1839
  {
1840
  background-color: white;
1841
- color:#20b2aa;
1842
  }
1843
  .mo_wpns_sub_nav_tab button {
1844
  background-color: inherit;
@@ -1857,21 +1836,7 @@ h2.mo_wpns_nav-tab-wrapper
1857
  color: black;
1858
  width :210px;
1859
  }
1860
- .mo_wpns_setting_layout
1861
- {
1862
- margin: 5px;
1863
- margin-left: 0px;
1864
- padding: 5px 20px 30px 20px;
1865
- background-color: #FFFFFF;
1866
- border: 2px solid #20b2aa;
1867
- float: left;
1868
- width: 90%;
1869
- /*margin-left: 1%;*/
1870
 
1871
- overflow: hidden;
1872
- text-align: left;
1873
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1874
- }
1875
  .mo_wpns_products-dollar-amount {
1876
  color: #797878;
1877
  font-weight: 400;
@@ -1897,7 +1862,7 @@ h2.mo_wpns_nav-tab-wrapper
1897
  -o-transition: border .2s ease-in-out;
1898
  transition: border .2s ease-in-out
1899
  }
1900
- }
1901
 
1902
 
1903
  .mo_wpns_table_layout td strong {
@@ -1917,7 +1882,7 @@ h2.mo_wpns_nav-tab-wrapper
1917
  }
1918
 
1919
  .fixed {
1920
- //width: 75% !important;
1921
  }
1922
  .mo_wpns_table_textbox {
1923
  width:100%;
@@ -2050,49 +2015,60 @@ h2.mo_wpns_nav-tab-wrapper
2050
  width:33%;
2051
  float: left;
2052
  }
2053
- h1 .nav-tab, div .nav-tab
 
2054
  {
2055
- font-size : 14px !important;
2056
- /*background-color: none; /* Green */
2057
- /*background-color: #4CAFA4;*/
2058
- background-color: white;
2059
- border: 1px ;
2060
- color: black;
2061
- padding: 10px;
2062
  text-align: center;
2063
- text-decoration: none;
2064
 
2065
- box-shadow: 3px 4px 3px #888888;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2066
 
2067
- /*font-size: 20px;*/
2068
- margin: 5px 0px;
2069
- cursor: pointer;
2070
- /*border-radius: 23px;*/
2071
- width: 8.2%;
2072
- border: 1px solid #20b2aa;
2073
- /*width: 100px;*/
2074
  }
2075
- h1 .nav-tab-active, div .nav-tab-active
2076
- {
2077
-
2078
- /*background-color: #4CAF50;*/
2079
- font-size: 150%;
2080
- box-shadow: 3px 4px 3px #888888;
2081
- background-color: #20b2aa;
2082
- color: white;
2083
-
2084
- }
2085
- h1 .nav-tab:hover , div .nav-tab:hover
2086
- {
2087
- background-color: #20b2aa;
2088
- color: white;
2089
- /*border-bottom: none;*/
2090
- }
2091
- h1 .nav-tab-active:hover , div .nav-tab-active:hover
2092
- {
2093
- background-color: white;
2094
- color:#20b2aa;
2095
- }
 
2096
  .ip_lookup_desc,.file_backup_desc{
2097
  background-color:#E6E6E6;
2098
  width:100%;
@@ -2467,22 +2443,17 @@ a{
2467
  font-weight: bold;
2468
  }
2469
 
2470
- /*.wpns_font_size {
2471
- font-size: 50px;
2472
- margin-top: -10px;
2473
- padding-right: 11px;
2474
- }*/
2475
  .wpns_font_shown {
 
2476
  font-size: 70px;
2477
- margin-top: -10px;
2478
- margin-bottom: 5px;
2479
- padding-right: 11px;
2480
  }
2481
 
2482
  /* Added for malware */
2483
  .malwaresummarydiv{
2484
  display: inline-flex;
2485
- width: 100%;
2486
  }
2487
  .malwarescandiv{
2488
  border-radius: 4px;
@@ -2541,11 +2512,6 @@ padding-right: 11px;
2541
  line-height: 20px; /* To center it vertically */
2542
  color: white;
2543
  }
2544
- /*#mo_wpns_bar {
2545
- width: 0%;
2546
- height: 20px;
2547
- background-color: blue;
2548
- }*/
2549
  .mo_wpns_lightgreen{
2550
  color:rgb(128, 173, 128);
2551
  }
@@ -2588,7 +2554,7 @@ padding-right: 11px;
2588
  width: 50%;
2589
  }
2590
  .mo_wpns_scan_button {
2591
- background-color: #20b2aa; /* Green */
2592
  border: none;
2593
  color: white;
2594
  padding: 5px 5px;
@@ -2602,7 +2568,7 @@ padding-right: 11px;
2602
  transition-duration: 0.4s;
2603
  }
2604
  .mo_wpns_scan_modal_button {
2605
- background-color: #20b2aa; /* Green */
2606
  border: none;
2607
  color: white;
2608
  padding: 5px 80px;
@@ -2616,7 +2582,7 @@ padding-right: 11px;
2616
  transition-duration: 0.4s;
2617
  }
2618
  .mo_wpns_deep_scan_button {
2619
- background-color: #20b2aa; /* Green */
2620
  border: none;
2621
  color: white;
2622
  padding: 5px 5px;
@@ -2638,18 +2604,18 @@ padding-right: 11px;
2638
  {
2639
  padding: 5px;
2640
  background-color: #FFFFFF;
2641
- border: 1px solid lightseagreen;
2642
  width: 23.5%;
2643
- border-top: 4px solid lightseagreen;
2644
  min-height: 180px;
2645
  }
2646
  .mo_wpns_malwarescandiv
2647
  {
2648
  padding: 5px;
2649
  background-color: #FFFFFF;
2650
- border: 1px solid lightseagreen;
2651
  width: 50%;
2652
- border-top: 4px solid lightseagreen;
2653
  }
2654
 
2655
 
@@ -2834,7 +2800,7 @@ padding-right: 11px;
2834
  margin: 10px;
2835
  float: left;
2836
  text-align: center;
2837
- border: 2px solid lightseagreen;
2838
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
2839
  }
2840
 
@@ -2845,6 +2811,32 @@ padding-right: 11px;
2845
 
2846
 
2847
  /*2FA css used*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2848
  .mo2f_licensing_plans {
2849
  background-color: white;
2850
  border-style: solid;
@@ -2872,7 +2864,7 @@ padding-right: 11px;
2872
  }
2873
 
2874
  .mo2f_auth_methods_table {
2875
- border-spacing: 10px;
2876
  border-collapse: separate;
2877
  width: 100%;
2878
  }
@@ -2910,7 +2902,6 @@ padding-right: 11px;
2910
  min-height: 103%;
2911
  overflow: hidden;
2912
  background-color: #fff;
2913
- border: 1px solid #ddd;
2914
  -webkit-transition: border .2s ease-in-out;
2915
  -o-transition: border .2s ease-in-out;
2916
  transition: border .2s ease-in-out
@@ -2944,7 +2935,7 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
2944
  }
2945
 
2946
  .mo2f_thumbnail_method_desc{
2947
- padding:13px;
2948
  font-size:17px;
2949
  }
2950
 
@@ -2963,6 +2954,9 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
2963
  outline: none;
2964
  color: white;
2965
  }
 
 
 
2966
 
2967
  .mo2f_auth_methods_thumbnail {
2968
  width: 50px;
@@ -2982,21 +2976,9 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
2982
  align-content: center
2983
 
2984
  }
2985
-
2986
- .mo_wpns_setting_layout{
2987
- margin: 5px;
2988
- margin-left: 0px;
2989
- padding: 5px 20px 30px 20px;
2990
- background-color: #FFFFFF;
2991
- border: 2px solid #20b2aa;
2992
- float: left;
2993
- width: 94%;
2994
- /*margin-left: 1%;*/
2995
- /*overflow: hidden;*/
2996
- text-align: left;
2997
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
2998
  }
2999
-
3000
  .mo2f_configure_set_2_factor:hover {
3001
  font-weight: bold;
3002
  font-size: 14px;
@@ -3109,6 +3091,15 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3109
  border-radius: 4px;
3110
  height: 30px;
3111
  font-size: 13px !important;
 
 
 
 
 
 
 
 
 
3112
  }
3113
 
3114
  .mo2f_kba_table {
@@ -3201,7 +3192,17 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3201
  text-align: center;
3202
  padding: 11px;
3203
  }
3204
-
 
 
 
 
 
 
 
 
 
 
3205
  .mo2f_vertical-submenu a:hover {
3206
  background-color: #ccc;
3207
  }
@@ -3280,7 +3281,7 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3280
  margin: 0px 0px;
3281
  cursor: pointer;
3282
  width: 1200px;
3283
- border: 1px solid #20b2aa;
3284
 
3285
  }
3286
  .mo_subtab_flex-container{
@@ -3300,25 +3301,25 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3300
  margin: 0px 0px;
3301
  cursor: pointer;
3302
  width: 1200px;
3303
- border: 1px solid #20b2aa;
3304
  }
3305
 
3306
  .mo_wpns_sub_scanmode
3307
  {
3308
  padding: 5px;
3309
  background-color: #FFFFFF;
3310
- border: 1px solid lightseagreen;
3311
  width: 23.5%;
3312
- border-top: 4px solid lightseagreen;
3313
  min-height: 180px;
3314
  }
3315
  .mo_wpns_sub_scansummary
3316
  {
3317
  padding: 5px;
3318
  background-color: #FFFFFF;
3319
- border: 1px solid lightseagreen;
3320
  width: 23.5%;
3321
- border-top: 4px solid lightseagreen;
3322
  height: 120px;
3323
  }
3324
  .mo_wpns_scan_summary_text
@@ -3331,9 +3332,9 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3331
  {
3332
  padding: 5px;
3333
  background-color: #FFFFFF;
3334
- border: 1px solid lightseagreen;
3335
  width: 50%;
3336
- border-top: 4px solid lightseagreen;
3337
  }
3338
 
3339
  .mo_scan_modal {
@@ -3393,8 +3394,10 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3393
  }
3394
  /*Custom login form*/
3395
  .customloginform{
 
 
3396
  border-collapse: collapse;
3397
- border:1px solid #20b2aa;
3398
  }
3399
  .customloginform th {
3400
 
@@ -3403,7 +3406,7 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3403
  .customloginform td {
3404
  /*width:80%;*/
3405
  text-align:left;
3406
- border:1px solid #20b2aa;
3407
  padding:1%;
3408
 
3409
  }
@@ -3415,16 +3418,30 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3415
  .mo2f_doc_icon_style
3416
  {
3417
  font-size:25px;
3418
- color:#269eb3;
3419
  }
3420
  .mo2f_doc_font_size
3421
  {
3422
  font-size: 112%;
3423
  width: 30%;
3424
  }
 
 
 
 
 
 
 
 
3425
  .mo2f_advance_setting
3426
  {
3427
- width: 40%;color: #111111; background: none;font-weight: bold;border: 2px solid black;margin-left: 6%;float: left;min-height: 54px;
 
 
 
 
 
 
3428
  }
3429
  .mo2f_advance_setting:hover
3430
  {
@@ -3475,7 +3492,7 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3475
  }
3476
  .mo2f_addons_alignment
3477
  {
3478
- color:#20b2aa;
3479
  font-size: large;
3480
  float: left;
3481
  margin-right: 5px;
@@ -3529,16 +3546,7 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3529
  color: #ffffff;
3530
  margin-left: 15px;
3531
  }
3532
- .call-setup-div{
3533
- background: #F2F5FF;
3534
- border-radius: 5px;
3535
- margin-top: 10px;
3536
- margin-bottom: 15px;
3537
- padding-top: 10px;
3538
- border-style: solid;
3539
- border-color: #2f6062;
3540
- padding-left: 10px;
3541
- }
3542
  /* The switch - the box around the slider */
3543
  .switch {
3544
  position: relative;
@@ -3602,27 +3610,6 @@ input:checked + .slider:before {
3602
  border-radius: 50%;
3603
  }
3604
 
3605
-
3606
-
3607
-
3608
-
3609
-
3610
-
3611
-
3612
-
3613
-
3614
-
3615
-
3616
-
3617
-
3618
-
3619
-
3620
-
3621
-
3622
-
3623
-
3624
-
3625
-
3626
  .mo_wpns_upgrade_page_2fa_ns_styles
3627
  {
3628
  background-color: #7ccbc7;
@@ -3812,67 +3799,246 @@ input:checked + .slider:before {
3812
 
3813
  .mo2f_offer_main_div
3814
  {
3815
- height:200px;
3816
- background-color:white;
3817
- border-top: 4px solid #a02929;
3818
- border-bottom: 4px solid #a02929;
3819
- width: 100%;
 
 
 
 
 
3820
  }
3821
 
3822
  .mo2f_offer_first_section
3823
  {
3824
- width:41%;
3825
- color:red;
3826
- height: 167.5px;
3827
- float: left;
3828
- text-align: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3829
 
3830
  }
3831
- .mo2f_offer_first_section_text
3832
- {
3833
- font-size: 73px !important;
3834
- text-align: center;
3835
- margin: 0px;
3836
- margin-bottom: 4% !important;
3837
- color: black;
3838
 
 
 
 
 
 
 
 
 
3839
  }
3840
- .mo2f_offer_get_upto
3841
- {
3842
- text-align:center;margin:0px;margin-bottom: -2%;margin-top: 2%;color: black;font-size: 120%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3843
  }
 
3844
  .mo2f_offer_middle_section
3845
  {
3846
- width:39%;color:red;height: 100px;float: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3847
  }
3848
 
3849
  .mo2f_offer_last_section
3850
  {
3851
- width:20%;color:red;height: 100px;float: left;text-align: left;
 
 
 
3852
  }
3853
 
3854
  .mo2f_offer_contact_us
3855
  {
3856
- font-size: 23px;
3857
- border-radius: 4px;
3858
- background: #a02929;
3859
- border: 0px;
3860
  color: white;
3861
- padding: 12px 27px;
 
 
3862
  text-decoration: none;
3863
  }
3864
 
3865
- .mo2f_offer_contact_us:hover
 
 
 
 
 
 
 
 
 
 
3866
  {
3867
- color: white !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3868
  }
3869
 
3870
  .mo2f_offer_contact_us_layout
3871
  {
3872
- border: 3px solid #a02929 !important;
3873
  }
3874
 
3875
  .mo2f_offer_contact_us_button
3876
  {
3877
- background: #a02929 !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3878
  }
1
+
2
+
3
+ :root {
4
+ --mo2f-theme-color: #2271b1;
5
+ --white: #ffffff;
6
+ }
7
+
8
+ .mo2f_miniAuthApp {
9
+ padding: 26px;
10
+ font-size: 18px;
11
+ font-weight: 600;
12
+ width: 100%;
13
+ height: 100%;
14
+ margin:-10px;
15
+ background-color:#2271b130;
16
+ display:block;
17
+ }
18
+ .mo2f_miniAuthApp:hover {
19
+ background: #2271b19e;
20
+ }
21
+ input[name = 'miniOrangeAuthenticator'] {
22
+ visibility:hidden;
23
+ }
24
+ input[name = 'miniOrangeAuthenticator']:checked + .mo2f_miniAuthApp{
25
+ background: #2271b1db;
26
+ }
27
+ .mo2fa-addons-preview-alignment{
28
+ text-align: right;
29
+ font-size: small
30
+ }
31
  .mo2f-chat-popup {
32
  display: none;
33
  position: fixed;
34
  bottom: 0;
35
  right: 15px;
36
  border: 3px solid #f1f1f1;
37
+ z-index: 998;
38
  }
39
  .mo2f-open-button {
40
  background-color: #555;
57
  float: left;
58
  }
59
 
60
+ .mo2f_advanced_options_note {
61
+
62
+
63
+ background-color: #bbccdd;
64
+
65
+
66
+ border-radius: 2px;
67
+
68
+
69
+ font-style: italic;
70
+
71
+
72
+ padding:2%;
73
+
74
+
75
+ }
76
 
77
  .mo2f-form-container textarea {
78
  width: 100%;
123
  text-decoration: none;
124
  cursor: pointer;
125
  }
126
+
127
+
128
  .mo-2fa-help-button-text {
129
  cursor: pointer;
130
  font-size: 16px;
131
+ box-shadow: transparent;
132
+ background-color: #413c69;
133
  bottom: 3%;
134
  right: 7%;
135
  position: fixed;
136
  font-weight: 700;
137
  color: #fff;
138
+ border-radius: 15px;
 
 
 
 
139
  padding: 9px;
140
  transition: all 3s ease-in-out;
141
+ display: none;
142
  }
143
  .mo_support_input_label {
144
  color: #999;
153
  height: 0;
154
  position: absolute;
155
  border-top: 15px solid transparent;
156
+ border-left: 30px solid #413c69;
157
  border-bottom: 15px solid transparent;
158
  right: -32px;
159
  top: 16px;
214
  right:13%!important
215
  }
216
  }
217
+ #wpbody-content
218
+ {
219
+ padding: 0px;
220
+ }
221
+
222
  .mo-2fa-mail-button
223
  {
224
  bottom: 2.5%;
234
  box-shadow: 1px 1px 10px 3px #8e8e9c;
235
  }
236
  .mo2f_blue_premium_features{
237
+ cursor: pointer;
238
  margin: 2px;
239
+ color: white;
240
+ font-style: oblique;
241
+ background-color:#a7c5eb;
242
  text-decoration: none;
243
  padding: 5px;
244
  font-size: 15px;
245
  }
246
  .mo2f_btn_premium_features
247
  {
248
+ background-color: #4a47a3;
249
  color: #fff;
250
  cursor: pointer;
251
  margin: 2px;
 
 
252
  text-decoration: none;
253
  padding: 5px;
254
  font-size: 12px;
303
  }
304
  .mo2f_2fa_plan_title
305
  {
306
+ background-color: var(--mo2f-theme-color);
307
+ border: 2px solid var(--mo2f-theme-color);
308
  }
309
  .mo2f_padding_style
310
  {
329
  .mo2f_tooltip .mo2f_tooltiptext {
330
  visibility: hidden;
331
  width: 200px;
332
+ background-color: var(--mo2f-theme-color);
333
  color: white;
334
  text-align: center;
335
  border-radius: 6px;
346
  }
347
  .mo2f_tooltip_addon .mo2f_tooltiptext_addon {
348
  visibility: hidden;
349
+ font-family: 'Roboto Thin', sans-serif;
350
+ width: 500px;
351
+ background-color: #709fb0;
352
  color: white;
353
  text-align: center;
354
  border-radius: 6px;
355
  font-size: 14px;
356
+ padding: 10px;
357
  /* Position the tooltip */
358
  position: absolute;
359
  z-index: 9999;
364
  }*/
365
  .mo2f_info_tab
366
  {
367
+ margin: 2px;
368
+ color:#709fb0;
369
+ cursor: pointer;
370
  }
371
  .mo2f_info_tab:hover
372
  {
406
  border-radius: 50em;
407
  border-width: 1px;
408
  border-style: solid;
409
+ border-color: var(--mo2f-theme-color);
410
  border-image: initial;
411
  }
412
+ .mo2f_upgrade_toggle_lable
413
  {
414
  position: relative;
415
  z-index: 1;
416
  display: inline-block;
417
+ float:left;
418
  width: 210px;
419
  height: 44px;
420
  line-height: 40px;
645
  background-color: white;
646
  }
647
  .mo_wpns_button_info_tab {
648
+ background-color: var(--mo2f-theme-color);
649
  border: none;
650
  color: white;
651
  height: 1.8em;
811
  font-size: 103%;
812
  margin-top: 20px;
813
  margin-bottom: 20px;
814
+ border: solid 1px var(--mo2f-theme-color);
815
  background-color: white;
816
  color: black;
817
  width :162px;
820
 
821
  /* Change background color of buttons on hover */
822
  .mo_wpns_tab button:hover {
823
+ background-color: var(--mo2f-theme-color);
824
  color: white;
825
  }
826
 
827
  /* Create an active/current tablink class */
828
  .mo_wpns_tab button.active {
829
+ background-color: var(--mo2f-theme-color);
830
  color: white;
831
  width: 20%;
832
+ border: solid 1px var(--mo2f-theme-color);
833
  /*border-bottom: none;*/
834
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
835
  font-weight: 600;
843
  border-top: none;
844
  }
845
  .mo_wpsn_button {
846
+ background-color: var(--mo2f-theme-color); /* Green */
847
  border: none;
848
  color: white;
849
  padding: 11px 32px;
866
  padding:0px 24px 10px 10px;
867
  min-height:220px;
868
  }
869
+ .mo_wpns_waf_divided_layout_tab{
870
  margin-bottom: 10px;
871
  margin-top: 10px;
872
+ height: 200px;
873
  width:100%;
874
  float:left;
875
 
876
+ }
877
+ .mo_wpns_offer_image{
878
+ margin-bottom: 10px;
879
+ margin-top: 10px;
880
+ float:left;
881
 
882
  }
883
  .mo_wpns_divided_layout{
884
  margin-bottom: 10px;
885
  margin-top: 10px;
886
  height:auto;
887
+ width:100%;
888
  float:left;
 
889
 
890
  }
891
  .mo_wpns_divided_layout_2
906
  min-height: 222px;
907
  overflow: hidden;
908
  text-align: center;
909
+ border-top: 6px solid var(--mo2f-theme-color);
910
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
911
  }
912
  .mo_wpns_small_layout{
918
  margin: 10px;
919
  padding: 5px 20px;
920
  background-color: #FFFFFF;
921
+ border: 1px solid #CCCCCC;
922
  float: left;
923
+ width: 320px;
924
  margin-left: 1%;
925
+ min-height: 280px;
926
+ overflow:auto;
927
  text-align: center;
928
+ border-top: 6px solid var(--mo2f-theme-color);
929
+ /* */
930
  /*font-style: italic;*/
931
 
932
  }
933
+
934
+ .mo_wpns_small_layout:hover{
935
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
936
+ }
937
+
938
  .mo_wpns_method_layout{
939
  margin: 10px;
940
  padding: 5px 20px;
946
  min-height: 222px;
947
  overflow: hidden;
948
  text-align: center;
949
+ border-top: 6px solid var(--mo2f-theme-color);
950
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
951
  /*font-style: italic;*/
952
 
959
  /*border: 1px solid #CCCCCC;*/
960
  float: left;
961
  width: 47%;
962
+ margin-left: 1%;
963
+ height: inherit;
964
  text-align: center;
965
+
966
  }
967
 
968
 
969
  .mo_wpns_small_3_layout
970
  {
971
+ display: flex;
972
+ align-items: center;
973
+ flex-direction: column;
974
+ justify-content: top;
975
  width: 64%;
976
+ height: inherit;
977
  text-align: center;
978
+ margin-top: 10px;
979
+
980
+ flex-wrap: wrap;
981
  }
982
  .mo_wpns_line
983
  {
984
+ border: 1.2px solid var(--mo2f-theme-color);
985
  }
986
  .mo_wpns_dashboard_layout
987
  {
988
  margin: 10px;
 
 
 
989
  float: left;
990
+ width: 100%;
991
+ height: 200px;
992
+ margin-left: 3%;
993
+ background-color: #ffffff;
994
+ width: 94.5%;
995
+ /* border: 2px solid var(--mo2f-theme-color); */
996
  }
997
  .mo_wpns_inside_dashboard_layout
998
  {
1005
  height: 100px;
1006
  margin-left: 1%;
1007
  font-weight: 600;
1008
+ border-top: 2px solid var(--mo2f-theme-color);
1009
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1010
  }
1011
  .mo_wpns_sub_dashboards_layout
1013
  margin-top: 10px;
1014
  padding: 5px 0px;
1015
  background-color: #FFFFFF;
1016
+ border: 1px solid var(--mo2f-theme-color);
1017
  float: left;
1018
  width: 34%;
1019
+ height: 150px;
1020
  margin-left: 1%;
1021
  font-weight: 600;
1022
+ border-top: 4px solid var(--mo2f-theme-color);
1023
+ text-align: center;
1024
+
1025
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1026
  /*font-style: italic;*/
1027
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1031
  margin-top: 10px;
1032
  padding: 5px 0px;
1033
  background-color: #FFFFFF;
1034
+ border: 1px solid var(--mo2f-theme-color);
1035
  float: left;
1036
  width: 45%;
1037
+ min-width: 50px;
1038
+ min-height: 50px;
1039
  overflow: hidden;
1040
  margin-left: 1%;
1041
  font-weight: 600;
1042
+ border-top: 3px solid var(--mo2f-theme-color);
1043
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1044
  /*font-style: italic;*/
1045
  }
1114
  margin-left: 0.3%;
1115
  float: left;
1116
  text-align: center;
1117
+ border: 2px solid var(--mo2f-theme-color);
1118
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1119
  }
1120
 
1126
  margin-left: 1%;
1127
  float: left;
1128
  /*text-align: center;*/
1129
+ border: 2px solid var(--mo2f-theme-color);
1130
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1131
  }
1132
  .mo_wpns_settings_textarea
1166
  margin: 10px;
1167
  padding: 5px 20px;
1168
  background-color: #FFFFFF;
1169
+ border: 2px solid var(--mo2f-theme-color);
1170
  float: left;
1171
  width: 593px;
1172
  min-height: 200px;
1187
  margin: 5px;
1188
  margin-left: 0px;
1189
  padding: 5px 20px 30px 20px;
1190
+ background-color: #FFFFFF;
1191
+ border: 1px solid #CCCCCC !important;
1192
+ float: left;
1193
+ width: 90%;
1194
+ overflow: hidden;
1195
+ text-align: left;
1196
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
 
1197
  }
1198
  .mo_wpns_setting_layout_scan
1199
  {
1200
  margin: 5px;
1201
  padding: 5px 20px 30px 20px;
1202
  background-color: #FFFFFF;
1203
+ border: 1px solid #CCCCCC;
1204
  float: left;
1205
  width: 80%;
1206
  margin-left: 10%;
1239
 
1240
  /* Create an active/current tablink class */
1241
  .mo_wpns_sub_nav_tab button.mo_wpns_sub_nav_active {
1242
+ background-color: var(--mo2f-theme-color);
1243
  color: white;
1244
  }
1245
 
1278
  width:23.3%;
1279
  float:left;
1280
  background-color: white;
1281
+ border-top: 4px solid var(--mo2f-theme-color);
1282
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1283
  font-style: italic;
1284
  }
1285
  .mo_wpns_button {
1286
+ background-color: var(--mo2f-theme-color); /* Green */
1287
  border: none;
1288
  color: white;
1289
  padding: 11px 28px;
1314
 
1315
 
1316
  .mo_wpns_dashboard_button {
1317
+ background-color: var(--mo2f-theme-color); /* Green */
1318
  border: none;
1319
  color: white;
1320
  padding-top: 10px;
1349
  }*/
1350
  .mo_wpns_upgrade_page_button
1351
  {
1352
+ border: 2px solid #2a80ca;
1353
  background-color: #2a80ca;
1354
  color: white;
1355
  padding: 12px 0px;
1418
  min-height: 222px;
1419
  overflow: hidden;
1420
  text-align: center;
1421
+ border-top: 6px solid var(--mo2f-theme-color);
1422
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1423
  }
1424
 
1433
  height: 220px;
1434
  overflow: hidden;
1435
  text-align: center;
1436
+ /*border-top: 6px solid var(--mo2f-theme-color);*/
1437
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1438
  }
1439
 
1496
  background-color: #dddddd;
1497
  }
1498
  .mo_wpns_free_feature_button {
1499
+ /*background-color: green; /* Green */
1500
  border: none;
1501
  color: black;
1502
  padding: 11px 12px;
1567
  width: 100%;
1568
 
1569
  }
 
 
 
 
 
 
 
1570
 
 
1571
  .mo_wpns_small_layout{
1572
  /*background-color:#FFFFFF;
1573
  border:1px solid #CCCCCC;
1586
  text-align: center;
1587
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1588
  /*font-style: italic;*/
1589
+ border-top: 6px solid var(--mo2f-theme-color);
1590
  }
1591
 
1592
  .mo_wpns_small_layout_test{
1610
 
1611
  }
1612
 
1613
+ /* .mo_wpns_inside_dashboard_layout
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1614
  {
1615
  margin-top: 10px;
1616
  padding: 5px 0px;
1619
  float: left;
1620
  width: 18.5%;
1621
  height: 100px;
1622
+ border-top: 2px solid var(--mo2f-theme-color);
1623
  font-weight: 600;
1624
  /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1625
+ } */
1626
 
1627
  /*.wpns_font_size {
1628
  font-size: 30px;
1652
 
1653
  .mo_wpns_dashboard_button
1654
  {
1655
+ background-color: var(--mo2f-theme-color); /* Green */
1656
  border: none;
1657
  color: white;
1658
  padding-top: 10px;
1685
  text-align: center;
1686
  color: black;
1687
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
 
 
 
 
 
 
 
 
 
 
1688
  }
 
 
 
 
 
 
 
 
 
 
 
 
1689
 
1690
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1691
  .mo_wpns_container{
1692
  /*padding:10px;*/
1693
  width: 100%;
1694
  /*background-color: yellow;*/
1695
  height: auto;
1696
  }
1697
+
1698
  .mo_wpns_details_layout
1699
  {
1700
  margin:10px;
1710
  float:left;
1711
  border: 1px solid;
1712
  background-color: white;
1713
+ border-top: 4px solid var(--mo2f-theme-color);
1714
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1715
  font-style: italic;
1716
  }
1724
  font-size: 103%;
1725
  margin-top: 20px;
1726
  margin-bottom: 20px;
1727
+ border: solid 1px var(--mo2f-theme-color);
1728
  background-color: white;
1729
  color: black;
1730
  width: 129px;
1731
  height: 55%;
1732
  }
1733
  .mo_wpns_tab button.active {
1734
+ background-color: var(--mo2f-theme-color);
1735
  color: white;
1736
  width: 130px;
1737
+ border: solid 1px var(--mo2f-theme-color);
1738
  /*border-bottom: none;*/
1739
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1740
  font-weight: 600;
1741
  }
1742
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1743
  .mo_wpns_third_layout{
1744
  margin-top: 10px;
1745
  padding: 5px 20px;
1770
  margin: 10px;
1771
  padding: 5px 20px;
1772
  background-color: #FFFFFF;
1773
+ border: 2px solid var(--mo2f-theme-color);
1774
  float: left;
1775
  width: 90%;
1776
  min-height: 200px;
1778
  text-align: center;
1779
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1780
  }
1781
+ .nav-tab{
1782
+ cursor: pointer;
1783
+ }
1784
  h1 .nav-tab, a .nav-tab{
1785
  font-size : auto;
1786
  background-color: none; /* Green
1793
 
1794
  font-size: 20px;
1795
  margin: 5px 0px;
 
1796
  /*border-radius: 23px;*/
1797
  width: 07.5%;
1798
  border: 1px solid gray;
1804
  /*background-color: #4CAF50;*/
1805
  font-size: 150%;
1806
  box-shadow: 3px 4px 3px #888888;
1807
+ background-color: var(--mo2f-theme-color);
1808
  color: white;
1809
 
1810
  }
1811
  h1 .nav-tab:hover , a .nav-tab:hover
1812
  {
1813
+ background-color: var(--mo2f-theme-color);
1814
  color: white;
1815
  /*border-bottom: none;*/
1816
  }
1817
  h1 .nav-tab-active:hover , a .nav-tab-active:hover
1818
  {
1819
  background-color: white;
1820
+ color:var(--mo2f-theme-color);
1821
  }
1822
  .mo_wpns_sub_nav_tab button {
1823
  background-color: inherit;
1836
  color: black;
1837
  width :210px;
1838
  }
 
 
 
 
 
 
 
 
 
 
1839
 
 
 
 
 
1840
  .mo_wpns_products-dollar-amount {
1841
  color: #797878;
1842
  font-weight: 400;
1862
  -o-transition: border .2s ease-in-out;
1863
  transition: border .2s ease-in-out
1864
  }
1865
+
1866
 
1867
 
1868
  .mo_wpns_table_layout td strong {
1882
  }
1883
 
1884
  .fixed {
1885
+ width: 75% !important;
1886
  }
1887
  .mo_wpns_table_textbox {
1888
  width:100%;
2015
  width:33%;
2016
  float: left;
2017
  }
2018
+
2019
+ .test_auth_button
2020
  {
2021
+ margin: auto;
 
 
 
 
 
 
2022
  text-align: center;
2023
+ align-items: center;
2024
 
2025
+ }
2026
+
2027
+ .mo2f_table_layout
2028
+ {
2029
+ width: 90%;
2030
+ background-color: #FFFFFF;
2031
+ border: 1px solid #CCCCCC;
2032
+ padding: 25px 50px 25px 50px;
2033
+ margin: 10px;
2034
+ }
2035
+
2036
+ .mo2f_wpns_container
2037
+ {
2038
+ position: absolute;
2039
+ width: 90%;
2040
+ margin: 10px;
2041
+ }
2042
 
2043
+
2044
+
2045
+
2046
+ .mo2f_table_divide_border
2047
+ {
2048
+ padding: 10px;
 
2049
  }
2050
+
2051
+ .mo2f_flexbox
2052
+ {
2053
+ display: flex;
2054
+ justify-content: space-between;
2055
+ }
2056
+
2057
+ .mo2f_support_flex
2058
+ {
2059
+ flex: 0 0 25%;
2060
+ }
2061
+ .mo2f_table_layout_support
2062
+ {
2063
+ margin: 10px;
2064
+ border: 1px solid #053742;
2065
+ text-align: center;
2066
+ padding: 10px;
2067
+ background-color: #dcecff;
2068
+
2069
+ }
2070
+
2071
+
2072
  .ip_lookup_desc,.file_backup_desc{
2073
  background-color:#E6E6E6;
2074
  width:100%;
2443
  font-weight: bold;
2444
  }
2445
 
2446
+
2447
+
 
 
 
2448
  .wpns_font_shown {
2449
+ padding-top: 20%;
2450
  font-size: 70px;
 
 
 
2451
  }
2452
 
2453
  /* Added for malware */
2454
  .malwaresummarydiv{
2455
  display: inline-flex;
2456
+ width: 90%;
2457
  }
2458
  .malwarescandiv{
2459
  border-radius: 4px;
2512
  line-height: 20px; /* To center it vertically */
2513
  color: white;
2514
  }
 
 
 
 
 
2515
  .mo_wpns_lightgreen{
2516
  color:rgb(128, 173, 128);
2517
  }
2554
  width: 50%;
2555
  }
2556
  .mo_wpns_scan_button {
2557
+ background-color: var(--mo2f-theme-color); /* Green */
2558
  border: none;
2559
  color: white;
2560
  padding: 5px 5px;
2568
  transition-duration: 0.4s;
2569
  }
2570
  .mo_wpns_scan_modal_button {
2571
+ background-color: var(--mo2f-theme-color); /* Green */
2572
  border: none;
2573
  color: white;
2574
  padding: 5px 80px;
2582
  transition-duration: 0.4s;
2583
  }
2584
  .mo_wpns_deep_scan_button {
2585
+ background-color: var(--mo2f-theme-color); /* Green */
2586
  border: none;
2587
  color: white;
2588
  padding: 5px 5px;
2604
  {
2605
  padding: 5px;
2606
  background-color: #FFFFFF;
2607
+ border: 1px solid var(--mo2f-theme-color);
2608
  width: 23.5%;
2609
+ border-top: 4px solid var(--mo2f-theme-color);
2610
  min-height: 180px;
2611
  }
2612
  .mo_wpns_malwarescandiv
2613
  {
2614
  padding: 5px;
2615
  background-color: #FFFFFF;
2616
+ border: 1px solid var(--mo2f-theme-color);
2617
  width: 50%;
2618
+ border-top: 4px solid var(--mo2f-theme-color);
2619
  }
2620
 
2621
 
2800
  margin: 10px;
2801
  float: left;
2802
  text-align: center;
2803
+ border: 2px solid var(--mo2f-theme-color);
2804
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
2805
  }
2806
 
2811
 
2812
 
2813
  /*2FA css used*/
2814
+
2815
+
2816
+ .mo2f_new_support_form
2817
+ {
2818
+ padding: 10px;
2819
+ border-radius: 20px;
2820
+ }
2821
+
2822
+
2823
+ .mo2f_new_support_form_table
2824
+ {
2825
+ border-radius: 25px;
2826
+ width: 100%;
2827
+ padding: 5px;
2828
+ border-spacing: 15px;
2829
+ }
2830
+
2831
+ .mo2f_new_support_form_input
2832
+ {
2833
+ border: 2px solid gray;
2834
+ width: 100%;
2835
+ height: 25px;
2836
+ border-radius: 20px !important;
2837
+ padding: 20px !important;
2838
+ }
2839
+
2840
  .mo2f_licensing_plans {
2841
  background-color: white;
2842
  border-style: solid;
2864
  }
2865
 
2866
  .mo2f_auth_methods_table {
2867
+ border-spacing: 13px;
2868
  border-collapse: separate;
2869
  width: 100%;
2870
  }
2902
  min-height: 103%;
2903
  overflow: hidden;
2904
  background-color: #fff;
 
2905
  -webkit-transition: border .2s ease-in-out;
2906
  -o-transition: border .2s ease-in-out;
2907
  transition: border .2s ease-in-out
2935
  }
2936
 
2937
  .mo2f_thumbnail_method_desc{
2938
+ padding:10px;
2939
  font-size:17px;
2940
  }
2941
 
2954
  outline: none;
2955
  color: white;
2956
  }
2957
+ .mo2f_configure_switch_2_factor{
2958
+ margin-top: 0.4em;
2959
+ }
2960
 
2961
  .mo2f_auth_methods_thumbnail {
2962
  width: 50px;
2976
  align-content: center
2977
 
2978
  }
2979
+ .mo2fa_see_preview{
2980
+ font-size: 13px;
 
 
 
 
 
 
 
 
 
 
 
2981
  }
 
2982
  .mo2f_configure_set_2_factor:hover {
2983
  font-weight: bold;
2984
  font-size: 14px;
3091
  border-radius: 4px;
3092
  height: 30px;
3093
  font-size: 13px !important;
3094
+ background: #fff!important;
3095
+ color: #1a5a97!important;
3096
+ font-weight: 600!important;
3097
+ }
3098
+
3099
+ .mo2f_kba_ques:hover {
3100
+ color: #1a5a97!important;
3101
+ font-weight: 600 !important;
3102
+
3103
  }
3104
 
3105
  .mo2f_kba_table {
3192
  text-align: center;
3193
  padding: 11px;
3194
  }
3195
+ .mo2f_send_query{
3196
+ margin-bottom:3%!important;
3197
+ width: 18em;
3198
+ }
3199
+ .mo2f_raise_support_ticket{
3200
+ margin-bottom:3%!important;
3201
+ background-color: #479814b5!important;
3202
+ color: white!important;
3203
+ width: 18em;
3204
+ border-color: white !important;
3205
+ }
3206
  .mo2f_vertical-submenu a:hover {
3207
  background-color: #ccc;
3208
  }
3281
  margin: 0px 0px;
3282
  cursor: pointer;
3283
  width: 1200px;
3284
+ border: 1px solid var(--mo2f-theme-color);
3285
 
3286
  }
3287
  .mo_subtab_flex-container{
3301
  margin: 0px 0px;
3302
  cursor: pointer;
3303
  width: 1200px;
3304
+ border: 1px solid var(--mo2f-theme-color);
3305
  }
3306
 
3307
  .mo_wpns_sub_scanmode
3308
  {
3309
  padding: 5px;
3310
  background-color: #FFFFFF;
3311
+ border: 1px solid var(--mo2f-theme-color);
3312
  width: 23.5%;
3313
+ border-top: 4px solid var(--mo2f-theme-color);
3314
  min-height: 180px;
3315
  }
3316
  .mo_wpns_sub_scansummary
3317
  {
3318
  padding: 5px;
3319
  background-color: #FFFFFF;
3320
+ border: 1px solid var(--mo2f-theme-color);
3321
  width: 23.5%;
3322
+ border-top: 4px solid var(--mo2f-theme-color);
3323
  height: 120px;
3324
  }
3325
  .mo_wpns_scan_summary_text
3332
  {
3333
  padding: 5px;
3334
  background-color: #FFFFFF;
3335
+ border: 1px solid var(--mo2f-theme-color);
3336
  width: 50%;
3337
+ border-top: 4px solid var(--mo2f-theme-color);
3338
  }
3339
 
3340
  .mo_scan_modal {
3394
  }
3395
  /*Custom login form*/
3396
  .customloginform{
3397
+ padding: 25px !important;
3398
+ margin: 30px!important;
3399
  border-collapse: collapse;
3400
+ border:1px solid #413c69;
3401
  }
3402
  .customloginform th {
3403
 
3406
  .customloginform td {
3407
  /*width:80%;*/
3408
  text-align:left;
3409
+ border:1px solid #413c69;
3410
  padding:1%;
3411
 
3412
  }
3418
  .mo2f_doc_icon_style
3419
  {
3420
  font-size:25px;
3421
+ color:#413c69;
3422
  }
3423
  .mo2f_doc_font_size
3424
  {
3425
  font-size: 112%;
3426
  width: 30%;
3427
  }
3428
+ .mo2fa_tour_button{
3429
+ margin-left: 5%!important;
3430
+ font-weight: bold;
3431
+ width: 40%!important;
3432
+ float: left;
3433
+ min-height: 54px;
3434
+ border: 2px solid black!important;
3435
+ }
3436
  .mo2f_advance_setting
3437
  {
3438
+ margin-left: 6%;
3439
+ background: none;
3440
+ font-weight: bold;
3441
+ width: 40%;
3442
+ float: left;
3443
+ min-height: 54px;
3444
+ border: 2px solid black!important;
3445
  }
3446
  .mo2f_advance_setting:hover
3447
  {
3492
  }
3493
  .mo2f_addons_alignment
3494
  {
3495
+ color:var(--mo2f-theme-color);
3496
  font-size: large;
3497
  float: left;
3498
  margin-right: 5px;
3546
  color: #ffffff;
3547
  margin-left: 15px;
3548
  }
3549
+
 
 
 
 
 
 
 
 
 
3550
  /* The switch - the box around the slider */
3551
  .switch {
3552
  position: relative;
3610
  border-radius: 50%;
3611
  }
3612
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3613
  .mo_wpns_upgrade_page_2fa_ns_styles
3614
  {
3615
  background-color: #7ccbc7;
3799
 
3800
  .mo2f_offer_main_div
3801
  {
3802
+ display:flex;
3803
+ background-image : url("christmas.gif");
3804
+ background-repeat: repeat;
3805
+ margin-top: -2.5%;
3806
+ height:auto;
3807
+ width: inherit;
3808
+ border-radius: 6px;
3809
+ padding-top: 1%;
3810
+ padding-bottom: 3%;
3811
+ justify-content: space-around;
3812
  }
3813
 
3814
  .mo2f_offer_first_section
3815
  {
3816
+ clear: both;
3817
+ display: block;
3818
+ width:23%;
3819
+ height: auto;
3820
+ margin:0px;
3821
+ padding-left: 3%;
3822
+ text-align: center;
3823
+ padding-top: 30px;
3824
+ }
3825
+ @media screen and (max-width: 768px) {
3826
+ .mo2f_offer_first_section {
3827
+ display:none;
3828
+ }
3829
+ .mo2f_offer_valid{
3830
+ display: none !important;
3831
+ }
3832
+ .mo2f_offer_timer{
3833
+ display:none !important;
3834
+ }
3835
+ .mo2f_offer_contact_us
3836
+ {
3837
+ font-size: 120% !important;
3838
+ border-radius: 30px;
3839
+ border: 1px solid #ea5ab7a1;
3840
+ color: white;
3841
+ padding: 4% 8%;
3842
+ background: #ea5ab7a1;
3843
+ text-decoration: none;
3844
+ }
3845
+
3846
 
3847
  }
 
 
 
 
 
 
 
3848
 
3849
+ .mo2f_offer_christmas{
3850
+ letter-spacing: 5px;
3851
+ font-size: 250%;
3852
+ width: 83%;
3853
+ color: #fffafa;
3854
+ -webkit-text-stroke: 2px #ffff;
3855
+ font-family: sans-serif;
3856
+ margin: 0%;
3857
  }
3858
+ .mo2f_offer_cyber{
3859
+ font-size: 200%;
3860
+ margin:0px;
3861
+ margin-left: -18%;
3862
+ letter-spacing: 6px;
3863
+ color: white;
3864
+ margin-top: 2%;
3865
+ font-weight: bold;
3866
+ }
3867
+ .mo2fa_hr_line{
3868
+ width: 83%;
3869
+ line-height: 1%;
3870
+ margin: 7px;
3871
+ }
3872
+ .mo2fa_hr_line span{
3873
+ background: #fe161600;
3874
+ padding: 0 10px;
3875
+ color: #ffffff;
3876
+ font-weight: bold;
3877
+ font-size: 30px;
3878
  }
3879
+
3880
  .mo2f_offer_middle_section
3881
  {
3882
+ width:50%;
3883
+ color: white; /*if no support for background-clip*/
3884
+ float: left;
3885
+ }
3886
+
3887
+ .mo2f_offer_get_upto
3888
+ {
3889
+ text-align:center;
3890
+ margin:0px;
3891
+ margin-bottom: -2%;
3892
+ margin-top: 4.5%;
3893
+ color: white;
3894
+ font-size: 200%;
3895
+ }
3896
+ .mo2f_offer_valid{
3897
+ text-align: center;
3898
+ font-size: 165%;
3899
+ margin:0px;
3900
+ }
3901
+ .mo2f_offer_timer{
3902
+ text-align: center;
3903
+ margin:0px;
3904
+ font-size: 150%;
3905
+ font-weight:bold;
3906
  }
3907
 
3908
  .mo2f_offer_last_section
3909
  {
3910
+ width:25%;
3911
+ padding-top: 5%;
3912
+ float: right;
3913
+ text-align: center;
3914
  }
3915
 
3916
  .mo2f_offer_contact_us
3917
  {
3918
+ font-size: 170%;
3919
+ border-radius: 30px;
3920
+ border: 1px solid #ffff;
 
3921
  color: white;
3922
+ padding: 4% 8%;
3923
+ background: #ffffff94;
3924
+ font-weight: 500;
3925
  text-decoration: none;
3926
  }
3927
 
3928
+ .mo2f_banner_never_show_again{
3929
+ color: white;
3930
+
3931
+ font-size: 15px;
3932
+ float: right;
3933
+ margin-top: -70px;
3934
+ margin-right: 10px;
3935
+ border:none;
3936
+ }
3937
+
3938
+ .mo2f_close
3939
  {
3940
+ background:none;
3941
+ }
3942
+
3943
+ .mo2f_cross
3944
+ {
3945
+ background:#d69494;
3946
+ padding: 0px 4px;
3947
+ font-weight: bold;
3948
+ cursor: pointer;
3949
+ }
3950
+
3951
+ .mo2f_offer_contact_us:hover, .mo2f_cross:hover
3952
+ {
3953
+ color: white;
3954
+ background: #ffffff7a;
3955
  }
3956
 
3957
  .mo2f_offer_contact_us_layout
3958
  {
3959
+ border: 3px solid var(--mo2f-theme-color) !important;
3960
  }
3961
 
3962
  .mo2f_offer_contact_us_button
3963
  {
3964
+ background: var(--mo2f-theme-color) !important;
3965
+ }
3966
+
3967
+ .mo2f_trial_submit_button
3968
+ {
3969
+ background: #2271b1 !important;
3970
+ background-color: #20b2aa; /* Green */
3971
+ border: none;
3972
+ color: white;
3973
+ padding: 11px 28px;
3974
+ text-align: center;
3975
+ text-decoration: none;
3976
+ display: inline-block;
3977
+ font-size: 16px;
3978
+ margin: 4px 2px;
3979
+ cursor: pointer;
3980
+ -webkit-transition-duration: 0.4s; /* Safari */
3981
+ transition-duration: 0.4s;
3982
+ }
3983
+ .mo2f_trial_submit_button:hover {
3984
+ box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
3985
+ color: white;
3986
+ }
3987
+
3988
+ .mo2f_trial_box{
3989
+ width: 654px;
3990
+ }
3991
+
3992
+ .mo2f_firebase_adv_container{
3993
+ display: flex;
3994
+ justify-content: top;
3995
+ align-items: center;
3996
+ flex-direction: column;
3997
+ margin: 10px;
3998
+ border: 1px solid #000000;
3999
+ height: 185px;
4000
+ padding: 10px;
4001
+ background-image: linear-gradient(rgba(255, 252, 0, 1),rgb(255,188,107));
4002
+ /* background-color: orange; */
4003
+ }
4004
+
4005
+ .mo2f_firebase_adv_img{
4006
+ display: flex;
4007
+ align-items: center;
4008
+ justify-content: space-between;
4009
+ }
4010
+ .mo2f_firebase_adv_text{
4011
+ width: 60px;
4012
+ height: 60px;
4013
+ left: 0px;
4014
+ top: 0px;
4015
+
4016
+ }
4017
+ .mo2f_firebase_adv_content{
4018
+ text-align: center;
4019
+ padding: 10px;
4020
+ font-size:15px;
4021
+ color: #434343;
4022
+ }
4023
+
4024
+ .mo2f_firebase_adv_button{
4025
+ background-color: #000000;
4026
+ border: none;
4027
+ color: #ffffff;
4028
+ padding: 10px 20px;
4029
+ text-align: center;
4030
+ text-decoration: none;
4031
+ display: inline-block;
4032
+ font-size: 16px;
4033
+ margin: 4px 2px;
4034
+ cursor: pointer;
4035
+ border-radius: 50px;
4036
+ }
4037
+
4038
+
4039
+ .mo2f_firebase_adv_button,.mo2f_firebase_adv_button:visited, .mo2f_firebase_adv_button:hover,.mo2f_firebase_adv_button:active{color:#ffffff;}
4040
+
4041
+ .mp2f-form-div{
4042
+ display: none;
4043
+ margin-top:10px;
4044
  }
includes/css/twofa_style_settings.css CHANGED
@@ -155,7 +155,19 @@
155
  filter: alpha(opacity=50);
156
  opacity: .5
157
  }
158
-
 
 
 
 
 
 
 
 
 
 
 
 
159
  button.mo2f_close {
160
  -webkit-appearance: none;
161
  padding: 0;
155
  filter: alpha(opacity=50);
156
  opacity: .5
157
  }
158
+ .mo2f-styled-radio {
159
+ width: 32px;
160
+ height: 32px;
161
+ position: relative;
162
+ display: inline-block;
163
+ border-radius: 50%;
164
+ background-color: #e6e6e6;
165
+ float: left;
166
+ margin-top: -4px;
167
+ }
168
+ .mo2f-styled-radio-text_conf {
169
+ margin-left: 10px;
170
+ }
171
  button.mo2f_close {
172
  -webkit-appearance: none;
173
  padding: 0;
includes/css/upgrade.css CHANGED
@@ -1,3 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  .mo2fa_pricing_feature_collection_supporter{
2
  height: 32em;
3
  }
@@ -8,12 +296,14 @@
8
  }
9
  i.fa-check {
10
  color: black;
 
11
  margin-right: 17px;
12
  margin-top: 0.5em;
13
  margin-bottom: 0.5em;
14
  }
15
  i.fa-times {
16
  color: #b6abab;
 
17
  margin-right: 17px;
18
  margin-top: 0.5em;
19
  margin-bottom: 0.5em;
@@ -26,20 +316,19 @@ i.fa-times {
26
 
27
  }
28
  .mo2fa_pricing_feature_collection{
29
- width: 24em;
30
  height: 31em;
31
- margin-top: 13px;
32
- padding-top: 18px;
33
- margin-left: 21px;
34
- margin-right: 28px;
35
  }
36
  .mo2fa_limit_pricing_feature_mo_2fa{
37
  color: #b6abab;
38
  font-weight: 500;
39
  }
40
  .mo2fa_unltimate_feature{
41
- color: #00000;
42
- font-weight: 500;
 
 
 
 
43
  }
44
  .mo2fa_sec{
45
  width: 27em;
@@ -49,24 +338,45 @@ i.fa-times {
49
  border: 1px solid #ccc;
50
  padding-top: 2em;
51
  }
52
- .mo2fa_upgrade_my_plan{
53
  border: none;
54
- top: 50%;
55
- left: 50%;
56
  color: white;
57
  padding: 15px 32px;
58
  width: auto;
59
- min-width: 70%;
60
  border-radius: 26px;
61
  text-align: center;
62
  text-decoration: none;
63
  display: inline-block;
64
- background: #2a80ca;
65
  font-size: 16px;
66
  height: auto;
67
- /*margin: 2px 18px 2px -27px;*/
68
  margin-top: 24px;
69
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  .mo2fa_upgrade_my_plan:hover{
71
  border: none;
72
  background: #8d86f5;
@@ -77,7 +387,7 @@ i.fa-times {
77
  .mo2fa_pricing_tabs_mo{
78
  width: auto;
79
  border-radius: 4px;
80
- height: 88em;
81
  border: 1px solid #ccc;
82
  padding-top: 2em;
83
  }
@@ -99,12 +409,15 @@ i.fa-times {
99
  color: white;
100
  background: #8d86f5;
101
  }
 
 
 
102
  .mo2fa_pricing_head_mo_2fa{
103
- font-size: 33px;
104
- font-weight: bold;
105
- color: black;
106
  margin-bottom: 3%;
107
- /*margin-top: 10%;*/
108
  }
109
  .mo2fa_method-list-size{
110
  font-size: 11px;
@@ -113,7 +426,6 @@ i.fa-times {
113
  margin-left: 2em;
114
  font-weight: 450;
115
  }
116
-
117
  .mo2fa_method-list-mo-size-cross{
118
  font-size: 11px;
119
  color: #b6abab;
@@ -121,28 +433,23 @@ i.fa-times {
121
  list-style: none!important;
122
  margin-left: 2em;
123
  }
124
-
125
  .mo2fa_price_mo_2fa{
126
  font-size: 35px;
127
  font-weight: bold;
128
  color: black;
129
-
130
  }
131
  .mo2fa_purchase_user_limit_mo{
132
  margin-top: 22px!important;
133
  margin-bottom: 0px!important;
134
  color: black;
135
  }
136
-
137
  .mo2fa_purchase_otp_limit{
138
  margin-top: 10px!important;
139
  margin-bottom: 4px!important;
140
  color: black;
141
-
142
  }
143
  .mo2fa_increase_my_limit{
144
- width:auto;
145
- min-width: 85%;
146
  color: black;
147
  font-size: 11px;
148
  background: #c9dbdb75;
@@ -159,6 +466,14 @@ i.fa-times {
159
  .mo2fa_ul{
160
  font-size: 15px;
161
  }
 
 
 
 
 
 
 
 
162
  .mo2fa_more_details_p,.mo2fa_more_details_p1{
163
  font-size: 13px;
164
  margin-bottom: -10px;
@@ -173,8 +488,7 @@ i.fa-times {
173
  }
174
  .mo2fa_pricing{
175
  padding: 16px 55px 12px 41px;
176
- margin-top: 9em;
177
- height: 25em;
178
  }
179
  .mo2fa_pricing_p{
180
  font-size: 10px;
@@ -184,8 +498,8 @@ i.fa-times {
184
  font-size: 46px;
185
  font-weight: 600;
186
  padding: 5px 5px 5px 5px;
187
- margin-top: 18px;
188
- color:black;
189
  }
190
  .mo2fa_country{
191
  margin-top: 2px;
@@ -212,7 +526,6 @@ i.fa-times {
212
  .mo2fa_starting_from{
213
  font-size: 10px;
214
  margin-left: -24px;
215
- /*margin-top: -17px;*/
216
  }
217
  .mo2fa_center{
218
  text-align: center;
@@ -222,8 +535,6 @@ i.fa-times {
222
  border: none!important;
223
  }
224
  .mo2fa_pricing_tabs_mo_premium{
225
- height: 84em!important;
226
- margin-top: -4em;
227
  background: ffffffad;
228
  border: none;
229
  box-shadow: 12px;
@@ -242,7 +553,6 @@ i.fa-times {
242
  background: #2a80caa6;
243
  color: white;
244
  height: 3em;
245
- /* border-radius: 1px 25px 25px 0px; */
246
  margin-left: 0px;
247
  margin-top: -2em;
248
  font-size: 16px;
@@ -276,7 +586,7 @@ i.fa-times {
276
  height: 28px;
277
  width:auto;
278
  }
279
- .category_feature_mo_2fa{
280
  font-size: 16px;
281
  font-weight: 600;
282
  padding-bottom: 0.3em;
@@ -287,12 +597,12 @@ background: #d5d5d5!important;
287
  margin-top: 0.3em;
288
  margin-bottom: 0.3em;
289
  }
290
- .bg_category_main_mo_2fa{
291
  font-size: 17px;
292
  border :0.5px solid #c1c1c1 ;
293
  background: #c9dbdb!important
294
  }
295
- .description_mo_2fa{
296
  font-size: 13px!important;
297
  font-weight: 400;
298
  }
@@ -332,26 +642,25 @@ table.mo2fa_table_features tr:last-child
332
  min-width: 22%!important;
333
  width:10%;
334
  }
335
- .mo2fa_tooltip_methodlist {
336
  position: relative;
337
  display: inline-block;
338
  }
339
 
340
- .mo2fa_tooltip_methodlist .methodlist {
341
  visibility: hidden;
342
  width: 15em;
343
  background-color: #000000b8;
344
  color: #fff;
345
  text-align: left;
346
  border-radius: 6px;
347
- padding: 7px 0px 8px 61px;
348
  position: absolute;
349
  z-index: 1;
350
- top: -141px;
351
  left: 107%;
352
  }
353
-
354
- .mo2fa_tooltip_methodlist .methodlist::after {
355
  content: "";
356
  position: absolute;
357
  top: 50%;
@@ -361,30 +670,27 @@ table.mo2fa_table_features tr:last-child
361
  border-style: solid;
362
  border-color: transparent black transparent transparent;
363
  }
364
- .mo2fa_tooltip_methodlist:hover .methodlist {
365
  visibility: visible;
366
  }
367
-
368
  .mo2fa_tooltip_methodlist {
369
  position: relative;
370
  display: inline-block;
371
  }
372
-
373
- .mo2fa_tooltip_methodlist .methodlist {
374
  visibility: hidden;
375
  width: 14em;
376
  background-color: #000000b8;
377
  color: #fff;
378
  text-align: left;
379
  border-radius: 6px;
380
- padding: 7px 0px 8px 61px;
381
  position: absolute;
382
  z-index: 1;
383
- top: -11em;
384
- left: 107%;
385
  }
386
-
387
- .mo2fa_tooltip_methodlist .methodlist::after {
388
  content: "";
389
  position: absolute;
390
  top: 50%;
@@ -394,9 +700,346 @@ table.mo2fa_table_features tr:last-child
394
  border-style: solid;
395
  border-color: transparent black transparent transparent;
396
  }
397
- .mo2fa_tooltip_methodlist:hover .methodlist {
398
  visibility: visible;
399
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  .mo2fa_enterprise_getting_started{
401
  margin-top: -1em;
402
  }
@@ -430,7 +1073,7 @@ table.mo2fa_table_features tr:last-child
430
  .mo_2fa_card{
431
  width: 98%;
432
  }
433
- .mo_upgrade_toggle_2fa_lable{
434
  font-size: 1em;
435
  width: 12em;
436
  }
@@ -441,3 +1084,41 @@ table.mo2fa_table_features tr:last-child
441
  display: grid;
442
  }
443
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .mo2fa_pricing_head_blue{
2
+ background-color: #1f3668;
3
+ border-radius: 1em 1em 50% 50%;
4
+ padding: 1em 1em 2em 0em;
5
+ color: white;
6
+ margin-top: -10%;
7
+ }
8
+ .mo2fa_per_tooltip_methodlist {
9
+ position: relative;
10
+ display: inline-block;
11
+ }
12
+ .mo2fa_per_tooltip_methodlist .mo2fa_methodlist {
13
+ visibility: hidden;
14
+ width: 13em;
15
+ background-color: #000000b8;
16
+ color: #fff;
17
+ text-align: left;
18
+ border-radius: 6px;
19
+ padding: 12px 2px 12px 28px;
20
+ position: absolute;
21
+ z-index: 1;
22
+ top: -2em;
23
+ left: 107%;
24
+ }
25
+ .mo2fa_per_tooltip_methodlist:hover .mo2fa_methodlist {
26
+ visibility: visible;
27
+ }
28
+ .mo2fa_per_tooltip_methodlist .mo2fa_methodlist::after {
29
+ content: "";
30
+ position: absolute;
31
+ top: 50%;
32
+ right: 100%;
33
+ margin-top: -5px;
34
+ border-width: 5px;
35
+ border-style: solid;
36
+ border-color: transparent black transparent transparent;
37
+ }
38
+ .mo2fa_on_per_tooltip_methodlist {
39
+ position: relative;
40
+ display: inline-block;
41
+ }
42
+ .mo2fa_on_per_tooltip_methodlist .mo2fa_methodlist {
43
+ visibility: hidden;
44
+ width: 14em;
45
+ background-color: #000000b8;
46
+ color: #fff;
47
+ text-align: left;
48
+ border-radius: 6px;
49
+ padding: 12px 2px 12px 28px;
50
+ position: absolute;
51
+ z-index: 1;
52
+ top: -1.6em;
53
+ left: 90%;
54
+ }
55
+ .mo2fa_on_per_tooltip_methodlist:hover .mo2fa_methodlist {
56
+ visibility: visible;
57
+ }
58
+ .mo2fa_on_per_tooltip_methodlist .mo2fa_methodlist::after {
59
+ content: "";
60
+ position: absolute;
61
+ top: 50%;
62
+ right: 100%;
63
+ margin-top: -5px;
64
+ border-width: 5px;
65
+ border-style: solid;
66
+ border-color: transparent black transparent transparent;
67
+ }
68
+
69
+
70
+ .mo2fa_cloud_per_tooltip_methodlist {
71
+ position: relative;
72
+ display: inline-block;
73
+ }
74
+ .mo2fa_cloud_per_tooltip_methodlist .mo2fa_methodlist {
75
+ visibility: hidden;
76
+ width: 14em;
77
+ background-color: #000000b8;
78
+ color: #fff;
79
+ text-align: left;
80
+ border-radius: 6px;
81
+ padding: 11px 1px 11px 43px;
82
+ position: absolute;
83
+ z-index: 1;
84
+ top: -15px;
85
+ right: 110%;
86
+ }
87
+ .mo2fa_cloud_per_tooltip_methodlist:hover .mo2fa_methodlist {
88
+ visibility: visible;
89
+ }
90
+ .mo2fa_cloud_per_tooltip_methodlist .mo2fa_methodlist::after {
91
+ content: "";
92
+ position: absolute;
93
+ top: 50%;
94
+ left: 100%;
95
+ margin-top: -5px;
96
+ border-width: 5px;
97
+ border-style: solid;
98
+ border-color: transparent transparent transparent black;
99
+ }
100
+
101
+ .mo2fa_fido_tooltip_methodlist {
102
+ position: relative;
103
+ display: inline-block;
104
+ }
105
+ .mo2fa_fido_tooltip_methodlist .mo2fa_methodlist {
106
+ visibility: hidden;
107
+ width: 16em;
108
+ background-color: #000000b8;
109
+ color: #fff;
110
+ text-align: left;
111
+ border-radius: 6px;
112
+ padding: 12px 2px 12px 28px;
113
+ position: absolute;
114
+ z-index: 1;
115
+ top: -1.9em;
116
+ left: 91%;
117
+ }
118
+ .mo2fa_fido_tooltip_methodlist:hover .mo2fa_methodlist {
119
+ visibility: visible;
120
+ }
121
+ .mo2fa_fido_tooltip_methodlist .mo2fa_methodlist::after {
122
+ content: "";
123
+ position: absolute;
124
+ top: 50%;
125
+ right: 100%;
126
+ margin-top: -5px;
127
+ border-width: 5px;
128
+ border-style: solid;
129
+ border-color: transparent black transparent transparent;
130
+ }
131
+
132
+ .mo2fa_shortcode_tooltip_methodlist {
133
+ position: relative;
134
+ display: inline-block;
135
+ }
136
+ .mo2fa_shortcode_tooltip_methodlist .mo2fa_methodlist {
137
+ visibility: hidden;
138
+ width: auto;
139
+ min-width:26em;
140
+ background-color: #000000b8;
141
+ color: #fff;
142
+ text-align: left;
143
+ border-radius: 6px;
144
+ padding: 7px 0px 8px 8px;
145
+ position: absolute;
146
+ z-index: 1;
147
+ top: -1.1em;
148
+ left: 107%;
149
+ }
150
+ .mo2fa_shortcode_tooltip_methodlist:hover .mo2fa_methodlist {
151
+ visibility: visible;
152
+ }
153
+ .mo2fa_shortcode_tooltip_methodlist .mo2fa_methodlist::after {
154
+ content: "";
155
+ position: absolute;
156
+ top: 50%;
157
+ right: 100%;
158
+ margin-top: -5px;
159
+ border-width: 5px;
160
+ border-style: solid;
161
+ border-color: transparent black transparent transparent;
162
+ }
163
+ .mo2fa_shortcode_ent_tooltip_methodlist {
164
+ position: relative;
165
+ display: inline-block;
166
+ }
167
+ .mo2fa_shortcode_ent_tooltip_methodlist .mo2fa_methodlist {
168
+ visibility: hidden;
169
+ width: auto;
170
+ min-width:26em;
171
+ background-color: #000000b8;
172
+ color: #fff;
173
+ text-align: left;
174
+ border-radius: 6px;
175
+ padding: 7px 0px 8px 8px;
176
+ position: absolute;
177
+ z-index: 1;
178
+ top: -15px;
179
+ right: 110%;
180
+ }
181
+ .mo2fa_shortcode_ent_tooltip_methodlist:hover .mo2fa_methodlist {
182
+ visibility: visible;
183
+ }
184
+ .mo2fa_shortcode_ent_tooltip_methodlist .mo2fa_methodlist::after {
185
+ content: "";
186
+ position: absolute;
187
+ top: 50%;
188
+ left: 100%;
189
+ margin-top: -5px;
190
+ border-width: 5px;
191
+ border-style: solid;
192
+ border-color: transparent transparent transparent black;
193
+ }
194
+ #mo2f_upgrade_main_div:hover > #mo2fa-ribbon{
195
+ margin-top: 0%;
196
+ transition: 1s;
197
+ }
198
+ .mo2fa_per_year{
199
+ color:white;
200
+ font-size: small;
201
+ }
202
+ .mo2fa_tooltip {
203
+ position: relative;
204
+ border-bottom: 1px dotted black;
205
+ }
206
+ .mo2fa_tooltip .mo2fa_tooltiptext {
207
+ visibility: hidden;
208
+ line-height: 1.6;
209
+ width: 248px;
210
+ background-color: white;
211
+ color: cadetblue;
212
+ border: 1px solid cadetblue;
213
+ text-align: center;
214
+ border-radius: 6px;
215
+ padding: 10px 0;
216
+ position: absolute;
217
+ z-index: 1;
218
+ top: -5px;
219
+ left: 105%;
220
+ }
221
+ .mo2fa_tooltip:hover .mo2fa_tooltiptext {
222
+ visibility: visible;
223
+ }
224
+ .mo2fa-ribbon span {
225
+ position: absolute;
226
+ width: 154px;
227
+ padding: 19px 0px 15px 68px;
228
+ background-color: #3498db;
229
+ box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
230
+ color: #fff;
231
+ font: 700 14px/1 Lato,sans-serif;
232
+ text-shadow: 0 1px 1px rgb(0 0 0 / 20%);
233
+ }
234
+ .mo2fa-ribbon-top-right span {
235
+ left: 0;
236
+ top: 19px;
237
+ transform: rotate(45deg);
238
+ z-index: 1;
239
+ }
240
+ .mo2fa-ribbon {
241
+ width: 160px;
242
+ height: 160px;
243
+ overflow: hidden;
244
+ position: absolute;
245
+ z-index: 0;
246
+ }
247
+ .mo2fa-ribbon-top-right {
248
+ top: 154px;
249
+ right: 486px;
250
+ }
251
+ .mo2fa-ribbon::before {
252
+ position: absolute;
253
+ content: "";
254
+ border: 5px solid #2980b9;
255
+ }
256
+ .mo2fa-ribbon-top-right::before {
257
+ top: -2px;
258
+ left: 34px;
259
+ }
260
+ .mo2fa-ribbon::after, .mo2fa-ribbon::before {
261
+ position: absolute;
262
+ content: "";
263
+ border: 5px solid #2980b9;
264
+ }
265
+ .mo2fa-ribbon-top-right::after {
266
+ bottom: 34px;
267
+ right: 0;
268
+ }
269
+ .mo2fa_pricing_head_sky{
270
+ background-color: #327a86;
271
+ border-radius: 1em 1em 50% 50%;
272
+ padding: 1em 1em 2em 0em;
273
+ color: white;
274
+ margin-top: -10%;
275
+ height:15.5em;
276
+ }
277
+ .wp-core-ui select{
278
+ padding: 4px 24px 4px 8px;
279
+ margin-left:1em;
280
+ }
281
+ .mo2fa_plan-type{
282
+ text-align: center;
283
+ color: #1f3668;
284
+ font-size: 28px;
285
+ }
286
+ .mo2fa_ul li{
287
+ margin-bottom: 0%;
288
+ }
289
  .mo2fa_pricing_feature_collection_supporter{
290
  height: 32em;
291
  }
296
  }
297
  i.fa-check {
298
  color: black;
299
+ margin-left:2em;
300
  margin-right: 17px;
301
  margin-top: 0.5em;
302
  margin-bottom: 0.5em;
303
  }
304
  i.fa-times {
305
  color: #b6abab;
306
+ margin-left: 2em;
307
  margin-right: 17px;
308
  margin-top: 0.5em;
309
  margin-bottom: 0.5em;
316
 
317
  }
318
  .mo2fa_pricing_feature_collection{
 
319
  height: 31em;
 
 
 
 
320
  }
321
  .mo2fa_limit_pricing_feature_mo_2fa{
322
  color: #b6abab;
323
  font-weight: 500;
324
  }
325
  .mo2fa_unltimate_feature{
326
+ text-align: center;
327
+ color: #000000;
328
+ font-family:Open Sans;
329
+ letter-spacing: 0.3px;
330
+ padding:0.5em;
331
+ font-family:Open Sans;
332
  }
333
  .mo2fa_sec{
334
  width: 27em;
338
  border: 1px solid #ccc;
339
  padding-top: 2em;
340
  }
341
+ .mo2fa_upgrade_my_plan_ent{
342
  border: none;
343
+ top: 50%;
344
+ left: 50%;
345
  color: white;
346
  padding: 15px 32px;
347
  width: auto;
348
+ min-width: 50%;
349
  border-radius: 26px;
350
  text-align: center;
351
  text-decoration: none;
352
  display: inline-block;
353
+ background: #327a86;
354
  font-size: 16px;
355
  height: auto;
 
356
  margin-top: 24px;
357
  }
358
+ .mo2fa_upgrade_my_plan_ent:hover{
359
+ border: none;
360
+ background: #8d86f5;
361
+ }
362
+ .mo2fa_upgrade_my_plan {
363
+ border: none;
364
+ top: 50%;
365
+ left: 50%;
366
+ color: white;
367
+ padding: 15px 32px;
368
+ width: auto;
369
+ min-width: 50%;
370
+ border-radius: 26px;
371
+ text-align: center;
372
+ text-decoration: none;
373
+ display: inline-block;
374
+ background: #1f3668;
375
+ font-size: 16px;
376
+ height: auto;
377
+ margin-top: 24px;
378
+ cursor:pointer;
379
+ }
380
  .mo2fa_upgrade_my_plan:hover{
381
  border: none;
382
  background: #8d86f5;
387
  .mo2fa_pricing_tabs_mo{
388
  width: auto;
389
  border-radius: 4px;
390
+ height: 84.5em;
391
  border: 1px solid #ccc;
392
  padding-top: 2em;
393
  }
409
  color: white;
410
  background: #8d86f5;
411
  }
412
+ .mo2fa_web_sec{
413
+ padding:20px 0;
414
+ }
415
  .mo2fa_pricing_head_mo_2fa{
416
+ font-size: 20px;
417
+ color: white;
418
+ line-height: 1.6;
419
  margin-bottom: 3%;
420
+ font-family:unset;
421
  }
422
  .mo2fa_method-list-size{
423
  font-size: 11px;
426
  margin-left: 2em;
427
  font-weight: 450;
428
  }
 
429
  .mo2fa_method-list-mo-size-cross{
430
  font-size: 11px;
431
  color: #b6abab;
433
  list-style: none!important;
434
  margin-left: 2em;
435
  }
 
436
  .mo2fa_price_mo_2fa{
437
  font-size: 35px;
438
  font-weight: bold;
439
  color: black;
 
440
  }
441
  .mo2fa_purchase_user_limit_mo{
442
  margin-top: 22px!important;
443
  margin-bottom: 0px!important;
444
  color: black;
445
  }
 
446
  .mo2fa_purchase_otp_limit{
447
  margin-top: 10px!important;
448
  margin-bottom: 4px!important;
449
  color: black;
 
450
  }
451
  .mo2fa_increase_my_limit{
452
+ width:40%;
 
453
  color: black;
454
  font-size: 11px;
455
  background: #c9dbdb75;
466
  .mo2fa_ul{
467
  font-size: 15px;
468
  }
469
+ .mo2fa_ul li{
470
+ font-size: 14px;
471
+ font-family: system-ui;
472
+ }
473
+
474
+ .mo2fa_ul li:nth-of-type(2n+1) {
475
+ background-color: rgba(23,61,80,.06);
476
+ }
477
  .mo2fa_more_details_p,.mo2fa_more_details_p1{
478
  font-size: 13px;
479
  margin-bottom: -10px;
488
  }
489
  .mo2fa_pricing{
490
  padding: 16px 55px 12px 41px;
491
+ height: 10em;
 
492
  }
493
  .mo2fa_pricing_p{
494
  font-size: 10px;
498
  font-size: 46px;
499
  font-weight: 600;
500
  padding: 5px 5px 5px 5px;
501
+ margin-top: 35px;
502
+ color:white;
503
  }
504
  .mo2fa_country{
505
  margin-top: 2px;
526
  .mo2fa_starting_from{
527
  font-size: 10px;
528
  margin-left: -24px;
 
529
  }
530
  .mo2fa_center{
531
  text-align: center;
535
  border: none!important;
536
  }
537
  .mo2fa_pricing_tabs_mo_premium{
 
 
538
  background: ffffffad;
539
  border: none;
540
  box-shadow: 12px;
553
  background: #2a80caa6;
554
  color: white;
555
  height: 3em;
 
556
  margin-left: 0px;
557
  margin-top: -2em;
558
  font-size: 16px;
586
  height: 28px;
587
  width:auto;
588
  }
589
+ .mo2fa_category_feature{
590
  font-size: 16px;
591
  font-weight: 600;
592
  padding-bottom: 0.3em;
597
  margin-top: 0.3em;
598
  margin-bottom: 0.3em;
599
  }
600
+ .mo2fa_bg_category_main{
601
  font-size: 17px;
602
  border :0.5px solid #c1c1c1 ;
603
  background: #c9dbdb!important
604
  }
605
+ .mo2fa_description{
606
  font-size: 13px!important;
607
  font-weight: 400;
608
  }
642
  min-width: 22%!important;
643
  width:10%;
644
  }
645
+ .mo2fa_tooltip_sms_info {
646
  position: relative;
647
  display: inline-block;
648
  }
649
 
650
+ .mo2fa_tooltip_sms_info .mo2fa_sms_info {
651
  visibility: hidden;
652
  width: 15em;
653
  background-color: #000000b8;
654
  color: #fff;
655
  text-align: left;
656
  border-radius: 6px;
657
+ padding: 7px 6px 8px 10px;
658
  position: absolute;
659
  z-index: 1;
660
+ top: 0px;
661
  left: 107%;
662
  }
663
+ .mo2fa_tooltip_sms_info .mo2fa_sms_info::after {
 
664
  content: "";
665
  position: absolute;
666
  top: 50%;
670
  border-style: solid;
671
  border-color: transparent black transparent transparent;
672
  }
673
+ .mo2fa_tooltip_sms_info:hover .mo2fa_sms_info {
674
  visibility: visible;
675
  }
 
676
  .mo2fa_tooltip_methodlist {
677
  position: relative;
678
  display: inline-block;
679
  }
680
+ .mo2fa_tooltip_methodlist .mo2fa_methodlist {
 
681
  visibility: hidden;
682
  width: 14em;
683
  background-color: #000000b8;
684
  color: #fff;
685
  text-align: left;
686
  border-radius: 6px;
687
+ padding: 11px 1px 11px 43px;
688
  position: absolute;
689
  z-index: 1;
690
+ top: -9.4em;
691
+ left: 95%;
692
  }
693
+ .mo2fa_tooltip_methodlist .mo2fa_methodlist::after {
 
694
  content: "";
695
  position: absolute;
696
  top: 50%;
700
  border-style: solid;
701
  border-color: transparent black transparent transparent;
702
  }
703
+ .mo2fa_tooltip_methodlist:hover .mo2fa_methodlist {
704
  visibility: visible;
705
  }
706
+
707
+ .mo2fa_ent_tooltip_methodlist {
708
+ position: relative;
709
+ display: inline-block;
710
+ }
711
+ .mo2fa_ent_tooltip_methodlist .mo2fa_methodlist {
712
+ visibility: hidden;
713
+ width: 14em;
714
+ background-color: #000000b8;
715
+ color: #fff;
716
+ text-align: left;
717
+ border-radius: 6px;
718
+ padding: 11px 1px 11px 43px;
719
+ position: absolute;
720
+ z-index: 1;
721
+ top: -128px;
722
+ right: 110%;
723
+ }
724
+ .mo2fa_ent_tooltip_methodlist .mo2fa_methodlist::after {
725
+ content: "";
726
+ position: absolute;
727
+ top: 50%;
728
+ left: 100%;
729
+ margin-top: -5px;
730
+ border-width: 5px;
731
+ border-style: solid;
732
+ border-color: transparent transparent transparent black;
733
+ }
734
+ .mo2fa_ent_tooltip_methodlist:hover .mo2fa_methodlist {
735
+ visibility: visible;
736
+ }
737
+ .mo2fa_rba_tooltip_methodlist {
738
+ position: relative;
739
+ display: inline-block;
740
+ }
741
+ .mo2fa_rba_tooltip_methodlist .mo2fa_methodlist {
742
+ visibility: hidden;
743
+ width: 14em;
744
+ background-color: #000000b8;
745
+ color: #fff;
746
+ text-align: left;
747
+ border-radius: 6px;
748
+ padding: 7px 0px 8px 11px;
749
+ position: absolute;
750
+ z-index: 1;
751
+ top: -2.6em;
752
+ left: 93%;
753
+ }
754
+ .mo2fa_rba_tooltip_methodlist .mo2fa_methodlist::after {
755
+ content: "";
756
+ position: absolute;
757
+ top: 50%;
758
+ right: 100%;
759
+ margin-top: -5px;
760
+ border-width: 5px;
761
+ border-style: solid;
762
+ border-color: transparent black transparent transparent;
763
+ }
764
+ .mo2fa_rba_tooltip_methodlist:hover .mo2fa_methodlist {
765
+ visibility: visible;
766
+ }
767
+ .mo2fa_ent_rba_tooltip_methodlist {
768
+ position: relative;
769
+ display: inline-block;
770
+ }
771
+ .mo2fa_ent_rba_tooltip_methodlist .mo2fa_methodlist {
772
+ visibility: hidden;
773
+ width: auto;
774
+ min-width:10em;
775
+ background-color: #000000b8;
776
+ color: #fff;
777
+ text-align: left;
778
+ border-radius: 6px;
779
+ padding: 11px 6px 11px 17px;
780
+ position: absolute;
781
+ z-index: 1;
782
+ top: -37px;
783
+ right: 108%;
784
+ }
785
+ .mo2fa_ent_rba_tooltip_methodlist .mo2fa_methodlist::after {
786
+ content: "";
787
+ position: absolute;
788
+ top: 50%;
789
+ left: 100%;
790
+ margin-top: -5px;
791
+ border-width: 5px;
792
+ border-style: solid;
793
+ border-color: transparent transparent transparent black;
794
+ }
795
+ .mo2fa_ent_rba_tooltip_methodlist:hover .mo2fa_methodlist {
796
+ visibility: visible;
797
+ }
798
+ .mo2fa_redirect_tooltip_methodlist {
799
+ position: relative;
800
+ display: inline-block;
801
+ }
802
+ .mo2fa_redirect_tooltip_methodlist .mo2fa_methodlist {
803
+ visibility: hidden;
804
+ width: 17em;
805
+ background-color: #000000b8;
806
+ color: #fff;
807
+ text-align: left;
808
+ border-radius: 6px;
809
+ padding: 10px 3px 10px 34px;
810
+ position: absolute;
811
+ z-index: 1;
812
+ top: -2.1em;
813
+ left: 93%;
814
+ }
815
+ .mo2fa_redirect_tooltip_methodlist .mo2fa_methodlist::after {
816
+ content: "";
817
+ position: absolute;
818
+ top: 50%;
819
+ right: 100%;
820
+ margin-top: -5px;
821
+ border-width: 5px;
822
+ border-style: solid;
823
+ border-color: transparent black transparent transparent;
824
+ }
825
+ .mo2fa_redirect_tooltip_methodlist:hover .mo2fa_methodlist {
826
+ visibility: visible;
827
+ }
828
+ .mo2fa_ent_redirect_tooltip_methodlist {
829
+ position: relative;
830
+ display: inline-block;
831
+ }
832
+ .mo2fa_ent_redirect_tooltip_methodlist .mo2fa_methodlist {
833
+ visibility: hidden;
834
+ width: auto;
835
+ min-width:20em;
836
+ background-color: #000000b8;
837
+ color: #fff;
838
+ text-align: left;
839
+ border-radius: 6px;
840
+ padding: 11px 1px 11px 13px;
841
+ position: absolute;
842
+ z-index: 1;
843
+ top: -28px;
844
+ right: 105%;
845
+ }
846
+ .mo2fa_ent_redirect_tooltip_methodlist .mo2fa_methodlist::after {
847
+ content: "";
848
+ position: absolute;
849
+ top: 50%;
850
+ left: 100%;
851
+ margin-top: -5px;
852
+ border-width: 5px;
853
+ border-style: solid;
854
+ border-color: transparent transparent transparent black;
855
+ }
856
+ .mo2fa_ent_redirect_tooltip_methodlist:hover .mo2fa_methodlist {
857
+ visibility: visible;
858
+ }
859
+ .mo2fa_role_tooltip_methodlist {
860
+ position: relative;
861
+ display: inline-block;
862
+ }
863
+ .mo2fa_role_tooltip_methodlist .mo2fa_methodlist {
864
+ visibility: hidden;
865
+ width: auto;
866
+ min-width:10em;
867
+ background-color: #000000b8;
868
+ color: #fff;
869
+ text-align: left;
870
+ border-radius: 6px;
871
+ padding: 6px 7px 8px 17px;
872
+ position: absolute;
873
+ z-index: 1;
874
+ top: -1.1em;
875
+ left: 90%;
876
+ }
877
+ .mo2fa_role_tooltip_methodlist .mo2fa_methodlist::after {
878
+ content: "";
879
+ position: absolute;
880
+ top: 50%;
881
+ right: 100%;
882
+ margin-top: -5px;
883
+ border-width: 5px;
884
+ border-style: solid;
885
+ border-color: transparent black transparent transparent;
886
+ }
887
+ .mo2fa_role_tooltip_methodlist:hover .mo2fa_methodlist {
888
+ visibility: visible;
889
+ }
890
+ .mo2fa_ent_role_tooltip_methodlist {
891
+ position: relative;
892
+ display: inline-block;
893
+ }
894
+ .mo2fa_ent_role_tooltip_methodlist .mo2fa_methodlist {
895
+ visibility: hidden;
896
+ width: auto;
897
+ min-width:10em;
898
+ background-color: #000000b8;
899
+ color: #fff;
900
+ text-align: left;
901
+ border-radius: 6px;
902
+ padding: 6px 7px 8px 17px;
903
+ position: absolute;
904
+ z-index: 1;
905
+ top: -17px;
906
+ right: 110%;
907
+ }
908
+ .mo2fa_ent_role_tooltip_methodlist .mo2fa_methodlist::after {
909
+ content: "";
910
+ position: absolute;
911
+ top: 50%;
912
+ left: 100%;
913
+ margin-top: -5px;
914
+ border-width: 5px;
915
+ border-style: solid;
916
+ border-color: transparent transparent transparent black;
917
+ }
918
+ .mo2fa_ent_role_tooltip_methodlist:hover .mo2fa_methodlist {
919
+ visibility: visible;
920
+ }
921
+ .mo2fa_custom_sms_tooltip_methodlist {
922
+ position: relative;
923
+ display: inline-block;
924
+ }
925
+ .mo2fa_custom_sms_tooltip_methodlist .mo2fa_methodlist {
926
+ visibility: hidden;
927
+ width: auto;
928
+ min-width:16em;
929
+ background-color: #000000b8;
930
+ color: #fff;
931
+ text-align: left;
932
+ border-radius: 6px;
933
+ padding: 7px 0px 8px 21px;
934
+ position: absolute;
935
+ z-index: 1;
936
+ top: -1.1em;
937
+ left: 107%;
938
+ }
939
+ .mo2fa_custom_sms_tooltip_methodlist .mo2fa_methodlist::after {
940
+ content: "";
941
+ position: absolute;
942
+ top: 50%;
943
+ right: 100%;
944
+ margin-top: -5px;
945
+ border-width: 5px;
946
+ border-style: solid;
947
+ border-color: transparent black transparent transparent;
948
+ }
949
+ .mo2fa_custom_sms_tooltip_methodlist:hover .mo2fa_methodlist {
950
+ visibility: visible;
951
+ }
952
+ .mo2fa_ent_custom_sms_tooltip_methodlist {
953
+ position: relative;
954
+ display: inline-block;
955
+ }
956
+ .mo2fa_ent_custom_sms_tooltip_methodlist .mo2fa_methodlist {
957
+ visibility: hidden;
958
+ width: auto;
959
+ min-width:16em;
960
+ background-color: #000000b8;
961
+ color: #fff;
962
+ text-align: left;
963
+ border-radius: 6px;
964
+ padding: 7px 0px 8px 21px;
965
+ position: absolute;
966
+ z-index: 1;
967
+ top: -17px;
968
+ right: 106%;
969
+ }
970
+ .mo2fa_ent_custom_sms_tooltip_methodlist .mo2fa_methodlist::after {
971
+ content: "";
972
+ position: absolute;
973
+ top: 50%;
974
+ left: 100%;
975
+ margin-top: -5px;
976
+ border-width: 5px;
977
+ border-style: solid;
978
+ border-color: transparent transparent transparent black;
979
+ }
980
+ .mo2fa_ent_custom_sms_tooltip_methodlist:hover .mo2fa_methodlist {
981
+ visibility: visible;
982
+ }
983
+ .mo2fa_enforce_2fa_tooltip_methodlist {
984
+ position: relative;
985
+ display: inline-block;
986
+ }
987
+ .mo2fa_enforce_2fa_tooltip_methodlist .mo2fa_methodlist {
988
+ visibility: hidden;
989
+ width: 14em;
990
+ background-color: #000000b8;
991
+ color: #fff;
992
+ text-align: left;
993
+ border-radius: 6px;
994
+ padding: 8px 22px 8px 22px;
995
+ position: absolute;
996
+ z-index: 1;
997
+ top: -1.1em;
998
+ left: 94%;
999
+ }
1000
+ .mo2fa_enforce_2fa_tooltip_methodlist .mo2fa_methodlist::after {
1001
+ content: "";
1002
+ position: absolute;
1003
+ top: 50%;
1004
+ right: 100%;
1005
+ margin-top: -5px;
1006
+ border-width: 5px;
1007
+ border-style: solid;
1008
+ border-color: transparent black transparent transparent;
1009
+ }
1010
+ .mo2fa_enforce_2fa_tooltip_methodlist:hover .mo2fa_methodlist {
1011
+ visibility: visible;
1012
+ }
1013
+ .mo2fa_ent_enforce_2fa_tooltip_methodlist {
1014
+ position: relative;
1015
+ display: inline-block;
1016
+ }
1017
+ .mo2fa_ent_enforce_2fa_tooltip_methodlist .mo2fa_methodlist {
1018
+ visibility: hidden;
1019
+ width: 18em;
1020
+ background-color: #000000b8;
1021
+ color: #fff;
1022
+ text-align: left;
1023
+ border-radius: 6px;
1024
+ padding: 11px 1px 11px 43px;
1025
+ position: absolute;
1026
+ z-index: 1;
1027
+ top: -26px;
1028
+ right: 110%;
1029
+ }
1030
+ .mo2fa_ent_enforce_2fa_tooltip_methodlist .mo2fa_methodlist::after {
1031
+ content: "";
1032
+ position: absolute;
1033
+ top: 50%;
1034
+ left: 100%;
1035
+ margin-top: -5px;
1036
+ border-width: 5px;
1037
+ border-style: solid;
1038
+ border-color: transparent transparent transparent black;
1039
+ }
1040
+ .mo2fa_ent_enforce_2fa_tooltip_methodlist:hover .mo2fa_methodlist {
1041
+ visibility: visible;
1042
+ }
1043
  .mo2fa_enterprise_getting_started{
1044
  margin-top: -1em;
1045
  }
1073
  .mo_2fa_card{
1074
  width: 98%;
1075
  }
1076
+ .mo2f_upgrade_toggle_lable{
1077
  font-size: 1em;
1078
  width: 12em;
1079
  }
1084
  display: grid;
1085
  }
1086
  }
1087
+ @media only screen and (min-width: 768px) and (max-width: 1024px){
1088
+ .mo2fa_pricing_head_blue{
1089
+ background-color: #1f3668;
1090
+ border-radius: 1em 1em 50% 50%;
1091
+ padding: 1em 1em 2em 0em;
1092
+ margin-top: -13%;
1093
+ }
1094
+ .mo2fa_pricing_head_sky{
1095
+ background-color: #327a86;
1096
+ border-radius: 1em 1em 50% 50%;
1097
+ padding: 1em 1em 2em 0em;
1098
+ margin-top: -14%;
1099
+ height:15.5em;
1100
+ }
1101
+ .mo2fa_pricing_tabs_mo{
1102
+ height: 95em;
1103
+ }
1104
+ .mo2fa_increase_my_limit{
1105
+ width:6em;
1106
+ }
1107
+ .mo2fa_unltimate_feature{
1108
+ height:2em;
1109
+ }
1110
+ .mo2f_upgrade_main_div{
1111
+ Width:auto;
1112
+ }
1113
+ .mo2fa_upgrade_my_plan {
1114
+ border: none;
1115
+ color: white;
1116
+ padding: 15px 32px;
1117
+ width: auto;
1118
+ min-width: 50%;
1119
+ border-radius: 26px;
1120
+ text-align: center;
1121
+ text-decoration: none;
1122
+ display: inline-block;
1123
+ }
1124
+ }
includes/css/user-profile.css ADDED
@@ -0,0 +1,179 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #mo2fa_form-table-user-profile th{
2
+ padding:0px 0px 0px 0px !important;
3
+ text-align: center;
4
+
5
+ }
6
+ .mo2fa_form-table td{
7
+ padding:6px 10px;
8
+ }
9
+ .miniOrange-2FA-methods-table {
10
+ background-color: #fff;
11
+ border: 1px solid #e5e5e5;
12
+ border-spacing: 0;
13
+ }
14
+
15
+ .miniOrange-2FA-methods-table thead,
16
+ .miniOrange-2FA-methods-table tfoot {
17
+ background: #fff;
18
+ }
19
+
20
+ .miniOrange-2FA-methods-table thead th {
21
+ padding: 0.5em;
22
+ }
23
+
24
+ .miniOrange-2FA-methods-table .col-primary,
25
+ .miniOrange-2FA-methods-table .col-enabled {
26
+ width: 5%;
27
+ }
28
+
29
+ .miniOrange-2FA-methods-table .col-name {
30
+ width: 90%;
31
+ }
32
+ .miniOrange-2FA-methods-
33
+ .miniOrange-2FA-methods-table tbody th {
34
+ text-align: center;
35
+ }
36
+
37
+ .miniOrange-2FA-methods-table tbody th,
38
+ .miniOrange-2FA-methods-table tbody td {
39
+ vertical-align: top;
40
+ }
41
+
42
+ .miniOrange-2FA-methods-table tbody tr:nth-child(odd) {
43
+ background-color: #f9f9f9;
44
+
45
+ /*background-color: nome;*/
46
+ }
47
+ #mo2f_configure_kba{
48
+ border:1px solid;
49
+ text-align: center;
50
+ border: 1px solid #52523b;
51
+ }
52
+ .mo2f_kba_header thead th{
53
+ border-bottom: 1px solid black;
54
+ }
55
+ .miniOrange-2FA-methods-table tbody th, .miniOrange-2FA-methods-table tbody td{
56
+ /*text-align: center;*/
57
+ }
58
+ #mo2f_setup_sms{
59
+ /*margin:0 auto;*/
60
+ }
61
+ #mo2f_setup_sms tr{
62
+ background-color: transparent;
63
+ }
64
+ .mo2f_qr{
65
+ margin-left: 5%;
66
+ }
67
+ .mcol-2{
68
+ margin-left: 2%;
69
+ }
70
+ .mo2fa_popup_text
71
+ {
72
+ color:black;
73
+ margin-top: 2%;
74
+ font-weight: 600;
75
+ font-size: 12px !important;;
76
+
77
+ }
78
+ .mo2fa_overlay_success {
79
+ width: min-content;
80
+ height: 40px;
81
+ position: fixed;
82
+ float: right;
83
+ z-index: 1;
84
+ top: 0;
85
+ right: 0;
86
+ margin-top: 7%;
87
+ background-color:#bcffb4 !important ;
88
+ /* overflow-x: hidden; */
89
+ border-left: 4px solid #46b450;
90
+ }
91
+ .mo2fa_overlay_error {
92
+ width: min-content;
93
+ height: min-content;
94
+ padding-bottom: 1%;
95
+ position: fixed;
96
+ float: right;
97
+ z-index: 1;
98
+ top: 0;
99
+ right: 0;
100
+ margin-top: 7%;
101
+ background-color:bisque !important ;
102
+ /* overflow-x: hidden; */
103
+ border-left: 4px solid red;
104
+ }
105
+
106
+ * {box-sizing: border-box}
107
+
108
+ /* Style the tab */
109
+ .mo2fa_tab {
110
+ float: left;
111
+ border: 1px solid #ccc;
112
+ background-color: #f1f1f1;
113
+ width: 15%;
114
+ height: 324px;
115
+ min-height: 300px;
116
+ /*margin-left: 210px;*/
117
+ }
118
+
119
+ /* Style the buttons that are used to open the tab content */
120
+ .mo2fa_tab button {
121
+ display: block;
122
+ background-color: inherit;
123
+ color: black;
124
+ padding: 8px 20px;
125
+ width: 100%;
126
+ border: none;
127
+ outline: none;
128
+ text-align: left;
129
+ cursor: pointer;
130
+ transition: 0.3s;
131
+ }
132
+
133
+ /* Change background color of buttons on hover */
134
+ .mo2fa_tab button:hover {
135
+ background-color: #ddd;
136
+ }
137
+
138
+ /* Create an active/current "tab button" class */
139
+ .mo2fa_tab button.active {
140
+ background-color: #ccc;
141
+ }
142
+
143
+ /* Style the tab content */
144
+ .mo2fa_tabcontent {
145
+ float: left;
146
+ padding: 0px 12px;
147
+ border: 1px solid #ccc;
148
+ width: 80%;
149
+ border-left: none;
150
+ /*height: autoffrom;*/
151
+ height: 324px;
152
+ }
153
+
154
+ .mo2f_miniAuthApp {
155
+ color: #2271b1;
156
+ padding:0.5% 3%;
157
+ /*font-size: 18px;*/
158
+ /*font-weight: 600;*/
159
+ /*width: 50%;*/
160
+ /*height: 20%;*/
161
+ margin:1px;
162
+ border: 1px solid black;
163
+ border-color: #2271b1;
164
+ background-color:#f6f7f7;
165
+ border-radius: 2px;
166
+ }
167
+ .mo2f_miniAuthApp:hover {
168
+ /*background: #20b2aa9e;*/
169
+ background: transparent;
170
+ }
171
+ input[name = 'miniOrangeAuthenticator'] {
172
+ visibility:hidden;
173
+ }
174
+ input[name = 'miniOrangeAuthenticator']:checked + .mo2f_miniAuthApp{
175
+ background: #e5e5ea;
176
+ }
177
+ .mo2fa_select_method{
178
+ width: auto !important;
179
+ }
includes/email-New-release.php CHANGED
@@ -1,257 +1,567 @@
1
  <?php
2
  function mail_tem()
3
  {
4
- return '<!DOCTYPE html>
5
- <html>
 
6
  <head>
7
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
8
- <title></title>
9
- </head>
10
- <body style=background-color:#f6f4f4>
11
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
12
- <style>
13
- .mo_2fa_description
14
- {
15
- /*min-height: 400px;*/
16
- /*background-color: yellow;*/
17
- /*width: 40%;*/
18
- margin: 0%;
19
- /*float: left;*/
20
- text-align: center;
21
-
22
- }
23
- .mo_2fa_feature
24
- {
25
- width: 100%;
26
- /*margin: 2%;*/
27
- float: left;
28
- /*background-color: white;*/
29
- /*border: 1px solid gray;*/
30
- min-height: 400px;
31
- overflow: hidden;
32
- }
33
- .mo_2fa_email_template_details
34
- {
35
- width: 40%;
36
- margin: 1%;
37
- float: left;
38
- background-color: white;
39
- border-top: 5px solid #20b2aa;
40
- min-height: 320px;
41
- text-align: center;
42
- overflow: hidden;
43
- font-size:23px;
44
- }
45
- .mo_2fa_email_template_details:hover
46
- {
47
- box-shadow: 0 0px 0px 0 #9894f6, 0 6px 10px 0 #837fea;
48
- border-top: 4px solid black;
49
- margin-top: -0.5%;
50
- }
51
- .mo_2fa_email_feature_details
52
- {
53
- width: 30%;
54
- margin: 1%;
55
- margin-bottom: 5%;
56
- float: left;
57
- background-color: white;
58
- text-align: center;
59
- min-height: 250px;
60
- overflow: hidden;
61
- color: black;
62
- font-family: inherit;
63
- border-radius: 15px;
64
- box-shadow: 0 0px 0px 0 #b5b2f6, 0 6px 10px 0 #bcbaf4;
65
- border: 1px solid #20b2aa;
66
- font-size:17px;
67
-
68
- }
69
- .mo_2fa_email_feature_details:hover
70
- {
71
- color: #20b2aa;
72
- box-shadow: 0 0px 0px 0 #9894f6, 0 6px 10px 0 #837fea;
73
- }
74
- .mo_2fa_ef_button:hover
75
- {
76
- box-shadow: 0 0px 0px 0 #ffa792, 0 6px 10px 0 grey;
77
- }
78
- .mo_2fa_feature_block
79
- {
80
- /*width: 91%;*/
81
- margin-left: 3%;
82
- display: flex;
83
- color:white;
84
- }
85
- .mo_2fa_ef_h2
86
- {
87
- color: #ad2100;
88
- font-family: cursive;
89
- }
90
- .mo_2fa_ef_h1
91
- {
92
- color: #100505;
93
- font-size: 35px;
94
- }
95
- .mo_2fa_ef_button
96
- {
97
- font-size: x-large;
98
- background-color:#20b2aa;
99
- color: white;
100
- padding: 17px 127px;
101
- font-family: cursive;
102
- margin-left: -42px;
103
- }
104
- .mo_2fa_ef_read_more
105
- {
106
- color: #20b2aa;
107
- border: 2px solid #20b2aa;
108
- padding: 17px 27px;
109
- font-family: cursive;
110
- }
111
- .mo_2fa_ef_read_more:hover
112
- {
113
- /*font-size: x-large;*/
114
- background-color: #20b2aa;
115
- color: white;
116
- border: 1px solid white;
117
- padding: 17px 27px;
118
- font-family: cursive;
119
- }
120
- .mo_2fa_ef_hr
121
- {
122
- border: 2px solid #100505;
123
- margin: 0px 7%;
124
- }
125
- .myDiv
126
- {
127
-
128
- /*min-height: 300px;*/
129
- background-color: #18272a;
130
- /*width: 29%;*/
131
- /*float: left;*/
132
- text-align: center;
133
- color: white;
134
- padding: 2px 2px;
135
- font-size:18px;
136
- margin-top:14px;
137
- }
138
  </style>
139
- <div style="border: 2px solid black;">
140
- <center><img src="https://s3.amazonaws.com/Snowcovered_C_Images/40290_shield.png" alt="miniorange" width="350" height="175" ></center>
141
- <div>
142
- <div class="mo_2fa_description">
143
- <h1 class="mo_2fa_ef_h1">miniOrange 2FA Plugin List of Latest Features</h1>
144
- </div>
145
- </div>
146
-
147
- <div>
148
- <div class="mo_2fa_feature_block">
149
- <div class="mo_2fa_feature">
150
- <div class="mo_2fa_email_feature_details">
151
- <h2>Backup Codes</h2>
152
- <ul style="text-align: left;">
153
- <li> This will help you to come out from lockdown situation </li>
154
- <li> We will provide five backup codes </li>
155
- <li> All are one time usable </li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  </ul>
157
- </div>
158
- <div class="mo_2fa_email_feature_details">
159
- <h2>Microsoft Authenticator</h2>
160
- <ul style="text-align: left;">
161
- <li>It will genrate the otp on every login</li>
162
- <li>It Provide multi-factor authentication with extra layer</li>
163
- <li> It is very easy to use and secure access</li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  </ul>
165
- </div>
166
- <div class="mo_2fa_email_feature_details">
167
- <h2>Email Notification</h2>
168
- <ul style="text-align: left;">
169
- <li>This feature will give important alert </li>
170
- <li>Very helpful for the user to be used</li>
171
- <li>Notification regarding important alerts</li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  </ul>
173
- </div>
174
- <div>
175
- <br><br>
176
- <center>
177
- <a class="mo_2fa_ef_button" href="https://plugins.miniorange.com/2-factor-authentication-for-wordpress">Feature Details</a>
178
- </center>
179
- </div>
180
- </div>
181
- </div>
182
- <!-- <br><br> -->
183
- </div>
184
- <!-- <hr class="mo_2fa_ef_hr"> -->
185
- <br><br>
186
- <div class="mo_2fa_feature_block" style="margin-left: 14%;">
187
- <div class="mo_2fa_email_template_details">
188
- <i class="fa fa-globe" style="font-size:50px;color: black;margin-top: 6%"></i>
189
- <div style="min-height: 150px;">
190
- <h2 style="color: black;">Website</h2>
191
- <p style="color: black;padding: 0px 27px;text-align: justify;">miniOrange provides easy to use 2 Factor authentication for secure login to your WordPress site</p>
192
- </div>
193
- <div>
194
- <br><br>
195
- <center>
196
- <a class="mo_2fa_ef_read_more" href="https://plugins.miniorange.com/">Read More</a>
197
- </center>
198
- </div>
199
- </div>
200
- <div class="mo_2fa_email_template_details">
201
- <i class="fa fa-headphones" style="font-size:50px;color: black;margin-top: 6%"></i>
202
- <div style="min-height: 150px;">
203
- <h2 style="color: black;">Documentation</h2>
204
- <p style="color: black;padding: 0px 27px;text-align: justify;">miniOrange Two-Factor Authentication in which you have to provide two factors to gain the access</p>
205
- </div>
206
- <div>
207
- <br><br>
208
- <center>
209
- <a class="mo_2fa_ef_read_more" href="https://developers.miniorange.com/docs/security/wordpress/wp-security">Read More</a>
210
- </center>
211
- </div>
212
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  </div>
214
- <div class="mo_2fa_feature_block" style="margin-left: 14%;">
215
- <div class="mo_2fa_email_template_details">
216
- <i class="fa fa-file-text" style="font-size:50px;color: black;margin-top: 6%"></i>
217
- <div style="min-height: 150px;">
218
- <h2 style="color: black;">Support</h2>
219
- <p style="color: black;padding: 0px 27px;text-align: justify;">You are not going to hit a ridiculously long phone menu when you call us or contact us.</p>
220
- </div>
221
- <div>
222
- <br><br>
223
- <center>
224
- <a class="mo_2fa_ef_read_more" href="https://www.miniorange.com/contact">Read More</a>
225
- </center>
226
- </div>
227
- </div>
228
- <div class="mo_2fa_email_template_details">
229
- <i class="fa fa-shield" style="font-size:50px;color: black;margin-top: 6%"></i>
230
- <div style="min-height: 150px;">
231
- <h2 style="color: black;">Security site</h2>
232
- <p style="color: black;padding: 0px 27px;text-align: justify;">miniOrange combines Web Application Firewall (WAF),Malware Scanner,Encrypted Database and File backup</p>
233
- </div>
234
- <div>
235
- <br><br>
236
- <center>
237
- <a class="mo_2fa_ef_read_more" href="https://security.miniorange.com/">Read More</a>
238
- </center>
239
- </div>
240
- </div>
241
- </div>
242
-
243
- <div class="myDiv">
244
- <h2 style="margin-bottom: -36px;"><b>You are welcome to use our New Features</b></h2>.
245
- <h2 style="margin-bottom: -36px;" > Thank you</h2><br>
246
- <p style="margin-top: 26px;">If you need any help we are just a mail away <p> <br>
247
- <p style="margin-top: -47px;"> Contact us at :- <b>info@xecurify.com /2fasupport@xecurify.com<b></p><br>
248
- <p style="margin-top: -10px;"> If you want to disable this notification please turn of the toggle of email from Notification TAB
249
- </p>
250
-
251
- </div>
252
  </div>
253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  </body>
255
- </html>';
 
 
 
 
256
  }
257
  ?>
1
  <?php
2
  function mail_tem()
3
  {
4
+ return '
5
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
7
  <head>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
+ <meta name="x-apple-disable-message-reformatting">
11
+ <!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->
12
+ <title></title>
13
+
14
+ <style type="text/css">
15
+ table, td { color: #000000; } a { color: #0000ee; text-decoration: underline; }
16
+ @media only screen and (min-width: 520px) {
17
+ .u-row {
18
+ width: 500px !important;
19
+ }
20
+ .u-row .u-col {
21
+ vertical-align: top;
22
+ }
23
+
24
+ .u-row .u-col-50 {
25
+ width: 250px !important;
26
+ }
27
+
28
+ .u-row .u-col-100 {
29
+ width: 500px !important;
30
+ }
31
+
32
+ }
33
+
34
+ @media (max-width: 520px) {
35
+ .u-row-container {
36
+ max-width: 100% !important;
37
+ padding-left: 0px !important;
38
+ padding-right: 0px !important;
39
+ }
40
+ .u-row .u-col {
41
+ min-width: 320px !important;
42
+ max-width: 100% !important;
43
+ display: block !important;
44
+ }
45
+ .u-row {
46
+ width: calc(100% - 40px) !important;
47
+ }
48
+ .u-col {
49
+ width: 100% !important;
50
+ }
51
+ .u-col > div {
52
+ margin: 0 auto;
53
+ }
54
+ }
55
+ body {
56
+ margin: 0;
57
+ padding: 0;
58
+ }
59
+
60
+ table,
61
+ tr,
62
+ td {
63
+ vertical-align: top;
64
+ border-collapse: collapse;
65
+ }
66
+
67
+ p {
68
+ margin: 0;
69
+ }
70
+
71
+ .ie-container table,
72
+ .mso-container table {
73
+ table-layout: fixed;
74
+ }
75
+
76
+ * {
77
+ line-height: inherit;
78
+ }
79
+
80
+ a[x-apple-data-detectors=\'true\'] {
81
+ color: inherit !important;
82
+ text-decoration: none !important;
83
+ }
84
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  </style>
86
+
87
+
88
+
89
+ </head>
90
+
91
+ <body class="clean-body u_body" style="margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #e7e7e7;color: #000000">
92
+ <!--[if IE]><div class="ie-container"><![endif]-->
93
+ <!--[if mso]><div class="mso-container"><![endif]-->
94
+ <table style="border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #e7e7e7;width:100%" cellpadding="0" cellspacing="0">
95
+ <tbody>
96
+ <tr style="vertical-align: top">
97
+ <td style="word-break: break-word;border-collapse: collapse !important;vertical-align: top">
98
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #e7e7e7;"><![endif]-->
99
+
100
+
101
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
102
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">
103
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
104
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->
105
+
106
+ <!--[if (mso)|(IE)]><td align="center" width="500" style="background-color: #20b2aa;width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;" valign="top"><![endif]-->
107
+ <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
108
+ <div style="background-color: #20b2aa;width: 100% !important;">
109
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;"><!--<![endif]-->
110
+
111
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
112
+ <tbody>
113
+ <tr>
114
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
115
+
116
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
117
+ <tr>
118
+ <td style="padding-right: 0px;padding-left: 0px;" align="center">
119
+
120
+ <img align="center" border="0" src="https://s3.amazonaws.com/Snowcovered_C_Images/40290_shield.png" alt="" title="" style="outline: none;text-decoration: none;-ms-interpolation-mode: bicubic;clear: both;display: inline-block !important;border: none;height: auto;float: none;width: 34%;max-width: 163.2px;" width="163.2"/>
121
+
122
+ </td>
123
+ </tr>
124
+ </table>
125
+
126
+ </td>
127
+ </tr>
128
+ </tbody>
129
+ </table>
130
+
131
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
132
+ <tbody>
133
+ <tr>
134
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
135
+
136
+ <h1 style="margin: 0px; color: #ffffff; line-height: 140%; text-align: center; word-wrap: break-word; font-weight: normal; font-family: arial,helvetica,sans-serif; font-size: 21px;">
137
+ miniOrange 2FA Plugin List of Latest Features
138
+ </h1>
139
+
140
+ </td>
141
+ </tr>
142
+ </tbody>
143
+ </table>
144
+
145
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
146
+ </div>
147
+ </div>
148
+ <!--[if (mso)|(IE)]></td><![endif]-->
149
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
150
+ </div>
151
+ </div>
152
+ </div>
153
+
154
+
155
+
156
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
157
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
158
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
159
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
160
+
161
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
162
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
163
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
164
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
165
+
166
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
167
+ <tbody>
168
+ <tr>
169
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
170
+
171
+ <div>
172
+ <div class="mo_2fa_email_feature_details" style="background-color: white;text-align: center;min-height: 160px;color: black;font-family: inherit;border-radius: 15px;border: 1px solid #20b2aa;font-size: 12px;">
173
+ <h2>Backup Codes</h2>
174
+ <ul class="mo_2fa_feature_backup_codes" style="text-align: left;padding-left: 15%;margin-top: 1%;padding-right: 7%;">
175
+ <li> Helps you to come out from locked out situation </li>
176
+ <li> Provide five backup codes </li>
177
+ <li> All are one time usable </li>
178
+ </ul>
179
+ </div>
180
+ </div>
181
+
182
+ </td>
183
+ </tr>
184
+ </tbody>
185
+ </table>
186
+
187
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
188
+ </div>
189
+ </div>
190
+ <!--[if (mso)|(IE)]></td><![endif]-->
191
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
192
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
193
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
194
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
195
+
196
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
197
+ <tbody>
198
+ <tr>
199
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
200
+
201
+ <div>
202
+ <div class="mo_2fa_email_feature_details" style="background-color: white;text-align: center;min-height: 160px;color: black;font-family: inherit;border-radius: 15px;border: 1px solid #20b2aa;font-size: 12px;">
203
+ <h2 class="mo_2fa_email_feature_title" style="margin-top: 2%;text-align: center;padding: 0% 2%;">Microsoft Authenticator</h2>
204
+ <ul class="mo_2fa_feature_MA" style="text-align: left;margin-top: -4%;padding-left: 15%;padding-right: 7%;">
205
+ <li>Generates the OTP on every login</li>
206
+ <li>Provides multifactor authentication with extra layer</li>
207
+ <li> Very easy to use and secure access</li>
208
  </ul>
209
+ </div>
210
+ </div>
211
+
212
+ </td>
213
+ </tr>
214
+ </tbody>
215
+ </table>
216
+
217
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
218
+ </div>
219
+ </div>
220
+ <!--[if (mso)|(IE)]></td><![endif]-->
221
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
222
+ </div>
223
+ </div>
224
+ </div>
225
+
226
+
227
+
228
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
229
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
230
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
231
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
232
+
233
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
234
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
235
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
236
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
237
+
238
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
239
+ <tbody>
240
+ <tr>
241
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
242
+
243
+ <div>
244
+ <div class="mo_2fa_email_feature_details" style="background-color: white;text-align: center;min-height: 160px;color: black;font-family: inherit;border-radius: 15px;border: 1px solid #20b2aa;font-size: 12px;">
245
+ <h2 class="mo_2fa_email_feature_title" style="margin-top: 10%;text-align: center;padding: 0% 2%;">Email Notification</h2>
246
+ <ul class="mo_2fa_feature_EN" style="text-align: left;padding-left: 15%;margin-top: -4%;padding-right: 7%;">
247
+ <li>Gives you important alerts via email</li>
248
+ <li>Very helpful for the user to know about account acitivities</li>
249
+
250
  </ul>
251
+ </div>
252
+ </div>
253
+
254
+ </td>
255
+ </tr>
256
+ </tbody>
257
+ </table>
258
+
259
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
260
+ </div>
261
+ </div>
262
+ <!--[if (mso)|(IE)]></td><![endif]-->
263
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
264
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
265
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
266
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
267
+
268
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
269
+ <tbody>
270
+ <tr>
271
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
272
+
273
+ <div>
274
+ <div class="mo_2fa_email_feature_details" style="background-color: white;text-align: center;min-height: 160px;color: black;font-family: inherit;border-radius: 15px;border: 1px solid #20b2aa;font-size: 12px;">
275
+ <h2>MFA</h2>
276
+ <ul class="mo_2fa_feature_MFA" style="text-align: left;padding-left: 15%;padding-right: 7%;">
277
+ <li>Login with any of the configured methods: <br>Authenticator Apps, OTP over Email and SMS, KBA, etc. </li>
278
+
279
  </ul>
280
+ </div>
281
+ </div>
282
+
283
+ </td>
284
+ </tr>
285
+ </tbody>
286
+ </table>
287
+
288
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
289
+ </div>
290
+ </div>
291
+ <!--[if (mso)|(IE)]></td><![endif]-->
292
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
293
+ </div>
294
+ </div>
295
+ </div>
296
+
297
+
298
+
299
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
300
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
301
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
302
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
303
+
304
+ <!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
305
+ <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
306
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
307
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
308
+
309
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
310
+ <tbody>
311
+ <tr>
312
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
313
+
314
+ <div align="center">
315
+ <!--[if mso]><table width="100%" cellpadding="0" cellspacing="0" border="0" style="border-spacing: 0; border-collapse: collapse; mso-table-lspace:0pt; mso-table-rspace:0pt;font-family:arial,helvetica,sans-serif;"><tr><td style="font-family:arial,helvetica,sans-serif;" align="center"><v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="https://plugins.miniorange.com/2-factor-authentication-for-wordpress" style="height:37px; v-text-anchor:middle; width:168px;" arcsize="11%" stroke="f" fillcolor="#20b2aa"><w:anchorlock/><center style="color:#ffffff;font-family:arial,helvetica,sans-serif;"><![endif]-->
316
+ <a href="https://plugins.miniorange.com/2-factor-authentication-for-wordpress" target="_blank" style="box-sizing: border-box;display: inline-block;font-family:arial,helvetica,sans-serif;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #ffffff; background-color: #20b2aa; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;">
317
+ <span style="display:block;padding:10px 20px;line-height:120%;">More Feature details</span>
318
+ </a>
319
+ <!--[if mso]></center></v:roundrect></td></tr></table><![endif]-->
320
+ </div>
321
+
322
+ </td>
323
+ </tr>
324
+ </tbody>
325
+ </table>
326
+
327
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
328
+ </div>
329
+ </div>
330
+ <!--[if (mso)|(IE)]></td><![endif]-->
331
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
332
+ </div>
333
+ </div>
334
+ </div>
335
+
336
+
337
+
338
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
339
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
340
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
341
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
342
+
343
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
344
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
345
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
346
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
347
+
348
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
349
+ <tbody>
350
+ <tr>
351
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px 10px 10px 26px;font-family:arial,helvetica,sans-serif;" align="left">
352
+
353
+ <div>
354
+ <div class="mo_2fa_email_template_details" style="background-color: white;border-top: 5px solid #20b2aa;min-height: 250px;text-align: center;overflow: hidden;font-size: 15px;">
355
+ <i class="fa fa-globe mo_2fa_email_icon" style="display: inline-block;font: normal normal normal 14px/1 FontAwesome;font-size: 50px;text-rendering: auto;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: black;margin-top: 6%;"></i>
356
+ <div style="min-height: 150px;">
357
+ <h2 style="color: black;margin: 2%;">Website</h2>
358
+ <p class="mo_2fa_feature_text" style="color: black;padding: 0px 27px;text-align: center;">miniOrange provides easy to use 2 Factor authentication for secure login to your WordPress site
359
+ <br><a class="mo_2fa_ef_read_more" href="https://plugins.miniorange.com/" style="color: black;">...Know More</a></p>
360
+ </div>
361
+ </div>
362
+ </div>
363
+
364
+ </td>
365
+ </tr>
366
+ </tbody>
367
+ </table>
368
+
369
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
370
+ </div>
371
+ </div>
372
+ <!--[if (mso)|(IE)]></td><![endif]-->
373
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
374
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
375
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
376
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
377
+
378
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
379
+ <tbody>
380
+ <tr>
381
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px 26px 10px 10px;font-family:arial,helvetica,sans-serif;" align="left">
382
+
383
+ <div>
384
+ <div class="mo_2fa_email_template_details" style="background-color: white;border-top: 5px solid #20b2aa;min-height: 250px;text-align: center;overflow: hidden;font-size: 15px;">
385
+ <i class="fa fa-headphones mo_2fa_email_icon" style="display: inline-block;font: normal normal normal 14px/1 FontAwesome;font-size: 50px;text-rendering: auto;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: black;margin-top: 6%;"></i>
386
+ <div style="min-height: 150px;">
387
+ <h2 style="color: black;margin: 2%;">Documentation</h2>
388
+ <p class="mo_2fa_feature_text" style="color: black;padding: 0px 27px;text-align: center;">miniOrange Two-Factor Authentication in which you have to provide two factors to gain the access <br>
389
+ <br><a class="mo_2fa_ef_read_more" href="https://developers.miniorange.com/docs/security/wordpress/wp-security" style="color: black;">...Know More</a></p>
390
+ </div>
391
+ </div>
392
+ </div>
393
+
394
+ </td>
395
+ </tr>
396
+ </tbody>
397
+ </table>
398
+
399
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
400
+ </div>
401
  </div>
402
+ <!--[if (mso)|(IE)]></td><![endif]-->
403
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
404
+ </div>
405
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
406
  </div>
407
 
408
+
409
+
410
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
411
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
412
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
413
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
414
+
415
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
416
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
417
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
418
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
419
+
420
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
421
+ <tbody>
422
+ <tr>
423
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px 10px 10px 26px;font-family:arial,helvetica,sans-serif;" align="left">
424
+
425
+ <div>
426
+ <div class="mo_2fa_email_template_details" style="background-color: white;border-top: 5px solid #20b2aa;min-height: 250px;text-align: center;overflow: hidden;font-size: 15px;">
427
+ <i class="fa fa-file-text mo_2fa_email_icon" style="display: inline-block;font: normal normal normal 14px/1 FontAwesome;font-size: 50px;text-rendering: auto;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: black;margin-top: 6%;"></i>
428
+ <div style="min-height: 120px;">
429
+ <h2 style="color: black;margin: 2%;">Support</h2>
430
+ <p class="mo_2fa_feature_text" style="color: black;padding: 0px 27px;text-align: center;">You are not going to hit a ridiculously long phone menu when you call us or contact us.<br>
431
+ <br><a class="mo_2fa_ef_read_more" href="https://www.miniorange.com/contact" style="color: black;">...Know More</a></p>
432
+ </div>
433
+ </div>
434
+ </div>
435
+
436
+ </td>
437
+ </tr>
438
+ </tbody>
439
+ </table>
440
+
441
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
442
+ </div>
443
+ </div>
444
+ <!--[if (mso)|(IE)]></td><![endif]-->
445
+ <!--[if (mso)|(IE)]><td align="center" width="250" style="width: 250px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
446
+ <div class="u-col u-col-50" style="max-width: 320px;min-width: 250px;display: table-cell;vertical-align: top;">
447
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
448
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
449
+
450
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
451
+ <tbody>
452
+ <tr>
453
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px 26px 10px 10px;font-family:arial,helvetica,sans-serif;" align="left">
454
+
455
+ <div>
456
+ <div class="mo_2fa_email_template_details" style="background-color: white;border-top: 5px solid #20b2aa;min-height: 250px;text-align: center;overflow: hidden;font-size: 15px;">
457
+ <i class="fa fa-shield mo_2fa_email_icon" style="display: inline-block;font: normal normal normal 14px/1 FontAwesome;font-size: 50px;text-rendering: auto;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;color: black;margin-top: 6%;"></i>
458
+ <div style="min-height: 110px;">
459
+ <h2 style="color: black;margin: 2%;">Security site</h2>
460
+ <p class="mo_2fa_feature_text" style="color: black;padding: 0px 27px;text-align: center;">miniOrange combines Web Application Firewall (WAF), Malware Scanner, Encrypted Database and File backup<br>
461
+ <a class="mo_2fa_ef_read_more" href="https://security.miniorange.com/" style="color: black;">...Know More</a></p>
462
+ </div>
463
+ </div>
464
+ </div>
465
+
466
+ </td>
467
+ </tr>
468
+ </tbody>
469
+ </table>
470
+
471
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
472
+ </div>
473
+ </div>
474
+ <!--[if (mso)|(IE)]></td><![endif]-->
475
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
476
+ </div>
477
+ </div>
478
+ </div>
479
+
480
+
481
+
482
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
483
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #20b2aa;">
484
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
485
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #20b2aa;"><![endif]-->
486
+
487
+ <!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
488
+ <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
489
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
490
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
491
+
492
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
493
+ <tbody>
494
+ <tr>
495
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
496
+
497
+ <div style="line-height: 140%; text-align: center; word-wrap: break-word;">
498
+ <p style="font-size: 14px; line-height: 140%;"><span style="color: #ffffff; font-size: 14px; line-height: 19.6px;">You are welcome to use our New Features</span></p>
499
+ <p style="font-size: 14px; line-height: 140%;">&nbsp;</p>
500
+ <p style="font-size: 14px; line-height: 140%;"><span style="color: #ffffff; font-size: 14px; line-height: 19.6px;">If you need any help we are just a mail away</span></p>
501
+ </div>
502
+
503
+ </td>
504
+ </tr>
505
+ </tbody>
506
+ </table>
507
+
508
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
509
+ </div>
510
+ </div>
511
+ <!--[if (mso)|(IE)]></td><![endif]-->
512
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
513
+ </div>
514
+ </div>
515
+ </div>
516
+
517
+
518
+
519
+ <div class="u-row-container" style="padding: 0px;background-color: #ffffff">
520
+ <div class="u-row" style="Margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: #f5f3f3;">
521
+ <div style="border-collapse: collapse;display: table;width: 100%;background-color: transparent;">
522
+ <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: #ffffff;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: #f5f3f3;"><![endif]-->
523
+
524
+ <!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;" valign="top"><![endif]-->
525
+ <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">
526
+ <div style="width: 100% !important;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;">
527
+ <!--[if (!mso)&(!IE)]><!--><div style="padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;border-radius: 0px;-webkit-border-radius: 0px; -moz-border-radius: 0px;"><!--<![endif]-->
528
+
529
+ <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
530
+ <tbody>
531
+ <tr>
532
+ <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">
533
+
534
+ <div style="line-height: 140%; text-align: center; word-wrap: break-word;">
535
+ <p style="font-size: 14px; line-height: 140%;">Contact us at :-&nbsp; <strong>info@xecurify.com / 2fasupport@xecurify.com</strong></p>
536
+ </div>
537
+
538
+ </td>
539
+ </tr>
540
+ </tbody>
541
+ </table>
542
+
543
+ <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->
544
+ </div>
545
+ </div>
546
+ <!--[if (mso)|(IE)]></td><![endif]-->
547
+ <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->
548
+ </div>
549
+ </div>
550
+ </div>
551
+
552
+
553
+ <!--[if (mso)|(IE)]></td></tr></table><![endif]-->
554
+ </td>
555
+ </tr>
556
+ </tbody>
557
+ </table>
558
+ <!--[if mso]></div><![endif]-->
559
+ <!--[if IE]></div><![endif]-->
560
  </body>
561
+
562
+ </html>
563
+
564
+
565
+ ';
566
  }
567
  ?>
includes/images/2fa-on-login-page.png ADDED
Binary file
includes/images/authmethods/miniOrangeAuthenticator.png ADDED
Binary file
includes/images/firebase.png ADDED
Binary file
includes/images/{hide_login_form.png → hide_login_form.PNG} RENAMED
File without changes
includes/images/{login-with-password-and-2fa.png → login-with-password-and-2fa.PNG} RENAMED
File without changes
includes/js/login_with_ajax.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(window).bind('load', function()
2
+
3
+ {
4
+ var list, index;
5
+ jQuery('form[class="lwa-form"]').prepend( "<div id='mo2f_msg'></div>" );
6
+
7
+ login = document.getElementById("lwa_wp-submit");
8
+ if(login===null)
9
+ return;
10
+ password = document.getElementsByName('pwd')[0];
11
+ mo2f_name = document.getElementsByName('log')[0];
12
+ login.setAttribute('type', 'button');
13
+ login.setAttribute('id','mo2f_lwa_login');
14
+ password.setAttribute('id','mo2f_lwa_user_pass');
15
+ mo2f_name.setAttribute('id','mo2f_lwa_user_name');
16
+ password.setAttribute('name','mo2f_lwa_user_pass');
17
+ mo2f_name.setAttribute('name','mo2f_lwa_user_name');
18
+
19
+ jQuery('#mo2f_lwa_login').click(function(){
20
+ mo2f_lwa_login();
21
+ })
22
+
23
+ jQuery('#mo2f_lwa_user_pass').keypress(function (e) {
24
+ if (e.which == 13) {//Enter key pressed
25
+ e.preventDefault();
26
+ mo2f_lwa_login();
27
+ }
28
+ });
29
+
30
+ jQuery('#mo2f_2fa_code').keypress(function (e) {
31
+ if (e.which == 13) {//Enter key pressed
32
+ e.preventDefault();
33
+ mo2f_lwa_login();
34
+ }
35
+ });
36
+
37
+ function mo2f_lwa_login()
38
+ {
39
+ var data;
40
+ jQuery("#mo2f_msg").empty();
41
+ data = {
42
+ 'action' : 'mo_two_factor_ajax',
43
+ 'mo_2f_two_factor_ajax' : 'mo2f_ajax_login_redirect',
44
+ 'username' : jQuery('#mo2f_lwa_user_name').val(),
45
+ 'nonce' : jQuery("input[name=miniorange_login_nonce]").val(),
46
+ 'password' : jQuery('#mo2f_lwa_user_pass').val(),
47
+ 'mo_softtoken' : jQuery('#mo2f_2fa_code').val(),
48
+ };
49
+ jQuery.post(my_ajax_object.ajax_url, data, function(response) {
50
+ if ( typeof response.data === "undefined") {
51
+
52
+ jQuery("html").html(response);
53
+ }
54
+ else if ( response.data.notice ) {
55
+ jQuery("#mo2f_msg").empty();
56
+ jQuery("#mo2f_msg").append( response.data.notice ).fadeIn();
57
+ }
58
+ else if(response.data.reload)
59
+ location.reload( true );
60
+ else
61
+ location.href = response.data.redirect;
62
+ });
63
+ jQuery('#mo2f_select_2fa_methods_form').submit();
64
+ }
65
+ });
includes/js/mo2fa_elementor.js ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(window).bind('load', function()
2
+ {
3
+ mo2fa_has_elementor_class = jQuery('.htmega-login-form-wrapper');
4
+
5
+ if(mo2fa_has_elementor_class.length){
6
+
7
+ var mo2fa_input = document.getElementsByTagName('input');
8
+ var mo2fa_on_submit = mo2fa_input[3].getAttribute('id');
9
+ mo2fa_on_submit = '#' +mo2fa_on_submit;
10
+
11
+ var mo2fa_form_id = jQuery('form').attr('id');
12
+ mo2fa_form_id = '#'+mo2fa_form_id ;
13
+ jQuery(mo2fa_form_id).removeAttr('action');
14
+ var mo2fa_log_user = document.getElementsByName('login_username');
15
+ var mo2fa_log_pass = document.getElementsByName('login_password');
16
+ mo2fa_log_user[0].setAttribute("name","mo2fa_user_name");
17
+ mo2fa_log_pass[0].setAttribute("name","mo2fa_user_password");
18
+
19
+ var mo2fa_pwd = document.getElementsByName("mo2fa_user_password");
20
+ mo2fa_pwd = mo2fa_pwd[0];
21
+ var mo2fa_pwd = document.getElementById(mo2fa_pwd.id);
22
+ mo2fa_pwd.setAttribute("id","mo2fa_user_password");
23
+
24
+ var mo2fa_user = document.getElementsByName("mo2fa_user_name");
25
+ mo2fa_user = mo2fa_user[0];
26
+ var element = document.getElementById(mo2fa_user.id);
27
+ element.setAttribute("id","mo2fa_user_name");
28
+
29
+ if(my_ajax_object.mo2f_login_option == '0'){
30
+
31
+ jQuery(mo2fa_form_id).after('<form name="f" id="mo2f_show_loginform" method="post" action="" hidden>'+
32
+ '<input type="text" name="mo2fa_username" id="mo2fa_username" hidden/>'+
33
+ '<input type="hidden" name="miniorange_login_nonce" value="'+my_ajax_object.nonce+'"/>'+'</form>'+
34
+ '<form name="f" id="mo2f_loginform" method="post" action="" hidden>'+
35
+ '<input type="text" name="mo2fa_elementor_user_name" id="mo2fa_elementor_user_name" hidden/>'+
36
+ '<input type="text" name="mo2fa_elementor_user_password" id="mo2fa_elementor_user_password" hidden/>'+
37
+ '<input type="hidden" name="miniorange_elementor_login_nonce" value="'+my_ajax_object.nonce+'"/>'+'</form>');
38
+
39
+ if(my_ajax_object.mo2f_enable_login_with_2nd_factor == '0'){
40
+ jQuery(mo2fa_pwd).after('<h2 style="text-align: center;">or</h2><input type="text" name="mo2fa_usernamekey" id="mo2fa_usernamekey" autofocus="true" placeholder="Username"/>'+
41
+ '<button style="padding:1px 4px 1px 4px; width:100%" name="miniorange_login_submit" id="miniorange_login_submit">Login with 2nd factor </button>');
42
+ }else{
43
+ jQuery("label[for='Password']").hide();
44
+ jQuery("#mo2fa_user_password").hide();
45
+ mo2fa_user = document.getElementsByName("mo2fa_user_name");
46
+ mo2fa_user[0].setAttribute("name","mo2fa_usernamekey");
47
+ mo2fa_log_user = document.getElementsByName("mo2fa_usernamekey");
48
+ mo2fa_log_user[0].setAttribute("id","mo2fa_usernamekey");
49
+ }
50
+ }
51
+ else{
52
+ jQuery(mo2fa_form_id).after('<form name="f" id="mo2f_loginform" method="post" action="" hidden>'+
53
+ '<input type="text" name="mo2fa_elementor_user_name" id="mo2fa_elementor_user_name" hidden/>'+
54
+ '<input type="text" name="mo2fa_elementor_user_password" id="mo2fa_elementor_user_password" hidden/>'+
55
+ '<input type="hidden" name="miniorange_elementor_login_nonce" value="'+my_ajax_object.nonce+'"/>'+'</form>');
56
+ }
57
+
58
+ jQuery('#mo2fa_user_password').keypress(function (e) {
59
+ if (e.which == 13) {//Enter key pressed
60
+ e.preventDefault();
61
+ mo2fa_elementor();
62
+ }
63
+ });
64
+ jQuery(mo2fa_on_submit).click(function(e){
65
+ if (e.which == 1) {//Enter key pressed
66
+ e.preventDefault();
67
+ mo2fa_elementor();
68
+ }
69
+ });
70
+ jQuery('#mo2fa_user_name').keypress(function (e){
71
+ if (e.which == 13) {//Enter key pressed
72
+ e.preventDefault();
73
+ mo2fa_elementor();
74
+ }
75
+ });
76
+ jQuery('#mo2fa_usernamekey').keypress(function (e) {
77
+ if (e.which == 13) {//Enter key pressed
78
+ e.preventDefault();
79
+ var username = jQuery('#mo2fa_usernamekey').val();
80
+ document.getElementById("mo2f_show_loginform").elements[0].value = username;
81
+ jQuery('#mo2f_show_loginform').submit();
82
+ }
83
+
84
+ });
85
+ jQuery('.htmega-login-form-wrapper' ).on( 'submit', mo2fa_form_id, function(e) {
86
+ e.preventDefault();
87
+ mo2f_login();
88
+
89
+ });
90
+ function mo2fa_elementor(){
91
+ if(my_ajax_object.mo2f_login_option == '1' || (my_ajax_object.mo2f_login_option == '0' && my_ajax_object.mo2f_enable_login_with_2nd_factor == '0' )){
92
+ mo2f_login();
93
+ }
94
+ else{
95
+ var username = jQuery('#mo2fa_usernamekey').val();
96
+ document.getElementById("mo2f_show_loginform").elements[0].value = username;
97
+ jQuery('#mo2f_show_loginform').submit();
98
+ }
99
+ }
100
+
101
+ jQuery('#miniorange_login_submit').click(function(e){
102
+ e.preventDefault();
103
+ var username = jQuery('#mo2fa_usernamekey').val();
104
+
105
+ document.getElementById("mo2f_show_loginform").elements[0].value = username;
106
+
107
+ jQuery('#mo2f_show_loginform').submit();
108
+ });
109
+
110
+ function mo2f_login(){
111
+ var username = jQuery('#mo2fa_user_name').val();
112
+ var password = jQuery('#mo2fa_user_password').val();
113
+
114
+ document.getElementById("mo2f_loginform").elements[0].value = username;
115
+ document.getElementById("mo2f_loginform").elements[1].value = password;
116
+
117
+ jQuery('#mo2f_loginform').submit();
118
+ }
119
+
120
+ }
121
+
122
+ });
includes/js/pointers.js CHANGED
@@ -399,13 +399,13 @@
399
  jQuery(data.anchor_id).css('position','');
400
  switch(data.anchor_id){
401
  case '#scan_status_table':
402
- document.getElementById("scan_set").click();
403
  break;
404
  case '#mo2f_select_scanning_files':
405
- document.getElementById("report_scan").click();
406
  break;
407
  case '#scan_report_table':
408
- document.getElementById("malware_view").click();
409
  break;
410
  case '#mo2f_scan_dash':
411
  jQuery('#mo_2fa_upgrade_tour').css('z-index',1);
399
  jQuery(data.anchor_id).css('position','');
400
  switch(data.anchor_id){
401
  case '#scan_status_table':
402
+ document.getElementById("mo2f_scan_set").click();
403
  break;
404
  case '#mo2f_select_scanning_files':
405
+ document.getElementById("mo2f_report_scan").click();
406
  break;
407
  case '#scan_report_table':
408
+ document.getElementById("mo2f_malware_view").click();
409
  break;
410
  case '#mo2f_scan_dash':
411
  jQuery('#mo_2fa_upgrade_tour').css('z-index',1);
includes/js/settings_page.js CHANGED
@@ -100,7 +100,8 @@ jQuery(document).ready(function () {
100
  $(".new_plugin_dismiss").click(function(){
101
  ajaxCall("dismissplugin",".plugin_warning_hide-notice",true);
102
  });
103
-
 
104
 
105
  $(".dismiss_website_backup_notice").click(function(){
106
  ajaxCall("dismissbackup",".plugin_warning_hide-notice",true);
@@ -122,6 +123,10 @@ jQuery(document).ready(function () {
122
  ajaxCall("plugin_warning_never_show_again",".plugin_warning_hide-notice",true);
123
  });
124
 
 
 
 
 
125
  $(".wpns_premium_option :input").attr("disabled",true);
126
 
127
  $("#setuptwofa_redirect").click(function(e){
@@ -160,6 +165,34 @@ window.onload = nav_popup();
160
  }
161
 
162
  function nav_popup() {
163
- document.getElementById("notice_div").style.width = "40%";
164
- setTimeout(function(){ jQuery('#notice_div').fadeOut('slow'); }, 3000);
165
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  $(".new_plugin_dismiss").click(function(){
101
  ajaxCall("dismissplugin",".plugin_warning_hide-notice",true);
102
  });
103
+
104
+
105
 
106
  $(".dismiss_website_backup_notice").click(function(){
107
  ajaxCall("dismissbackup",".plugin_warning_hide-notice",true);
123
  ajaxCall("plugin_warning_never_show_again",".plugin_warning_hide-notice",true);
124
  });
125
 
126
+ $(".mo2f_banner_never_show_again").click(function(){
127
+ ajaxCall("mo2f_banner_never_show_again",".mo2f_offer_main_div",true);
128
+ });
129
+
130
  $(".wpns_premium_option :input").attr("disabled",true);
131
 
132
  $("#setuptwofa_redirect").click(function(e){
165
  }
166
 
167
  function nav_popup() {
168
+ if(document.getElementById("notice_div") !== null){
169
+ document.getElementById("notice_div").style.width = "40%";
170
+ setTimeout(function(){ jQuery('#notice_div').fadeOut('slow'); }, 3000);
171
+ }
172
+ }
173
+
174
+ // OFFER TIMER
175
+ var countDownDate = new Date("Jan 15, 2022 23:59:59").getTime();
176
+
177
+ var x = setInterval(function() {
178
+
179
+ var now = new Date().getTime();
180
+ var distance = countDownDate - now;
181
+
182
+ var days = Math.floor(distance / (1000 * 60 * 60 * 24));
183
+ var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
184
+ var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
185
+ var seconds = Math.floor((distance % (1000 * 60)) / 1000);
186
+ if(document.getElementById("mo2f_offer_timer")!= null){
187
+ document.getElementById("mo2f_offer_timer").innerHTML = days + "d " + hours + "h "
188
+ + minutes + "m " + seconds + "s ";
189
+ }
190
+
191
+ if (distance < 0) {
192
+ clearInterval(x);
193
+ if(document.getElementById("mo2f_offer_timer")!= null){
194
+ document.getElementById("mo2f_offer_timer").innerHTML = "EXPIRED";
195
+ }
196
+ }
197
+ }, 1000);
198
+ // -----OFFER TIMER
includes/js/setup-wizard-2fa.js ADDED
@@ -0,0 +1,6572 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(t) {
2
+
3
+ for (var s, o, r = e[0], l = e[1], c = e[2], m = 0, u = []; m < r.length; m++) o = r[m], Object.prototype.hasOwnProperty.call(a, o) && a[o] && u.push(a[o][0]), a[o] = 0;
4
+ for (s in l) Object.prototype.hasOwnProperty.call(l, s) && (t[s] = l[s]);
5
+ p && p(e);
6
+ while (u.length) u.shift()();
7
+ return n.push.apply(n, c || []), i()
8
+ }
9
+
10
+ function i() {
11
+ for (var t, e = 0; e < n.length; e++) {
12
+ for (var i = n[e], s = !0, r = 1; r < i.length; r++) {
13
+ var l = i[r];
14
+ 0 !== a[l] && (s = !1)
15
+ }
16
+ s && (n.splice(e--, 1), t = o(o.s = i[0]))
17
+ }
18
+ return t
19
+ }
20
+ var s = {},
21
+ a = {
22
+ wizard: 0
23
+ },
24
+ n = [];
25
+
26
+ function o(e) {
27
+ if (s[e]) return s[e].exports;
28
+ var i = s[e] = {
29
+ i: e,
30
+ l: !1,
31
+ exports: {}
32
+ };
33
+ return t[e].call(i.exports, i, i.exports, o), i.l = !0, i.exports
34
+ }
35
+ o.m = t, o.c = s, o.d = function(t, e, i) {
36
+ o.o(t, e) || Object.defineProperty(t, e, {
37
+ enumerable: !0,
38
+ get: i
39
+ })
40
+ }, o.r = function(t) {
41
+ "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {
42
+ value: "Module"
43
+ }), Object.defineProperty(t, "__esModule", {
44
+ value: !0
45
+ })
46
+ }, o.t = function(t, e) {
47
+ if (1 & e && (t = o(t)), 8 & e) return t;
48
+ if (4 & e && "object" === typeof t && t && t.__esModule) return t;
49
+ var i = Object.create(null);
50
+ if (o.r(i), Object.defineProperty(i, "default", {
51
+ enumerable: !0,
52
+ value: t
53
+ }), 2 & e && "string" != typeof t)
54
+ for (var s in t) o.d(i, s, function(e) {
55
+ return t[e]
56
+ }.bind(null, s));
57
+ return i
58
+ }, o.n = function(t) {
59
+ var e = t && t.__esModule ? function() {
60
+ return t["default"]
61
+ } : function() {
62
+ return t
63
+ };
64
+ return o.d(e, "a", e), e
65
+ }, o.o = function(t, e) {
66
+ return Object.prototype.hasOwnProperty.call(t, e)
67
+ }, o.p = "http://localhost:8080/";
68
+ var r = window["mo2fjsonp"] = window["mo2fjsonp"] || [],
69
+ l = r.push.bind(r);
70
+ r.push = e, r = r.slice();
71
+ for (var c = 0; c < r.length; c++) e(r[c]);
72
+ var p = l;
73
+ n.push([0, "chunk-vendors"]), i()
74
+ })({
75
+ 0: function(t, e, i) {
76
+ t.exports = i("9f7c")
77
+ },
78
+ "107e": function(t, e, i) {
79
+ t.exports = i.p + "img/long-arrow-alt-right-regular.svg"
80
+ },
81
+ 1532: function(t, e) {
82
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAAHYklEQVR4AeVbeVBVVRj/7n1sIqsICIKhIAIKkjCJmgJlKiYuTU4wWZqWMzWauYzmMsVUmk0Gf5SmGU1qizMq2mSbo40RmMjmioiC+JQdHijw4PGW2/kecxF9PO7yFq68M3Pn3nfOd77z/X733HPO953zKDCSgr+YEUjTtJeR4icqW6vTKCvO55TDEdA+bjj1SMbKGPuQcLfVNMWsAqBGP1L2pP9gQKGj4AAoNZ/e2vJvAwunh4CQHdO9KWe7X0nGZLZwcN6ZWo0OkivWnS1AfLQe5GKQUc6yrMEPHtFSI2QU9du4L6f54y89AcHT4pdTQD2LGbaQKAp8GK39Z4hV/wmEZiTkA0XF2gL4hxgZdVcL+FBBaQlO9u5UO2Gl+3N4KDH4nyiYSctcdd42CZ68XtL9XWgtTcsG/6s2jtCs3Z4MpDDaMxBGuo0w3qLESuxMscfJzhEifcfBJL8JEOM/AaL9xoO7kyvoGB2k52bC/sKfTVFvlbqCCPAa4kGARsIkAhavCO+xYC8zVEFTNLw7ZRlklfwBTR0tVgEithFD641oWhmbCmunrgAExyc5yOwhJXI+7L5wkI/4gMnwQuPqMBTWTFnOGzyLJiUqGexp3hyz1ax650WAm6ML2ImYLHyGesHskBlWBSS0MV4EqLRdQvX2yL8W/VLPsxQfeBHQ3qUUbXu0X4R+phCtwMIVeRHQoVGBSmNCL5i4yMIwxKvnRQCqr2vriSEIbi0pNBFwCpVi4k1A1YM60fazU6JoBRasyJuAima5SWbglCjjuYYwqSGBlXkTUNZ4W6DqR8VxSkQ/QWqJNwFX68tMsr2urRHk96tN0mGJyrwJuN5wE9q7OkTZIG+phjeOb4AurVpUfUtW4k2Alnh4hdWXBdtyTl4ELx9+G8oVcsF1rVGBNwFoTHZlviCbDhYfgzdPbIT7qlZB9awpLIiA0+U5wDAMp33Y1bee3gXbs3cD9hwpJ0EE1LTVQ3HNNU48W09/Dkev/c4pJwUBQQSgwcdL/uK0OyEojlNGKgKCCThZ9je0qdr7tT8pNAHCvUP6lZFKoWAClOoOOMLRvTFqtC1+tVQw9muHYAJQ24Hio5xzeuzISFg8fm6/jUuhUBQBNcQz5DPIvT/jHQh085MCTqM2iCIAte3JO8S5MnRxcIaMuR8AeoNSTaIJaFAq4OsLhzhx4b7Bx8+v45QbKAHRBKDB35Ox4FZTJaftC8Nnw+rJSznlBkLAJALUOg1sIYsejc7g6I0BllVxS+GtmFSDfL4ZjjIHvqKC5GQec4I8yImJ9wTV6iWMbi4GOp4JiO6V2/fj1FEx+m2z/Cr+TpWzvRPsSf4Eds7aBElj48neBAW3FHcAyTc1EVWHTSYAjSiovgKxZMsswJ17xI8LfBowOJJzJ19PBheI9KRt8NyYqXqxYc4eEB80GZZELYThzsMA3WxTHC2zEcAAA/9U5pE3lAC4icKVJviGAhKRI88nM4nxkDuOG6lRCwzUOdg5kI3YCHh14kKI8g2Dls4HooItZiMALewkofNceQHMD5sJjsRAruTn6gOLImZDLVlTlDUZhttmBU+HDxPXkJM7+lM8farDsiDPAFgQ9gK8SCLPKCrk8yDy5vkEWOsUHfehqPoqzCXG9LVrzMqxd9xex62zKDJVXqkrJW+yO24wbvgY2Ldgh6D1g+cQ957PQ0sGZT5eq9kJQGDVrd0u8xwyYPEhAevgW3wlMhl8hw4HXF98Ne8j8HL2xCLBCT+PaU/Fkk/yPNS3N/VbHwkwaRo0pj3v3kVY+ctmaFW1GRMxyMfVYmrUfMhK3QsBZjhhMsLF26CNvjIsQgA2dKHqEiw5uhZqSI8YiHSp9jqvZi1GALZe2liuD4gWVl3hZYy5hKoe1HJ2f7YtixKAjTQqm+H1rHWwv+Awr3mfNcyUe1E1d9iO1W9xArAhXCrvyv0Glh5bD3etsDlSSBZmfJNVCGCNwXFh3g8rYF/+T9BlwnY7q8/YvajmqrEig3yrEoCt44Ip/dy3kHRoGZy8ccbsn0UriVfe5OGhskxYnQC24XtkoFr/53bSI5bDieunOENsbD2u+8XaEkGkDhgBLBDcMtt0aickfpcCGecyobL5Hlsk6o4rUSFJMmfYcLbYm/+j/sIDmLhERs8vzDu4X3/gcbBCBkCsKxkCegMpITvReGX8lwm4xsejuBhaCyU+QrDnKPB38+3TTzh/txgKBMQaJEtAbzKaiYN1piJXf7H5eCh7GCEGyXEl7jcexsSjfJdrS4ljzr13yep5IgjobSz7jCDxDLI5ziHTtIr8h8qGE63rtKsnO942SQI51q+kK9POdgLFXLK9TsCoVR3aAnYdsM/WCCBD5TH55pxmPQE3WyCTZOTZDAn4N1qtbiPi7e4BaWc1jFKTTEgoGuwkkBmkQc1oksrXZ99FrD3/GFOckSvd4oIOyhwZJVl6hZMy10FGRhsZ7DPVakip3JB9g8VmLOZMBacnBNO0zp+hZcZkWB2Sv2tVmubb7YpSSLtmcOT9f3LyV1v6G8m6AAAAAElFTkSuQmCC"
83
+ },
84
+ "1f7f": function(t, e, i) {
85
+ "use strict";
86
+ i("e8f2")
87
+ },
88
+ "1fa5": function(t, e, i) {
89
+ t.exports = i.p + "img/long-arrow-alt-left-regular.svg"
90
+ },
91
+ "29b8": function(t, e) {
92
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAALjklEQVR4Ad1ba2wU1xU+M7uzfmAMpODFCQ8H8IMCogpKGrVSZKlpEqQQF8jKNmlTaByaJuRHErUhIT+o8iNNU9oqTZSSKkU0kbEzsgNOIiW/CmklmkqOEI2KxdMYiL2AAdevxbsz0+/c2bter3dt78yujX2l2fs+93znnnPvuXdmFcpwsIgUSfL0+vWzZxcWLiFFWWYZxjqyrDJUVqB+IdIFsp2IFaXftKwu1LeRx3NSUZTWsKqeG4pEzi/T9f/JtqjHEJkLMWbdkpTAmcELmzeX+jRtF8q2gK4WpW0gZuZ5TPlEq0TEdfLhek+0MoxYN8PhV29vampDA67jH27rOghibqgwQ8xM+6ZNxbma9gxyP0K+DOUqZllF3kKsIE5vLMuy4vqaCvKgeQrPxxHTfHOxrl+SY7vhPz2m4kbiwTnbVVOzFMz9HMlf4CkE02YUuGPaTHdUsAVi0ybqx/h7VaJ3ihobz3JbDIai9IMjJhl867p13ttLS59QLetPAO0BaNYFR/TSZjuqHRC8Cbv65TenT7+9rrU14kQIaTPMMDs3by73aFo90qsB3DtpwBMlZQsiguKTEct67I7GxuPpCgFaNPEgwFdXb/d4vUeRXjul4Jlt1jieAKKVmqIcCVZX72AeJ45ogo0F0UBA61LVP2DMp6IDpCW8dJhy2NYU/Sxr/2Aw+HTJ4cM3J6IN40qLwbdXVubk+f1NkPgPp3zWx5KO2CjIwCT9fcgwqhbpOgvBFkyKfmPOIoOHM+PL9fs/APgHb2nwDNBehD3g+weax6O3b93qE9qbArzokqpOgocn1wzCD6HdmMJKRWcKy9nx+qffMNaTrodSmcNYoJTZc+b8Lqr245rKFAJNPjQ7YUTfC6rqm4hT8p9UADz7wZqabej49C2v9snh2+Zgb9E/A5aUu8MoyTD4K1u2rDAN49+Y/ULQTyqkVOPeguW8CPbhoHVvcWNjGwAD4nAYAY7BU2WlxzDNAwA/G81G1A93m1YpxlCgKkrzxUAgV2CMY38UwCt+/08gpTVQ/VF1cf2mV5IPY0TLNVWtS2Q8ZgIsmW+qqhZ58vJOoxF7VzNHADZqNoWIEg6vLGpqOidNYQRIT27u41HwMcHYfWfEL2P1ml6v9GQFKAGUZ//Sxo23eXNy2lB6G54RghEtZ8KP7Slet0yzYqGuX2UtiAHVNG3HjAbPE8ieoqLMxZXbrzjHRSrPPkvCUtWNXOA2gB5ZfEjLxuOWuWh/zHoVBQJexs6LHXVv2rRoyLIqIAiWkONhcPFJSn4+acuWgbIg7ZhWYkdraIjCZ8+SdfMmKWpMcRObjZ/HjoDJWdphmqVLiP7LXCoRn28nYIv0+BSSt4BdUf6DD1JBbS2peXnJG7ksNXt7qff992nwyBFSPPLONE2i0QNTjqY9j551yoVAIA8npyswgnxhI2nSE82hNb7Vq2nezp22QUkaLrRJkgBfsaRIg2Y3xglfuEC4EhuuSydlL4aDqmn61Tyvdyn6zgJ4h9Rg81DPvPvvHwmeGWIGnTIp+3MsQ1T18x/C4RQa5zLkRVS1TA2b5p2CkO0tOaMJZtRZs6JkLBr47DPq3rWLQl99BfwOhYB+bFaDX3xB3S+/LGLOc1ALcfnsRrCCCugoSinf3a9B3nSs/lFiImKmsBD2HTpEkY4OuvHaaxQ6fJisMN5tTFQQ3A5AebHrP3iQet56iyJQ974PPxS0XWmU5NXeDvl9xRoVDK8WApCVbmK2eSxOnvnzbRXVNOrZu5euv/46mYODNuXoLCYdJloXCQap+5VXqE/XsTRjbY5EyFtcLGi72aUSxjTZIVLBcmlChfMsBAB6VPDoo6TwTgDGebUe+vpruvrss2IWjatXh7VBakU0Dp8/Tz3vvkvdL75IkYsX7e2OaUDlC2pqbM/FOXeJPZnVO9kZmIMUZzITsFDlrF1L8/fsod4DB+jml1+SFQqRNTBAfU1N1N/SQr677qJcPJ6iImLfwbh0iUJHj9LQiRP29iZ3D2hQ3n330WyAV+fOtfljYWUoYB2Zy3v/YjyZE0CUOXXOHCp8CueObdto4PPPqb+5mawbN+B8qzR07BgNtbYK8DywBTUXZonYgqkoWFALqqoo/5FHSPH5MrI8RdkajuzjfpE3ijyzAojOoFipc3Jo1oYNlPfAAxSBiodPnRIzbXR2ktnfL8xBzc0l78KFpJWXk1ZRQVpJCanwKGP2LjVimH33KZum7Qq7p5aCgmQcMYP0lZWRDyBnPfyw6CC3yKSureybgnSmitkEJicwIAkqutrHgEu7lvWTwxGPYvEieAGslSHj0LlOk1uANeDTD3zyCYXPnRPbpVZaKsxEOFOTJwTck1pB/oDhBksiTRjOmgP8zePHqfuFF8RpsXD7diqsqxO7xNXnnqOh07iNG8tPcDZqql4WqWqPFwdL/uri7lStMl2uYC2YB9eWFzoZCrdupdx77hm5BcrKbMaKcsZrqiq/U/9xNseJ0YZ680Io3FlWdanu0AzfypV2XpbFOmUtwdp/wosDwX+gAXwm4G9ywFWWQzxwOVSyMlmXjVhsP/B9gJ0PmO1iDBfHYdgSmX199sxmg+F4mpgns6dHXLnFFztJ4/OeU2pfMNiBaQdF8fLACR3hrfERWIRsLmJwm3ny+j/9dNh8HHEsOvUZAwOnPH9sbzf7V636FtThuyh2fNlm4ARnXL9O2ooVwulxzlfynrxNmdeuUe9774nDVcyHSN587FJ8yQZ6+4qbm1v4GkjpCwTm93s8HRBvjpt1gC8smDHvokX20XVsNtKrxeyHccfAwRV4e60Lq4axaoGunxECgAlYndXVrVgDvwP6jrWAmeOZymbIwCrN10onuw1j7bd1Pcz3AbAqLGOW1ZgJxpnBbD6Z4BF4dYAX3xXK2bbUUOgdEL+Cx/VtYyaYzBINxnYtFAr9HrFQViEA1oL5LS19OL7uiVZkW5OzhG9MshLTn0sOHuxhzNxaaoDoqYbDH8Ag+PJONhblM+SHMQ3iy5e/xOOJCUBoQXNzF14bbUODsNhw41tO57Tt+UUggR3Fus6n39gExwTA+LjiH4bxEZLHsB3OnLUAXi4Qn7lmGPWJ8wjMIwMaKp1btizBa6N/oaYIzwghjWw9LXL8iX03bqfvLaqvj30ZIjkfBY61oLi+vgMa8Dw68sfIMXWRnaZNLHlXlJeSgWccowTAhSwE/4EDjYh3QxCRaSkE2+Nju3/D39CwjzExtsSQVADcCB3MItP8DeL6abkeYA1TTPNQxDB+zVgSgct8SgEIIej60BHDeALpRmiBfRSTPW/VmGcevGLZO3jEsmrwxXhoLFYhnLEDL4pooVyurd0H2rUgPnX/EBmbVSg5wLPJEn3kr6iopd27+YyfVPUlqTE1gBsxATxmUSTyJOJXox1TqpQkPAWxzZNl/XYwN/enyu7d5njgmUe0mXhgbcCHx7Xo8Qakjde1CJNxjSYGSvFjzzrPfhDXey8taGjYPxHgklpaAuBOLIQrgYDf9Hg+xqD8bQG/vOOqtGlxJxeBbZ2vxsJQ4zbDMDYkenkToT2uCSQSYekW6XoXztPfx8XEYxAIv1fgMJlmwc4NK98NPFuvGsbdTsAz065mjbUBi2MRXmY8jpl4BvT4TTOrI9+4uqIt6MT/2KqOIREsqxP3F2+HVHX/4oaGTp6U+KbppF0zyUJgBi4HAgUwiyfB3DaULQf+HDDCnqQ9RnpmItRbALFvqzmPDwSVc7h2+5sXdxcLWlp65djpAE5s61oA8QTBkEqVlerFBQv8PkWpwz1THSbujlgb+4CFZjHNk+NzGQe7Lu5TfQiyE4V/jXg8e7va2oL4h6iBThkzN8mAPXwGfsGs0AiO+e+1S8rLS/CvzuU4XJVDGBUwl6VoUcJDwVmZJyJFucZ5hPMAfB7fGbXxwgZP7uxl02znuzswCqu3adtNM/P7fzVZgkVauHi3AAAAAElFTkSuQmCC"
93
+ },
94
+ "2adc": function(t, e) {
95
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAADyklEQVRYCbVXa0hTURz/nW0+Ssc0zdIQDR+RFoGGFFkolYkUZCJYIfSgiB4U1Kc+mN8qUnp8KAjC3g+KRZRlKZSlZUGZZaa23maumWXTzW262zkrL9vuPdPpdi6Xc87/8fv/7rn3f87/EvxrJPFwVgEBWQQiBPyX+aUjEOxDdvLsfavxIk4+txEWJelI1iUavMgvETmggiDUBvYackhSedZyoiQ3OXZ+FdsFYbuCKJDp1ygewOnyz1cIBEEebESVJkgtjn01IARKlRyYSqFCalQS0qJnIS2G3tGpiJgYjr01h6BtqZJzGbNMQkBJ38nt4grEhU2TgG6euxrXW+5CoJevmsIdKFgVLBuc2U0Pj0Vm3Fx3l3HNJQTMg2bYBTsXtHhOPlc3FoWEAE0NdPf3cLEWxmcgTiN9PVyHERQSAsz+46+vXDeWt/kpy7h6bxWyBF7r27k4A4MWPPvWxNV7q5Al8LSjURany2jA2qs78fjLc1n9WISSNGQgDZSA0dIHdVCoiPnu5yes1+6BwcT/PkRjLwayK2AdsqGy7b4LTPgEDfptZheZLyayBBjwuSatSzpG0p1wa0axL2K6YHAJ6Ho+4057rYvxhrRCpMfMdpGNd8IlwIDL6k/CbBsQYygVShzL24dp6imibLwDjwQ6jXoHCecgkSGTcKagHDEcEjMnJ2JTehGi1VHObtyxMiI3PpdWQ/N4Fq/0rUiOmI7EiDjRRBOsRl5SNhq/v0FXn0GUs5W5UHgUixMWgG3ZMyIT0E2zhj0IpzWPSIA5Pvj4BPNj0zBVPVnECQmcSHfEHATQE72pq4X2AajIL0OsJsZhw3ZMRnpVSi6WJmTCZDWj7ecH0f//oJnQevAwXYFd7hr3OdsTTq08iDlTZ7qrwDaob/Qp02nt4KktrliDjj9dTibCZY/fgJOlY2Nap92Nal2ds9gxZiszUnDLoBX6vm6J76gJME8TzYgdlSXY//A42JngTXutb4PNPihx8YoA82a10OnGa1hxfiNq3teBltcSUDnBi+/NcmJ4TWAY5UtvJ7bdKkHB5S248fYeBmyeV+RFpzyBUWXBcFC53kCLl2q6EmdfavH2hw69FiMILXdDaZawzGDtz4ARBx6dgGXI6g7RLHsauluNZm6iB1WVrtZxD9urA0MQGhTi+ID7rKZhsUuvIgIscPyguch9MjFa+8FuXqP/JEMKWgPW8wz8LbcLaGDPTpKPZF+hfaG/Azrj0+ypE5QdS/4tfikUyWFZhTSjsunrGNWvmjOYN2MBxEaT+anut+EcSt9Y/wKYPTFLjUA+DAAAAABJRU5ErkJggg=="
96
+ },
97
+ "2bc2": function(t, e, i) {
98
+ t.exports = i.p + "img/zoho.svg"
99
+ },
100
+ "2cf42": function(t, e) {
101
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAACT5JREFUeJzNm39wVNUVxz/n7W6I/FDkpwpmd/mRwUIdrfijKNZBOq11xmJhC7tRpKCpta3tWNGx1hoc2yIFrDJOK79FskHiFOSPSmvr4LT4C1qhVgVi2N3EURAoShJIstl3+scmwLK/3r73Qv3+tXvvOd977tn77t57znlCb2NW00VI6ipErgTGAqOA4cBAoH+3VDtwGDiIEkP4ANhFUl+nPnigN82TXmGdFbsaQ2YA3wK+5JBtL8IWUmxmg/8NEHXBwpNwzwFz9wygvc+diNyFcolrvJnYh7KSPrqCtcHP3CB07oBQ43n4PA8APwTOc8xnDccQlqGyhKj/qBMi+w6oUYO9ibsRFgBDnBjhAIcRfYTOwArqJWWHwJ4DwrFxiKwErrWl7z62Y3jmsP7iD0tVNEoeKpy4DZGdfHEmD3AtZmoXkXhVqYrWV0BIPfjiS0HuLXWQs4wnSfrnW30krDlgTqycTqkFvuPEsrOIepJtt1E/vrOYYHEH3NTQh0G+zSjfdMW0s4eXSbZNK+aEwntASD2c79vgwuTbbOgcdjjmTfj6rSeknkJChR3gS/wWmGbTgBPAKtDLiQb6ozITMC3odQJTiAaGojIBYRn2HAgQwpdYVEgg/yMQScwGfc7euNKMeCZRO/KjjOaq+NMoPy6iW0PUvyCjaXZjBV2eHcAwe+ZQRW0gmqsr9wq4rXkM6DO2BgNAX8qaPIBR/hCwv4DeuyRbf5PVvG50E/CKfXN4lplNo3N1ZTugRg3M1DpO3dTsDDgiZ/vzF7ShejPwKrAfZTfwb2A/wlZMbsm7aeXjtIb+GKk11GjWfL1Zog3xapCvOhgMhCvy9tUF9wA3lkaogiQud2aTTKahaR6wIqM5Q2hObCCd0ggMcjQYQNIzmPqL/+uYB2BWLIAhMReYDlGmlaffJDOXRFLux43Jg0lZe5cLPGmkaAfciAMMpVPuO73hlAPmxAaiuHPMFX2c2rHHXOECqA8eQPi1S2w/oqrh3J4vpxzQIXOBAY7pRR+jNvioY54zURv4BeiC4oJFcT545/Z86XaACsI9jqlVftcrk+9BNFgDLHXMo3JXz8f0JpiO4b1pUf1zROZjmocQLkNkIspwYAuV/l9RI1ZOew6gQiTxM5SbMfgIlZ2QegeRC1H5PXC+JRpTr2FD8K3036Ah37VugDxKrb/nr2Rzaca7AVGiLAYWZ3VFEsNBn7JEY3Ar8FbPHmD1stNC+YnVFmUzUb3TRzj+MOH49LwyMxsrqYovyndqK4oycx1w3JKsyC0ABrObR2A5dK2bWD2uxZZxbUO/gfA4Qh3VO305ZTzex1Dm4zHt7SNrg5+BvmhJVhnH7R8OM+hKXW15ACFuyzAAk77dn3ycGFmWR6hHpp/tcUQOWpUk5b3OAC6zTG7KPCKNY20ZdjZQ1XQlyjzrCnqpQSmZG2EEeN4hHL8HtHeySnZwg3oJJ36Jmtsp6SRrjPOCVpQYHe+H8AzhxFS6NGQ3Hu8aqnf6aE1sBabY0A56QexdM4VbKYvdCPwlr0xVw7nguwsVL+ilJ9tT7fcRSWRfe0XHoIBSSSTxIACGvsL6wL/yjtE2ZCr2Jg/oMC9O7v0YRTJCZdejujjHPeaxnHebniZhAujC7rYJwO15hzB1IGL7aRxsAOfY1UaM1sL9Unri5UxoseeziA2F4TNwcs1Us2DE9azA0OygjnV4DMDewSYN+6vHLZha7kD7uAHYX0JqlpyMdB3pahKbFzA5ZmAvAZFC9SGio94uKKVd7bbsykRhjmhwF8gPisrlhHnAQNhXotY+RK+jLriwOD/O63vEAkfUv5wUXwEp/INkwdhvoLLXsryym2TfK6gNWosdfBJ8H3AWGlNetyT3QuADkq2Tge0lkO8zUP2PZXlhC/XDrO8Z26QL2GjdoCwcpExftSxdP74TxHoCxTB2Gni7/o71v8JJlslPIrUIW88ngD7B2mCputZt7Ei9bfD8mE/B8iqYUvJtMDq6AZUHStJJ4zWSgadL0pgVC4BaTLrou9QHD3Sf1OSvFocQ8GSHzkPNhc8Ddf5lIDVYX2nbSaa+nfeiVaMGodgFWYEVj8wHrB3OlJfhZFC0aSKGucOicSYqz2PwCehlKFcCg4HX8Hqns27kkbyas+I3Y+iTIPlWUSuiS+l35HGWT0zmlAh/PASj8yWUSUAHyG4wd4EMo5RUvhhXUVux49Q5OxJ/D6dVncLrdHqmUn/xibwyN6iXC+NTMWQNygXdrZ8CPyfp2VQwnVb9cV9aO/8GXOPITnifaGA8ZKbG1jgkBWUSvtTLhBrzF0xuky7qglvRjP/3ZqKBVQUnH2o8j5aOrTifPKArez6dckB5+7OAo6rLbnwNn+ePuVLR9qGCz/MiIpNdIDtKeUcOB6we1wJa2q6bH1NoTPhd4oJwbBgw1RUu0WWnR7bP+JWMp4BDrgzUnnRyT8/EgPIWwI1s80H6dGQkVDIdEPUfRfVBFwb6iPqxxRx5WiJWz80vBiy/6DjKHsdWiTxyZl4j+zmtC6ylpPN0Lug7BbvTmZ9Rp1k2Jl2XVABCYc6iJrGN2oqVZzbn2KhESRl3AJ/bH0w68vaFmgfhSdWRGYoWzNRGQg1DC5A6KZBowTTuzPWyRaEyuRCo3YtMEvgelf66jGxxeP+liLGJjF8/w5xmSM3IiDOE1IOvKQK6AuhjyxqVmdT5c86lcMAxEl8C3FdQpjD2ASsQeQP0JpSfUjzt1QH6B1S2YOjVqNwNVNi2QFlCXeD+fN1FIq4qRJpWg86xbcD/FfIClRWRQjULRQ4rovQ/VA38yWXLeh+qW0i2zi5WsFH8tLZ8YpL+h6cBtW7Z1usQ3ciAIzPcKZc/CRUiiUVA3ufpCwGRhYyteNhqqU7pOaVwfDrCKs7eG2JWcQz0+0SDG0pRspdUiyRGoeZaly4nbuAfIHcQ9RcoxM4NBzl+Faris1FZhN0yduc4BDxE1L/a7hulzosc5sQG0mHci+hPcKfM1go+R2Up55x40nbNUjfcq/IIfdof7/FqhLnAeNd4M7EHeIby9uecTrwHvfTydPxyDCIoX0f4MnbeT0xD0xFr+TPIBqL+f7ppJvSWA05H+OMhSOf1pOONlwCVpB+VntfnvaQvXieAJqAZ5D0wd6H6JnWjrFZ92cL/AEdm6o5wcBoEAAAAAElFTkSuQmCC"
102
+ },
103
+ "2db4": function(t, e, i) {
104
+ t.exports = i.p + "img/outlook.svg"
105
+ },
106
+ "31f1": function(t, e, i) {
107
+ var s = {
108
+ "./googleAuthenticator.svg": "7de8",
109
+ "./AuthyAuthenticator.svg": "ddc9",
110
+ "./OTPOverSMS.svg": "776b",
111
+ "./OTPOverEmail.svg": "2db4",
112
+ "./KBA.svg": "b1c2",
113
+ "./DuoPush.svg": "7f3e",
114
+ "./OTPOverTelegram.svg": "5f30",
115
+ };
116
+
117
+ function a(t) {
118
+ var e = n(t);
119
+ return i(e)
120
+ }
121
+
122
+ function n(t) {
123
+ if (!i.o(s, t)) {
124
+ var e = new Error("Cannot find module '" + t + "'");
125
+ throw e.code = "MODULE_NOT_FOUND", e
126
+ }
127
+ return s[t]
128
+ }
129
+ a.keys = function() {
130
+ return Object.keys(s)
131
+ }, a.resolve = n, t.exports = a, a.id = "31f1"
132
+ },
133
+ "3af1": function(t, e, i) {
134
+ t.exports = i.p + "img/check-solid.svg"
135
+ },
136
+ "3dce": function(t, e, i) {
137
+ t.exports = i.p + "img/loading-white.svg"
138
+ },
139
+ "4bd8": function(t, e, i) {
140
+ t.exports = i.p + "img/logo.svg"
141
+ },
142
+ "4e2d": function(t, e, i) {
143
+ t.exports = i.p + "img/times-solid.svg"
144
+ },
145
+ "50bf": function(t, e, i) {
146
+ t.exports = i.p + "img/arrow.svg"
147
+ },
148
+ 5711: function(t, e, i) {
149
+ var s = {
150
+ "./loading-blue.svg": "8e56",
151
+ "./loading-white.svg": "3dce",
152
+ "./loading.svg": "8e57"
153
+ };
154
+
155
+ function a(t) {
156
+ var e = n(t);
157
+ return i(e)
158
+ }
159
+
160
+ function n(t) {
161
+ if (!i.o(s, t)) {
162
+ var e = new Error("Cannot find module '" + t + "'");
163
+ throw e.code = "MODULE_NOT_FOUND", e
164
+ }
165
+ return s[t]
166
+ }
167
+ a.keys = function() {
168
+ return Object.keys(s)
169
+ }, a.resolve = n, t.exports = a, a.id = "5711"
170
+ },
171
+ "5f30": function(t, e, i) {
172
+ t.exports = i.p + "img/smtp.svg"
173
+ },
174
+ "6f43": function(t, e, i) {
175
+ t.exports = i.p + "img/star-solid.svg"
176
+ },
177
+ "776b": function(t, e, i) {
178
+ t.exports = i.p + "img/mailgun.svg"
179
+ },
180
+ "78cb": function(t, e, i) {
181
+ t.exports = i.p + "img/smtpcom.svg"
182
+ },
183
+ "7c9b": function(t, e, i) {
184
+ var s = {
185
+ "./all-in-one-seo-pack@2x.png": "2cf42",
186
+ "./coming-soon@2x.png": "9f86",
187
+ "./google-analytics-for-wordpress@2x.png": "82f2",
188
+ "./instagram-feed@2x.png": "877f",
189
+ "./rafflepress@2x.png": "a1c2",
190
+ "./wp-call-button@2x.png": "1532"
191
+ };
192
+
193
+ function a(t) {
194
+ var e = n(t);
195
+ return i(e)
196
+ }
197
+
198
+ function n(t) {
199
+ if (!i.o(s, t)) {
200
+ var e = new Error("Cannot find module '" + t + "'");
201
+ throw e.code = "MODULE_NOT_FOUND", e
202
+ }
203
+ return s[t]
204
+ }
205
+ a.keys = function() {
206
+ return Object.keys(s)
207
+ }, a.resolve = n, t.exports = a, a.id = "7c9b"
208
+ },
209
+ "7de8": function(t, e, i) {
210
+ t.exports = i.p + "img/amazonses.svg"
211
+ },
212
+ "7f3e": function(t, e, i) {
213
+ t.exports = i.p + "img/sendinblue.svg"
214
+ },
215
+ "827a": function(t, e, i) {
216
+ t.exports = i.p + "img/exclamation-circle-solid.svg"
217
+ },
218
+ "82f2": function(t, e, i) {
219
+ t.exports = i.p + "img/google-analytics-for-wordpress@2x.png"
220
+ },
221
+ 8398: function(t, e, i) {
222
+ t.exports = i.p + "img/working.svg"
223
+ },
224
+ 8475: function(t, e, i) {
225
+ t.exports = i.p + "img/question-circle-solid.svg"
226
+ },
227
+ "84d7": function(t, e, i) {
228
+ t.exports = i.p + "img/info-circle-solid.svg"
229
+ },
230
+ "877f": function(t, e, i) {
231
+ t.exports = i.p + "img/instagram-feed@2x.png"
232
+ },
233
+ "87eb": function(t, e, i) {
234
+ t.exports = i.p + "img/pro-badge.svg"
235
+ },
236
+ 8888: function(t, e, i) {
237
+ t.exports = i.p + "img/post-smtp-mailer.png"
238
+ },
239
+ "8cbb": function(t, e, i) {
240
+ "use strict";
241
+ i("da18")
242
+ },
243
+ "8d41": function(t, e) {
244
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAAJsUlEQVR4AeVbC3ATxxn+93SS/JAtY8DYGDuAbd4QQoEkTRlCmzakEyYhAxRCYAjT6QBJWxIIr5Kp2yktj5KQJiSUPGoKmNSTQEmaZ6e0CQwpBUJJKClYro2NH2DLtmTJ1kl3u/1XVKqEJetOPoFtdjRze//++z++2+e/KwKJToyR775emS8BGU3AMJgwmssI5DEGOW6JWRrbFQUIOAXGGhjAZUJYvcxIreD1fFWxcdxlAILkxCWSCNH3/bbCKpqMIwhlj/ooXUaIkBRJj0ui0NSuRCry0ygDD2ZeAgXeJBIrtxUXOaMyx1mgKwAryq5aqpwd+3wAD6mxJxYAnWQo5O3yWroQXiySOpXFSdAFgMWlVyY0tLlKqcEwggAxqrVFMwB+wcwHlH3FDGSBbXXRebW6ovF1C4AFpXWjmju8zykMZqLjmmXFB8A1VxgQCgzeYwp7umJ9oS2ag7Homo3mAsvKmGGPs2q1F0gxDlIR+3csxby8OwAE5ONg2g7ANtrWFD0foGl5agZg4b7LQ5ol5YjMoEiLoki8egAQlEvhgtckzrj01ND6IE1FRlDBE2SZu79+6lWPUqOH80GhemUEGGmS5bqhWy9O1CJSNQCz99QubW2XPtUi/GbwisRwvHBb+WNqdasCYFZJ9WqXT34FxzmzWsE3i48AS8Z+/VrBVtsP1dgQEwD+5SWZbUJhJjUCewYPMQsEthVuLp8Xy54uB8H5B2rutLuUTxL15XUdBCN6ynxeGe68tL7oTMRiJEZtAY//sTbP7qZ/T5Tz0QzSl06MJpGdGrq1Mjua3IgA/JUxscEu/yVapd5FFwQRlHej2RwRgB046PXIqS6aFzHouEadXLi54ulIbJ3GgMfL6sdcdkqnu7PCi6QoEi3xY0CYVieVYFzFxsKaUGqnFnClTdp+I5wPNeIG5dOFJPby9brCAHji7bpJXgb3X8/UV94pJQ8UbLflhfoTBoCtqWNvPLu6UIE9OY9rAwPI8FGojUEA9n/R2k8xGLq9wQkV3hPzGHIryCwuTw/YJgYyb55y7NESzOD15o5LhUGWoIiAqOue0UN6Pox5dWCf60666lJg10n1kTJCiCkjhf2yGeBJrtc/Cyw51JJRa3e2aDUkK9UAC263wN15SXGEQwADOwzwF3c6fskDO084oLJF1iiD0Va31dpYnOXyd4F2t3OsRgkwor8RUowEXjjugJ8daYb6Nhmd6YY3Kg3gOriudR/ZYfWHdj+AE7K1blOIkJHa6vfZD4DChPkq9QfZ+JffMrM//GBKGtjsPlj5nh3+8KUbfBgfS1SSUfZb59wwp/QKfFbtgeVT06H0e4Ng5det2lUy8du8ksCXvQ6P8n3tEq7V+ObwFHjloYFwV54ZDp13w7LDjXDyMo9m65v+WS/B7P0N8Dy2uCm5Zji4MBsem2jxK+m0mlOhmhK6nLOJew9W5+PAEHdcj4dC08wCPHVPBlxo9MKrJ9tg+zEHjMnqgGVT0yAr5iDZtbUtHQps/qQVjuMXH4hjzm8eHACTBptA0B6DDVOETX/woG22LNHuZqP+NxaGMcTzMnKgCX51fyZ8eLEdDmJr+DF2iwdHpsDDY1Ih1RSccVWJ9uBmpOxLF5R87sR+TmDxHWn+L55s1CanK2WpVBkvMhDyMaraFZ+mMqOBwKzRqTBtaBLs+ocT/nShHY5WdcDSyenwtcFmMOBqpKuEMyN8XuuBX2MrqnbIcEeOCTZMz4Bcq7GranGVEcEwXBQFyI2rdoxKGckGWDe9H5Q3eWEH9lveLQoyRVgzLQOsSQJOm52BcHgobPpbMxy7JEG/ZAG2zcyEe25LjqEp/mI8ussVgcKQ+EXErlk0wAQvYL/9AFvCvrMuWPFOE3yrIBmWTEoLrh34Vy892wavnXKCF48K5+ECa8VdVjBha0pkwo+QI8oUokZL9FIuYrPn3WIqLph+f6YNPrZ1wOk6CeaPt0CySGDL0RaocSgwfpDJ30KGZxqD4OhlQyQ5uAzLFnE1FlwXR2LSkzbIYoBV37DC6VoJgXCh461gdyuQjl1i470Z8J3CFBAT/NVD/cGlvxUX8nxUpaH0hOb59DVlSBJMzDHDHhzh69sU+NHd6WAxGxKqN5JwbAEUx0DWFqkw0TQ+W/CZ4QasnqO7QkijIAjQEJ2jj5fwmyiCQQiLkfVxl8PdI3BFkH20Npx667zhGNAsEAOpvnVcDvcUL1lUCv1TTf8OJ986b5LPe0ZY9EgWbwG6XTrqLfDh7FNdu2G0XZhBiJxmJm/0FsP1s5OVcFn+vWWyybBfP8G9RBKDD4IAMFnWfN3Mi/v1npLafdpswXWvYrZYz3H7g9utWW/UvO+h9AG1TvEt7dxxFty2chFBMWqr+/l4jE/C3Vi8ibvd3E5hN+4iWzrUy2GUPGdbW7CK6w1azg9GSk44riIlVqA/Xns71bvBh6N+/Qiax+GWBjYWj3Vxgn8M4JmFEzJaQKAXeb4vJ6KwswHnuZ9BAPjLMGvyUoy7a+tQvGJvSdjjfB7vw6HmhgGwe072CVEkfw5l6Et5jH0crioeG7b5CwOAO5trNePgwPQP7N90JFkzUa6dB4aa0gmA1x/JPpdigl+EMvWFvEKFZ20bihqv96UTAJxhZd5tWzBecel65t76jk3/yH/WFnS6HcL9iQjAjBlEzk4x3dtbHQ63m3ncMswPp/3/LSIAvLhkQU7VgBTjNMz23o0SAy9TYHJDhKYfgCAqAJzhwKODj1lEtgpXS95Ahd7yxLm8gxE2z7au6F9d2dwlALzioSVDd+LF25/jzIB/Beodye88oyttzxQdjmVxTAC4gHeX5m9KFcmTeISo9SpGLP2JKPcSmS6qWDNitxrhwb2AGuY5e6unOST2qRpeNTz67wUo3o0Wp1Q+M/wLNfo5j6oWEBD21qL8oxkmNhzP1MoDtJ7yxADnZ7JRzNfiPLddUwsIOMv/NFXirnrWR4U12C3iPr7VowWg406gwk9xe7sjYJ+WZ1wABBTM3Vc/ptUj7cTT3el45KVZVrcAYIyHZN6XmLK8Zu2ouoBNWp+ajY6kYHFpzYS6dvkdwoRcLfGEuABgzIsb1osyNc6qWj+sKpI9Wmi6AOBXiPdYFhyozGqVxF0Y6QnbckYzSAsAlBEFzzFfbmmSf9K0dZRu55n6ARDi5dyymkxnm3I7Hj/PphSW4hWf1JDiYDYWADx0zYC+imv5j10W+XzjE9eiOEEBOmQSAkCYXdgy7vtd9TCBkgkKY/kKIwPxH+U5isKyPApLc3soRgZxqwqkgRFSiyfWjVilEiM35yLt3sJk6/DyX5qvt56zCsMvAAAAAElFTkSuQmCC"
245
+ },
246
+ "8e56": function(t, e, i) {
247
+ t.exports = i.p + "img/loading-blue.svg"
248
+ },
249
+ "8e57": function(t, e, i) {
250
+ t.exports = i.p + "img/loading.svg"
251
+ },
252
+ "9a1d": function(t, e, i) {
253
+ t.exports = i.p + "img/check-circle-solid.svg"
254
+ },
255
+ "9da7": function(t, e) {
256
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABKdJREFUWIWtl11sFFUUx39ndqf0C0EhiKVluy01ARuoxMRo1CBBIqKRqNV2C4Sg8cGowQcViUFtFOmDCSYaE9SEqN0tluiDIRBBosYHQlBDowbSwu62fNTKh/JRSnd3jg9TdruzMzsN8H+79/zP+f/vzZ17zwgTRfNAGSWZh1FZCtoI3A6YwBRgECGBcghhD6R+oLPh/ETKii9j9dHZpAPrgVVA5QTtXgS2kTG2sH320Wsz0PxnCWZ5O8grQMkEhZ24gmgHZ9Ob2NVwZeIGVg7Mwcp8Ddx5jcJO9GClH6VrzoC/gdbkHRi6F2XmDRK/ipOotYxYXc/4SSOPsioRRvRHT3HlBOiHwBGXaA8q7wP9HgaqEGMXLX017gbWxEvJsAOY7lGgn3SggWh4HYb1ODAyLnaJACuIhTZQWTIXYdDbRPA7lvVOKjSQMt4CFnok2tzumssAfFV3BGUxIq+jvAbWYr6sjQOwtWoYJehZRVjAzcE3ckOASLIO9C9gklceoJRoOdvCI0U40NZ7E2r+V5QDV0DmEQ0ds3dAdb2POKhs9hUH6Gw4j8hmH9YkRNcBCKsGK8iMnAImOxR7QXqBeajEiIU2+IqPR1viXZSngB6ERpS5DsYFSkdmCa3JpxHd7ghmwKonWpd0L368mlEdprvmLGAf4FGrhmh9ryu/JV6LIX1AwLHIFQaG3ueS8runOICmOzDTL2fHo8ZjENjhye8KJ4CegnmRpQYqd7ukNNGWWOtZEEwQM1dITQTTnapCJPEisKAwxIIgaJVLVhDlc1qT1cRC7dnZRRqkKnk/yK2IpokklwBg0YhoBZHkElJl++mecTGbE0m2A296LCQUBKZ5rlM0/y2ojtdjGftAQQG01eZll7QHc/hJ4JtxWY2e9WGaQcHBuE6o431R26oHUgbg1Tgowt58ejDtayBgpPLGhuwCLA/2ZQPkmFsA1UforP04b3bKUD+QcuHnoNqXN+4MfYrqYuwmxQE5YqB6qLAIR4mFdxfMb70rBXQXkf+VhtmHC2Zj4Z9QCjsj0T8MRPcVBmgkEm9ylbCMV4FCERgCfY63Jbfda+KlAETiTQjzCzJUvxfWHp7MSOkgUO4InwZOAnMR/ZaKMyvHdgCaB27BtF4C3YD9DXxEMLOFL+rtXuD5gyYXpkcRngD6gBnAVEf9i6QCM8Zew8RnwLOuK86hi2goApI71W2JUygW0dpZecxIIga0+NT7hGjtC2P9QKYDv8MFLbT1Tfbh2O07POPDGkGCm+BqQxKt70XY4pN0Mq/Xbx4oQ5kCTB0TtWE3LfGilYQP6Kw+njMAYOpGYH+RtFJa+u1ru3mokmCmEygDyjGtGGsP27tjc4rt1EEqTr+T8zIeKxO3YXEAqPZIHgZ2Y7frYUesH/vFewiv5kY5gcgDREPZu8elLT82HzF2FjFxrfgb1UXEwnmfsFFAi9X1kEotBPn5Bor/RoB7nOLuBgC6G/7h3OhSRNuBS9chfBnhPc6l7s12zQ74/5w2x2diykZgNVAxQeF/EaIEMh3Zy8kD/gayRoYqKbm0HIwHQZtQwti3WxrkDOhx0AOI8Qujxs7sP4QP/gdLfYuNd8XCxgAAAABJRU5ErkJggg=="
257
+ },
258
+ "9f7c": function(t, e, i) {
259
+ "use strict";
260
+ i.r(e);
261
+ i("e260"), i("e6cf"), i("cca6"), i("a79d");
262
+ var s = function() {
263
+ var t = this,
264
+ e = t.$createElement,
265
+ s = t._self._c || e;
266
+ return s("div", {
267
+ staticClass: "mo2f-setup-admin-page"
268
+ }, [s("router-view"), t.blocked ? s("div", {
269
+ staticClass: "mo2f-setup-blocked"
270
+ }) : t.loading ? s("div", {
271
+ staticClass: "mo2f-setup-loading"
272
+ }, [s("inline-svg", {
273
+ staticClass: "icon",
274
+ attrs: {
275
+ src: i("c869"),
276
+ width: "195"
277
+ }
278
+ })], 1) : t._e()], 1)
279
+ },
280
+ a = [],
281
+ n = i("5530"),
282
+ o = i("8c4f"),
283
+ r = function() {
284
+ var t = this,
285
+ e = t.$createElement,
286
+ s = t._self._c || e;
287
+ return s("div", {
288
+ staticClass: "mo2f-setup-welcome"
289
+ }, [s("the-wizard-header"), s("div", {
290
+ staticClass: "mo2f-setup-setup-wizard-container"
291
+ }, [s("main", {
292
+ staticClass: "mo2f-setup-setup-wizard-content"
293
+ }, [s("div", {
294
+ staticClass: "mo2f-setup-setup-wizard-content-container"
295
+ }, [s("content-header", {
296
+ attrs: {
297
+ title: t.text_header_title,
298
+ subtitle: t.text_header_subtitle
299
+ }
300
+ }), s("button", {
301
+ staticClass: "mo2f-setup-button mo2f-setup-button-main mo2f-setup-button-large",
302
+ attrs: {
303
+ type: "button"
304
+ },
305
+ on: {
306
+ click: function(e) {
307
+ return e.preventDefault(), t.nextStep(e)
308
+ }
309
+ }
310
+ }, [s("span", {
311
+ staticClass: "text-with-arrow text-with-arrow-right"
312
+ }, [t._v(" " + t._s(t.text_button) + " "), s("inline-svg", {
313
+ staticClass: "icon",
314
+ attrs: {
315
+ src: i("107e"),
316
+ width: "16",
317
+ height: "22"
318
+ }
319
+ })], 1)])], 1)]), s("footer", [s("p", {
320
+ staticClass: "mo2f-setup-exit-link"
321
+ }, [s("a", {
322
+ attrs: {
323
+ href: t.exit_href
324
+ }
325
+ }, [t._v(t._s(t.text_exit_link))])])])])], 1)
326
+ },
327
+ l = [],
328
+ c = (i("cc99"), i("561c")),
329
+ p = function() {
330
+ var t = this,
331
+ e = t.$createElement,
332
+ i = t._self._c || e;
333
+ return i("div", {
334
+ staticClass: "mo2f-setup-content-header"
335
+ }, [i("h2", {
336
+ domProps: {
337
+ innerHTML: t._s(t.title)
338
+ }
339
+ }), t.subtitle ? i("p", {
340
+ staticClass: "subtitle",
341
+ domProps: {
342
+ innerHTML: t._s(t.subtitle)
343
+ }
344
+ }) : t._e()])
345
+ },
346
+ m = [],
347
+ u = {
348
+ name: "ContentHeader",
349
+ props: {
350
+ title: String,
351
+ subtitle: String
352
+ }
353
+ },
354
+ d = u,
355
+ _ = i("2877"),
356
+ f = Object(_["a"])(d, p, m, !1, null, null, null),
357
+ h = f.exports,
358
+ g = function() {
359
+ var t = this,
360
+ e = t.$createElement,
361
+ s = t._self._c || e;
362
+ return s("header", {
363
+ staticClass: "mo2f-setup-wizard-header"
364
+ }, [s("h1", {
365
+ staticClass: "mo2f-setup-setup-wizard-logo"
366
+ }, [s("div", {
367
+ staticClass: "mo2f-setup-logo"
368
+ }, [s("img", {
369
+ staticClass: "mo2f-setup-logo-img",
370
+ attrs: {
371
+ src: i("4bd8"),
372
+ alt: t.text_logo_alt
373
+ }
374
+ })])])])
375
+ },
376
+ w = [],
377
+ b = {
378
+ name: "TheWizardHeader",
379
+ data: function() {
380
+ return {
381
+ text_logo_alt: Object(c["a"])("miniOrange 2-Factor Authentication LOGO", "mo2f-setup")
382
+ }
383
+ }
384
+ },
385
+ A = b,
386
+ v = Object(_["a"])(A, g, w, !1, null, null, null),
387
+ x = v.exports,
388
+ y = {
389
+ name: "SetupWizardWelcome",
390
+ components: {
391
+ ContentHeader: h,
392
+ TheWizardHeader: x
393
+ },
394
+ data: function() {
395
+ return {
396
+ text_header_title: Object(c["a"])("Welcome to the 2FA Setup Wizard!", "mo2f-setup"),
397
+ text_header_subtitle: Object(c["a"])("This setup guide will take you through all the steps you need to follow to enable the two-factor authentication for your website.", "mo2f-setup"),
398
+ text_button: Object(c["a"])("Let's Get Started", "mo2f-setup"),
399
+ text_exit_link: Object(c["a"])("Go back to the Dashboard", "mo2f-setup"),
400
+ exit_href: this.$wpms.exit_url
401
+ }
402
+ },
403
+ methods: {
404
+ nextStep: function() {
405
+ this.$router.push({
406
+ name: this.$wizard_steps[0]
407
+ })
408
+ }
409
+ }
410
+ },
411
+ C = y,
412
+ k = Object(_["a"])(C, r, l, !1, null, null, null),
413
+ O = k.exports,
414
+ j = function() {
415
+ var t = this,
416
+ e = t.$createElement,
417
+ i = t._self._c || e;
418
+ return i("div", {
419
+ staticClass: "mo2f-setup-step"
420
+ }, [i("the-wizard-header"), i("the-wizard-timeline"), i("div", {
421
+ staticClass: "mo2f-setup-setup-wizard-container"
422
+ }, [i("main", {
423
+ staticClass: "mo2f-setup-setup-wizard-content"
424
+ }, [i("router-view", {
425
+ on: {
426
+ displayContentBelow: t.displayContentBelow
427
+ }
428
+ })], 1), i("footer", [t.content_below.length > 0 ? i("div", {
429
+ staticClass: "mo2f-setup-step-below-content",
430
+ domProps: {
431
+ innerHTML: t._s(t.content_below)
432
+ }
433
+ }) : t._e(), t.display_exit_link ? i("p", {
434
+ staticClass: "mo2f-setup-exit-link"
435
+ }, [i("a", {
436
+ attrs: {
437
+ href: t.exit_href
438
+ }
439
+ }, [t._v(t._s(t.text_exit_link))])]) : t._e()])])], 1)
440
+ },
441
+ S = [],
442
+ P = (i("caad"), i("b0c0"), i("d3b7"), i("2532"), i("3ca3"), i("ddb0"), function() {
443
+ var t = this,
444
+ e = t.$createElement,
445
+ s = t._self._c || e;
446
+ return s("div", {
447
+ staticClass: "mo2f-setup-setup-wizard-container"
448
+ }, [s("div", {
449
+ staticClass: "mo2f-setup-setup-wizard-timeline"
450
+ }, [t._l(t.steps, (function(e, a) {
451
+ return [a > 0 ? s("div", {
452
+ key: a + "line",
453
+ class: t.lineClass(a)
454
+ }) : t._e(), s("div", {
455
+ key: a,
456
+ class: t.stepClass(a)
457
+ }, [s("inline-svg", {
458
+ staticClass: "icon icon-success",
459
+ attrs: {
460
+ src: i("3af1"),
461
+ width: "10",
462
+ height: "10"
463
+ }
464
+ }), s("inline-svg", {
465
+ staticClass: "icon icon-failed",
466
+ attrs: {
467
+ src: i("4e2d"),
468
+ width: "8",
469
+ height: "11"
470
+ }
471
+ })], 1)]
472
+ }))], 2)])
473
+ }),
474
+ E = [],
475
+ T = (i("c740"), {
476
+ name: "TheWizardTimeline",
477
+ data: function() {
478
+ return {
479
+ steps: this.$wizard_steps
480
+ }
481
+ },
482
+ methods: {
483
+ stepClass: function(t) {
484
+ var e = this,
485
+ i = "mo2f-setup-setup-wizard-timeline-step",
486
+ s = this.steps.findIndex((function(t) {
487
+ return e.$route.name.includes(t)
488
+ }));
489
+ return (t < s || parseInt(s) === this.steps.length - 1 && this.$route.name.includes("_success")) && (i += " mo2f-setup-setup-wizard-timeline-step-completed"), t === s && parseInt(s) === this.steps.length - 1 && this.$route.name.includes("_failure") && (i += " mo2f-setup-setup-wizard-timeline-step-failed"), parseInt(t) === parseInt(s) && (i += " mo2f-setup-setup-wizard-timeline-step-active"), i
490
+ },
491
+ lineClass: function(t) {
492
+ var e = this,
493
+ i = "mo2f-setup-setup-wizard-timeline-step-line",
494
+ s = this.steps.findIndex((function(t) {
495
+ return e.$route.name.includes(t)
496
+ }));
497
+ return t <= s && (i += " mo2f-setup-setup-wizard-timeline-line-active"), i
498
+ }
499
+ }
500
+ }),
501
+ z = T,
502
+ B = Object(_["a"])(z, P, E, !1, null, null, null),
503
+ I = B.exports,
504
+ M = {
505
+ name: "SetupWizardSteps",
506
+ components: {
507
+ TheWizardHeader: x,
508
+ TheWizardTimeline: I
509
+ },
510
+ data: function() {
511
+ return {
512
+ text_exit_link: Object(c["a"])("Close and exit the Setup Wizard", "mo2f-setup"),
513
+ exit_href: this.$wpms.exit_url,
514
+ content_below: ""
515
+ }
516
+ },
517
+ computed: {
518
+ display_exit_link: function() {
519
+ return !this.$route.name.includes("check_configuration_step")
520
+ }
521
+ },
522
+ methods: {
523
+ displayContentBelow: function(t) {
524
+ this.content_below = t
525
+ }
526
+ },
527
+ mounted: function() {
528
+ var t = this;
529
+ this.$store.dispatch("$_app/start_loading"), Promise.all([this.$store.dispatch("$_settings/getSettings"), this.$store.dispatch("$_plugins/getPlugins")]).finally((function() {
530
+ t.$store.dispatch("$_app/stop_loading")
531
+ }))
532
+ }
533
+ },
534
+ D = M,
535
+ F = Object(_["a"])(D, j, S, !1, null, null, null),
536
+ N = F.exports,
537
+ Q = function() {
538
+ var t = this,
539
+ e = t.$createElement,
540
+ s = t._self._c || e;
541
+ return s("div", {
542
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-import"
543
+ }, [s("div", {
544
+ staticClass: "mo2f-setup-setup-wizard-content-container"
545
+ }, [s("the-wizard-step-counter"), s("content-header", {
546
+ attrs: {
547
+ title: t.text_header_title,
548
+ subtitle: t.text_header_subtitle
549
+ }
550
+ }), s("div", {
551
+ staticClass: "mo2f-setup-setup-wizard-form"
552
+ }, [s("form", [s("div", {
553
+ staticClass: "mo2f-setup-setup-wizard-form-row"
554
+ }, [s("settings-input-radios-with-icons", {
555
+ attrs: {
556
+ name: "import_from_plugin",
557
+ options: t.options
558
+ },
559
+ model: {
560
+ value: t.selectedImport,
561
+ callback: function(e) {
562
+ t.selectedImport = e
563
+ },
564
+ expression: "selectedImport"
565
+ }
566
+ })], 1)])])], 1), s("div", {
567
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
568
+ }), s("div", {
569
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
570
+ }, [s("a", {
571
+ attrs: {
572
+ href: "#"
573
+ },
574
+ on: {
575
+ click: function(e) {
576
+ return e.preventDefault(), t.previousStep(e)
577
+ }
578
+ }
579
+ }, [s("span", {
580
+ staticClass: "text-with-arrow text-with-arrow-left"
581
+ }, [s("inline-svg", {
582
+ staticClass: "icon",
583
+ attrs: {
584
+ src: i("1fa5"),
585
+ width: "16",
586
+ height: "18"
587
+ }
588
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
589
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
590
+ }, [s("button", {
591
+ staticClass: "mo2f-setup-button",
592
+ attrs: {
593
+ type: "button",
594
+ name: "skip_step"
595
+ },
596
+ domProps: {
597
+ textContent: t._s(t.text_skip)
598
+ },
599
+ on: {
600
+ click: function(e) {
601
+ return e.preventDefault(), t.nextStep(e)
602
+ }
603
+ }
604
+ }), s("button", {
605
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
606
+ attrs: {
607
+ type: "submit",
608
+ name: "next_step",
609
+ disabled: null === t.selectedImport
610
+ },
611
+ on: {
612
+ click: function(e) {
613
+ return e.preventDefault(), t.handleSubmit(e)
614
+ }
615
+ }
616
+ }, [s("span", {
617
+ staticClass: "text-with-arrow text-with-arrow-right"
618
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
619
+ staticClass: "icon",
620
+ attrs: {
621
+ src: i("107e"),
622
+ width: "16",
623
+ height: "19"
624
+ }
625
+ })], 1)])])])])
626
+ },
627
+ L = [],
628
+ W = function() {
629
+ var t = this,
630
+ e = t.$createElement,
631
+ s = t._self._c || e;
632
+ return s("div", {
633
+ staticClass: "mo2f-setup-input-radios-with-icons"
634
+ }, t._l(t.options, (function(e) {
635
+ return s("label", {
636
+ key: e.value,
637
+ class: t.labelClass(e),
638
+ attrs: {
639
+ for: "mo2f-setup-settings-radio-" + t.name + "[" + e.value + "]"
640
+ },
641
+ on: {
642
+ click: function(i) {
643
+ return t.clicked(e)
644
+ }
645
+ }
646
+ }, [s("span", {
647
+ class: t.titleClass(e.value)
648
+ }, [s("inline-svg", {
649
+ staticClass: "icon",
650
+ attrs: {
651
+ src: i("3af1"),
652
+ width: "16",
653
+ height: "16"
654
+ }
655
+ })], 1), e.logo.length ? s("img", {
656
+ staticClass: "mo2f-setup-logo-icon",
657
+ attrs: {
658
+ src: e.logo,
659
+ alt: e.label
660
+ }
661
+ }) : t._e(), s("input", {
662
+ directives: [{
663
+ name: "model",
664
+ rawName: "v-model",
665
+ value: t.selectedImport,
666
+ expression: "selectedImport"
667
+ }],
668
+ attrs: {
669
+ id: "mo2f-setup-settings-radio-" + t.name + "[" + e.value + "]",
670
+ type: "radio",
671
+ name: t.name,
672
+ autocomplete: "off",
673
+ disabled: e.disabled || !1
674
+ },
675
+ domProps: {
676
+ value: e.value,
677
+ checked: t.isChecked(e.value),
678
+ checked: t._q(t.selectedImport, e.value)
679
+ },
680
+ on: {
681
+ change: function(i) {
682
+ t.selectedImport = e.value
683
+ }
684
+ }
685
+ }), s("span", {
686
+ staticClass: "mo2f-setup-styled-radio-text",
687
+ domProps: {
688
+ innerHTML: t._s(e.label)
689
+ }
690
+ }), e.is_pro ? s("inline-svg", {
691
+ staticClass: "mo2f-setup-pro-badge",
692
+ attrs: {
693
+ src: i("87eb"),
694
+ width: "46",
695
+ height: "26"
696
+ }
697
+ }) : t._e()], 1)
698
+ })), 0)
699
+ },
700
+ U = [],
701
+ H = {
702
+ name: "SettingsInputRadiosWithIcons",
703
+ props: {
704
+ options: Array,
705
+ name: String,
706
+ value: String
707
+ },
708
+ data: function() {
709
+ return {
710
+ has_error: !1
711
+ }
712
+ },
713
+ computed: {
714
+ selectedImport: {
715
+ get: function() {
716
+ return this.value
717
+ },
718
+ set: function(t) {
719
+ this.$emit("input", t)
720
+ }
721
+ }
722
+ },
723
+ methods: {
724
+ titleClass: function(t) {
725
+ var e = "mo2f-setup-styled-radio";
726
+ return this.isChecked(t) && (e += " mo2f-setup-styled-radio-checked"), e
727
+ },
728
+ labelClass: function(t) {
729
+ var e = "";
730
+ return this.isChecked(t.value) && (e += " mo2f-setup-styled-radio-label-checked"), t.disabled && (e += " mo2f-setup-styled-radio-label-disabled"), t.readonly && (e += " mo2f-setup-styled-radio-label-readonly"), e
731
+ },
732
+ isChecked: function(t) {
733
+ return t === this.selectedImport
734
+ },
735
+ clicked: function(t) {
736
+ t.disabled && this.$emit("clicked-disabled", t)
737
+ }
738
+ }
739
+ },
740
+ R = H,
741
+ G = (i("8cbb"), Object(_["a"])(R, W, U, !1, null, "1652957d", null)),
742
+ V = G.exports,
743
+ Y = function() {
744
+ var t = this,
745
+ e = t.$createElement,
746
+ i = t._self._c || e;
747
+ return i("p", {
748
+ staticClass: "mo2f-setup-setup-wizard-step-count"
749
+ }, [t._v(" " + t._s(t.stepValue) + " ")])
750
+ },
751
+ J = [],
752
+ K = {
753
+ name: "TheWizardStepCounter",
754
+ computed: {
755
+ stepValue: function() {
756
+ var t = this,
757
+ e = this.$wizard_steps.findIndex((function(e) {
758
+ return t.$route.name.includes(e)
759
+ })) + 1;
760
+ return Object(c["c"])(Object(c["a"])("Step %1$s of %2$s", "mo2f-setup"), e, this.$wizard_steps.length)
761
+ }
762
+ }
763
+ },
764
+ q = K,
765
+ Z = (i("1f7f"), Object(_["a"])(q, Y, J, !1, null, "44fd4a93", null)),
766
+ X = Z.exports,
767
+ $ = {
768
+ name: "WizardStepImport",
769
+ components: {
770
+ SettingsInputRadiosWithIcons: V,
771
+ ContentHeader: h,
772
+ TheWizardStepCounter: X
773
+ },
774
+ data: function() {
775
+ return {
776
+ text_header_title: Object(c["a"])("Import data from your current plugins", "mo2f-setup"),
777
+ text_header_subtitle: Object(c["a"])("We have detected other 2FA plugins installed on your website. Select which plugin's data you would like to import to miniOrange 2-Factor authentication.", "mo2f-setup"),
778
+ text_save: Object(c["a"])("Import Data and Continue", "mo2f-setup"),
779
+ text_skip: Object(c["a"])("Skip this Step", "mo2f-setup"),
780
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup"),
781
+ options: [{
782
+ value: "easy-smtp",
783
+ label: Object(c["a"])("Wordfence", "mo2f-setup"),
784
+ // logo: i("8d41"),
785
+ // disabled: !this.$wpms.other_2FA_plugins.includes("easy-smtp"),
786
+ // readonly: !this.$wpms.other_2FA_plugins.includes("easy-smtp")
787
+ }, {
788
+ value: "post-smtp-mailer",
789
+ label: Object(c["a"])("WP 2FA", "mo2f-setup"),
790
+ //logo: i("8888"),
791
+ // disabled: !this.$wpms.other_2FA_plugins.includes("post-smtp-mailer"),
792
+ // readonly: !this.$wpms.other_2FA_plugins.includes("post-smtp-mailer")
793
+ }, {
794
+ value: "smtp-mailer",
795
+ label: Object(c["a"])("Two Factor authentication", "mo2f-setup"),
796
+ //logo: i("29b8"),
797
+ // disabled: !this.$wpms.other_2FA_plugins.includes("smtp-mailer"),
798
+ // readonly: !this.$wpms.other_2FA_plugins.includes("smtp-mailer")
799
+ }, {
800
+ value: "wp-smtp",
801
+ label: Object(c["a"])("Google Authenticator", "mo2f-setup"),
802
+ //logo: i("b98f"),
803
+ // disabled: !this.$wpms.other_2FA_plugins.includes("wp-smtp"),
804
+ // readonly: !this.$wpms.other_2FA_plugins.includes("wp-smtp")
805
+ }],
806
+ selectedImport: null
807
+ }
808
+ },
809
+ methods: {
810
+ handleSubmit: function() {
811
+ var t = this;
812
+ null !== this.selectedImport && (this.$store.dispatch("$_app/start_loading"), this.$store.dispatch("$_settings/importOtherPlugin", {
813
+ value: this.selectedImport
814
+ }).then((function(e) {
815
+ e ? t.nextStep() : t.$wpms_error_toast({})
816
+ })).finally((function() {
817
+ t.$store.dispatch("$_app/stop_loading")
818
+ })))
819
+ },
820
+ nextStep: function() {
821
+ this.$next_step()
822
+ },
823
+ previousStep: function() {
824
+ this.$previous_step()
825
+ }
826
+ }
827
+ },
828
+ tt = $,
829
+ et = Object(_["a"])(tt, Q, L, !1, null, null, null),
830
+ it = et.exports,
831
+ st = function() {
832
+ var t = this,
833
+ e = t.$createElement,
834
+ s = t._self._c || e;
835
+ return s("div", {
836
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-choose-mailer"
837
+ }, [s("div", {
838
+ staticClass: "mo2f-setup-setup-wizard-content-container"
839
+ }, [s("the-wizard-step-counter"), s("content-header", {
840
+ attrs: {
841
+ title: t.text_header_title,
842
+ subtitle: t.text_header_subtitle
843
+ }
844
+ }), s("div", {
845
+ staticClass: "mo2f-setup-setup-wizard-form"
846
+ }, [s("form", [s("div", {
847
+ staticClass: "mo2f-setup-setup-wizard-form-row mo2f-setup-setup-wizard-form-row-highlight"
848
+ }, [s("h3", [t._v(t._s(t.text_recommended_mailers))]), s("settings-input-radios-with-icons", {
849
+ attrs: {
850
+ name: "choose_mailer",
851
+ options: t.recommended_options
852
+ },
853
+ model: {
854
+ value: t.selectedMailer,
855
+ callback: function(e) {
856
+ t.selectedMailer = e
857
+ },
858
+ expression: "selectedMailer"
859
+ }
860
+ })], 1), s("div", {
861
+ staticClass: "mo2f-setup-setup-wizard-form-row"
862
+ }, [s("settings-input-radios-with-icons", {
863
+ attrs: {
864
+ name: "choose_mailer",
865
+ options: t.options
866
+ },
867
+ on: {
868
+ "clicked-disabled": t.clickedDisabledOption
869
+ },
870
+ model: {
871
+ value: t.selectedMailer,
872
+ callback: function(e) {
873
+ t.selectedMailer = e
874
+ },
875
+ expression: "selectedMailer"
876
+ }
877
+ })], 1)])])], 1), s("div", {
878
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
879
+ }), s("div", {
880
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
881
+ }, [s("a", {
882
+ attrs: {
883
+ href: "#"
884
+ },
885
+ on: {
886
+ click: function(e) {
887
+ return e.preventDefault(), t.previousStep(e)
888
+ }
889
+ }
890
+ }, [s("span", {
891
+ staticClass: "text-with-arrow text-with-arrow-left"
892
+ }, [s("inline-svg", {
893
+ staticClass: "icon",
894
+ attrs: {
895
+ src: i("1fa5"),
896
+ width: "16",
897
+ height: "18"
898
+ }
899
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
900
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
901
+ }, [s("button", {
902
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
903
+ attrs: {
904
+ type: "submit",
905
+ name: "next_step",
906
+ disabled: null === t.selectedMailer
907
+ },
908
+ on: {
909
+ click: function(e) {
910
+ return e.preventDefault(), t.handleSubmit(e)
911
+ }
912
+ }
913
+ }, [s("span", {
914
+ staticClass: "text-with-arrow text-with-arrow-right"
915
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
916
+ staticClass: "icon",
917
+ attrs: {
918
+ src: i("107e"),
919
+ width: "16",
920
+ height: "19"
921
+ }
922
+ })], 1)])])])])
923
+ },
924
+ at = [],
925
+ nt = (i("99af"), i("7db0"), i("ac1f"), i("5319"), i("2f62")),
926
+ ot = {
927
+ name: "WizardStepChooseMailer",
928
+ components: {
929
+ SettingsInputRadiosWithIcons: V,
930
+ ContentHeader: h,
931
+ TheWizardStepCounter: X
932
+ },
933
+ data: function() {
934
+ return {
935
+ text_header_title: Object(c["a"])("Choose Your 2FA method", "mo2f-setup"),
936
+ text_header_subtitle: Object(c["c"])(Object(c["a"])("Which method would you like to use for 2-factor authentication? Not sure which method to choose? Reach out to us", "mo2f-setup"), '<a href="https://plugins.miniorange.com/2-factor-authentication-for-wordpress" target="_blank" rel="noopener noreferrer">', "</a>"),
937
+ text_save: Object(c["a"])("Save and Continue", "mo2f-setup"),
938
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup"),
939
+ text_recommended_mailers: Object(c["a"])("Recommended Methods", "mo2f-setup"),
940
+ // recommended_options: [{
941
+ // value: "smtpcom",
942
+ // label: this.$wpms.mailer_options["smtpcom"].title,
943
+ // logo: i("78cb")
944
+ // }, {
945
+ // value: "sendinblue",
946
+ // label: this.$wpms.mailer_options["sendinblue"].title,
947
+ // logo: i("7f3e")
948
+ // }],
949
+ // options: [{
950
+ // value: "mailgun",
951
+ // label: this.$wpms.mailer_options["mailgun"].title,
952
+ // logo: i("776b")
953
+ // }, {
954
+ // value: "sendgrid",
955
+ // label: this.$wpms.mailer_options["sendgrid"].title,
956
+ // logo: i("b1c2")
957
+ // }, {
958
+ // value: "gmail",
959
+ // label: this.$wpms.mailer_options["gmail"].title,
960
+ // logo: i("ddc9"),
961
+ // notice: this.$wpms.mailer_options["gmail"].edu_notice
962
+ // }, {
963
+ // value: "amazonses",
964
+ // label: this.$wpms.mailer_options["amazonses"].title,
965
+ // logo: i("7de8"),
966
+ // disabled: !this.$wpms.is_pro,
967
+ // is_pro: !this.$wpms.is_pro,
968
+ // notice: this.$wpms.mailer_options["amazonses"].edu_notice
969
+ // }, {
970
+ // value: "outlook",
971
+ // label: this.$wpms.mailer_options["outlook"].title,
972
+ // logo: i("2db4"),
973
+ // disabled: !this.$wpms.is_pro,
974
+ // is_pro: !this.$wpms.is_pro,
975
+ // notice: this.$wpms.mailer_options["outlook"].edu_notice
976
+ // }, {
977
+ // value: "zoho",
978
+ // label: this.$wpms.mailer_options["zoho"].title,
979
+ // logo: i("2bc2"),
980
+ // disabled: !this.$wpms.is_pro,
981
+ // is_pro: !this.$wpms.is_pro
982
+ // }, {
983
+ // value: "smtp",
984
+ // label: this.$wpms.mailer_options["smtp"].title,
985
+ // logo: i("5f30")
986
+ // }],
987
+ // selectedMailer: this.currentMailer
988
+ }
989
+ },
990
+ watch: {
991
+ currentMailer: function(t) {
992
+ this.selectedMailer = t
993
+ }
994
+ },
995
+ computed: Object(n["a"])(Object(n["a"])({}, Object(nt["b"])({
996
+ currentMailer: "$_settings/mailer"
997
+ })), {}, {
998
+ selectedMailerOptions: function() {
999
+ var t = this;
1000
+ return this.recommended_options.concat(this.options).find((function(e) {
1001
+ return e.value === t.selectedMailer
1002
+ }))
1003
+ }
1004
+ }),
1005
+ methods: {
1006
+ handleSubmit: function(t) {
1007
+ var e = this,
1008
+ i = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];
1009
+ null !== this.selectedMailer && (void 0 === this.selectedMailerOptions.notice || i ? (this.$store.dispatch("$_app/start_loading"), this.$store.dispatch("$_settings/updateSettings", {
1010
+ value: {
1011
+ mail: {
1012
+ mailer: this.selectedMailer
1013
+ }
1014
+ }
1015
+ }).then((function(t) {
1016
+ t.success ? (e.$store.dispatch("$_settings/setMailer", e.selectedMailer), e.nextStep()) : e.$wpms_error_toast({})
1017
+ })).finally((function() {
1018
+ e.$store.dispatch("$_app/stop_loading")
1019
+ }))) : this.$swal({
1020
+ title: this.selectedMailerOptions.label + " " + Object(c["a"])("Mailer", "mo2f-setup"),
1021
+ html: this.selectedMailerOptions.notice,
1022
+ width: 650,
1023
+ showCloseButton: !0,
1024
+ allowOutsideClick: !1,
1025
+ allowEscapeKey: !1,
1026
+ allowEnterKey: !1,
1027
+ customClass: {
1028
+ container: "mo2f-setup-swal"
1029
+ },
1030
+ confirmButtonText: Object(c["a"])("I Understand, Continue", "mo2f-setup"),
1031
+ cancelButtonText: Object(c["a"])("Choose a Different Mailer", "mo2f-setup"),
1032
+ showCancelButton: !0,
1033
+ reverseButtons: !0
1034
+ }).then((function(t) {
1035
+ t.value ? e.handleSubmit(null, !0) : void 0 !== t.dismiss && "cancel" === t.dismiss && (e.selectedMailer = null)
1036
+ })))
1037
+ },
1038
+ nextStep: function() {
1039
+ var t = this,
1040
+ e = this.$wizard_steps.findIndex((function(e) {
1041
+ return t.$route.name.includes(e)
1042
+ })) + 1;
1043
+ this.$router.push({
1044
+ name: "".concat(this.$wizard_steps[e], "_").concat(this.selectedMailer)
1045
+ })
1046
+ },
1047
+ previousStep: function() {
1048
+ this.$previous_step()
1049
+ },
1050
+ clickedDisabledOption: function(t) {
1051
+ this.$swal({
1052
+ title: t.label + " " + Object(c["a"])("is a PRO Feature", "mo2f-setup"),
1053
+ html: "<p>".concat(this.$wpms.education.upgrade_text.replace("%mailer%", t.label), '</p>\n\t\t\t\t\t\t<p><a href="').concat(this.$wpms.education.upgrade_url + "&utm_content=" + t.value, '" class="mo2f-setup-button mo2f-setup-button-small mo2f-setup-button-main" target="_blank" rel="noopener noreferrer">').concat(this.$wpms.education.upgrade_button, '</a></p>\n\t\t\t\t\t\t<p class="upgrade-bonus"><span class="icon-container"><svg data-v-6d7a07a8="" viewBox="0 0 512 512" role="img" class="icon" data-icon="check" data-prefix="fas" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16"><path xmlns="http://www.w3.org/2000/svg" fill="currentColor" d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"></path></svg></span>').concat(this.$wpms.education.upgrade_bonus, "</p>\n\t\t\t\t\t\t<p>").concat(this.$wpms.education.upgrade_doc, "</p>"),
1054
+ width: 550,
1055
+ imageUrl: i("b32f"),
1056
+ imageWidth: 31,
1057
+ imageHeight: 35,
1058
+ showCloseButton: !0,
1059
+ customClass: {
1060
+ container: "mo2f-setup-swal mo2f-setup-upgrade-popup"
1061
+ },
1062
+ showConfirmButton: !1
1063
+ })
1064
+ }
1065
+ },
1066
+ mounted: function() {
1067
+ this.selectedMailer = this.currentMailer
1068
+ }
1069
+ },
1070
+ rt = ot,
1071
+ lt = Object(_["a"])(rt, st, at, !1, null, null, null),
1072
+ ct = lt.exports,
1073
+ pt = function() {
1074
+ var t = this,
1075
+ e = t.$createElement,
1076
+ s = t._self._c || e;
1077
+ return s("div", {
1078
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-configure-mailer"
1079
+ }, [s("div", {
1080
+ staticClass: "mo2f-setup-setup-wizard-content-container"
1081
+ }, [s("div", {
1082
+ staticClass: "mo2f-setup-configure-mailer-header"
1083
+ }, [s("div", {
1084
+ staticClass: "mo2f-setup-configure-mailer-header-container"
1085
+ }, [s("the-wizard-step-counter"), s("content-header", {
1086
+ attrs: {
1087
+ title: t.text_header_title,
1088
+ subtitle: t.text_header_subtitle
1089
+ }
1090
+ })], 1), s("span", {
1091
+ staticClass: "mo2f-setup-configure-mailer-logo"
1092
+ }, [s("inline-svg", {
1093
+ attrs: {
1094
+ src: t.logo(t.mailer),
1095
+ height: "40"
1096
+ }
1097
+ })], 1)]), s("div", {
1098
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
1099
+ }), s("router-view", {
1100
+ ref: "mailerConfiguration"
1101
+ })], 1), s("div", {
1102
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
1103
+ }), s("div", {
1104
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
1105
+ }, [s("a", {
1106
+ attrs: {
1107
+ href: "#"
1108
+ },
1109
+ on: {
1110
+ click: function(e) {
1111
+ return e.preventDefault(), t.previousStep(e)
1112
+ }
1113
+ }
1114
+ }, [s("span", {
1115
+ staticClass: "text-with-arrow text-with-arrow-left"
1116
+ }, [s("inline-svg", {
1117
+ staticClass: "icon",
1118
+ attrs: {
1119
+ src: i("1fa5"),
1120
+ width: "16",
1121
+ height: "18"
1122
+ }
1123
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
1124
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
1125
+ }, [s("button", {
1126
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
1127
+ attrs: {
1128
+ type: "submit",
1129
+ name: "next_step",
1130
+ disabled: null === t.mailer || !0 === t.blocked_step
1131
+ },
1132
+ on: {
1133
+ click: function(e) {
1134
+ return e.preventDefault(), t.handleSubmit(e)
1135
+ }
1136
+ }
1137
+ }, [s("span", {
1138
+ staticClass: "text-with-arrow text-with-arrow-right"
1139
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
1140
+ staticClass: "icon",
1141
+ attrs: {
1142
+ src: i("107e"),
1143
+ width: "16",
1144
+ height: "19"
1145
+ }
1146
+ })], 1)])])])])
1147
+ },
1148
+ mt = [],
1149
+ ut = i("5935"),
1150
+ dt = {
1151
+ name: "WizardStepConfigureMailer",
1152
+ components: {
1153
+ ContentHeader: h,
1154
+ TheWizardStepCounter: X
1155
+ },
1156
+ data: function() {
1157
+ return {
1158
+ text_header_title: Object(c["a"])("Configure Mailer Settings", "mo2f-setup"),
1159
+ text_header_subtitle: Object(c["a"])("Below, we'll show you all of the settings required to set up this mailer.", "mo2f-setup"),
1160
+ text_save: Object(c["a"])("Save and Continue", "mo2f-setup"),
1161
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup")
1162
+ }
1163
+ },
1164
+ computed: Object(n["a"])(Object(n["a"])({}, Object(nt["b"])({
1165
+ mailer: "$_settings/mailer"
1166
+ })), Object(ut["b"])("$_wizard", ["blocked_step"])),
1167
+ methods: {
1168
+ handleSubmit: function() {
1169
+ var t = this;
1170
+ return !this.blocked_step && (this.$refs.mailerConfiguration.areRequiredFieldsValid() ? (this.$store.dispatch("$_app/start_loading"), void this.$store.dispatch("$_settings/saveCurrentSettings").then((function(e) {
1171
+ e.success ? t.$next_step() : t.$wpms_error_toast({})
1172
+ })).finally((function() {
1173
+ t.$store.dispatch("$_app/stop_loading")
1174
+ }))) : (this.$required_fields_modal(), !1))
1175
+ },
1176
+ previousStep: function() {
1177
+ this.blocked_step = !1, this.$previous_step()
1178
+ },
1179
+ logo: function(t) {
1180
+ return t = "mail" === t ? "smtp" : t, i("31f1")("./".concat(t, ".svg"))
1181
+ }
1182
+ }
1183
+ },
1184
+ _t = dt,
1185
+ ft = Object(_["a"])(_t, pt, mt, !1, null, null, null),
1186
+ ht = ft.exports,
1187
+ gt = function() {
1188
+ var t = this,
1189
+ e = t.$createElement,
1190
+ s = t._self._c || e;
1191
+ return s("div", {
1192
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-plugin-features"
1193
+ }, [s("div", {
1194
+ staticClass: "mo2f-setup-setup-wizard-content-container"
1195
+ }, [s("div", {
1196
+ staticClass: "mo2f-setup-plugin-features-header"
1197
+ }, [s("the-wizard-step-counter"), s("content-header", {
1198
+ attrs: {
1199
+ title: t.text_header_title,
1200
+ subtitle: t.text_header_subtitle
1201
+ }
1202
+ })], 1), s("div", {
1203
+ staticClass: "mo2f-setup-plugin-features-list"
1204
+ }, [s("settings-input-long-checkbox", {
1205
+ attrs: {
1206
+ value: !0,
1207
+ name: "improved_deliverability",
1208
+ label: t.text_improved_email_deliverability,
1209
+ description: t.text_improved_email_deliverability_desc,
1210
+ disabled: ""
1211
+ }
1212
+ }), s("settings-input-long-checkbox", {
1213
+ attrs: {
1214
+ value: !0,
1215
+ name: "error_tracking",
1216
+ label: t.text_error_tracking,
1217
+ description: t.text_error_tracking_desc,
1218
+ disabled: ""
1219
+ }
1220
+ }), t.contact_form_already_installed ? t._e() : s("settings-input-long-checkbox", {
1221
+ attrs: {
1222
+ name: "smart_contact_form",
1223
+ label: t.text_smart_contact_form,
1224
+ description: t.text_smart_contact_form_desc
1225
+ },
1226
+ model: {
1227
+ value: t.smart_contact_form,
1228
+ callback: function(e) {
1229
+ t.smart_contact_form = e
1230
+ },
1231
+ expression: "smart_contact_form"
1232
+ }
1233
+ }), s("settings-input-long-checkbox", {
1234
+ attrs: {
1235
+ name: "email_log",
1236
+ label: t.text_email_log,
1237
+ description: t.text_email_log_desc,
1238
+ show_pro: !t.is_pro
1239
+ },
1240
+ model: {
1241
+ value: t.email_log,
1242
+ callback: function(e) {
1243
+ t.email_log = e
1244
+ },
1245
+ expression: "email_log"
1246
+ }
1247
+ }), t.is_pro ? t._e() : s("settings-input-long-checkbox", {
1248
+ attrs: {
1249
+ name: "manage_notifications",
1250
+ label: t.text_manage_notifications,
1251
+ description: t.text_manage_notifications_desc,
1252
+ show_pro: !t.is_pro
1253
+ },
1254
+ model: {
1255
+ value: t.manage_notifications,
1256
+ callback: function(e) {
1257
+ t.manage_notifications = e
1258
+ },
1259
+ expression: "manage_notifications"
1260
+ }
1261
+ }), t.is_multisite && !t.is_pro ? s("settings-input-long-checkbox", {
1262
+ attrs: {
1263
+ name: "network_settings",
1264
+ label: t.text_network_settings,
1265
+ description: t.text_network_settings_desc,
1266
+ show_pro: !t.is_pro
1267
+ },
1268
+ model: {
1269
+ value: t.network_settings,
1270
+ callback: function(e) {
1271
+ t.network_settings = e
1272
+ },
1273
+ expression: "network_settings"
1274
+ }
1275
+ }) : t._e()], 1)]), s("div", {
1276
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
1277
+ }), s("div", {
1278
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
1279
+ }, [s("a", {
1280
+ attrs: {
1281
+ href: "#"
1282
+ },
1283
+ on: {
1284
+ click: function(e) {
1285
+ return e.preventDefault(), t.previousStep(e)
1286
+ }
1287
+ }
1288
+ }, [s("span", {
1289
+ staticClass: "text-with-arrow text-with-arrow-left"
1290
+ }, [s("inline-svg", {
1291
+ staticClass: "icon",
1292
+ attrs: {
1293
+ src: i("1fa5"),
1294
+ width: "16",
1295
+ height: "18"
1296
+ }
1297
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
1298
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
1299
+ }, [s("button", {
1300
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
1301
+ attrs: {
1302
+ type: "submit",
1303
+ name: "next_step"
1304
+ },
1305
+ on: {
1306
+ click: function(e) {
1307
+ return e.preventDefault(), t.handleSubmit(e)
1308
+ }
1309
+ }
1310
+ }, [s("span", {
1311
+ staticClass: "text-with-arrow text-with-arrow-right"
1312
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
1313
+ staticClass: "icon",
1314
+ attrs: {
1315
+ src: i("107e"),
1316
+ width: "16",
1317
+ height: "19"
1318
+ }
1319
+ })], 1)])])])])
1320
+ },
1321
+ wt = [],
1322
+ bt = (i("4de4"), function() {
1323
+ var t = this,
1324
+ e = t.$createElement,
1325
+ s = t._self._c || e;
1326
+ return s("label", {
1327
+ staticClass: "settings-input-long-checkbox",
1328
+ class: {
1329
+ "settings-input-long-checkbox-checked": t.value, "settings-input-long-checkbox-disabled": t.disabled
1330
+ },
1331
+ attrs: {
1332
+ for: "mo2f-setup-settings-long-checkbox-" + t.name
1333
+ }
1334
+ }, [s("div", {
1335
+ staticClass: "settings-input-long-checkbox-header"
1336
+ }, [s("span", {
1337
+ staticClass: "title-container"
1338
+ }, [s("span", {
1339
+ staticClass: "label",
1340
+ domProps: {
1341
+ innerHTML: t._s(t.label)
1342
+ }
1343
+ }), t.show_pro ? s("inline-svg", {
1344
+ staticClass: "mo2f-setup-pro-badge",
1345
+ attrs: {
1346
+ src: i("87eb"),
1347
+ width: "46",
1348
+ height: "24"
1349
+ }
1350
+ }) : t._e()], 1), t.description ? s("p", {
1351
+ staticClass: "description",
1352
+ domProps: {
1353
+ innerHTML: t._s(t.description)
1354
+ }
1355
+ }) : t._e()]), s("span", {
1356
+ staticClass: "settings-input-long-checkbox-container"
1357
+ }, [s("span", {
1358
+ staticClass: "checkbox",
1359
+ class: {
1360
+ "checkbox-checked": t.value, "checkbox-disabled": t.disabled
1361
+ }
1362
+ }, [s("inline-svg", {
1363
+ staticClass: "icon",
1364
+ attrs: {
1365
+ src: i("3af1"),
1366
+ width: "16",
1367
+ height: "16"
1368
+ }
1369
+ })], 1), s("input", {
1370
+ attrs: {
1371
+ id: "mo2f-setup-settings-long-checkbox-" + t.name,
1372
+ type: "checkbox",
1373
+ name: t.name,
1374
+ disabled: t.disabled
1375
+ },
1376
+ domProps: {
1377
+ checked: t.value
1378
+ },
1379
+ on: {
1380
+ input: function(e) {
1381
+ return t.$emit("input", e.target.checked)
1382
+ }
1383
+ }
1384
+ })])])
1385
+ }),
1386
+ At = [],
1387
+ vt = {
1388
+ name: "SettingsInputLongCheckbox",
1389
+ props: {
1390
+ label: String,
1391
+ name: String,
1392
+ value: Boolean,
1393
+ description: String,
1394
+ disabled: Boolean,
1395
+ show_pro: Boolean
1396
+ }
1397
+ },
1398
+ xt = vt,
1399
+ yt = Object(_["a"])(xt, bt, At, !1, null, null, null),
1400
+ Ct = yt.exports,
1401
+ kt = {
1402
+ name: "WizardStepPluginFeatures",
1403
+ components: {
1404
+ ContentHeader: h,
1405
+ TheWizardStepCounter: X,
1406
+ SettingsInputLongCheckbox: Ct
1407
+ },
1408
+ data: function() {
1409
+ return {
1410
+ text_header_title: Object(c["a"])("Which email features do you want to enable?", "mo2f-setup"),
1411
+ text_header_subtitle: Object(c["a"])("Make sure you're getting the most out of WP Mail SMTP. Just check all of the features you'd like to use, and we'll go ahead and enable those for you.", "mo2f-setup"),
1412
+ text_save: Object(c["a"])("Save and Continue", "mo2f-setup"),
1413
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup"),
1414
+ text_improved_email_deliverability: Object(c["a"])("Improved Email Deliverability", "mo2f-setup"),
1415
+ text_improved_email_deliverability_desc: Object(c["a"])("Ensure your emails are sent successfully and reliably.", "mo2f-setup"),
1416
+ text_error_tracking: Object(c["a"])("Email Error Tracking", "mo2f-setup"),
1417
+ text_error_tracking_desc: Object(c["a"])("Easily spot errors causing delivery issues.", "mo2f-setup"),
1418
+ text_smart_contact_form: Object(c["a"])("Smart Contact Form", "mo2f-setup"),
1419
+ text_smart_contact_form_desc: Object(c["a"])("Create beautiful contact forms with just a few clicks.", "mo2f-setup"),
1420
+ text_email_log: Object(c["a"])("Detailed Email Logs", "mo2f-setup"),
1421
+ text_email_log_desc: Object(c["a"])("Keep records of every email that's sent out from your website.", "mo2f-setup"),
1422
+ text_manage_notifications: Object(c["a"])("Manage Default Notifications", "mo2f-setup"),
1423
+ text_manage_notifications_desc: Object(c["a"])("Control which email notifications your WordPress site sends.", "mo2f-setup"),
1424
+ text_network_settings: Object(c["a"])("Multisite Network Settings", "mo2f-setup"),
1425
+ text_network_settings_desc: Object(c["a"])("Save time with powerful WordPress Multisite controls.", "mo2f-setup"),
1426
+ is_pro: this.$wpms.is_pro,
1427
+ is_multisite: this.$wpms.is_multisite,
1428
+ email_log: !1,
1429
+ manage_notifications: !1,
1430
+ network_settings: !1
1431
+ }
1432
+ },
1433
+ computed: Object(n["a"])(Object(n["a"])({}, Object(nt["b"])({
1434
+ contact_form_already_installed: "$_plugins/contact_form_plugin_already_installed",
1435
+ email_log_setting: "$_settings/email_log_enabled"
1436
+ })), Object(ut["b"])("$_plugins", {
1437
+ smart_contact_form: "smart_contact_form_setting"
1438
+ })),
1439
+ watch: {
1440
+ smart_contact_form: function(t) {
1441
+ if (this.contact_form_already_installed) return !1;
1442
+ this.showWPFormsPluginInstallFooterNotice(t)
1443
+ },
1444
+ contact_form_already_installed: function(t) {
1445
+ t && this.$emit("displayContentBelow", "")
1446
+ },
1447
+ email_log_setting: function(t) {
1448
+ this.email_log = t
1449
+ }
1450
+ },
1451
+ methods: {
1452
+ handleSubmit: function() {
1453
+ var t = this;
1454
+ this.$store.dispatch("$_app/start_loading");
1455
+ var e = [];
1456
+ if (this.is_pro) {
1457
+ var i = {
1458
+ value: {
1459
+ logs: {
1460
+ enabled: this.email_log
1461
+ }
1462
+ }
1463
+ };
1464
+ e.push(this.$store.dispatch("$_settings/updateSettings", i)), e.push(this.$store.dispatch("$_settings/setLogs", this.email_log))
1465
+ }
1466
+ if (this.smart_contact_form && !this.contact_form_already_installed && e.push(this.$store.dispatch("$_plugins/installPlugin", "wpforms-lite")), !this.is_pro) {
1467
+ var s = [];
1468
+ this.email_log && s.push("email_log"), this.manage_notifications && s.push("manage_notifications"), this.network_settings && s.push("network_settings"), e.push(this.$store.dispatch("$_settings/savePluginFeatures", s))
1469
+ }
1470
+ Promise.all(e).then((function(e) {
1471
+ var i = e.filter((function(t) {
1472
+ return t.success
1473
+ }));
1474
+ i.length === e.length && (t.$emit("displayContentBelow", ""), t.$next_step())
1475
+ })).finally((function() {
1476
+ t.$store.dispatch("$_app/stop_loading")
1477
+ }))
1478
+ },
1479
+ previousStep: function() {
1480
+ var t = this;
1481
+ this.$emit("displayContentBelow", "");
1482
+ var e = this.$wizard_steps.findIndex((function(e) {
1483
+ return t.$route.name.includes(e)
1484
+ })) - 1;
1485
+ this.$router.push({
1486
+ name: "".concat(this.$wizard_steps[e], "_").concat(this.$store.getters["$_settings/mailer"])
1487
+ })
1488
+ },
1489
+ showWPFormsPluginInstallFooterNotice: function(t) {
1490
+ var e = t ? "<p> ".concat(Object(c["a"])("The following plugin will be installed for free: WPForms", "mo2f-setup"), "</p>") : "";
1491
+ this.$emit("displayContentBelow", e)
1492
+ }
1493
+ },
1494
+ mounted: function() {
1495
+ if (this.showWPFormsPluginInstallFooterNotice(this.smart_contact_form && !this.contact_form_already_installed), this.email_log = this.$store.getters["$_settings/email_log_enabled"], !this.$wpms.is_pro) {
1496
+ var t = this.$store.getters["$_settings/plugin_features"];
1497
+ t.includes("email_log") && (this.email_log = !0), t.includes("manage_notifications") && (this.manage_notifications = !0), t.includes("network_settings") && (this.network_settings = !0)
1498
+ }
1499
+ }
1500
+ },
1501
+ Ot = kt,
1502
+ jt = Object(_["a"])(Ot, gt, wt, !1, null, null, null),
1503
+ St = jt.exports,
1504
+ Pt = function() {
1505
+ var t = this,
1506
+ e = t.$createElement,
1507
+ s = t._self._c || e;
1508
+ return s("div", {
1509
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-help-improve"
1510
+ }, [s("div", {
1511
+ staticClass: "mo2f-setup-setup-wizard-content-container"
1512
+ }, [s("div", {
1513
+ staticClass: "mo2f-setup-help-improve-header"
1514
+ }, [s("the-wizard-step-counter"), s("content-header", {
1515
+ attrs: {
1516
+ title: t.text_header_title,
1517
+ subtitle: t.text_header_subtitle
1518
+ }
1519
+ })], 1), s("settings-input-text", {
1520
+ attrs: {
1521
+ name: "email",
1522
+ type: "email",
1523
+ label: t.text_email_label,
1524
+ description: t.text_email_description
1525
+ },
1526
+ model: {
1527
+ value: t.email,
1528
+ callback: function(e) {
1529
+ t.email = e
1530
+ },
1531
+ expression: "email"
1532
+ }
1533
+ }), s("settings-input-checkbox", {
1534
+ attrs: {
1535
+ name: "usage_tracking",
1536
+ label: t.text_usage_tracking_label,
1537
+ description: t.text_usage_tracking_description,
1538
+ tooltip: t.text_usage_tracking_tooltip
1539
+ },
1540
+ model: {
1541
+ value: t.usage_tracking,
1542
+ callback: function(e) {
1543
+ t.usage_tracking = e
1544
+ },
1545
+ expression: "usage_tracking"
1546
+ }
1547
+ })], 1), s("div", {
1548
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
1549
+ }), s("div", {
1550
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
1551
+ }, [s("a", {
1552
+ attrs: {
1553
+ href: "#"
1554
+ },
1555
+ on: {
1556
+ click: function(e) {
1557
+ return e.preventDefault(), t.previousStep(e)
1558
+ }
1559
+ }
1560
+ }, [s("span", {
1561
+ staticClass: "text-with-arrow text-with-arrow-left"
1562
+ }, [s("inline-svg", {
1563
+ staticClass: "icon",
1564
+ attrs: {
1565
+ src: i("1fa5"),
1566
+ width: "16",
1567
+ height: "18"
1568
+ }
1569
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
1570
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
1571
+ }, [s("button", {
1572
+ staticClass: "mo2f-setup-button",
1573
+ attrs: {
1574
+ type: "button",
1575
+ name: "skip_step"
1576
+ },
1577
+ domProps: {
1578
+ textContent: t._s(t.text_skip)
1579
+ },
1580
+ on: {
1581
+ click: function(e) {
1582
+ return e.preventDefault(), t.nextStep(e)
1583
+ }
1584
+ }
1585
+ }), s("button", {
1586
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
1587
+ attrs: {
1588
+ type: "submit",
1589
+ name: "next_step"
1590
+ },
1591
+ on: {
1592
+ click: function(e) {
1593
+ return e.preventDefault(), t.handleSubmit(e)
1594
+ }
1595
+ }
1596
+ }, [s("span", {
1597
+ staticClass: "text-with-arrow text-with-arrow-right"
1598
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
1599
+ staticClass: "icon",
1600
+ attrs: {
1601
+ src: i("107e"),
1602
+ width: "16",
1603
+ height: "19"
1604
+ }
1605
+ })], 1)])])])])
1606
+ },
1607
+ Et = [],
1608
+ Tt = function() {
1609
+ var t = this,
1610
+ e = t.$createElement,
1611
+ s = t._self._c || e;
1612
+ return s("div", {
1613
+ staticClass: "settings-input-text",
1614
+ class: {
1615
+ "settings-input-text-with-copy": t.copy, "input-error": t.has_errors || t.field_error
1616
+ }
1617
+ }, [s("label", {
1618
+ staticClass: "settings-input-label-container",
1619
+ attrs: {
1620
+ for: t.id
1621
+ }
1622
+ }, [t.label ? s("span", {
1623
+ staticClass: "label",
1624
+ domProps: {
1625
+ innerHTML: t._s(t.label)
1626
+ }
1627
+ }) : t._e(), t.tooltip ? s("settings-info-tooltip", {
1628
+ attrs: {
1629
+ content: t.tooltip
1630
+ }
1631
+ }) : t._e()], 1), s("span", {
1632
+ staticClass: "settings-input-container"
1633
+ }, ["checkbox" === t.type ? s("input", {
1634
+ directives: [{
1635
+ name: "model",
1636
+ rawName: "v-model",
1637
+ value: t.currentValue,
1638
+ expression: "currentValue"
1639
+ }],
1640
+ ref: "input",
1641
+ attrs: {
1642
+ id: t.id,
1643
+ name: t.name,
1644
+ placeholder: t.placeholder,
1645
+ readonly: t.readonly,
1646
+ disabled: t.disabled,
1647
+ type: "checkbox"
1648
+ },
1649
+ domProps: {
1650
+ checked: Array.isArray(t.currentValue) ? t._i(t.currentValue, null) > -1 : t.currentValue
1651
+ },
1652
+ on: {
1653
+ change: [function(e) {
1654
+ var i = t.currentValue,
1655
+ s = e.target,
1656
+ a = !!s.checked;
1657
+ if (Array.isArray(i)) {
1658
+ var n = null,
1659
+ o = t._i(i, n);
1660
+ s.checked ? o < 0 && (t.currentValue = i.concat([n])) : o > -1 && (t.currentValue = i.slice(0, o).concat(i.slice(o + 1)))
1661
+ } else t.currentValue = a
1662
+ }, t.inputUpdate]
1663
+ }
1664
+ }) : "radio" === t.type ? s("input", {
1665
+ directives: [{
1666
+ name: "model",
1667
+ rawName: "v-model",
1668
+ value: t.currentValue,
1669
+ expression: "currentValue"
1670
+ }],
1671
+ ref: "input",
1672
+ attrs: {
1673
+ id: t.id,
1674
+ name: t.name,
1675
+ placeholder: t.placeholder,
1676
+ readonly: t.readonly,
1677
+ disabled: t.disabled,
1678
+ type: "radio"
1679
+ },
1680
+ domProps: {
1681
+ checked: t._q(t.currentValue, null)
1682
+ },
1683
+ on: {
1684
+ change: [function(e) {
1685
+ t.currentValue = null
1686
+ }, t.inputUpdate]
1687
+ }
1688
+ }) : s("input", {
1689
+ directives: [{
1690
+ name: "model",
1691
+ rawName: "v-model",
1692
+ value: t.currentValue,
1693
+ expression: "currentValue"
1694
+ }],
1695
+ ref: "input",
1696
+ attrs: {
1697
+ id: t.id,
1698
+ name: t.name,
1699
+ placeholder: t.placeholder,
1700
+ readonly: t.readonly,
1701
+ disabled: t.disabled,
1702
+ type: t.type
1703
+ },
1704
+ domProps: {
1705
+ value: t.currentValue
1706
+ },
1707
+ on: {
1708
+ change: t.inputUpdate,
1709
+ input: function(e) {
1710
+ e.target.composing || (t.currentValue = e.target.value)
1711
+ }
1712
+ }
1713
+ }), t.copy ? s("button", {
1714
+ staticClass: "mo2f-setup-button mo2f-setup-button-small",
1715
+ class: {
1716
+ "mo2f-setup-button-copied": t.show_copied
1717
+ },
1718
+ attrs: {
1719
+ title: t.text_copy_button
1720
+ },
1721
+ on: {
1722
+ click: function(e) {
1723
+ return e.preventDefault(), t.copyValue(e)
1724
+ }
1725
+ }
1726
+ }, [s("span", {
1727
+ staticClass: "copy-button-container"
1728
+ }, [s("inline-svg", {
1729
+ staticClass: "icon",
1730
+ class: {
1731
+ active: !t.show_copied
1732
+ },
1733
+ attrs: {
1734
+ src: i("d51e"),
1735
+ width: "16",
1736
+ height: "16"
1737
+ }
1738
+ }), s("inline-svg", {
1739
+ staticClass: "icon copied",
1740
+ class: {
1741
+ active: t.show_copied
1742
+ },
1743
+ attrs: {
1744
+ src: i("e108"),
1745
+ width: "16",
1746
+ height: "16"
1747
+ }
1748
+ })], 1)]) : t._e()]), t.has_errors ? s("p", {
1749
+ staticClass: "error"
1750
+ }, [s("inline-svg", {
1751
+ staticClass: "icon",
1752
+ attrs: {
1753
+ src: i("827a"),
1754
+ width: "16"
1755
+ }
1756
+ }), s("span", {
1757
+ domProps: {
1758
+ innerHTML: t._s(t.text_error)
1759
+ }
1760
+ })], 1) : t._e(), t.description ? s("p", {
1761
+ staticClass: "description",
1762
+ domProps: {
1763
+ innerHTML: t._s(t.description)
1764
+ }
1765
+ }) : t._e()])
1766
+ },
1767
+ zt = [],
1768
+ Bt = (i("4d63"), i("25f0"), i("4795"), function() {
1769
+ var t = this,
1770
+ e = t.$createElement,
1771
+ s = t._self._c || e;
1772
+ return s("span", {
1773
+ directives: [{
1774
+ name: "tooltip",
1775
+ rawName: "v-tooltip",
1776
+ value: t.tooltip_data,
1777
+ expression: "tooltip_data"
1778
+ }],
1779
+ staticClass: "mo2f-setup-info",
1780
+ attrs: {
1781
+ tabindex: "0"
1782
+ }
1783
+ }, [s("inline-svg", {
1784
+ staticClass: "icon",
1785
+ attrs: {
1786
+ src: i("8475"),
1787
+ width: "14",
1788
+ height: "14"
1789
+ }
1790
+ })], 1)
1791
+ }),
1792
+ It = [],
1793
+ Mt = {
1794
+ name: "SettingsInfoTooltip",
1795
+ props: {
1796
+ content: String
1797
+ },
1798
+ data: function() {
1799
+ return {
1800
+ tooltip_data: {
1801
+ content: this.content,
1802
+ autoHide: !1,
1803
+ trigger: "hover focus click"
1804
+ }
1805
+ }
1806
+ }
1807
+ },
1808
+ Dt = Mt,
1809
+ Ft = (i("ba75"), Object(_["a"])(Dt, Bt, It, !1, null, "74a4d2ae", null)),
1810
+ Nt = Ft.exports,
1811
+ Qt = {
1812
+ name: "SettingsInputText",
1813
+ components: {
1814
+ SettingsInfoTooltip: Nt
1815
+ },
1816
+ props: {
1817
+ name: String,
1818
+ value: String,
1819
+ label: String,
1820
+ description: String,
1821
+ placeholder: String,
1822
+ type: {
1823
+ type: String,
1824
+ default: "text"
1825
+ },
1826
+ tooltip: String,
1827
+ readonly: Boolean,
1828
+ disabled: Boolean,
1829
+ format: RegExp,
1830
+ error: {
1831
+ type: String,
1832
+ default: ""
1833
+ },
1834
+ copy: {
1835
+ type: Boolean,
1836
+ default: !1
1837
+ },
1838
+ is_error: Boolean
1839
+ },
1840
+ data: function() {
1841
+ return {
1842
+ has_error: !1,
1843
+ id: "input-" + this.name,
1844
+ text_copy_button: Object(c["a"])("Copy input value", "mo2f-setup"),
1845
+ text_copied: Object(c["a"])("Copied!", "mo2f-setup"),
1846
+ show_copied: !1
1847
+ }
1848
+ },
1849
+ computed: {
1850
+ currentValue: {
1851
+ get: function() {
1852
+ return this.value
1853
+ },
1854
+ set: function(t) {
1855
+ this.$emit("is_error_update", !1), this.$emit("input", t)
1856
+ }
1857
+ },
1858
+ field_error: {
1859
+ get: function() {
1860
+ return this.is_error
1861
+ },
1862
+ set: function(t) {
1863
+ this.$emit("is_error_update", t)
1864
+ }
1865
+ },
1866
+ has_errors: function() {
1867
+ return this.error.length > 0 || this.has_error
1868
+ },
1869
+ text_error: function() {
1870
+ return this.error.length > 0 ? this.error : Object(c["a"])("The value entered does not match the required format", "mo2f-setup")
1871
+ }
1872
+ },
1873
+ methods: {
1874
+ inputUpdate: function(t) {
1875
+ return !this.disabled && (this.has_error = !1, this.format && !this.format.test(t.target.value) ? (this.has_error = !0, !1) : void 0)
1876
+ },
1877
+ copyValue: function() {
1878
+ var t = this.$refs.input;
1879
+ t.select(), document.execCommand("copy"), this.show_copied = !0;
1880
+ var e = this;
1881
+ setTimeout((function() {
1882
+ e.show_copied = !1
1883
+ }), 1e3)
1884
+ }
1885
+ }
1886
+ },
1887
+ Lt = Qt,
1888
+ Wt = Object(_["a"])(Lt, Tt, zt, !1, null, null, null),
1889
+ Ut = Wt.exports,
1890
+ Ht = function() {
1891
+ var t = this,
1892
+ e = t.$createElement,
1893
+ s = t._self._c || e;
1894
+ return s("div", {
1895
+ staticClass: "settings-input-checkbox",
1896
+ class: {
1897
+ "settings-input-checkbox-checked": t.value, "settings-input-checkbox-disabled": t.disabled
1898
+ }
1899
+ }, [s("span", {
1900
+ staticClass: "settings-input-label-container"
1901
+ }, [s("span", {
1902
+ staticClass: "label",
1903
+ domProps: {
1904
+ innerHTML: t._s(t.label)
1905
+ }
1906
+ }), t.tooltip ? s("settings-info-tooltip", {
1907
+ attrs: {
1908
+ content: t.tooltip
1909
+ }
1910
+ }) : t._e()], 1), s("label", {
1911
+ staticClass: "settings-input-checkbox-container",
1912
+ attrs: {
1913
+ for: "mo2f-setup-settings-checkbox-" + t.name
1914
+ }
1915
+ }, [s("span", {
1916
+ staticClass: "checkbox",
1917
+ class: {
1918
+ "checkbox-checked": t.value, "checkbox-disabled": t.disabled
1919
+ }
1920
+ }, [s("inline-svg", {
1921
+ staticClass: "icon",
1922
+ attrs: {
1923
+ src: i("3af1"),
1924
+ width: "14",
1925
+ height: "14"
1926
+ }
1927
+ })], 1), s("input", {
1928
+ attrs: {
1929
+ id: "mo2f-setup-settings-checkbox-" + t.name,
1930
+ type: "checkbox",
1931
+ name: t.name,
1932
+ disabled: t.disabled
1933
+ },
1934
+ domProps: {
1935
+ checked: t.value
1936
+ },
1937
+ on: {
1938
+ input: function(e) {
1939
+ return t.$emit("input", e.target.checked)
1940
+ }
1941
+ }
1942
+ }), t.description ? s("span", {
1943
+ staticClass: "input-label",
1944
+ domProps: {
1945
+ innerHTML: t._s(t.description)
1946
+ }
1947
+ }) : t._e()])])
1948
+ },
1949
+ Rt = [],
1950
+ Gt = {
1951
+ name: "SettingsInputCheckbox",
1952
+ components: {
1953
+ SettingsInfoTooltip: Nt
1954
+ },
1955
+ props: {
1956
+ label: String,
1957
+ name: String,
1958
+ value: Boolean,
1959
+ description: String,
1960
+ tooltip: String,
1961
+ disabled: Boolean
1962
+ }
1963
+ },
1964
+ Vt = Gt,
1965
+ Yt = Object(_["a"])(Vt, Ht, Rt, !1, null, null, null),
1966
+ Jt = Yt.exports,
1967
+ Kt = {
1968
+ name: "WizardStepHelpImprove",
1969
+ components: {
1970
+ ContentHeader: h,
1971
+ TheWizardStepCounter: X,
1972
+ SettingsInputText: Ut,
1973
+ SettingsInputCheckbox: Jt
1974
+ },
1975
+ data: function() {
1976
+ return {
1977
+ text_header_title: Object(c["a"])("Help Improve WP Mail SMTP + Smart Recommendations", "mo2f-setup"),
1978
+ text_header_subtitle: Object(c["a"])("Get helpful suggestions from WP Mail SMTP on how to optimize your email deliverability and grow your business.", "mo2f-setup"),
1979
+ text_save: Object(c["a"])("Save and Continue", "mo2f-setup"),
1980
+ text_skip: Object(c["a"])("Skip this Step", "mo2f-setup"),
1981
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup"),
1982
+ text_email_label: Object(c["a"])("Your Email Address", "mo2f-setup"),
1983
+ text_email_description: Object(c["a"])("Your email is needed, so you can receive recommendations.", "mo2f-setup"),
1984
+ text_usage_tracking_label: Object(c["a"])("Help make WP Mail SMTP better for everyone", "mo2f-setup"),
1985
+ text_usage_tracking_description: Object(c["a"])("Yes, count me in", "mo2f-setup"),
1986
+ text_usage_tracking_tooltip: Object(c["a"])("By allowing us to track usage data we can better help you because we know with which WordPress configurations, themes and plugins we should test.", "mo2f-setup"),
1987
+ is_pro: this.$wpms.is_pro,
1988
+ email: "",
1989
+ usage_tracking: !1
1990
+ }
1991
+ },
1992
+ methods: {
1993
+ handleSubmit: function() {
1994
+ var t = this;
1995
+ this.$store.dispatch("$_app/start_loading");
1996
+ var e = [];
1997
+ if (this.email && e.push(this.$store.dispatch("$_settings/subscribeToNewsletter", this.email)), this.usage_tracking) {
1998
+ var i = {
1999
+ value: {
2000
+ general: {
2001
+ "usage-tracking-enabled": !0
2002
+ }
2003
+ }
2004
+ };
2005
+ e.push(this.$store.dispatch("$_settings/updateSettings", i))
2006
+ }
2007
+ Promise.all(e).then((function() {
2008
+ t.nextStep()
2009
+ })).finally((function() {
2010
+ t.$store.dispatch("$_app/stop_loading")
2011
+ }))
2012
+ },
2013
+ nextStep: function() {
2014
+ this.$next_step()
2015
+ },
2016
+ previousStep: function() {
2017
+ this.$previous_step()
2018
+ }
2019
+ }
2020
+ },
2021
+ qt = Kt,
2022
+ Zt = Object(_["a"])(qt, Pt, Et, !1, null, null, null),
2023
+ Xt = Zt.exports,
2024
+ $t = function() {
2025
+ var t = this,
2026
+ e = t.$createElement,
2027
+ s = t._self._c || e;
2028
+ return s("div", {
2029
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-step-license"
2030
+ }, [s("div", {
2031
+ staticClass: "mo2f-setup-setup-wizard-content-container"
2032
+ }, [s("div", {
2033
+ staticClass: "mo2f-setup-license-header"
2034
+ }, [s("the-wizard-step-counter"), s("content-header", {
2035
+ attrs: {
2036
+ title: t.text_header_title,
2037
+ subtitle: t.text_header_subtitle
2038
+ }
2039
+ })], 1), t.is_pro ? t._e() : s("div", {
2040
+ staticClass: "upgrade-content"
2041
+ }, [s("p", {
2042
+ staticClass: "medium-bold",
2043
+ domProps: {
2044
+ innerHTML: t._s(t.text_upgrade_paragraph)
2045
+ }
2046
+ }), s("div", {
2047
+ staticClass: "checked-item-list"
2048
+ }, [s("span", {
2049
+ staticClass: "checked-item"
2050
+ }, [s("inline-svg", {
2051
+ staticClass: "icon",
2052
+ attrs: {
2053
+ src: i("3af1"),
2054
+ width: "16",
2055
+ height: "16"
2056
+ }
2057
+ }), t._v(" "), s("span", [t._v(t._s(t.text_email_log))])], 1), s("span", {
2058
+ staticClass: "checked-item"
2059
+ }, [s("inline-svg", {
2060
+ staticClass: "icon",
2061
+ attrs: {
2062
+ src: i("3af1"),
2063
+ width: "16",
2064
+ height: "16"
2065
+ }
2066
+ }), t._v(" "), s("span", [t._v(t._s(t.text_manage_notifications))])], 1), s("span", {
2067
+ staticClass: "checked-item"
2068
+ }, [s("inline-svg", {
2069
+ staticClass: "icon",
2070
+ attrs: {
2071
+ src: i("3af1"),
2072
+ width: "16",
2073
+ height: "16"
2074
+ }
2075
+ }), t._v(" "), s("span", [t._v(t._s(t.text_network_settings))])], 1)])]), t.verified ? s("div", {
2076
+ staticClass: "verified-license"
2077
+ }, [s("p", {
2078
+ domProps: {
2079
+ innerHTML: t._s(t.text_verified_license)
2080
+ }
2081
+ })]) : s("div", {
2082
+ staticClass: "license-form",
2083
+ class: {
2084
+ "license-form-error": t.license_error
2085
+ }
2086
+ }, [s("p", {
2087
+ domProps: {
2088
+ innerHTML: t._s(t.text_license_form)
2089
+ }
2090
+ }), s("div", {
2091
+ staticClass: "license-control"
2092
+ }, [s("input", {
2093
+ directives: [{
2094
+ name: "model",
2095
+ rawName: "v-model",
2096
+ value: t.license,
2097
+ expression: "license"
2098
+ }],
2099
+ attrs: {
2100
+ name: "license",
2101
+ type: "password",
2102
+ placeholder: t.text_license_input_placeholder,
2103
+ "aria-label": t.text_aria_label_for_license_input
2104
+ },
2105
+ domProps: {
2106
+ value: t.license
2107
+ },
2108
+ on: {
2109
+ input: function(e) {
2110
+ e.target.composing || (t.license = e.target.value)
2111
+ }
2112
+ }
2113
+ }), s("button", {
2114
+ staticClass: "mo2f-setup-button mo2f-setup-button-success mo2f-setup-button-small",
2115
+ attrs: {
2116
+ type: "button"
2117
+ },
2118
+ on: {
2119
+ click: function(e) {
2120
+ return e.preventDefault(), t.handleLicenseSubmit(e)
2121
+ }
2122
+ }
2123
+ }, [t._v(" " + t._s(t.text_license_button) + " ")])]), t.license_error ? s("p", {
2124
+ staticClass: "error-message",
2125
+ domProps: {
2126
+ textContent: t._s(t.text_license_error)
2127
+ }
2128
+ }) : t._e()])]), s("div", {
2129
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
2130
+ }), s("div", {
2131
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
2132
+ }, [s("a", {
2133
+ attrs: {
2134
+ href: "#"
2135
+ },
2136
+ on: {
2137
+ click: function(e) {
2138
+ return e.preventDefault(), t.previousStep(e)
2139
+ }
2140
+ }
2141
+ }, [s("span", {
2142
+ staticClass: "text-with-arrow text-with-arrow-left"
2143
+ }, [s("inline-svg", {
2144
+ staticClass: "icon",
2145
+ attrs: {
2146
+ src: i("1fa5"),
2147
+ width: "16",
2148
+ height: "18"
2149
+ }
2150
+ }), t._v(t._s(t.text_previous_step) + " ")], 1)]), s("div", {
2151
+ staticClass: "mo2f-setup-setup-wizard-step-footer-buttons"
2152
+ }, [t.verified ? s("button", {
2153
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
2154
+ attrs: {
2155
+ type: "submit",
2156
+ name: "next_step"
2157
+ },
2158
+ on: {
2159
+ click: function(e) {
2160
+ return e.preventDefault(), t.handleSubmit(e)
2161
+ }
2162
+ }
2163
+ }, [s("span", {
2164
+ staticClass: "text-with-arrow text-with-arrow-right"
2165
+ }, [t._v(" " + t._s(t.text_save) + " "), s("inline-svg", {
2166
+ staticClass: "icon",
2167
+ attrs: {
2168
+ src: i("107e"),
2169
+ width: "16",
2170
+ height: "19"
2171
+ }
2172
+ })], 1)]) : s("button", {
2173
+ staticClass: "mo2f-setup-button",
2174
+ attrs: {
2175
+ type: "button",
2176
+ name: "skip_step"
2177
+ },
2178
+ domProps: {
2179
+ textContent: t._s(t.text_skip)
2180
+ },
2181
+ on: {
2182
+ click: function(e) {
2183
+ return e.preventDefault(), t.nextStep(e)
2184
+ }
2185
+ }
2186
+ })])])])
2187
+ },
2188
+ te = [],
2189
+ ee = (i("841c"), i("2b3d"), i("6341")),
2190
+ ie = i.n(ee),
2191
+ se = {
2192
+ name: "WizardStepLicense",
2193
+ components: {
2194
+ ContentHeader: h,
2195
+ TheWizardStepCounter: X
2196
+ },
2197
+ data: function() {
2198
+ return {
2199
+ text_header_title: Object(c["a"])("Enter your WP Mail SMTP License Key", "mo2f-setup"),
2200
+ text_header_subtitle: this.$wpms.is_pro ? "" : Object(c["c"])(Object(c["a"])("You're currently using %1$sWP Mail SMTP Lite%2$s - no license needed. Enjoy!", "mo2f-setup"), '<span class="medium-bold">', "</span>") + " 🙂",
2201
+ text_save: Object(c["a"])("Continue", "mo2f-setup"),
2202
+ text_skip: Object(c["a"])("Skip this Step", "mo2f-setup"),
2203
+ text_previous_step: Object(c["a"])("Previous Step", "mo2f-setup"),
2204
+ text_upgrade_paragraph: Object(c["c"])(Object(c["a"])("To unlock selected features, %1$sUpgrade to Pro%2$s and enter your license key below.", "mo2f-setup"), '<a href="' + this.$wpms.upgrade_link + '" target="_blank" rel="noopener noreferrer">', "</a>"),
2205
+ text_network_settings: Object(c["a"])("Multisite Network Settings", "mo2f-setup"),
2206
+ text_manage_notifications: Object(c["a"])("Manage Default Notifications", "mo2f-setup"),
2207
+ text_email_log: Object(c["a"])("Detailed Email Logs", "mo2f-setup"),
2208
+ text_license_form_lite: Object(c["c"])(Object(c["a"])("Already purchased? Enter your license key below to connect with %1$sWP Mail SMTP Pro%2$s!", "mo2f-setup"), "<b>", "</b>"),
2209
+ text_license_form_pro: Object(c["a"])("Enter your license key below to unlock plugin updates!", "mo2f-setup"),
2210
+ text_license_button: this.$wpms.is_pro ? Object(c["a"])("Verify License Key", "mo2f-setup") : Object(c["a"])("Connect", "mo2f-setup"),
2211
+ text_license_error: Object(c["a"])("The License Key format is incorrect. Please enter a valid key and try again.", "mo2f-setup"),
2212
+ text_verified_license: Object(c["a"])("Your license was successfully verified! You are ready for the next step.", "mo2f-setup"),
2213
+ text_email_log_desc: Object(c["a"])("Keep records of every email that's sent out from your website.", "mo2f-setup"),
2214
+ text_manage_notifications_desc: Object(c["a"])("Control which email notifications your WordPress site sends.", "mo2f-setup"),
2215
+ text_network_settings_desc: Object(c["a"])("Save time with powerful WordPress Multisite controls.", "mo2f-setup"),
2216
+ text_pro_badge: Object(c["a"])("Pro badge", "mo2f-setup"),
2217
+ text_aria_label_for_license_input: Object(c["a"])("License key input", "mo2f-setup"),
2218
+ text_license_input_placeholder: Object(c["a"])("Paste your license key here", "mo2f-setup"),
2219
+ pro_badge: i("87eb"),
2220
+ is_pro: this.$wpms.is_pro,
2221
+ verified: !1,
2222
+ license: "",
2223
+ license_error: !1
2224
+ }
2225
+ },
2226
+ computed: Object(n["a"])({
2227
+ text_license_form: function() {
2228
+ return this.is_pro ? this.text_license_form_pro : this.text_license_form_lite
2229
+ }
2230
+ }, Object(nt["b"])({
2231
+ selectedProFeatures: "$_settings/plugin_features"
2232
+ })),
2233
+ methods: {
2234
+ handleLicenseSubmit: function() {
2235
+ var t = this;
2236
+ return this.license_error = !1, !(!this.is_pro && 0 === this.license.length) && (this.is_pro && this.license.length < 16 ? (this.license_error = !0, !1) : (this.$store.dispatch("$_app/start_loading"), void(this.is_pro ? this.$store.dispatch("$_settings/verifyLicense", this.license).then((function(e) {
2237
+ e.success ? (t.verified = !0, t.$swal({
2238
+ title: Object(c["a"])("Successful Verification!", "mo2f-setup"),
2239
+ html: e.data.message,
2240
+ width: 450,
2241
+ showCloseButton: !0,
2242
+ customClass: {
2243
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
2244
+ }
2245
+ })) : t.$swal({
2246
+ title: Object(c["a"])("Verification Error!", "mo2f-setup"),
2247
+ html: e.data,
2248
+ width: 450,
2249
+ showCloseButton: !0,
2250
+ customClass: {
2251
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
2252
+ }
2253
+ })
2254
+ })).finally((function() {
2255
+ t.$store.dispatch("$_app/stop_loading")
2256
+ })) : this.$store.dispatch("$_settings/upgradePlugin", this.license).then((function(e) {
2257
+ if (e.success && ie()(e, "data.redirect_url")) return window.location = e.data.redirect_url;
2258
+ t.$store.dispatch("$_app/stop_loading"), t.$swal({
2259
+ title: e.success ? Object(c["a"])("Successful Upgrade!", "mo2f-setup") : Object(c["a"])("Upgrade Failed!", "mo2f-setup"),
2260
+ html: e.data,
2261
+ width: 450,
2262
+ showCloseButton: !0,
2263
+ customClass: {
2264
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
2265
+ }
2266
+ })
2267
+ })))))
2268
+ },
2269
+ handleSubmit: function() {
2270
+ this.nextStep()
2271
+ },
2272
+ nextStep: function() {
2273
+ this.$next_step()
2274
+ },
2275
+ previousStep: function() {
2276
+ this.$previous_step()
2277
+ },
2278
+ prepareLongCheckbox: function(t, e) {
2279
+ return '<label for="email_log" class="settings-input-long-checkbox settings-input-long-checkbox-checked settings-input-long-checkbox-disabled">\n\t\t\t\t\t\t<div class="settings-input-long-checkbox-header">\n\t\t\t\t\t\t\t<span class="title-container">\n\t\t\t\t\t\t\t\t<span class="label">\n\t\t\t\t\t\t\t\t\t'.concat(t, '\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<img src="').concat(this.pro_badge, '" alt="').concat(this.text_pro_badge, '" class="mo2f-setup-pro-badge">\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<p class="description">\n\t\t\t\t\t\t\t\t').concat(e, '\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span class="settings-input-long-checkbox-container">\n\t\t\t\t\t\t\t<span class="checkbox checkbox-checked checkbox-disabled">\n\t\t\t\t\t\t\t\t<svg viewBox="0 0 512 512" role="img" class="icon" data-icon="check" data-prefix="fas" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16"><path xmlns="http://www.w3.org/2000/svg" fill="currentColor" d="M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"></path></svg>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<input id="email_log" type="checkbox" name="email_log" disabled="disabled">\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>')
2280
+ },
2281
+ prepareProFeaturesHtml: function() {
2282
+ var t = "<div>";
2283
+ return this.selectedProFeatures.includes("email_log") && (t += this.prepareLongCheckbox(this.text_email_log, this.text_email_log_desc)), this.selectedProFeatures.includes("manage_notifications") && (t += this.prepareLongCheckbox(this.text_manage_notifications, this.text_manage_notifications_desc)), this.selectedProFeatures.includes("network_settings") && (t += this.prepareLongCheckbox(this.text_network_settings, this.text_network_settings_desc)), t + "</div>"
2284
+ }
2285
+ },
2286
+ mounted: function() {
2287
+ var t = this;
2288
+ if (!this.is_pro && this.selectedProFeatures.length > 0) {
2289
+ var e = this.prepareProFeaturesHtml();
2290
+ this.$swal({
2291
+ title: Object(c["a"])("Would you like to purchase the following features now?", "mo2f-setup"),
2292
+ html: '<p class="subtitle">'.concat(Object(c["a"])("These features are available as part of WP Mail SMTP Pro plan.", "mo2f-setup"), "</p>\n\t\t\t\t\t\t").concat(e, '\n\t\t\t\t\t\t<p class="bonus">').concat(Object(c["c"])(Object(c["a"])("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.", "mo2f-setup"), "<b>", "</b>", '<span class="medium-bold">', "</span>", "$50"), "</p>\n\t\t\t\t\t"),
2293
+ width: 850,
2294
+ showCloseButton: !0,
2295
+ allowOutsideClick: !1,
2296
+ allowEscapeKey: !1,
2297
+ allowEnterKey: !1,
2298
+ customClass: {
2299
+ container: "mo2f-setup-swal mo2f-setup-swal-plugin-upgrade"
2300
+ },
2301
+ confirmButtonText: Object(c["a"])("Purchase Now", "mo2f-setup"),
2302
+ cancelButtonText: Object(c["a"])("I'll do it later", "mo2f-setup"),
2303
+ showCancelButton: !0,
2304
+ reverseButtons: !0
2305
+ }).then((function(e) {
2306
+ if (e.value) {
2307
+ var i = window.open(t.$wpms.upgrade_link, "_blank");
2308
+ i.focus()
2309
+ }
2310
+ }))
2311
+ }
2312
+ this.verified = this.$wpms.license_exists
2313
+ },
2314
+ created: function() {
2315
+ var t = new URLSearchParams(window.location.search);
2316
+ this.$wpms.license_exists && !t.has("upgrade-redirect") && this.nextStep()
2317
+ }
2318
+ },
2319
+ ae = se,
2320
+ ne = Object(_["a"])(ae, $t, te, !1, null, null, null),
2321
+ oe = ne.exports,
2322
+ re = function() {
2323
+ var t = this,
2324
+ e = t.$createElement,
2325
+ s = t._self._c || e;
2326
+ return s("div", {
2327
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-check-configuration"
2328
+ }, [s("div", {
2329
+ staticClass: "mo2f-setup-setup-wizard-content-container"
2330
+ }, [s("div", {
2331
+ staticClass: "mo2f-setup-check-configuration-header"
2332
+ }, [s("content-header", {
2333
+ attrs: {
2334
+ title: t.text_header_title,
2335
+ subtitle: t.text_header_subtitle
2336
+ }
2337
+ })], 1), s("div", {
2338
+ staticClass: "check-configuration-loading-image-container"
2339
+ }, [s("img", {
2340
+ attrs: {
2341
+ src: i("8398"),
2342
+ alt: t.text_image_alt
2343
+ }
2344
+ })])])])
2345
+ },
2346
+ le = [],
2347
+ ce = {
2348
+ name: "WizardStepCheckConfiguration",
2349
+ components: {
2350
+ ContentHeader: h
2351
+ },
2352
+ data: function() {
2353
+ return {
2354
+ text_header_title: Object(c["a"])("Checking Mailer Configuration", "mo2f-setup"),
2355
+ text_header_subtitle: Object(c["a"])("We're running some tests in the background to make sure everything is set up properly.", "mo2f-setup"),
2356
+ text_image_alt: Object(c["a"])("Checking mailer configuration image", "mo2f-setup")
2357
+ }
2358
+ },
2359
+ mounted: function() {
2360
+ var t = this;
2361
+ this.$store.dispatch("$_wizard/checkMailerConfiguration").then((function(e) {
2362
+ e.success ? t.$router.push({
2363
+ name: "check_configuration_step_success"
2364
+ }) : t.$router.push({
2365
+ name: "check_configuration_step_failure"
2366
+ })
2367
+ }))
2368
+ }
2369
+ },
2370
+ pe = ce,
2371
+ me = Object(_["a"])(pe, re, le, !1, null, null, null),
2372
+ ue = me.exports,
2373
+ de = function() {
2374
+ var t = this,
2375
+ e = t.$createElement,
2376
+ s = t._self._c || e;
2377
+ return s("div", {
2378
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-configuration-success"
2379
+ }, [s("div", {
2380
+ staticClass: "mo2f-setup-setup-wizard-content-container"
2381
+ }, [s("div", {
2382
+ staticClass: "mo2f-setup-configuration-success-header"
2383
+ }, [s("the-wizard-step-counter"), s("content-header", {
2384
+ attrs: {
2385
+ title: t.text_header_title,
2386
+ subtitle: t.text_header_subtitle
2387
+ }
2388
+ })], 1), s("div", {
2389
+ staticClass: "plugin-item-container"
2390
+ }, [s("p", {
2391
+ staticClass: "medium-bold",
2392
+ domProps: {
2393
+ textContent: t._s(t.text_free_plugins_header)
2394
+ }
2395
+ }), s("div", t._l(t.plugins, (function(t, e) {
2396
+ return s("plugin-item", {
2397
+ key: e,
2398
+ attrs: {
2399
+ name: t.name,
2400
+ slug: t.slug,
2401
+ is_installed: t.is_installed,
2402
+ is_activated: t.is_activated
2403
+ }
2404
+ })
2405
+ })), 1)]), t.is_pro ? t._e() : s("div", {
2406
+ staticClass: "upgrade-banner-container"
2407
+ }, [s("div", {
2408
+ staticClass: "upgrade-banner"
2409
+ }, [s("h2", {
2410
+ domProps: {
2411
+ textContent: t._s(t.text_upgrade_title)
2412
+ }
2413
+ }), s("p", {
2414
+ staticClass: "subtitle",
2415
+ domProps: {
2416
+ textContent: t._s(t.text_upgrade_subtitle)
2417
+ }
2418
+ }), s("div", {
2419
+ staticClass: "checked-item-list"
2420
+ }, [s("span", {
2421
+ staticClass: "checked-item"
2422
+ }, [s("inline-svg", {
2423
+ staticClass: "icon",
2424
+ attrs: {
2425
+ src: i("3af1"),
2426
+ width: "16",
2427
+ height: "16"
2428
+ }
2429
+ }), t._v(" "), s("span", [t._v(t._s(t.text_email_log))])], 1), s("span", {
2430
+ staticClass: "checked-item"
2431
+ }, [s("inline-svg", {
2432
+ staticClass: "icon",
2433
+ attrs: {
2434
+ src: i("3af1"),
2435
+ width: "16",
2436
+ height: "16"
2437
+ }
2438
+ }), t._v(" "), s("span", [t._v(t._s(t.text_manage_notifications))])], 1), s("span", {
2439
+ staticClass: "checked-item"
2440
+ }, [s("inline-svg", {
2441
+ staticClass: "icon",
2442
+ attrs: {
2443
+ src: i("3af1"),
2444
+ width: "16",
2445
+ height: "16"
2446
+ }
2447
+ }), t._v(" "), s("span", [t._v(t._s(t.text_network_settings))])], 1)]), s("button", {
2448
+ staticClass: "mo2f-setup-button mo2f-setup-button-success",
2449
+ attrs: {
2450
+ type: "button"
2451
+ },
2452
+ domProps: {
2453
+ textContent: t._s(t.text_upgrade_button)
2454
+ },
2455
+ on: {
2456
+ click: t.openUpgradePage
2457
+ }
2458
+ })]), s("p", {
2459
+ staticClass: "bonus",
2460
+ domProps: {
2461
+ innerHTML: t._s(t.text_bonus)
2462
+ }
2463
+ })])]), s("div", {
2464
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
2465
+ }), s("div", {
2466
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
2467
+ }, [s("button", {
2468
+ staticClass: "mo2f-setup-button",
2469
+ attrs: {
2470
+ type: "button",
2471
+ name: "send_test_email"
2472
+ },
2473
+ domProps: {
2474
+ textContent: t._s(t.text_test_email)
2475
+ },
2476
+ on: {
2477
+ click: function(e) {
2478
+ return e.preventDefault(), t.handleTestEmail(e)
2479
+ }
2480
+ }
2481
+ }), s("button", {
2482
+ staticClass: "mo2f-setup-button",
2483
+ attrs: {
2484
+ type: "button",
2485
+ name: "send_feedback"
2486
+ },
2487
+ domProps: {
2488
+ textContent: t._s(t.text_send_feedback)
2489
+ },
2490
+ on: {
2491
+ click: function(e) {
2492
+ return e.preventDefault(), t.handleFeedback(e)
2493
+ }
2494
+ }
2495
+ }), s("button", {
2496
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
2497
+ attrs: {
2498
+ type: "button",
2499
+ name: "finish_setup"
2500
+ },
2501
+ domProps: {
2502
+ textContent: t._s(t.text_finish)
2503
+ },
2504
+ on: {
2505
+ click: function(e) {
2506
+ return e.preventDefault(), t.handleFinish(e)
2507
+ }
2508
+ }
2509
+ })])])
2510
+ },
2511
+ _e = [],
2512
+ fe = function() {
2513
+ var t = this,
2514
+ e = t.$createElement,
2515
+ i = t._self._c || e;
2516
+ return i("div", {
2517
+ class: "mo2f-setup-plugin-item mo2f-setup-plugin-" + t.slug
2518
+ }, [i("span", {
2519
+ staticClass: "mo2f-setup-plugin-item-title-container"
2520
+ }, [t.logo.length ? i("img", {
2521
+ staticClass: "mo2f-setup-logo-icon",
2522
+ attrs: {
2523
+ src: t.logo2x,
2524
+ srcset: t.logo_srcset,
2525
+ alt: t.name
2526
+ }
2527
+ }) : t._e(), i("span", {
2528
+ domProps: {
2529
+ textContent: t._s(t.name)
2530
+ }
2531
+ })]), i("button", {
2532
+ staticClass: "mo2f-setup-button",
2533
+ attrs: {
2534
+ type: "button",
2535
+ disabled: t.is_activated || t.is_installed
2536
+ },
2537
+ on: {
2538
+ click: function(e) {
2539
+ return e.preventDefault(), t.handleClick(e)
2540
+ }
2541
+ }
2542
+ }, [t.loading ? i("loader", {
2543
+ attrs: {
2544
+ color: "white"
2545
+ }
2546
+ }) : i("span", [t._v(" " + t._s(t.text_button_label) + " ")])], 1)])
2547
+ },
2548
+ he = [],
2549
+ ge = function() {
2550
+ var t = this,
2551
+ e = t.$createElement,
2552
+ i = t._self._c || e;
2553
+ return i("img", {
2554
+ class: "mo2f-setup-loader mo2f-setup-loader-" + t.size,
2555
+ attrs: {
2556
+ src: t.image,
2557
+ alt: t.text_loading
2558
+ }
2559
+ })
2560
+ },
2561
+ we = [],
2562
+ be = {
2563
+ name: "Loader",
2564
+ props: {
2565
+ color: {
2566
+ type: String,
2567
+ default: ""
2568
+ },
2569
+ size: {
2570
+ type: String,
2571
+ default: "sm"
2572
+ }
2573
+ },
2574
+ data: function() {
2575
+ return {
2576
+ image: i("5711")("./loading".concat(this.color.length ? "-" + this.color : "", ".svg")),
2577
+ text_loading: Object(c["a"])("Loading", "mo2f-setup")
2578
+ }
2579
+ }
2580
+ },
2581
+ Ae = be,
2582
+ ve = Object(_["a"])(Ae, ge, we, !1, null, null, null),
2583
+ xe = ve.exports,
2584
+ ye = {
2585
+ name: "PluginItem",
2586
+ components: {
2587
+ Loader: xe
2588
+ },
2589
+ props: {
2590
+ slug: String,
2591
+ name: String,
2592
+ is_installed: Boolean,
2593
+ is_activated: Boolean
2594
+ },
2595
+ data: function() {
2596
+ return {
2597
+ loading: !1,
2598
+ logo: i("bbc2")("./".concat(this.slug, ".png")),
2599
+ logo2x: i("7c9b")("./".concat(this.slug, "@2x.png"))
2600
+ }
2601
+ },
2602
+ computed: {
2603
+ text_button_label: function() {
2604
+ var t = Object(c["a"])("Install", "mo2f-setup");
2605
+ return this.is_installed && !this.is_activated && (t = Object(c["a"])("Installed", "mo2f-setup")), this.is_activated && (t = Object(c["a"])("Activated", "mo2f-setup")), t
2606
+ },
2607
+ logo_srcset: function() {
2608
+ return "".concat(this.logo, ", ").concat(this.logo2x, " 2x")
2609
+ }
2610
+ },
2611
+ methods: {
2612
+ handleClick: function() {
2613
+ var t = this;
2614
+ this.loading || (this.loading = !0, this.$store.dispatch("$_plugins/installPlugin", this.slug).then((function(e) {
2615
+ e.success && t.$wpms_success_toast({
2616
+ title: "Plugin: ".concat(t.name, " installed!")
2617
+ }), t.loading = !1
2618
+ })))
2619
+ }
2620
+ }
2621
+ },
2622
+ Ce = ye,
2623
+ ke = (i("f8b1"), Object(_["a"])(Ce, fe, he, !1, null, "6b0d8118", null)),
2624
+ Oe = ke.exports,
2625
+ je = {
2626
+ name: "WizardStepConfigurationSuccess",
2627
+ components: {
2628
+ ContentHeader: h,
2629
+ TheWizardStepCounter: X,
2630
+ PluginItem: Oe
2631
+ },
2632
+ data: function() {
2633
+ return {
2634
+ text_header_title: Object(c["a"])("Congrats, you’ve successfully set up WP Mail SMTP!", "mo2f-setup"),
2635
+ text_header_subtitle: Object(c["a"])("Here’s what to do next:", "mo2f-setup"),
2636
+ text_free_plugins_header: Object(c["a"])("Check out our other free WordPress plugins:", "mo2f-setup"),
2637
+ text_upgrade_title: Object(c["a"])("Upgrade to Unlock Powerful SMTP Features", "mo2f-setup"),
2638
+ text_upgrade_subtitle: Object(c["a"])("Upgrade to WP Mail SMTP Pro to unlock more awesome features and experience why WP Mail SMTP is used by over 2,000,000 websites.", "mo2f-setup"),
2639
+ text_network_settings: Object(c["a"])("Multisite Network Settings", "mo2f-setup"),
2640
+ text_manage_notifications: Object(c["a"])("Manage Default Notifications", "mo2f-setup"),
2641
+ text_email_log: Object(c["a"])("Detailed Email Logs", "mo2f-setup"),
2642
+ text_upgrade_button: Object(c["a"])("Upgrade to Pro Today", "mo2f-setup"),
2643
+ text_test_email: Object(c["a"])("Send a Test Email", "mo2f-setup"),
2644
+ text_send_feedback: Object(c["a"])("Send us Feedback", "mo2f-setup"),
2645
+ text_finish: Object(c["a"])("Finish Setup", "mo2f-setup"),
2646
+ text_bonus: Object(c["c"])(Object(c["a"])("%1$sBonus:%2$s You can upgrade to the Pro plan and %3$ssave %5$s today%4$s, automatically applied at checkout.", "mo2f-setup"), "<b>", "</b>", '<span class="medium-bold">', "</span>", "$50"),
2647
+ star_image_html: '<img src="'.concat(i("6f43"), '" alt="').concat(Object(c["a"])("Star icon", "mo2f-setup"), '" class="icon" / >'),
2648
+ is_pro: this.$wpms.is_pro
2649
+ }
2650
+ },
2651
+ computed: Object(n["a"])({}, Object(nt["b"])({
2652
+ plugins: "$_plugins/partner_plugins"
2653
+ })),
2654
+ methods: {
2655
+ handleTestEmail: function() {
2656
+ return window.location = this.$wpms.email_test_tab_url
2657
+ },
2658
+ goodFeedback: function() {
2659
+ this.$swal({
2660
+ title: Object(c["a"])("Thanks for the feedback!", "mo2f-setup"),
2661
+ html: "".concat(Object(c["c"])(Object(c["a"])("Help us spread the word %1$sby giving WP Mail SMTP a 5-star rating %3$s(%4$s) on WordPress.org%2$s. Thanks for your support and we look forward to bringing you more awesome features.", "mo2f-setup"), '<span class="medium-bold">', "</span>", "<br>", this.star_image_html + "" + this.star_image_html + this.star_image_html + this.star_image_html + this.star_image_html)),
2662
+ width: 650,
2663
+ showCloseButton: !0,
2664
+ allowEnterKey: !1,
2665
+ confirmButtonText: Object(c["a"])("Rate on WordPress.org", "mo2f-setup"),
2666
+ customClass: {
2667
+ container: "mo2f-setup-swal mo2f-setup-swal-feedback-good"
2668
+ }
2669
+ }).then((function(t) {
2670
+ if (t.value) {
2671
+ var e = window.open("https://wordpress.org/support/plugin/mo2f-setup/reviews/#new-post", "_blank");
2672
+ e.focus()
2673
+ }
2674
+ }))
2675
+ },
2676
+ badFeedback: function() {
2677
+ var t = this;
2678
+ this.$swal({
2679
+ title: Object(c["a"])("What could we do to improve?", "mo2f-setup"),
2680
+ html: "".concat(Object(c["a"])("We're sorry things didn't go smoothly for you, and want to keep improving. Please let us know any specific parts of this process that you think could be better. We really appreciate any details you're willing to share!", "mo2f-setup"), '\n\t\t\t\t\t\t\t\t<textarea id="feedback" name="feedback" rows="9"></textarea>\n\t\t\t\t\t\t\t\t<span class="permission-container">\n\t\t\t\t\t\t\t\t\t<input type="checkbox" id="permission" name="permission">\n\t\t\t\t\t\t\t\t\t<label for="permission">').concat(Object(c["a"])("Yes, I give WP Mail SMTP permission to contact me for any follow up questions.", "mo2f-setup"), "</label>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t"),
2681
+ width: 650,
2682
+ showCloseButton: !0,
2683
+ allowEnterKey: !1,
2684
+ allowOutsideClick: !1,
2685
+ allowEscapeKey: !1,
2686
+ confirmButtonText: Object(c["a"])("Submit Feedback", "mo2f-setup"),
2687
+ customClass: {
2688
+ container: "mo2f-setup-swal mo2f-setup-swal-feedback-bad"
2689
+ },
2690
+ preConfirm: function() {
2691
+ return [document.getElementById("feedback").value, document.getElementById("permission").checked]
2692
+ }
2693
+ }).then((function(e) {
2694
+ if (e.value) {
2695
+ var i = e.value[0],
2696
+ s = e.value[1];
2697
+ t.$store.dispatch("$_wizard/sendFeedback", {
2698
+ feedback: i,
2699
+ permission: s
2700
+ })
2701
+ }
2702
+ }))
2703
+ },
2704
+ handleFeedback: function() {
2705
+ var t = this;
2706
+ this.$swal({
2707
+ title: Object(c["a"])("How was your WP Mail SMTP setup experience?", "mo2f-setup"),
2708
+ text: Object(c["a"])("Our goal is to make your SMTP setup as simple and straightforward as possible. We'd love to know how this process went for you!", "mo2f-setup"),
2709
+ width: 650,
2710
+ showCloseButton: !0,
2711
+ allowEnterKey: !1,
2712
+ customClass: {
2713
+ container: "mo2f-setup-swal mo2f-setup-swal-feedback"
2714
+ },
2715
+ showCancelButton: !0
2716
+ }).then((function(e) {
2717
+ e.value ? t.goodFeedback() : void 0 !== e.dismiss && "cancel" === e.dismiss && t.badFeedback()
2718
+ }))
2719
+ },
2720
+ handleFinish: function() {
2721
+ return window.location = this.$wpms.exit_url
2722
+ },
2723
+ openUpgradePage: function() {
2724
+ var t = window.open(this.$wpms.upgrade_link, "_blank");
2725
+ t.focus()
2726
+ }
2727
+ }
2728
+ },
2729
+ Se = je,
2730
+ Pe = Object(_["a"])(Se, de, _e, !1, null, null, null),
2731
+ Ee = Pe.exports,
2732
+ Te = function() {
2733
+ var t = this,
2734
+ e = t.$createElement,
2735
+ s = t._self._c || e;
2736
+ return s("div", {
2737
+ staticClass: "mo2f-setup-setup-wizard-step mo2f-setup-setup-wizard-configuration-failure"
2738
+ }, [s("div", {
2739
+ staticClass: "mo2f-setup-setup-wizard-content-container"
2740
+ }, [s("div", {
2741
+ staticClass: "mo2f-setup-configuration-failure-header"
2742
+ }, [s("the-wizard-step-counter"), s("content-header", {
2743
+ attrs: {
2744
+ title: t.text_header_title,
2745
+ subtitle: t.text_header_subtitle
2746
+ }
2747
+ })], 1), s("div", {
2748
+ staticClass: "start-troubleshooting-arrow-container"
2749
+ }, [s("inline-svg", {
2750
+ staticClass: "icon",
2751
+ attrs: {
2752
+ src: i("50bf"),
2753
+ width: "112",
2754
+ height: "112"
2755
+ }
2756
+ })], 1)]), s("div", {
2757
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-no-margin"
2758
+ }), s("div", {
2759
+ staticClass: "mo2f-setup-setup-wizard-step-footer"
2760
+ }, [s("button", {
2761
+ staticClass: "mo2f-setup-button mo2f-setup-button-main",
2762
+ attrs: {
2763
+ type: "button",
2764
+ name: "start_troubleshooting"
2765
+ },
2766
+ domProps: {
2767
+ textContent: t._s(t.text_start_troubleshooting)
2768
+ },
2769
+ on: {
2770
+ click: function(e) {
2771
+ return e.preventDefault(), t.handleTroubleshooting(e)
2772
+ }
2773
+ }
2774
+ }), s("button", {
2775
+ staticClass: "mo2f-setup-button",
2776
+ attrs: {
2777
+ type: "button",
2778
+ name: "finish_setup"
2779
+ },
2780
+ domProps: {
2781
+ textContent: t._s(t.text_finish)
2782
+ },
2783
+ on: {
2784
+ click: function(e) {
2785
+ return e.preventDefault(), t.handleFinish(e)
2786
+ }
2787
+ }
2788
+ })])])
2789
+ },
2790
+ ze = [],
2791
+ Be = {
2792
+ name: "WizardStepConfigurationFailure",
2793
+ components: {
2794
+ ContentHeader: h,
2795
+ TheWizardStepCounter: X
2796
+ },
2797
+ data: function() {
2798
+ return {
2799
+ text_header_title: Object(c["a"])("Whoops, looks like things aren’t configured properly.", "mo2f-setup"),
2800
+ text_header_subtitle: Object(c["a"])("We just tried to send a test email, but something prevented that from working. To see more details about the issue we detected, as well as our suggestions to fix it, please start troubleshooting.", "mo2f-setup"),
2801
+ text_start_troubleshooting: Object(c["a"])("Start Troubleshooting", "mo2f-setup"),
2802
+ text_send_feedback: Object(c["a"])("Send us Feedback", "mo2f-setup"),
2803
+ text_finish: Object(c["a"])("Finish Setup", "mo2f-setup")
2804
+ }
2805
+ },
2806
+ methods: {
2807
+ handleTroubleshooting: function() {
2808
+ return window.location = "".concat(this.$wpms.email_test_tab_url, "&auto-start=1")
2809
+ },
2810
+ handleFinish: function() {
2811
+ return window.location = this.$wpms.exit_url
2812
+ }
2813
+ }
2814
+ },
2815
+ Ie = Be,
2816
+ Me = Object(_["a"])(Ie, Te, ze, !1, null, null, null),
2817
+ De = Me.exports,
2818
+ Fe = function() {
2819
+ var t = this,
2820
+ e = t.$createElement,
2821
+ i = t._self._c || e;
2822
+ return i("div", {
2823
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-smtp"
2824
+ }, [i("p", {
2825
+ staticClass: "mailer-description",
2826
+ domProps: {
2827
+ innerHTML: t._s(t.description)
2828
+ }
2829
+ }), i("div", {
2830
+ staticClass: "mo2f-setup-setup-wizard-form"
2831
+ }, [i("settings-input-text", {
2832
+ attrs: {
2833
+ name: "host",
2834
+ label: t.text_host_label,
2835
+ is_error: t.field_errors.includes("host")
2836
+ },
2837
+ on: {
2838
+ is_error_update: function(e) {
2839
+ return t.removeFieldError("host")
2840
+ }
2841
+ },
2842
+ model: {
2843
+ value: t.host,
2844
+ callback: function(e) {
2845
+ t.host = e
2846
+ },
2847
+ expression: "host"
2848
+ }
2849
+ }), i("settings-input-radio", {
2850
+ attrs: {
2851
+ name: "encryption",
2852
+ label: t.text_encryption_label,
2853
+ options: t.encryptionOptions,
2854
+ description: t.text_encryption_description
2855
+ },
2856
+ on: {
2857
+ input: t.encryptionChanged
2858
+ },
2859
+ model: {
2860
+ value: t.encryption,
2861
+ callback: function(e) {
2862
+ t.encryption = e
2863
+ },
2864
+ expression: "encryption"
2865
+ }
2866
+ }), i("settings-input-number", {
2867
+ attrs: {
2868
+ name: "port",
2869
+ label: t.text_port_label,
2870
+ is_error: t.field_errors.includes("port")
2871
+ },
2872
+ on: {
2873
+ is_error_update: function(e) {
2874
+ return t.removeFieldError("port")
2875
+ }
2876
+ },
2877
+ model: {
2878
+ value: t.port,
2879
+ callback: function(e) {
2880
+ t.port = e
2881
+ },
2882
+ expression: "port"
2883
+ }
2884
+ }), i("settings-input-switch", {
2885
+ directives: [{
2886
+ name: "show",
2887
+ rawName: "v-show",
2888
+ value: t.show_autotls,
2889
+ expression: "show_autotls"
2890
+ }],
2891
+ attrs: {
2892
+ name: "autotls",
2893
+ title: t.text_autotls_title,
2894
+ label: t.text_autotls_label,
2895
+ description: t.text_autotls_description
2896
+ },
2897
+ model: {
2898
+ value: t.autotls,
2899
+ callback: function(e) {
2900
+ t.autotls = e
2901
+ },
2902
+ expression: "autotls"
2903
+ }
2904
+ }), i("div", {
2905
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
2906
+ }), i("settings-input-switch", {
2907
+ attrs: {
2908
+ name: "auth",
2909
+ title: t.text_auth_title,
2910
+ label: t.text_auth_label
2911
+ },
2912
+ model: {
2913
+ value: t.auth,
2914
+ callback: function(e) {
2915
+ t.auth = e
2916
+ },
2917
+ expression: "auth"
2918
+ }
2919
+ }), i("settings-input-text", {
2920
+ directives: [{
2921
+ name: "show",
2922
+ rawName: "v-show",
2923
+ value: t.auth,
2924
+ expression: "auth"
2925
+ }],
2926
+ attrs: {
2927
+ name: "user",
2928
+ label: t.text_user_label,
2929
+ is_error: t.field_errors.includes("user")
2930
+ },
2931
+ on: {
2932
+ is_error_update: function(e) {
2933
+ return t.removeFieldError("user")
2934
+ }
2935
+ },
2936
+ model: {
2937
+ value: t.user,
2938
+ callback: function(e) {
2939
+ t.user = e
2940
+ },
2941
+ expression: "user"
2942
+ }
2943
+ }), i("settings-input-text", {
2944
+ directives: [{
2945
+ name: "show",
2946
+ rawName: "v-show",
2947
+ value: t.auth,
2948
+ expression: "auth"
2949
+ }],
2950
+ attrs: {
2951
+ name: "pass",
2952
+ type: "password",
2953
+ label: t.text_pass_label,
2954
+ is_error: t.field_errors.includes("pass")
2955
+ },
2956
+ on: {
2957
+ is_error_update: function(e) {
2958
+ return t.removeFieldError("pass")
2959
+ }
2960
+ },
2961
+ model: {
2962
+ value: t.pass,
2963
+ callback: function(e) {
2964
+ t.pass = e
2965
+ },
2966
+ expression: "pass"
2967
+ }
2968
+ }), i("div", {
2969
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
2970
+ }), i("settings-input-text", {
2971
+ attrs: {
2972
+ name: "from_name",
2973
+ label: t.text_from_name_label,
2974
+ description: t.text_from_name_description
2975
+ },
2976
+ model: {
2977
+ value: t.from_name,
2978
+ callback: function(e) {
2979
+ t.from_name = e
2980
+ },
2981
+ expression: "from_name"
2982
+ }
2983
+ }), i("settings-input-switch", {
2984
+ attrs: {
2985
+ classname: "sub_setting",
2986
+ name: "from_name_force",
2987
+ title: t.text_force_from_name_title,
2988
+ label: t.text_force_from_name_label
2989
+ },
2990
+ model: {
2991
+ value: t.from_name_force,
2992
+ callback: function(e) {
2993
+ t.from_name_force = e
2994
+ },
2995
+ expression: "from_name_force"
2996
+ }
2997
+ }), i("settings-input-text", {
2998
+ attrs: {
2999
+ name: "from_email",
3000
+ type: "email",
3001
+ label: t.text_from_email_label,
3002
+ description: t.text_from_email_description,
3003
+ is_error: t.field_errors.includes("from_email")
3004
+ },
3005
+ on: {
3006
+ is_error_update: function(e) {
3007
+ return t.removeFieldError("from_email")
3008
+ }
3009
+ },
3010
+ model: {
3011
+ value: t.from_email,
3012
+ callback: function(e) {
3013
+ t.from_email = e
3014
+ },
3015
+ expression: "from_email"
3016
+ }
3017
+ }), i("settings-input-switch", {
3018
+ attrs: {
3019
+ classname: "sub_setting",
3020
+ name: "from_email_force",
3021
+ title: t.text_force_from_email_title,
3022
+ label: t.text_force_from_email_label
3023
+ },
3024
+ model: {
3025
+ value: t.from_email_force,
3026
+ callback: function(e) {
3027
+ t.from_email_force = e
3028
+ },
3029
+ expression: "from_email_force"
3030
+ }
3031
+ })], 1)])
3032
+ },
3033
+ Ne = [],
3034
+ Qe = (i("a4d3"), i("e01a"), function() {
3035
+ var t = this,
3036
+ e = t.$createElement,
3037
+ i = t._self._c || e;
3038
+ return i("div", {
3039
+ staticClass: "settings-input-radio"
3040
+ }, [t.label ? i("span", {
3041
+ staticClass: "settings-input-label-container"
3042
+ }, [i("span", {
3043
+ staticClass: "label",
3044
+ domProps: {
3045
+ innerHTML: t._s(t.label)
3046
+ }
3047
+ })]) : t._e(), i("div", {
3048
+ staticClass: "settings-input-radio-container"
3049
+ }, t._l(t.options, (function(e) {
3050
+ return i("label", {
3051
+ key: e.value,
3052
+ class: t.labelClass(e.value),
3053
+ attrs: {
3054
+ for: "mo2f-setup-settings-radio-" + t.name + "[" + e.value + "]"
3055
+ }
3056
+ }, [i("span", {
3057
+ class: t.titleClass(e.value)
3058
+ }), i("input", {
3059
+ directives: [{
3060
+ name: "model",
3061
+ rawName: "v-model",
3062
+ value: t.selected,
3063
+ expression: "selected"
3064
+ }],
3065
+ attrs: {
3066
+ id: "mo2f-setup-settings-radio-" + t.name + "[" + e.value + "]",
3067
+ type: "radio",
3068
+ name: t.name,
3069
+ autocomplete: "off",
3070
+ readonly: t.disabled
3071
+ },
3072
+ domProps: {
3073
+ value: e.value,
3074
+ checked: t.isChecked(e.value),
3075
+ checked: t._q(t.selected, e.value)
3076
+ },
3077
+ on: {
3078
+ change: [function(i) {
3079
+ t.selected = e.value
3080
+ }, t.updateSetting]
3081
+ }
3082
+ }), i("span", {
3083
+ staticClass: "input-label",
3084
+ domProps: {
3085
+ innerHTML: t._s(e.label)
3086
+ }
3087
+ })])
3088
+ })), 0), t.description ? i("p", {
3089
+ staticClass: "description",
3090
+ domProps: {
3091
+ innerHTML: t._s(t.description)
3092
+ }
3093
+ }) : t._e()])
3094
+ }),
3095
+ Le = [],
3096
+ We = {
3097
+ name: "SettingsInputRadio",
3098
+ props: {
3099
+ options: Array,
3100
+ label: String,
3101
+ name: String,
3102
+ value: String,
3103
+ description: String,
3104
+ disabled: Boolean
3105
+ },
3106
+ data: function() {
3107
+ return {
3108
+ has_error: !1
3109
+ }
3110
+ },
3111
+ computed: {
3112
+ selected: {
3113
+ get: function() {
3114
+ return this.value
3115
+ },
3116
+ set: function(t) {
3117
+ this.$emit("input", t)
3118
+ }
3119
+ }
3120
+ },
3121
+ methods: {
3122
+ updateSetting: function() {
3123
+ if (this.disabled) return !1
3124
+ },
3125
+ titleClass: function(t) {
3126
+ var e = "mo2f-setup-styled-radio";
3127
+ return this.isChecked(t) && (e += " mo2f-setup-styled-radio-checked"), e
3128
+ },
3129
+ labelClass: function(t) {
3130
+ var e = "";
3131
+ return this.isChecked(t) && (e += " mo2f-setup-styled-radio-label-checked"), e
3132
+ },
3133
+ isChecked: function(t) {
3134
+ return t === this.selected
3135
+ }
3136
+ }
3137
+ },
3138
+ Ue = We,
3139
+ He = Object(_["a"])(Ue, Qe, Le, !1, null, null, null),
3140
+ Re = He.exports,
3141
+ Ge = function() {
3142
+ var t = this,
3143
+ e = t.$createElement,
3144
+ s = t._self._c || e;
3145
+ return s("div", {
3146
+ staticClass: "settings-input-number",
3147
+ class: {
3148
+ "settings-input-number-error": t.field_error
3149
+ }
3150
+ }, [s("label", {
3151
+ staticClass: "settings-input-label-container",
3152
+ attrs: {
3153
+ for: t.id
3154
+ }
3155
+ }, [t.label ? s("span", {
3156
+ staticClass: "label",
3157
+ domProps: {
3158
+ innerHTML: t._s(t.label)
3159
+ }
3160
+ }) : t._e(), t.tooltip ? s("settings-info-tooltip", {
3161
+ attrs: {
3162
+ content: t.tooltip
3163
+ }
3164
+ }) : t._e()], 1), s("input", {
3165
+ directives: [{
3166
+ name: "model",
3167
+ rawName: "v-model",
3168
+ value: t.currentValue,
3169
+ expression: "currentValue"
3170
+ }],
3171
+ attrs: {
3172
+ id: t.id,
3173
+ type: "number",
3174
+ name: t.name,
3175
+ placeholder: t.placeholder,
3176
+ min: t.min,
3177
+ max: t.max,
3178
+ step: t.step,
3179
+ readonly: t.disabled
3180
+ },
3181
+ domProps: {
3182
+ value: t.currentValue
3183
+ },
3184
+ on: {
3185
+ change: t.inputUpdate,
3186
+ input: function(e) {
3187
+ e.target.composing || (t.currentValue = e.target.value)
3188
+ }
3189
+ }
3190
+ }), t.has_error ? s("p", {
3191
+ staticClass: "error"
3192
+ }, [s("inline-svg", {
3193
+ staticClass: "icon",
3194
+ attrs: {
3195
+ src: i("827a"),
3196
+ width: "16"
3197
+ }
3198
+ }), s("span", {
3199
+ domProps: {
3200
+ innerHTML: t._s(t.has_error)
3201
+ }
3202
+ })], 1) : t._e(), t.description ? s("p", {
3203
+ staticClass: "description",
3204
+ domProps: {
3205
+ innerHTML: t._s(t.description)
3206
+ }
3207
+ }) : t._e()])
3208
+ },
3209
+ Ve = [],
3210
+ Ye = (i("a9e3"), {
3211
+ name: "SettingsInputNumber",
3212
+ components: {
3213
+ SettingsInfoTooltip: Nt
3214
+ },
3215
+ props: {
3216
+ name: String,
3217
+ value: [Number, String],
3218
+ label: String,
3219
+ description: String,
3220
+ placeholder: String,
3221
+ type: {
3222
+ type: String,
3223
+ default: "text"
3224
+ },
3225
+ tooltip: String,
3226
+ default_value: String,
3227
+ min: Number,
3228
+ max: Number,
3229
+ disabled: Boolean,
3230
+ step: {
3231
+ type: Number,
3232
+ default: 1
3233
+ },
3234
+ round: {
3235
+ type: Boolean,
3236
+ default: !1
3237
+ },
3238
+ is_error: Boolean
3239
+ },
3240
+ data: function() {
3241
+ return {
3242
+ has_error: !1,
3243
+ id: "input-" + this.name,
3244
+ text_error_value: Object(c["c"])(Object(c["a"])("Please enter a value between %1$s and %2$s", "mo2f-setup"), "<strong>" + this.min + "</strong>", "<strong>" + this.max + "</strong>"),
3245
+ text_error_round: Object(c["a"])("Value has to be a round number", "mo2f-setup")
3246
+ }
3247
+ },
3248
+ computed: {
3249
+ currentValue: {
3250
+ get: function() {
3251
+ return this.value
3252
+ },
3253
+ set: function(t) {
3254
+ this.$emit("is_error_update", !1), this.$emit("input", parseInt(t, 10))
3255
+ }
3256
+ },
3257
+ field_error: {
3258
+ get: function() {
3259
+ return this.is_error
3260
+ },
3261
+ set: function(t) {
3262
+ this.$emit("is_error_update", t)
3263
+ }
3264
+ }
3265
+ },
3266
+ methods: {
3267
+ inputUpdate: function(t) {
3268
+ if (this.disabled) return !1;
3269
+ this.has_error = !1;
3270
+ var e = parseFloat(t.target.value);
3271
+ return this.round && e % 1 !== 0 ? (this.has_error = this.text_error_round, !1) : e > this.max || e < this.min ? (this.has_error = this.text_error_value, !1) : void 0
3272
+ }
3273
+ }
3274
+ }),
3275
+ Je = Ye,
3276
+ Ke = Object(_["a"])(Je, Ge, Ve, !1, null, null, null),
3277
+ qe = Ke.exports,
3278
+ Ze = function() {
3279
+ var t = this,
3280
+ e = t.$createElement,
3281
+ i = t._self._c || e;
3282
+ return i("div", {
3283
+ staticClass: "settings-input-switch",
3284
+ class: t.classname
3285
+ }, [i("label", {
3286
+ attrs: {
3287
+ for: t.id
3288
+ }
3289
+ }, [i("span", {
3290
+ staticClass: "title settings-input-label-container"
3291
+ }, [i("span", {
3292
+ staticClass: "label",
3293
+ domProps: {
3294
+ innerHTML: t._s(t.title)
3295
+ }
3296
+ }), t.tooltip ? i("settings-info-tooltip", {
3297
+ attrs: {
3298
+ content: t.tooltip
3299
+ }
3300
+ }) : t._e()], 1), t.description ? i("p", {
3301
+ staticClass: "description",
3302
+ domProps: {
3303
+ innerHTML: t._s(t.description)
3304
+ }
3305
+ }) : t._e(), i("span", {
3306
+ staticClass: "control"
3307
+ }, [i("input", {
3308
+ directives: [{
3309
+ name: "model",
3310
+ rawName: "v-model",
3311
+ value: t.currentValue,
3312
+ expression: "currentValue"
3313
+ }],
3314
+ attrs: {
3315
+ id: t.id,
3316
+ type: "checkbox",
3317
+ name: t.name,
3318
+ disabled: t.disabled
3319
+ },
3320
+ domProps: {
3321
+ checked: Array.isArray(t.currentValue) ? t._i(t.currentValue, null) > -1 : t.currentValue
3322
+ },
3323
+ on: {
3324
+ change: [function(e) {
3325
+ var i = t.currentValue,
3326
+ s = e.target,
3327
+ a = !!s.checked;
3328
+ if (Array.isArray(i)) {
3329
+ var n = null,
3330
+ o = t._i(i, n);
3331
+ s.checked ? o < 0 && (t.currentValue = i.concat([n])) : o > -1 && (t.currentValue = i.slice(0, o).concat(i.slice(o + 1)))
3332
+ } else t.currentValue = a
3333
+ }, t.inputUpdate]
3334
+ }
3335
+ }), i("span", {
3336
+ class: {
3337
+ "toggle-switch": !0, "toggle-switch-with-label": t.label
3338
+ }
3339
+ }), t.label ? i("span", {
3340
+ staticClass: "label-description",
3341
+ domProps: {
3342
+ innerHTML: t._s(t.label)
3343
+ }
3344
+ }) : t._e()])])])
3345
+ },
3346
+ Xe = [],
3347
+ $e = {
3348
+ name: "SettingsInputSwitch",
3349
+ components: {
3350
+ SettingsInfoTooltip: Nt
3351
+ },
3352
+ props: {
3353
+ name: String,
3354
+ value: Boolean,
3355
+ title: String,
3356
+ label: String,
3357
+ description: String,
3358
+ tooltip: String,
3359
+ classname: String,
3360
+ disabled: Boolean
3361
+ },
3362
+ data: function() {
3363
+ return {
3364
+ has_error: !1,
3365
+ id: "input-" + this.name
3366
+ }
3367
+ },
3368
+ computed: {
3369
+ currentValue: {
3370
+ get: function() {
3371
+ return this.value
3372
+ },
3373
+ set: function(t) {
3374
+ this.$emit("input", !!t)
3375
+ }
3376
+ }
3377
+ },
3378
+ methods: {
3379
+ inputUpdate: function() {
3380
+ if (this.disabled) return !1
3381
+ }
3382
+ }
3383
+ },
3384
+ ti = $e,
3385
+ ei = Object(_["a"])(ti, Ze, Xe, !1, null, null, null),
3386
+ ii = ei.exports,
3387
+ si = {
3388
+ name: "WizardStepConfigureMailerSmtp",
3389
+ components: {
3390
+ SettingsInputText: Ut,
3391
+ SettingsInputRadio: Re,
3392
+ SettingsInputNumber: qe,
3393
+ SettingsInputSwitch: ii
3394
+ },
3395
+ data: function() {
3396
+ return {
3397
+ mailer: "smtp",
3398
+ text_host_label: Object(c["a"])("SMTP Host", "mo2f-setup"),
3399
+ text_encryption_label: Object(c["a"])("Encryption", "mo2f-setup"),
3400
+ text_port_label: Object(c["a"])("SMTP Port", "mo2f-setup"),
3401
+ text_autotls_title: Object(c["a"])("Auto TLS", "mo2f-setup"),
3402
+ text_autotls_label: Object(c["a"])("Enable Auto TLS", "mo2f-setup"),
3403
+ text_autotls_description: Object(c["a"])("By default, TLS encryption is automatically used if the server supports it (recommended). In some cases, due to server misconfigurations, this can cause issues and may need to be disabled.", "mo2f-setup"),
3404
+ text_auth_title: Object(c["a"])("Authentication", "mo2f-setup"),
3405
+ text_auth_label: Object(c["a"])("Enable Authentication", "mo2f-setup"),
3406
+ text_user_label: Object(c["a"])("SMTP Username", "mo2f-setup"),
3407
+ text_pass_label: Object(c["a"])("SMTP Password", "mo2f-setup"),
3408
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
3409
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
3410
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
3411
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
3412
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
3413
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
3414
+ text_encryption_description: Object(c["a"])("For most servers TLS is the recommended option. If your SMTP provider offers both SSL and TLS options, we recommend using TLS.", "mo2f-setup"),
3415
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3416
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3417
+ description: this.$wpms.mailer_options.smtp.description,
3418
+ encryptionOptions: [{
3419
+ label: Object(c["a"])("None", "mo2f-setup"),
3420
+ value: "none",
3421
+ default_port: 25
3422
+ }, {
3423
+ label: Object(c["a"])("SSL", "mo2f-setup"),
3424
+ value: "ssl",
3425
+ default_port: 465
3426
+ }, {
3427
+ label: Object(c["a"])("TLS", "mo2f-setup"),
3428
+ value: "tls",
3429
+ default_port: 587
3430
+ }],
3431
+ show_autotls: !0,
3432
+ show_user_and_pass: !0,
3433
+ field_errors: []
3434
+ }
3435
+ },
3436
+ computed: Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.smtp.host", "settings.smtp.auth", "settings.smtp.port", "settings.smtp.encryption", "settings.smtp.user", "settings.smtp.pass", "settings.smtp.autotls", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])),
3437
+ watch: {
3438
+ encryption: function(t) {
3439
+ this.show_autotls = "tls" !== t
3440
+ }
3441
+ },
3442
+ methods: {
3443
+ getEncryptionDefaultPort: function(t) {
3444
+ return this.encryptionOptions.find((function(e) {
3445
+ return e.value === t
3446
+ })).default_port
3447
+ },
3448
+ encryptionChanged: function(t) {
3449
+ this.port = this.getEncryptionDefaultPort(t)
3450
+ },
3451
+ areRequiredFieldsValid: function() {
3452
+ var t = !0;
3453
+ return "" === this.host && (t = !1, this.field_errors.push("host")), ("" === this.port || isNaN(this.port)) && (t = !1, this.field_errors.push("port")), this.auth && ("" === this.user && (t = !1, this.field_errors.push("user")), "" === this.pass && (t = !1, this.field_errors.push("pass"))), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
3454
+ },
3455
+ removeFieldError: function(t) {
3456
+ this.field_errors = this.field_errors.filter((function(e) {
3457
+ return e !== t
3458
+ }))
3459
+ }
3460
+ },
3461
+ mounted: function() {
3462
+ "tls" === this.encryption && (this.show_autotls = !1)
3463
+ }
3464
+ },
3465
+ ai = si,
3466
+ ni = Object(_["a"])(ai, Fe, Ne, !1, null, null, null),
3467
+ oi = ni.exports,
3468
+ ri = function() {
3469
+ var t = this,
3470
+ e = t.$createElement,
3471
+ s = t._self._c || e;
3472
+ return s("div", {
3473
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-smtpcom"
3474
+ }, [s("p", {
3475
+ staticClass: "mailer-description",
3476
+ domProps: {
3477
+ innerHTML: t._s(t.description)
3478
+ }
3479
+ }), s("p", {
3480
+ staticClass: "mailer-description mailer-description-links"
3481
+ }, [s("a", {
3482
+ staticClass: "mo2f-setup-button mo2f-setup-button-small mo2f-setup-button-secondary",
3483
+ attrs: {
3484
+ href: "https://wpmailsmtp.com/go/smtp/",
3485
+ target: "_blank",
3486
+ rel: "noopener noreferrer"
3487
+ }
3488
+ }, [s("span", {
3489
+ staticClass: "text-with-arrow text-with-arrow-right"
3490
+ }, [t._v(" " + t._s(t.text_get_started_button)), s("inline-svg", {
3491
+ staticClass: "icon",
3492
+ attrs: {
3493
+ src: i("107e"),
3494
+ width: "16",
3495
+ height: "23"
3496
+ }
3497
+ })], 1)]), s("a", {
3498
+ staticClass: "mo2f-setup-link",
3499
+ attrs: {
3500
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-smtp-com-mailer-in-mo2f-setup",
3501
+ target: "_blank",
3502
+ rel: "noopener noreferrer"
3503
+ }
3504
+ }, [t._v(t._s(t.text_documentation_link))])]), s("div", {
3505
+ staticClass: "mo2f-setup-setup-wizard-form"
3506
+ }, [s("settings-input-text", {
3507
+ attrs: {
3508
+ name: "api_key",
3509
+ type: "password",
3510
+ label: t.text_api_key_label,
3511
+ description: t.text_api_key_description,
3512
+ is_error: t.field_errors.includes("api_key")
3513
+ },
3514
+ on: {
3515
+ is_error_update: function(e) {
3516
+ return t.removeFieldError("api_key")
3517
+ }
3518
+ },
3519
+ model: {
3520
+ value: t.api_key,
3521
+ callback: function(e) {
3522
+ t.api_key = e
3523
+ },
3524
+ expression: "api_key"
3525
+ }
3526
+ }), s("settings-input-text", {
3527
+ attrs: {
3528
+ name: "channel",
3529
+ label: t.text_channel_label,
3530
+ description: t.text_channel_description,
3531
+ is_error: t.field_errors.includes("channel")
3532
+ },
3533
+ on: {
3534
+ is_error_update: function(e) {
3535
+ return t.removeFieldError("channel")
3536
+ }
3537
+ },
3538
+ model: {
3539
+ value: t.channel,
3540
+ callback: function(e) {
3541
+ t.channel = e
3542
+ },
3543
+ expression: "channel"
3544
+ }
3545
+ }), s("settings-input-text", {
3546
+ attrs: {
3547
+ name: "from_name",
3548
+ label: t.text_from_name_label,
3549
+ description: t.text_from_name_description
3550
+ },
3551
+ model: {
3552
+ value: t.from_name,
3553
+ callback: function(e) {
3554
+ t.from_name = e
3555
+ },
3556
+ expression: "from_name"
3557
+ }
3558
+ }), s("settings-input-switch", {
3559
+ attrs: {
3560
+ classname: "sub_setting",
3561
+ name: "from_name_force",
3562
+ title: t.text_force_from_name_title,
3563
+ label: t.text_force_from_name_label
3564
+ },
3565
+ model: {
3566
+ value: t.from_name_force,
3567
+ callback: function(e) {
3568
+ t.from_name_force = e
3569
+ },
3570
+ expression: "from_name_force"
3571
+ }
3572
+ }), s("settings-input-text", {
3573
+ attrs: {
3574
+ name: "from_email",
3575
+ type: "email",
3576
+ label: t.text_from_email_label,
3577
+ description: t.text_from_email_description,
3578
+ is_error: t.field_errors.includes("from_email")
3579
+ },
3580
+ on: {
3581
+ is_error_update: function(e) {
3582
+ return t.removeFieldError("from_email")
3583
+ }
3584
+ },
3585
+ model: {
3586
+ value: t.from_email,
3587
+ callback: function(e) {
3588
+ t.from_email = e
3589
+ },
3590
+ expression: "from_email"
3591
+ }
3592
+ }), s("settings-input-switch", {
3593
+ attrs: {
3594
+ classname: "sub_setting",
3595
+ name: "from_email_force",
3596
+ title: t.text_force_from_email_title,
3597
+ label: t.text_force_from_email_label
3598
+ },
3599
+ model: {
3600
+ value: t.from_email_force,
3601
+ callback: function(e) {
3602
+ t.from_email_force = e
3603
+ },
3604
+ expression: "from_email_force"
3605
+ }
3606
+ })], 1)])
3607
+ },
3608
+ li = [],
3609
+ ci = (i("baa5"), {
3610
+ name: "WizardStepConfigureMailerSmtpCom",
3611
+ components: {
3612
+ SettingsInputText: Ut,
3613
+ SettingsInputSwitch: ii
3614
+ },
3615
+ data: function() {
3616
+ return {
3617
+ mailer: "smtpcom",
3618
+ text_api_key_label: Object(c["a"])("API Key", "mo2f-setup"),
3619
+ text_channel_label: Object(c["a"])("Sender Name", "mo2f-setup"),
3620
+ text_api_key_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get an API Key for SMTP.com.", "mo2f-setup"), '<a href="https://my.smtp.com/settings/api" target="_blank" rel="noopener noreferrer">', "</a>"),
3621
+ text_channel_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get a Sender Name for SMTP.com.", "mo2f-setup"), '<a href="https://my.smtp.com/senders/" target="_blank" rel="noopener noreferrer">', "</a>"),
3622
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
3623
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
3624
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
3625
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
3626
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3627
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3628
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
3629
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
3630
+ text_get_started_button: Object(c["a"])("Get Started with SMTP.com", "mo2f-setup"),
3631
+ text_documentation_link: Object(c["a"])("Read how to set up SMTP.com", "mo2f-setup"),
3632
+ description: this.$wpms.mailer_options.smtpcom.description.substr(0, this.$wpms.mailer_options.smtpcom.description.lastIndexOf("<br><br>")),
3633
+ field_errors: []
3634
+ }
3635
+ },
3636
+ computed: Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.smtpcom.api_key", "settings.smtpcom.channel", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])),
3637
+ methods: {
3638
+ areRequiredFieldsValid: function() {
3639
+ var t = !0;
3640
+ return "" === this.api_key && (t = !1, this.field_errors.push("api_key")), "" === this.channel && (t = !1, this.field_errors.push("channel")), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
3641
+ },
3642
+ removeFieldError: function(t) {
3643
+ this.field_errors = this.field_errors.filter((function(e) {
3644
+ return e !== t
3645
+ }))
3646
+ }
3647
+ }
3648
+ }),
3649
+ pi = ci,
3650
+ mi = Object(_["a"])(pi, ri, li, !1, null, null, null),
3651
+ ui = mi.exports,
3652
+ di = function() {
3653
+ var t = this,
3654
+ e = t.$createElement,
3655
+ s = t._self._c || e;
3656
+ return s("div", {
3657
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-sendinblue"
3658
+ }, [s("p", {
3659
+ staticClass: "mailer-description",
3660
+ domProps: {
3661
+ innerHTML: t._s(t.description)
3662
+ }
3663
+ }), s("p", {
3664
+ staticClass: "mailer-description mailer-description-links"
3665
+ }, [s("a", {
3666
+ staticClass: "mo2f-setup-button mo2f-setup-button-small mo2f-setup-button-secondary",
3667
+ attrs: {
3668
+ href: "https://wpmailsmtp.com/go/sendinblue/",
3669
+ target: "_blank",
3670
+ rel: "noopener noreferrer"
3671
+ }
3672
+ }, [s("span", {
3673
+ staticClass: "text-with-arrow text-with-arrow-right"
3674
+ }, [t._v(" " + t._s(t.text_get_started_button)), s("inline-svg", {
3675
+ staticClass: "icon",
3676
+ attrs: {
3677
+ src: i("107e"),
3678
+ width: "16",
3679
+ height: "23"
3680
+ }
3681
+ })], 1)]), s("a", {
3682
+ staticClass: "mo2f-setup-link",
3683
+ attrs: {
3684
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-sendinblue-mailer-in-mo2f-setup",
3685
+ target: "_blank",
3686
+ rel: "noopener noreferrer"
3687
+ }
3688
+ }, [t._v(t._s(t.text_documentation_link))])]), s("div", {
3689
+ staticClass: "mo2f-setup-setup-wizard-form"
3690
+ }, [s("settings-input-text", {
3691
+ attrs: {
3692
+ name: "api_key",
3693
+ type: "password",
3694
+ label: t.text_api_key_label,
3695
+ description: t.text_api_key_description,
3696
+ is_error: t.field_errors.includes("api_key")
3697
+ },
3698
+ on: {
3699
+ is_error_update: function(e) {
3700
+ return t.removeFieldError("api_key")
3701
+ }
3702
+ },
3703
+ model: {
3704
+ value: t.api_key,
3705
+ callback: function(e) {
3706
+ t.api_key = e
3707
+ },
3708
+ expression: "api_key"
3709
+ }
3710
+ }), s("settings-input-text", {
3711
+ attrs: {
3712
+ name: "domain",
3713
+ label: t.text_domain_label,
3714
+ description: t.text_domain_description
3715
+ },
3716
+ model: {
3717
+ value: t.domain,
3718
+ callback: function(e) {
3719
+ t.domain = e
3720
+ },
3721
+ expression: "domain"
3722
+ }
3723
+ }), s("settings-input-text", {
3724
+ attrs: {
3725
+ name: "from_name",
3726
+ label: t.text_from_name_label,
3727
+ description: t.text_from_name_description
3728
+ },
3729
+ model: {
3730
+ value: t.from_name,
3731
+ callback: function(e) {
3732
+ t.from_name = e
3733
+ },
3734
+ expression: "from_name"
3735
+ }
3736
+ }), s("settings-input-switch", {
3737
+ attrs: {
3738
+ classname: "sub_setting",
3739
+ name: "from_name_force",
3740
+ title: t.text_force_from_name_title,
3741
+ label: t.text_force_from_name_label
3742
+ },
3743
+ model: {
3744
+ value: t.from_name_force,
3745
+ callback: function(e) {
3746
+ t.from_name_force = e
3747
+ },
3748
+ expression: "from_name_force"
3749
+ }
3750
+ }), s("settings-input-text", {
3751
+ attrs: {
3752
+ name: "from_email",
3753
+ type: "email",
3754
+ label: t.text_from_email_label,
3755
+ description: t.text_from_email_description,
3756
+ is_error: t.field_errors.includes("from_email")
3757
+ },
3758
+ on: {
3759
+ is_error_update: function(e) {
3760
+ return t.removeFieldError("from_email")
3761
+ }
3762
+ },
3763
+ model: {
3764
+ value: t.from_email,
3765
+ callback: function(e) {
3766
+ t.from_email = e
3767
+ },
3768
+ expression: "from_email"
3769
+ }
3770
+ }), s("settings-input-switch", {
3771
+ attrs: {
3772
+ classname: "sub_setting",
3773
+ name: "from_email_force",
3774
+ title: t.text_force_from_email_title,
3775
+ label: t.text_force_from_email_label
3776
+ },
3777
+ model: {
3778
+ value: t.from_email_force,
3779
+ callback: function(e) {
3780
+ t.from_email_force = e
3781
+ },
3782
+ expression: "from_email_force"
3783
+ }
3784
+ })], 1)])
3785
+ },
3786
+ _i = [],
3787
+ fi = {
3788
+ name: "WizardStepConfigureMailerSendinblue",
3789
+ components: {
3790
+ SettingsInputText: Ut,
3791
+ SettingsInputSwitch: ii
3792
+ },
3793
+ data: function() {
3794
+ return {
3795
+ mailer: "sendinblue",
3796
+ text_api_key_label: Object(c["a"])("API Key", "mo2f-setup"),
3797
+ text_domain_label: Object(c["a"])("Sending Domain", "mo2f-setup"),
3798
+ text_api_key_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get an API Key for Sendinblue.", "mo2f-setup"), '<a href="https://account.sendinblue.com/advanced/api" target="_blank" rel="noopener noreferrer">', "</a>"),
3799
+ text_domain_description: Object(c["c"])(Object(c["a"])("Please input the sending domain/subdomain you configured in your Sendinblue dashboard. More information can be found in our %1$sSendinblue documentation%2$s", "mo2f-setup"), '<a href="https://wpmailsmtp.com/docs/how-to-set-up-the-sendinblue-mailer-in-mo2f-setup#setup-smtp" target="_blank" rel="noopener noreferrer">', "</a>"),
3800
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
3801
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
3802
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
3803
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
3804
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3805
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3806
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
3807
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
3808
+ text_get_started_button: Object(c["a"])("Get Started with Sendinblue", "mo2f-setup"),
3809
+ text_documentation_link: Object(c["a"])("Read how to set up Sendinblue", "mo2f-setup"),
3810
+ description: this.$wpms.mailer_options.sendinblue.description.substr(0, this.$wpms.mailer_options.sendinblue.description.lastIndexOf("<br><br>")),
3811
+ field_errors: []
3812
+ }
3813
+ },
3814
+ computed: Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.sendinblue.api_key", "settings.sendinblue.domain", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])),
3815
+ methods: {
3816
+ areRequiredFieldsValid: function() {
3817
+ var t = !0;
3818
+ return "" === this.api_key && (t = !1, this.field_errors.push("api_key")), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
3819
+ },
3820
+ removeFieldError: function(t) {
3821
+ this.field_errors = this.field_errors.filter((function(e) {
3822
+ return e !== t
3823
+ }))
3824
+ }
3825
+ }
3826
+ },
3827
+ hi = fi,
3828
+ gi = Object(_["a"])(hi, di, _i, !1, null, null, null),
3829
+ wi = gi.exports,
3830
+ bi = function() {
3831
+ var t = this,
3832
+ e = t.$createElement,
3833
+ i = t._self._c || e;
3834
+ return i("div", {
3835
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-mailgun"
3836
+ }, [i("p", {
3837
+ staticClass: "mailer-description",
3838
+ domProps: {
3839
+ innerHTML: t._s(t.description)
3840
+ }
3841
+ }), i("p", {
3842
+ staticClass: "mailer-description mailer-description-links"
3843
+ }, [i("a", {
3844
+ staticClass: "mo2f-setup-link",
3845
+ attrs: {
3846
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-mailgun-mailer-in-mo2f-setup/",
3847
+ target: "_blank",
3848
+ rel: "noopener noreferrer"
3849
+ }
3850
+ }, [t._v(t._s(t.text_documentation_link))])]), i("div", {
3851
+ staticClass: "mo2f-setup-setup-wizard-form"
3852
+ }, [i("settings-input-text", {
3853
+ attrs: {
3854
+ name: "api_key",
3855
+ type: "password",
3856
+ label: t.text_api_key_label,
3857
+ description: t.text_api_key_description,
3858
+ is_error: t.field_errors.includes("api_key")
3859
+ },
3860
+ on: {
3861
+ is_error_update: function(e) {
3862
+ return t.removeFieldError("api_key")
3863
+ }
3864
+ },
3865
+ model: {
3866
+ value: t.api_key,
3867
+ callback: function(e) {
3868
+ t.api_key = e
3869
+ },
3870
+ expression: "api_key"
3871
+ }
3872
+ }), i("settings-input-text", {
3873
+ attrs: {
3874
+ name: "domain",
3875
+ label: t.text_domain_label,
3876
+ description: t.text_domain_description,
3877
+ is_error: t.field_errors.includes("domain")
3878
+ },
3879
+ on: {
3880
+ is_error_update: function(e) {
3881
+ return t.removeFieldError("domain")
3882
+ }
3883
+ },
3884
+ model: {
3885
+ value: t.domain,
3886
+ callback: function(e) {
3887
+ t.domain = e
3888
+ },
3889
+ expression: "domain"
3890
+ }
3891
+ }), i("settings-input-radio", {
3892
+ attrs: {
3893
+ name: "region",
3894
+ label: t.text_region_label,
3895
+ options: t.regionOptions,
3896
+ description: t.text_region_description
3897
+ },
3898
+ model: {
3899
+ value: t.region,
3900
+ callback: function(e) {
3901
+ t.region = e
3902
+ },
3903
+ expression: "region"
3904
+ }
3905
+ }), i("settings-input-text", {
3906
+ attrs: {
3907
+ name: "from_name",
3908
+ label: t.text_from_name_label,
3909
+ description: t.text_from_name_description
3910
+ },
3911
+ model: {
3912
+ value: t.from_name,
3913
+ callback: function(e) {
3914
+ t.from_name = e
3915
+ },
3916
+ expression: "from_name"
3917
+ }
3918
+ }), i("settings-input-switch", {
3919
+ attrs: {
3920
+ classname: "sub_setting",
3921
+ name: "from_name_force",
3922
+ title: t.text_force_from_name_title,
3923
+ label: t.text_force_from_name_label
3924
+ },
3925
+ model: {
3926
+ value: t.from_name_force,
3927
+ callback: function(e) {
3928
+ t.from_name_force = e
3929
+ },
3930
+ expression: "from_name_force"
3931
+ }
3932
+ }), i("settings-input-text", {
3933
+ attrs: {
3934
+ name: "from_email",
3935
+ type: "email",
3936
+ label: t.text_from_email_label,
3937
+ description: t.text_from_email_description,
3938
+ is_error: t.field_errors.includes("from_email")
3939
+ },
3940
+ on: {
3941
+ is_error_update: function(e) {
3942
+ return t.removeFieldError("from_email")
3943
+ }
3944
+ },
3945
+ model: {
3946
+ value: t.from_email,
3947
+ callback: function(e) {
3948
+ t.from_email = e
3949
+ },
3950
+ expression: "from_email"
3951
+ }
3952
+ }), i("settings-input-switch", {
3953
+ attrs: {
3954
+ classname: "sub_setting",
3955
+ name: "from_email_force",
3956
+ title: t.text_force_from_email_title,
3957
+ label: t.text_force_from_email_label
3958
+ },
3959
+ model: {
3960
+ value: t.from_email_force,
3961
+ callback: function(e) {
3962
+ t.from_email_force = e
3963
+ },
3964
+ expression: "from_email_force"
3965
+ }
3966
+ })], 1)])
3967
+ },
3968
+ Ai = [],
3969
+ vi = (i("c975"), {
3970
+ name: "WizardStepConfigureMailerMailgun",
3971
+ components: {
3972
+ SettingsInputText: Ut,
3973
+ SettingsInputRadio: Re,
3974
+ SettingsInputSwitch: ii
3975
+ },
3976
+ data: function() {
3977
+ return {
3978
+ mailer: "mailgun",
3979
+ text_api_key_label: Object(c["a"])("API Key", "mo2f-setup"),
3980
+ text_domain_label: Object(c["a"])("Domain Name", "mo2f-setup"),
3981
+ text_region_label: Object(c["a"])("Region", "mo2f-setup"),
3982
+ text_api_key_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get an API Key from Mailgun.", "mo2f-setup"), '<a href="https://app.mailgun.com/app/account/security/api_keys" target="_blank" rel="noopener noreferrer">', "</a>"),
3983
+ text_domain_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get a Domain Name from Mailgun.", "mo2f-setup"), '<a href="https://app.mailgun.com/app/domains" target="_blank" rel="noopener noreferrer">', "</a>"),
3984
+ text_region_description: Object(c["c"])(Object(c["a"])("Define which endpoint you want to use for sending messages. If you are operating under EU laws, you may be required to use EU region. %1$sMore information%2$s on Mailgun.com.", "mo2f-setup"), '<a href="https://www.mailgun.com/regions" target="_blank" rel="noopener noreferrer">', "</a>"),
3985
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
3986
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
3987
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
3988
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
3989
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3990
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
3991
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
3992
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
3993
+ text_documentation_link: Object(c["a"])("Read how to set up Mailgun", "mo2f-setup"),
3994
+ description: this.$wpms.mailer_options.mailgun.description.substr(0, this.$wpms.mailer_options.mailgun.description.indexOf("<br>")),
3995
+ regionOptions: [{
3996
+ label: Object(c["a"])("US", "mo2f-setup"),
3997
+ value: "US"
3998
+ }, {
3999
+ label: Object(c["a"])("EU", "mo2f-setup"),
4000
+ value: "EU"
4001
+ }],
4002
+ field_errors: []
4003
+ }
4004
+ },
4005
+ computed: Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.mailgun.api_key", "settings.mailgun.domain", "settings.mailgun.region", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])),
4006
+ methods: {
4007
+ areRequiredFieldsValid: function() {
4008
+ var t = !0;
4009
+ return "" === this.api_key && (t = !1, this.field_errors.push("api_key")), "" === this.domain && (t = !1, this.field_errors.push("domain")), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
4010
+ },
4011
+ removeFieldError: function(t) {
4012
+ this.field_errors = this.field_errors.filter((function(e) {
4013
+ return e !== t
4014
+ }))
4015
+ }
4016
+ }
4017
+ }),
4018
+ xi = vi,
4019
+ yi = Object(_["a"])(xi, bi, Ai, !1, null, null, null),
4020
+ Ci = yi.exports,
4021
+ ki = function() {
4022
+ var t = this,
4023
+ e = t.$createElement,
4024
+ i = t._self._c || e;
4025
+ return i("div", {
4026
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-sendgrid"
4027
+ }, [i("p", {
4028
+ staticClass: "mailer-description",
4029
+ domProps: {
4030
+ innerHTML: t._s(t.description)
4031
+ }
4032
+ }), i("p", {
4033
+ staticClass: "mailer-description mailer-description-links"
4034
+ }, [i("a", {
4035
+ staticClass: "mo2f-setup-link",
4036
+ attrs: {
4037
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-sendgrid-mailer-in-mo2f-setup/",
4038
+ target: "_blank",
4039
+ rel: "noopener noreferrer"
4040
+ }
4041
+ }, [t._v(t._s(t.text_documentation_link))])]), i("div", {
4042
+ staticClass: "mo2f-setup-setup-wizard-form"
4043
+ }, [i("settings-input-text", {
4044
+ attrs: {
4045
+ name: "api_key",
4046
+ type: "password",
4047
+ label: t.text_api_key_label,
4048
+ description: t.text_api_key_description,
4049
+ is_error: t.field_errors.includes("api_key")
4050
+ },
4051
+ on: {
4052
+ is_error_update: function(e) {
4053
+ return t.removeFieldError("api_key")
4054
+ }
4055
+ },
4056
+ model: {
4057
+ value: t.api_key,
4058
+ callback: function(e) {
4059
+ t.api_key = e
4060
+ },
4061
+ expression: "api_key"
4062
+ }
4063
+ }), i("settings-input-text", {
4064
+ attrs: {
4065
+ name: "domain",
4066
+ label: t.text_domain_label,
4067
+ description: t.text_domain_description
4068
+ },
4069
+ model: {
4070
+ value: t.domain,
4071
+ callback: function(e) {
4072
+ t.domain = e
4073
+ },
4074
+ expression: "domain"
4075
+ }
4076
+ }), i("settings-input-text", {
4077
+ attrs: {
4078
+ name: "from_name",
4079
+ label: t.text_from_name_label,
4080
+ description: t.text_from_name_description
4081
+ },
4082
+ model: {
4083
+ value: t.from_name,
4084
+ callback: function(e) {
4085
+ t.from_name = e
4086
+ },
4087
+ expression: "from_name"
4088
+ }
4089
+ }), i("settings-input-switch", {
4090
+ attrs: {
4091
+ classname: "sub_setting",
4092
+ name: "from_name_force",
4093
+ title: t.text_force_from_name_title,
4094
+ label: t.text_force_from_name_label
4095
+ },
4096
+ model: {
4097
+ value: t.from_name_force,
4098
+ callback: function(e) {
4099
+ t.from_name_force = e
4100
+ },
4101
+ expression: "from_name_force"
4102
+ }
4103
+ }), i("settings-input-text", {
4104
+ attrs: {
4105
+ name: "from_email",
4106
+ type: "email",
4107
+ label: t.text_from_email_label,
4108
+ description: t.text_from_email_description,
4109
+ is_error: t.field_errors.includes("from_email")
4110
+ },
4111
+ on: {
4112
+ is_error_update: function(e) {
4113
+ return t.removeFieldError("from_email")
4114
+ }
4115
+ },
4116
+ model: {
4117
+ value: t.from_email,
4118
+ callback: function(e) {
4119
+ t.from_email = e
4120
+ },
4121
+ expression: "from_email"
4122
+ }
4123
+ }), i("settings-input-switch", {
4124
+ attrs: {
4125
+ classname: "sub_setting",
4126
+ name: "from_email_force",
4127
+ title: t.text_force_from_email_title,
4128
+ label: t.text_force_from_email_label
4129
+ },
4130
+ model: {
4131
+ value: t.from_email_force,
4132
+ callback: function(e) {
4133
+ t.from_email_force = e
4134
+ },
4135
+ expression: "from_email_force"
4136
+ }
4137
+ })], 1)])
4138
+ },
4139
+ Oi = [],
4140
+ ji = {
4141
+ name: "WizardStepConfigureMailerSendgrid",
4142
+ components: {
4143
+ SettingsInputText: Ut,
4144
+ SettingsInputSwitch: ii
4145
+ },
4146
+ data: function() {
4147
+ return {
4148
+ mailer: "sendgrid",
4149
+ text_api_key_label: Object(c["a"])("API Key", "mo2f-setup"),
4150
+ text_domain_label: Object(c["a"])("Sending Domain", "mo2f-setup"),
4151
+ text_api_key_description: Object(c["c"])(Object(c["a"])("%1$sFollow this link%2$s to get an API Key for Sendgrid.", "mo2f-setup"), '<a href="https://app.sendgrid.com/settings/api_keys" target="_blank" rel="noopener noreferrer">', "</a>") + "<br>" + Object(c["c"])(Object(c["a"])("To send emails you will need only a %1$sMail Send%2$s access level for this API key.", "mo2f-setup"), "<i>", "</i>"),
4152
+ text_domain_description: Object(c["c"])(Object(c["a"])("Please input the sending domain/subdomain you configured in your SendGrid dashboard. More information can be found in our %1$sSendGrid documentation%2$s", "mo2f-setup"), '<a href="https://wpmailsmtp.com/docs/how-to-set-up-the-sendgrid-mailer-in-mo2f-setup/#setup" target="_blank" rel="noopener noreferrer">', "</a>"),
4153
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
4154
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
4155
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
4156
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
4157
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
4158
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
4159
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
4160
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
4161
+ text_documentation_link: Object(c["a"])("Read how to set up Sendgrid", "mo2f-setup"),
4162
+ description: this.$wpms.mailer_options.sendgrid.description.substr(0, this.$wpms.mailer_options.sendgrid.description.indexOf("<br>")),
4163
+ field_errors: []
4164
+ }
4165
+ },
4166
+ computed: Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.sendgrid.api_key", "settings.sendgrid.domain", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])),
4167
+ methods: {
4168
+ areRequiredFieldsValid: function() {
4169
+ var t = !0;
4170
+ return "" === this.api_key && (t = !1, this.field_errors.push("api_key")), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
4171
+ },
4172
+ removeFieldError: function(t) {
4173
+ this.field_errors = this.field_errors.filter((function(e) {
4174
+ return e !== t
4175
+ }))
4176
+ }
4177
+ }
4178
+ },
4179
+ Si = ji,
4180
+ Pi = Object(_["a"])(Si, ki, Oi, !1, null, null, null),
4181
+ Ei = Pi.exports,
4182
+ Ti = function() {
4183
+ var t = this,
4184
+ e = t.$createElement,
4185
+ i = t._self._c || e;
4186
+ return i("div", {
4187
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-amazonses"
4188
+ }, [i("p", {
4189
+ staticClass: "mailer-description",
4190
+ domProps: {
4191
+ innerHTML: t._s(t.description)
4192
+ }
4193
+ }), i("p", {
4194
+ staticClass: "mailer-description mailer-description-links"
4195
+ }, [i("b", [i("a", {
4196
+ staticClass: "mo2f-setup-link",
4197
+ attrs: {
4198
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-amazon-ses-mailer-in-mo2f-setup/",
4199
+ target: "_blank",
4200
+ rel: "noopener noreferrer"
4201
+ }
4202
+ }, [t._v(t._s(t.text_documentation_link))])])]), i("div", {
4203
+ staticClass: "mo2f-setup-setup-wizard-form"
4204
+ }, [i("settings-input-text", {
4205
+ attrs: {
4206
+ name: "client_id",
4207
+ label: t.text_client_id_label,
4208
+ is_error: t.field_errors.includes("client_id")
4209
+ },
4210
+ on: {
4211
+ is_error_update: function(e) {
4212
+ return t.removeFieldError("client_id")
4213
+ }
4214
+ },
4215
+ model: {
4216
+ value: t.client_id,
4217
+ callback: function(e) {
4218
+ t.client_id = e
4219
+ },
4220
+ expression: "client_id"
4221
+ }
4222
+ }), i("settings-input-text", {
4223
+ attrs: {
4224
+ name: "client_secret",
4225
+ type: "password",
4226
+ label: t.text_client_secret_label,
4227
+ is_error: t.field_errors.includes("client_secret")
4228
+ },
4229
+ on: {
4230
+ is_error_update: function(e) {
4231
+ return t.removeFieldError("client_secret")
4232
+ }
4233
+ },
4234
+ model: {
4235
+ value: t.client_secret,
4236
+ callback: function(e) {
4237
+ t.client_secret = e
4238
+ },
4239
+ expression: "client_secret"
4240
+ }
4241
+ }), i("settings-input-select", {
4242
+ attrs: {
4243
+ name: "region",
4244
+ label: t.text_region_label,
4245
+ options: t.regionOptions,
4246
+ description: t.text_region_description,
4247
+ is_error: t.field_errors.includes("region")
4248
+ },
4249
+ on: {
4250
+ is_error_update: function(e) {
4251
+ return t.removeFieldError("region")
4252
+ }
4253
+ },
4254
+ model: {
4255
+ value: t.region,
4256
+ callback: function(e) {
4257
+ t.region = e
4258
+ },
4259
+ expression: "region"
4260
+ }
4261
+ }), t.is_api_auth_missing ? t._e() : i("div", [i("div", {
4262
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
4263
+ }), i("settings-amazon-s-e-s-identities", {
4264
+ attrs: {
4265
+ options: t.identities,
4266
+ label: t.text_identities_label,
4267
+ columns: t.identities_columns
4268
+ }
4269
+ }), i("div", {
4270
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
4271
+ }), i("settings-input-text", {
4272
+ attrs: {
4273
+ name: "from_name",
4274
+ label: t.text_from_name_label,
4275
+ description: t.text_from_name_description
4276
+ },
4277
+ model: {
4278
+ value: t.from_name,
4279
+ callback: function(e) {
4280
+ t.from_name = e
4281
+ },
4282
+ expression: "from_name"
4283
+ }
4284
+ }), i("settings-input-switch", {
4285
+ attrs: {
4286
+ classname: "sub_setting",
4287
+ name: "from_name_force",
4288
+ title: t.text_force_from_name_title,
4289
+ label: t.text_force_from_name_label
4290
+ },
4291
+ model: {
4292
+ value: t.from_name_force,
4293
+ callback: function(e) {
4294
+ t.from_name_force = e
4295
+ },
4296
+ expression: "from_name_force"
4297
+ }
4298
+ }), i("settings-input-text", {
4299
+ attrs: {
4300
+ name: "from_email",
4301
+ type: "email",
4302
+ label: t.text_from_email_label,
4303
+ description: t.text_from_email_description,
4304
+ is_error: t.field_errors.includes("from_email")
4305
+ },
4306
+ on: {
4307
+ is_error_update: function(e) {
4308
+ return t.removeFieldError("from_email")
4309
+ }
4310
+ },
4311
+ model: {
4312
+ value: t.from_email,
4313
+ callback: function(e) {
4314
+ t.from_email = e
4315
+ },
4316
+ expression: "from_email"
4317
+ }
4318
+ }), i("settings-input-switch", {
4319
+ attrs: {
4320
+ classname: "sub_setting",
4321
+ name: "from_email_force",
4322
+ title: t.text_force_from_email_title,
4323
+ label: t.text_force_from_email_label
4324
+ },
4325
+ model: {
4326
+ value: t.from_email_force,
4327
+ callback: function(e) {
4328
+ t.from_email_force = e
4329
+ },
4330
+ expression: "from_email_force"
4331
+ }
4332
+ })], 1)], 1)])
4333
+ },
4334
+ zi = [],
4335
+ Bi = i("f7fe"),
4336
+ Ii = i.n(Bi),
4337
+ Mi = function() {
4338
+ var t = this,
4339
+ e = t.$createElement,
4340
+ i = t._self._c || e;
4341
+ return i("div", {
4342
+ staticClass: "settings-input-select",
4343
+ class: {
4344
+ "settings-input-select-error": t.field_error
4345
+ }
4346
+ }, [i("label", {
4347
+ staticClass: "settings-input-label-container",
4348
+ attrs: {
4349
+ for: "mo2f-setup-settings-select-" + t.name
4350
+ }
4351
+ }, [i("span", {
4352
+ staticClass: "label",
4353
+ domProps: {
4354
+ innerHTML: t._s(t.label)
4355
+ }
4356
+ })]), i("div", {
4357
+ staticClass: "settings-input-select-container"
4358
+ }, [i("select", {
4359
+ directives: [{
4360
+ name: "model",
4361
+ rawName: "v-model",
4362
+ value: t.selected,
4363
+ expression: "selected"
4364
+ }],
4365
+ attrs: {
4366
+ id: "mo2f-setup-settings-select-" + t.name,
4367
+ name: t.name,
4368
+ readonly: t.disabled
4369
+ },
4370
+ on: {
4371
+ change: function(e) {
4372
+ var i = Array.prototype.filter.call(e.target.options, (function(t) {
4373
+ return t.selected
4374
+ })).map((function(t) {
4375
+ var e = "_value" in t ? t._value : t.value;
4376
+ return e
4377
+ }));
4378
+ t.selected = e.target.multiple ? i : i[0]
4379
+ }
4380
+ }
4381
+ }, t._l(t.options, (function(e) {
4382
+ return i("option", {
4383
+ key: e.value,
4384
+ domProps: {
4385
+ value: e.value
4386
+ }
4387
+ }, [t._v(" " + t._s(e.label) + " ")])
4388
+ })), 0)]), t.description ? i("p", {
4389
+ staticClass: "description",
4390
+ domProps: {
4391
+ innerHTML: t._s(t.description)
4392
+ }
4393
+ }) : t._e()])
4394
+ },
4395
+ Di = [],
4396
+ Fi = {
4397
+ name: "SettingsInputSelect",
4398
+ props: {
4399
+ options: Array,
4400
+ label: String,
4401
+ name: String,
4402
+ value: String,
4403
+ description: String,
4404
+ disabled: Boolean,
4405
+ is_error: Boolean
4406
+ },
4407
+ computed: {
4408
+ selected: {
4409
+ get: function() {
4410
+ return this.value
4411
+ },
4412
+ set: function(t) {
4413
+ this.$emit("is_error_update", !1), this.$emit("input", t)
4414
+ }
4415
+ },
4416
+ field_error: {
4417
+ get: function() {
4418
+ return this.is_error
4419
+ },
4420
+ set: function(t) {
4421
+ this.$emit("is_error_update", t)
4422
+ }
4423
+ }
4424
+ }
4425
+ },
4426
+ Ni = Fi,
4427
+ Qi = Object(_["a"])(Ni, Mi, Di, !1, null, null, null),
4428
+ Li = Qi.exports,
4429
+ Wi = function() {
4430
+ var t = this,
4431
+ e = t.$createElement,
4432
+ s = t._self._c || e;
4433
+ return s("div", {
4434
+ staticClass: "settings-amazon-ses-identities"
4435
+ }, [s("label", {
4436
+ staticClass: "settings-input-label-container"
4437
+ }, [s("span", {
4438
+ staticClass: "label",
4439
+ domProps: {
4440
+ innerHTML: t._s(t.label)
4441
+ }
4442
+ }), t.tooltip ? s("settings-info-tooltip", {
4443
+ attrs: {
4444
+ content: t.tooltip
4445
+ }
4446
+ }) : t._e()], 1), t.options ? s("div", [t.options && 0 !== t.options.length ? s("p", {
4447
+ staticClass: "description"
4448
+ }, [t._v(" " + t._s(t.text_identities_table_description) + " ")]) : s("p", {
4449
+ staticClass: "description"
4450
+ }, [s("strong", [t._v(t._s(t.text_no_registered_identities_title))]), t._v(" " + t._s(t.text_no_registered_identities_content) + " ")]), s("div", {
4451
+ staticClass: "ses-identities-container"
4452
+ }, [t.options && t.options.length > 0 ? s("div", {
4453
+ staticClass: "ses-identities-table-container"
4454
+ }, [s("table", [t.columns ? s("tr", {
4455
+ staticClass: "ses-identity-columns"
4456
+ }, t._l(t.filtered_columns, (function(e) {
4457
+ return s("th", {
4458
+ key: e.key,
4459
+ class: "ses-identity-column ses-identity-column-" + e.key
4460
+ }, [t._v(" " + t._s(e.label) + " ")])
4461
+ })), 0) : t._e(), t._l(t.options, (function(e, i) {
4462
+ return s("tr", {
4463
+ key: i
4464
+ }, [s("td", [t._v(" " + t._s(e.value) + " ")]), s("td", [t._v(" " + t._s(e.type) + " ")]), s("td", [t._v(" " + t._s(e.status) + " ")])])
4465
+ })), t.show_identity_form ? t._e() : s("button", {
4466
+ staticClass: "mo2f-setup-button mo2f-setup-button-main mo2f-setup-button-small",
4467
+ attrs: {
4468
+ type: "button"
4469
+ },
4470
+ on: {
4471
+ click: function(e) {
4472
+ return e.preventDefault(), t.addNewIdentity(e)
4473
+ }
4474
+ }
4475
+ }, [t._v(" " + t._s(t.text_add_new_identity) + " ")])], 2)]) : t._e(), t.show_identity_form || !t.options || 0 === t.options.length ? s("div", {
4476
+ staticClass: "mo2f-setup-amazonses-identity-form"
4477
+ }, [t.options && 0 !== t.options.length ? t._e() : s("h3", [t._v(" " + t._s(t.text_verify_identity) + " ")]), s("div", {
4478
+ directives: [{
4479
+ name: "show",
4480
+ rawName: "v-show",
4481
+ value: 1 === t.verify_identity_step,
4482
+ expression: "verify_identity_step === 1"
4483
+ }],
4484
+ staticClass: "amazonses-identity-form-step"
4485
+ }, [s("settings-input-radio", {
4486
+ attrs: {
4487
+ name: "identity_type",
4488
+ options: t.identity_type_options
4489
+ },
4490
+ model: {
4491
+ value: t.identity_type,
4492
+ callback: function(e) {
4493
+ t.identity_type = e
4494
+ },
4495
+ expression: "identity_type"
4496
+ }
4497
+ }), s("p", {
4498
+ domProps: {
4499
+ textContent: t._s(t.verify_identity_text)
4500
+ }
4501
+ }), s("settings-input-text", {
4502
+ attrs: {
4503
+ name: "identity_value",
4504
+ placeholder: t.identity_value_placeholder
4505
+ },
4506
+ model: {
4507
+ value: t.identity_value,
4508
+ callback: function(e) {
4509
+ t.identity_value = e
4510
+ },
4511
+ expression: "identity_value"
4512
+ }
4513
+ }), s("button", {
4514
+ staticClass: "mo2f-setup-button mo2f-setup-button-main mo2f-setup-button-small mo2f-setup-button-verify",
4515
+ attrs: {
4516
+ type: "button"
4517
+ },
4518
+ on: {
4519
+ click: function(e) {
4520
+ return e.preventDefault(), t.verifyIdentity(e)
4521
+ }
4522
+ }
4523
+ }, [t.loading_verify_identity ? s("loader", {
4524
+ attrs: {
4525
+ color: "white"
4526
+ }
4527
+ }) : s("span", [t._v(t._s(t.text_verify))])], 1)], 1), s("div", {
4528
+ directives: [{
4529
+ name: "show",
4530
+ rawName: "v-show",
4531
+ value: 2 === t.verify_identity_step && "domain" === t.verify_identity_result.type,
4532
+ expression: "verify_identity_step === 2 && verify_identity_result.type === 'domain'"
4533
+ }],
4534
+ staticClass: "amazonses-identity-form-step amazonses-identity-form-step-domain"
4535
+ }, [s("p", {
4536
+ domProps: {
4537
+ innerHTML: t._s(t.text_verify_identity_step2_domain_text)
4538
+ }
4539
+ }), s("div", {
4540
+ staticClass: "amazonses-domain-identity-added-inputs"
4541
+ }, [s("settings-input-text", {
4542
+ attrs: {
4543
+ value: t.ses_domain_name,
4544
+ label: t.text_name,
4545
+ name: "ses_domain_name",
4546
+ readonly: "",
4547
+ copy: ""
4548
+ }
4549
+ }), s("settings-input-text", {
4550
+ attrs: {
4551
+ value: t.verify_identity_result.domain_txt,
4552
+ label: t.text_value,
4553
+ name: "ses_domain_value",
4554
+ readonly: "",
4555
+ copy: ""
4556
+ }
4557
+ })], 1)]), s("div", {
4558
+ directives: [{
4559
+ name: "show",
4560
+ rawName: "v-show",
4561
+ value: 2 === t.verify_identity_step && "email" === t.verify_identity_result.type,
4562
+ expression: "verify_identity_step === 2 && verify_identity_result.type === 'email'"
4563
+ }],
4564
+ staticClass: "amazonses-identity-form-step"
4565
+ }, [s("p", {
4566
+ staticClass: "ses-identities-email-success-notice"
4567
+ }, [s("inline-svg", {
4568
+ staticClass: "icon",
4569
+ attrs: {
4570
+ src: i("84d7"),
4571
+ width: "16",
4572
+ height: "16"
4573
+ }
4574
+ }), t._v(" "), s("span", {
4575
+ domProps: {
4576
+ innerHTML: t._s(t.text_verify_identity_step2_email_text)
4577
+ }
4578
+ })], 1)])]) : t._e()])]) : s("loader", {
4579
+ attrs: {
4580
+ size: "md"
4581
+ }
4582
+ })], 1)
4583
+ },
4584
+ Ui = [],
4585
+ Hi = {
4586
+ name: "SettingsAmazonSESIdentities",
4587
+ components: {
4588
+ SettingsInfoTooltip: Nt,
4589
+ SettingsInputRadio: Re,
4590
+ SettingsInputText: Ut,
4591
+ Loader: xe
4592
+ },
4593
+ props: {
4594
+ options: Array,
4595
+ columns: Array,
4596
+ label: String,
4597
+ tooltip: String
4598
+ },
4599
+ computed: {
4600
+ filtered_columns: function() {
4601
+ return this.columns.filter((function(t) {
4602
+ return "action" !== t.key
4603
+ }))
4604
+ },
4605
+ identity_value_placeholder: function() {
4606
+ return "domain" === this.identity_type ? Object(c["a"])("Please enter a domain", "mo2f-setup") : Object(c["a"])("Please enter a valid email address", "mo2f-setup")
4607
+ },
4608
+ verify_identity_text: function() {
4609
+ return "domain" === this.identity_type ? Object(c["a"])("Enter the domain name to verify it on Amazon SES and generate the required DNS TXT record.", "mo2f-setup") : Object(c["a"])("Enter a valid email address. A verification email will be sent to the email address you entered.", "mo2f-setup")
4610
+ },
4611
+ text_verify_identity_step2_email_text: function() {
4612
+ return Object(c["c"])(Object(c["a"])("Please check the inbox of <b>%s</b> for a confirmation email.", "mo2f-setup"), this.verify_identity_result.value)
4613
+ },
4614
+ ses_domain_name: function() {
4615
+ return this.verify_identity_result.value ? "_amazonses.".concat(this.verify_identity_result.value) : ""
4616
+ },
4617
+ text_verify: function() {
4618
+ return "domain" === this.identity_type ? Object(c["a"])("Verify Domain", "mo2f-setup") : Object(c["a"])("Verify Email", "mo2f-setup")
4619
+ }
4620
+ },
4621
+ data: function() {
4622
+ return {
4623
+ text_no_registered_identities_title: Object(c["a"])("No registered domains or emails.", "mo2f-setup"),
4624
+ text_no_registered_identities_content: Object(c["a"])("You will not be able to send emails until you verify at least one domain or email address for the selected Amazon SES Region.", "mo2f-setup"),
4625
+ text_view_dns: Object(c["a"])("View DNS", "mo2f-setup"),
4626
+ text_resend: Object(c["a"])("Resend", "mo2f-setup"),
4627
+ text_identities_table_description: Object(c["a"])("Here are the domains and email addresses that have been verified and can be used as the From Email.", "mo2f-setup"),
4628
+ text_verify_identity: Object(c["a"])("Verify SES Identity", "mo2f-setup"),
4629
+ text_add_new_identity: Object(c["a"])("Add New SES Identity", "mo2f-setup"),
4630
+ text_name: Object(c["a"])("Name", "mo2f-setup"),
4631
+ text_value: Object(c["a"])("Value", "mo2f-setup"),
4632
+ text_verify_identity_step2_domain_text: Object(c["c"])(Object(c["a"])("Please add this TXT record to your domain's DNS settings. For information on how to add TXT DNS records, please refer to the %1$sAmazon SES documentation%2$s.", "mo2f-setup"), '<a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/dns-txt-records.html" target="_blank" rel="noopener noreferrer">', "</a>"),
4633
+ show_identity_form: !1,
4634
+ identity_type: "domain",
4635
+ identity_type_options: [{
4636
+ label: Object(c["a"])("Verify Domain", "mo2f-setup"),
4637
+ value: "domain"
4638
+ }, {
4639
+ label: Object(c["a"])("Verify Email Address", "mo2f-setup"),
4640
+ value: "email"
4641
+ }],
4642
+ identity_value: "",
4643
+ verify_identity_step: 1,
4644
+ verify_identity_result: {},
4645
+ loading_verify_identity: !1
4646
+ }
4647
+ },
4648
+ methods: {
4649
+ verifyIdentity: function() {
4650
+ if (!this.loading_verify_identity) {
4651
+ this.loading_verify_identity = !0;
4652
+ var t = this;
4653
+ this.$store.dispatch("$_settings/amazonSESRegisterIdentity", {
4654
+ value: this.identity_value,
4655
+ type: this.identity_type
4656
+ }).then((function(e) {
4657
+ t.loading_verify_identity = !1, e.success && e.data && (t.verify_identity_result = e.data, t.verify_identity_step = 2)
4658
+ }))
4659
+ }
4660
+ },
4661
+ addNewIdentity: function() {
4662
+ this.show_identity_form = !0
4663
+ }
4664
+ }
4665
+ },
4666
+ Ri = Hi,
4667
+ Gi = Object(_["a"])(Ri, Wi, Ui, !1, null, null, null),
4668
+ Vi = Gi.exports,
4669
+ Yi = {
4670
+ name: "WizardStepConfigureMailerAmazonSES",
4671
+ components: {
4672
+ SettingsInputText: Ut,
4673
+ SettingsInputSelect: Li,
4674
+ SettingsInputSwitch: ii,
4675
+ SettingsAmazonSESIdentities: Vi
4676
+ },
4677
+ data: function() {
4678
+ return {
4679
+ mailer: "amazonses",
4680
+ text_client_id_label: Object(c["a"])("Access Key ID", "mo2f-setup"),
4681
+ text_client_secret_label: Object(c["a"])("Secret Access Key", Object({
4682
+ NODE_ENV: "production",
4683
+ VUE_APP_TEXTDOMAIN: "mo2f-setup",
4684
+ VUE_APP_PRODUCT_NAME: "WPMailSMTP",
4685
+ BASE_URL: "http://localhost:8080/"
4686
+ }).VUE_APP_TEXTclient_id),
4687
+ text_region_label: Object(c["a"])("Region", "mo2f-setup"),
4688
+ text_identities_label: Object(c["a"])("SES Identities", "mo2f-setup"),
4689
+ text_region_description: Object(c["a"])("Please select the Amazon SES API region which is the closest to where your website is hosted. This can help to decrease network latency between your site and Amazon SES, which will speed up email sending.", "mo2f-setup"),
4690
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
4691
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
4692
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
4693
+ text_force_from_email_title: Object(c["a"])("Force From Email", "mo2f-setup"),
4694
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
4695
+ text_force_from_email_label: Object(c["a"])("If enabled, the From Email setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
4696
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
4697
+ text_from_email_description: Object(c["a"])("The email address that emails are sent from.", "mo2f-setup"),
4698
+ text_documentation_link: Object(c["a"])("Read how to set up Amazon SES", "mo2f-setup"),
4699
+ description: this.$wpms.mailer_options.amazonses.description.substr(0, this.$wpms.mailer_options.amazonses.description.indexOf("<br>")),
4700
+ regionOptions: this.$wpms.mailer_options.amazonses.region_options || [],
4701
+ fetching_identities: !1,
4702
+ field_errors: []
4703
+ }
4704
+ },
4705
+ computed: Object(n["a"])(Object(n["a"])(Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.amazonses.client_id", "settings.amazonses.client_secret", "settings.amazonses.region", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_email_force", "settings.mail.from_name_force"])), Object(ut["b"])("$_settings", {
4706
+ identities_columns: "amazonses_identities.columns",
4707
+ identities: "amazonses_identities.data"
4708
+ })), {}, {
4709
+ is_api_auth_missing: function() {
4710
+ return !this.client_id || !this.client_secret || !this.region
4711
+ }
4712
+ }),
4713
+ watch: {
4714
+ client_id: function() {
4715
+ this.getIdentitiesDelayed()
4716
+ },
4717
+ client_secret: function() {
4718
+ this.getIdentitiesDelayed()
4719
+ },
4720
+ region: function() {
4721
+ this.getIdentities()
4722
+ }
4723
+ },
4724
+ methods: {
4725
+ getIdentities: function() {
4726
+ var t = this;
4727
+ this.fetching_identities || this.client_id.length < 20 || this.client_secret.length < 40 || !this.region || (this.fetching_identities = !0, this.$store.dispatch("$_app/start_loading"), this.$store.dispatch("$_settings/getAmazonSESIdentities").then((function() {
4728
+ t.fetching_identities = !1
4729
+ })).finally((function() {
4730
+ t.$store.dispatch("$_app/stop_loading")
4731
+ })))
4732
+ },
4733
+ getIdentitiesDelayed: Ii()((function() {
4734
+ this.getIdentities()
4735
+ }), 500),
4736
+ areRequiredFieldsValid: function() {
4737
+ var t = !0;
4738
+ return "" === this.client_id && (t = !1, this.field_errors.push("client_id")), "" === this.client_secret && (t = !1, this.field_errors.push("client_secret")), "" === this.region && (t = !1, this.field_errors.push("region")), "" === this.from_email && (t = !1, this.field_errors.push("from_email")), t
4739
+ },
4740
+ removeFieldError: function(t) {
4741
+ this.field_errors = this.field_errors.filter((function(e) {
4742
+ return e !== t
4743
+ }))
4744
+ }
4745
+ },
4746
+ mounted: function() {
4747
+ this.getIdentities()
4748
+ }
4749
+ },
4750
+ Ji = Yi,
4751
+ Ki = Object(_["a"])(Ji, Ti, zi, !1, null, null, null),
4752
+ qi = Ki.exports,
4753
+ Zi = function() {
4754
+ var t = this,
4755
+ e = t.$createElement,
4756
+ i = t._self._c || e;
4757
+ return i("div", {
4758
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-gmail"
4759
+ }, [i("p", {
4760
+ staticClass: "mailer-description",
4761
+ domProps: {
4762
+ innerHTML: t._s(t.description)
4763
+ }
4764
+ }), i("p", {
4765
+ staticClass: "mailer-description mailer-description-links"
4766
+ }, [i("b", [i("a", {
4767
+ staticClass: "mo2f-setup-link",
4768
+ attrs: {
4769
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-gmail-mailer-in-mo2f-setup/#create-app",
4770
+ target: "_blank",
4771
+ rel: "noopener noreferrer"
4772
+ }
4773
+ }, [t._v(t._s(t.text_documentation_link))])])]), i("div", {
4774
+ staticClass: "mo2f-setup-setup-wizard-form"
4775
+ }, [i("settings-input-text", {
4776
+ attrs: {
4777
+ name: "client_id",
4778
+ label: t.text_client_id_label,
4779
+ is_error: t.field_errors.includes("client_id")
4780
+ },
4781
+ on: {
4782
+ is_error_update: function(e) {
4783
+ return t.removeFieldError("client_id")
4784
+ }
4785
+ },
4786
+ model: {
4787
+ value: t.client_id,
4788
+ callback: function(e) {
4789
+ t.client_id = e
4790
+ },
4791
+ expression: "client_id"
4792
+ }
4793
+ }), i("settings-input-text", {
4794
+ attrs: {
4795
+ name: "client_secret",
4796
+ type: "password",
4797
+ label: t.text_client_secret_label,
4798
+ is_error: t.field_errors.includes("client_secret")
4799
+ },
4800
+ on: {
4801
+ is_error_update: function(e) {
4802
+ return t.removeFieldError("client_secret")
4803
+ }
4804
+ },
4805
+ model: {
4806
+ value: t.client_secret,
4807
+ callback: function(e) {
4808
+ t.client_secret = e
4809
+ },
4810
+ expression: "client_secret"
4811
+ }
4812
+ }), i("settings-input-text", {
4813
+ attrs: {
4814
+ value: t.redirect_uri,
4815
+ name: "redirect_uri",
4816
+ label: t.text_redirect_uri_label,
4817
+ copy: "",
4818
+ readonly: ""
4819
+ }
4820
+ }), i("div", {
4821
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
4822
+ }), i("settings-o-auth-connection", {
4823
+ attrs: {
4824
+ label: t.text_authorization_label,
4825
+ mailer: t.mailer,
4826
+ connected_email: t.connected_email_address,
4827
+ is_auth_required: t.is_auth_required,
4828
+ client_id: t.client_id,
4829
+ client_secret: t.client_secret
4830
+ }
4831
+ }), t.is_auth_required ? t._e() : i("div", {
4832
+ staticClass: "mo2f-setup-setup-wizard-form-general-settings"
4833
+ }, [i("div", {
4834
+ staticClass: "mo2f-setup-separator mo2f-setup-separator-big-margin"
4835
+ }), i("settings-input-text", {
4836
+ attrs: {
4837
+ name: "from_name",
4838
+ label: t.text_from_name_label,
4839
+ description: t.text_from_name_description
4840
+ },
4841
+ model: {
4842
+ value: t.from_name,
4843
+ callback: function(e) {
4844
+ t.from_name = e
4845
+ },
4846
+ expression: "from_name"
4847
+ }
4848
+ }), i("settings-input-switch", {
4849
+ attrs: {
4850
+ classname: "sub_setting",
4851
+ name: "from_name_force",
4852
+ title: t.text_force_from_name_title,
4853
+ label: t.text_force_from_name_label
4854
+ },
4855
+ model: {
4856
+ value: t.from_name_force,
4857
+ callback: function(e) {
4858
+ t.from_name_force = e
4859
+ },
4860
+ expression: "from_name_force"
4861
+ }
4862
+ }), i("settings-input-select", {
4863
+ attrs: {
4864
+ name: "from_email",
4865
+ label: t.text_from_email_label,
4866
+ options: t.possible_send_as_emails,
4867
+ description: t.text_from_email_description
4868
+ },
4869
+ model: {
4870
+ value: t.from_email,
4871
+ callback: function(e) {
4872
+ t.from_email = e
4873
+ },
4874
+ expression: "from_email"
4875
+ }
4876
+ })], 1)], 1)])
4877
+ },
4878
+ Xi = [],
4879
+ $i = function() {
4880
+ var t = this,
4881
+ e = t.$createElement,
4882
+ s = t._self._c || e;
4883
+ return s("div", {
4884
+ staticClass: "settings-oauth-connection"
4885
+ }, [s("label", {
4886
+ staticClass: "settings-input-label-container"
4887
+ }, [s("span", {
4888
+ staticClass: "label",
4889
+ domProps: {
4890
+ innerHTML: t._s(t.label)
4891
+ }
4892
+ }), t.tooltip ? s("settings-info-tooltip", {
4893
+ attrs: {
4894
+ content: t.tooltip
4895
+ }
4896
+ }) : t._e()], 1), t.is_auth_required ? s("div", {
4897
+ staticClass: "add-authorization-container"
4898
+ }, [s("p", {
4899
+ staticClass: "description",
4900
+ domProps: {
4901
+ textContent: t._s(t.text_authorization_button_description)
4902
+ }
4903
+ }), s("button", {
4904
+ staticClass: "mo2f-setup-button mo2f-setup-button-main mo2f-setup-button-small",
4905
+ attrs: {
4906
+ type: "button",
4907
+ disabled: !t.are_client_details_ready
4908
+ },
4909
+ on: {
4910
+ click: function(e) {
4911
+ return e.preventDefault(), t.authorize(e)
4912
+ }
4913
+ }
4914
+ }, [t._v(" " + t._s(t.text_authorization_button) + " ")])]) : s("div", {
4915
+ staticClass: "remove-authorization-container"
4916
+ }, [t.connected_email ? s("p", {
4917
+ staticClass: "description connected-as"
4918
+ }, [s("span", {
4919
+ domProps: {
4920
+ innerHTML: t._s(t.text_connected_as_with_email)
4921
+ }
4922
+ }), t._v(" "), s("inline-svg", {
4923
+ staticClass: "icon",
4924
+ attrs: {
4925
+ src: i("9a1d"),
4926
+ width: "16",
4927
+ height: "16"
4928
+ }
4929
+ })], 1) : t._e(), "gmail" === t.mailer ? s("p", {
4930
+ staticClass: "description",
4931
+ domProps: {
4932
+ innerHTML: t._s(t.text_remove_authorization_button_description_google)
4933
+ }
4934
+ }) : t._e(), s("p", {
4935
+ staticClass: "description",
4936
+ domProps: {
4937
+ innerHTML: t._s(t.text_remove_authorization_button_description)
4938
+ }
4939
+ }), s("button", {
4940
+ staticClass: "mo2f-setup-button mo2f-setup-button-red mo2f-setup-button-small",
4941
+ attrs: {
4942
+ type: "button"
4943
+ },
4944
+ on: {
4945
+ click: function(e) {
4946
+ return e.preventDefault(), t.removeAuthorization(e)
4947
+ }
4948
+ }
4949
+ }, [t._v(" " + t._s(t.text_remove_authorization_button) + " ")])])])
4950
+ },
4951
+ ts = [],
4952
+ es = {
4953
+ name: "SettingsOAuthConnection",
4954
+ components: {
4955
+ SettingsInfoTooltip: Nt
4956
+ },
4957
+ props: {
4958
+ label: String,
4959
+ mailer: String,
4960
+ connected_email: String,
4961
+ is_auth_required: Boolean,
4962
+ client_id: String,
4963
+ client_secret: String,
4964
+ tooltip: String,
4965
+ disabled: Boolean
4966
+ },
4967
+ data: function() {
4968
+ return {
4969
+ text_allow_button: Object(c["a"])("Connect to %s", "mo2f-setup"),
4970
+ text_authorization_button_description_general: Object(c["a"])("Before continuing, you'll need to allow this plugin to send emails using your %s account.", "mo2f-setup"),
4971
+ text_remove_authorization_button: Object(c["a"])("Remove Connection", "mo2f-setup"),
4972
+ text_remove_authorization_button_description_google: Object(c["c"])(Object(c["a"])("If you want to use a different From Email address you can setup a Google email alias. %1$sFollow these instructions%2$s, then select the alias in the From Email section below.", "mo2f-setup"), '<a href="https://wpmailsmtp.com/gmail-send-from-alias-mo2f-setup/" target="_blank" rel="noopener noreferrer">', "</a>"),
4973
+ text_remove_authorization_button_desc_template: Object(c["a"])("Removing this connection will give you the ability to redo the connection or connect to different %s account.", "mo2f-setup"),
4974
+ text_connected_as: Object(c["a"])("Connected as", "mo2f-setup")
4975
+ }
4976
+ },
4977
+ computed: {
4978
+ are_client_details_ready: function() {
4979
+ return !!this.client_id && !!this.client_secret
4980
+ },
4981
+ mailer_name: function() {
4982
+ var t = "Google";
4983
+ return "outlook" === this.mailer ? t = "Microsoft Outlook" : "zoho" === this.mailer && (t = "Zoho Mail"), t
4984
+ },
4985
+ text_authorization_button: function() {
4986
+ return Object(c["c"])(this.text_allow_button, this.mailer_name)
4987
+ },
4988
+ text_authorization_button_description: function() {
4989
+ return Object(c["c"])(this.text_authorization_button_description_general, this.mailer_name)
4990
+ },
4991
+ text_remove_authorization_button_description: function() {
4992
+ return Object(c["c"])(this.text_remove_authorization_button_desc_template, this.mailer_name)
4993
+ },
4994
+ text_connected_as_with_email: function() {
4995
+ return "".concat(this.text_connected_as, " <b>").concat(this.connected_email, "</b>")
4996
+ }
4997
+ },
4998
+ methods: {
4999
+ authorize: function() {
5000
+ var t = this;
5001
+ this.$store.dispatch("$_app/start_loading"), this.$store.dispatch("$_settings/getAuthUrl", this.mailer).then((function(t) {
5002
+ t.success && t.data.oauth_url && (window.location.href = t.data.oauth_url)
5003
+ })).finally((function() {
5004
+ t.$store.dispatch("$_app/stop_loading")
5005
+ }))
5006
+ },
5007
+ removeAuthorization: function() {
5008
+ var t = this;
5009
+ this.$store.dispatch("$_app/start_loading"), this.$store.dispatch("$_settings/removeAuth", this.mailer).finally((function() {
5010
+ t.$store.dispatch("$_app/stop_loading")
5011
+ }))
5012
+ },
5013
+ removeUrlParam: function(t, e, i) {
5014
+ e.delete(i), t.search = e.toString(), window.history.replaceState({}, document.title, t.toString())
5015
+ },
5016
+ catchAuthNotice: function() {
5017
+ var t = new URL(window.location.href),
5018
+ e = new URLSearchParams(t.search),
5019
+ i = "",
5020
+ s = "",
5021
+ a = !1;
5022
+ switch (e.has("success") ? (i = e.get("success"), a = !0, this.removeUrlParam(t, e, "success")) : e.has("error") && (i = e.get("error"), this.removeUrlParam(t, e, "error")), i) {
5023
+ case "google_access_denied":
5024
+ case "zoho_access_denied":
5025
+ case "google_no_code_scope":
5026
+ case "microsoft_no_code":
5027
+ case "zoho_no_code":
5028
+ case "zoho_invalid_nonce":
5029
+ s = Object(c["a"])("There was an error while processing the authentication request. Please try again.", "mo2f-setup");
5030
+ break;
5031
+ case "google_no_clients":
5032
+ case "zoho_no_clients":
5033
+ case "zoho_unsuccessful_oauth":
5034
+ case "microsoft_unsuccessful_oauth":
5035
+ case "google_unsuccessful_oauth":
5036
+ s = Object(c["a"])("There was an error while processing the authentication request. Please recheck your Client ID and Client Secret and try again.", "mo2f-setup");
5037
+ break;
5038
+ case "google_site_linked":
5039
+ s = Object(c["a"])("You have successfully linked the current site with your Google API project. Now you can start sending emails through Gmail.", "mo2f-setup");
5040
+ break;
5041
+ case "microsoft_site_linked":
5042
+ s = Object(c["a"])("You have successfully linked the current site with your Microsoft API project. Now you can start sending emails through Outlook.", "mo2f-setup");
5043
+ break;
5044
+ case "zoho_site_linked":
5045
+ s = Object(c["a"])("You have successfully linked the current site with your Zoho Mail API project. Now you can start sending emails through Zoho Mail.", "mo2f-setup");
5046
+ break
5047
+ }
5048
+ s.length > 0 && this.$swal({
5049
+ title: a ? Object(c["a"])("Successful Authorization", "mo2f-setup") : Object(c["a"])("Authorization Error!", "mo2f-setup"),
5050
+ text: s,
5051
+ width: 550,
5052
+ showCloseButton: !0,
5053
+ customClass: {
5054
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
5055
+ }
5056
+ })
5057
+ }
5058
+ },
5059
+ mounted: function() {
5060
+ this.catchAuthNotice()
5061
+ }
5062
+ },
5063
+ is = es,
5064
+ ss = Object(_["a"])(is, $i, ts, !1, null, null, null),
5065
+ as = ss.exports,
5066
+ ns = {
5067
+ name: "WizardStepConfigureMailerGmail",
5068
+ components: {
5069
+ SettingsInputText: Ut,
5070
+ SettingsInputSwitch: ii,
5071
+ SettingsOAuthConnection: as,
5072
+ SettingsInputSelect: Li
5073
+ },
5074
+ data: function() {
5075
+ return {
5076
+ mailer: "gmail",
5077
+ text_client_id_label: Object(c["a"])("Client ID", "mo2f-setup"),
5078
+ text_client_secret_label: Object(c["a"])("Client Secret", "mo2f-setup"),
5079
+ text_redirect_uri_label: Object(c["a"])("Authorized Redirect URI", "mo2f-setup"),
5080
+ text_authorization_label: Object(c["a"])("Authorization", "mo2f-setup"),
5081
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
5082
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
5083
+ text_from_email_label: Object(c["a"])("From Email", "mo2f-setup"),
5084
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
5085
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
5086
+ text_from_email_description: Object(c["a"])("Select which email address you would like to send your emails from.", "mo2f-setup"),
5087
+ text_documentation_link: Object(c["a"])("Read how to set up the Gmail mailer", "mo2f-setup"),
5088
+ description: this.$wpms.mailer_options.gmail.description.substr(0, this.$wpms.mailer_options.gmail.description.indexOf("<br>")),
5089
+ redirect_uri: this.$wpms.mailer_options.gmail.redirect_uri,
5090
+ connected_email_address: null,
5091
+ possible_send_as_emails: [],
5092
+ field_errors: []
5093
+ }
5094
+ },
5095
+ computed: Object(n["a"])(Object(n["a"])(Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.gmail.client_id", "settings.gmail.client_secret", "settings.gmail.access_token", "settings.gmail.refresh_token", "settings.mail.from_email", "settings.mail.from_name", "settings.mail.from_name_force"])), Object(ut["b"])("$_wizard", ["blocked_step"])), {}, {
5096
+ is_auth_required: function() {
5097
+ return !this.access_token || !this.refresh_token
5098
+ }
5099
+ }),
5100
+ watch: {
5101
+ is_auth_required: function(t) {
5102
+ this.blocked_step = t
5103
+ }
5104
+ },
5105
+ methods: {
5106
+ getConnectedData: function() {
5107
+ var t = this;
5108
+ this.$store.dispatch("$_settings/getConnectedData", this.mailer).then((function(e) {
5109
+ e.success && e.data && (t.connected_email_address = e.data.connected_email || null, t.possible_send_as_emails = e.data.possible_send_from_addresses || [], t.isEmailInPosibleAddresses(t.from_email) || (t.from_email = t.connected_email_address))
5110
+ }))
5111
+ },
5112
+ isEmailInPosibleAddresses: function(t) {
5113
+ return this.possible_send_as_emails.find((function(e) {
5114
+ return e.value === t
5115
+ }))
5116
+ },
5117
+ areRequiredFieldsValid: function() {
5118
+ var t = !0;
5119
+ return "" === this.client_id && (t = !1, this.field_errors.push("client_id")), "" === this.client_secret && (t = !1, this.field_errors.push("client_secret")), t
5120
+ },
5121
+ removeFieldError: function(t) {
5122
+ this.field_errors = this.field_errors.filter((function(e) {
5123
+ return e !== t
5124
+ }))
5125
+ }
5126
+ },
5127
+ mounted: function() {
5128
+ this.getConnectedData(), this.is_auth_required && (this.blocked_step = !0)
5129
+ }
5130
+ },
5131
+ os = ns,
5132
+ rs = Object(_["a"])(os, Zi, Xi, !1, null, null, null),
5133
+ ls = rs.exports,
5134
+ cs = function() {
5135
+ var t = this,
5136
+ e = t.$createElement,
5137
+ i = t._self._c || e;
5138
+ return i("div", {
5139
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-outlook"
5140
+ }, [i("p", {
5141
+ staticClass: "mailer-description",
5142
+ domProps: {
5143
+ innerHTML: t._s(t.description)
5144
+ }
5145
+ }), i("p", {
5146
+ staticClass: "mailer-description mailer-description-links"
5147
+ }, [i("a", {
5148
+ staticClass: "mo2f-setup-link",
5149
+ attrs: {
5150
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-outlook-mailer-in-mo2f-setup/#microsoft-setup",
5151
+ target: "_blank",
5152
+ rel: "noopener noreferrer"
5153
+ }
5154
+ }, [t._v(t._s(t.text_documentation_link))])]), i("div", {
5155
+ staticClass: "mo2f-setup-setup-wizard-form"
5156
+ }, [i("settings-input-text", {
5157
+ attrs: {
5158
+ name: "client_id",
5159
+ label: t.text_client_id_label,
5160
+ is_error: t.field_errors.includes("client_id")
5161
+ },
5162
+ on: {
5163
+ is_error_update: function(e) {
5164
+ return t.removeFieldError("client_id")
5165
+ }
5166
+ },
5167
+ model: {
5168
+ value: t.client_id,
5169
+ callback: function(e) {
5170
+ t.client_id = e
5171
+ },
5172
+ expression: "client_id"
5173
+ }
5174
+ }), i("settings-input-text", {
5175
+ attrs: {
5176
+ name: "client_secret",
5177
+ type: "password",
5178
+ label: t.text_client_secret_label,
5179
+ is_error: t.field_errors.includes("client_secret")
5180
+ },
5181
+ on: {
5182
+ is_error_update: function(e) {
5183
+ return t.removeFieldError("client_secret")
5184
+ }
5185
+ },
5186
+ model: {
5187
+ value: t.client_secret,
5188
+ callback: function(e) {
5189
+ t.client_secret = e
5190
+ },
5191
+ expression: "client_secret"
5192
+ }
5193
+ }), i("settings-input-text", {
5194
+ attrs: {
5195
+ value: t.redirect_uri,
5196
+ name: "redirect_uri",
5197
+ label: t.text_redirect_uri_label,
5198
+ copy: "",
5199
+ readonly: ""
5200
+ }
5201
+ }), i("settings-o-auth-connection", {
5202
+ attrs: {
5203
+ - mailer: t.mailer,
5204
+ connected_email: t.connected_email_address,
5205
+ is_auth_required: t.is_auth_required,
5206
+ client_id: t.client_id,
5207
+ client_secret: t.client_secret
5208
+ }
5209
+ })], 1)])
5210
+ },
5211
+ ps = [],
5212
+ ms = {
5213
+ name: "WizardStepConfigureMailerOutlook",
5214
+ components: {
5215
+ SettingsInputText: Ut,
5216
+ SettingsOAuthConnection: as
5217
+ },
5218
+ data: function() {
5219
+ return {
5220
+ mailer: "outlook",
5221
+ text_client_id_label: Object(c["a"])("Application ID", "mo2f-setup"),
5222
+ text_client_secret_label: Object(c["a"])("Application Password", "mo2f-setup"),
5223
+ text_redirect_uri_label: Object(c["a"])("Redirect URI", "mo2f-setup"),
5224
+ text_authorization_label: Object(c["a"])("Authorization", "mo2f-setup"),
5225
+ text_documentation_link: Object(c["a"])("Read how to set up Outlook", "mo2f-setup"),
5226
+ description: this.$wpms.mailer_options.outlook.description.substr(0, this.$wpms.mailer_options.outlook.description.indexOf("<br>")),
5227
+ redirect_uri: this.$wpms.mailer_options.outlook.redirect_uri,
5228
+ field_errors: []
5229
+ }
5230
+ },
5231
+ computed: Object(n["a"])(Object(n["a"])(Object(n["a"])(Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.outlook.client_id", "settings.outlook.client_secret", "settings.outlook.access_token", "settings.outlook.refresh_token"])), Object(ut["b"])("$_wizard", ["blocked_step"])), Object(nt["b"])({
5232
+ connected_email_address: "$_settings/outlook_email"
5233
+ })), {}, {
5234
+ is_auth_required: function() {
5235
+ return !this.access_token || !this.refresh_token
5236
+ }
5237
+ }),
5238
+ watch: {
5239
+ is_auth_required: function(t) {
5240
+ this.blocked_step = t
5241
+ }
5242
+ },
5243
+ methods: {
5244
+ areRequiredFieldsValid: function() {
5245
+ var t = !0;
5246
+ return "" === this.client_id && (t = !1, this.field_errors.push("client_id")), "" === this.client_secret && (t = !1, this.field_errors.push("client_secret")), t
5247
+ },
5248
+ removeFieldError: function(t) {
5249
+ this.field_errors = this.field_errors.filter((function(e) {
5250
+ return e !== t
5251
+ }))
5252
+ }
5253
+ },
5254
+ mounted: function() {
5255
+ this.is_auth_required && (this.blocked_step = !0)
5256
+ }
5257
+ },
5258
+ us = ms,
5259
+ ds = Object(_["a"])(us, cs, ps, !1, null, null, null),
5260
+ _s = ds.exports,
5261
+ fs = function() {
5262
+ var t = this,
5263
+ e = t.$createElement,
5264
+ i = t._self._c || e;
5265
+ return i("div", {
5266
+ staticClass: "mo2f-setup-setup-wizard-step-configure-mailer-settings mo2f-setup-setup-wizard-step-configure-mailer-settings-zoho"
5267
+ }, [i("p", {
5268
+ staticClass: "mailer-description",
5269
+ domProps: {
5270
+ innerHTML: t._s(t.description)
5271
+ }
5272
+ }), i("p", {
5273
+ staticClass: "mailer-description mailer-description-links"
5274
+ }, [i("a", {
5275
+ staticClass: "mo2f-setup-link",
5276
+ attrs: {
5277
+ href: "https://wpmailsmtp.com/docs/how-to-set-up-the-zoho-mailer-in-mo2f-setup/#zoho-account",
5278
+ target: "_blank",
5279
+ rel: "noopener noreferrer"
5280
+ }
5281
+ }, [t._v(t._s(t.text_documentation_link))])]), i("div", {
5282
+ staticClass: "mo2f-setup-setup-wizard-form"
5283
+ }, [i("settings-input-select", {
5284
+ attrs: {
5285
+ name: "domain",
5286
+ label: t.text_domain_label,
5287
+ options: t.domain_options,
5288
+ description: t.text_domain_description,
5289
+ is_error: t.field_errors.includes("domain")
5290
+ },
5291
+ on: {
5292
+ is_error_update: function(e) {
5293
+ return t.removeFieldError("domain")
5294
+ }
5295
+ },
5296
+ model: {
5297
+ value: t.domain,
5298
+ callback: function(e) {
5299
+ t.domain = e
5300
+ },
5301
+ expression: "domain"
5302
+ }
5303
+ }), i("settings-input-text", {
5304
+ attrs: {
5305
+ name: "client_id",
5306
+ label: t.text_client_id_label,
5307
+ is_error: t.field_errors.includes("client_id")
5308
+ },
5309
+ on: {
5310
+ is_error_update: function(e) {
5311
+ return t.removeFieldError("client_id")
5312
+ }
5313
+ },
5314
+ model: {
5315
+ value: t.client_id,
5316
+ callback: function(e) {
5317
+ t.client_id = e
5318
+ },
5319
+ expression: "client_id"
5320
+ }
5321
+ }), i("settings-input-text", {
5322
+ attrs: {
5323
+ name: "client_secret",
5324
+ type: "password",
5325
+ label: t.text_client_secret_label,
5326
+ is_error: t.field_errors.includes("client_secret")
5327
+ },
5328
+ on: {
5329
+ is_error_update: function(e) {
5330
+ return t.removeFieldError("client_secret")
5331
+ }
5332
+ },
5333
+ model: {
5334
+ value: t.client_secret,
5335
+ callback: function(e) {
5336
+ t.client_secret = e
5337
+ },
5338
+ expression: "client_secret"
5339
+ }
5340
+ }), i("settings-input-text", {
5341
+ attrs: {
5342
+ value: t.redirect_uri,
5343
+ name: "redirect_uri",
5344
+ label: t.text_redirect_uri_label,
5345
+ copy: "",
5346
+ readonly: ""
5347
+ }
5348
+ }), i("settings-o-auth-connection", {
5349
+ attrs: {
5350
+ label: t.text_authorization_label,
5351
+ mailer: t.mailer,
5352
+ connected_email: t.connected_email_address,
5353
+ is_auth_required: t.is_auth_required,
5354
+ client_id: t.client_id,
5355
+ client_secret: t.client_secret
5356
+ }
5357
+ }), t.is_auth_required ? t._e() : i("div", [i("settings-input-text", {
5358
+ attrs: {
5359
+ name: "from_name",
5360
+ label: t.text_from_name_label,
5361
+ description: t.text_from_name_description
5362
+ },
5363
+ model: {
5364
+ value: t.from_name,
5365
+ callback: function(e) {
5366
+ t.from_name = e
5367
+ },
5368
+ expression: "from_name"
5369
+ }
5370
+ }), i("settings-input-switch", {
5371
+ attrs: {
5372
+ classname: "sub_setting",
5373
+ name: "from_name_force",
5374
+ title: t.text_force_from_name_title,
5375
+ label: t.text_force_from_name_label
5376
+ },
5377
+ model: {
5378
+ value: t.from_name_force,
5379
+ callback: function(e) {
5380
+ t.from_name_force = e
5381
+ },
5382
+ expression: "from_name_force"
5383
+ }
5384
+ })], 1)], 1)])
5385
+ },
5386
+ hs = [],
5387
+ gs = {
5388
+ name: "WizardStepConfigureMailerZoho",
5389
+ components: {
5390
+ SettingsInputText: Ut,
5391
+ SettingsInputSwitch: ii,
5392
+ SettingsInputSelect: Li,
5393
+ SettingsOAuthConnection: as
5394
+ },
5395
+ data: function() {
5396
+ return {
5397
+ mailer: "zoho",
5398
+ text_domain_label: Object(c["a"])("Region", "mo2f-setup"),
5399
+ text_domain_description: Object(c["a"])("The data center location used by your Zoho account.", "mo2f-setup"),
5400
+ text_client_id_label: Object(c["a"])("Client ID", "mo2f-setup"),
5401
+ text_client_secret_label: Object(c["a"])("Client Secret", "mo2f-setup"),
5402
+ text_redirect_uri_label: Object(c["a"])("Redirect URI", "mo2f-setup"),
5403
+ text_authorization_label: Object(c["a"])("Authorization", "mo2f-setup"),
5404
+ text_from_name_label: Object(c["a"])("From Name", "mo2f-setup"),
5405
+ text_force_from_name_title: Object(c["a"])("Force From Name", "mo2f-setup"),
5406
+ text_force_from_name_label: Object(c["a"])("If enabled, the From Name setting above will be used for all emails, ignoring values set by other plugins.", "mo2f-setup"),
5407
+ text_from_name_description: Object(c["a"])("The name that emails are sent from.", "mo2f-setup"),
5408
+ text_documentation_link: Object(c["a"])("Read how to set up Zoho Mail", "mo2f-setup"),
5409
+ description: this.$wpms.mailer_options.zoho.description.substr(0, this.$wpms.mailer_options.zoho.description.indexOf("<br>")),
5410
+ redirect_uri: this.$wpms.mailer_options.zoho.redirect_uri,
5411
+ domain_options: this.$wpms.mailer_options.zoho.domain_options,
5412
+ field_errors: []
5413
+ }
5414
+ },
5415
+ computed: Object(n["a"])(Object(n["a"])(Object(n["a"])(Object(n["a"])({}, Object(ut["b"])("$_settings", ["settings.zoho.domain", "settings.zoho.client_id", "settings.zoho.client_secret", "settings.zoho.access_token", "settings.zoho.refresh_token", "settings.mail.from_name", "settings.mail.from_name_force"])), Object(ut["b"])("$_wizard", ["blocked_step"])), Object(nt["b"])({
5416
+ connected_email_address: "$_settings/zoho_email"
5417
+ })), {}, {
5418
+ is_auth_required: function() {
5419
+ return !this.access_token || !this.refresh_token
5420
+ }
5421
+ }),
5422
+ watch: {
5423
+ is_auth_required: function(t) {
5424
+ this.blocked_step = t
5425
+ }
5426
+ },
5427
+ methods: {
5428
+ areRequiredFieldsValid: function() {
5429
+ var t = !0;
5430
+ return "" === this.domain && (t = !1, this.field_errors.push("domain")), "" === this.client_id && (t = !1, this.field_errors.push("client_id")), "" === this.client_secret && (t = !1, this.field_errors.push("client_secret")), t
5431
+ },
5432
+ removeFieldError: function(t) {
5433
+ this.field_errors = this.field_errors.filter((function(e) {
5434
+ return e !== t
5435
+ }))
5436
+ }
5437
+ },
5438
+ mounted: function() {
5439
+ this.is_auth_required && (this.blocked_step = !0)
5440
+ }
5441
+ },
5442
+ ws = gs,
5443
+ bs = Object(_["a"])(ws, fs, hs, !1, null, null, null),
5444
+ As = bs.exports,
5445
+ vs = new o["a"]({
5446
+ routes: [{
5447
+ path: "*",
5448
+ redirect: "/"
5449
+ }, {
5450
+ path: "/",
5451
+ name: "welcome",
5452
+ component: O
5453
+ }, {
5454
+ path: "/step",
5455
+ name: "step",
5456
+ component: N,
5457
+ children: [{
5458
+ path: "import",
5459
+ name: "import_step",
5460
+ component: it
5461
+ }, {
5462
+ path: "choose_mailer",
5463
+ name: "choose_mailer_step",
5464
+ component: ct
5465
+ }, {
5466
+ path: "configure_mailer",
5467
+ name: "configure_mailer_step",
5468
+ component: ht,
5469
+ children: [{
5470
+ path: "smtp",
5471
+ name: "configure_mailer_step_smtp",
5472
+ component: oi
5473
+ }, {
5474
+ path: "smtpcom",
5475
+ name: "configure_mailer_step_smtpcom",
5476
+ component: ui
5477
+ }, {
5478
+ path: "sendinblue",
5479
+ name: "configure_mailer_step_sendinblue",
5480
+ component: wi
5481
+ }, {
5482
+ path: "mailgun",
5483
+ name: "configure_mailer_step_mailgun",
5484
+ component: Ci
5485
+ }, {
5486
+ path: "sendgrid",
5487
+ name: "configure_mailer_step_sendgrid",
5488
+ component: Ei
5489
+ }, {
5490
+ path: "amazoneses",
5491
+ name: "configure_mailer_step_amazonses",
5492
+ component: qi
5493
+ }, {
5494
+ path: "gmail",
5495
+ name: "configure_mailer_step_gmail",
5496
+ component: ls
5497
+ }, {
5498
+ path: "outlook",
5499
+ name: "configure_mailer_step_outlook",
5500
+ component: _s
5501
+ }, {
5502
+ path: "zoho",
5503
+ name: "configure_mailer_step_zoho",
5504
+ component: As
5505
+ }]
5506
+ }, {
5507
+ path: "plugin_features",
5508
+ name: "plugin_features_step",
5509
+ component: St
5510
+ }, {
5511
+ path: "help_improve",
5512
+ name: "help_improve_step",
5513
+ component: Xt
5514
+ }, {
5515
+ path: "license",
5516
+ name: "license_step",
5517
+ component: oe
5518
+ }, {
5519
+ path: "check_configuration",
5520
+ name: "check_configuration_step",
5521
+ component: ue
5522
+ }, {
5523
+ path: "successful_configuration",
5524
+ name: "check_configuration_step_success",
5525
+ component: Ee
5526
+ }, {
5527
+ path: "failed_configuration",
5528
+ name: "check_configuration_step_failure",
5529
+ component: De
5530
+ }]
5531
+ }],
5532
+ scrollBehavior: function() {
5533
+ return {
5534
+ x: 0,
5535
+ y: 0
5536
+ }
5537
+ }
5538
+ }),
5539
+ xs = {
5540
+ name: "SetupWizardApp",
5541
+ router: vs,
5542
+ computed: Object(n["a"])({}, Object(nt["b"])({
5543
+ blocked: "$_app/blocked",
5544
+ loading: "$_app/loading"
5545
+ }))
5546
+ },
5547
+ ys = xs,
5548
+ Cs = Object(_["a"])(ys, s, a, !1, null, null, null),
5549
+ ks = Cs.exports,
5550
+ Os = i("2b0e"),
5551
+ js = i("5886"),
5552
+ Ss = (i("466d"), {
5553
+ install: function(t) {
5554
+ window.wp_mail_smtp_vue && (t.prototype.$wpms = window.wp_mail_smtp_vue), t.prototype.$isPro = Ps, t.prototype.$addQueryArg = Es
5555
+ }
5556
+ });
5557
+
5558
+ function Ps() {
5559
+ return window.wp_mail_smtp_vue.is_pro
5560
+ }
5561
+
5562
+ function Es(t, e, i) {
5563
+ var s = new RegExp("([?&])" + e + "=.*?(&|#|$)", "i");
5564
+ if (t.match(s)) return t.replace(s, "$1" + e + "=" + i + "$2");
5565
+ var a = ""; - 1 !== t.indexOf("#") && (a = t.replace(/.*#/, "#"), t = t.replace(/#.*/, ""));
5566
+ var n = -1 !== t.indexOf("?") ? "&" : "?";
5567
+ return t + n + e + "=" + i + a
5568
+ }
5569
+ var Ts = Ss,
5570
+ zs = {
5571
+ install: function(t) {
5572
+ t.prototype.$next_step = function() {
5573
+ var e = this,
5574
+ i = t.prototype.$wizard_steps.findIndex((function(t) {
5575
+ return e.$route.name.includes(t)
5576
+ })) + 1;
5577
+ this.$router.push({
5578
+ name: t.prototype.$wizard_steps[i]
5579
+ })
5580
+ }, t.prototype.$previous_step = function() {
5581
+ var e = this,
5582
+ i = "welcome",
5583
+ s = t.prototype.$wizard_steps.findIndex((function(t) {
5584
+ return e.$route.name.includes(t)
5585
+ })) - 1;
5586
+ s >= 0 && (i = t.prototype.$wizard_steps[s]), this.$router.push({
5587
+ name: i
5588
+ })
5589
+ }, t.prototype.$swal && (t.prototype.$wpms_success_toast = function(e) {
5590
+ var i = e.animation,
5591
+ s = void 0 !== i && i,
5592
+ a = e.toast,
5593
+ n = void 0 === a || a,
5594
+ o = e.position,
5595
+ r = void 0 === o ? "top-end" : o,
5596
+ l = e.showConfirmButton,
5597
+ p = void 0 !== l && l,
5598
+ m = e.icon,
5599
+ u = void 0 === m ? "success" : m,
5600
+ d = e.timer,
5601
+ _ = void 0 === d ? 3e3 : d,
5602
+ f = e.showCloseButton,
5603
+ h = void 0 === f || f,
5604
+ g = e.title,
5605
+ w = void 0 === g ? Object(c["a"])("Settings Updated", "mo2f-setup") : g,
5606
+ b = e.showCancelButton,
5607
+ A = void 0 !== b && b,
5608
+ v = e.confirmButtonText,
5609
+ x = void 0 === v ? "" : v,
5610
+ y = e.cancelButtonText,
5611
+ C = void 0 === y ? "" : y,
5612
+ k = e.text,
5613
+ O = void 0 === k ? "" : k;
5614
+ return t.prototype.$swal({
5615
+ animation: s,
5616
+ toast: n,
5617
+ position: r,
5618
+ showConfirmButton: p,
5619
+ icon: u,
5620
+ showCloseButton: h,
5621
+ title: w,
5622
+ timer: _,
5623
+ showCancelButton: A,
5624
+ confirmButtonText: x,
5625
+ cancelButtonText: C,
5626
+ text: O
5627
+ })
5628
+ }, t.prototype.$wpms_error_toast = function(e) {
5629
+ var i = e.animation,
5630
+ s = void 0 !== i && i,
5631
+ a = e.toast,
5632
+ n = void 0 === a || a,
5633
+ o = e.position,
5634
+ r = void 0 === o ? "top-end" : o,
5635
+ l = e.showConfirmButton,
5636
+ p = void 0 !== l && l,
5637
+ m = e.icon,
5638
+ u = void 0 === m ? "error" : m,
5639
+ d = e.showCloseButton,
5640
+ _ = void 0 === d || d,
5641
+ f = e.title,
5642
+ h = void 0 === f ? Object(c["a"])("Could Not Save Changes", "mo2f-setup") : f,
5643
+ g = e.text,
5644
+ w = void 0 === g ? "" : g;
5645
+ return t.prototype.$swal({
5646
+ animation: s,
5647
+ toast: n,
5648
+ position: r,
5649
+ showConfirmButton: p,
5650
+ icon: u,
5651
+ showCloseButton: _,
5652
+ title: h,
5653
+ text: w,
5654
+ onOpen: function() {
5655
+ t.prototype.$swal.hideLoading()
5656
+ }
5657
+ })
5658
+ }, t.prototype.$wpms_error_modal = function(e) {
5659
+ var i = e.position,
5660
+ s = void 0 === i ? "center" : i,
5661
+ a = e.width,
5662
+ n = void 0 === a ? 650 : a,
5663
+ o = e.showConfirmButton,
5664
+ r = void 0 === o || o,
5665
+ l = e.confirmButtonText,
5666
+ p = void 0 === l ? Object(c["a"])("Return to Mailer Settings", "mo2f-setup") : l,
5667
+ m = e.customClass,
5668
+ u = void 0 === m ? {
5669
+ container: "mo2f-setup-swal mo2f-setup-swal-error"
5670
+ } : m,
5671
+ d = e.showCloseButton,
5672
+ _ = void 0 === d || d,
5673
+ f = e.title,
5674
+ h = void 0 === f ? Object(c["a"])("Whoops, we found an issue!", "mo2f-setup") : f,
5675
+ g = e.subtitle,
5676
+ w = void 0 === g ? Object(c["a"])("It looks like something went wrong...", "mo2f-setup") : g,
5677
+ b = e.detailedError,
5678
+ A = void 0 === b ? "" : b;
5679
+ return t.prototype.$swal({
5680
+ position: s,
5681
+ width: n,
5682
+ showConfirmButton: r,
5683
+ confirmButtonText: p,
5684
+ customClass: u,
5685
+ showCloseButton: _,
5686
+ title: h,
5687
+ html: '\n\t\t\t\t\t\t<p class="subtitle">'.concat(w, '</p>\n\t\t\t\t\t\t<div class="detailed-error">\n\t\t\t\t\t\t\t<h3>').concat(Object(c["a"])("Error Message:", "mo2f-setup"), "</h3>\n\t\t\t\t\t\t\t<div>").concat(A, "</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t"),
5688
+ allowEscapeKey: !1,
5689
+ allowOutsideClick: !1,
5690
+ onOpen: function() {
5691
+ t.prototype.$swal.hideLoading()
5692
+ }
5693
+ })
5694
+ }, t.prototype.$required_fields_modal = function() {
5695
+ return t.prototype.$swal({
5696
+ position: "center",
5697
+ width: 450,
5698
+ showConfirmButton: !0,
5699
+ confirmButtonText: Object(c["a"])("OK", "mo2f-setup"),
5700
+ customClass: {
5701
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
5702
+ },
5703
+ showCloseButton: !0,
5704
+ title: Object(c["a"])("Heads up!", "mo2f-setup"),
5705
+ text: Object(c["a"])("Please fill out all the required fields to continue.", "mo2f-setup"),
5706
+ allowEscapeKey: !1,
5707
+ allowOutsideClick: !1
5708
+ })
5709
+ })
5710
+ }
5711
+ },
5712
+ Bs = zs,
5713
+ Is = i("bc3a"),
5714
+ Ms = i.n(Is),
5715
+ Ds = function(t, e) {
5716
+ return new Promise((function(i, s) {
5717
+ var a = new FormData;
5718
+ a.append("action", "wp_mail_smtp_vue_install_plugin"), a.append("nonce", Os["a"].prototype.$wpms.nonce), a.append("slug", e), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, a).then((function(e) {
5719
+ if (e.data.success) t.commit("PLUGIN_INSTALLED", e.data);
5720
+ else {
5721
+ var s = "";
5722
+ ie()(e.data, "data[0].message") ? s = e.data.data[0].message : ie()(e.data, "data") && (s = e.data.data), Os["a"].prototype.$wpms_error_modal({
5723
+ subtitle: Object(c["a"])("It looks like the plugin installation failed!", "mo2f-setup"),
5724
+ detailedError: s
5725
+ })
5726
+ }
5727
+ i(e.data)
5728
+ })).catch((function(t) {
5729
+ if (s(t), t.response) {
5730
+ var e = t.response;
5731
+ return Os["a"].prototype.$wpms_error_modal({
5732
+ subtitle: Object(c["a"])("It looks like we can't install the plugin.", "mo2f-setup"),
5733
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5734
+ })
5735
+ }
5736
+ Os["a"].prototype.$wpms_error_toast({
5737
+ title: Object(c["a"])("You appear to be offline. Plugin not installed.", "mo2f-setup")
5738
+ })
5739
+ }))
5740
+ }))
5741
+ },
5742
+ Fs = function(t) {
5743
+ return new Promise((function(e, i) {
5744
+ var s = new FormData;
5745
+ s.append("action", "wp_mail_smtp_vue_get_partner_plugins_info"), s.append("nonce", Os["a"].prototype.$wpms.nonce), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(i) {
5746
+ i.data.success ? t.commit("PLUGINS_FETCHED", i.data) : Os["a"].prototype.$wpms_error_toast({
5747
+ title: Object(c["a"])("Can't fetch plugins information.", "mo2f-setup")
5748
+ }), e(i.data)
5749
+ })).catch((function(t) {
5750
+ if (i(t), t.response) {
5751
+ var e = t.response;
5752
+ return Os["a"].prototype.$wpms_error_modal({
5753
+ subtitle: Object(c["a"])("It looks like we can't fetch plugins information.", "mo2f-setup"),
5754
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5755
+ })
5756
+ }
5757
+ Os["a"].prototype.$wpms_error_toast({
5758
+ title: Object(c["a"])("You appear to be offline. Plugin information not retrieved.", "mo2f-setup")
5759
+ })
5760
+ }))
5761
+ }))
5762
+ },
5763
+ Ns = {
5764
+ installPlugin: Ds,
5765
+ fetchPlugins: Fs
5766
+ },
5767
+ Qs = function(t, e) {
5768
+ return Ns.installPlugin(t, e)
5769
+ },
5770
+ Ls = function(t) {
5771
+ return Ns.fetchPlugins(t)
5772
+ },
5773
+ Ws = {
5774
+ installPlugin: Qs,
5775
+ getPlugins: Ls
5776
+ },
5777
+ Us = function(t) {
5778
+ return t.plugins
5779
+ },
5780
+ Hs = function(t) {
5781
+ return t.plugins.filter((function(t) {
5782
+ return "wpforms-lite" !== t.slug
5783
+ }))
5784
+ },
5785
+ Rs = function(t) {
5786
+ return t.contact_form_plugin_already_installed
5787
+ },
5788
+ Gs = {
5789
+ getField: ut["a"],
5790
+ plugins: Us,
5791
+ partner_plugins: Hs,
5792
+ contact_form_plugin_already_installed: Rs
5793
+ },
5794
+ Vs = (i("d81d"), function(t, e) {
5795
+ t.plugins.map((function(i) {
5796
+ return i.slug === e.data.slug && (i.is_installed = e.data.is_installed, i.is_activated = e.data.is_activated), "wpforms-lite" === e.data.slug && (t.contact_form_plugin_already_installed = !0), i
5797
+ }))
5798
+ }),
5799
+ Ys = function(t, e) {
5800
+ t.plugins = e.data.plugins, t.contact_form_plugin_already_installed = e.data.contact_form_plugin_already_installed
5801
+ },
5802
+ Js = {
5803
+ updateField: ut["c"],
5804
+ PLUGIN_INSTALLED: Vs,
5805
+ PLUGINS_FETCHED: Ys
5806
+ },
5807
+ Ks = {
5808
+ plugins: [],
5809
+ contact_form_plugin_already_installed: !1,
5810
+ smart_contact_form_setting: !0
5811
+ },
5812
+ qs = {
5813
+ namespaced: !0,
5814
+ state: Ks,
5815
+ actions: Ws,
5816
+ getters: Gs,
5817
+ mutations: Js
5818
+ },
5819
+ Zs = (i("b64b"), function(t) {
5820
+ return new Promise((function(e, i) {
5821
+ var s = new FormData;
5822
+ s.append("action", "wp_mail_smtp_vue_get_settings"), s.append("nonce", Os["a"].prototype.$wpms.nonce), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(t) {
5823
+ t.data.success ? e(t.data) : i(t.data)
5824
+ })).catch((function(e) {
5825
+ if (t.dispatch("$_app/block", !1, {
5826
+ root: !0
5827
+ }), e.response) {
5828
+ var i = e.response;
5829
+ return Os["a"].prototype.$wpms_error_modal({
5830
+ subtitle: Object(c["a"])("It looks like we can't load the settings.", "mo2f-setup"),
5831
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), i.status, i.statusText)
5832
+ })
5833
+ }
5834
+ Os["a"].prototype.$wpms_error_toast({
5835
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
5836
+ })
5837
+ }))
5838
+ }))
5839
+ }),
5840
+ Xs = function(t, e) {
5841
+ return new Promise((function(t, i) {
5842
+ var s = new FormData;
5843
+ s.append("action", "wp_mail_smtp_vue_get_amazon_ses_identities"), s.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== e && s.append("value", JSON.stringify(e)), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(e) {
5844
+ e.data.success ? t(e.data) : i(e.data)
5845
+ })).catch((function(t) {
5846
+ if (t.response) {
5847
+ var e = t.response;
5848
+ return Os["a"].prototype.$wpms_error_modal({
5849
+ subtitle: Object(c["a"])("It looks like we can't retrieve Amazon SES Identities.", "mo2f-setup"),
5850
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5851
+ })
5852
+ }
5853
+ Os["a"].prototype.$wpms_error_toast({
5854
+ title: Object(c["a"])("Can't retrieve Amazon SES Identities.", "mo2f-setup")
5855
+ })
5856
+ }))
5857
+ }))
5858
+ },
5859
+ $s = function(t, e) {
5860
+ return new Promise((function(t, i) {
5861
+ var s = new FormData;
5862
+ s.append("action", "wp_mail_smtp_vue_amazon_ses_identity_registration"), s.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== e.value && s.append("value", e.value), !1 !== e.value && s.append("type", e.type), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(e) {
5863
+ e.data.success ? t(e.data) : i(e.data)
5864
+ })).catch((function(t) {
5865
+ if (t.response) {
5866
+ var e = t.response;
5867
+ return Os["a"].prototype.$wpms_error_modal({
5868
+ subtitle: Object(c["a"])("It looks like we can't register the Amazon SES Identity.", "mo2f-setup"),
5869
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5870
+ })
5871
+ }
5872
+ Os["a"].prototype.$wpms_error_toast({
5873
+ title: Object(c["a"])("Can't register the Amazon SES Identity", "mo2f-setup")
5874
+ })
5875
+ }))
5876
+ }))
5877
+ },
5878
+ ta = function(t, e) {
5879
+ return new Promise((function(t) {
5880
+ var i = new FormData;
5881
+ i.append("action", "wp_mail_smtp_vue_update_settings"), i.append("nonce", Os["a"].prototype.$wpms.nonce), void 0 !== e.overwrite && i.append("overwrite", e.overwrite), !1 !== e.value && i.append("value", JSON.stringify(e.value)), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, i).then((function(e) {
5882
+ t(e.data)
5883
+ })).catch((function(t) {
5884
+ if (t.response) {
5885
+ var e = t.response;
5886
+ return Os["a"].prototype.$wpms_error_modal({
5887
+ subtitle: Object(c["a"])("It looks like we can't save the settings.", "mo2f-setup"),
5888
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5889
+ })
5890
+ }
5891
+ Os["a"].prototype.$wpms_error_toast({
5892
+ title: Object(c["a"])("Network error encountered. Settings not saved.", "mo2f-setup")
5893
+ })
5894
+ }))
5895
+ }))
5896
+ },
5897
+ ea = function(t, e) {
5898
+ return new Promise((function(t) {
5899
+ var i = new FormData;
5900
+ i.append("action", "wp_mail_smtp_vue_import_settings"), i.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== e.value && i.append("value", e.value), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, i).then((function(e) {
5901
+ t(e.data)
5902
+ })).catch((function(t) {
5903
+ if (t.response) {
5904
+ var e = t.response;
5905
+ return Os["a"].prototype.$wpms_error_modal({
5906
+ subtitle: Object(c["a"])("It looks like we can't import the plugin settings.", "mo2f-setup"),
5907
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5908
+ })
5909
+ }
5910
+ Os["a"].prototype.$wpms_error_toast({
5911
+ title: Object(c["a"])("Network error encountered. SMTP plugin import failed!", "mo2f-setup")
5912
+ })
5913
+ }))
5914
+ }))
5915
+ },
5916
+ ia = function(t, e) {
5917
+ return new Promise((function(i, s) {
5918
+ var a = new FormData;
5919
+ a.append("action", "wp_mail_smtp_vue_get_oauth_url"), a.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== t && a.append("mailer", t), !1 !== e && a.append("settings", JSON.stringify(e)), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, a).then((function(t) {
5920
+ t.data.success ? i(t.data) : s(t.data)
5921
+ })).catch((function(t) {
5922
+ if (t.response) {
5923
+ var e = t.response;
5924
+ return Os["a"].prototype.$wpms_error_modal({
5925
+ subtitle: Object(c["a"])("It looks like we can't load authentication details.", "mo2f-setup"),
5926
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5927
+ })
5928
+ }
5929
+ Os["a"].prototype.$wpms_error_toast({
5930
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
5931
+ })
5932
+ }))
5933
+ }))
5934
+ },
5935
+ sa = function(t) {
5936
+ return new Promise((function(e, i) {
5937
+ var s = new FormData;
5938
+ s.append("action", "wp_mail_smtp_vue_remove_oauth_connection"), s.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== t && s.append("mailer", t), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(t) {
5939
+ t.data.success ? e(t.data) : i(t.data)
5940
+ })).catch((function(t) {
5941
+ if (t.response) {
5942
+ var e = t.response;
5943
+ return Os["a"].prototype.$wpms_error_modal({
5944
+ subtitle: Object(c["a"])("It looks like we can't remove oAuth connection.", "mo2f-setup"),
5945
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5946
+ })
5947
+ }
5948
+ Os["a"].prototype.$wpms_error_toast({
5949
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
5950
+ })
5951
+ }))
5952
+ }))
5953
+ },
5954
+ aa = function(t) {
5955
+ return new Promise((function(e, i) {
5956
+ var s = new FormData;
5957
+ s.append("action", "wp_mail_smtp_vue_get_connected_data"), s.append("nonce", Os["a"].prototype.$wpms.nonce), !1 !== t && s.append("mailer", t), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, s).then((function(t) {
5958
+ t.data.success ? e(t.data) : i(t.data)
5959
+ })).catch((function(t) {
5960
+ if (t.response) {
5961
+ var e = t.response;
5962
+ return Os["a"].prototype.$wpms_error_modal({
5963
+ subtitle: Object(c["a"])("It looks like we can't load oAuth connected data.", "mo2f-setup"),
5964
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
5965
+ })
5966
+ }
5967
+ Os["a"].prototype.$wpms_error_toast({
5968
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
5969
+ })
5970
+ }))
5971
+ }))
5972
+ },
5973
+ na = function(t) {
5974
+ return new Promise((function(e) {
5975
+ var i = new FormData;
5976
+ i.append("action", "wp_mail_smtp_vue_subscribe_to_newsletter"), i.append("nonce", Os["a"].prototype.$wpms.nonce), i.append("email", t), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, i).then((function(t) {
5977
+ e(t.data)
5978
+ }))
5979
+ }))
5980
+ },
5981
+ oa = function(t) {
5982
+ return new Promise((function(e) {
5983
+ var i = new FormData;
5984
+ i.append("action", "wp_mail_smtp_vue_verify_license_key"), i.append("nonce", Os["a"].prototype.$wpms.nonce), i.append("license_key", t), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, i).then((function(t) {
5985
+ e(t.data)
5986
+ }))
5987
+ }))
5988
+ },
5989
+ ra = function(t) {
5990
+ return new Promise((function(e) {
5991
+ var i = new FormData;
5992
+ i.append("action", "wp_mail_smtp_vue_upgrade_plugin"), i.append("nonce", Os["a"].prototype.$wpms.nonce), i.append("license_key", t), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, i).then((function(t) {
5993
+ e(t.data)
5994
+ }))
5995
+ }))
5996
+ },
5997
+ la = {
5998
+ fetchSettings: Zs,
5999
+ saveSettings: ta,
6000
+ importOtherPluginSettings: ea,
6001
+ fetchAmazonSESIdentities: Xs,
6002
+ amazonSESRegisterIdentity: $s,
6003
+ getAuthRedirect: ia,
6004
+ removeAuth: sa,
6005
+ getConnectedData: aa,
6006
+ subscribeToNewsletter: na,
6007
+ verifyLicense: oa,
6008
+ upgradePlugin: ra
6009
+ },
6010
+ ca = function(t) {
6011
+ return la.fetchSettings(t).then((function(e) {
6012
+ t.commit("SETTINGS_UPDATED", e.data)
6013
+ })).catch((function(t) {
6014
+ if (t.data) return Os["a"].prototype.$wpms_error_modal({
6015
+ subtitle: Object(c["a"])("It looks like we can't load existing settings.", "mo2f-setup"),
6016
+ detailedError: t.data
6017
+ })
6018
+ }))
6019
+ },
6020
+ pa = function(t) {
6021
+ var e = t.getters.settings.amazonses;
6022
+ if (0 !== Object.keys(e).length) return la.fetchAmazonSESIdentities(t, e).then((function(e) {
6023
+ t.commit("AMAZONSES_IDENTITIES_UPDATED", e), Os["a"].swal.close()
6024
+ })).catch((function(t) {
6025
+ Os["a"].prototype.$wpms_error_modal({
6026
+ subtitle: Object(c["a"])("It looks like we can't retrieve the Amazon SES Identities.", "mo2f-setup"),
6027
+ detailedError: t.data ? t.data : ""
6028
+ })
6029
+ }))
6030
+ },
6031
+ ma = function(t, e) {
6032
+ return la.amazonSESRegisterIdentity(t, e).catch((function(t) {
6033
+ Os["a"].prototype.$wpms_error_modal({
6034
+ subtitle: Object(c["a"])("It looks like we can't register the Amazon SES Identity.", "mo2f-setup"),
6035
+ detailedError: t.data
6036
+ })
6037
+ }))
6038
+ },
6039
+ ua = function(t, e) {
6040
+ t.commit("MAILER_UPDATE", e)
6041
+ },
6042
+ da = function(t, e) {
6043
+ return new Promise((function(i) {
6044
+ t.commit("LOGS_UPDATE", e), i({
6045
+ success: !0
6046
+ })
6047
+ }))
6048
+ },
6049
+ _a = function(t, e) {
6050
+ t.commit("SETTINGS_SAVE_START");
6051
+ var i = la.saveSettings(t, e);
6052
+ return i.then((function() {
6053
+ t.commit("SETTINGS_SAVE_END")
6054
+ })), i
6055
+ },
6056
+ fa = function(t) {
6057
+ var e = t.getters.settings;
6058
+ t.commit("SETTINGS_SAVE_START");
6059
+ var i = la.saveSettings(t, {
6060
+ value: e
6061
+ });
6062
+ return i.then((function() {
6063
+ t.commit("SETTINGS_SAVE_END")
6064
+ })), i
6065
+ },
6066
+ ha = function(t, e) {
6067
+ return t.commit("SETTINGS_SAVE_START"), new Promise((function(i) {
6068
+ la.importOtherPluginSettings(t, e).then((function(e) {
6069
+ t.commit("SETTINGS_SAVE_END"), e.success ? ca(t).then((function() {
6070
+ i(!0)
6071
+ })) : i(!1)
6072
+ }))
6073
+ }))
6074
+ },
6075
+ ga = function(t, e) {
6076
+ return la.getAuthRedirect(e, t.getters.settings[e]).catch((function(t) {
6077
+ Os["a"].prototype.$wpms_error_modal({
6078
+ subtitle: Object(c["a"])("It looks like we can't load oAuth redirect.", "mo2f-setup"),
6079
+ detailedError: t.data
6080
+ })
6081
+ }))
6082
+ },
6083
+ wa = function(t, e) {
6084
+ return la.getConnectedData(e).catch((function(t) {
6085
+ Os["a"].prototype.$wpms_error_modal({
6086
+ subtitle: Object(c["a"])("It looks like we can't load oAuth connected data.", "mo2f-setup"),
6087
+ detailedError: t.data
6088
+ })
6089
+ }))
6090
+ },
6091
+ ba = function(t, e) {
6092
+ return la.removeAuth(e).then((function() {
6093
+ t.commit("SETTINGS_REMOVE_AUTH", e)
6094
+ })).catch((function(t) {
6095
+ Os["a"].prototype.$wpms_error_modal({
6096
+ subtitle: Object(c["a"])("It looks like we can't remove oAuth connection.", "mo2f-setup"),
6097
+ detailedError: t.data
6098
+ })
6099
+ }))
6100
+ },
6101
+ Aa = function(t, e) {
6102
+ return new Promise((function(i) {
6103
+ t.commit("SETTINGS_SAVE_PLUGIN_FEATURES", e), i({
6104
+ success: !0,
6105
+ features: e
6106
+ })
6107
+ }))
6108
+ },
6109
+ va = function(t, e) {
6110
+ return la.subscribeToNewsletter(e)
6111
+ },
6112
+ xa = function(t, e) {
6113
+ return la.verifyLicense(e)
6114
+ },
6115
+ ya = function(t, e) {
6116
+ return la.upgradePlugin(e)
6117
+ },
6118
+ Ca = {
6119
+ getSettings: ca,
6120
+ updateSettings: _a,
6121
+ importOtherPlugin: ha,
6122
+ setMailer: ua,
6123
+ setLogs: da,
6124
+ saveCurrentSettings: fa,
6125
+ getAmazonSESIdentities: pa,
6126
+ amazonSESRegisterIdentity: ma,
6127
+ getAuthUrl: ga,
6128
+ removeAuth: ba,
6129
+ getConnectedData: wa,
6130
+ savePluginFeatures: Aa,
6131
+ subscribeToNewsletter: va,
6132
+ verifyLicense: xa,
6133
+ upgradePlugin: ya
6134
+ },
6135
+ ka = (i("4160"), i("1276"), i("159b"), function(t) {
6136
+ return t.settings
6137
+ }),
6138
+ Oa = function(t) {
6139
+ return t.settings.mail.mailer
6140
+ },
6141
+ ja = function(t) {
6142
+ return t.settings.outlook.user_details ? t.settings.outlook.user_details.email : null
6143
+ },
6144
+ Sa = function(t) {
6145
+ return t.settings.zoho.user_details ? t.settings.zoho.user_details.email : null
6146
+ },
6147
+ Pa = function(t) {
6148
+ return t.plugin_features
6149
+ },
6150
+ Ea = function(t) {
6151
+ return !!t.settings.logs.enabled && t.settings.logs.enabled
6152
+ },
6153
+ Ta = function(t) {
6154
+ return function(e) {
6155
+ var i = !1,
6156
+ s = t.amazonses_identities.data,
6157
+ a = e.split("@").pop();
6158
+ return void 0 !== s && (s.forEach((function(t) {
6159
+ ("email" === t.type && t.value === e || "domain" === t.type && t.value === a) && (i = !0)
6160
+ })), i)
6161
+ }
6162
+ },
6163
+ za = {
6164
+ getField: ut["a"],
6165
+ settings: ka,
6166
+ mailer: Oa,
6167
+ outlook_email: ja,
6168
+ zoho_email: Sa,
6169
+ plugin_features: Pa,
6170
+ amazonses_is_email_registered: Ta,
6171
+ email_log_enabled: Ea
6172
+ },
6173
+ Ba = i("da81"),
6174
+ Ia = i.n(Ba),
6175
+ Ma = function(t, e) {
6176
+ t.is_saving = !1, t.settings = Ia()(t.settings, e)
6177
+ },
6178
+ Da = function(t, e) {
6179
+ t.amazonses_identities = e.data
6180
+ },
6181
+ Fa = function(t, e) {
6182
+ t.settings.mail.mailer = e
6183
+ },
6184
+ Na = function(t, e) {
6185
+ t.settings.logs.enabled = e
6186
+ },
6187
+ Qa = function(t) {
6188
+ t.is_saving = !0
6189
+ },
6190
+ La = function(t) {
6191
+ t.is_saving = !1
6192
+ },
6193
+ Wa = function(t, e) {
6194
+ var i = t.settings[e];
6195
+ t.settings[e] = {
6196
+ client_id: i.client_id,
6197
+ client_secret: i.client_secret
6198
+ }, "zoho" === e && (t.settings[e].domain = i.domain)
6199
+ },
6200
+ Ua = function(t, e) {
6201
+ t.plugin_features = e
6202
+ },
6203
+ Ha = {
6204
+ updateField: ut["c"],
6205
+ SETTINGS_UPDATED: Ma,
6206
+ SETTINGS_SAVE_START: Qa,
6207
+ SETTINGS_SAVE_END: La,
6208
+ MAILER_UPDATE: Fa,
6209
+ LOGS_UPDATE: Na,
6210
+ AMAZONSES_IDENTITIES_UPDATED: Da,
6211
+ SETTINGS_REMOVE_AUTH: Wa,
6212
+ SETTINGS_SAVE_PLUGIN_FEATURES: Ua
6213
+ },
6214
+ Ra = {
6215
+ settings: {
6216
+ mail: {
6217
+ mailer: "mail",
6218
+ from_email: "",
6219
+ from_name: "",
6220
+ return_path: !1,
6221
+ from_email_force: !0,
6222
+ from_name_force: !1
6223
+ },
6224
+ smtp: {
6225
+ host: "",
6226
+ port: "587",
6227
+ encryption: "tls",
6228
+ autotls: !0,
6229
+ auth: !0,
6230
+ user: "",
6231
+ pass: ""
6232
+ },
6233
+ smtpcom: {
6234
+ api_key: "",
6235
+ channel: ""
6236
+ },
6237
+ sendinblue: {
6238
+ api_key: "",
6239
+ domain: ""
6240
+ },
6241
+ mailgun: {
6242
+ api_key: "",
6243
+ domain: "",
6244
+ region: "US"
6245
+ },
6246
+ sendgrid: {
6247
+ api_key: "",
6248
+ domain: ""
6249
+ },
6250
+ amazonses: {
6251
+ client_id: "",
6252
+ client_secret: "",
6253
+ region: "us-east-1"
6254
+ },
6255
+ gmail: {
6256
+ client_id: "",
6257
+ client_secret: "",
6258
+ access_token: {},
6259
+ refresh_token: ""
6260
+ },
6261
+ outlook: {
6262
+ client_id: "",
6263
+ client_secret: "",
6264
+ access_token: {},
6265
+ refresh_token: "",
6266
+ user_details: {
6267
+ email: ""
6268
+ }
6269
+ },
6270
+ zoho: {
6271
+ client_id: "",
6272
+ client_secret: "",
6273
+ domain: "com",
6274
+ access_token: {},
6275
+ refresh_token: "",
6276
+ user_details: {
6277
+ email: ""
6278
+ }
6279
+ },
6280
+ logs: {
6281
+ enabled: !1
6282
+ }
6283
+ },
6284
+ amazonses_identities: {},
6285
+ plugin_features: []
6286
+ },
6287
+ Ga = {
6288
+ namespaced: !0,
6289
+ state: Ra,
6290
+ actions: Ca,
6291
+ getters: za,
6292
+ mutations: Ha
6293
+ },
6294
+ Va = function() {
6295
+ return new Promise((function(t) {
6296
+ var e = new FormData;
6297
+ e.append("action", "wp_mail_smtp_vue_check_mailer_configuration"), e.append("nonce", Os["a"].prototype.$wpms.nonce), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, e).then((function(e) {
6298
+ t(e.data)
6299
+ })).catch((function(t) {
6300
+ if (t.response) {
6301
+ var e = t.response;
6302
+ return Os["a"].prototype.$wpms_error_modal({
6303
+ subtitle: Object(c["a"])("It looks like we can't perform the mailer configuration check.", "mo2f-setup"),
6304
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
6305
+ })
6306
+ }
6307
+ Os["a"].prototype.$wpms_error_toast({
6308
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
6309
+ })
6310
+ }))
6311
+ }))
6312
+ },
6313
+ Ya = function(t) {
6314
+ var e = new FormData;
6315
+ e.append("action", "wp_mail_smtp_vue_send_feedback"), e.append("nonce", Os["a"].prototype.$wpms.nonce), e.append("data", JSON.stringify(t)), Ms.a.post(Os["a"].prototype.$wpms.ajax_url, e).catch((function(t) {
6316
+ if (t.response) {
6317
+ var e = t.response;
6318
+ return Os["a"].prototype.$wpms_error_modal({
6319
+ subtitle: Object(c["a"])("It looks like we can't send the feedback.", "mo2f-setup"),
6320
+ detailedError: Object(c["c"])(Object(c["a"])("%1$s, %2$s", "mo2f-setup"), e.status, e.statusText)
6321
+ })
6322
+ }
6323
+ Os["a"].prototype.$wpms_error_toast({
6324
+ title: Object(c["a"])("You appear to be offline.", "mo2f-setup")
6325
+ })
6326
+ }))
6327
+ },
6328
+ Ja = {
6329
+ checkMailerConfiguration: Va,
6330
+ sendFeedback: Ya
6331
+ },
6332
+ Ka = function() {
6333
+ return Ja.checkMailerConfiguration()
6334
+ },
6335
+ qa = function(t, e) {
6336
+ Ja.sendFeedback(e)
6337
+ },
6338
+ Za = {
6339
+ checkMailerConfiguration: Ka,
6340
+ sendFeedback: qa
6341
+ },
6342
+ Xa = function(t) {
6343
+ return t.blocked_step
6344
+ },
6345
+ $a = {
6346
+ getField: ut["a"],
6347
+ blocked_step: Xa
6348
+ },
6349
+ tn = {
6350
+ updateField: ut["c"]
6351
+ },
6352
+ en = {
6353
+ blocked_step: !1
6354
+ },
6355
+ sn = {
6356
+ namespaced: !0,
6357
+ state: en,
6358
+ actions: Za,
6359
+ getters: $a,
6360
+ mutations: tn
6361
+ },
6362
+ an = function(t) {
6363
+ t.commit("INIT")
6364
+ },
6365
+ nn = function(t) {
6366
+ t.commit("BLOCK_APP")
6367
+ },
6368
+ on = function(t) {
6369
+ t.commit("UNBLOCK_APP")
6370
+ },
6371
+ rn = function(t) {
6372
+ t.commit("APP_LOADING_START")
6373
+ },
6374
+ ln = function(t) {
6375
+ t.commit("APP_LOADING_STOP")
6376
+ },
6377
+ cn = {
6378
+ init: an,
6379
+ block: nn,
6380
+ unblock: on,
6381
+ start_loading: rn,
6382
+ stop_loading: ln
6383
+ },
6384
+ pn = function(t) {
6385
+ return t.blocked
6386
+ },
6387
+ mn = function(t) {
6388
+ return t.loading
6389
+ },
6390
+ un = function(t) {
6391
+ return t.wpms
6392
+ },
6393
+ dn = {
6394
+ blocked: pn,
6395
+ loading: mn,
6396
+ wpms: un
6397
+ },
6398
+ _n = function() {},
6399
+ fn = function(t) {
6400
+ t.blocked = !0
6401
+ },
6402
+ hn = function(t) {
6403
+ t.blocked = !1
6404
+ },
6405
+ gn = function(t) {
6406
+ t.loading = !0
6407
+ },
6408
+ wn = function(t) {
6409
+ t.loading = !1
6410
+ },
6411
+ bn = {
6412
+ INIT: _n,
6413
+ BLOCK_APP: fn,
6414
+ UNBLOCK_APP: hn,
6415
+ APP_LOADING_START: gn,
6416
+ APP_LOADING_STOP: wn
6417
+ },
6418
+ An = {
6419
+ blocked: !1,
6420
+ loading: !1,
6421
+ wpms: window.wp_mail_smtp_vue ? window.wp_mail_smtp_vue : {}
6422
+ },
6423
+ vn = {
6424
+ namespaced: !0,
6425
+ state: An,
6426
+ actions: cn,
6427
+ getters: dn,
6428
+ mutations: bn
6429
+ },
6430
+ xn = function(t) {
6431
+ t.subscribe((function(e, i) {
6432
+ if ("$_app/INIT" === e.type) {
6433
+ var s = i["$_app"].wpms.versions,
6434
+ a = "",
6435
+ n = "";
6436
+ s.php_version_below_55 ? (a = Object(c["a"])("Yikes! PHP Update Required", "mo2f-setup"), n = Object(c["c"])(Object(c["a"])("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s), which could be putting your site at risk for being hacked. WordPress stopped supporting your PHP version in April, 2019. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.", "mo2f-setup"), s.php_version, "7.4")) : s.php_version_below_56 ? (a = Object(c["a"])("Yikes! PHP Update Required", "mo2f-setup"), n = Object(c["c"])(Object(c["a"])("WP Mail SMTP has detected that your site is running an outdated, insecure version of PHP (%1$s). Some mailers require at least PHP version 5.6. Updating to the recommended version (PHP %2$s) only takes a few minutes and will make your website significantly faster and more secure.", "mo2f-setup"), s.php_version, "7.4")) : s.wp_version_below_49 && (a = Object(c["a"])("Yikes! WordPress Update Required", "mo2f-setup"), n = Object(c["c"])(Object(c["a"])("WP Mail SMTP has detected that your site is running an outdated version of WordPress (%s). WP Mail SMTP requires at least WordPress version 4.9.", "mo2f-setup"), s.wp_version)), Os["a"].prototype.$swal && a.length && (t.dispatch("$_app/block"), Os["a"].prototype.$swal.close(), Os["a"].prototype.$swal({
6437
+ title: a,
6438
+ html: "<p>".concat(n, '</p><p><a href="').concat(Os["a"].prototype.$wpms.exit_url, '">').concat(Object(c["a"])("Return to Plugin Settings", "mo2f-setup"), "</a></p>"),
6439
+ customClass: {
6440
+ container: "mo2f-setup-swal mo2f-setup-swal-alert"
6441
+ },
6442
+ allowOutsideClick: !1,
6443
+ allowEscapeKey: !1,
6444
+ allowEnterKey: !1,
6445
+ showConfirmButton: !1,
6446
+ onOpen: function() {
6447
+ Os["a"].prototype.$swal.hideLoading()
6448
+ }
6449
+ }))
6450
+ }
6451
+ }))
6452
+ },
6453
+ yn = xn;
6454
+ Os["a"].use(nt["a"]);
6455
+ var Cn = [yn],
6456
+ kn = new nt["a"].Store({
6457
+ modules: {
6458
+ $_app: vn,
6459
+ $_plugins: qs,
6460
+ $_settings: Ga,
6461
+ $_wizard: sn
6462
+ },
6463
+ plugins: Cn
6464
+ }),
6465
+ On = i("e37d"),
6466
+ jn = (i("6c6b"), i("6d5e")),
6467
+ Sn = document.getElementById("mo2f-setup-vue-setup-wizard");
6468
+ Os["a"].config.productionTip = !1, i.p = window.wp_mail_smtp_vue.public_url, Os["a"].use(jn["InlineSvgPlugin"]), Os["a"].use(o["a"]), Os["a"].use(js["a"]), Os["a"].use(On["a"], {
6469
+ defaultTemplate: '<div class="mo2f-setup-tooltip" role="tooltip"><div class="mo2f-setup-tooltip-arrow"></div><div class="mo2f-setup-tooltip-inner"></div></div>',
6470
+ defaultArrowSelector: ".mo2f-setup-tooltip-arrow, .mo2f-setup-tooltip__arrow",
6471
+ defaultInnerSelector: ".mo2f-setup-tooltip-inner, .mo2f-setup-tooltip__inner"
6472
+ }), Os["a"].use(Ts), Object(c["b"])(window.wp_mail_smtp_vue.translations, "mo2f-setup");
6473
+ var Pn = {
6474
+ install: function(t) {
6475
+ t.prototype.$wizard_steps = [], t.prototype.$wpms && t.prototype.$wpms.other_2FA_plugins.length > 0 && t.prototype.$wizard_steps.push("import_step"), t.prototype.$wizard_steps.push("choose_mailer_step"), t.prototype.$wizard_steps.push("configure_mailer_step"), t.prototype.$wizard_steps.push("plugin_features_step"), t.prototype.$wpms && !t.prototype.$wpms.is_pro && t.prototype.$wizard_steps.push("help_improve_step"), t.prototype.$wizard_steps.push("license_step"), t.prototype.$wizard_steps.push("check_configuration_step")
6476
+ }
6477
+ };
6478
+ Os["a"].use(Pn), Os["a"].use(Bs), new Os["a"]({
6479
+ store: kn,
6480
+ mounted: function() {
6481
+ kn.dispatch("$_app/init")
6482
+ },
6483
+ render: function(t) {
6484
+ return t(ks)
6485
+ }
6486
+ }).$mount(Sn)
6487
+ },
6488
+ "9f86": function(t, e) {
6489
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAB8dAAAdhwGkh9VpAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAADg1JREFUeJzdm3mQVdWdx7+/37mvN5pFERdkaRqj7bCESUMZkxAagjGMoKJCJW2cCs5ACpW1UWqmUvomTvgjxoWJJjGVqINLFEUyg2B0TEDWoHaCtguCvu7GBiQgTUM3Tb93lvxx33LXd18vaNX8qrrueXf53XM+9/s753fOvU2N1533qTKiQ2srYYxIKFgJra3DWotDUFZi3DcamigOjf+nRs3XD3pHG2ucMgJaW9DGgjIC2ljpP5FUWrRoYx3WsA4pbSW0EQlpYgklkRjU2frJxPr61BfdkJ4afTK7/0vaiGuUsdIARBqCs5yDo41IH0sf1xaUEa3aWAljYgllKKFM0WGtxCFNnOiA3P/93U+f/KIbGmYWk2y2iwQwYIudYLxnEmWLrmMMGI1zAKrWQDXDgkEKEAbQFspMDC9M+tej2ljNGtYBpUWz1lazhtUEQwc0lTTO2xM/cTYbmc8sZnUA2m6cAVwNzRnBZOHk9uWK7mtM5ngO6BAAQ2Aw0ZDJ7tcQMDqJ3467+2/aiL3axN5JafEGjLX7jr11+/qmifnNIqhmdtbf0dBsQzJGuYJx7rRVgIATAQpQkwsOoIDzyf77pmADrYGfX/azTzRir2jDG9uS5X+IN80707Mm5jc6chO+BogdrtjXuU4w1yGmYz+kn9Da3TcE9BN+nzrAj6vPyfpp08Z6URnx65Ufzf9znwI4NgcXG6BFhzTUV7kQOPYx57kOCB44bgh+YOEPwYI2ol4b62dnPm5eG0e818MzDx6Dw2B0MSkwSdjbXFl493HmmITwXJM713+N+1z/fXz3ZO9xmSlXE+TviitHNqyqXHNDrxUAAMe+hw+NxqXQCHwKbhWI9JMOkLpHIcEqCAoFv9rcKghSiF02JvZa0vCieFPt3p4AEABw15cxk4BLbCIauU6MAFD6FwFAO0AWKNPtU/YosmeR73q76PTjvsZddtyTAvz47mkqGfQvUwfNPT3lxLg3tmCLv8/NYxYAgNGYdQeAtbSPMrlHBDKLLyk6vGZf57ALGVyRghzFZCoMMBIwFQAqwDTCaBT5G2j/NN59nvs4rzHZn35Q7mGZSg3wAFdUXR2Xa2vjLXOPdwsAE5oM2zfMQVB2BRw3IkND6XkooOUggIMAdngdmjh419YrL7KEHqVkqsIQKhgYSYYqwKoCGiOADCAHkHRDfY/P9RD8QD2Qr4ZlvRkfsXZW/MDc9wsGYCw0QuUab28NhFauG2lgaJRDe+K0KwNou/d4HHGuvvKtiyxROspINVaQqYZBNZjGQiPmbWFOBX4zLuVk85ZKMLb+eNgL19zdctPuyPoCwLH5mEQSb0AD0OmkJr01mnKdGKzfD3+xfXaU057Y2ivnlFpqwEyl+WZlimZoI4qC5iKeIdEz9Lo61nZNsaviTTfmzRsIAE4uwHlS4Wim4VkIKg3BkF0BiPqh685MPBsAnPb0uIXncBEWGB27S0Oc24uJWmtK8ZR7W+Y25AUAAMfn4yQ0+rsgqBwMYwhGW60XrEude7YBZGz9hKWDOknfpWEtUUaU+VUQkYDZCmkyKT0pfqj2WNA9sgBaF+BtYzDe+/ThCgdGZ5E+d+QzaP2cGAAAnqm+o0rp2HPaxMbncpPg1NmfolvQxvqTbv7gqqDMkbMlgSZie493mykTa5SlUBlW0be/fUG//TOGjzZxh98+sNr6h/cWl+CrTPLRoOxRkAJzUEZq7yeS02hkVV2Q75wCbsNDMFgSpACnErTB3POfw/Nhld03c+g8ZWL3GWN9qI3Ypo3YmoyVbZm4of50X8B4csKyO7WJ/bRbEzU7FLoUiifEm25yZYzsKDVmnzYhVAkMjM5XwUtfOvS4MHI6kTyfSK0k0htjqc6jf7lq/Lq3pk+o/fOMKwb0BsAtex68T7Ba4Z1XhKsgu69YmK6fe/05Q6DRK/mQbWgIZCFsOrinqEtMZKhX0xUoY5Y3MOunLZk6+Mb0SY9sn/r1y3oK4ft/vf9+QfJHvomar+wAwhLMavpPRv7umkAAsbQCMk8fITCMiAYAAKNfS7R1HBk8k0k9wSQhcrO7ciZ1W0wkP9j1rStf3jV18td7AuHmPQ+sEiT/xz+LlO6+wQMEnLonEEBnLLoTLFQBGZtYX5+q2th0qyB5r7cighQxqe+A5fYd0yav31xTU9EdAASYFPQPBMmPC5liOx7CpJ9UPvUtH4AhP8UpCByNhEAYbhZ4U9b8Fa3a2Hy3YLmUWZmQil5fTOrdbVOnLjahia/f5u156IQgdQuTNK7Yd6wleNcsmCQYydt9ANLWlC/+wQAJWG1dGFFoJTNW9VLTaoasC66cBLHqR5Crt9VMXb+5pmZQoX5r//rQLovUmkL6AYcKZq265LEhPgAkbABh8Z/Zp2KFh4HT/mFT04MMvTyictcJ8M7NNTOGFey4yKxkkif8KnCMEO57WpZRs30AQEhExL+91fmHwvwQEg8yq3uDK5dVxOXCnHn9j9OmXVyIz9rdq48IqPsdy2Z51SBYgUhe7wOQUUAkBIFRPQUAAJdvbLyHST0ZrgIJZlUZ09iwuaamvBCfWspHmFS7OzvMs7ZJevKj1Y/G3AACFBAC4ZLeACDAxIyYzyS3hUg0U/5Hy/Cjhfi8ueGXrYL040ELsoELr6zK29tUtQuAQi4bDIVg5wnjewMAAL708kddVJycLUi1BEk0UyaWtVumTCtoDcJi/RCTMnlHAGfHK9QEF4AB45EA40y++E+XR3+2CL1KaQHg8vUHPyMk5wdLNLe1WK3eNGNGcZS/G9/8ZYJJ7fSpiYOBWCzHu0NgLhQx3g+Vfi5LJNL4Rm8BAEDVppY/MMlNfom6gAwv7zp9ayH+GPJZ3xwhrGM0cpQ3DwAEGgoZCZgxsy8AAAAb/eOQCUxOBVArCplma1IvCJLKpyYOAMJquM8hA28XNBIwrjVz7PcKvbVLN7XsZpIfBE5gcjFbuev1yVOjfM1984lPmdRu3xwhOE0e7AOgGX8MbLB/inzxqaGY0RcAAIBIPhU2gckBSc0rxJeA2hyoJnYCkWBS5T4A/f4dDcQ4lK8TzPwZxsK+AsBIPsWkdMgExu61Sc18b86YokhfrLb44AWHV5EPABEMCP8XMPQFwfintiW4oi8AjN7QeoBJvRc4fOU6xIGnTpTXRPkyqVM7mWQyUE3sAiKDOxUL6yLT4czWwqq+AAAAguSOwOzQUbYgr47yM6t+w2lm+Z5PTf5+oCsQQFkHXibCYe8CSRAEw5jWVoeb+wIAk9oROnxlVZCaUpAv6HeZQ5KhnAqOBQKgOCQsrCloYmRvH+xYiot6C0CL5M7g7wJcQCa8Nb16YCQAkWoIV1MWaDAAAGDCb8BQ+TpBx7EhqSI8a+Lpt809tBHrzjQyqdOhw5cNR8REZ2QqbmnzbuaaPMnQgVAAJcvxERjPRC6QZBIj4Jsn2/FfvQFAgGGS+0MnMJnRACYSAMe6GsNS6ywQofbnzazY4D/BUIVCIMbCtjrc3RsIgtT+4OErpwISyXHRnpItzmuCkiFh9Pt5AZTUYR8RnogaCUCOfQL/0bYC8Z4CIKQXOdn75HJhIYyOVMDULVvaRXaVKFhNJNS2yNw6VYSVxDhayFKZY989J1fgV2YRImdwPgAWjnhj1jd8CTW2kMVTJnXQOSMUbp8f37j7Ny2RAAbcgc/AqCtkRPCUf3iyGNta6zCyWwAIR8HGmwB5s7r++2YOi/xYgyGPh6bWUFsB75pgiJUuwZMk8Ps8CyRho8QkJtS3LcN3ugOAGCAycIaCryEwkSvTgtUp74ww60ckXy8YAAAUF+MHYOzvRm6QKQ+GwKa2ZVjTfhsujCaAtowPG0LwQokgNTzKFUO1h6wMaan5tW4BoB+ijWO4CYyOgAWSKAgExi2qGHvblmBxvnyBBE47fRCZdCh4GiJkJACwbPd1gixhkd45a9fzB7sFAACKb8M7RLgBjK4eKAFgDARjdVsrGloX4Z+D3jDJGE7DAzYbDo6GEKIBCFLJoNSaSD6bZdQdAABQshivGkItGLLALDFoXxUx/rutGPuO346FnyxDacZ/EbnzjiwE1t6GRL4zYJIUED6dlu54pscAAKBsMV40jO/CsYCat8HhoVLBjF+UJ3GodSEePrEAXwHCfdkQsvnA4EgArMi7MiSg107evj37iU+PAABA2SKsA+EqMI4XmCXmU8kgMG43AvWG8Uo+X8Qawl4ciXx/yKSJ2Tv8JV0fSfQYAACULsF2Ar4WtJAamCVGAbKV8qWoMCLWYKhzouonKBXzjACvfHXz7vo+AwAAJUvxYYnCFWD8qsD479WxTJk5GgCz7u+c/zOlfIs3vQYAALQcnaVLsZCBa8Fo/jwggDEgKh1myIHZjhPy5a+82rD1rADIWMlybChVGAPGfWAkI7LEXoUKMahlDkry1YfIBsAkNcfMvwWd06cAAIDuREfZctxFApcZxuPEkN2Vd6HH+sfyAxCkBtrxrx8b+9K+t4PO6XMAGStdhqZ+d+JWtjCG7f6hPbRRVKBK2D33SOlc/hBkguSFTOqoTOmVYeecNQAZK6nDvtKVWNhFGEaEZUTuN089jH+AAasEoe8I/jZnSDmTGkCkVox5pSX0HygK/iCpL+3kKlSRwndJY5bRmAAF9n6m7/1C1QR8wC0kKgc9af+3i9daZhdfCsTuG7a+/bp8dflCADjtVBznk8J0ozEFwCSjMBYasUAIyr2PDUYPegyJIL+fzi4aSyp29IL/7TiS7/5fOACvmThKTp7BONj/xXYZNCqNxnmk0c8olBuNAdAYYDTKWWFMGIBC7e8sGqmBIvaRSgAAAABJRU5ErkJggg=="
6490
+ },
6491
+ "9fec": function(t, e, i) {},
6492
+ a1c2: function(t, e) {
6493
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAAL5klEQVR4AdVbeZQUxRn/qqt7ZnZml2U5FjfKsQQBWY41ERRwg4iBEMEH5CIaiT4SQUHRCDwIEk3y8rzgD+UwmgMFjRxCfMEYjFFRFIJRiQi8hMilyLUKLOwxM31Uqnq2Zrt7urt6pmfJS723W1VffUfVr+v46hgEFziQKVU91cpeq6V003BJwsr5Tz8GVNHtmFTVc0Ni12sPoK1w9kJWCV0oY+qNl34NKrqulFqaapAkZc0yALKhpFTHfYZslA/tWhjbePJglt6OiXYHQP1B/2tISWKdTIxKt3bYALAwSL0Hva2cP3lr7NkDFoQsDEVKthsA6oyhY4CQ57Ghd/WrqxcAXAZfevlOBdRbost3/IvTihkXHQD2xSFeul7UcNYIQgg0nq4HaD4nbJPUp3aH0nBsWrF7RNEAUG/uP4rEEuu9urq1hYZBAK78BhjTfwVnk2mIbF0HaO0jAPWfWtlc01L1wG1K/cFbijVHhAZAnVpdB6UV6zGQi1xrbCHqsgLo8msB3/agSVV1wwSAsyhvrAXppScBDu/lJM9Y6tHvDfnEf6aXbG445MkUoKBgANhypl3UczNOpwaJ7LCGSzfMBGn8rTZWJwC8UN63HfA62iP2bOckzxj3u2JNYvcbdxW6fBYEgDpj2OuSmhptXc7caujVcM7rBQAvx3vfAXn9o2IgYgkN9+j7WOmyt+Zy2aBxXgCo88c9hD4/Pp86ML5yoobzyokA4HwMCIUCQUQ9omPX5siAYTNL7l+7hsuKYt+GcGHt3rHjSUP9ixggwmlucdCGc9mgAHB+NjRkOjREQND54VikU+ex0YdfEU4mQgDU2Vfvk5rPX+bX3dmsjq67EaTvz+N1DRTnCwBXKr+7BfCqRQCnfFaNeJmBew/aULr0lalczi32BECdM+rnqLFhkYQQ/fDuga3jpOYqwPc84c4goBYKAFcbocMCbaarho8fgap6n5M7d5seX/rXF7icNc4BgNzcrzpd1nmbkm652MroTGtdu4NyzwqArpc4iwLnwwLADKGmBohsoBPl5qd87eLBdW8mDu+egjYcPW1ltAGQ/snY26Vzp5ZLgNp2K1ZummbjHM9ZDqj/UEdJ/tliAMCt4vpPQF5+l++KYfYGXR0bX7NvJ5fLAsDWdb1j5SFJkrI0zsRi1t1hjHicq68+B2n6h/a/b4qTaByUqXMhMnmWVZ2Z9gMgsnUtoN8vBqBf2AzVA4FMnAHpUd/L0WMlmHK/u89zWDAQyg5/2JP7DdnGpu4YvkdJJ2usynha69AZlAWrfLu7cWA3JJfMBNxwCiKJDlzUjNNN50D55SaQvjzYRvcCAB/aA/Lca2282QwFQpv1OOg09grmsFhFwaOepVuQB9dtTDz68rdZWbar42TTACczm93JlDtBWfqqb+PJySOQWjQZYqmmnMYznQwQ4090sgoYMF3uPAMD5/7JwEDyCiRRDqnZj4P2iz8CVHbPYdP2v38DJ5oAsO7vdG5Y4/FDm3PcVy5ojVMPT4dYWTkg7LlgAGnM46CnsbXbW41Y03RYyCvoeBcEvWYkpJe8ngtCslkh10BHJm4CoEajk526SIT6PAFmeH33NlDOnHSK5+SNU5/k0LwIUot4ewysJ1B/QBRYbwC6YjlDY6y0ltFMAFCiU9zJEDRPXqM7OLoyiALW0iKWbDk5+FE27ZfAh4Px+ekwATCUqOxkIl/q4yS55vPq2q4aQhD3vBNIGFX2yOFDXS6OMaIJgBSJeA/eHNHCCEQ0ri1qkY9nZ2EDGDjSlvXMdHMBoKzC3NdkeoDf7OWpNVOAe/QXcGSK5VjwUUZ8ZnirMeLyZa3lfmlUUmqO20wPwCjrD/gJuZWh2jo38gWhaT1d3ZZgtrGcaXswbm8uNOQa70JHCVsxRIE5MUGD4eMMCXXYACDu7q9QSSuDXmouqUJ29Jn4iF867O3gWA2gK8dbs/mnbQDkL26TkGpH2/JeGePYAa+iLB3XH82m/RLGsHAA0PMNc9ib48DPUJAy6Tt3B2EDcizAAW5Ah0kdGg4AYp7N870AYgf1IUK8DNiGSRTIicMiFkABnBs0eiqYHp5Qmw+DrhmsNNMDCAoHAFUkT6NHVIIgqUkBBzvgELvB6mj/LbHQiIXBBMAwTDAs5PyTbDXQo6Zz5SmMVLE7LDrwhJoRwDY5oQPJ9PrWtZBe0RQhSNf/2FcL2zOwrbNXCLIE6lPne4kXRM/sAei2vyBphxC7+dG2vgD49HFHSVuW7N1hZoyTnwKbh6S0mimsvASQ3ykv46L3idqAERn+Iv3PAKDrRQGA1Ume+yQYCycC8nAu1ZXzwNA1kCJRswlKw+lgTYl3gPSsZcF4g3Bp1kkQQq4CVoP0DIEMGWWl2NKRiq4Q61IFkQ6dzD9boU+GnQeGnvld9BdtFTB101Of5K8XgPbmRhdT4Uho3aMQfXqxeQweTlOrtK5alkFdCz8EaOOb5n0T8PYXgX3ldgn0EiRCzwODTJZC+zZHCEjoVSC94TGINp8FmR6Dt2ugW2XzIiSkEaKmdKYiMwS08D3AeP15wBF/PyBkndvE6S1Q6F6gpduGgGG4+AEtjW0GBSn9lWchmseBh0BdoGL87suB+BgT+ejtHF7S0qQxotkDiJY2u4OVC505Yc36p3e95l/eDqX4yN5wWlvOtwFAX3TlAJCPdnJkXz7sxeE9GOzcwMsYaTrXBgDRM+PBizkMnd0paj0uM2+YzJjdMXoF6uxEb1oAiUf+DLEZDwLQvGcIenDqqSBTkPEEBUyiYpSiuzyvW6Fv3QVK6+Mo5iobf1kFsMndo0s8QCfSwXWmORbTOzxonHW1u/mAB6fuwm1Ucw5QUil6iWYPSE3Rd3tH7USPnOTReNPXd7wMM0FwcTwRvcPjjedm2GUqfRfIswXF5mrxeW47SpON/2QKTQDQpuNHiMMVkOgTAX3hhMwXK8g0nX099lhudDom3a147Cncme1U9rgqMm8MwMlP7AXRuIZaX6WbALBSDSuH7FwUHQoCot1VXTQpcG+w6pDoeHeeBGvbXwJGzwn0NJiVWQOTNQJek1nl2FdnbrP8M3rl6Ww8ZcS9Bqzj/Nn7APOBRDl9IIHdT4jpGRrAdTe5PoQyptfSNyVZLLluM2ZvA2DkJJDrJoG27UWAd6irbHk/4HwsHZl0BygjJoBKwWAPLbIPJGxaM5nUxlM51Mg/tgBadqe3XHmX5g6nDl3Me0AWAKZJ+9Hl0+isvYrek7i3hvK4PZHRbvsqYLev2lo9QldZXUsBlqM5V+hOAFpFxBFdIVJrPs7yZZ7IzKFPZLzvC9FFvc7Jaurr8T/sf5cL2hoq/3bXajnd0keNxD7jDM4Ya/QAY+kM+7DA/osJu3lje4QQN3DOagDqnZkcs9195hW+jcdD6t4qaz5TbW08U2rrAVYr6uwR96OWlsV0QHhenLJhQQaOAELfA5nAWBUETBfcA+jZILnq+swrc5/bJPOrd6kK/kzOWe/UrOF7lVRygJNerHzBAIgqUFJqyPTnN4klW77rx2obAm6M0RU7avSyTuPpoZn4SNdNwf+AJnXveyw2aFitqPGsap5DwK3e2r3jlsPpE3d4rRRuMiJaMXsAqqhMKoNG3F6yaM3TIru8PC8AuJB696id0vmzw3wWC84qjIsCAO3uyrCxK+M/fYauf/mFggBgJsisMX3TEWOLcv5sdX4m7dxhAZCHT/hb/IujN6Jl2+rtmoPlCgaAqyf3TblB++L4M1hNduS0fOJCAcADR+6NdKuaFpm/6oN87Dl5QwPAFWoLJ04gZ+pXYy1VwWlB4nwBwAOu+lAp7zAt+sDG3UH0i3iKBgA3ROaMHqclm57Duiq+LqZCQQHA/Yd+oMSUaUF+BMHrEiQuOgDcqDbzK5OJgZ/ChtaF09xiEQC4T+1O2Wj5YeyJ9/7tJh+W1m4A8Iplfjobpz+dJZWcZo29AJB61bytNNX///501tpIlmY/niblnX6D08m+1uXTBkAsYf54Gu//+4Kwvwd02vfKt3sPcBpm2261qvdzUqrlSgmIzACQqmvqpdKOG+LvbVnEt6lOufbK/xf7Oz42iMSR9wAAAABJRU5ErkJggg=="
6494
+ },
6495
+ b0d2: function(t, e, i) {},
6496
+ b1c2: function(t, e, i) {
6497
+ t.exports = i.p + "img/sendgrid.svg"
6498
+ },
6499
+ b32f: function(t, e, i) {
6500
+ t.exports = i.p + "img/lock-solid.svg"
6501
+ },
6502
+ b98f: function(t, e, i) {
6503
+ t.exports = i.p + "img/wp-smtp.png"
6504
+ },
6505
+ ba75: function(t, e, i) {
6506
+ "use strict";
6507
+ i("b0d2")
6508
+ },
6509
+ bbc2: function(t, e, i) {
6510
+ var s = {
6511
+ "./all-in-one-seo-pack.png": "9da7",
6512
+ "./all-in-one-seo-pack@2x.png": "2cf42",
6513
+ "./coming-soon.png": "d686",
6514
+ "./coming-soon@2x.png": "9f86",
6515
+ "./google-analytics-for-wordpress.png": "c2d9",
6516
+ "./google-analytics-for-wordpress@2x.png": "82f2",
6517
+ "./instagram-feed.png": "e0ed",
6518
+ "./instagram-feed@2x.png": "877f",
6519
+ "./rafflepress.png": "d3f3",
6520
+ "./rafflepress@2x.png": "a1c2",
6521
+ "./wp-call-button.png": "2adc",
6522
+ "./wp-call-button@2x.png": "1532"
6523
+ };
6524
+
6525
+ function a(t) {
6526
+ var e = n(t);
6527
+ return i(e)
6528
+ }
6529
+
6530
+ function n(t) {
6531
+ if (!i.o(s, t)) {
6532
+ var e = new Error("Cannot find module '" + t + "'");
6533
+ throw e.code = "MODULE_NOT_FOUND", e
6534
+ }
6535
+ return s[t]
6536
+ }
6537
+ a.keys = function() {
6538
+ return Object.keys(s)
6539
+ }, a.resolve = n, t.exports = a, a.id = "bbc2"
6540
+ },
6541
+ c2d9: function(t, e) {
6542
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAJO0lEQVRYCY1Xa3AT1xX+VruSVm/Jkh8E22Cbh20CY9K0QHhYQGDAkCm0hB/pDIHpJM1k0tTpn7QznUD/tdMfmB9N25RJITOdTDrJ0AAFCrQYUhJIeJinAWOMjbGNLFmyLK2k3dVuz11ZtgUKkzOj3at7zr3nu+ece85Z4DtS6/qTm1qDp7xPE//5hhOtT+MX43HFJh+fa113aqbFiZ6MpHRwmnlz27GV96fKMGC6Qz1gNpuCqqqtbDu8pn0q/2lj09OYeZ7GK7vKK51YuLyiiRe1K60tx5vyPGPsVK9U1nqCbr8IXcfOPO+7vIsCKFBAp7OY+VetogCzxYT5i0rdDo/1DJNhluF4U3tVnbfa5jBD13SINiFYsH4K2GKAhGKTGtD2i5YTUU4SdsCWDbp8NkNMy+oGiNkLfK5r58MHVVmJVNb6PFZbbhsyP6x2AVJKDZJb7ut2ZbcOMGstLKaHzRUFwIFrql/o99y9EV2lKvoldnpGiqLDynMGiNoGb1V4KFVFJzZ46ZRqvE3EN+n6q3Cq7/jLHdVj0Ywx/22PogDAwcObeTQtLXPHhuUgU8woI9EJxZzXeCELrz9nGYOXzgHQsho8AVuTL2BHJq1AoH2eRgW3gPmOzN/Mcdyu2QtKvR4fD3YijXyryjpSkoq7t0JQUyaQDM1n4fRaUDbNAykpw2LlCaAAkym3JjyUwGgkQ4GptxLs021H1nY8DqYAwLsvn9Jr6r2wOwXaHCDzw+aYjNMvT3VBlnRSYIJF5IlHUU9xESh3w+GyQpE1pCUFLq8VUkIm8ASUNEpJBaPhFIpd0QIXON0WWmw2QGp0YqttEl9oYJQsoKCmrgI+v+vxgxj/mcmZJUS7mQ5hmZBhQZqMy1BjpicsUAAgPCShttFDwlnIGc0wv6ckJ5IYk1HfWEUbi6hudMM7XYRM/h68Q2buTxvKnG4rucBsBCmbYFZgYJhLGLW1r4wZgymPAgDkq9PEa2bmZ8SuHfuxOCirKEHDsgAWrayARZh0S3yFggfhJHouxNB7LjahnK1n11Jne5F4itxQjAoA5AXs5HcpCToNXSlSzmj51io0zPPlRSbebqsZdeUu6IuBQK0dVz4bgkrWY+T2ihNylCF7J/5MGTwBQCHfmy0cxcLk9ZmzyF9UeX4fUeDht1uBMmDGYi+6T4/gQaQT94Yvg/MkyQ12xOzx6YubN/wty+l7vmk/MhELjwHg2jVNa05LHEU5nX7cd/O+X5rXVfDWhiOQL15HNjQCW1MDUE4BOkfA/z78GLOfr8J7v2mF6HAhS8cnEoYHh7bv/dPe7bxm2nXuzOHfssnJY9KfRbO3BSuqHUHoHHiB8iHd9Yo6J+YUMb3a04942z4DgNr7EPqZrwFZxh+PHkXz+mXY9soWZGh7FqgaAfDZLJhXVYHmVc3o6R8M6pqlt7+vq+MxC1C6zehweiZxmWyTAccQG0RRKtRUQtz5FpYuXw6O8sJMXcDL4Ueo3vgiXlq3Co8SaUNxfglP1kx+fBDZQyfxq9d/gp923tqzOLiuvWB32qddzuRSan6hTJGs5K/F+KQupYxRlp5MeTabxZV4BJ9JMbS0rEVYyhQon9jrbi/0ZArDV65i0+aNbi7LbyqwAKXcWXnh/Ds1oqB/VEKNz5mfQmLfp+guceL3hz5laRaSJBk8c80MuH2UR+TCQzAmC9TuVd9D7dplaFy0EFrfAPb++cPghAVYHXA4rXsyEjvXJI30ShilJHQ3MoZ4JneX+cppqDrxNR503sbY2Bil7dy1szichvK/R77Bhtvv46tEz8RGWVVBim60h5Qz8nq90MF5DQuwlsru4v5RXuWyx6M58zKhsSilT0XD5ztvYP5L0zBnaYBNA0t+AN/Zi/iocgH2hnowpGSwtaQS+/v6DbaSzmXGzr6bqHNyqLHEEb5zDnWrXzP47PHw4SA99fsGAM2uttY0ls3OpMZT4LiY02dBlgqMr0zEzSOP4ApYMW1urg7E3twO56HjeLujFCYpjcycOjwzNoLb125gmWrFc/U/xALbdCpCIVQd/SUELYOeB4vRLzyPAOWM//7nDOnX241w//Hat/7tL7fyaar3kVAK5dPtBoTUmAIzFZKKGQ5YLDzunItg9vJxK5jNkJ+th/TiCiTXr0LomXokejy4ePM4mltaMN3uN/YQ7Q7oZit03oKRuS1I6Ty6egew/y97B86cPLCNY+32s4sDB2xUgkdHVPR1RVnfN24D4F5nDO4SKzz0S4zKcAdEuCtt8FSKMFtNiFEhCndLSAzLxpru0CVwlWHsePP1iT2mDiKhMP7a9j5mmJplqd8zV9A4LciUM6Ib9QRVz3Kj61oUcWosXD4rkhQXzGzxHgnx2JPRXlf2HLr7L+G9t9/Fuh9tRNXMGfSrxp0bt9Bx4QJuXOjEioZN8LumWa5GQh8I/jLbmqlabQ4LtVJZKkS5ZBQLp1HX6KPynEVWpR5hfJ4354rU1LX5MQNRWdKIW8dv4tjAWWjmJJyiC9d7vsR83xbcvSjDtwIwi8ILgkkwTWMLmf+ZgmIUj6bhof6PJ0Pl60MxualzVkEEA2Idm4XKOjdlLA59/feoyZ6OZEJC6GGSlfqEYHeYjRrLzM9yP+uKuq5GWTMpWaymXDTSzunxG2KmYGTVktFI6MmO97G6/yiTUZJSQql92BvGXHEruuLHMce7BiPUQ2TS2gGhuzMc0TW/n/mXtVzMBi6q40MPxv5AJy73BmxvsA+OBHVJeZLJRamEsp+s0UHfAbtZf5gn0U6NLOX9aCTz1e7PV7/A5t/ZeOJfLp/YkpDisAul1KRwCA9GUw7d/2tTSk5eu3a554ur5wdx+/oARf3wJ333wtRgZiI+v/0Nf5kDgQonXU0XWKvNyGhSOO4+dZwd+YaFNaVMhsmW0Bp/mX0J+3Ji8rsPr9mQiKg73Db/kUHlXPpu4gTi8vBrrEUT9LS6gxPFmJQaO6br6u8++OKVf25f8cl9yNqh6Ii4Iqtnt/gCDoQGYxDFyUaTbTyVFErTAw+S8Je66HakkIiqt5HmJnpAasn3kfy+hqYlrY+yHcFB+fJZtv7bQ5lxiX62+uB5XdNKeYF3q5oas1kdRr6lkNlH7A7KnW1MLi2nKnjOFKDiRI07whk1u2pf++YJAEymGP0f66rSztLaxrAAAAAASUVORK5CYII="
6543
+ },
6544
+ c869: function(t, e, i) {
6545
+ t.exports = i.p + "img/loading-pattie.svg"
6546
+ },
6547
+ cc99: function(t, e, i) {},
6548
+ d3f3: function(t, e) {
6549
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFG0lEQVRYCaVXa0xcRRQ+M/exsJTFUgOCpawGLU9taBuB1kdqjRQxwWhMQNPaNqExjTXGgk3sDxOLptb+ayRVafyDRVJfNAImPtpQCdSaKK8mDW1poU2BQq0sLNzde8e5d5m7d+5ddhc9f+acb86c883MnTNzEfwHCbz1dDnM+ZpxwJ/qu3NbE7wFfVKKZ4frva/7lhsOLWcASyyoSiobNzM6zFQQ8kv+XC6RuAgEP9j+Erkx3CQs+D1mNqqonlXgT3sAyK8tVhjE4i3Dck7hTml3wzmuI4IRlYAxY8X/FZeYaBDMzAGx5h1AuRthcnYehMnrILV+DKSnHWDuHzONTkR0iS9G25qIBEhFRnbgobU/ibN3c8xoNLHqLQCx9jBA2moT1gkwwbN3QW7/FEjbcZ5IybZO99nWanQG/ma+rHUQUOoqmvHUWA3GAvMBNTvPkZh1WgkwDFEiLp1IyxEGAVqVoUiPPP5+4oGmQyZIFZOAsdwz09/TtDJz0EQJ8JvHjKVmmL2NRID5GFtzbB+QgW4GAfbm3ZIzsp5l22IQUA+9Ug9X+g+jxVkTjQDZWgNCdZ05UO3rArX3R8AFJSCWVZq4lYD8eyfga4OgFZSCkldm+sgXOgE1vQswMRrC3B4il5bXJtY3fW4QCOxapwoYYWD7fLDZHKwrCwcqQRofASTSxVGDQN4+TomUGj6MgHB1AMT9W8xx6LEKmK//wrR1xdVKt+R06PtAqenznpPDiVjvMJLTVttYDqItebCxDuSpm6HkhrMIcO2irnEizM9wNulth8SOzzhs4WW6orsbDIxMjyfoCg68kLmZeaGsh5kabvu7wvqipkUgAOPXHX7Q84MDI+lrOAyrsryBQ2wGIsSGUJOuiEMmnAQijOSG+Z5JWmdsAYfaDHJ/uBTYujgTI/NAhfFCc3HDmEUjAronJgG8fqtlSEglk2NO7KrzHtK8hQ4/OxCbwLadALZtwEq4+rGAeDZcgg3M7QGFftSxJCYBPYDqzefi4AU/Z+uGZik2Rufzexw+kYC4CBj1n9YIUwR6FH3hsq6XXk702T9Xy0FLGTRSHEIvH3VTFQjdbaazureM7owGrgnniSD0rJOkFNM3mhLXCmiX+0Dt+oaLg+UEEFxuDmMGohVPHBlk5pJtcqfvDBYU5cKSHosdgYZXQdaXPV6hRUn4aEdc3lj69ua5aJ7aHz8vLzkLRknEswoxt0C7eJ6FNFr9ptSvabsIRZsApWVxMB78jbMjGRwBMnrJ6TMywGH4w9MgNPaCakkmV70OSUc6IPkTPqHjdNBIyHZnGASISqdFBZ/vgCDd76jiXmF0E8G5CvZxyFaeE04dBThx0HBDK9OMamZ8WcG01Uel22P7gT5IhJEhUGvXA6raC7hilz0mBPY9SY+YByT97C9+mMp3jaBe6QfNNjttsYKKQ90g0sSEvhkMSUwmUvFTb0DLZf5Jhnx32jAh5tTUlHsB0r0gXFr6oFj/C+xsSWUt4LkZIL+cNLtwdu4tOXMN/yQze6kSepTeoI9S7vOwunB6NAJWR5R6nyI9+sTSj1Krs/4sV9bmn5VmprOteCQ9JgG63GLuhjZ3T9trcT3LrUmMl/KC7xQtVklW3KpHIyAUbR6SVrir2QvYOo7pEV4RrCvc6r9m2ujwCTHgTw6jIS0SAT2xK694z//+NbMni0TESoD+nP5Ff063R5uxPWZcK2AfpG8NmfN9KQTmV/qmxlXhwaKB5SZmMf8F4cLeesegrcIAAAAASUVORK5CYII="
6550
+ },
6551
+ d51e: function(t, e, i) {
6552
+ t.exports = i.p + "img/copy-solid.svg"
6553
+ },
6554
+ d686: function(t, e) {
6555
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA+OAAAOwwHS3rpiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABpdJREFUWIW1l2tsHNUVx//n3nN3dh0nTRxLAeQUg3GVlCREclFUtbgOMpFSEQXUYEirRlDaD0nqBFNQm35otv1StbT0QSXUiLZQpEBqESVA+kKAo6A0gB3aSo6gpPb6oZKWJHaM451753H7YWd2Z8Z2DJV6pKvZmTlz7m/+55x7Z2l4a+N7XuDMeKEz5IX5IT9whgKbf8/4zr+0z0OvvfbZUhHFEP8no7E7l7zlhbn1fuDAC/PwQwde4FSOYR5e4Lh+6Ix6oTPih/lREzgjgc2NVI7OyMjS/Hixr+j/zwDntuUOe4Fzpxfk4YVOAmCe88CBF8FFv10/dAa9wPmbbwsvh274+55Sz+SHBWAJU7KCYEFJrmhUzNrKuQUAi8qxdj8PoM2C2hDQVzzH8X7U+vifPJv/8b6z9/UtCECMEgc6mgkRSDQZZk2WArSZZyJnBdDtCOn277f85pTn53d9Z2T7W/MByIfXYwURtgsbAARQZbIzBDwBYIyIpgAwgHpEHjEPAQBRDY8ysBZNRHT/5z7WVdc4eXffGfRaZIylQMlGzyjfAJZgYS+2PP+fbycd3918g3PRXHWtFdRMAZph0QxQiwWth0WrrZLNUost8K21zWLdddNH7/nh+a0fpO5e6MYSTOMSfMD6QOgT/MAZvuawe/18smXt6IavrvB8cbdBfrcXOJ+IC9WvdFHUUQ78MH8iRHlTsXSfGz8rlj+GKZK4AAZIAkJasDQrbQf4wwJsff2Jf28bOPDzqxc33MjS3cVSX1bCgIWGkhosNLhyfguFhSdTCgDAxE70Wx9t1quoAB8IPLSseA5DAGDvgnyn3LzDhM5FOcMv39g3OH0loINtX1/l+3XHTOhcX2njfEIFB55f2LF/tOtpABAAQAolkgBxZYABKVFNAfUiKNjwiCK9Oyz4509vWvfSG503f61/S1vdXABfHPjF2yrndyihSyxMQoVoSPcnxabfNVQBIFGKJ4+HdZCqgWuPjU6cu1z6PEv9S5a6k4U+EJTl2Mlb2x/qb2tTWYjtbz46Jth8gYV244lVlAol9XKl3J01BRjDWQCSmFWEG/vgr36xtFcJvZ+FgRK6QQr3EbOk7q/H2ztXZ/2/PPDT0zlhvlurBZNUorvY8SpXFBAoIZI+BpCMlvlyvPpY6XtK6sfiYFLqT0ppTr7a0dmR9WUz/qgU+p8sDFjGKmgoaVbUjQ9/RgCAyNVSEENgDgWSturm4QekcA+qWoUvVWQOH2/fdF3Sr2uw1yhpHqmloKaEFDObBQDUSwwTI8xArBnrQWE+ACoiLDctv5eF+Xui3ZZJ6T5jM6uRUO//loWeqhSgqakg9HoRBZsRjKFkDYCRq/ew4UoqfOrAgKeE2Vt9M2nAwmw4eWv7bSkV/tJbVmSOpFXQYGFaRexkJfoTBQhiQDDuuBIAALS+ON7Hwh1MBpfC7M36SVl+oVqE1VowjVUAYryETCdA4v7JnVi2EAQL71mVCM6kbzu1ecOSFEAh7FNC22Q7stCyChAuwgvEMJApiHrUYd+CAOQez/S6kp7emPTZ0vfMeZZ6rFqEFRW8KsDiPXifGEfjIozVEIwHp3pwy5UAKPdBP0sdqkRwlt7GrB+TOVvdIyrA4yLpYBV+QAyb6QYJhUOXHkbrfAAre1FmoUc5EVwJfVPWT0r3LKeX5ZEUwKK9GCCFQ5luADGuJsIrU9/AqvkglDAjyYWGpV43h8+7qU6Q3usi6xQo9BDjfLIjopQ0QeKNyR50zQVAbCeSG44SpuGdLdc0pgDIXKwWqjDIyZnjswDqd+McSXyJGEF2fwBjsVA4NNWD3gu7sDINgMnKt4RGnGcBfDzpw6xNdUMS7oXLl+ypWQAAkN+DP4OxgyT8OSAAxjZ28PZEN35WBWFMgaMPmkgFh2aaknFzVPZqa4F5tmuw18wJAACFbhy0CvcQw8wDUScYe6TE0MROPE+MtfE9wSGU0BDsNSRjSqG9uAZywvwaiL8H5rG6bjwHRicll2k5q0CZGFtIYmPyuuAQOVFenIynhM/RnvGHT79y4vSCAABQ2IMTeQc3kcLjyQ0rBZFevBIqhSkAKcuNLLTNCXd/fG1BAACg3Zgu9GCXFFgLxlPE8OZISfaDBkIiBZATppGlfnrNH//x5kcCiM15CGcWfRP3Uh4tUNgHximSs7bx5MinFBBuUJDTD6Ze7qMAzGXTRVxlA7SHHtbBxxrrYxV81FsP9aGPJ5f/Cg/EvhN3YOmyI0j9cf0viS/aZy8IpPkAAAAASUVORK5CYII="
6556
+ },
6557
+ da18: function(t, e, i) {},
6558
+ ddc9: function(t, e, i) {
6559
+ t.exports = i.p + "img/gmail.svg"
6560
+ },
6561
+ e0ed: function(t, e) {
6562
+ t.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAGaElEQVRYCY1Xy24cRRS9/ZgZP+JH7NgOCTE2CIiiECFZwBpFrPkAWPFV/AY7VkhZIMQCIR4iQQRsOcRMYmNP/BrPTE8X55yq6umxY6A93VV97617bt1XtZMnH88645Xw5oMjbzxqYxLf03O8tCYXeRglH3kaIVfxwxrQSRoB1edj4EEmKoi8CEDjIg+jNzaAyPDaPK7B6JdFZf8KXgOI8lHRZeCVQQG8kudmPLiBlsuM/wKPoBwbTUuaE7hbZhr9PGm0LMkbZriTBkeozjDHu7PShgd/WtF+5MGjcTAkJ3Y91um1m5bNL0uJFERledMsgzh3bEOzsoRijK60xDGNSs8jGzQrBhAbmCtAwC+7esNc79DKw7+8XPAIzKQBXihfu2v54g2zfleLxJOyvjko03XOlaP1Xod/p07clSxeBl1LZ5esPGqP6FUIKAwjGsur5rpHWuywv932nh12OtZoNW3l5nWbmJ4KhmFBa9JShoCu582QaAQtJ61h/ae/mDvdD2swMETRKI3KgWCtLGYK+/fNx1vm5l+x9U8+s+2vvrBHP/xotzfu2sREy5pvvm/5yjpEIUx5XtXoJw5DevDEht1oAAjICckFcFZOFQKFtiwk0O2eWWe/Y6sb9+3q2/es6J3Z/sPvrb391NZuv2HDoz1LWvDGsIcYh3vYR9wZqnAXZ+CDRnsUYpjLHKqBk64qEDgebggDsGLQx0KE4MXvcGHprLu7IyVFgaSDwrKzY8MSOVFzfzo1q/did9PcyZ7k6uCaozI0xiqgByI4GQ5KExCnZqYtTSUF2tAW72xYd69t033sHAuy2WuWrbyOHWP33DF2XvaQO0jU8uTvl4Nj52MeCJ6RBypLAWZZhlJu2Dv3P7K5+5/CoNQmr1231Xc3rHj0AJ5hTcMD8EK1jrsICn1HHLlddLkdNOVAkKVBWFflABcyBAkMYGwyZO/xl59bOr+E+j0xOz1E/KJijl5hzH5f86eWLb7mG1WD1YDegTA5eGew85Nfw0pwwKHR0DfuATAsmVCiZMtrSLRJlVgKJVJ0dmTF88fWuvOhB0lpLAzBo+yfWH/zW2utv1fRPI+hXbRB+2fIoWlR1wCeDpvxHgguYkYjwJZeWbDWWx9Qs7dUE3qob8XBtqUT0+JFcI5JcxJAvopkgQyjAtwZPMHkYteEZ1xxincuoh0xPiAwmQy7YjLykps00Sv8BUWqFDIDgyN1KWnRgvVCHq4gQz0JzpDKAzXMVEIhHg51zSRkPV8AJ0iwOir2awXlwbgJ/OkK4F4WbHRH7wGM5AVMGEDNgUBgGsDSoiIpIS/wMdBAh4PI00jAJTk86KFLwqA2HHMggBP7Qg4kDEECcB4+VFgHx5yZ7dDlknyUBzTIDdH5SuTI/hbyeMZvgp0QNMqXZwewFHqps1ZNeZUDjAsX0ANAZUdLpqAIxypDo4YzgCKUZ++3B1AEVzJXaCCM1rk/OLWis23ZlSXxVT1o2SlKr+y90HHMI77u9coDii8VhgQZtH+1bOFVlQ1LJ52cM5tdxmJn6dRVy5fWYSw+OCjPC0Nv+zvLF25ZNrPiDaOrA294/AxHB3qJvikoDx5+oQ/4F4KrlNgglteteeueV0RJ/PzF8wCpQ1fGK/D4paQK4nsEDzJKQuhP0nEPqAwlG3bukygcTFKMRwCQHXQ9Q8VLQH5KQIEwd+rgYa14nMsArsULfukYePQABQXihQRBGi6Gg/lwHnyMJ0kKhwlB5DEYGT/ryAN91IjkAVDVjumBAEId5xSN8wITgyqk7h2tJQO/+DFSywHZJeURXN2SB1KuzOf6MXC+QhHLSpfc52WYO2XvGFWya8OT5z4XEA7HMoRR5Wn4RlB/gSdoNx7jSQhC7Oeuf2zFi6cSUouGEinil+3xczsbnHgQVo52jRoP9d3f+lrrZDyRBIahMYmvqZ0KnPTxPgBCebxn2RzKDTXd/+OblyqihrLbgTeAyB6AA0b9A3NpRxgdQ4nvCz/yHfOjJ9D/rKZTZQhXxArAWB62rZxZUA8wAlAJ22tUisOIyhK4tqRXgovV8TBXFQVPjHtg5PboER+CGjgJPDWL9kOc+/wvJhqHSVQa5NWAyKeLow7NAy3ywkiWZDWO5v40lAIPPqYw0EfgXIjfBcCRwhEIBT39MnDyQxn+X3DKjRRXhhGBYHUe30G/FBxsLvoHJCM5JyU1x+sAAAAASUVORK5CYII="
6563
+ },
6564
+ e108: function(t, e, i) {
6565
+ t.exports = i.p + "img/check-circle-solid-white.svg"
6566
+ },
6567
+ e8f2: function(t, e, i) {},
6568
+ f8b1: function(t, e, i) {
6569
+ "use strict";
6570
+ i("9fec")
6571
+ }
6572
+ });
includes/js/user-profile-twofa.js ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ function mo2fa_viewMethod(evt, selected_method)
2
+ {
3
+ var i, tabcontent, tablinks;
4
+ var is_registered = jQuery('input[name=\'is_registered\']').val();
5
+ var trimmed_method = selected_method.replace(/ /g,'');
6
+ jQuery('#method').val(selected_method);
7
+ tabcontent = document.getElementsByClassName("mo2fa_tabcontent");
8
+ for (i = 0; i < tabcontent.length; i++) {
9
+ tabcontent[i].style.display = "none";
10
+ }
11
+ tablinks = document.getElementsByClassName("mo2fa_tablinks");
12
+ for (i = 0; i < tablinks.length; i++) {
13
+ tablinks[i].className = tablinks[i].className.replace(" active", "");
14
+ }
15
+ mo2fa_viewMethod.calledTimes++;
16
+ jQuery("#mo2fa_count").val(mo2fa_viewMethod.calledTimes);
17
+ document.getElementById(selected_method).style.display = "block";
18
+ evt.currentTarget.className += " active";
19
+ var same_user = jQuery('input[name=\'same_user\']').val();
20
+ var textbox_id = 'textbox-'+trimmed_method;
21
+ var textbox_element = document.getElementById(textbox_id);
22
+ if(selected_method == 'SecurityQuestions')
23
+ document.getElementById("mo2f_kbaquestion_1").focus();
24
+ else if(selected_method == 'OTPOverSMS' && is_registered)
25
+ document.getElementById("textbox-OTPOverSMS").focus();
26
+ else if(textbox_element !== null && same_user && (is_registered && ((trimmed_method!="EmailVerification" && trimmed_method !='OTPOverEmail')) || (!is_registered && (trimmed_method=="GoogleAuthenticator" || trimmed_method=="AuthyAuthenticator" || trimmed_method=='SecurityQuestions'))))
27
+ document.getElementById(textbox_id).focus();
28
+ var save_button_id = jQuery('#'+'save-'+trimmed_method);
29
+ var form_id = jQuery('#'+'mo2f_verify_form-'+trimmed_method);
30
+ jQuery(form_id).submit(function(e){
31
+ e.preventDefault();
32
+ jQuery(save_button_id).click();
33
+ });
34
+ var MO2F_IS_ONPREM = jQuery('input[name=\'MO2F_IS_ONPREM\']').val();
35
+ var cloud_methods = ["miniOrangeQRCodeAuthentication", "miniOrangeSoftToken","miniOrangePushNotification","OTPOverSMS","miniOrangeAuthenticator"];
36
+ if(MO2F_IS_ONPREM == 0 && !is_registered)
37
+ {
38
+ jQuery('#wpns_nav_message').empty();
39
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>Please register with miniOrange for using this method</b> </div></div>");
40
+ window.onload = nav_popup();
41
+ return;
42
+ }
43
+ for(method of cloud_methods)
44
+ {
45
+ if((selected_method==method && !is_registered) || !MO2F_IS_ONPREM)
46
+ {
47
+ jQuery('#wpns_nav_message').empty();
48
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>Please register with miniOrange for using this method</b> </div></div>");
49
+ window.onload = nav_popup();
50
+ }
51
+ }
52
+ }
53
+
54
+ jQuery('#mo2f_qrcode').hide();
55
+ jQuery('.mo2f_miniAuthApp').click(function(){
56
+ jQuery('#mo2f_qrcode').show();
57
+ jQuery('#mo2fa_display_mo_methods').hide();
58
+ var method = jQuery('input[name="miniOrangeAuthenticator"]:checked').val();
59
+ });
60
+
61
+ jQuery('.mo2f_miniAuthApp').click(function(){
62
+ var method = jQuery('input[name="miniOrangeAuthenticator"]:checked').val();
63
+ });
64
+
65
+ jQuery('#miniOrangeSoftTokenButton').click(function() {
66
+ jQuery('#method').val('miniOrangeSoftToken');
67
+ jQuery("#save-miniOrangeAuthenticator").click(function(e){
68
+ set_mo_methods('miniOrangeSoftToken');
69
+ });
70
+ });
71
+ jQuery('#miniOrangeQRCodeAuthenticationButton').click(function() {
72
+ jQuery('#method').val('miniOrangeQRCodeAuthentication');
73
+ jQuery("#save-miniOrangeAuthenticator").click(function(e){
74
+ set_mo_methods('miniOrangeQRCodeAuthentication');
75
+ });
76
+ });
77
+ jQuery('#miniOrangePushNotificationButton').click(function() {
78
+ jQuery('#method').val('miniOrangePushNotification');
79
+ jQuery("#save-miniOrangeAuthenticator").click(function(e){
80
+ set_mo_methods('miniOrangePushNotification');
81
+ });
82
+ });
83
+
84
+
85
+ function set_mo_methods(trimmed_method){
86
+ var textbox_id_element = jQuery('#'+'textbox-'+trimmed_method);
87
+ var code = jQuery('#textbox-miniOrangeAuthenticator').val();
88
+ var nonce = jQuery('input[name=\'mo2f-update-mobile-nonce\']').val();
89
+ var transient_id = jQuery('input[name=\'transient_id\']').val();
90
+ var is_registered = jQuery('input[name=\'is_registered\']').val();
91
+ if(!is_registered)
92
+ {
93
+ jQuery('#wpns_nav_message').empty();
94
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>Please register with miniOrange for using this method</b> </div></div>");
95
+ window.onload = nav_popup();
96
+ }
97
+ else
98
+ {
99
+ var data = {
100
+ 'action' : 'mo_two_factor_ajax',
101
+ 'mo_2f_two_factor_ajax' : 'mo2f_set_miniorange_methods',
102
+ 'nonce' : nonce,
103
+ 'code' : code,
104
+ 'transient_id' : transient_id,
105
+ };
106
+ jQuery.post(ajaxurl, data, function(response) {
107
+ if(response['status'] == "SUCCESS")
108
+ {
109
+ $("#mo2f_configuration_status").val(response['status']);
110
+ }
111
+ jQuery('#wpns_nav_message').empty();
112
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='"+(response['status']=="SUCCESS"?"mo2fa_overlay_success":"mo2fa_overlay_error")+"'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>"+response['status']+"</b> : "+response['message']+"</div></div>");
113
+ window.onload = nav_popup();
114
+ });
115
+ }
116
+ }
117
+ function mo2fa_set_ga(code){
118
+ var nonce = jQuery('input[name=\'mo2f-update-mobile-nonce\']').val();
119
+ var transient_id = jQuery('input[name=\'transient_id\']').val();
120
+ var ga_secret = jQuery('input[name=\'ga_secret\']').val();
121
+ var data = {
122
+ 'action' : 'mo_two_factor_ajax',
123
+ 'mo_2f_two_factor_ajax' : 'mo2f_set_GA',
124
+ 'nonce' : nonce,
125
+ 'code' : code,
126
+ 'transient_id' : transient_id,
127
+ 'ga_secret' : ga_secret
128
+ };
129
+ jQuery.post(ajaxurl, data, function(response) {
130
+ jQuery('#wpns_nav_message').empty();
131
+ if(response == "SUCCESS"){
132
+ jQuery("#mo2f_configuration_status").val(response);
133
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_success'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>SUCCESS</b> : Entered Passcode is correct. Click on Update Profile.</div></div>");
134
+ }else if(response == "UserIdNotFound"){
135
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; Error occured validating the user. </div></div>");
136
+ }else{
137
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>ERROR</b> : Entered Passcode is incorrect. </div></div>");
138
+ }
139
+ window.onload = nav_popup();
140
+ });
141
+ }
142
+ var MO2F_IS_ONPREM = jQuery('input[name=\'MO2F_IS_ONPREM\']').val();
143
+ if(MO2F_IS_ONPREM == 1){
144
+ jQuery(document).ready(function() {
145
+ jQuery('.mo2f_gauth').qrcode({
146
+ 'render': 'image',
147
+ size: 175,
148
+ 'text': jQuery('.mo2f_gauth').data('qrcode')
149
+ });
150
+ });
151
+ }
152
+
153
+ jQuery("#save-GoogleAuthenticator").click(function(e){
154
+ var code = jQuery('#textbox-GoogleAuthenticator').val();
155
+ mo2fa_set_ga(code);
156
+ });
157
+ jQuery("#save-AuthyAuthenticator").click(function(e){
158
+ var code = jQuery('#textbox-AuthyAuthenticator').val();
159
+ mo2fa_set_ga(code);
160
+ });
161
+ jQuery("#save-OTPOverSMS").click(function(e){
162
+ var nonce = jQuery('input[name=\'mo2f-update-mobile-nonce\']').val();
163
+ var transient_id = jQuery('input[name=\'transient_id\']').val();
164
+ var phone = jQuery("#textbox-OTPOverSMS").val();
165
+ var is_registered = jQuery('input[name=\'is_registered\']').val();
166
+ if(!is_registered){
167
+ jQuery('#wpns_nav_message').empty();
168
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; <b>Please register with miniOrange for using this method</b> </div></div>");
169
+ window.onload = nav_popup();
170
+ }
171
+ else{
172
+ var data = {
173
+ 'action' : 'mo_two_factor_ajax',
174
+ 'mo_2f_two_factor_ajax' : 'mo2f_set_otp_over_sms',
175
+ 'nonce' : nonce,
176
+ 'transient_id' : transient_id,
177
+ 'phone' : phone
178
+ };
179
+ jQuery.post(ajaxurl, data, function(response) {
180
+ jQuery('#wpns_nav_message').empty();
181
+ if(response == "UserIdNotFound"){
182
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; Error occured validating the user. </div></div>");
183
+ }else if(response != "ERROR"){
184
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_success'><div class='mo2fa_popup_text'>&nbsp; &nbsp; Phone no. has been saved. Click on Update Profile.</div></div>");
185
+ }else{
186
+ jQuery('#wpns_nav_message').append("<div id='notice_div' class='mo2fa_overlay_error'><div class='mo2fa_popup_text'>&nbsp; &nbsp; There was an error saving your phone no. </div></div>");
187
+ }
188
+ window.onload = nav_popup();
189
+ });
190
+ }
191
+ })
192
+ mo2fa_viewMethod.calledTimes = 0;
193
+ document.getElementById("defaultOpen").click();
194
+ jQuery("#textbox-OTPOverSMS").intlTelInput();
includes/lib/mo-2fa-options-enum.php DELETED
@@ -1,435 +0,0 @@
1
- <?php
2
- include "Mo2FABasicEnum.php";
3
-
4
- class mo_2fa_options_enum_pointers extends Mo2FABasicEnum{
5
- public static
6
- $DEFAULT = array(
7
- 'custom_admin_pointers4_8_52_default-miniorange-sp-metadata-url',
8
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-select-authentication',
9
-
10
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-configure',
11
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-choose_app',
12
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-download_app',
13
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-choose_name_on_app',
14
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-scan-qrcode',
15
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-enter_code_manually',
16
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-enter-otp',
17
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-save-otp',
18
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-test',
19
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-customizations',
20
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-inline-registration',
21
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-integration',
22
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-premium-features',
23
-
24
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-upgrade',
25
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-support',
26
- 'custom_admin_pointers4_8_52_default-miniorange-2fa-support_open',
27
-
28
-
29
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-level',
30
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-attacks',
31
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-attack-limit',
32
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-rate-limit',
33
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-check-attacks',
34
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-support',
35
- 'custom_admin_pointers4_8_52_default-miniorange-firewall-support_open',
36
-
37
-
38
- 'custom_admin_pointers4_8_52_default-miniorange-malware-scan-modes',
39
- 'custom_admin_pointers4_8_52_default-miniorange-malware-custom-scan-files',
40
- 'custom_admin_pointers4_8_52_default-miniorange-malware-scan-reports',
41
- 'custom_admin_pointers4_8_52_default-miniorange-malware-scan-dashboard',
42
- 'custom_admin_pointers4_8_52_default-miniorange-malware-support',
43
- 'custom_admin_pointers4_8_52_default-miniorange-malware-support_open',
44
-
45
-
46
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-IP-blocking',
47
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-IP-whitelisting',
48
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-IP-lookup',
49
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-IP-range',
50
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-htaccess-blocking',
51
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-browser-blocking',
52
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-country-blocking',
53
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-support',
54
- 'custom_admin_pointers4_8_52_default-miniorange-advance-blocking-support_open',
55
-
56
-
57
- 'custom_admin_pointers4_8_52_default-miniorange-backup-manual-db',
58
- 'custom_admin_pointers4_8_52_default-miniorange-backup-auto-db',
59
- 'custom_admin_pointers4_8_52_default-miniorange-backup-file',
60
- 'custom_admin_pointers4_8_52_default-miniorange-backup-report',
61
- 'custom_admin_pointers4_8_52_default-miniorange-backup-support',
62
- 'custom_admin_pointers4_8_52_default-miniorange-backup-support_open',
63
-
64
-
65
-
66
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-bruteforce',
67
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-recaptcha',
68
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-strong-pass',
69
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-fake-registration',
70
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-content',
71
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-block-spam',
72
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-support',
73
- 'custom_admin_pointers4_8_52_default-miniorange-login-spam-support_open'
74
- );
75
-
76
-
77
- }
78
-
79
-
80
- class mo_2fa_time_zones {
81
-
82
- public static $time_zones = array(
83
- "(GMT-11:00) Niue Time" => "Pacific/Niue",
84
- "(GMT-11:00) Samoa Standard Time" => "Pacific/Pago_Pago",
85
- "(GMT-10:00) Cook Islands Standard Time" => "Pacific/Rarotonga",
86
- "(GMT-10:00) Hawaii-Aleutian Standard Time" => "Pacific/Honolulu",
87
- "(GMT-10:00) Tahiti Time" => "Pacific/Tahiti",
88
- "(GMT-09:30) Marquesas Time" => "Pacific/Marquesas",
89
- "(GMT-09:00) Gambier Time" => "Pacific/Gambier",
90
- "(GMT-09:00) Hawaii-Aleutian Time (Adak)" => "America/Adak",
91
- "(GMT-08:00) Alaska Time - Anchorage" => "America/Anchorage",
92
- "(GMT-08:00) Alaska Time - Juneau" => "America/Juneau",
93
- "(GMT-08:00) Alaska Time - Metlakatla" => "America/Metlakatla",
94
- "(GMT-08:00) Alaska Time - Nome" => "America/Nome",
95
- "(GMT-08:00) Alaska Time - Sitka" => "America/Sitka",
96
- "(GMT-08:00) Alaska Time - Yakutat" => "America/Yakutat",
97
- "(GMT-08:00) Pitcairn Time" => "Pacific/Pitcairn",
98
- "(GMT-07:00) Mexican Pacific Standard Time" => "America/Hermosillo",
99
- "(GMT-07:00) Mountain Standard Time - Creston" => "America/Creston",
100
- "(GMT-07:00) Mountain Standard Time - Dawson" => "America/Dawson",
101
- "(GMT-07:00) Mountain Standard Time - Dawson Creek" => "America/Dawson_Creek",
102
- "(GMT-07:00) Mountain Standard Time - Fort Nelson" => "America/Fort_Nelson",
103
- "(GMT-07:00) Mountain Standard Time - Phoenix" => "America/Phoenix",
104
- "(GMT-07:00) Mountain Standard Time - Whitehorse" => "America/Whitehorse",
105
- "(GMT-07:00) Pacific Time - Los Angeles" => "America/Los_Angeles",
106
- "(GMT-07:00) Pacific Time - Tijuana" => "America/Tijuana",
107
- "(GMT-07:00) Pacific Time - Vancouver" => "America/Vancouver",
108
- "(GMT-06:00) Central Standard Time - Belize" => "America/Belize",
109
- "(GMT-06:00) Central Standard Time - Costa Rica" => "America/Costa_Rica",
110
- "(GMT-06:00) Central Standard Time - El Salvador" => "America/El_Salvador",
111
- "(GMT-06:00) Central Standard Time - Guatemala" => "America/Guatemala",
112
- "(GMT-06:00) Central Standard Time - Managua" => "America/Managua",
113
- "(GMT-06:00) Central Standard Time - Regina" => "America/Regina",
114
- "(GMT-06:00) Central Standard Time - Swift Current" => "America/Swift_Current",
115
- "(GMT-06:00) Central Standard Time - Tegucigalpa" => "America/Tegucigalpa",
116
- "(GMT-06:00) Easter Island Time" => "Pacific/Easter",
117
- "(GMT-06:00) Galapagos Time" => "Pacific/Galapagos",
118
- "(GMT-06:00) Mexican Pacific Time - Chihuahua" => "America/Chihuahua",
119
- "(GMT-06:00) Mexican Pacific Time - Mazatlan" => "America/Mazatlan",
120
- "(GMT-06:00) Mountain Time - Boise" => "America/Boise",
121
- "(GMT-06:00) Mountain Time - Cambridge Bay" => "America/Cambridge_Bay",
122
- "(GMT-06:00) Mountain Time - Denver" => "America/Denver",
123
- "(GMT-06:00) Mountain Time - Edmonton" => "America/Edmonton",
124
- "(GMT-06:00) Mountain Time - Inuvik" => "America/Inuvik",
125
- "(GMT-06:00) Mountain Time - Ojinaga" => "America/Ojinaga",
126
- "(GMT-06:00) Mountain Time - Yellowknife" => "America/Yellowknife",
127
- "(GMT-05:00) Acre Standard Time - Eirunepe" => "America/Eirunepe",
128
- "(GMT-05:00) Acre Standard Time - Rio Branco" => "America/Rio_Branco",
129
- "(GMT-05:00) Central Time - Bahia Banderas" => "America/Bahia_Banderas",
130
- "(GMT-05:00) Central Time - Beulah, North Dakota" => "America/North_Dakota/Beulah",
131
- "(GMT-05:00) Central Time - Center, North Dakota" => "America/North_Dakota/Center",
132
- "(GMT-05:00) Central Time - Chicago" => "America/Chicago",
133
- "(GMT-05:00) Central Time - Knox, Indiana" => "America/Indiana/Knox",
134
- "(GMT-05:00) Central Time - Matamoros" => "America/Matamoros",
135
- "(GMT-05:00) Central Time - Menominee" => "America/Menominee",
136
- "(GMT-05:00) Central Time - Merida" => "America/Merida",
137
- "(GMT-05:00) Central Time - Mexico City" => "America/Mexico_City",
138
- "(GMT-05:00) Central Time - Monterrey" => "America/Monterrey",
139
- "(GMT-05:00) Central Time - New Salem, North Dakota" => "America/North_Dakota/New_Salem",
140
- "(GMT-05:00) Central Time - Rainy River" => "America/Rainy_River",
141
- "(GMT-05:00) Central Time - Rankin Inlet" => "America/Rankin_Inlet",
142
- "(GMT-05:00) Central Time - Resolute" => "America/Resolute",
143
- "(GMT-05:00) Central Time - Tell City, Indiana" => "America/Indiana/Tell_City",
144
- "(GMT-05:00) Central Time - Winnipeg" => "America/Winnipeg",
145
- "(GMT-05:00) Colombia Standard Time" => "America/Bogota",
146
- "(GMT-05:00) Eastern Standard Time - Atikokan" => "America/Atikokan",
147
- "(GMT-05:00) Eastern Standard Time - Cancun" => "America/Cancun",
148
- "(GMT-05:00) Eastern Standard Time - Jamaica" => "America/Jamaica",
149
- "(GMT-05:00) Eastern Standard Time - Panama" => "America/Panama",
150
- "(GMT-05:00) Ecuador Time" => "America/Guayaquil",
151
- "(GMT-05:00) Peru Standard Time" => "America/Lima",
152
- "(GMT-04:00) Amazon Standard Time - Boa Vista" => "America/Boa_Vista",
153
- "(GMT-04:00) Amazon Standard Time - Campo Grande" => "America/Campo_Grande",
154
- "(GMT-04:00) Amazon Standard Time - Cuiaba" => "America/Cuiaba",
155
- "(GMT-04:00) Amazon Standard Time - Manaus" => "America/Manaus",
156
- "(GMT-04:00) Amazon Standard Time - Porto Velho" => "America/Porto_Velho",
157
- "(GMT-04:00) Atlantic Standard Time - Barbados" => "America/Barbados",
158
- "(GMT-04:00) Atlantic Standard Time - Blanc-Sablon" => "America/Blanc-Sablon",
159
- "(GMT-04:00) Atlantic Standard Time - Cura�ao" => "America/Curacao",
160
- "(GMT-04:00) Atlantic Standard Time - Martinique" => "America/Martinique",
161
- "(GMT-04:00) Atlantic Standard Time - Port of Spain" => "America/Port_of_Spain",
162
- "(GMT-04:00) Atlantic Standard Time - Puerto Rico" => "America/Puerto_Rico",
163
- "(GMT-04:00) Atlantic Standard Time - Santo Domingo" => "America/Santo_Domingo",
164
- "(GMT-04:00) Bolivia Time" => "America/La_Paz",
165
- "(GMT-04:00) Chile Time" => "America/Santiago",
166
- "(GMT-04:00) Cuba Time" => "America/Havana",
167
- "(GMT-04:00) Eastern Time - Detroit" => "America/Detroit",
168
- "(GMT-04:00) Eastern Time - Grand Turk" => "America/Grand_Turk",
169
- "(GMT-04:00) Eastern Time - Indianapolis" => "America/Indiana/Indianapolis",
170
- "(GMT-04:00) Eastern Time - Iqaluit" => "America/Iqaluit",
171
- "(GMT-04:00) Eastern Time - Louisville" => "America/Kentucky/Louisville",
172
- "(GMT-04:00) Eastern Time - Marengo, Indiana" => "America/Indiana/Marengo",
173
- "(GMT-04:00) Eastern Time - Monticello, Kentucky" => "America/Kentucky/Monticello",
174
- "(GMT-04:00) Eastern Time - Nassau" => "America/Nassau",
175
- "(GMT-04:00) Eastern Time - New York" => "America/New_York",
176
- "(GMT-04:00) Eastern Time - Nipigon" => "America/Nipigon",
177
- "(GMT-04:00) Eastern Time - Pangnirtung" => "America/Pangnirtung",
178
- "(GMT-04:00) Eastern Time - Petersburg, Indiana" => "America/Indiana/Petersburg",
179
- "(GMT-04:00) Eastern Time - Port-au-Prince" => "America/Port-au-Prince",
180
- "(GMT-04:00) Eastern Time - Thunder Bay" => "America/Thunder_Bay",
181
- "(GMT-04:00) Eastern Time - Toronto" => "America/Toronto",
182
- "(GMT-04:00) Eastern Time - Vevay, Indiana" => "America/Indiana/Vevay",
183
- "(GMT-04:00) Eastern Time - Vincennes, Indiana" => "America/Indiana/Vincennes",
184
- "(GMT-04:00) Eastern Time - Winamac, Indiana" => "America/Indiana/Winamac",
185
- "(GMT-04:00) Guyana Time" => "America/Guyana",
186
- "(GMT-04:00) Paraguay Time" => "America/Asuncion",
187
- "(GMT-04:00) Venezuela Time" => "America/Caracas",
188
- "(GMT-03:00) Argentina Standard Time - Buenos Aires" => "America/Argentina/Buenos_Aires",
189
- "(GMT-03:00) Argentina Standard Time - Catamarca" => "America/Argentina/Catamarca",
190
- "(GMT-03:00) Argentina Standard Time - Cordoba" => "America/Argentina/Cordoba",
191
- "(GMT-03:00) Argentina Standard Time - Jujuy" => "America/Argentina/Jujuy",
192
- "(GMT-03:00) Argentina Standard Time - La Rioja" => "America/Argentina/La_Rioja",
193
- "(GMT-03:00) Argentina Standard Time - Mendoza" => "America/Argentina/Mendoza",
194
- "(GMT-03:00) Argentina Standard Time - Rio Gallegos" => "America/Argentina/Rio_Gallegos",
195
- "(GMT-03:00) Argentina Standard Time - Salta" => "America/Argentina/Salta",
196
- "(GMT-03:00) Argentina Standard Time - San Juan" => "America/Argentina/San_Juan",
197
- "(GMT-03:00) Argentina Standard Time - San Luis" => "America/Argentina/San_Luis",
198
- "(GMT-03:00) Argentina Standard Time - Tucuman" => "America/Argentina/Tucuman",
199
- "(GMT-03:00) Argentina Standard Time - Ushuaia" => "America/Argentina/Ushuaia",
200
- "(GMT-03:00) Atlantic Time - Bermuda" => "Atlantic/Bermuda",
201
- "(GMT-03:00) Atlantic Time - Glace Bay" => "America/Glace_Bay",
202
- "(GMT-03:00) Atlantic Time - Goose Bay" => "America/Goose_Bay",
203
- "(GMT-03:00) Atlantic Time - Halifax" => "America/Halifax",
204
- "(GMT-03:00) Atlantic Time - Moncton" => "America/Moncton",
205
- "(GMT-03:00) Atlantic Time - Thule" => "America/Thule",
206
- "(GMT-03:00) Brasilia Standard Time - Araguaina" => "America/Araguaina",
207
- "(GMT-03:00) Brasilia Standard Time - Bahia" => "America/Bahia",
208
- "(GMT-03:00) Brasilia Standard Time - Belem" => "America/Belem",
209
- "(GMT-03:00) Brasilia Standard Time - Fortaleza" => "America/Fortaleza",
210
- "(GMT-03:00) Brasilia Standard Time - Maceio" => "America/Maceio",
211
- "(GMT-03:00) Brasilia Standard Time - Recife" => "America/Recife",
212
- "(GMT-03:00) Brasilia Standard Time - Santarem" => "America/Santarem",
213
- "(GMT-03:00) Brasilia Standard Time - Sao Paulo" => "America/Sao_Paulo",
214
- "(GMT-03:00) Chile Time" => "America/Santiago",
215
- "(GMT-03:00) Falkland Islands Standard Time" => "Atlantic/Stanley",
216
- "(GMT-03:00) French Guiana Time" => "America/Cayenne",
217
- "(GMT-03:00) Palmer Time" => "Antarctica/Palmer",
218
- "(GMT-03:00) Punta Arenas Time" => "America/Punta_Arenas",
219
- "(GMT-03:00) Rothera Time" => "Antarctica/Rothera",
220
- "(GMT-03:00) Suriname Time" => "America/Paramaribo",
221
- "(GMT-03:00) Uruguay Standard Time" => "America/Montevideo",
222
- "(GMT-02:30) Newfoundland Time" => "America/St_Johns",
223
- "(GMT-02:00) Fernando de Noronha Standard Time" => "America/Noronha",
224
- "(GMT-02:00) South Georgia Time" => "Atlantic/South_Georgia",
225
- "(GMT-02:00) St. Pierre & Miquelon Time" => "America/Miquelon",
226
- "(GMT-02:00) West Greenland Time" => "America/Nuuk",
227
- "(GMT-01:00) Cape Verde Standard Time" => "Atlantic/Cape_Verde",
228
- "(GMT+00:00) Azores Time" => "Atlantic/Azores",
229
- "(GMT+00:00) Coordinated Universal Time" => "UTC",
230
- "(GMT+00:00) East Greenland Time" => "America/Scoresbysund",
231
- "(GMT+00:00) Greenwich Mean Time" => "Etc/GMT",
232
- "(GMT+00:00) Greenwich Mean Time - Abidjan" => "Africa/Abidjan",
233
- "(GMT+00:00) Greenwich Mean Time - Accra" => "Africa/Accra",
234
- "(GMT+00:00) Greenwich Mean Time - Bissau" => "Africa/Bissau",
235
- "(GMT+00:00) Greenwich Mean Time - Danmarkshavn" => "America/Danmarkshavn",
236
- "(GMT+00:00) Greenwich Mean Time - Monrovia" => "Africa/Monrovia",
237
- "(GMT+00:00) Greenwich Mean Time - Reykjavik" => "Atlantic/Reykjavik",
238
- "(GMT+00:00) Greenwich Mean Time - S�o Tom�" => "Africa/Sao_Tome",
239
- "(GMT+01:00) Central European Standard Time - Algiers" => "Africa/Algiers",
240
- "(GMT+01:00) Central European Standard Time - Tunis" => "Africa/Tunis",
241
- "(GMT+01:00) Ireland Time" => "Europe/Dublin",
242
- "(GMT+01:00) Morocco Time" => "Africa/Casablanca",
243
- "(GMT+01:00) United Kingdom Time" => "Europe/London",
244
- "(GMT+01:00) West Africa Standard Time - Lagos" => "Africa/Lagos",
245
- "(GMT+01:00) West Africa Standard Time - Ndjamena" => "Africa/Ndjamena",
246
- "(GMT+01:00) Western European Time - Canary" => "Atlantic/Canary",
247
- "(GMT+01:00) Western European Time - Faroe" => "Atlantic/Faroe",
248
- "(GMT+01:00) Western European Time - Lisbon" => "Europe/Lisbon",
249
- "(GMT+01:00) Western European Time - Madeira" => "Atlantic/Madeira",
250
- "(GMT+01:00) Western Sahara Time" => "Africa/El_Aaiun",
251
- "(GMT+02:00) Central Africa Time - Khartoum" => "Africa/Khartoum",
252
- "(GMT+02:00) Central Africa Time - Maputo" => "Africa/Maputo",
253
- "(GMT+02:00) Central Africa Time - Windhoek" => "Africa/Windhoek",
254
- "(GMT+02:00) Central European Time - Amsterdam" => "Europe/Amsterdam",
255
- "(GMT+02:00) Central European Time - Andorra" => "Europe/Andorra",
256
- "(GMT+02:00) Central European Time - Belgrade" => "Europe/Belgrade",
257
- "(GMT+02:00) Central European Time - Berlin" => "Europe/Berlin",
258
- "(GMT+02:00) Central European Time - Brussels" => "Europe/Brussels",
259
- "(GMT+02:00) Central European Time - Budapest" => "Europe/Budapest",
260
- "(GMT+02:00) Central European Time - Ceuta" => "Africa/Ceuta",
261
- "(GMT+02:00) Central European Time - Copenhagen" => "Europe/Copenhagen",
262
- "(GMT+02:00) Central European Time - Gibraltar" => "Europe/Gibraltar",
263
- "(GMT+02:00) Central European Time - Luxembourg" => "Europe/Luxembourg",
264
- "(GMT+02:00) Central European Time - Madrid" => "Europe/Madrid",
265
- "(GMT+02:00) Central European Time - Malta" => "Europe/Malta",
266
- "(GMT+02:00) Central European Time - Monaco" => "Europe/Monaco",
267
- "(GMT+02:00) Central European Time - Oslo" => "Europe/Oslo",
268
- "(GMT+02:00) Central European Time - Paris" => "Europe/Paris",
269
- "(GMT+02:00) Central European Time - Prague" => "Europe/Prague",
270
- "(GMT+02:00) Central European Time - Rome" => "Europe/Rome",
271
- "(GMT+02:00) Central European Time - Stockholm" => "Europe/Stockholm",
272
- "(GMT+02:00) Central European Time - Tirane" => "Europe/Tirane",
273
- "(GMT+02:00) Central European Time - Vienna" => "Europe/Vienna",
274
- "(GMT+02:00) Central European Time - Warsaw" => "Europe/Warsaw",
275
- "(GMT+02:00) Central European Time - Zurich" => "Europe/Zurich",
276
- "(GMT+02:00) Eastern European Standard Time - Cairo" => "Africa/Cairo",
277
- "(GMT+02:00) Eastern European Standard Time - Kaliningrad" => "Europe/Kaliningrad",
278
- "(GMT+02:00) Eastern European Standard Time - Tripoli" => "Africa/Tripoli",
279
- "(GMT+02:00) South Africa Standard Time" => "Africa/Johannesburg",
280
- "(GMT+02:00) Troll Time" => "Antarctica/Troll",
281
- "(GMT+03:00) Arabian Standard Time - Baghdad" => "Asia/Baghdad",
282
- "(GMT+03:00) Arabian Standard Time - Qatar" => "Asia/Qatar",
283
- "(GMT+03:00) Arabian Standard Time - Riyadh" => "Asia/Riyadh",
284
- "(GMT+03:00) East Africa Time - Juba" => "Africa/Juba",
285
- "(GMT+03:00) East Africa Time - Nairobi" => "Africa/Nairobi",
286
- "(GMT+03:00) Eastern European Time - Amman" => "Asia/Amman",
287
- "(GMT+03:00) Eastern European Time - Athens" => "Europe/Athens",
288
- "(GMT+03:00) Eastern European Time - Beirut" => "Asia/Beirut",
289
- "(GMT+03:00) Eastern European Time - Bucharest" => "Europe/Bucharest",
290
- "(GMT+03:00) Eastern European Time - Chisinau" => "Europe/Chisinau",
291
- "(GMT+03:00) Eastern European Time - Damascus" => "Asia/Damascus",
292
- "(GMT+03:00) Eastern European Time - Gaza" => "Asia/Gaza",
293
- "(GMT+03:00) Eastern European Time - Hebron" => "Asia/Hebron",
294
- "(GMT+03:00) Eastern European Time - Helsinki" => "Europe/Helsinki",
295
- "(GMT+03:00) Eastern European Time - Kiev" => "Europe/Kiev",
296
- "(GMT+03:00) Eastern European Time - Nicosia" => "Asia/Nicosia",
297
- "(GMT+03:00) Eastern European Time - Riga" => "Europe/Riga",
298
- "(GMT+03:00) Eastern European Time - Sofia" => "Europe/Sofia",
299
- "(GMT+03:00) Eastern European Time - Tallinn" => "Europe/Tallinn",
300
- "(GMT+03:00) Eastern European Time - Uzhhorod" => "Europe/Uzhgorod",
301
- "(GMT+03:00) Eastern European Time - Vilnius" => "Europe/Vilnius",
302
- "(GMT+03:00) Eastern European Time - Zaporozhye" => "Europe/Zaporozhye",
303
- "(GMT+03:00) Famagusta Time" => "Asia/Famagusta",
304
- "(GMT+03:00) Israel Time" => "Asia/Jerusalem",
305
- "(GMT+03:00) Kirov Time" => "Europe/Kirov",
306
- "(GMT+03:00) Moscow Standard Time - Minsk" => "Europe/Minsk",
307
- "(GMT+03:00) Moscow Standard Time - Moscow" => "Europe/Moscow",
308
- "(GMT+03:00) Moscow Standard Time - Simferopol" => "Europe/Simferopol",
309
- "(GMT+03:00) Syowa Time" => "Antarctica/Syowa",
310
- "(GMT+03:00) Turkey Time" => "Europe/Istanbul",
311
- "(GMT+04:00) Armenia Standard Time" => "Asia/Yerevan",
312
- "(GMT+04:00) Astrakhan Time" => "Europe/Astrakhan",
313
- "(GMT+04:00) Azerbaijan Standard Time" => "Asia/Baku",
314
- "(GMT+04:00) Georgia Standard Time" => "Asia/Tbilisi",
315
- "(GMT+04:00) Gulf Standard Time" => "Asia/Dubai",
316
- "(GMT+04:00) Mauritius Standard Time" => "Indian/Mauritius",
317
- "(GMT+04:00) R�union Time" => "Indian/Reunion",
318
- "(GMT+04:00) Samara Standard Time" => "Europe/Samara",
319
- "(GMT+04:00) Saratov Time" => "Europe/Saratov",
320
- "(GMT+04:00) Seychelles Time" => "Indian/Mahe",
321
- "(GMT+04:00) Ulyanovsk Time" => "Europe/Ulyanovsk",
322
- "(GMT+04:00) Volgograd Standard Time" => "Europe/Volgograd",
323
- "(GMT+04:30) Afghanistan Time" => "Asia/Kabul",
324
- "(GMT+04:30) Iran Time" => "Asia/Tehran",
325
- "(GMT+05:00) French Southern & Antarctic Time" => "Indian/Kerguelen",
326
- "(GMT+05:00) Maldives Time" => "Indian/Maldives",
327
- "(GMT+05:00) Mawson Time" => "Antarctica/Mawson",
328
- "(GMT+05:00) Pakistan Standard Time" => "Asia/Karachi",
329
- "(GMT+05:00) Tajikistan Time" => "Asia/Dushanbe",
330
- "(GMT+05:00) Turkmenistan Standard Time" => "Asia/Ashgabat",
331
- "(GMT+05:00) Uzbekistan Standard Time - Samarkand" => "Asia/Samarkand",
332
- "(GMT+05:00) Uzbekistan Standard Time - Tashkent" => "Asia/Tashkent",
333
- "(GMT+05:00) West Kazakhstan Time - Aqtau" => "Asia/Aqtau",
334
- "(GMT+05:00) West Kazakhstan Time - Aqtobe" => "Asia/Aqtobe",
335
- "(GMT+05:00) West Kazakhstan Time - Atyrau" => "Asia/Atyrau",
336
- "(GMT+05:00) West Kazakhstan Time - Oral" => "Asia/Oral",
337
- "(GMT+05:00) West Kazakhstan Time - Qyzylorda" => "Asia/Qyzylorda",
338
- "(GMT+05:00) Yekaterinburg Standard Time" => "Asia/Yekaterinburg",
339
- "(GMT+05:30) Indian Standard Time - Colombo" => "Asia/Colombo",
340
- "(GMT+05:30) Indian Standard Time - Kolkata" => "Asia/Kolkata",
341
- "(GMT+05:45) Nepal Time" => "Asia/Kathmandu",
342
- "(GMT+06:00) Bangladesh Standard Time" => "Asia/Dhaka",
343
- "(GMT+06:00) Bhutan Time" => "Asia/Thimphu",
344
- "(GMT+06:00) East Kazakhstan Time - Almaty" => "Asia/Almaty",
345
- "(GMT+06:00) East Kazakhstan Time - Kostanay" => "Asia/Qostanay",
346
- "(GMT+06:00) Indian Ocean Time" => "Indian/Chagos",
347
- "(GMT+06:00) Kyrgyzstan Time" => "Asia/Bishkek",
348
- "(GMT+06:00) Omsk Standard Time" => "Asia/Omsk",
349
- "(GMT+06:00) Urumqi Time" => "Asia/Urumqi",
350
- "(GMT+06:00) Vostok Time" => "Antarctica/Vostok",
351
- "(GMT+06:30) Cocos Islands Time" => "Indian/Cocos",
352
- "(GMT+06:30) Myanmar Time" => "Asia/Yangon",
353
- "(GMT+07:00) Barnaul Time" => "Asia/Barnaul",
354
- "(GMT+07:00) Christmas Island Time" => "Indian/Christmas",
355
- "(GMT+07:00) Davis Time" => "Antarctica/Davis",
356
- "(GMT+07:00) Hovd Standard Time" => "Asia/Hovd",
357
- "(GMT+07:00) Indochina Time - Bangkok" => "Asia/Bangkok",
358
- "(GMT+07:00) Indochina Time - Ho Chi Minh City" => "Asia/Ho_Chi_Minh",
359
- "(GMT+07:00) Krasnoyarsk Standard Time - Krasnoyarsk" => "Asia/Krasnoyarsk",
360
- "(GMT+07:00) Krasnoyarsk Standard Time - Novokuznetsk" => "Asia/Novokuznetsk",
361
- "(GMT+07:00) Novosibirsk Standard Time" => "Asia/Novosibirsk",
362
- "(GMT+07:00) Tomsk Time" => "Asia/Tomsk",
363
- "(GMT+07:00) Western Indonesia Time - Jakarta" => "Asia/Jakarta",
364
- "(GMT+07:00) Western Indonesia Time - Pontianak" => "Asia/Pontianak",
365
- "(GMT+08:00) Australian Western Standard Time - Casey" => "Antarctica/Casey",
366
- "(GMT+08:00) Australian Western Standard Time - Perth" => "Australia/Perth",
367
- "(GMT+08:00) Brunei Darussalam Time" => "Asia/Brunei",
368
- "(GMT+08:00) Central Indonesia Time" => "Asia/Makassar",
369
- "(GMT+08:00) China Standard Time - Macao" => "Asia/Macau",
370
- "(GMT+08:00) China Standard Time - Shanghai" => "Asia/Shanghai",
371
- "(GMT+08:00) Hong Kong Standard Time" => "Asia/Hong_Kong",
372
- "(GMT+08:00) Irkutsk Standard Time" => "Asia/Irkutsk",
373
- "(GMT+08:00) Malaysia Time - Kuala Lumpur" => "Asia/Kuala_Lumpur",
374
- "(GMT+08:00) Malaysia Time - Kuching" => "Asia/Kuching",
375
- "(GMT+08:00) Philippine Standard Time" => "Asia/Manila",
376
- "(GMT+08:00) Singapore Standard Time" => "Asia/Singapore",
377
- "(GMT+08:00) Taipei Standard Time" => "Asia/Taipei",
378
- "(GMT+08:00) Ulaanbaatar Standard Time - Choibalsan" => "Asia/Choibalsan",
379
- "(GMT+08:00) Ulaanbaatar Standard Time - Ulaanbaatar" => "Asia/Ulaanbaatar",
380
- "(GMT+08:45) Australian Central Western Standard Time" => "Australia/Eucla",
381
- "(GMT+09:00) East Timor Time" => "Asia/Dili",
382
- "(GMT+09:00) Eastern Indonesia Time" => "Asia/Jayapura",
383
- "(GMT+09:00) Japan Standard Time" => "Asia/Tokyo",
384
- "(GMT+09:00) Korean Standard Time - Pyongyang" => "Asia/Pyongyang",
385
- "(GMT+09:00) Korean Standard Time - Seoul" => "Asia/Seoul",
386
- "(GMT+09:00) Palau Time" => "Pacific/Palau",
387
- "(GMT+09:00) Yakutsk Standard Time - Chita" => "Asia/Chita",
388
- "(GMT+09:00) Yakutsk Standard Time - Khandyga" => "Asia/Khandyga",
389
- "(GMT+09:00) Yakutsk Standard Time - Yakutsk" => "Asia/Yakutsk",
390
- "(GMT+09:30) Australian Central Standard Time" => "Australia/Darwin",
391
- "(GMT+09:30) Central Australia Time - Adelaide" => "Australia/Adelaide",
392
- "(GMT+09:30) Central Australia Time - Broken Hill" => "Australia/Broken_Hill",
393
- "(GMT+10:00) Australian Eastern Standard Time - Brisbane" => "Australia/Brisbane",
394
- "(GMT+10:00) Australian Eastern Standard Time - Lindeman" => "Australia/Lindeman",
395
- "(GMT+10:00) Chamorro Standard Time" => "Pacific/Guam",
396
- "(GMT+10:00) Chuuk Time" => "Pacific/Chuuk",
397
- "(GMT+10:00) Dumont-d�Urville Time" => "Antarctica/DumontDUrville",
398
- "(GMT+10:00) Eastern Australia Time - Currie" => "Australia/Currie",
399
- "(GMT+10:00) Eastern Australia Time - Hobart" => "Australia/Hobart",
400
- "(GMT+10:00) Eastern Australia Time - Melbourne" => "Australia/Melbourne",
401
- "(GMT+10:00) Eastern Australia Time - Sydney" => "Australia/Sydney",
402
- "(GMT+10:00) Papua New Guinea Time" => "Pacific/Port_Moresby",
403
- "(GMT+10:00) Vladivostok Standard Time - Ust-Nera" => "Asia/Ust-Nera",
404
- "(GMT+10:00) Vladivostok Standard Time - Vladivostok" => "Asia/Vladivostok",
405
- "(GMT+10:30) Lord Howe Time" => "Australia/Lord_Howe",
406
- "(GMT+11:00) Bougainville Time" => "Pacific/Bougainville",
407
- "(GMT+11:00) Kosrae Time" => "Pacific/Kosrae",
408
- "(GMT+11:00) Macquarie Island Time" => "Antarctica/Macquarie",
409
- "(GMT+11:00) Magadan Standard Time" => "Asia/Magadan",
410
- "(GMT+11:00) New Caledonia Standard Time" => "Pacific/Noumea",
411
- "(GMT+11:00) Norfolk Island Time" => "Pacific/Norfolk",
412
- "(GMT+11:00) Ponape Time" => "Pacific/Pohnpei",
413
- "(GMT+11:00) Sakhalin Standard Time" => "Asia/Sakhalin",
414
- "(GMT+11:00) Solomon Islands Time" => "Pacific/Guadalcanal",
415
- "(GMT+11:00) Srednekolymsk Time" => "Asia/Srednekolymsk",
416
- "(GMT+11:00) Vanuatu Standard Time" => "Pacific/Efate",
417
- "(GMT+12:00) Anadyr Standard Time" => "Asia/Anadyr",
418
- "(GMT+12:00) Fiji Time" => "Pacific/Fiji",
419
- "(GMT+12:00) Gilbert Islands Time" => "Pacific/Tarawa",
420
- "(GMT+12:00) Marshall Islands Time - Kwajalein" => "Pacific/Kwajalein",
421
- "(GMT+12:00) Marshall Islands Time - Majuro" => "Pacific/Majuro",
422
- "(GMT+12:00) Nauru Time" => "Pacific/Nauru",
423
- "(GMT+12:00) New Zealand Time" => "Pacific/Auckland",
424
- "(GMT+12:00) Petropavlovsk-Kamchatski Standard Time" => "Asia/Kamchatka",
425
- "(GMT+12:00) Tuvalu Time" => "Pacific/Funafuti",
426
- "(GMT+12:00) Wake Island Time" => "Pacific/Wake",
427
- "(GMT+12:00) Wallis & Futuna Time" => "Pacific/Wallis",
428
- "(GMT+12:45) Chatham Time" => "Pacific/Chatham",
429
- "(GMT+13:00) Apia Time" => "Pacific/Apia",
430
- "(GMT+13:00) Phoenix Islands Time" => "Pacific/Enderbury",
431
- "(GMT+13:00) Tokelau Time" => "Pacific/Fakaofo",
432
- "(GMT+13:00) Tonga Standard Time" => "Pacific/Tongatapu",
433
- "(GMT+14:00) Line Islands Time" => "Pacific/Kiritimati"
434
- );
435
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
miniorange_2_factor_settings.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: miniOrange 2 Factor Authentication
4
  * Plugin URI: https://miniorange.com
5
  * Description: This TFA plugin provides various two-factor authentication methods as an additional layer of security after the default wordpress login. We Support Google/Authy/LastPass Authenticator, QR Code, Push Notification, Soft Token and Security Questions(KBA) for 3 User in the free version of the plugin.
6
- * Version: 5.4.33
7
  * Author: miniOrange
8
  * Author URI: https://miniorange.com
9
  * Text Domain: miniorange-2-factor-authentication
@@ -14,9 +14,8 @@
14
  require dirname(__FILE__).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'email-IPaddress.php';
15
 
16
  define( 'MO_HOST_NAME', 'https://login.xecurify.com' );
17
-
18
- define( 'MO2F_VERSION', '5.4.33' );
19
- define('MO2F_PLUGIN_URL', (plugin_dir_url(__FILE__)));
20
  define( 'MO2F_TEST_MODE', false );
21
  define( 'MO2F_IS_ONPREM', get_option('is_onprem'));
22
 
@@ -37,7 +36,7 @@
37
  add_action( 'admin_init' , array( $this, 'miniorange_reset_save_settings' ) );
38
  add_filter('manage_users_columns' , array( $this, 'mo2f_mapped_email_column' ) );
39
  add_action('manage_users_custom_column' , array( $this, 'mo2f_mapped_email_column_content'), 10, 3 );
40
-
41
  $actions = add_filter('user_row_actions' , array( $this, 'miniorange_reset_users' ),10 , 2 );
42
  add_action( 'admin_footer' , array( $this, 'feedback_request' ) );
43
  add_action('admin_notices',array( $this, 'mo_wpns_malware_notices' ) );
@@ -51,6 +50,7 @@
51
  $customShort = new TwoFACustomRegFormShortcode();
52
  add_action('admin_init',array( $this, 'mo2f_enable_register_shortcode' ));
53
  add_action('admin_init',array( $customShort, 'mo_enqueue_shortcode' ));
 
54
  add_shortcode('mo2f_enable_register',array($this,'mo2f_enable_register_shortcode'));
55
  if(defined("DIGIMEMBER_DIR"))
56
  {
@@ -59,6 +59,44 @@
59
 
60
  }
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  public function mo2f_enable_register_shortcode()
63
  {
64
  $submitSelector = get_site_option('mo2f_custom_submit_selector');
@@ -122,7 +160,7 @@
122
  wp_enqueue_style( 'wp-pointer' );
123
  wp_enqueue_script( 'wp-pointer' );
124
  wp_enqueue_script( 'utils' );
125
- wp_enqueue_style( 'mo_wpns_admin_plugins_page_style', plugins_url( '/includes/css/style_settings.css?ver=4.8.60', __FILE__ ) );
126
 
127
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_form.php';;
128
 
@@ -199,24 +237,19 @@
199
 
200
  if( $is_2fa_enabled){
201
  $menu_slug = 'mo_2fa_two_fa';
 
202
  }
203
  else{
204
  $menu_slug = 'mo_2fa_dashboard';
205
  }
206
- add_menu_page ( 'miniOrange 2-Factor' , 'miniOrange 2-Factor' , 'administrator', $menu_slug , array( $this, 'mo_wpns'), plugin_dir_url(__FILE__) . 'includes/images/miniorange_icon.png' );
207
  if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
208
  {
209
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Dashboard' ,'administrator','mo_2fa_dashboard' , array( $this, 'mo_wpns'),1);
210
  }
211
-
212
- if(MO2F_IS_ONPREM)
213
- {
214
- if( $is_2fa_enabled){
215
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Two Factor' ,'read', 'mo_2fa_two_fa' , array( $this, 'mo_wpns'),1);
216
- }
217
- }
218
- else{
219
- add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Two Factor' ,'administrator','mo_2fa_two_fa' , array( $this, 'mo_wpns'),2);
220
  }
221
  if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
222
  {
@@ -231,12 +264,16 @@
231
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Account' ,'administrator','mo_2fa_account' , array( $this, 'mo_wpns'),11);
232
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Addons' ,'administrator','mo_2fa_addons' , array( $this, 'mo_wpns'),10);
233
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Upgrade' ,'administrator','mo_2fa_upgrade' , array( $this, 'mo_wpns'),12);
234
- add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Request for Demo' ,'administrator','mo_2fa_request_demo' , array( $this, 'mo_wpns'),13);
235
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Notifications' ,'administrator','mo_2fa_notifications' , array( $this, 'mo_wpns'),8);
236
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Offers' ,'administrator','mo_2fa_request_offer' , array( $this, 'mo_wpns'),14);
237
  $mo2fa_hook_page = add_users_page ('Reset 2nd Factor', null , 'manage_options', 'reset', array( $this, 'mo_reset_2fa_for_users_by_admin' ),66);
238
-
239
-
 
 
 
 
 
240
  }
241
 
242
 
@@ -277,12 +314,15 @@
277
  add_action( 'mo_auth_show_success_message', array($this, 'mo_auth_show_success_message'), 10, 1 );
278
  add_action( 'mo_auth_show_error_message', array($this, 'mo_auth_show_error_message'), 10, 1 );
279
  add_option( 'mo2f_onprem_admin' , $userid );
 
280
  add_option( 'mo_wpns_last_scan_time', time());
281
  update_site_option('mo2f_mail_notify_new_release','on');
282
  add_site_option('mo2f_mail_notify','on');
283
  if(get_site_option('mo2f_activated_time') == null){
284
  add_site_option('mo2f_activated_time', time());
285
  }
 
 
286
  update_site_option('mo2f_plugin_redirect', true);
287
  if (!wp_next_scheduled( 'mo2f_realtime_ip_block_free_hook')) {
288
  wp_schedule_event( time(), 'mo2f_realtime_ipblock_free', 'mo2f_realtime_ip_block_free_hook' );
@@ -290,12 +330,19 @@
290
  if(is_multisite()){
291
  add_site_option('mo2fa_superadmin',1);
292
  }
 
293
  }
294
 
295
  function mo_wpns_deactivate()
296
  {
297
  update_option('mo2f_activate_plugin', 1);
298
 
 
 
 
 
 
 
299
  $two_fa_settings = new Miniorange_Authentication();
300
  $two_fa_settings->mo_auth_deactivate();
301
  $timestamp = wp_next_scheduled( 'mo2f_realtime_ip_block_free_hook' );
@@ -312,7 +359,6 @@
312
  wp_enqueue_style( 'mo_wpns_admin_settings_datatable_style' , plugins_url('includes/css/jquery.dataTables.min.css', __FILE__));
313
  wp_enqueue_style( 'mo_wpns_button_settings_style' , plugins_url('includes/css/button_styles.css',__FILE__));
314
  wp_enqueue_style( 'mo_wpns_popup_settings_style' , plugins_url('includes/css/popup.css',__FILE__));
315
- wp_enqueue_style( 'mo_2fa_time_settings_style' , plugins_url('includes/css/datetime-style-settings.min.css', __FILE__));
316
  $file = plugin_dir_path( __FILE__ ) .'controllers'.DIRECTORY_SEPARATOR. 'pointers.php';
317
 
318
  $tour_started=get_option('mo2f_tour_started',0);
@@ -351,9 +397,7 @@
351
  wp_enqueue_script( 'mo_wpns_min_qrcode_script', plugins_url( "/includes/jquery-qrcode/jquery-qrcode.min.js", __FILE__ ) );
352
  wp_enqueue_script('jquery-ui-core');
353
  wp_enqueue_script('jquery-ui-autocomplete');
354
- wp_enqueue_script('jquery-ui-datepicker');
355
  wp_enqueue_script('mo_2fa_select2_script', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js');
356
- wp_enqueue_script('mo_2fa_timepicker_script', 'https://cdnjs.cloudflare.com/ajax/libs/timepicker/1.3.5/jquery.timepicker.min.js');
357
  }
358
  }
359
 
@@ -476,9 +520,9 @@
476
  require('handler/security_features.php');
477
  require('handler/feedback_form.php');
478
  require('handler/recaptcha.php');
479
- require('handler/login.php');
480
  require('handler/twofa/setup_twofa.php');
481
  require('handler/twofa/two_fa_settings.php');
 
482
  require('handler/twofa/two_fa_utility.php');
483
  require('handler/twofa/two_fa_constants.php');
484
  require('handler/registration.php');
@@ -496,7 +540,7 @@
496
  require('controllers/malware_scanner/malware_scan_ajax.php');
497
  require('controllers/duo_authenticator/duo_authenticator_ajax.php');
498
  require('controllers/backup/backup_ajax.php');
499
- require('controllers/tour/tour_ajax.php');
500
  require('controllers/twofa/two_factor_ajax.php');
501
  require('controllers/dashboard_ajax.php');
502
  require('handler/malware_scanner/malware_scanner_cron.php');
@@ -532,26 +576,29 @@
532
  function mo_reset_2fa_for_users_by_admin(){
533
  $nonce = wp_create_nonce('ResetTwoFnonce');
534
  if(isset($_GET['action']) && $_GET['action']== 'reset_edit'){
535
- $user_id = $_GET['user'];
536
- $user_info = get_userdata($user_id);
537
- ?>
538
- <form method="post" name="reset2fa" id="reset2fa" action="<?php echo esc_url('users.php'); ?>">
539
-
540
- <div class="wrap">
541
- <h1>Reset 2nd Factor</h1>
 
 
542
 
543
  <p>You have specified this user for reset:</p>
544
 
545
  <ul>
546
  <li>ID #<?php echo $user_info->ID; ?>: <?php echo $user_info->user_login; ?></li>
547
  </ul>
548
- <input type="hidden" name="userid" value="<?php echo $user_id; ?>">
549
  <input type="hidden" name="miniorange_reset_2fa_option" value="mo_reset_2fa">
550
  <input type="hidden" name="nonce" value="<?php echo $nonce;?>">
551
  <p class="submit"><input type="submit" name="submit" id="submit" class="button button-primary" value="Confirm Reset" ></p>
552
  </div>
553
  </form>
554
  <?php
 
555
  }
556
  }
557
 
@@ -579,13 +626,21 @@
579
  }
580
  }
581
  }
 
 
582
  }
583
 
584
  function mo2f_mapped_email_column_content($value, $column_name, $user_id) {
585
  global $Mo2fdbQueries;
586
  $currentMethod = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user_id );
587
- if(!$currentMethod)
588
- $currentMethod = 'Not Registered for 2FA';
 
 
 
 
 
 
589
  if ( 'current_method' == $column_name )
590
  return $currentMethod;
591
  return $value;
@@ -620,7 +675,7 @@
620
  {
621
 
622
 
623
- $subject = 'Announce it via email on the New Release of 2FA Plugin';
624
  $messages = mail_tem();
625
  $headers = array('Content-Type: text/html; charset=UTF-8');
626
  $email = get_option('admin_email');
3
  * Plugin Name: miniOrange 2 Factor Authentication
4
  * Plugin URI: https://miniorange.com
5
  * Description: This TFA plugin provides various two-factor authentication methods as an additional layer of security after the default wordpress login. We Support Google/Authy/LastPass Authenticator, QR Code, Push Notification, Soft Token and Security Questions(KBA) for 3 User in the free version of the plugin.
6
+ * Version: 5.5.1
7
  * Author: miniOrange
8
  * Author URI: https://miniorange.com
9
  * Text Domain: miniorange-2-factor-authentication
14
  require dirname(__FILE__).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'email-IPaddress.php';
15
 
16
  define( 'MO_HOST_NAME', 'https://login.xecurify.com' );
17
+ define( 'MO2F_VERSION', '5.5.1' );
18
+ define( 'MO2F_PLUGIN_URL', (plugin_dir_url(__FILE__)));
 
19
  define( 'MO2F_TEST_MODE', false );
20
  define( 'MO2F_IS_ONPREM', get_option('is_onprem'));
21
 
36
  add_action( 'admin_init' , array( $this, 'miniorange_reset_save_settings' ) );
37
  add_filter('manage_users_columns' , array( $this, 'mo2f_mapped_email_column' ) );
38
  add_action('manage_users_custom_column' , array( $this, 'mo2f_mapped_email_column_content'), 10, 3 );
39
+ add_action('admin_notices' , array( $this, 'mo2f_notices' ) );
40
  $actions = add_filter('user_row_actions' , array( $this, 'miniorange_reset_users' ),10 , 2 );
41
  add_action( 'admin_footer' , array( $this, 'feedback_request' ) );
42
  add_action('admin_notices',array( $this, 'mo_wpns_malware_notices' ) );
50
  $customShort = new TwoFACustomRegFormShortcode();
51
  add_action('admin_init',array( $this, 'mo2f_enable_register_shortcode' ));
52
  add_action('admin_init',array( $customShort, 'mo_enqueue_shortcode' ));
53
+ add_action( 'elementor/init', array($this, 'mo2fa_login_elementor_note'));
54
  add_shortcode('mo2f_enable_register',array($this,'mo2f_enable_register_shortcode'));
55
  if(defined("DIGIMEMBER_DIR"))
56
  {
59
 
60
  }
61
 
62
+ function mo2f_notices(){
63
+
64
+ global $Mo2fdbQueries, $mo2f_db_queries;
65
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', wp_get_current_user()->ID ) == 'SUCCESS' ? true : false;
66
+ if(strpos($_SERVER['REQUEST_URI'], 'mo_2fa_upgrade'))
67
+ if(!get_site_option('mo2f_trial_query_sent') && !get_site_option('mo2f_donot_show_trial_notice_always') && current_user_can('administrator')){
68
+
69
+ if(!$is_customer_registered)
70
+ echo MoWpnsMessages::showMessage('FREE_TRIAL_MESSAGE_ACCOUNT_PAGE');
71
+ else
72
+ echo MoWpnsMessages::showMessage('FREE_TRIAL_MESSAGE_TRIAL_PAGE');
73
+ }
74
+
75
+ }
76
+ function mo2f_get_dismiss_days($option_name){
77
+ $one_day = 60*60*24;
78
+ $days= (time()-get_site_option($option_name))/$one_day;
79
+ return floor($days);
80
+ }
81
+
82
+ function mo2fa_login_elementor_note()
83
+ {
84
+ global $mainDir;
85
+
86
+ if(!is_user_logged_in())
87
+ {
88
+ wp_enqueue_script( 'jquery' );
89
+ wp_enqueue_script( 'mo2fa_elementor_script', $mainDir. 'includes/js/mo2fa_elementor.js' );
90
+
91
+ wp_localize_script( 'mo2fa_elementor_script', 'my_ajax_object',
92
+ array( 'ajax_url' => get_site_url() .'/login/' ,
93
+ 'nonce' => wp_create_nonce( 'miniorange-2-factor-login-nonce' ),
94
+ 'mo2f_login_option' => MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option'),
95
+ 'mo2f_enable_login_with_2nd_factor' => get_option( 'mo2f_enable_login_with_2nd_factor' )) );
96
+
97
+ }
98
+ }
99
+
100
  public function mo2f_enable_register_shortcode()
101
  {
102
  $submitSelector = get_site_option('mo2f_custom_submit_selector');
160
  wp_enqueue_style( 'wp-pointer' );
161
  wp_enqueue_script( 'wp-pointer' );
162
  wp_enqueue_script( 'utils' );
163
+ wp_enqueue_style( 'mo_wpns_admin_plugins_page_style', plugins_url( '/includes/css/style_settings.css?ver=5.5.1', __FILE__ ) );
164
 
165
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_form.php';;
166
 
237
 
238
  if( $is_2fa_enabled){
239
  $menu_slug = 'mo_2fa_two_fa';
240
+ add_menu_page ( 'miniOrange 2-Factor' , 'miniOrange 2-Factor' , 'read', $menu_slug , array( $this, 'mo_wpns'), plugin_dir_url(__FILE__) . 'includes/images/miniorange_icon.png' );
241
  }
242
  else{
243
  $menu_slug = 'mo_2fa_dashboard';
244
  }
245
+
246
  if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
247
  {
248
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Dashboard' ,'administrator','mo_2fa_dashboard' , array( $this, 'mo_wpns'),1);
249
  }
250
+
251
+ if( $is_2fa_enabled){
 
 
252
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Two Factor' ,'read', 'mo_2fa_two_fa' , array( $this, 'mo_wpns'),1);
 
 
 
 
253
  }
254
  if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
255
  {
264
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Account' ,'administrator','mo_2fa_account' , array( $this, 'mo_wpns'),11);
265
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Addons' ,'administrator','mo_2fa_addons' , array( $this, 'mo_wpns'),10);
266
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Upgrade' ,'administrator','mo_2fa_upgrade' , array( $this, 'mo_wpns'),12);
 
267
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Notifications' ,'administrator','mo_2fa_notifications' , array( $this, 'mo_wpns'),8);
268
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Offers' ,'administrator','mo_2fa_request_offer' , array( $this, 'mo_wpns'),14);
269
  $mo2fa_hook_page = add_users_page ('Reset 2nd Factor', null , 'manage_options', 'reset', array( $this, 'mo_reset_2fa_for_users_by_admin' ),66);
270
+
271
+ global $Mo2fdbQueries;
272
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', wp_get_current_user()->ID ) == 'SUCCESS' ? true : false;
273
+ if(!$is_customer_registered)
274
+ add_submenu_page($menu_slug, 'miniOrange 2-Factor', 'Request Trial' ,'administrator','mo_2fa_account', array( $this, 'mo_wpns'), 20);
275
+ else
276
+ add_submenu_page($menu_slug, 'miniOrange 2-Factor', 'Request Trial' ,'administrator','mo2f_trial', array( $this, 'mo_wpns'), 20);
277
  }
278
 
279
 
314
  add_action( 'mo_auth_show_success_message', array($this, 'mo_auth_show_success_message'), 10, 1 );
315
  add_action( 'mo_auth_show_error_message', array($this, 'mo_auth_show_error_message'), 10, 1 );
316
  add_option( 'mo2f_onprem_admin' , $userid );
317
+ add_option('mo2f_nonce_enable_configured_methods' ,true);
318
  add_option( 'mo_wpns_last_scan_time', time());
319
  update_site_option('mo2f_mail_notify_new_release','on');
320
  add_site_option('mo2f_mail_notify','on');
321
  if(get_site_option('mo2f_activated_time') == null){
322
  add_site_option('mo2f_activated_time', time());
323
  }
324
+ $NoOf2faUsers = $Mo2fdbQueries->get_no_of_2fa_users();
325
+ if(!$NoOf2faUsers)
326
  update_site_option('mo2f_plugin_redirect', true);
327
  if (!wp_next_scheduled( 'mo2f_realtime_ip_block_free_hook')) {
328
  wp_schedule_event( time(), 'mo2f_realtime_ipblock_free', 'mo2f_realtime_ip_block_free_hook' );
330
  if(is_multisite()){
331
  add_site_option('mo2fa_superadmin',1);
332
  }
333
+ MO2f_Utility::mo2f_debug_file('Plugin activated');
334
  }
335
 
336
  function mo_wpns_deactivate()
337
  {
338
  update_option('mo2f_activate_plugin', 1);
339
 
340
+ if(!MO2F_IS_ONPREM)
341
+ {
342
+ delete_option('mo2f_customerKey');
343
+ delete_option('mo2f_api_key');
344
+ delete_option('mo2f_customer_token');
345
+ }
346
  $two_fa_settings = new Miniorange_Authentication();
347
  $two_fa_settings->mo_auth_deactivate();
348
  $timestamp = wp_next_scheduled( 'mo2f_realtime_ip_block_free_hook' );
359
  wp_enqueue_style( 'mo_wpns_admin_settings_datatable_style' , plugins_url('includes/css/jquery.dataTables.min.css', __FILE__));
360
  wp_enqueue_style( 'mo_wpns_button_settings_style' , plugins_url('includes/css/button_styles.css',__FILE__));
361
  wp_enqueue_style( 'mo_wpns_popup_settings_style' , plugins_url('includes/css/popup.css',__FILE__));
 
362
  $file = plugin_dir_path( __FILE__ ) .'controllers'.DIRECTORY_SEPARATOR. 'pointers.php';
363
 
364
  $tour_started=get_option('mo2f_tour_started',0);
397
  wp_enqueue_script( 'mo_wpns_min_qrcode_script', plugins_url( "/includes/jquery-qrcode/jquery-qrcode.min.js", __FILE__ ) );
398
  wp_enqueue_script('jquery-ui-core');
399
  wp_enqueue_script('jquery-ui-autocomplete');
 
400
  wp_enqueue_script('mo_2fa_select2_script', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js');
 
401
  }
402
  }
403
 
520
  require('handler/security_features.php');
521
  require('handler/feedback_form.php');
522
  require('handler/recaptcha.php');
 
523
  require('handler/twofa/setup_twofa.php');
524
  require('handler/twofa/two_fa_settings.php');
525
+ require('handler/login.php');
526
  require('handler/twofa/two_fa_utility.php');
527
  require('handler/twofa/two_fa_constants.php');
528
  require('handler/registration.php');
540
  require('controllers/malware_scanner/malware_scan_ajax.php');
541
  require('controllers/duo_authenticator/duo_authenticator_ajax.php');
542
  require('controllers/backup/backup_ajax.php');
543
+
544
  require('controllers/twofa/two_factor_ajax.php');
545
  require('controllers/dashboard_ajax.php');
546
  require('handler/malware_scanner/malware_scanner_cron.php');
576
  function mo_reset_2fa_for_users_by_admin(){
577
  $nonce = wp_create_nonce('ResetTwoFnonce');
578
  if(isset($_GET['action']) && $_GET['action']== 'reset_edit'){
579
+ $user_id = sanitize_text_field($_GET['user']);
580
+ if(is_numeric($user_id))
581
+ {
582
+ $user_info = get_userdata($user_id);
583
+ ?>
584
+ <form method="post" name="reset2fa" id="reset2fa" action="<?php echo esc_url('users.php'); ?>">
585
+
586
+ <div class="wrap">
587
+ <h1>Reset 2nd Factor</h1>
588
 
589
  <p>You have specified this user for reset:</p>
590
 
591
  <ul>
592
  <li>ID #<?php echo $user_info->ID; ?>: <?php echo $user_info->user_login; ?></li>
593
  </ul>
594
+ <input type="hidden" name="userid" value="<?php echo esc_attr($user_id); ?>">
595
  <input type="hidden" name="miniorange_reset_2fa_option" value="mo_reset_2fa">
596
  <input type="hidden" name="nonce" value="<?php echo $nonce;?>">
597
  <p class="submit"><input type="submit" name="submit" id="submit" class="button button-primary" value="Confirm Reset" ></p>
598
  </div>
599
  </form>
600
  <?php
601
+ }
602
  }
603
  }
604
 
626
  }
627
  }
628
  }
629
+ if(isset($_POST['mo2f_dismiss_trial']) && sanitize_text_field($_POST['mo2f_dismiss_trial'] == 'mo2f_dismiss_trial'))
630
+ update_site_option('mo2f_donot_show_trial_notice_always', 1);
631
  }
632
 
633
  function mo2f_mapped_email_column_content($value, $column_name, $user_id) {
634
  global $Mo2fdbQueries;
635
  $currentMethod = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user_id );
636
+ if(!$currentMethod){
637
+ $check_if_skipped = $Mo2fdbQueries->get_user_detail('mo2f_2factor_enable_2fa_byusers', $user_id);
638
+ if($check_if_skipped === '0'){
639
+ $currentMethod = 'Two-Factor skipped by user';
640
+ }else{
641
+ $currentMethod = 'Not Registered for 2FA';
642
+ }
643
+ }
644
  if ( 'current_method' == $column_name )
645
  return $currentMethod;
646
  return $value;
675
  {
676
 
677
 
678
+ $subject = 'miniOrange 2FA V'. MO2F_VERSION.' | What\'s New?';
679
  $messages = mail_tem();
680
  $headers = array('Content-Type: text/html; charset=UTF-8');
681
  $email = get_option('admin_email');
readme.txt CHANGED
@@ -1,463 +1,385 @@
1
- === miniOrange's Google Authenticator - WordPress Two Factor Authentication (2FA , MFA, OTP SMS and Email) | Passwordless login ===
2
 
3
- Contributors: twofactor, cyberlord92, hsn97
4
- Tags: google authenticator, two factor authentication, 2FA, OTP , two-factor, 2-factor authentication, multi factor authentication ,two-step verification, wp 2fa, two factor, mobile verification, TFA, MFA, 2 factor authentication, Multi factor authentication, Remember Device, WordPress otp, Clef,SMS, email, signup security, two factor auth, Mobile Authentication, strong authentication, 2 step authentication, Multifactor authentication, passwordless login, one time passcode, soft token Authentication, QR Code Authentication, email verification, KBA, Security Questions, login OTP, login with SMS, mobile login, phone login, OTP login, knowledge based authentication, authy, authy two factor , yubico, security, user security, ​Twilio WordPress, SMS gateway, Solutions Infini, FIDO, FIDO2, FIDO 2, Webauthn, Usernameless login ,Clickatell, BulkSMS, MSG91, Nexmo, SMS Country, message, woocommerce, website security, login security, multi factor, wordfence, IP Blocking, IP Whitelisting, login Audits, woocommerce, SMS login, passwordless login, auth, login with OTP WordPress, OTP Over SMS and Email, two-step authentication, login without password, passwordless authentication, secure login, temporary login, temporary access, one time passcode, email verification, security, website security, login security, multi-factor authentication, woocommerce, smartphone, WordPress otp, register with OTP, user OTP verification, SMS OTP, OTP Email, registration with OTP verification, registration verification, smartphone authentication, Login with fingerprint, faceID, touchID, session restriction, device restriction, password free authentication,
5
  Donate link: https://miniorange.com/
6
  Requires at least: 3.0.1
7
- Tested up to: 5.7.1
8
  Requires PHP: 5.3.0
9
- Stable tag: 5.4.33
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
 
13
- **Google Authenticator**, Two Factor Authentication (2 Factor)/ Multi factor authentication, Two step verification, OTP verificaion - SMS and Email , mobile verification, Apps like Microsoft, Duo, LastPass & more on login and Registration for all forms. Google Authenticator also Supports QR Code, Push Notification and Security Questions along with the Google Authenticator itself. Google authenticator plugin can also be used for multi factor authentication.
14
 
15
  == Description ==
16
 
17
- **Google Authenticator** - Two Factor Authentication (2FA) / Multi factor authentication plugin provides a completely Secure login to your WordPress website. Google Authenticator - multi Factor Authentication (2FA) is a FREE, Simple & very easy to setup plugin. Google Authenticator ( 2FA ) provides two factor authentication (2FA, MFA) whenever login to your WordPress website ensuring no unauthorised access to your website. Google Authenticator - multi factor authentication can be configured for any TOTP based Authentication Method for providing addtional layer of security of Two Factor Authentication(multi factor authentication). miniOrange also supports OTP Over SMS and OTP Over Email for login and registration.
18
 
19
- You can checkout the following video to configure the plugin with your Identity Provider:
20
 
21
  [youtube https://www.youtube.com/watch?v=BS6tY-Goa1Q]
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
- = User Identity Verification or **OTP** Verification (Two Factor Authentication) =
25
- Login and Registration: Verify users on login and Registration with different authentication methods like OTP over SMS, OTP Over Email, Google Authenticator, SMS Verification, Email, Authy Authenticator, Duo Authenticator, Microsoft Authenticator, TOTP Based Authenticator, Security Questions and many others. Easy OTP Verification with SMS Verification and Email Verification. We provide complete two factor authentication security.
26
-
27
- = **Google Authenticator** and other 2 Factor ( 2FA, Two Factor Authentication ) sync on multiple websites with the same OTP =
28
- You would not need to configure **Google Authenticator** and other Two Factor Authentication ( 2FA ) methods from second site onword. Just login with miniOrange account and your 2FA will automatically get set. This is available for Google Authenticator, Duo Authenticator, Microsoft Authenticator, Securty Questions, LastPass, Authy, miniOrange methods, OTP over SMS, OTP over Email. It is supported only if you are using our cloud services of 2 Factor.
29
-
30
- == Plugin Integrations and Support for all methods of two factor authentication ( 2fa ) like **Google Authenticator** ==
31
- * [Woocommerce](https://wordpress.org/plugins/woocommerce/) (Login Woocommerce using Google Authenticator - Multi Factor Authentication (2FA))
32
- * [BuddyPress form](https://wordpress.org/plugins/buddypress/) (Login BuddyPress using Google Authenticator - Multi Factor Authentication (2FA))
33
- * [bbpress form](https://wordpress.org/plugins/bbpress/) (Login bbpress using Google Authenticator - Two Factor Authentication (2FA))
34
- * [Digimember](https://digimember.com/) (Login Digimember using Google Authenticator - Two Factor Authentication (2FA))
35
- * [Paid Memberships Pro](https://wordpress.org/plugins/paid-memberships-pro/) (Login Paid Memberships Pro using Google Authenticator - Two Factor Authentication (2FA))
36
- * [Memberpress Pro](https://memberpress.com/) (Login Memberpress Pro using Google Authenticator - Two Factor Authentication (2FA))
37
- * [Ultimate Member – User Profile & Membership Form](https://wordpress.org/plugins/ultimate-member/) (Login Ultimate Member – User Profile & Membership using Google Authenticator - Two Factor Authentication (2FA))
38
- * [LearnDash](https://www.learndash.com/) (Login LearnDash using Google Authenticator - Two Factor Authentication (2FA))
39
- * [LearnPress](https://wordpress.org/plugins/learnpress/) (Login LearnPress using Google Authenticator - Two Factor Authentication (2FA))
40
- * [LifterLMS](https://wordpress.org/plugins/lifterlms/) (Login LifterLMS using Google Authenticator - Two Factor Authentication (2FA))
41
- * [Dokan](https://wordpress.org/plugins/dokan-lite/) (Login Dokan using Google Authenticator - Multi Factor Authentication (2FA))
42
- * And many more
43
-
44
- == WordPress login and registration forms support and integration for all methods of two factor authentication ( 2fa ) like **Google Authenticator** ==
45
- * [Restrict Content Pro Form](https://wordpress.org/plugins/restrict-content/) (Register and Login Restrict Content Pro using Google Authenticator - Two Factor Authentication (2FA))
46
- * [My theme Login Form](https://wordpress.org/plugins/theme-my-login/) (Login My theme Login using Google Authenticator - Two Factor Authentication (2FA))
47
- * [Login with ajax Form](https://wordpress.org/plugins/login-with-ajax/) (2fa (Two factor authentication | Google authenticator ) for Login with ajax login form)
48
- * [Elementor Login Form](https://wordpress.org/plugins/elementor/) (2fa (Two factor authentication | Google authenticator ) for Elementor login form)
49
- * [WooCommerce Login Form](https://wordpress.org/plugins/woocommerce/) (2fa (Two factor authentication | Google authenticator ) for WooCommerce login form)
50
- * [Paid memb
1
+ === miniOrange's Google Authenticator - WordPress Two Factor Authentication (2FA , Two Factor, OTP SMS and Email) | Passwordless login ===
2
 
3
+ Contributors: twofactor, twofactorauthentication, hsn97,cyberlord92
4
+ Tags: google authenticator,two factor,two factor authentication, 2FA, OTP , wp 2fa, 2-factor authentication, multi factor authentication , MFA ,two step verification, TFA, mobile verification, MFA, Remember Device, OTP Over Telegram, Mobile Authentication, 2 step authentication, passwordless login, QR Code Authentication, email verification, KBA, Security Questions, login with SMS, Authy, Authy two factor , FIDO, FIDO2, Webauthn, multi factor, wordfence, IP Blocking, IP Whitelisting, SMS login, OTP Over SMS and Email, login without password, Mobile verification, password free authentication, session restriction.
5
  Donate link: https://miniorange.com/
6
  Requires at least: 3.0.1
7
+ Tested up to: 5.9.2
8
  Requires PHP: 5.3.0
9
+ Stable tag: 5.5.1
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
 
13
+ Google Authenticator-multi Factor(WP 2FA/OTP) - Supports TOTP-based methods like Duo/Google Authenticator along with OTP Over SMS/Email & more.
14
 
15
  == Description ==
16
 
17
+ **Google Authenticator - Two Factor (WP 2FA/OTP)** - Provides *secure login* to WordPress. This plugin can be configured for any **TOTP-based** methods like Duo/Microsoft/Google Authenticator. It supports OTP-based 2fa methods.
18
 
19
+ You can check out following video to configure google authenticator as a two factor:
20
 
21
  [youtube https://www.youtube.com/watch?v=BS6tY-Goa1Q]
22
 
23
+ = Trial for Google authenticator Premium and Enterprise plugin =
24
+ We do provide 7 days trial of our Google Authenticator Premium plugins. You can test all Premium features including 2fa methods such as google authenticator, OTP Over SMS/Email.
25
+
26
+ = [Google Authenticator - Two step verification/ 2 Factor Authentication/ WP 2FA] FREE Plugin Features =
27
+ * Simplified & easy user interface to set up **Google Authenticator** and other Two-Factor Authentication ( WP 2FA/TFA/OTP ) methods.
28
+ * **3 Users** forever FREE!
29
+ * QR Code authentication, Push Notification, Soft Token and Security Questions(KBA) are supported in the plugin for multi factor authentication(WP 2FA/TFA).
30
+ * Includes Language Translation Support
31
+ * **[User Profile 2fa](https://plugins.miniorange.com/how-to-set-up-2-factor-from-wordpress-user-profile-section):** Administrators can set up Two Factor (TFA)of users via WordPress users section
32
+ * **Multi Factor Authentication(MFA):** This feature can be used to invoke any two factor method on login among multiple methods which were configured. You can configure multiple 2fa methods that can be used as a **backup 2fa method**
33
+ * **Two-Factor Authentication** ( TFA/2FA ) for Ajax login forms like User Pro, login with ajax, Theme my login, etc with all authentication methods.
34
+ * **Passwordless login** and login with phone number
35
+ * **[Prevent account sharing](prevent account sharing between users by two factor authentication)** Google Authenticator(WP 2FA) restricts users from sharing WordPress login credentials which help to secure WordPress Websites. The Google authenticator plugin also adds a session control feature that limits user sessions based on WordPress User activities.
36
+ * This plugin Supports standard TOTP
37
+ * Two-Factor Authentication (WP 2FA/TFA) allows authentication on the login page itself for Google Authenticator & miniOrange Soft Token
38
+ * **[Multiple Login Options](https://docs.miniorange.com/documentation/login-username-2nd-factor-2):** Username + password + two-factor (or) Username + two-factor i.e. Passwordless login /Login without password /Password free authentication
39
+ * Recovery codes in case you are locked out for all Two-Factor Authentication (WP 2FA/TFA)
40
+ * **Mobile verification - two step verification** (WP 2FA/TFA) using a user's mobile phone with authentication method like google authenticator, QR code authentication, etc.
41
+
42
+ = Additional Features other than the basic Google Authenticator two-factor authentication =
43
+
44
+ * Complete Web Security suite to protect wordpress from any attacks
45
+ * Web Application Firewall (WAF): Wordpress Firewall to protect your site
46
+ * OWASP TOP 10 Protection
47
+ * Login Protection: Spam and Login Protection
48
+ * Malware scanner: Detects any virus, malware and trojan
49
+ * Backup: Taking Encrypted Backup with local storage and cloud storage
50
+ * Limit Login Attempts to stop password guessing
51
+ * Realtime Global IP Blocking
52
+ * Limit Rate of Request: Protecting resources from any security hole exploit
53
+ * Crawler Detection and blocking
54
+ * Blocking IP and Attacks
55
+ * Country Blocking and Browser Blocking
56
+ * Brute Force Attacks prevention to stop password hack
57
+ * Captcha for Bot Detection
58
+ * Google Recaptcha
59
+ * Login Form Protection
60
+ * Registration Form Protection
61
+ * Integration with different plugin - WooCommerce, Buddypress, Ultimate Member and others
62
+ * Reporting
63
+ * Audit Log
64
+
65
+ = Apps Supported by the two-factor authentication (2FA/MFA) plugin =
66
+ * Google Authenticator
67
+ * miniOrange Authenticator
68
+ * Duo Authenticator
69
+ * Microsoft Authenticator
70
+ * Authy 2 Factor Authenticator
71
+ * LastPass Authenticator
72
+ * FreeOTP Authenticator
73