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

Version Description

  • Google Authenticator - Two factor Authentication (2FA, OTP) :
  • Vulnerability fixes
  • Removed Network Security for new users
  • Updated Pricing page UI
Download this release

Release Info

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

Code changes from version 5.6.1 to 5.6.2

Files changed (51) hide show
  1. api/class-customer-common-setup.php +38 -16
  2. changelog.txt +9 -3
  3. controllers/backup/backup.php +0 -2
  4. controllers/backup/backup_ajax.php +0 -157
  5. controllers/backup/backup_controller.php +0 -2
  6. controllers/backup/backup_created_report.php +0 -2
  7. controllers/backup/backup_created_result.php +0 -14
  8. controllers/backup/backup_schdule.php +0 -22
  9. controllers/dashboard_ajax.php +0 -27
  10. controllers/main_controller.php +1 -2
  11. controllers/malware_scanner/malware_scan_ajax.php +14 -6
  12. controllers/navbar.php +1 -6
  13. controllers/twofa/mo2fa_common_login.php +22 -31
  14. controllers/twofa/two_factor_ajax.php +2 -2
  15. controllers/waf.php +0 -2
  16. database/database_functions.php +64 -102
  17. database/database_functions_2fa.php +24 -30
  18. database/mo2f_db_options.php +0 -11
  19. handler/WAF/Includes/CrawlerIPs.php +12 -0
  20. handler/WAF/database/mo-waf-plugin-db.php +6 -6
  21. handler/WAF/mo-waf-plugin.php +18 -7
  22. handler/WAF/mo-waf.php +27 -8
  23. handler/WAF/waf-include.php +196 -40
  24. handler/backup.php +0 -322
  25. handler/mo-waf-plugin.php +25 -47
  26. handler/mo-waf.php +2 -25
  27. handler/twofa/encryption.php +1 -5
  28. handler/twofa/gaonprem.php +1 -1
  29. handler/twofa/setup_twofa.php +1 -1
  30. handler/twofa/two_fa_pass2login.php +15 -25
  31. handler/twofa/two_fa_settings.php +0 -45
  32. handler/twofa/two_fa_utility.php +13 -38
  33. helper/constants.php +5 -3
  34. helper/dashboard_security_notification.php +3 -66
  35. helper/pluginUtility.php +1 -1
  36. helper/utility.php +15 -10
  37. includes/css/style_settings.css +5 -0
  38. includes/css/upgrade.css +613 -900
  39. includes/js/settings_page.js +0 -6
  40. miniorange_2_factor_settings.php +10 -7
  41. readme.txt +16 -14
  42. uninstall.php +0 -27
  43. views/backup/backup.php +0 -66
  44. views/backup/backup_created_report.php +0 -81
  45. views/backup/backup_schdule.php +0 -192
  46. views/backup/backup_setting_view.php +0 -165
  47. views/common-elements.php +0 -2
  48. views/dashboard.php +0 -18
  49. views/malware_scanner/scan_summary_view.php +17 -6
  50. views/navbar.php +26 -20
  51. views/upgrade.php +532 -582
api/class-customer-common-setup.php CHANGED
@@ -310,44 +310,66 @@ class Customer_Cloud_Setup {
310
  }
311
 
312
  public function mo_2f_generate_backup_codes($mo2f_user_email,$site_url){
313
-
314
- $url = 'https://sitestats.xecurify.com/backupcodeservice/index.php';
315
-
316
- $headers = array('header' => "Authorization:Basic" . base64_encode("$mo2f_user_email:$site_url") );
317
-
318
- $postdata = array('mo2f_email'=> $mo2f_user_email,
319
  'mo2f_domain' =>$site_url,
320
- 'headers'=>$headers['header'],
321
  'mo2f_generate_backup_codes'=>'initiated_backup_codes');
322
 
323
- $args = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
324
  'method' => 'POST',
325
  'timeout' => 45,
326
  'sslverify' => false,
327
  'headers' => array(),
328
  'body' => $postdata,
 
329
  );
330
 
331
  $mo2f_api=new Mo2f_Api();
332
  $data = $mo2f_api->mo2f_wp_remote_post($url,$args);
333
  $status_code = wp_remote_retrieve_response_code(wp_remote_post($url,$args));
334
-
335
  $data1 = json_decode($data, true);
336
  if( is_array($data1) && $data1['status'] == "ERROR" || $status_code != '200'){
337
- return "InternetConnectivityError";
338
  }else
339
- return $data;
340
  }
341
 
342
  public function mo2f_validate_backup_codes($mo2f_backup_code,$mo2f_user_email){
343
- $url = 'https://sitestats.xecurify.com/backupcodeservice/backup_code_validation.php';
 
 
344
 
345
- $site_url = site_url();
346
- $headers = array('header' => "Authorization:Basic" . base64_encode("$mo2f_user_email:$site_url") );
347
-
348
  $postdata = array('mo2f_otp_token' => $mo2f_backup_code,
349
  'mo2f_user_email'=> $mo2f_user_email,
350
- 'headers'=>$headers['header'],
351
  'mo2f_site_url' => $site_url);
352
 
353
  $args = array(
310
  }
311
 
312
  public function mo_2f_generate_backup_codes($mo2f_user_email,$site_url){
313
+ $url = MoWpnsConstants::GENERATE_BACK_CODE;
314
+
315
+ $data = $this->mo_2f_autnetication_backup_code_request($mo2f_user_email,$site_url);
316
+
317
+ $postdata = array('mo2f_email'=> $mo2f_user_email,
 
318
  'mo2f_domain' =>$site_url,
319
+ 'HTTP_AUTHORIZATION'=>'Bearer|'.$data,
320
  'mo2f_generate_backup_codes'=>'initiated_backup_codes');
321
 
322
+
323
+
324
+ return $this->mo_2f_remote_call_function($url,$postdata);
325
+
326
+ }
327
+
328
+ public function mo_2f_autnetication_backup_code_request($mo2f_user_email,$site_url){
329
+
330
+ $url = MoWpnsConstants::AUTHENTICATE_REQUEST;
331
+
332
+ $postdata = array('mo2f_email'=> $mo2f_user_email,
333
+ 'mo2f_domain' =>$site_url,
334
+ 'mo2f_cKey'=>MoWpnsConstants::DEFAULT_CUSTOMER_KEY,
335
+ 'mo2f_cSecret'=>MoWpnsConstants::DEFAULT_API_KEY
336
+ );
337
+
338
+ return $this->mo_2f_remote_call_function($url,$postdata,);
339
+ }
340
+
341
+ public function mo_2f_remote_call_function($url,$postdata){
342
+
343
+
344
+ $args = array(
345
  'method' => 'POST',
346
  'timeout' => 45,
347
  'sslverify' => false,
348
  'headers' => array(),
349
  'body' => $postdata,
350
+
351
  );
352
 
353
  $mo2f_api=new Mo2f_Api();
354
  $data = $mo2f_api->mo2f_wp_remote_post($url,$args);
355
  $status_code = wp_remote_retrieve_response_code(wp_remote_post($url,$args));
356
+
357
  $data1 = json_decode($data, true);
358
  if( is_array($data1) && $data1['status'] == "ERROR" || $status_code != '200'){
359
+ return 'InternetConnectivityError';
360
  }else
361
+ return $data;
362
  }
363
 
364
  public function mo2f_validate_backup_codes($mo2f_backup_code,$mo2f_user_email){
365
+ $url = MoWpnsConstants::VALIDATE_BACKUP_CODE;
366
+ $site_url = site_url();
367
+ $data = $this->mo_2f_autnetication_backup_code_request($mo2f_user_email,$site_url);
368
 
369
+
 
 
370
  $postdata = array('mo2f_otp_token' => $mo2f_backup_code,
371
  'mo2f_user_email'=> $mo2f_user_email,
372
+ 'HTTP_AUTHORIZATION'=>'Bearer|'.$data,
373
  'mo2f_site_url' => $site_url);
374
 
375
  $args = array(
changelog.txt CHANGED
@@ -5,9 +5,15 @@
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 =
9
- * Google Authenticator - Two factor Authentication (2FA, OTP) :
10
- * Updated Network Security UI
 
 
 
 
 
 
11
 
12
  = 5.5.82 =
13
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
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.6.0 =
9
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
10
+ * Added new feature - the grace period for users
11
+ * Updated setup wizard UI - Included user-based settings in the wizard
12
+ * Added dashboard to check 2fa status of users
13
+ * Login report of users available even when Network Security is disabled
14
+ * Handled backup codes flow when sitestats is unreachable
15
+ * Added access control and nonce checks in some flows - Malware scan, plugin enable/disable
16
+ * Fixed warning issues - fetching location details using geoplugin API
17
 
18
  = 5.5.82 =
19
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
controllers/backup/backup.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- include $mo2f_dirName. 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup.php';
 
 
controllers/backup/backup_ajax.php DELETED
@@ -1,157 +0,0 @@
1
- <?php
2
- class Mo_wpns_file_db_backup{
3
-
4
- function __construct(){
5
- add_action( 'admin_init' , array( $this, 'mo_wpns_file_db_backup_functions' ) );
6
- }
7
-
8
- public function mo_wpns_file_db_backup_functions(){
9
- add_action('wp_ajax_mo_wpns_backup_redirect', array( $this, 'mo_wpns_backup_redirect' ));
10
- }
11
-
12
- public function mo_wpns_backup_redirect(){
13
-
14
- switch(sanitize_text_field(wp_unslash($_POST['call_type'])))
15
- {
16
- case "submit_backup_settings_form":
17
- $this->mo_wpns_save_backup_config_form($_POST);
18
- break;
19
- case "submit_schedule_settings_form":
20
- $this->mo_wpns_save_schedule_backup_config_form($_POST);
21
- break;
22
- case "delete_backup":
23
- $this->delete_backup($_POST);
24
- break;
25
- }
26
- }
27
-
28
- public function mo_wpns_save_backup_config_form($postData){
29
- $nonce = sanitize_text_field($postData['nonce']);
30
- if ( ! wp_verify_nonce( $nonce, 'wpns-backup-settings' ) ){
31
- wp_send_json('ERROR');
32
- }
33
-
34
- if(! isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database'])){
35
- wp_send_json('folder_error');
36
- }
37
-
38
- isset($postData['backup_plugin']) ? update_site_option( 'mo_file_manual_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_manual_backup_plugins', 0);
39
-
40
- isset($postData['backup_themes']) ? update_site_option( 'mo_file_manual_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_manual_backup_themes', 0);
41
-
42
- isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_manual_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_manual_backup_wp_files', 0);
43
-
44
- isset($postData['database']) ? update_site_option( 'mo_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_database_backup', 0);
45
-
46
- if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
47
- $handler_obj = new MoBackupSite();
48
- update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
49
- $handler_obj->file_manual_backup();
50
- }
51
- if(isset($postData['database'])) {
52
- $handler_obj = new MoBackupSite();
53
- update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
54
- $handler_obj->backupDB();
55
- }
56
- wp_send_json('created_backup');
57
- }
58
-
59
- function mo_wpns_save_schedule_backup_config_form($postData){
60
- $nonce = sanitize_text_field($postData['nonce']);
61
- if ( ! wp_verify_nonce( $nonce, 'wpns-schedule-backup' ) ){
62
- wp_send_json('ERROR');
63
-
64
- }
65
-
66
- $handler_obj = new MoBackupSite;
67
- if(!isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database']))
68
- {
69
- wp_send_json('folder_error');
70
-
71
- }
72
-
73
- isset($postData['backup_plugin']) ? update_site_option( 'mo_file_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_backup_plugins', 0);
74
-
75
- isset($postData['backup_themes']) ? update_site_option( 'mo_file_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_backup_themes', 0);
76
-
77
- isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_backup_wp_files', 0);
78
-
79
- isset($postData['database']) ? update_site_option( 'mo_schedule_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_schedule_database_backup', 0);
80
-
81
- if($postData['backup_time']==='12'||$postData['backup_time']==='24'||$postData['backup_time']==='168'||$postData['backup_time']==='360'||$postData['backup_time']==='720')
82
- {
83
- isset($postData['backup_time']) ? update_site_option( 'mo_wpns_backup_time', sanitize_text_field($postData['backup_time'])) : update_site_option( 'mo_wpns_backup_time', 0);
84
- }else{
85
- wp_send_json('invalid_hours');
86
-
87
- }
88
-
89
- isset($postData['enable_backup_schedule']) ? update_site_option( 'enable_backup_schedule', sanitize_text_field($postData['enable_backup_schedule'])) : update_site_option( 'enable_backup_schedule', 0);
90
-
91
- isset($postData['local_storage']) ? update_site_option( 'storage_type', sanitize_text_field($postData['local_storage'])) : update_site_option( 'storage_type', 0);
92
-
93
- if(get_site_option('enable_backup_schedule') === '1'){
94
-
95
- if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
96
- $handler_obj-> file_backup_deactivate();
97
- if (!wp_next_scheduled( 'mo_eb_file_cron_hook')) {
98
- wp_schedule_event( time(), 'file_eb_backup_time', 'mo_eb_file_cron_hook' );
99
- }
100
- update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
101
- update_site_option('scheduled_file_backup',1);
102
- }
103
- else
104
- $handler_obj-> file_backup_deactivate();
105
-
106
- if(MoWpnsUtility::get_mo2f_db_option('mo_schedule_database_backup', 'site_option') === '1'){
107
- $handler_obj->bl_deactivate();
108
- if ( ! wp_next_scheduled( 'mo_eb_bl_cron_hook' ) ) {
109
- wp_schedule_event( time(), 'db_eb_backup_time', 'mo_eb_bl_cron_hook' );
110
- }
111
- update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
112
- update_site_option('scheduled_db_backup',1);
113
- }
114
- else
115
- $handler_obj->bl_deactivate();
116
-
117
- wp_send_json('success');
118
-
119
- }else{
120
- $handler_obj-> file_backup_deactivate();
121
- $handler_obj->bl_deactivate();
122
- update_site_option('scheduled_db_backup',0);
123
- update_site_option('scheduled_file_backup',0);
124
- wp_send_json('disable');
125
-
126
- }
127
- }
128
-
129
-
130
-
131
- function delete_backup($postData){
132
-
133
- $nonce = sanitize_text_field($postData['nonce']);
134
- if ( ! wp_verify_nonce( $nonce, 'delete_entry' ) ){
135
- wp_send_json('ERROR');
136
-
137
- }
138
-
139
- if(current_user_can('administrator')){
140
- global $wpnsDbQueries;
141
- $id = $postData['id'];
142
- $row_exist = (int)$wpnsDbQueries->row_exist($id);
143
- $status = file_exists($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
144
- if($status){
145
- unlink($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
146
- if($row_exist)
147
- $wpnsDbQueries->delete_file($id);
148
- wp_send_json('success');
149
-
150
- }else{
151
- $wpnsDbQueries->delete_file($id);
152
- wp_send_json('notexist');
153
- }
154
- }
155
- }
156
- }new Mo_wpns_file_db_backup();
157
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
controllers/backup/backup_controller.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_setting_view.php';
 
 
controllers/backup/backup_created_report.php DELETED
@@ -1,2 +0,0 @@
1
- <?php
2
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_created_report.php';
 
 
controllers/backup/backup_created_result.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
- function showBackupResults(){
3
- global $wpnsDbQueries;
4
- $array = $wpnsDbQueries->get_table_content();
5
- $array_size = sizeof($array);
6
- for($i=0; $i<(int)$array_size; $i++){
7
- $backup_file_path = $array[$i]->plugin_path.DIRECTORY_SEPARATOR.$array[$i]->file_name;
8
- if(file_exists($backup_file_path))
9
- show_backup_report($array[$i]->plugin_path, $array[$i]->file_name, $array[$i]->created_timestamp,$array[$i]->id);
10
- else
11
- $wpnsDbQueries->delete_file($array[$i]->id);
12
- }
13
- }
14
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
controllers/backup/backup_schdule.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
-
3
- $file_backup_time = MoWpnsUtility::get_mo2f_db_option('file_backup_created_time', 'site_option');
4
- $db_eb_backup_time = MoWpnsUtility::get_mo2f_db_option('db_backup_created_time', 'site_option');
5
- $file_schedule_status = MoWpnsUtility::get_mo2f_db_option('scheduled_file_backup', 'site_option');
6
- $db_backup_status = MoWpnsUtility::get_mo2f_db_option('scheduled_db_backup', 'site_option');
7
- $next_file_backup_hours = MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option');
8
- $next_db_backup_hours = MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option');
9
- $img_loader_url = plugins_url('backup-wordpress'.DIRECTORY_SEPARATOR .'includes'.DIRECTORY_SEPARATOR .'images'.DIRECTORY_SEPARATOR .'loader.gif');
10
- $page_url = "";
11
- $file_next_backup_timestamp = wp_next_scheduled( 'mo_eb_file_cron_hook' );
12
- $db_next_backup_timestamp = wp_next_scheduled( 'mo_eb_bl_cron_hook' );
13
-
14
- $file_date = date('d-m-Y', $file_next_backup_timestamp);
15
- $file_time = date('H:i', $file_next_backup_timestamp);
16
- $file_day = date('l',$file_next_backup_timestamp);
17
-
18
- $db_date = date('d-m-Y', $db_next_backup_timestamp);
19
- $db_time = date('H:i', $db_next_backup_timestamp);
20
- $db_day = date('l',$db_next_backup_timestamp);
21
-
22
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_schdule.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
controllers/dashboard_ajax.php CHANGED
@@ -27,9 +27,6 @@ class Mo2f_ajax_dashboard
27
  case "tab_login_switch":
28
  $this->mo2f_handle_login_enable($santizied_post);
29
  break;
30
- case "tab_backup_switch":
31
- $this->mo2f_handle_backup_enable($santizied_post);
32
- break;
33
  case "tab_malware_switch":
34
  $this->mo2f_handle_malware_enable($santizied_post);
35
  break;
@@ -44,7 +41,6 @@ class Mo2f_ajax_dashboard
44
  public function mo2f_handle_all_enable($POSTED){
45
  $this->mo2f_handle_waf_enable($POSTED);
46
  $this->mo2f_handle_login_enable($POSTED);
47
- $this->mo2f_handle_backup_enable($POSTED);
48
  $this->mo2f_handle_malware_enable($POSTED);
49
  $this->mo2f_handle_block_enable($POSTED);
50
  if($POSTED){
@@ -142,29 +138,6 @@ class Mo2f_ajax_dashboard
142
  }
143
  }
144
 
145
- public function mo2f_handle_backup_enable($POSTED){
146
- if($POSTED){
147
- update_site_option('mo_2f_switch_backup', 1);
148
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
149
- if (isset($_POST['option'] ))
150
- {
151
- if(sanitize_text_field($_POST['option']) == 'tab_backup_switch')
152
- do_action('wpns_show_message',MoWpnsMessages::showMessage('BACKUP_ENABLE'),'SUCCESS');
153
- }
154
- }
155
- else{
156
- update_site_option('mo_2f_switch_backup', 0);
157
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
158
- $handler_obj = new MoBackupSite;
159
- $handler_obj->bl_deactivate();
160
- update_site_option('mo2f_enable_cron_backup', 0);
161
- $handler_obj->file_backup_deactivate();
162
- update_site_option('mo2f_enable_cron_file_backup', 0);
163
- if(sanitize_text_field($_POST['option']) == 'tab_backup_switch')
164
- do_action('wpns_show_message',MoWpnsMessages::showMessage('BACKUP_DISABLE'),'ERROR');
165
- }
166
- }
167
-
168
  public function mo2f_handle_malware_enable($POSTED){
169
  if($POSTED){
170
  update_site_option('mo_2f_switch_malware', 1);
27
  case "tab_login_switch":
28
  $this->mo2f_handle_login_enable($santizied_post);
29
  break;
 
 
 
30
  case "tab_malware_switch":
31
  $this->mo2f_handle_malware_enable($santizied_post);
32
  break;
41
  public function mo2f_handle_all_enable($POSTED){
42
  $this->mo2f_handle_waf_enable($POSTED);
43
  $this->mo2f_handle_login_enable($POSTED);
 
44
  $this->mo2f_handle_malware_enable($POSTED);
45
  $this->mo2f_handle_block_enable($POSTED);
46
  if($POSTED){
138
  }
139
  }
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  public function mo2f_handle_malware_enable($POSTED){
142
  if($POSTED){
143
  update_site_option('mo_2f_switch_malware', 1);
controllers/main_controller.php CHANGED
@@ -22,8 +22,7 @@ if(current_user_can('administrator'))
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':
22
  include_once $controller . 'login-security.php'; break;
23
  case 'mo_2fa_account':
24
  include_once $controller . 'account.php'; break;
25
+
 
26
  case 'mo_2fa_upgrade':
27
  include_once $controller . 'upgrade.php'; break;
28
  case 'mo_2fa_waf':
controllers/malware_scanner/malware_scan_ajax.php CHANGED
@@ -22,10 +22,10 @@ class Mo_wpns_scan_malware
22
  $this->mo_wpns_start_malware_scan($_POST);
23
  break;
24
  case "malware_progress_bar":
25
- $this->mo_wpns_get_progress();
26
  break;
27
  case "malware_scan_terminate":
28
- $this->mo_wpns_stop_scan();
29
  break;
30
  }
31
  }
@@ -112,7 +112,6 @@ class Mo_wpns_scan_malware
112
  wp_send_json('scanning_already');
113
  }
114
  global $moWpnsUtility, $mo2f_dirName;
115
-
116
  $mo_wpns_scan_handler = new Mo_wpns_Scan_Handler_Cron();
117
  $mo2f_malware_db_handler = new MoWpnsDB();
118
 
@@ -253,8 +252,12 @@ class Mo_wpns_scan_malware
253
  }
254
 
255
 
256
- public function mo_wpns_get_progress(){
257
-
 
 
 
 
258
  $decoded_scan_status=json_decode(get_site_option('mo_wpns_scan_status'));
259
  $status= $decoded_scan_status->scan_progress;
260
  $files_scanned= $decoded_scan_status->files_scanned;
@@ -340,7 +343,12 @@ class Mo_wpns_scan_malware
340
  }
341
  }
342
 
343
- function mo_wpns_stop_scan(){
 
 
 
 
 
344
  update_site_option('mo_stop_scan','1');
345
  $mo2f_malware_db_handler = new MoWpnsDB();
346
  $mo2f_malware_db_handler->delete_files_parts();
22
  $this->mo_wpns_start_malware_scan($_POST);
23
  break;
24
  case "malware_progress_bar":
25
+ $this->mo_wpns_get_progress($_POST);
26
  break;
27
  case "malware_scan_terminate":
28
+ $this->mo_wpns_stop_scan($_POST);
29
  break;
30
  }
31
  }
112
  wp_send_json('scanning_already');
113
  }
114
  global $moWpnsUtility, $mo2f_dirName;
 
115
  $mo_wpns_scan_handler = new Mo_wpns_Scan_Handler_Cron();
116
  $mo2f_malware_db_handler = new MoWpnsDB();
117
 
252
  }
253
 
254
 
255
+ public function mo_wpns_get_progress($POSTED){
256
+ $nonce = isset($POSTED['nonce'])?sanitize_text_field($POSTED['nonce']):'';
257
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
258
+ wp_send_json('NONCE_ERROR');
259
+ return;
260
+ }
261
  $decoded_scan_status=json_decode(get_site_option('mo_wpns_scan_status'));
262
  $status= $decoded_scan_status->scan_progress;
263
  $files_scanned= $decoded_scan_status->files_scanned;
343
  }
344
  }
345
 
346
+ function mo_wpns_stop_scan($POSTED){
347
+ $nonce = isset($POSTED['nonce'])?sanitize_text_field($POSTED['nonce']):'';
348
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
349
+ wp_send_json('NONCE_ERROR');
350
+ return;
351
+ }
352
  update_site_option('mo_stop_scan','1');
353
  $mo2f_malware_db_handler = new MoWpnsDB();
354
  $mo2f_malware_db_handler->delete_files_parts();
controllers/navbar.php CHANGED
@@ -25,11 +25,6 @@
25
  if($tab_count < 5 && !get_site_option('mo_2f_switch_loginspam'))
26
  update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
27
  break;
28
- case 'mo_2fa_backup':
29
- update_option('mo_2f_switch_backup', 1);
30
- if($tab_count < 5 && !get_site_option('mo_2f_switch_backup'))
31
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
32
- break;
33
  case 'mo_2fa_waf':
34
  update_option('mo_2f_switch_waf', 1);
35
  if($tab_count < 5 && !get_site_option('mo_2f_switch_waf'))
@@ -61,7 +56,7 @@
61
  $help_url = esc_url(add_query_arg( array('page' => 'mo_2fa_troubleshooting' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
62
  $addons_url = esc_url(add_query_arg( array('page' => 'mo_2fa_addons' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
63
  $content_protect= esc_url(add_query_arg( array('page' => 'content_protect' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
64
- $backup = esc_url(add_query_arg( array('page' => 'mo_2fa_backup' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
65
  $scan_url = esc_url(add_query_arg( array('page' => 'mo_2fa_malwarescan' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
66
  $two_fa = esc_url(add_query_arg( array('page' => 'mo_2fa_two_fa' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
67
  //Added for new design
25
  if($tab_count < 5 && !get_site_option('mo_2f_switch_loginspam'))
26
  update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
27
  break;
 
 
 
 
 
28
  case 'mo_2fa_waf':
29
  update_option('mo_2f_switch_waf', 1);
30
  if($tab_count < 5 && !get_site_option('mo_2f_switch_waf'))
56
  $help_url = esc_url(add_query_arg( array('page' => 'mo_2fa_troubleshooting' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
57
  $addons_url = esc_url(add_query_arg( array('page' => 'mo_2fa_addons' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
58
  $content_protect= esc_url(add_query_arg( array('page' => 'content_protect' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
59
+
60
  $scan_url = esc_url(add_query_arg( array('page' => 'mo_2fa_malwarescan' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
61
  $two_fa = esc_url(add_query_arg( array('page' => 'mo_2fa_two_fa' ), sanitize_text_field($_SERVER['REQUEST_URI'] )));
62
  //Added for new design
controllers/twofa/mo2fa_common_login.php CHANGED
@@ -1510,39 +1510,30 @@ function echo_js_css_files() {
1510
  wp_print_scripts( 'mo2f_bootstrap_js');
1511
  }
1512
 
1513
- function mo2f_backup_codes_generate($id, $redirect_to, $session_id_encrypt){
1514
- global $Mo2fdbQueries;
1515
- update_site_option('mo2f_is_inline_used','1');
1516
- $code_generated = 'code_generation_failed';
1517
 
1518
- if(get_user_meta($id, 'mo_backup_code_generated', true) && !get_user_meta($id, 'mo_backup_code_downloaded', false))
1519
- {
1520
- $encrypted_codes =get_user_meta($id, 'chqwetcsdvnvd', true);
1521
- $key = get_option( 'mo2f_encryption_key' );
1522
- $codes_string = MO2f_Utility::decrypt_data( $encrypted_codes, $key );
1523
- $codes = explode(",", $codes_string);
1524
- $code_generated='code_generation_successful';
1525
- delete_user_meta($id, 'chqwetcsdvnvd');
1526
- $result = true;
1527
- }
1528
- else{
1529
- $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
1530
- if(empty($mo2f_user_email)){
1531
- $currentuser = get_user_by( 'id', $id );
1532
- $mo2f_user_email = $currentuser->user_email;
1533
- }
1534
- $generate_backup_code = new Customer_Cloud_Setup();
1535
- $codes = $generate_backup_code->mo_2f_generate_backup_codes($mo2f_user_email, site_url());
1536
-
1537
- $codes = explode(' ', $codes);
1538
- $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
1539
- update_user_meta($id, 'mo_backup_code_generated', 1);
1540
- $code_generated = 'code_generation_successful';
1541
-
1542
- }
1543
 
1544
- update_user_meta($id, 'mo_backup_code_screen_shown', 1);
1545
- ?>
 
 
 
 
 
 
 
1546
  <html>
1547
  <head> <meta charset="utf-8"/>
1548
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
1510
  wp_print_scripts( 'mo2f_bootstrap_js');
1511
  }
1512
 
1513
+ function mo2f_backup_codes_generate($redirect_to, $session_id_encrypt){
1514
+ global $Mo2fdbQueries;
1515
+ $id = MO2f_Utility::mo2f_get_transient($session_id_encrypt, 'mo2f_current_user_id');
 
1516
 
1517
+ update_site_option('mo2f_is_inline_used','1');
1518
+ $code_generated = 'code_generation_failed';
1519
+
1520
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
1521
+ if(empty($mo2f_user_email)){
1522
+ $currentuser = get_user_by( 'id', $id );
1523
+ $mo2f_user_email = $currentuser->user_email;
1524
+ }
1525
+ $generate_backup_code = new Customer_Cloud_Setup();
1526
+ $codes = $generate_backup_code->mo_2f_generate_backup_codes($mo2f_user_email, site_url());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1527
 
1528
+ $codes = explode(' ', $codes);
1529
+ $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
1530
+ update_user_meta($id, 'mo_backup_code_generated', 1);
1531
+ $code_generated = 'code_generation_successful';
1532
+
1533
+
1534
+
1535
+ update_user_meta($id, 'mo_backup_code_screen_shown', 1);
1536
+ ?>
1537
  <html>
1538
  <head> <meta charset="utf-8"/>
1539
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
controllers/twofa/two_factor_ajax.php CHANGED
@@ -874,7 +874,7 @@ class mo_2f_ajax
874
  if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-save-form-settings' ) ) {
875
  $error = new WP_Error();
876
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
877
- //return $error;
878
  }
879
  if(!current_user_can( 'administrator' ))
880
  wp_send_json('error');
@@ -1064,7 +1064,7 @@ function mo2f_shift_to_onprem(){
1064
  if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-enable-2FA' ) ) {
1065
  $error = new WP_Error();
1066
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1067
-
1068
  }
1069
  if(!current_user_can( 'administrator' ))
1070
  wp_send_json('error');
874
  if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-save-form-settings' ) ) {
875
  $error = new WP_Error();
876
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
877
+ wp_send_json('error');
878
  }
879
  if(!current_user_can( 'administrator' ))
880
  wp_send_json('error');
1064
  if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-enable-2FA' ) ) {
1065
  $error = new WP_Error();
1066
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1067
+ wp_send_json("error");
1068
  }
1069
  if(!current_user_can( 'administrator' ))
1070
  wp_send_json('error');
controllers/waf.php CHANGED
@@ -13,8 +13,6 @@
13
  $IPblockedByWAF = $mo_wpns_handler->get_blocked_ip_waf();
14
  $totalIPBlocked = $manualBlocks+$realTime+$IPblockedByWAF;
15
  $mo_waf = get_option('WAFEnabled');
16
- if(!get_option('mo2f_tour_firewall'))
17
- update_option('mo2f_tour_firewall',1);
18
  if($mo_waf)
19
  {
20
  $mo_waf = false;
13
  $IPblockedByWAF = $mo_wpns_handler->get_blocked_ip_waf();
14
  $totalIPBlocked = $manualBlocks+$realTime+$IPblockedByWAF;
15
  $mo_waf = get_option('WAFEnabled');
 
 
16
  if($mo_waf)
17
  {
18
  $mo_waf = false;
database/database_functions.php CHANGED
@@ -22,12 +22,10 @@
22
  $this->whitelistIPsTable = $wpdb->base_prefix.'mo2f_network_whitelisted_ips';
23
  $this->emailAuditTable = $wpdb->base_prefix.'mo2f_network_email_sent_audit';
24
  $this->IPrateDetails = $wpdb->base_prefix.'wpns_ip_rate_details';
25
- $this->attackLogs = $wpdb->base_prefix.'wpns_attack_logs';
26
  $this->malwarereportTable = $wpdb->base_prefix.'wpns_malware_scan_report';
27
  $this->scanreportdetails = $wpdb->base_prefix.'wpns_malware_scan_report_details';
28
  $this->skipfiles = $wpdb->base_prefix.'wpns_malware_skip_files';
29
  $this->hashfile = $wpdb->base_prefix.'wpns_malware_hash_file';
30
- $this->backupdetails = $wpdb->base_prefix.'wpns_backup_report';
31
  $this->filescan = $wpdb->base_prefix.'wpns_files_scan';
32
  }
33
 
@@ -76,13 +74,6 @@
76
  dbDelta($sql);
77
  }
78
 
79
- $tableName = $this->backupdetails;
80
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
81
- {
82
- $sql = "CREATE TABLE " . $tableName . " (`id` int NOT NULL AUTO_INCREMENT,
83
- `backup_id` mediumtext NOT NULL, `file_name` mediumtext NOT NULL , `created_timestamp` bigint, `plugin_path` mediumtext, UNIQUE KEY id (id) );";
84
- dbDelta($sql);
85
- }
86
  $result= $wpdb->get_var("SHOW COLUMNS FROM `$tableName` LIKE 'plugin_path'");
87
  if(is_null($result)){
88
  $sql = "ALTER TABLE `$tableName` ADD `plugin_path` mediumtext AFTER `created_timestamp` ;";
@@ -104,7 +95,7 @@
104
  dbDelta($sql);
105
  }
106
 
107
- $tableName = $this->attackLogs;
108
  if($wpdb->get_var("show tables like '$tableName'") != $tableName)
109
  {
110
  $sql = "create table ". $tableName ." (
@@ -203,55 +194,13 @@
203
  }
204
  }
205
 
206
- function insert_backup_detail($backup_id,$file_name,$backup_created_timestamp,$plugin_path){
207
- global $wpdb;
208
- $wpdb->insert(
209
- $this->backupdetails,
210
- array(
211
- 'backup_id' =>$backup_id,
212
- 'file_name' =>$file_name,
213
- 'created_timestamp'=> $backup_created_timestamp,
214
- 'plugin_path' => $plugin_path
215
- ));
216
- }
217
-
218
- function get_table_content(){
219
- global $wpdb;
220
- return $wpdb->get_results("SELECT plugin_path,file_name,created_timestamp,id FROM ".$this->backupdetails);
221
- }
222
-
223
- function get_number_of_plugin_backup(){
224
- global $wpdb;
225
-
226
- $plugin_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'plugin'");
227
- $themes_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'themes'");
228
- $wp_files_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'wpfiles'");
229
- $db_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'db'");
230
- $total_backup = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails);
231
- $array = array('plugin_count'=>$plugin_count,'themes_count'=>$themes_count,'wp_files_count'=>$wp_files_count,'db_count'=>$db_count,'total_backup'=>$total_backup);
232
-
233
- return $array;
234
- }
235
-
236
- function delete_file($id){
237
- global $wpdb;
238
- $wpdb->query(
239
- "DELETE FROM ".$this->backupdetails."
240
- WHERE id = ".$id
241
- );
242
- return;
243
- }
244
 
245
- function row_exist($id){
246
- global $wpdb;
247
- $is_exist = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE id =".$id );
248
- return $is_exist;
249
- }
250
 
251
  function get_ip_blocked_count($ipAddress)
252
  {
253
  global $wpdb;
254
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE ip_address = '".$ipAddress."'" );
255
  }
256
  function get_total_blocked_ips()
257
  {
@@ -272,19 +221,19 @@
272
  function get_blocked_attack_count($attack)
273
  {
274
  global $wpdb;
275
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->attackList." WHERE type = '".$attack."'" );
276
  }
277
 
278
  function get_count_of_blocked_ips(){
279
  global $wpdb;
280
- return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->blockedIPsTable."");
281
  }
282
 
283
 
284
  function get_blocked_ip($entryid)
285
  {
286
  global $wpdb;
287
- return $wpdb->get_results( "SELECT ip_address FROM ".$this->blockedIPsTable." WHERE id=".$entryid );
288
  }
289
 
290
  function get_blocked_ip_list()
@@ -298,11 +247,10 @@
298
  global $wpdb;
299
  return $wpdb->get_results("SELECT ip_address FROM ".$this->blockedIPsTable);
300
  }
301
- function get_blocked_attack_list($tableName)
302
  {
303
  global $wpdb;
304
- $tableName = $wpdb->base_prefix.$tableName;
305
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$tableName);
306
  }
307
 
308
  function get_blocked_sqli_list()
@@ -341,7 +289,8 @@
341
  'reason' => $reason,
342
  'blocked_for_time' => $blocked_for_time,
343
  'created_timestamp' => current_time( 'timestamp' )
344
- )
 
345
  );
346
  return;
347
  }
@@ -350,8 +299,7 @@
350
  {
351
  global $wpdb;
352
  $wpdb->query(
353
- "DELETE FROM ".$this->blockedIPsTable."
354
- WHERE id = ".$entryid
355
  );
356
  return;
357
  }
@@ -359,7 +307,7 @@
359
  function get_whitelisted_ip_count($ipAddress)
360
  {
361
  global $wpdb;
362
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->whitelistIPsTable." WHERE ip_address = '".$ipAddress."'" );
363
  }
364
 
365
  function insert_whitelisted_ip($ipAddress)
@@ -370,7 +318,8 @@
370
  array(
371
  'ip_address' => $ipAddress,
372
  'created_timestamp' => current_time( 'timestamp' )
373
- )
 
374
  );
375
  }
376
 
@@ -383,8 +332,7 @@
383
  {
384
  global $wpdb;
385
  $wpdb->query(
386
- "DELETE FROM ".$this->whitelistIPsTable."
387
- WHERE id = ".$entryid
388
  );
389
  return;
390
  }
@@ -398,8 +346,7 @@
398
  function get_email_audit_count($ipAddress,$username)
399
  {
400
  global $wpdb;
401
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->emailAuditTable." WHERE ip_address = '".$ipAddress."' AND
402
- username='".$username."'" );
403
  }
404
 
405
  function insert_email_audit($ipAddress,$username,$reason)
@@ -412,7 +359,8 @@
412
  'username' => $username,
413
  'reason' => $reason,
414
  'created_timestamp' => current_time( 'timestamp' )
415
- )
 
416
  );
417
  return;
418
  }
@@ -427,9 +375,10 @@
427
  'status' => $status,
428
  'created_timestamp' => current_time( 'timestamp' )
429
  );
 
430
  $data['url'] = is_null($url) ? '' : $url;
431
  $url = sanitize_url($url);
432
- $wpdb->insert( $this->transactionTable, $data);
433
  return;
434
  }
435
 
@@ -461,7 +410,11 @@
461
  {
462
  if($i%2!=0)
463
  $sql .= ' , ';
464
- $sql .= $key."='".$value."'";
 
 
 
 
465
  $i++;
466
  }
467
  $sql .= " WHERE ";
@@ -470,7 +423,11 @@
470
  {
471
  if($i%2!=0)
472
  $sql .= ' AND ';
473
- $sql .= $key."='".$value."'";
 
 
 
 
474
  $i++;
475
  }
476
 
@@ -486,16 +443,14 @@
486
  function get_failed_transaction_count($ipAddress)
487
  {
488
  global $wpdb;
489
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE ip_address = '".$ipAddress."'
490
- AND status = '".MoWpnsConstants::FAILED."'" );
491
  }
492
 
493
  function delete_transaction($ipAddress)
494
  {
495
  global $wpdb;
496
  $wpdb->query(
497
- "DELETE FROM ".$this->transactionTable."
498
- WHERE ip_address = '".$ipAddress."' AND status='".MoWpnsConstants::FAILED."'"
499
  );
500
  return;
501
  }
@@ -512,7 +467,8 @@
512
  'malware_count' => 0,
513
  'repo_issues' => $repo_check_status_code,
514
  'malicious_links' => 0
515
- )
 
516
  );
517
  $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id DESC LIMIT 1");
518
  if($result){
@@ -530,7 +486,9 @@
530
  ),
531
  array(
532
  'id' => $reportid
533
- )
 
 
534
  );
535
  }
536
 
@@ -543,7 +501,9 @@
543
  ),
544
  array(
545
  'id' => $reportid
546
- )
 
 
547
  );
548
  }
549
 
@@ -556,14 +516,15 @@
556
  'filename' => $filename,
557
  'report' => serialize($report),
558
  'created_timestamp' => current_time('timestamp')
559
- )
 
560
  );
561
  }
562
 
563
  function scan_report_complete($recordId, $no_of_scanned_files, $malware_count, $repo_issues, $malicious_links){
564
  global $wpdb;
565
  $wpdb->query(
566
- "UPDATE ".$this->malwarereportTable." set completed_timestamp = ".current_time('timestamp').", scanned_files=".$no_of_scanned_files.", malware_count= '".$malware_count."', repo_issues='".$repo_issues."', malicious_links='".$malicious_links."' WHERE id = ".$recordId
567
  );
568
  }
569
 
@@ -581,19 +542,19 @@
581
 
582
  function count_files_last_scan($reportid){
583
  global $wpdb;
584
- $sql= $wpdb->get_results('SELECT * FROM '.$this->malwarereportTable.' WHERE `id`="'.$reportid.'"');
585
  return $sql[0]->scanned_files;
586
  }
587
 
588
  function count_malicious_last_scan($reportid){
589
  global $wpdb;
590
- $sql= $wpdb->get_results('SELECT COUNT(*) AS mal_file FROM '.$this->scanreportdetails.' WHERE `report_id`="'.$reportid.'"');
591
  return $sql[0]->mal_file;
592
  }
593
 
594
  function check_hash($hash_of_file){
595
  global $wpdb;
596
- $sql= 'SELECT * FROM '.$this->hashfile.' WHERE `file hash`="'.$hash_of_file.'"';
597
  $result=$wpdb->get_results( $sql );
598
  return $result;
599
  }
@@ -601,27 +562,27 @@
601
  function insert_hash($source_file_path,$hash_of_file, $scan_data){
602
  global $wpdb;
603
  $source_file_path = addslashes($source_file_path);
604
- $query= "INSERT INTO ".$this->hashfile."(`file name`,`file hash`,`scan_data`) VALUES('".$source_file_path."', '".$hash_of_file."', '".serialize($scan_data)."') ON DUPLICATE KEY UPDATE `file hash`='".$hash_of_file."' AND `scan_data`='".serialize($scan_data)."'";
605
  $res=$wpdb->query( $query );
606
  }
607
 
608
  function update_hash($source_file_path, $hash_of_file, $scan_data){
609
  global $wpdb;
610
  $source_file_path = addslashes($source_file_path);
611
- $query= "UPDATE ".$this->hashfile." SET `file hash`='".$hash_of_file."',`scan_data`='".serialize($scan_data)."' WHERE `file name`='".$source_file_path."'";
612
  $res=$wpdb->query( $query );
613
  }
614
 
615
  function delete_hash($source_file_path){
616
  global $wpdb;
617
- $query= "DELETE FROM ".$this->hashfile." WHERE `file name` = '".$source_file_path."'";
618
  $res=$wpdb->query( $query );
619
  }
620
 
621
  function get_infected_file($filename){
622
  global $wpdb;
623
  $filename = addslashes($filename);
624
- $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where filename=".$filename );
625
  return $result;
626
  }
627
 
@@ -637,7 +598,7 @@
637
  $file_path = addslashes($file_path);
638
  $hash_value= md5($file_path);
639
  $repo_key = $value['key'];
640
- $query.= "('".$file_path."', '".$hash_value."', '".$default."', '".$default."', '".$default."', '".$repo_key."')";
641
  if($i < $size){
642
  $query.= ",";
643
  }
@@ -670,7 +631,7 @@
670
  $value= $file_path_array[$i]->path;
671
  $value = addslashes($value);
672
  $value = md5($value);
673
- $query.= "('".$value."', 1)";
674
  if($i < $file_count-1){
675
  $query.= ",";
676
  }
@@ -686,7 +647,7 @@
686
  $value= $file_path_array[$i]->path;
687
  $value = addslashes($value);
688
  $value = md5($value);
689
- $query.= "('".$value."', 1)";
690
  if($i < $file_count-1){
691
  $query.= ",";
692
  }
@@ -711,7 +672,7 @@
711
 
712
  function get_files_for_repo($repo_key){
713
  global $wpdb;
714
- $sql= 'SELECT * FROM '.$this->filescan.' WHERE `repo_check`= 0 AND `repo_key`= "'.$repo_key.'" LIMIT 100';
715
  $result=$wpdb->get_results($sql);
716
  return $result;
717
  }
@@ -730,14 +691,14 @@
730
 
731
  function get_report_with_id($reportid){
732
  global $wpdb;
733
- $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." where id=".$reportid );
734
  return $result;
735
  }
736
 
737
  function delete_report($reportid){
738
  global $wpdb;
739
  $wpdb->query(
740
- "DELETE FROM ".$this->malwarereportTable." WHERE id = ".$reportid
741
  );
742
  $warning_count=0;
743
  $malware_count=0;
@@ -769,17 +730,17 @@
769
 
770
  function get_vulnerable_files_count_for_reportid($reportid){
771
  global $wpdb;
772
- $result = $wpdb->get_results( "SELECT count(*) as count FROM ".$this->scanreportdetails." where report_id=".$reportid );
773
  return $result;
774
  }
775
 
776
  function ignorefile($filename){
777
  $signature = md5_file($filename);
778
  global $wpdb;
779
- $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where path = '".$filename."'" );
780
  if($result){
781
  $wpdb->query(
782
- "UPDATE ".$this->skipfiles." SET signature = '".$signature."' WHERE path = '".$filename."'"
783
  );
784
  } else {
785
  $wpdb->insert(
@@ -788,19 +749,20 @@
788
  'path' => $filename,
789
  'signature' => $signature,
790
  'created_timestamp' => current_time('timestamp')
791
- )
 
792
  );
793
  }
794
  }
795
 
796
  function ignorechangedfile($recordId){
797
  global $wpdb;
798
- $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where id = ".$recordId );
799
  if($result){
800
  $record = $result[0];
801
  $signature = md5_file($record->path);
802
  $wpdb->query(
803
- "UPDATE ".$this->skipfiles." set signature = '".$signature."' WHERE id = ".$recordId
804
  );
805
  }
806
  }
@@ -813,7 +775,7 @@
813
 
814
  function get_detail_report_with_id($reportid){
815
  global $wpdb;
816
- $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where report_id=".$reportid );
817
  return $result;
818
  }
819
 
22
  $this->whitelistIPsTable = $wpdb->base_prefix.'mo2f_network_whitelisted_ips';
23
  $this->emailAuditTable = $wpdb->base_prefix.'mo2f_network_email_sent_audit';
24
  $this->IPrateDetails = $wpdb->base_prefix.'wpns_ip_rate_details';
 
25
  $this->malwarereportTable = $wpdb->base_prefix.'wpns_malware_scan_report';
26
  $this->scanreportdetails = $wpdb->base_prefix.'wpns_malware_scan_report_details';
27
  $this->skipfiles = $wpdb->base_prefix.'wpns_malware_skip_files';
28
  $this->hashfile = $wpdb->base_prefix.'wpns_malware_hash_file';
 
29
  $this->filescan = $wpdb->base_prefix.'wpns_files_scan';
30
  }
31
 
74
  dbDelta($sql);
75
  }
76
 
 
 
 
 
 
 
 
77
  $result= $wpdb->get_var("SHOW COLUMNS FROM `$tableName` LIKE 'plugin_path'");
78
  if(is_null($result)){
79
  $sql = "ALTER TABLE `$tableName` ADD `plugin_path` mediumtext AFTER `created_timestamp` ;";
95
  dbDelta($sql);
96
  }
97
 
98
+ $tableName = $this->attackList;
99
  if($wpdb->get_var("show tables like '$tableName'") != $tableName)
100
  {
101
  $sql = "create table ". $tableName ." (
194
  }
195
  }
196
 
197
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
 
 
 
 
 
 
199
 
200
  function get_ip_blocked_count($ipAddress)
201
  {
202
  global $wpdb;
203
+ return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE ip_address = '%s'", array($ipAddress)) );
204
  }
205
  function get_total_blocked_ips()
206
  {
221
  function get_blocked_attack_count($attack)
222
  {
223
  global $wpdb;
224
+ return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM ".$this->attackList." WHERE type = '%s'" ,array($attack)));
225
  }
226
 
227
  function get_count_of_blocked_ips(){
228
  global $wpdb;
229
+ return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->blockedIPsTable);
230
  }
231
 
232
 
233
  function get_blocked_ip($entryid)
234
  {
235
  global $wpdb;
236
+ return $wpdb->get_results( $wpdb->prepare("SELECT ip_address FROM ".$this->blockedIPsTable." WHERE id= %d" , array($entryid)) );
237
  }
238
 
239
  function get_blocked_ip_list()
247
  global $wpdb;
248
  return $wpdb->get_results("SELECT ip_address FROM ".$this->blockedIPsTable);
249
  }
250
+ function get_blocked_attack_list()
251
  {
252
  global $wpdb;
253
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList);
 
254
  }
255
 
256
  function get_blocked_sqli_list()
289
  'reason' => $reason,
290
  'blocked_for_time' => $blocked_for_time,
291
  'created_timestamp' => current_time( 'timestamp' )
292
+ ),
293
+ array('%s','%s','%d','%d')
294
  );
295
  return;
296
  }
299
  {
300
  global $wpdb;
301
  $wpdb->query(
302
+ $wpdb->prepare("DELETE FROM ".$this->blockedIPsTable." WHERE id = %d",array($entryid))
 
303
  );
304
  return;
305
  }
307
  function get_whitelisted_ip_count($ipAddress)
308
  {
309
  global $wpdb;
310
+ return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM ".$this->whitelistIPsTable." WHERE ip_address = %s",array($ipAddress)) );
311
  }
312
 
313
  function insert_whitelisted_ip($ipAddress)
318
  array(
319
  'ip_address' => $ipAddress,
320
  'created_timestamp' => current_time( 'timestamp' )
321
+ ),
322
+ array('%s','%d')
323
  );
324
  }
325
 
332
  {
333
  global $wpdb;
334
  $wpdb->query(
335
+ $wpdb->prepare("DELETE FROM ".$this->whitelistIPsTable." WHERE id = %d",array($entryid))
 
336
  );
337
  return;
338
  }
346
  function get_email_audit_count($ipAddress,$username)
347
  {
348
  global $wpdb;
349
+ return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM ".$this->emailAuditTable." WHERE ip_address = '%s' AND username= '%s'",array($ipAddress,$username)) );
 
350
  }
351
 
352
  function insert_email_audit($ipAddress,$username,$reason)
359
  'username' => $username,
360
  'reason' => $reason,
361
  'created_timestamp' => current_time( 'timestamp' )
362
+ ),
363
+ array('%s','%s','%s','%d')
364
  );
365
  return;
366
  }
375
  'status' => $status,
376
  'created_timestamp' => current_time( 'timestamp' )
377
  );
378
+ $format = array('%s','%s','%s','%s','%d');
379
  $data['url'] = is_null($url) ? '' : $url;
380
  $url = sanitize_url($url);
381
+ $wpdb->insert( $this->transactionTable, $data , $format );
382
  return;
383
  }
384
 
410
  {
411
  if($i%2!=0)
412
  $sql .= ' , ';
413
+ if($key == 'created_timestamp' || $key == 'id'){
414
+ $sql .= $wpdb->prepare("%1s = '%d'",array($key,$value));
415
+ }else{
416
+ $sql .= $wpdb->prepare("%1s = '%s'",array($key,$value));
417
+ }
418
  $i++;
419
  }
420
  $sql .= " WHERE ";
423
  {
424
  if($i%2!=0)
425
  $sql .= ' AND ';
426
+ if($key == 'created_timestamp' || $key == 'id'){
427
+ $sql .= $wpdb->prepare("%1s = '%d'",array($key,$value));
428
+ }else{
429
+ $sql .= $wpdb->prepare("%1s = '%s'",array($key,$value));
430
+ }
431
  $i++;
432
  }
433
 
443
  function get_failed_transaction_count($ipAddress)
444
  {
445
  global $wpdb;
446
+ return $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM ".$this->transactionTable." WHERE ip_address = '%s' AND status = '".MoWpnsConstants::FAILED."'", array($ipAddress)) );
 
447
  }
448
 
449
  function delete_transaction($ipAddress)
450
  {
451
  global $wpdb;
452
  $wpdb->query(
453
+ $wpdb->prepare("DELETE FROM ".$this->transactionTable." WHERE ip_address = '%s' AND status='".MoWpnsConstants::FAILED."'",array($ipAddress))
 
454
  );
455
  return;
456
  }
467
  'malware_count' => 0,
468
  'repo_issues' => $repo_check_status_code,
469
  'malicious_links' => 0
470
+ ),
471
+ array('%s','%s','%d','%d','%d','%d','%d')
472
  );
473
  $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id DESC LIMIT 1");
474
  if($result){
486
  ),
487
  array(
488
  'id' => $reportid
489
+ ),
490
+ array('%d'),
491
+ array('%d')
492
  );
493
  }
494
 
501
  ),
502
  array(
503
  'id' => $reportid
504
+ ),
505
+ array('%s'),
506
+ array('%d')
507
  );
508
  }
509
 
516
  'filename' => $filename,
517
  'report' => serialize($report),
518
  'created_timestamp' => current_time('timestamp')
519
+ ),
520
+ array('%d','%s','%s','%d')
521
  );
522
  }
523
 
524
  function scan_report_complete($recordId, $no_of_scanned_files, $malware_count, $repo_issues, $malicious_links){
525
  global $wpdb;
526
  $wpdb->query(
527
+ $wpdb->prepare("UPDATE ".$this->malwarereportTable." set completed_timestamp = ".current_time('timestamp').", scanned_files= %d , malware_count= %d , repo_issues= %d , malicious_links= %d WHERE id = %d",array($no_of_scanned_files,$malware_count,$repo_issues,$malicious_links,$recordId))
528
  );
529
  }
530
 
542
 
543
  function count_files_last_scan($reportid){
544
  global $wpdb;
545
+ $sql= $wpdb->get_results($wpdb->prepare('SELECT * FROM '.$this->malwarereportTable.' WHERE `id`= %d',array($reportid)));
546
  return $sql[0]->scanned_files;
547
  }
548
 
549
  function count_malicious_last_scan($reportid){
550
  global $wpdb;
551
+ $sql= $wpdb->get_results($wpdb->prepare('SELECT COUNT(*) AS mal_file FROM '.$this->scanreportdetails.' WHERE `report_id`= %d',array($reportid)));
552
  return $sql[0]->mal_file;
553
  }
554
 
555
  function check_hash($hash_of_file){
556
  global $wpdb;
557
+ $sql= $wpdb->prepare("SELECT * FROM ".$this->hashfile." WHERE `file hash`= '%s'",array($hash_of_file));
558
  $result=$wpdb->get_results( $sql );
559
  return $result;
560
  }
562
  function insert_hash($source_file_path,$hash_of_file, $scan_data){
563
  global $wpdb;
564
  $source_file_path = addslashes($source_file_path);
565
+ $query= $wpdb->prepare("INSERT INTO ".$this->hashfile."(`file name`,`file hash`,`scan_data`) VALUES('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `file hash`='%s' AND `scan_data`='%s'",array($source_file_path,$hash_of_file,serialize($scan_data),$hashfile,serialize($scan_data)));
566
  $res=$wpdb->query( $query );
567
  }
568
 
569
  function update_hash($source_file_path, $hash_of_file, $scan_data){
570
  global $wpdb;
571
  $source_file_path = addslashes($source_file_path);
572
+ $query= $wpdb->prepare("UPDATE ".$this->hashfile." SET `file hash`='%s',`scan_data`='%s' WHERE `file name`='%s'",array($hash_of_file,serialize($scan_data),$source_file_path));
573
  $res=$wpdb->query( $query );
574
  }
575
 
576
  function delete_hash($source_file_path){
577
  global $wpdb;
578
+ $query= $wpdb->prepare("DELETE FROM ".$this->hashfile." WHERE `file name` = '%s'",array($source_file_path));
579
  $res=$wpdb->query( $query );
580
  }
581
 
582
  function get_infected_file($filename){
583
  global $wpdb;
584
  $filename = addslashes($filename);
585
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM ".$this->scanreportdetails." where filename= %s",array($filename)) );
586
  return $result;
587
  }
588
 
598
  $file_path = addslashes($file_path);
599
  $hash_value= md5($file_path);
600
  $repo_key = $value['key'];
601
+ $query.= $wpdb->prepare("('%s', '%s', '%d', '%d', '%d', '%s')",array($file_path,$hash_value,$default,$default,$default,$repo_key));
602
  if($i < $size){
603
  $query.= ",";
604
  }
631
  $value= $file_path_array[$i]->path;
632
  $value = addslashes($value);
633
  $value = md5($value);
634
+ $query.= $wpdb->prepare("('%s', 1)",array($value));
635
  if($i < $file_count-1){
636
  $query.= ",";
637
  }
647
  $value= $file_path_array[$i]->path;
648
  $value = addslashes($value);
649
  $value = md5($value);
650
+ $query.= $wpdb->prepare("('%s', 1)",array($value));
651
  if($i < $file_count-1){
652
  $query.= ",";
653
  }
672
 
673
  function get_files_for_repo($repo_key){
674
  global $wpdb;
675
+ $sql= $wpdb->prepare('SELECT * FROM '.$this->filescan.' WHERE `repo_check`= 0 AND `repo_key`= "%s" LIMIT 100',array($repo_key));
676
  $result=$wpdb->get_results($sql);
677
  return $result;
678
  }
691
 
692
  function get_report_with_id($reportid){
693
  global $wpdb;
694
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM ".$this->malwarereportTable." where id= %d",array($reportid)) );
695
  return $result;
696
  }
697
 
698
  function delete_report($reportid){
699
  global $wpdb;
700
  $wpdb->query(
701
+ $wpdb->prepare("DELETE FROM ".$this->malwarereportTable." WHERE id = %d",array($reportid))
702
  );
703
  $warning_count=0;
704
  $malware_count=0;
730
 
731
  function get_vulnerable_files_count_for_reportid($reportid){
732
  global $wpdb;
733
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT count(*) as count FROM ".$this->scanreportdetails." where report_id= %d", array($reportid)) );
734
  return $result;
735
  }
736
 
737
  function ignorefile($filename){
738
  $signature = md5_file($filename);
739
  global $wpdb;
740
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM ".$this->skipfiles." where path = '%s'",array($filename)) );
741
  if($result){
742
  $wpdb->query(
743
+ $wpdb->prepare("UPDATE ".$this->skipfiles." SET signature = '%s' WHERE path = '%s'",array($signature,$filename))
744
  );
745
  } else {
746
  $wpdb->insert(
749
  'path' => $filename,
750
  'signature' => $signature,
751
  'created_timestamp' => current_time('timestamp')
752
+ ),
753
+ array('%s','%s','%d')
754
  );
755
  }
756
  }
757
 
758
  function ignorechangedfile($recordId){
759
  global $wpdb;
760
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM ".$this->skipfiles." where id = %d ",array($recordId)) );
761
  if($result){
762
  $record = $result[0];
763
  $signature = md5_file($record->path);
764
  $wpdb->query(
765
+ $wpdb->prepare("UPDATE ".$this->skipfiles." set signature = '%s' WHERE id = %d",array($signature,$recordId))
766
  );
767
  }
768
  }
775
 
776
  function get_detail_report_with_id($reportid){
777
  global $wpdb;
778
+ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM ".$this->scanreportdetails." where report_id= %d" ,array($reportid)) );
779
  return $result;
780
  }
781
 
database/database_functions_2fa.php CHANGED
@@ -139,7 +139,7 @@ class Mo2fDB {
139
  function get_current_user_email($id)
140
  {
141
  global $wpdb;
142
- $sql = 'select user_email from wp_users where ID='.$id.';';
143
  return $wpdb->get_var($sql);
144
  }
145
  function database_table_issue(){
@@ -176,30 +176,21 @@ class Mo2fDB {
176
 
177
  function insert_user( $user_id ) {
178
  global $wpdb;
179
- $sql = "INSERT INTO $this->userDetailsTable (user_id) VALUES($user_id) ON DUPLICATE KEY UPDATE user_id=$user_id";
180
  $wpdb->query( $sql );
181
  }
182
 
183
- function drop_table( $table_name ) {
184
- global $wpdb;
185
- $sql = "DROP TABLE $table_name";
186
- $wpdb->query( $sql );
187
- }
188
-
189
-
190
  function get_user_detail( $column_name, $user_id ) {
191
  global $wpdb;
192
- $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userDetailsTable . " WHERE user_id = " . $user_id . ";" );
193
  $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
194
-
195
  return $value == '' ? '' : $value[ $column_name ];
196
  }
197
 
198
  function delete_user_details( $user_id ) {
199
  global $wpdb;
200
  $wpdb->query(
201
- "DELETE FROM " . $this->userDetailsTable . "
202
- WHERE user_id = " . $user_id
203
  );
204
 
205
  return;
@@ -235,8 +226,7 @@ class Mo2fDB {
235
  function check_if_user_column_exists($user_id){
236
  global $wpdb;
237
  $value = $wpdb->query(
238
- "SELECT * FROM " . $this->userDetailsTable . "
239
- WHERE user_id = " . $user_id
240
  );
241
 
242
  return $value;
@@ -250,8 +240,7 @@ class Mo2fDB {
250
  else if($table_type == "mo2f_user_details")
251
  $table = $this->userDetailsTable;
252
  global $wpdb;
253
- $sql="SHOW COLUMNS FROM " . $table . "
254
- LIKE '" . $column_name . "'";
255
  $value = $wpdb->query($sql);
256
 
257
  return $value;
@@ -264,14 +253,17 @@ class Mo2fDB {
264
  $sql = "UPDATE " . $this->userDetailsTable . " SET ";
265
  $i = 1;
266
  foreach ( $update as $key => $value ) {
 
 
 
 
267
 
268
- $sql .= $key . "='" . $value . "'";
269
  if ( $i < $count ) {
270
  $sql .= ' , ';
271
  }
272
  $i ++;
273
  }
274
- $sql .= " WHERE user_id=" . $user_id . ";";
275
  $wpdb->query( $sql );
276
 
277
  return;
@@ -280,7 +272,7 @@ class Mo2fDB {
280
 
281
  function insert_user_login_session( $session_id ) {
282
  global $wpdb;
283
- $sql = "INSERT INTO $this->userLoginInfoTable (session_id) VALUES('$session_id') ON DUPLICATE KEY UPDATE session_id='$session_id'";
284
 
285
  $wpdb->query( $sql );
286
  $sql = "DELETE FROM $this->userLoginInfoTable WHERE ts_created < DATE_ADD(NOW(),INTERVAL - 2 MINUTE);";
@@ -293,14 +285,16 @@ class Mo2fDB {
293
  $sql = "UPDATE " . $this->userLoginInfoTable . " SET ";
294
  $i = 1;
295
  foreach ( $user_values as $key => $value ) {
296
-
297
- $sql .= $key . "='" . $value . "'";
 
 
298
  if ( $i < $count ) {
299
  $sql .= ' , ';
300
  }
301
  $i ++;
302
  }
303
- $sql .= " WHERE session_id='" . $session_id . "';";
304
  $wpdb->query( $sql );
305
 
306
  return;
@@ -316,22 +310,21 @@ class Mo2fDB {
316
 
317
  function get_user_login_details( $column_name, $session_id ) {
318
  global $wpdb;
319
- $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userLoginInfoTable . " WHERE session_id = '" . $session_id . "';" );
320
  $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
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;
332
  $wpdb->query(
333
- "DELETE FROM " . $this->userLoginInfoTable . "
334
- WHERE session_id='$session_id';"
335
  );
336
 
337
  return;
@@ -345,8 +338,8 @@ class Mo2fDB {
345
  );
346
 
347
  $user_already_configured = $wpdb->query(
348
- "SELECT meta_key FROM ".$wpdb->base_prefix ."usermeta
349
- WHERE meta_key = 'currentMethod' and user_id =".$user_id);
350
 
351
  if($value < 3 || $user_already_configured){
352
  return false;
@@ -362,7 +355,8 @@ class Mo2fDB {
362
  "SELECT * FROM ".$this->userDetailsTable
363
  );
364
  $user_already_configured = $wpdb->query(
365
- "SELECT * FROM ".$this->userDetailsTable ." WHERE user_id =".$user_id );
 
366
 
367
  if($value < 3 || $user_already_configured){
368
  return false;
139
  function get_current_user_email($id)
140
  {
141
  global $wpdb;
142
+ $sql = $wpdb->prepare("select user_email from wp_users where ID='%d'",array($id));
143
  return $wpdb->get_var($sql);
144
  }
145
  function database_table_issue(){
176
 
177
  function insert_user( $user_id ) {
178
  global $wpdb;
179
+ $sql = $wpdb->prepare("INSERT INTO $this->userDetailsTable (user_id) VALUES(%d) ON DUPLICATE KEY UPDATE user_id=%d",array($user_id,$user_id));
180
  $wpdb->query( $sql );
181
  }
182
 
 
 
 
 
 
 
 
183
  function get_user_detail( $column_name, $user_id ) {
184
  global $wpdb;
185
+ $user_column_detail = $wpdb->get_results( $wpdb->prepare("SELECT %1s FROM %1s WHERE user_id = %d;",array($column_name, $this->userDetailsTable,$user_id)) );
186
  $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
 
187
  return $value == '' ? '' : $value[ $column_name ];
188
  }
189
 
190
  function delete_user_details( $user_id ) {
191
  global $wpdb;
192
  $wpdb->query(
193
+ $wpdb->prepare("DELETE FROM " . $this->userDetailsTable . " WHERE user_id = %d",array($user_id))
 
194
  );
195
 
196
  return;
226
  function check_if_user_column_exists($user_id){
227
  global $wpdb;
228
  $value = $wpdb->query(
229
+ $wpdb->prepare("SELECT * FROM " . $this->userDetailsTable . " WHERE user_id = %d",array($user_id))
 
230
  );
231
 
232
  return $value;
240
  else if($table_type == "mo2f_user_details")
241
  $table = $this->userDetailsTable;
242
  global $wpdb;
243
+ $sql=$wpdb->prepare("SHOW COLUMNS FROM " . $table . " LIKE '%s'",array($column_name)) ;
 
244
  $value = $wpdb->query($sql);
245
 
246
  return $value;
253
  $sql = "UPDATE " . $this->userDetailsTable . " SET ";
254
  $i = 1;
255
  foreach ( $update as $key => $value ) {
256
+ if($key == 'mo2f_configured_2FA_method' || $key == 'mo2f_user_phone' || $key == 'mo2f_user_email' || $key == 'user_registration_with_miniorange' || $key == 'mo_2factor_user_registration_status' )
257
+ $sql .= $wpdb->prepare(" %1s ='%s'",array($key,$value));
258
+ else
259
+ $sql .= $wpdb->prepare(" %1s ='%d'",array($key,$value));
260
 
 
261
  if ( $i < $count ) {
262
  $sql .= ' , ';
263
  }
264
  $i ++;
265
  }
266
+ $sql .= $wpdb->prepare(" WHERE user_id= %d;",array($user_id));
267
  $wpdb->query( $sql );
268
 
269
  return;
272
 
273
  function insert_user_login_session( $session_id ) {
274
  global $wpdb;
275
+ $sql = $wpdb->prepare("INSERT INTO $this->userLoginInfoTable (session_id) VALUES('$session_id') ON DUPLICATE KEY UPDATE session_id= %s",array($session_id));
276
 
277
  $wpdb->query( $sql );
278
  $sql = "DELETE FROM $this->userLoginInfoTable WHERE ts_created < DATE_ADD(NOW(),INTERVAL - 2 MINUTE);";
285
  $sql = "UPDATE " . $this->userLoginInfoTable . " SET ";
286
  $i = 1;
287
  foreach ( $user_values as $key => $value ) {
288
+ if($key == 'session_id' || $key == 'ts_created')
289
+ $sql .= $wpdb->prepare(" %1s ='%d'",array($key,$value));
290
+ else
291
+ $sql .= $wpdb->prepare(" %1s ='%s'",array($key,$value));
292
  if ( $i < $count ) {
293
  $sql .= ' , ';
294
  }
295
  $i ++;
296
  }
297
+ $sql .= $wpdb->prepare(" WHERE session_id='%s';",array($session_id));
298
  $wpdb->query( $sql );
299
 
300
  return;
310
 
311
  function get_user_login_details( $column_name, $session_id ) {
312
  global $wpdb;
313
+ $user_column_detail = $wpdb->get_results( $wpdb->prepare("SELECT %1s FROM " . $this->userLoginInfoTable . " WHERE session_id = '%s';",array($column_name,$session_id)) );
314
  $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
315
 
316
  return $value == '' ? '' : $value[ $column_name ];
317
  }
318
  function get_user_configured_methods( $user_id ) {
319
  global $wpdb;
320
+ $user_methods_detail = $wpdb->get_results( $wpdb->prepare("SELECT * FROM " . $this->userDetailsTable . " WHERE user_id = %d;",array($user_id)) );
321
  return $user_methods_detail;
322
  }
323
 
324
  function delete_user_login_sessions($session_id ) {
325
  global $wpdb;
326
  $wpdb->query(
327
+ $wpdb->prepare("DELETE FROM " . $this->userLoginInfoTable . " WHERE session_id=%s;",array($session_id))
 
328
  );
329
 
330
  return;
338
  );
339
 
340
  $user_already_configured = $wpdb->query(
341
+ $wpdb->prepare("SELECT meta_key FROM ".$wpdb->base_prefix ."usermeta WHERE meta_key = 'currentMethod' and user_id =%d",array($user_id))
342
+ );
343
 
344
  if($value < 3 || $user_already_configured){
345
  return false;
355
  "SELECT * FROM ".$this->userDetailsTable
356
  );
357
  $user_already_configured = $wpdb->query(
358
+ $wpdb->prepare("SELECT * FROM ".$this->userDetailsTable ." WHERE user_id = %d",array($user_id))
359
+ );
360
 
361
  if($value < 3 || $user_already_configured){
362
  return false;
database/mo2f_db_options.php CHANGED
@@ -13,20 +13,9 @@ $GLOBALS['mo2f_enable_xmlrpc'] = 0;
13
  $GLOBALS['mo2f_custom_plugin_name'] = 'miniOrange 2-Factor';
14
  $GLOBALS['mo2f_show_sms_transaction_message'] = 0;
15
  $GLOBALS['mo2f_enforce_strong_passswords_for_accounts'] = 'all';
16
- $GLOBALS['mo_file_backup_plugins'] = 1;
17
- $GLOBALS['mo_file_backup_themes'] = 1;
18
- $GLOBALS['mo_wpns_backup_time'] = 12;
19
- $GLOBALS['scheduled_file_backup'] = 0;
20
- $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['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;
28
- $GLOBALS['mo_file_manual_backup_themes'] = 1;
29
- $GLOBALS['mo_schedule_database_backup'] = 1;
30
  $GLOBALS['mo_wpns_2fa_with_network_security'] = 0;
31
  $GLOBALS['mo_wpns_2fa_with_network_security_popup_visible'] = 1;
32
  $GLOBALS['mo2f_two_factor_tour'] = -1;
13
  $GLOBALS['mo2f_custom_plugin_name'] = 'miniOrange 2-Factor';
14
  $GLOBALS['mo2f_show_sms_transaction_message'] = 0;
15
  $GLOBALS['mo2f_enforce_strong_passswords_for_accounts'] = 'all';
 
 
 
 
 
 
 
16
  $GLOBALS['mo2f_inline_registration'] = 1;
17
  $GLOBALS['mo2f_nonce_enable_configured_methods'] = true;
 
18
  $GLOBALS['mo_wpns_scan_initialize'] = 1;
 
 
 
19
  $GLOBALS['mo_wpns_2fa_with_network_security'] = 0;
20
  $GLOBALS['mo_wpns_2fa_with_network_security_popup_visible'] = 1;
21
  $GLOBALS['mo2f_two_factor_tour'] = -1;
handler/WAF/Includes/CrawlerIPs.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $googleBot = array('64.233.160.0 - 64.233.191.255','66.102.0.0 - 66.102.15.255','66.249.80.0 - 66.249.95.255','72.14.192.0 - 72.14.255.255','74.125.0.0 - 74.125.255.255','108.177.8.0 - 108.177.15.255','172.217.0.0 - 172.217.31.255','173.194.0.0 - 173.194.255.255','207.126.144.0 - 207.126.159.255','209.85.128.0 - 209.85.255.255','216.58.192.0 - 216.58.223.255','216.239.32.0 - 216.239.63.255');
3
+
4
+ $googleBotV6 = array('2001:4860:4000:0:0:0:0:0 - 2001:4860:4fff:ffff:ffff:ffff:ffff:ffff','2404:6800:4000:0:0:0:0:0 - 2404:6800:4fff:ffff:ffff:ffff:ffff:ffff','2607:f8b0:4000:0:0:0:0:0 - 2607:f8b0:4fff:ffff:ffff:ffff:ffff:ffff','2800:3f0:4000:0:0:0:0:0 - 2800:3f0:4fff:ffff:ffff:ffff:ffff:ffff','2a00:1450:4000:0:0:0:0:0 - 2a00:1450:4fff:ffff:ffff:ffff:ffff:ffff','2c0f:fb50:4000:0:0:0:0:0 - 2c0f:fb50:4fff:ffff:ffff:ffff:ffff:ffff');
5
+
6
+ $facebookBot = array('69.63.176.1 - 69.63.183.254','69.63.184.1 - 69.63.191.254','66.220.144.1 - 66.220.159.254','69.63.176.1 - 69.63.191.254');
7
+
8
+ $facebookBotV6 = array('2620:0000:1c00:0000:0000:0000:0000:0000 - 2620:0000:1cff:ffff:ffff:ffff:ffff:ffff' , '2a03:2880:0000:0000:0000:0000:0000:0000 - 2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff','2a03:2880:fffe:0000:0000:0000:0000:0000 - 2a03:2880:fffe:ffff:ffff:ffff:ffff:ffff','2a03:2880:ffff:0000:0000:0000:0000:0000 - 2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff','2620:0000:1cff:0000:0000:0000:0000:0000 - 2620:0000:1cff:ffff:ffff:ffff:ffff:ffff');
9
+
10
+ $bingBot = array('65.52.104.1 - 65.52.104.254','65.52.108.1 - 65.52.108.254','65.55.24.1 - 65.55.24.254','65.55.52.1 - 65.55.52.254','65.55.55.1 - 65.55.55.254','65.55.213.1 - 65.55.213.254','65.55.217.1 - 65.55.217.254','131.253.24.1 - 131.253.27.254','131.253.46.1 - 131.253.47.254','40.77.167.1 - 40.77.167.254','199.30.27.1 - 199.30.27.254','157.55.16.1 - 157.55.17.254','157.55.18.1 - 157.55.18.254','157.55.32.1 - 157.55.35.254','157.55.36.1 - 157.55.36.254','157.55.48.1 - 157.55.48.254','157.55.109.1 - 157.55.109.254','157.55.110.41 - 157.55.110.46','157.55.110.49 - 157.55.110.62','157.56.92.1 - 157.56.92.254' ,'157.56.93.1 - 157.56.93.254','157.56.94.1 - 157.56.95.254','157.56.229.1 - 157.56.229.254','199.30.16.1 - 199.30.16.254' , '207.46.12.1 - 207.46.13.254','207.46.192.1 - 207.46.192.254' ,'207.46.195.1 - 207.46.195.254','207.46.199.1 - 207.46.199.254','207.46.204.1 - 207.46.204.254','157.55.39.1 - 157.55.39.254');
11
+
12
+ $statusCake = array("103.194.112.70","104.131.247.151","104.131.248.65","104.131.248.78","104.156.229.24","104.156.255.184","104.206.168.26","104.238.164.105","107.150.1.135","107.155.104.182","107.155.108.234","107.155.125.29","107.161.28.219","107.170.197.248","107.170.219.46","107.170.227.23","107.170.227.24","107.170.240.141","107.170.53.191","107.191.47.131","107.191.57.237","108.61.119.153","108.61.162.214","108.61.205.201","108.61.212.141","108.61.215.179","125.63.48.239","128.199.222.65","138.197.130.232","138.197.130.235","138.197.140.243","138.204.171.136","138.68.24.115","138.68.24.136","138.68.24.207","138.68.24.60","138.68.80.10","138.68.80.173","139.59.15.79","139.59.155.26","139.59.190.241","139.59.22.109","139.59.26.85","139.59.29.167","149.154.157.61","149.255.59.100","151.236.10.238","151.236.18.80","151.80.175.223","151.80.175.226","154.127.60.23","154.127.60.59","158.255.208.76","159.203.182.22","159.203.182.60","159.203.186.225","159.203.31.18","162.243.247.163","162.243.71.56","162.248.97.72","162.253.64.104","162.253.64.87","176.56.230.110","178.62.101.57","178.62.104.137","178.62.106.84","178.62.109.7","178.62.40.233","178.62.41.44","178.62.41.49","178.62.41.52","178.62.65.162","178.62.71.227","178.62.78.199","178.62.80.93","178.62.86.69","178.73.210.99","181.41.201.117","181.41.214.137","185.112.157.185","185.12.45.70","185.47.129.168","185.60.135.86","188.166.158.224","188.166.253.148","188.226.139.158","188.226.158.160","188.226.169.228","188.226.171.58","188.226.184.152","188.226.185.106","188.226.186.199","188.226.203.84","188.226.247.184","188.68.238.79","192.241.221.11","193.124.178.54","193.124.178.61","193.182.144.105","193.182.144.147","199.167.128.80","209.222.30.242","213.183.56.107","217.148.43.188","217.148.43.202","31.220.7.237","37.157.246.146","37.235.48.42","37.235.52.25","37.235.53.240","37.235.55.205","37.97.188.103","45.32.128.80","45.32.145.79","45.32.151.21","45.32.160.172","45.32.166.195","45.32.171.24","45.32.192.198","45.32.195.186","45.32.195.93","45.32.212.56","45.32.36.158","45.32.7.22","45.63.121.159","45.63.26.78","45.63.51.63","45.63.61.213","45.63.76.68","45.63.78.84","45.63.86.120","45.63.88.213","45.76.1.44","45.76.192.50","45.76.3.112","46.101.0.24","46.101.110.32","46.101.110.43","46.101.110.45","46.101.20.96","46.101.238.182","46.101.238.189","46.101.240.208","46.101.27.186","46.101.61.83","46.101.74.251","5.45.179.103","50.2.139.16","82.221.95.161","91.236.116.163");
handler/WAF/database/mo-waf-plugin-db.php CHANGED
@@ -43,7 +43,7 @@
43
  function mo_wpns_getRLEAttack($ipaddress)
44
  {
45
  global $wpdb;
46
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
47
  $results = $wpdb->get_results($query);
48
  return $results[0]->time;
49
  }
@@ -51,9 +51,9 @@
51
  {
52
  global $wpdb;
53
  $value = htmlspecialchars($value);
54
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
55
  $results = $wpdb->get_results($query);
56
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
57
  $results = $wpdb->get_results($query);
58
  return $results[0]->count;
59
  }
@@ -65,7 +65,7 @@
65
  $time = 60;
66
  mo_wpns_clearRate($time);
67
  mo_wpns_insertRate($ipaddress);
68
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
69
  $results = $wpdb->get_results($query);
70
 
71
  if(isset($results[0]->count))
@@ -78,13 +78,13 @@
78
  function mo_wpns_clearRate($time)
79
  {
80
  global $wpdb;
81
- $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
82
  $results = $wpdb->get_results($query);
83
  }
84
  function mo_wpns_insertRate($ipaddress)
85
  {
86
  global $wpdb;
87
- $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
88
  $results = $wpdb->get_results($query);
89
  }
90
 
43
  function mo_wpns_getRLEAttack($ipaddress)
44
  {
45
  global $wpdb;
46
+ $query = $wpdb->prepare("select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='%s' ORDER BY time DESC LIMIT 1;",array($ipaddress));
47
  $results = $wpdb->get_results($query);
48
  return $results[0]->time;
49
  }
51
  {
52
  global $wpdb;
53
  $value = htmlspecialchars($value);
54
+ $query = $wpdb->prepare('insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("%s","%s",%d,"%s");',array($ipaddress,$value1,time(),$value));
55
  $results = $wpdb->get_results($query);
56
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='%s' and input != 'RLE';",array($ipaddress));
57
  $results = $wpdb->get_results($query);
58
  return $results[0]->count;
59
  }
65
  $time = 60;
66
  mo_wpns_clearRate($time);
67
  mo_wpns_insertRate($ipaddress);
68
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='%s';",array($ipaddress));
69
  $results = $wpdb->get_results($query);
70
 
71
  if(isset($results[0]->count))
78
  function mo_wpns_clearRate($time)
79
  {
80
  global $wpdb;
81
+ $query = $wpdb->prepare("delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time< %d",array(time()-$time));
82
  $results = $wpdb->get_results($query);
83
  }
84
  function mo_wpns_insertRate($ipaddress)
85
  {
86
  global $wpdb;
87
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('%s',%d);",array($ipaddress,time()));
88
  $results = $wpdb->get_results($query);
89
  }
90
 
handler/WAF/mo-waf-plugin.php CHANGED
@@ -14,9 +14,9 @@
14
  include_once($wafDB);
15
 
16
 
17
- global $wpdb,$mowpnshandle;
18
  $mowpnshandle = new MoWpnsHandler();
19
- $ipaddress = get_ipaddress();
20
  $ipaddress = sanitize_text_field($ipaddress);
21
  if($mowpnshandle->mo_wpns_is_ip_blocked($ipaddress))
22
  {
@@ -34,7 +34,8 @@
34
  }
35
  if(isset($RateLimiting) and $RateLimiting == 1)
36
  {
37
- if(!is_crawler())
 
38
  {
39
  mo_wpns_apply_RateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
40
  }
@@ -43,9 +44,9 @@
43
  {
44
  if($RateLimitingCrawler == 1)
45
  {
46
- if(is_crawler())
47
  {
48
- if(is_fake_googlebot($ipaddress))
49
  {
50
  header('HTTP/1.1 403 Forbidden');
51
  include_once($errorPage);
@@ -59,6 +60,16 @@
59
  }
60
  }
61
  }
 
 
 
 
 
 
 
 
 
 
62
  $attack = array();
63
  if(isset($SQL) )
64
  {
@@ -170,7 +181,7 @@
170
  include($filename);
171
  }
172
  global $wpdb,$mowpnshandle;
173
- $USER_AGENT = isset($_SERVER['HTTP_USER_AGENT'])?sanitize_text_field($_SERVER['HTTP_USER_AGENT']):'';
174
  if(isset($RateLimitingCrawler))
175
  {
176
  if($RateLimitingCrawler=='1')
@@ -186,7 +197,7 @@
186
  $current_time = time();
187
  if($current_time>$lastAttack && sanitize_text_field($_SERVER['HTTP_USER_AGENT'])!='')
188
  {
189
- mo_wpns_log_attack($ipaddress,'RLECrawler',$USER_AGENT);
190
  }
191
  if($action != 'ThrottleIP')
192
  {
14
  include_once($wafDB);
15
 
16
 
17
+ global $wpdb,$mowpnshandle,$moWpnsUtility;
18
  $mowpnshandle = new MoWpnsHandler();
19
+ $ipaddress = $moWpnsUtility->get_client_ip();
20
  $ipaddress = sanitize_text_field($ipaddress);
21
  if($mowpnshandle->mo_wpns_is_ip_blocked($ipaddress))
22
  {
34
  }
35
  if(isset($RateLimiting) and $RateLimiting == 1)
36
  {
37
+
38
+ if(!mo2f_is_crawler())
39
  {
40
  mo_wpns_apply_RateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
41
  }
44
  {
45
  if($RateLimitingCrawler == 1)
46
  {
47
+ if(mo2f_is_crawler())
48
  {
49
+ if(mo2f_is_fake_googlebot($ipaddress))
50
  {
51
  header('HTTP/1.1 403 Forbidden');
52
  include_once($errorPage);
60
  }
61
  }
62
  }
63
+ if(mo2f_is_crawler())
64
+ {
65
+ if(mo2f_is_fake_bot($ipaddress))
66
+ {
67
+ header('HTTP/1.1 403 Forbidden');
68
+ include_once($errorPage);
69
+ exit;
70
+ }
71
+
72
+ }
73
  $attack = array();
74
  if(isset($SQL) )
75
  {
181
  include($filename);
182
  }
183
  global $wpdb,$mowpnshandle;
184
+ $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?sanitize_text_field($_SERVER['HTTP_USER_AGENT']):'';
185
  if(isset($RateLimitingCrawler))
186
  {
187
  if($RateLimitingCrawler=='1')
197
  $current_time = time();
198
  if($current_time>$lastAttack && sanitize_text_field($_SERVER['HTTP_USER_AGENT'])!='')
199
  {
200
+ mo_wpns_log_attack($ipaddress,'RLECrawler',$user_agent);
201
  }
202
  if($action != 'ThrottleIP')
203
  {
handler/WAF/mo-waf.php CHANGED
@@ -10,14 +10,19 @@
10
  include_once($wafInclude);
11
  include_once($wafdb);
12
 
13
- global $dbcon,$prefix;
14
  $connection = mo_wpns_dbconnection();
15
  if($connection)
16
  {
17
  $wafLevel = mo_wpns_get_option_value('WAF');
18
  if($wafLevel=='HtaccessLevel')
19
  {
20
- $ipaddress = get_ipaddress();
 
 
 
 
 
21
  if(mo_wpns_is_ip_blocked($ipaddress))
22
  {
23
  if(!mo_wpns_is_ip_whitelisted($ipaddress))
@@ -35,7 +40,7 @@
35
  }
36
  if(isset($RateLimiting) && $RateLimiting == 1)
37
  {
38
- if(!is_crawler())
39
  {
40
  if(isset($RequestsPMin) && isset($actionRateL))
41
  mo_wpns_applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
@@ -43,9 +48,9 @@
43
  }
44
  if(isset($RateLimitingCrawler) && $RateLimitingCrawler == 1)
45
  {
46
- if(is_crawler())
47
  {
48
- if(is_fake_googlebot($ipaddress))
49
  {
50
  header('HTTP/1.1 403 Forbidden');
51
  include_once($errorPage);
@@ -135,7 +140,20 @@
135
  }
136
  }
137
 
138
-
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  function mo_wpns_applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
140
  {
141
  global $dbcon, $prefix;
@@ -168,7 +186,8 @@
168
  include($filename);
169
  }
170
  global $dbcon,$prefix;
171
- $USER_AGENT = sanitize_text_field($_SERVER['HTTP_USER_AGENT']);
 
172
  if(isset($RateLimitingCrawler))
173
  {
174
  if(isset($RateLimitingCrawler) && $RateLimitingCrawler=='1')
@@ -184,7 +203,7 @@
184
  $current_time = time();
185
  if($current_time>$lastAttack)
186
  {
187
- mo_wpns_log_attack($ipaddress,'RLECrawler',$USER_AGENT);
188
  }
189
  if($action != 'ThrottleIP')
190
  {
10
  include_once($wafInclude);
11
  include_once($wafdb);
12
 
13
+ global $dbcon,$prefix,$moWpnsUtility;
14
  $connection = mo_wpns_dbconnection();
15
  if($connection)
16
  {
17
  $wafLevel = mo_wpns_get_option_value('WAF');
18
  if($wafLevel=='HtaccessLevel')
19
  {
20
+ if((isset($_SERVER['REMOTE_ADDR']) && is_string($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) && mo2f_isValidIP($_SERVER['REMOTE_ADDR'])))
21
+ {
22
+ $ipaddress = get_unique_ip($_SERVER['REMOTE_ADDR']);
23
+ }else{
24
+ $ipaddress = 'UNKNOWN';
25
+ }
26
  if(mo_wpns_is_ip_blocked($ipaddress))
27
  {
28
  if(!mo_wpns_is_ip_whitelisted($ipaddress))
40
  }
41
  if(isset($RateLimiting) && $RateLimiting == 1)
42
  {
43
+ if(!mo2f_is_crawler())
44
  {
45
  if(isset($RequestsPMin) && isset($actionRateL))
46
  mo_wpns_applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
48
  }
49
  if(isset($RateLimitingCrawler) && $RateLimitingCrawler == 1)
50
  {
51
+ if(mo2f_is_crawler())
52
  {
53
+ if(mo2f_is_fake_googlebot($ipaddress))
54
  {
55
  header('HTTP/1.1 403 Forbidden');
56
  include_once($errorPage);
140
  }
141
  }
142
 
143
+ function get_unique_ip($IP){
144
+ $IP = explode(',',$IP);
145
+ if(is_array($IP))
146
+ return filter_var($IP[0], FILTER_VALIDATE_IP);
147
+ return filter_var($IP, FILTER_VALIDATE_IP);
148
+ }
149
+
150
+ function mo2f_isValidIP($IP){
151
+ $new_ip = explode(',',$IP);
152
+ if(is_array($new_ip))
153
+ $IP = $new_ip[0];
154
+ return filter_var(get_unique_ip($IP), FILTER_VALIDATE_IP) !== false;
155
+ }
156
+
157
  function mo_wpns_applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
158
  {
159
  global $dbcon, $prefix;
186
  include($filename);
187
  }
188
  global $dbcon,$prefix;
189
+
190
+ $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?filter_var($_SERVER['HTTP_USER_AGENT'], FILTER_SANITIZE_STRING):'';
191
  if(isset($RateLimitingCrawler))
192
  {
193
  if(isset($RateLimitingCrawler) && $RateLimitingCrawler=='1')
203
  $current_time = time();
204
  if($current_time>$lastAttack)
205
  {
206
+ mo_wpns_log_attack($ipaddress,'RLECrawler',$user_agent);
207
  }
208
  if($action != 'ThrottleIP')
209
  {
handler/WAF/waf-include.php CHANGED
@@ -22,62 +22,218 @@
22
  include_once($xssFile);
23
  include_once($lfiFile);
24
 
25
- function mo2f_isValidIP($IP)
26
- {
27
- return filter_var($IP, FILTER_VALIDATE_IP) !== false;
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- function get_ipaddress()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  {
32
- $ipaddress = '';
33
- if (isset($_SERVER['HTTP_CLIENT_IP']) && mo2f_isValidIP($_SERVER['HTTP_CLIENT_IP']))
34
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_CLIENT_IP']);
35
- elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED_FOR']))
36
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED_FOR']);
37
- elseif(isset($_SERVER['HTTP_X_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED']))
38
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED']);
39
- elseif(isset($_SERVER['HTTP_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED_FOR']))
40
- {
41
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED_FOR']);
42
- $ipaddress = explode(",", $ipaddress)[0];
43
- }
44
- elseif(isset($_SERVER['HTTP_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED']))
45
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED']);
46
- elseif(isset($_SERVER['REMOTE_ADDR']) && mo2f_isValidIP($_SERVER['REMOTE_ADDR']))
47
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['REMOTE_ADDR']);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  else
49
- $ipaddress = 'UNKNOWN';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- return $ipaddress;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
- function is_crawler()
 
54
  {
55
- $USER_AGENT = isset($_SERVER['HTTP_USER_AGENT'])?filter_input(INPUT_SERVER,$_SERVER['HTTP_USER_AGENT']):'';
56
- $Botsign = array('bot','apache','crawler','elinks','http', 'java', 'spider','link','fetcher','scanner','grabber','collector','capture','seo','.com');
57
- foreach ($Botsign as $key => $value)
 
58
  {
59
- if(isset($USER_AGENT) || preg_match('/'.$value.'/', $USER_AGENT))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  {
61
  return true;
62
  }
63
- }
 
64
  return false;
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
- function is_fake_googlebot($ipaddress)
 
67
  {
68
- $USER_AGENT = isset($_SERVER['HTTP_USER_AGENT'])? sanitize_text_field($_SERVER['HTTP_USER_AGENT']):'';
69
- if(isset($USER_AGENT) || preg_match('/Googlebot/', $USER_AGENT))
70
  {
71
- if(is_fake('Googlebot',$USER_AGENT,$ipaddress))
 
 
72
  {
73
- header('HTTP/1.1 403 Forbidden');
74
- include_once("mo-error.html");
75
- exit;
76
  }
 
77
  }
78
- }
79
- function is_fake($crawler,$USER_AGENT,$ipaddress)
80
- {
81
-
82
  }
83
  ?>
22
  include_once($xssFile);
23
  include_once($lfiFile);
24
 
25
+ function mo2f_is_crawler()
26
+ {
27
+
28
+ $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?filter_var($_SERVER['HTTP_USER_AGENT'], FILTER_SANITIZE_STRING):'';
29
+ $Botsign = array('bot','apache','crawler','elinks','http', 'java', 'spider','link','fetcher','scanner','grabber','collector','capture','seo','.com');
30
+ foreach ($Botsign as $key => $value)
31
+ {
32
+ if(isset($user_agent) && preg_match('/'.$value.'/', $user_agent))
33
+ {
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+ function mo2f_is_fake_bot($ipaddress)
40
+ {
41
+ $bing = false;
42
+ $fb = false;
43
+ $google = false;
44
+ $status = false;
45
 
46
+ $bing = mo2f_is_fake_bing_bot($ipaddress);
47
+ $fb = mo2f_is_fake_FB_crawler($ipaddress);
48
+ $google = mo2f_is_fake_googlebot($ipaddress);
49
+ $status = mo2f_is_fake_statusCake($ipaddress);
50
+
51
+ return $google or $fb or $bing or $status;
52
+
53
+ }
54
+ function mo2f_is_fake_statusCake($ipaddress)
55
+ {
56
+ $user_agent = sanitize_text_field($_SERVER['HTTP_USER_AGENT']);
57
+ if(preg_match('/StatusCake/', $user_agent))
58
+ {
59
+ return mo2f_is_fake_status($ipaddress);
60
+ }
61
+ return false;
62
+ }
63
+ function mo2f_is_fake_googlebot($ipaddress)
64
+ {
65
+
66
+ $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?filter_var($_SERVER['HTTP_USER_AGENT'], FILTER_SANITIZE_STRING):'';
67
+ if(preg_match('/Googlebot/', $user_agent))
68
+ {
69
+ return mo2f_is_fake_google('Googlebot',$user_agent,$ipaddress);
70
+ }
71
+ return false;
72
+ }
73
+ function mo2f_is_fake_FB_crawler($ipaddress)
74
  {
75
+ $user_agent = sanitize_text_field($_SERVER['HTTP_USER_AGENT']);
76
+ if(preg_match('/Facebot/', $user_agent))
77
+ {
78
+ return mo2f_is_fake_fb('Facebot',$user_agent,$ipaddress);
79
+ }
80
+ else if(preg_match('/facebookexternalhit/', $user_agent))
81
+ {
82
+ return mo2f_is_fake_fb('facebookexternalhit',$user_agent,$ipaddress);
83
+ }
84
+ return false;
85
+ }
86
+ function mo2f_is_fake_bing_bot($ipaddress)
87
+ {
88
+ $user_agent = sanitize_text_field($_SERVER['HTTP_USER_AGENT']);
89
+ if(preg_match('/bingbot/', $user_agent))
90
+ {
91
+ return mo2f_is_fake_bing('bingbot',$user_agent,$ipaddress);
92
+ }
93
+ return false;
94
+ }
95
+ function mo2f_is_fake_status($ipaddress)
96
+ {
97
+ $dir = dirname(dirname(__FILE__));
98
+ $IPList = $dir.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'Includes'.DIRECTORY_SEPARATOR.'CrawlerIPs.php';
99
+ include($IPList);
100
+ $currentIP = '';
101
+ if(strlen(inet_pton($ipaddress)) == 16)
102
+ {
103
+ $currentIP = mo2f_ipaddress_to_ipnumber(trim($ipaddress));
104
+ }
105
  else
106
+ {
107
+ $currentIP = ip2long(trim($ipaddress));
108
+ }
109
+ foreach ($statusCake as $index => $IP)
110
+ {
111
+ $ip = ip2long(trim($IP));
112
+ if($ip == $currentIP)
113
+ {
114
+ return false;
115
+ }
116
+ }
117
+ return true;
118
+ }
119
+
120
+ function mo2f_is_fake_google($crawler,$user_agent,$ipaddress)
121
+ {
122
+ $dir = dirname(dirname(__FILE__));
123
+ $IPList = $dir.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'Includes'.DIRECTORY_SEPARATOR.'CrawlerIPs.php';
124
+ include($IPList);
125
+ if(strlen(inet_pton($ipaddress)) == 4)
126
+ {
127
+ foreach ($googleBot as $index => $range)
128
+ {
129
+ if(mo2f_check_current_IP_in_range($range,$ipaddress))
130
+ {
131
+ return false;
132
+ }
133
+ }
134
+ }
135
+ else if(strlen(inet_pton($ipaddress)) == 16)
136
+ {
137
+ foreach ($googleBotV6 as $index => $range)
138
+ {
139
+ if(mo2f_check_current_IP_in_rangeV6($range,$ipaddress))
140
+ {
141
+ return false;
142
+ }
143
+ }
144
+ }
145
+ return true;
146
+ }
147
 
148
+ function mo2f_is_fake_bing($crawler,$user_agent,$ipaddress)
149
+ {
150
+ $dir = dirname(dirname(__FILE__));
151
+ $IPList = $dir.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'Includes'.DIRECTORY_SEPARATOR.'CrawlerIPs.php';
152
+ include($IPList);
153
+ if(strlen(inet_pton($ipaddress)) == 4)
154
+ {
155
+ foreach ($bingBot as $index => $range)
156
+ {
157
+ if(mo2f_check_current_IP_in_range($range,$ipaddress))
158
+ {
159
+ return false;
160
+ }
161
+ }
162
+ }
163
+ return true;
164
  }
165
+
166
+ function mo2f_is_fake_fb($crawler,$user_agent,$ipaddress)
167
  {
168
+ $dir = dirname(dirname(__FILE__));
169
+ $IPList = $dir.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'Includes'.DIRECTORY_SEPARATOR.'CrawlerIPs.php';
170
+ include($IPList);
171
+ if(strlen(inet_pton($ipaddress)) == 4)
172
  {
173
+ foreach ($facebookBot as $index => $range)
174
+ {
175
+ if(mo2f_check_current_IP_in_range($range,$ipaddress))
176
+ {
177
+ return false;
178
+ }
179
+ }
180
+ }
181
+ else if(strlen(inet_pton($ipaddress)) == 16)
182
+ {
183
+ foreach ($facebookBotV6 as $index => $range)
184
+ {
185
+ if(mo2f_check_current_IP_in_rangeV6($range,$ipaddress))
186
+ {
187
+ return false;
188
+ }
189
+ }
190
+ }
191
+ return true;
192
+ }
193
+
194
+ function mo2f_check_current_IP_in_rangeV6($range , $ipaddress)
195
+ {
196
+ $rangearray = explode(" - ",$range);
197
+ if(sizeof($rangearray)==2)
198
+ {
199
+ $lowip = mo2f_ipaddress_to_ipnumber(trim($rangearray[0]));
200
+ $highip = mo2f_ipaddress_to_ipnumber(trim($rangearray[1]));
201
+ $currentIP = mo2f_ipaddress_to_ipnumber(trim($ipaddress));
202
+
203
+ if($currentIP>=$lowip && $currentIP<=$highip)
204
  {
205
  return true;
206
  }
207
+ return false;
208
+ }
209
  return false;
210
+
211
+ }
212
+
213
+ function mo2f_ipaddress_to_ipnumber($ipaddress)
214
+ {
215
+ $pton = @inet_pton($ipaddress);
216
+ if (!$pton) { return false; }
217
+ $number = '';
218
+ foreach (unpack('C*', $pton) as $byte) {
219
+ $number .= str_pad(decbin($byte), 8, '0', STR_PAD_LEFT);
220
+ }
221
+ return base_convert(ltrim($number, '0'), 2, 10);
222
  }
223
+
224
+ function mo2f_check_current_IP_in_range($range, $ipaddress)
225
  {
226
+ $rangearray = explode(" - ",$range);
227
+ if(sizeof($rangearray)==2)
228
  {
229
+ $lowip = ip2long(trim($rangearray[0]));
230
+ $highip = ip2long(trim($rangearray[1]));
231
+ if(ip2long(trim($ipaddress))>=$lowip && ip2long(trim($ipaddress))<=$highip)
232
  {
233
+ return true;
 
 
234
  }
235
+ return false;
236
  }
237
+ return false;
 
 
 
238
  }
239
  ?>
handler/backup.php DELETED
@@ -1,322 +0,0 @@
1
- <?php
2
-
3
- class MoBackupSite{
4
-
5
- function __construct()
6
- {
7
- add_filter( 'cron_schedules', array($this,'db_eb_backup_interval'));
8
- add_action( 'mo_eb_bl_cron_hook', array($this,'db_cron_backup') );
9
- add_filter( 'cron_schedules', array($this,'file_eb_backup_interval'));
10
- add_action( 'mo_eb_file_cron_hook', array($this,'file_cron_backup') );
11
- }
12
-
13
- function db_cron_backup(){
14
-
15
- $obj = new MoBackupSite;
16
- $obj->backupDB();
17
-
18
- }
19
-
20
- function db_eb_backup_interval($schedules){
21
- $mo2f_cron_hours = MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option')*3600;
22
- $schedules['db_eb_backup_time'] = array(
23
- 'interval' => $mo2f_cron_hours,
24
- 'display' => esc_html__( 'Cron Activated' ),
25
- );
26
- return $schedules;
27
- }
28
-
29
- function bl_deactivate() {
30
- $timestamp = wp_next_scheduled( 'mo_eb_bl_cron_hook' );
31
- wp_unschedule_event( $timestamp, 'mo_eb_bl_cron_hook' );
32
- }
33
-
34
- function file_cron_backup(){
35
- $backup_store_path = wp_upload_dir();
36
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
37
- $time = time();
38
- update_site_option('backup_created_time',$time);
39
-
40
- if(MoWpnsUtility::get_mo2f_db_option('mo_file_backup_plugins', 'site_option') =='1'){
41
- $this->plugin_backup($backup_store_path, $time);
42
- }
43
- if(MoWpnsUtility::get_mo2f_db_option('mo_file_backup_themes','site_option') =='1'){
44
- $this->themes_backup($backup_store_path ,$time);
45
- }
46
-
47
- if(get_site_option('mo_file_backup_wp_files') == '1'){
48
- $this->wpfiles_backup($backup_store_path, $time);
49
- }
50
- update_site_option('backup_notification_option',1);
51
- }
52
-
53
- function file_manual_backup(){
54
- $backup_store_path = wp_upload_dir();
55
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
56
- $time = time();
57
- update_site_option('backup_created_time',$time);
58
-
59
- if(MoWpnsUtility::get_mo2f_db_option('mo_file_manual_backup_plugins', 'site_option') =='1'){
60
- // if(get_option('mo_file_manual_backup_plugins') =='1'){
61
- $this->plugin_backup($backup_store_path, $time);
62
- }
63
- if(MoWpnsUtility::get_mo2f_db_option('mo_file_manual_backup_themes', 'site_option') =='1'){
64
- // if(get_option('mo_file_manual_backup_themes') =='1'){
65
- $this->themes_backup($backup_store_path ,$time);
66
- }
67
-
68
- if(get_site_option('mo_file_manual_backup_wp_files') == '1'){
69
- $this->wpfiles_backup($backup_store_path, $time);
70
- }
71
- update_site_option('backup_notification_option',1);
72
- }
73
-
74
- function file_eb_backup_interval($schedules){
75
- $mo2f_cron_file_backup_hours = MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option')*3600;
76
- $schedules['file_eb_backup_time'] = array(
77
- 'interval' => $mo2f_cron_file_backup_hours,
78
- 'display' => esc_html__( 'Cron Activated' ),
79
- );
80
- return $schedules;
81
- }
82
-
83
- function file_backup_deactivate(){
84
- $timestamp = wp_next_scheduled( 'mo_eb_file_cron_hook' );
85
- wp_unschedule_event( $timestamp, 'mo_eb_file_cron_hook' );
86
- }
87
-
88
- function plugin_backup($backup_store_path, $time){
89
- global $wpnsDbQueries;
90
- $this->mkdirectory('plugins');
91
- $real_path= WP_PLUGIN_DIR;
92
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'plugins';
93
- $filename = 'miniorange-plugins-backup-'.$time.'.zip';
94
- $this->file_backup($real_path,$filename,'plugins');
95
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::PLUGIN,$filename,$time,$backup_path);
96
- }
97
-
98
- function themes_backup($backup_store_path ,$time){
99
- global $wpnsDbQueries;
100
- $this->mkdirectory('themes');
101
- $real_path= get_theme_root();
102
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'themes';
103
- $filename = 'miniorange-themes-backup-'.$time.'.zip';
104
- $this->file_backup($real_path,$filename,'themes');
105
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::THEMES,$filename,$time,$backup_path);
106
-
107
- }
108
-
109
- function wpfiles_backup($backup_store_path, $time){
110
- global $wpnsDbQueries;
111
- $this->mkdirectory('wp_files');
112
- $homepath = get_home_path();
113
- $real_path= $homepath;
114
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'wp_files';
115
- $filename = 'miniorange-wpfiles-backup-'.$time.'.zip';
116
- $this->file_backup($real_path,$filename, 'wp_files');
117
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::WPFILES,$filename,$time,$backup_path);
118
- }
119
-
120
- function mkdirectory($foldername){
121
-
122
- $homepath = wp_upload_dir();
123
- $homepath = $homepath['basedir'].DIRECTORY_SEPARATOR;
124
- if(!is_writable($homepath)){
125
- wp_send_json('not_writable');
126
- return;
127
- }
128
-
129
-
130
- $basepath = $homepath;
131
- if(!file_exists($basepath."miniorangebackup")){
132
- mkdir($basepath."miniorangebackup");
133
- }
134
-
135
- $basepath = $homepath.'miniorangebackup'.DIRECTORY_SEPARATOR;
136
- $this-> create_index_file($basepath);
137
-
138
- if(!file_exists($basepath.'file-backups')){
139
- mkdir($basepath.'file-backups');
140
- }
141
-
142
- $basepath = $homepath.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR;
143
- if(!file_exists($basepath.$foldername)){
144
- mkdir($basepath.$foldername);
145
- }
146
-
147
- }
148
-
149
- function create_index_file($folder_path){
150
-
151
- $html_path=$folder_path."index.html";
152
- $htaccess_path= $folder_path.".htaccess";
153
-
154
- if(!file_exists($html_path)){
155
- $f = fopen($html_path, "a");
156
- fwrite($f, '<html><body><a href="https://security.miniorange.com/" target="_blank">WordPress backups by miniorange</a></body></html>');
157
- fclose($f);
158
- }
159
- if(!file_exists($htaccess_path)){
160
- $f = fopen($htaccess_path, "a");
161
- fwrite($f, "deny from all");
162
- fclose($f);
163
- }
164
- }
165
-
166
-
167
- function file_backup($real_path, $filename, $foldername){
168
- ini_set('max_execution_time', 0);
169
- $backup_store_path = wp_upload_dir();
170
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR;
171
- $rootPath = realpath($real_path);
172
- $zip = new ZipArchive();
173
- $res = $zip->open($backup_store_path.$foldername.DIRECTORY_SEPARATOR.$filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
174
-
175
- $files = new RecursiveIteratorIterator(
176
- new RecursiveDirectoryIterator($rootPath),
177
- RecursiveIteratorIterator::LEAVES_ONLY
178
- );
179
- foreach ($files as $name => $file)
180
- {
181
- if (!$file->isDir())
182
- {
183
- $filePath = $file->getRealPath();
184
- $relativePath = substr($filePath, strlen($rootPath) + 1);
185
- if(strpos($relativePath, 'miniorangebackup')!== false ){}
186
- else{
187
- $zip->addFile($filePath, $relativePath);
188
- }
189
- }
190
- }
191
- $zip->close();
192
- }
193
-
194
-
195
- function backupDB(){
196
-
197
- if ( function_exists('memory_get_usage') && ( (int) ini_get('memory_limit') < 128 ) ){
198
- ini_set('memory_limit', '128M' );
199
- do_action('mo_eb_show_message',MoBackupMessages::showMessage('DB_MEMORY_LIMIT'),'SUCCESS');
200
- }
201
-
202
- $backup_store_path = wp_upload_dir();
203
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
204
-
205
- if(!is_writable($backup_store_path)){
206
- wp_send_json('not_writable');
207
- return;
208
- }
209
- global $wpdb;
210
- $tables = $wpdb->get_results("SHOW TABLES", ARRAY_N);
211
- $nooftables = count($tables);
212
- $query = "";
213
- $tableswithfk = array();
214
- $tableswithoutfk= array();
215
-
216
- foreach($tables as $table)
217
- {
218
- if(is_array($table))
219
- $table = $table[0];
220
- $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
221
- if(!empty($createtable[0]))
222
- {
223
- $createquery = $createtable[0]['Create Table'];
224
- if (strpos($createquery, 'FOREIGN KEY') !== false)
225
- array_push($tableswithfk,$table);
226
- else
227
- array_push($tableswithoutfk, $table);
228
- }
229
- }
230
-
231
- $query .= $this->get_table_query($query,$tableswithoutfk);
232
-
233
- $query .= $this->get_table_query($query,$tableswithfk);
234
-
235
- $fileName = $this->create_db_backup_file($query);
236
- wp_send_json('created_backup');
237
- }
238
-
239
- function get_table_query($query,$tables)
240
- {
241
-
242
- global $wpdb;
243
- foreach($tables as $table)
244
- {
245
- $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
246
- if(!empty($createtable[0]))
247
- {
248
- $createquery = $createtable[0]['Create Table'];
249
- $query .= 'DROP TABLE IF EXISTS '.$table.";\n";
250
- $query .= $createquery.";\n\n";
251
- $data = $wpdb->get_results("SELECT * FROM $table", ARRAY_A);
252
- foreach($data as $record)
253
- {
254
- if(count($record)>0)
255
- {
256
- $query.= 'INSERT INTO '.$table.' VALUES(';
257
- $i=0;
258
- foreach($record as $key=>$value)
259
- {
260
- $value = addslashes($value);
261
- if (isset($value))
262
- $query.= '"'.$value.'"' ;
263
- else
264
- $query.= '""';
265
- if ($i < (count($record)-1)) { $query.= ','; }
266
- $i++;
267
- }
268
- $query.= ");\n";
269
- }
270
- }
271
- $query.="\n\n";
272
- }
273
- }
274
- return $query;
275
- }
276
-
277
- function create_db_backup_file($data)
278
- {
279
-
280
- global $wpnsDbQueries;
281
- $time = time();
282
- $backup_store_path = wp_upload_dir();
283
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
284
- if(!file_exists($backup_store_path."miniorangebackup")){
285
- mkdir($backup_store_path."miniorangebackup");
286
- }
287
- $basepath = $backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR;
288
- $handler_obj = new MoBackupSite;
289
- $handler_obj->create_index_file($basepath);
290
- if(!file_exists($basepath.'db-backups')){
291
- mkdir($basepath.'db-backups');
292
- }
293
-
294
- $backup_path = $basepath.'db-backups';
295
- $filename = 'miniorange-db-backup-'.$time.'.sql';
296
- $basepath = $basepath.'db-backups';
297
- $handle = fopen($basepath.DIRECTORY_SEPARATOR.$filename,'w+');
298
- fwrite($handle,$data);
299
- fclose($handle);
300
- $filezipname = $this->barfw_create_database_backup_zip_file($filename,$time);
301
- $zip_path = $basepath.DIRECTORY_SEPARATOR.$filename;
302
- unlink($zip_path);
303
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::DATABASE,$filezipname,$time,$backup_path);
304
- return $filename;
305
- }
306
-
307
- function barfw_create_database_backup_zip_file($filename,$time){
308
- $backup_store_path = wp_upload_dir();
309
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR.'miniorangebackup'.DIRECTORY_SEPARATOR.'db-backups'.DIRECTORY_SEPARATOR;
310
-
311
- $filezipname = 'miniorange-db-backup-'.$time.'.zip';
312
- $zip = new ZipArchive();
313
- $res = $zip->open($backup_store_path.DIRECTORY_SEPARATOR.$filezipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
314
- $filePath = $backup_store_path.$filename;
315
- $relativePath = $filename;
316
- $zip->addFile($filePath, $relativePath);
317
-
318
- $zip->close();
319
- return $filezipname;
320
- }
321
-
322
- }new MoBackupSite;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
handler/mo-waf-plugin.php CHANGED
@@ -1,9 +1,5 @@
1
  <?php
2
 
3
- function mo2f_isValidIP($IP){
4
- return filter_var($IP, FILTER_VALIDATE_IP) !== false;
5
- }
6
-
7
  $dir =dirname(__FILE__);
8
  $dir = str_replace('\\', "/", $dir);
9
  $sqlInjectionFile = $dir.'/signature/APSQLI.php';
@@ -27,32 +23,14 @@
27
  include_once($lfiFile);
28
 
29
 
30
- global $wpdb;
31
- $ipaddress = '';
32
- if (isset($_SERVER['HTTP_CLIENT_IP']) && mo2f_isValidIP($_SERVER['HTTP_CLIENT_IP']))
33
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_CLIENT_IP']);
34
- elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED_FOR']))
35
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED_FOR']);
36
- elseif(isset($_SERVER['HTTP_X_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED']))
37
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED']);
38
- elseif(isset($_SERVER['HTTP_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED_FOR']))
39
- {
40
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED_FOR']);
41
- $ipaddress = explode(",", $ipaddress)[0];
42
- }
43
- elseif(isset($_SERVER['HTTP_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED']))
44
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED']);
45
- elseif(isset($_SERVER['REMOTE_ADDR']) && mo2f_isValidIP($_SERVER['REMOTE_ADDR']))
46
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['REMOTE_ADDR']);
47
- else
48
- $ipaddress = 'UNKNOWN';
49
-
50
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
51
  $results = $wpdb->get_results($query);
52
 
53
  if(sizeof($results)!=0)
54
  {
55
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
56
  $results1 = $wpdb->get_results($query);
57
  if(sizeof($results1)!=0)
58
  {
@@ -105,13 +83,13 @@
105
  $time = 60;
106
  $reqLimit = $RequestsPMin;
107
 
108
- $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
109
  $results = $wpdb->get_results($query);
110
 
111
- $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
112
  $results = $wpdb->get_results($query);
113
 
114
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
115
  $results = $wpdb->get_results($query);
116
 
117
  if($results[0]->count>=$reqLimit)
@@ -119,12 +97,12 @@
119
  $action = $actionRateL;
120
  if($action == 'ThrottleIP')
121
  {
122
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
123
  $results = $wpdb->get_results($query);
124
  $current_time = time();
125
  if($results[0]->time < $current_time-60)
126
  {
127
- $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
128
  $results = $wpdb->get_results($query);
129
  }
130
  header('HTTP/1.1 403 Forbidden');
@@ -133,15 +111,15 @@
133
  }
134
  else
135
  {
136
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
137
  $results = $wpdb->get_results($query);
138
  $current_time = time();
139
  if($results[0]->time < $current_time-60)
140
  {
141
- $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
142
  $results = $wpdb->get_results($query);
143
  }
144
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
145
  $results1 = $wpdb->get_results($query);
146
  if(sizeof($results1)!=0)
147
  {
@@ -149,7 +127,7 @@
149
  }
150
  else
151
  {
152
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','Rate limit exceed',NULL,".current_time( 'timestamp' ).");";
153
  $results =$wpdb->get_results($query);
154
  }
155
  header('HTTP/1.1 403 Forbidden');
@@ -234,13 +212,13 @@
234
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
235
  {
236
  $value = htmlspecialchars($value);
237
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
238
  $results = $wpdb->get_results($query);
239
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
240
  $results = $wpdb->get_results($query);
241
  if($results[0]->count>$limitAttack)
242
  {
243
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
244
  $results = $wpdb->get_results($query);
245
  if(sizeof($results)!=0)
246
  {
@@ -248,7 +226,7 @@
248
  }
249
  else
250
  {
251
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
252
  $results =$wpdb->get_results($query);
253
  }
254
  }
@@ -303,14 +281,14 @@
303
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
304
  {
305
  $value = htmlspecialchars($value);
306
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
307
  $results = $wpdb->get_results($query);
308
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
309
  $results = $wpdb->get_results($query);
310
 
311
  if($results[0]->count>$limitAttack)
312
  {
313
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
314
  $results = $wpdb->get_results($query);
315
  if(sizeof($results)!=0)
316
  {
@@ -318,7 +296,7 @@
318
  }
319
  else
320
  {
321
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
322
  $results =$wpdb->get_results($query);
323
  }
324
  }
@@ -373,14 +351,14 @@
373
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
374
  {
375
  $value = htmlspecialchars($value);
376
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
377
  $results = $wpdb->get_results($query);
378
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
379
  $results = $wpdb->get_results($query);
380
 
381
  if($results[0]->count>$limitAttack)
382
  {
383
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
384
  $results = $wpdb->get_results($query);
385
  if(sizeof($results)!=0)
386
  {
@@ -388,7 +366,7 @@
388
  }
389
  else
390
  {
391
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
392
  $results =$wpdb->get_results($query);
393
  }
394
  }
1
  <?php
2
 
 
 
 
 
3
  $dir =dirname(__FILE__);
4
  $dir = str_replace('\\', "/", $dir);
5
  $sqlInjectionFile = $dir.'/signature/APSQLI.php';
23
  include_once($lfiFile);
24
 
25
 
26
+ global $wpdb,$moWpnsUtility;
27
+ $ipaddress = $moWpnsUtility->get_client_ip();
28
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_blocked_ips where ip_address="%s";',array($ipaddress));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  $results = $wpdb->get_results($query);
30
 
31
  if(sizeof($results)!=0)
32
  {
33
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="%s";',array($ipaddress));
34
  $results1 = $wpdb->get_results($query);
35
  if(sizeof($results1)!=0)
36
  {
83
  $time = 60;
84
  $reqLimit = $RequestsPMin;
85
 
86
+ $query = $wpdb->prepare("delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time< %d",array((time()-$time)));
87
  $results = $wpdb->get_results($query);
88
 
89
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('%s',%d);",array($ipaddress,time()));
90
  $results = $wpdb->get_results($query);
91
 
92
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='%s';",array($ipaddress));
93
  $results = $wpdb->get_results($query);
94
 
95
  if($results[0]->count>=$reqLimit)
97
  $action = $actionRateL;
98
  if($action == 'ThrottleIP')
99
  {
100
+ $query = $wpdb->prepare("select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='%s' ORDER BY time DESC LIMIT 1;",array($ipaddress));
101
  $results = $wpdb->get_results($query);
102
  $current_time = time();
103
  if($results[0]->time < $current_time-60)
104
  {
105
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."wpns_attack_logs values('%s','Rate Limit',%d,'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');",array($ipaddress,time()));
106
  $results = $wpdb->get_results($query);
107
  }
108
  header('HTTP/1.1 403 Forbidden');
111
  }
112
  else
113
  {
114
+ $query = $wpdb->prepare("select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='%s' ORDER BY time DESC LIMIT 1;",array($ipaddress));
115
  $results = $wpdb->get_results($query);
116
  $current_time = time();
117
  if($results[0]->time < $current_time-60)
118
  {
119
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."wpns_attack_logs values('%s','Rate Limit',%d,'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');",array($ipaddress,time()));
120
  $results = $wpdb->get_results($query);
121
  }
122
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="%s";',array($ipaddress));
123
  $results1 = $wpdb->get_results($query);
124
  if(sizeof($results1)!=0)
125
  {
127
  }
128
  else
129
  {
130
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'%s','Rate limit exceed',NULL,".current_time( 'timestamp' ).");",array($ipaddress));
131
  $results =$wpdb->get_results($query);
132
  }
133
  header('HTTP/1.1 403 Forbidden');
212
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
213
  {
214
  $value = htmlspecialchars($value);
215
+ $query = $wpdb->prepare('insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("%s","%s",%d,"%s");',array($ipaddress,$value1,time(),$value));
216
  $results = $wpdb->get_results($query);
217
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='%s' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';",array($ipaddress));
218
  $results = $wpdb->get_results($query);
219
  if($results[0]->count>$limitAttack)
220
  {
221
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="%s";',array($ipaddress));
222
  $results = $wpdb->get_results($query);
223
  if(sizeof($results)!=0)
224
  {
226
  }
227
  else
228
  {
229
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'%s','attack limit exceed',NULL,%d);",array($ipaddress,current_time('timestamp')));
230
  $results =$wpdb->get_results($query);
231
  }
232
  }
281
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
282
  {
283
  $value = htmlspecialchars($value);
284
+ $query = $wpdb->prepare('insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("%s","%s",%d,"%s");',array($ipaddress,$value1,time(),$value));
285
  $results = $wpdb->get_results($query);
286
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='%s' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';",array($ipaddress));
287
  $results = $wpdb->get_results($query);
288
 
289
  if($results[0]->count>$limitAttack)
290
  {
291
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="%s";',array($ipaddress));
292
  $results = $wpdb->get_results($query);
293
  if(sizeof($results)!=0)
294
  {
296
  }
297
  else
298
  {
299
+ $query =$wpdb->prepare("insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'%s','attack limit exceed',NULL,%d);",array($ipaddress,current_time( 'timestamp' )));
300
  $results =$wpdb->get_results($query);
301
  }
302
  }
351
  if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
352
  {
353
  $value = htmlspecialchars($value);
354
+ $query = $wpdb->prepare('insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("%s","%s",%d,"%s");',array($ipaddress,$value1,time(),$value));
355
  $results = $wpdb->get_results($query);
356
+ $query = $wpdb->prepare("select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='%s' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';",array($ipaddress));
357
  $results = $wpdb->get_results($query);
358
 
359
  if($results[0]->count>$limitAttack)
360
  {
361
+ $query = $wpdb->prepare('select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="%s";',$ipaddress);
362
  $results = $wpdb->get_results($query);
363
  if(sizeof($results)!=0)
364
  {
366
  }
367
  else
368
  {
369
+ $query = $wpdb->prepare("insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'%s','attack limit exceed',NULL,%d);",array($ipaddress,current_time( 'timestamp' )));
370
  $results =$wpdb->get_results($query);
371
  }
372
  }
handler/mo-waf.php CHANGED
@@ -1,9 +1,5 @@
1
  <?php
2
 
3
- function mo2f_isValidIP($IP){
4
- return filter_var($IP, FILTER_VALIDATE_IP) !== false;
5
- }
6
-
7
  $dir =dirname(__FILE__);
8
  $dir = str_replace('\\', "/", $dir);
9
  $sqlInjectionFile = $dir.'/signature/APSQLI.php';
@@ -102,27 +98,8 @@
102
  $results1 = mysqli_query($dbcon,$query);
103
  $row = mysqli_fetch_array($results1);
104
  if(isset($row['option_value']) && $row['option_value']=='HtaccessLevel'){
105
- $ipaddress = '';
106
-
107
- if (isset($_SERVER['HTTP_CLIENT_IP']) && mo2f_isValidIP($_SERVER['HTTP_CLIENT_IP']))
108
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_CLIENT_IP']);
109
- elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED_FOR']))
110
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED_FOR']);
111
- elseif(isset($_SERVER['HTTP_X_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED']))
112
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED']);
113
- elseif(isset($_SERVER['HTTP_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED_FOR']))
114
- {
115
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED_FOR']);
116
- $ipaddress = explode(",", $ipaddress)[0];
117
- }
118
- elseif(isset($_SERVER['HTTP_FORWARDED']) && mo2f_isValidIP($_SERVER['HTTP_FORWARDED']))
119
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['HTTP_FORWARDED']);
120
- elseif(isset($_SERVER['REMOTE_ADDR']) && mo2f_isValidIP($_SERVER['REMOTE_ADDR']))
121
- $ipaddress = filter_input(INPUT_SERVER,$_SERVER['REMOTE_ADDR']);
122
- else
123
- $ipaddress = 'UNKNOWN';
124
-
125
-
126
  $ipaddress = filter_var($ipaddress, FILTER_VALIDATE_IP) ? $ipaddress : 'UNKNOWN';
127
 
128
  $query = 'select * from '.$prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
1
  <?php
2
 
 
 
 
 
3
  $dir =dirname(__FILE__);
4
  $dir = str_replace('\\', "/", $dir);
5
  $sqlInjectionFile = $dir.'/signature/APSQLI.php';
98
  $results1 = mysqli_query($dbcon,$query);
99
  $row = mysqli_fetch_array($results1);
100
  if(isset($row['option_value']) && $row['option_value']=='HtaccessLevel'){
101
+ global $wpdb,$moWpnsUtility;
102
+ $ipaddress = $moWpnsUtility->get_client_ip();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  $ipaddress = filter_var($ipaddress, FILTER_VALIDATE_IP) ? $ipaddress : 'UNKNOWN';
104
 
105
  $query = 'select * from '.$prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
handler/twofa/encryption.php CHANGED
@@ -33,12 +33,8 @@ class mo2f_GAuth_AESEncryption {
33
  $c = base64_decode($data);
34
  $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
35
  $iv = substr($c, 0, $ivlen);
36
- $hmac = substr($c, $ivlen, $sha2len=32);
37
- $ciphertext_raw = substr($c, $ivlen+$sha2len);
38
  $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
39
- $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
40
-
41
-
42
  return $original_plaintext;
43
  }
44
 
33
  $c = base64_decode($data);
34
  $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
35
  $iv = substr($c, 0, $ivlen);
36
+ $ciphertext_raw = substr($c, $ivlen+32);
 
37
  $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);
 
 
 
38
  return $original_plaintext;
39
  }
40
 
handler/twofa/gaonprem.php CHANGED
@@ -62,7 +62,7 @@ class Google_auth_onpremise{
62
  $randomString = '';
63
  $charactersLength = strlen($keyspace);
64
  for ($i = 0; $i < $length; $i++) {
65
- $randomString .= $keyspace[rand(0, $charactersLength - 1)];
66
  }
67
  return $randomString;
68
 
62
  $randomString = '';
63
  $charactersLength = strlen($keyspace);
64
  for ($i = 0; $i < $length; $i++) {
65
+ $randomString .= $keyspace[random_int(0, $charactersLength - 1)];
66
  }
67
  return $randomString;
68
 
handler/twofa/setup_twofa.php CHANGED
@@ -637,7 +637,7 @@ function mo2f_update_and_sync_user_two_factor( $user_id, $userinfo ) {
637
  if ( $mo2f_second_factor == 'OUT OF BAND EMAIL' ) {
638
  $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_EmailVerification_config_status' => true ) );
639
  } else if ( $mo2f_second_factor == 'SMS' and !MO2F_IS_ONPREM) {
640
- $phone_num = $userinfo['phone'];
641
  $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_OTPOverSMS_config_status' => true ) );
642
  $_SESSION['user_phone'] = $phone_num;
643
  } else if ( in_array( $mo2f_second_factor, array(
637
  if ( $mo2f_second_factor == 'OUT OF BAND EMAIL' ) {
638
  $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_EmailVerification_config_status' => true ) );
639
  } else if ( $mo2f_second_factor == 'SMS' and !MO2F_IS_ONPREM) {
640
+ $phone_num = isset($userinfo['phone'])?sanitize_text_field($userinfo['phone']):'';
641
  $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_OTPOverSMS_config_status' => true ) );
642
  $_SESSION['user_phone'] = $phone_num;
643
  } else if ( in_array( $mo2f_second_factor, array(
handler/twofa/two_fa_pass2login.php CHANGED
@@ -116,10 +116,7 @@ class Miniorange_Password_2Factor_Login {
116
  $codes=explode(",", $backups);
117
  $session_id = sanitize_text_field($_POST['session_id']);
118
  $id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id, 'mo2f_current_user_id');
119
-
120
-
121
- update_user_meta($id, 'mo_backup_code_downloaded', 1);
122
- delete_user_meta($id, 'chqwetcsdvnvd');
123
  MO2f_Utility::mo2f_download_backup_codes($id, $codes);
124
  }
125
  }
@@ -215,6 +212,10 @@ class Miniorange_Password_2Factor_Login {
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';
@@ -295,19 +296,6 @@ class Miniorange_Password_2Factor_Login {
295
  $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
296
  }
297
  $codes = explode(' ', $codes);
298
- $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
299
- $str1="";
300
- for ($x = 0; $x < sizeof($codes); $x++) {
301
- $str = $codes[$x];
302
- $str1.=$str;
303
- if($x != 4){
304
- $str1.=',';
305
- }
306
- }
307
-
308
- $key = get_option( 'mo2f_encryption_key' );
309
- $codes_encrypt = MO2f_Utility::encrypt_data($str1, $key);
310
- update_user_meta($id,'chqwetcsdvnvd', $codes_encrypt);
311
 
312
  $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
313
  if(empty($mo2f_user_email)){
@@ -315,12 +303,13 @@ class Miniorange_Password_2Factor_Login {
315
  $mo2f_user_email = $currentuser->user_email;
316
  }
317
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
 
318
  if($result){
319
  $mo2fa_login_message = "An email containing the backup codes has been sent. Please click on Use backup codes to login using the backup codes.";
320
- update_user_meta($id, 'mo_backup_code_generated', 0);
321
  }else{
322
  $mo2fa_login_message = " If you haven\'t configured SMTP, please set your SMTP to get the backup codes on email.";
323
- update_user_meta($id, 'mo_backup_code_generated', 1);
324
  }
325
 
326
  $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
@@ -2422,7 +2411,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2422
  MO2f_Utility::unset_cookie_variables( $cookie_variables );
2423
  $key = get_option( 'mo2f_encryption_key' );
2424
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
2425
- $Mo2fdbQueries->save_user_login_details( $session_id, array(
 
2426
 
2427
  'mo2f_current_user_id' => '',
2428
  'mo2f_login_message' => '',
@@ -2609,9 +2599,8 @@ function check_miniorange_duo_push_validation_failed($POSTED){
2609
  break;
2610
 
2611
  case 'MO_2_FACTOR_GENERATE_BACKUP_CODES':
2612
- $current_user_id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient( $session_id_encrypt, 'mo2f_current_user_id' );
2613
 
2614
- mo2f_backup_codes_generate($current_user_id, $redirect_to, $session_id_encrypt);
2615
  exit;
2616
 
2617
  case 'MO_2_FACTOR_CHALLENGE_BACKUP':
@@ -3099,9 +3088,10 @@ function check_miniorange_duo_push_validation_failed($POSTED){
3099
  function create_session(){
3100
  global $Mo2fdbQueries;
3101
  $session_id = MO2f_Utility::random_str(20);
3102
- $Mo2fdbQueries->insert_user_login_session($session_id);
3103
- $key = get_option( 'mo2f_encryption_key' );
3104
- $session_id_encrypt = MO2f_Utility::encrypt_data($session_id, $key);
 
3105
  return $session_id_encrypt;
3106
  }
3107
 
116
  $codes=explode(",", $backups);
117
  $session_id = sanitize_text_field($_POST['session_id']);
118
  $id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_get_transient($session_id, 'mo2f_current_user_id');
119
+
 
 
 
120
  MO2f_Utility::mo2f_download_backup_codes($id, $codes);
121
  }
122
  }
212
  $mo2fa_login_message = __('Backup code has not generated for you.','miniorange-2-factor-authentication');
213
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
214
  $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
215
+ }else if($data =='TokenNotFound'){
216
+ $mo2fa_login_message = __('Validation request authentication failed');
217
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
218
+ $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null, $session_id_encrypt);
219
  }else if($data == 'DBConnectionerror'){
220
  $mo2fa_login_message = __('Error occurred while establising connection.','miniorange-2-factor-authentication');
221
  $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_BACKUP';
296
  $this->miniorange_pass2login_form_fields($mo2fa_login_status, $mo2fa_login_message, $redirect_to, null ,$session_id);
297
  }
298
  $codes = explode(' ', $codes);
 
 
 
 
 
 
 
 
 
 
 
 
 
299
 
300
  $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $id );
301
  if(empty($mo2f_user_email)){
303
  $mo2f_user_email = $currentuser->user_email;
304
  }
305
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
306
+
307
  if($result){
308
  $mo2fa_login_message = "An email containing the backup codes has been sent. Please click on Use backup codes to login using the backup codes.";
309
+ update_user_meta($id, 'mo_backup_code_generated', 1);
310
  }else{
311
  $mo2fa_login_message = " If you haven\'t configured SMTP, please set your SMTP to get the backup codes on email.";
312
+ update_user_meta($id, 'mo_backup_code_generated', 0);
313
  }
314
 
315
  $mo2fa_login_status = sanitize_text_field($_POST['login_status']);
2411
  MO2f_Utility::unset_cookie_variables( $cookie_variables );
2412
  $key = get_option( 'mo2f_encryption_key' );
2413
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
2414
+ $session_id_hash = md5($session_id);
2415
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array(
2416
 
2417
  'mo2f_current_user_id' => '',
2418
  'mo2f_login_message' => '',
2599
  break;
2600
 
2601
  case 'MO_2_FACTOR_GENERATE_BACKUP_CODES':
 
2602
 
2603
+ mo2f_backup_codes_generate($redirect_to, $session_id_encrypt);
2604
  exit;
2605
 
2606
  case 'MO_2_FACTOR_CHALLENGE_BACKUP':
3088
  function create_session(){
3089
  global $Mo2fdbQueries;
3090
  $session_id = MO2f_Utility::random_str(20);
3091
+ $session_id_hash = md5($session_id);
3092
+ $Mo2fdbQueries->insert_user_login_session($session_id_hash);
3093
+ $key = get_option('mo2f_encryption_key');
3094
+ $session_id_encrypt = MO2f_Utility::encrypt_data($session_id, $key);
3095
  return $session_id_encrypt;
3096
  }
3097
 
handler/twofa/two_fa_settings.php CHANGED
@@ -1351,51 +1351,6 @@ private function settings_error_page( $id = 'mo2f-setup-vue-site-settings', $foo
1351
  wp_logout();
1352
  wp_redirect(admin_url());
1353
  }
1354
- }else if(isset($_POST['option']) and sanitize_text_field($_POST['option']) == 'restart_plugin_tour'){
1355
- $nonce = sanitize_text_field($_POST['_wpnonce']);
1356
- if ( ! wp_verify_nonce( $nonce, 'restart_plugin_tour' ) ) {
1357
- $error = new WP_Error();
1358
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1359
- return $error;
1360
- } else {
1361
- $page = isset($_POST['page'])? sanitize_text_field($_POST['page']) : '';
1362
- $page = sanitize_text_field($page);
1363
- update_option('mo2f_two_factor_tour',0);
1364
- update_option('mo2f_tour_firewall',0);
1365
- update_option('mo2f_tour_loginSpam',0);
1366
- update_option('mo2f_tour_backup',0);
1367
- update_option('mo2f_tour_malware_scan',0);
1368
- update_option('mo2f_tour_advance_blocking',0);
1369
- switch (sanitize_text_field($_REQUEST['page'])) {
1370
- case 'mo_2fa_two_fa':
1371
- update_option('mo2f_two_factor_tour',1);
1372
- break;
1373
- case 'mo_2fa_waf':
1374
- update_option('mo2f_tour_firewall',1);
1375
- break;
1376
- case 'mo_2fa_login_and_spam':
1377
- update_option('mo2f_tour_loginSpam',1);
1378
- break;
1379
- case 'mo_2fa_backup':
1380
- update_option('mo2f_tour_backup',1);
1381
- break;
1382
- case 'mo_2fa_malwarescan':
1383
- update_option('mo2f_tour_malware_scan',1);
1384
- break;
1385
- case 'mo_2fa_advancedblocking':
1386
- update_option('mo2f_tour_advance_blocking',1);
1387
- break;
1388
- }
1389
- if($page != '')
1390
- {
1391
- $url = get_option('siteurl').'/wp-admin/admin.php?page='.$page;
1392
- wp_redirect($url);
1393
- exit;
1394
- }
1395
- $redirect=explode('&',htmlentities($_SERVER['REQUEST_URI']))[0];
1396
- header("Location: ".$redirect);
1397
- return;
1398
- }
1399
  }else if ( isset( $_POST['option'] ) and sanitize_text_field($_POST['option']) == "mo2f_save_proxy_settings" ) {
1400
  $nonce = sanitize_text_field($_POST['mo2f_save_proxy_settings_nonce']);
1401
  if ( ! wp_verify_nonce( $nonce, 'mo2f-save-proxy-settings-nonce' ) ) {
1351
  wp_logout();
1352
  wp_redirect(admin_url());
1353
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1354
  }else if ( isset( $_POST['option'] ) and sanitize_text_field($_POST['option']) == "mo2f_save_proxy_settings" ) {
1355
  $nonce = sanitize_text_field($_POST['mo2f_save_proxy_settings_nonce']);
1356
  if ( ! wp_verify_nonce( $nonce, 'mo2f-save-proxy-settings-nonce' ) ) {
handler/twofa/two_fa_utility.php CHANGED
@@ -137,11 +137,12 @@ class MO2f_Utility {
137
 
138
  // setting values in database
139
  $user_session_id = MO2f_Utility::decrypt_data( $user_session_id, $key );
 
140
  if ( is_array( $value ) ) {
141
  $string_value = serialize( $value );
142
- $Mo2fdbQueries->save_user_login_details( $user_session_id, array( $variable => $string_value ) );
143
  } else {
144
- $Mo2fdbQueries->save_user_login_details( $user_session_id, array( $variable => $value ) );
145
  }
146
  } else if (!empty($data_option) && $data_option=="sessions"){
147
 
@@ -163,35 +164,16 @@ class MO2f_Utility {
163
  }
164
  } else if (!empty($data_option) && $data_option=="tables"){
165
  $user_session_id = MO2f_Utility::decrypt_data( $user_session_id, $key );
 
166
  if ( is_array( $value ) ) {
167
  $string_value = serialize( $value );
168
- $Mo2fdbQueries->save_user_login_details( $user_session_id, array( $variable => $string_value ) );
169
  } else {
170
- $Mo2fdbQueries->save_user_login_details( $user_session_id, array( $variable => $value ) );
171
  }
172
  }
173
  }
174
 
175
- function mo2f_isValidIP($IP)
176
- {
177
- return filter_var($IP, FILTER_VALIDATE_IP) !== false;
178
- }
179
-
180
- public static function get_client_ipaddress(){
181
-
182
- $ip = null;
183
- if (!empty($_SERVER['HTTP_CLIENT_IP']) && mo2f_isValidIP($_SERVER['HTTP_CLIENT_IP'])) {
184
- $ip = filter_input(INPUT_SERVER,$_SERVER['HTTP_CLIENT_IP']);
185
-
186
- } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED_FOR'])) {
187
- $ip = filter_input(INPUT_SERVER,$_SERVER['HTTP_X_FORWARDED_FOR']);
188
- $ip = explode(",",$ip)[0];
189
-
190
- } else {
191
- $ip = mo2f_isValidIP($_SERVER['REMOTE_ADDR']) ? filter_input(INPUT_SERVER,$_SERVER['REMOTE_ADDR']) : 'UNKNOWN';
192
- }
193
- return $ip;
194
- }
195
  /*
196
 
197
  Returns Random string with length provided in parameter.
@@ -326,7 +308,8 @@ class MO2f_Utility {
326
  return $cookie_value;
327
  } else {
328
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
329
- $db_value = $Mo2fdbQueries->get_user_login_details( $variable, $session_id );
 
330
  if ( in_array( $variable, array( "mo2f_rba_status", "mo_2_factor_kba_questions" ) ) ) {
331
  $db_value = unserialize( $db_value );
332
  }
@@ -374,7 +357,8 @@ class MO2f_Utility {
374
  }else if (!empty($data_option) && $data_option=="tables"){
375
  $key = get_option( 'mo2f_encryption_key' );
376
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
377
- $db_value = $Mo2fdbQueries->get_user_login_details( $variable, $session_id );
 
378
  if ( in_array( $variable, array( "mo2f_rba_status", "mo_2_factor_kba_questions" ) ) ) {
379
  $db_value = unserialize( $db_value );
380
  }
@@ -521,10 +505,11 @@ class MO2f_Utility {
521
  global $Mo2fdbQueries;
522
  $key = get_option( 'mo2f_encryption_key' );
523
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
 
524
  if($command == "destroy"){
525
- $Mo2fdbQueries->delete_user_login_sessions( $session_id );
526
  }else{
527
- $Mo2fdbQueries->save_user_login_details( $session_id, array($variables => ''));
528
  }
529
  }
530
 
@@ -710,15 +695,6 @@ class MO2f_Utility {
710
  return $message;
711
  }
712
 
713
- public static function mo2f_get_codes_hash($codes){
714
- $codes_hash=array();
715
- for ($x = 0; $x < sizeof($codes); $x++) {
716
- $str = $codes[$x];
717
- array_push($codes_hash,md5($str));
718
- }
719
- return $codes_hash;
720
- }
721
-
722
  public static function mo2f_email_backup_codes($codes, $mo2f_user_email){
723
  $subject = '2-Factor Authentication(Backup Codes)';
724
  $headers = array('Content-Type: text/html; charset=UTF-8');
@@ -769,7 +745,6 @@ class MO2f_Utility {
769
  return $codes;
770
 
771
  $codes = explode(' ', $codes);
772
- $codes_hash=MO2f_Utility::mo2f_get_codes_hash($codes);
773
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
774
  update_user_meta($id, 'mo_backup_code_generated', 1);
775
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
137
 
138
  // setting values in database
139
  $user_session_id = MO2f_Utility::decrypt_data( $user_session_id, $key );
140
+ $session_id_hash = md5($user_session_id);
141
  if ( is_array( $value ) ) {
142
  $string_value = serialize( $value );
143
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array( $variable => $string_value ) );
144
  } else {
145
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array( $variable => $value ) );
146
  }
147
  } else if (!empty($data_option) && $data_option=="sessions"){
148
 
164
  }
165
  } else if (!empty($data_option) && $data_option=="tables"){
166
  $user_session_id = MO2f_Utility::decrypt_data( $user_session_id, $key );
167
+ $session_id_hash = md5($user_session_id);
168
  if ( is_array( $value ) ) {
169
  $string_value = serialize( $value );
170
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array( $variable => $string_value ) );
171
  } else {
172
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array( $variable => $value ) );
173
  }
174
  }
175
  }
176
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  /*
178
 
179
  Returns Random string with length provided in parameter.
308
  return $cookie_value;
309
  } else {
310
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
311
+ $session_id_hash = md5($session_id);
312
+ $db_value = $Mo2fdbQueries->get_user_login_details( $variable, $session_id_hash );
313
  if ( in_array( $variable, array( "mo2f_rba_status", "mo_2_factor_kba_questions" ) ) ) {
314
  $db_value = unserialize( $db_value );
315
  }
357
  }else if (!empty($data_option) && $data_option=="tables"){
358
  $key = get_option( 'mo2f_encryption_key' );
359
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
360
+ $session_id_hash = md5($session_id);
361
+ $db_value = $Mo2fdbQueries->get_user_login_details( $variable, $session_id_hash );
362
  if ( in_array( $variable, array( "mo2f_rba_status", "mo_2_factor_kba_questions" ) ) ) {
363
  $db_value = unserialize( $db_value );
364
  }
505
  global $Mo2fdbQueries;
506
  $key = get_option( 'mo2f_encryption_key' );
507
  $session_id = MO2f_Utility::decrypt_data( $session_id, $key );
508
+ $session_id_hash = md5($session_id);
509
  if($command == "destroy"){
510
+ $Mo2fdbQueries->delete_user_login_sessions( $session_id_hash );
511
  }else{
512
+ $Mo2fdbQueries->save_user_login_details( $session_id_hash, array($variables => ''));
513
  }
514
  }
515
 
695
  return $message;
696
  }
697
 
 
 
 
 
 
 
 
 
 
698
  public static function mo2f_email_backup_codes($codes, $mo2f_user_email){
699
  $subject = '2-Factor Authentication(Backup Codes)';
700
  $headers = array('Content-Type: text/html; charset=UTF-8');
745
  return $codes;
746
 
747
  $codes = explode(' ', $codes);
 
748
  $result = MO2f_Utility::mo2f_email_backup_codes($codes, $mo2f_user_email);
749
  update_user_meta($id, 'mo_backup_code_generated', 1);
750
  update_user_meta($id, 'mo_backup_code_downloaded', 1);
helper/constants.php CHANGED
@@ -13,8 +13,12 @@
13
  const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
  const DB_VERSION = 155;
15
  const DB_FEATURE_MAIL = 3;
 
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>';
19
  const CURRENT_BROWSER = '<span style="font-size:10px;color:red;">( Current Browser )</span>';
20
 
@@ -43,9 +47,7 @@
43
  const ATTACK_LIMIT_EXCEEDED = "ale";
44
  const RATE_LIMIT_EXCEEDED = "rle";
45
  const RATE_LIMIT_EXCEEDED_CRAWLER_ATTACK= "rlecrawler";
46
- const PLUGIN = 'plugin';
47
- const THEMES = 'themes';
48
- const WPFILES = 'wpfiles';
49
  const DATABASE = 'db';
50
  const CloudLockedOut ='https://faq.miniorange.com/knowledgebase/how-to-gain-access-to-my-website-if-i-get-locked-out/';
51
  const OnPremiseLockedOut ='https://faq.miniorange.com/knowledgebase/i-am-locked-cant-access-my-account-what-do-i-do/';
13
  const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
  const DB_VERSION = 155;
15
  const DB_FEATURE_MAIL = 3;
16
+ const SMS_EMAIL_TRANSACTION ="https://plugins.miniorange.com/sms-and-email-transaction-pricing-2fa";
17
  const SUPPORT_EMAIL = 'info@xecurify.com';
18
  const REAL_TIME_IP_HOST = 'https://firewall.xecurify.com/';
19
+ const GENERATE_BACK_CODE = 'https://sitestats.xecurify.com/backupcodeserviceauthentication';
20
+ const AUTHENTICATE_REQUEST = 'https://sitestats.xecurify.com/backupcodeserviceauthentication/authenticate.php';
21
+ const VALIDATE_BACKUP_CODE = 'https://sitestats.xecurify.com/backupcodeserviceauthentication/backup_code_validation.php';
22
  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>';
23
  const CURRENT_BROWSER = '<span style="font-size:10px;color:red;">( Current Browser )</span>';
24
 
47
  const ATTACK_LIMIT_EXCEEDED = "ale";
48
  const RATE_LIMIT_EXCEEDED = "rle";
49
  const RATE_LIMIT_EXCEEDED_CRAWLER_ATTACK= "rlecrawler";
50
+
 
 
51
  const DATABASE = 'db';
52
  const CloudLockedOut ='https://faq.miniorange.com/knowledgebase/how-to-gain-access-to-my-website-if-i-get-locked-out/';
53
  const OnPremiseLockedOut ='https://faq.miniorange.com/knowledgebase/i-am-locked-cant-access-my-account-what-do-i-do/';
helper/dashboard_security_notification.php CHANGED
@@ -29,12 +29,12 @@ class miniorange_security_notification{
29
 
30
  $latest_id = (int)$array[0]->id;
31
 
32
- $last_scan_malicious_count = $wpdb->get_results("SELECT COUNT(*) as total FROM ".$wpdb->base_prefix."wpns_malware_scan_report_details where report_id=".$latest_id);
33
 
34
 
35
  $total_malicious_count = $wpdb->get_results("SELECT COUNT(*) as total FROM ".$wpdb->base_prefix."wpns_malware_scan_report_details");
36
 
37
- $table_content = $wpdb->get_results("SELECT * FROM ".$wpdb->base_prefix."wpns_malware_scan_report where id=".$latest_id);
38
  if(sizeof($table_content)>0){
39
  $type_of_scan = $table_content[0]->scan_mode;
40
  $total_scanned_files = $table_content[0]->scanned_files;
@@ -45,23 +45,6 @@ class miniorange_security_notification{
45
 
46
  if($total_scanned_files === null)
47
  $total_scanned_files = '0';
48
- // -------------------------------------------------------------------------------------------------------->
49
- $array = $wpnsDbQueries->get_number_of_plugin_backup();
50
- $last_backup_create_time = get_option('backup_created_time');
51
- $last_backup = 'No Backup Util';
52
- if($array['total_backup'] !=0){
53
- $timestamp = time()-$last_backup_create_time;
54
- $days = $timestamp/(60*60*24);
55
- $day = (int)$days;
56
- if($day == 0){
57
- $last_backup ='Last Backup Create Today';
58
- }else{
59
- $last_backup= 'Last backup'.' '.$day.' '.'day ago';
60
- }
61
- }else{
62
- $last_backup = 'No Backup Until Now';
63
- }
64
-
65
 
66
  if(current_user_can('administrator'))
67
  {
@@ -211,53 +194,7 @@ class miniorange_security_notification{
211
 
212
  echo '<br><br>';
213
 
214
- echo "<div style='width:100%;background-color:#555f5f;padding-top:10px;'>
215
- <div style='font-size:20px;color:white;text-align:center'>
216
- <strong style='font-weight:300;'>Backup <span style='color:orange;'>[".esc_html($last_backup)." ]</span></strong>
217
- </div>
218
- <hr>
219
- <div>
220
- <table>
221
- <tbody>
222
-
223
- <tr>
224
- <td style='border-collapse:collapse!important;color:#0a0a0a;line-height:1.3;margin:0;padding:0;text-align:left;vertical-align:top;word-wrap:normal'>
225
- <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
226
- <tbody>
227
- <tr>
228
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>" .esc_attr($array['plugin_count'])."</strong></td>
229
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>" .esc_attr($array['themes_count'])."</strong></td>
230
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>" .esc_attr($array['wp_files_count'])."</strong></td>
231
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>" .esc_attr($array['db_count'])."</strong></td>
232
-
233
- </tr>
234
-
235
- <tr>
236
- <td>&nbsp;
237
- </td>
238
- <td>
239
- </td>
240
- </tr>
241
- <tr>
242
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Plugin Backup</strong></td>
243
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Themes Backup</strong></td>
244
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>WP File Backup</strong></td>
245
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Database Backup</strong></td>
246
-
247
- </tr>
248
- </tbody>
249
- </table>
250
-
251
- </tr>
252
- </tbody>
253
- </table>
254
- </div>
255
-
256
- <a class='button button-primary' style='background-color:#f0a702;width:100%;text-align:center' href='admin.php?page=mo_2fa_backup'><h3 style='background-color:#f0a702'>Take Backup</h3></a>
257
- </div>";
258
-
259
-
260
- }
261
 
262
  }
263
 
29
 
30
  $latest_id = (int)$array[0]->id;
31
 
32
+ $last_scan_malicious_count = $wpdb->get_results($wpdb->prepare("SELECT COUNT(*) as total FROM ".$wpdb->base_prefix."wpns_malware_scan_report_details where report_id=%d",array($latest_id)));
33
 
34
 
35
  $total_malicious_count = $wpdb->get_results("SELECT COUNT(*) as total FROM ".$wpdb->base_prefix."wpns_malware_scan_report_details");
36
 
37
+ $table_content = $wpdb->get_results($wpdb->prepare("SELECT * FROM ".$wpdb->base_prefix."wpns_malware_scan_report where id=%d",array($latest_id)));
38
  if(sizeof($table_content)>0){
39
  $type_of_scan = $table_content[0]->scan_mode;
40
  $total_scanned_files = $table_content[0]->scanned_files;
45
 
46
  if($total_scanned_files === null)
47
  $total_scanned_files = '0';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  if(current_user_can('administrator'))
50
  {
194
 
195
  echo '<br><br>';
196
 
197
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
 
199
  }
200
 
helper/pluginUtility.php CHANGED
@@ -73,7 +73,7 @@ class MoWpnsHandler
73
  function get_blocked_attacks()
74
  {
75
  global $wpnsDbQueries;
76
- return $wpnsDbQueries->get_blocked_attack_list('wpns_attack_logs');
77
  }
78
  function get_blocked_ips()
79
  {
73
  function get_blocked_attacks()
74
  {
75
  global $wpnsDbQueries;
76
+ return $wpnsDbQueries->get_blocked_attack_list();
77
  }
78
  function get_blocked_ips()
79
  {
helper/utility.php CHANGED
@@ -67,19 +67,26 @@ class MoWpnsUtility
67
  }
68
 
69
  static function mo2f_isValidIP($IP){
70
- return filter_var($IP, FILTER_VALIDATE_IP) !== false;
 
 
 
71
  }
72
 
73
  public static function get_client_ip()
74
  {
75
- if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
76
- return self::mo2f_isValidIP($_SERVER['HTTP_CLIENT_IP']) ? sanitize_text_field($_SERVER['HTTP_CLIENT_IP']) : '';
77
- } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
78
- return self::mo2f_isValidIP($_SERVER['HTTP_X_FORWARDED_FOR']) ? sanitize_text_field($_SERVER['HTTP_X_FORWARDED_FOR']) : '';
79
- } else {
80
- return self::mo2f_isValidIP($_SERVER['REMOTE_ADDR']) ? sanitize_text_field($_SERVER['REMOTE_ADDR']) : '';
81
  }
82
- return '';
 
 
 
 
 
 
83
  }
84
 
85
  public static function check_if_valid_email($email)
@@ -314,8 +321,6 @@ class MoWpnsUtility
314
  $status.="LS1";
315
  if(get_site_option('mo2f_visit_malware'))
316
  $status.="M1";
317
- if(get_site_option('mo2f_visit_backup'))
318
- $status.="B1";
319
  if(get_site_option('mo2f_two_factor'))
320
  $status.="TF1";
321
  if(time()-get_site_option("mo_2fa_pnp")<2592000)
67
  }
68
 
69
  static function mo2f_isValidIP($IP){
70
+ $new_ip = explode(',',$IP);
71
+ if(is_array($new_ip))
72
+ $IP = $new_ip[0];
73
+ return filter_var(self::get_unique_ip($IP), FILTER_VALIDATE_IP) !== false;
74
  }
75
 
76
  public static function get_client_ip()
77
  {
78
+ if((isset($_SERVER['REMOTE_ADDR']) && is_string($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) && self::mo2f_isValidIP($_SERVER['REMOTE_ADDR']))){
79
+ return self::get_unique_ip($_SERVER['REMOTE_ADDR']);
80
+ }else{
81
+ return 'UNKNOWN';
 
 
82
  }
83
+ }
84
+
85
+ public static function get_unique_ip($IP){
86
+ $IP = explode(',',$IP);
87
+ if(is_array($IP))
88
+ return sanitize_text_field($IP[0]);
89
+ return sanitize_text_field($IP);
90
  }
91
 
92
  public static function check_if_valid_email($email)
321
  $status.="LS1";
322
  if(get_site_option('mo2f_visit_malware'))
323
  $status.="M1";
 
 
324
  if(get_site_option('mo2f_two_factor'))
325
  $status.="TF1";
326
  if(time()-get_site_option("mo_2fa_pnp")<2592000)
includes/css/style_settings.css CHANGED
@@ -572,6 +572,11 @@ input[name="miniOrangeAuthenticator"]:checked + .mo2f_miniAuthApp {
572
  min-height: 62px;
573
  border-radius: 1em 1em 0 0;
574
  }
 
 
 
 
 
575
  .mo_wpns_upgrade_page_2fa_plan_name {
576
  margin-top: 0%;
577
  padding: 6% 0% 0% 0%;
572
  min-height: 62px;
573
  border-radius: 1em 1em 0 0;
574
  }
575
+ @media only screen and (max-width: 1024px){
576
+ .mo_wpns_upgrade_page_title_name {
577
+ height:100px;
578
+ }
579
+ }
580
  .mo_wpns_upgrade_page_2fa_plan_name {
581
  margin-top: 0%;
582
  padding: 6% 0% 0% 0%;
includes/css/upgrade.css CHANGED
@@ -1,304 +1,9 @@
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
- .mo2fa_cloud_per_tooltip_methodlist {
70
- position: relative;
71
- display: inline-block;
72
- }
73
- .mo2fa_cloud_per_tooltip_methodlist .mo2fa_methodlist {
74
- visibility: hidden;
75
- width: 14em;
76
- background-color: #000000b8;
77
- color: #fff;
78
- text-align: left;
79
- border-radius: 6px;
80
- padding: 11px 1px 11px 43px;
81
- position: absolute;
82
- z-index: 1;
83
- top: -15px;
84
- right: 110%;
85
- }
86
- .mo2fa_cloud_per_tooltip_methodlist:hover .mo2fa_methodlist {
87
- visibility: visible;
88
- }
89
- .mo2fa_cloud_per_tooltip_methodlist .mo2fa_methodlist::after {
90
- content: "";
91
- position: absolute;
92
- top: 50%;
93
- left: 100%;
94
- margin-top: -5px;
95
- border-width: 5px;
96
- border-style: solid;
97
- border-color: transparent transparent transparent black;
98
- }
99
-
100
- .mo2fa_fido_tooltip_methodlist {
101
- position: relative;
102
- display: inline-block;
103
- }
104
- .mo2fa_fido_tooltip_methodlist .mo2fa_methodlist {
105
- visibility: hidden;
106
- width: 16em;
107
- background-color: #000000b8;
108
- color: #fff;
109
- text-align: left;
110
- border-radius: 6px;
111
- padding: 12px 2px 12px 28px;
112
- position: absolute;
113
- z-index: 1;
114
- top: -1.9em;
115
- left: 91%;
116
- }
117
- .mo2fa_fido_tooltip_methodlist:hover .mo2fa_methodlist {
118
- visibility: visible;
119
- }
120
- .mo2fa_fido_tooltip_methodlist .mo2fa_methodlist::after {
121
- content: "";
122
- position: absolute;
123
- top: 50%;
124
- right: 100%;
125
- margin-top: -5px;
126
- border-width: 5px;
127
- border-style: solid;
128
- border-color: transparent black transparent transparent;
129
- }
130
 
131
- .mo2fa_shortcode_tooltip_methodlist {
132
- position: relative;
133
- display: inline-block;
134
- }
135
- .mo2fa_shortcode_tooltip_methodlist .mo2fa_methodlist {
136
- visibility: hidden;
137
- width: auto;
138
- min-width: 26em;
139
- background-color: #000000b8;
140
- color: #fff;
141
- text-align: left;
142
- border-radius: 6px;
143
- padding: 7px 0px 8px 8px;
144
- position: absolute;
145
- z-index: 1;
146
- top: -1.1em;
147
- left: 107%;
148
- }
149
- .mo2fa_shortcode_tooltip_methodlist:hover .mo2fa_methodlist {
150
- visibility: visible;
151
- }
152
- .mo2fa_shortcode_tooltip_methodlist .mo2fa_methodlist::after {
153
- content: "";
154
- position: absolute;
155
- top: 50%;
156
- right: 100%;
157
- margin-top: -5px;
158
- border-width: 5px;
159
- border-style: solid;
160
- border-color: transparent black transparent transparent;
161
- }
162
- .mo2fa_shortcode_ent_tooltip_methodlist {
163
- position: relative;
164
- display: inline-block;
165
- }
166
- .mo2fa_shortcode_ent_tooltip_methodlist .mo2fa_methodlist {
167
- visibility: hidden;
168
- width: auto;
169
- min-width: 26em;
170
- background-color: #000000b8;
171
- color: #fff;
172
- text-align: left;
173
- border-radius: 6px;
174
- padding: 7px 0px 8px 8px;
175
- position: absolute;
176
- z-index: 1;
177
- top: -15px;
178
- right: 110%;
179
- }
180
- .mo2fa_shortcode_ent_tooltip_methodlist:hover .mo2fa_methodlist {
181
- visibility: visible;
182
- }
183
- .mo2fa_shortcode_ent_tooltip_methodlist .mo2fa_methodlist::after {
184
- content: "";
185
- position: absolute;
186
- top: 50%;
187
- left: 100%;
188
- margin-top: -5px;
189
- border-width: 5px;
190
- border-style: solid;
191
- border-color: transparent transparent transparent black;
192
- }
193
- #mo2f_upgrade_main_div:hover > #mo2fa-ribbon {
194
- margin-top: 0%;
195
- transition: 1s;
196
- }
197
- .mo2fa_per_year {
198
- color: white;
199
- font-size: small;
200
- }
201
- .mo2fa_tooltip {
202
- position: relative;
203
- border-bottom: 1px dotted black;
204
- }
205
- .mo2fa_tooltip .mo2fa_tooltiptext {
206
- visibility: hidden;
207
- line-height: 1.6;
208
- font-family: "Times New Roman", Times, serif;
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_basic .mo2fa_tooltiptext_basic{
222
- right: 105%;
223
- left: unset;
224
- }
225
- .mo2fa_tooltip:hover .mo2fa_tooltiptext {
226
- visibility: visible;
227
- }
228
- .mo2fa-ribbon span {
229
- position: absolute;
230
- width: 154px;
231
- padding: 19px 0px 15px 68px;
232
- background-color: #3498db;
233
- box-shadow: 0 5px 10px rgb(0 0 0 / 10%);
234
- color: #fff;
235
- font: 700 14px/1 Lato, sans-serif;
236
- text-shadow: 0 1px 1px rgb(0 0 0 / 20%);
237
- }
238
- .mo2fa-ribbon-top-right span {
239
- left: 0;
240
- top: 19px;
241
- transform: rotate(45deg);
242
- z-index: 1;
243
- }
244
- .mo2fa-ribbon {
245
- width: 160px;
246
- height: 160px;
247
- overflow: hidden;
248
- position: absolute;
249
- z-index: 0;
250
- }
251
- .mo2fa-ribbon-top-right {
252
- top: 154px;
253
- right: 486px;
254
- }
255
- .mo2fa-ribbon::before {
256
- position: absolute;
257
- content: "";
258
- border: 5px solid #2980b9;
259
- }
260
- .mo2fa-ribbon-top-right::before {
261
- top: -2px;
262
- left: 34px;
263
- }
264
- .mo2fa-ribbon::after,
265
- .mo2fa-ribbon::before {
266
- position: absolute;
267
- content: "";
268
- border: 5px solid #2980b9;
269
- }
270
- .mo2fa-ribbon-top-right::after {
271
- bottom: 34px;
272
- right: 0;
273
- }
274
- .mo2fa_pricing_head_sky {
275
- background-color: #327a86;
276
- border-radius: 1em 1em 50% 50%;
277
- padding: 1em 1em 2em 0em;
278
- color: white;
279
- margin-top: -10%;
280
- height: 15.5em;
281
- }
282
  .wp-core-ui select {
283
  padding: 4px 24px 4px 8px;
284
  margin-left: 1em;
285
  }
286
- .mo2fa_plan-type {
287
- text-align: center;
288
- color: #1f3668;
289
- font-size: 28px;
290
- }
291
- .mo2fa_ul li {
292
- margin-bottom: 0%;
293
- }
294
- .mo2fa_pricing_feature_collection_supporter {
295
- height: 32em;
296
- }
297
- .mo2fa_pricing_head_supporter {
298
- height: 4em;
299
- padding: 2px 1px 1px 1px;
300
- margin-bottom: 1em;
301
- }
302
  i.fa-check {
303
  color: black;
304
  margin-left: 2em;
@@ -320,56 +25,7 @@ i.fa-times {
320
  margin-top: 1em;
321
  color: #b6abab;
322
  }
323
- .mo2fa_pricing_feature_collection {
324
- height: 31em;
325
- }
326
- .mo2fa_limit_pricing_feature_mo_2fa {
327
- color: #b6abab;
328
- font-weight: 500;
329
- }
330
- .mo2fa_unltimate_feature {
331
- text-align: center;
332
- color: #000000;
333
- font-family: Open Sans;
334
- letter-spacing: 0.3px;
335
- padding: 0.5em;
336
- font-family: Open Sans;
337
- }
338
- .mo2fa_sec {
339
- width: 27em;
340
- border-radius: 4px;
341
- box-shadow: 1px 0px 11px 0px #ccc;
342
- height: 70em;
343
- border: 1px solid #ccc;
344
- padding-top: 2em;
345
- }
346
- .mo2f-installation-steps strong{
347
- font-size: 1.1em;
348
- }
349
- .mo2fa_upgrade_my_plan_ent {
350
- border: none;
351
- top: 50%;
352
- left: 50%;
353
- color: white;
354
- padding: 15px 32px;
355
- width: auto;
356
- min-width: 50%;
357
- border-radius: 26px;
358
- text-align: center;
359
- text-decoration: none;
360
- display: inline-block;
361
- background: #327a86;
362
- font-size: 16px;
363
- height: auto;
364
- margin-top: 24px;
365
- margin-bottom: 0.7em;
366
- cursor: pointer;
367
- }
368
- .mo2fa_upgrade_my_plan_ent:hover {
369
- border: none;
370
 
371
- background: #114b56;
372
- }
373
  .mo2fa_upgrade_my_plan {
374
  border: none;
375
  top: 50%;
@@ -396,15 +52,7 @@ i.fa-times {
396
  .mo2fa_plugins {
397
  width: 12%;
398
  }
399
- .mo2fa_pricing_tabs_mo {
400
- background: #fff;
401
- width: auto;
402
- border-radius: 4px;
403
- height: 84.5em;
404
- border: 1px solid #ccc;
405
- padding-top: 2em;
406
- box-shadow: 0 1px 2px 0 rgb(60 64 67 / 30%), 0 1px 3px 1px rgb(60 64 67 / 15%);
407
- }
408
  .mo2fa_make_my_plan_mo {
409
  border: none;
410
  color: white;
@@ -426,42 +74,7 @@ i.fa-times {
426
  .mo2fa_web_sec {
427
  padding: 20px 0;
428
  }
429
- .mo2fa_pricing_head_mo_2fa {
430
- font-size: 20px;
431
- color: white;
432
- line-height: 1.6;
433
- margin-bottom: 3%;
434
- font-family: unset;
435
- }
436
- .mo2fa_method-list-size {
437
- font-size: 11px;
438
- margin-bottom: -3px !important;
439
- list-style: none !important;
440
- margin-left: 2em;
441
- font-weight: 450;
442
- }
443
- .mo2fa_method-list-mo-size-cross {
444
- font-size: 11px;
445
- color: #b6abab;
446
- margin-bottom: -3px !important;
447
- list-style: none !important;
448
- margin-left: 2em;
449
- }
450
- .mo2fa_price_mo_2fa {
451
- font-size: 35px;
452
- font-weight: bold;
453
- color: black;
454
- }
455
- .mo2fa_purchase_user_limit_mo {
456
- margin-top: 22px !important;
457
- margin-bottom: 0px !important;
458
- color: black;
459
- }
460
- .mo2fa_purchase_otp_limit {
461
- margin-top: 10px !important;
462
- margin-bottom: 4px !important;
463
- color: black;
464
- }
465
  .mo2fa_increase_my_limit {
466
  width: 40%;
467
  color: black;
@@ -472,22 +85,7 @@ i.fa-times {
472
  margin-left: -10px;
473
  margin-right: 3px;
474
  }
475
- .mo2fa_feature {
476
- margin-top: -0.5em;
477
- margin-bottom: 0.5em;
478
- font-size: 16px;
479
- }
480
- .mo2fa_ul {
481
- font-size: 15px;
482
- }
483
- .mo2fa_ul li {
484
- font-size: 14px;
485
- font-family: system-ui;
486
- }
487
 
488
- .mo2fa_ul li:nth-of-type(2n + 1) {
489
- background-color: rgba(23, 61, 80, 0.06);
490
- }
491
  .mo2fa_more_details_p,
492
  .mo2fa_more_details_p1 {
493
  font-size: 13px;
@@ -497,28 +95,7 @@ i.fa-times {
497
  color: #4545ff;
498
  text-align: center;
499
  }
500
- .mo2fa_class {
501
- background: aliceblue;
502
- width: 85%;
503
- }
504
- .mo2fa_pricing {
505
- padding: 16px 55px 12px 41px;
506
- height: 10em;
507
- }
508
- .mo2fa_pricing_p {
509
- font-size: 10px;
510
- margin-bottom: -21px;
511
- }
512
- .mo2fa_dollar {
513
- font-size: 46px;
514
- font-weight: 600;
515
- padding: 5px 5px 5px 5px;
516
- margin-top: 35px;
517
- color: white;
518
- }
519
- .mo2fa_country {
520
- margin-top: 2px;
521
- }
522
  .mo2fa_payment_p {
523
  font-size: 110%;
524
  }
@@ -538,80 +115,30 @@ i.fa-times {
538
  border-radius: 5px;
539
  width: 70%;
540
  }
541
- .mo2fa_starting_from {
542
- font-size: 10px;
543
- margin-left: -24px;
 
544
  }
545
- .mo2fa_center {
546
- text-align: center;
 
 
 
547
  }
548
- .mo2fa_pricing_tabs_mo_premium_lite {
549
- background: ffffffad;
550
- border: none !important;
551
- }
552
- .mo2fa_pricing_tabs_mo_premium {
553
- background: ffffffad;
554
- border: none;
555
- box-shadow: 12px;
556
- }
557
- .mo2fa_pricing_tabs_mo_enterprise {
558
- background: ffffffad;
559
- border: none !important;
560
- }
561
- .mo2f_upgrade_super_div {
562
- display: flex;
563
- justify-content: center;
564
- align-content: center;
565
- }
566
- .mo2fa_recommended {
567
- width: 100%;
568
- background: #2a80caa6;
569
- color: white;
570
- height: 3em;
571
- margin-left: 0px;
572
- margin-top: -2em;
573
- font-size: 16px;
574
- margin-bottom: 2em;
575
- padding: 10px 1px 1px 1px;
576
- }
577
- .mo2fa_purchase_limit_mo {
578
- font-size: 16px;
579
- }
580
- .mo2fa_pricing_head_h5 {
581
- margin: 0.67em;
582
- }
583
- .mo2fa_h4 {
584
- font-size: 1.5em;
585
- margin: 0.33em 0;
586
- font-weight: 400;
587
- }
588
- .mo2fa_note_color {
589
- color: red;
590
- }
591
- .mo2fa_note {
592
- font-size: 17px;
593
- }
594
- .mo2fa_setting_layout {
595
- width: 81.5%;
596
- margin-left: 8%;
597
- margin-top: 1%;
598
- box-shadow: 0px 2px 25px 0px #ccc;
599
- }
600
- .mo2fa_bank_transfer {
601
- height: 28px;
602
- width: auto;
603
- }
604
- .mo2fa_category_feature {
605
- font-size: 16px;
606
- font-weight: 600;
607
- padding-bottom: 0.3em;
608
- padding-top: 0.3em;
609
  }
 
610
  .mo2fa_main_category_header {
611
  background: #d5d5d5 !important;
612
  margin-top: 0.3em;
613
  margin-bottom: 0.3em;
614
  }
 
615
  .mo2fa_bg_category_main {
616
  font-size: 17px;
617
  border: 0.5px solid #c1c1c1;
@@ -644,6 +171,7 @@ table.mo2fa_table_features tr:nth-child(odd) {
644
  table.mo2fa_table_features tr:last-child {
645
  border-bottom: 1px solid #c1c1c1;
646
  }
 
647
  .mo2fa_hide {
648
  display: none !important;
649
  }
@@ -651,309 +179,350 @@ table.mo2fa_table_features tr:last-child {
651
  .mo2fa_hide1 {
652
  display: none;
653
  }
 
654
  .mo2fa_comparison {
655
  font-size: 18px;
656
  width: 20%;
657
  }
 
 
658
  .mo2fa_compare1 {
659
  min-width: 22% !important;
660
  width: 10%;
661
  }
662
- .mo2fa_tooltip_sms_info {
663
- position: relative;
664
- display: inline-block;
665
- }
666
 
667
- .mo2fa_tooltip_sms_info .mo2fa_sms_info {
668
- visibility: hidden;
669
- width: 15em;
670
- background-color: #000000b8;
671
- color: #fff;
672
- text-align: left;
673
- border-radius: 6px;
674
- padding: 7px 6px 8px 10px;
675
- position: absolute;
676
- z-index: 1;
677
- top: 0px;
678
- left: 107%;
679
- }
680
- .mo2fa_tooltip_sms_info .mo2fa_sms_info::after {
681
- content: "";
682
- position: absolute;
683
- top: 50%;
684
- right: 100%;
685
- margin-top: -5px;
686
- border-width: 5px;
687
- border-style: solid;
688
- border-color: transparent black transparent transparent;
689
  }
690
- .mo2fa_tooltip_sms_info:hover .mo2fa_sms_info {
691
- visibility: visible;
692
  }
693
- .mo2fa_tooltip_methodlist {
694
- position: relative;
695
- display: inline-block;
 
 
 
 
696
  }
697
- .mo2fa_tooltip_methodlist .mo2fa_methodlist {
698
- visibility: hidden;
699
- width: 14em;
700
- background-color: #000000b8;
701
- color: #fff;
702
- text-align: left;
703
- border-radius: 6px;
704
- padding: 11px 1px 11px 43px;
705
- position: absolute;
706
- z-index: 1;
707
- top: -9.4em;
708
- left: 95%;
709
  }
710
- .mo2fa_tooltip_methodlist .mo2fa_methodlist::after {
711
- content: "";
712
- position: absolute;
713
- top: 50%;
714
- right: 100%;
715
- margin-top: -5px;
716
- border-width: 5px;
717
- border-style: solid;
718
- border-color: transparent black transparent transparent;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
719
  }
720
- .mo2fa_tooltip_methodlist:hover .mo2fa_methodlist {
721
- visibility: visible;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
722
  }
723
 
724
- .mo2fa_ent_tooltip_methodlist {
725
- position: relative;
726
- display: inline-block;
 
 
 
 
 
727
  }
728
- .mo2fa_ent_tooltip_methodlist .mo2fa_methodlist {
729
- visibility: hidden;
730
- width: 14em;
731
- background-color: #000000b8;
732
- color: #fff;
733
- text-align: left;
734
- border-radius: 6px;
735
- padding: 11px 1px 11px 43px;
736
- position: absolute;
737
- z-index: 1;
738
- top: -128px;
739
- right: 110%;
 
 
740
  }
741
- .mo2fa_ent_tooltip_methodlist .mo2fa_methodlist::after {
742
- content: "";
743
- position: absolute;
744
- top: 50%;
745
- left: 100%;
746
- margin-top: -5px;
747
- border-width: 5px;
748
- border-style: solid;
749
- border-color: transparent transparent transparent black;
 
 
 
750
  }
751
- .mo2fa_ent_tooltip_methodlist:hover .mo2fa_methodlist {
752
- visibility: visible;
 
 
753
  }
754
- .mo2fa_rba_tooltip_methodlist {
755
- position: relative;
756
- display: inline-block;
 
 
 
 
 
757
  }
758
- .mo2fa_rba_tooltip_methodlist .mo2fa_methodlist {
759
- visibility: hidden;
760
- width: 14em;
761
- background-color: #000000b8;
762
- color: #fff;
763
- text-align: left;
764
- border-radius: 6px;
765
- padding: 7px 0px 8px 11px;
766
- position: absolute;
767
- z-index: 1;
768
- top: -2.6em;
769
- left: 93%;
770
  }
771
- .mo2fa_rba_tooltip_methodlist .mo2fa_methodlist::after {
772
- content: "";
773
- position: absolute;
774
- top: 50%;
775
- right: 100%;
776
- margin-top: -5px;
777
- border-width: 5px;
778
- border-style: solid;
779
- border-color: transparent black transparent transparent;
780
  }
781
- .mo2fa_rba_tooltip_methodlist:hover .mo2fa_methodlist {
782
- visibility: visible;
 
 
 
 
783
  }
784
- .mo2fa_ent_rba_tooltip_methodlist {
785
- position: relative;
786
- display: inline-block;
787
  }
788
- .mo2fa_ent_rba_tooltip_methodlist .mo2fa_methodlist {
789
- visibility: hidden;
790
- width: auto;
791
- min-width: 10em;
792
- background-color: #000000b8;
793
- color: #fff;
794
- text-align: left;
795
- border-radius: 6px;
796
- padding: 11px 6px 11px 17px;
797
- position: absolute;
798
- z-index: 1;
799
- top: -37px;
800
- right: 108%;
801
  }
802
- .mo2fa_ent_rba_tooltip_methodlist .mo2fa_methodlist::after {
803
- content: "";
804
- position: absolute;
805
- top: 50%;
806
- left: 100%;
807
- margin-top: -5px;
808
- border-width: 5px;
809
- border-style: solid;
810
- border-color: transparent transparent transparent black;
811
  }
812
- .mo2fa_ent_rba_tooltip_methodlist:hover .mo2fa_methodlist {
813
- visibility: visible;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
814
  }
815
- .mo2fa_redirect_tooltip_methodlist {
816
- position: relative;
817
- display: inline-block;
 
 
 
 
818
  }
819
- .mo2fa_redirect_tooltip_methodlist .mo2fa_methodlist {
820
- visibility: hidden;
821
- width: 17em;
822
- background-color: #000000b8;
823
- color: #fff;
824
  text-align: left;
825
- border-radius: 6px;
826
- padding: 10px 3px 10px 34px;
827
- position: absolute;
828
- z-index: 1;
829
- top: -2.1em;
830
- left: 93%;
831
  }
832
- .mo2fa_redirect_tooltip_methodlist .mo2fa_methodlist::after {
833
- content: "";
834
- position: absolute;
835
- top: 50%;
836
- right: 100%;
837
- margin-top: -5px;
838
- border-width: 5px;
839
- border-style: solid;
840
- border-color: transparent black transparent transparent;
841
  }
842
- .mo2fa_redirect_tooltip_methodlist:hover .mo2fa_methodlist {
843
- visibility: visible;
 
 
844
  }
845
- .mo2fa_ent_redirect_tooltip_methodlist {
846
- position: relative;
847
- display: inline-block;
848
  }
849
- .mo2fa_ent_redirect_tooltip_methodlist .mo2fa_methodlist {
850
- visibility: hidden;
851
- width: auto;
852
- min-width: 20em;
853
- background-color: #000000b8;
854
- color: #fff;
855
- text-align: left;
856
- border-radius: 6px;
857
- padding: 11px 1px 11px 13px;
858
- position: absolute;
859
- z-index: 1;
860
- top: -28px;
861
- right: 105%;
862
  }
863
- .mo2fa_ent_redirect_tooltip_methodlist .mo2fa_methodlist::after {
864
- content: "";
865
- position: absolute;
866
- top: 50%;
867
- left: 100%;
868
- margin-top: -5px;
869
- border-width: 5px;
870
- border-style: solid;
871
- border-color: transparent transparent transparent black;
872
  }
873
- .mo2fa_ent_redirect_tooltip_methodlist:hover .mo2fa_methodlist {
874
- visibility: visible;
 
 
875
  }
876
- .mo2fa_role_tooltip_methodlist {
 
877
  position: relative;
878
- display: inline-block;
 
 
879
  }
880
- .mo2fa_role_tooltip_methodlist .mo2fa_methodlist {
881
- visibility: hidden;
882
- width: auto;
883
- min-width: 10em;
884
- background-color: #000000b8;
885
- color: #fff;
886
- text-align: left;
887
- border-radius: 6px;
888
- padding: 6px 7px 8px 17px;
889
- position: absolute;
890
- z-index: 1;
891
- top: -1.1em;
892
- left: 90%;
893
  }
894
- .mo2fa_role_tooltip_methodlist .mo2fa_methodlist::after {
895
- content: "";
896
- position: absolute;
897
- top: 50%;
898
- right: 100%;
899
- margin-top: -5px;
900
- border-width: 5px;
901
- border-style: solid;
902
- border-color: transparent black transparent transparent;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
903
  }
904
- .mo2fa_role_tooltip_methodlist:hover .mo2fa_methodlist {
905
- visibility: visible;
 
 
 
 
 
 
 
906
  }
907
- .mo2fa_ent_role_tooltip_methodlist {
908
- position: relative;
 
909
  display: inline-block;
 
 
 
 
 
 
 
 
 
 
910
  }
911
- .mo2fa_ent_role_tooltip_methodlist .mo2fa_methodlist {
912
- visibility: hidden;
913
- width: auto;
914
- min-width: 10em;
915
- background-color: #000000b8;
916
- color: #fff;
917
- text-align: left;
918
- border-radius: 6px;
919
- padding: 6px 7px 8px 17px;
920
- position: absolute;
921
- z-index: 1;
922
- top: -17px;
923
- right: 110%;
924
- }
925
- .mo2fa_ent_role_tooltip_methodlist .mo2fa_methodlist::after {
926
- content: "";
927
- position: absolute;
928
- top: 50%;
929
- left: 100%;
930
- margin-top: -5px;
931
- border-width: 5px;
932
- border-style: solid;
933
- border-color: transparent transparent transparent black;
934
- }
935
- .mo2fa_ent_role_tooltip_methodlist:hover .mo2fa_methodlist {
936
- visibility: visible;
937
- }
938
- .mo2fa_custom_sms_tooltip_methodlist {
939
  position: relative;
940
  display: inline-block;
941
  }
942
- .mo2fa_custom_sms_tooltip_methodlist .mo2fa_methodlist {
943
  visibility: hidden;
944
- width: auto;
945
- min-width: 16em;
946
  background-color: #000000b8;
947
  color: #fff;
948
  text-align: left;
949
  border-radius: 6px;
950
- padding: 7px 0px 8px 21px;
951
  position: absolute;
952
  z-index: 1;
953
- top: -1.1em;
954
- left: 107%;
 
 
955
  }
956
- .mo2fa_custom_sms_tooltip_methodlist .mo2fa_methodlist::after {
957
  content: "";
958
  position: absolute;
959
  top: 50%;
@@ -963,198 +532,342 @@ table.mo2fa_table_features tr:last-child {
963
  border-style: solid;
964
  border-color: transparent black transparent transparent;
965
  }
966
- .mo2fa_custom_sms_tooltip_methodlist:hover .mo2fa_methodlist {
967
  visibility: visible;
968
  }
969
- .mo2fa_ent_custom_sms_tooltip_methodlist {
970
- position: relative;
971
- display: inline-block;
 
 
 
 
 
972
  }
973
- .mo2fa_ent_custom_sms_tooltip_methodlist .mo2fa_methodlist {
974
- visibility: hidden;
975
- width: auto;
976
- min-width: 16em;
977
- background-color: #000000b8;
978
- color: #fff;
979
- text-align: left;
980
- border-radius: 6px;
981
- padding: 7px 0px 8px 21px;
982
- position: absolute;
983
- z-index: 1;
984
- top: -17px;
985
- right: 106%;
986
  }
987
- .mo2fa_ent_custom_sms_tooltip_methodlist .mo2fa_methodlist::after {
988
- content: "";
989
- position: absolute;
990
- top: 50%;
991
- left: 100%;
992
- margin-top: -5px;
993
- border-width: 5px;
994
- border-style: solid;
995
- border-color: transparent transparent transparent black;
996
  }
997
- .mo2fa_ent_custom_sms_tooltip_methodlist:hover .mo2fa_methodlist {
998
- visibility: visible;
 
 
999
  }
1000
- .mo2fa_enforce_2fa_tooltip_methodlist {
1001
- position: relative;
1002
- display: inline-block;
 
1003
  }
1004
- .mo2fa_enforce_2fa_tooltip_methodlist .mo2fa_methodlist {
1005
- visibility: hidden;
1006
- width: 14em;
1007
- background-color: #000000b8;
1008
- color: #fff;
1009
- text-align: left;
1010
- border-radius: 6px;
1011
- padding: 8px 22px 8px 22px;
1012
- position: absolute;
1013
- z-index: 1;
1014
- top: -1.1em;
1015
- left: 94%;
 
 
 
 
 
 
 
 
 
1016
  }
1017
- .mo2fa_enforce_2fa_tooltip_methodlist .mo2fa_methodlist::after {
1018
- content: "";
1019
- position: absolute;
1020
- top: 50%;
1021
- right: 100%;
1022
- margin-top: -5px;
1023
- border-width: 5px;
1024
- border-style: solid;
1025
- border-color: transparent black transparent transparent;
1026
  }
1027
- .mo2fa_enforce_2fa_tooltip_methodlist:hover .mo2fa_methodlist {
1028
- visibility: visible;
1029
  }
1030
- .mo2fa_ent_enforce_2fa_tooltip_methodlist {
1031
- position: relative;
1032
- display: inline-block;
1033
  }
1034
- .mo2fa_ent_enforce_2fa_tooltip_methodlist .mo2fa_methodlist {
1035
- visibility: hidden;
1036
- width: 18em;
1037
- background-color: #000000b8;
1038
- color: #fff;
1039
- text-align: left;
1040
- border-radius: 6px;
1041
- padding: 11px 1px 11px 43px;
1042
- position: absolute;
1043
- z-index: 1;
1044
- top: -26px;
1045
- right: 110%;
1046
  }
1047
- .mo2fa_ent_enforce_2fa_tooltip_methodlist .mo2fa_methodlist::after {
1048
- content: "";
1049
- position: absolute;
1050
- top: 50%;
1051
- left: 100%;
1052
- margin-top: -5px;
1053
- border-width: 5px;
1054
- border-style: solid;
1055
- border-color: transparent transparent transparent black;
1056
  }
1057
- .mo2fa_ent_enforce_2fa_tooltip_methodlist:hover .mo2fa_methodlist {
1058
- visibility: visible;
 
 
1059
  }
1060
- .mo2fa_enterprise_getting_started {
1061
- margin-top: -1em;
 
 
 
1062
  }
1063
- .mo2fa_table-scrollbar {
1064
- overflow-y: scroll;
1065
- overflow-x: scroll;
1066
- height: 50%;
1067
  }
1068
- .mo2fa_fa-check {
1069
- color: #fff !important;
 
1070
  }
1071
- .mo_wpns_upgrade_page_header {
1072
- margin-top: 0%;
1073
- padding: 10% 0% 0% 0%;
1074
- color: white;
1075
- font-size: 200%;
1076
  }
1077
-
1078
- .mo_wpns_upgrade_security_title {
1079
- width: 23%;
1080
- min-height: 480px;
1081
- background-color: white;
1082
- float: left;
1083
- border: none;
1084
- border-top: none;
1085
- margin-bottom: 1em;
1086
- border-radius: 1em 1em 0.5em 0.5em;
1087
- box-shadow: 0 1px 2px 0 rgb(60 64 67 / 30%), 0 1px 3px 1px rgb(60 64 67 / 15%);
1088
  }
1089
 
1090
- @media only screen and (max-width: 600px) {
1091
- .mo2f_upgrade_super_div {
1092
- display: block;
1093
- }
1094
- .mo2f_upgrade_main_div {
1095
- width: 96%;
1096
- margin-bottom: 6em;
1097
- height: 93em;
1098
  }
1099
- .mo2fa_compare1 {
1100
- width: 101%;
1101
- margin-top: -2em;
1102
- }
1103
- .mo2fa_setting_layout {
1104
- margin-left: 4%;
 
1105
  }
1106
- .mo_2fa_card-deck {
1107
- display: block;
 
 
 
 
 
 
1108
  }
1109
- .mo_2fa_card {
1110
- width: 98%;
 
 
 
 
 
1111
  }
1112
- .mo2f_upgrade_toggle_lable {
1113
- font-size: 1em;
1114
- width: 12em;
 
 
 
 
1115
  }
1116
- .mo_wpns_upgrade_security_title {
1117
- width: 97%;
 
 
 
 
 
1118
  }
1119
- .mo_ns_features_only {
1120
- display: grid;
 
 
 
 
 
1121
  }
 
 
1122
  }
1123
- @media only screen and (min-width: 768px) and (max-width: 1024px) {
1124
- .mo2fa_pricing_head_blue {
1125
- background-color: #1f3668;
1126
- border-radius: 1em 1em 50% 50%;
1127
- padding: 1em 1em 2em 0em;
1128
- margin-top: -13%;
1129
  }
1130
- .mo2fa_pricing_head_sky {
1131
- background-color: #327a86;
1132
- border-radius: 1em 1em 50% 50%;
1133
- padding: 1em 1em 2em 0em;
1134
- margin-top: -14%;
1135
- height: 15.5em;
 
1136
  }
1137
- .mo2fa_pricing_tabs_mo {
1138
- height: 95em;
 
 
 
 
 
 
1139
  }
1140
- .mo2fa_increase_my_limit {
1141
- width: 6em;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1142
  }
1143
- .mo2fa_unltimate_feature {
1144
- height: 2em;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1145
  }
1146
- .mo2f_upgrade_main_div {
1147
- width: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1148
  }
1149
- .mo2fa_upgrade_my_plan {
1150
- border: none;
1151
- color: white;
1152
- padding: 15px 32px;
1153
- width: auto;
1154
- min-width: 50%;
1155
- border-radius: 26px;
1156
- text-align: center;
1157
- text-decoration: none;
1158
- display: inline-block;
1159
  }
1160
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  .wp-core-ui select {
3
  padding: 4px 24px 4px 8px;
4
  margin-left: 1em;
5
  }
6
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  i.fa-check {
8
  color: black;
9
  margin-left: 2em;
25
  margin-top: 1em;
26
  color: #b6abab;
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
 
 
29
  .mo2fa_upgrade_my_plan {
30
  border: none;
31
  top: 50%;
52
  .mo2fa_plugins {
53
  width: 12%;
54
  }
55
+
 
 
 
 
 
 
 
 
56
  .mo2fa_make_my_plan_mo {
57
  border: none;
58
  color: white;
74
  .mo2fa_web_sec {
75
  padding: 20px 0;
76
  }
77
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  .mo2fa_increase_my_limit {
79
  width: 40%;
80
  color: black;
85
  margin-left: -10px;
86
  margin-right: 3px;
87
  }
 
 
 
 
 
 
 
 
 
 
 
 
88
 
 
 
 
89
  .mo2fa_more_details_p,
90
  .mo2fa_more_details_p1 {
91
  font-size: 13px;
95
  color: #4545ff;
96
  text-align: center;
97
  }
98
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  .mo2fa_payment_p {
100
  font-size: 110%;
101
  }
115
  border-radius: 5px;
116
  width: 70%;
117
  }
118
+
119
+
120
+ .mo2fa_note {
121
+ font-size: 17px;
122
  }
123
+
124
+
125
+ .mo2fa_bank_transfer {
126
+ height: 28px;
127
+ width: auto;
128
  }
129
+ .mo2fa_category_feature {
130
+ font-size: 16px;
131
+ font-weight: 600;
132
+ padding-bottom: 0.3em;
133
+ padding-top: 0.3em;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  }
135
+
136
  .mo2fa_main_category_header {
137
  background: #d5d5d5 !important;
138
  margin-top: 0.3em;
139
  margin-bottom: 0.3em;
140
  }
141
+
142
  .mo2fa_bg_category_main {
143
  font-size: 17px;
144
  border: 0.5px solid #c1c1c1;
171
  table.mo2fa_table_features tr:last-child {
172
  border-bottom: 1px solid #c1c1c1;
173
  }
174
+
175
  .mo2fa_hide {
176
  display: none !important;
177
  }
179
  .mo2fa_hide1 {
180
  display: none;
181
  }
182
+
183
  .mo2fa_comparison {
184
  font-size: 18px;
185
  width: 20%;
186
  }
187
+
188
+
189
  .mo2fa_compare1 {
190
  min-width: 22% !important;
191
  width: 10%;
192
  }
 
 
 
 
193
 
194
+
195
+ .mo2fa_table-scrollbar {
196
+ overflow-y: scroll;
197
+ overflow-x: scroll;
198
+ height: 50%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  }
200
+ .mo2fa_fa-check {
201
+ color: #fff !important;
202
  }
203
+
204
+ .mo_wpns_upgrade_page_header {
205
+ margin-top: 0%;
206
+ padding: 10% 0% 0% 0%;
207
+ color: white;
208
+ font-size: 200%;
209
+ line-height:1.5em;
210
  }
211
+
212
+ .mo_wpns_upgrade_security_title {
213
+ width: 23%;
214
+ min-height: 480px;
215
+ background-color: white;
216
+ float: left;
217
+ border: none;
218
+ border-top: none;
219
+ margin-bottom: 1em;
220
+ border-radius: 1em 1em 0.5em 0.5em;
221
+ box-shadow: 0 1px 2px 0 rgb(60 64 67 / 30%), 0 1px 3px 1px rgb(60 64 67 / 15%);
 
222
  }
223
+
224
+ @media only screen and (max-width: 600px) {
225
+
226
+
227
+ .mo2fa_compare1 {
228
+ width: 101%;
229
+ margin-top: -2em;
230
+ }
231
+
232
+ .mo_2fa_card-deck {
233
+ display: block;
234
+ }
235
+ .mo_2fa_card {
236
+ width: 98%;
237
+ }
238
+ .mo2f_upgrade_toggle_lable {
239
+ font-size: 1em;
240
+ width: 12em;
241
+ }
242
+ .mo_wpns_upgrade_security_title {
243
+ width: 97%;
244
+ }
245
+ .mo_ns_features_only {
246
+ display: grid;
247
+ }
248
  }
249
+ @media only screen and (min-width: 768px) and (max-width: 1024px) {
250
+
251
+
252
+ .mo2fa_increase_my_limit {
253
+ width: 6em;
254
+ }
255
+
256
+
257
+ .mo2fa_upgrade_my_plan {
258
+ border: none;
259
+ color: white;
260
+ padding: 15px 32px;
261
+ width: auto;
262
+ min-width: 50%;
263
+ border-radius: 26px;
264
+ text-align: center;
265
+ text-decoration: none;
266
+ display: inline-block;
267
+ }
268
  }
269
 
270
+ .mo2f-cloud-onprem-solution {
271
+ text-align: center;
272
+ color: black;
273
+ padding: 0.4167em;
274
+ border-radius: 1em;
275
+ z-index: 1;
276
+ margin-right: 0.5em;
277
+ margin-left: 0.5em;
278
  }
279
+
280
+ .mo2f-ribbon-title{
281
+ font-size:1.6667em;
282
+ padding-top: 0.4em;
283
+ }
284
+ .mo2f-cloud-solution-ribbon{
285
+ background-color: #c7e8f1;
286
+ background-color: #1d66ff2e;
287
+ border-radius: 0.7500em;
288
+ width: 49.5%;
289
+ box-shadow: rgba(0, 0, 0, 0.18) 0px 2px 4px;
290
+ padding-top:1.2500em;
291
+ float: left;
292
+
293
  }
294
+
295
+ .mo2f-on-prem-ribbon{
296
+ background-color:#c7e8f1;
297
+ background-color: #1d66ff2e;
298
+ border-radius:0.7500em;
299
+ width: 48.5%;
300
+ margin-left: 1em;
301
+ box-shadow: rgba(0, 0, 0, 0.18) 0px 2px 4px;
302
+
303
+ padding-top:1.2500em;
304
+ float: left;
305
+
306
  }
307
+
308
+ .mo2f-upper-row {
309
+ margin-left: 1em;
310
+ margin-right: 1em;
311
  }
312
+
313
+ .mo2f-cloud-onprem-solution {
314
+ text-align: center;
315
+ color: black;
316
+ padding: 0.4167em;
317
+ border-radius: 1em;
318
+ z-index: 1;
319
+
320
  }
321
+
322
+ .mo2f-text-center {
323
+ text-align: center;
 
 
 
 
 
 
 
 
 
324
  }
325
+ .mo2f-single-site-rot {
326
+ transform: rotateY(0deg);
 
 
 
 
 
 
 
327
  }
328
+
329
+ .mo2f-single-site {
330
+ width: 100%;
331
+ display: flex;
332
+ justify-content: center;
333
+
334
  }
335
+
336
+ .mo2f-single-site {
337
+ flex-direction: row;
338
  }
339
+
340
+ .mo2f-hover-2fa {
341
+ width: 25%;
342
+ border-radius: 0.8333em;
343
+ margin: 0.3em;
344
+ background:rgb(255, 255, 255); ;
345
+ padding-right: 1.25em;
346
+ padding-left: 1.25em;
347
+ float:left;
348
+ font-family:'Poppins', sans-serif;
349
+ font-size: 1em;
350
+ box-shadow: rgb(0 0 0 / 20%) 0px 0.75em 1.75em 0em, rgb(0 0 0 / 10%) 0em 0.125em 0.25em 0em, rgb(255 255 255 / 5%) 0em 0em 0em 0.0625em inset;
 
351
  }
352
+
353
+ .mo2f-col-me-4{
354
+ position: relative;
355
+ min-height: 0.0625em;
356
+
 
 
 
 
357
  }
358
+ .mo2f-hover-2fa h3{
359
+ font-family:Arial, Helvetica, sans-serif;
360
+ font-weight: 700;
361
+ font-size:2.1666em;
362
+ text-transform: none;
363
+ letter-spacing: 0.2px;
364
+ color: #585858;
365
+ text-rendering: optimizeLegibility;
366
+ margin-block-start: 1em;
367
+ margin-block-end: 1em;
368
+ margin-inline-start: 0px;
369
+ margin-inline-end: 0px;
370
+ margin-bottom:0.8em;
371
+ margin-top: 0.8em;
372
+ }
373
+ .mo2f-price-list1 {
374
+
375
+ border-top: 0.0625em solid #fff;
376
+ border-bottom: 0.0625em solid #fff;
377
+ font-size: 1.2em;
378
+ background: white;
379
+
380
  }
381
+ .mo2f-price-list1 .mo2f-choose-plan-2fa {
382
+
383
+ display: block;
384
+ font-family:'Open sans', sans-serif !important;
385
+ font-weight: 300;
386
+ color: rgb(105, 100, 100);
387
+
388
  }
389
+ .mo2f-text-left {
 
 
 
 
390
  text-align: left;
391
+
 
 
 
 
 
392
  }
393
+ .mo2f-hover-2fa.fas {
394
+ font-weight: 900;
395
+ font-family:'Open sans', sans-serif !important;
396
+ -webkit-font-smoothing: antialiased;
397
+ display: inline-block;
398
+ font-style: normal;
399
+ font-variant: normal;
400
+ text-rendering: auto;
401
+ line-height: 1;
402
  }
403
+
404
+
405
+ .mo2f-text-success {
406
+ color: #1d66ff;
407
  }
408
+
409
+ .mo2f-hover-2fa .fa-xs {
410
+ font-size: .75em;
411
  }
412
+
413
+ .mo2f-mt {
414
+ margin-top: 0.5em;
415
+ margin-bottom: 2em;
416
+ margin: 0 0 0.625em;
417
+ display: block;
418
+ margin-block-start: 1em;
419
+ margin-block-end: 1em;
420
+ margin-inline-start: 0px;
421
+ margin-inline-end: 0px;
 
 
 
422
  }
423
+
424
+ .mo2f-display-1 {
425
+ font-size: 2.0em;
426
+ font-weight: 200;
 
 
 
 
 
427
  }
428
+ .mo2f-year {
429
+ font-size: 12px;
430
+ font-weight: 500;
431
+ color: black;
432
  }
433
+ .mo2f-hover-2fa sub {
434
+ bottom: -0.25em;
435
  position: relative;
436
+
437
+ line-height: 0;
438
+ vertical-align: baseline;
439
  }
440
+
441
+ .mo2f-inst-btn2 {
442
+ background-color: #fff;
443
+ padding: 3%;
444
+ border-radius: 8%;
445
+ height: 1%;
446
+ min-height: 2.0625em;
447
+ width: fit-content;
448
+ margin:5%;
449
+
 
 
 
450
  }
451
+
452
+ .mo2f-mt select{
453
+ font-family: inherit;
454
+ font-size: inherit;
455
+ line-height: inherit;
456
+ text-transform: none;
457
+ margin: 0;
458
+ font: inherit;
459
+ color: inherit;
460
+ outline: 0;
461
+ text-align: left;
462
+ vertical-align: top;
463
+ box-shadow: none!important;
464
+ border: 1px solid #E9E9E9;
465
+ background: #f5f5f5;
466
+ writing-mode: horizontal-tb !important;
467
+ text-rendering: auto;
468
+ letter-spacing: normal;
469
+ word-spacing: normal;
470
+ text-indent: 0px;
471
+ text-shadow: none;
472
+ display: inline-block;
473
+ appearance: auto;
474
+ align-items: center;
475
+ white-space: pre;
476
+ -webkit-rtl-ordering: logical;
477
+ cursor: default;
478
+
479
  }
480
+
481
+ .mo2f-license-btn-2fa {
482
+ color: #1d66ff!important;
483
+ font-size: 1.2em;
484
+ padding:0.625em 1.875em 0.625em 1.875em;
485
+ border-radius: 0.5625em;
486
+ background: #e3ecfe;
487
+ font-weight: 600;
488
+ box-shadow: rgb(50 50 105 / 15%) 0em 0.125em 0.3125em 0em, rgb(0 0 0 / 5%) 0em 0.0625em 0.0625em 0em;
489
  }
490
+
491
+ .mo2f-license-btn {
492
+
493
  display: inline-block;
494
+ margin-bottom:2em;
495
+ line-height: 1.42857143;
496
+ text-align: center;
497
+ white-space: nowrap;
498
+ vertical-align: middle;
499
+ touch-action: manipulation;
500
+ cursor: pointer;
501
+ user-select: none;
502
+ border:0.0625em solid transparent;
503
+
504
  }
505
+
506
+ .mo2fa_15_tooltip_methodlist {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  position: relative;
508
  display: inline-block;
509
  }
510
+ .mo2fa_15_tooltip_methodlist .mo2fa_methodlist {
511
  visibility: hidden;
512
+ width: 12em;
 
513
  background-color: #000000b8;
514
  color: #fff;
515
  text-align: left;
516
  border-radius: 6px;
517
+ padding: 11px 12px 11px 23px;
518
  position: absolute;
519
  z-index: 1;
520
+ top: -2em;
521
+ left: 100%;
522
+ margin-left:-6em;
523
+
524
  }
525
+ .mo2fa_15_tooltip_methodlist .mo2fa_methodlist::after {
526
  content: "";
527
  position: absolute;
528
  top: 50%;
532
  border-style: solid;
533
  border-color: transparent black transparent transparent;
534
  }
535
+ .mo2fa_15_tooltip_methodlist:hover .mo2fa_methodlist {
536
  visibility: visible;
537
  }
538
+
539
+ .mo2f-license-btn-2fa:hover{
540
+ box-shadow: rgba(136, 165, 191, 0.48) 0.375em 0.125em 1em 0em, rgba(255, 255, 255, 0.8) -0.375em -0.125em 1em 0em;
541
+ }
542
+ .mo2f-container-dropdown{
543
+ align-items:left;
544
+ margin-top: -1.5em;
545
+
546
  }
547
+ .mo2f-dropdown-width{
548
+ width:8em;
 
 
 
 
 
 
 
 
 
 
 
549
  }
550
+
551
+ .mo2f-price-list .mo2f-choose-plan-2fa {
552
+ display: block;
553
+ font-family:'Open sans', sans-serif !important;
554
+ font-style:normal;
555
+ font-variant: normal;
556
+ font-weight: 300;
557
+ color: rgb(105, 100, 100);
558
+
559
  }
560
+
561
+ .mo2f-premium-color {
562
+ color: #96df8a!important;
563
+ font-weight: bold!important;
564
  }
565
+
566
+ .mo2f-basic-color {
567
+ color: #ffc06d!important;
568
+ font-weight: bold!important;
569
  }
570
+
571
+ .mo2f-price-tag {
572
+ width: 9em;
573
+ display: flex;
574
+ justify-content: center;
575
+ align-items: center;
576
+ height: 2.9375em;
577
+ border-radius: 0.5em 0.5em 0 0.5em;
578
+ background: #46a9f4;
579
+ z-index: 99;
580
+ position: absolute;
581
+ top: -1.8em;
582
+ left: 68%;
583
+ }
584
+ .mo2f-price {
585
+ color: #fff;
586
+ font-size: 1.2em;
587
+ list-style-type: none;
588
+ margin: 0;
589
+ padding: 0;
590
+ transition: .3s;
591
  }
592
+
593
+ .mo2f-price-list {
594
+
595
+ border-top: 0.0625em solid #fff;
596
+ border-bottom: 0.0625em solid #fff;
597
+ font-size: 1.2em;
598
+ background: white;
599
+
 
600
  }
601
+ .mo2f-price-list li{
602
+ margin-bottom:0.1875em;
603
  }
604
+
605
+ .mo2f-plan-head-2fa {
606
+ text-align: center;
607
  }
608
+
609
+ .mo2f-plan-head-2fa {
610
+ color: #000000;
611
+ font-weight: unset;
612
+ margin-bottom: 0.7em;
613
+
 
 
 
 
 
 
614
  }
615
+
616
+ #mo2f_twofa_plans h2{
617
+ font-family:'Open sans', sans-serif !important;
618
+ margin-top:0.75em;
619
+ font-size: 2.5em;
620
+ line-height: 2.1875em;
621
+ text-transform: none;
622
+ letter-spacing: 0.0125em;
 
623
  }
624
+
625
+ .mo2f-pp-row {
626
+ margin-right: 0.9375em;
627
+ margin-left: 0.9375em;
628
  }
629
+
630
+
631
+
632
+ .mo2f-price-list-incl {
633
+ background: linear-gradient(145deg, #fafbfe,#e3ecfe);
634
  }
635
+
636
+ #mo2f-list-margin li span{
637
+ margin-left: -0.625em;
 
638
  }
639
+
640
+ #mo2fa-plan-name h3{
641
+ font-size:1.75em;
642
  }
643
+ #mo2f-list-margin li .mo2fa_15_tooltip_methodlist span{
644
+ margin-left:-0.925em;
 
 
 
645
  }
646
+ .mo2f_price_list_border{
647
+ box-shadow: rgb(3 102 214 / 30%) 0em 0em 0em 0.1875em;
648
+ border-radius: 0.625em;
649
+ padding-left: 0.625em;
650
+ padding-right:0.625em;
651
+ padding-bottom:0.1em;
652
+
653
+ }
654
+ .mo2f-reg-plans-2fa{
655
+ letter-spacing: 0.3px;
 
656
  }
657
 
658
+ @media only screen and (min-width: 2350px)
659
+ {
660
+ .mo2f_price_list_border{
661
+ height:18em;
 
 
 
 
662
  }
663
+
664
+
665
+ }
666
+ @media only screen and (min-width: 2150px)and (max-width:2350px)
667
+ {
668
+ .mo2f_price_list_border{
669
+ height:19.5em;
670
  }
671
+
672
+
673
+ }
674
+
675
+ @media only screen and (min-width: 1950px)and (max-width:2150px)
676
+ {
677
+ .mo2f_price_list_border{
678
+ height:20.8em;
679
  }
680
+
681
+
682
+ }
683
+ @media only screen and (min-width: 1750px)and (max-width:1950px)
684
+ {
685
+ .mo2f_price_list_border{
686
+ height:21em;
687
  }
688
+
689
+
690
+ }
691
+ @media only screen and (min-width: 1550px)and (max-width:1750px)
692
+ {
693
+ .mo2f_price_list_border{
694
+ height:22em;
695
  }
696
+
697
+
698
+ }
699
+ @media only screen and (min-width: 1400px)and (max-width:1550px)
700
+ {
701
+ .mo2f_price_list_border{
702
+ height:24.5em;
703
  }
704
+
705
+
706
+ }
707
+ @media only screen and (min-width: 1300px)and (max-width:1400px)
708
+ {
709
+ .mo2f_price_list_border{
710
+ height:25.5em;
711
  }
712
+
713
+
714
  }
715
+ @media only screen and (min-width: 1200px)and (max-width:1300px)
716
+ {
717
+ .mo2f_price_list_border{
718
+ height:28.5em;
 
 
719
  }
720
+
721
+
722
+ }
723
+ @media only screen and (min-width: 1000px)and (max-width:1200px)
724
+ {
725
+ .mo2f_price_list_border{
726
+ height:31em;
727
  }
728
+
729
+
730
+ }
731
+
732
+ @media only screen and (min-width:769px)and (max-width:1000px)
733
+ {
734
+ .mo2f_price_list_border{
735
+ height:31.5em;
736
  }
737
+
738
+
739
+ }
740
+
741
+ @media screen and (max-width: 550px){
742
+ .mo2f-cloud-solution-ribbon-rpn {
743
+ text-align: center;
744
+ color: black;
745
+ padding: 5px;
746
+ border-radius: 1em;
747
+ margin-bottom: 0.5em;
748
+ z-index: 1;
749
+ background-color: #ebf1fa;
750
+ border-radius: 9px;
751
+ width: 100%;
752
+ box-shadow: rgb(0 0 0 / 18%) 0px 2px 4px;
753
+ display: block;
754
+ }
755
+
756
+ }
757
+ @media screen and (min-width:550px){
758
+ .mo2f-cloud-solution-ribbon-rpn{
759
+ display: none;
760
  }
761
+ }
762
+ @media screen and (max-width: 550px){
763
+ .mo2f-ribbon-title {
764
+ font-size: 20px;
765
+ padding-top: 0.4em;
766
+ }
767
+
768
+ .mo2f-single-site {
769
+ flex-direction: column;
770
+ }
771
+ }
772
+
773
+ @media screen and (max-width: 550px){
774
+ .mo2f-cloud-solution-ribbon {
775
+ display: none;
776
+ }
777
+ }
778
+
779
+ .mo2f-col-md-4{
780
+
781
+ position: relative;
782
+
783
+
784
+ }
785
+ @media screen and (max-width: 550px){
786
+ .mo2f-on-prem-ribbon {
787
+ display: none;
788
+ }
789
+ .mo2f-price-tag{
790
+ left:75%;
791
+ }
792
+ }
793
+ @media screen and (max-width: 550px){
794
+ .mo2f-hover-2fa {
795
+ width: 90%;
796
+ border-radius: 10px;
797
+ height: auto;
798
+ border: 5px solid white;
799
+ font-family: 'Poppins', sans-serif;
800
+ margin-bottom: 1em;
801
+ margin-top: 1em;
802
+ box-shadow: rgb(0 0 0 / 20%) 0px 12px 28px 0px, rgb(0 0 0 / 10%) 0px 2px 4px 0px, rgb(255 255 255 / 5%) 0px 0px 0px 1px inset;
803
+ }
804
+ }
805
+
806
+ @media screen and (max-width: 550px){
807
+ .mo2f-price-list {
808
+ border-top: 1px solid #fff;
809
+ border-bottom: 1px solid #fff;
810
+ font-size: 1.4em;
811
+ background: white;
812
+ border-radius: 10px;
813
+ height: auto;
814
+ box-shadow: rgb(3 102 214 / 30%) 0px 0px 0px 3px;
815
+
816
+ }
817
+ }
818
+
819
+ @media screen and (max-width: 550px){
820
+ .mo2f-on-prem-ribbon-rpn {
821
+ text-align: center;
822
+ color: black;
823
+ padding: 5px;
824
+ border-radius: 1em;
825
+ margin-bottom: 0.5em;
826
+ z-index: 1;
827
+ background-color: #ebf1fa;
828
+ border-radius: 9px;
829
+ width: 94%;
830
+ margin-left:8px;
831
+ box-shadow: rgb(0 0 0 / 18%) 0px 2px 4px;
832
+ display: block;
833
+ }
834
+ }
835
+ @media screen and (min-width:550px){
836
+ .mo2f-on-prem-ribbon-rpn{
837
+ display: none;
838
  }
839
+
840
+ }
841
+ @media screen and (max-width:550px){
842
+ .mo2fa_15_tooltip_methodlist .mo2fa_methodlist {
843
+ visibility: hidden;
844
+ width: 12em;
845
+ background-color: #000000b8;
846
+ color: #fff;
847
+ text-align: left;
848
+ border-radius: 0.375em;
849
+ padding: 0.6875em 0.75em 0.6875em 1.4375em;
850
+ position: absolute;
851
+ z-index: 1;
852
+ top: 4em;
853
+ left:2%;
854
+ line-height:1.4em;
855
+
856
  }
857
+
858
+ .mo2fa_15_tooltip_methodlist .mo2fa_methodlist::after {
859
+ content: "";
860
+ position: absolute;
861
+ top: -3%;
862
+ left: 50%;
863
+ margin-left: -0.3125em;
864
+ border-width: 0.3125em;
865
+ border-style: solid;
866
+ border-color: transparent transparent black transparent;
867
  }
868
  }
869
+
870
+
871
+ .mo2fa-top-auth-unbold {
872
+ font-weight:400;
873
+ }
includes/js/settings_page.js CHANGED
@@ -101,12 +101,6 @@ jQuery(document).ready(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);
108
- });
109
-
110
 
111
  $(".dismiss_brute_force_notice").click(function(){
112
  ajaxCall("dismissbruteforce",".plugin_warning_hide-notice",true);
101
  ajaxCall("dismissplugin",".plugin_warning_hide-notice",true);
102
  });
103
 
 
 
 
 
 
 
104
 
105
  $(".dismiss_brute_force_notice").click(function(){
106
  ajaxCall("dismissbruteforce",".plugin_warning_hide-notice",true);
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.6.1
7
  * Author: miniOrange
8
  * Author URI: https://miniorange.com
9
  * Text Domain: miniorange-2-factor-authentication
@@ -14,7 +14,7 @@
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.6.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'));
@@ -298,7 +298,7 @@
298
  {
299
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Firewall' ,'administrator','mo_2fa_waf' , array( $this, 'mo_wpns'),3);
300
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Login and Spam' ,'administrator','mo_2fa_login_and_spam' , array( $this, 'mo_wpns'),4);
301
- add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Backup' ,'administrator','mo_2fa_backup' , array( $this, 'mo_wpns'),5);
302
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Malware Scan' ,'administrator','mo_2fa_malwarescan' , array( $this, 'mo_wpns'),6);
303
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'IP Blocking' ,'administrator','mo_2fa_advancedblocking' , array( $this, 'mo_wpns'),7);
304
 
@@ -352,7 +352,7 @@
352
  function mo_wpns_activate()
353
  {
354
 
355
- global $wpnsDbQueries,$Mo2fdbQueries;
356
  $userid = wp_get_current_user()->ID;
357
  $wpnsDbQueries->mo_plugin_activate();
358
  $Mo2fdbQueries->mo_plugin_activate();
@@ -378,6 +378,11 @@
378
  if(is_multisite()){
379
  add_site_option('mo2fa_superadmin',1);
380
  }
 
 
 
 
 
381
  MO2f_Utility::mo2f_debug_file('Plugin activated');
382
 
383
 
@@ -550,8 +555,7 @@
550
  require('api/class-customer-onprem-setup.php');
551
  require('api/class-rba-attributes.php');
552
  require('api/class-two-factor-setup.php');
553
- // require('api/mo2f_api.php');
554
- require('handler/backup.php');
555
  require('handler/WAF/mo-waf-real-time.php');
556
  require('handler/security_features.php');
557
  require('handler/feedback_form.php');
@@ -575,7 +579,6 @@
575
  require('controllers/wpns-loginsecurity-ajax.php');
576
  require('controllers/malware_scanner/malware_scan_ajax.php');
577
  require('controllers/duo_authenticator/duo_authenticator_ajax.php');
578
- require('controllers/backup/backup_ajax.php');
579
 
580
  require('controllers/twofa/two_factor_ajax.php');
581
  require('controllers/dashboard_ajax.php');
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.6.2
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.6.2' );
18
  define( 'MO2F_PLUGIN_URL', (plugin_dir_url(__FILE__)));
19
  define( 'MO2F_TEST_MODE', false );
20
  define( 'MO2F_IS_ONPREM', get_option('is_onprem'));
298
  {
299
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Firewall' ,'administrator','mo_2fa_waf' , array( $this, 'mo_wpns'),3);
300
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Login and Spam' ,'administrator','mo_2fa_login_and_spam' , array( $this, 'mo_wpns'),4);
301
+
302
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'Malware Scan' ,'administrator','mo_2fa_malwarescan' , array( $this, 'mo_wpns'),6);
303
  add_submenu_page( $menu_slug ,'miniOrange 2-Factor' ,'IP Blocking' ,'administrator','mo_2fa_advancedblocking' , array( $this, 'mo_wpns'),7);
304
 
352
  function mo_wpns_activate()
353
  {
354
 
355
+ global $wpnsDbQueries,$Mo2fdbQueries,$wp_roles;
356
  $userid = wp_get_current_user()->ID;
357
  $wpnsDbQueries->mo_plugin_activate();
358
  $Mo2fdbQueries->mo_plugin_activate();
378
  if(is_multisite()){
379
  add_site_option('mo2fa_superadmin',1);
380
  }
381
+ if (isset($wp_roles)){
382
+ foreach($wp_roles->role_names as $role => $name) {
383
+ update_option('mo2fa_'.$role, 1);
384
+ }
385
+ }
386
  MO2f_Utility::mo2f_debug_file('Plugin activated');
387
 
388
 
555
  require('api/class-customer-onprem-setup.php');
556
  require('api/class-rba-attributes.php');
557
  require('api/class-two-factor-setup.php');
558
+
 
559
  require('handler/WAF/mo-waf-real-time.php');
560
  require('handler/security_features.php');
561
  require('handler/feedback_form.php');
579
  require('controllers/wpns-loginsecurity-ajax.php');
580
  require('controllers/malware_scanner/malware_scan_ajax.php');
581
  require('controllers/duo_authenticator/duo_authenticator_ajax.php');
 
582
 
583
  require('controllers/twofa/two_factor_ajax.php');
584
  require('controllers/dashboard_ajax.php');
readme.txt CHANGED
@@ -6,7 +6,7 @@ Donate link: https://miniorange.com/
6
  Requires at least: 3.0.1
7
  Tested up to: 6.0.2
8
  Requires PHP: 5.3.0
9
- Stable tag: 5.6.1
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
 
@@ -20,7 +20,7 @@ USERS DON'T REQUIRE ACCESS TO THE WORDPRESS DASHBOARD TO SET UP 2FA making it ex
20
 
21
  Check out following video to configure google authenticator as a 2fa:
22
 
23
- [youtube https://youtu.be/_nkMCkxLcIs]
24
 
25
  [Features](https://plugins.miniorange.com/2-factor-authentication-for-wordpress-wp-2fa?utm_source=wordpress&utm_medium=readme+link&utm_campaign=last+June#key-features) | [7 day Premium trial](https://plugins.miniorange.com/wordpress-2fa-free-trial-request)
26
 
@@ -60,9 +60,9 @@ Users will receive an OTP at the time of registration which will be used to veri
60
  = Plugin Integrations and Support for all methods of two-factor authentication/two step verification ( WP 2FA/TFA/OTP Authentication ) =
61
  Our plugin is integrated with [popular Plugins](https://plugins.miniorange.com/2-factor-authentication-for-wordpress-wp-2fa#integrations) such as [WooCommerce](https://developers.miniorange.com/docs/security/wordpress/wp-security/2fa_on_woocomerce_login), [Ultimate member](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-ultimate-member-login-form), [User Registration](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-user-registration-login-form), [Restrict Content Pro](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-restrict-content-pro-login-form), [Login Press](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-login-press-login-form), [Registration Magic](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-registrationmagic-form), [Admin Custom Login](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-admin-custom-login-form), [Buddy Press](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-buddypress-login-form), [Theme My Login](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-theme-my-login-form), [Elementor Pro](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-elementor-pro-login-form), [Profile Builder](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-profile-builder-login-form), [Login With Ajax](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-login-with-ajax-form) and many more.
62
 
63
- = [Third Party Custom SMS Gateway for OTP Over SMS](https://plugins.miniorange.com/wordpress-two-factor-authentication-setup-guides#) ( OTP Login/two-factor authentication / 2FA ) =
64
  The premium plugin supports any third-party **custom SMS Gateway**. If you don't have your SMS gateway you can use miniOrange gateway and send SMS(OTP over SMS) all over the world for OTP authentication.
65
- [Here](https://plugins.miniorange.com/supported-sms-email-gateways) are some famous gateways supported for two-factor (WP 2FA/TFA/OTP).
66
  [Test your Gateway](https://login.xecurify.com/moas/login?redirectUrl=https://login.xecurify.com/moas/admin/customer/smsconfig)
67
 
68
  = Why do you need to register for google authenticator? =
@@ -219,25 +219,27 @@ You should go to <b>Setup Two-Factor (2FA) </b> Tab and click on <b>Reconfigure<
219
 
220
  == Changelog ==
221
 
 
 
 
 
 
 
222
  = 5.6.1 =
223
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
224
  * Bug fix- Headers already sent
225
  * Added SMTP check for sending backup codes on 2fa prompt
226
 
227
- = 5.6.0 =
228
- * Google Authenticator - Two factor Authentication (2FA, OTP) :
229
- * Added new feature - the grace period for users
230
- * Updated setup wizard UI - Included user-based settings in the wizard
231
- * Added dashboard to check 2fa status of users
232
- * Login report of users available even when Network Security is disabled
233
- * Handled backup codes flow when sitestats is unreachable
234
- * Added access control and nonce checks in some flows - Malware scan, plugin enable/disable
235
- * Fixed warning issues - fetching location details using geoplugin API
236
-
237
  For older changelog entries, please see the [additional changelog.txt file](https://plugins.svn.wordpress.org/miniorange-2-factor-authentication/trunk/changelog.txt) provided with the plugin.
238
 
239
  == Upgrade Notice ==
240
 
 
 
 
 
 
 
241
  = 5.6.1 =
242
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
243
  * Bug fix- Headers already sent
6
  Requires at least: 3.0.1
7
  Tested up to: 6.0.2
8
  Requires PHP: 5.3.0
9
+ Stable tag: 5.6.2
10
  License: GPLv2 or later
11
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
12
 
20
 
21
  Check out following video to configure google authenticator as a 2fa:
22
 
23
+ [youtube https://youtu.be/6je2iARqrcs]
24
 
25
  [Features](https://plugins.miniorange.com/2-factor-authentication-for-wordpress-wp-2fa?utm_source=wordpress&utm_medium=readme+link&utm_campaign=last+June#key-features) | [7 day Premium trial](https://plugins.miniorange.com/wordpress-2fa-free-trial-request)
26
 
60
  = Plugin Integrations and Support for all methods of two-factor authentication/two step verification ( WP 2FA/TFA/OTP Authentication ) =
61
  Our plugin is integrated with [popular Plugins](https://plugins.miniorange.com/2-factor-authentication-for-wordpress-wp-2fa#integrations) such as [WooCommerce](https://developers.miniorange.com/docs/security/wordpress/wp-security/2fa_on_woocomerce_login), [Ultimate member](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-ultimate-member-login-form), [User Registration](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-user-registration-login-form), [Restrict Content Pro](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-restrict-content-pro-login-form), [Login Press](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-login-press-login-form), [Registration Magic](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-registrationmagic-form), [Admin Custom Login](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-admin-custom-login-form), [Buddy Press](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-buddypress-login-form), [Theme My Login](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-theme-my-login-form), [Elementor Pro](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-elementor-pro-login-form), [Profile Builder](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-profile-builder-login-form), [Login With Ajax](https://plugins.miniorange.com/two-factor-authentication-2fa-mfa-for-login-with-ajax-form) and many more.
62
 
63
+ = Third Party Custom SMS Gateway for OTP Over SMS( OTP Login/two-factor authentication / 2FA ) =
64
  The premium plugin supports any third-party **custom SMS Gateway**. If you don't have your SMS gateway you can use miniOrange gateway and send SMS(OTP over SMS) all over the world for OTP authentication.
65
+ [Here](https://plugins.miniorange.com/sms-email-gateways-supported-by-2fa-plugin) are some famous gateways supported for two-factor (WP 2FA/TFA/OTP).
66
  [Test your Gateway](https://login.xecurify.com/moas/login?redirectUrl=https://login.xecurify.com/moas/admin/customer/smsconfig)
67
 
68
  = Why do you need to register for google authenticator? =
219
 
220
  == Changelog ==
221
 
222
+ = 5.6.2 =
223
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
224
+ * Vulnerability fixes
225
+ * Removed Network Security for new users
226
+ * Updated Pricing page UI
227
+
228
  = 5.6.1 =
229
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
230
  * Bug fix- Headers already sent
231
  * Added SMTP check for sending backup codes on 2fa prompt
232
 
 
 
 
 
 
 
 
 
 
 
233
  For older changelog entries, please see the [additional changelog.txt file](https://plugins.svn.wordpress.org/miniorange-2-factor-authentication/trunk/changelog.txt) provided with the plugin.
234
 
235
  == Upgrade Notice ==
236
 
237
+ = 5.6.2 =
238
+ * Google Authenticator - Two factor Authentication (2FA, OTP) :
239
+ * Vulnerability fixes
240
+ * Removed Network Security for new users
241
+ * Updated Pricing page UI
242
+
243
  = 5.6.1 =
244
  * Google Authenticator - Two factor Authentication (2FA, OTP) :
245
  * Bug fix- Headers already sent
uninstall.php CHANGED
@@ -84,11 +84,6 @@
84
  delete_option( 'mo2f_scan_nonce');
85
  delete_option( 'mo2f_onprem_admin');
86
  delete_option( 'mo2f_two_factor_tour');
87
- delete_option( 'mo2f_tour_firewall');
88
- delete_option( 'mo2f_tour_malware_scan');
89
- delete_option( 'mo2f_tour_advance_blocking');
90
- delete_option( 'mo2f_tour_backup');
91
- delete_option( 'mo2f_tour_loginSpam');
92
  delete_option( 'mo2f_tab_count');
93
  delete_option( 'mo2f_attempts_before_redirect');
94
  delete_option( 'mo2f_register_with_another_email');
@@ -142,32 +137,11 @@
142
 
143
  delete_option('mo_wpns_dbversion');
144
 
145
-
146
- delete_option('mo_file_backup_plugins');
147
- delete_option('mo_file_backup_themes');
148
- delete_option('mo_file_backup_wp_files');
149
- delete_option('mo2f_cron_file_backup_hours');
150
- delete_option('mo2f_cron_hours');
151
-
152
- delete_option('scheduled_file_backup');
153
- delete_option('scheduled_db_backup');
154
- delete_option('file_backup_created_time');
155
- delete_option('db_backup_created_time');
156
-
157
- delete_option('mo_database_backup');
158
- delete_option('mo_wpns_backup_time');
159
- delete_site_option('enable_backup_schedule');
160
- delete_option('backup_created_time');
161
-
162
  delete_site_option('mo2fa_superadmin');
163
  delete_site_option('mo2f_visit_waf');
164
  delete_site_option('mo2f_visit_login_and_spam');
165
  delete_site_option('mo2f_visit_malware');
166
- delete_site_option('mo2f_visit_backup');
167
  delete_site_option('mo2f_two_factor');
168
- delete_site_option('mo_file_manual_backup_plugins');
169
- delete_site_option('mo_file_manual_backup_themes');
170
- delete_site_option('mo_schedule_database_backup');
171
  delete_site_option('mo2f_enable_debug_log');
172
  delete_site_option('duo_credentials_save_successfully');
173
  delete_site_option('mo2f_d_integration_key');
@@ -366,7 +340,6 @@
366
 
367
  delete_option( 'mo_2f_switch_waf');
368
  delete_option( 'mo_2f_switch_loginspam');
369
- delete_option( 'mo_2f_switch_backup');
370
  delete_option( 'mo_2f_switch_malware');
371
  delete_option( 'mo_2f_switch_adv_block');
372
 
84
  delete_option( 'mo2f_scan_nonce');
85
  delete_option( 'mo2f_onprem_admin');
86
  delete_option( 'mo2f_two_factor_tour');
 
 
 
 
 
87
  delete_option( 'mo2f_tab_count');
88
  delete_option( 'mo2f_attempts_before_redirect');
89
  delete_option( 'mo2f_register_with_another_email');
137
 
138
  delete_option('mo_wpns_dbversion');
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  delete_site_option('mo2fa_superadmin');
141
  delete_site_option('mo2f_visit_waf');
142
  delete_site_option('mo2f_visit_login_and_spam');
143
  delete_site_option('mo2f_visit_malware');
 
144
  delete_site_option('mo2f_two_factor');
 
 
 
145
  delete_site_option('mo2f_enable_debug_log');
146
  delete_site_option('duo_credentials_save_successfully');
147
  delete_site_option('mo2f_d_integration_key');
340
 
341
  delete_option( 'mo_2f_switch_waf');
342
  delete_option( 'mo_2f_switch_loginspam');
 
343
  delete_option( 'mo_2f_switch_malware');
344
  delete_option( 'mo_2f_switch_adv_block');
345
 
views/backup/backup.php DELETED
@@ -1,66 +0,0 @@
1
-
2
- <div class="nav-tab-wrapper">
3
- <button class="nav-tab" onclick="mo2f_wpns_openTabbackup(this)" id="mo2f_setting_backup">Manual Backup</button>
4
- <button class="nav-tab" onclick="mo2f_wpns_openTabbackup(this)" id="mo2f_schedule_view">Scheduled Backup</button>
5
- <button class="nav-tab" onclick="mo2f_wpns_openTabbackup(this)" id="mo2f_report_view">Report</button>
6
-
7
- </div>
8
-
9
- <div class="tabcontent" id="mo2f_setting_backup_div">
10
- <div class="mo_wpns_divided_layout">
11
- <table style="width: 100%;">
12
- <tr>
13
- <td style="width:100%;vertical-align:top;" id="configurationForm2">
14
- <?php include_once $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_controller.php'; ?>
15
- </tr>
16
- </table>
17
- </div>
18
- </div>
19
- <div class="tabcontent" id="mo2f_schedule_view_div">
20
- <div class="mo_wpns_divided_layout">
21
- <table style="width: 100%;">
22
- <tr>
23
- <td style="width:100%;vertical-align:top;" id="configurationForm3">
24
- <?php include_once $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_schdule.php'; ?>
25
- </tr>
26
- </table>
27
- </div>
28
- </div>
29
- <div class="tabcontent" id="mo2f_report_view_div">
30
- <div class="mo_wpns_divided_layout">
31
- <table style="width: 100%;">
32
- <tr>
33
- <td style="width:100%;vertical-align:top;" id="configurationForm4">
34
- <?php include_once $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_created_report.php'; ?>
35
- </tr>
36
- </table>
37
- </div>
38
- </div>
39
-
40
- <script>
41
- jQuery('#backup_tab').addClass('nav-tab-active');
42
-
43
- function mo2f_wpns_openTabbackup(elmt){
44
- var tabname = elmt.id;
45
- var tabarray = ["mo2f_setting_backup","mo2f_schedule_view","mo2f_report_view"];
46
- for (var i = 0; i < tabarray.length; i++) {
47
- if(tabarray[i] == tabname){
48
- jQuery("#"+tabarray[i]).addClass("nav-tab-active");
49
- jQuery("#"+tabarray[i]+"_div").css("display", "block");
50
- }else{
51
- jQuery("#"+tabarray[i]).removeClass("nav-tab-active");
52
- jQuery("#"+tabarray[i]+"_div").css("display", "none");
53
- }
54
- }
55
-
56
- localStorage.setItem("backup_last_tab", tabname);
57
- }
58
-
59
- var tab = localStorage.getItem("backup_last_tab");
60
-
61
- if(tab)
62
- document.getElementById(tab).click();
63
- else{
64
- document.getElementById("mo2f_setting_backup").click();
65
- }
66
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
views/backup/backup_created_report.php DELETED
@@ -1,81 +0,0 @@
1
- <?php
2
- ?>
3
-
4
-
5
- <div class="mo_wpns_setting_layout" id="backup_report_table">
6
- <?php if(! isset($_GET['view']))?>
7
- <h2>Backup Created Report</h2>
8
-
9
- <hr>
10
- <div id="backupdata">
11
- <table id="reports_table" class="display" cellspacing="0" width="100%">
12
- <thead><tr><th style="text-align:center">Created Time</th><th style="text-align:center">Backup Folders</th><th style="text-align:center">Storage</th><th style="text-align:center">Download</th><th style="text-align:center">Delete</th></tr></thead>
13
- <tbody>
14
- <br>
15
- <?php
16
- include_once $mo2f_dirName. 'controllers'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_created_result.php';
17
- echo showBackupResults();
18
-
19
- ?></tbody>
20
- </table>
21
- </div>
22
- </div>
23
-
24
- <?php
25
- function show_backup_report($file_path,$file_name,$timestamp,$id) {
26
- $time = date('m/d/Y H:i:s', $timestamp);
27
- $nonce = wp_create_nonce('mo-wpns-download-nonce');
28
- echo "<tr><td style=text-align:center>".esc_attr($time)."</td>";
29
- echo "<td style=text-align:center>".esc_attr($file_name)."</td>";
30
- echo "<td style=text-align:center>Local</td>";
31
- echo "<td><form action='' method='POST' enctype='multipart/form-data'>
32
- <input type='hidden' value='mo_wpns_backup_download' name='option' />
33
- <input type='hidden' value=".esc_html($file_name)."/".esc_html($id)." name='file_name' />
34
- <input type='hidden' value=".esc_html($file_path)." name='file_path' />
35
- <input type='hidden' value=".esc_html($nonce)." name='download_nonce'/>
36
- <input type='submit' value='Download' name='download' class='upload btn btn-info btn-xs'>
37
- </form>
38
- </td>";
39
- echo "<td><button type='button' onclick=\"backup_delete(this, '".addslashes($file_path)."','".esc_attr($file_name)."',".esc_attr($id).")\" name='delete' id='delete' class='btn btn-info btn-xs delete'>Delete</button></td>";
40
- echo "</tr>";
41
- } ?>
42
- <script>
43
- function backup_delete(elmt, file_path,file_name,id){
44
-
45
- jQuery(document).ready(function(){
46
-
47
- if(confirm("Are you sure you want to delete it?"))
48
- {
49
- var data={
50
- 'action':'mo_wpns_backup_redirect',
51
- 'call_type':'delete_backup',
52
- 'file_name':file_name,
53
- 'folder_name':file_path,
54
- 'id' :id,
55
- 'nonce' : '<?php echo esc_html(wp_create_nonce("delete_entry"));?>',
56
-
57
- };
58
-
59
- jQuery.post(ajaxurl, data, function(response){
60
-
61
- if(response=="success"){
62
- success_msg("Backup delete successfully.");
63
- var row = elmt.parentNode.parentNode;
64
- row.parentNode.removeChild(row);
65
- }else if(response ==="notexist"){
66
- error_msg("Someone has deleted the backup by going to directory please refreash the page");
67
- }
68
- });
69
- }
70
-
71
- });
72
-
73
- }
74
-
75
- jQuery("#reports_table").DataTable({
76
- "order": [[ 1, "desc" ]],
77
- retrieve: true,
78
- paging: false
79
- });
80
-
81
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
views/backup/backup_schdule.php DELETED
@@ -1,192 +0,0 @@
1
- <?php
2
- global $mo2f_dirName;
3
- $setup_dirName = $mo2f_dirName.'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'link_tracer.php';
4
- include $setup_dirName;
5
- add_action('admin_footer','mo_wpns_schedule_backup');
6
- ?>
7
-
8
-
9
- <div class="mo_wpns_setting_layout" id = "mo2f_schedule_backup_status">
10
- <br>
11
- <table class="mo_wpns_settings_table font_class">
12
- <tr>
13
- <th>Scheduled file backup </th>
14
- <th>Scheduled database backup </th>
15
- <th><a href='<?php echo esc_url($two_factor_premium_doc['Scheduled database']);?>' target="_blank"><span class="dashicons dashicons-text-page" style="font-size:23px;color:#413c69;margin-top: 0.5em;float: right;"></span></a></th>
16
- </tr>
17
- <tr><td>&nbsp;</td><td></td></tr>
18
- <tr>
19
-
20
- <td><b>Scheduled Status :</b><?php
21
- if(MoWpnsUtility::get_mo2f_db_option('scheduled_file_backup', 'site_option')){
22
- ?><span class="mo_green" >Enabled</span><?php
23
- } else{
24
- ?><span class="mo_green">Disabled</span><?php
25
- }
26
- ?></td>
27
- <td><b>Scheduled Status :</b><?php
28
- if(MoWpnsUtility::get_mo2f_db_option('scheduled_db_backup', 'site_option')){
29
- ?><span class="mo_green" >Enabled</span><?php
30
- } else{
31
- ?><span class="mo_green">Disabled</span>
32
- <?php }
33
- ?></td>
34
-
35
- </tr>
36
-
37
- <tr>
38
- <td><b>Last Backup :</b><?php
39
- if($file_backup_time !== 0) echo esc_attr($file_backup_time) ;
40
- ?></td>
41
- <td><b>Last Backup :</b><?php
42
- if($db_eb_backup_time !== 0) echo esc_attr($db_eb_backup_time) ;
43
- ?></td>
44
-
45
- </tr>
46
- <tr>
47
- <td><b>Next Backup :</b><?php
48
- if($file_schedule_status == 0){ echo 'N/A';
49
- } else{ echo esc_attr($file_day).' '.esc_attr($file_date).' '.esc_attr($file_time) ;
50
- }
51
- ?></td>
52
- <td><b>Next Backup :</b>
53
- <?php if($db_backup_status == 0){ echo 'N/A';
54
- } else{ echo esc_attr($db_day).' '.esc_attr($db_date).' '.esc_attr($db_time) ;
55
- }
56
- ?></td>
57
-
58
- </tr>
59
- </table>
60
-
61
- </div>
62
- <div class="mo_wpns_setting_layout text_size" id= "mo2f_auto_dbbackup">
63
-
64
- <form id="" method="post" action="">
65
- <br>
66
- <p class="text_size"><b>To automatically create a backup select the following option and save the settings</b></p>
67
- <input type="checkbox" name="enable_backup_schedule" id="enable_backup_schedule" value="1"<?php checked(get_site_option('enable_backup_schedule') == 1);?>> Enable Backup Schedule<br><br>
68
-
69
- <br>
70
- <p class="text_size"><b>Create a backup after every</b></p>
71
- <table class="mo_wpns_settings_table " >
72
- <tr>
73
- <td>
74
- <input type="radio" name="backup_time" value="12" id="hours"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option') === '12')?>>12 Hours
75
- </td>
76
- <td>
77
- <input type="radio" name="backup_time" value="24" id="daily"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option') === '24')?>> Day
78
- </td>
79
- <td>
80
- <input type="radio" name="backup_time" value="168" id="weekly"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option') === '168')?>>Week
81
- </td>
82
- </tr>
83
- <tr>
84
- <td>
85
- <input type="radio" name="backup_time" value="360" id="fortnight"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option') === '360')?>> Fortnight
86
- </td>
87
- <td>
88
- <input type="radio" name="backup_time" value="720" id="month"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_wpns_backup_time', 'site_option') === '720')?>> Month
89
- </td>
90
- </tr>
91
- </table>
92
- <br>
93
- <p class="text_size"><b>Choose the following folder to backup</b></p>
94
- <table class="mo_wpns_settings_table ">
95
- <tr>
96
- <td>
97
- <input type="checkbox" name="mo_schedule_file_backup_plugins" id="mo_schedule_plugins" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_file_backup_plugins', 'site_option') == 1);?>> WordPress Plugins folder
98
- </td>
99
- <td>
100
- <input type="checkbox" name="mo_schedule_file_backup_themes" id="mo_schedule_themes" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_file_backup_themes','site_option') == 1);?>> WordPress Themes folder
101
- </td>
102
- </tr>
103
- <tr>
104
- <td>
105
- <input type="checkbox" name="mo_schedule_file_backup_wp_files" onclick="check1()" value="1"<?php checked(get_site_option('mo_file_backup_wp_files') == 1);?>> WordPress Files
106
- </td>
107
- <td>
108
- <input type="checkbox" name="mo_schedule_database_backup" id="mo_database_backup" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_schedule_database_backup', 'site_option') == 1);?>> Database
109
-
110
- </td>
111
- </tr>
112
- </table>
113
-
114
-
115
- <br>
116
- <p class="text_size">After checking the <b>enable backup schedule</b> checkbox, a backup will be created once you click on save setting and another backup will be created automatically after the scheduled time you select.</p>
117
- <input type = "hidden" id = "wpns_schedule_backup_url" value="<?php echo esc_html(wp_create_nonce('wpns-schedule-backup')) ?>" >
118
- <input type="button" class="mo_wpns_scan_button" name="save_schedule_settings" id="save_schedule_settings" value ="Save Settings" style="width:120px;" />
119
-
120
-
121
- </div>
122
- </form>
123
-
124
- <?php
125
- function mo_wpns_schedule_backup(){
126
- ?><script type="text/javascript">
127
-
128
- jQuery(document).ready(function(){
129
- jQuery('#save_schedule_settings').click(function(){
130
- var data={
131
- 'action':'mo_wpns_backup_redirect',
132
- 'call_type':'submit_schedule_settings_form',
133
- 'backup_plugin':jQuery('input[name= "mo_schedule_file_backup_plugins"]:checked').val(),
134
- 'backup_themes':jQuery('input[name= "mo_schedule_file_backup_themes"]:checked').val(),
135
- 'backup_wp_files':jQuery('input[name= "mo_schedule_file_backup_wp_files"]:checked').val(),
136
- 'database':jQuery('input[name= "mo_schedule_database_backup"]:checked').val(),
137
- 'backup_time':jQuery('input[name= "backup_time"]:checked').val(),
138
- 'local_storage':jQuery('input[name= "local_storage"]:checked').val(),
139
- 'enable_backup_schedule':jQuery('input[name= "enable_backup_schedule"]:checked').val(),
140
- 'nonce' : jQuery('#wpns_schedule_backup_url').val(),
141
-
142
- };
143
-
144
-
145
- jQuery.post(ajaxurl, data, function(response){
146
-
147
- if (response == "folder_error"){
148
- error_msg(" Please select at least one folder to backup");
149
- }else if(response=="success"){
150
- success_msg(" Backup Configuration Saved Successfully");
151
- }
152
- else if(response=="disable"){
153
- jQuery(".add_remove_disable").attr("disabled","disabled");
154
- error_msg(" Automatic Backup Disabled");
155
- }else if(response==="invalid_hours"){
156
- error_msg(" Please select valid hours");
157
- }else if(response==="ERROR"){
158
- error_msg("There was an error in procession your request");
159
- }
160
- });
161
-
162
- });
163
- });
164
-
165
- function check1() {
166
- if(jQuery('input[name= "mo_schedule_file_backup_wp_files"]:checked').val()){
167
- disable_checkbox();
168
- }else{
169
- enable_checkbox();
170
- }
171
- }
172
- if(jQuery('input[name= "mo_schedule_file_backup_wp_files"]:checked').val()){
173
- disable_checkbox();
174
- }else{
175
- enable_checkbox();
176
- }
177
-
178
- function disable_checkbox(){
179
- jQuery('input[name="mo_schedule_file_backup_plugins"]').attr('disabled', true);
180
- jQuery('input[name="mo_schedule_file_backup_themes"]').attr('disabled', true);
181
- jQuery('#mo_schedule_plugins').prop('checked', false); // Unchecks it
182
- jQuery('#mo_schedule_themes').prop('checked', false); // Unchecks it
183
- }
184
-
185
- function enable_checkbox(){
186
- jQuery('input[name="mo_schedule_file_backup_plugins"]').removeAttr('disabled');
187
- jQuery('input[name="mo_schedule_file_backup_themes"]').removeAttr('disabled');
188
- }
189
-
190
- </script>
191
- <?php }
192
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
views/backup/backup_setting_view.php DELETED
@@ -1,165 +0,0 @@
1
- <?php
2
- add_action('admin_footer','mo_backup_config_page_submit');
3
- ?>
4
-
5
-
6
- <div class="mo_wpns_setting_layout" id="mo2f_select_files_backup">
7
- <div class="mo_wpns_subheading"></div>
8
- <br>
9
- <form id="abc" method="post" action="">
10
- <input type="hidden" name="option" value="mo_wpns_backup_configuration">
11
- <table class="mo_wpns_settings_table">
12
- <tr>
13
- <td style="width:30%"><b>Select Folders to Backup : </b></td>
14
- <td>
15
- <input type="checkbox" name="mo_file_backup_wp_files" onclick="check()" id="mo__manual_file_wp_files"
16
- value="1"<?php checked(get_site_option('mo_file_manual_backup_wp_files') == 1);?>> WordPress Files<br>
17
-
18
- <input type="checkbox" name="mo_file_backup_plugins" id="mo_file_manual_backup_plugins" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_file_manual_backup_plugins', 'site_option') == 1);?>> WordPress Plugins folder<br>
19
- <input type="checkbox" name="mo_file_backup_themes" id="mo_file_manual_backup_themes" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_file_manual_backup_themes', 'site_option') == 1);?>> WordPress Themes folder<br>
20
- <input type="checkbox" name="mo_database_backup" value="1"<?php checked(MoWpnsUtility::get_mo2f_db_option('mo_database_backup', 'site_option') == 1);?>> Database
21
- </td>
22
- </tr>
23
-
24
- <tr><td>&nbsp;</td><td></td></tr>
25
-
26
- <tr>
27
- <td style="width: 30%"></td>
28
- <td>
29
- <input type = "hidden" id = "wpns_backup_settings_url" value="<?php echo esc_html(wp_create_nonce('wpns-backup-settings')) ?>" >
30
- <input type="button" name="save_backup_settings" id="save_backup_settings" value ="Take Backup" style="width:120px;" class="mo_wpns_scan_button" />
31
-
32
- </td>
33
- </tr>
34
- </table>
35
-
36
- </form>
37
- <div class="file_backup_desc" hidden></div>
38
- </div>
39
-
40
- <?php
41
- function mo_backup_config_page_submit(){
42
- $backup='';
43
- if(get_site_option('mo_file_manual_backup_wp_files')|| get_site_option('mo_file_manual_backup_plugins') || get_site_option('mo_file_manual_backup_themes') )
44
- $backup = 'files';
45
- elseif(get_site_option('mo_database_backup'))
46
- $backup = 'database';
47
- if($backup =='files' && (get_site_option('mo_database_backup')))
48
- $backup = 'files and database';
49
- $img_loader_url = plugins_url('miniorange-2-factor-authentication'.DIRECTORY_SEPARATOR .'includes'.DIRECTORY_SEPARATOR .'images'.DIRECTORY_SEPARATOR .'loader.gif');
50
- $filemessage = '<div id=\'filebackupmessage\'><h2>DO NOT :</h2><ol><li>Close this browser</li><li>Reload this page</li><li>Click the Stop or Back button.</li></ol><h2 id=\'mo_backup_message\'></h2></div><br/><div class=\'filebackupmessage\'><h2><div id=\'backupinprogress\'> BACKUP IN PROGRESS</div></h2></div><div id=\'fileloader\' ><img src=\"'.esc_url_raw($img_loader_url).'\"></div>';
51
- $filemessage2a = 'Backup is Completed. Check ';
52
- $filemessage2b = ' file in <b>uploads/miniorangebackup</b> folder.';
53
- $backup_store_path = wp_upload_dir();
54
- $backup_store_path_=str_replace("\\","\\\\",$backup_store_path["basedir"]);
55
- ?>
56
- <script>
57
-
58
- jQuery(document).ready(function(){
59
- jQuery('#save_backup_settings').click(function(){
60
-
61
- var message = "<?php echo $filemessage; ?>";
62
- jQuery(".file_backup_desc").empty();
63
- jQuery(".file_backup_desc").append(message);
64
- jQuery(".file_backup_desc").slideDown(400);
65
- setInterval(function(){ jQuery("#backupinprogress").fadeOut(700); }, 1000);
66
- setInterval(function(){ jQuery("#backupinprogress").fadeIn(700); }, 1000);
67
- document.getElementById("save_backup_settings").value = "Taking Backup...";
68
- jQuery('input[name="save_backup_settings"]').attr('disabled', true);
69
- document.getElementById('save_backup_settings').style.backgroundColor = '#2271b1';
70
-
71
- var data={
72
- 'action':'mo_wpns_backup_redirect',
73
- 'call_type':'submit_backup_settings_form',
74
- 'backup_plugin':jQuery('input[name= "mo_file_backup_plugins"]:checked').val(),
75
- 'backup_themes':jQuery('input[name= "mo_file_backup_themes"]:checked').val(),
76
- 'backup_wp_files':jQuery('input[name= "mo_file_backup_wp_files"]:checked').val(),
77
- 'database':jQuery('input[name= "mo_database_backup"]:checked').val(),
78
- 'nonce' :jQuery('#wpns_backup_settings_url').val(),
79
- };
80
-
81
- if(data['backup_plugin']|| data['backup_themes'] || data['backup_wp_files'] )
82
- var backup = 'files';
83
- else if(data['database'])
84
- var backup = 'database';
85
- if(backup =='files' && (data['database']))
86
- var backup = 'files and database';
87
- jQuery('#mo_backup_message').html('Until your '+backup+' backup is Completed');
88
-
89
-
90
- jQuery.post(ajaxurl, data, function(response){
91
-
92
- if (response == "ERROR"){
93
- error_msg("There is an error in processing request");
94
- window.onload = barfw_response_handler('NONCE_ERROR','Nonce did not match');
95
-
96
- }else if(response == "not_writable"){
97
- jQuery('#mo_backup_message').empty();
98
- error_msg("We don't have write permission. Please give the permission to create folder in uploads");
99
- window.onload = barfw_response_handler('We do not have write permission. Please give the permission to create folder in uploads','Permission Denied');
100
-
101
- }
102
- else if(response == "folder_error")
103
- {
104
- error_msg("Please select atleast one file folder from manual backup.");
105
- window.onload = barfw_response_handler('NO FILES TO BACKUP.PLEASE CHANGE MANUAL SETTINGS','Please select at least one folder to backup');
106
-
107
- }
108
- else
109
- {
110
- var backup_store_path = '<?php echo esc_attr($backup_store_path_);?>';
111
- var success_message = 'Your backup is created and stored at this location: '+backup_store_path+'/miniorangebackup';
112
- window.onload = barfw_response_handler('BACKUP COMPLETED', success_message);
113
-
114
- }
115
- });
116
-
117
-
118
-
119
- });
120
-
121
- });
122
-
123
-
124
- function barfw_response_handler(para1, para2){
125
- jQuery(".filebackupmessage h2").empty();
126
- jQuery(".filebackupmessage h2").append(para1);
127
-
128
- jQuery("#fileloader").empty();
129
-
130
- jQuery("#fileloader").append(para2);
131
- jQuery(".filebackupmessage").css("background-color","#1EC11E");
132
-
133
- jQuery('input[name="save_backup_settings"]').removeAttr('disabled');
134
- document.getElementById('save_backup_settings').style.backgroundColor = '#2271b1';
135
- document.getElementById("save_backup_settings").value = "Take Backup";
136
- }
137
-
138
- function check() {
139
- if(jQuery('input[name= "mo_file_backup_wp_files"]:checked').val()){
140
- mo2f_disable_box();
141
- }else{
142
- mo2f_enable_box();
143
- }
144
- }
145
- if(jQuery('input[name= "mo_file_backup_wp_files"]:checked').val()){
146
- mo2f_disable_box();
147
- }else{
148
- mo2f_enable_box();
149
- }
150
-
151
- function mo2f_enable_box(){
152
- jQuery('input[name="mo_file_backup_plugins"]').removeAttr('disabled');
153
- jQuery('input[name="mo_file_backup_themes"]').removeAttr('disabled');
154
- }
155
-
156
- function mo2f_disable_box(){
157
- jQuery('input[name="mo_file_backup_plugins"]').attr('disabled', true);
158
- jQuery('input[name="mo_file_backup_themes"]').attr('disabled', true);
159
- jQuery('#mo_file_manual_backup_plugins').prop('checked', false); // Unchecks it
160
- jQuery('#mo_file_manual_backup_themes').prop('checked', false); // Unchecks it
161
- }
162
-
163
-
164
- </script>
165
- <?php }?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
views/common-elements.php CHANGED
@@ -103,8 +103,6 @@
103
  }
104
  }
105
  }
106
-
107
-
108
  //Function to show google recaptcha v3 upon login
109
 
110
  function show_google_recaptcha_form_v3_login()
103
  }
104
  }
105
  }
 
 
106
  //Function to show google recaptcha v3 upon login
107
 
108
  function show_google_recaptcha_form_v3_login()
views/dashboard.php CHANGED
@@ -7,7 +7,6 @@ $two_fa_on= get_site_option("mo_2f_switch_2fa")?"checked":"";
7
  $all_on= get_site_option("mo_2f_switch_all")?"checked":"";
8
  $waf_on= get_site_option("mo_2f_switch_waf")?"checked":"";
9
  $login_spam_on= get_site_option("mo_2f_switch_loginspam")?"checked":"";
10
- $backup_on= get_site_option("mo_2f_switch_backup")?"checked":"";
11
  $malware_on= get_site_option("mo_2f_switch_malware")?"checked":"";
12
  $adv_block_on= get_site_option("mo_2f_switch_adv_block")?"checked":"";
13
  echo '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
@@ -110,23 +109,6 @@ echo '<meta name="viewport" content="width=device-width, initial-scale=1, maximu
110
  </div>
111
  </div>
112
  <div style="display:flex;justify-content:center">
113
- <div class="mo_wpns_small_layout">
114
- <form name="tab_backup" id="tab_backup" method="post">
115
- <h3>Encrypted Backup
116
- <label class="mo_wpns_switch" style="float: right">
117
- <input type="hidden" name="option" value="tab_backup_switch"/>
118
- <input type=checkbox id="switch_backup" name="switch_val" value="1" ' .esc_html($backup_on). '/>
119
- <span class="mo_wpns_slider mo_wpns_round"></span>
120
- </label>
121
- </h3>
122
- </form>
123
- <br>
124
- <div style="text-align:justify;">
125
- Creating regular backups for your website is essential. By Creating backup you can <b>restore your website back to normal</b> within a few minutes. miniOrange creates <b>database and file Backup</b> which is stored locally in your system.
126
- <br><br>
127
- </div>
128
- <a class="button button-primary button-large" href="'.esc_url($backup).'">Settings</a>
129
- </div>
130
  <div class="mo_wpns_small_layout">
131
  <form name="tab_malware" id="tab_malware" method="post">
132
  <h3>Malware Scan
7
  $all_on= get_site_option("mo_2f_switch_all")?"checked":"";
8
  $waf_on= get_site_option("mo_2f_switch_waf")?"checked":"";
9
  $login_spam_on= get_site_option("mo_2f_switch_loginspam")?"checked":"";
 
10
  $malware_on= get_site_option("mo_2f_switch_malware")?"checked":"";
11
  $adv_block_on= get_site_option("mo_2f_switch_adv_block")?"checked":"";
12
  echo '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
109
  </div>
110
  </div>
111
  <div style="display:flex;justify-content:center">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  <div class="mo_wpns_small_layout">
113
  <form name="tab_malware" id="tab_malware" method="post">
114
  <h3>Malware Scan
views/malware_scanner/scan_summary_view.php CHANGED
@@ -286,15 +286,22 @@ function mo_wpns_start_scan(){
286
 
287
  jQuery('input[name="mo_stop_button"]').val("Stop Scanning...");
288
  document.getElementById('mo_stop_button').style.backgroundColor = disabled;
 
289
  var data={
290
  'action':'mo_wpns_malware_redirect',
291
- 'call_type':'malware_scan_terminate'
 
292
  };
293
  jQuery("#mo_scan_message").removeClass(removeClass);
294
  jQuery.post(ajaxurl, data, function(response){
295
- jQuery('#mo_scan_message').show();
296
- jQuery('#mo_scan_message').empty();
297
- showMessageWithscroll(successClass,"Scan is stopping...");
 
 
 
 
 
298
  });
299
  }else{
300
  document.getElementById("mo_progress").style.display="none";
@@ -419,16 +426,20 @@ function mo_wpns_start_scan(){
419
  clearInterval(progress_bar);
420
  }
421
  function status_progress(){
422
-
423
  var data={
424
  'action':'mo_wpns_malware_redirect',
425
- 'call_type':'malware_progress_bar'
 
426
  };
427
  jQuery.post(ajaxurl, data, function(response){
428
  var scanset = new Map();
429
 
430
  jQuery("#mo_scan_message").removeClass(removeClass);
431
  var bar= document.getElementById("mo_wpns_progress_bar");
 
 
 
432
  if(response['status']=="COMPLETE"){
433
 
434
  scanset.set("progress_message", "Scan completed");
286
 
287
  jQuery('input[name="mo_stop_button"]').val("Stop Scanning...");
288
  document.getElementById('mo_stop_button').style.backgroundColor = disabled;
289
+ nonce = jQuery('#wpns_scan_nonce').val();
290
  var data={
291
  'action':'mo_wpns_malware_redirect',
292
+ 'call_type':'malware_scan_terminate',
293
+ 'nonce':nonce,
294
  };
295
  jQuery("#mo_scan_message").removeClass(removeClass);
296
  jQuery.post(ajaxurl, data, function(response){
297
+ if(response=="NONCE_ERROR"){
298
+ showMessageWithscroll(errorClass,nonceMessage);
299
+ }else{
300
+
301
+ jQuery('#mo_scan_message').show();
302
+ jQuery('#mo_scan_message').empty();
303
+ showMessageWithscroll(successClass,"Scan is stopping...");
304
+ }
305
  });
306
  }else{
307
  document.getElementById("mo_progress").style.display="none";
426
  clearInterval(progress_bar);
427
  }
428
  function status_progress(){
429
+ nonce = jQuery('#wpns_scan_nonce').val();
430
  var data={
431
  'action':'mo_wpns_malware_redirect',
432
+ 'call_type':'malware_progress_bar',
433
+ 'nonce':nonce,
434
  };
435
  jQuery.post(ajaxurl, data, function(response){
436
  var scanset = new Map();
437
 
438
  jQuery("#mo_scan_message").removeClass(removeClass);
439
  var bar= document.getElementById("mo_wpns_progress_bar");
440
+ if(response=="NONCE_ERROR"){
441
+ showMessageWithscroll(errorClass,nonceMessage);
442
+ }
443
  if(response['status']=="COMPLETE"){
444
 
445
  scanset.set("progress_message", "Scan completed");
views/navbar.php CHANGED
@@ -77,26 +77,32 @@ if( isset( $_GET[ 'page' ]) && sanitize_text_field($_GET['page']) != 'mo_2fa_upg
77
  id ="mo_2fa_upgrade_tour" href="'.esc_url($upgrade_url).'">See Plans and Pricing</a>
78
 
79
  </div>';
80
- echo' <form id="mo_wpns_2fa_with_network_security" method="post" action="">
81
- <div class="mo2f-security-toggle">
82
 
83
-
84
- <input type="hidden" name="mo_security_features_nonce" value="'.esc_html($security_features_nonce).'"/>
85
-
86
- <input type="hidden" name="option" value="mo_wpns_2fa_with_network_security">
87
- <div>2FA + Website Security
88
- <span>
89
- <label class="mo_wpns_switch">
90
- <input type="checkbox" name="mo_wpns_2fa_with_network_security" '.esc_html($network_security_features).' onchange="document.getElementById(\'mo_wpns_2fa_with_network_security\').submit();">
91
- <span class="mo_wpns_slider mo_wpns_round"></span>
92
- </label>
93
- </span>
94
- </div>
95
-
96
-
97
- </div>
98
- </form>';
99
- }
 
 
 
 
 
 
 
 
100
 
101
  echo'</div></div>';
102
  echo '<div id = "wpns_nav_message"></div>';
@@ -117,7 +123,7 @@ if( isset( $_GET[ 'page' ]) && sanitize_text_field($_GET['page']) != 'mo_2fa_upg
117
 
118
  echo '<a id="login_spam_tab" class="nav-tab" href="'.esc_url($login_and_spam).'" >Login and Spam</a>';
119
 
120
- echo '<a id="backup_tab" class="nav-tab" href="'.esc_url($backup).'" >Encrypted Backup</a>';
121
 
122
  echo '<a id="malware_tab" class="nav-tab" href="'.esc_url($scan_url).'">Malware Scan</a>';
123
 
77
  id ="mo_2fa_upgrade_tour" href="'.esc_url($upgrade_url).'">See Plans and Pricing</a>
78
 
79
  </div>';
 
 
80
 
81
+ if(get_site_option("mo_wpns_2fa_with_network_security") || get_site_option("mo2f_is_old_customer"))
82
+ {
83
+ update_site_option("mo2f_is_old_customer",1);
84
+
85
+ echo' <form id="mo_wpns_2fa_with_network_security" method="post" action="">
86
+ <div class="mo2f-security-toggle">
87
+
88
+
89
+ <input type="hidden" name="mo_security_features_nonce" value="'.esc_html($security_features_nonce).'"/>
90
+
91
+ <input type="hidden" name="option" value="mo_wpns_2fa_with_network_security">
92
+ <div>2FA + Website Security
93
+ <span>
94
+ <label class="mo_wpns_switch">
95
+ <input type="checkbox" name="mo_wpns_2fa_with_network_security" '.esc_html($network_security_features).' onchange="document.getElementById(\'mo_wpns_2fa_with_network_security\').submit();">
96
+ <span class="mo_wpns_slider mo_wpns_round"></span>
97
+ </label>
98
+ </span>
99
+ </div>
100
+
101
+
102
+ </div>
103
+ </form>';
104
+ }
105
+ }
106
 
107
  echo'</div></div>';
108
  echo '<div id = "wpns_nav_message"></div>';
123
 
124
  echo '<a id="login_spam_tab" class="nav-tab" href="'.esc_url($login_and_spam).'" >Login and Spam</a>';
125
 
126
+
127
 
128
  echo '<a id="malware_tab" class="nav-tab" href="'.esc_url($scan_url).'">Malware Scan</a>';
129
 
views/upgrade.php CHANGED
@@ -72,513 +72,364 @@ echo '
72
  <span class="cd-switch"></span>
73
 
74
 
75
- <br><br>
76
-
77
- <div class="mo2f_upgrade_super_div" id="mo2f_twofa_plans">
78
- <div class="mo2f_upgrade_main_div" id="mo2f_upgrade_main_div">
79
 
80
- <div id="mofa_pricing_tabs_mo" class="mo2fa_pricing_tabs_mo mo2fa_pricing_tabs_mo_premium">
81
- <div class="mo2fa_pricing_head_blue">
82
 
83
- <div id="mo2fa_pricing_head_all_inclusive" class="mo2fa_pricing_head_supporter"><center><h3 class="mo2fa_pricing_head_mo_2fa">Unlimited Users<br>&nbsp;&nbsp;&nbsp;&nbsp;Advanced 2FA <i class="mo2fa_tooltip fa fa-info-circle" aria-hidden="true"><span class="mo2fa_tooltiptext">
84
- Essential 2FA<br>
85
- Security Features<br>
86
- Addons
87
- </span></i><br>Website Security</h3></center></div><br><br>
88
 
89
- <div class="mo2fa_dollar"> <center><span>$</span><span id="mo2fa_display_my_all_inclusive_pricing"></span><span class="mo2fa_per_year">/Year</span></center></div>
90
- <br>
91
- </div>
92
- <h3 class="mo2fa_plan-type"><b>PREMIUM</b></h3>
93
 
94
- <div id="mo2fa_pricing_addons_all_inclusive" class="mo2fa_pricing">
95
- <div id="purchase_user_limit_all_inclusive">
96
-
97
- <center>
98
- <select id="mo2fa_all_inclusive_price_mo" onclick="mo2fa_update_site_limit_all_inclusive()" onchange="mo2fa_update_site_limit_all_inclusive()" class="mo2fa_increase_my_limit">
99
- <option value="199">1 SITE</option>
100
- <option value="299">2 SITES</option>
101
- <option value="499">5 SITES</option>
102
- <option value="799">10 SITES</option>
103
- <option value="1099">25 SITES</option>
104
-
105
- </select>
106
- </center>
107
- </div>
108
-
109
-
110
- <center>
111
- <div id="mo2fa_custom_my_plan_2fa_mo">
112
- <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
113
- <a onclick="mo2f_upgradeform('wp_security_two_factor_all_inclusive_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan">Upgrade</button></a>
114
- <?php }else{ ?>
115
- <a onclick="mo2f_register_and_upgradeform('wp_security_two_factor_all_inclusive_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan">Upgrade</button></a>
116
- <?php }?>
117
- </div>
118
- <a href="https://plugins.miniorange.com/how-to-download-2fa-premium-plugin-wordpress" target="blank" class="mo2f-installation-steps"><strong>Installation Steps</strong></a>
119
- </center>
120
- </div>
121
 
122
- <div id="mo2fa_pricing_feature_collection_supporter_all_inclusive" class="mo2fa_pricing_feature_collection_supporter">
123
- <div id="mo2fa_pricing_feature_collection_all_inclusive" class="mo2fa_pricing_feature_collection">
124
- <ul class="mo2fa_ul">
125
- <center><p class="mo2fa_feature"><strong>Features</strong></p></center>
126
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_on_per_tooltip_methodlist">On-Premise Solution <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Users' data is stored on their end.</span></span></li>
127
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature" title="Only 3 sub-sites supported">Multisite Support (Only 3 subsites)</li>
128
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Configure for Unlimited Users</li>
129
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Unlimited Email Transactions</li>
130
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_tooltip_methodlist">10+ Authentication Methods <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
131
- <span class="mo2fa_methodlist"t>
132
- <ul class="methods-list-mo2fa" style="margin-left: -43px;">
133
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Google Authenticator</li>
134
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS</li>
135
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Email</li>
136
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Email Verification</li>
137
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Security Questions</li>
138
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Whatsapp</li>
139
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Authy Authenticator</li>
140
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Microsoft Authenticator</li>
141
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">LastPass Authenticator</li>
142
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">FreeOTP Authenticator</li>
143
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Duo Mobile Authenticator</li>
144
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Telegram</li>
145
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange QR Code Authenticator</li>
146
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange Soft Token</li>
147
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange Push Notification</li>
148
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">OTP Over SMS and Email</li>
149
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Hardware Token</li>
150
- </ul>
151
- </span>
152
- </span></li>
153
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_enforce_2fa_tooltip_methodlist">Enforce 2FA Set-up For Users <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Enforce users to set their 2FA after installing the plugin</span></span></li>
154
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_role_tooltip_methodlist">Role-Based 2FA <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>You can enable 2FA for specific user role</span></span></li>
155
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> 3+ Backup Login Methods</li>
156
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_redirect_tooltip_methodlist">Custom Redirection URL <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Redirects users to the specific Url after login(can be configured according to user role)</span></span></li>
157
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_rba_tooltip_methodlist">Remember Device <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i> <span class="mo2fa_methodlist"t> It give users the option to rememeber device.Skip 2FA for trusted device</span></span></li>
158
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Passwordless Login </li>
159
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_custom_sms_tooltip_methodlist">Custom SMS Gateway <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>You can integrate your own SMS gateway with miniOrange</span></span></li>
160
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_shortcode_tooltip_methodlist">Shortcode Addon <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i> <span class="mo2fa_methodlist"t>
161
- 1. 2FA Shortcode - Use to add 2FA on any page.<br>
162
- 2. Reconfigure 2FA Addon - Add on to reconfiigure 2FA.
163
- </span></span></li>
164
- <li class="mo2fa_per_feature_collect_mo-2fa mo2fa_unltimate_feature">
165
- <span class="mo2fa_per_tooltip_methodlist">Personalisation Addon <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>
166
- <ul class="methods-list-mo2fa" style="margin-left: -43px;">
167
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Customize 2FA Login Screen</li>
168
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Customize Email Template</li>
169
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Customize Security Questions </li>
170
- </ul>
171
- </span>
172
- </span>
173
- </li>
174
-
175
-
176
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Page Restriction Addon</li>
177
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_fido_tooltip_methodlist">FIDO2/WebAuthn <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Allows you to login to any site using device credentials.</span></span></li>
178
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Concurrent Session Restriction </li>
179
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Skip 2FA For Specified IP </li>
180
-
181
-
182
-
183
 
184
- </ul>
 
 
 
185
 
186
- </div>
 
 
 
 
187
  </div>
188
-
189
- </div>
190
- <script>
191
-
192
- var base_price_site_all_inclusive =0;
193
- var display_my_all_inclusive_price = parseInt(base_price_site_all_inclusive)+parseInt(0)+parseInt(0)+parseInt(0);
194
- document.getElementById("mo2fa_display_my_all_inclusive_pricing").innerHTML = + display_my_all_inclusive_price;
195
- jQuery('#mo2fa_all_inclusive_price_mo').click();
196
- function mo2fa_update_site_limit_all_inclusive() {
197
- var sites_all_inclusive = document.getElementById("mo2fa_all_inclusive_price_mo").value;
198
- var total_inclusive = parseInt(base_price_site_all_inclusive)+parseInt(sites_all_inclusive);
199
-
200
- document.getElementById("mo2fa_display_my_all_inclusive_pricing").innerHTML = + total_inclusive;
201
 
202
- }
 
 
 
 
 
 
 
 
203
 
204
- </script>
205
- </div>
206
-
207
- <div class="mo2f_upgrade_main_div">
208
-
209
- <div id="mofa_pricing_tabs_mo" class="mo2fa_pricing_tabs_mo mo2fa_pricing_tabs_mo_premium_lite">
210
- <div class="mo2fa_pricing_head_blue">
211
- <div id="mo2fa_pricing_head" class="mo2fa_pricing_head_supporter"><center><h3 class="mo2fa_pricing_head_mo_2fa">Unlimited Users<br>&nbsp;&nbsp;&nbsp;Essential 2FA <i class="mo2fa_tooltip fa fa-info-circle" aria-hidden="true"><span class="mo2fa_tooltiptext">
212
- Enforce 2FA for all users<br>
213
- Role-Based Authentication
214
- </span></i></h3></center></div><br><br>
215
-
216
- <div class="mo2fa_dollar"><center><span>$</span><span id="mo2fa_pricing_adder_site_based"></span><span class="mo2fa_per_year">/Year</span></center></div>
217
-
218
- <br>
219
- </div>
220
- <h3 class="mo2fa_plan-type"><b>PREMIUM LITE</b></h3>
221
- <div id="mo2fa_pricing_addons_site_based" class="mo2fa_pricing">
222
- <center>
223
- <div id="mo2fa_purchase_user_limit">
224
-
225
- <center>
226
- <select id="mo2fa_site_price" onchange="mo2fa_update_site_limit()" onclick="mo2fa_update_site_limit()" class="mo2fa_increase_my_limit">
227
- <option value="99">1 SITE</option>
228
- <option value="179">2 SITES</option>
229
- <option value="299">5 SITES </option>
230
- <option value="449">10 SITES</option>
231
- <option value="599">25 SITES</option>
232
-
233
- </select>
234
- </div>
235
-
236
- <div id="mo2fa_custom_my_plan_2fa_mo">
237
- <center>
238
- <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
239
- <a onclick="mo2f_upgradeform('wp_security_two_factor_premium_lite_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan">Upgrade</button></a>
240
- <?php }else{ ?>
241
- <a onclick="mo2f_register_and_upgradeform('wp_security_two_factor_premium_lite_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan">Upgrade</button></a>
242
- <?php }?>
243
- </center>
244
- </div>
245
- <a href="https://developers.miniorange.com/docs/security/wordpress/wp-security/miniorange-2fa-premium-plugin-installation-guide" target="blank" class="mo2f-installation-steps"><strong>Installation Steps</strong></a>
246
- </center>
247
-
248
- </div>
249
- <div id="mo2fa_pricing_feature_collection_supporter" class="mo2fa_pricing_feature_collection_supporter">
250
- <div id="mo2fa_pricing_feature_collection" class="mo2fa_pricing_feature_collection">
251
- <ul class="mo2fa_ul">
252
- <center><p class="mo2fa_feature"><strong>Features</strong></p></center>
253
-
254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255
 
256
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_on_per_tooltip_methodlist">
257
- On-Premise Solution <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i> <span class="mo2fa_methodlist"t>Users' data is stored on their end.</span></span>
258
- </li>
259
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Single Site Support</li>
260
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Configure for Unlimited Users</li>
261
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Unlimited Email Transactions</li>
262
-
263
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">
264
- <span class="mo2fa_tooltip_methodlist">10+ Authentication Methods <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
265
- <span class="mo2fa_methodlist"t>
266
- <ul class="methods-list-mo2fa" style="margin-left: -43px; ">
267
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Google Authenticator</li>
268
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS</li>
269
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Email</li>
270
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Email Verification</li>
271
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Security Questions</li>
272
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Authy Authenticator</li>
273
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Microsoft Authenticator</li>
274
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">LastPass Authenticator</li>
275
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">FreeOTP Authenticator</li>
276
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Duo Mobile Authenticator</li>
277
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange QR Code Authenticator</li>
278
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange Soft Token</li>
279
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">miniOrange Push Notification</li>
280
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">OTP Over SMS and Email</li>
281
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Hardware Token</li>
282
-
283
- </ul>
284
- </span>
285
- </span>
286
- </li>
287
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_enforce_2fa_tooltip_methodlist">Enforce 2FA Set-up For Users <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Enforce users to set their 2FA after installing the plugin</span></span> </li>
288
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_role_tooltip_methodlist"> Role-Based 2FA <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i> <span class="mo2fa_methodlist"t>You can enable 2FA for specific user role</span></span></li>
289
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> 2+ Backup Login Methods</li>
290
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_redirect_tooltip_methodlist"> Custom Redirection URL <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Redirects users to the specific Url after login(can be configured according to user role)</span></span></li>
291
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_rba_tooltip_methodlist"> Silently Remember Device <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>It allows option to silently remember your devices. 2FA will be skipped for trusted device. </span></span></li>
292
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
293
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
294
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
295
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
296
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
297
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
298
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
299
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
300
-
301
-
302
- </ul>
303
 
304
- </div>
305
- </div>
306
 
307
- </div>
308
- <script>
309
- var base_price_site_based =0;
310
- var display_my_site_based_price = parseInt(base_price_site_based)+parseInt(0)+parseInt(0)+parseInt(0);
311
- document.getElementById("mo2fa_pricing_adder_site_based").innerHTML = + display_my_site_based_price;
312
- jQuery('#mo2fa_site_price').click();
313
- function mo2fa_update_site_limit() {
314
- var users = document.getElementById("mo2fa_site_price").value;
315
- var sms_user_selection= 0;
316
- var users_addion = parseInt(base_price_site_based)+parseInt(users)+parseInt(sms_user_selection);
317
-
318
- document.getElementById("mo2fa_pricing_adder_site_based").innerHTML = + users_addion;
319
-
320
- }
321
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322
 
323
- </script>
324
- </div>
325
 
326
 
327
- <div class="mo2f_upgrade_main_div">
 
 
328
 
329
- <div id="mofa_pricing_tabs_mo" class="mo2fa_pricing_tabs_mo mo2fa_pricing_tabs_mo_enterprise">
330
- <div class="mo2fa_pricing_head_sky">
331
- <div id="mo2fa_pricing_head" class="mo2fa_pricing_head_supporter">
332
- <center><h3 class="mo2fa_pricing_head_mo_2fa">Unlimited Sites<br>&nbsp;&nbsp;&nbsp;&nbsp;Advanced 2FA <i class="mo2fa_tooltip fa fa-info-circle" aria-hidden="true"><span class="mo2fa_tooltiptext">
333
- Essential 2FA<br>
334
- Security Features<br>
335
- Addons
336
- </span></i><br>Website Security</h3></center>
337
- </div><br><br>
338
- <div id="mo2fa_pricing_head_cost" class="mo2fa_pricing_head_supporter">
339
- <div class="mo2fa_dollar"> <center><span>$</span><span id="mo2fa_pricing_adder"></span><span class="mo2fa_per_year">/Year</span></center></div>
340
 
341
- </div>
342
- </div>
343
- <h3 class="mo2fa_plan-type"><b>ENTERPRISE</b></h3>
344
 
345
- <div id="mo2fa_pricing_addons" class="mo2fa_pricing">
346
- <center>
347
- <div id="mo2fa_purchase_user_limit">
348
-
349
- <center>
350
- <select id="mo2fa_user_price" onclick="mo2fa_update_user_limit()" onchange="mo2fa_update_user_limit()" class="mo2fa_increase_my_limit">
351
- <option value="59" selected>5 USERS</option>
352
- <option value="128" >50 USERS</option>
353
- <option value="228">100 USERS</option>
354
- <option value="378">500 USERS</option>
355
- <option value="528">1K USERS</option>
356
- <option value="828">5K USERS</option>
357
- <option value="1028">10K USERS</option>
358
- <option value="1528">20K USERS</option>
359
-
360
- </select>
361
- </center>
362
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
 
 
 
 
 
 
364
 
365
- <div id="details">
366
- <center>
367
- <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
368
- <a onclick="mo2f_upgradeform('wp_2fa_enterprise_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan_ent">Upgrade</button></a>
369
- <?php }else{ ?>
370
- <a onclick="mo2f_register_and_upgradeform('wp_2fa_enterprise_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan_ent">Upgrade</button></a>
371
- <?php }?>
372
- </center>
373
- </div>
374
- <a href="https://plugins.miniorange.com/configure-wordpress-2-factor-authentication-2fa-enterprise-plugin" target="blank" class="mo2f-installation-steps"><strong>Installation Steps</strong></a>
375
- </center>
376
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
 
378
 
379
- <div id="mo2fa_pricing_feature_collection_supporter" class="mo2fa_pricing_feature_collection_supporter">
380
-
 
 
 
 
381
 
382
- <div id="mo2fa_pricing_feature_collection" class="mo2fa_pricing_feature_collection">
383
- <ul class="mo2fa_ul">
384
- <center><p class="mo2fa_feature"><strong>Features</strong></p></center>
385
-
386
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_cloud_per_tooltip_methodlist">Cloud Solution <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Users data is stored on the miniOrange Cloud</span></span></li>
387
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Multisite Support</li>
388
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Install on Unlimited Websites</li>
389
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Email Transactions Extra</li>
390
-
391
- <li class="mo2fa_ent_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_tooltip_methodlist">15+ Authentication Methods <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
392
- <span class="mo2fa_methodlist"t>
393
- <ul class="methods-list-mo2fa" style="margin-left: -43px;">
394
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Google Authenticator</li>
395
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS</li>
396
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Email</li>
397
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Email Verification</li>
398
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS and Email</li>
399
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Security Questions</li>
400
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Authy Authenticator</li>
401
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Microsoft Authenticator</li>
402
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">LastPass Authenticator</li>
403
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">FreeOTP Authenticator</li>
404
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Duo Mobile Authenticator</li>
405
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange QR Code Authentication</li>
406
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange Soft Token</li>
407
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange Push Notification</li>
408
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Hardware Token</li>
409
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">OTP Over Whatsapp</li>
410
- </ul>
411
- </span>
412
- </span></li>
413
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_enforce_2fa_tooltip_methodlist">Enforce 2FA Set-up For Users <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Enforce users to set their 2FA after installing the plugin</span></span></li>
414
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_role_tooltip_methodlist">Role-Based 2FA <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>You can enable 2FA for specific user role</span></span></li>
415
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> 3+ Backup Login Methods</li>
416
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_redirect_tooltip_methodlist">Custom Redirection URL <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Redirects users to the specific Url after login(can be configured according to user role)</span></span></li>
417
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_rba_tooltip_methodlist">Remember Device <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t> It give users the option to rememeber device.Skip 2FA for trusted device</span></span></li>
418
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Passwordless login </li>
419
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_custom_sms_tooltip_methodlist">Custom SMS Gateway <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>
420
- You can integrate your own SMS gateway with miniOrange</span><span></li>
421
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_shortcode_ent_tooltip_methodlist">Shortcode Addon <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i> <span class="mo2fa_methodlist"t>
422
- 1. 2FA Shortcode - Use to add 2FA on any page.<br>
423
- 2. Reconfigure 2FA Addon - Addon to reconfiigure 2FA.</span>
424
- </li>
425
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
426
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
427
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
428
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
429
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
430
-
431
-
432
- </ul>
433
 
434
- </div>
435
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
 
437
- </div>
438
-
439
- <script>
440
- var base_price =0;
441
- var display_me = parseInt(base_price)+parseInt(30)+parseInt(0)+parseInt(0);
442
- document.getElementById("mo2fa_pricing_adder").innerHTML = + display_me;
443
- jQuery('#mo2fa_user_price').click();
444
- function mo2fa_update_user_limit() {
445
- var users = document.getElementById("mo2fa_user_price").value;
446
-
447
- var users_addion = parseInt(base_price)+parseInt(users);
448
-
449
- document.getElementById("mo2fa_pricing_adder").innerHTML = + users_addion;
450
-
451
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
 
454
- </script>
 
 
 
 
 
455
 
456
- </div>
457
 
458
- <div class="mo2f_upgrade_main_div">
 
 
 
 
 
459
 
460
- <div id="mofa_pricing_tabs_mo" class="mo2fa_pricing_tabs_mo mo2fa_pricing_tabs_mo_standard">
461
- <div class="mo2fa_pricing_head_sky">
462
- <div id="mo2fa_pricing_head" class="mo2fa_pricing_head_supporter"><center><h3 class="mo2fa_pricing_head_mo_2fa">Unlimited Sites<br>&nbsp;&nbsp;&nbsp;Essential 2FA <i class="mo2fa_tooltip mo2fa_tooltip_basic fa fa-info-circle" aria-hidden="true"><span class="mo2fa_tooltiptext mo2fa_tooltiptext_basic">
463
- Enforce 2FA for all users<br>
464
- Role-Based Authentication
465
- </span></i></h3></center></div><br><br>
466
- <div id="mo2fa_pricing_head_cost" class="mo2fa_pricing_head_supporter">
467
- <div class="mo2fa_dollar"> <center><span>$</span><span id="mo2fa_pricing_adder_standard"></span><span class="mo2fa_per_year">/Year</span></center></div>
468
 
469
- </div>
470
- </div>
471
- <h3 class="mo2fa_plan-type"><b>BASIC</b></h3>
472
 
473
- <div id="mo2fa_pricing_addons" class="mo2fa_pricing">
474
- <center>
475
- <div id="mo2fa_purchase_user_limit">
476
-
477
- <center>
478
- <select id="mo2fa_user_price_standard" onclick="mo2fa_update_user_limit_standard()" onchange="mo2fa_update_user_limit_standard()" class="mo2fa_increase_my_limit">
479
- <option value="30" selected>5 USERS</option>
480
- <option value="99" >50 USERS</option>
481
- <option value="199">100 USERS</option>
482
- <option value="349">500 USERS</option>
483
- <option value="499">1K USERS</option>
484
- <option value="799">5K USERS</option>
485
- <option value="999">10K USERS</option>
486
- <option value="1449">20K USERS</option>
487
-
488
- </select>
489
- </center>
490
- </div>
491
-
492
 
493
- <div id="details">
494
- <center>
495
- <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
496
- <a onclick="mo2f_upgradeform('wp_2fa_premium_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan_ent">Upgrade</button></a>
497
- <?php }else{ ?>
498
- <a onclick="mo2f_register_and_upgradeform('wp_2fa_premium_plan','2fa_plan')" target="blank"><button class="mo2fa_upgrade_my_plan_ent">Upgrade</button></a>
499
- <?php }?>
500
- </center>
501
- </div>
502
- <a href="https://plugins.miniorange.com/how-to-download-2fa-premium-plugin-wordpress" target="blank" class="mo2f-installation-steps"><strong>Installation Steps</strong></a>
503
- </center>
504
- </div>
505
 
 
 
 
 
 
 
506
 
507
- <div id="mo2fa_pricing_feature_collection_supporter" class="mo2fa_pricing_feature_collection_supporter">
508
-
509
 
510
- <div id="mo2fa_pricing_feature_collection" class="mo2fa_pricing_feature_collection">
511
- <ul class="mo2fa_ul">
512
- <center><p class="mo2fa_feature"><strong>Features</strong></p></center>
513
-
514
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_cloud_per_tooltip_methodlist">Cloud Solution <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Users data is stored on the miniOrange Cloud</span></span></li>
515
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Multisite Support</li>
516
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Install on Unlimited Websites</li>
517
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature">Email Transactions Extra</li>
518
-
519
- <li class="mo2fa_ent_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_tooltip_methodlist">5+ Authentication Methods <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
520
- <span class="mo2fa_methodlist"t>
521
- <ul class="methods-list-mo2fa" style="margin-left: -43px;">
522
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Google Authenticator</li>
523
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS</li>
524
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over Email</li>
525
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Email Verification</li>
526
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">OTP Over SMS and Email</li>
527
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">Security Questions</li>
528
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Authy Authenticator</li>
529
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Microsoft Authenticator</li>
530
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">LastPass Authenticator</li>
531
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">FreeOTP Authenticator</li>
532
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Duo Mobile Authenticator</li>
533
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange QR Code Authentication</li>
534
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange Soft Token</li>
535
- <li class="feature_collect_mo-2fa mo2fa_method-list-size">miniOrange Push Notification</li>
536
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">Hardware Token</li>
537
- <li class="feature_collect_mo-2fa mo2fa_method-list-mo-size-cross">OTP Over Whatsapp</li>
538
- </ul>
539
- </span>
540
- </span></li>
541
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_enforce_2fa_tooltip_methodlist">Enforce 2FA Set-up For Users <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Enforce users to set their 2FA after installing the plugin</span></span></li>
542
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_role_tooltip_methodlist">Role-Based 2FA <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>You can enable 2FA for specific user role</span></span></li>
543
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> Backup Login Method</li>
544
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"><span class="mo2fa_ent_redirect_tooltip_methodlist">Custom Redirection URL <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i><span class="mo2fa_methodlist"t>Redirects users to the specific Url after login(can be configured according to user role)</span></span></li>
545
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
546
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
547
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
548
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
549
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
550
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
551
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
552
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
553
- <li class="mo2fa_feature_collect_mo-2fa mo2fa_unltimate_feature"> <br></li>
554
-
555
-
556
- </ul>
557
 
558
- </div>
559
- </div>
560
-
561
- </div>
562
 
563
- <script>
564
- var base_price =0;
565
- var display_me = parseInt(base_price)+parseInt(0)+parseInt(0)+parseInt(0);
566
- document.getElementById("mo2fa_pricing_adder_standard").innerHTML = + display_me;
567
- jQuery('#mo2fa_user_price_standard').click();
568
- function mo2fa_update_user_limit_standard() {
569
- var users = document.getElementById("mo2fa_user_price_standard").value;
570
 
571
- var users_addion = parseInt(base_price)+parseInt(users);
572
-
573
- document.getElementById("mo2fa_pricing_adder_standard").innerHTML = + users_addion;
574
-
575
- }
576
-
577
-
578
- </script>
579
 
580
- </div>
581
- </div>
 
 
582
  <div id="mo2fa_compare">
583
  <center>
584
  <div class=""><a href="#mo2fa_more_deails" onclick="mo2fa_show_details()"><button class="mo2fa_upgrade_my_plan mo2fa_compare1">Click here to Compare Features</button></a></div>
@@ -635,7 +486,9 @@ Role-Based Authentication
635
  <div class="mo_wpns_upgrade_security_title" >
636
  <div class="mo_wpns_upgrade_page_title_name">
637
  <h1 class="mo_wpns_upgrade_page_header">
638
- Login and Spam</h1><hr class="mo_wpns_upgrade_page_hr"></div>
 
 
639
 
640
  <div class="mo_wpns_upgrade_page_ns_background">
641
  <center>
@@ -717,7 +570,7 @@ Role-Based Authentication
717
  <div class="mo_wpns_upgrade_page_space_in_div"></div>
718
  <div class="mo_wpns_upgrade_security_title" >
719
  <div class="mo_wpns_upgrade_page_title_name">
720
- <h1 style="margin-top: 0%;padding: 10% 0% 0% 0%; color: white;font-size: 200%;">
721
  Encrypted Backup</h1><hr class="mo_wpns_upgrade_page_hr"></div>
722
 
723
  <div class="mo_wpns_upgrade_page_ns_background">
@@ -765,27 +618,30 @@ Role-Based Authentication
765
  <thead>
766
  <tr class="mo2fa_main_category_header" style="font-size: 20px;">
767
  <th scope="col">Features</th>
768
- <th scope="col" class="mo2fa_plugins"><center>Premium</center></th>
769
- <th scope="col" class="mo2fa_plugins"><center>Premium Lite</center></th>
770
  <th scope="col" class="mo2fa_plugins"><center>Enterprise</center></th>
771
- <th scope="col" class="mo2fa_plugins"><center>Basic</center></th>
 
772
  </tr>
773
  </thead>
774
  <tbody>
775
  <tr>
776
  <th scope="row">Unlimited Sites</th>
777
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
778
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
779
- <td><center><i class="fas fa-check"></i></center></td>
780
  <td><center><i class="fas fa-check"></i></center></td>
 
 
 
781
  </tr>
782
 
783
  <tr>
784
  <th scope="row">Unlimited Users</th>
785
- <td><center><i class="fas fa-check"></i></center></td>
786
- <td><center><i class="fas fa-check"></i></center></td>
787
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
788
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
 
789
 
790
  </tr>
791
  <tr class="mo2fa_bg_category_main">
@@ -796,37 +652,28 @@ Role-Based Authentication
796
  <td></td>
797
  </tr>
798
  <tr>
799
- <th scope="row" class="mo2fa_category_feature">Google Authenticator</th>
800
- <td><center><i class="fas fa-check"></i></center></td>
801
- <td><center><i class="fas fa-check"></i></center></td>
802
- <td><center><i class="fas fa-check"></i></center></td>
803
- <td><center><i class="fas fa-check"></i></center></td>
804
- </tr>
805
- <tr>
806
- <th scope="row" class="mo2fa_category_feature">Security Questions</th>
807
- <td><center><i class="fas fa-check"></i></center></td>
808
- <td><center><i class="fas fa-check"></i></center></td>
809
- <td><center><i class="fas fa-check"></i></center></td>
810
- <td><center><i class="fas fa-check"></i></center></td>
811
 
812
- </tr>
813
- <tr>
814
- <th scope="row" class="mo2fa_category_feature">TOTP Based Authenticator</th>
815
  <td><center><i class="fas fa-check"></i></center></td>
816
  <td><center><i class="fas fa-check"></i></center></td>
817
  <td><center><i class="fas fa-check"></i></center></td>
818
  <td><center><i class="fas fa-check"></i></center></td>
819
 
820
  </tr>
821
- <tr>
822
- <th scope="row" class="mo2fa_category_feature">Authy Authenticator</th>
823
- <td><center><i class="fas fa-check"></i></center></td>
824
- <td><center><i class="fas fa-check"></i></center></td>
 
825
  <td><center><i class="fas fa-check"></i></center></td>
826
  <td><center><i class="fas fa-check"></i></center></td>
827
 
828
- </tr>
829
- <tr>
830
  <th scope="row" class="mo2fa_category_feature">Email Verification</th>
831
  <td><center><i class="fas fa-check"></i></center></td>
832
  <td><center><i class="fas fa-check"></i></center></td>
@@ -834,74 +681,91 @@ Role-Based Authentication
834
  <td><center><i class="fas fa-check"></i></center></td>
835
 
836
  </tr>
837
- <tr>
838
- <th scope="row" class="mo2fa_category_feature">OTP Over Email (Email Charges apply)</th>
839
- <td><center><i class="fas fa-check"></i></center></td>
840
- <td><center><i class="fas fa-check"></i></center></td>
841
- <td><center><i class="fas fa-check"></i></center></td>
842
- <td><center><i class="fas fa-check"></i></center></td>
843
 
 
844
 
845
- </tr>
846
- <tr>
847
- <th scope="row" class="mo2fa_category_feature">OTP Over SMS (SMS Charges apply)</th>
848
- <td><center><i class="fas fa-check"></i></center></td>
849
- <td><center><i class="fas fa-check"></i></center></td>
850
- <td><center><i class="fas fa-check"></i></center></td>
851
- <td><center><i class="fas fa-check"></i></center></td>
852
 
853
- </tr>
854
 
855
- <tr>
856
- <th scope="row" class="mo2fa_category_feature">miniOrange QR Code Authentication</th>
857
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
858
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
859
- <td><center><i class="fas fa-check"></i></center></td>
860
- <td><center><i class="fas fa-check"></i></center></td>
861
- </tr>
862
- <tr>
 
 
 
 
 
 
 
863
  <th scope="row" class="mo2fa_category_feature">miniOrange Soft Token</th>
864
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
865
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
866
  <td><center><i class="fas fa-check"></i></center></td>
867
  <td><center><i class="fas fa-check"></i></center></td>
 
 
868
  </tr>
869
  <tr>
870
  <th scope="row" class="mo2fa_category_feature">miniOrange Push Notification</th>
871
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
872
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
873
  <td><center><i class="fas fa-check"></i></center></td>
874
  <td><center><i class="fas fa-check"></i></center></td>
875
- </tr>
876
- <tr>
877
- <th scope="row" class="mo2fa_category_feature">OTP Over SMS and Email (SMS and Email Charges apply)</th>
878
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
879
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
880
- <td><center><i class="fas fa-check"></i></center></td>
881
- <td><center><i class="fas fa-check"></i></center></td>
882
 
883
- </tr>
884
- <tr>
885
- <th scope="row" class="mo2fa_category_feature">Hardware Token</th>
886
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
887
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
888
  <td><center><i class="fas fa-check"></i></center></td>
889
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
890
-
891
- </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
892
  <tr>
893
  <th scope="row" class="mo2fa_category_feature">OTP Over Whatsapp (Add-on)</th>
894
- <td><center><i class="fas fa-check"></i></center></td>
895
  <td><center></center></td>
896
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
897
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
898
  </tr>
899
  <tr>
900
  <th scope="row" class="mo2fa_category_feature">OTP Over Telegram</th>
901
- <td><center><i class="fas fa-check"></i></center></td>
902
  <td><center></center></td>
903
  <td><center></center></td>
904
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
905
  </tr>
906
  <tr class="mo2fa_bg_category_main">
907
  <th scope="row">Backup Login Methods</th>
@@ -919,17 +783,20 @@ Role-Based Authentication
919
  </tr>
920
  <tr>
921
  <th scope="row" class="mo2fa_category_feature">OTP Over Email</th>
922
- <td><center><i class="fas fa-check"></i></center></td>
923
- <td><center><i class="fas fa-check"></i></center></td>
924
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
925
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
 
926
  </tr>
927
  <tr>
928
  <th scope="row" class="mo2fa_category_feature">Backup Codes</th>
 
929
  <td><center><i class="fas fa-check"></i></center></td>
930
  <td><center><i class="fas fa-check"></i></center></td>
931
  <td><center><i class="fas fa-check"></i></center></td>
932
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
933
  </tr>
934
  <tr class="mo2fa_bg_category_main">
935
  <th scope="row">Password Policy</th>
@@ -941,17 +808,17 @@ Role-Based Authentication
941
  </tr>
942
  <tr>
943
  <th scope="row" class="mo2fa_category_feature">Passwordless Login</th>
 
944
  <td><center><i class="fas fa-check"></i></center></td>
945
- <td><center><i class="fas fa-check"></i></center></td>
946
- <td><center><i class="fas fa-check"></i></center></td>
947
  <td><center><i class="fas fa-check"></i></center></td>
948
  </tr>
949
 
950
  <tr>
951
- <th scope="row">Custom Gateway</th>
952
- <td><center><i class="fas fa-check"></i></center></td>
953
  <td><center><i class="fas fa-check"></i></center></td>
954
- <td><center><i class="fas fa-check"></i></center></td>
955
  <td><center><i class="fas fa-check"></i></center></td>
956
 
957
  </tr>
@@ -965,33 +832,48 @@ Role-Based Authentication
965
  </tr>
966
  <tr>
967
  <th scope="row" class="mo2fa_category_feature">Remember Device Add-on</br><p class="mo2fa_description">You can save your device using the Remember device addon and you will get a two-factor authentication </br>prompt to check your identity if you try to login from different devices.</p></th>
968
- <td><center><b>Included</b></center></td>
969
- <td><center><b>Separate</b></center></td>
970
- <td><center><b>Included</b></center></td>
971
- <td><center><b>Separate</b></center></td>
 
972
  </tr>
973
  <tr>
974
  <th scope="row" class="mo2fa_category_feature">Personalization Add-on<p class="mo2fa_description">You'll get many more customization options in Personalization, such as </br>ustom Email and SMS Template, Custom Login Popup, Custom Security Questions, and many more.</p></th>
975
- <td><center><b>Included</b></center></td>
976
- <td><center><b>Separate</b></center></td>
977
- <td><center><b>Included</b></center></td>
978
- <td><center><b>Separate</b></center></td>
 
979
  </tr>
980
  <tr>
981
  <th scope="row" class="mo2fa_category_feature">Short Codes Add-on<p class="mo2fa_description">Shortcode Add-ons mostly include Allow 2fa shortcode (you can use this this to add 2fa on any page), </br>Reconfigure 2fa add-on (you can use this add-on to reconfigure your 2fa if you have lost your 2fa verification ability), remember device shortcode.</p></th>
982
- <td><center><b>Included</b></center></td>
983
- <td><center><b>Separate</b></center></td>
984
- <td><center><b>Included</b></center></td>
985
- <td><center><b>Separate</b></center></td>
 
986
  </tr>
987
  <tr>
988
  <th scope="row" class="mo2fa_category_feature">Session Management<p class="mo2fa_description">Session Management prevents account sharing and limits number of simultaneous sessions. It also supports session control, login limit, idle session logout feature.</th>
989
 
990
- <td><center><i class="fas fa-check"></i></center></td>
991
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
992
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
993
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
994
  </tr>
 
 
 
 
 
 
 
 
 
 
 
995
  <tr class="mo2fa_bg_category_main">
996
  <th scope="row">Advance WordPress Login Settings</th>
997
  <td></td>
@@ -1016,21 +898,23 @@ Role-Based Authentication
1016
  </tr>
1017
  <tr>
1018
  <th scope="row" class="mo2fa_category_feature">Email Verification during Two-Factor Registration</th>
 
1019
  <td><center><i class="fas fa-check"></i></center></td>
1020
  <td><center><i class="fas fa-check"></i></center></td>
1021
  <td><center><i class="fas fa-check"></i></center></td>
1022
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1023
 
1024
  </tr>
1025
  <tr>
1026
  <th scope="row" class="mo2fa_category_feature">Custom Redirect URL</th>
 
1027
  <td><center><i class="fas fa-check"></i></center></td>
1028
  <td><center><i class="fas fa-check"></i></center></td>
1029
  <td><center><i class="fas fa-check"></i></center></td>
1030
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1031
 
1032
  </tr><tr>
1033
- <th scope="row" class="mo2fa_category_feature">Inline Registration</th>
1034
  <td><center><i class="fas fa-check"></i></center></td>
1035
  <td><center><i class="fas fa-check"></i></center></td>
1036
  <td><center><i class="fas fa-check"></i></center></td>
@@ -1038,24 +922,27 @@ Role-Based Authentication
1038
 
1039
  </tr><tr>
1040
  <th scope="row" class="mo2fa_category_feature">Mobile Support</th>
 
1041
  <td><center><i class="fas fa-check"></i></center></td>
1042
  <td><center><i class="fas fa-check"></i></center></td>
1043
  <td><center><i class="fas fa-check"></i></center></td>
1044
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1045
 
1046
  </tr><tr>
1047
  <th scope="row" class="mo2fa_category_feature">Privacy Policy Settings</th>
 
1048
  <td><center><i class="fas fa-check"></i></center></td>
1049
  <td><center><i class="fas fa-check"></i></center></td>
1050
  <td><center><i class="fas fa-check"></i></center></td>
1051
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1052
 
1053
  </tr><tr>
1054
  <th scope="row" class="mo2fa_category_feature">XML-RPC </th>
 
1055
  <td><center><i class="fas fa-check"></i></center></td>
1056
  <td><center><i class="fas fa-check"></i></center></td>
1057
  <td><center><i class="fas fa-check"></i></center></td>
1058
- <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1059
 
1060
  </tr>
1061
  <tr class="mo2fa_bg_category_main">
@@ -1068,98 +955,128 @@ Role-Based Authentication
1068
  </tr>
1069
  <tr>
1070
  <th scope="row" class="mo2fa_category_feature">Brute Force Protection</th>
1071
- <td><center><i class="fas fa-check"></i></center></td>
1072
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1073
  <td><center><i class="fas fa-check"></i></center></td>
 
1074
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1075
 
1076
  </tr>
1077
  <tr>
1078
  <th scope="row" class="mo2fa_category_feature">IP Blocking </th>
1079
- <td><center><i class="fas fa-check"></i></center></td>
 
 
1080
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1081
  <td><center><i class="fas fa-check"></i></center></td>
1082
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1083
 
1084
  </tr>
1085
  <tr>
1086
  <th scope="row" class="mo2fa_category_feature">Monitoring</th>
1087
- <td><center><i class="fas fa-check"></i></center></td>
 
 
1088
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1089
  <td><center><i class="fas fa-check"></i></center></td>
1090
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1091
 
1092
  </tr> <tr>
1093
  <th scope="row" class="mo2fa_category_feature">File Protection</th>
1094
- <td><center><i class="fas fa-check"></i></center></td>
1095
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1096
  <td><center><i class="fas fa-check"></i></center></td>
1097
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1098
 
1099
  </tr>
1100
  <tr>
1101
  <th scope="row" class="mo2fa_category_feature">Country Blocking </th>
1102
- <td><center><i class="fas fa-check"></i></center></td>
1103
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1104
  <td><center><i class="fas fa-check"></i></center></td>
1105
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1106
 
1107
  </tr>
1108
  <tr>
1109
  <th scope="row" class="mo2fa_category_feature">HTACCESS Level Blocking </th>
1110
- <td><center><i class="fas fa-check"></i></center></td>
1111
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1112
  <td><center><i class="fas fa-check"></i></center></td>
1113
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1114
 
1115
  </tr>
1116
  <tr>
1117
  <th scope="row" class="mo2fa_category_feature">Browser Blocking </th>
1118
- <td><center><i class="fas fa-check"></i></center></td>
1119
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1120
  <td><center><i class="fas fa-check"></i></center></td>
1121
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1122
 
1123
  </tr>
1124
  <tr>
1125
  <th scope="row" class="mo2fa_category_feature">Block Global Blacklisted Email Domains</th>
1126
- <td><center><i class="fas fa-check"></i></center></td>
1127
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1128
  <td><center><i class="fas fa-check"></i></center></td>
1129
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1130
 
1131
  </tr>
1132
  <tr>
1133
  <th scope="row" class="mo2fa_category_feature">Manual Block Email Domains</th>
1134
- <td><center><i class="fas fa-check"></i></center></td>
1135
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1136
  <td><center><i class="fas fa-check"></i></center></td>
1137
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1138
 
1139
  </tr>
1140
  <tr>
1141
  <th scope="row" class="mo2fa_category_feature">DB Backup</th>
1142
- <td><center><i class="fas fa-check"></i></center></td>
1143
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1144
  <td><center><i class="fas fa-check"></i></center></td>
1145
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
1146
 
1147
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
1148
  <tr>
1149
- <th scope="row">Multi-Site Support</th>
1150
  <td><center><i class="fas fa-check"></i></center></td>
1151
- <td><center></center></td>
1152
  <td><center><i class="fas fa-check"></i></center></td>
 
1153
  <td><center><i class="fas fa-check"></i></center></td>
1154
- </tr><tr>
1155
- <th scope="row">Language Translation Support</th>
1156
- <td><center><i class="fas fa-check"></i></center></td>
 
1157
  <td><center></center></td>
1158
  <td><center></center></td>
1159
  <td><center></center></td>
 
1160
 
1161
  </tr><tr>
1162
- <th scope="row">Get online support with GoTo/Zoom meeting</th>
1163
  <td><center><i class="fas fa-check"></i></center></td>
1164
  <td><center><i class="fas fa-check"></i></center></td>
1165
  <td><center><i class="fas fa-check"></i></center></td>
@@ -1343,9 +1260,9 @@ function mo2f_scanner_yearly_standard_pricing() {
1343
  function mo2f_get_binary_equivalent_2fa_lite( $mo2f_var ) {
1344
  switch ( $mo2f_var ) {
1345
  case 1:
1346
- return "<div style='color: #20b2aa;font-size: x-large;float:left;margin:0px 5px;'>🗸</div>";
1347
  case 0:
1348
- return "<div style='color: red;font-size: x-large;float:left;margin:0px 5px;'>×</div>";
1349
  default:
1350
  return $mo2f_var;
1351
  }
@@ -1405,7 +1322,7 @@ function mo2f_feature_on_hover_2fa_upgrade( $mo2f_var ) {
1405
  function show_2fa_plans()
1406
  {
1407
  document.getElementById('mo2fa_ns_features_only').style.display = "none";
1408
- document.getElementById('mo2f_twofa_plans').style.display = "flex";
1409
  document.getElementById('mo_2fa_lite_licensing_plans_title').style.display = "none";
1410
  document.getElementById('mo_2fa_lite_licensing_plans_title1').style.display = "block";
1411
  document.getElementById('mo2f_ns_licensing_plans_title').style.display = "block";
@@ -1421,6 +1338,16 @@ function mo2f_feature_on_hover_2fa_upgrade( $mo2f_var ) {
1421
  document.getElementById('mo2f_ns_licensing_plans_title').style.display = "none";
1422
  document.getElementById('mo_ns_licensing_plans_title1').style.display = "block";
1423
  document.getElementById('mo2fa_compare').style.display = "none";
 
 
 
 
 
 
 
 
 
 
1424
  }
1425
 
1426
  function wpns_pricing()
@@ -1436,4 +1363,27 @@ function mo2f_feature_on_hover_2fa_upgrade( $mo2f_var ) {
1436
  jQuery('.mo2fa_compare1').toggle();
1437
  }
1438
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1439
  </script>
72
  <span class="cd-switch"></span>
73
 
74
 
 
 
 
 
75
 
76
+ <div class="mo2f-pp-row" id="mo2f_twofa_plans">
 
77
 
 
 
 
 
 
78
 
 
 
 
 
79
 
80
+ <div class="mo2f-text-center mo2f-upper-row">
81
+ <div class="mo2f-cloud-onprem-solution">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
+ <div class="mo2f-col-md-6 mo2f-cloud-solution-ribbon">
84
+ <div class="mo2f-ribbon-title">Cloud Solution Plans</div>
85
+ <p>Synchronize and use same 2FA method across multiple websites.</p>
86
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
+ <div class="mo2f-col-md-6 mo2f-on-prem-ribbon">
89
+ <div class="mo2f-ribbon-title">On Premise Solution Plans</div>
90
+ <p>Users' data is stored on your organization's premises.</p>
91
+ </div>
92
 
93
+ </div>
94
+ <div class="mo2f-cloud-solution-ribbon-rpn">
95
+ <div class="mo2f-ribbon-title">Cloud Solution Plans</div>
96
+ <p>Synchronize and use same 2FA method across multiple websites.</p>
97
+ </div>
98
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
99
 
100
+ <div class="mo2f-text-center mo2f-reg-plans-2fa mo2f-single-site mo2f-single-site-rot" id="mo2fa-plan-name">
101
+ <div id="mo2f-hover-2fa-1" class="mo2f-col-md-4 mo2f-hover-2fa mo2f-hover-2fa1">
102
+ <h3>BASIC </h3>
103
+
104
+ <div class="mo2f-price-list" class="mo2f-list-border" id="mo2f-list-margin">
105
+ <div id="mo2f-basic-plan-div" class="mo2f_price_list_border">
106
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
107
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Install On Unlimited Websites</span>
108
+ </li>
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
 
111
+
112
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
113
+ <div class="mo2fa_15_tooltip_methodlist">
114
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i>
115
+ <span>TOTP Based Methods (2FA code via mobile app)</span>
116
+ <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
117
+ <span class="mo2fa_methodlist">
118
+
119
+ Google Authenticator <br>
120
+ Authy Authenticator <br>
121
+ Microsoft Authenticato <br>
122
+ LastPass Authenticator<br>
123
+ FreeOTP Authenticator<br>
124
+ Duo Mobile Authenticator <br>
125
+
126
+
127
+ </span>
128
+ </div>
129
+ </li>
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
 
 
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
+
135
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >2FA Code Over Email/Email Verification (Charges Apply)</span></li>
136
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >2FA Code Via SMS (Charges Apply) </span></li>
137
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >Enforce 2FA For Users</span></li>
138
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >Redirection To Custom Url After 2FA</span></li>
139
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >Role-Based 2FA</span></li>
140
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span >Backup Login Method</span></li>
141
+
142
+ </div>
143
+ </div>
144
+ <p class="mo2f-mt"><span class="mo2f-display-1"><span>$</span><span class="mo_basic_price">30</span><sub class="mo2f-year">/year</sub><br></span></p>
145
+
146
+
147
+ <div class="mo2f-container-dropdown mo2f-discount-price">
148
+ <div class="mo2f-select-dropdown">
149
+ <select class="mo2f-dropdown-width mo2f-inst-btn2" id="mo_basic_select" onchange="mo2f_change_instance_value('mo_enterprise_select','mo_basic_select',this);">
150
+ <option value="1" data-price="30"> 5 USERS </option>
151
+ <option value="2" data-price="49">10 USERS </option>
152
+ <option value="3" data-price="69">25 USERS </option>
153
+ <option value="4" data-price="99">50 USERS</option>
154
+ <option value="5" data-price="199">100 USERS</option>
155
+ <option value="6" data-price="349">500 USERS</option>
156
+ <option value="7" data-price="499">1000 USERS</option>
157
+ <option value="8" data-price="799">5000 USERS</option>
158
+ <option value="9" data-price="999">10000 USERS</option>
159
+ <option value="10" data-price="1449">20000 USERS</option>
160
+
161
+
162
+ </select>
163
+ </div>
164
+ </div>
165
+
166
+ <center>
167
+ <div id="mo2fa_custom_my_plan_2fa_mo">
168
+ <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
169
+ <a onclick="mo2f_upgradeform('wp_2fa_premium_plan','2fa_plan')" target="blank" class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
170
+ <?php }else{ ?>
171
+ <a onclick="mo2f_register_and_upgradeform('wp_2fa_premium_plan','2fa_plan')" target="blank"class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
172
+ <?php }?>
173
+ </div>
174
+
175
+ </center>
176
+
177
+ </div>
178
+
179
+
180
+
181
+
182
+ <div class="mo2f-col-md-4 mo2f-hover-2fa" style="background: rgb(255, 255, 255);">
183
+ <h3>ENTERPRISE</h3>
184
+
185
+ <div class="mo2f-price-list" id="mo2f-list-margin">
186
+ <div id="mo2f-enterprise-plan-div" class="mo2f_price_list_border">
187
+
188
 
 
 
189
 
190
 
191
+ <li id="mo2f-enterprise-first-element" class="mo2f-choose-plan-2fa mo2f-text-left mo2f-basic-color"><i class="fas fa-arrow-circle-right mo2f-basic-color"></i><span>Everything In Basic</span> </li>
192
+
193
+
194
 
 
 
 
 
 
 
 
 
 
 
 
195
 
 
 
 
196
 
197
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
198
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>White labelling (logo, text and color)</span>
199
+ </li>
200
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
201
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Passwordless Login</span>
202
+ </li>
203
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
204
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Configurable 2FA Code Length And Expiration Time.</span></li>
205
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
206
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Remember Device(skip 2FA for trusted devices.)</span></li>
207
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
208
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Custom SMS Gateway</span></li>
209
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
210
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>QR Code Authentication, OTP Over call, Push Notification, Yubikey Hardware Token</span></li>
211
+ </div>
212
+ </div>
213
+ <p class="mo2f-mt"><span class="mo2f-display-1"><span>$</span><span class="mo_enterprise_price">59</span><sub class="mo2f-year">/year</sub><br></span></p>
214
+
215
+ <div class="mo2f-container-dropdown mo2f-discount-price">
216
+ <div class="mo2f-select-dropdown">
217
+ <select class="mo2f-dropdown-width mo2f-inst-btn2" id="mo_enterprise_select" onchange="mo2f_change_instance_value('mo_enterprise_select','mo_basic_select',this);">
218
+ <option value="1" selected="" data-price="59"> 5 USERS </option>
219
+ <option value="2" data-price="78"> 10 USERS </option>
220
+ <option value="3" data-price="98"> 25 USERS </option>
221
+ <option value="4" data-price="128"> 50 USERS</option>
222
+ <option value="5" data-price="228"> 100 USERS</option>
223
+ <option value="6" data-price="378"> 500 USERS</option>
224
+ <option value="7" data-price="528"> 1000 USERS</option>
225
+ <option value="8" data-price="878"> 5000 USERS</option>
226
+ <option value="9" data-price="1028"> 10000 USERS</option>
227
+ <option value="10" data-price="1478"> 20000 USERS</option>
228
+
229
+ </select>
230
+ </div>
231
+ </div>
232
+
233
+ <center>
234
+ <div id="mo2fa_custom_my_plan_2fa_mo">
235
+ <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
236
+ <a onclick="mo2f_upgradeform('wp_2fa_enterprise_plan','2fa_plan')" target="blank" class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
237
+ <?php }else{ ?>
238
+ <a onclick="mo2f_register_and_upgradeform('wp_2fa_enterprise_plan','2fa_plan')" target="blank"class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
239
+ <?php }?>
240
+ </div>
241
+
242
+ </center>
243
+ </div>
244
 
245
+ <div class="mo2f-on-prem-ribbon-rpn"><div class="mo2f-ribbon-title">On Premise Solution Plans</div>
246
+ <p>Users' data is stored on your organization's premises.</p>
247
+ </div>
248
+
249
+ <div id="mo2f-hover-2fa-2" class="mo2f-col-md-4 mo2f-hover-2fa mo2f-hover-2fa2">
250
 
251
+ <h3>PREMIUM LITE</h3>
252
+
253
+ <div class="mo2f-price-list" id="mo2f-list-margin">
254
+ <div id="mo2f-premium-lite-plan-div" class="mo2f_price_list_border">
255
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
256
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Unlimited Users And Single-Site Compatible</span>
257
+ </li>
258
+
259
+ <li class="mo2f-choose-plan-2fa mo2f-text-left">
260
+ <div class="mo2fa_15_tooltip_methodlist">
261
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i>
262
+ <span>TOTP Based Methods (2FA code via mobile app)</span>
263
+ <i class="fa fa-info-circle fa-xs" aria-hidden="true"></i>
264
+ <span class="mo2fa_methodlist">
265
+
266
+ Google Authenticator <br>
267
+ Authy Authenticator <br>
268
+ Microsoft Authenticato <br>
269
+ LastPass Authenticator<br>
270
+ FreeOTP Authenticator<br>
271
+ Duo Mobile Authenticator <br>
272
+
273
+
274
+ </span>
275
+ </div>
276
+ </li>
277
 
278
 
279
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>2FA Code Over Email/Email Verification (Unlimited Transcations)</span></li>
280
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>2FA Code Via SMS (Charges Apply)</span></li>
281
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Enforce 2FA For Users</span></li>
282
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Redirection To Custom Url After 2FA</span></li>
283
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Role-Based 2FA</span></li>
284
+ <li class="mo2f-choose-plan-2fa mo2f-text-left"><i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Backup Login Method</span></li>
285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
 
287
+
288
+
289
+
290
+ </div>
291
+ </div>
292
+ <p class="mo2f-mt"><span class="mo2f-display-1 "><span>$</span><span class="mo_premium_lite_price">99</span><sub class="mo2f-year">/year</sub></span><br></p>
293
+
294
+ <div class="mo2f-container-dropdown mo2f-discount-price">
295
+ <div class="mo2f-select-dropdown">
296
+ <select class="mo2f-dropdown-width mo2f-inst-btn2" id="mo_premium_lite_select" onchange="mo2f_change_instance_value('mo_premium_select','mo_premium_lite_select',this);">
297
+ <option value="1" data-price="99"> 1 SITE </option>
298
+ <option value="2" data-price="179"> 2 SITES</option>
299
+ <option value="3" data-price="299"> 5 SITES</option>
300
+ <option value="4" data-price="449"> 10 SITES</option>
301
+ <option value="5" data-price="599"> 25 SITES</option>
302
+ </select>
303
+
304
+ </div>
305
+ </div>
306
+ <center>
307
+ <div id="mo2fa_custom_my_plan_2fa_mo">
308
+ <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
309
+ <a onclick="mo2f_upgradeform('wp_security_two_factor_premium_lite_plan','2fa_plan')" target="blank" class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
310
+ <?php }else{ ?>
311
+ <a onclick="mo2f_register_and_upgradeform('wp_security_two_factor_premium_lite_plan','2fa_plan')" target="blank"class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
312
+ <?php }?>
313
+ </div>
314
+
315
+ </center>
316
+
317
+ </div>
318
+
319
 
320
+ <div class="mo2f-col-md-4 mo2f-hover-2fa mo2f-incl-plan-2fa">
321
+
322
+
323
+ <div class="mo2f-product">
324
+ <div class="mo2f-price-tag">
325
+ <p class="mo2f-price">Best Value</p>
326
+ </div>
327
+
328
+ <h3 >ALL-INCLUSIVE</h3>
329
+
330
+ <div class="mo2f-price-list mo2f-text-left mo2f-price-list-incl" id="mo2f-list-margin">
331
+ <div id="mo2f-all-inclusive-plan-div" class="mo2f_price_list_border">
332
+ <li id="mo2f-all-inclusive-first-element" class="mo2f-choose-plan-2fa mo2f-text-left mo2f-premium-color"><i class="fas fa-arrow-circle-right mo2f-premium-color"></i><span>Everything In Premium Lite </span>
333
+
334
+ </li>
335
+
336
+
337
+ <li class="mo2f-choose-plan-2fa">
338
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>2FA Code Via Telegram</span>
339
+ </li>
340
+ <li class="mo2f-choose-plan-2fa">
341
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Remember Device (Skip 2FA for trusted device)</span>
342
+ </li>
343
+ <li class="mo2f-choose-plan-2fa">
344
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>White labelling (logo, text and color)</span>
345
+ </li>
346
+ <li class="mo2f-choose-plan-2fa">
347
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Page Restriction (2FA to access specific pages)</span>
348
+ </li>
349
+ <li class="mo2f-choose-plan-2fa">
350
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Concurrent Session Restriction</span>
351
+ </li>
352
+ <li class="mo2f-choose-plan-2fa">
353
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>WebAuthn (Login using device credentials)</span>
354
+ </li>
355
+ <li class="mo2f-choose-plan-2fa">
356
+ <i class="fas fa-arrow-circle-right mo2f-text-success"></i><span>Skip 2FA For Specified IPs.</span>
357
+ </li>
358
+ </div>
359
+ </div>
360
+ <p class="mo2f-mt"><span class="mo2f-display-1"><span>$</span><span class="mo_premium_price">199</span><sub class="mo2f-year">/year</sub></span><br></p>
361
 
362
+
363
+ <div class="mo2f-container-dropdown mo2f-discount-price">
364
+ <div class="mo2f-select-dropdown">
365
+ <select class="mo2f-dropdown-width mo2f-inst-btn2" id="mo_premium_select" onchange="mo2f_change_instance_value('mo_premium_select','mo_premium_lite_select',this);">
366
+ <option value="1" data-price="199"> 1 SITE </option>
367
+ <option value="2" data-price="299"> 2 SITES</option>
368
+ <option value="3" data-price="499"> 5 SITES</option>
369
+ <option value="4" data-price="799"> 10 SITES</option>
370
+ <option value="5" data-price="1099"> 25 SITES</option>
371
+ </select>
372
+
373
+ </div>
374
+ </div>
375
+ <center>
376
+ <div id="mo2fa_custom_my_plan_2fa_mo">
377
+ <?php if( isset($is_customer_registered) && $is_customer_registered) { ?>
378
+ <a onclick="mo2f_upgradeform('wp_security_two_factor_all_inclusive_plan','2fa_plan')" target="blank" class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
379
+ <?php }else{ ?>
380
+ <a onclick="mo2f_register_and_upgradeform('wp_security_two_factor_all_inclusive_plan','2fa_plan')" target="blank"class="mo2f-license-btn mo2f-license-btn-2fa">UPGRADE NOW</a>
381
+ <?php }?>
382
+ </div>
383
+
384
+ </center>
385
+ </div>
386
+
387
+
388
+ </div>
389
+ </div>
390
 
391
+ <br>
392
+ <br><br>
393
+ </div>
394
+
395
+ <script>
396
+ document.getElementById("mo2f-enterprise-first-element").addEventListener("mouseover", mouseOver);
397
 
398
+ document.getElementById("mo2f-enterprise-first-element").addEventListener("mouseout", mouseOut);
399
 
400
+ function mouseOver() {
401
+ document.getElementById("mo2f-hover-2fa-1").style.background = "linear-gradient(145deg, #fafbfe,#ffe9cc,#e3ecfe)";
402
+ }
403
+ function mouseOut() {
404
+ document.getElementById("mo2f-hover-2fa-1").style.background = "#fff";
405
+ }
406
 
 
 
 
 
 
 
 
 
407
 
 
 
 
408
 
409
+ document.getElementById("mo2f-all-inclusive-first-element").addEventListener("mouseover", premium_mouseOver);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
 
411
+ document.getElementById("mo2f-all-inclusive-first-element").addEventListener("mouseout", premium_mouseOut);
 
 
 
 
 
 
 
 
 
 
 
412
 
413
+ function premium_mouseOver() {
414
+ document.getElementById("mo2f-hover-2fa-2").style.background = "linear-gradient(145deg,#fafbfe,#d5f6d3 ,#d4f1d3,#e3ecfe)";
415
+ }
416
+ function premium_mouseOut() {
417
+ document.getElementById("mo2f-hover-2fa-2").style.background = "#fff";
418
+ }
419
 
 
 
420
 
421
+ </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
422
 
 
 
 
 
423
 
424
+
 
 
 
 
 
 
425
 
426
+
427
+
 
 
 
 
 
 
428
 
429
+
430
+
431
+
432
+
433
  <div id="mo2fa_compare">
434
  <center>
435
  <div class=""><a href="#mo2fa_more_deails" onclick="mo2fa_show_details()"><button class="mo2fa_upgrade_my_plan mo2fa_compare1">Click here to Compare Features</button></a></div>
486
  <div class="mo_wpns_upgrade_security_title" >
487
  <div class="mo_wpns_upgrade_page_title_name">
488
  <h1 class="mo_wpns_upgrade_page_header">
489
+ Login and Spam</h1>
490
+ <hr class="mo_wpns_upgrade_page_hr">
491
+ </div>
492
 
493
  <div class="mo_wpns_upgrade_page_ns_background">
494
  <center>
570
  <div class="mo_wpns_upgrade_page_space_in_div"></div>
571
  <div class="mo_wpns_upgrade_security_title" >
572
  <div class="mo_wpns_upgrade_page_title_name">
573
+ <h1 class="mo_wpns_upgrade_page_header">
574
  Encrypted Backup</h1><hr class="mo_wpns_upgrade_page_hr"></div>
575
 
576
  <div class="mo_wpns_upgrade_page_ns_background">
618
  <thead>
619
  <tr class="mo2fa_main_category_header" style="font-size: 20px;">
620
  <th scope="col">Features</th>
621
+
622
+ <th scope="col" class="mo2fa_plugins"><center>Basic</center></th>
623
  <th scope="col" class="mo2fa_plugins"><center>Enterprise</center></th>
624
+ <th scope="col" class="mo2fa_plugins"><center>Premium Lite</center></th>
625
+ <th scope="col" class="mo2fa_plugins"><center>All Inclusive</center></th>
626
  </tr>
627
  </thead>
628
  <tbody>
629
  <tr>
630
  <th scope="row">Unlimited Sites</th>
631
+
 
 
632
  <td><center><i class="fas fa-check"></i></center></td>
633
+ <td><center><i class="fas fa-check"></i></center></td>
634
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
635
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
636
  </tr>
637
 
638
  <tr>
639
  <th scope="row">Unlimited Users</th>
640
+
 
641
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
642
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
643
+ <td><center><i class="fas fa-check"></i></center></td>
644
+ <td><center><i class="fas fa-check"></i></center></td>
645
 
646
  </tr>
647
  <tr class="mo2fa_bg_category_main">
652
  <td></td>
653
  </tr>
654
  <tr>
655
+ <th scope="row" class="mo2fa_category_feature">
656
+ TOTP Based Authenticator
657
+ <br>
658
+ <div class="mo2fa-top-auth-unbold"> Google Authenticator<br>Microsoft Authenticator<br>Authy Authenticator<br>Last Pass Authenticator<br>Duo Authenticator</div>
659
+ </th>
 
 
 
 
 
 
 
660
 
 
 
 
661
  <td><center><i class="fas fa-check"></i></center></td>
662
  <td><center><i class="fas fa-check"></i></center></td>
663
  <td><center><i class="fas fa-check"></i></center></td>
664
  <td><center><i class="fas fa-check"></i></center></td>
665
 
666
  </tr>
667
+
668
+ <tr>
669
+ <th scope="row" class="mo2fa_category_feature">Security Questions</th>
670
+ <td><center><i class="fas fa-check"></i></center></td>
671
+ <td><center><i class="fas fa-check"></i></center></td>
672
  <td><center><i class="fas fa-check"></i></center></td>
673
  <td><center><i class="fas fa-check"></i></center></td>
674
 
675
+ </tr>
676
+ <tr>
677
  <th scope="row" class="mo2fa_category_feature">Email Verification</th>
678
  <td><center><i class="fas fa-check"></i></center></td>
679
  <td><center><i class="fas fa-check"></i></center></td>
681
  <td><center><i class="fas fa-check"></i></center></td>
682
 
683
  </tr>
 
 
 
 
 
 
684
 
685
+
686
 
687
+ <tr>
688
+ <th scope="row" class="mo2fa_category_feature">OTP Over Email</th>
689
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
690
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
691
+ <td><center>Unlimited</center></td>
692
+ <td><center>Unlimited</center></td>
693
+ </tr>
694
 
 
695
 
696
+ <tr>
697
+ <th scope="row" class="mo2fa_category_feature">OTP Over SMS</th>
698
+
699
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
700
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
701
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
702
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
703
+
704
+
705
+ </tr>
706
+
707
+
708
+
709
+
710
+
711
  <th scope="row" class="mo2fa_category_feature">miniOrange Soft Token</th>
712
+
 
713
  <td><center><i class="fas fa-check"></i></center></td>
714
  <td><center><i class="fas fa-check"></i></center></td>
715
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
716
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
717
  </tr>
718
  <tr>
719
  <th scope="row" class="mo2fa_category_feature">miniOrange Push Notification</th>
720
+
 
721
  <td><center><i class="fas fa-check"></i></center></td>
722
  <td><center><i class="fas fa-check"></i></center></td>
723
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
 
 
 
724
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
725
+ </tr>
726
+ <th scope="row" class="mo2fa_category_feature">miniOrange QR code authentication</th>
727
 
728
+ <td><center><i class="fas fa-check"></i></center></td>
 
 
 
 
729
  <td><center><i class="fas fa-check"></i></center></td>
730
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
731
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
732
+ </tr>
733
+
734
+ <tr>
735
+ <th scope="row" class="mo2fa_category_feature">OTP Over SMS and Email</th>
736
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
737
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
738
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
739
+ <td><center><a href="<?php echo esc_url(MoWpnsConstants::SMS_EMAIL_TRANSACTION) ?>" target="_blank">Charges Apply</a></center></td>
740
+
741
+
742
+ </tr>
743
+
744
+
745
+ <tr>
746
+ <th scope="row" class="mo2fa_category_feature">Yubikey Hardware Token</th>
747
+ <td></td>
748
+ <td><center><i class="fas fa-check"></i></center></td>
749
+ <td></td>
750
+ <td></td>
751
+
752
+
753
+ </tr>
754
  <tr>
755
  <th scope="row" class="mo2fa_category_feature">OTP Over Whatsapp (Add-on)</th>
756
+
757
  <td><center></center></td>
758
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
759
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
760
+ <td><center><i class="fas fa-check"></i></center></td>
761
  </tr>
762
  <tr>
763
  <th scope="row" class="mo2fa_category_feature">OTP Over Telegram</th>
764
+
765
  <td><center></center></td>
766
  <td><center></center></td>
767
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
768
+ <td><center><i class="fas fa-check"></i></center></td>
769
  </tr>
770
  <tr class="mo2fa_bg_category_main">
771
  <th scope="row">Backup Login Methods</th>
783
  </tr>
784
  <tr>
785
  <th scope="row" class="mo2fa_category_feature">OTP Over Email</th>
786
+
 
787
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
788
+ <td><center><i class="fas fa-check"></i></center></td>
789
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
790
+
791
+ <td><center><i class="fas fa-check"></i></center></td>
792
  </tr>
793
  <tr>
794
  <th scope="row" class="mo2fa_category_feature">Backup Codes</th>
795
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
796
  <td><center><i class="fas fa-check"></i></center></td>
797
  <td><center><i class="fas fa-check"></i></center></td>
798
  <td><center><i class="fas fa-check"></i></center></td>
799
+
800
  </tr>
801
  <tr class="mo2fa_bg_category_main">
802
  <th scope="row">Password Policy</th>
808
  </tr>
809
  <tr>
810
  <th scope="row" class="mo2fa_category_feature">Passwordless Login</th>
811
+ <td><center></center></td>
812
  <td><center><i class="fas fa-check"></i></center></td>
813
+ <td><center></center></td>
 
814
  <td><center><i class="fas fa-check"></i></center></td>
815
  </tr>
816
 
817
  <tr>
818
+ <th scope="row" class="mo2fa_category_feature">Custom Gateway</th>
819
+ <td><center></center></td>
820
  <td><center><i class="fas fa-check"></i></center></td>
821
+ <td><center></center></td>
822
  <td><center><i class="fas fa-check"></i></center></td>
823
 
824
  </tr>
832
  </tr>
833
  <tr>
834
  <th scope="row" class="mo2fa_category_feature">Remember Device Add-on</br><p class="mo2fa_description">You can save your device using the Remember device addon and you will get a two-factor authentication </br>prompt to check your identity if you try to login from different devices.</p></th>
835
+
836
+ <td><center></center></td>
837
+ <td><center><i class="fas fa-check"></i></center></td>
838
+ <td><center></center></td>
839
+ <td><center><i class="fas fa-check"></i></center></td>
840
  </tr>
841
  <tr>
842
  <th scope="row" class="mo2fa_category_feature">Personalization Add-on<p class="mo2fa_description">You'll get many more customization options in Personalization, such as </br>ustom Email and SMS Template, Custom Login Popup, Custom Security Questions, and many more.</p></th>
843
+
844
+ <td><center></center></td>
845
+ <td><center><i class="fas fa-check"></i></center></td>
846
+ <td><center></center></td>
847
+ <td><center><i class="fas fa-check"></i></center></td>
848
  </tr>
849
  <tr>
850
  <th scope="row" class="mo2fa_category_feature">Short Codes Add-on<p class="mo2fa_description">Shortcode Add-ons mostly include Allow 2fa shortcode (you can use this this to add 2fa on any page), </br>Reconfigure 2fa add-on (you can use this add-on to reconfigure your 2fa if you have lost your 2fa verification ability), remember device shortcode.</p></th>
851
+
852
+ <td><center></center></td>
853
+ <td><center><i class="fas fa-check"></i></center></td>
854
+ <td><center></center></td>
855
+ <td><center><i class="fas fa-check"></i></center></td>
856
  </tr>
857
  <tr>
858
  <th scope="row" class="mo2fa_category_feature">Session Management<p class="mo2fa_description">Session Management prevents account sharing and limits number of simultaneous sessions. It also supports session control, login limit, idle session logout feature.</th>
859
 
860
+
861
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
862
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
863
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
864
+ <td><center><i class="fas fa-check"></i></center></td>
865
  </tr>
866
+
867
+ <tr>
868
+ <th scope="row" class="mo2fa_category_feature">Page Restriction Add-On</th>
869
+ <td></td>
870
+ <td></td>
871
+ <td></td>
872
+ <td><center><i class="fas fa-check"></i></center></td>
873
+
874
+
875
+
876
+ </tr>
877
  <tr class="mo2fa_bg_category_main">
878
  <th scope="row">Advance WordPress Login Settings</th>
879
  <td></td>
898
  </tr>
899
  <tr>
900
  <th scope="row" class="mo2fa_category_feature">Email Verification during Two-Factor Registration</th>
901
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
902
  <td><center><i class="fas fa-check"></i></center></td>
903
  <td><center><i class="fas fa-check"></i></center></td>
904
  <td><center><i class="fas fa-check"></i></center></td>
905
+
906
 
907
  </tr>
908
  <tr>
909
  <th scope="row" class="mo2fa_category_feature">Custom Redirect URL</th>
910
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
911
  <td><center><i class="fas fa-check"></i></center></td>
912
  <td><center><i class="fas fa-check"></i></center></td>
913
  <td><center><i class="fas fa-check"></i></center></td>
914
+
915
 
916
  </tr><tr>
917
+ <th scope="row" class="mo2fa_category_feature">Inline Registration (Set up 2FA after first login)</th>
918
  <td><center><i class="fas fa-check"></i></center></td>
919
  <td><center><i class="fas fa-check"></i></center></td>
920
  <td><center><i class="fas fa-check"></i></center></td>
922
 
923
  </tr><tr>
924
  <th scope="row" class="mo2fa_category_feature">Mobile Support</th>
925
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
926
  <td><center><i class="fas fa-check"></i></center></td>
927
  <td><center><i class="fas fa-check"></i></center></td>
928
  <td><center><i class="fas fa-check"></i></center></td>
929
+
930
 
931
  </tr><tr>
932
  <th scope="row" class="mo2fa_category_feature">Privacy Policy Settings</th>
933
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
934
  <td><center><i class="fas fa-check"></i></center></td>
935
  <td><center><i class="fas fa-check"></i></center></td>
936
  <td><center><i class="fas fa-check"></i></center></td>
937
+
938
 
939
  </tr><tr>
940
  <th scope="row" class="mo2fa_category_feature">XML-RPC </th>
941
+ <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
942
  <td><center><i class="fas fa-check"></i></center></td>
943
  <td><center><i class="fas fa-check"></i></center></td>
944
  <td><center><i class="fas fa-check"></i></center></td>
945
+
946
 
947
  </tr>
948
  <tr class="mo2fa_bg_category_main">
955
  </tr>
956
  <tr>
957
  <th scope="row" class="mo2fa_category_feature">Brute Force Protection</th>
 
958
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
959
+
960
  <td><center><i class="fas fa-check"></i></center></td>
961
+
962
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
963
+ <td><center><i class="fas fa-check"></i></center></td>
964
 
965
  </tr>
966
  <tr>
967
  <th scope="row" class="mo2fa_category_feature">IP Blocking </th>
968
+
969
+
970
+
971
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
972
  <td><center><i class="fas fa-check"></i></center></td>
973
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
974
+ <td><center><i class="fas fa-check"></i></center></td>
975
 
976
  </tr>
977
  <tr>
978
  <th scope="row" class="mo2fa_category_feature">Monitoring</th>
979
+
980
+
981
+
982
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
983
  <td><center><i class="fas fa-check"></i></center></td>
984
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
985
+ <td><center><i class="fas fa-check"></i></center></td>
986
 
987
  </tr> <tr>
988
  <th scope="row" class="mo2fa_category_feature">File Protection</th>
989
+
990
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
991
  <td><center><i class="fas fa-check"></i></center></td>
992
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
993
+ <td><center><i class="fas fa-check"></i></center></td>
994
 
995
  </tr>
996
  <tr>
997
  <th scope="row" class="mo2fa_category_feature">Country Blocking </th>
998
+
999
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1000
  <td><center><i class="fas fa-check"></i></center></td>
1001
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1002
+ <td><center><i class="fas fa-check"></i></center></td>
1003
 
1004
  </tr>
1005
  <tr>
1006
  <th scope="row" class="mo2fa_category_feature">HTACCESS Level Blocking </th>
1007
+
1008
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1009
  <td><center><i class="fas fa-check"></i></center></td>
1010
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1011
+ <td><center><i class="fas fa-check"></i></center></td>
1012
 
1013
  </tr>
1014
  <tr>
1015
  <th scope="row" class="mo2fa_category_feature">Browser Blocking </th>
1016
+
1017
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1018
  <td><center><i class="fas fa-check"></i></center></td>
1019
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1020
+ <td><center><i class="fas fa-check"></i></center></td>
1021
 
1022
  </tr>
1023
  <tr>
1024
  <th scope="row" class="mo2fa_category_feature">Block Global Blacklisted Email Domains</th>
1025
+
1026
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1027
  <td><center><i class="fas fa-check"></i></center></td>
1028
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1029
+ <td><center><i class="fas fa-check"></i></center></td>
1030
 
1031
  </tr>
1032
  <tr>
1033
  <th scope="row" class="mo2fa_category_feature">Manual Block Email Domains</th>
1034
+
1035
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1036
  <td><center><i class="fas fa-check"></i></center></td>
1037
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1038
+ <td><center><i class="fas fa-check"></i></center></td>
1039
 
1040
  </tr>
1041
  <tr>
1042
  <th scope="row" class="mo2fa_category_feature">DB Backup</th>
1043
+
1044
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1045
  <td><center><i class="fas fa-check"></i></center></td>
1046
  <td><center><i class="fas fa-times mo2fa_hide"></i></center></td>
1047
+ <td><center><i class="fas fa-check"></i></center></td>
1048
 
1049
  </tr>
1050
+
1051
+ </tr>
1052
+ <tr class="mo2fa_bg_category_main">
1053
+ <th scope="row">Additional Features</th>
1054
+ <td></td>
1055
+ <td></td>
1056
+ <td></td>
1057
+ <td></td>
1058
+
1059
+ </tr>
1060
+
1061
+
1062
  <tr>
1063
+ <th scope="row" class="mo2fa_category_feature">Multi-Site Support</th>
1064
  <td><center><i class="fas fa-check"></i></center></td>
1065
+
1066
  <td><center><i class="fas fa-check"></i></center></td>
1067
+ <td><center></center></td>
1068
  <td><center><i class="fas fa-check"></i></center></td>
1069
+ </tr>
1070
+ <tr>
1071
+ <th scope="row" class="mo2fa_category_feature">Language Translation Support</th>
1072
+
1073
  <td><center></center></td>
1074
  <td><center></center></td>
1075
  <td><center></center></td>
1076
+ <td><center><i class="fas fa-check"></i></center></td>
1077
 
1078
  </tr><tr>
1079
+ <th scope="row" class="mo2fa_category_feature">Get online support with GoTo/Zoom meeting</th>
1080
  <td><center><i class="fas fa-check"></i></center></td>
1081
  <td><center><i class="fas fa-check"></i></center></td>
1082
  <td><center><i class="fas fa-check"></i></center></td>
1260
  function mo2f_get_binary_equivalent_2fa_lite( $mo2f_var ) {
1261
  switch ( $mo2f_var ) {
1262
  case 1:
1263
+ return "<div style='color: #20b2aa;font-size: x-large;float:left;margin:0px 5px;'>🗸</div>";
1264
  case 0:
1265
+ return "<div style='color: red;font-size: x-large;float:left;margin:0px 5px;'>×</div>";
1266
  default:
1267
  return $mo2f_var;
1268
  }
1322
  function show_2fa_plans()
1323
  {
1324
  document.getElementById('mo2fa_ns_features_only').style.display = "none";
1325
+ document.getElementById('mo2f_twofa_plans').style.display = "block";
1326
  document.getElementById('mo_2fa_lite_licensing_plans_title').style.display = "none";
1327
  document.getElementById('mo_2fa_lite_licensing_plans_title1').style.display = "block";
1328
  document.getElementById('mo2f_ns_licensing_plans_title').style.display = "block";
1338
  document.getElementById('mo2f_ns_licensing_plans_title').style.display = "none";
1339
  document.getElementById('mo_ns_licensing_plans_title1').style.display = "block";
1340
  document.getElementById('mo2fa_compare').style.display = "none";
1341
+
1342
+ if(document.getElementById('mo2fa_more_deails').style.display!="none")
1343
+ {
1344
+ jQuery('#mo2fa_more_deails').toggle();
1345
+ jQuery('.mo2fa_compare1').toggle();
1346
+
1347
+
1348
+ }
1349
+
1350
+
1351
  }
1352
 
1353
  function wpns_pricing()
1363
  jQuery('.mo2fa_compare1').toggle();
1364
  }
1365
 
1366
+
1367
+ var multisite = !1;
1368
+
1369
+ function mo2f_change_instance_value(e, r, o, s = !1) {
1370
+ let p = 0,
1371
+ u = 0,
1372
+ n = 0;
1373
+ if (s) p = jQuery(o).find(":selected").val(), jQuery("#number_of_subsites_premium,#number_of_subsites_all_inclusive").not(o).val(p);
1374
+ else if (u = jQuery(o).find(":selected").val(), jQuery("#" + r ).not(o).val(u), "" != e) {
1375
+ document.getElementById(e).value = u;
1376
+ var c = jQuery("#" + e).find(":selected").data("price");
1377
+ jQuery("." + e.replace("select", "price")).text(c)
1378
+ }
1379
+ multisite && (n = jQuery("#number_of_subsites_premium").find(":selected").data("price"));
1380
+ var l = jQuery("#" + r).find(":selected").data("price"),
1381
+ a = jQuery("#" + r).find(":selected").val();
1382
+ jQuery("." + r.replace("select", "price")).text(parseInt(l) + parseInt(n) * parseInt(a));
1383
+ }
1384
+
1385
+
1386
+
1387
+
1388
+
1389
  </script>