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

Version Description

  • Google Authenticator-Two Factor Authentication (2FA, OTP) :
    • Theme My Login plugin Support
    • Ultimate Memember Registration Support
    • Woocommerce Registration Support
    • Ultimate Memember Redirect
    • Restrict Content Pro Login and Registration
Download this release

Release Info

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

Code changes from version 5.4.12 to 5.4.15

Files changed (84) hide show
  1. api/Mo2f_OnPremRedirect.php +17 -6
  2. api/class-customer-common-setup.php +6 -6
  3. api/class-two-factor-setup.php +1 -1
  4. api/mo2f_api.php +71 -70
  5. controllers/account.php +5 -4
  6. controllers/advanced-blocking.php +186 -186
  7. controllers/backup/backup_ajax.php +1 -1
  8. controllers/backup/backup_created_report.php +1 -1
  9. controllers/backup/backup_schdule.php +21 -21
  10. controllers/content-protection.php +93 -93
  11. controllers/dashboard_ajax.php +210 -210
  12. controllers/feedback_footer.php +46 -46
  13. controllers/licensing.php +49 -49
  14. controllers/login-security.php +4 -4
  15. controllers/login-spam.php +9 -9
  16. controllers/main_controller.php +111 -111
  17. controllers/malware_scanner/malware_scan_result.php +40 -40
  18. controllers/malware_scanner/scan_malware.php +9 -10
  19. controllers/malware_scanner/scan_malware_report.php +4 -4
  20. controllers/malware_scanner/scan_malware_settings.php +2 -4
  21. controllers/malware_scanner/scan_malware_summary.php +4 -4
  22. controllers/navbar.php +83 -83
  23. controllers/newtork_security_features.php +1 -1
  24. controllers/notification-settings.php +100 -100
  25. controllers/pointers.php +2 -1
  26. controllers/registration-security.php +128 -128
  27. controllers/tour-model.php +1 -1
  28. controllers/tour/tour_ajax.php +1 -1
  29. controllers/two-fa-intro.php +222 -222
  30. controllers/twofa/mo2fa_common_login.php +132 -20
  31. controllers/twofa/mo2fa_inline_registration.php +16 -12
  32. controllers/twofa/setup_twofa.php +38 -35
  33. controllers/twofa/two_fa.php +3 -3
  34. controllers/twofa/two_fa_addon.php +5 -5
  35. controllers/twofa/two_fa_custom_form.php +8 -1
  36. controllers/twofa/two_fa_premium_feature.php +2 -2
  37. controllers/twofa/two_factor_ajax.php +121 -28
  38. controllers/upgrade.php +1 -1
  39. controllers/wpns-loginsecurity-ajax.php +1208 -1170
  40. database/database_functions.php +819 -813
  41. database/database_functions_2fa.php +4 -2
  42. database/mo2f_db_options.php +37 -0
  43. handler/WAF/database/mo-waf-db-common.php +25 -0
  44. handler/WAF/database/mo-waf-db.php +1 -1
  45. handler/WAF/database/mo-waf-plugin-db.php +4 -1
  46. handler/WAF/mo-waf-plugin.php +211 -210
  47. handler/WAF/mo-waf.php +206 -206
  48. handler/backup.php +321 -319
  49. handler/feedback_form.php +1 -1
  50. handler/logger.php +36 -36
  51. handler/login.php +6 -6
  52. handler/mo-block.html +9 -9
  53. handler/recaptcha.php +106 -106
  54. handler/security_features.php +3 -3
  55. handler/twofa/class_miniorange_2fa_strong_password.php +107 -110
  56. handler/twofa/setup_twofa.php +918 -877
  57. handler/twofa/two_fa_constants.php +1 -1
  58. handler/twofa/two_fa_get_details.php +0 -2
  59. handler/twofa/two_fa_login.php +8 -2
  60. handler/twofa/two_fa_pass2login.php +201 -63
  61. handler/twofa/two_fa_settings.php +83 -67
  62. handler/twofa/two_fa_short_call.php +43 -0
  63. handler/twofa/two_fa_short_custom.php +80 -0
  64. handler/twofa/two_fa_short_gateway.php +67 -0
  65. handler/twofa/two_fa_utility.php +17 -3
  66. helper/constants.php +96 -96
  67. helper/curl.php +285 -284
  68. helper/dashboard_security_notification.php +270 -264
  69. helper/mo_twofa_sessions.php +53 -0
  70. helper/pluginUtility.php +6 -1
  71. helper/plugins.php +102 -102
  72. helper/utility.php +22 -8
  73. includes/css/bootstrap.min.css +5734 -5734
  74. includes/css/front_end_login.css +618 -618
  75. includes/css/jquery.ui.css +743 -743
  76. includes/css/phone.css +35 -0
  77. includes/css/popup.css +82 -82
  78. includes/css/style_settings.css +131 -52
  79. includes/js/bootstrap.min.js +6 -6
  80. includes/js/custom-ajax-rcp.js +268 -0
  81. includes/js/custom-form-ajax.js +487 -0
  82. includes/js/custom-form.js +407 -0
  83. includes/js/dmajax.js +58 -0
  84. includes/js/jquery.dataTables.min.js +0 -17
api/Mo2f_OnPremRedirect.php CHANGED
@@ -108,7 +108,6 @@ class Mo2f_OnPremRedirect {
108
  function OnpremSendOTPEMail($current_user,$tokenName,$timeName,$email=null)
109
  {
110
  global $Mo2fdbQueries;
111
-
112
  if(!isset($current_user) or is_null($current_user))
113
  {
114
  if(is_user_logged_in()){
@@ -117,10 +116,21 @@ class Mo2f_OnPremRedirect {
117
  $current_user = unserialize($_SESSION['mo2f_current_user']);
118
  }
119
  }
120
- //$email = get_user_meta($current_user->ID,'email',true);
121
 
122
  if(is_null($email) or empty($email) or $email == '' or !isset($email) )
 
123
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
 
 
 
 
 
 
 
 
 
 
 
124
  $subject = '2-Factor Authentication';
125
  $headers = array('Content-Type: text/html; charset=UTF-8');
126
  $otpToken = '';
@@ -131,7 +141,6 @@ class Mo2f_OnPremRedirect {
131
  update_user_meta($current_user->ID,$tokenName,$otpToken);
132
  update_user_meta($current_user->ID,$timeName,time());
133
  update_user_meta($current_user->ID,'tempRegEmail',$email);
134
- //update_site_option('otpTokenEmailV',$otpTokenH);
135
  $message = '<table cellpadding="25" style="margin:0px auto">
136
  <tbody>
137
  <tr>
@@ -218,11 +227,14 @@ class Mo2f_OnPremRedirect {
218
  {
219
  $arr = array('status' => 'SUCCESS','message'=>'Successfully validated.');
220
  delete_user_meta( $user_id, $dtoken );
221
- if($dtoken == 'mo2f_email_check_code')
222
  {
223
  $tempRegEmail = get_user_meta($user_id,'tempRegEmail',true);
224
  if($tempRegEmail != '' or !is_null($tempRegEmail) or !$tempRegEmail)
225
- $Mo2fdbQueries->update_user_details($user_id,array('mo2f_user_email'=> $tempRegEmail));
 
 
 
226
  }
227
  delete_user_meta( $user_id,'tempRegEmail');
228
  }
@@ -231,7 +243,6 @@ class Mo2f_OnPremRedirect {
231
  $arr = array('status' => 'FAILED','message'=>'TEST FAILED.');
232
  }
233
 
234
- //exit;
235
  $content = json_encode($arr);
236
  return $content;
237
 
108
  function OnpremSendOTPEMail($current_user,$tokenName,$timeName,$email=null)
109
  {
110
  global $Mo2fdbQueries;
 
111
  if(!isset($current_user) or is_null($current_user))
112
  {
113
  if(is_user_logged_in()){
116
  $current_user = unserialize($_SESSION['mo2f_current_user']);
117
  }
118
  }
 
119
 
120
  if(is_null($email) or empty($email) or $email == '' or !isset($email) )
121
+ {
122
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
123
+ if($email == '' or empty($email))
124
+ {
125
+ $email = get_user_meta($current_user->ID,'tempEmail',true);
126
+
127
+ }
128
+
129
+ }
130
+ if(is_null($email) or empty($email) or $email == '' or !isset($email) )
131
+ $email = $current_user->user_email;
132
+
133
+ delete_user_meta($current_user->ID,'tempEmail');
134
  $subject = '2-Factor Authentication';
135
  $headers = array('Content-Type: text/html; charset=UTF-8');
136
  $otpToken = '';
141
  update_user_meta($current_user->ID,$tokenName,$otpToken);
142
  update_user_meta($current_user->ID,$timeName,time());
143
  update_user_meta($current_user->ID,'tempRegEmail',$email);
 
144
  $message = '<table cellpadding="25" style="margin:0px auto">
145
  <tbody>
146
  <tr>
227
  {
228
  $arr = array('status' => 'SUCCESS','message'=>'Successfully validated.');
229
  delete_user_meta( $user_id, $dtoken );
230
+ if($dtoken == 'mo2f_email_check_code' or $dtoken == 'mo2f_otp_email_code')
231
  {
232
  $tempRegEmail = get_user_meta($user_id,'tempRegEmail',true);
233
  if($tempRegEmail != '' or !is_null($tempRegEmail) or !$tempRegEmail)
234
+ $Mo2fdbQueries->update_user_details($user_id,array(
235
+ 'mo2f_configured_2FA_method' => 'OTP Over Email',
236
+ 'mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS',
237
+ 'mo2f_user_email'=> $tempRegEmail));
238
  }
239
  delete_user_meta( $user_id,'tempRegEmail');
240
  }
243
  $arr = array('status' => 'FAILED','message'=>'TEST FAILED.');
244
  }
245
 
 
246
  $content = json_encode($arr);
247
  return $content;
248
 
api/class-customer-common-setup.php CHANGED
@@ -104,8 +104,8 @@ class Customer_Cloud_Setup {
104
 
105
  global $user;
106
  $user = wp_get_current_user();
107
- $is_nc_with_1_user = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' );
108
- $is_ec_with_1_user = ! get_option( 'mo2f_is_NC' );
109
 
110
 
111
  $customer_feature = "";
@@ -255,7 +255,7 @@ class Customer_Cloud_Setup {
255
  $field_string = json_encode( $fields );
256
 
257
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
258
- //{"txId":"8eb0f8d1-bb72-11ea-aad7-02c931e36dd8","authType":"KBA","responseType":"CHALLENGE","phoneDelivery":{"contact":null,"sendStatus":null,"sendTime":null},"emailDelivery":{"contact":null,"sendStatus":null,"sendTime":null},"status":"SUCCESS","message":"Please answer the following security questions.","questions":[{"question":"What is your first company name?"},{"question":"What was your childhood nickname?"}]}
259
  return $content;
260
  }
261
 
@@ -346,7 +346,7 @@ class Customer_Cloud_Setup {
346
  }
347
  $field_string = json_encode( $fields );
348
 
349
-
350
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
351
 
352
  return $content;
@@ -362,8 +362,8 @@ class Customer_Cloud_Setup {
362
  $url = MO_HOST_NAME . "/moas/rest/customer/contact-us";
363
  global $user;
364
  $user = wp_get_current_user();
365
- $is_nc_with_1_user = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' );
366
- $is_ec_with_1_user = ! get_option( 'mo2f_is_NC' );
367
 
368
  $mo2fApi= new Mo2f_Api();
369
  $customer_feature = "";
104
 
105
  global $user;
106
  $user = wp_get_current_user();
107
+ $is_nc_with_1_user = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option');
108
+ $is_ec_with_1_user = ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
109
 
110
 
111
  $customer_feature = "";
255
  $field_string = json_encode( $fields );
256
 
257
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
258
+
259
  return $content;
260
  }
261
 
346
  }
347
  $field_string = json_encode( $fields );
348
 
349
+
350
  $content = $mo2fApi->make_curl_call( $url, $field_string, $headers );
351
 
352
  return $content;
362
  $url = MO_HOST_NAME . "/moas/rest/customer/contact-us";
363
  global $user;
364
  $user = wp_get_current_user();
365
+ $is_nc_with_1_user = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option');
366
+ $is_ec_with_1_user = ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
367
 
368
  $mo2fApi= new Mo2f_Api();
369
  $customer_feature = "";
api/class-two-factor-setup.php CHANGED
@@ -159,7 +159,7 @@ class Two_Factor_Setup {
159
 
160
  $http_header_array = $mo2fApi->get_http_header_array();
161
 
162
- $response= $mo2fApi->make_curl_call( $url, $fields, $http_header_array );
163
  }
164
  return $response;
165
  }
159
 
160
  $http_header_array = $mo2fApi->get_http_header_array();
161
 
162
+ $response = $mo2fApi->make_curl_call( $url, $fields, $http_header_array );
163
  }
164
  return $response;
165
  }
api/mo2f_api.php CHANGED
@@ -1,71 +1,72 @@
1
- <?php
2
-
3
- class Mo2f_Api
4
- {
5
-
6
- public function mo2f_wp_remote_post($url, $args = array()){
7
- $response = wp_remote_post($url, $args);
8
- if(!is_wp_error($response)){
9
- return $response['body'];
10
- } else {
11
- $message = 'Please enable curl extension. <a href="admin.php?page=mo_2fa_troubleshooting">Click here</a> for the steps to enable curl.';
12
-
13
- return json_encode( array( "status" => 'ERROR', "message" => $message ) );
14
- }
15
- }
16
-
17
- function get_timestamp() {
18
-
19
- $currentTimeInMillis = round( microtime( true ) * 1000 );
20
- $currentTimeInMillis = number_format( $currentTimeInMillis, 0, '', '' );
21
-
22
- return $currentTimeInMillis ;
23
- }
24
-
25
- function make_curl_call( $url, $fields, $http_header_array =array("Content-Type"=>"application/json","charset"=>"UTF-8","Authorization"=>"Basic")) {
26
-
27
- if ( gettype( $fields ) !== 'string' ) {
28
- $fields = json_encode( $fields );
29
- }
30
-
31
- $args = array(
32
- 'method' => 'POST',
33
- 'body' => $fields,
34
- 'timeout' => '5',
35
- 'redirection' => '5',
36
- 'httpversion' => '1.0',
37
- 'blocking' => true,
38
- 'headers' => $http_header_array
39
- );
40
-
41
- // 'sslverify' => true,//MO_TEST_MODE ? false: true
42
- //wp_remote_retrieve_body
43
-
44
- $response = Mo2f_Api::mo2f_wp_remote_post($url, $args);
45
- return $response;
46
-
47
- }
48
-
49
- function get_http_header_array() {
50
-
51
- $customerKey = get_option( 'mo2f_customerKey' );
52
- $apiKey = get_option( 'mo2f_api_key' );
53
-
54
- /* Current time in milliseconds since midnight, January 1, 1970 UTC. */
55
- $currentTimeInMillis = Mo2f_Api::get_timestamp();
56
-
57
- /* Creating the Hash using SHA-512 algorithm */
58
- $stringToHash = $customerKey . $currentTimeInMillis . $apiKey;;
59
- $hashValue = hash( "sha512", $stringToHash );
60
-
61
- $headers = array(
62
- "Content-Type" => "application/json",
63
- "Customer-Key" => $customerKey,
64
- "Timestamp" => $currentTimeInMillis,
65
- "Authorization" => $hashValue
66
- );
67
-
68
- return $headers;
69
- }
70
-
 
71
  }
1
+ <?php
2
+
3
+ class Mo2f_Api
4
+ {
5
+
6
+ public function mo2f_wp_remote_post($url, $args = array()){
7
+ $response = wp_remote_post($url, $args);
8
+ if(!is_wp_error($response)){
9
+ return $response['body'];
10
+ } else {
11
+ $message = 'Please enable curl extension. <a href="admin.php?page=mo_2fa_troubleshooting">Click here</a> for the steps to enable curl.';
12
+
13
+ return json_encode( array( "status" => 'ERROR', "message" => $message ) );
14
+ }
15
+ }
16
+
17
+ function get_timestamp() {
18
+
19
+ $currentTimeInMillis = round( microtime( true ) * 1000 );
20
+ $currentTimeInMillis = number_format( $currentTimeInMillis, 0, '', '' );
21
+
22
+ return $currentTimeInMillis ;
23
+ }
24
+
25
+ function make_curl_call( $url, $fields, $http_header_array =array("Content-Type"=>"application/json","charset"=>"UTF-8","Authorization"=>"Basic")) {
26
+
27
+ if ( gettype( $fields ) !== 'string' ) {
28
+ $fields = json_encode( $fields );
29
+ }
30
+
31
+ $args = array(
32
+ 'method' => 'POST',
33
+ 'body' => $fields,
34
+ 'timeout' => '5',
35
+ 'redirection' => '5',
36
+ 'sslverify' =>true,
37
+ 'httpversion' => '1.0',
38
+ 'blocking' => true,
39
+ 'headers' => $http_header_array
40
+ );
41
+
42
+ // 'sslverify' => true,//MO_TEST_MODE ? false: true
43
+ //wp_remote_retrieve_body
44
+
45
+ $response = Mo2f_Api::mo2f_wp_remote_post($url, $args);
46
+ return $response;
47
+
48
+ }
49
+
50
+ function get_http_header_array() {
51
+
52
+ $customerKey = get_option( 'mo2f_customerKey' );
53
+ $apiKey = get_option( 'mo2f_api_key' );
54
+
55
+ /* Current time in milliseconds since midnight, January 1, 1970 UTC. */
56
+ $currentTimeInMillis = Mo2f_Api::get_timestamp();
57
+
58
+ /* Creating the Hash using SHA-512 algorithm */
59
+ $stringToHash = $customerKey . $currentTimeInMillis . $apiKey;;
60
+ $hashValue = hash( "sha512", $stringToHash );
61
+
62
+ $headers = array(
63
+ "Content-Type" => "application/json",
64
+ "Customer-Key" => $customerKey,
65
+ "Timestamp" => $currentTimeInMillis,
66
+ "Authorization" => $hashValue
67
+ );
68
+
69
+ return $headers;
70
+ }
71
+
72
  }
controllers/account.php CHANGED
@@ -48,7 +48,8 @@
48
  $key = get_option('mo2f_customerKey');
49
  $api = get_option('mo2f_api_key');
50
  $token = get_option('mo2f_customer_token');
51
- $EmailTransactions = get_site_option('cmVtYWluaW5nT1RQ')? get_site_option('cmVtYWluaW5nT1RQ') : 0;
 
52
  $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
53
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'profile.php';
54
  }
@@ -231,7 +232,7 @@
231
  $configured_2FA_method = 'NONE';
232
  }else if ( $mo2f_second_factor != 'NONE' ) {
233
  $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
234
- if ( get_option( 'mo2f_is_NC' ) == 0 ) {
235
  $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
236
  } else {
237
  if ( in_array( $configured_2FA_method, array(
@@ -245,7 +246,7 @@
245
  }
246
 
247
  $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
248
- if ( $configured_2FA_method != 'NONE' && get_option( 'mo2f_is_NC' ) == 0 ) {
249
  $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '. ';
250
  }
251
  $mo2f_message .= '<a href=\"admin.php?page=mo_2fa_two_fa\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
@@ -256,7 +257,7 @@
256
  if ( ! empty( $mo2f_customer_selected_plan ) ) {
257
  delete_option( 'mo2f_customer_selected_plan' );
258
 
259
- if (get_option('mo2f_planname') == 'addon_plan')
260
  {
261
  ?><script>window.location.href="admin.php?page=mo_2fa_addons";</script><?php
262
  }
48
  $key = get_option('mo2f_customerKey');
49
  $api = get_option('mo2f_api_key');
50
  $token = get_option('mo2f_customer_token');
51
+ $EmailTransactions = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
52
+ $EmailTransactions = $EmailTransactions? $EmailTransactions : 0;
53
  $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
54
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'profile.php';
55
  }
232
  $configured_2FA_method = 'NONE';
233
  }else if ( $mo2f_second_factor != 'NONE' ) {
234
  $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
235
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') == 0 ) {
236
  $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
237
  } else {
238
  if ( in_array( $configured_2FA_method, array(
246
  }
247
 
248
  $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
249
+ if ( $configured_2FA_method != 'NONE' && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') == 0 ) {
250
  $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '. ';
251
  }
252
  $mo2f_message .= '<a href=\"admin.php?page=mo_2fa_two_fa\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
257
  if ( ! empty( $mo2f_customer_selected_plan ) ) {
258
  delete_option( 'mo2f_customer_selected_plan' );
259
 
260
+ if (MoWpnsUtility::get_mo2f_db_option('mo2f_planname', 'get_option') == 'addon_plan')
261
  {
262
  ?><script>window.location.href="admin.php?page=mo_2fa_addons";</script><?php
263
  }
controllers/advanced-blocking.php CHANGED
@@ -1,186 +1,186 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
6
- {
7
- switch($_POST['option'])
8
- {
9
- case "mo_wpns_block_ip_range":
10
- wpns_handle_range_blocking($_POST); break;
11
- case "mo_wpns_browser_blocking":
12
- wpns_handle_browser_blocking($_POST); break;
13
- case "mo_wpns_enable_htaccess_blocking":
14
- wpns_handle_htaccess_blocking($_POST); break;
15
- case "mo_wpns_enable_user_agent_blocking":
16
- wpns_handle_user_agent_blocking($_POST); break;
17
- case "mo_wpns_block_countries":
18
- wpns_handle_country_block($_POST); break;
19
- case "mo_wpns_block_referrer":
20
- wpns_handle_block_referrer($_POST); break;
21
-
22
- }
23
- }
24
-
25
- $range_count = is_numeric(get_option('mo_wpns_iprange_count'))
26
- && intval(get_option('mo_wpns_iprange_count')) !=0 ? intval(get_option('mo_wpns_iprange_count')) : 1;
27
- $htaccess_block = get_option('mo_wpns_enable_htaccess_blocking') ? "checked" : "";
28
- $user_agent = get_option('mo_wpns_enable_user_agent_blocking') ? "checked" : "";
29
- $block_chrome = get_option('mo_wpns_block_chrome') ? "checked" : "";
30
- $block_ie = get_option('mo_wpns_block_ie') ? "checked" : "";
31
- $block_firefox = get_option('mo_wpns_block_firefox') ? "checked" : "";
32
- $block_safari = get_option('mo_wpns_block_safari') ? "checked" : "";
33
- $block_opera = get_option('mo_wpns_block_opera') ? "checked" : "";
34
- $block_edge = get_option('mo_wpns_block_edge') ? "checked" : "";
35
- $country = MoWpnsConstants::$country;
36
- $codes = get_option( "mo_wpns_countrycodes");
37
- $referrers = get_option( 'mo_wpns_referrers');
38
- $referrers = explode(";",$referrers);
39
- $current_browser= $moWpnsUtility->getCurrentBrowser();
40
- $start = array();
41
- $end = array();
42
- for($i = 1 ; $i <= $range_count ; $i++){
43
- $ip_range = get_option("mo_wpns_iprange_range_".$i);
44
- if($ip_range){
45
- $a = explode('-', $ip_range);
46
-
47
- $start[$i] = $a[0];
48
- $end[$i] = $a[1];
49
- }
50
-
51
- }
52
- if(!isset($start[1])){
53
- $start[1] = '';
54
- }
55
- if(!isset($end[1])){
56
- $end[1] = '';
57
- }
58
-
59
- switch($current_browser)
60
- {
61
- case "chrome":
62
- $block_chrome = 'disabled'; break;
63
- case "ie":
64
- $block_ie = 'disabled'; break;
65
- case "firefox":
66
- $block_firefox= 'disabled'; break;
67
- case "safari":
68
- $block_safari = 'disabled'; break;
69
- case "edge":
70
- $block_edge = 'disabled'; break;
71
- case "opera":
72
- $block_opera = 'disabled'; break;
73
- }
74
-
75
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'advanced-blocking.php';
76
-
77
-
78
- /* ADVANCD BLOCKING FUNCTIONS */
79
-
80
- //Function to save range of ips
81
- function wpns_handle_range_blocking($postedValue)
82
- {
83
- $flag=0;
84
- $max_allowed_ranges = 100;
85
- $added_mappings_ranges = 0 ;
86
- for($i=1;$i<=$max_allowed_ranges;$i++){
87
- if(isset($postedValue['start_'.$i]) && isset($postedValue['end_'.$i]) && !empty($postedValue['start_'.$i]) && !empty($postedValue['end_'.$i])){
88
-
89
- $postedValue['start_'.$i] = sanitize_text_field($postedValue['start_'.$i]);
90
- $postedValue['end_'.$i] = sanitize_text_field($postedValue['end_'.$i]);
91
-
92
- if(filter_var($postedValue['start_'.$i] , FILTER_VALIDATE_IP ) && filter_var($postedValue['end_'.$i] , FILTER_VALIDATE_IP ) && (ip2long($postedValue['end_'.$i]) > ip2long($postedValue['start_'.$i])) ){
93
- $range = '';
94
- $range = $postedValue['start_'.$i];
95
- $range .= '-';
96
- $range .= $postedValue['end_'.$i];
97
- $added_mappings_ranges++;
98
- update_option( 'mo_wpns_iprange_range_'.$added_mappings_ranges, $range );
99
-
100
- }
101
- else{
102
- $flag = 1;
103
- do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP'),'ERROR');
104
- return;
105
- }
106
- }
107
- }
108
-
109
-
110
- if($added_mappings_ranges==0)
111
- update_option( 'mo_wpns_iprange_range_1','');
112
- update_option( 'mo_wpns_iprange_count', $added_mappings_ranges);
113
- if($flag == 0){
114
- do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_PERMANENTLY_BLOCKED'),'SUCCESS');
115
- }
116
- }
117
-
118
- //Function to handle browser blocking
119
- function wpns_handle_browser_blocking($postedValue)
120
- {
121
- isset($postedValue['mo_wpns_block_chrome']) ? update_option( 'mo_wpns_block_chrome' , $postedValue['mo_wpns_block_chrome'] ) : update_option( 'mo_wpns_block_chrome' , false );
122
- isset($postedValue['mo_wpns_block_firefox']) ? update_option( 'mo_wpns_block_firefox' , $postedValue['mo_wpns_block_firefox'] ) : update_option( 'mo_wpns_block_firefox' , false );
123
- isset($postedValue['mo_wpns_block_ie']) ? update_option( 'mo_wpns_block_ie' , $postedValue['mo_wpns_block_ie'] ) : update_option( 'mo_wpns_block_ie' , false );
124
- isset($postedValue['mo_wpns_block_safari']) ? update_option( 'mo_wpns_block_safari' , $postedValue['mo_wpns_block_safari'] ) : update_option( 'mo_wpns_block_safari' , false );
125
- isset($postedValue['mo_wpns_block_opera']) ? update_option( 'mo_wpns_block_opera' , $postedValue['mo_wpns_block_opera'] ) : update_option( 'mo_wpns_block_opera' , false );
126
- isset($postedValue['mo_wpns_block_edge']) ? update_option( 'mo_wpns_block_edge' , $postedValue['mo_wpns_block_edge'] ) : update_option( 'mo_wpns_block_edge' , false );
127
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
128
- }
129
-
130
-
131
- //Function to handle Htaccess blocking
132
- function wpns_handle_htaccess_blocking($postdata)
133
- {
134
- $htaccess = isset($postdata['mo_wpns_enable_htaccess_blocking']) ? true : false;
135
- update_option( 'mo_wpns_enable_htaccess_blocking', $htaccess);
136
- $mo_wpns_config = new MoWpnsHandler();
137
- if($htaccess)
138
- {
139
- $mo_wpns_config->add_htaccess_ips();
140
- do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_ENABLED'),'SUCCESS');
141
- }
142
- else
143
- {
144
- $mo_wpns_config->remove_htaccess_ips();
145
- do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_DISABLED'),'ERROR');
146
- }
147
- }
148
-
149
-
150
- //Function to handle user agent blocking
151
- function wpns_handle_user_agent_blocking($postvalue)
152
- {
153
- $user_agent = isset($postvalue['mo_wpns_enable_user_agent_blocking']) ? true : false;
154
- update_option( 'mo_wpns_enable_user_agent_blocking', $user_agent);
155
- if($user_agent)
156
- do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_ENABLED'),'SUCCESS');
157
- else
158
- do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_DISABLED'),'ERROR');
159
- }
160
-
161
-
162
- //Function to handle country block
163
- function wpns_handle_country_block($post)
164
- {
165
- $countrycodes = "";
166
- foreach($post as $countrycode=>$value){
167
- if($countrycode!="option")
168
- $countrycodes .= $countrycode.";";
169
- }
170
- update_option( 'mo_wpns_countrycodes', $countrycodes);
171
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
172
- }
173
-
174
-
175
- //Function to handle block referrer
176
- function wpns_handle_block_referrer($post)
177
- {
178
- $referrers = "";
179
- foreach($post as $key => $value)
180
- {
181
- if(strpos($key, 'referrer_') !== false)
182
- if(!empty($value))
183
- $referrers .= $value.";";
184
- }
185
- update_option( 'mo_wpns_referrers', $referrers);
186
- }
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
6
+ {
7
+ switch($_POST['option'])
8
+ {
9
+ case "mo_wpns_block_ip_range":
10
+ wpns_handle_range_blocking($_POST); break;
11
+ case "mo_wpns_browser_blocking":
12
+ wpns_handle_browser_blocking($_POST); break;
13
+ case "mo_wpns_enable_htaccess_blocking":
14
+ wpns_handle_htaccess_blocking($_POST); break;
15
+ case "mo_wpns_enable_user_agent_blocking":
16
+ wpns_handle_user_agent_blocking($_POST); break;
17
+ case "mo_wpns_block_countries":
18
+ wpns_handle_country_block($_POST); break;
19
+ case "mo_wpns_block_referrer":
20
+ wpns_handle_block_referrer($_POST); break;
21
+
22
+ }
23
+ }
24
+
25
+ $range_count = is_numeric(get_option('mo_wpns_iprange_count'))
26
+ && intval(get_option('mo_wpns_iprange_count')) !=0 ? intval(get_option('mo_wpns_iprange_count')) : 1;
27
+ $htaccess_block = get_option('mo_wpns_enable_htaccess_blocking') ? "checked" : "";
28
+ $user_agent = get_option('mo_wpns_enable_user_agent_blocking') ? "checked" : "";
29
+ $block_chrome = get_option('mo_wpns_block_chrome') ? "checked" : "";
30
+ $block_ie = get_option('mo_wpns_block_ie') ? "checked" : "";
31
+ $block_firefox = get_option('mo_wpns_block_firefox') ? "checked" : "";
32
+ $block_safari = get_option('mo_wpns_block_safari') ? "checked" : "";
33
+ $block_opera = get_option('mo_wpns_block_opera') ? "checked" : "";
34
+ $block_edge = get_option('mo_wpns_block_edge') ? "checked" : "";
35
+ $country = MoWpnsConstants::$country;
36
+ $codes = get_option( "mo_wpns_countrycodes");
37
+ $referrers = get_option( 'mo_wpns_referrers');
38
+ $referrers = explode(";",$referrers);
39
+ $current_browser= $moWpnsUtility->getCurrentBrowser();
40
+ $start = array();
41
+ $end = array();
42
+ for($i = 1 ; $i <= $range_count ; $i++){
43
+ $ip_range = get_option("mo_wpns_iprange_range_".$i);
44
+ if($ip_range){
45
+ $a = explode('-', $ip_range);
46
+
47
+ $start[$i] = $a[0];
48
+ $end[$i] = $a[1];
49
+ }
50
+
51
+ }
52
+ if(!isset($start[1])){
53
+ $start[1] = '';
54
+ }
55
+ if(!isset($end[1])){
56
+ $end[1] = '';
57
+ }
58
+
59
+ switch($current_browser)
60
+ {
61
+ case "chrome":
62
+ $block_chrome = 'disabled'; break;
63
+ case "ie":
64
+ $block_ie = 'disabled'; break;
65
+ case "firefox":
66
+ $block_firefox= 'disabled'; break;
67
+ case "safari":
68
+ $block_safari = 'disabled'; break;
69
+ case "edge":
70
+ $block_edge = 'disabled'; break;
71
+ case "opera":
72
+ $block_opera = 'disabled'; break;
73
+ }
74
+
75
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'advanced-blocking.php';
76
+
77
+
78
+ /* ADVANCD BLOCKING FUNCTIONS */
79
+
80
+ //Function to save range of ips
81
+ function wpns_handle_range_blocking($postedValue)
82
+ {
83
+ $flag=0;
84
+ $max_allowed_ranges = 100;
85
+ $added_mappings_ranges = 0 ;
86
+ for($i=1;$i<=$max_allowed_ranges;$i++){
87
+ if(isset($postedValue['start_'.$i]) && isset($postedValue['end_'.$i]) && !empty($postedValue['start_'.$i]) && !empty($postedValue['end_'.$i])){
88
+
89
+ $postedValue['start_'.$i] = sanitize_text_field($postedValue['start_'.$i]);
90
+ $postedValue['end_'.$i] = sanitize_text_field($postedValue['end_'.$i]);
91
+
92
+ if(filter_var($postedValue['start_'.$i] , FILTER_VALIDATE_IP ) && filter_var($postedValue['end_'.$i] , FILTER_VALIDATE_IP ) && (ip2long($postedValue['end_'.$i]) > ip2long($postedValue['start_'.$i])) ){
93
+ $range = '';
94
+ $range = $postedValue['start_'.$i];
95
+ $range .= '-';
96
+ $range .= $postedValue['end_'.$i];
97
+ $added_mappings_ranges++;
98
+ update_option( 'mo_wpns_iprange_range_'.$added_mappings_ranges, $range );
99
+
100
+ }
101
+ else{
102
+ $flag = 1;
103
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP'),'ERROR');
104
+ return;
105
+ }
106
+ }
107
+ }
108
+
109
+
110
+ if($added_mappings_ranges==0)
111
+ update_option( 'mo_wpns_iprange_range_1','');
112
+ update_option( 'mo_wpns_iprange_count', $added_mappings_ranges);
113
+ if($flag == 0){
114
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_PERMANENTLY_BLOCKED'),'SUCCESS');
115
+ }
116
+ }
117
+
118
+ //Function to handle browser blocking
119
+ function wpns_handle_browser_blocking($postedValue)
120
+ {
121
+ isset($postedValue['mo_wpns_block_chrome']) ? update_option( 'mo_wpns_block_chrome' , $postedValue['mo_wpns_block_chrome'] ) : update_option( 'mo_wpns_block_chrome' , false );
122
+ isset($postedValue['mo_wpns_block_firefox']) ? update_option( 'mo_wpns_block_firefox' , $postedValue['mo_wpns_block_firefox'] ) : update_option( 'mo_wpns_block_firefox' , false );
123
+ isset($postedValue['mo_wpns_block_ie']) ? update_option( 'mo_wpns_block_ie' , $postedValue['mo_wpns_block_ie'] ) : update_option( 'mo_wpns_block_ie' , false );
124
+ isset($postedValue['mo_wpns_block_safari']) ? update_option( 'mo_wpns_block_safari' , $postedValue['mo_wpns_block_safari'] ) : update_option( 'mo_wpns_block_safari' , false );
125
+ isset($postedValue['mo_wpns_block_opera']) ? update_option( 'mo_wpns_block_opera' , $postedValue['mo_wpns_block_opera'] ) : update_option( 'mo_wpns_block_opera' , false );
126
+ isset($postedValue['mo_wpns_block_edge']) ? update_option( 'mo_wpns_block_edge' , $postedValue['mo_wpns_block_edge'] ) : update_option( 'mo_wpns_block_edge' , false );
127
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
128
+ }
129
+
130
+
131
+ //Function to handle Htaccess blocking
132
+ function wpns_handle_htaccess_blocking($postdata)
133
+ {
134
+ $htaccess = isset($postdata['mo_wpns_enable_htaccess_blocking']) ? true : false;
135
+ update_option( 'mo_wpns_enable_htaccess_blocking', $htaccess);
136
+ $mo_wpns_config = new MoWpnsHandler();
137
+ if($htaccess)
138
+ {
139
+ $mo_wpns_config->add_htaccess_ips();
140
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_ENABLED'),'SUCCESS');
141
+ }
142
+ else
143
+ {
144
+ $mo_wpns_config->remove_htaccess_ips();
145
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_DISABLED'),'ERROR');
146
+ }
147
+ }
148
+
149
+
150
+ //Function to handle user agent blocking
151
+ function wpns_handle_user_agent_blocking($postvalue)
152
+ {
153
+ $user_agent = isset($postvalue['mo_wpns_enable_user_agent_blocking']) ? true : false;
154
+ update_option( 'mo_wpns_enable_user_agent_blocking', $user_agent);
155
+ if($user_agent)
156
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_ENABLED'),'SUCCESS');
157
+ else
158
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_DISABLED'),'ERROR');
159
+ }
160
+
161
+
162
+ //Function to handle country block
163
+ function wpns_handle_country_block($post)
164
+ {
165
+ $countrycodes = "";
166
+ foreach($post as $countrycode=>$value){
167
+ if($countrycode!="option")
168
+ $countrycodes .= $countrycode.";";
169
+ }
170
+ update_option( 'mo_wpns_countrycodes', $countrycodes);
171
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
172
+ }
173
+
174
+
175
+ //Function to handle block referrer
176
+ function wpns_handle_block_referrer($post)
177
+ {
178
+ $referrers = "";
179
+ foreach($post as $key => $value)
180
+ {
181
+ if(strpos($key, 'referrer_') !== false)
182
+ if(!empty($value))
183
+ $referrers .= $value.";";
184
+ }
185
+ update_option( 'mo_wpns_referrers', $referrers);
186
+ }
controllers/backup/backup_ajax.php CHANGED
@@ -103,7 +103,7 @@ function mo_wpns_save_schedule_backup_config_form($postData){
103
  else
104
  $handler_obj-> file_backup_deactivate();
105
 
106
- if(get_site_option('mo_schedule_database_backup') === '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' );
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' );
controllers/backup/backup_created_report.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_created_report.php';
1
+ <?php
2
  include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup_created_report.php';
controllers/backup/backup_schdule.php CHANGED
@@ -1,22 +1,22 @@
1
- <?php
2
-
3
- $file_backup_time =get_site_option('file_backup_created_time');
4
- $db_eb_backup_time = get_site_option('db_backup_created_time');
5
- $file_schedule_status = get_site_option('scheduled_file_backup');
6
- $db_backup_status = get_site_option('scheduled_db_backup');
7
- $next_file_backup_hours = get_site_option('mo_wpns_backup_time');
8
- $next_db_backup_hours = get_site_option('mo_wpns_backup_time');
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';
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/content-protection.php CHANGED
@@ -1,94 +1,94 @@
1
- <?php
2
- global $moWpnsUtility,$mo2f_dirName;
3
-
4
- if(current_user_can( 'manage_options' ) && isset($_POST['option']))
5
- {
6
- switch($_POST['option'])
7
- {
8
- case "mo_wpns_content_protection":
9
- wpns_handle_content_protection($_POST); break;
10
- case "mo_wpns_enable_comment_spam_blocking":
11
- wpns_handle_comment_spam_blocking($_POST); break;
12
- case "mo_wpns_enable_comment_recaptcha":
13
- wpns_handle_comment_recaptcha($_POST); break;
14
- case "mo_wpns_comment_recaptcha_settings":
15
- wpns_save_comment_recaptcha($_POST); break;
16
- }
17
- }
18
-
19
-
20
- $protect_wp_config = get_option('mo2f_protect_wp_config') ? "checked" : "";
21
- $protect_wp_uploads = get_option('mo2f_prevent_directory_browsing') ? "checked" : "";
22
- $disable_file_editing = get_option('mo2f_disable_file_editing') ? "checked" : "";
23
- $comment_spam_protect = get_option('mo_wpns_enable_comment_spam_blocking') ? "checked" : "";
24
- $enable_recaptcha = get_option('mo_wpns_enable_comment_recaptcha') ? "checked" : "";
25
- $htaccess_file = get_option('mo2f_htaccess_file') ? "checked" : "";
26
- $restAPI = get_site_option('mo2f_restrict_restAPI') ? "checked" : "";
27
- $test_recaptcha_url = "";
28
- $wp_config = site_url().'/wp-config.php';
29
- $wp_uploads = get_site_url().'/wp-content/uploads';
30
- $plugin_editor = get_site_url().'/wp-admin/plugin-editor.php';
31
- $restAPI_link = rest_url().'wp'.DIRECTORY_SEPARATOR.'v2'.DIRECTORY_SEPARATOR.'users';
32
- $restApiPlugin = 'https:'.DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR.'www.wordpress.org'.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR.'wp-rest-api-authentication';
33
- if($enable_recaptcha)
34
- {
35
- $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
36
- $captcha_site_key = get_option('mo_wpns_recaptcha_site_key' );
37
- $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');
38
- }
39
-
40
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'content-protection.php';
41
-
42
- /* CONTENT PROTECTION FUNCTIONS */
43
-
44
- //Function to save content protection settings
45
- function wpns_handle_content_protection()
46
- {
47
- isset($_POST['protect_wp_config']) ? update_option('mo2f_protect_wp_config' , $_POST['protect_wp_config']) : update_option('mo2f_protect_wp_config' ,0);
48
- isset($_POST['prevent_directory_browsing']) ? update_option('mo2f_prevent_directory_browsing', $_POST['prevent_directory_browsing']): update_option('mo2f_prevent_directory_browsing',0);
49
- isset($_POST['disable_file_editing']) ? update_option('mo2f_disable_file_editing' , $_POST['disable_file_editing']) : update_option('mo2f_disable_file_editing' ,0);
50
- isset($_POST['mo2f_htaccess_file']) ? update_option('mo2f_htaccess_file' , $_POST['mo2f_htaccess_file']) : update_option('mo2f_htaccess_file',0);
51
- if(isset($_POST['restrictAPI'])){
52
- update_site_option('mo2f_restrict_restAPI', 1);
53
- }
54
- else{
55
- update_site_option('mo2f_restrict_restAPI',0);
56
- }
57
-
58
-
59
-
60
-
61
- $mo_wpns_htaccess_handler = new MoWpnsHandler();
62
- $mo_wpns_htaccess_handler->update_htaccess_configuration();
63
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_PROTECTION_ENABLED'),'SUCCESS');
64
- }
65
-
66
-
67
- //Function to handle comment spam blocking
68
- function wpns_handle_comment_spam_blocking($postvalue)
69
- {
70
- $enable = isset($postvalue['mo_wpns_enable_comment_spam_blocking']) ? true : false;
71
- update_option('mo_wpns_enable_comment_spam_blocking', $enable);
72
- if($enable)
73
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING'),'SUCCESS');
74
- else
75
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING_DISABLED'),'ERROR');
76
- }
77
-
78
-
79
- //Function to handle reCAPTCHA for comments
80
- function wpns_handle_comment_recaptcha($postvalue)
81
- {
82
- $enable = isset($postvalue['mo_wpns_enable_comment_recaptcha']) ? true : false;
83
- update_option('mo_wpns_enable_comment_recaptcha', $enable);
84
- if($enable)
85
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA'),'SUCCESS');
86
- else
87
- do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA_DISABLED'),'ERROR');
88
- }
89
-
90
- function wpns_save_comment_recaptcha($postvalue){
91
- update_option('mo_wpns_recaptcha_site_key', $postvalue['mo_wpns_recaptcha_site_key']);
92
- update_option('mo_wpns_recaptcha_secret_key', $postvalue['mo_wpns_recaptcha_secret_key']);
93
- do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
94
  }
1
+ <?php
2
+ global $moWpnsUtility,$mo2f_dirName;
3
+
4
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
5
+ {
6
+ switch($_POST['option'])
7
+ {
8
+ case "mo_wpns_content_protection":
9
+ wpns_handle_content_protection($_POST); break;
10
+ case "mo_wpns_enable_comment_spam_blocking":
11
+ wpns_handle_comment_spam_blocking($_POST); break;
12
+ case "mo_wpns_enable_comment_recaptcha":
13
+ wpns_handle_comment_recaptcha($_POST); break;
14
+ case "mo_wpns_comment_recaptcha_settings":
15
+ wpns_save_comment_recaptcha($_POST); break;
16
+ }
17
+ }
18
+
19
+
20
+ $protect_wp_config = get_option('mo2f_protect_wp_config') ? "checked" : "";
21
+ $protect_wp_uploads = get_option('mo2f_prevent_directory_browsing') ? "checked" : "";
22
+ $disable_file_editing = get_option('mo2f_disable_file_editing') ? "checked" : "";
23
+ $comment_spam_protect = get_option('mo_wpns_enable_comment_spam_blocking') ? "checked" : "";
24
+ $enable_recaptcha = get_option('mo_wpns_enable_comment_recaptcha') ? "checked" : "";
25
+ $htaccess_file = get_option('mo2f_htaccess_file') ? "checked" : "";
26
+ $restAPI = get_site_option('mo2f_restrict_restAPI') ? "checked" : "";
27
+ $test_recaptcha_url = "";
28
+ $wp_config = site_url().'/wp-config.php';
29
+ $wp_uploads = get_site_url().'/wp-content/uploads';
30
+ $plugin_editor = get_site_url().'/wp-admin/plugin-editor.php';
31
+ $restAPI_link = rest_url().'wp'.DIRECTORY_SEPARATOR.'v2'.DIRECTORY_SEPARATOR.'users';
32
+ $restApiPlugin = 'https:'.DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR.'www.wordpress.org'.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR.'wp-rest-api-authentication';
33
+ if($enable_recaptcha)
34
+ {
35
+ $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
36
+ $captcha_site_key = get_option('mo_wpns_recaptcha_site_key' );
37
+ $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');
38
+ }
39
+
40
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'content-protection.php';
41
+
42
+ /* CONTENT PROTECTION FUNCTIONS */
43
+
44
+ //Function to save content protection settings
45
+ function wpns_handle_content_protection()
46
+ {
47
+ isset($_POST['protect_wp_config']) ? update_option('mo2f_protect_wp_config' , $_POST['protect_wp_config']) : update_option('mo2f_protect_wp_config' ,0);
48
+ isset($_POST['prevent_directory_browsing']) ? update_option('mo2f_prevent_directory_browsing', $_POST['prevent_directory_browsing']): update_option('mo2f_prevent_directory_browsing',0);
49
+ isset($_POST['disable_file_editing']) ? update_option('mo2f_disable_file_editing' , $_POST['disable_file_editing']) : update_option('mo2f_disable_file_editing' ,0);
50
+ isset($_POST['mo2f_htaccess_file']) ? update_option('mo2f_htaccess_file' , $_POST['mo2f_htaccess_file']) : update_option('mo2f_htaccess_file',0);
51
+ if(isset($_POST['restrictAPI'])){
52
+ update_site_option('mo2f_restrict_restAPI', 1);
53
+ }
54
+ else{
55
+ update_site_option('mo2f_restrict_restAPI',0);
56
+ }
57
+
58
+
59
+
60
+
61
+ $mo_wpns_htaccess_handler = new MoWpnsHandler();
62
+ $mo_wpns_htaccess_handler->update_htaccess_configuration();
63
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_PROTECTION_ENABLED'),'SUCCESS');
64
+ }
65
+
66
+
67
+ //Function to handle comment spam blocking
68
+ function wpns_handle_comment_spam_blocking($postvalue)
69
+ {
70
+ $enable = isset($postvalue['mo_wpns_enable_comment_spam_blocking']) ? true : false;
71
+ update_option('mo_wpns_enable_comment_spam_blocking', $enable);
72
+ if($enable)
73
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING'),'SUCCESS');
74
+ else
75
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING_DISABLED'),'ERROR');
76
+ }
77
+
78
+
79
+ //Function to handle reCAPTCHA for comments
80
+ function wpns_handle_comment_recaptcha($postvalue)
81
+ {
82
+ $enable = isset($postvalue['mo_wpns_enable_comment_recaptcha']) ? true : false;
83
+ update_option('mo_wpns_enable_comment_recaptcha', $enable);
84
+ if($enable)
85
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA'),'SUCCESS');
86
+ else
87
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA_DISABLED'),'ERROR');
88
+ }
89
+
90
+ function wpns_save_comment_recaptcha($postvalue){
91
+ update_option('mo_wpns_recaptcha_site_key', $postvalue['mo_wpns_recaptcha_site_key']);
92
+ update_option('mo_wpns_recaptcha_secret_key', $postvalue['mo_wpns_recaptcha_secret_key']);
93
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
94
  }
controllers/dashboard_ajax.php CHANGED
@@ -1,211 +1,211 @@
1
- <?php
2
- class Mo2f_ajax_dashboard
3
- {
4
- function __construct(){
5
- add_action( 'admin_init' , array( $this, 'mo2f_switch_functions' ) );
6
- }
7
-
8
- public function mo2f_switch_functions(){
9
- if(isset($_POST) && isset($_POST['option'])){
10
- $tab_count= get_site_option('mo2f_tab_count', 0);
11
- if($tab_count == 5)
12
- update_site_option('mo_2f_switch_all', 1);
13
- else if($tab_count == 0)
14
- update_site_option('mo_2f_switch_all', 0);
15
- $santizied_post=isset($_POST['switch_val'])? sanitize_text_field($_POST['switch_val']):null;
16
- switch($_POST['option'])
17
- {
18
- case "tab_all_switch":
19
- $this->mo2f_handle_all_enable($santizied_post);
20
- break;
21
- case "tab_2fa_switch":
22
- $this->mo2f_handle_2fa_enable($santizied_post);
23
- break;
24
- case "tab_waf_switch":
25
- $this->mo2f_handle_waf_enable($santizied_post);
26
- break;
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;
36
- case "tab_block_switch":
37
- $this->mo2f_handle_block_enable($santizied_post);
38
- break;
39
-
40
- }
41
- }
42
- }
43
-
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){
51
- update_option('mo_2f_switch_all',1);
52
- update_site_option('mo2f_tab_count', 5);
53
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ALL_ENABLED'),'SUCCESS');
54
- }
55
- else{
56
- update_option('mo_2f_switch_all', 0);
57
- update_site_option('mo2f_tab_count', 0);
58
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ALL_DISABLED'),'ERROR');
59
- }
60
- }
61
-
62
- public function mo2f_handle_2fa_enable($POSTED){
63
- global $Mo2fdbQueries;
64
- $user= wp_get_current_user();
65
- $user_id= $user->user_ID;
66
- if($POSTED){
67
- $Mo2fdbQueries->update_user_deails($user_id, array('mo_2factor_user_registration_status', 'MO_2_FACTOR_PLUGIN_SETTINGS'));
68
- if($_POST['tab_2fa_switch'])
69
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FACTOR_ENABLE'),'SUCCESS');
70
- }
71
- else{
72
- $Mo2fdbQueries->update_user_deails($user_id, array('mo_2factor_user_registration_status', 0));
73
- if($_POST['tab_2fa_switch'])
74
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FACTOR_DISABLE'),'ERROR');
75
- }
76
- }
77
-
78
- public function mo2f_handle_waf_enable($POSTED){
79
- if($POSTED){
80
- update_site_option('mo_2f_switch_waf', 1);
81
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
82
- if (isset($_POST['option'] ))
83
- {
84
- if($_POST['option'] == 'tab_waf_switch')
85
- {
86
- do_action('wpns_show_message',MoWpnsMessages::showMessage('WAF_ENABLE'),'SUCCESS');
87
- }
88
- }
89
- }
90
- else{
91
- update_site_option('mo_2f_switch_waf', 0);
92
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
93
- update_site_option('WAFEnabled', 0);
94
- update_site_option('WAF','wafDisable');
95
- update_site_option('Rate_limiting', 0);
96
- $dir_name = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
97
- $dir_name1 = $dir_name.DIRECTORY_SEPARATOR.'.htaccess';
98
- $filePath = $dir_name.DIRECTORY_SEPARATOR.'mo-check.php';
99
- $filePath = str_replace('\\', '/', $filePath);
100
- $file = file_get_contents($dir_name1);
101
- $cont = PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
102
- $cont .= 'php_value auto_prepend_file '.$filePath.PHP_EOL;
103
- $cont .= '# END miniOrange WAF'.PHP_EOL;
104
- $file =str_replace($cont,'',$file);
105
- file_put_contents($dir_name1, $file);
106
- if($_POST['option'] == 'tab_waf_switch')
107
- do_action('wpns_show_message',MoWpnsMessages::showMessage('WAF_DISABLE'),'ERROR');
108
- }
109
- }
110
-
111
- public function mo2f_handle_login_enable($POSTED){
112
- if($POSTED){
113
- update_site_option('mo_2f_switch_loginspam', 1);
114
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
115
- if (isset($_POST['option'] ))
116
- {
117
- if($_POST['option'] == 'tab_login_switch')
118
- do_action('wpns_show_message',MoWpnsMessages::showMessage('LOGIN_ENABLE'),'SUCCESS');
119
- }
120
- }
121
- else{
122
- update_site_option('mo_2f_switch_loginspam', 0);
123
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
124
- update_site_option('mo2f_enable_brute_force', false);
125
- update_site_option('mo_wpns_activate_recaptcha', false);
126
- update_site_option('mo_wpns_activate_recaptcha_for_login', false);
127
- update_site_option('mo_wpns_activate_recaptcha_for_woocommerce_login', false);
128
- update_site_option('mo_wpns_activate_recaptcha_for_registration', false);
129
- update_site_option('mo_wpns_activate_recaptcha_for_woocommerce_registration', false);
130
- update_site_option('mo2f_enforce_strong_passswords', 0);
131
- update_site_option('mo_wpns_enable_fake_domain_blocking', false);
132
- update_site_option('mo_wpns_enable_advanced_user_verification', false);
133
- update_site_option('mo_wpns_enable_social_integration', false);
134
- update_site_option('mo2f_protect_wp_config', 0);
135
- update_site_option('mo2f_prevent_directory_browsing', 0);
136
- update_site_option('mo2f_disable_file_editing', 0);
137
- update_site_option('mo_wpns_enable_comment_spam_blocking', false);
138
- update_site_option('mo_wpns_enable_comment_recaptcha', false);
139
- update_site_option('mo2f_htaccess_file', 0);
140
- if($_POST['option'] == 'tab_login_switch')
141
- do_action('wpns_show_message',MoWpnsMessages::showMessage('LOGIN_DISABLE'),'ERROR');
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($_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($_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);
171
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
172
- if (isset($_POST['option'] ))
173
- {
174
- if($_POST['option'] == 'tab_malware_switch')
175
- do_action('wpns_show_message',MoWpnsMessages::showMessage('MALWARE_ENABLE'),'SUCCESS');
176
- }
177
- }else{
178
- update_site_option('mo_2f_switch_malware', 0);
179
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
180
- if($_POST['option'] == 'tab_malware_switch')
181
- do_action('wpns_show_message',MoWpnsMessages::showMessage('MALWARE_DISABLE'),'ERROR');
182
- }
183
- }
184
-
185
- public function mo2f_handle_block_enable($POSTED){
186
- if($POSTED){
187
- update_site_option('mo_2f_switch_adv_block', 1);
188
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
189
- if (isset($_POST['option'] ))
190
- {
191
- if($_POST['option'] == 'tab_block_switch')
192
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ADV_BLOCK_ENABLE'),'SUCCESS');
193
- }
194
- }
195
- else{
196
- update_site_option('mo_2f_switch_adv_block', 0);
197
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
198
- update_site_option('mo_wpns_iprange_count', 0);
199
- update_site_option('mo_wpns_enable_htaccess_blocking', 0);
200
- update_site_option('mo_wpns_enable_user_agent_blocking', 0);
201
- update_site_option('mo_wpns_referrers', false);
202
- update_site_option('mo_wpns_countrycodes', false);
203
- if($_POST['option'] == 'tab_block_switch')
204
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ADV_BLOCK_DISABLE'),'ERROR');
205
- }
206
- }
207
-
208
-
209
- }
210
- new Mo2f_ajax_dashboard();
211
  ?>
1
+ <?php
2
+ class Mo2f_ajax_dashboard
3
+ {
4
+ function __construct(){
5
+ add_action( 'admin_init' , array( $this, 'mo2f_switch_functions' ) );
6
+ }
7
+
8
+ public function mo2f_switch_functions(){
9
+ if(isset($_POST) && isset($_POST['option'])){
10
+ $tab_count= get_site_option('mo2f_tab_count', 0);
11
+ if($tab_count == 5)
12
+ update_site_option('mo_2f_switch_all', 1);
13
+ else if($tab_count == 0)
14
+ update_site_option('mo_2f_switch_all', 0);
15
+ $santizied_post=isset($_POST['switch_val'])? sanitize_text_field($_POST['switch_val']):null;
16
+ switch($_POST['option'])
17
+ {
18
+ case "tab_all_switch":
19
+ $this->mo2f_handle_all_enable($santizied_post);
20
+ break;
21
+ case "tab_2fa_switch":
22
+ $this->mo2f_handle_2fa_enable($santizied_post);
23
+ break;
24
+ case "tab_waf_switch":
25
+ $this->mo2f_handle_waf_enable($santizied_post);
26
+ break;
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;
36
+ case "tab_block_switch":
37
+ $this->mo2f_handle_block_enable($santizied_post);
38
+ break;
39
+
40
+ }
41
+ }
42
+ }
43
+
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){
51
+ update_option('mo_2f_switch_all',1);
52
+ update_site_option('mo2f_tab_count', 5);
53
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ALL_ENABLED'),'SUCCESS');
54
+ }
55
+ else{
56
+ update_option('mo_2f_switch_all', 0);
57
+ update_site_option('mo2f_tab_count', 0);
58
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ALL_DISABLED'),'ERROR');
59
+ }
60
+ }
61
+
62
+ public function mo2f_handle_2fa_enable($POSTED){
63
+ global $Mo2fdbQueries;
64
+ $user= wp_get_current_user();
65
+ $user_id= $user->user_ID;
66
+ if($POSTED){
67
+ $Mo2fdbQueries->update_user_deails($user_id, array('mo_2factor_user_registration_status', 'MO_2_FACTOR_PLUGIN_SETTINGS'));
68
+ if($_POST['tab_2fa_switch'])
69
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FACTOR_ENABLE'),'SUCCESS');
70
+ }
71
+ else{
72
+ $Mo2fdbQueries->update_user_deails($user_id, array('mo_2factor_user_registration_status', 0));
73
+ if($_POST['tab_2fa_switch'])
74
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FACTOR_DISABLE'),'ERROR');
75
+ }
76
+ }
77
+
78
+ public function mo2f_handle_waf_enable($POSTED){
79
+ if($POSTED){
80
+ update_site_option('mo_2f_switch_waf', 1);
81
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
82
+ if (isset($_POST['option'] ))
83
+ {
84
+ if($_POST['option'] == 'tab_waf_switch')
85
+ {
86
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('WAF_ENABLE'),'SUCCESS');
87
+ }
88
+ }
89
+ }
90
+ else{
91
+ update_site_option('mo_2f_switch_waf', 0);
92
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
93
+ update_site_option('WAFEnabled', 0);
94
+ update_site_option('WAF','wafDisable');
95
+ update_site_option('Rate_limiting', 0);
96
+ $dir_name = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
97
+ $dir_name1 = $dir_name.DIRECTORY_SEPARATOR.'.htaccess';
98
+ $filePath = $dir_name.DIRECTORY_SEPARATOR.'mo-check.php';
99
+ $filePath = str_replace('\\', '/', $filePath);
100
+ $file = file_get_contents($dir_name1);
101
+ $cont = PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
102
+ $cont .= 'php_value auto_prepend_file '.$filePath.PHP_EOL;
103
+ $cont .= '# END miniOrange WAF'.PHP_EOL;
104
+ $file =str_replace($cont,'',$file);
105
+ file_put_contents($dir_name1, $file);
106
+ if($_POST['option'] == 'tab_waf_switch')
107
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('WAF_DISABLE'),'ERROR');
108
+ }
109
+ }
110
+
111
+ public function mo2f_handle_login_enable($POSTED){
112
+ if($POSTED){
113
+ update_site_option('mo_2f_switch_loginspam', 1);
114
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
115
+ if (isset($_POST['option'] ))
116
+ {
117
+ if($_POST['option'] == 'tab_login_switch')
118
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('LOGIN_ENABLE'),'SUCCESS');
119
+ }
120
+ }
121
+ else{
122
+ update_site_option('mo_2f_switch_loginspam', 0);
123
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
124
+ update_site_option('mo2f_enable_brute_force', false);
125
+ update_site_option('mo_wpns_activate_recaptcha', false);
126
+ update_site_option('mo_wpns_activate_recaptcha_for_login', false);
127
+ update_site_option('mo_wpns_activate_recaptcha_for_woocommerce_login', false);
128
+ update_site_option('mo_wpns_activate_recaptcha_for_registration', false);
129
+ update_site_option('mo_wpns_activate_recaptcha_for_woocommerce_registration', false);
130
+ update_site_option('mo2f_enforce_strong_passswords', 0);
131
+ update_site_option('mo_wpns_enable_fake_domain_blocking', false);
132
+ update_site_option('mo_wpns_enable_advanced_user_verification', false);
133
+ update_site_option('mo_wpns_enable_social_integration', false);
134
+ update_site_option('mo2f_protect_wp_config', 0);
135
+ update_site_option('mo2f_prevent_directory_browsing', 0);
136
+ update_site_option('mo2f_disable_file_editing', 0);
137
+ update_site_option('mo_wpns_enable_comment_spam_blocking', false);
138
+ update_site_option('mo_wpns_enable_comment_recaptcha', false);
139
+ update_site_option('mo2f_htaccess_file', 0);
140
+ if($_POST['option'] == 'tab_login_switch')
141
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('LOGIN_DISABLE'),'ERROR');
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($_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($_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);
171
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
172
+ if (isset($_POST['option'] ))
173
+ {
174
+ if($_POST['option'] == 'tab_malware_switch')
175
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('MALWARE_ENABLE'),'SUCCESS');
176
+ }
177
+ }else{
178
+ update_site_option('mo_2f_switch_malware', 0);
179
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
180
+ if($_POST['option'] == 'tab_malware_switch')
181
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('MALWARE_DISABLE'),'ERROR');
182
+ }
183
+ }
184
+
185
+ public function mo2f_handle_block_enable($POSTED){
186
+ if($POSTED){
187
+ update_site_option('mo_2f_switch_adv_block', 1);
188
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
189
+ if (isset($_POST['option'] ))
190
+ {
191
+ if($_POST['option'] == 'tab_block_switch')
192
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ADV_BLOCK_ENABLE'),'SUCCESS');
193
+ }
194
+ }
195
+ else{
196
+ update_site_option('mo_2f_switch_adv_block', 0);
197
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')-1);
198
+ update_site_option('mo_wpns_iprange_count', 0);
199
+ update_site_option('mo_wpns_enable_htaccess_blocking', 0);
200
+ update_site_option('mo_wpns_enable_user_agent_blocking', 0);
201
+ update_site_option('mo_wpns_referrers', false);
202
+ update_site_option('mo_wpns_countrycodes', false);
203
+ if($_POST['option'] == 'tab_block_switch')
204
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ADV_BLOCK_DISABLE'),'ERROR');
205
+ }
206
+ }
207
+
208
+
209
+ }
210
+ new Mo2f_ajax_dashboard();
211
  ?>
controllers/feedback_footer.php CHANGED
@@ -1,47 +1,47 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- if(current_user_can( 'manage_options' ) && isset($_POST['option']))
6
- {
7
- switch($_POST['option'])
8
- {
9
- case "mo_wpns_send_query":
10
- wpns_handle_feedback_footer_form($_POST['query_email'],$_POST['query'],$_POST['query_phone']); break;
11
- }
12
- }
13
-
14
- $current_user = wp_get_current_user();
15
- $email = get_option("mo2f_email");
16
- $phone = get_option("mo_wpns_admin_phone");
17
-
18
-
19
- /* SUPPORT FORM RELATED FUNCTIONS */
20
-
21
- //Function to handle support form submit
22
- function wpns_handle_feedback_footer_form($email,$query,$phone)
23
- {
24
-
25
- if( empty($email) || empty($query) )
26
- {
27
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'SUCCESS');
28
- return;
29
- }
30
-
31
-
32
- $query = sanitize_text_field( $query );
33
- $email = sanitize_text_field( $email );
34
- $phone = sanitize_text_field( $phone );
35
- $contact_us = new MocURL();
36
- $submited = json_decode($contact_us->submit_contact_us($email, $phone, $query),true);
37
-
38
- if(json_last_error() == JSON_ERROR_NONE && $submited)
39
- {
40
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
41
- return;
42
- }
43
-
44
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
45
- }
46
-
47
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_footer.php';
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
6
+ {
7
+ switch($_POST['option'])
8
+ {
9
+ case "mo_wpns_send_query":
10
+ wpns_handle_feedback_footer_form($_POST['query_email'],$_POST['query'],$_POST['query_phone']); break;
11
+ }
12
+ }
13
+
14
+ $current_user = wp_get_current_user();
15
+ $email = get_option("mo2f_email");
16
+ $phone = get_option("mo_wpns_admin_phone");
17
+
18
+
19
+ /* SUPPORT FORM RELATED FUNCTIONS */
20
+
21
+ //Function to handle support form submit
22
+ function wpns_handle_feedback_footer_form($email,$query,$phone)
23
+ {
24
+
25
+ if( empty($email) || empty($query) )
26
+ {
27
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'SUCCESS');
28
+ return;
29
+ }
30
+
31
+
32
+ $query = sanitize_text_field( $query );
33
+ $email = sanitize_text_field( $email );
34
+ $phone = sanitize_text_field( $phone );
35
+ $contact_us = new MocURL();
36
+ $submited = json_decode($contact_us->submit_contact_us($email, $phone, $query),true);
37
+
38
+ if(json_last_error() == JSON_ERROR_NONE && $submited)
39
+ {
40
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
41
+ return;
42
+ }
43
+
44
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
45
+ }
46
+
47
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'feedback_footer.php';
controllers/licensing.php CHANGED
@@ -1,50 +1,50 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- $default_url = add_query_arg( array('page' => 'default' ), $_SERVER['REQUEST_URI'] );
6
- $form_action = MoWpnsConstants::HOST_NAME.'/moas/login';
7
- $admin_email = get_option('mo2f_email');
8
- $redirect_url = MoWpnsConstants::HOST_NAME .'/moas/initializepayment';
9
-
10
- $basic_plan_price = '$9 / year';
11
- $premium_plan_price = '$9 / year + One Time Setup Fees';
12
-
13
-
14
- $basic_plan_features= array(
15
- "Brute Force Protection ( Login Security and Monitoring - Limit Login Attempts and track user logins. )",
16
- "User Registration Security - Disallow Disposable / Fake email addresses",
17
- "IP Blocking:(manual and automatic) [Blaclisting and whitelisting included",
18
- "Advanced Blocking based on: IP range",
19
- "Protection for WP files",
20
- "Security Log - Logs Blocked IPs, Spammers, Bots, HTTP 404,403 and 400 logging",
21
- "Database Backup",
22
- "Google reCAPTCHA",
23
- "Password protection - Enforce Strong Password : Check Password strength for all users",
24
- "Mobile authentication based on QR code, OTP over SMS and email, Push, Soft token (15+ methods to choose from)<br>For Unlimited Users",
25
- "Advanced activity logs auditing and reporting",
26
- "Risk based access - Contextual authentication based on device, location, time of access and user behavior",
27
- "Advanced User Verification",
28
- "Social Login Integration",
29
- ""
30
- );
31
-
32
- $premium_plan_features= array(
33
- "Brute Force Protection ( Login Security and Monitoring - Limit Login Attempts and track user logins. )",
34
- "User Registration Security - Disallow Disposable / Fake email addresses",
35
- "IP Blocking:(manual and automatic) [Blaclisting and whitelisting included",
36
- "Advanced Blocking based on: IP range",
37
- "Protection for WP files",
38
- "Security Log - Logs Blocked IPs, Spammers, Bots, HTTP 404,403 and 400 logging",
39
- "Database Backup",
40
- "Google reCAPTCHA",
41
- "Password protection - Enforce Strong Password : Check Password strength for all users",
42
- "Mobile authentication based on QR code, OTP over SMS and email, Push, Soft token (15+ methods to choose from)<br>For Unlimited Users",
43
- "Advanced activity logs auditing and reporting",
44
- "Risk based access - Contextual authentication based on device, location, time of access and user behavior",
45
- "Advanced User Verification",
46
- "Social Login Integration",
47
- 'End to End Integration Support'
48
- );
49
-
50
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'licensing.php';
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ $default_url = add_query_arg( array('page' => 'default' ), $_SERVER['REQUEST_URI'] );
6
+ $form_action = MoWpnsConstants::HOST_NAME.'/moas/login';
7
+ $admin_email = get_option('mo2f_email');
8
+ $redirect_url = MoWpnsConstants::HOST_NAME .'/moas/initializepayment';
9
+
10
+ $basic_plan_price = '$9 / year';
11
+ $premium_plan_price = '$9 / year + One Time Setup Fees';
12
+
13
+
14
+ $basic_plan_features= array(
15
+ "Brute Force Protection ( Login Security and Monitoring - Limit Login Attempts and track user logins. )",
16
+ "User Registration Security - Disallow Disposable / Fake email addresses",
17
+ "IP Blocking:(manual and automatic) [Blaclisting and whitelisting included",
18
+ "Advanced Blocking based on: IP range",
19
+ "Protection for WP files",
20
+ "Security Log - Logs Blocked IPs, Spammers, Bots, HTTP 404,403 and 400 logging",
21
+ "Database Backup",
22
+ "Google reCAPTCHA",
23
+ "Password protection - Enforce Strong Password : Check Password strength for all users",
24
+ "Mobile authentication based on QR code, OTP over SMS and email, Push, Soft token (15+ methods to choose from)<br>For Unlimited Users",
25
+ "Advanced activity logs auditing and reporting",
26
+ "Risk based access - Contextual authentication based on device, location, time of access and user behavior",
27
+ "Advanced User Verification",
28
+ "Social Login Integration",
29
+ ""
30
+ );
31
+
32
+ $premium_plan_features= array(
33
+ "Brute Force Protection ( Login Security and Monitoring - Limit Login Attempts and track user logins. )",
34
+ "User Registration Security - Disallow Disposable / Fake email addresses",
35
+ "IP Blocking:(manual and automatic) [Blaclisting and whitelisting included",
36
+ "Advanced Blocking based on: IP range",
37
+ "Protection for WP files",
38
+ "Security Log - Logs Blocked IPs, Spammers, Bots, HTTP 404,403 and 400 logging",
39
+ "Database Backup",
40
+ "Google reCAPTCHA",
41
+ "Password protection - Enforce Strong Password : Check Password strength for all users",
42
+ "Mobile authentication based on QR code, OTP over SMS and email, Push, Soft token (15+ methods to choose from)<br>For Unlimited Users",
43
+ "Advanced activity logs auditing and reporting",
44
+ "Risk based access - Contextual authentication based on device, location, time of access and user behavior",
45
+ "Advanced User Verification",
46
+ "Social Login Integration",
47
+ 'End to End Integration Support'
48
+ );
49
+
50
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'licensing.php';
controllers/login-security.php CHANGED
@@ -41,12 +41,12 @@
41
  $allwed_login_attempts = get_option('mo2f_allwed_login_attempts') ? get_option('mo2f_allwed_login_attempts') : 10;
42
  $time_of_blocking_type = get_option('mo2f_time_of_blocking_type') ? get_option('mo2f_time_of_blocking_type') : "permanent";
43
  $time_of_blocking_val = get_option('mo2f_time_of_blocking_val') ? get_option('mo2f_time_of_blocking_val') : 3;
44
- $brute_force_enabled = get_option('mo2f_enable_brute_force') ? "checked" : "";
45
- $remaining_attempts = get_option('mo2f_show_remaining_attempts') ? "checked" : "";
46
  $slow_down_attacks = get_option('mo_wpns_slow_down_attacks') ? "checked" : "";
47
  $enable_2fa = get_option('mo_wpns_enable_2fa') ? "checked" : "";
48
 
49
- $enforce_strong_password= get_option('mo2f_enforce_strong_passswords') ? "checked" : "";
50
  $attack_delay = get_option('mo_wpns_slow_down_attacks_delay') ? get_option('mo_wpns_slow_down_attacks_delay'): 2 ;
51
  $google_recaptcha = get_option('mo_wpns_activate_recaptcha') ? "checked" : "";
52
  $test_recaptcha_url = "";
@@ -58,7 +58,7 @@
58
  $captcha_reg = get_option('mo_wpns_activate_recaptcha_for_registration') ? "checked" : "";
59
 
60
 
61
- $strong_password_account= get_option('mo2f_enforce_strong_passswords_for_accounts') ? get_option('mo2f_enforce_strong_passswords_for_accounts') : "all";
62
 
63
 
64
  $mo2FAPlugin = new TwoFAPlugin();
41
  $allwed_login_attempts = get_option('mo2f_allwed_login_attempts') ? get_option('mo2f_allwed_login_attempts') : 10;
42
  $time_of_blocking_type = get_option('mo2f_time_of_blocking_type') ? get_option('mo2f_time_of_blocking_type') : "permanent";
43
  $time_of_blocking_val = get_option('mo2f_time_of_blocking_val') ? get_option('mo2f_time_of_blocking_val') : 3;
44
+ $brute_force_enabled = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option') ? "checked" : "";
45
+ $remaining_attempts = MoWpnsUtility::get_mo2f_db_option('mo2f_show_remaining_attempts', 'get_option') ? "checked" : "";
46
  $slow_down_attacks = get_option('mo_wpns_slow_down_attacks') ? "checked" : "";
47
  $enable_2fa = get_option('mo_wpns_enable_2fa') ? "checked" : "";
48
 
49
+ $enforce_strong_password= MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option') ? "checked" : "";
50
  $attack_delay = get_option('mo_wpns_slow_down_attacks_delay') ? get_option('mo_wpns_slow_down_attacks_delay'): 2 ;
51
  $google_recaptcha = get_option('mo_wpns_activate_recaptcha') ? "checked" : "";
52
  $test_recaptcha_url = "";
58
  $captcha_reg = get_option('mo_wpns_activate_recaptcha_for_registration') ? "checked" : "";
59
 
60
 
61
+ $strong_password_account= MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option') ? MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option') : "all";
62
 
63
 
64
  $mo2FAPlugin = new TwoFAPlugin();
controllers/login-spam.php CHANGED
@@ -1,10 +1,10 @@
1
- <?php
2
- global $moWpnsUtility,$mo2f_dirName;
3
- if( isset( $_GET[ 'tab' ] ) ) {
4
- $active_tab = $_GET[ 'tab' ];
5
- } else {
6
- $active_tab = 'default';
7
- }
8
- update_site_option('mo2f_visit_login_and_spam',true);
9
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'login_spam.php';
10
  ?>
1
+ <?php
2
+ global $moWpnsUtility,$mo2f_dirName;
3
+ if( isset( $_GET[ 'tab' ] ) ) {
4
+ $active_tab = $_GET[ 'tab' ];
5
+ } else {
6
+ $active_tab = 'default';
7
+ }
8
+ update_site_option('mo2f_visit_login_and_spam',true);
9
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'login_spam.php';
10
  ?>
controllers/main_controller.php CHANGED
@@ -1,111 +1,111 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- $controller = $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR;
6
-
7
-
8
- if(current_user_can('administrator'))
9
- {
10
- include $controller . 'navbar.php';
11
- include $controller . 'newtork_security_features.php';
12
-
13
- $tour_started=get_option('mo2f_tour_started',0);
14
-
15
-
16
- if($tour_started<1)
17
- include $controller . 'two-fa-intro.php';
18
- else if($tour_started != 0)
19
- include $controller . 'tour-model.php';
20
-
21
- if( isset( $_GET[ 'page' ]))
22
- {
23
- switch($_GET['page'])
24
- {
25
- case 'mo_2fa_dashboard':
26
- include $controller . 'dashboard.php'; break;
27
- case 'mo_2fa_login_and_spam':
28
- include $controller . 'login-spam.php'; break;
29
- case 'default':
30
- include $controller . 'login-security.php'; break;
31
- case 'mo_2fa_account':
32
- include $controller . 'account.php'; break;
33
- case 'mo_2fa_backup':
34
- include $controller . 'backup'.DIRECTORY_SEPARATOR.'backup.php'; break;
35
- case 'mo_2fa_upgrade':
36
- include $controller . 'upgrade.php'; break;
37
- case 'mo_2fa_waf':
38
- include $controller . 'waf.php'; break;
39
- case 'mo_2fa_blockedips':
40
- include $controller . 'ip-blocking.php'; break;
41
- case 'mo_2fa_advancedblocking':
42
- include $controller . 'advanced-blocking.php'; break;
43
- case 'mo_2fa_notifications':
44
- include $controller . 'notification-settings.php'; break;
45
- case 'mo_2fa_reports':
46
- include $controller . 'reports.php'; break;
47
- case 'mo_2fa_licensing':
48
- include $controller . 'licensing.php'; break;
49
- case 'mo_2fa_troubleshooting':
50
- include $controller . 'troubleshooting.php'; break;
51
- case 'mo_2fa_addons':
52
- include $controller . 'addons.php'; break;
53
- case 'mo_2fa_malwarescan':
54
- include $controller . 'malware_scanner'.DIRECTORY_SEPARATOR.'scan_malware.php'; break;
55
- case 'mo_2fa_two_fa':
56
- include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
57
- case 'mo_2fa_request_demo':
58
- include $controller . 'request_demo.php';
59
- }
60
- }
61
-
62
- }
63
- else
64
- {
65
- if( isset( $_GET[ 'page' ]))
66
- {
67
- switch($_GET['page'])
68
- {
69
- case 'mo_2fa_two_fa':
70
- include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
71
-
72
- }
73
-
74
- }
75
-
76
- }
77
- if (isset( $_GET[ 'page' ])) {
78
-
79
- if ($_GET[ 'page' ] == "mo_2fa_upgrade" || $_GET[ 'page' ] == "mo_2fa_addons")
80
- {
81
- include $controller . 'feedback_footer.php';
82
- }
83
- else
84
- {
85
- include $controller . 'support.php';
86
- }
87
- }
88
- ?>
89
- <?php //if(get_option('mo_wpns_scan_initialize')) { ?>
90
- <!-- <script>
91
- jQuery(document).ready(function(){
92
- var nonce = "<?php //echo wp_create_nonce('wpns-quick-scan');?>";
93
- var data={
94
- 'action':'mo_wpns_malware_redirect',
95
- 'call_type':'malware_scan_initiate',
96
- 'scan':'scan_start',
97
- 'scantype':'quick_scan',
98
- 'nonce': nonce
99
- };
100
- jQuery.post(ajaxurl, data, function(response){
101
- jQuery('input[name="quick_scan_button"]').removeAttr('disabled');
102
- document.getElementById('quick_scan_button').style.backgroundColor = '#20b2aa';
103
- jQuery('input[name="standard_scan_button"]').removeAttr('disabled');
104
- document.getElementById('standard_scan_button').style.backgroundColor = '#20b2aa';
105
- jQuery('input[name="custom_scan_button"]').removeAttr('disabled');
106
- document.getElementById('custom_scan_button').style.backgroundColor = '#20b2aa';
107
- document.getElementById("quick_scan_button").value = "Quick Scan";
108
- });
109
- });
110
- </script> -->
111
- <?php //} ?>
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ $controller = $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR;
6
+
7
+
8
+ if(current_user_can('administrator'))
9
+ {
10
+ include $controller . 'navbar.php';
11
+ include $controller . 'newtork_security_features.php';
12
+
13
+ $tour_started=get_option('mo2f_tour_started',0);
14
+
15
+
16
+ if($tour_started<1)
17
+ include $controller . 'two-fa-intro.php';
18
+ else if($tour_started != 0)
19
+ include $controller . 'tour-model.php';
20
+
21
+ if( isset( $_GET[ 'page' ]))
22
+ {
23
+ switch($_GET['page'])
24
+ {
25
+ case 'mo_2fa_dashboard':
26
+ include $controller . 'dashboard.php'; break;
27
+ case 'mo_2fa_login_and_spam':
28
+ include $controller . 'login-spam.php'; break;
29
+ case 'default':
30
+ include $controller . 'login-security.php'; break;
31
+ case 'mo_2fa_account':
32
+ include $controller . 'account.php'; break;
33
+ case 'mo_2fa_backup':
34
+ include $controller . 'backup'.DIRECTORY_SEPARATOR.'backup.php'; break;
35
+ case 'mo_2fa_upgrade':
36
+ include $controller . 'upgrade.php'; break;
37
+ case 'mo_2fa_waf':
38
+ include $controller . 'waf.php'; break;
39
+ case 'mo_2fa_blockedips':
40
+ include $controller . 'ip-blocking.php'; break;
41
+ case 'mo_2fa_advancedblocking':
42
+ include $controller . 'advanced-blocking.php'; break;
43
+ case 'mo_2fa_notifications':
44
+ include $controller . 'notification-settings.php'; break;
45
+ case 'mo_2fa_reports':
46
+ include $controller . 'reports.php'; break;
47
+ case 'mo_2fa_licensing':
48
+ include $controller . 'licensing.php'; break;
49
+ case 'mo_2fa_troubleshooting':
50
+ include $controller . 'troubleshooting.php'; break;
51
+ case 'mo_2fa_addons':
52
+ include $controller . 'addons.php'; break;
53
+ case 'mo_2fa_malwarescan':
54
+ include $controller . 'malware_scanner'.DIRECTORY_SEPARATOR.'scan_malware.php'; break;
55
+ case 'mo_2fa_two_fa':
56
+ include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
57
+ case 'mo_2fa_request_demo':
58
+ include $controller . 'request_demo.php';
59
+ }
60
+ }
61
+
62
+ }
63
+ else
64
+ {
65
+ if( isset( $_GET[ 'page' ]))
66
+ {
67
+ switch($_GET['page'])
68
+ {
69
+ case 'mo_2fa_two_fa':
70
+ include $controller .'twofa'.DIRECTORY_SEPARATOR. 'two_fa.php'; break;
71
+
72
+ }
73
+
74
+ }
75
+
76
+ }
77
+ if (isset( $_GET[ 'page' ])) {
78
+
79
+ if ($_GET[ 'page' ] == "mo_2fa_upgrade" || $_GET[ 'page' ] == "mo_2fa_addons")
80
+ {
81
+ include $controller . 'feedback_footer.php';
82
+ }
83
+ else
84
+ {
85
+ include $controller . 'support.php';
86
+ }
87
+ }
88
+ ?>
89
+
90
+ <!-- <script>
91
+ jQuery(document).ready(function(){
92
+ var nonce = "<?php //echo wp_create_nonce('wpns-quick-scan');?>";
93
+ var data={
94
+ 'action':'mo_wpns_malware_redirect',
95
+ 'call_type':'malware_scan_initiate',
96
+ 'scan':'scan_start',
97
+ 'scantype':'quick_scan',
98
+ 'nonce': nonce
99
+ };
100
+ jQuery.post(ajaxurl, data, function(response){
101
+ jQuery('input[name="quick_scan_button"]').removeAttr('disabled');
102
+ document.getElementById('quick_scan_button').style.backgroundColor = '#20b2aa';
103
+ jQuery('input[name="standard_scan_button"]').removeAttr('disabled');
104
+ document.getElementById('standard_scan_button').style.backgroundColor = '#20b2aa';
105
+ jQuery('input[name="custom_scan_button"]').removeAttr('disabled');
106
+ document.getElementById('custom_scan_button').style.backgroundColor = '#20b2aa';
107
+ document.getElementById("quick_scan_button").value = "Quick Scan";
108
+ });
109
+ });
110
+ </script> -->
111
+
controllers/malware_scanner/malware_scan_result.php CHANGED
@@ -1,41 +1,41 @@
1
- <?php
2
-
3
- function showScanResults(){
4
- $mo_wpns_db_handler = new MoWpnsDB();
5
- if(isset($_GET['view'])){
6
- if(isset($_GET['trust'])){
7
- $mo_wpns_db_handler->ignorefile(base64_decode($_GET['trust']));
8
- }
9
- else if(isset($_GET['trustchanged'])){
10
- $mo_wpns_db_handler->ignorechangedfile($_GET['trustchanged']);
11
- }
12
- $last_id=$mo_wpns_db_handler->get_last_id();
13
- $send_id=$last_id[0]->max;
14
- $last_scan=$mo_wpns_db_handler->count_files_last_scan($send_id);
15
- $listofignorefiles = $mo_wpns_db_handler->getlistofignorefiles();
16
- $ignorefiles = array();
17
- foreach($listofignorefiles as $row)
18
- $ignorefiles[$row->path] = array('signature'=>$row->signature,"id"=>$row->id);
19
-
20
- $result = $mo_wpns_db_handler->get_report_with_id($_GET['view']);
21
- if(sizeof($result)>0){
22
- $detailreport = $mo_wpns_db_handler->get_detail_report_with_id($_GET['view']);
23
- show_scan_details($detailreport, $result, $ignorefiles, $last_scan);
24
- }
25
- }
26
- else{
27
- $str1= $_SERVER['REQUEST_URI'];
28
- $str1= str_replace("admin-ajax.php", "admin.php?page=mo_2fa_malwarescan", $str1);
29
- $currenturl = remove_query_arg('delete',$str1);
30
- $currenturl = remove_query_arg('view',$currenturl);
31
- $currenturl = remove_query_arg('trust',$currenturl);
32
- $currenturl = remove_query_arg('trustchanged',$currenturl);
33
- if(isset($_GET['delete'])){
34
- $mo_wpns_db_handler->delete_report($_GET['delete']);
35
- }
36
- $result = $mo_wpns_db_handler->get_report();
37
- show_scan_report($currenturl, $result);
38
- }
39
- }
40
-
41
  ?>
1
+ <?php
2
+
3
+ function showScanResults(){
4
+ $mo_wpns_db_handler = new MoWpnsDB();
5
+ if(isset($_GET['view'])){
6
+ if(isset($_GET['trust'])){
7
+ $mo_wpns_db_handler->ignorefile(base64_decode($_GET['trust']));
8
+ }
9
+ else if(isset($_GET['trustchanged'])){
10
+ $mo_wpns_db_handler->ignorechangedfile($_GET['trustchanged']);
11
+ }
12
+ $last_id=$mo_wpns_db_handler->get_last_id();
13
+ $send_id=$last_id[0]->max;
14
+ $last_scan=$mo_wpns_db_handler->count_files_last_scan($send_id);
15
+ $listofignorefiles = $mo_wpns_db_handler->getlistofignorefiles();
16
+ $ignorefiles = array();
17
+ foreach($listofignorefiles as $row)
18
+ $ignorefiles[$row->path] = array('signature'=>$row->signature,"id"=>$row->id);
19
+
20
+ $result = $mo_wpns_db_handler->get_report_with_id($_GET['view']);
21
+ if(sizeof($result)>0){
22
+ $detailreport = $mo_wpns_db_handler->get_detail_report_with_id($_GET['view']);
23
+ show_scan_details($detailreport, $result, $ignorefiles, $last_scan);
24
+ }
25
+ }
26
+ else{
27
+ $str1= $_SERVER['REQUEST_URI'];
28
+ $str1= str_replace("admin-ajax.php", "admin.php?page=mo_2fa_malwarescan", $str1);
29
+ $currenturl = remove_query_arg('delete',$str1);
30
+ $currenturl = remove_query_arg('view',$currenturl);
31
+ $currenturl = remove_query_arg('trust',$currenturl);
32
+ $currenturl = remove_query_arg('trustchanged',$currenturl);
33
+ if(isset($_GET['delete'])){
34
+ $mo_wpns_db_handler->delete_report($_GET['delete']);
35
+ }
36
+ $result = $mo_wpns_db_handler->get_report();
37
+ show_scan_report($currenturl, $result);
38
+ }
39
+ }
40
+
41
  ?>
controllers/malware_scanner/scan_malware.php CHANGED
@@ -1,10 +1,9 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- add_option('mo_wpns_skip_folders');
6
- update_site_option('mo2f_visit_malware',true);
7
-
8
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'malware_scan.php';
9
- ?>
10
-
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ update_site_option('mo2f_visit_malware',true);
6
+
7
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'malware_scan.php';
8
+ ?>
9
+
 
controllers/malware_scanner/scan_malware_report.php CHANGED
@@ -1,5 +1,5 @@
1
- <?php
2
-
3
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'scan_report_view.php';
4
-
5
  ?>
1
+ <?php
2
+
3
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'scan_report_view.php';
4
+
5
  ?>
controllers/malware_scanner/scan_malware_settings.php CHANGED
@@ -24,23 +24,21 @@ if(is_null($scan_configuration)){
24
  $mo_wpns_check_extl = $scan_configuration->ext_link_check;
25
  $mo_wpns_check_repo = $scan_configuration->check_repo;
26
  }
27
- //$mo_wpns_scan_files_extensions = get_option('mo_wpns_scan_files_extensions');
28
  $mo_wpns_check_rfi = 0;
29
  $mo_wpns_adv_sign = 0;
30
  $mo_wpns_check_domain = 0;
31
  $mo_wpns_check_trojan = 0;
32
  $mo_wpns_check_backdoor = 0;
33
- //$mo_wpns_skip_folders = get_option('mo_wpns_skip_folders');
34
  $mo_wpns_skip_folders_array = array();
35
  if(!empty($mo_wpns_skip_folders)){
36
  $mo_wpns_skip_folders_array = explode(";",$mo_wpns_skip_folders);
37
  }
38
- $mo_wpns_white_url = "";//get_option('mo_wpns_white_url');
39
  $mo_wpns_white_urls_array = array();
40
  if(!empty($mo_wpns_white_url)){
41
  $mo_wpns_white_urls_array = explode(";",$mo_wpns_white_url);
42
  }
43
- $mo_wpns_custom_sign = "";//get_option('mo_wpns_custom_sign');
44
  $mo_wpns_custom_sign_array = array();
45
  if(!empty($mo_wpns_custom_sign)){
46
  $mo_wpns_custom_sign_array = explode(";",$mo_wpns_custom_sign);
24
  $mo_wpns_check_extl = $scan_configuration->ext_link_check;
25
  $mo_wpns_check_repo = $scan_configuration->check_repo;
26
  }
 
27
  $mo_wpns_check_rfi = 0;
28
  $mo_wpns_adv_sign = 0;
29
  $mo_wpns_check_domain = 0;
30
  $mo_wpns_check_trojan = 0;
31
  $mo_wpns_check_backdoor = 0;
 
32
  $mo_wpns_skip_folders_array = array();
33
  if(!empty($mo_wpns_skip_folders)){
34
  $mo_wpns_skip_folders_array = explode(";",$mo_wpns_skip_folders);
35
  }
36
+ $mo_wpns_white_url = "";
37
  $mo_wpns_white_urls_array = array();
38
  if(!empty($mo_wpns_white_url)){
39
  $mo_wpns_white_urls_array = explode(";",$mo_wpns_white_url);
40
  }
41
+ $mo_wpns_custom_sign = "";
42
  $mo_wpns_custom_sign_array = array();
43
  if(!empty($mo_wpns_custom_sign)){
44
  $mo_wpns_custom_sign_array = explode(";",$mo_wpns_custom_sign);
controllers/malware_scanner/scan_malware_summary.php CHANGED
@@ -1,5 +1,5 @@
1
- <?php
2
-
3
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'scan_summary_view.php';
4
-
5
  ?>
1
+ <?php
2
+
3
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scanner'.DIRECTORY_SEPARATOR.'scan_summary_view.php';
4
+
5
  ?>
controllers/navbar.php CHANGED
@@ -1,83 +1,83 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
- if(current_user_can( 'manage_options' ) && isset($_POST['option']))
5
- {
6
- switch(sanitize_text_field(wp_unslash($_POST['option'])))
7
- {
8
- case "mo_wpns_2fa_with_network_security":
9
- $security_features = new Mo_2fa_security_features();
10
- $security_features->wpns_2fa_with_network_security($_POST); break;
11
- }
12
- }
13
- $network_security_features= get_option('mo_wpns_2fa_with_network_security') ? "checked" : "";
14
-
15
- if( isset( $_GET[ 'page' ])){
16
- $tab_count= get_site_option('mo2f_tab_count', 0);
17
- if($tab_count == 5)
18
- update_site_option('mo_2f_switch_all', 1);
19
- else
20
- update_site_option('mo_2f_switch_all', 0);
21
- switch($_GET['page'])
22
- {
23
- case 'mo_2fa_login_and_spam':
24
- update_option('mo_2f_switch_loginspam', 1);
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'))
36
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
37
- break;
38
- case 'mo_2fa_advancedblocking':
39
- update_option('mo_2f_switch_adv_block', 1);
40
- if($tab_count < 5 && !get_site_option('mo_2f_switch_adv_block'))
41
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
42
- break;
43
-
44
- case 'mo_2fa_malwarescan':
45
- update_option('mo_2f_switch_malware', 1);
46
- if($tab_count < 5 && !get_site_option('mo_2f_switch_malware'))
47
- update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
48
- break;
49
- }
50
- }
51
- $profile_url = add_query_arg( array('page' => 'mo_2fa_account' ), $_SERVER['REQUEST_URI'] );
52
- $login_security = add_query_arg( array('page' => 'default' ), $_SERVER['REQUEST_URI'] );
53
- $waf = add_query_arg( array('page' => 'mo_2fa_waf' ), $_SERVER['REQUEST_URI'] );
54
- $login_and_spam = add_query_arg( array('page' => 'mo_2fa_login_and_spam' ), $_SERVER['REQUEST_URI'] );
55
- $register_url = add_query_arg( array('page' => 'registration' ), $_SERVER['REQUEST_URI'] );
56
- $blocked_ips = add_query_arg( array('page' => 'mo_2fa_blockedips' ), $_SERVER['REQUEST_URI'] );
57
- $advance_block = add_query_arg( array('page' => 'mo_2fa_advancedblocking' ), $_SERVER['REQUEST_URI'] );
58
- $notif_url = add_query_arg( array('page' => 'mo_2fa_notifications' ), $_SERVER['REQUEST_URI'] );
59
- $reports_url = add_query_arg( array('page' => 'mo_2fa_reports' ), $_SERVER['REQUEST_URI'] );
60
- $license_url = add_query_arg( array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI'] );
61
- $help_url = add_query_arg( array('page' => 'mo_2fa_troubleshooting' ), $_SERVER['REQUEST_URI'] );
62
- $addons_url = add_query_arg( array('page' => 'mo_2fa_addons' ), $_SERVER['REQUEST_URI'] );
63
- $content_protect= add_query_arg( array('page' => 'content_protect' ), $_SERVER['REQUEST_URI'] );
64
- $backup = add_query_arg( array('page' => 'mo_2fa_backup' ), $_SERVER['REQUEST_URI'] );
65
- $scan_url = add_query_arg( array('page' => 'mo_2fa_malwarescan' ), $_SERVER['REQUEST_URI'] );
66
- $two_fa = add_query_arg( array('page' => 'mo_2fa_two_fa' ), $_SERVER['REQUEST_URI'] );
67
- //Added for new design
68
- $dashboard_url = add_query_arg(array('page' => 'mo_2fa_dashboard' ), $_SERVER['REQUEST_URI']);
69
- $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
70
- $request_demo_url = add_query_arg(array('page' => 'mo_2fa_request_demo' ), $_SERVER['REQUEST_URI']);
71
- //dynamic
72
- $logo_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/miniorange_logo.png';
73
- $login_with_usename_only_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/login-with-password-and-2fa.png';
74
- $hide_login_form_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/hide_login_form.png';
75
- $new_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/new.png';
76
- $shw_feedback = get_option('donot_show_feedback_message') ? false: true;
77
-
78
- $moPluginHandler= new MoWpnsHandler();
79
- $safe = $moPluginHandler->is_whitelisted($moWpnsUtility->get_client_ip());
80
-
81
- $active_tab = $_GET['page'];
82
-
83
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'navbar.php';
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
5
+ {
6
+ switch(sanitize_text_field(wp_unslash($_POST['option'])))
7
+ {
8
+ case "mo_wpns_2fa_with_network_security":
9
+ $security_features = new Mo_2fa_security_features();
10
+ $security_features->wpns_2fa_with_network_security($_POST); break;
11
+ }
12
+ }
13
+ $network_security_features= MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option') ? "checked" : "";
14
+
15
+ if( isset( $_GET[ 'page' ])){
16
+ $tab_count= get_site_option('mo2f_tab_count', 0);
17
+ if($tab_count == 5)
18
+ update_site_option('mo_2f_switch_all', 1);
19
+ else
20
+ update_site_option('mo_2f_switch_all', 0);
21
+ switch($_GET['page'])
22
+ {
23
+ case 'mo_2fa_login_and_spam':
24
+ update_option('mo_2f_switch_loginspam', 1);
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'))
36
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
37
+ break;
38
+ case 'mo_2fa_advancedblocking':
39
+ update_option('mo_2f_switch_adv_block', 1);
40
+ if($tab_count < 5 && !get_site_option('mo_2f_switch_adv_block'))
41
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
42
+ break;
43
+
44
+ case 'mo_2fa_malwarescan':
45
+ update_option('mo_2f_switch_malware', 1);
46
+ if($tab_count < 5 && !get_site_option('mo_2f_switch_malware'))
47
+ update_site_option('mo2f_tab_count', get_site_option('mo2f_tab_count')+1);
48
+ break;
49
+ }
50
+ }
51
+ $profile_url = add_query_arg( array('page' => 'mo_2fa_account' ), $_SERVER['REQUEST_URI'] );
52
+ $login_security = add_query_arg( array('page' => 'default' ), $_SERVER['REQUEST_URI'] );
53
+ $waf = add_query_arg( array('page' => 'mo_2fa_waf' ), $_SERVER['REQUEST_URI'] );
54
+ $login_and_spam = add_query_arg( array('page' => 'mo_2fa_login_and_spam' ), $_SERVER['REQUEST_URI'] );
55
+ $register_url = add_query_arg( array('page' => 'registration' ), $_SERVER['REQUEST_URI'] );
56
+ $blocked_ips = add_query_arg( array('page' => 'mo_2fa_blockedips' ), $_SERVER['REQUEST_URI'] );
57
+ $advance_block = add_query_arg( array('page' => 'mo_2fa_advancedblocking' ), $_SERVER['REQUEST_URI'] );
58
+ $notif_url = add_query_arg( array('page' => 'mo_2fa_notifications' ), $_SERVER['REQUEST_URI'] );
59
+ $reports_url = add_query_arg( array('page' => 'mo_2fa_reports' ), $_SERVER['REQUEST_URI'] );
60
+ $license_url = add_query_arg( array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI'] );
61
+ $help_url = add_query_arg( array('page' => 'mo_2fa_troubleshooting' ), $_SERVER['REQUEST_URI'] );
62
+ $addons_url = add_query_arg( array('page' => 'mo_2fa_addons' ), $_SERVER['REQUEST_URI'] );
63
+ $content_protect= add_query_arg( array('page' => 'content_protect' ), $_SERVER['REQUEST_URI'] );
64
+ $backup = add_query_arg( array('page' => 'mo_2fa_backup' ), $_SERVER['REQUEST_URI'] );
65
+ $scan_url = add_query_arg( array('page' => 'mo_2fa_malwarescan' ), $_SERVER['REQUEST_URI'] );
66
+ $two_fa = add_query_arg( array('page' => 'mo_2fa_two_fa' ), $_SERVER['REQUEST_URI'] );
67
+ //Added for new design
68
+ $dashboard_url = add_query_arg(array('page' => 'mo_2fa_dashboard' ), $_SERVER['REQUEST_URI']);
69
+ $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
70
+ $request_demo_url = add_query_arg(array('page' => 'mo_2fa_request_demo' ), $_SERVER['REQUEST_URI']);
71
+ //dynamic
72
+ $logo_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/miniorange_logo.png';
73
+ $login_with_usename_only_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/login-with-password-and-2fa.png';
74
+ $hide_login_form_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/hide_login_form.png';
75
+ $new_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/new.png';
76
+ $shw_feedback = get_option('donot_show_feedback_message') ? false: true;
77
+
78
+ $moPluginHandler= new MoWpnsHandler();
79
+ $safe = $moPluginHandler->is_whitelisted($moWpnsUtility->get_client_ip());
80
+
81
+ $active_tab = $_GET['page'];
82
+
83
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'navbar.php';
controllers/newtork_security_features.php CHANGED
@@ -17,7 +17,7 @@
17
  }
18
 
19
 
20
- $network_security_features= get_option('mo_wpns_2fa_with_network_security') ? "checked" : "";
21
 
22
 
23
 
17
  }
18
 
19
 
20
+ $network_security_features= MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option') ? "checked" : "";
21
 
22
 
23
 
controllers/notification-settings.php CHANGED
@@ -1,101 +1,101 @@
1
- <?php
2
-
3
- global $moWpnsUtility,$mo2f_dirName;
4
-
5
- $template1 = "Hello,<br><br>The user with IP Address <b>##ipaddress##</b> has exceeded allowed trasaction limit on your website <b>".get_bloginfo()."</b> and we have blocked his IP address for further access to website.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange";
6
- $template2 = "Hello ##username##,<br><br>Your account was logged in from new IP Address <b>##ipaddress##</b> on website <b>".get_bloginfo()."</b>. Please <a href='mailto:".MoWpnsConstants::SUPPORT_EMAIL."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo();
7
-
8
- if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
9
- {
10
- switch($_POST['option'])
11
- {
12
- case "mo_wpns_enable_ip_blocked_email_to_admin":
13
- wpns_handle_notify_admin_on_ip_block($_POST); break;
14
- case "mo_wpns_enable_unusual_activity_email_to_user":
15
- wpns_handle_notify_unusual_activity($_POST); break;
16
- case "custom_user_template":
17
- wpns_handle_custom_template($_POST['custom_user_template']); break;
18
- case "mo_wpns_get_manual_email" :
19
- wpns_handle_admin_email($_POST); break;
20
- case "custom_admin_template":
21
- wpns_handle_custom_template(null,$_POST['custom_admin_template']); break;
22
- }
23
- }
24
- if(!get_option("admin_email_address_status")|| get_option("admin_email_address") ==''){
25
- update_option('mo_wpns_enable_ip_blocked_email_to_admin','0');
26
- $notify_admin_on_ip_block = get_option('mo_wpns_enable_ip_blocked_email_to_admin') ? "" : "unchacked";
27
- }
28
- $notify_admin_on_ip_block = get_option('mo_wpns_enable_ip_blocked_email_to_admin') ? "checked" : "";
29
- $notify_admin_unusual_activity = get_option('mo_wpns_enable_unusual_activity_email_to_user') ? "checked" : "";
30
-
31
- $template1 = get_option('custom_admin_template') ? get_option('custom_admin_template') : $template1;
32
- $template_type1 = 'custom_admin_template';
33
- $ip_blocking_template = array(
34
- 'textarea_name' => 'custom_admin_template',
35
- 'wpautop' => false
36
- );
37
- $fromEmail = get_option('mo2f_email');
38
- $template2 = get_option('custom_user_template') ? get_option('custom_user_template') : $template2;
39
- $template_type2 = 'custom_user_template';
40
- $user_activity_template = array(
41
- 'textarea_name' => 'custom_user_template',
42
- 'wpautop' => false
43
- );
44
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'notification-settings.php';
45
-
46
-
47
-
48
- /* ADMIN NOTIFICATION SETTINGS */
49
- function wpns_handle_admin_email($postValue)
50
- {
51
-
52
- if(validate_email($_POST['admin_email_address'])){
53
- $admin_email_address_status = isset($postValue['admin_email_address']) ? '1' :'0';
54
- update_option('admin_email_address',$postValue['admin_email_address']);
55
- update_option( 'admin_email_address_status', $admin_email_address_status);
56
- do_action('wpns_show_message',MoWpnsMessages::showMessage('EMAIL_SAVED'),'SUCCESS');
57
- }else{
58
- do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_EMAIL'),'ERROR');
59
- }
60
- }
61
- function validate_email($str) {
62
- return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
63
- }
64
-
65
- //Function to handle enabling and disabling of admin notification on ip blocking
66
- function wpns_handle_notify_admin_on_ip_block($postValue)
67
- {
68
- $enable_ip_blocked_email_to_admin = isset($postValue['enable_ip_blocked_email_to_admin']) ? true : false;
69
- update_option( 'mo_wpns_enable_ip_blocked_email_to_admin', $enable_ip_blocked_email_to_admin);
70
-
71
- if($enable_ip_blocked_email_to_admin)
72
- do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_IP_BLOCKED'),'SUCCESS');
73
- else
74
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_IP_BLOCKED'),'ERROR');
75
- }
76
-
77
-
78
- //Function to handle enabling and disabling of admin notification on unusual activity
79
- function wpns_handle_notify_unusual_activity($postValue)
80
- {
81
- $enable_unusual_activity_email_to_user = isset($postValue['enable_unusual_activity_email_to_user']) ? true : false;
82
- update_option( 'mo_wpns_enable_unusual_activity_email_to_user', $enable_unusual_activity_email_to_user);
83
-
84
- if($enable_unusual_activity_email_to_user)
85
- do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_UNUSUAL_ACTIVITY'),'SUCCESS');
86
- else
87
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_UNUSUAL_ACTIVITY'),'ERROR');
88
- }
89
-
90
-
91
- //Function to save unusual activity email template
92
- function wpns_handle_custom_template($template1,$template2=null)
93
- {
94
- if(!is_null($template1))
95
- update_option('custom_user_template', stripslashes($template1));
96
-
97
- if(!is_null($template2))
98
- update_option('custom_admin_template', stripslashes($template2));
99
-
100
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TEMPLATE_SAVED'),'SUCCESS');
101
  }
1
+ <?php
2
+
3
+ global $moWpnsUtility,$mo2f_dirName;
4
+
5
+ $template1 = "Hello,<br><br>The user with IP Address <b>##ipaddress##</b> has exceeded allowed trasaction limit on your website <b>".get_bloginfo()."</b> and we have blocked his IP address for further access to website.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange";
6
+ $template2 = "Hello ##username##,<br><br>Your account was logged in from new IP Address <b>##ipaddress##</b> on website <b>".get_bloginfo()."</b>. Please <a href='mailto:".MoWpnsConstants::SUPPORT_EMAIL."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo();
7
+
8
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
9
+ {
10
+ switch($_POST['option'])
11
+ {
12
+ case "mo_wpns_enable_ip_blocked_email_to_admin":
13
+ wpns_handle_notify_admin_on_ip_block($_POST); break;
14
+ case "mo_wpns_enable_unusual_activity_email_to_user":
15
+ wpns_handle_notify_unusual_activity($_POST); break;
16
+ case "custom_user_template":
17
+ wpns_handle_custom_template($_POST['custom_user_template']); break;
18
+ case "mo_wpns_get_manual_email" :
19
+ wpns_handle_admin_email($_POST); break;
20
+ case "custom_admin_template":
21
+ wpns_handle_custom_template(null,$_POST['custom_admin_template']); break;
22
+ }
23
+ }
24
+ if(!get_option("admin_email_address_status")|| get_option("admin_email_address") ==''){
25
+ update_option('mo_wpns_enable_ip_blocked_email_to_admin','0');
26
+ $notify_admin_on_ip_block = MoWpnsUtility::get_mo2f_db_option('mo_wpns_enable_ip_blocked_email_to_admin', 'get_option') ? "" : "unchacked";
27
+ }
28
+ $notify_admin_on_ip_block = MoWpnsUtility::get_mo2f_db_option('mo_wpns_enable_ip_blocked_email_to_admin', 'get_option') ? "checked" : "";
29
+ $notify_admin_unusual_activity = get_option('mo_wpns_enable_unusual_activity_email_to_user') ? "checked" : "";
30
+
31
+ $template1 = get_option('custom_admin_template') ? get_option('custom_admin_template') : $template1;
32
+ $template_type1 = 'custom_admin_template';
33
+ $ip_blocking_template = array(
34
+ 'textarea_name' => 'custom_admin_template',
35
+ 'wpautop' => false
36
+ );
37
+ $fromEmail = get_option('mo2f_email');
38
+ $template2 = get_option('custom_user_template') ? get_option('custom_user_template') : $template2;
39
+ $template_type2 = 'custom_user_template';
40
+ $user_activity_template = array(
41
+ 'textarea_name' => 'custom_user_template',
42
+ 'wpautop' => false
43
+ );
44
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'notification-settings.php';
45
+
46
+
47
+
48
+ /* ADMIN NOTIFICATION SETTINGS */
49
+ function wpns_handle_admin_email($postValue)
50
+ {
51
+
52
+ if(validate_email($_POST['admin_email_address'])){
53
+ $admin_email_address_status = isset($postValue['admin_email_address']) ? '1' :'0';
54
+ update_option('admin_email_address',$postValue['admin_email_address']);
55
+ update_option( 'admin_email_address_status', $admin_email_address_status);
56
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('EMAIL_SAVED'),'SUCCESS');
57
+ }else{
58
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_EMAIL'),'ERROR');
59
+ }
60
+ }
61
+ function validate_email($str) {
62
+ return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
63
+ }
64
+
65
+ //Function to handle enabling and disabling of admin notification on ip blocking
66
+ function wpns_handle_notify_admin_on_ip_block($postValue)
67
+ {
68
+ $enable_ip_blocked_email_to_admin = isset($postValue['enable_ip_blocked_email_to_admin']) ? true : false;
69
+ update_option( 'mo_wpns_enable_ip_blocked_email_to_admin', $enable_ip_blocked_email_to_admin);
70
+
71
+ if($enable_ip_blocked_email_to_admin)
72
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_IP_BLOCKED'),'SUCCESS');
73
+ else
74
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_IP_BLOCKED'),'ERROR');
75
+ }
76
+
77
+
78
+ //Function to handle enabling and disabling of admin notification on unusual activity
79
+ function wpns_handle_notify_unusual_activity($postValue)
80
+ {
81
+ $enable_unusual_activity_email_to_user = isset($postValue['enable_unusual_activity_email_to_user']) ? true : false;
82
+ update_option( 'mo_wpns_enable_unusual_activity_email_to_user', $enable_unusual_activity_email_to_user);
83
+
84
+ if($enable_unusual_activity_email_to_user)
85
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_UNUSUAL_ACTIVITY'),'SUCCESS');
86
+ else
87
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_UNUSUAL_ACTIVITY'),'ERROR');
88
+ }
89
+
90
+
91
+ //Function to save unusual activity email template
92
+ function wpns_handle_custom_template($template1,$template2=null)
93
+ {
94
+ if(!is_null($template1))
95
+ update_option('custom_user_template', stripslashes($template1));
96
+
97
+ if(!is_null($template2))
98
+ update_option('custom_admin_template', stripslashes($template2));
99
+
100
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TEMPLATE_SAVED'),'SUCCESS');
101
  }
controllers/pointers.php CHANGED
@@ -5,7 +5,8 @@ $tab= 'default';
5
  if(array_key_exists('tab',$_GET))
6
  $tab = $_GET['tab'];
7
 
8
- if(get_option('mo2f_two_factor_tour')==1)
 
9
  {
10
  $pointers['default-miniorange-2fa-select-authentication'] = array(
11
  'title' => sprintf( '<h3>%s</h3>', esc_html__( 'Select Authentication Method (Step 1 out of 9)' ) ),
5
  if(array_key_exists('tab',$_GET))
6
  $tab = $_GET['tab'];
7
 
8
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_two_factor_tour', 'get_option') ==1)
9
+
10
  {
11
  $pointers['default-miniorange-2fa-select-authentication'] = array(
12
  'title' => sprintf( '<h3>%s</h3>', esc_html__( 'Select Authentication Method (Step 1 out of 9)' ) ),
controllers/registration-security.php CHANGED
@@ -1,129 +1,129 @@
1
- <?php
2
-
3
- global $moWpnsUtility, $mo2f_dirName;
4
-
5
-
6
- if(current_user_can( 'manage_options' ) && isset($_POST['option']))
7
- {
8
- switch($_POST['option'])
9
- {
10
- case "mo_wpns_enable_fake_domain_blocking":
11
- wpns_handle_domain_blocking($_POST); break;
12
- case "mo_wpns_advanced_user_verification":
13
- wpns_handle_advanced_user_verification($_POST); break;
14
- case "mo_wpns_social_integration":
15
- wpns_handle_enable_social_login($_POST); break;
16
-
17
- }
18
- }
19
-
20
- $otpVerify_url = add_query_arg( array('page' => 'mosettings', 'tab'=>'settings'), $_SERVER['REQUEST_URI'] );
21
- $openid_url = add_query_arg( array('page' => 'mo_openid_settings' ), $_SERVER['REQUEST_URI'] );
22
- $domain_blocking= get_option('mo_wpns_enable_fake_domain_blocking') ? "checked" : "";
23
- $user_verify = get_option('mo_wpns_enable_advanced_user_verification') ? "checked" : "";
24
- $social_login = get_option('mo_wpns_enable_social_integration') ? "checked" : "";
25
-
26
- if($user_verify)
27
- {
28
- $moOTPPlugin = new OTPPlugin();
29
- $status = $moOTPPlugin->getstatus();
30
- switch ($status)
31
- {
32
- case "ACTIVE":
33
- $html1 = "<br><a href='".$otpVerify_url."'>Click here to configure.</a>";
34
- $moOTPPlugin->updatePluginConfiguration();
35
- break;
36
- case "INSTALLED":
37
- $path = "miniorange-otp-verification/miniorange_validation_settings.php";
38
- $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
39
- $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate OTP Verification Plugin</a>';
40
- break;
41
- default:
42
- $action = 'install-plugin';
43
- $slug = 'miniorange-otp-verification';
44
- $install_link = wp_nonce_url(
45
- add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
46
- $action.'_'.$slug
47
- );
48
- $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin installed.</span><br><a href="'.$install_link.'">Install OTP Verification plugin</a>';
49
- break;
50
- }
51
- }
52
-
53
-
54
- if($social_login)
55
- {
56
- $moSocialLogin = new SocialPlugin();
57
- $status = $moSocialLogin->getstatus();
58
- switch ($status)
59
- {
60
- case "ACTIVE":
61
- $html2 = "<br><a href='".$openid_url."'>Click here to configure.</a>";
62
- break;
63
- case "INSTALLED":
64
- $path = "miniorange-login-openid/miniorange_openid_sso_settings.php";
65
- $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
66
- $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate Social Login, Sharing Plugin</a>';
67
- break;
68
- default:
69
- $action = 'install-plugin';
70
- $slug = 'miniorange-login-openid';
71
- $install_link = wp_nonce_url(
72
- add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
73
- $action.'_'.$slug
74
- );
75
- $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin installed.</span><br><a href="'.$install_link.'">Install Social Login, Sharing plugin</a>';
76
- break;
77
- }
78
- }
79
-
80
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'registration-security.php';
81
-
82
-
83
-
84
-
85
- /* REGISTRATION SECURITY RELATED FUNCTIONS*/
86
-
87
- //Function to handle enabling and disabling domain blocking
88
- function wpns_handle_domain_blocking($postvalue)
89
- {
90
- $enable_fake_emails = isset($postvalue['mo_wpns_enable_fake_domain_blocking']) ? true : false;
91
- update_option( 'mo_wpns_enable_fake_domain_blocking', $enable_fake_emails);
92
-
93
- if($enable_fake_emails)
94
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_ENABLED'),'SUCCESS');
95
- else
96
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_DISABLED'),'ERROR');
97
- }
98
-
99
-
100
- //Function to enable and disable User Verification for the Default Registration Page
101
- function wpns_handle_advanced_user_verification($postvalue)
102
- {
103
- $enable_advanced_user_verification = isset($postvalue['mo_wpns_enable_advanced_user_verification']) ? true : false;
104
- update_option( 'mo_wpns_enable_advanced_user_verification', $enable_advanced_user_verification);
105
-
106
- if($enable_advanced_user_verification)
107
- {
108
- update_option('mo_customer_validation_wp_default_enable',1);
109
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_ADVANCED_USER_VERIFY'),'SUCCESS');
110
- }
111
- else
112
- {
113
- update_option('mo_customer_validation_wp_default_enable',0);
114
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_ADVANCED_USER_VERIFY'),'ERROR');
115
- }
116
- }
117
-
118
-
119
- //Function to enable and disable Social Login
120
- function wpns_handle_enable_social_login($postvalue)
121
- {
122
- $social_login = isset($postvalue['mo_wpns_enable_social_integration']) ? true : false;
123
- update_option( 'mo_wpns_enable_social_integration', $social_login);
124
-
125
- if($social_login)
126
- do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_SOCIAL_LOGIN'),'SUCCESS');
127
- else
128
- do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_SOCIAL_LOGIN'),'ERROR');
129
  }
1
+ <?php
2
+
3
+ global $moWpnsUtility, $mo2f_dirName;
4
+
5
+
6
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
7
+ {
8
+ switch($_POST['option'])
9
+ {
10
+ case "mo_wpns_enable_fake_domain_blocking":
11
+ wpns_handle_domain_blocking($_POST); break;
12
+ case "mo_wpns_advanced_user_verification":
13
+ wpns_handle_advanced_user_verification($_POST); break;
14
+ case "mo_wpns_social_integration":
15
+ wpns_handle_enable_social_login($_POST); break;
16
+
17
+ }
18
+ }
19
+
20
+ $otpVerify_url = add_query_arg( array('page' => 'mosettings', 'tab'=>'settings'), $_SERVER['REQUEST_URI'] );
21
+ $openid_url = add_query_arg( array('page' => 'mo_openid_settings' ), $_SERVER['REQUEST_URI'] );
22
+ $domain_blocking= get_option('mo_wpns_enable_fake_domain_blocking') ? "checked" : "";
23
+ $user_verify = get_option('mo_wpns_enable_advanced_user_verification') ? "checked" : "";
24
+ $social_login = get_option('mo_wpns_enable_social_integration') ? "checked" : "";
25
+
26
+ if($user_verify)
27
+ {
28
+ $moOTPPlugin = new OTPPlugin();
29
+ $status = $moOTPPlugin->getstatus();
30
+ switch ($status)
31
+ {
32
+ case "ACTIVE":
33
+ $html1 = "<br><a href='".$otpVerify_url."'>Click here to configure.</a>";
34
+ $moOTPPlugin->updatePluginConfiguration();
35
+ break;
36
+ case "INSTALLED":
37
+ $path = "miniorange-otp-verification/miniorange_validation_settings.php";
38
+ $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
39
+ $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate OTP Verification Plugin</a>';
40
+ break;
41
+ default:
42
+ $action = 'install-plugin';
43
+ $slug = 'miniorange-otp-verification';
44
+ $install_link = wp_nonce_url(
45
+ add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
46
+ $action.'_'.$slug
47
+ );
48
+ $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin installed.</span><br><a href="'.$install_link.'">Install OTP Verification plugin</a>';
49
+ break;
50
+ }
51
+ }
52
+
53
+
54
+ if($social_login)
55
+ {
56
+ $moSocialLogin = new SocialPlugin();
57
+ $status = $moSocialLogin->getstatus();
58
+ switch ($status)
59
+ {
60
+ case "ACTIVE":
61
+ $html2 = "<br><a href='".$openid_url."'>Click here to configure.</a>";
62
+ break;
63
+ case "INSTALLED":
64
+ $path = "miniorange-login-openid/miniorange_openid_sso_settings.php";
65
+ $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
66
+ $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate Social Login, Sharing Plugin</a>';
67
+ break;
68
+ default:
69
+ $action = 'install-plugin';
70
+ $slug = 'miniorange-login-openid';
71
+ $install_link = wp_nonce_url(
72
+ add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
73
+ $action.'_'.$slug
74
+ );
75
+ $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin installed.</span><br><a href="'.$install_link.'">Install Social Login, Sharing plugin</a>';
76
+ break;
77
+ }
78
+ }
79
+
80
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'registration-security.php';
81
+
82
+
83
+
84
+
85
+ /* REGISTRATION SECURITY RELATED FUNCTIONS*/
86
+
87
+ //Function to handle enabling and disabling domain blocking
88
+ function wpns_handle_domain_blocking($postvalue)
89
+ {
90
+ $enable_fake_emails = isset($postvalue['mo_wpns_enable_fake_domain_blocking']) ? true : false;
91
+ update_option( 'mo_wpns_enable_fake_domain_blocking', $enable_fake_emails);
92
+
93
+ if($enable_fake_emails)
94
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_ENABLED'),'SUCCESS');
95
+ else
96
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_DISABLED'),'ERROR');
97
+ }
98
+
99
+
100
+ //Function to enable and disable User Verification for the Default Registration Page
101
+ function wpns_handle_advanced_user_verification($postvalue)
102
+ {
103
+ $enable_advanced_user_verification = isset($postvalue['mo_wpns_enable_advanced_user_verification']) ? true : false;
104
+ update_option( 'mo_wpns_enable_advanced_user_verification', $enable_advanced_user_verification);
105
+
106
+ if($enable_advanced_user_verification)
107
+ {
108
+ update_option('mo_customer_validation_wp_default_enable',1);
109
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_ADVANCED_USER_VERIFY'),'SUCCESS');
110
+ }
111
+ else
112
+ {
113
+ update_option('mo_customer_validation_wp_default_enable',0);
114
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_ADVANCED_USER_VERIFY'),'ERROR');
115
+ }
116
+ }
117
+
118
+
119
+ //Function to enable and disable Social Login
120
+ function wpns_handle_enable_social_login($postvalue)
121
+ {
122
+ $social_login = isset($postvalue['mo_wpns_enable_social_integration']) ? true : false;
123
+ update_option( 'mo_wpns_enable_social_integration', $social_login);
124
+
125
+ if($social_login)
126
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_SOCIAL_LOGIN'),'SUCCESS');
127
+ else
128
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_SOCIAL_LOGIN'),'ERROR');
129
  }
controllers/tour-model.php CHANGED
@@ -5,7 +5,7 @@
5
  $email = get_option("mo2f_email");
6
  $phone = get_option("mo_wpns_admin_phone");
7
  $display = get_option('mo2f_tour_started') == 2?'block':'none';
8
- $networkSEnable = get_option("mo_wpns_2fa_with_network_security");
9
  if(empty($email))
10
  $email = $current_user->user_email;
11
  $counter = 0;
5
  $email = get_option("mo2f_email");
6
  $phone = get_option("mo_wpns_admin_phone");
7
  $display = get_option('mo2f_tour_started') == 2?'block':'none';
8
+ $networkSEnable = MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option');
9
  if(empty($email))
10
  $email = $current_user->user_email;
11
  $counter = 0;
controllers/tour/tour_ajax.php CHANGED
@@ -11,7 +11,7 @@ class Mo_wpns_Tour
11
  {
12
  switch ($_REQUEST['page']) {
13
  case 'mo_2fa_two_fa':
14
- if(!get_option('mo2f_two_factor_tour'))
15
  update_option('mo2f_two_factor_tour',1);
16
 
17
  break;
11
  {
12
  switch ($_REQUEST['page']) {
13
  case 'mo_2fa_two_fa':
14
+ if(!MoWpnsUtility::get_mo2f_db_option('mo2f_two_factor_tour', 'get_option'))
15
  update_option('mo2f_two_factor_tour',1);
16
 
17
  break;
controllers/two-fa-intro.php CHANGED
@@ -1,222 +1,222 @@
1
-
2
- <div id="mo2f_2fa_intro" class = "modal" style="display: block;">
3
- <div id="mo2f_2fa_intro_modal" class="modal-content" style="width: 40%;overflow: hidden;padding:50px;" >
4
-
5
- <div class="modal-header" style="border-bottom: none;">
6
- <h2 class="modal-title" style="text-align: center; font-size: 20px; color: #2980b9">
7
- <span id="closeintromodal" class="close modal-span-close" onclick="skipintro();">X</span>
8
- </h2>
9
- </div>
10
-
11
- <div class="modal-body" style="height: auto;">
12
- <center>
13
- <div class="checkmark-circle" >
14
- <div class="background"></div>
15
- <div class="checkmark draw"></div>
16
- </div>
17
- <h1>Awesome!!</h1>
18
- <h2 style="color: black;font-size: 20px;">You are ready to use Two Factor.</h2>
19
- </center>
20
- <div >
21
- <h3 style="color: black;display:none;" ><span style="color:red;">Logout</span> : You can logout and get the same experience as your users. </h3>
22
-
23
- </div>
24
- </div>
25
-
26
- <div class="modal-footer" style="border: 0px;">
27
- <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button readytogo mo2f_advance_setting" onclick="skipintro();">Advance Settings</button>
28
- <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button " style="margin-left: 5%;width: 40%;background-color:#2EB150;float: left;min-height: 54px;border: 2px solid black;" title="Logout and check the user experience" onclick="mo2f_userlogout()">Logout and Configure</button>
29
- <div class="mo2f_tooltip_addon logout mo_wpns_button mo_wpns_button1 modal-button " style="float: left;border: 2px solid black;border-left:none;width: 6%;box-shadow: none;text-decoration:none;background-color: #2EB150;margin-left: -5px;min-height: 50px;">
30
- <span class="dashicons dashicons-info mo2f_info_tab" style="color: white;font-size: 27px;margin-top: 14px;margin-left: -12px;"></span>
31
- <span class="mo2f_tooltiptext_addon mo2f_logout_and_configure_info" style="font-size: 20px;font-family: auto; text-align: justify;font-weight: lighter;background-color: #2EB150; font-size: 20px;">
32
- <ul style="list-style-type:square;margin: 10px 18px 10px 18px;"><li>This will logout you and will ask you to set your 2FA on next login.</li><li> New and existing users can set their 2FA on next login.</li></ul>
33
- </span>
34
- <span class="mo2f_tooltiptext_addon" style="color: #2EB150;background: none; margin-left: -200px; margin-top: -38px;">
35
- <span class="dashicons dashicons-arrow-down" style="font-size: 300%;"></span>
36
- </span>
37
- </div>
38
-
39
- </div>
40
- </div>
41
- </div>
42
- <form name="f" id="mo2f_skiploginform" method="post" action="">
43
- <input type="hidden" name="mo2f_skiplogin_nonce" value="<?php echo wp_create_nonce( 'miniorange-2-factor-skiplogin-failed-nonce' ); ?>"/>
44
- <input type="hidden" name="option" value="mo2f_skiplogin"/>
45
- </form>
46
- <form name="f" id="mo2f_userlogoutform" method="post" action="">
47
- <input type="hidden" name="mo2f_userlogout_nonce" value="<?php echo wp_create_nonce( 'miniorange-2-factor-userlogout-failed-nonce' ); ?>"/>
48
- <input type="hidden" name="option" value="mo2f_userlogout"/>
49
- </form>
50
-
51
- <script>
52
- function mo2f_userlogout() {
53
- jQuery("#mo2f_userlogoutform").submit();
54
- }
55
-
56
- function skipintro() {
57
- jQuery("#mo2f_skiploginform").submit();
58
- }
59
- </script>
60
-
61
- <style>
62
-
63
- .modalhover:hover{
64
- border:2px solid #2EB150;
65
- background: #2EB150 !important;
66
- color:white !important;
67
- }
68
- .checkmark-circle {
69
- width: 150px;
70
- height: 150px;
71
- position: relative;
72
- display: inline-block;
73
- vertical-align: top;
74
- }
75
- .checkmark-circle .background {
76
- width: 150px;
77
- height: 150px;
78
- border-radius: 50%;
79
- background: #2EB150;
80
- position: absolute;
81
- }
82
- .checkmark-circle .checkmark {
83
- border-radius: 5px;
84
- }
85
- .checkmark-circle .checkmark.draw:after {
86
- -webkit-animation-delay: 100ms;
87
- -moz-animation-delay: 100ms;
88
- animation-delay: 100ms;
89
- -webkit-animation-duration: 1s;
90
- -moz-animation-duration: 1s;
91
- animation-duration: 1s;
92
- -webkit-animation-timing-function: ease;
93
- -moz-animation-timing-function: ease;
94
- animation-timing-function: ease;
95
- -webkit-animation-name: checkmark;
96
- -moz-animation-name: checkmark;
97
- animation-name: checkmark;
98
- -webkit-transform: scaleX(-1) rotate(130deg);
99
- -moz-transform: scaleX(-1) rotate(130deg);
100
- -ms-transform: scaleX(-1) rotate(130deg);
101
- -o-transform: scaleX(-1) rotate(130deg);
102
- transform: scaleX(-1) rotate(130deg);
103
- -webkit-animation-fill-mode: forwards;
104
- -moz-animation-fill-mode: forwards;
105
- animation-fill-mode: forwards;
106
- }
107
- .checkmark-circle .checkmark:after {
108
- opacity: 1;
109
- height: 75px;
110
- width: 37.5px;
111
- -webkit-transform-origin: left top;
112
- -moz-transform-origin: left top;
113
- -ms-transform-origin: left top;
114
- -o-transform-origin: left top;
115
- transform-origin: left top;
116
- border-right: 15px solid white;
117
- border-top: 15px solid white;
118
- border-radius: 2.5px !important;
119
- content: '';
120
- left: 25px;
121
- top: 75px;
122
- position: absolute;
123
- }
124
-
125
- @-webkit-keyframes checkmark {
126
- 0% {
127
- height: 0;
128
- width: 0;
129
- opacity: 1;
130
- }
131
- 20% {
132
- height: 0;
133
- width: 37.5px;
134
- opacity: 1;
135
- }
136
- 40% {
137
- height: 75px;
138
- width: 37.5px;
139
- opacity: 1;
140
- }
141
- 100% {
142
- height: 75px;
143
- width: 37.5px;
144
- opacity: 1;
145
- }
146
- }
147
- @-moz-keyframes checkmark {
148
- 0% {
149
- height: 0;
150
- width: 0;
151
- opacity: 1;
152
- }
153
- 20% {
154
- height: 0;
155
- width: 37.5px;
156
- opacity: 1;
157
- }
158
- 40% {
159
- height: 75px;
160
- width: 37.5px;
161
- opacity: 1;
162
- }
163
- 100% {
164
- height: 75px;
165
- width: 37.5px;
166
- opacity: 1;
167
- }
168
- }
169
- @keyframes checkmark {
170
- 0% {
171
- height: 0;
172
- width: 0;
173
- opacity: 1;
174
- }
175
- 20% {
176
- height: 0;
177
- width: 37.5px;
178
- opacity: 1;
179
- }
180
- 40% {
181
- height: 75px;
182
- width: 37.5px;
183
- opacity: 1;
184
- }
185
- 100% {
186
- height: 75px;
187
- width: 37.5px;
188
- opacity: 1;
189
- }
190
- }
191
- body{
192
- background-color: #e6e6e6;
193
- width: 100%;
194
- height: 100%;
195
- }
196
- #success_tic .page-body{
197
- max-width:300px;
198
- background-color:#FFFFFF;
199
- margin:10% auto;
200
- }
201
- #success_tic .page-body .head{
202
- text-align:center;
203
- }
204
- /* #success_tic .tic{
205
- font-size:186px;
206
- } */
207
- .close{
208
- opacity: 1;
209
- position: absolute;
210
- right: 0px;
211
- font-size: 30px;
212
- padding: 3px 15px;
213
- margin-bottom: 10px;
214
- float: right;
215
- font-size: 21px;
216
- font-weight: 700;
217
- line-height: 1;
218
- color: #000;
219
- text-shadow: 0 1px 0 #fff;
220
- }
221
-
222
- </style>
1
+
2
+ <div id="mo2f_2fa_intro" class = "modal" style="display: block;">
3
+ <div id="mo2f_2fa_intro_modal" class="modal-content" style="width: 40%;overflow: hidden;padding:50px;" >
4
+
5
+ <div class="modal-header" style="border-bottom: none;">
6
+ <h2 class="modal-title" style="text-align: center; font-size: 20px; color: #2980b9">
7
+ <span id="closeintromodal" class="close modal-span-close" onclick="skipintro();">X</span>
8
+ </h2>
9
+ </div>
10
+
11
+ <div class="modal-body" style="height: auto;">
12
+ <center>
13
+ <div class="checkmark-circle" >
14
+ <div class="background"></div>
15
+ <div class="checkmark draw"></div>
16
+ </div>
17
+ <h1>Awesome!!</h1>
18
+ <h2 style="color: black;font-size: 20px;">You are ready to use Two Factor.</h2>
19
+ </center>
20
+ <div >
21
+ <h3 style="color: black;display:none;" ><span style="color:red;">Logout</span> : You can logout and get the same experience as your users. </h3>
22
+
23
+ </div>
24
+ </div>
25
+
26
+ <div class="modal-footer" style="border: 0px;">
27
+ <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button readytogo mo2f_advance_setting" onclick="skipintro();">Advance Settings</button>
28
+ <button type="button" class="mo_wpns_button mo_wpns_button1 modal-button " style="margin-left: 5%;width: 40%;background-color:#2EB150;float: left;min-height: 54px;border: 2px solid black;" title="Logout and check the user experience" onclick="mo2f_userlogout()">Logout and Configure</button>
29
+ <div class="mo2f_tooltip_addon logout mo_wpns_button mo_wpns_button1 modal-button " style="float: left;border: 2px solid black;border-left:none;width: 6%;box-shadow: none;text-decoration:none;background-color: #2EB150;margin-left: -5px;min-height: 50px;">
30
+ <span class="dashicons dashicons-info mo2f_info_tab" style="color: white;font-size: 27px;margin-top: 14px;margin-left: -12px;"></span>
31
+ <span class="mo2f_tooltiptext_addon mo2f_logout_and_configure_info" style="font-size: 20px;font-family: auto; text-align: justify;font-weight: lighter;background-color: #2EB150; font-size: 20px;">
32
+ <ul style="list-style-type:square;margin: 10px 18px 10px 18px;"><li>This will logout you and will ask you to set your 2FA on next login.</li><li> New and existing users can set their 2FA on next login.</li></ul>
33
+ </span>
34
+ <span class="mo2f_tooltiptext_addon" style="color: #2EB150;background: none; margin-left: -200px; margin-top: -38px;">
35
+ <span class="dashicons dashicons-arrow-down" style="font-size: 300%;"></span>
36
+ </span>
37
+ </div>
38
+
39
+ </div>
40
+ </div>
41
+ </div>
42
+ <form name="f" id="mo2f_skiploginform" method="post" action="">
43
+ <input type="hidden" name="mo2f_skiplogin_nonce" value="<?php echo wp_create_nonce( 'miniorange-2-factor-skiplogin-failed-nonce' ); ?>"/>
44
+ <input type="hidden" name="option" value="mo2f_skiplogin"/>
45
+ </form>
46
+ <form name="f" id="mo2f_userlogoutform" method="post" action="">
47
+ <input type="hidden" name="mo2f_userlogout_nonce" value="<?php echo wp_create_nonce( 'miniorange-2-factor-userlogout-failed-nonce' ); ?>"/>
48
+ <input type="hidden" name="option" value="mo2f_userlogout"/>
49
+ </form>
50
+
51
+ <script>
52
+ function mo2f_userlogout() {
53
+ jQuery("#mo2f_userlogoutform").submit();
54
+ }
55
+
56
+ function skipintro() {
57
+ jQuery("#mo2f_skiploginform").submit();
58
+ }
59
+ </script>
60
+
61
+ <style>
62
+
63
+ .modalhover:hover{
64
+ border:2px solid #2EB150;
65
+ background: #2EB150 !important;
66
+ color:white !important;
67
+ }
68
+ .checkmark-circle {
69
+ width: 150px;
70
+ height: 150px;
71
+ position: relative;
72
+ display: inline-block;
73
+ vertical-align: top;
74
+ }
75
+ .checkmark-circle .background {
76
+ width: 150px;
77
+ height: 150px;
78
+ border-radius: 50%;
79
+ background: #2EB150;
80
+ position: absolute;
81
+ }
82
+ .checkmark-circle .checkmark {
83
+ border-radius: 5px;
84
+ }
85
+ .checkmark-circle .checkmark.draw:after {
86
+ -webkit-animation-delay: 100ms;
87
+ -moz-animation-delay: 100ms;
88
+ animation-delay: 100ms;
89
+ -webkit-animation-duration: 1s;
90
+ -moz-animation-duration: 1s;
91
+ animation-duration: 1s;
92
+ -webkit-animation-timing-function: ease;
93
+ -moz-animation-timing-function: ease;
94
+ animation-timing-function: ease;
95
+ -webkit-animation-name: checkmark;
96
+ -moz-animation-name: checkmark;
97
+ animation-name: checkmark;
98
+ -webkit-transform: scaleX(-1) rotate(130deg);
99
+ -moz-transform: scaleX(-1) rotate(130deg);
100
+ -ms-transform: scaleX(-1) rotate(130deg);
101
+ -o-transform: scaleX(-1) rotate(130deg);
102
+ transform: scaleX(-1) rotate(130deg);
103
+ -webkit-animation-fill-mode: forwards;
104
+ -moz-animation-fill-mode: forwards;
105
+ animation-fill-mode: forwards;
106
+ }
107
+ .checkmark-circle .checkmark:after {
108
+ opacity: 1;
109
+ height: 75px;
110
+ width: 37.5px;
111
+ -webkit-transform-origin: left top;
112
+ -moz-transform-origin: left top;
113
+ -ms-transform-origin: left top;
114
+ -o-transform-origin: left top;
115
+ transform-origin: left top;
116
+ border-right: 15px solid white;
117
+ border-top: 15px solid white;
118
+ border-radius: 2.5px !important;
119
+ content: '';
120
+ left: 25px;
121
+ top: 75px;
122
+ position: absolute;
123
+ }
124
+
125
+ @-webkit-keyframes checkmark {
126
+ 0% {
127
+ height: 0;
128
+ width: 0;
129
+ opacity: 1;
130
+ }
131
+ 20% {
132
+ height: 0;
133
+ width: 37.5px;
134
+ opacity: 1;
135
+ }
136
+ 40% {
137
+ height: 75px;
138
+ width: 37.5px;
139
+ opacity: 1;
140
+ }
141
+ 100% {
142
+ height: 75px;
143
+ width: 37.5px;
144
+ opacity: 1;
145
+ }
146
+ }
147
+ @-moz-keyframes checkmark {
148
+ 0% {
149
+ height: 0;
150
+ width: 0;
151
+ opacity: 1;
152
+ }
153
+ 20% {
154
+ height: 0;
155
+ width: 37.5px;
156
+ opacity: 1;
157
+ }
158
+ 40% {
159
+ height: 75px;
160
+ width: 37.5px;
161
+ opacity: 1;
162
+ }
163
+ 100% {
164
+ height: 75px;
165
+ width: 37.5px;
166
+ opacity: 1;
167
+ }
168
+ }
169
+ @keyframes checkmark {
170
+ 0% {
171
+ height: 0;
172
+ width: 0;
173
+ opacity: 1;
174
+ }
175
+ 20% {
176
+ height: 0;
177
+ width: 37.5px;
178
+ opacity: 1;
179
+ }
180
+ 40% {
181
+ height: 75px;
182
+ width: 37.5px;
183
+ opacity: 1;
184
+ }
185
+ 100% {
186
+ height: 75px;
187
+ width: 37.5px;
188
+ opacity: 1;
189
+ }
190
+ }
191
+ body{
192
+ background-color: #e6e6e6;
193
+ width: 100%;
194
+ height: 100%;
195
+ }
196
+ #success_tic .page-body{
197
+ max-width:300px;
198
+ background-color:#FFFFFF;
199
+ margin:10% auto;
200
+ }
201
+ #success_tic .page-body .head{
202
+ text-align:center;
203
+ }
204
+ /* #success_tic .tic{
205
+ font-size:186px;
206
+ } */
207
+ .close{
208
+ opacity: 1;
209
+ position: absolute;
210
+ right: 0px;
211
+ font-size: 30px;
212
+ padding: 3px 15px;
213
+ margin-bottom: 10px;
214
+ float: right;
215
+ font-size: 21px;
216
+ font-weight: 700;
217
+ line-height: 1;
218
+ color: #000;
219
+ text-shadow: 0 1px 0 #fff;
220
+ }
221
+
222
+ </style>
controllers/twofa/mo2fa_common_login.php CHANGED
@@ -51,13 +51,21 @@ function redirect_user_to( $user, $redirect_to ) {
51
  $redirectUrl = isset( $redirect_to ) && ! empty( $redirect_to ) ? $redirect_to : null;
52
  if ( $current_role == 'administrator' ) {
53
  $redirectUrl = empty( $redirectUrl ) ? admin_url() : $redirectUrl;
54
- wp_redirect( $redirectUrl );
55
  } else {
56
  $redirectUrl = empty( $redirectUrl ) ? home_url() : $redirectUrl;
57
- wp_redirect( $redirectUrl );
58
  }
 
 
 
 
 
 
 
 
 
59
  }
60
 
 
61
  // used in shortcode addon
62
 
63
  function miniorange_check_if_2fa_enabled_for_roles( $current_roles ) {
@@ -163,7 +171,7 @@ function mo2f_get_user_2ndfactor( $user ) {
163
  }
164
 
165
  function mo2f_get_forgotphone_form( $login_status, $login_message, $redirect_to, $session_id_encrypt ) {
166
- $mo2f_forgotphone_enabled = get_option( 'mo2f_enable_forgotphone' );
167
  $mo2f_email_as_backup_enabled = get_option( 'mo2f_enable_forgotphone_email' );
168
  $mo2f_kba_as_backup_enabled = get_option( 'mo2f_enable_forgotphone_kba' );
169
  ?>
@@ -249,8 +257,7 @@ function mo2f_get_forgotphone_form( $login_status, $login_message, $redirect_to,
249
 
250
  function mo2f_get_kba_authentication_prompt( $login_message, $redirect_to, $session_id_encrypt , $cookievalue) {
251
  $mo_wpns_config = new MoWpnsHandler();
252
-
253
- $mo2f_login_option = get_option( 'mo2f_login_option' );
254
  $mo2f_remember_device_enabled = get_option( 'mo2f_remember_device' );
255
  ?>
256
  <html>
@@ -342,6 +349,48 @@ function mo2f_get_kba_authentication_prompt( $login_message, $redirect_to, $sess
342
  function mologinback() {
343
  jQuery('#mo2f_backto_mo_loginform').submit();
344
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  </script>
346
  </body>
347
 
@@ -353,9 +402,9 @@ function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_
353
  $mo_wpns_config = new MoWpnsHandler();
354
 
355
  global $Mo2fdbQueries,$txid;
356
- $mo2f_enable_forgotphone = get_option( 'mo2f_enable_forgotphone' );
357
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $id );
358
- $mo2f_is_new_customer = get_option( 'mo2f_is_NC' );
359
  $mo2f_EV_txid = get_user_meta($id,'mo2f_EV_txid',true);
360
  if(!MO2F_IS_ONPREM)
361
  $mo2f_EV_txid = $_SESSION['mo2f_transactionId'];
@@ -478,8 +527,9 @@ function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_
478
  var timeout;
479
  var login_status = '<?php echo $login_status;?>';
480
  var calls = 0;
481
-
482
- if(login_status != "MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS")
 
483
  {
484
  pollPushValidation();
485
  function pollPushValidation()
@@ -565,9 +615,9 @@ function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_
565
  }
566
 
567
  function mo2f_get_qrcode_authentication_prompt( $login_status, $login_message, $redirect_to, $qrCode, $session_id_encrypt , $cookievalue) {
568
- $mo2f_enable_forgotphone = get_option( 'mo2f_enable_forgotphone' );
569
  $mo_wpns_config = new MoWpnsHandler();
570
- $mo2f_is_new_customer = get_option( 'mo2f_is_NC' );
571
  ?>
572
  <html>
573
  <head>
@@ -712,10 +762,10 @@ function mo2f_get_qrcode_authentication_prompt( $login_status, $login_message, $
712
  <?php
713
  }
714
 
715
- function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to,$session_id_encrypt,$user_id ) {
716
- $mo2f_enable_forgotphone = get_option( 'mo2f_enable_forgotphone' );
717
  $mo_wpns_config = new MoWpnsHandler();
718
- $mo2f_is_new_customer = get_option( 'mo2f_is_NC' );
719
  $attempts = get_option('mo2f_attempts_before_redirect', 3);
720
  ?>
721
  <html>
@@ -765,6 +815,17 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
765
  <input type="submit" name="miniorange_otp_token_submit" id="miniorange_otp_token_submit"
766
  class="miniorange_otp_token_submit"
767
  value="<?php echo mo2f_lt( 'Validate' ); ?>"/>
 
 
 
 
 
 
 
 
 
 
 
768
  <input type="hidden" name="request_origin_method" value="<?php echo $login_status; ?>"/>
769
  <input type="hidden" name="miniorange_soft_token_nonce"
770
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-soft-token-nonce' ); ?>"/>
@@ -772,7 +833,7 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
772
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
773
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
774
  </form>
775
- <?php
776
  $Kbaset = get_user_meta( $user_id ,'Security Questions' );
777
  if ( ! $mo2f_is_new_customer ) { ?>
778
  <?php if ( $mo2f_enable_forgotphone && isset( $login_status ) && $login_status != 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' && (sizeof($Kbaset) != 0 ) ) { ?>
@@ -792,13 +853,24 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
792
  </div>
793
  </div>
794
  </div>
 
 
 
 
 
 
 
 
 
 
 
795
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>"
796
  class="mo2f_display_none_forms">
797
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce"
798
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-mobile-validation-failed-nonce' ); ?>"/>
799
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
800
  </form>
801
- <?php if ( get_option( 'mo2f_enable_forgotphone' ) && isset( $login_status ) && $login_status != 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) { ?>
802
  <form name="f" id="mo2f_show_forgotphone_loginform" method="post" action="" class="mo2f_display_none_forms">
803
  <input type="hidden" name="request_origin_method" value="<?php echo $login_status; ?>"/>
804
  <input type="hidden" name="miniorange_forgotphone"
@@ -807,9 +879,14 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
807
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
808
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
809
  </form>
 
810
  <?php } ?>
811
 
812
  <script>
 
 
 
 
813
  function mologinback() {
814
  jQuery('#mo2f_backto_mo_loginform').submit();
815
  }
@@ -817,6 +894,41 @@ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $red
817
  function mologinforgotphone() {
818
  jQuery('#mo2f_show_forgotphone_loginform').submit();
819
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
820
  </script>
821
  </body>
822
  </html>
@@ -901,14 +1013,14 @@ function mo2f_get_device_form( $redirect_to, $session_id_encrypt ) {
901
  }
902
 
903
  function mo_check_device_confirm() {
904
- jQuery('#mo2f_device_content').hide();
905
- jQuery('#showLoadingBar').show();
906
  jQuery('#mo2f_trust_device_confirm_form').submit();
907
  }
908
 
909
  function mo_check_device_cancel() {
910
- jQuery('#mo2f_device_content').hide();
911
- jQuery('#showLoadingBar').show();
912
  jQuery('#mo2f_trust_device_cancel_form').submit();
913
  }
914
  </script>
51
  $redirectUrl = isset( $redirect_to ) && ! empty( $redirect_to ) ? $redirect_to : null;
52
  if ( $current_role == 'administrator' ) {
53
  $redirectUrl = empty( $redirectUrl ) ? admin_url() : $redirectUrl;
 
54
  } else {
55
  $redirectUrl = empty( $redirectUrl ) ? home_url() : $redirectUrl;
 
56
  }
57
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
58
+ $redirect = array(
59
+ 'redirect' => $redirectUrl,
60
+ ) ;
61
+
62
+ wp_send_json_success($redirect);
63
+ }
64
+ else
65
+ wp_redirect( $redirectUrl );
66
  }
67
 
68
+
69
  // used in shortcode addon
70
 
71
  function miniorange_check_if_2fa_enabled_for_roles( $current_roles ) {
171
  }
172
 
173
  function mo2f_get_forgotphone_form( $login_status, $login_message, $redirect_to, $session_id_encrypt ) {
174
+ $mo2f_forgotphone_enabled = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
175
  $mo2f_email_as_backup_enabled = get_option( 'mo2f_enable_forgotphone_email' );
176
  $mo2f_kba_as_backup_enabled = get_option( 'mo2f_enable_forgotphone_kba' );
177
  ?>
257
 
258
  function mo2f_get_kba_authentication_prompt( $login_message, $redirect_to, $session_id_encrypt , $cookievalue) {
259
  $mo_wpns_config = new MoWpnsHandler();
260
+ $mo2f_login_option = MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option');
 
261
  $mo2f_remember_device_enabled = get_option( 'mo2f_remember_device' );
262
  ?>
263
  <html>
349
  function mologinback() {
350
  jQuery('#mo2f_backto_mo_loginform').submit();
351
  }
352
+ var is_ajax = "<?php echo MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request');?>";
353
+ if(is_ajax){
354
+ jQuery('#mo2f_answer_1').keypress(function (e) {
355
+ if (e.which == 13) {//Enter key pressed
356
+ e.preventDefault();
357
+ mo2f_kba_ajax();
358
+ }
359
+ });
360
+ jQuery('#mo2f_answer_2').keypress(function (e) {
361
+ if (e.which == 13) {//Enter key pressed
362
+ e.preventDefault();
363
+ mo2f_kba_ajax();
364
+ }
365
+ });
366
+ jQuery("#miniorange_kba_validate").click(function(e){
367
+ e.preventDefault();
368
+ mo2f_kba_ajax();
369
+ });
370
+
371
+ function mo2f_kba_ajax(){
372
+ jQuery('#mo2f_answer_1').prop('disabled','true');
373
+ jQuery('#mo2f_answer_2').prop('disabled','true');
374
+ jQuery('#miniorange_kba_validate').prop('disabled','true');
375
+ var data = {
376
+ "action" : "mo2f_ajax",
377
+ "mo2f_ajax_option" : "mo2f_ajax_kba",
378
+ "mo2f_answer_1" : jQuery( "input[name=\'mo2f_answer_1\']" ).val(),
379
+ "mo2f_answer_2" : jQuery( "input[name=\'mo2f_answer_2\']" ).val(),
380
+ "miniorange_kba_nonce" : jQuery( "input[name=\'miniorange_kba_nonce\']" ).val(),
381
+ "session_id" : jQuery( "input[name=\'session_id\']" ).val(),
382
+ "redirect_to" : jQuery( "input[name=\'redirect_to\']" ).val(),
383
+ "mo2f_trust_device" : jQuery( "input[name=\'mo2f_trust_device\']" ).val(),
384
+ };
385
+ jQuery.post(my_ajax_object.ajax_url, data, function(response) {
386
+ if ( typeof response.data === "undefined") {
387
+ jQuery("html").html(response);
388
+ }
389
+ else
390
+ location.href = response.data.redirect;
391
+ });
392
+ }
393
+ }
394
  </script>
395
  </body>
396
 
402
  $mo_wpns_config = new MoWpnsHandler();
403
 
404
  global $Mo2fdbQueries,$txid;
405
+ $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
406
  $mo2f_KBA_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $id );
407
+ $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
408
  $mo2f_EV_txid = get_user_meta($id,'mo2f_EV_txid',true);
409
  if(!MO2F_IS_ONPREM)
410
  $mo2f_EV_txid = $_SESSION['mo2f_transactionId'];
527
  var timeout;
528
  var login_status = '<?php echo $login_status;?>';
529
  var calls = 0;
530
+ var onprem = '<?php echo MO2F_IS_ONPREM; ?>';
531
+
532
+ if(login_status != "MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS" && onprem ==1)
533
  {
534
  pollPushValidation();
535
  function pollPushValidation()
615
  }
616
 
617
  function mo2f_get_qrcode_authentication_prompt( $login_status, $login_message, $redirect_to, $qrCode, $session_id_encrypt , $cookievalue) {
618
+ $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
619
  $mo_wpns_config = new MoWpnsHandler();
620
+ $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
621
  ?>
622
  <html>
623
  <head>
762
  <?php
763
  }
764
 
765
+ function mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to,$session_id_encrypt,$user_id,$show_back_button =null ) {
766
+ $mo2f_enable_forgotphone = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option');
767
  $mo_wpns_config = new MoWpnsHandler();
768
+ $mo2f_is_new_customer = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
769
  $attempts = get_option('mo2f_attempts_before_redirect', 3);
770
  ?>
771
  <html>
815
  <input type="submit" name="miniorange_otp_token_submit" id="miniorange_otp_token_submit"
816
  class="miniorange_otp_token_submit"
817
  value="<?php echo mo2f_lt( 'Validate' ); ?>"/>
818
+ <?php
819
+
820
+ if($show_back_button == 1)
821
+ {
822
+ ?>
823
+ <input type="button" name="miniorange_otp_token_back" id="miniorange_otp_token_back"
824
+ class="miniorange_otp_token_submit"
825
+ value="<?php echo mo2f_lt( 'Back' ); ?>"/>
826
+ <?php
827
+ }
828
+ ?>
829
  <input type="hidden" name="request_origin_method" value="<?php echo $login_status; ?>"/>
830
  <input type="hidden" name="miniorange_soft_token_nonce"
831
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-soft-token-nonce' ); ?>"/>
833
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
834
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
835
  </form>
836
+ <?php
837
  $Kbaset = get_user_meta( $user_id ,'Security Questions' );
838
  if ( ! $mo2f_is_new_customer ) { ?>
839
  <?php if ( $mo2f_enable_forgotphone && isset( $login_status ) && $login_status != 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' && (sizeof($Kbaset) != 0 ) ) { ?>
853
  </div>
854
  </div>
855
  </div>
856
+
857
+ <form name="f" id="mo2f_backto_inline_registration" method="post" action="<?php echo wp_login_url(); ?>"
858
+ class="mo2f_display_none_forms">
859
+ <input type="hidden" name="miniorange_back_inline_reg_nonce"
860
+ value="<?php echo wp_create_nonce( 'miniorange-2-factor-back-inline-reg-nonce' ); ?>"/>
861
+ <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
862
+ <input type="hidden" name="option" value="miniorange2f_back_to_inline_registration">
863
+ <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
864
+
865
+ </form>
866
+
867
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>"
868
  class="mo2f_display_none_forms">
869
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce"
870
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-mobile-validation-failed-nonce' ); ?>"/>
871
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
872
  </form>
873
+ <?php if ( MoWpnsUtility::get_mo2f_db_option('mo2f_enable_forgotphone', 'get_option') && isset( $login_status ) && $login_status != 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) { ?>
874
  <form name="f" id="mo2f_show_forgotphone_loginform" method="post" action="" class="mo2f_display_none_forms">
875
  <input type="hidden" name="request_origin_method" value="<?php echo $login_status; ?>"/>
876
  <input type="hidden" name="miniorange_forgotphone"
879
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
880
  <input type="hidden" name="session_id" value="<?php echo $session_id_encrypt; ?>"/>
881
  </form>
882
+
883
  <?php } ?>
884
 
885
  <script>
886
+ jQuery('#miniorange_otp_token_back').click(function(){
887
+ jQuery('#mo2f_backto_inline_registration').submit();
888
+ });
889
+
890
  function mologinback() {
891
  jQuery('#mo2f_backto_mo_loginform').submit();
892
  }
894
  function mologinforgotphone() {
895
  jQuery('#mo2f_show_forgotphone_loginform').submit();
896
  }
897
+ var is_ajax = '<?php echo MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request');?>';
898
+ if(is_ajax){
899
+ jQuery('#mo2fa_softtoken').keypress(function (e) {
900
+ if (e.which == 13) {//Enter key pressed
901
+ e.preventDefault();
902
+ mo2f_otp_ajax();
903
+ }
904
+ });
905
+ jQuery("#miniorange_otp_token_submit").click(function(e){
906
+ e.preventDefault();
907
+ mo2f_otp_ajax();
908
+ });
909
+
910
+ function mo2f_otp_ajax(){
911
+ jQuery('#mo2fa_softtoken').prop('disabled','true');
912
+ jQuery('#miniorange_otp_token_submit').prop('disabled','true');
913
+ var data = {
914
+ "action" : "mo2f_ajax",
915
+ "mo2f_ajax_option" : "mo2f_ajax_otp",
916
+ "mo2fa_softtoken" : jQuery( "input[name=\'mo2fa_softtoken\']" ).val(),
917
+ "miniorange_soft_token_nonce" : jQuery( "input[name=\'miniorange_soft_token_nonce\']" ).val(),
918
+ "session_id" : jQuery( "input[name=\'session_id\']" ).val(),
919
+ "redirect_to" : jQuery( "input[name=\'redirect_to\']" ).val(),
920
+ "request_origin_method" : jQuery( "input[name=\'request_origin_method\']" ).val(),
921
+ };
922
+ jQuery.post(my_ajax_object.ajax_url, data, function(response) {
923
+ if(typeof response.data === "undefined")
924
+ jQuery("html").html(response);
925
+ else if(response.data.reload)
926
+ location.reload( true );
927
+ else
928
+ location.href = response.data.redirect;
929
+ });
930
+ }
931
+ }
932
  </script>
933
  </body>
934
  </html>
1013
  }
1014
 
1015
  function mo_check_device_confirm() {
1016
+ jQuery('#mo2f_device_content').css("display", "none");
1017
+ jQuery('#showLoadingBar').css("display", "block");
1018
  jQuery('#mo2f_trust_device_confirm_form').submit();
1019
  }
1020
 
1021
  function mo_check_device_cancel() {
1022
+ jQuery('#mo2f_device_content').css("display", "none");
1023
+ jQuery('#showLoadingBar').css("display", "block");
1024
  jQuery('#mo2f_trust_device_cancel_form').submit();
1025
  }
1026
  </script>
controllers/twofa/mo2fa_inline_registration.php CHANGED
@@ -170,15 +170,13 @@ function prompt_user_to_select_2factor_mthod_inline($current_user_id, $login_sta
170
  </label>
171
  <br>
172
  </span>
173
- <span class="<?php if( !(in_array("OTP_OVER_EMAIL", $opt)) ){ echo "mo2f_td_hide"; }else { echo "mo2f_td_hide"; }?>">
174
  <label title="<?php echo __('You will receive a one time passcode on your email. You have to enter the otp on your screen to login. Supported in Smartphones, Feature Phones.', 'miniorange-2-factor-authentication'); ?>" >
175
  <input type="radio" name="mo2f_selected_2factor_method" value="OTP OVER EMAIL" />
176
  <?php echo __('OTP Over Email', 'miniorange-2-factor-authentication'); ?>
177
  </label>
178
  </span>
179
- <?php //if(isset($login_message) && !empty($login_message)){ ?>
180
  <br><a href="#skiptwofactor" style="color:#F4D03F ;font-weight:bold;margin-left:35%;"><?php echo __('Skip Two Factor', 'miniorange-2-factor-authentication'); ?></a>>>
181
- <?php//} ?>
182
  <br />
183
  <?php mo2f_customize_logo() ?>
184
  </div>
@@ -195,7 +193,7 @@ function prompt_user_to_select_2factor_mthod_inline($current_user_id, $login_sta
195
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
196
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
197
  </form>
198
- <!-- --><?php //if(isset($login_message) && !empty($login_message)){ ?>
199
  <form name="f" id="mo2f_skip_loginform" method="post" action="" style="display:none;">
200
  <input type="hidden" name="option" value="mo2f_skip_2fa_setup" />
201
  <input type="hidden" name="miniorange_skip_2fa_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-skip-nonce'); ?>" />
@@ -203,8 +201,7 @@ function prompt_user_to_select_2factor_mthod_inline($current_user_id, $login_sta
203
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
204
 
205
  </form>
206
- <!-- --><?php //} ?>
207
- </body>
208
  <script>
209
  function mologinback(){
210
  jQuery('#mo2f_backto_mo_loginform').submit();
@@ -219,6 +216,7 @@ function prompt_user_to_select_2factor_mthod_inline($current_user_id, $login_sta
219
  jQuery('#mo2f_skip_loginform').submit();
220
  });
221
  </script>
 
222
  </html>
223
  <?php
224
  }
@@ -340,7 +338,7 @@ function mo2f_inline_email_form($email,$current_user_id)
340
  <input type="hidden" name="miniorange_skip_2fa" value="<?php echo wp_create_nonce('miniorange-2-factor-skip-nonce'); ?>" />
341
  </form>
342
  <?php } ?>
343
- </body>
344
  <script type="text/javascript">
345
  jQuery('#save_entered_email_inlinecloud1').click(function(){
346
  var email = jQuery('#emailInlineCloud').val();
@@ -373,6 +371,7 @@ function mo2f_inline_email_form($email,$current_user_id)
373
 
374
 
375
  </script>
 
376
 
377
  <?php
378
  }
@@ -625,7 +624,7 @@ function prompt_user_for_google_authenticator_setup($current_user_id, $login_sta
625
  <input type="hidden" name="google_phone_type" />
626
  <input type="hidden" name="mo2f_inline_ga_phone_type_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-inline-ga-phone-type-nonce'); ?>" />
627
  </form>
628
- </body>
629
  <script>
630
  jQuery('#authenticator_type').change(function(){
631
  var auth_type = jQuery(this).val();
@@ -675,6 +674,7 @@ function prompt_user_for_google_authenticator_setup($current_user_id, $login_sta
675
  jQuery("#mo2f_scanbarcode_a").toggle();
676
  });
677
  </script>
 
678
  <?php
679
  echo '<head>';
680
  echo '<script type="text/javascript" src="'.plugins_url( "/includes/jquery-qrcode/jquery-qrcode.js", dirname(dirname(__FILE__ ))).'"></script>';
@@ -827,7 +827,7 @@ function prompt_user_for_kba_setup($current_user_id, $login_status, $login_messa
827
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
828
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
829
  </form>
830
- </body>
831
  <script>
832
 
833
 
@@ -843,6 +843,7 @@ function prompt_user_for_kba_setup($current_user_id, $login_status, $login_messa
843
  jQuery('#mo2f_goto_two_factor_form').submit();
844
  }
845
  </script>
 
846
  </html>
847
  <?php
848
  }function prompt_user_for_miniorange_register($current_user_id, $login_status, $login_message){
@@ -940,7 +941,7 @@ function prompt_user_for_kba_setup($current_user_id, $login_status, $login_messa
940
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
941
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
942
  </form>
943
- </body>
944
  <script>
945
  jQuery('#mo2f_inline_back_btn').click(function() {
946
  jQuery('#mo2f_goto_two_factor_form').submit();
@@ -957,6 +958,7 @@ function prompt_user_for_kba_setup($current_user_id, $login_status, $login_messa
957
  jQuery('#mo2f_backto_mo_loginform').submit();
958
  }
959
  </script>
 
960
  </html>
961
  <?php
962
  }
@@ -1073,12 +1075,13 @@ function prompt_user_for_setup_success($id, $login_status, $login_message){
1073
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
1074
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
1075
  </form>
1076
- </body>
1077
  <script>
1078
  function mologinback(){
1079
  jQuery('#mo2f_backto_mo_loginform').submit();
1080
  }
1081
  </script>
 
1082
  </html>
1083
  <?php
1084
  }
@@ -1205,7 +1208,6 @@ $current_user = get_userdata($current_user_id);
1205
  <input type="hidden" name="miniorange_inline_two_factor_setup" value="<?php echo wp_create_nonce('miniorange-2-factor-inline-setup-nonce'); ?>" />
1206
  </form>
1207
  <?php } ?>
1208
- </body>
1209
  <script>
1210
  jQuery("#phone").intlTelInput();
1211
  function mologinback(){
@@ -1218,6 +1220,8 @@ $current_user = get_userdata($current_user_id);
1218
  jQuery('#mo2fa_inline_resend_otp_form').submit();
1219
  });
1220
  </script>
 
 
1221
  </html>
1222
  <?php
1223
  }
170
  </label>
171
  <br>
172
  </span>
173
+ <span class="<?php if( !(in_array("OTP_OVER_EMAIL", $opt)) ){ echo "mo2f_td_hide"; }else { echo "mo2f_td_show"; }?>">
174
  <label title="<?php echo __('You will receive a one time passcode on your email. You have to enter the otp on your screen to login. Supported in Smartphones, Feature Phones.', 'miniorange-2-factor-authentication'); ?>" >
175
  <input type="radio" name="mo2f_selected_2factor_method" value="OTP OVER EMAIL" />
176
  <?php echo __('OTP Over Email', 'miniorange-2-factor-authentication'); ?>
177
  </label>
178
  </span>
 
179
  <br><a href="#skiptwofactor" style="color:#F4D03F ;font-weight:bold;margin-left:35%;"><?php echo __('Skip Two Factor', 'miniorange-2-factor-authentication'); ?></a>>>
 
180
  <br />
181
  <?php mo2f_customize_logo() ?>
182
  </div>
193
  <input type="hidden" name="redirect_to" value="<?php echo $redirect_to; ?>"/>
194
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
195
  </form>
196
+
197
  <form name="f" id="mo2f_skip_loginform" method="post" action="" style="display:none;">
198
  <input type="hidden" name="option" value="mo2f_skip_2fa_setup" />
199
  <input type="hidden" name="miniorange_skip_2fa_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-skip-nonce'); ?>" />
201
  <input type="hidden" name="session_id" value="<?php echo $session_id; ?>"/>
202
 
203
  </form>
204
+
 
205
  <script>
206
  function mologinback(){
207
  jQuery('#mo2f_backto_mo_loginform').submit();
216
  jQuery('#mo2f_skip_loginform').submit();
217
  });
218
  </script>
219
+ </body>
220
  </html>
221
  <?php
222
  }
338
  <input type="hidden" name="miniorange_skip_2fa" value="<?php echo wp_create_nonce('miniorange-2-factor-skip-nonce'); ?>" />
339
  </form>
340
  <?php } ?>
341
+
342
  <script type="text/javascript">
343
  jQuery('#save_entered_email_inlinecloud1').click(function(){
344
  var email = jQuery('#emailInlineCloud').val();
371
 
372
 
373
  </script>
374
+ </body>
375
 
376
  <?php
377
  }
624
  <input type="hidden" name="google_phone_type" />
625
  <input type="hidden" name="mo2f_inline_ga_phone_type_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-inline-ga-phone-type-nonce'); ?>" />
626
  </form>
627
+
628
  <script>
629
  jQuery('#authenticator_type').change(function(){
630
  var auth_type = jQuery(this).val();
674
  jQuery("#mo2f_scanbarcode_a").toggle();
675
  });
676
  </script>
677
+ </body>
678
  <?php
679
  echo '<head>';
680
  echo '<script type="text/javascript" src="'.plugins_url( "/includes/jquery-qrcode/jquery-qrcode.js", dirname(dirname(__FILE__ ))).'"></script>';
827
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
828
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
829
  </form>
830
+
831
  <script>
832
 
833
 
843
  jQuery('#mo2f_goto_two_factor_form').submit();
844
  }
845
  </script>
846
+ </body>
847
  </html>
848
  <?php
849
  }function prompt_user_for_miniorange_register($current_user_id, $login_status, $login_message){
941
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
942
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
943
  </form>
944
+
945
  <script>
946
  jQuery('#mo2f_inline_back_btn').click(function() {
947
  jQuery('#mo2f_goto_two_factor_form').submit();
958
  jQuery('#mo2f_backto_mo_loginform').submit();
959
  }
960
  </script>
961
+ </body>
962
  </html>
963
  <?php
964
  }
1075
  <form name="f" id="mo2f_backto_mo_loginform" method="post" action="<?php echo wp_login_url(); ?>" style="display:none;">
1076
  <input type="hidden" name="miniorange_mobile_validation_failed_nonce" value="<?php echo wp_create_nonce('miniorange-2-factor-mobile-validation-failed-nonce'); ?>" />
1077
  </form>
1078
+
1079
  <script>
1080
  function mologinback(){
1081
  jQuery('#mo2f_backto_mo_loginform').submit();
1082
  }
1083
  </script>
1084
+ </body>
1085
  </html>
1086
  <?php
1087
  }
1208
  <input type="hidden" name="miniorange_inline_two_factor_setup" value="<?php echo wp_create_nonce('miniorange-2-factor-inline-setup-nonce'); ?>" />
1209
  </form>
1210
  <?php } ?>
 
1211
  <script>
1212
  jQuery("#phone").intlTelInput();
1213
  function mologinback(){
1220
  jQuery('#mo2fa_inline_resend_otp_form').submit();
1221
  });
1222
  </script>
1223
+ </body>
1224
+
1225
  </html>
1226
  <?php
1227
  }
controllers/twofa/setup_twofa.php CHANGED
@@ -1,35 +1,38 @@
1
- <?php
2
-
3
- $email_registered = 1;
4
- global $Mo2fdbQueries;
5
- $email =$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', get_current_user_id() );
6
- if(isset($email))
7
- $email_registered = 1;
8
- else
9
- $email_registered = 0;
10
-
11
- $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
12
-
13
- if(current_user_can( 'manage_options' ) && isset($_POST['option']))
14
- {
15
- switch($_POST['option'])
16
- {
17
- case "mo2f_enable_2FA_on_login_page_option":
18
- wpns_handle_enable_2fa_login_prompt($_POST); break;
19
- }
20
- }
21
-
22
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'setup_twofa.php';
23
-
24
- function wpns_handle_enable_2fa_login_prompt($postvalue)
25
- {
26
- if( get_option( 'mo2f_enable_2fa_prompt_on_login_page' ) == 1 )
27
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_ON_LOGIN_PROMPT_ENABLED'),'SUCCESS');
28
- else{
29
- if(isset($postvalue['mo2f_enable_2fa_prompt_on_login_page'])){
30
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_PROMPT_LOGIN_PAGE'),'ERROR');
31
- }else{
32
- do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_ON_LOGIN_PROMPT_DISABLED'),'ERROR');
33
- }
34
- }
35
- }
 
 
 
1
+ <?php
2
+
3
+ $email_registered = 1;
4
+ global $Mo2fdbQueries;
5
+ $email =$Mo2fdbQueries->get_user_detail( 'mo2f_user_email', get_current_user_id() );
6
+ if($email == '' or !isset($email))
7
+ $email = wp_get_current_user()->user_email;
8
+
9
+ if(isset($email))
10
+ $email_registered = 1;
11
+ else
12
+ $email_registered = 0;
13
+
14
+ $upgrade_url = add_query_arg(array('page' => 'mo_2fa_upgrade' ), $_SERVER['REQUEST_URI']);
15
+
16
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
17
+ {
18
+ switch($_POST['option'])
19
+ {
20
+ case "mo2f_enable_2FA_on_login_page_option":
21
+ wpns_handle_enable_2fa_login_prompt($_POST); break;
22
+ }
23
+ }
24
+
25
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'setup_twofa.php';
26
+
27
+ function wpns_handle_enable_2fa_login_prompt($postvalue)
28
+ {
29
+ if( MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'get_option') == 1 )
30
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_ON_LOGIN_PROMPT_ENABLED'),'SUCCESS');
31
+ else{
32
+ if(isset($postvalue['mo2f_enable_2fa_prompt_on_login_page'])){
33
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_PROMPT_LOGIN_PAGE'),'ERROR');
34
+ }else{
35
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWO_FA_ON_LOGIN_PROMPT_DISABLED'),'ERROR');
36
+ }
37
+ }
38
+ }
controllers/twofa/two_fa.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php
2
-
3
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa.php';
4
  update_site_option('mo2f_two_factor',true);
1
+ <?php
2
+
3
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa.php';
4
  update_site_option('mo2f_two_factor',true);
controllers/twofa/two_fa_addon.php CHANGED
@@ -1,5 +1,5 @@
1
- <?php
2
- global $Mo2fdbQueries;
3
- $current_user = wp_get_current_user();
4
- $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
5
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_addon.php';
1
+ <?php
2
+ global $Mo2fdbQueries;
3
+ $current_user = wp_get_current_user();
4
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
5
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_addon.php';
controllers/twofa/two_fa_custom_form.php CHANGED
@@ -1,2 +1,9 @@
1
  <?php
2
- include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_custom_form.php';
 
 
 
 
 
 
 
1
  <?php
2
+
3
+ $is_woocommerce = get_site_option('mo2f_custom_reg_wocommerce');
4
+ $is_bbpress = get_site_option('mo2f_custom_reg_bbpress');
5
+ $is_any_of_woo_bb = $is_woocommerce || $is_bbpress;
6
+ $is_custom = get_site_option('mo2f_custom_reg_custom');
7
+ $is_registered = get_site_option('mo2f_customerkey');
8
+
9
+ include_once $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_custom_form.php';
controllers/twofa/two_fa_premium_feature.php CHANGED
@@ -1,3 +1,3 @@
1
- <?php
2
-
3
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_premium_feature.php';
1
+ <?php
2
+
3
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_premium_feature.php';
controllers/twofa/two_factor_ajax.php CHANGED
@@ -6,7 +6,7 @@ class mo_2f_ajax
6
  add_action( 'admin_init' , array( $this, 'mo_2f_two_factor' ) );
7
  }
8
 
9
- function mo_2f_two_factor(){
10
  add_action( 'wp_ajax_mo_two_factor_ajax', array($this,'mo_two_factor_ajax') );
11
  }
12
 
@@ -25,13 +25,95 @@ class mo_2f_ajax
25
  case 'mo2f_role_based_2_factor':
26
  $this->mo2f_role_based_2_factor();break;
27
  case 'mo2f_enable_disable_twofactor':
28
- $this->mo2f_enable_disable_twofactor(); break;
29
  case 'mo2f_enable_disable_inline':
30
  $this->mo2f_enable_disable_inline(); break;
31
  case 'mo2f_shift_to_onprem':
32
  $this->mo2f_shift_to_onprem();break;
 
 
 
33
  }
34
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  function mo2f_check_user_exist_miniOrange()
36
  {
37
  $nonce = sanitize_text_field($_POST['nonce']);
@@ -54,16 +136,16 @@ class mo_2f_ajax
54
  $email = $user->user_email;
55
 
56
 
57
-
58
  if(isset($_POST['email']))
59
  {
60
  $email = sanitize_text_field($_POST['email']);
61
  }
62
-
63
  $enduser = new Two_Factor_Setup();
64
  $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
65
-
66
-
67
  if(strcasecmp($check_user['status'], 'USER_FOUND_UNDER_DIFFERENT_CUSTOMER') == 0 ){
68
  echo "alreadyExist";
69
  exit;
@@ -83,7 +165,7 @@ function mo2f_shift_to_onprem(){
83
  $current_userID = $current_user->ID;
84
  $miniorangeID = get_option( 'mo2f_miniorange_admin' );
85
  if(is_null($miniorangeID) or $miniorangeID =='')
86
- $is_customer_admin = true;
87
  else
88
  $is_customer_admin = $miniorangeID == $current_userID ? true : false;
89
  if($is_customer_admin)
@@ -96,9 +178,9 @@ function mo2f_shift_to_onprem(){
96
  {
97
  $adminUser = get_user_by('id',$miniorangeID);
98
  $email = $adminUser->user_email;
99
- wp_send_json($email);
100
  }
101
-
102
  }
103
 
104
 
@@ -109,7 +191,6 @@ function mo2f_shift_to_onprem(){
109
  $error = new WP_Error();
110
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
111
 
112
- //return $error;
113
  }
114
 
115
  $enable = sanitize_text_field($_POST['mo2f_enable_2fa']);
@@ -119,7 +200,7 @@ function mo2f_shift_to_onprem(){
119
  }
120
  else{
121
  update_site_option('mo2f_activate_plugin' , false);
122
- wp_send_json('false');
123
  }
124
  }
125
 
@@ -136,7 +217,7 @@ function mo2f_shift_to_onprem(){
136
  }
137
  else{
138
  update_site_option('mo2f_inline_registration' , 0);
139
- wp_send_json('false');
140
  }
141
  }
142
 
@@ -159,7 +240,7 @@ function mo2f_shift_to_onprem(){
159
  $enabledrole = array();
160
  }
161
  foreach($enabledrole as $role){
162
- update_option($role, 1);
163
  }
164
  wp_send_json('true');
165
  return;
@@ -177,10 +258,10 @@ function mo2f_shift_to_onprem(){
177
  $current_userID = $current_user->ID;
178
  $miniorangeID = get_option( 'mo2f_miniorange_admin' );
179
  $is_customer_admin = $miniorangeID == $current_userID ? true : false;
180
-
181
  if(is_null($miniorangeID) or $miniorangeID =='')
182
  $is_customer_admin = true;
183
-
184
  if($is_customer_admin)
185
  {
186
  update_option('is_onprem', 0);
@@ -190,14 +271,14 @@ function mo2f_shift_to_onprem(){
190
  {
191
  $adminUser = get_user_by('id',$miniorangeID);
192
  $email = $adminUser->user_email;
193
- wp_send_json($email);
194
  }
195
-
196
  }
197
  }
198
 
199
  function mo2f_unlimitted_user()
200
- {
201
  if(!wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce'))
202
  {
203
  echo "NonceDidNotMatch";
@@ -224,13 +305,13 @@ function mo2f_shift_to_onprem(){
224
  else
225
  {
226
  echo "OnPremiseDeactive";
227
- exit;
228
  }
229
  }
230
  }
231
  function mo2f_save_email_verification()
232
- {
233
-
234
  if(!wp_verify_nonce($_POST['nonce'],'EmailVerificationSaveNonce'))
235
  {
236
  echo "NonceDidNotMatch";
@@ -247,25 +328,37 @@ function mo2f_shift_to_onprem(){
247
  {
248
  $twofactor_transactions = new Mo2fDB;
249
  $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user_id);
250
-
251
  if($exceeded){
252
  echo "USER_LIMIT_EXCEEDED";
253
  exit;
254
  }
255
  }
256
- if (!filter_var($email, FILTER_VALIDATE_EMAIL))
257
  {
258
  $error = true;
259
  }
260
  if($email!='' && !$error)
261
  {
262
  global $Mo2fdbQueries;
263
- $Mo2fdbQueries->update_user_details(get_current_user_id(),array(
 
 
264
  'mo2f_EmailVerification_config_status'=>true,
265
  'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
266
  'mo2f_configured_2FA_method'=>"Email Verification",
267
  'mo2f_user_email' => $email
268
- ));
 
 
 
 
 
 
 
 
 
 
269
  echo "settingsSaved";
270
  exit;
271
  }
@@ -276,14 +369,14 @@ function mo2f_shift_to_onprem(){
276
  }
277
 
278
  }
279
-
280
  }
281
  function CheckEVStatus()
282
  {
283
  if(isset($_POST['txid']))
284
  {
285
  $txid = sanitize_text_field($_POST['txid']);
286
- $status = get_site_option($_POST['txid']);
287
  if($status ==1 || $status ==0)
288
  delete_site_option($_POST['txid']);
289
  echo $status;
@@ -295,6 +388,6 @@ function mo2f_shift_to_onprem(){
295
 
296
 
297
  }
298
-
299
  new mo_2f_ajax;
300
  ?>
6
  add_action( 'admin_init' , array( $this, 'mo_2f_two_factor' ) );
7
  }
8
 
9
+ function mo_2f_two_factor(){
10
  add_action( 'wp_ajax_mo_two_factor_ajax', array($this,'mo_two_factor_ajax') );
11
  }
12
 
25
  case 'mo2f_role_based_2_factor':
26
  $this->mo2f_role_based_2_factor();break;
27
  case 'mo2f_enable_disable_twofactor':
28
+ $this->mo2f_enable_disable_twofactor(); break;
29
  case 'mo2f_enable_disable_inline':
30
  $this->mo2f_enable_disable_inline(); break;
31
  case 'mo2f_shift_to_onprem':
32
  $this->mo2f_shift_to_onprem();break;
33
+ case 'mo2f_save_custom_form_settings':
34
+ $this ->mo2f_save_custom_form_settings();
35
+ break;
36
  }
37
  }
38
+ function mo2f_save_custom_form_settings()
39
+ {
40
+
41
+ $customForm = false;
42
+ $nonce = sanitize_text_field($_POST['mo2f_nonce_save_form_settings']);
43
+
44
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-nonce-save-form-settings' ) ) {
45
+ $error = new WP_Error();
46
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
47
+ //return $error;
48
+ }
49
+ if(isset($_POST['submit_selector']) and
50
+ isset($_POST['email_selector']) and
51
+ isset($_POST['authType']) and
52
+ isset($_POST['customForm']) and
53
+ isset($_POST['form_selector']) and
54
+
55
+ $_POST['submit_selector']!="" and
56
+ $_POST['email_selector']!="" and
57
+ $_POST['customForm']!="" and
58
+ $_POST['form_selector']!="")
59
+ {
60
+ $submit_selector = sanitize_text_field($_POST['submit_selector']);
61
+ $form_selector = sanitize_text_field($_POST['form_selector']);
62
+ $email_selector = sanitize_text_field($_POST['email_selector']);
63
+ $phone_selector = sanitize_text_field($_POST['phone_selector']);
64
+ $authType = sanitize_text_field($_POST['authType']);
65
+ $customForm = sanitize_text_field( $_POST['customForm']);
66
+ $enableShortcode = sanitize_text_field($_POST['enableShortcode']);
67
+
68
+ switch ($form_selector)
69
+ {
70
+ case '.bbp-login-form':
71
+ update_site_option('mo2f_custom_reg_bbpress',true);
72
+ update_site_option('mo2f_custom_reg_wocommerce',false);
73
+ update_site_option('mo2f_custom_reg_custom',false);
74
+ break;
75
+ case '.woocommerce-form woocommerce-form-register':
76
+ update_site_option('mo2f_custom_reg_bbpress',false);
77
+ update_site_option('mo2f_custom_reg_wocommerce',true);
78
+ update_site_option('mo2f_custom_reg_custom',false);
79
+ break;
80
+ default:
81
+ update_site_option('mo2f_custom_reg_bbpress',false);
82
+ update_site_option('mo2f_custom_reg_wocommerce',false);
83
+ update_site_option('mo2f_custom_reg_custom',true);
84
+ }
85
+
86
+ update_site_option('mo2f_custom_form_name', $form_selector);
87
+ update_site_option('mo2f_custom_email_selector', $email_selector);
88
+ update_site_option('mo2f_custom_phone_selector', $phone_selector);
89
+ update_site_option('mo2f_custom_submit_selector', $submit_selector);
90
+ update_site_option('mo2f_custom_auth_type', $authType);
91
+
92
+ update_site_option('enable_form_shortcode',$enableShortcode);
93
+ $saved = true;
94
+ }
95
+ else
96
+ {
97
+ $submit_selector = 'NA';
98
+ $form_selector = 'NA';
99
+ $email_selector = 'NA';
100
+ $authType ='NA';
101
+ $saved = false;
102
+ }
103
+ $return = array(
104
+ 'authType' => $authType,
105
+ 'submit' => $submit_selector,
106
+ 'emailSelector' => $email_selector,
107
+ 'phone_selector' => $phone_selector,
108
+ 'form' => $form_selector,
109
+ 'saved' => $saved,
110
+ 'customForm' => $customForm,
111
+ 'enableShortcode' => $enableShortcode
112
+ );
113
+
114
+ return wp_send_json($return);
115
+ }
116
+
117
  function mo2f_check_user_exist_miniOrange()
118
  {
119
  $nonce = sanitize_text_field($_POST['nonce']);
136
  $email = $user->user_email;
137
 
138
 
139
+
140
  if(isset($_POST['email']))
141
  {
142
  $email = sanitize_text_field($_POST['email']);
143
  }
144
+
145
  $enduser = new Two_Factor_Setup();
146
  $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
147
+
148
+
149
  if(strcasecmp($check_user['status'], 'USER_FOUND_UNDER_DIFFERENT_CUSTOMER') == 0 ){
150
  echo "alreadyExist";
151
  exit;
165
  $current_userID = $current_user->ID;
166
  $miniorangeID = get_option( 'mo2f_miniorange_admin' );
167
  if(is_null($miniorangeID) or $miniorangeID =='')
168
+ $is_customer_admin = true;
169
  else
170
  $is_customer_admin = $miniorangeID == $current_userID ? true : false;
171
  if($is_customer_admin)
178
  {
179
  $adminUser = get_user_by('id',$miniorangeID);
180
  $email = $adminUser->user_email;
181
+ wp_send_json($email);
182
  }
183
+
184
  }
185
 
186
 
191
  $error = new WP_Error();
192
  $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
193
 
 
194
  }
195
 
196
  $enable = sanitize_text_field($_POST['mo2f_enable_2fa']);
200
  }
201
  else{
202
  update_site_option('mo2f_activate_plugin' , false);
203
+ wp_send_json('false');
204
  }
205
  }
206
 
217
  }
218
  else{
219
  update_site_option('mo2f_inline_registration' , 0);
220
+ wp_send_json('false');
221
  }
222
  }
223
 
240
  $enabledrole = array();
241
  }
242
  foreach($enabledrole as $role){
243
+ update_option($role, 1);
244
  }
245
  wp_send_json('true');
246
  return;
258
  $current_userID = $current_user->ID;
259
  $miniorangeID = get_option( 'mo2f_miniorange_admin' );
260
  $is_customer_admin = $miniorangeID == $current_userID ? true : false;
261
+
262
  if(is_null($miniorangeID) or $miniorangeID =='')
263
  $is_customer_admin = true;
264
+
265
  if($is_customer_admin)
266
  {
267
  update_option('is_onprem', 0);
271
  {
272
  $adminUser = get_user_by('id',$miniorangeID);
273
  $email = $adminUser->user_email;
274
+ wp_send_json($email);
275
  }
276
+
277
  }
278
  }
279
 
280
  function mo2f_unlimitted_user()
281
+ {
282
  if(!wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce'))
283
  {
284
  echo "NonceDidNotMatch";
305
  else
306
  {
307
  echo "OnPremiseDeactive";
308
+ exit;
309
  }
310
  }
311
  }
312
  function mo2f_save_email_verification()
313
+ {
314
+
315
  if(!wp_verify_nonce($_POST['nonce'],'EmailVerificationSaveNonce'))
316
  {
317
  echo "NonceDidNotMatch";
328
  {
329
  $twofactor_transactions = new Mo2fDB;
330
  $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user_id);
331
+
332
  if($exceeded){
333
  echo "USER_LIMIT_EXCEEDED";
334
  exit;
335
  }
336
  }
337
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL))
338
  {
339
  $error = true;
340
  }
341
  if($email!='' && !$error)
342
  {
343
  global $Mo2fdbQueries;
344
+ if($currentMethod == 'EmailVerification')
345
+ {
346
+ $Mo2fdbQueries->update_user_details(get_current_user_id(),array(
347
  'mo2f_EmailVerification_config_status'=>true,
348
  'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
349
  'mo2f_configured_2FA_method'=>"Email Verification",
350
  'mo2f_user_email' => $email
351
+ ));
352
+ }
353
+ else
354
+ {
355
+ $Mo2fdbQueries->update_user_details(get_current_user_id(),array(
356
+ 'mo2f_EmailVerification_config_status'=>true,
357
+ 'mo2f_user_email' => $email
358
+ ));
359
+
360
+ }
361
+ update_user_meta($user_id,'tempEmail',$email);
362
  echo "settingsSaved";
363
  exit;
364
  }
369
  }
370
 
371
  }
372
+
373
  }
374
  function CheckEVStatus()
375
  {
376
  if(isset($_POST['txid']))
377
  {
378
  $txid = sanitize_text_field($_POST['txid']);
379
+ $status = get_site_option($txid);
380
  if($status ==1 || $status ==0)
381
  delete_site_option($_POST['txid']);
382
  echo $status;
388
 
389
 
390
  }
391
+
392
  new mo_2f_ajax;
393
  ?>
controllers/upgrade.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'upgrade.php';
1
+ <?php
2
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'upgrade.php';
controllers/wpns-loginsecurity-ajax.php CHANGED
@@ -1,1171 +1,1209 @@
1
- <?php
2
- class wpns_ajax
3
- {
4
- function __construct(){
5
- //add comment here
6
- add_action( 'admin_init' , array( $this, 'mo_login_security_ajax' ) );
7
- }
8
-
9
- function mo_login_security_ajax(){
10
-
11
- add_action( 'wp_ajax_wpns_login_security', array($this,'wpns_login_security') );
12
- }
13
-
14
- function wpns_login_security(){
15
- switch($_POST['wpns_loginsecurity_ajax'])
16
- {
17
- case "wpns_bruteforce_form":
18
- $this->wpns_handle_bf_configuration_form(); break;
19
- case "wpns_save_captcha":
20
- $this->wpns_captcha_settings();break;
21
- case "save_strong_password":
22
- $this->wpns_strong_password_settings();break;
23
- case 'wpns_ManualIPBlock_form':
24
- $this->wpns_handle_IP_blocking();break;
25
- case 'wpns_WhitelistIP_form':
26
- $this->wpns_whitelist_ip(); break;
27
- case 'wpns_waf_settings_form':
28
- $this->wpns_waf_settings_form(); break;
29
- case 'wpns_waf_rate_limiting_form':
30
- $this->wpns_waf_rate_limiting_form(); break;
31
- case 'wpns_ip_lookup':
32
- $this->wpns_ip_lookup(); break;
33
- case 'wpns_all_plans':
34
- $this->wpns_all_plans(); break;
35
- case 'wpns_logout_form':
36
- $this->wpns_logout_form(); break;
37
-
38
- }
39
- }
40
- function wpns_logout_form()
41
- {
42
- global $moWpnsUtility;
43
- if( !$moWpnsUtility->check_empty_or_null( get_option('mo_wpns_registration_status') ) ) {
44
- delete_option('mo2f_email');
45
- }
46
- delete_option('mo2f_customerKey');
47
- delete_option('mo2f_api_key');
48
- delete_option('mo2f_customer_token');
49
- delete_option('mo_wpns_transactionId');
50
- delete_option('mo_wpns_registration_status');
51
- delete_option( 'mo_2factor_admin_registration_status' );
52
-
53
- $two_fa_settings = new Miniorange_Authentication();
54
- $two_fa_settings->mo_auth_deactivate();
55
-
56
- }
57
- function wpns_all_plans()
58
- {
59
- $mo2f_all_plannames = $_POST['planname'];
60
- update_option('mo2f_planname', $mo2f_all_plannames);
61
- if ($mo2f_all_plannames == 'addon_plan')
62
- {
63
- update_option('mo2f_planname', 'addon_plan');
64
- }
65
- elseif ($mo2f_all_plannames == '2fa_plan')
66
- {
67
- update_option('mo2f_planname', '2fa_plan');
68
- }
69
- }
70
- function wpns_handle_bf_configuration_form(){
71
-
72
- $nonce = $_POST['nonce'];
73
- if ( ! wp_verify_nonce( $nonce, 'wpns-brute-force' ) ){
74
- wp_send_json('ERROR');
75
- return;
76
- }
77
- $brute_force = $_POST['bf_enabled/disabled'];
78
- if($brute_force == 'true'){$brute_force = "on";}else if($brute_force == 'false') {$brute_force = "";}
79
- $login_attempts = $_POST['allwed_login_attempts'];
80
- $blocking_type = $_POST['time_of_blocking_type'];
81
- $blocking_value = isset($_POST['time_of_blocking_val']) ? $_POST['time_of_blocking_val'] : false;
82
- $show_login_attempts= $_POST['show_remaining_attempts'];
83
- if($show_login_attempts == 'true'){$show_login_attempts = "on";} else if($show_login_attempts == 'false') { $show_login_attempts = "";}
84
- if($brute_force == 'on' && $login_attempts == "" ){
85
- wp_send_json('empty');
86
- return;
87
- }
88
- update_option( 'mo2f_enable_brute_force' , $brute_force );
89
- update_option( 'mo2f_allwed_login_attempts' , $login_attempts );
90
- update_option( 'mo_wpns_time_of_blocking_type' , $blocking_type );
91
- update_option( 'mo_wpns_time_of_blocking_val' , $blocking_value );
92
- update_option('mo2f_show_remaining_attempts' , $show_login_attempts );
93
- if($brute_force == "on"){
94
- wp_send_json('true');
95
- }
96
- else if($brute_force == ""){
97
- wp_send_json('false');
98
- }
99
-
100
- }
101
- function wpns_handle_IP_blocking()
102
- {
103
-
104
- global $mo2f_dirName;
105
- if(!wp_verify_nonce($_POST['nonce'],'manualIPBlockingNonce'))
106
- {
107
- echo "NonceDidNotMatch";
108
- exit;
109
- }
110
- else
111
- {
112
- include_once($mo2f_dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
113
- }
114
- }
115
- function wpns_whitelist_ip()
116
- {
117
- global $mo2f_dirName;
118
- if(!wp_verify_nonce($_POST['nonce'],'IPWhiteListingNonce'))
119
- {
120
- echo "NonceDidNotMatch";
121
- exit;
122
- }
123
- else
124
- {
125
- include_once($mo2f_dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
126
- }
127
- }
128
-
129
- function wpns_ip_lookup()
130
- {
131
-
132
- if(!wp_verify_nonce($_POST['nonce'],'IPLookUPNonce'))
133
- {
134
- echo "NonceDidNotMatch";
135
- exit;
136
- }
137
- else
138
- {
139
- $ip = $_POST['IP'];
140
- if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/',$ip))
141
- {
142
- echo("INVALID_IP_FORMAT");
143
- exit;
144
- }
145
- else if(! filter_var($ip, FILTER_VALIDATE_IP)){
146
- echo("INVALID_IP");
147
- exit;
148
- }
149
- $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
150
- $hostname = gethostbyaddr($result["geoplugin_request"]);
151
- try{
152
- $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
153
- $timeoffset = $timeoffset/3600;
154
-
155
- }catch(Exception $e){
156
- $result["geoplugin_timezone"]="";
157
- $timeoffset="";
158
- }
159
- $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
160
- if($result['geoplugin_request']==$ip) {
161
-
162
- $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
163
- $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
164
- $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
165
- $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
166
- $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
167
- $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
168
- $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
169
- $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
170
- $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
171
- $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
172
- $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
173
- $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
174
- $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
175
- $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
176
-
177
- $result['ipDetails'] = $ipLookUpTemplate;
178
- }else{
179
- $result["ipDetails"]["status"]="ERROR";
180
- }
181
- wp_send_json( $result );
182
- }
183
- }
184
- function wpns_waf_settings_form()
185
- {
186
- $dir_name = dirname(__FILE__);
187
- $dir_name1 = explode('wp-content', $dir_name);
188
- $dir_name = $dir_name1[0];
189
- $filepath = str_replace('\\', '/', $dir_name1[0]);
190
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
191
-
192
- if(!file_exists($fileName))
193
- {
194
- $file = fopen($fileName, "a+");
195
- $string = "<?php".PHP_EOL;
196
- $string .= '$SQL=1;'.PHP_EOL;
197
- $string .= '$XSS=1;'.PHP_EOL;
198
- $string .= '$RCE=0;'.PHP_EOL;
199
- $string .= '$LFI=0;'.PHP_EOL;
200
- $string .= '$RFI=0;'.PHP_EOL;
201
- $string .= '$RateLimiting=1;'.PHP_EOL;
202
- $string .= '$RequestsPMin=120;'.PHP_EOL;
203
- $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
204
- $string .= '?>'.PHP_EOL;
205
-
206
- fwrite($file, $string);
207
- fclose($file);
208
- }
209
- else
210
- {
211
- if(!is_writable($fileName) or !is_readable($fileName))
212
- {
213
- echo "FilePermissionDenied";
214
- exit;
215
- }
216
- }
217
-
218
- if(!wp_verify_nonce($_POST['nonce'],'WAFsettingNonce'))
219
- {
220
- var_dump("NonceDidNotMatch");
221
- exit;
222
- }
223
- else
224
- {
225
- switch ($_POST['optionValue']) {
226
- case "SQL":
227
- $this->savesql(); break;
228
- case "XSS":
229
- $this->savexss(); break;
230
- case "RCE":
231
- $this->saverce(); break;
232
- case "RFI":
233
- $this->saverfi(); break;
234
- case "LFI":
235
- $this->savelfi(); break;
236
- case "WAF":
237
- $this->saveWAF(); break;
238
- case "HWAF":
239
- $this->saveHWAF(); break;
240
- case "backupHtaccess":
241
- $this->backupHtaccess(); break;
242
- case "limitAttack":
243
- $this->limitAttack(); break;
244
- default:
245
- break;
246
- }
247
-
248
- }
249
-
250
- }
251
- function wpns_waf_rate_limiting_form()
252
- {
253
- if(!wp_verify_nonce($_POST['nonce'],'RateLimitingNonce'))
254
- {
255
- echo "NonceDidNotMatch";
256
- exit;
257
- }
258
- else
259
- {
260
- if(get_site_option('WAFEnabled') != 1)
261
- {
262
- echo "WAFNotEnabled";
263
- exit;
264
- }
265
-
266
- if($_POST['Requests']!='')
267
- {
268
- if(is_numeric($_POST['Requests']))
269
- {
270
- $dir_name = dirname(__FILE__);
271
- $dir_name1 = explode('wp-content', $dir_name);
272
- $dir_name = $dir_name1[0];
273
- $filepath = str_replace('\\', '/', $dir_name1[0]);
274
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
275
-
276
- $file = file_get_contents($fileName);
277
- $data = $file;
278
-
279
- $req = sanitize_text_field($_POST['Requests']);
280
- if($req >1)
281
- {
282
- update_option('Rate_request',$req);
283
- if(isset($_POST['rateCheck']))
284
- {
285
- if($_POST['rateCheck'] == 'on')
286
- {
287
- update_option('Rate_limiting','1');
288
- echo "RateEnabled";
289
- if(strpos($file, 'RateLimiting')!=false)
290
- {
291
- $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
292
- $data = $file;
293
- file_put_contents($fileName,$file);
294
-
295
- }
296
- else
297
- {
298
- $content = explode('?>', $file);
299
- $file = $content[0];
300
- $file .= PHP_EOL;
301
- $file .= '$RateLimiting=1;'.PHP_EOL;
302
- $file .='?>';
303
- file_put_contents($fileName,$file);
304
- $data = $file;
305
- }
306
-
307
-
308
- }
309
- }
310
- else
311
- {
312
- update_option('Rate_limiting','0');
313
- echo "Ratedisabled";
314
- if(strpos($file, 'RateLimiting')!=false)
315
- {
316
- $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
317
- $data = $file;
318
- file_put_contents($fileName,$file);
319
- }
320
- else
321
- {
322
- $content = explode('?>', $file);
323
- $file = $content[0];
324
- $file .= PHP_EOL;
325
- $file .= '$RateLimiting=0;'.PHP_EOL;
326
- $file .='?>';
327
- file_put_contents($fileName,$file);
328
- $data = $file;
329
- }
330
-
331
- }
332
-
333
-
334
- $file = $data;
335
- if(strpos($file, 'RequestsPMin')!=false)
336
- {
337
- $content = explode(PHP_EOL, $file);
338
- $con = '';
339
- $len = sizeof($content);
340
-
341
- for($i=0;$i<$len;$i++)
342
- {
343
- if(strpos($content[$i], 'RequestsPMin')!=false)
344
- {
345
- $con.='$RequestsPMin='.$req.';'.PHP_EOL;
346
- }
347
- else
348
- {
349
- $con .= $content[$i].PHP_EOL;
350
- }
351
- }
352
-
353
- file_put_contents($fileName,$con);
354
- $data = $con;
355
-
356
- }
357
-
358
- else
359
- {
360
- $content = explode('?>', $file);
361
- $file = $content[0];
362
- $file .= PHP_EOL;
363
- $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
364
- $file .='?>';
365
- file_put_contents($fileName,$file);
366
- $data = $file;
367
- }
368
-
369
- if($_POST['actionOnLimitE']=='BlockIP' || $_POST['actionOnLimitE'] == 1)
370
- {
371
- update_option('actionRateL',1);
372
-
373
- $file = $data;
374
- if(strpos($file, 'actionRateL')!=false)
375
- {
376
- $content = explode(PHP_EOL, $file);
377
- $con = '';
378
- foreach ($content as $line => $lineV) {
379
- if(strpos($lineV, 'actionRateL')!=false)
380
- {
381
- $con.='$actionRateL="BlockIP";'.PHP_EOL;
382
- }
383
- else
384
- {
385
- $con .= $lineV.PHP_EOL;
386
- }
387
- }
388
- file_put_contents($fileName,$con);
389
- }
390
- else
391
- {
392
- $content = explode('?>', $file);
393
- $file = $content[0];
394
- $file .= PHP_EOL;
395
- $file .= '$actionRateL="BlockIP";'.PHP_EOL;
396
- $file .='?>';
397
- file_put_contents($fileName,$file);
398
- $file = $data;
399
- }
400
- }
401
- else if($_POST['actionOnLimitE']=='ThrottleIP' || $_POST['actionOnLimitE'] == 0)
402
- {
403
-
404
- $file = $data;
405
- update_option('actionRateL',0);
406
- if(strpos($file, 'actionRateL')!=false)
407
- {
408
- $content = explode(PHP_EOL, $file);
409
- $con = '';
410
- foreach ($content as $line => $lineV) {
411
- if(strpos($lineV, 'actionRateL')!=false)
412
- {
413
- $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
414
- }
415
- else
416
- {
417
- $con .= $lineV.PHP_EOL;
418
- }
419
- }
420
- file_put_contents($fileName,$con);
421
- }
422
- else
423
- {
424
- $content = explode('?>', $file);
425
- $file = $content[0];
426
- $file .= PHP_EOL;
427
- $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
428
- $file .='?>';
429
- file_put_contents($fileName,$file);
430
- }
431
- }
432
-
433
- }
434
- exit;
435
- }
436
-
437
-
438
-
439
- }
440
- echo("Error");
441
- exit;
442
- }
443
-
444
-
445
- }
446
-
447
- private function saveWAF()
448
- {
449
- if(isset($_POST['pluginWAF']))
450
- {
451
- if($_POST['pluginWAF']=='on')
452
- {
453
- update_option('WAF','PluginLevel');
454
- update_option('WAFEnabled','1');
455
- echo("PWAFenabled");exit;
456
- }
457
- }
458
- else
459
- {
460
- update_option('WAFEnabled','0');
461
- update_option('WAF','wafDisable');
462
- echo("PWAFdisabled");exit;
463
- }
464
- }
465
- private function saveHWAF()
466
- {
467
- if(!function_exists('mysqli_connect'))
468
- {
469
- echo "mysqliDoesNotExit";
470
- exit;
471
- }
472
- if(isset($_POST['htaccessWAF']))
473
- {
474
- if($_POST['htaccessWAF']=='on')
475
- {
476
- update_option('WAF','HtaccessLevel');
477
- update_option('WAFEnabled','1');
478
- $dir_name = dirname(__FILE__);
479
- $dirN = $dir_name;
480
- $dirN = str_replace('\\', '/', $dirN);
481
- $dirN = str_replace('controllers', 'handler', $dirN);
482
-
483
- $dir_name1 = explode('wp-content', $dir_name);
484
- $dir_name = $dir_name1[0];
485
- $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
486
- $dir_name .='.htaccess';
487
- $file = file_get_contents($dir_name);
488
- if(strpos($file, 'php_value auto_prepend_file')!=false)
489
- {
490
- echo("WAFConflicts");
491
- exit;
492
- }
493
-
494
- $cont = $file.PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
495
- $cont .= 'php_value auto_prepend_file '.$dir_name1.'mo-check.php'.PHP_EOL;
496
- $cont .= '# END miniOrange WAF'.PHP_EOL;
497
- file_put_contents($dir_name, $cont);
498
-
499
- $filecontent = file_get_contents($dir_name);
500
-
501
- $dir_name = dirname(__FILE__);
502
- $dir_name1 = explode('wp-content', $dir_name);
503
- $dir_name = $dir_name1[0];
504
- $filepath = str_replace('\\', '/', $dir_name1[0]);
505
- $fileName = $filepath.'mo-check.php';
506
- $file = fopen($fileName, 'w+');
507
- $dir_name = dirname(__FILE__);
508
- $filepath = str_replace('\\', '/', $dir_name);
509
- $filepath = explode('controllers', $filepath);
510
- $filepath = $filepath[0].'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf.php';
511
-
512
- $string = '<?php'.PHP_EOL;
513
- $string .= 'if(file_exists("'.$filepath.'"))'.PHP_EOL;
514
- $string .= 'include_once("'.$filepath.'");'.PHP_EOL;
515
- $string .= '?>'.PHP_EOL;
516
-
517
- fwrite($file, $string);
518
- fclose($file);
519
-
520
- if(strpos($filecontent,'mo-check.php')!=false)
521
- {
522
- echo "HWAFEnabled";
523
- exit;
524
- }
525
- else
526
- {
527
- echo "HWAFEnabledFailed";
528
- exit;
529
- }
530
- }
531
- }
532
- else
533
- {
534
- update_option('WAF','wafDisable');
535
- if(isset($_POST['pluginWAF']))
536
- {
537
- if($_POST['pluginWAF'] == 'on')
538
- {
539
- update_option('WAFEnabled',1);
540
- update_option('WAF','PluginLevel');
541
- }
542
- }
543
- else
544
- update_option('WAFEnabled',0);
545
- $dir_name = dirname(__FILE__);
546
- $dirN = $dir_name;
547
- $dirN = str_replace('\\', '/', $dirN);
548
- $dirN = explode('wp-content', $dirN);
549
- $dir_name1 = explode('wp-content', $dir_name);
550
- $dir_name = $dir_name1[0];
551
- $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
552
- $dir_name00 = $dir_name1;
553
- $dir_name1 .='.htaccess';
554
- $file = file_get_contents($dir_name1);
555
-
556
- $cont = PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
557
- $cont .= 'php_value auto_prepend_file '.$dir_name00.'mo-check.php'.PHP_EOL;
558
- $cont .= '# END miniOrange WAF'.PHP_EOL;
559
- $file =str_replace($cont,'',$file);
560
- file_put_contents($dir_name1, $file);
561
-
562
- $filecontent = file_get_contents($dir_name1);
563
- if(strpos($filecontent,'mo-check.php')==false)
564
- {
565
- echo "HWAFdisabled";
566
- exit;
567
- }
568
- else
569
- {
570
- echo "HWAFdisabledFailed";
571
- exit;
572
- }
573
- }
574
-
575
-
576
- }
577
- private function savesql()
578
- {
579
- if(isset($_POST['SQL']))
580
- {
581
- if($_POST['SQL']=='on')
582
- {
583
- update_option('SQLInjection',1);
584
- $dir_name = dirname(__FILE__);
585
- $dir_name1 = explode('wp-content', $dir_name);
586
- $dir_name = $dir_name1[0];
587
- $filepath = str_replace('\\', '/', $dir_name1[0]);
588
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
589
-
590
- $file = file_get_contents($fileName);
591
- if(strpos($file, 'SQL')!=false)
592
- {
593
- $file = str_replace('$SQL=0;', '$SQL=1;', $file);
594
- file_put_contents($fileName,$file);
595
- }
596
- else
597
- {
598
- $content = explode('?>', $file);
599
- $file = $content[0];
600
- $file .= PHP_EOL;
601
- $file .= '$SQL=1;'.PHP_EOL;
602
- $file .='?>';
603
- file_put_contents($fileName,$file);
604
- }
605
- echo("SQLenable");
606
- exit;
607
-
608
- }
609
- }
610
- else
611
- {
612
- update_option('SQLInjection',0);
613
-
614
- $dir_name = dirname(__FILE__);
615
- $dir_name1 = explode('wp-content', $dir_name);
616
- $dir_name = $dir_name1[0];
617
- $filepath = str_replace('\\', '/', $dir_name1[0]);
618
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
619
-
620
- $file = file_get_contents($fileName);
621
- if(strpos($file, '$SQL')!=false)
622
- {
623
- $file = str_replace('$SQL=1;', '$SQL=0;', $file);
624
- file_put_contents($fileName,$file);
625
- }
626
- else
627
- {
628
- $content = explode('?>', $file);
629
- $file = $content[0];
630
- $file .= PHP_EOL;
631
- $file .= '$SQL=0;'.PHP_EOL;
632
- $file .='?>';
633
- file_put_contents($fileName,$file);
634
- }
635
-
636
- echo("SQLdisable");
637
- exit;
638
-
639
- }
640
-
641
- }
642
- private function saverce()
643
- {
644
- if(isset($_POST['RCE']))
645
- {
646
- if($_POST['RCE']=='on')
647
- {
648
- update_option('RCEAttack',1);
649
-
650
- $dir_name = dirname(__FILE__);
651
- $dir_name1 = explode('wp-content', $dir_name);
652
- $dir_name = $dir_name1[0];
653
- $filepath = str_replace('\\', '/', $dir_name1[0]);
654
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
655
-
656
- $file = file_get_contents($fileName);
657
- if(strpos($file, 'RCE')!=false)
658
- {
659
- $file = str_replace('$RCE=0;', '$RCE=1;', $file);
660
- file_put_contents($fileName,$file);
661
- }
662
- else
663
- {
664
- $content = explode('?>', $file);
665
- $file = $content[0];
666
- $file .= PHP_EOL;
667
- $file .= '$RCE=1;'.PHP_EOL;
668
- $file .='?>';
669
- file_put_contents($fileName,$file);
670
- }
671
- echo("RCEenable");
672
- exit;
673
- }
674
- }
675
- else
676
- {
677
- update_option('RCEAttack',0);
678
-
679
- $dir_name = dirname(__FILE__);
680
- $dir_name1 = explode('wp-content', $dir_name);
681
- $dir_name = $dir_name1[0];
682
- $filepath = str_replace('\\', '/', $dir_name1[0]);
683
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
684
-
685
- $file = file_get_contents($fileName);
686
- if(strpos($file, '$RCE')!=false)
687
- {
688
- $file = str_replace('$RCE=1;', '$RCE=0;', $file);
689
- file_put_contents($fileName,$file);
690
- }
691
- else
692
- {
693
- $content = explode('?>', $file);
694
- $file = $content[0];
695
- $file .= PHP_EOL;
696
- $file .= '$RCE=0;'.PHP_EOL;
697
- $file .='?>';
698
- file_put_contents($fileName,$file);
699
- }
700
- echo("RCEdisable");
701
- exit;
702
-
703
- }
704
-
705
- }
706
- private function savexss()
707
- {
708
- if(isset($_POST['XSS']))
709
- {
710
- if($_POST['XSS']=='on')
711
- {
712
- update_option('XSSAttack',1);
713
- $dir_name = dirname(__FILE__);
714
- $dir_name1 = explode('wp-content', $dir_name);
715
- $dir_name = $dir_name1[0];
716
- $filepath = str_replace('\\', '/', $dir_name1[0]);
717
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
718
-
719
- $file = file_get_contents($fileName);
720
- if(strpos($file, 'XSS')!=false)
721
- {
722
- $file = str_replace('$XSS=0;', '$XSS=1;', $file);
723
- file_put_contents($fileName,$file);
724
- }
725
- else
726
- {
727
- $content = explode('?>', $file);
728
- $file = $content[0];
729
- $file .= PHP_EOL;
730
- $file .= '$XSS=1;'.PHP_EOL;
731
- $file .='?>';
732
- file_put_contents($fileName,$file);
733
- }
734
- echo("XSSenable");
735
- exit;
736
- }
737
- }
738
- else
739
- {
740
- update_option('XSSAttack',0);
741
- $dir_name = dirname(__FILE__);
742
- $dir_name1 = explode('wp-content', $dir_name);
743
- $dir_name = $dir_name1[0];
744
- $filepath = str_replace('\\', '/', $dir_name1[0]);
745
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
746
-
747
- $file = file_get_contents($fileName);
748
- if(strpos($file, '$XSS')!=false)
749
- {
750
- $file = str_replace('$XSS=1;', '$XSS=0;', $file);
751
- file_put_contents($fileName,$file);
752
- }
753
- else
754
- {
755
- $content = explode('?>', $file);
756
- $file = $content[0];
757
- $file .= PHP_EOL;
758
- $file .= '$XSS=0;'.PHP_EOL;
759
- $file .='?>';
760
- file_put_contents($fileName,$file);
761
- }
762
- echo("XSSdisable");
763
- exit;
764
- }
765
-
766
- }
767
- private function savelfi()
768
- {
769
- if(isset($_POST['LFI']))
770
- {
771
- if($_POST['LFI']=='on')
772
- {
773
- update_option('LFIAttack',1);
774
- $dir_name = dirname(__FILE__);
775
- $dir_name1 = explode('wp-content', $dir_name);
776
- $dir_name = $dir_name1[0];
777
- $filepath = str_replace('\\', '/', $dir_name1[0]);
778
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
779
-
780
- $file = file_get_contents($fileName);
781
- if(strpos($file, 'LFI')!=false)
782
- {
783
- $file = str_replace("LFI=0;", "LFI=1;", $file);
784
- file_put_contents($fileName,$file);
785
- }
786
- else
787
- {
788
- $content = explode('?>', $file);
789
- $file = $content[0];
790
- $file .= PHP_EOL;
791
- $file .= '$LFI=1;'.PHP_EOL;
792
- $file .='?>';
793
- file_put_contents($fileName,$file);
794
- }
795
- $file = file_get_contents($fileName);
796
-
797
- echo("LFIenable");
798
- exit;
799
- }
800
- }
801
- else
802
- {
803
- update_option('LFIAttack',0);
804
- $dir_name = dirname(__FILE__);
805
- $dir_name1 = explode('wp-content', $dir_name);
806
- $dir_name = $dir_name1[0];
807
- $filepath = str_replace('\\', '/', $dir_name1[0]);
808
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
809
-
810
- $file = file_get_contents($fileName);
811
- if(strpos($file, '$LFI')!=false)
812
- {
813
- $file = str_replace('$LFI=1;', '$LFI=0;', $file);
814
- file_put_contents($fileName,$file);
815
- }
816
- else
817
- {
818
- $content = explode('?>', $file);
819
- $file = $content[0];
820
- $file .= PHP_EOL;
821
- $file .= '$LFI=0;'.PHP_EOL;
822
- $file .='?>';
823
- file_put_contents($fileName,$file);
824
- }
825
- echo("LFIdisable");
826
- exit;
827
- }
828
-
829
- }
830
- private function saverfi()
831
- {
832
- if(isset($_POST['RFI']))
833
- {
834
- if($_POST['RFI']=='on')
835
- {
836
- update_option('RFIAttack',1);
837
- $dir_name = dirname(__FILE__);
838
- $dir_name1 = explode('wp-content', $dir_name);
839
- $dir_name = $dir_name1[0];
840
- $filepath = str_replace('\\', '/', $dir_name1[0]);
841
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
842
-
843
- $file = file_get_contents($fileName);
844
- if(strpos($file, 'RFI')!=false)
845
- {
846
- $file = str_replace('$RFI=0;', '$RFI=1;', $file);
847
- file_put_contents($fileName,$file);
848
- }
849
- else
850
- {
851
- $content = explode('?>', $file);
852
- $file = $content[0];
853
- $file .= PHP_EOL;
854
- $file .= '$RFI=1;'.PHP_EOL;
855
- $file .='?>';
856
- file_put_contents($fileName,$file);
857
- }
858
- echo("RFIenable");
859
- exit;
860
- }
861
- }
862
- else
863
- {
864
- update_option('RFIAttack',0);
865
- $dir_name = dirname(__FILE__);
866
- $dir_name1 = explode('wp-content', $dir_name);
867
- $dir_name = $dir_name1[0];
868
- $filepath = str_replace('\\', '/', $dir_name1[0]);
869
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
870
-
871
- $file = file_get_contents($fileName);
872
- if(strpos($file, '$RFI')!=false)
873
- {
874
- $file = str_replace('$RFI=1;', '$RFI=0;', $file);
875
- file_put_contents($fileName,$file);
876
- }
877
- else
878
- {
879
- $content = explode('?>', $file);
880
- $file = $content[0];
881
- $file .= PHP_EOL;
882
- $file .= '$RFI=0;'.PHP_EOL;
883
- $file .='?>';
884
- file_put_contents($fileName,$file);
885
- }
886
- echo("RFIdisable");
887
- exit;
888
- }
889
-
890
- }
891
- private function saveRateL()
892
- {
893
-
894
- if($_POST['time']!='' && $_POST['req']!='')
895
- {
896
- if(is_numeric($_POST['time']) && is_numeric($_POST['req']))
897
- {
898
- $dir_name = dirname(__FILE__);
899
- $dir_name1 = explode('wp-content', $dir_name);
900
- $dir_name = $dir_name1[0];
901
- $filepath = str_replace('\\', '/', $dir_name1[0]);
902
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
903
-
904
- $file = file_get_contents($fileName);
905
- $data = $file;
906
- $time = sanitize_text_field($_POST['time']);
907
- $req = sanitize_text_field($_POST['req']);
908
- if($time>0 && $req >0)
909
- {
910
- update_option('Rate_time',$time);
911
- update_option('Rate_request',$req);
912
- update_option('Rate_limiting','1');
913
-
914
- if(strpos($file, 'RateLimiting')!=false)
915
- {
916
- $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
917
- $data = $file;
918
- file_put_contents($fileName,$file);
919
- }
920
- else
921
- {
922
- $content = explode('?>', $file);
923
- $file = $content[0];
924
- $file .= PHP_EOL;
925
- $file .= '$RateLimiting=1;'.PHP_EOL;
926
- $file .='?>';
927
- file_put_contents($fileName,$file);
928
- $data = $file;
929
- }
930
-
931
- $file = $data;
932
- if(strpos($file, 'RequestsPMin')!=false)
933
- {
934
- $content = explode(PHP_EOL, $file);
935
- $con = '';
936
- $len = sizeof($content);
937
-
938
- for($i=0;$i<$len;$i++)
939
- {
940
- if(strpos($content[$i], 'RequestsPMin')!=false)
941
- {
942
- $con.='$RequestsPMin='.$req.';'.PHP_EOL;
943
- }
944
- else
945
- {
946
- $con .= $content[$i].PHP_EOL;
947
- }
948
- }
949
-
950
- file_put_contents($fileName,$con);
951
- $data = $con;
952
-
953
- }
954
-
955
- else
956
- {
957
- $content = explode('?>', $file);
958
- $file = $content[0];
959
- $file .= PHP_EOL;
960
- $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
961
- $file .='?>';
962
- file_put_contents($fileName,$file);
963
- $data = $file;
964
- }
965
-
966
-
967
-
968
- if($_POST['action']=='BlockIP')
969
- {
970
- update_option('actionRateL',1);
971
-
972
- $file = $data;
973
- if(strpos($file, 'actionRateL')!=false)
974
- {
975
- $content = explode(PHP_EOL, $file);
976
- $con = '';
977
- foreach ($content as $line => $lineV) {
978
- if(strpos($lineV, 'actionRateL')!=false)
979
- {
980
- $con.='$actionRateL="BlockIP";'.PHP_EOL;
981
- }
982
- else
983
- {
984
- $con .= $lineV.PHP_EOL;
985
- }
986
- }
987
- file_put_contents($fileName,$con);
988
- }
989
- else
990
- {
991
- $content = explode('?>', $file);
992
- $file = $content[0];
993
- $file .= PHP_EOL;
994
- $file .= '$actionRateL="BlockIP";'.PHP_EOL;
995
- $file .='?>';
996
- file_put_contents($fileName,$file);
997
- $file = $data;
998
- }
999
- }
1000
- elseif($_POST['action']=='ThrottleIP')
1001
- {
1002
- $file = $data;
1003
- update_option('actionRateL',0);
1004
- if(strpos($file, 'actionRateL')!=false)
1005
- {
1006
- $content = explode(PHP_EOL, $file);
1007
- $con = '';
1008
- foreach ($content as $line => $lineV) {
1009
- if(strpos($lineV, 'actionRateL')!=false)
1010
- {
1011
- $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
1012
- }
1013
- else
1014
- {
1015
- $con .= $lineV.PHP_EOL;
1016
- }
1017
- }
1018
- file_put_contents($fileName,$con);
1019
- }
1020
- else
1021
- {
1022
- $content = explode('?>', $file);
1023
- $file = $content[0];
1024
- $file .= PHP_EOL;
1025
- $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
1026
- $file .='?>';
1027
- file_put_contents($fileName,$file);
1028
- }
1029
- }
1030
-
1031
- }
1032
-
1033
- }
1034
-
1035
- }
1036
-
1037
- }
1038
- private function disableRL()
1039
- {
1040
- update_option('Rate_limiting',0);
1041
-
1042
- $dir_name = dirname(__FILE__);
1043
- $dir_name1 = explode('wp-content', $dir_name);
1044
- $dir_name = $dir_name1[0];
1045
- $filepath = str_replace('\\', '/', $dir_name1[0]);
1046
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
1047
- $file = file_get_contents($fileName);
1048
-
1049
- if(strpos($file, 'RateLimiting')!=false)
1050
- {
1051
- $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
1052
- file_put_contents($fileName,$file);
1053
- }
1054
- else
1055
- {
1056
- $content = explode('?>', $file);
1057
- $file = $content[0];
1058
- $file .= PHP_EOL;
1059
- $file .= '$RateLimiting=0;'.PHP_EOL;
1060
- $file .='?>';
1061
- file_put_contents($fileName,$file);
1062
- }
1063
-
1064
- }
1065
- private function backupHtaccess()
1066
- {
1067
- if(isset($_POST['htaccessWAF']))
1068
- {
1069
- if($_POST['htaccessWAF']=='on')
1070
- {
1071
- $dir_name = dirname(__FILE__);
1072
- $dirN = $dir_name;
1073
- $dirN = str_replace('\\', '/', $dirN);
1074
- $dir_name1 = explode('wp-content', $dir_name);
1075
- $dir_name = $dir_name1[0];
1076
- $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
1077
- $dir_name =$dir_name1.'.htaccess';
1078
- $file = file_get_contents($dir_name);
1079
- $dir_backup = $dir_name1.'htaccess';
1080
- $handle = fopen($dir_backup, 'c+');
1081
- fwrite($handle,$file);
1082
- }
1083
- }
1084
- }
1085
- private function limitAttack()
1086
- {
1087
- if(isset($_POST['limitAttack']))
1088
- {
1089
- $value = sanitize_text_field($_POST['limitAttack']);
1090
- if($value>1)
1091
- {
1092
- update_option('limitAttack',$value);
1093
- echo "limitSaved";
1094
- exit;
1095
- }
1096
- else
1097
- {
1098
- echo "limitIsLT1";
1099
- exit;
1100
- }
1101
-
1102
- }
1103
- }
1104
-
1105
-
1106
-
1107
- function wpns_captcha_settings(){
1108
- $nonce = $_POST['nonce'];
1109
- if ( ! wp_verify_nonce( $nonce, 'wpns-captcha' ) ){
1110
- wp_send_json('ERROR');
1111
- return;
1112
- }
1113
- $site_key = sanitize_text_field($_POST['site_key']);
1114
- $secret_key = sanitize_text_field($_POST['secret_key']);
1115
- $enable_captcha = $_POST['enable_captcha'];
1116
- if($enable_captcha == 'true'){$enable_captcha = "on";}else if($enable_captcha == 'false') {$enable_captcha = "";}
1117
- $login_form_captcha = $_POST['login_form'];
1118
- if($login_form_captcha == 'true'){$login_form_captcha = "on";}else if($login_form_captcha == 'false') {$login_form_captcha = "";}
1119
- $reg_form_captcha = $_POST['registeration_form'];
1120
- if($reg_form_captcha == 'true'){$reg_form_captcha = "on";}else if($reg_form_captcha == 'false') {$reg_form_captcha = "";}
1121
-
1122
- if(($site_key == "" || $secret_key == "") and $enable_captcha == 'true'){
1123
- wp_send_json('empty');
1124
- return;
1125
- }
1126
-
1127
- update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
1128
- update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
1129
- update_option( 'mo_wpns_activate_recaptcha' , $enable_captcha );
1130
-
1131
- if($enable_captcha == "on"){
1132
- update_option( 'mo_wpns_activate_recaptcha_for_login' , $login_form_captcha );
1133
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', $login_form_captcha );
1134
- update_option('mo_wpns_activate_recaptcha_for_registration', $reg_form_captcha );
1135
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration',$reg_form_captcha );
1136
- wp_send_json('true');
1137
- }
1138
- else if($enable_captcha == ""){
1139
- update_option( 'mo_wpns_activate_recaptcha_for_login' , '' );
1140
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', '' );
1141
- update_option('mo_wpns_activate_recaptcha_for_registration', '' );
1142
- update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration','' );
1143
- wp_send_json('false');
1144
- }
1145
-
1146
- }
1147
-
1148
- function wpns_strong_password_settings(){
1149
- $nonce = $_POST['nonce'];
1150
- if ( ! wp_verify_nonce( $nonce, 'wpns-strn-pass' ) ){
1151
- wp_send_json('ERROR');
1152
- return;
1153
- }
1154
- $enable_strong_pass = $_POST['enable_strong_pass'];
1155
- if($enable_strong_pass == 'true'){$enable_strong_pass = 1;}else if($enable_strong_pass == 'false') {$enable_strong_pass = 0;}
1156
- $strong_pass_accounts = $_POST['accounts_strong_pass'];
1157
- update_option('mo2f_enforce_strong_passswords_for_accounts',$strong_pass_accounts);
1158
- update_option('mo2f_enforce_strong_passswords' , $enable_strong_pass);
1159
- if($enable_strong_pass){
1160
- update_option('mo_wpns_enable_rename_login_url',"");
1161
- wp_send_json('true');
1162
- }
1163
- else{
1164
- wp_send_json('false');
1165
- }
1166
- }
1167
-
1168
- }
1169
- new wpns_ajax;
1170
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1171
  ?>
1
+ <?php
2
+ class wpns_ajax
3
+ {
4
+ function __construct(){
5
+ //add comment here
6
+ add_action( 'admin_init' , array( $this, 'mo_login_security_ajax' ) );
7
+ }
8
+
9
+ function mo_login_security_ajax(){
10
+
11
+ add_action( 'wp_ajax_wpns_login_security', array($this,'wpns_login_security') );
12
+ add_action( 'wp_ajax_mo2f_ajax', array($this,'mo2f_ajax') );
13
+ add_action( 'wp_ajax_nopriv_mo2f_ajax', array($this,'mo2f_ajax') );
14
+ }
15
+
16
+ function mo2f_ajax(){
17
+ $GLOBALS['mo2f_is_ajax_request'] = true;
18
+ switch ($_POST['mo2f_ajax_option']) {
19
+ case "mo2f_ajax_kba":
20
+ $this->mo2f_ajax_kba();break;
21
+ case "mo2f_ajax_login":
22
+ $this->mo2f_ajax_login(); break;
23
+ case "mo2f_ajax_otp":
24
+ $this->mo2f_ajax_otp(); break;
25
+ }
26
+ }
27
+
28
+ function wpns_login_security(){
29
+ switch($_POST['wpns_loginsecurity_ajax'])
30
+ {
31
+ case "wpns_bruteforce_form":
32
+ $this->wpns_handle_bf_configuration_form(); break;
33
+ case "wpns_save_captcha":
34
+ $this->wpns_captcha_settings();break;
35
+ case "save_strong_password":
36
+ $this->wpns_strong_password_settings();break;
37
+ case 'wpns_ManualIPBlock_form':
38
+ $this->wpns_handle_IP_blocking();break;
39
+ case 'wpns_WhitelistIP_form':
40
+ $this->wpns_whitelist_ip(); break;
41
+ case 'wpns_waf_settings_form':
42
+ $this->wpns_waf_settings_form(); break;
43
+ case 'wpns_waf_rate_limiting_form':
44
+ $this->wpns_waf_rate_limiting_form(); break;
45
+ case 'wpns_ip_lookup':
46
+ $this->wpns_ip_lookup(); break;
47
+ case 'wpns_all_plans':
48
+ $this->wpns_all_plans(); break;
49
+ case 'wpns_logout_form':
50
+ $this->wpns_logout_form(); break;
51
+
52
+ }
53
+ }
54
+
55
+
56
+ function mo2f_ajax_otp(){
57
+ $obj = new Miniorange_Password_2Factor_Login();
58
+ $obj->check_miniorange_soft_token($_POST);
59
+ }
60
+ function mo2f_ajax_kba(){
61
+ $obj = new Miniorange_Password_2Factor_Login();
62
+ $obj->check_kba_validation($_POST);
63
+ }
64
+ function mo2f_ajax_login()
65
+ {
66
+ if(!wp_verify_nonce(sanitize_text_field($_POST['nonce']),'miniorange-2-factor-login-nonce'))
67
+ {
68
+ wp_send_json("ERROR");
69
+ exit;
70
+ }
71
+ else
72
+ {
73
+ $username = sanitize_text_field($_POST['username']);
74
+ $password = sanitize_text_field($_POST['password'] );
75
+ apply_filters( 'authenticate', null, $username, $password );
76
+ }
77
+ }
78
+ function wpns_logout_form()
79
+ {
80
+ global $moWpnsUtility;
81
+ if( !$moWpnsUtility->check_empty_or_null( get_option('mo_wpns_registration_status') ) ) {
82
+ delete_option('mo2f_email');
83
+ }
84
+ delete_option('mo2f_customerKey');
85
+ delete_option('mo2f_api_key');
86
+ delete_option('mo2f_customer_token');
87
+ delete_option('mo_wpns_transactionId');
88
+ delete_option('mo_wpns_registration_status');
89
+ delete_option( 'mo_2factor_admin_registration_status' );
90
+
91
+ $two_fa_settings = new Miniorange_Authentication();
92
+ $two_fa_settings->mo_auth_deactivate();
93
+
94
+ }
95
+ function wpns_all_plans()
96
+ {
97
+ $mo2f_all_plannames = $_POST['planname'];
98
+ update_option('mo2f_planname', $mo2f_all_plannames);
99
+ if ($mo2f_all_plannames == 'addon_plan')
100
+ {
101
+ update_option('mo2f_planname', 'addon_plan');
102
+ }
103
+ elseif ($mo2f_all_plannames == '2fa_plan')
104
+ {
105
+ update_option('mo2f_planname', '2fa_plan');
106
+ }
107
+ }
108
+ function wpns_handle_bf_configuration_form(){
109
+
110
+ $nonce = $_POST['nonce'];
111
+ if ( ! wp_verify_nonce( $nonce, 'wpns-brute-force' ) ){
112
+ wp_send_json('ERROR');
113
+ return;
114
+ }
115
+ $brute_force = $_POST['bf_enabled/disabled'];
116
+ if($brute_force == 'true'){$brute_force = "on";}else if($brute_force == 'false') {$brute_force = "";}
117
+ $login_attempts = $_POST['allwed_login_attempts'];
118
+ $blocking_type = $_POST['time_of_blocking_type'];
119
+ $blocking_value = isset($_POST['time_of_blocking_val']) ? $_POST['time_of_blocking_val'] : false;
120
+ $show_login_attempts= $_POST['show_remaining_attempts'];
121
+ if($show_login_attempts == 'true'){$show_login_attempts = "on";} else if($show_login_attempts == 'false') { $show_login_attempts = "";}
122
+ if($brute_force == 'on' && $login_attempts == "" ){
123
+ wp_send_json('empty');
124
+ return;
125
+ }
126
+ update_option( 'mo2f_enable_brute_force' , $brute_force );
127
+ update_option( 'mo2f_allwed_login_attempts' , $login_attempts );
128
+ update_option( 'mo_wpns_time_of_blocking_type' , $blocking_type );
129
+ update_option( 'mo_wpns_time_of_blocking_val' , $blocking_value );
130
+ update_option('mo2f_show_remaining_attempts' , $show_login_attempts );
131
+ if($brute_force == "on"){
132
+ wp_send_json('true');
133
+ }
134
+ else if($brute_force == ""){
135
+ wp_send_json('false');
136
+ }
137
+
138
+ }
139
+ function wpns_handle_IP_blocking()
140
+ {
141
+
142
+ global $mo2f_dirName;
143
+ if(!wp_verify_nonce($_POST['nonce'],'manualIPBlockingNonce'))
144
+ {
145
+ echo "NonceDidNotMatch";
146
+ exit;
147
+ }
148
+ else
149
+ {
150
+ include_once($mo2f_dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
151
+ }
152
+ }
153
+ function wpns_whitelist_ip()
154
+ {
155
+ global $mo2f_dirName;
156
+ if(!wp_verify_nonce($_POST['nonce'],'IPWhiteListingNonce'))
157
+ {
158
+ echo "NonceDidNotMatch";
159
+ exit;
160
+ }
161
+ else
162
+ {
163
+ include_once($mo2f_dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
164
+ }
165
+ }
166
+
167
+ function wpns_ip_lookup()
168
+ {
169
+
170
+ if(!wp_verify_nonce($_POST['nonce'],'IPLookUPNonce'))
171
+ {
172
+ echo "NonceDidNotMatch";
173
+ exit;
174
+ }
175
+ else
176
+ {
177
+ $ip = $_POST['IP'];
178
+ if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/',$ip))
179
+ {
180
+ echo("INVALID_IP_FORMAT");
181
+ exit;
182
+ }
183
+ else if(! filter_var($ip, FILTER_VALIDATE_IP)){
184
+ echo("INVALID_IP");
185
+ exit;
186
+ }
187
+ $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
188
+ $hostname = gethostbyaddr($result["geoplugin_request"]);
189
+ try{
190
+ $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
191
+ $timeoffset = $timeoffset/3600;
192
+
193
+ }catch(Exception $e){
194
+ $result["geoplugin_timezone"]="";
195
+ $timeoffset="";
196
+ }
197
+ $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
198
+ if($result['geoplugin_request']==$ip) {
199
+
200
+ $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
201
+ $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
202
+ $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
203
+ $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
204
+ $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
205
+ $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
206
+ $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
207
+ $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
208
+ $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
209
+ $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
210
+ $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
211
+ $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
212
+ $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
213
+ $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
214
+
215
+ $result['ipDetails'] = $ipLookUpTemplate;
216
+ }else{
217
+ $result["ipDetails"]["status"]="ERROR";
218
+ }
219
+ wp_send_json( $result );
220
+ }
221
+ }
222
+ function wpns_waf_settings_form()
223
+ {
224
+ $dir_name = dirname(__FILE__);
225
+ $dir_name1 = explode('wp-content', $dir_name);
226
+ $dir_name = $dir_name1[0];
227
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
228
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
229
+
230
+ if(!file_exists($fileName))
231
+ {
232
+ $file = fopen($fileName, "a+");
233
+ $string = "<?php".PHP_EOL;
234
+ $string .= '$SQL=1;'.PHP_EOL;
235
+ $string .= '$XSS=1;'.PHP_EOL;
236
+ $string .= '$RCE=0;'.PHP_EOL;
237
+ $string .= '$LFI=0;'.PHP_EOL;
238
+ $string .= '$RFI=0;'.PHP_EOL;
239
+ $string .= '$RateLimiting=1;'.PHP_EOL;
240
+ $string .= '$RequestsPMin=120;'.PHP_EOL;
241
+ $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
242
+ $string .= '?>'.PHP_EOL;
243
+
244
+ fwrite($file, $string);
245
+ fclose($file);
246
+ }
247
+ else
248
+ {
249
+ if(!is_writable($fileName) or !is_readable($fileName))
250
+ {
251
+ echo "FilePermissionDenied";
252
+ exit;
253
+ }
254
+ }
255
+
256
+ if(!wp_verify_nonce($_POST['nonce'],'WAFsettingNonce'))
257
+ {
258
+ var_dump("NonceDidNotMatch");
259
+ exit;
260
+ }
261
+ else
262
+ {
263
+ switch ($_POST['optionValue']) {
264
+ case "SQL":
265
+ $this->savesql(); break;
266
+ case "XSS":
267
+ $this->savexss(); break;
268
+ case "RCE":
269
+ $this->saverce(); break;
270
+ case "RFI":
271
+ $this->saverfi(); break;
272
+ case "LFI":
273
+ $this->savelfi(); break;
274
+ case "WAF":
275
+ $this->saveWAF(); break;
276
+ case "HWAF":
277
+ $this->saveHWAF(); break;
278
+ case "backupHtaccess":
279
+ $this->backupHtaccess(); break;
280
+ case "limitAttack":
281
+ $this->limitAttack(); break;
282
+ default:
283
+ break;
284
+ }
285
+
286
+ }
287
+
288
+ }
289
+ function wpns_waf_rate_limiting_form()
290
+ {
291
+ if(!wp_verify_nonce($_POST['nonce'],'RateLimitingNonce'))
292
+ {
293
+ echo "NonceDidNotMatch";
294
+ exit;
295
+ }
296
+ else
297
+ {
298
+ if(get_site_option('WAFEnabled') != 1)
299
+ {
300
+ echo "WAFNotEnabled";
301
+ exit;
302
+ }
303
+
304
+ if($_POST['Requests']!='')
305
+ {
306
+ if(is_numeric($_POST['Requests']))
307
+ {
308
+ $dir_name = dirname(__FILE__);
309
+ $dir_name1 = explode('wp-content', $dir_name);
310
+ $dir_name = $dir_name1[0];
311
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
312
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
313
+
314
+ $file = file_get_contents($fileName);
315
+ $data = $file;
316
+
317
+ $req = sanitize_text_field($_POST['Requests']);
318
+ if($req >1)
319
+ {
320
+ update_option('Rate_request',$req);
321
+ if(isset($_POST['rateCheck']))
322
+ {
323
+ if($_POST['rateCheck'] == 'on')
324
+ {
325
+ update_option('Rate_limiting','1');
326
+ echo "RateEnabled";
327
+ if(strpos($file, 'RateLimiting')!=false)
328
+ {
329
+ $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
330
+ $data = $file;
331
+ file_put_contents($fileName,$file);
332
+
333
+ }
334
+ else
335
+ {
336
+ $content = explode('?>', $file);
337
+ $file = $content[0];
338
+ $file .= PHP_EOL;
339
+ $file .= '$RateLimiting=1;'.PHP_EOL;
340
+ $file .='?>';
341
+ file_put_contents($fileName,$file);
342
+ $data = $file;
343
+ }
344
+
345
+
346
+ }
347
+ }
348
+ else
349
+ {
350
+ update_option('Rate_limiting','0');
351
+ echo "Ratedisabled";
352
+ if(strpos($file, 'RateLimiting')!=false)
353
+ {
354
+ $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
355
+ $data = $file;
356
+ file_put_contents($fileName,$file);
357
+ }
358
+ else
359
+ {
360
+ $content = explode('?>', $file);
361
+ $file = $content[0];
362
+ $file .= PHP_EOL;
363
+ $file .= '$RateLimiting=0;'.PHP_EOL;
364
+ $file .='?>';
365
+ file_put_contents($fileName,$file);
366
+ $data = $file;
367
+ }
368
+
369
+ }
370
+
371
+
372
+ $file = $data;
373
+ if(strpos($file, 'RequestsPMin')!=false)
374
+ {
375
+ $content = explode(PHP_EOL, $file);
376
+ $con = '';
377
+ $len = sizeof($content);
378
+
379
+ for($i=0;$i<$len;$i++)
380
+ {
381
+ if(strpos($content[$i], 'RequestsPMin')!=false)
382
+ {
383
+ $con.='$RequestsPMin='.$req.';'.PHP_EOL;
384
+ }
385
+ else
386
+ {
387
+ $con .= $content[$i].PHP_EOL;
388
+ }
389
+ }
390
+
391
+ file_put_contents($fileName,$con);
392
+ $data = $con;
393
+
394
+ }
395
+
396
+ else
397
+ {
398
+ $content = explode('?>', $file);
399
+ $file = $content[0];
400
+ $file .= PHP_EOL;
401
+ $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
402
+ $file .='?>';
403
+ file_put_contents($fileName,$file);
404
+ $data = $file;
405
+ }
406
+
407
+ if($_POST['actionOnLimitE']=='BlockIP' || $_POST['actionOnLimitE'] == 1)
408
+ {
409
+ update_option('actionRateL',1);
410
+
411
+ $file = $data;
412
+ if(strpos($file, 'actionRateL')!=false)
413
+ {
414
+ $content = explode(PHP_EOL, $file);
415
+ $con = '';
416
+ foreach ($content as $line => $lineV) {
417
+ if(strpos($lineV, 'actionRateL')!=false)
418
+ {
419
+ $con.='$actionRateL="BlockIP";'.PHP_EOL;
420
+ }
421
+ else
422
+ {
423
+ $con .= $lineV.PHP_EOL;
424
+ }
425
+ }
426
+ file_put_contents($fileName,$con);
427
+ }
428
+ else
429
+ {
430
+ $content = explode('?>', $file);
431
+ $file = $content[0];
432
+ $file .= PHP_EOL;
433
+ $file .= '$actionRateL="BlockIP";'.PHP_EOL;
434
+ $file .='?>';
435
+ file_put_contents($fileName,$file);
436
+ $file = $data;
437
+ }
438
+ }
439
+ else if($_POST['actionOnLimitE']=='ThrottleIP' || $_POST['actionOnLimitE'] == 0)
440
+ {
441
+
442
+ $file = $data;
443
+ update_option('actionRateL',0);
444
+ if(strpos($file, 'actionRateL')!=false)
445
+ {
446
+ $content = explode(PHP_EOL, $file);
447
+ $con = '';
448
+ foreach ($content as $line => $lineV) {
449
+ if(strpos($lineV, 'actionRateL')!=false)
450
+ {
451
+ $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
452
+ }
453
+ else
454
+ {
455
+ $con .= $lineV.PHP_EOL;
456
+ }
457
+ }
458
+ file_put_contents($fileName,$con);
459
+ }
460
+ else
461
+ {
462
+ $content = explode('?>', $file);
463
+ $file = $content[0];
464
+ $file .= PHP_EOL;
465
+ $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
466
+ $file .='?>';
467
+ file_put_contents($fileName,$file);
468
+ }
469
+ }
470
+
471
+ }
472
+ exit;
473
+ }
474
+
475
+
476
+
477
+ }
478
+ echo("Error");
479
+ exit;
480
+ }
481
+
482
+
483
+ }
484
+
485
+ private function saveWAF()
486
+ {
487
+ if(isset($_POST['pluginWAF']))
488
+ {
489
+ if($_POST['pluginWAF']=='on')
490
+ {
491
+ update_option('WAF','PluginLevel');
492
+ update_option('WAFEnabled','1');
493
+ echo("PWAFenabled");exit;
494
+ }
495
+ }
496
+ else
497
+ {
498
+ update_option('WAFEnabled','0');
499
+ update_option('WAF','wafDisable');
500
+ echo("PWAFdisabled");exit;
501
+ }
502
+ }
503
+ private function saveHWAF()
504
+ {
505
+ if(!function_exists('mysqli_connect'))
506
+ {
507
+ echo "mysqliDoesNotExit";
508
+ exit;
509
+ }
510
+ if(isset($_POST['htaccessWAF']))
511
+ {
512
+ if($_POST['htaccessWAF']=='on')
513
+ {
514
+ update_option('WAF','HtaccessLevel');
515
+ update_option('WAFEnabled','1');
516
+ $dir_name = dirname(__FILE__);
517
+ $dirN = $dir_name;
518
+ $dirN = str_replace('\\', '/', $dirN);
519
+ $dirN = str_replace('controllers', 'handler', $dirN);
520
+
521
+ $dir_name1 = explode('wp-content', $dir_name);
522
+ $dir_name = $dir_name1[0];
523
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
524
+ $dir_name .='.htaccess';
525
+ $file = file_get_contents($dir_name);
526
+ if(strpos($file, 'php_value auto_prepend_file')!=false)
527
+ {
528
+ echo("WAFConflicts");
529
+ exit;
530
+ }
531
+
532
+ $cont = $file.PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
533
+ $cont .= 'php_value auto_prepend_file '.$dir_name1.'mo-check.php'.PHP_EOL;
534
+ $cont .= '# END miniOrange WAF'.PHP_EOL;
535
+ file_put_contents($dir_name, $cont);
536
+
537
+ $filecontent = file_get_contents($dir_name);
538
+
539
+ $dir_name = dirname(__FILE__);
540
+ $dir_name1 = explode('wp-content', $dir_name);
541
+ $dir_name = $dir_name1[0];
542
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
543
+ $fileName = $filepath.'mo-check.php';
544
+ $file = fopen($fileName, 'w+');
545
+ $dir_name = dirname(__FILE__);
546
+ $filepath = str_replace('\\', '/', $dir_name);
547
+ $filepath = explode('controllers', $filepath);
548
+ $filepath = $filepath[0].'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf.php';
549
+
550
+ $string = '<?php'.PHP_EOL;
551
+ $string .= 'if(file_exists("'.$filepath.'"))'.PHP_EOL;
552
+ $string .= 'include_once("'.$filepath.'");'.PHP_EOL;
553
+ $string .= '?>'.PHP_EOL;
554
+
555
+ fwrite($file, $string);
556
+ fclose($file);
557
+
558
+ if(strpos($filecontent,'mo-check.php')!=false)
559
+ {
560
+ echo "HWAFEnabled";
561
+ exit;
562
+ }
563
+ else
564
+ {
565
+ echo "HWAFEnabledFailed";
566
+ exit;
567
+ }
568
+ }
569
+ }
570
+ else
571
+ {
572
+ update_option('WAF','wafDisable');
573
+ if(isset($_POST['pluginWAF']))
574
+ {
575
+ if($_POST['pluginWAF'] == 'on')
576
+ {
577
+ update_option('WAFEnabled',1);
578
+ update_option('WAF','PluginLevel');
579
+ }
580
+ }
581
+ else
582
+ update_option('WAFEnabled',0);
583
+ $dir_name = dirname(__FILE__);
584
+ $dirN = $dir_name;
585
+ $dirN = str_replace('\\', '/', $dirN);
586
+ $dirN = explode('wp-content', $dirN);
587
+ $dir_name1 = explode('wp-content', $dir_name);
588
+ $dir_name = $dir_name1[0];
589
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
590
+ $dir_name00 = $dir_name1;
591
+ $dir_name1 .='.htaccess';
592
+ $file = file_get_contents($dir_name1);
593
+
594
+ $cont = PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
595
+ $cont .= 'php_value auto_prepend_file '.$dir_name00.'mo-check.php'.PHP_EOL;
596
+ $cont .= '# END miniOrange WAF'.PHP_EOL;
597
+ $file =str_replace($cont,'',$file);
598
+ file_put_contents($dir_name1, $file);
599
+
600
+ $filecontent = file_get_contents($dir_name1);
601
+ if(strpos($filecontent,'mo-check.php')==false)
602
+ {
603
+ echo "HWAFdisabled";
604
+ exit;
605
+ }
606
+ else
607
+ {
608
+ echo "HWAFdisabledFailed";
609
+ exit;
610
+ }
611
+ }
612
+
613
+
614
+ }
615
+ private function savesql()
616
+ {
617
+ if(isset($_POST['SQL']))
618
+ {
619
+ if($_POST['SQL']=='on')
620
+ {
621
+ update_option('SQLInjection',1);
622
+ $dir_name = dirname(__FILE__);
623
+ $dir_name1 = explode('wp-content', $dir_name);
624
+ $dir_name = $dir_name1[0];
625
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
626
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
627
+
628
+ $file = file_get_contents($fileName);
629
+ if(strpos($file, 'SQL')!=false)
630
+ {
631
+ $file = str_replace('$SQL=0;', '$SQL=1;', $file);
632
+ file_put_contents($fileName,$file);
633
+ }
634
+ else
635
+ {
636
+ $content = explode('?>', $file);
637
+ $file = $content[0];
638
+ $file .= PHP_EOL;
639
+ $file .= '$SQL=1;'.PHP_EOL;
640
+ $file .='?>';
641
+ file_put_contents($fileName,$file);
642
+ }
643
+ echo("SQLenable");
644
+ exit;
645
+
646
+ }
647
+ }
648
+ else
649
+ {
650
+ update_option('SQLInjection',0);
651
+
652
+ $dir_name = dirname(__FILE__);
653
+ $dir_name1 = explode('wp-content', $dir_name);
654
+ $dir_name = $dir_name1[0];
655
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
656
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
657
+
658
+ $file = file_get_contents($fileName);
659
+ if(strpos($file, '$SQL')!=false)
660
+ {
661
+ $file = str_replace('$SQL=1;', '$SQL=0;', $file);
662
+ file_put_contents($fileName,$file);
663
+ }
664
+ else
665
+ {
666
+ $content = explode('?>', $file);
667
+ $file = $content[0];
668
+ $file .= PHP_EOL;
669
+ $file .= '$SQL=0;'.PHP_EOL;
670
+ $file .='?>';
671
+ file_put_contents($fileName,$file);
672
+ }
673
+
674
+ echo("SQLdisable");
675
+ exit;
676
+
677
+ }
678
+
679
+ }
680
+ private function saverce()
681
+ {
682
+ if(isset($_POST['RCE']))
683
+ {
684
+ if($_POST['RCE']=='on')
685
+ {
686
+ update_option('RCEAttack',1);
687
+
688
+ $dir_name = dirname(__FILE__);
689
+ $dir_name1 = explode('wp-content', $dir_name);
690
+ $dir_name = $dir_name1[0];
691
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
692
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
693
+
694
+ $file = file_get_contents($fileName);
695
+ if(strpos($file, 'RCE')!=false)
696
+ {
697
+ $file = str_replace('$RCE=0;', '$RCE=1;', $file);
698
+ file_put_contents($fileName,$file);
699
+ }
700
+ else
701
+ {
702
+ $content = explode('?>', $file);
703
+ $file = $content[0];
704
+ $file .= PHP_EOL;
705
+ $file .= '$RCE=1;'.PHP_EOL;
706
+ $file .='?>';
707
+ file_put_contents($fileName,$file);
708
+ }
709
+ echo("RCEenable");
710
+ exit;
711
+ }
712
+ }
713
+ else
714
+ {
715
+ update_option('RCEAttack',0);
716
+
717
+ $dir_name = dirname(__FILE__);
718
+ $dir_name1 = explode('wp-content', $dir_name);
719
+ $dir_name = $dir_name1[0];
720
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
721
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
722
+
723
+ $file = file_get_contents($fileName);
724
+ if(strpos($file, '$RCE')!=false)
725
+ {
726
+ $file = str_replace('$RCE=1;', '$RCE=0;', $file);
727
+ file_put_contents($fileName,$file);
728
+ }
729
+ else
730
+ {
731
+ $content = explode('?>', $file);
732
+ $file = $content[0];
733
+ $file .= PHP_EOL;
734
+ $file .= '$RCE=0;'.PHP_EOL;
735
+ $file .='?>';
736
+ file_put_contents($fileName,$file);
737
+ }
738
+ echo("RCEdisable");
739
+ exit;
740
+
741
+ }
742
+
743
+ }
744
+ private function savexss()
745
+ {
746
+ if(isset($_POST['XSS']))
747
+ {
748
+ if($_POST['XSS']=='on')
749
+ {
750
+ update_option('XSSAttack',1);
751
+ $dir_name = dirname(__FILE__);
752
+ $dir_name1 = explode('wp-content', $dir_name);
753
+ $dir_name = $dir_name1[0];
754
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
755
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
756
+
757
+ $file = file_get_contents($fileName);
758
+ if(strpos($file, 'XSS')!=false)
759
+ {
760
+ $file = str_replace('$XSS=0;', '$XSS=1;', $file);
761
+ file_put_contents($fileName,$file);
762
+ }
763
+ else
764
+ {
765
+ $content = explode('?>', $file);
766
+ $file = $content[0];
767
+ $file .= PHP_EOL;
768
+ $file .= '$XSS=1;'.PHP_EOL;
769
+ $file .='?>';
770
+ file_put_contents($fileName,$file);
771
+ }
772
+ echo("XSSenable");
773
+ exit;
774
+ }
775
+ }
776
+ else
777
+ {
778
+ update_option('XSSAttack',0);
779
+ $dir_name = dirname(__FILE__);
780
+ $dir_name1 = explode('wp-content', $dir_name);
781
+ $dir_name = $dir_name1[0];
782
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
783
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
784
+
785
+ $file = file_get_contents($fileName);
786
+ if(strpos($file, '$XSS')!=false)
787
+ {
788
+ $file = str_replace('$XSS=1;', '$XSS=0;', $file);
789
+ file_put_contents($fileName,$file);
790
+ }
791
+ else
792
+ {
793
+ $content = explode('?>', $file);
794
+ $file = $content[0];
795
+ $file .= PHP_EOL;
796
+ $file .= '$XSS=0;'.PHP_EOL;
797
+ $file .='?>';
798
+ file_put_contents($fileName,$file);
799
+ }
800
+ echo("XSSdisable");
801
+ exit;
802
+ }
803
+
804
+ }
805
+ private function savelfi()
806
+ {
807
+ if(isset($_POST['LFI']))
808
+ {
809
+ if($_POST['LFI']=='on')
810
+ {
811
+ update_option('LFIAttack',1);
812
+ $dir_name = dirname(__FILE__);
813
+ $dir_name1 = explode('wp-content', $dir_name);
814
+ $dir_name = $dir_name1[0];
815
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
816
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
817
+
818
+ $file = file_get_contents($fileName);
819
+ if(strpos($file, 'LFI')!=false)
820
+ {
821
+ $file = str_replace("LFI=0;", "LFI=1;", $file);
822
+ file_put_contents($fileName,$file);
823
+ }
824
+ else
825
+ {
826
+ $content = explode('?>', $file);
827
+ $file = $content[0];
828
+ $file .= PHP_EOL;
829
+ $file .= '$LFI=1;'.PHP_EOL;
830
+ $file .='?>';
831
+ file_put_contents($fileName,$file);
832
+ }
833
+ $file = file_get_contents($fileName);
834
+
835
+ echo("LFIenable");
836
+ exit;
837
+ }
838
+ }
839
+ else
840
+ {
841
+ update_option('LFIAttack',0);
842
+ $dir_name = dirname(__FILE__);
843
+ $dir_name1 = explode('wp-content', $dir_name);
844
+ $dir_name = $dir_name1[0];
845
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
846
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
847
+
848
+ $file = file_get_contents($fileName);
849
+ if(strpos($file, '$LFI')!=false)
850
+ {
851
+ $file = str_replace('$LFI=1;', '$LFI=0;', $file);
852
+ file_put_contents($fileName,$file);
853
+ }
854
+ else
855
+ {
856
+ $content = explode('?>', $file);
857
+ $file = $content[0];
858
+ $file .= PHP_EOL;
859
+ $file .= '$LFI=0;'.PHP_EOL;
860
+ $file .='?>';
861
+ file_put_contents($fileName,$file);
862
+ }
863
+ echo("LFIdisable");
864
+ exit;
865
+ }
866
+
867
+ }
868
+ private function saverfi()
869
+ {
870
+ if(isset($_POST['RFI']))
871
+ {
872
+ if($_POST['RFI']=='on')
873
+ {
874
+ update_option('RFIAttack',1);
875
+ $dir_name = dirname(__FILE__);
876
+ $dir_name1 = explode('wp-content', $dir_name);
877
+ $dir_name = $dir_name1[0];
878
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
879
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
880
+
881
+ $file = file_get_contents($fileName);
882
+ if(strpos($file, 'RFI')!=false)
883
+ {
884
+ $file = str_replace('$RFI=0;', '$RFI=1;', $file);
885
+ file_put_contents($fileName,$file);
886
+ }
887
+ else
888
+ {
889
+ $content = explode('?>', $file);
890
+ $file = $content[0];
891
+ $file .= PHP_EOL;
892
+ $file .= '$RFI=1;'.PHP_EOL;
893
+ $file .='?>';
894
+ file_put_contents($fileName,$file);
895
+ }
896
+ echo("RFIenable");
897
+ exit;
898
+ }
899
+ }
900
+ else
901
+ {
902
+ update_option('RFIAttack',0);
903
+ $dir_name = dirname(__FILE__);
904
+ $dir_name1 = explode('wp-content', $dir_name);
905
+ $dir_name = $dir_name1[0];
906
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
907
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
908
+
909
+ $file = file_get_contents($fileName);
910
+ if(strpos($file, '$RFI')!=false)
911
+ {
912
+ $file = str_replace('$RFI=1;', '$RFI=0;', $file);
913
+ file_put_contents($fileName,$file);
914
+ }
915
+ else
916
+ {
917
+ $content = explode('?>', $file);
918
+ $file = $content[0];
919
+ $file .= PHP_EOL;
920
+ $file .= '$RFI=0;'.PHP_EOL;
921
+ $file .='?>';
922
+ file_put_contents($fileName,$file);
923
+ }
924
+ echo("RFIdisable");
925
+ exit;
926
+ }
927
+
928
+ }
929
+ private function saveRateL()
930
+ {
931
+
932
+ if($_POST['time']!='' && $_POST['req']!='')
933
+ {
934
+ if(is_numeric($_POST['time']) && is_numeric($_POST['req']))
935
+ {
936
+ $dir_name = dirname(__FILE__);
937
+ $dir_name1 = explode('wp-content', $dir_name);
938
+ $dir_name = $dir_name1[0];
939
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
940
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
941
+
942
+ $file = file_get_contents($fileName);
943
+ $data = $file;
944
+ $time = sanitize_text_field($_POST['time']);
945
+ $req = sanitize_text_field($_POST['req']);
946
+ if($time>0 && $req >0)
947
+ {
948
+ update_option('Rate_time',$time);
949
+ update_option('Rate_request',$req);
950
+ update_option('Rate_limiting','1');
951
+
952
+ if(strpos($file, 'RateLimiting')!=false)
953
+ {
954
+ $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
955
+ $data = $file;
956
+ file_put_contents($fileName,$file);
957
+ }
958
+ else
959
+ {
960
+ $content = explode('?>', $file);
961
+ $file = $content[0];
962
+ $file .= PHP_EOL;
963
+ $file .= '$RateLimiting=1;'.PHP_EOL;
964
+ $file .='?>';
965
+ file_put_contents($fileName,$file);
966
+ $data = $file;
967
+ }
968
+
969
+ $file = $data;
970
+ if(strpos($file, 'RequestsPMin')!=false)
971
+ {
972
+ $content = explode(PHP_EOL, $file);
973
+ $con = '';
974
+ $len = sizeof($content);
975
+
976
+ for($i=0;$i<$len;$i++)
977
+ {
978
+ if(strpos($content[$i], 'RequestsPMin')!=false)
979
+ {
980
+ $con.='$RequestsPMin='.$req.';'.PHP_EOL;
981
+ }
982
+ else
983
+ {
984
+ $con .= $content[$i].PHP_EOL;
985
+ }
986
+ }
987
+
988
+ file_put_contents($fileName,$con);
989
+ $data = $con;
990
+
991
+ }
992
+
993
+ else
994
+ {
995
+ $content = explode('?>', $file);
996
+ $file = $content[0];
997
+ $file .= PHP_EOL;
998
+ $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
999
+ $file .='?>';
1000
+ file_put_contents($fileName,$file);
1001
+ $data = $file;
1002
+ }
1003
+
1004
+
1005
+
1006
+ if($_POST['action']=='BlockIP')
1007
+ {
1008
+ update_option('actionRateL',1);
1009
+
1010
+ $file = $data;
1011
+ if(strpos($file, 'actionRateL')!=false)
1012
+ {
1013
+ $content = explode(PHP_EOL, $file);
1014
+ $con = '';
1015
+ foreach ($content as $line => $lineV) {
1016
+ if(strpos($lineV, 'actionRateL')!=false)
1017
+ {
1018
+ $con.='$actionRateL="BlockIP";'.PHP_EOL;
1019
+ }
1020
+ else
1021
+ {
1022
+ $con .= $lineV.PHP_EOL;
1023
+ }
1024
+ }
1025
+ file_put_contents($fileName,$con);
1026
+ }
1027
+ else
1028
+ {
1029
+ $content = explode('?>', $file);
1030
+ $file = $content[0];
1031
+ $file .= PHP_EOL;
1032
+ $file .= '$actionRateL="BlockIP";'.PHP_EOL;
1033
+ $file .='?>';
1034
+ file_put_contents($fileName,$file);
1035
+ $file = $data;
1036
+ }
1037
+ }
1038
+ elseif($_POST['action']=='ThrottleIP')
1039
+ {
1040
+ $file = $data;
1041
+ update_option('actionRateL',0);
1042
+ if(strpos($file, 'actionRateL')!=false)
1043
+ {
1044
+ $content = explode(PHP_EOL, $file);
1045
+ $con = '';
1046
+ foreach ($content as $line => $lineV) {
1047
+ if(strpos($lineV, 'actionRateL')!=false)
1048
+ {
1049
+ $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
1050
+ }
1051
+ else
1052
+ {
1053
+ $con .= $lineV.PHP_EOL;
1054
+ }
1055
+ }
1056
+ file_put_contents($fileName,$con);
1057
+ }
1058
+ else
1059
+ {
1060
+ $content = explode('?>', $file);
1061
+ $file = $content[0];
1062
+ $file .= PHP_EOL;
1063
+ $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
1064
+ $file .='?>';
1065
+ file_put_contents($fileName,$file);
1066
+ }
1067
+ }
1068
+
1069
+ }
1070
+
1071
+ }
1072
+
1073
+ }
1074
+
1075
+ }
1076
+ private function disableRL()
1077
+ {
1078
+ update_option('Rate_limiting',0);
1079
+
1080
+ $dir_name = dirname(__FILE__);
1081
+ $dir_name1 = explode('wp-content', $dir_name);
1082
+ $dir_name = $dir_name1[0];
1083
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
1084
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
1085
+ $file = file_get_contents($fileName);
1086
+
1087
+ if(strpos($file, 'RateLimiting')!=false)
1088
+ {
1089
+ $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
1090
+ file_put_contents($fileName,$file);
1091
+ }
1092
+ else
1093
+ {
1094
+ $content = explode('?>', $file);
1095
+ $file = $content[0];
1096
+ $file .= PHP_EOL;
1097
+ $file .= '$RateLimiting=0;'.PHP_EOL;
1098
+ $file .='?>';
1099
+ file_put_contents($fileName,$file);
1100
+ }
1101
+
1102
+ }
1103
+ private function backupHtaccess()
1104
+ {
1105
+ if(isset($_POST['htaccessWAF']))
1106
+ {
1107
+ if($_POST['htaccessWAF']=='on')
1108
+ {
1109
+ $dir_name = dirname(__FILE__);
1110
+ $dirN = $dir_name;
1111
+ $dirN = str_replace('\\', '/', $dirN);
1112
+ $dir_name1 = explode('wp-content', $dir_name);
1113
+ $dir_name = $dir_name1[0];
1114
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
1115
+ $dir_name =$dir_name1.'.htaccess';
1116
+ $file = file_get_contents($dir_name);
1117
+ $dir_backup = $dir_name1.'htaccess';
1118
+ $handle = fopen($dir_backup, 'c+');
1119
+ fwrite($handle,$file);
1120
+ }
1121
+ }
1122
+ }
1123
+ private function limitAttack()
1124
+ {
1125
+ if(isset($_POST['limitAttack']))
1126
+ {
1127
+ $value = sanitize_text_field($_POST['limitAttack']);
1128
+ if($value>1)
1129
+ {
1130
+ update_option('limitAttack',$value);
1131
+ echo "limitSaved";
1132
+ exit;
1133
+ }
1134
+ else
1135
+ {
1136
+ echo "limitIsLT1";
1137
+ exit;
1138
+ }
1139
+
1140
+ }
1141
+ }
1142
+
1143
+
1144
+
1145
+ function wpns_captcha_settings(){
1146
+ $nonce = $_POST['nonce'];
1147
+ if ( ! wp_verify_nonce( $nonce, 'wpns-captcha' ) ){
1148
+ wp_send_json('ERROR');
1149
+ return;
1150
+ }
1151
+ $site_key = sanitize_text_field($_POST['site_key']);
1152
+ $secret_key = sanitize_text_field($_POST['secret_key']);
1153
+ $enable_captcha = $_POST['enable_captcha'];
1154
+ if($enable_captcha == 'true'){$enable_captcha = "on";}else if($enable_captcha == 'false') {$enable_captcha = "";}
1155
+ $login_form_captcha = $_POST['login_form'];
1156
+ if($login_form_captcha == 'true'){$login_form_captcha = "on";}else if($login_form_captcha == 'false') {$login_form_captcha = "";}
1157
+ $reg_form_captcha = $_POST['registeration_form'];
1158
+ if($reg_form_captcha == 'true'){$reg_form_captcha = "on";}else if($reg_form_captcha == 'false') {$reg_form_captcha = "";}
1159
+
1160
+ if(($site_key == "" || $secret_key == "") and $enable_captcha == 'true'){
1161
+ wp_send_json('empty');
1162
+ return;
1163
+ }
1164
+
1165
+ update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
1166
+ update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
1167
+ update_option( 'mo_wpns_activate_recaptcha' , $enable_captcha );
1168
+
1169
+ if($enable_captcha == "on"){
1170
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , $login_form_captcha );
1171
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', $login_form_captcha );
1172
+ update_option('mo_wpns_activate_recaptcha_for_registration', $reg_form_captcha );
1173
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration',$reg_form_captcha );
1174
+ wp_send_json('true');
1175
+ }
1176
+ else if($enable_captcha == ""){
1177
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , '' );
1178
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', '' );
1179
+ update_option('mo_wpns_activate_recaptcha_for_registration', '' );
1180
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration','' );
1181
+ wp_send_json('false');
1182
+ }
1183
+
1184
+ }
1185
+
1186
+ function wpns_strong_password_settings(){
1187
+ $nonce = $_POST['nonce'];
1188
+ if ( ! wp_verify_nonce( $nonce, 'wpns-strn-pass' ) ){
1189
+ wp_send_json('ERROR');
1190
+ return;
1191
+ }
1192
+ $enable_strong_pass = $_POST['enable_strong_pass'];
1193
+ if($enable_strong_pass == 'true'){$enable_strong_pass = 1;}else if($enable_strong_pass == 'false') {$enable_strong_pass = 0;}
1194
+ $strong_pass_accounts = $_POST['accounts_strong_pass'];
1195
+ update_option('mo2f_enforce_strong_passswords_for_accounts',$strong_pass_accounts);
1196
+ update_option('mo2f_enforce_strong_passswords' , $enable_strong_pass);
1197
+ if($enable_strong_pass){
1198
+ update_option('mo_wpns_enable_rename_login_url',"");
1199
+ wp_send_json('true');
1200
+ }
1201
+ else{
1202
+ wp_send_json('false');
1203
+ }
1204
+ }
1205
+
1206
+ }
1207
+ new wpns_ajax;
1208
+
1209
  ?>
database/database_functions.php CHANGED
@@ -1,814 +1,820 @@
1
- <?php
2
-
3
- require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
4
-
5
- class MoWpnsDB
6
- {
7
- private $transactionTable;
8
- private $blockedIPsTable;
9
- private $whitelistIPsTable;
10
- private $emailAuditTable;
11
- private $malwarereportTable;
12
- private $scanreportdetails;
13
- private $skipfiles;
14
- private $hashfile;
15
-
16
- function __construct()
17
- {
18
- global $wpdb;
19
- $this->transactionTable = $wpdb->base_prefix.'mo2f_network_transactions';
20
- $this->blockedIPsTable = $wpdb->base_prefix.'mo2f_network_blocked_ips';
21
- $this->attackList = $wpdb->base_prefix.'wpns_attack_logs';
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
-
34
- function mo_plugin_activate()
35
- {
36
- global $wpdb;
37
- if(!get_option('mo_wpns_dbversion')||get_option('mo_wpns_dbversion')<MoWpnsConstants::DB_VERSION){
38
- update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
39
- $this->generate_tables();
40
- } else {
41
- $current_db_version = get_option('mo_wpns_dbversion');
42
- if($current_db_version < MoWpnsConstants::DB_VERSION){
43
- update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
44
-
45
- }
46
- }
47
- }
48
-
49
- function generate_tables(){
50
- global $wpdb;
51
-
52
- $tableName = $this->transactionTable;
53
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
54
- {
55
- $sql = "CREATE TABLE " . $tableName . " (
56
- `id` bigint NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL ,
57
- `type` mediumtext NOT NULL , `url` mediumtext NOT NULL , `status` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
58
- dbDelta($sql);
59
- }
60
-
61
- $tableName = $this->blockedIPsTable;
62
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
63
- {
64
- $sql = "CREATE TABLE " . $tableName . " (
65
- `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `reason` mediumtext, `blocked_for_time` int,
66
- `created_timestamp` int, UNIQUE KEY id (id) );";
67
- dbDelta($sql);
68
- }
69
-
70
-
71
- $tableName = $this->whitelistIPsTable;
72
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
73
- {
74
- $sql = "CREATE TABLE " . $tableName . " (
75
- `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
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` ;";
89
- $results1 = $wpdb->query($sql);
90
- }
91
-
92
- $tableName = $this->emailAuditTable;
93
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
94
- {
95
- $sql = "CREATE TABLE " . $tableName . " (
96
- `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL, `reason` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
97
- dbDelta($sql);
98
- }
99
- $tableName = $this->IPrateDetails;
100
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
101
- {
102
- $sql = "CREATE TABLE " . $tableName . " (
103
- ip varchar(20) , time bigint );";
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 ." (
111
- ip varchar(20),
112
- type varchar(20),
113
- time bigint,
114
- input mediumtext );";
115
- //dbDelta($sql);
116
- $results = $wpdb->get_results($sql);
117
-
118
- }
119
- $tableName = $this->malwarereportTable;
120
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
121
- {
122
- $sql = "CREATE TABLE " . $tableName . " (
123
- `id` bigint NOT NULL AUTO_INCREMENT, `scan_mode` mediumtext NOT NULL, `scanned_folders` mediumtext NOT NULL, `scanned_files` int NOT NULL, `malware_count` int NOT NULL DEFAULT 0, `repo_issues` int NOT NULL DEFAULT 0, `malicious_links` int NOT NULL DEFAULT 0, `start_timestamp` int, `completed_timestamp` int, UNIQUE KEY id (id) );";
124
- dbDelta($sql);
125
- }
126
- $result= $wpdb->get_var("SHOW COLUMNS FROM `$tableName` LIKE 'scan_mode'");
127
- if(is_null($result)){
128
- $sql = "ALTER TABLE `$tableName` ADD `scan_mode` mediumtext AFTER `id` ;";
129
- $results1 = $wpdb->query($sql);
130
- $sql1= "UPDATE $this->malwarereportTable SET `scan_mode`='Custom Scan';";
131
- $resluts = $wpdb->query($sql1);
132
- }
133
-
134
- $tableName = $this->scanreportdetails;
135
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
136
- {
137
- $sql = "CREATE TABLE " . $tableName . " (
138
- `id` bigint NOT NULL AUTO_INCREMENT, `report_id` bigint, `filename` mediumtext NOT NULL, `report` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
139
- dbDelta($sql);
140
- }
141
-
142
- $tableName = $this->skipfiles;
143
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
144
- {
145
- $sql = "CREATE TABLE " . $tableName . " (
146
- `id` bigint NOT NULL AUTO_INCREMENT, `path` mediumtext NOT NULL , `signature` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
147
- dbDelta($sql);
148
- }
149
-
150
- $tableName = $this->filescan;
151
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
152
- {
153
- $sql = "CREATE TABLE " . $tableName . " (
154
- `id` bigint NOT NULL AUTO_INCREMENT, `path` mediumtext NOT NULL, `name_hash` varchar(45) NOT NULL, `malware_service` int NOT NULL, `repo_check` int NOT NULL, `link_check` int NOT NULL, PRIMARY KEY id (id), UNIQUE KEY name_hash (name_hash) );";
155
- dbDelta($sql);
156
- }
157
-
158
- $tableName = $this->hashfile;
159
- if($wpdb->get_var("show tables like '$tableName'") != $tableName)
160
- {
161
- $sql = "CREATE TABLE " . $tableName . " (
162
- `id` bigint(20) NOT NULL AUTO_INCREMENT,`file name` varchar(500) NOT NULL,`file hash` mediumtext NOT NULL, `scan_data` mediumtext NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `file name` (`file name`), UNIQUE KEY `id_2`(`id`));";
163
- dbDelta($sql);
164
- }
165
-
166
- $row1 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'malware_count'" );
167
- $row2 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'repo_issues'" );
168
- $row3 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'malicious_links'" );
169
- if(empty($row1) && empty($row1) && empty($row1)){
170
- $result = $wpdb->query("ALTER TABLE $this->malwarereportTable ADD COLUMN `malware_count` INT NOT NULL DEFAULT 0 AFTER `scanned_files`, ADD COLUMN `repo_issues` INT NOT NULL DEFAULT 0 AFTER `malware_count`, ADD COLUMN `malicious_links` INT NOT NULL DEFAULT 0 AFTER `repo_issues`");
171
- if($result){
172
- $report_ids = $wpdb->get_results("SELECT id FROM $this->malwarereportTable");
173
- foreach ($report_ids as $key => $value) {
174
- $scan_detail = $wpdb->get_results("SELECT report FROM $this->scanreportdetails WHERE report_id='".$report_ids[$key]->id."'");
175
- $result = $this->mo_wpns_get_scan_count($scan_detail);
176
- $wpdb->query("UPDATE $this->malwarereportTable SET `malware_count`= '".$result['scan']."', `repo_issues`='".$result['repo']."', `malicious_links`='".$result['extl']."' WHERE id='".$report_ids[$key]->id."'");
177
- }
178
- }
179
- }
180
- $rowhash = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->hashfile." LIKE 'scan_data'" );
181
- if(empty($rowhash)){
182
- $result = $wpdb->query("ALTER TABLE $this->hashfile ADD COLUMN `scan_data` mediumtext NOT NULL");
183
- }
184
- }
185
-
186
- function insert_backup_detail($backup_id,$file_name,$backup_created_timestamp,$plugin_path){
187
- global $wpdb;
188
- $wpdb->insert(
189
- $this->backupdetails,
190
- array(
191
- 'backup_id' =>$backup_id,
192
- 'file_name' =>$file_name,
193
- 'created_timestamp'=> $backup_created_timestamp,
194
- 'plugin_path' => $plugin_path
195
- ));
196
- }
197
-
198
- function get_table_content(){
199
- global $wpdb;
200
- return $wpdb->get_results("SELECT plugin_path,file_name,created_timestamp,id FROM ".$this->backupdetails);
201
- }
202
-
203
- function get_number_of_plugin_backup(){
204
- global $wpdb;
205
-
206
- $plugin_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'plugin'");
207
- $themes_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'themes'");
208
- $wp_files_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'wpfiles'");
209
- $db_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'db'");
210
- $total_backup = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails);
211
- $array = array('plugin_count'=>$plugin_count,'themes_count'=>$themes_count,'wp_files_count'=>$wp_files_count,'db_count'=>$db_count,'total_backup'=>$total_backup);
212
-
213
- return $array;
214
- }
215
-
216
- function delete_file($id){
217
- global $wpdb;
218
- $wpdb->query(
219
- "DELETE FROM ".$this->backupdetails."
220
- WHERE id = ".$id
221
- );
222
- return;
223
- }
224
-
225
- function row_exist($id){
226
- global $wpdb;
227
- $is_exist = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE id =".$id );
228
- return $is_exist;
229
- }
230
-
231
- function get_ip_blocked_count($ipAddress)
232
- {
233
- global $wpdb;
234
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE ip_address = '".$ipAddress."'" );
235
- }
236
- function get_total_blocked_ips()
237
- {
238
- global $wpdb;
239
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
240
- }
241
- function get_total_manual_blocked_ips()
242
- {
243
- global $wpdb;
244
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
245
- }
246
- function get_total_blocked_ips_waf()
247
- {
248
- global $wpdb;
249
- $totalIPBlocked = $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
250
- return $totalIPBlocked - $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
251
- }
252
- function get_blocked_attack_count($attack)
253
- {
254
- global $wpdb;
255
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->attackList." WHERE type = '".$attack."'" );
256
- }
257
-
258
- function get_count_of_blocked_ips(){
259
- global $wpdb;
260
- return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->blockedIPsTable."");
261
- }
262
-
263
-
264
- function get_blocked_ip($entryid)
265
- {
266
- global $wpdb;
267
- return $wpdb->get_results( "SELECT ip_address FROM ".$this->blockedIPsTable." WHERE id=".$entryid );
268
- }
269
-
270
- function get_blocked_ip_list()
271
- {
272
- global $wpdb;
273
- return $wpdb->get_results("SELECT id, reason, ip_address, created_timestamp FROM ".$this->blockedIPsTable);
274
- }
275
-
276
-
277
- function get_blocked_sqli_list()
278
- {
279
- global $wpdb;
280
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='SQL attack'");
281
- }
282
- function get_blocked_rfi_list()
283
- {
284
- global $wpdb;
285
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RFI attack'");
286
- }
287
- function get_blocked_lfi_list()
288
- {
289
- global $wpdb;
290
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='LFI attack'");
291
- }
292
- function get_blocked_rce_list()
293
- {
294
- global $wpdb;
295
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RCE attack'");
296
- }
297
- function get_blocked_xss_list()
298
- {
299
- global $wpdb;
300
- return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='XSS attack'");
301
- }
302
-
303
- function insert_blocked_ip($ipAddress,$reason,$blocked_for_time)
304
- {
305
- global $wpdb;
306
- $wpdb->insert(
307
- $this->blockedIPsTable,
308
- array(
309
- 'ip_address' => $ipAddress,
310
- 'reason' => $reason,
311
- 'blocked_for_time' => $blocked_for_time,
312
- 'created_timestamp' => current_time( 'timestamp' )
313
- )
314
- );
315
- return;
316
- }
317
-
318
- function delete_blocked_ip($entryid)
319
- {
320
- global $wpdb;
321
- $wpdb->query(
322
- "DELETE FROM ".$this->blockedIPsTable."
323
- WHERE id = ".$entryid
324
- );
325
- return;
326
- }
327
-
328
- function get_whitelisted_ip_count($ipAddress)
329
- {
330
- global $wpdb;
331
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->whitelistIPsTable." WHERE ip_address = '".$ipAddress."'" );
332
- }
333
-
334
- function insert_whitelisted_ip($ipAddress)
335
- {
336
- global $wpdb;
337
- $wpdb->insert(
338
- $this->whitelistIPsTable,
339
- array(
340
- 'ip_address' => $ipAddress,
341
- 'created_timestamp' => current_time( 'timestamp' )
342
- )
343
- );
344
- }
345
-
346
- function get_number_of_whitelisted_ips(){
347
- global $wpdb;
348
- return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->whitelistIPsTable."");
349
- }
350
-
351
- function delete_whitelisted_ip($entryid)
352
- {
353
- global $wpdb;
354
- $wpdb->query(
355
- "DELETE FROM ".$this->whitelistIPsTable."
356
- WHERE id = ".$entryid
357
- );
358
- return;
359
- }
360
-
361
- function get_whitelisted_ips_list()
362
- {
363
- global $wpdb;
364
- return $wpdb->get_results( "SELECT id, ip_address, created_timestamp FROM ".$this->whitelistIPsTable );
365
- }
366
-
367
- function get_email_audit_count($ipAddress,$username)
368
- {
369
- global $wpdb;
370
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->emailAuditTable." WHERE ip_address = '".$ipAddress."' AND
371
- username='".$username."'" );
372
- }
373
-
374
- function insert_email_audit($ipAddress,$username,$reason)
375
- {
376
- global $wpdb;
377
- $wpdb->insert(
378
- $this->emailAuditTable,
379
- array(
380
- 'ip_address' => $ipAddress,
381
- 'username' => $username,
382
- 'reason' => $reason,
383
- 'created_timestamp' => current_time( 'timestamp' )
384
- )
385
- );
386
- return;
387
- }
388
-
389
- function insert_transaction_audit($ipAddress,$username,$type,$status,$url=null)
390
- {
391
- global $wpdb;
392
- $data = array(
393
- 'ip_address' => $ipAddress,
394
- 'username' => $username,
395
- 'type' => $type,
396
- 'status' => $status,
397
- 'created_timestamp' => current_time( 'timestamp' )
398
- );
399
- $data['url'] = is_null($url) ? '' : $url;
400
- $wpdb->insert( $this->transactionTable, $data);
401
- return;
402
- }
403
-
404
- function get_transasction_list()
405
- {
406
- global $wpdb;
407
- return $wpdb->get_results( "SELECT ip_address, username, type, status, created_timestamp FROM ".$this->transactionTable." order by id desc limit 5000" );
408
- }
409
-
410
- function get_login_transaction_report()
411
- {
412
- global $wpdb;
413
- return $wpdb->get_results( "SELECT ip_address, username, status, created_timestamp FROM ".$this->transactionTable." WHERE type='User Login' order by id desc limit 5000" );
414
- }
415
-
416
- function get_error_transaction_report()
417
- {
418
- global $wpdb;
419
- return $wpdb->get_results( "SELECT ip_address, username, url, type, created_timestamp FROM ".$this->transactionTable." WHERE type <> 'User Login' order by id desc limit 5000" );
420
- }
421
-
422
- function update_transaction_table($where,$update)
423
- {
424
- global $wpdb;
425
-
426
- $sql = "UPDATE ".$this->transactionTable." SET ";
427
- $i = 0;
428
- foreach($update as $key=>$value)
429
- {
430
- if($i%2!=0)
431
- $sql .= ' , ';
432
- $sql .= $key."='".$value."'";
433
- $i++;
434
- }
435
- $sql .= " WHERE ";
436
- $i = 0;
437
- foreach($where as $key=>$value)
438
- {
439
- if($i%2!=0)
440
- $sql .= ' AND ';
441
- $sql .= $key."='".$value."'";
442
- $i++;
443
- }
444
-
445
- $wpdb->query($sql);
446
- return;
447
- }
448
-
449
- function get_count_of_attacks_blocked(){
450
- global $wpdb;
451
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE status = '".MoWpnsConstants::FAILED."' OR status = '".MoWpnsConstants::PAST_FAILED."'" );
452
- }
453
-
454
- function get_failed_transaction_count($ipAddress)
455
- {
456
- global $wpdb;
457
- return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE ip_address = '".$ipAddress."'
458
- AND status = '".MoWpnsConstants::FAILED."'" );
459
- }
460
-
461
- function delete_transaction($ipAddress)
462
- {
463
- global $wpdb;
464
- $wpdb->query(
465
- "DELETE FROM ".$this->transactionTable."
466
- WHERE ip_address = '".$ipAddress."' AND status='".MoWpnsConstants::FAILED."'"
467
- );
468
- return;
469
- }
470
-
471
- function create_scan_report($folderNames, $scan_type, $start_timestamp, $repo_check_status_code){
472
- global $wpdb;
473
- $wpdb->insert(
474
- $this->malwarereportTable,
475
- array(
476
- 'scan_mode' => $scan_type,
477
- 'scanned_folders' => $folderNames,
478
- 'scanned_files' => 0,
479
- 'start_timestamp' => $start_timestamp,
480
- 'malware_count' => 0,
481
- 'repo_issues' => $repo_check_status_code,
482
- 'malicious_links' => 0
483
- )
484
- );
485
- $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id DESC LIMIT 1");
486
- if($result){
487
- $record = $result[0];
488
- return $record->id;
489
- }
490
- }
491
-
492
- function add_report_details($reportid, $filename, $report){
493
- global $wpdb;
494
- $wpdb->insert(
495
- $this->scanreportdetails,
496
- array(
497
- 'report_id' => $reportid,
498
- 'filename' => $filename,
499
- 'report' => serialize($report),
500
- 'created_timestamp' => current_time('timestamp')
501
- )
502
- );
503
- }
504
-
505
- function scan_report_complete($recordId, $no_of_scanned_files, $malware_count, $repo_issues, $malicious_links){
506
- global $wpdb;
507
- $wpdb->query(
508
- "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
509
- );
510
- }
511
-
512
- function count_files(){
513
- global $wpdb;
514
- $sql= $wpdb->get_results("SELECT SUM(`scanned_files`) AS scan_count FROM ".$this->malwarereportTable);
515
- return $sql[0]->scan_count;
516
- }
517
-
518
- function count_malicious_files(){
519
- global $wpdb;
520
- $sql= $wpdb->get_results("SELECT COUNT(*) AS total_mal FROM ".$this->scanreportdetails);
521
- return $sql[0]->total_mal;
522
- }
523
-
524
- function count_files_last_scan($reportid){
525
- global $wpdb;
526
- $sql= $wpdb->get_results('SELECT * FROM '.$this->malwarereportTable.' WHERE `id`="'.$reportid.'"');
527
- return $sql[0]->scanned_files;
528
- }
529
-
530
- function count_malicious_last_scan($reportid){
531
- global $wpdb;
532
- $sql= $wpdb->get_results('SELECT COUNT(*) AS mal_file FROM '.$this->scanreportdetails.' WHERE `report_id`="'.$reportid.'"');
533
- return $sql[0]->mal_file;
534
- }
535
-
536
- function check_hash($hash_of_file){
537
- global $wpdb;
538
- $sql= 'SELECT * FROM '.$this->hashfile.' WHERE `file hash`="'.$hash_of_file.'"';
539
- $result=$wpdb->get_results( $sql );
540
- return $result;
541
- }
542
-
543
- function insert_hash($source_file_path,$hash_of_file, $scan_data){
544
- global $wpdb;
545
- $source_file_path = addslashes($source_file_path);
546
- $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)."'";
547
- $res=$wpdb->query( $query );
548
- }
549
-
550
- function update_hash($source_file_path, $hash_of_file, $scan_data){
551
- global $wpdb;
552
- $source_file_path = addslashes($source_file_path);
553
- $query= "UPDATE ".$this->hashfile." SET `file hash`='".$hash_of_file."',`scan_data`='".serialize($scan_data)."' WHERE `file name`='".$source_file_path."'";
554
- $res=$wpdb->query( $query );
555
- }
556
-
557
- function delete_hash($source_file_path){
558
- global $wpdb;
559
- $query= "DELETE FROM ".$this->hashfile." WHERE `file name` = '".$source_file_path."'";
560
- $res=$wpdb->query( $query );
561
- }
562
-
563
- function get_infected_file($filename){
564
- global $wpdb;
565
- $filename = addslashes($filename);
566
- $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where filename=".$filename );
567
- return $result;
568
- }
569
-
570
- function insert_files_in_parts($file_path_array){
571
- global $wpdb;
572
- if(!empty($file_path_array)){
573
- $size=sizeof($file_path_array);
574
- $default=0;
575
- $query="INSERT INTO ".$this->filescan."(`path`, `name_hash`, `malware_service`, `repo_check`, `link_check`) VALUES";
576
- for ($i=1; $i <= $size ; $i++) {
577
- $value= $file_path_array[$i];
578
- $value = addslashes($value);
579
- $hash_value= md5($value);
580
- $query.= "('".$value."', '".$hash_value."', '".$default."', '".$default."', '".$default."')";
581
- if($i < $size){
582
- $query.= ",";
583
- }
584
- }
585
- $query.=";";
586
- $res=$wpdb->query( $query );
587
- }
588
- }
589
-
590
- function update_files_scan($file_path_array, $file_count){
591
- global $wpdb;
592
- $query="INSERT INTO ".$this->filescan."(`name_hash`, `malware_service`) VALUES";
593
- for ($i=0; $i < $file_count ; $i++) {
594
- $value= $file_path_array[$i]->path;
595
- $value = addslashes($value);
596
- $value = md5($value);
597
- $query.= "('".$value."', 1)";
598
- if($i < $file_count-1){
599
- $query.= ",";
600
- }
601
- }
602
- $query.=" ON DUPLICATE KEY UPDATE `malware_service`= VALUES(malware_service);";
603
- $res=$wpdb->query( $query );
604
- }
605
-
606
- function update_files_scan_ext_link($file_path_array, $file_count){
607
- global $wpdb;
608
- $query="INSERT INTO ".$this->filescan."(`name_hash`, `link_check`) VALUES";
609
- for ($i=0; $i < $file_count ; $i++) {
610
- $value= $file_path_array[$i]->path;
611
- $value = addslashes($value);
612
- $value = md5($value);
613
- $query.= "('".$value."', 1)";
614
- if($i < $file_count-1){
615
- $query.= ",";
616
- }
617
- }
618
- $query.=" ON DUPLICATE KEY UPDATE `link_check`= VALUES(link_check);";
619
- $res=$wpdb->query( $query );
620
- }
621
-
622
- function update_files_scan_repo($file_path_array, $file_count){
623
- global $wpdb;
624
- $query="INSERT INTO ".$this->filescan."(`name_hash`, `repo_check`) VALUES";
625
- for ($i=0; $i < $file_count ; $i++) {
626
- $value= $file_path_array[$i]->path;
627
- $value = addslashes($value);
628
- $value = md5($value);
629
- $query.= "('".$value."', 1)";
630
- if($i < $file_count-1){
631
- $query.= ",";
632
- }
633
- }
634
- $query.=" ON DUPLICATE KEY UPDATE `repo_check`= VALUES(repo_check);";
635
- $res=$wpdb->query( $query );
636
- }
637
-
638
- function get_files_in_parts(){
639
- global $wpdb;
640
- $sql= 'SELECT * FROM '.$this->filescan.' WHERE `malware_service`= 0 LIMIT 100';
641
- $result=$wpdb->get_results($sql);
642
- return $result;
643
- }
644
-
645
- function get_files_for_link(){
646
- global $wpdb;
647
- $sql= 'SELECT * FROM '.$this->filescan.' WHERE `link_check`= 0 LIMIT 100';
648
- $result=$wpdb->get_results($sql);
649
- return $result;
650
- }
651
-
652
- function get_files_for_repo(){
653
- global $wpdb;
654
- $sql= 'SELECT * FROM '.$this->filescan.' WHERE `repo_check`= 0 LIMIT 100';
655
- $result=$wpdb->get_results($sql);
656
- return $result;
657
- }
658
-
659
- function delete_files_parts(){
660
- global $wpdb;
661
- $sql= "TRUNCATE TABLE ".$this->filescan.";";
662
- $res=$wpdb->query($sql);
663
- }
664
-
665
- function get_last_id(){
666
- global $wpdb;
667
- $result= $wpdb->get_results("SELECT MAX(Id) AS max FROM ".$this->malwarereportTable);
668
- return $result;
669
- }
670
-
671
- function get_report_with_id($reportid){
672
- global $wpdb;
673
- $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." where id=".$reportid );
674
- return $result;
675
- }
676
-
677
- function delete_report($reportid){
678
- global $wpdb;
679
- $wpdb->query(
680
- "DELETE FROM ".$this->malwarereportTable." WHERE id = ".$reportid
681
- );
682
- $warning_count=0;
683
- $malware_count=0;
684
- $last_id=$this->get_last_id();
685
- $send_id=$last_id[0]->max;
686
- if(!is_null($send_id)){
687
- $res = $this->get_report_with_id($send_id);
688
- $record = $res[0];
689
- if($record->malware_count >= 0){
690
- $malware_count = $record->malware_count;
691
- }
692
- if($record->repo_issues < 0){
693
- $warning_count = $record->malicious_links;
694
- }else{
695
- $warning_count = $record->repo_issues + $record->malicious_links;
696
- }
697
- }
698
-
699
- update_option('mo_wpns_infected_files', $malware_count);
700
- update_option('mo_wpns_warning_files', $warning_count);
701
-
702
- }
703
-
704
- function get_report(){
705
- global $wpdb;
706
- $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id desc" );
707
- return $result;
708
- }
709
-
710
- function get_vulnerable_files_count_for_reportid($reportid){
711
- global $wpdb;
712
- $result = $wpdb->get_results( "SELECT count(*) as count FROM ".$this->scanreportdetails." where report_id=".$reportid );
713
- return $result;
714
- }
715
-
716
- function ignorefile($filename){
717
- $signature = md5_file($filename);
718
- global $wpdb;
719
- $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where path = '".$filename."'" );
720
- if($result){
721
- $wpdb->query(
722
- "UPDATE ".$this->skipfiles." SET signature = '".$signature."' WHERE path = '".$filename."'"
723
- );
724
- } else {
725
- $wpdb->insert(
726
- $this->skipfiles,
727
- array(
728
- 'path' => $filename,
729
- 'signature' => $signature,
730
- 'created_timestamp' => current_time('timestamp')
731
- )
732
- );
733
- }
734
- }
735
-
736
- function ignorechangedfile($recordId){
737
- global $wpdb;
738
- $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where id = ".$recordId );
739
- if($result){
740
- $record = $result[0];
741
- $signature = md5_file($record->path);
742
- $wpdb->query(
743
- "UPDATE ".$this->skipfiles." set signature = '".$signature."' WHERE id = ".$recordId
744
- );
745
- }
746
- }
747
-
748
- function getlistofignorefiles(){
749
- global $wpdb;
750
- $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles."" );
751
- return $result;
752
- }
753
-
754
- function get_detail_report_with_id($reportid){
755
- global $wpdb;
756
- $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where report_id=".$reportid );
757
- return $result;
758
- }
759
-
760
- function mo_wpns_upgrade_process_complete(){
761
- $current_db_version = get_option('mo_wpns_dbversion');
762
- if($current_db_version < MoWpnsConstants::DB_VERSION){
763
- update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
764
- $row = $wpdb->get_results( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".$this->malwarereportTable."' AND column_name = 'malware_count' AND column_name='repo_issues' AND column_name='malicious_links'" );
765
- if(empty($row)){
766
- $result = $wpdb->query("ALTER TABLE $this->malwarereportTable ADD COLUMN `malware_count` INT NOT NULL DEFAULT 0 AFTER `scanned_files`, ADD COLUMN `repo_issues` INT NOT NULL DEFAULT 0 AFTER `malware_count`, ADD COLUMN `malicious_links` INT NOT NULL DEFAULT 0 AFTER `repo_issues`");
767
- if($result){
768
- $report_ids = $wpdb->get_results("SELECT id FROM $this->malwarereportTable");
769
- foreach ($report_ids as $key => $value) {
770
- $scan_detail = $wpdb->get_results("SELECT report FROM $this->scanreportdetails WHERE report_id='".$report_ids[$key]->id."'");
771
- $result = $this->mo_wpns_get_scan_count($scan_detail);
772
- $wpdb->query("UPDATE $this->malwarereportTable SET 'malware_count'= '".$result['scan']."', `repo_issues`='".$result['repo']."', `malicious_links`='".$result['extl']."' WHERE id='".$report_ids[$key]->id."'");
773
- }
774
- }
775
- }
776
- $rowhash = $wpdb->get_results( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".$this->hashfile."' AND column_name = 'scan_data'" );
777
- if(empty($rowhash)){
778
- $result = $wpdb->query("ALTER TABLE $this->hashfile ADD COLUMN `scan_data` mediumtext NOT NULL");
779
- }
780
- }
781
- }
782
-
783
- function mo_wpns_get_scan_count($result){
784
- $scan_count = 0;
785
- $repo_count = 0;
786
- $link_count = 0;
787
- $total = 0;
788
- foreach ($result as $key => $value) {
789
- $total+=1;
790
- $temp = unserialize($result[$key]->report);
791
- if(isset($temp['scan'])&&isset($temp['repo'])&&isset($temp['extl'])){
792
- $scan_count++;
793
- $repo_count++;
794
- $link_count++;
795
- }else if(isset($temp['scan'])&&isset($temp['repo'])){
796
- $scan_count++;
797
- $repo_count++;
798
- }else if(isset($temp['scan'])&&isset($temp['extl'])){
799
- $scan_count++;
800
- $link_count++;
801
- }else if(isset($temp['repo'])&&isset($temp['extl'])){
802
- $repo_count++;
803
- $link_count++;
804
- }else if(isset($temp['scan'])){
805
- $scan_count++;
806
- }else if(isset($temp['repo'])){
807
- $repo_count++;
808
- }else if(isset($temp['extl'])){
809
- $link_count++;
810
- }
811
- }
812
- return array('scan'=>$scan_count, 'repo'=>$repo_count, 'extl'=>$link_count);
813
- }
 
 
 
 
 
 
814
  }
1
+ <?php
2
+
3
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
4
+
5
+ class MoWpnsDB
6
+ {
7
+ private $transactionTable;
8
+ private $blockedIPsTable;
9
+ private $whitelistIPsTable;
10
+ private $emailAuditTable;
11
+ private $malwarereportTable;
12
+ private $scanreportdetails;
13
+ private $skipfiles;
14
+ private $hashfile;
15
+
16
+ function __construct()
17
+ {
18
+ global $wpdb;
19
+ $this->transactionTable = $wpdb->base_prefix.'mo2f_network_transactions';
20
+ $this->blockedIPsTable = $wpdb->base_prefix.'mo2f_network_blocked_ips';
21
+ $this->attackList = $wpdb->base_prefix.'wpns_attack_logs';
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
+
34
+ function mo_plugin_activate()
35
+ {
36
+ global $wpdb;
37
+ if(!get_option('mo_wpns_dbversion')||get_option('mo_wpns_dbversion')<MoWpnsConstants::DB_VERSION){
38
+ update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
39
+ $this->generate_tables();
40
+ } else {
41
+ $current_db_version = get_option('mo_wpns_dbversion');
42
+ if($current_db_version < MoWpnsConstants::DB_VERSION){
43
+ update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
44
+
45
+ }
46
+ }
47
+ }
48
+
49
+ function generate_tables(){
50
+ global $wpdb;
51
+
52
+ $tableName = $this->transactionTable;
53
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
54
+ {
55
+ $sql = "CREATE TABLE " . $tableName . " (
56
+ `id` bigint NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL ,
57
+ `type` mediumtext NOT NULL , `url` mediumtext NOT NULL , `status` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
58
+ dbDelta($sql);
59
+ }
60
+
61
+ $tableName = $this->blockedIPsTable;
62
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
63
+ {
64
+ $sql = "CREATE TABLE " . $tableName . " (
65
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `reason` mediumtext, `blocked_for_time` int,
66
+ `created_timestamp` int, UNIQUE KEY id (id) );";
67
+ dbDelta($sql);
68
+ }
69
+
70
+
71
+ $tableName = $this->whitelistIPsTable;
72
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
73
+ {
74
+ $sql = "CREATE TABLE " . $tableName . " (
75
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
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` ;";
89
+ $results1 = $wpdb->query($sql);
90
+ }
91
+
92
+ $tableName = $this->emailAuditTable;
93
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
94
+ {
95
+ $sql = "CREATE TABLE " . $tableName . " (
96
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL, `reason` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
97
+ dbDelta($sql);
98
+ }
99
+ $tableName = $this->IPrateDetails;
100
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
101
+ {
102
+ $sql = "CREATE TABLE " . $tableName . " (
103
+ ip varchar(20) , time bigint );";
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 ." (
111
+ ip varchar(20),
112
+ type varchar(20),
113
+ time bigint,
114
+ input mediumtext );";
115
+ //dbDelta($sql);
116
+ $results = $wpdb->get_results($sql);
117
+
118
+ }
119
+ $tableName = $this->malwarereportTable;
120
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
121
+ {
122
+ $sql = "CREATE TABLE " . $tableName . " (
123
+ `id` bigint NOT NULL AUTO_INCREMENT, `scan_mode` mediumtext NOT NULL, `scanned_folders` mediumtext NOT NULL, `scanned_files` int NOT NULL, `malware_count` int NOT NULL DEFAULT 0, `repo_issues` int NOT NULL DEFAULT 0, `malicious_links` int NOT NULL DEFAULT 0, `start_timestamp` int, `completed_timestamp` int, UNIQUE KEY id (id) );";
124
+ dbDelta($sql);
125
+ }
126
+ $result= $wpdb->get_var("SHOW COLUMNS FROM `$tableName` LIKE 'scan_mode'");
127
+ if(is_null($result)){
128
+ $sql = "ALTER TABLE `$tableName` ADD `scan_mode` mediumtext AFTER `id` ;";
129
+ $results1 = $wpdb->query($sql);
130
+ $sql1= "UPDATE $this->malwarereportTable SET `scan_mode`='Custom Scan';";
131
+ $resluts = $wpdb->query($sql1);
132
+ }
133
+
134
+ $tableName = $this->scanreportdetails;
135
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
136
+ {
137
+ $sql = "CREATE TABLE " . $tableName . " (
138
+ `id` bigint NOT NULL AUTO_INCREMENT, `report_id` bigint, `filename` mediumtext NOT NULL, `report` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
139
+ dbDelta($sql);
140
+ }
141
+
142
+ $tableName = $this->skipfiles;
143
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
144
+ {
145
+ $sql = "CREATE TABLE " . $tableName . " (
146
+ `id` bigint NOT NULL AUTO_INCREMENT, `path` mediumtext NOT NULL , `signature` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
147
+ dbDelta($sql);
148
+ }
149
+
150
+ $tableName = $this->filescan;
151
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
152
+ {
153
+ $sql = "CREATE TABLE " . $tableName . " (
154
+ `id` bigint NOT NULL AUTO_INCREMENT, `path` mediumtext NOT NULL, `name_hash` varchar(45) NOT NULL, `malware_service` int NOT NULL, `repo_check` int NOT NULL, `link_check` int NOT NULL, PRIMARY KEY id (id), UNIQUE KEY name_hash (name_hash) );";
155
+ dbDelta($sql);
156
+ }
157
+
158
+ $tableName = $this->hashfile;
159
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
160
+ {
161
+ $sql = "CREATE TABLE " . $tableName . " (
162
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,`file name` varchar(500) NOT NULL,`file hash` mediumtext NOT NULL, `scan_data` mediumtext NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `file name` (`file name`), UNIQUE KEY `id_2`(`id`));";
163
+ dbDelta($sql);
164
+ }
165
+
166
+ $row1 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'malware_count'" );
167
+ $row2 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'repo_issues'" );
168
+ $row3 = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->malwarereportTable." LIKE 'malicious_links'" );
169
+ if(empty($row1) && empty($row1) && empty($row1)){
170
+ $result = $wpdb->query("ALTER TABLE $this->malwarereportTable ADD COLUMN `malware_count` INT NOT NULL DEFAULT 0 AFTER `scanned_files`, ADD COLUMN `repo_issues` INT NOT NULL DEFAULT 0 AFTER `malware_count`, ADD COLUMN `malicious_links` INT NOT NULL DEFAULT 0 AFTER `repo_issues`");
171
+ if($result){
172
+ $report_ids = $wpdb->get_results("SELECT id FROM $this->malwarereportTable");
173
+ foreach ($report_ids as $key => $value) {
174
+ $scan_detail = $wpdb->get_results("SELECT report FROM $this->scanreportdetails WHERE report_id='".$report_ids[$key]->id."'");
175
+ $result = $this->mo_wpns_get_scan_count($scan_detail);
176
+ $wpdb->query("UPDATE $this->malwarereportTable SET `malware_count`= '".$result['scan']."', `repo_issues`='".$result['repo']."', `malicious_links`='".$result['extl']."' WHERE id='".$report_ids[$key]->id."'");
177
+ }
178
+ }
179
+ }
180
+ $rowhash = $wpdb->get_results( "SHOW COLUMNS FROM ".$this->hashfile." LIKE 'scan_data'" );
181
+ if(empty($rowhash)){
182
+ $result = $wpdb->query("ALTER TABLE $this->hashfile ADD COLUMN `scan_data` mediumtext NOT NULL");
183
+ }
184
+ }
185
+
186
+ function insert_backup_detail($backup_id,$file_name,$backup_created_timestamp,$plugin_path){
187
+ global $wpdb;
188
+ $wpdb->insert(
189
+ $this->backupdetails,
190
+ array(
191
+ 'backup_id' =>$backup_id,
192
+ 'file_name' =>$file_name,
193
+ 'created_timestamp'=> $backup_created_timestamp,
194
+ 'plugin_path' => $plugin_path
195
+ ));
196
+ }
197
+
198
+ function get_table_content(){
199
+ global $wpdb;
200
+ return $wpdb->get_results("SELECT plugin_path,file_name,created_timestamp,id FROM ".$this->backupdetails);
201
+ }
202
+
203
+ function get_number_of_plugin_backup(){
204
+ global $wpdb;
205
+
206
+ $plugin_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'plugin'");
207
+ $themes_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'themes'");
208
+ $wp_files_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'wpfiles'");
209
+ $db_count = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE backup_id = 'db'");
210
+ $total_backup = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails);
211
+ $array = array('plugin_count'=>$plugin_count,'themes_count'=>$themes_count,'wp_files_count'=>$wp_files_count,'db_count'=>$db_count,'total_backup'=>$total_backup);
212
+
213
+ return $array;
214
+ }
215
+
216
+ function delete_file($id){
217
+ global $wpdb;
218
+ $wpdb->query(
219
+ "DELETE FROM ".$this->backupdetails."
220
+ WHERE id = ".$id
221
+ );
222
+ return;
223
+ }
224
+
225
+ function row_exist($id){
226
+ global $wpdb;
227
+ $is_exist = $wpdb->get_var("SELECT COUNT(*) FROM ".$this->backupdetails." WHERE id =".$id );
228
+ return $is_exist;
229
+ }
230
+
231
+ function get_ip_blocked_count($ipAddress)
232
+ {
233
+ global $wpdb;
234
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE ip_address = '".$ipAddress."'" );
235
+ }
236
+ function get_total_blocked_ips()
237
+ {
238
+ global $wpdb;
239
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
240
+ }
241
+ function get_total_manual_blocked_ips()
242
+ {
243
+ global $wpdb;
244
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
245
+ }
246
+ function get_total_blocked_ips_waf()
247
+ {
248
+ global $wpdb;
249
+ $totalIPBlocked = $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
250
+ return $totalIPBlocked - $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
251
+ }
252
+ function get_blocked_attack_count($attack)
253
+ {
254
+ global $wpdb;
255
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->attackList." WHERE type = '".$attack."'" );
256
+ }
257
+
258
+ function get_count_of_blocked_ips(){
259
+ global $wpdb;
260
+ return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->blockedIPsTable."");
261
+ }
262
+
263
+
264
+ function get_blocked_ip($entryid)
265
+ {
266
+ global $wpdb;
267
+ return $wpdb->get_results( "SELECT ip_address FROM ".$this->blockedIPsTable." WHERE id=".$entryid );
268
+ }
269
+
270
+ function get_blocked_ip_list()
271
+ {
272
+ global $wpdb;
273
+ return $wpdb->get_results("SELECT id, reason, ip_address, created_timestamp FROM ".$this->blockedIPsTable);
274
+ }
275
+
276
+ function get_blocked_attack_list($tableName)
277
+ {
278
+ global $wpdb;
279
+ $tableName = $wpdb->base_prefix.$tableName;
280
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$tableName);
281
+ }
282
+
283
+ function get_blocked_sqli_list()
284
+ {
285
+ global $wpdb;
286
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='SQL attack'");
287
+ }
288
+ function get_blocked_rfi_list()
289
+ {
290
+ global $wpdb;
291
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RFI attack'");
292
+ }
293
+ function get_blocked_lfi_list()
294
+ {
295
+ global $wpdb;
296
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='LFI attack'");
297
+ }
298
+ function get_blocked_rce_list()
299
+ {
300
+ global $wpdb;
301
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RCE attack'");
302
+ }
303
+ function get_blocked_xss_list()
304
+ {
305
+ global $wpdb;
306
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='XSS attack'");
307
+ }
308
+
309
+ function insert_blocked_ip($ipAddress,$reason,$blocked_for_time)
310
+ {
311
+ global $wpdb;
312
+ $wpdb->insert(
313
+ $this->blockedIPsTable,
314
+ array(
315
+ 'ip_address' => $ipAddress,
316
+ 'reason' => $reason,
317
+ 'blocked_for_time' => $blocked_for_time,
318
+ 'created_timestamp' => current_time( 'timestamp' )
319
+ )
320
+ );
321
+ return;
322
+ }
323
+
324
+ function delete_blocked_ip($entryid)
325
+ {
326
+ global $wpdb;
327
+ $wpdb->query(
328
+ "DELETE FROM ".$this->blockedIPsTable."
329
+ WHERE id = ".$entryid
330
+ );
331
+ return;
332
+ }
333
+
334
+ function get_whitelisted_ip_count($ipAddress)
335
+ {
336
+ global $wpdb;
337
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->whitelistIPsTable." WHERE ip_address = '".$ipAddress."'" );
338
+ }
339
+
340
+ function insert_whitelisted_ip($ipAddress)
341
+ {
342
+ global $wpdb;
343
+ $wpdb->insert(
344
+ $this->whitelistIPsTable,
345
+ array(
346
+ 'ip_address' => $ipAddress,
347
+ 'created_timestamp' => current_time( 'timestamp' )
348
+ )
349
+ );
350
+ }
351
+
352
+ function get_number_of_whitelisted_ips(){
353
+ global $wpdb;
354
+ return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->whitelistIPsTable."");
355
+ }
356
+
357
+ function delete_whitelisted_ip($entryid)
358
+ {
359
+ global $wpdb;
360
+ $wpdb->query(
361
+ "DELETE FROM ".$this->whitelistIPsTable."
362
+ WHERE id = ".$entryid
363
+ );
364
+ return;
365
+ }
366
+
367
+ function get_whitelisted_ips_list()
368
+ {
369
+ global $wpdb;
370
+ return $wpdb->get_results( "SELECT id, ip_address, created_timestamp FROM ".$this->whitelistIPsTable );
371
+ }
372
+
373
+ function get_email_audit_count($ipAddress,$username)
374
+ {
375
+ global $wpdb;
376
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->emailAuditTable." WHERE ip_address = '".$ipAddress."' AND
377
+ username='".$username."'" );
378
+ }
379
+
380
+ function insert_email_audit($ipAddress,$username,$reason)
381
+ {
382
+ global $wpdb;
383
+ $wpdb->insert(
384
+ $this->emailAuditTable,
385
+ array(
386
+ 'ip_address' => $ipAddress,
387
+ 'username' => $username,
388
+ 'reason' => $reason,
389
+ 'created_timestamp' => current_time( 'timestamp' )
390
+ )
391
+ );
392
+ return;
393
+ }
394
+
395
+ function insert_transaction_audit($ipAddress,$username,$type,$status,$url=null)
396
+ {
397
+ global $wpdb;
398
+ $data = array(
399
+ 'ip_address' => $ipAddress,
400
+ 'username' => $username,
401
+ 'type' => $type,
402
+ 'status' => $status,
403
+ 'created_timestamp' => current_time( 'timestamp' )
404
+ );
405
+ $data['url'] = is_null($url) ? '' : $url;
406
+ $wpdb->insert( $this->transactionTable, $data);
407
+ return;
408
+ }
409
+
410
+ function get_transasction_list()
411
+ {
412
+ global $wpdb;
413
+ return $wpdb->get_results( "SELECT ip_address, username, type, status, created_timestamp FROM ".$this->transactionTable." order by id desc limit 5000" );
414
+ }
415
+
416
+ function get_login_transaction_report()
417
+ {
418
+ global $wpdb;
419
+ return $wpdb->get_results( "SELECT ip_address, username, status, created_timestamp FROM ".$this->transactionTable." WHERE type='User Login' order by id desc limit 5000" );
420
+ }
421
+
422
+ function get_error_transaction_report()
423
+ {
424
+ global $wpdb;
425
+ return $wpdb->get_results( "SELECT ip_address, username, url, type, created_timestamp FROM ".$this->transactionTable." WHERE type <> 'User Login' order by id desc limit 5000" );
426
+ }
427
+
428
+ function update_transaction_table($where,$update)
429
+ {
430
+ global $wpdb;
431
+
432
+ $sql = "UPDATE ".$this->transactionTable." SET ";
433
+ $i = 0;
434
+ foreach($update as $key=>$value)
435
+ {
436
+ if($i%2!=0)
437
+ $sql .= ' , ';
438
+ $sql .= $key."='".$value."'";
439
+ $i++;
440
+ }
441
+ $sql .= " WHERE ";
442
+ $i = 0;
443
+ foreach($where as $key=>$value)
444
+ {
445
+ if($i%2!=0)
446
+ $sql .= ' AND ';
447
+ $sql .= $key."='".$value."'";
448
+ $i++;
449
+ }
450
+
451
+ $wpdb->query($sql);
452
+ return;
453
+ }
454
+
455
+ function get_count_of_attacks_blocked(){
456
+ global $wpdb;
457
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE status = '".MoWpnsConstants::FAILED."' OR status = '".MoWpnsConstants::PAST_FAILED."'" );
458
+ }
459
+
460
+ function get_failed_transaction_count($ipAddress)
461
+ {
462
+ global $wpdb;
463
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE ip_address = '".$ipAddress."'
464
+ AND status = '".MoWpnsConstants::FAILED."'" );
465
+ }
466
+
467
+ function delete_transaction($ipAddress)
468
+ {
469
+ global $wpdb;
470
+ $wpdb->query(
471
+ "DELETE FROM ".$this->transactionTable."
472
+ WHERE ip_address = '".$ipAddress."' AND status='".MoWpnsConstants::FAILED."'"
473
+ );
474
+ return;
475
+ }
476
+
477
+ function create_scan_report($folderNames, $scan_type, $start_timestamp, $repo_check_status_code){
478
+ global $wpdb;
479
+ $wpdb->insert(
480
+ $this->malwarereportTable,
481
+ array(
482
+ 'scan_mode' => $scan_type,
483
+ 'scanned_folders' => $folderNames,
484
+ 'scanned_files' => 0,
485
+ 'start_timestamp' => $start_timestamp,
486
+ 'malware_count' => 0,
487
+ 'repo_issues' => $repo_check_status_code,
488
+ 'malicious_links' => 0
489
+ )
490
+ );
491
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id DESC LIMIT 1");
492
+ if($result){
493
+ $record = $result[0];
494
+ return $record->id;
495
+ }
496
+ }
497
+
498
+ function add_report_details($reportid, $filename, $report){
499
+ global $wpdb;
500
+ $wpdb->insert(
501
+ $this->scanreportdetails,
502
+ array(
503
+ 'report_id' => $reportid,
504
+ 'filename' => $filename,
505
+ 'report' => serialize($report),
506
+ 'created_timestamp' => current_time('timestamp')
507
+ )
508
+ );
509
+ }
510
+
511
+ function scan_report_complete($recordId, $no_of_scanned_files, $malware_count, $repo_issues, $malicious_links){
512
+ global $wpdb;
513
+ $wpdb->query(
514
+ "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
515
+ );
516
+ }
517
+
518
+ function count_files(){
519
+ global $wpdb;
520
+ $sql= $wpdb->get_results("SELECT SUM(`scanned_files`) AS scan_count FROM ".$this->malwarereportTable);
521
+ return $sql[0]->scan_count;
522
+ }
523
+
524
+ function count_malicious_files(){
525
+ global $wpdb;
526
+ $sql= $wpdb->get_results("SELECT COUNT(*) AS total_mal FROM ".$this->scanreportdetails);
527
+ return $sql[0]->total_mal;
528
+ }
529
+
530
+ function count_files_last_scan($reportid){
531
+ global $wpdb;
532
+ $sql= $wpdb->get_results('SELECT * FROM '.$this->malwarereportTable.' WHERE `id`="'.$reportid.'"');
533
+ return $sql[0]->scanned_files;
534
+ }
535
+
536
+ function count_malicious_last_scan($reportid){
537
+ global $wpdb;
538
+ $sql= $wpdb->get_results('SELECT COUNT(*) AS mal_file FROM '.$this->scanreportdetails.' WHERE `report_id`="'.$reportid.'"');
539
+ return $sql[0]->mal_file;
540
+ }
541
+
542
+ function check_hash($hash_of_file){
543
+ global $wpdb;
544
+ $sql= 'SELECT * FROM '.$this->hashfile.' WHERE `file hash`="'.$hash_of_file.'"';
545
+ $result=$wpdb->get_results( $sql );
546
+ return $result;
547
+ }
548
+
549
+ function insert_hash($source_file_path,$hash_of_file, $scan_data){
550
+ global $wpdb;
551
+ $source_file_path = addslashes($source_file_path);
552
+ $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)."'";
553
+ $res=$wpdb->query( $query );
554
+ }
555
+
556
+ function update_hash($source_file_path, $hash_of_file, $scan_data){
557
+ global $wpdb;
558
+ $source_file_path = addslashes($source_file_path);
559
+ $query= "UPDATE ".$this->hashfile." SET `file hash`='".$hash_of_file."',`scan_data`='".serialize($scan_data)."' WHERE `file name`='".$source_file_path."'";
560
+ $res=$wpdb->query( $query );
561
+ }
562
+
563
+ function delete_hash($source_file_path){
564
+ global $wpdb;
565
+ $query= "DELETE FROM ".$this->hashfile." WHERE `file name` = '".$source_file_path."'";
566
+ $res=$wpdb->query( $query );
567
+ }
568
+
569
+ function get_infected_file($filename){
570
+ global $wpdb;
571
+ $filename = addslashes($filename);
572
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where filename=".$filename );
573
+ return $result;
574
+ }
575
+
576
+ function insert_files_in_parts($file_path_array){
577
+ global $wpdb;
578
+ if(!empty($file_path_array)){
579
+ $size=sizeof($file_path_array);
580
+ $default=0;
581
+ $query="INSERT INTO ".$this->filescan."(`path`, `name_hash`, `malware_service`, `repo_check`, `link_check`) VALUES";
582
+ for ($i=1; $i <= $size ; $i++) {
583
+ $value= $file_path_array[$i];
584
+ $value = addslashes($value);
585
+ $hash_value= md5($value);
586
+ $query.= "('".$value."', '".$hash_value."', '".$default."', '".$default."', '".$default."')";
587
+ if($i < $size){
588
+ $query.= ",";
589
+ }
590
+ }
591
+ $query.=";";
592
+ $res=$wpdb->query( $query );
593
+ }
594
+ }
595
+
596
+ function update_files_scan($file_path_array, $file_count){
597
+ global $wpdb;
598
+ $query="INSERT INTO ".$this->filescan."(`name_hash`, `malware_service`) VALUES";
599
+ for ($i=0; $i < $file_count ; $i++) {
600
+ $value= $file_path_array[$i]->path;
601
+ $value = addslashes($value);
602
+ $value = md5($value);
603
+ $query.= "('".$value."', 1)";
604
+ if($i < $file_count-1){
605
+ $query.= ",";
606
+ }
607
+ }
608
+ $query.=" ON DUPLICATE KEY UPDATE `malware_service`= VALUES(malware_service);";
609
+ $res=$wpdb->query( $query );
610
+ }
611
+
612
+ function update_files_scan_ext_link($file_path_array, $file_count){
613
+ global $wpdb;
614
+ $query="INSERT INTO ".$this->filescan."(`name_hash`, `link_check`) VALUES";
615
+ for ($i=0; $i < $file_count ; $i++) {
616
+ $value= $file_path_array[$i]->path;
617
+ $value = addslashes($value);
618
+ $value = md5($value);
619
+ $query.= "('".$value."', 1)";
620
+ if($i < $file_count-1){
621
+ $query.= ",";
622
+ }
623
+ }
624
+ $query.=" ON DUPLICATE KEY UPDATE `link_check`= VALUES(link_check);";
625
+ $res=$wpdb->query( $query );
626
+ }
627
+
628
+ function update_files_scan_repo($file_path_array, $file_count){
629
+ global $wpdb;
630
+ $query="INSERT INTO ".$this->filescan."(`name_hash`, `repo_check`) VALUES";
631
+ for ($i=0; $i < $file_count ; $i++) {
632
+ $value= $file_path_array[$i]->path;
633
+ $value = addslashes($value);
634
+ $value = md5($value);
635
+ $query.= "('".$value."', 1)";
636
+ if($i < $file_count-1){
637
+ $query.= ",";
638
+ }
639
+ }
640
+ $query.=" ON DUPLICATE KEY UPDATE `repo_check`= VALUES(repo_check);";
641
+ $res=$wpdb->query( $query );
642
+ }
643
+
644
+ function get_files_in_parts(){
645
+ global $wpdb;
646
+ $sql= 'SELECT * FROM '.$this->filescan.' WHERE `malware_service`= 0 LIMIT 100';
647
+ $result=$wpdb->get_results($sql);
648
+ return $result;
649
+ }
650
+
651
+ function get_files_for_link(){
652
+ global $wpdb;
653
+ $sql= 'SELECT * FROM '.$this->filescan.' WHERE `link_check`= 0 LIMIT 100';
654
+ $result=$wpdb->get_results($sql);
655
+ return $result;
656
+ }
657
+
658
+ function get_files_for_repo(){
659
+ global $wpdb;
660
+ $sql= 'SELECT * FROM '.$this->filescan.' WHERE `repo_check`= 0 LIMIT 100';
661
+ $result=$wpdb->get_results($sql);
662
+ return $result;
663
+ }
664
+
665
+ function delete_files_parts(){
666
+ global $wpdb;
667
+ $sql= "TRUNCATE TABLE ".$this->filescan.";";
668
+ $res=$wpdb->query($sql);
669
+ }
670
+
671
+ function get_last_id(){
672
+ global $wpdb;
673
+ $result= $wpdb->get_results("SELECT MAX(Id) AS max FROM ".$this->malwarereportTable);
674
+ return $result;
675
+ }
676
+
677
+ function get_report_with_id($reportid){
678
+ global $wpdb;
679
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." where id=".$reportid );
680
+ return $result;
681
+ }
682
+
683
+ function delete_report($reportid){
684
+ global $wpdb;
685
+ $wpdb->query(
686
+ "DELETE FROM ".$this->malwarereportTable." WHERE id = ".$reportid
687
+ );
688
+ $warning_count=0;
689
+ $malware_count=0;
690
+ $last_id=$this->get_last_id();
691
+ $send_id=$last_id[0]->max;
692
+ if(!is_null($send_id)){
693
+ $res = $this->get_report_with_id($send_id);
694
+ $record = $res[0];
695
+ if($record->malware_count >= 0){
696
+ $malware_count = $record->malware_count;
697
+ }
698
+ if($record->repo_issues < 0){
699
+ $warning_count = $record->malicious_links;
700
+ }else{
701
+ $warning_count = $record->repo_issues + $record->malicious_links;
702
+ }
703
+ }
704
+
705
+ update_option('mo_wpns_infected_files', $malware_count);
706
+ update_option('mo_wpns_warning_files', $warning_count);
707
+
708
+ }
709
+
710
+ function get_report(){
711
+ global $wpdb;
712
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id desc" );
713
+ return $result;
714
+ }
715
+
716
+ function get_vulnerable_files_count_for_reportid($reportid){
717
+ global $wpdb;
718
+ $result = $wpdb->get_results( "SELECT count(*) as count FROM ".$this->scanreportdetails." where report_id=".$reportid );
719
+ return $result;
720
+ }
721
+
722
+ function ignorefile($filename){
723
+ $signature = md5_file($filename);
724
+ global $wpdb;
725
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where path = '".$filename."'" );
726
+ if($result){
727
+ $wpdb->query(
728
+ "UPDATE ".$this->skipfiles." SET signature = '".$signature."' WHERE path = '".$filename."'"
729
+ );
730
+ } else {
731
+ $wpdb->insert(
732
+ $this->skipfiles,
733
+ array(
734
+ 'path' => $filename,
735
+ 'signature' => $signature,
736
+ 'created_timestamp' => current_time('timestamp')
737
+ )
738
+ );
739
+ }
740
+ }
741
+
742
+ function ignorechangedfile($recordId){
743
+ global $wpdb;
744
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where id = ".$recordId );
745
+ if($result){
746
+ $record = $result[0];
747
+ $signature = md5_file($record->path);
748
+ $wpdb->query(
749
+ "UPDATE ".$this->skipfiles." set signature = '".$signature."' WHERE id = ".$recordId
750
+ );
751
+ }
752
+ }
753
+
754
+ function getlistofignorefiles(){
755
+ global $wpdb;
756
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles."" );
757
+ return $result;
758
+ }
759
+
760
+ function get_detail_report_with_id($reportid){
761
+ global $wpdb;
762
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where report_id=".$reportid );
763
+ return $result;
764
+ }
765
+
766
+ function mo_wpns_upgrade_process_complete(){
767
+ $current_db_version = get_option('mo_wpns_dbversion');
768
+ if($current_db_version < MoWpnsConstants::DB_VERSION){
769
+ update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
770
+ $row = $wpdb->get_results( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".$this->malwarereportTable."' AND column_name = 'malware_count' AND column_name='repo_issues' AND column_name='malicious_links'" );
771
+ if(empty($row)){
772
+ $result = $wpdb->query("ALTER TABLE $this->malwarereportTable ADD COLUMN `malware_count` INT NOT NULL DEFAULT 0 AFTER `scanned_files`, ADD COLUMN `repo_issues` INT NOT NULL DEFAULT 0 AFTER `malware_count`, ADD COLUMN `malicious_links` INT NOT NULL DEFAULT 0 AFTER `repo_issues`");
773
+ if($result){
774
+ $report_ids = $wpdb->get_results("SELECT id FROM $this->malwarereportTable");
775
+ foreach ($report_ids as $key => $value) {
776
+ $scan_detail = $wpdb->get_results("SELECT report FROM $this->scanreportdetails WHERE report_id='".$report_ids[$key]->id."'");
777
+ $result = $this->mo_wpns_get_scan_count($scan_detail);
778
+ $wpdb->query("UPDATE $this->malwarereportTable SET 'malware_count'= '".$result['scan']."', `repo_issues`='".$result['repo']."', `malicious_links`='".$result['extl']."' WHERE id='".$report_ids[$key]->id."'");
779
+ }
780
+ }
781
+ }
782
+ $rowhash = $wpdb->get_results( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".$this->hashfile."' AND column_name = 'scan_data'" );
783
+ if(empty($rowhash)){
784
+ $result = $wpdb->query("ALTER TABLE $this->hashfile ADD COLUMN `scan_data` mediumtext NOT NULL");
785
+ }
786
+ }
787
+ }
788
+
789
+ function mo_wpns_get_scan_count($result){
790
+ $scan_count = 0;
791
+ $repo_count = 0;
792
+ $link_count = 0;
793
+ $total = 0;
794
+ foreach ($result as $key => $value) {
795
+ $total+=1;
796
+ $temp = unserialize($result[$key]->report);
797
+ if(isset($temp['scan'])&&isset($temp['repo'])&&isset($temp['extl'])){
798
+ $scan_count++;
799
+ $repo_count++;
800
+ $link_count++;
801
+ }else if(isset($temp['scan'])&&isset($temp['repo'])){
802
+ $scan_count++;
803
+ $repo_count++;
804
+ }else if(isset($temp['scan'])&&isset($temp['extl'])){
805
+ $scan_count++;
806
+ $link_count++;
807
+ }else if(isset($temp['repo'])&&isset($temp['extl'])){
808
+ $repo_count++;
809
+ $link_count++;
810
+ }else if(isset($temp['scan'])){
811
+ $scan_count++;
812
+ }else if(isset($temp['repo'])){
813
+ $repo_count++;
814
+ }else if(isset($temp['extl'])){
815
+ $link_count++;
816
+ }
817
+ }
818
+ return array('scan'=>$scan_count, 'repo'=>$repo_count, 'extl'=>$link_count);
819
+ }
820
  }
database/database_functions_2fa.php CHANGED
@@ -60,8 +60,10 @@ class Mo2fDB {
60
  add_site_option( 'cmVtYWluaW5nT1RQ' ,30);
61
  add_site_option( 'bGltaXRSZWFjaGVk' ,0);
62
  add_site_option( base64_encode('totalUsersCloud'),0);
63
- add_site_option( 'mo2f_inline_registration',1);
64
-
 
 
65
  $check_if_column_exists = $this->check_if_column_exists( 'mo2f_user_details', "mo2f_OTPOverEmail_config_status" );
66
 
67
  if ( ! $check_if_column_exists ) {
60
  add_site_option( 'cmVtYWluaW5nT1RQ' ,30);
61
  add_site_option( 'bGltaXRSZWFjaGVk' ,0);
62
  add_site_option( base64_encode('totalUsersCloud'),0);
63
+
64
+
65
+
66
+
67
  $check_if_column_exists = $this->check_if_column_exists( 'mo2f_user_details', "mo2f_OTPOverEmail_config_status" );
68
 
69
  if ( ! $check_if_column_exists ) {
database/mo2f_db_options.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $GLOBALS['mo2f_enable_brute_force'] = false;
3
+ $GLOBALS['mo2f_show_remaining_attempts'] = false;
4
+ $GLOBALS['mo_wpns_enable_ip_blocked_email_to_admin'] = false;
5
+ $GLOBALS['mo2f_activate_plugin'] = 1;
6
+ $GLOBALS['mo2f_login_option'] = 1;
7
+ $GLOBALS['mo2f_number_of_transactions'] = 1;
8
+ $GLOBALS['mo2f_set_transactions'] = 0;
9
+ $GLOBALS['mo2f_enable_forgotphone'] = 0;
10
+ $GLOBALS['mo2f_enable_2fa_for_users'] = 1;
11
+ $GLOBALS['mo2f_enable_2fa_prompt_on_login_page'] = 0;
12
+ $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['mo_database_backup'] = 1;
25
+ $GLOBALS['mo_wpns_scan_initialize'] = 1;
26
+ $GLOBALS['mo_file_manual_backup_plugins'] = 1;
27
+ $GLOBALS['mo_file_manual_backup_themes'] = 1;
28
+ $GLOBALS['mo_schedule_database_backup'] = 1;
29
+ $GLOBALS['mo_wpns_2fa_with_network_security'] = 0;
30
+ $GLOBALS['mo_wpns_2fa_with_network_security_popup_visible'] = 1;
31
+ $GLOBALS['mo2f_two_factor_tour'] = -1;
32
+ $GLOBALS['mo2f_planname'] = '';
33
+ $GLOBALS['cmVtYWluaW5nT1RQ'] = 30;
34
+ $GLOBALS['bGltaXRSZWFjaGVk'] = 0;
35
+ $GLOBALS['mo2f_is_NC'] = 1;
36
+ $GLOBALS['mo2f_is_NNC'] = 1;
37
+ $GLOBALS['mo2f_enforce_strong_passswords'] = false;
handler/WAF/database/mo-waf-db-common.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function retrivefullname($name)
3
+ {
4
+
5
+ switch ($name) {
6
+ case 'XSS':
7
+ return 'Cross-site Scripting';
8
+ case 'SQL':
9
+ return 'SQL injection';
10
+ case 'RCE':
11
+ return 'Remote Code Execution';
12
+ case 'LFI':
13
+ return 'Local File Inclusion';
14
+ case 'RFI':
15
+ return 'Remote File Inclusion';
16
+ case 'RLE':
17
+ return 'Rate limiting Exceeded';
18
+ case 'RLECrawler':
19
+ return 'Rate limit Exceeded for crawler';
20
+ default:
21
+ return $name;
22
+
23
+ }
24
+
25
+ }
handler/WAF/database/mo-waf-db.php CHANGED
@@ -1,5 +1,6 @@
1
  <?php
2
  global $dbcon,$prefix;
 
3
  function log_attack($ipaddress,$value1,$value)
4
  {
5
  global $prefix,$dbcon;
@@ -11,7 +12,6 @@
11
  $rows = mysqli_fetch_array($results);
12
  return $rows['count(*)'];
13
  }
14
-
15
  function setting_file()
16
  {
17
  global $prefix,$dbcon;
1
  <?php
2
  global $dbcon,$prefix;
3
+ include_once('mo-waf-db-common.php');
4
  function log_attack($ipaddress,$value1,$value)
5
  {
6
  global $prefix,$dbcon;
12
  $rows = mysqli_fetch_array($results);
13
  return $rows['count(*)'];
14
  }
 
15
  function setting_file()
16
  {
17
  global $prefix,$dbcon;
handler/WAF/database/mo-waf-plugin-db.php CHANGED
@@ -1,4 +1,6 @@
1
  <?php
 
 
2
  function setting_file()
3
  {
4
  global $prefix,$dbcon;
@@ -55,7 +57,8 @@
55
  $results = $wpdb->get_results($query);
56
  return $results[0]->count;
57
  }
58
-
 
59
  function CheckRate($ipaddress)
60
  {
61
  global $wpdb;
1
  <?php
2
+
3
+ include_once('mo-waf-db-common.php');
4
  function setting_file()
5
  {
6
  global $prefix,$dbcon;
57
  $results = $wpdb->get_results($query);
58
  return $results[0]->count;
59
  }
60
+
61
+
62
  function CheckRate($ipaddress)
63
  {
64
  global $wpdb;
handler/WAF/mo-waf-plugin.php CHANGED
@@ -1,211 +1,212 @@
1
- <?php
2
-
3
- $dir = dirname(__FILE__);
4
- $dir = str_replace('\\', "/", $dir);
5
- $dir = explode('handler', $dir);
6
- $wafInclude = $dir[0].'/handler/WAF/waf-include.php';
7
- $pluginU = $dir[0].'helper/pluginUtility.php';
8
- $wafDB = $dir[0].'/handler/WAF/database/mo-waf-plugin-db.php';
9
- $errorPage = $dir[0].'handler/mo-error.html';
10
- $blockPage = $dir[0].'handler/mo-block.html';
11
-
12
- include_once($wafInclude);
13
- include_once($pluginU);
14
- include_once($wafDB);
15
-
16
-
17
- global $wpdb,$mowpnshandle;
18
- $mowpnshandle = new MoWpnsHandler();
19
- $ipaddress = get_ipaddress();
20
- if($mowpnshandle->is_ip_blocked($ipaddress))
21
- {
22
- if(!$mowpnshandle->is_whitelisted($ipaddress))
23
- {
24
- header('HTTP/1.1 403 Forbidden');
25
- include_once($blockPage);
26
- exit;
27
- }
28
- }
29
- $fileName = setting_file();
30
- if($fileName != "notMissing")
31
- {
32
- include_once($fileName);
33
- }
34
- if(isset($RateLimiting) and $RateLimiting == 1)
35
- {
36
- if(!is_crawler())
37
- {
38
- applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
39
- }
40
- }
41
- if(isset($RateLimitingCrawler))
42
- {
43
- if($RateLimitingCrawler == 1)
44
- {
45
- if(is_crawler())
46
- {
47
- if(is_fake_googlebot($ipaddress))
48
- {
49
- header('HTTP/1.1 403 Forbidden');
50
- include_once($errorPage);
51
- exit;
52
- }
53
- if($RateLimitingCrawler == '1')
54
- {
55
- applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
56
- }
57
-
58
- }
59
- }
60
- }
61
- $attack = array();
62
- if(isset($SQL) )
63
- {
64
- if($SQL==1)
65
- array_push($attack,"SQL");
66
- }
67
- if(isset($XSS) )
68
- {
69
- if( $XSS==1)
70
- array_push($attack,"XSS");
71
- }
72
- if(isset($LFI))
73
- {
74
- if($LFI==1)
75
- array_push($attack,"LFI");
76
- }
77
-
78
- $attackC = $attack;
79
- $ParanoiaLevel = 1;
80
- $annomalyS = 0;
81
- $SQLScore = 0;
82
- $XSSScore = 0;
83
- $limitAttack = get_option('limitAttack');
84
-
85
-
86
- foreach ($attackC as $key1 => $value1)
87
- {
88
- for($lev=1;$lev<=$ParanoiaLevel;$lev++)
89
- {
90
- if(isset($regex[$value1][$lev]))
91
- { $ooo = 0;
92
- for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
93
- {
94
- foreach ($_REQUEST as $key => $value) {
95
-
96
- if($regex[$value1][$lev][$i] != "")
97
- {
98
- if(is_string($value))
99
- {
100
- if(preg_match($regex[$value1][$lev][$i], $value))
101
- {
102
-
103
- if($value1 == "SQL")
104
- {
105
- $SQLScore += $score[$value1][$lev][$i];
106
- }
107
- elseif ($value1 == "XSS")
108
- {
109
- $XSSScore += $score[$value1][$lev][$i];
110
- }
111
- else
112
- {
113
- $annomalyS += $score[$value1][$lev][$i];
114
- }
115
-
116
- if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
117
- {
118
- $attackCount = log_attack($ipaddress,$value1,$value);
119
- if($attackCount>$limitAttack)
120
- {
121
- if(!$mowpnshandle->is_whitelisted($ipaddress))
122
- {
123
- if(!$mowpnshandle->is_ip_blocked($ipaddress))
124
- $mowpnshandle->block_ip($ipaddress,'ALE',true); //Attack Limit Exceed
125
- }
126
- }
127
-
128
- header('HTTP/1.1 403 Forbidden');
129
- include_once($errorPage);
130
- exit;
131
- }
132
- }
133
- }
134
- }
135
- }
136
- }
137
- }
138
- }
139
- }
140
-
141
- function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
142
- {
143
- global $wpdb,$mowpnshandle;
144
- $rate = CheckRate($ipaddress);
145
- if($rate>=$reqLimit)
146
- {
147
- $lastAttack = getRLEAttack($ipaddress)+60;
148
- $current_time = time();
149
- if($lastAttack < $current_time-60)
150
- {
151
- log_attack($ipaddress,'RLE','RLE');
152
- }
153
- if($action != 'ThrottleIP')
154
- {
155
- if(!$mowpnshandle->is_whitelisted($ipaddress))
156
- {
157
- $mowpnshandle->block_ip($ipaddress,'RLE',true);
158
- }
159
- }
160
- header('HTTP/1.1 403 Forbidden');
161
- include_once($errorPage);
162
- exit;
163
- }
164
- }
165
- function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
166
- {
167
- if(file_exists($filename))
168
- {
169
- include($filename);
170
- }
171
- global $wpdb,$mowpnshandle;
172
- $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
173
- if(isset($RateLimitingCrawler))
174
- {
175
- if($RateLimitingCrawler=='1')
176
- {
177
- if(isset($RequestsPMinCrawler))
178
- {
179
- $reqLimit = $RequestsPMinCrawler;
180
- $rate = CheckRate($ipaddress);
181
- if($rate>=$reqLimit)
182
- {
183
- $action = $actionRateLCrawler;
184
- $lastAttack = getRLEattack($ipaddress)+60;
185
- $current_time = time();
186
- if($current_time>$lastAttack)
187
- {
188
- log_attack($ipaddress,'RLECrawler',$USER_AGENT);
189
- }
190
- if($action != 'ThrottleIP')
191
- {
192
- if(!$mowpnshandle->is_whitelisted($ipaddress))
193
- {
194
- if(!$mowpnshandle->is_ip_blocked($ipaddress))
195
- {
196
- $mowpnshandle->block_ip($ipaddress,'RLECrawler',true);
197
- }
198
- }
199
- }
200
- header('HTTP/1.1 403 Forbidden');
201
- include_once($errorPage);
202
- exit;
203
- }
204
- }
205
- }
206
- }
207
- }
208
-
209
-
210
-
 
211
  ?>
1
+ <?php
2
+
3
+ $dir = dirname(__FILE__);
4
+ $dir = str_replace('\\', "/", $dir);
5
+ $dir = explode('handler', $dir);
6
+ $wafInclude = $dir[0].'/handler/WAF/waf-include.php';
7
+ $pluginU = $dir[0].'helper/pluginUtility.php';
8
+ $wafDB = $dir[0].'/handler/WAF/database/mo-waf-plugin-db.php';
9
+ $errorPage = $dir[0].'handler/mo-error.html';
10
+ $blockPage = $dir[0].'handler/mo-block.html';
11
+
12
+ include_once($wafInclude);
13
+ include_once($pluginU);
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->is_ip_blocked($ipaddress))
22
+ {
23
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
24
+ {
25
+ header('HTTP/1.1 403 Forbidden');
26
+ include_once($blockPage);
27
+ exit;
28
+ }
29
+ }
30
+ $fileName = setting_file();
31
+ if($fileName != "notMissing")
32
+ {
33
+ include_once($fileName);
34
+ }
35
+ if(isset($RateLimiting) and $RateLimiting == 1)
36
+ {
37
+ if(!is_crawler())
38
+ {
39
+ applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
40
+ }
41
+ }
42
+ if(isset($RateLimitingCrawler))
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);
52
+ exit;
53
+ }
54
+ if($RateLimitingCrawler == '1')
55
+ {
56
+ applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
57
+ }
58
+
59
+ }
60
+ }
61
+ }
62
+ $attack = array();
63
+ if(isset($SQL) )
64
+ {
65
+ if($SQL==1)
66
+ array_push($attack,"SQL");
67
+ }
68
+ if(isset($XSS) )
69
+ {
70
+ if( $XSS==1)
71
+ array_push($attack,"XSS");
72
+ }
73
+ if(isset($LFI))
74
+ {
75
+ if($LFI==1)
76
+ array_push($attack,"LFI");
77
+ }
78
+
79
+ $attackC = $attack;
80
+ $ParanoiaLevel = 1;
81
+ $annomalyS = 0;
82
+ $SQLScore = 0;
83
+ $XSSScore = 0;
84
+ $limitAttack = get_option('limitAttack');
85
+
86
+
87
+ foreach ($attackC as $key1 => $value1)
88
+ {
89
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
90
+ {
91
+ if(isset($regex[$value1][$lev]))
92
+ { $ooo = 0;
93
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
94
+ {
95
+ foreach ($_REQUEST as $key => $value) {
96
+
97
+ if($regex[$value1][$lev][$i] != "")
98
+ {
99
+ if(is_string($value))
100
+ {
101
+ if(preg_match($regex[$value1][$lev][$i], $value))
102
+ {
103
+
104
+ if($value1 == "SQL")
105
+ {
106
+ $SQLScore += $score[$value1][$lev][$i];
107
+ }
108
+ elseif ($value1 == "XSS")
109
+ {
110
+ $XSSScore += $score[$value1][$lev][$i];
111
+ }
112
+ else
113
+ {
114
+ $annomalyS += $score[$value1][$lev][$i];
115
+ }
116
+
117
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
118
+ {
119
+ $attackCount = log_attack($ipaddress,$value1,$value);
120
+ if($attackCount>$limitAttack)
121
+ {
122
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
123
+ {
124
+ if(!$mowpnshandle->is_ip_blocked($ipaddress))
125
+ $mowpnshandle->block_ip($ipaddress,'Attack limit Exceeded',true); //Attack Limit Exceed
126
+ }
127
+ }
128
+
129
+ header('HTTP/1.1 403 Forbidden');
130
+ include_once($errorPage);
131
+ exit;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
143
+ {
144
+ global $wpdb,$mowpnshandle;
145
+ $rate = CheckRate($ipaddress);
146
+ if($rate>=$reqLimit)
147
+ {
148
+ $lastAttack = getRLEAttack($ipaddress)+60;
149
+ $current_time = time();
150
+ if($lastAttack < $current_time-60)
151
+ {
152
+ log_attack($ipaddress,'RLE','RLE');
153
+ }
154
+ if($action != 'ThrottleIP')
155
+ {
156
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
157
+ {
158
+ $mowpnshandle->block_ip($ipaddress,'RLE',true);
159
+ }
160
+ }
161
+ header('HTTP/1.1 403 Forbidden');
162
+ include_once($errorPage);
163
+ exit;
164
+ }
165
+ }
166
+ function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
167
+ {
168
+ if(file_exists($filename))
169
+ {
170
+ include($filename);
171
+ }
172
+ global $wpdb,$mowpnshandle;
173
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
174
+ if(isset($RateLimitingCrawler))
175
+ {
176
+ if($RateLimitingCrawler=='1')
177
+ {
178
+ if(isset($RequestsPMinCrawler))
179
+ {
180
+ $reqLimit = $RequestsPMinCrawler;
181
+ $rate = CheckRate($ipaddress);
182
+ if($rate>=$reqLimit)
183
+ {
184
+ $action = $actionRateLCrawler;
185
+ $lastAttack = getRLEattack($ipaddress)+60;
186
+ $current_time = time();
187
+ if($current_time>$lastAttack)
188
+ {
189
+ log_attack($ipaddress,'RLECrawler',$USER_AGENT);
190
+ }
191
+ if($action != 'ThrottleIP')
192
+ {
193
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
194
+ {
195
+ if(!$mowpnshandle->is_ip_blocked($ipaddress))
196
+ {
197
+ $mowpnshandle->block_ip($ipaddress,'RLECrawler',true);
198
+ }
199
+ }
200
+ }
201
+ header('HTTP/1.1 403 Forbidden');
202
+ include_once($errorPage);
203
+ exit;
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+
211
+
212
  ?>
handler/WAF/mo-waf.php CHANGED
@@ -1,207 +1,207 @@
1
- <?php
2
- $dir = dirname(__FILE__);
3
- $dir = str_replace('\\', "/", $dir);
4
- $dir = explode('WAF', $dir);
5
- $wafInclude = $dir[0].'WAF/waf-include.php';
6
- $wafdb = $dir[0].'WAF/database/mo-waf-db.php';
7
- $errorPage = $dir[0].'mo-error.html';
8
- $blockPage = $dir[0].'mo-block.html';
9
-
10
- include_once($wafInclude);
11
- include_once($wafdb);
12
-
13
- global $dbcon,$prefix;
14
- $connection = dbconnection();
15
- if($connection)
16
- {
17
- $wafLevel = get_option_value('WAF');
18
- if($wafLevel=='HtaccessLevel')
19
- {
20
- $ipaddress = get_ipaddress();
21
- if(is_ip_blocked($ipaddress))
22
- {
23
- if(!is_ip_whitelisted($ipaddress))
24
- {
25
- header('HTTP/1.1 403 Forbidden');
26
- include_once($blockPage);
27
- exit;
28
- }
29
- }
30
- $fileName = setting_file();
31
-
32
- if($fileName != 'notMissing')
33
- {
34
- include_once($fileName);
35
- }
36
- if(isset($RateLimiting) && $RateLimiting == 1)
37
- {
38
- if(!is_crawler())
39
- {
40
- if(isset($RequestsPMin) && isset($actionRateL))
41
- applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
42
- }
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);
52
- exit;
53
- }
54
- if($RateLimitingCrawler == '1')
55
- {
56
- applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
57
- }
58
-
59
- }
60
- }
61
- $attack = array();
62
- if(isset($SQL) && $SQL==1)
63
- {
64
- array_push($attack,"SQL");
65
- }
66
- if(isset($XSS) && $XSS==1)
67
- {
68
- array_push($attack,"XSS");
69
- }
70
- if(isset($LFI) && $LFI==1)
71
- {
72
- array_push($attack,"LFI");
73
- }
74
-
75
- $attackC = $attack;
76
- $ParanoiaLevel = 1;
77
- $annomalyS = 0;
78
- $SQLScore = 0;
79
- $XSSScore = 0;
80
- $limitAttack = get_option_value("limitAttack");
81
-
82
- foreach ($attackC as $key1 => $value1)
83
- {
84
- for($lev=1;$lev<=$ParanoiaLevel;$lev++)
85
- {
86
- if(isset($regex[$value1][$lev]))
87
- { $ooo = 0;
88
- for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
89
- {
90
- foreach ($_REQUEST as $key => $value) {
91
-
92
- if($regex[$value1][$lev][$i] != "")
93
- {
94
- if(is_string($value))
95
- {
96
- if(preg_match($regex[$value1][$lev][$i], $value))
97
- {
98
-
99
- if($value1 == "SQL")
100
- {
101
- $SQLScore += $score[$value1][$lev][$i];
102
- }
103
- elseif ($value1 == "XSS")
104
- {
105
- $XSSScore += $score[$value1][$lev][$i];
106
- }
107
- else
108
- {
109
- $annomalyS += $score[$value1][$lev][$i];
110
- }
111
-
112
- if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
113
- {
114
- $attackCount = log_attack($ipaddress,$value1,$value);
115
- if($attackCount>$limitAttack)
116
- {
117
- if(!is_ip_whitelisted($ipaddress))
118
- {
119
- block_ip($ipaddress,'ALE'); //Attack Limit Exceed
120
- }
121
- }
122
-
123
- header('HTTP/1.1 403 Forbidden');
124
- include_once($errorPage);
125
- exit;
126
- }
127
- }
128
- }
129
- }
130
- }
131
- }
132
- }
133
- }
134
- }
135
- }
136
- }
137
-
138
-
139
- function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
140
- {
141
- global $dbcon, $prefix;
142
- $rate = CheckRate($ipaddress);
143
- if($rate>$reqLimit)
144
- {
145
- $lastAttack = getRLEattack($ipaddress)+60;
146
- $current_time = time();
147
- if($current_time > $lastAttack)
148
- {
149
- log_attack($ipaddress,'RLE','RLE');
150
- }
151
- if($action != 'ThrottleIP')
152
- {
153
- if(!is_ip_whitelisted($ipaddress))
154
- {
155
- block_ip($ipaddress,'RLE'); //Rate Limit Exceed
156
- }
157
- }
158
- header('HTTP/1.1 403 Forbidden');
159
- include_once($errorPage);
160
- exit;
161
- }
162
- }
163
-
164
- function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
165
- {
166
- if(file_exists($filename))
167
- {
168
- include($filename);
169
- }
170
- global $dbcon,$prefix;
171
- $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
172
- if(isset($RateLimitingCrawler))
173
- {
174
- if(isset($RateLimitingCrawler) && $RateLimitingCrawler=='1')
175
- {
176
- if(isset($RequestsPMinCrawler) && isset($actionRateLCrawler) )
177
- {
178
- $reqLimit = $RequestsPMinCrawler;
179
- $rate = CheckRate($ipaddress);
180
- if($rate>=$reqLimit)
181
- {
182
- $action = $actionRateLCrawler;
183
- $lastAttack = getRLEattack($ipaddress)+60;
184
- $current_time = time();
185
- if($current_time>$lastAttack)
186
- {
187
- log_attack($ipaddress,'RLECrawler',$USER_AGENT);
188
- }
189
- if($action != 'ThrottleIP')
190
- {
191
- if(!is_ip_whitelisted($ipaddress))
192
- {
193
- block_ip($ipaddress,'RLECrawler'); //Rate Limit Exceed for Crawler
194
- }
195
- }
196
- header('HTTP/1.1 403 Forbidden');
197
- include_once($errorPage);
198
- exit;
199
- }
200
- }
201
- }
202
- }
203
- }
204
-
205
-
206
- $dbcon->close();
207
  ?>
1
+ <?php
2
+ $dir = dirname(__FILE__);
3
+ $dir = str_replace('\\', "/", $dir);
4
+ $dir = explode('WAF', $dir);
5
+ $wafInclude = $dir[0].'WAF/waf-include.php';
6
+ $wafdb = $dir[0].'WAF/database/mo-waf-db.php';
7
+ $errorPage = $dir[0].'mo-error.html';
8
+ $blockPage = $dir[0].'mo-block.html';
9
+
10
+ include_once($wafInclude);
11
+ include_once($wafdb);
12
+
13
+ global $dbcon,$prefix;
14
+ $connection = dbconnection();
15
+ if($connection)
16
+ {
17
+ $wafLevel = get_option_value('WAF');
18
+ if($wafLevel=='HtaccessLevel')
19
+ {
20
+ $ipaddress = get_ipaddress();
21
+ if(is_ip_blocked($ipaddress))
22
+ {
23
+ if(!is_ip_whitelisted($ipaddress))
24
+ {
25
+ header('HTTP/1.1 403 Forbidden');
26
+ include_once($blockPage);
27
+ exit;
28
+ }
29
+ }
30
+ $fileName = setting_file();
31
+
32
+ if($fileName != 'notMissing')
33
+ {
34
+ include_once($fileName);
35
+ }
36
+ if(isset($RateLimiting) && $RateLimiting == 1)
37
+ {
38
+ if(!is_crawler())
39
+ {
40
+ if(isset($RequestsPMin) && isset($actionRateL))
41
+ applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
42
+ }
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);
52
+ exit;
53
+ }
54
+ if($RateLimitingCrawler == '1')
55
+ {
56
+ applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
57
+ }
58
+
59
+ }
60
+ }
61
+ $attack = array();
62
+ if(isset($SQL) && $SQL==1)
63
+ {
64
+ array_push($attack,"SQL");
65
+ }
66
+ if(isset($XSS) && $XSS==1)
67
+ {
68
+ array_push($attack,"XSS");
69
+ }
70
+ if(isset($LFI) && $LFI==1)
71
+ {
72
+ array_push($attack,"LFI");
73
+ }
74
+
75
+ $attackC = $attack;
76
+ $ParanoiaLevel = 1;
77
+ $annomalyS = 0;
78
+ $SQLScore = 0;
79
+ $XSSScore = 0;
80
+ $limitAttack = get_option_value("limitAttack");
81
+
82
+ foreach ($attackC as $key1 => $value1)
83
+ {
84
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
85
+ {
86
+ if(isset($regex[$value1][$lev]))
87
+ { $ooo = 0;
88
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
89
+ {
90
+ foreach ($_REQUEST as $key => $value) {
91
+
92
+ if($regex[$value1][$lev][$i] != "")
93
+ {
94
+ if(is_string($value))
95
+ {
96
+ if(preg_match($regex[$value1][$lev][$i], $value))
97
+ {
98
+
99
+ if($value1 == "SQL")
100
+ {
101
+ $SQLScore += $score[$value1][$lev][$i];
102
+ }
103
+ elseif ($value1 == "XSS")
104
+ {
105
+ $XSSScore += $score[$value1][$lev][$i];
106
+ }
107
+ else
108
+ {
109
+ $annomalyS += $score[$value1][$lev][$i];
110
+ }
111
+
112
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
113
+ {
114
+ $attackCount = log_attack($ipaddress,$value1,$value);
115
+ if($attackCount>$limitAttack)
116
+ {
117
+ if(!is_ip_whitelisted($ipaddress))
118
+ {
119
+ block_ip($ipaddress,'Attack limit Exceeded'); //Attack Limit Exceed
120
+ }
121
+ }
122
+
123
+ header('HTTP/1.1 403 Forbidden');
124
+ include_once($errorPage);
125
+ exit;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+
139
+ function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
140
+ {
141
+ global $dbcon, $prefix;
142
+ $rate = CheckRate($ipaddress);
143
+ if($rate>$reqLimit)
144
+ {
145
+ $lastAttack = getRLEattack($ipaddress)+60;
146
+ $current_time = time();
147
+ if($current_time > $lastAttack)
148
+ {
149
+ log_attack($ipaddress,'RLE','RLE');
150
+ }
151
+ if($action != 'ThrottleIP')
152
+ {
153
+ if(!is_ip_whitelisted($ipaddress))
154
+ {
155
+ block_ip($ipaddress,'RLE'); //Rate Limit Exceed
156
+ }
157
+ }
158
+ header('HTTP/1.1 403 Forbidden');
159
+ include_once($errorPage);
160
+ exit;
161
+ }
162
+ }
163
+
164
+ function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
165
+ {
166
+ if(file_exists($filename))
167
+ {
168
+ include($filename);
169
+ }
170
+ global $dbcon,$prefix;
171
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
172
+ if(isset($RateLimitingCrawler))
173
+ {
174
+ if(isset($RateLimitingCrawler) && $RateLimitingCrawler=='1')
175
+ {
176
+ if(isset($RequestsPMinCrawler) && isset($actionRateLCrawler) )
177
+ {
178
+ $reqLimit = $RequestsPMinCrawler;
179
+ $rate = CheckRate($ipaddress);
180
+ if($rate>=$reqLimit)
181
+ {
182
+ $action = $actionRateLCrawler;
183
+ $lastAttack = getRLEattack($ipaddress)+60;
184
+ $current_time = time();
185
+ if($current_time>$lastAttack)
186
+ {
187
+ log_attack($ipaddress,'RLECrawler',$USER_AGENT);
188
+ }
189
+ if($action != 'ThrottleIP')
190
+ {
191
+ if(!is_ip_whitelisted($ipaddress))
192
+ {
193
+ block_ip($ipaddress,'RLECrawler'); //Rate Limit Exceed for Crawler
194
+ }
195
+ }
196
+ header('HTTP/1.1 403 Forbidden');
197
+ include_once($errorPage);
198
+ exit;
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+
205
+
206
+ $dbcon->close();
207
  ?>
handler/backup.php CHANGED
@@ -1,320 +1,322 @@
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 = get_site_option('mo_wpns_backup_time')*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(get_site_option('mo_file_backup_plugins') =='1'){
41
- $this->plugin_backup($backup_store_path, $time);
42
- }
43
- if(get_site_option('mo_file_backup_themes')=='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
-
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(get_site_option('mo_file_manual_backup_plugins') =='1'){
60
- $this->plugin_backup($backup_store_path, $time);
61
- }
62
- if(get_site_option('mo_file_manual_backup_themes')=='1'){
63
- $this->themes_backup($backup_store_path ,$time);
64
- }
65
-
66
- if(get_site_option('mo_file_manual_backup_wp_files') == '1'){
67
- $this->wpfiles_backup($backup_store_path, $time);
68
- }
69
-
70
- }
71
-
72
- function file_eb_backup_interval($schedules){
73
- $mo2f_cron_file_backup_hours = get_site_option('mo_wpns_backup_time')*3600;
74
- $schedules['file_eb_backup_time'] = array(
75
- 'interval' => $mo2f_cron_file_backup_hours,
76
- 'display' => esc_html__( 'Cron Activated' ),
77
- );
78
- return $schedules;
79
- }
80
-
81
- function file_backup_deactivate(){
82
- $timestamp = wp_next_scheduled( 'mo_eb_file_cron_hook' );
83
- wp_unschedule_event( $timestamp, 'mo_eb_file_cron_hook' );
84
- }
85
-
86
- function plugin_backup($backup_store_path, $time){
87
- global $wpnsDbQueries;
88
- $this->mkdirectory('plugins');
89
- $real_path= WP_PLUGIN_DIR;
90
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'plugins';
91
- $filename = 'miniorange-plugins-backup-'.$time.'.zip';
92
- $this->file_backup($real_path,$filename,'plugins');
93
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::PLUGIN,$filename,$time,$backup_path);
94
- }
95
-
96
- function themes_backup($backup_store_path ,$time){
97
- global $wpnsDbQueries;
98
- $this->mkdirectory('themes');
99
- $real_path= get_theme_root();
100
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'themes';
101
- $filename = 'miniorange-themes-backup-'.$time.'.zip';
102
- $this->file_backup($real_path,$filename,'themes');
103
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::THEMES,$filename,$time,$backup_path);
104
-
105
- }
106
-
107
- function wpfiles_backup($backup_store_path, $time){
108
- global $wpnsDbQueries;
109
- $this->mkdirectory('wp_files');
110
- $homepath = get_home_path();
111
- $real_path= $homepath;
112
- $backup_path =$backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR.'wp_files';
113
- $filename = 'miniorange-wpfiles-backup-'.$time.'.zip';
114
- $this->file_backup($real_path,$filename, 'wp_files');
115
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::WPFILES,$filename,$time,$backup_path);
116
- }
117
-
118
- function mkdirectory($foldername){
119
-
120
- $homepath = wp_upload_dir();
121
- $homepath = $homepath['basedir'].DIRECTORY_SEPARATOR;
122
- if(!is_writable($homepath)){
123
- wp_send_json('not_writable');
124
- return;
125
- }
126
-
127
-
128
- $basepath = $homepath;
129
- if(!file_exists($basepath."miniorangebackup")){
130
- mkdir($basepath."miniorangebackup");
131
- }
132
-
133
- $basepath = $homepath.'miniorangebackup'.DIRECTORY_SEPARATOR;
134
- $this-> create_index_file($basepath);
135
-
136
- if(!file_exists($basepath.'file-backups')){
137
- mkdir($basepath.'file-backups');
138
- }
139
-
140
- $basepath = $homepath.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR;
141
- if(!file_exists($basepath.$foldername)){
142
- mkdir($basepath.$foldername);
143
- }
144
-
145
- }
146
-
147
- function create_index_file($folder_path){
148
-
149
- $html_path=$folder_path."index.html";
150
- $htaccess_path= $folder_path.".htaccess";
151
-
152
- if(!file_exists($html_path)){
153
- $f = fopen($html_path, "a");
154
- fwrite($f, '<html><body><a href="https://security.miniorange.com/" target="_blank">WordPress backups by miniorange</a></body></html>');
155
- fclose($f);
156
- }
157
- if(!file_exists($htaccess_path)){
158
- $f = fopen($htaccess_path, "a");
159
- fwrite($f, "deny from all");
160
- fclose($f);
161
- }
162
- }
163
-
164
-
165
- function file_backup($real_path, $filename, $foldername){
166
- ini_set('max_execution_time', 0);
167
- $backup_store_path = wp_upload_dir();
168
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR.'miniorangebackup'.DIRECTORY_SEPARATOR.'file-backups'.DIRECTORY_SEPARATOR;
169
- $rootPath = realpath($real_path);
170
- $zip = new ZipArchive();
171
- $res = $zip->open($backup_store_path.$foldername.DIRECTORY_SEPARATOR.$filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
172
-
173
- $files = new RecursiveIteratorIterator(
174
- new RecursiveDirectoryIterator($rootPath),
175
- RecursiveIteratorIterator::LEAVES_ONLY
176
- );
177
- foreach ($files as $name => $file)
178
- {
179
- if (!$file->isDir())
180
- {
181
- $filePath = $file->getRealPath();
182
- $relativePath = substr($filePath, strlen($rootPath) + 1);
183
- if(strpos($relativePath, 'miniorangebackup')!== false ){}
184
- else{
185
- $zip->addFile($filePath, $relativePath);
186
- }
187
- }
188
- }
189
- $zip->close();
190
- }
191
-
192
-
193
- function backupDB(){
194
-
195
- if ( function_exists('memory_get_usage') && ( (int) ini_get('memory_limit') < 128 ) ){
196
- ini_set('memory_limit', '128M' );
197
- do_action('mo_eb_show_message',MoBackupMessages::showMessage('DB_MEMORY_LIMIT'),'SUCCESS');
198
- }
199
-
200
- $backup_store_path = wp_upload_dir();
201
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
202
-
203
- if(!is_writable($backup_store_path)){
204
- wp_send_json('not_writable');
205
- return;
206
- }
207
- global $wpdb;
208
- $tables = $wpdb->get_results("SHOW TABLES", ARRAY_N);
209
- $nooftables = count($tables);
210
- $query = "";
211
- $tableswithfk = array();
212
- $tableswithoutfk= array();
213
-
214
- foreach($tables as $table)
215
- {
216
- if(is_array($table))
217
- $table = $table[0];
218
- $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
219
- if(!empty($createtable[0]))
220
- {
221
- $createquery = $createtable[0]['Create Table'];
222
- if (strpos($createquery, 'FOREIGN KEY') !== false)
223
- array_push($tableswithfk,$table);
224
- else
225
- array_push($tableswithoutfk, $table);
226
- }
227
- }
228
-
229
- $query .= $this->get_table_query($query,$tableswithoutfk);
230
-
231
- $query .= $this->get_table_query($query,$tableswithfk);
232
-
233
- $fileName = $this->create_db_backup_file($query);
234
- wp_send_json('created_backup');
235
- }
236
-
237
- function get_table_query($query,$tables)
238
- {
239
-
240
- global $wpdb;
241
- foreach($tables as $table)
242
- {
243
- $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
244
- if(!empty($createtable[0]))
245
- {
246
- $createquery = $createtable[0]['Create Table'];
247
- $query .= 'DROP TABLE IF EXISTS '.$table.";\n";
248
- $query .= $createquery.";\n\n";
249
- $data = $wpdb->get_results("SELECT * FROM $table", ARRAY_A);
250
- foreach($data as $record)
251
- {
252
- if(count($record)>0)
253
- {
254
- $query.= 'INSERT INTO '.$table.' VALUES(';
255
- $i=0;
256
- foreach($record as $key=>$value)
257
- {
258
- $value = addslashes($value);
259
- if (isset($value))
260
- $query.= '"'.$value.'"' ;
261
- else
262
- $query.= '""';
263
- if ($i < (count($record)-1)) { $query.= ','; }
264
- $i++;
265
- }
266
- $query.= ");\n";
267
- }
268
- }
269
- $query.="\n\n";
270
- }
271
- }
272
- return $query;
273
- }
274
-
275
- function create_db_backup_file($data)
276
- {
277
-
278
- global $wpnsDbQueries;
279
- $time = time();
280
- $backup_store_path = wp_upload_dir();
281
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR;
282
- if(!file_exists($backup_store_path."miniorangebackup")){
283
- mkdir($backup_store_path."miniorangebackup");
284
- }
285
- $basepath = $backup_store_path.'miniorangebackup'.DIRECTORY_SEPARATOR;
286
- $handler_obj = new MoBackupSite;
287
- $handler_obj->create_index_file($basepath);
288
- if(!file_exists($basepath.'db-backups')){
289
- mkdir($basepath.'db-backups');
290
- }
291
-
292
- $backup_path = $basepath.'db-backups';
293
- $filename = 'miniorange-db-backup-'.$time.'.sql';
294
- $basepath = $basepath.'db-backups';
295
- $handle = fopen($basepath.DIRECTORY_SEPARATOR.$filename,'w+');
296
- fwrite($handle,$data);
297
- fclose($handle);
298
- $filezipname = $this->barfw_create_database_backup_zip_file($filename,$time);
299
- $zip_path = $basepath.DIRECTORY_SEPARATOR.$filename;
300
- unlink($zip_path);
301
- $wpnsDbQueries->insert_backup_detail(MoWpnsConstants::DATABASE,$filezipname,$time,$backup_path);
302
- return $filename;
303
- }
304
-
305
- function barfw_create_database_backup_zip_file($filename,$time){
306
- $backup_store_path = wp_upload_dir();
307
- $backup_store_path = $backup_store_path['basedir'].DIRECTORY_SEPARATOR.'miniorangebackup'.DIRECTORY_SEPARATOR.'db-backups'.DIRECTORY_SEPARATOR;
308
-
309
- $filezipname = 'miniorange-db-backup-'.$time.'.zip';
310
- $zip = new ZipArchive();
311
- $res = $zip->open($backup_store_path.DIRECTORY_SEPARATOR.$filezipname, ZipArchive::CREATE | ZipArchive::OVERWRITE);
312
- $filePath = $backup_store_path.$filename;
313
- $relativePath = $filename;
314
- $zip->addFile($filePath, $relativePath);
315
-
316
- $zip->close();
317
- return $filezipname;
318
- }
319
-
 
 
320
  }new MoBackupSite;
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
+
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
+
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/feedback_form.php CHANGED
@@ -72,7 +72,7 @@ class FeedbackHandler
72
  $message ='[' ;
73
  }
74
  $message .= 'D:' . $days . ',';
75
- if(get_option("mo_wpns_2fa_with_network_security")){
76
  $message .= '2FA+NS]';
77
  }
78
  else{
72
  $message ='[' ;
73
  }
74
  $message .= 'D:' . $days . ',';
75
+ if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option')){
76
  $message .= '2FA+NS]';
77
  }
78
  else{
handler/logger.php CHANGED
@@ -1,37 +1,37 @@
1
- <?php
2
-
3
- class mo2f_Logger
4
- {
5
- function __construct()
6
- {
7
- add_action( 'log_403' , array( $this, 'log_403' ) );
8
- add_action( 'template_redirect', array( $this, 'log_404' ) );
9
- }
10
-
11
-
12
- function log_403()
13
- {
14
- global $moWpnsUtility;
15
- $mo_wpns_config = new MoWpnsHandler();
16
- $userIp = $moWpnsUtility->get_client_ip();
17
- $url = $moWpnsUtility->get_current_url();
18
- $user = wp_get_current_user();
19
- $username = is_user_logged_in() ? $user->user_login : 'GUEST';
20
- $mo_wpns_config->add_transactions($userIp,$username,MoWpnsConstants::ERR_403, MoWpnsConstants::ACCESS_DENIED,$url);
21
- }
22
-
23
- function log_404()
24
- {
25
- global $moWpnsUtility;
26
-
27
- if(!is_404())
28
- return;
29
- $mo_wpns_config = new MoWpnsHandler();
30
- $userIp = $moWpnsUtility->get_client_ip();
31
- $url = $moWpnsUtility->get_current_url();
32
- $user = wp_get_current_user();
33
- $username = is_user_logged_in() ? $user->user_login : 'GUEST';
34
- $mo_wpns_config->add_transactions($userIp,$username,MoWpnsConstants::ERR_404, MoWpnsConstants::ACCESS_DENIED,$url);
35
- }
36
- }
37
  new mo2f_Logger;
1
+ <?php
2
+
3
+ class mo2f_Logger
4
+ {
5
+ function __construct()
6
+ {
7
+ add_action( 'log_403' , array( $this, 'log_403' ) );
8
+ add_action( 'template_redirect', array( $this, 'log_404' ) );
9
+ }
10
+
11
+
12
+ function log_403()
13
+ {
14
+ global $moWpnsUtility;
15
+ $mo_wpns_config = new MoWpnsHandler();
16
+ $userIp = $moWpnsUtility->get_client_ip();
17
+ $url = $moWpnsUtility->get_current_url();
18
+ $user = wp_get_current_user();
19
+ $username = is_user_logged_in() ? $user->user_login : 'GUEST';
20
+ $mo_wpns_config->add_transactions($userIp,$username,MoWpnsConstants::ERR_403, MoWpnsConstants::ACCESS_DENIED,$url);
21
+ }
22
+
23
+ function log_404()
24
+ {
25
+ global $moWpnsUtility;
26
+
27
+ if(!is_404())
28
+ return;
29
+ $mo_wpns_config = new MoWpnsHandler();
30
+ $userIp = $moWpnsUtility->get_client_ip();
31
+ $url = $moWpnsUtility->get_current_url();
32
+ $user = wp_get_current_user();
33
+ $username = is_user_logged_in() ? $user->user_login : 'GUEST';
34
+ $mo_wpns_config->add_transactions($userIp,$username,MoWpnsConstants::ERR_404, MoWpnsConstants::ACCESS_DENIED,$url);
35
+ }
36
+ }
37
  new mo2f_Logger;
handler/login.php CHANGED
@@ -7,7 +7,7 @@ class LoginHandler
7
  if(get_site_option('mo2f_restrict_restAPI')){
8
  add_action('rest_api_init' , array($this , 'mo_block_restAPI' ) );
9
  }
10
- if(get_option('mo2f_enforce_strong_passswords') || get_option('mo_wpns_activate_recaptcha_for_login')
11
  || get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
12
  {
13
 
@@ -192,7 +192,7 @@ class LoginHandler
192
  if(!empty($recaptchaError->errors))
193
  $error = $recaptchaError;
194
  if(empty($error->errors)){
195
- if(!get_option('mo2f_enable_brute_force'))
196
  {
197
  $this->mo_wpns_login_success($username);
198
  }
@@ -216,7 +216,7 @@ class LoginHandler
216
  {
217
  if($moWpnsUtility->check_user_password_strength($user,$password,"")=="success")
218
  {
219
- if(get_option('mo2f_enable_brute_force'))
220
  $this->mo_wpns_login_success($user->data->user_login);
221
  return $user;
222
  }
@@ -251,7 +251,7 @@ class LoginHandler
251
  $pass = $_POST['pwd'];
252
  $user = get_user_by('login',$username);
253
 
254
- if(!get_option('mo2f_enforce_strong_passswords')){
255
  if(!class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($pass, $username)){
256
  if(!get_user_meta($user->ID,'password_strong?')){
257
  update_user_meta($user->ID,'password_strong?', true);
@@ -282,7 +282,7 @@ class LoginHandler
282
  global $moWpnsUtility;
283
  $userIp = $moWpnsUtility->get_client_ip();
284
 
285
- if(empty($userIp) || empty($username) || !get_option('mo2f_enable_brute_force'))
286
  return;
287
 
288
  $mo_wpns_config = new MoWpnsHandler();
@@ -302,7 +302,7 @@ class LoginHandler
302
 
303
  if($allowedLoginAttepts - $failedAttempts<=0)
304
  $this->handle_login_attempt_exceeded($userIp);
305
- else if(get_option('mo2f_show_remaining_attempts'))
306
  $this->show_limit_login_left($allowedLoginAttepts,$failedAttempts);
307
  }
308
 
7
  if(get_site_option('mo2f_restrict_restAPI')){
8
  add_action('rest_api_init' , array($this , 'mo_block_restAPI' ) );
9
  }
10
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option') || get_option('mo_wpns_activate_recaptcha_for_login')
11
  || get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
12
  {
13
 
192
  if(!empty($recaptchaError->errors))
193
  $error = $recaptchaError;
194
  if(empty($error->errors)){
195
+ if(!MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
196
  {
197
  $this->mo_wpns_login_success($username);
198
  }
216
  {
217
  if($moWpnsUtility->check_user_password_strength($user,$password,"")=="success")
218
  {
219
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
220
  $this->mo_wpns_login_success($user->data->user_login);
221
  return $user;
222
  }
251
  $pass = $_POST['pwd'];
252
  $user = get_user_by('login',$username);
253
 
254
+ if(!MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option')){
255
  if(!class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($pass, $username)){
256
  if(!get_user_meta($user->ID,'password_strong?')){
257
  update_user_meta($user->ID,'password_strong?', true);
282
  global $moWpnsUtility;
283
  $userIp = $moWpnsUtility->get_client_ip();
284
 
285
+ if(empty($userIp) || empty($username) || !MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
286
  return;
287
 
288
  $mo_wpns_config = new MoWpnsHandler();
302
 
303
  if($allowedLoginAttepts - $failedAttempts<=0)
304
  $this->handle_login_attempt_exceeded($userIp);
305
+ else if(MoWpnsUtility::get_mo2f_db_option('mo2f_show_remaining_attempts', 'get_option'))
306
  $this->show_limit_login_left($allowedLoginAttepts,$failedAttempts);
307
  }
308
 
handler/mo-block.html CHANGED
@@ -1,9 +1,9 @@
1
- <img src="data:image/jpeg;base64,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" style="margin-left: 5em;width: 12em;margin-top: 1px;">
2
- <div>
3
- <img src="data:image/jpeg;base64,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" style="width: 16em;margin-left: 52em;margin-top: 63px;">
4
- <div><h1 style="font-size: 90px;margin-top: -2em;margin-left: 401PX;">403</h1></div>
5
- <div><h2 style="font-size: 54px;margin-left: 557px;margin-top: -140px;" >Forbidden</h2></div>
6
- <div><h6 style="font-size: 21px;margin-left: 19em;margin-top: 7em;color: red;">Your IP has been blocked. Please Contact your Administrator.<h6></div>
7
- <h6 style="font-size: 21px;margin-left:20em;">For more information please contact miniorange <a href="https://faq.miniorange.com/">FAQ'S</h6>
8
- </div>
9
- </div>
1
+ <img src="data:image/jpeg;base64,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" style="margin-left: 5em;width: 12em;margin-top: 1px;">
2
+ <div>
3
+ <img src="data:image/jpeg;base64,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" style="width: 16em;margin-left: 52em;margin-top: 63px;">
4
+ <div><h1 style="font-size: 90px;margin-top: -2em;margin-left: 401PX;">403</h1></div>
5
+ <div><h2 style="font-size: 54px;margin-left: 557px;margin-top: -140px;" >Forbidden</h2></div>
6
+ <div><h6 style="font-size: 21px;margin-left: 19em;margin-top: 7em;color: red;">Your IP has been blocked. Please Contact your Administrator.<h6></div>
7
+ <h6 style="font-size: 21px;margin-left:20em;">For more information please contact miniorange <a href="https://faq.miniorange.com/">FAQ'S</h6>
8
+ </div>
9
+ </div>
handler/recaptcha.php CHANGED
@@ -1,106 +1,106 @@
1
- <?php
2
-
3
- class mo2f_ReCaptcha
4
- {
5
- function __construct()
6
- {
7
- add_filter( 'admin_init' , array($this, 'handle_recaptcha' ), 11, 3 );
8
- add_action( 'login_form' , array($this, 'custom_login_fields' ) );
9
- add_action( 'register_form' , array($this, 'register_with_captcha') );
10
- add_action( 'woocommerce_register_form' , array($this, 'woocommerce_register_with_captcha'));
11
- add_action( 'woocommerce_login_form', array($this, 'woocommerce_login_with_captcha'));
12
- add_action( 'woocommerce_review_order_before_submit', array($this, 'woocommerce_register_with_captcha_checkout'));
13
- }
14
-
15
-
16
- //Function to handle Testing reCaptcha
17
- function handle_recaptcha()
18
- {
19
- global $moWpnsUtility,$mo2f_dirName;
20
- if (current_user_can( 'manage_options' ))
21
- {
22
- if(isset($_REQUEST['option']) && $_REQUEST['option']=='testrecaptchaconfig')
23
- {
24
- if(array_key_exists('g-recaptcha-response',$_POST))
25
- {
26
- $userIp = $moWpnsUtility->get_client_ip();
27
- $mocURL = new MocURL;
28
- $response = $mocURL->validate_recaptcha($userIp,$_POST['g-recaptcha-response']);
29
- $content = json_decode($response, true);
30
- if(isset($content['error-codes']) && in_array("invalid-input-secret", $content['error-codes']))
31
- echo "<br><br><h2 style=color:red;text-align:center>Invalid Secret Key.</h2>";
32
- else if(isset($content['success']) && $content['success']==1)
33
- echo "<br><br><h2 style=color:green;text-align:center>Test was successful and captcha verified.</h2>";
34
- else
35
- echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
36
- }
37
- show_google_recaptcha_form();
38
- }
39
- }
40
- }
41
-
42
-
43
- function custom_login_fields()
44
- {
45
- if(get_option('mo_wpns_activate_recaptcha_for_login') && get_option('mo2f_login_option'))
46
- {
47
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
48
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
49
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
50
- }
51
- }
52
-
53
- function register_with_captcha(){
54
- if(get_option('mo_wpns_activate_recaptcha_for_registration'))
55
- {
56
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
57
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
58
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
59
- }
60
- }
61
-
62
- function woocommerce_register_with_captcha(){
63
- if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
64
- {
65
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
66
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
67
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
68
- }
69
- }
70
-
71
- function woocommerce_login_with_captcha(){
72
- if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
73
- {
74
-
75
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
76
-
77
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
78
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
79
- }
80
- }
81
-
82
- function woocommerce_register_with_captcha_checkout(){
83
-
84
- if (!is_user_logged_in()){
85
- if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
86
- {
87
- echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
88
- echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
89
- echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
90
- }
91
- }
92
- }
93
-
94
- public static function recaptcha_verify($response)
95
- {
96
- global $moWpnsUtility;
97
- $userIp = $moWpnsUtility->get_client_ip();
98
- $mocURL = new MocURL;
99
- $response = $mocURL->validate_recaptcha($userIp,$response);
100
- $content = json_decode($response, true);
101
- $isvalid = isset($content['success']) && $content['success']==1 ? true : false;
102
- return $isvalid;
103
- }
104
-
105
- }
106
- new mo2f_ReCaptcha;
1
+ <?php
2
+
3
+ class mo2f_ReCaptcha
4
+ {
5
+ function __construct()
6
+ {
7
+ add_filter( 'admin_init' , array($this, 'handle_recaptcha' ), 11, 3 );
8
+ add_action( 'login_form' , array($this, 'custom_login_fields' ) );
9
+ add_action( 'register_form' , array($this, 'register_with_captcha') );
10
+ add_action( 'woocommerce_register_form' , array($this, 'woocommerce_register_with_captcha'));
11
+ add_action( 'woocommerce_login_form', array($this, 'woocommerce_login_with_captcha'));
12
+ add_action( 'woocommerce_review_order_before_submit', array($this, 'woocommerce_register_with_captcha_checkout'));
13
+ }
14
+
15
+
16
+ //Function to handle Testing reCaptcha
17
+ function handle_recaptcha()
18
+ {
19
+ global $moWpnsUtility,$mo2f_dirName;
20
+ if (current_user_can( 'manage_options' ))
21
+ {
22
+ if(isset($_REQUEST['option']) && $_REQUEST['option']=='testrecaptchaconfig')
23
+ {
24
+ if(array_key_exists('g-recaptcha-response',$_POST))
25
+ {
26
+ $userIp = $moWpnsUtility->get_client_ip();
27
+ $mocURL = new MocURL;
28
+ $response = $mocURL->validate_recaptcha($userIp,$_POST['g-recaptcha-response']);
29
+ $content = json_decode($response, true);
30
+ if(isset($content['error-codes']) && in_array("invalid-input-secret", $content['error-codes']))
31
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid Secret Key.</h2>";
32
+ else if(isset($content['success']) && $content['success']==1)
33
+ echo "<br><br><h2 style=color:green;text-align:center>Test was successful and captcha verified.</h2>";
34
+ else
35
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
36
+ }
37
+ show_google_recaptcha_form();
38
+ }
39
+ }
40
+ }
41
+
42
+
43
+ function custom_login_fields()
44
+ {
45
+ if(get_option('mo_wpns_activate_recaptcha_for_login') && MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option'))
46
+ {
47
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
48
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
49
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
50
+ }
51
+ }
52
+
53
+ function register_with_captcha(){
54
+ if(get_option('mo_wpns_activate_recaptcha_for_registration'))
55
+ {
56
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
57
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
58
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
59
+ }
60
+ }
61
+
62
+ function woocommerce_register_with_captcha(){
63
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
64
+ {
65
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
66
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
67
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
68
+ }
69
+ }
70
+
71
+ function woocommerce_login_with_captcha(){
72
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
73
+ {
74
+
75
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
76
+
77
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
78
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
79
+ }
80
+ }
81
+
82
+ function woocommerce_register_with_captcha_checkout(){
83
+
84
+ if (!is_user_logged_in()){
85
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
86
+ {
87
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
88
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
89
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
90
+ }
91
+ }
92
+ }
93
+
94
+ public static function recaptcha_verify($response)
95
+ {
96
+ global $moWpnsUtility;
97
+ $userIp = $moWpnsUtility->get_client_ip();
98
+ $mocURL = new MocURL;
99
+ $response = $mocURL->validate_recaptcha($userIp,$response);
100
+ $content = json_decode($response, true);
101
+ $isvalid = isset($content['success']) && $content['success']==1 ? true : false;
102
+ return $isvalid;
103
+ }
104
+
105
+ }
106
+ new mo2f_ReCaptcha;
handler/security_features.php CHANGED
@@ -12,7 +12,7 @@ class Mo_2fa_security_features
12
  function wpns_2fa_with_network_security($postvalue)
13
  {
14
  $nonce= sanitize_text_field(wp_unslash($_POST['mo_security_features_nonce']));
15
- add_option( 'mo2f_two_factor_tour',0);
16
  if ( wp_verify_nonce( $nonce, 'mo_2fa_security_features_nonce' ) )
17
  {
18
  $enable_newtwork_security_features = isset($postvalue['mo_wpns_2fa_with_network_security']) ? true : false;
@@ -28,7 +28,7 @@ class Mo_2fa_security_features
28
 
29
 
30
  update_option( 'mo_wpns_2fa_with_network_security_popup_visible', 0);
31
- if(get_option('mo_wpns_2fa_with_network_security'))
32
  {
33
  ?><script>window.location.href="admin.php?page=mo_2fa_dashboard";</script><?php
34
  }
@@ -44,4 +44,4 @@ class Mo_2fa_security_features
44
 
45
  }
46
  }new Mo_2fa_security_features;
47
- ?>
12
  function wpns_2fa_with_network_security($postvalue)
13
  {
14
  $nonce= sanitize_text_field(wp_unslash($_POST['mo_security_features_nonce']));
15
+
16
  if ( wp_verify_nonce( $nonce, 'mo_2fa_security_features_nonce' ) )
17
  {
18
  $enable_newtwork_security_features = isset($postvalue['mo_wpns_2fa_with_network_security']) ? true : false;
28
 
29
 
30
  update_option( 'mo_wpns_2fa_with_network_security_popup_visible', 0);
31
+ if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
32
  {
33
  ?><script>window.location.href="admin.php?page=mo_2fa_dashboard";</script><?php
34
  }
44
 
45
  }
46
  }new Mo_2fa_security_features;
47
+ ?>
handler/twofa/class_miniorange_2fa_strong_password.php CHANGED
@@ -1,111 +1,108 @@
1
- <?php
2
-
3
- class class_miniorange_2fa_strong_password {
4
-
5
- function __construct(){
6
-
7
- add_option( 'mo2f_enforce_strong_passswords', false);
8
-
9
- }
10
-
11
- public static function woocommerce_password_protection($errors, $username, $password, $email) {
12
- if ($password == false) { return $errors; }
13
- if ($errors->get_error_data("pass")) { return $errors; }
14
-
15
- $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
16
-
17
- if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
18
- $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
19
- return $errors;
20
- }
21
-
22
- return $errors;
23
- }
24
- public static function validatePassword($errors, $update, $userData){
25
- $Users = get_option('mo2f_enforce_strong_passswords_for_accounts');
26
- $UserRole = $_POST['role'];
27
- if(is_null($UserRole) and $Users == 'user')
28
- {
29
- return true;
30
- }
31
-
32
- if($Users == 'all' or ($Users == 'admin' and $UserRole == 'administrator') or ($Users == 'user' and $UserRole != 'administrator' ) or ($Users == 'admin' and is_null($UserRole)))
33
- {
34
- $password = (isset($_POST['pass1']) && trim($_POST['pass1'])) ? $_POST['pass1'] : false;
35
- $password=($password==false)?(isset($_POST['password_1'])?$_POST['password_1']:false):$password ;
36
- $user_id = isset($userData->ID) ? $userData->ID : false;
37
- $username = isset($_POST["user_login"]) ? $_POST["user_login"] : (isset($userData->user_login)?$userData->user_login:$userData->user_email);
38
-
39
- if ($password == false) { return $errors; }
40
- if ($errors->get_error_data("pass")) { return $errors; }
41
-
42
- $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
43
- if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
44
- $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
45
- return $errors;
46
- }
47
-
48
- return $errors;
49
- }
50
-
51
- return true;
52
- }
53
- public static function woocommerce_password_registration_protection($errors, $username, $email) {
54
- if(get_option( 'woocommerce_registration_generate_password' )=='yes')
55
- return $errors;
56
- $password=$_POST['account_password'];
57
- return class_miniorange_2fa_strong_password::is_validPassword($errors, $username, $password);
58
- }
59
-
60
- public static function woocommerce_password_edit_account($errors, $user) {
61
- $password=$_POST['password_1'];
62
- $user =get_userdata($user->ID);
63
- $username=$user->user_login;
64
- $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
65
-
66
- if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
67
- $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
68
- return $errors;
69
- }
70
- }
71
-
72
- public static function is_validPassword($errors, $username, $password){
73
-
74
- $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
75
- if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
76
- $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
77
- return $errors;
78
- }
79
-
80
- return $errors;
81
-
82
- }
83
- public static function mo2f_isStrongPasswd($passwd, $username ) {
84
- $strength = 0;
85
-
86
- if(strlen( trim( $passwd ) ) < 5)
87
- return false;
88
-
89
- if(strtolower( $passwd ) == strtolower( $username ) )
90
- return false;
91
-
92
- if(preg_match('/(?:password|passwd|mypass|wordpress)/i', $passwd)){
93
- return false;
94
- }
95
- if($num = preg_match_all( "/\d/", $passwd, $matches) ){
96
- $strength += ((int)$num * 10);
97
- }
98
- if ( preg_match( "/[a-z]/", $passwd ) )
99
- $strength += 26;
100
- if ( preg_match( "/[A-Z]/", $passwd ) )
101
- $strength += 26;
102
- if ($num = preg_match_all( "/[^a-zA-Z0-9]/", $passwd, $matches)){
103
- $strength += (31 * (int)$num);
104
-
105
- }
106
- if($strength > 60){
107
- return true;
108
- }
109
- }
110
- }
111
  ?>
1
+ <?php
2
+
3
+ class class_miniorange_2fa_strong_password {
4
+
5
+ function __construct(){
6
+ }
7
+
8
+ public static function woocommerce_password_protection($errors, $username, $password, $email) {
9
+ if ($password == false) { return $errors; }
10
+ if ($errors->get_error_data("pass")) { return $errors; }
11
+
12
+ $enforceStrongPasswds = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option');
13
+
14
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
15
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
16
+ return $errors;
17
+ }
18
+
19
+ return $errors;
20
+ }
21
+ public static function validatePassword($errors, $update, $userData){
22
+ $Users = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option');
23
+ $UserRole = $_POST['role'];
24
+ if(is_null($UserRole) and $Users == 'user')
25
+ {
26
+ return true;
27
+ }
28
+
29
+ if($Users == 'all' or ($Users == 'admin' and $UserRole == 'administrator') or ($Users == 'user' and $UserRole != 'administrator' ) or ($Users == 'admin' and is_null($UserRole)))
30
+ {
31
+ $password = (isset($_POST['pass1']) && trim($_POST['pass1'])) ? $_POST['pass1'] : false;
32
+ $password=($password==false)?(isset($_POST['password_1'])?$_POST['password_1']:false):$password ;
33
+ $user_id = isset($userData->ID) ? $userData->ID : false;
34
+ $username = isset($_POST["user_login"]) ? $_POST["user_login"] : (isset($userData->user_login)?$userData->user_login:$userData->user_email);
35
+
36
+ if ($password == false) { return $errors; }
37
+ if ($errors->get_error_data("pass")) { return $errors; }
38
+
39
+ $enforceStrongPasswds = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option');
40
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
41
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
42
+ return $errors;
43
+ }
44
+
45
+ return $errors;
46
+ }
47
+
48
+ return true;
49
+ }
50
+ public static function woocommerce_password_registration_protection($errors, $username, $email) {
51
+ if(get_option( 'woocommerce_registration_generate_password' )=='yes')
52
+ return $errors;
53
+ $password=$_POST['account_password'];
54
+ return class_miniorange_2fa_strong_password::is_validPassword($errors, $username, $password);
55
+ }
56
+
57
+ public static function woocommerce_password_edit_account($errors, $user) {
58
+ $password=$_POST['password_1'];
59
+ $user =get_userdata($user->ID);
60
+ $username=$user->user_login;
61
+ $enforceStrongPasswds = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option');
62
+
63
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
64
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
65
+ return $errors;
66
+ }
67
+ }
68
+
69
+ public static function is_validPassword($errors, $username, $password){
70
+
71
+ $enforceStrongPasswds = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords', 'get_option');
72
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
73
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
74
+ return $errors;
75
+ }
76
+
77
+ return $errors;
78
+
79
+ }
80
+ public static function mo2f_isStrongPasswd($passwd, $username ) {
81
+ $strength = 0;
82
+
83
+ if(strlen( trim( $passwd ) ) < 5)
84
+ return false;
85
+
86
+ if(strtolower( $passwd ) == strtolower( $username ) )
87
+ return false;
88
+
89
+ if(preg_match('/(?:password|passwd|mypass|wordpress)/i', $passwd)){
90
+ return false;
91
+ }
92
+ if($num = preg_match_all( "/\d/", $passwd, $matches) ){
93
+ $strength += ((int)$num * 10);
94
+ }
95
+ if ( preg_match( "/[a-z]/", $passwd ) )
96
+ $strength += 26;
97
+ if ( preg_match( "/[A-Z]/", $passwd ) )
98
+ $strength += 26;
99
+ if ($num = preg_match_all( "/[^a-zA-Z0-9]/", $passwd, $matches)){
100
+ $strength += (31 * (int)$num);
101
+
102
+ }
103
+ if($strength > 60){
104
+ return true;
105
+ }
106
+ }
107
+ }
 
 
 
108
  ?>
handler/twofa/setup_twofa.php CHANGED
@@ -1,877 +1,918 @@
1
- <?php
2
- $setup_dirName = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'setup'.DIRECTORY_SEPARATOR;
3
- $test_dirName = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'test'.DIRECTORY_SEPARATOR;
4
- include $setup_dirName.'setup_google_authenticator.php';
5
- include $setup_dirName.'setup_google_authenticator_onpremise.php';
6
- include $setup_dirName.'setup_authy_authenticator.php';
7
- include $setup_dirName.'setup_kba_questions.php';
8
- include $setup_dirName.'setup_miniorange_authenticator.php';
9
- include $setup_dirName.'setup_otp_over_sms.php';
10
- include $test_dirName.'test_twofa_email_verification.php';
11
- include $test_dirName.'test_twofa_google_authy_authenticator.php';
12
- include $test_dirName.'test_twofa_miniorange_qrcode_authentication.php';
13
- include $test_dirName.'test_twofa_kba_questions.php';
14
- include $test_dirName.'test_twofa_miniorange_push_notification.php';
15
- include $test_dirName.'test_twofa_miniorange_soft_token.php';
16
- include $test_dirName.'test_twofa_otp_over_sms.php';
17
-
18
- function mo2f_decode_2_factor( $selected_2_factor_method, $decode_type ) {
19
-
20
- if ( $selected_2_factor_method == 'NONE' ) {
21
- return $selected_2_factor_method;
22
- }else if($selected_2_factor_method == "OTP Over Email")
23
- {
24
- $selected_2_factor_method = "EMAIL";
25
- }
26
-
27
- $wpdb_2fa_methods = array(
28
- "miniOrangeQRCodeAuthentication" => "miniOrange QR Code Authentication",
29
- "miniOrangeSoftToken" => "miniOrange Soft Token",
30
- "miniOrangePushNotification" => "miniOrange Push Notification",
31
- "GoogleAuthenticator" => "Google Authenticator",
32
- "AuthyAuthenticator" => "Authy Authenticator",
33
- "SecurityQuestions" => "Security Questions",
34
- "EmailVerification" => "Email Verification",
35
- "OTPOverSMS" => "OTP Over SMS",
36
- "OTPOverEmail" => "OTP Over Email",
37
- "EMAIL" => "OTP Over Email",
38
- );
39
-
40
- $server_2fa_methods = array(
41
- "miniOrange QR Code Authentication" => "MOBILE AUTHENTICATION",
42
- "miniOrange Soft Token" => "SOFT TOKEN",
43
- "miniOrange Push Notification" => "PUSH NOTIFICATIONS",
44
- "Google Authenticator" => "GOOGLE AUTHENTICATOR",
45
- "Authy Authenticator" => "GOOGLE AUTHENTICATOR",
46
- "Security Questions" => "KBA",
47
- "Email Verification" => "OUT OF BAND EMAIL",
48
- "OTP Over SMS" => "SMS",
49
- "EMAIL" => "OTP Over Email",
50
- "OTPOverEmail" => "OTP Over Email"
51
- );
52
-
53
- $server_to_wpdb_2fa_methods = array(
54
- "MOBILE AUTHENTICATION" => "miniOrange QR Code Authentication",
55
- "SOFT TOKEN" => "miniOrange Soft Token",
56
- "PUSH NOTIFICATIONS" => "miniOrange Push Notification",
57
- "GOOGLE AUTHENTICATOR" => "Google Authenticator",
58
- "KBA" => "Security Questions",
59
- "OUT OF BAND EMAIL" => "Email Verification",
60
- "SMS" => "OTP Over SMS",
61
- "EMAIL" => "OTP Over Email",
62
- "OTPOverEmail" => "OTP Over Email",
63
- "OTP OVER EMAIL" => "OTP Over Email",
64
- );
65
- $methodname='';
66
- if ( $decode_type == "wpdb" ) {
67
- $methodname = isset($wpdb_2fa_methods[ $selected_2_factor_method ])?$wpdb_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
68
- } else if ( $decode_type == "server" ) {
69
- $methodname = isset($server_2fa_methods[ $selected_2_factor_method ])?$server_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
70
- } else {
71
- $methodname = isset($server_to_wpdb_2fa_methods[ $selected_2_factor_method ])?$server_to_wpdb_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
72
- }
73
- return $methodname;
74
-
75
- }
76
-
77
-
78
- function mo2f_create_2fa_form( $user, $category, $auth_methods, $can_display_admin_features='' ) {
79
- global $Mo2fdbQueries;
80
- $all_two_factor_methods = array(
81
- "miniOrange QR Code Authentication",
82
- "miniOrange Soft Token",
83
- "miniOrange Push Notification",
84
- "Google Authenticator",
85
- "Security Questions",
86
- "OTP Over SMS",
87
- "OTP Over Email",
88
- "Authy Authenticator",
89
- "Email Verification",
90
- "OTP Over SMS and Email",
91
- "Hardware Token"
92
- );
93
- $two_factor_methods_descriptions = array(
94
- ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
95
- "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
96
- "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
97
- "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
98
- "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
99
- "Security Questions" => "Answer the three security questions you had set, to login.",
100
- "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
101
- "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
102
- "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
103
- "Email Verification" => "Accept the verification link sent to your email to login.",
104
- "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
105
- "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
106
- );
107
- $two_factor_methods_doc = array(
108
- "Security Questions" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-security-question",
109
- "Google Authenticator" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/google-authenticator",
110
- "miniOrange QR Code Authentication" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-QR-code",
111
- "Email Verification" => "",
112
- "miniOrange Soft Token" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-soft-token",
113
- "miniOrange Push Notification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-push-notification",
114
- "Authy Authenticator" => "",
115
- "OTP Over SMS" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-otp-over-sms",
116
- "OTP Over Email" => "",
117
- "OTP Over SMS and Email" => "",
118
- "Hardware Token" => "",
119
- "" => ""
120
- );
121
- $two_factor_methods_video = array(
122
- "Security Questions" => "",
123
- "Google Authenticator" => "https://www.youtube.com/watch?v=vVGXjedIaGs",
124
- "miniOrange QR Code Authentication" => "",
125
- "Email Verification" => "",
126
- "miniOrange Soft Token" => "",
127
- "miniOrange Push Notification" => "",
128
- "Authy Authenticator" => "",
129
- "OTP Over SMS" => "",
130
- "OTP Over Email" => "",
131
- "OTP Over SMS and Email" => "",
132
- "Hardware Token" => "",
133
- "" => ""
134
- );
135
-
136
- $two_factor_methods_EC = array_slice( $all_two_factor_methods, 0, 9 );
137
- $two_factor_methods_NC = array_slice( $all_two_factor_methods, 0, 7 );
138
- if(MO2F_IS_ONPREM or $category != 'free_plan')
139
- {
140
- $all_two_factor_methods = array(
141
- "Security Questions",
142
- "Google Authenticator",
143
- "Email Verification",
144
- "miniOrange QR Code Authentication",
145
- "miniOrange Soft Token",
146
- "miniOrange Push Notification",
147
- "Authy Authenticator",
148
- "OTP Over SMS",
149
- "OTP Over Email",
150
- "OTP Over SMS and Email",
151
- "Hardware Token"
152
- );
153
- $two_factor_methods_descriptions = array(
154
- ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
155
- "Security Questions" => "Answer the three security questions you had set, to login.",
156
- "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
157
- "Email Verification" => "Accept the verification link sent to your email to login.",
158
- "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
159
- "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
160
- "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
161
- "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
162
- "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
163
- "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
164
- "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
165
- "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
166
- );
167
- }
168
-
169
- $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
170
- $can_user_configure_2fa_method = $can_display_admin_features || ( !$can_display_admin_features && $is_customer_registered );
171
- $is_NC = get_option( 'mo2f_is_NC' );
172
- $is_EC = ! $is_NC;
173
-
174
- $form = '<div class="overlay1" id="overlay" hidden ></div>';
175
- $form .= '<form name="f" method="post" action="" id="mo2f_save_' . $category . '_auth_methods_form">
176
- <div id="mo2f_' . $category . '_auth_methods" >
177
- <br>
178
- <table class="mo2f_auth_methods_table">';
179
-
180
- for ( $i = 0; $i < count( $auth_methods ); $i ++ ) {
181
-
182
- $form .= '<tr>';
183
- for ( $j = 0; $j < count( $auth_methods[ $i ] ); $j ++ ) {
184
- $auth_method = $auth_methods[ $i ][ $j ];
185
- if(MO2F_IS_ONPREM and $category =='free_plan')
186
- {
187
-
188
- if($auth_method != 'Email Verification' and $auth_method != 'Security Questions' and $auth_method != 'Google Authenticator' and $auth_method !='miniOrange QR Code Authentication' and $auth_method !='miniOrange Soft Token' and $auth_method != 'miniOrange Push Notification' and $auth_method != 'OTP Over SMS' and $auth_method != 'OTP Over Email')
189
- {
190
- //continue;
191
- }
192
- }
193
- $auth_method_abr = str_replace( ' ', '', $auth_method );
194
- $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
195
- $is_auth_method_selected = ( $configured_auth_method == $auth_method ? true : false );
196
-
197
- $is_auth_method_av = false;
198
- if ( ( $is_EC && in_array( $auth_method, $two_factor_methods_EC ) ) ||
199
- ( $is_NC && in_array( $auth_method, $two_factor_methods_NC ) ) ) {
200
- $is_auth_method_av = true;
201
- }
202
-
203
- $thumbnail_height = $is_auth_method_av && $category == 'free_plan' ? 190 : 160;
204
- $is_image = $auth_method == "" ? 0 :1;
205
-
206
- $form .= '<td style="width:33%;height: 203px;">
207
- <div class="mo2f_thumbnail" id="'.$auth_method_abr.'_thumbnail_2_factor" style="height:' . $thumbnail_height . 'px;border:1px solid ';
208
- if(MO2F_IS_ONPREM)
209
- {
210
- $iscurrentMethod = 0;
211
- $currentMethod = $configured_auth_method;
212
- if($currentMethod == $auth_method)
213
- $iscurrentMethod = 1;
214
-
215
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
216
- $form .= ';border-top:3px solid ';
217
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
218
- $form .= ';">';
219
- }
220
- else
221
- {
222
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
223
- $form .= ';border-top:3px solid ';
224
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
225
- $form .= ';">';
226
-
227
- }
228
- $form .= '<div>
229
- <div class="mo2f_thumbnail_method" style="width:100%";>
230
- <div style="width: 17%; float:left;padding-top:5px;padding-left:5px;">';
231
-
232
- if($is_image){
233
- $form .= '<img src="' . plugins_url( "includes/images/authmethods/" . $auth_method_abr . ".png", dirname(dirname(__FILE__ ))) . '" style="width: 40px;height: 40px !important; " line-height: 80px;" />';
234
- }
235
-
236
- $form .= '</div>
237
- <div class="mo2f_thumbnail_method_desc" style="padding: 8px;width: 83%;">';
238
- switch ($auth_method) {
239
- case 'Google Authenticator':
240
- $form .=' <span style="float:right">
241
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
242
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
243
-
244
- </a>
245
-
246
- <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
247
- <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
248
- </a>
249
- </span>';
250
- break;
251
-
252
- case 'Security Questions':
253
- $form .=' <span style="float:right">
254
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
255
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
256
-
257
- </a>
258
-
259
-
260
- </span>';
261
- break;
262
-
263
- case 'OTP Over SMS':
264
- $form .=' <span style="float:right">
265
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
266
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
267
-
268
- </a>
269
-
270
-
271
- </span>';
272
- break;
273
-
274
-
275
- case 'miniOrange Soft Token':
276
- $form .=' <span style="float:right">
277
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
278
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
279
-
280
- </a>
281
-
282
-
283
- </span>';
284
-
285
- break;
286
-
287
- case 'miniOrange QR Code Authentication':
288
- $form .=' <span style="float:right">
289
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
290
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
291
-
292
- </a>
293
-
294
-
295
- </span>';
296
-
297
- break;
298
-
299
- case 'miniOrange Push Notification':
300
- $form .=' <span style="float:right">
301
- <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
302
- <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
303
-
304
- </a>
305
-
306
-
307
- </span>';
308
- break;
309
-
310
- default:
311
- {$form .= "";}
312
- break;
313
- }
314
- $form .=' <b>' . $auth_method .
315
- '</b><br>
316
- <p style="padding:0px; padding-left:0px;font-size: 14px;"> ' . $two_factor_methods_descriptions[ $auth_method ] . '</p>
317
-
318
- </div>
319
- </div>
320
- </div>';
321
-
322
- if ( $is_auth_method_av && $category == 'free_plan' ) {
323
-
324
- $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_' . $auth_method_abr . '_config_status', $user->ID );
325
-
326
- $form .= '<div style="height:40px;width:100%;position: absolute;bottom: 0;background-color:';
327
- $iscurrentMethod = 0;
328
- if(MO2F_IS_ONPREM)
329
- {
330
- $currentMethod = $configured_auth_method;
331
- if($currentMethod == $auth_method)
332
- $iscurrentMethod = 1;
333
- $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
334
- }
335
- else
336
- $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
337
- if(MO2F_IS_ONPREM)
338
- {
339
- $twofactor_transactions = new Mo2fDB;
340
- $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user->ID);
341
- if($exceeded){
342
- if(empty($configured_auth_method)){
343
- $can_user_configure_2fa_method = false;
344
- }
345
- else{
346
- $can_user_configure_2fa_method = true;
347
- }
348
- }
349
- else{
350
- $can_user_configure_2fa_method = true;
351
- }
352
- $is_customer_registered = true;
353
- $user = wp_get_current_user();
354
- $form .= ';color:white">';
355
-
356
- $check = $is_customer_registered? true : false;
357
- $show = 0;
358
-
359
-
360
-
361
- $cloud_methods = array('miniOrange QR Code Authentication' , 'miniOrange Soft Token','miniOrange Push Notification');
362
-
363
- if($auth_method == 'Email Verification' || $auth_method == 'Security Questions' || $auth_method == 'Google Authenticator' || $auth_method == 'miniOrange QR Code Authentication' || $auth_method =='miniOrange Soft Token' || $auth_method == 'miniOrange Push Notification' || $auth_method == 'OTP Over SMS' || $auth_method == 'OTP Over Email')
364
- {
365
- $show = 1;
366
- }
367
-
368
- if ( $check ) {
369
- $form .= '<div class="mo2f_configure_2_factor">
370
- <button type="button" id="'.$auth_method_abr.'_configuration" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'configure2factor\');"';
371
- $form .= $show==1 ? "" : " disabled ";
372
- $form .= '>';
373
- if($show)
374
- $form .= $is_auth_method_configured? 'Reconfigure' : 'Configure';
375
- else
376
- $form .= 'Available in cloud solution';
377
- $form .= '</button></div>';
378
- }
379
- if ( ($is_auth_method_configured && ! $is_auth_method_selected) or MO2F_IS_ONPREM) {
380
- $form .= '<div class="mo2f_set_2_factor">
381
- <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\');"';
382
- $form .= $can_user_configure_2fa_method ? "" : " disabled ";
383
- $form .= $show==1 ? "" : " disabled ";
384
- if($show == 1 and $is_auth_method_configured and $iscurrentMethod == 0)
385
- $form .= '>Set as 2-factor</button>
386
- </div>';
387
- }
388
-
389
- $form .= '</div>';
390
-
391
- }
392
- else
393
- {
394
- if(get_option('mo2f_miniorange_admin'))
395
- $allowed = wp_get_current_user()->ID == get_option('mo2f_miniorange_admin');
396
- else
397
- $allowed = 1;
398
- $cloudswitch = 0;
399
- if(!$allowed)
400
- $allowed = 2;
401
- $form .= ';color:white">';
402
- $check = !$is_customer_registered? true : ($auth_method != "Email Verification" and $auth_method != "OTP Over Email"? true : false);
403
-
404
- if ( $check ) {
405
- $form .= '<div class="mo2f_configure_2_factor">
406
- <button type="button" id="'.$auth_method_abr.'_configuration" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'configure2factor\','.$cloudswitch.','.$allowed.');"';
407
- $form .= $can_user_configure_2fa_method ? "" : " ";
408
- $form .= '>';
409
- $form .= $is_auth_method_configured ? 'Reconfigure' : 'Configure';
410
- $form .= '</button></div>';
411
- }
412
-
413
- if ( ($is_auth_method_configured && ! $is_auth_method_selected) or MO2F_IS_ONPREM ) {
414
- $form .= '<div class="mo2f_set_2_factor">
415
- <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\','.$cloudswitch.','.$allowed.');"';
416
- $form .= $can_user_configure_2fa_method ? "" : " ";
417
- $form .= '>Set as 2-factor</button>
418
- </div>';
419
- }
420
-
421
- $form .= '</div>';
422
- }
423
- }
424
- $form .= '</div></div></td>';
425
- }
426
-
427
- $form .= '</tr>';
428
- }
429
-
430
-
431
- $form .= '</table>';
432
- if( $category!="free_plan")
433
- if(current_user_can('administrator')){
434
- $form .= '<div style="background-color: #f1f1f1;padding:10px">
435
- <p style="font-size:16px;margin-left: 1%">In addition to these authentication methods, for other features in this plan, <a href="admin.php?page=mo_2fa_upgrade"><i>Click here.</i></a></p>
436
- </div>';
437
- }
438
-
439
- $form .= '</div> <input type="hidden" name="miniorange_save_form_auth_methods_nonce"
440
- value="'. wp_create_nonce( "miniorange-save-form-auth-methods-nonce" ) .'"/>
441
- <input type="hidden" name="option" value="mo2f_save_' . $category . '_auth_methods" />
442
- <input type="hidden" name="mo2f_configured_2FA_method_' . $category . '" id="mo2f_configured_2FA_method_' . $category . '" />
443
- <input type="hidden" name="mo2f_selected_action_' . $category . '" id="mo2f_selected_action_' . $category . '" />
444
- </form>';
445
-
446
- return $form;
447
- }
448
-
449
-
450
- function mo2f_get_activated_second_factor( $user ) {
451
-
452
- global $Mo2fdbQueries;
453
- $user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
454
- $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
455
- $useremail = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
456
-
457
- if ( $user_registration_status == 'MO_2_FACTOR_SUCCESS' ) {
458
- //checking this option for existing users
459
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mobile_registration_status' => true ) );
460
- $mo2f_second_factor = 'MOBILE AUTHENTICATION';
461
-
462
- return $mo2f_second_factor;
463
- } else if ( $user_registration_status == 'MO_2_FACTOR_INITIALIZE_TWO_FACTOR' ) {
464
- return 'NONE';
465
- } else {
466
- //for new users
467
- if ( $user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' && $is_customer_registered ) {
468
- $enduser = new Two_Factor_Setup();
469
- $userinfo = json_decode( $enduser->mo2f_get_userinfo( $useremail ), true );
470
- if ( json_last_error() == JSON_ERROR_NONE ) {
471
- if ( $userinfo['status'] == 'ERROR' ) {
472
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $userinfo['message'] ) );
473
- $mo2f_second_factor = 'NONE';
474
- } else if ( $userinfo['status'] == 'SUCCESS' ) {
475
- $mo2f_second_factor = mo2f_update_and_sync_user_two_factor( $user->ID, $userinfo );
476
- } else if ( $userinfo['status'] == 'FAILED' ) {
477
- $mo2f_second_factor = 'NONE';
478
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_REMOVED" ) );
479
- } else {
480
- $mo2f_second_factor = 'NONE';
481
- }
482
- } else {
483
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
484
- $mo2f_second_factor = 'NONE';
485
- }
486
- } else {
487
- $mo2f_second_factor = 'NONE';
488
- }
489
-
490
- return $mo2f_second_factor;
491
- }
492
- }
493
-
494
- function mo2f_update_and_sync_user_two_factor( $user_id, $userinfo ) {
495
- global $Mo2fdbQueries;
496
- $mo2f_second_factor = isset( $userinfo['authType'] ) && ! empty( $userinfo['authType'] ) ? $userinfo['authType'] : 'NONE';
497
-
498
- if(MO2F_IS_ONPREM)
499
- {
500
- $mo2f_second_factor = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user_id );
501
- $mo2f_second_factor = $mo2f_second_factor ? $mo2f_second_factor : 'NONE';
502
- return $mo2f_second_factor;
503
- }
504
-
505
- $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_user_email' => $userinfo['email'] ) );
506
- if ( $mo2f_second_factor == 'OUT OF BAND EMAIL' ) {
507
- $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_EmailVerification_config_status' => true ) );
508
- } else if ( $mo2f_second_factor == 'SMS' and !MO2F_IS_ONPREM) {
509
- $phone_num = $userinfo['phone'];
510
- $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_OTPOverSMS_config_status' => true ) );
511
- $_SESSION['user_phone'] = $phone_num;
512
- } else if ( in_array( $mo2f_second_factor, array(
513
- 'SOFT TOKEN',
514
- 'MOBILE AUTHENTICATION',
515
- 'PUSH NOTIFICATIONS'
516
- ) ) ) {
517
- if(!MO2F_IS_ONPREM)
518
- $Mo2fdbQueries->update_user_details( $user_id, array(
519
- 'mo2f_miniOrangeSoftToken_config_status' => true,
520
- 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
521
- 'mo2f_miniOrangePushNotification_config_status' => true
522
- ) );
523
- } else if ( $mo2f_second_factor == 'KBA' ) {
524
- $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_SecurityQuestions_config_status' => true ) );
525
- } else if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
526
- $app_type = get_user_meta( $user_id, 'mo2f_external_app_type', true );
527
-
528
- if ( $app_type == 'Google Authenticator' ) {
529
- $Mo2fdbQueries->update_user_details( $user_id, array(
530
- 'mo2f_GoogleAuthenticator_config_status' => true
531
- ) );
532
- update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
533
- } else if ( $app_type == 'Authy Authenticator' ) {
534
- $Mo2fdbQueries->update_user_details( $user_id, array(
535
- 'mo2f_AuthyAuthenticator_config_status' => true
536
- ) );
537
- update_user_meta( $user_id, 'mo2f_external_app_type', 'Authy Authenticator' );
538
- } else {
539
- $Mo2fdbQueries->update_user_details( $user_id, array(
540
- 'mo2f_GoogleAuthenticator_config_status' => true
541
- ) );
542
-
543
- update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
544
- }
545
- }
546
-
547
- return $mo2f_second_factor;
548
- }
549
-
550
- function display_customer_registration_forms($user){
551
-
552
- global $Mo2fdbQueries;
553
- $mo2f_current_registration_status = get_option( 'mo_2factor_user_registration_status');
554
- $mo2f_message = get_option( 'mo2f_message' );
555
- ?>
556
-
557
- <div id="smsAlertModal" class="modal" role="dialog" data-backdrop="static" data-keyboard="false" >
558
- <div class="mo2f_modal-dialog" style="margin-left:30%;">
559
- <!-- Modal content-->
560
- <div class="modal-content">
561
- <div class="mo2f_modal-header">
562
- <h2 class="mo2f_modal-title">You are just one step away from setting up 2FA.</h2><span type="button" id="mo2f_registration_closed" class="modal-span-close" data-dismiss="modal">&times;</span>
563
- </div>
564
- <div class="mo2f_modal-body">
565
- <span style="color:green;cursor: pointer;float:right;" onclick="show_content();">Why Register with miniOrange?</span><br>
566
- <div id="mo2f_register" style="background-color:#f1f1f1;padding: 1px 4px 1px 14px;display: none;">
567
- <p>miniOrange Two Factor plugin uses highly secure miniOrange APIs to communicate with the plugin. To keep this communication secure, we ask you to register and assign you API keys specific to your account. This way your account and users can be only accessed by API keys assigned to you. Also, you can use the same account on multiple applications and your users do not have to maintain multiple accounts or 2-factors.</p>
568
- </div>
569
- <?php if ( $mo2f_message ) { ?>
570
- <div style="padding:5px;">
571
- <div class="alert alert-info" style="margin-bottom:0px;padding:3px;">
572
- <p style="font-size:15px;margin-left: 2%;"><?php echo $mo2f_message; ?></p>
573
- </div>
574
- </div>
575
- <?php }
576
- if(in_array($mo2f_current_registration_status, array("REGISTRATION_STARTED", "MO_2_FACTOR_OTP_DELIVERED_SUCCESS", "MO_2_FACTOR_OTP_DELIVERED_FAILURE", "MO_2_FACTOR_VERIFY_CUSTOMER")) ){
577
- mo2f_show_registration_screen($user);
578
- }
579
- ?>
580
- </div>
581
- </div>
582
- </div>
583
- <form name="f" method="post" action="" class="mo2f_registration_closed_form">
584
- <input type="hidden" name="mo2f_registration_closed_nonce"
585
- value="<?php echo wp_create_nonce( "mo2f-registration-closed-nonce" ) ?>"/>
586
- <input type="hidden" name="option" value="mo2f_registration_closed"/>
587
- </form>
588
- </div>
589
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
590
- <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
591
- <script>
592
- function show_content() {
593
- jQuery('#mo2f_register').slideToggle();
594
- }
595
- jQuery(function () {
596
- jQuery('#smsAlertModal').modal();
597
- });
598
-
599
- jQuery('#mo2f_registration_closed').click(function () {
600
- jQuery('.mo2f_registration_closed_form').submit();
601
- });
602
- </script>
603
-
604
- <?php
605
- }
606
-
607
- function mo2f_show_registration_screen($user){
608
- global $mo2f_dirName;
609
-
610
- include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'account.php';
611
-
612
- }
613
-
614
- function mo2f_show_2FA_configuration_screen( $user, $selected2FAmethod ) {
615
- global $mo2f_dirName;
616
- switch ( $selected2FAmethod ) {
617
- case "Google Authenticator":
618
- if(MO2F_IS_ONPREM){
619
- include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR. 'gaonprem.php';
620
- $obj = new Google_auth_onpremise();
621
- $obj->mo_GAuth_get_details();
622
- }
623
- else{
624
- Miniorange_Authentication::mo2f_get_GA_parameters($user);
625
- mo2f_configure_google_authenticator( $user );
626
- }
627
- break;
628
- case "Authy Authenticator":
629
- mo2f_configure_authy_authenticator( $user );
630
- break;
631
- case "Security Questions":
632
- mo2f_configure_for_mobile_suppport_kba( $user );
633
- break;
634
- case "Email Verification":
635
- mo2f_configure_for_mobile_suppport_kba( $user );
636
- break;
637
- case "OTP Over SMS":
638
- mo2f_configure_otp_over_sms( $user );
639
- break;
640
- case "miniOrange Soft Token":
641
- mo2f_configure_miniorange_authenticator( $user );
642
- break;
643
- case "miniOrange QR Code Authentication":
644
- mo2f_configure_miniorange_authenticator( $user );
645
- break;
646
- case "miniOrange Push Notification":
647
- mo2f_configure_miniorange_authenticator( $user );
648
- break;
649
- }
650
-
651
- }
652
-
653
- function mo2f_show_2FA_test_screen( $user, $selected2FAmethod ) {
654
-
655
-
656
- switch ( $selected2FAmethod ) {
657
- case "miniOrange QR Code Authentication":
658
- mo2f_test_miniorange_qr_code_authentication( $user );
659
- break;
660
- case "miniOrange Push Notification":
661
- mo2f_test_miniorange_push_notification( $user );
662
- break;
663
- case "miniOrange Soft Token":
664
- mo2f_test_miniorange_soft_token( $user );
665
- break;
666
- case "Email Verification":
667
- mo2f_test_email_verification();
668
- break;
669
- case "OTP Over SMS":
670
- mo2f_test_otp_over_sms( $user );
671
- break;
672
- case "Security Questions":
673
- mo2f_test_kba_security_questions( $user );
674
- break;
675
- case "OTP Over Email":
676
- mo2f_test_otp_over_email($user,$selected2FAmethod);
677
- break;
678
- default:
679
- mo2f_test_google_authy_authenticator( $user, $selected2FAmethod );
680
- }
681
-
682
- }
683
-
684
- function mo2f_method_display_name($user,$mo2f_second_factor){
685
-
686
- if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
687
- $app_type = get_user_meta( $user->ID, 'mo2f_external_app_type', true );
688
-
689
- if ( $app_type == 'Google Authenticator' ) {
690
- $selectedMethod = 'Google Authenticator';
691
- } else if ( $app_type == 'Authy Authenticator' ) {
692
- $selectedMethod = 'Authy Authenticator';
693
- } else {
694
- $selectedMethod = 'Google Authenticator';
695
- update_user_meta( $user->ID, 'mo2f_external_app_type', $selectedMethod );
696
- }
697
- } else {
698
- $selectedMethod = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
699
- }
700
- return $selectedMethod;
701
-
702
- }
703
-
704
- function mo2f_lt( $string ) {
705
- return __($string ,'miniorange-2-factor-authentication' );
706
- }
707
-
708
- function mo2f_rba_description($mo2f_user_email) {?>
709
- <div id="mo2f_rba_addon">
710
- <?php if ( get_option( 'mo2f_rba_installed' ) ) { ?>
711
- <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_rba_addon"
712
- class="mo_wpns_button mo_wpns_button1"
713
- style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
714
- <?php } ?>
715
- <?php if ( ! get_option( 'mo2f_rba_purchased' ) ) { ?>
716
- <a onclick="mo2f_addonform('wp_2fa_addon_rba')" id="mo2f_purchase_rba_addon"
717
- class="mo_wpns_button mo_wpns_button1"
718
- style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a><?php } ?>
719
- <div id="mo2f_rba_addon_hide">
720
-
721
- <br>
722
- <div id="mo2f_hide_rba_content">
723
-
724
- <div class="mo2f_box">
725
- <h3><?php echo __( 'Remember Device', 'miniorange-2-factor-authentication' ); ?></h3>
726
- <hr>
727
- <p id="mo2f_hide_rba_content"><?php echo __( 'With this feature, User would get an option to remember the personal device where Two Factor is not required. Every time the user logs in with the same device it detects the saved device so he will directly login without being prompted for the 2nd factor. If user logs in from new device he will be prompted with 2nd Factor.', 'miniorange-2-factor-authentication' ); ?>
728
-
729
- </p>
730
- </div>
731
- <br><br>
732
- <div class="mo2f_box">
733
- <h3><?php echo __( 'Limit Number Of Device', 'miniorange-2-factor-authentication' ); ?></h3>
734
- <hr>
735
- <p><?php echo __( 'With this feature, the admin can restrict the number of devices from which the user can access the website. If the device limit is exceeded the admin can set three actions where it can allow the users to login, deny the access or challenge the user for authentication.', 'miniorange-2-factor-authentication' ); ?>
736
- </p>
737
-
738
- </div>
739
- <br><br>
740
- <div class="mo2f_box">
741
- <h3><?php echo __( 'IP Restriction: Limit users to login from specific IPs', 'miniorange-2-factor-authentication' ); ?></h3>
742
- <hr>
743
- <p><?php echo __( 'The Admin can enable IP restrictions for the users. It will provide additional security to the accounts and perform different action to the accounts only from the listed IP Ranges. If user tries to access with a restricted IP, Admin can set three action: Allow, challenge or deny. Depending upon the action it will allow the user to login, challenge(prompt) for authentication or deny the access.', 'miniorange-2-factor-authentication' ); ?>
744
-
745
- </div>
746
- <br>
747
- </div>
748
-
749
- </div>
750
- <div id="mo2f_rba_addon_show">
751
- <?php $x = apply_filters( 'mo2f_rba', "rba" );?>
752
- </div>
753
- </div>
754
- <form style="display:none;" id="mo2fa_loginform"
755
- action="<?php echo MO_HOST_NAME . '/moas/login'; ?>"
756
- target="_blank" method="post">
757
- <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
758
- <input type="text" name="redirectUrl"
759
- value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
760
- <input type="text" name="requestOrigin" id="requestOrigin"/>
761
- </form>
762
- <script>
763
- function mo2f_addonform(planType) {
764
- jQuery('#requestOrigin').val(planType);
765
- jQuery('#mo2fa_loginform').submit();
766
- }
767
- </script>
768
- <?php
769
- }
770
-
771
- function mo2f_personalization_description($mo2f_user_email) {?>
772
- <div id="mo2f_custom_addon">
773
- <?php if ( get_option( 'mo2f_personalization_installed' ) ) { ?>
774
- <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_custom_addon"
775
- class="mo_wpns_button mo_wpns_button1"
776
- style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
777
- <?php } ?>
778
- <?php if ( ! get_option( 'mo2f_personalization_purchased' ) ) { ?> <a
779
- onclick="mo2f_addonform('wp_2fa_addon_shortcode')" id="mo2f_purchase_custom_addon"
780
- class="mo_wpns_button mo_wpns_button1"
781
- style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
782
- <?php } ?>
783
- <div id="mo2f_custom_addon_hide">
784
-
785
-
786
- <br>
787
- <div id="mo2f_hide_custom_content">
788
- <div class="mo2f_box">
789
- <h3><?php echo __( 'Customize Plugin Icon', 'miniorange-2-factor-authentication' ); ?></h3>
790
- <hr>
791
- <p>
792
- <?php echo __( 'With this feature, you can customize the plugin icon in the dashboard which is useful when you want your custom logo to be displayed to the users.', 'miniorange-2-factor-authentication' ); ?>
793
- </p>
794
- <br>
795
- <h3><?php echo __( 'Customize Plugin Name', 'miniorange-2-factor-authentication' ); ?></h3>
796
- <hr>
797
- <p>
798
- <?php echo __( 'With this feature, you can customize the name of the plugin in the dashboard.', 'miniorange-2-factor-authentication' ); ?>
799
- </p>
800
-
801
- </div>
802
- <br>
803
- <div class="mo2f_box">
804
- <h3><?php echo __( 'Customize UI of Login Pop up\'s', 'miniorange-2-factor-authentication' ); ?></h3>
805
- <hr>
806
- <p>
807
- <?php echo __( 'With this feature, you can customize the login pop-ups during two factor authentication according to the theme of your website.', 'miniorange-2-factor-authentication' ); ?>
808
- </p>
809
- </div>
810
-
811
- <br>
812
- <div class="mo2f_box">
813
- <h3><?php echo __( 'Custom Email and SMS Templates', 'miniorange-2-factor-authentication' ); ?></h3>
814
- <hr>
815
-
816
- <p><?php echo __( 'You can change the templates for Email and SMS which user receives during authentication.', 'miniorange-2-factor-authentication' ); ?></p>
817
-
818
- </div>
819
- </div>
820
- </div>
821
- <div id="mo2f_custom_addon_show"><?php $x = apply_filters( 'mo2f_custom', "custom"); ?></div>
822
- </div>
823
-
824
- <?php
825
- }
826
-
827
- function mo2f_shortcode_description($mo2f_user_email) { ?>
828
- <div id="mo2f_Shortcode_addon_hide">
829
- <?php if ( get_option( 'mo2f_shortcode_installed' ) ) { ?>
830
- <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_shortcode_addon"
831
- class="mo_wpns_button mo_wpns_button1" style="float:right; margin-top:2%;"><?php echo __( 'Activate
832
- Plugin', 'miniorange-2-factor-authentication' ); ?></a>
833
- <?php } if ( ! get_option( 'mo2f_shortcode_purchased' ) ) { ?>
834
- <a onclick="mo2f_addonform('wp_2fa_addon_personalization')" id="mo2f_purchase_shortcode_addon"
835
- class="mo_wpns_button mo_wpns_button1"
836
- style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
837
- <?php } ?>
838
-
839
- <div id="shortcode" class="description">
840
-
841
-
842
- <br>
843
- <div id="mo2f_hide_shortcode_content" class="mo2f_box">
844
- <h3><?php echo __( 'List of Shortcodes', 'miniorange-2-factor-authentication' ); ?>:</h3>
845
- <hr>
846
- <ol style="margin-left:2%">
847
- <li>
848
- <b><?php echo __( 'Enable Two Factor: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to turn on/off 2-factor by user.', 'miniorange-2-factor-authentication' ); ?>
849
- </li>
850
- <li>
851
- <b><?php echo __( 'Enable Reconfiguration: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to configure the Google Authenticator and Security Questions by user.', 'miniorange-2-factor-authentication' ); ?>
852
- </li>
853
- <li>
854
- <b><?php echo __( 'Enable Remember Device: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( ' This shortcode provides\'Enable Remember Device\' from your custom login form.', 'miniorange-2-factor-authentication' ); ?>
855
- </li>
856
- </ol>
857
- </div>
858
- <div id="mo2f_Shortcode_addon_show"><?php $x = apply_filters( 'mo2f_shortcode', "shortcode" ); ?></div>
859
- </div>
860
- <br>
861
- </div>
862
- <form style="display:none;" id="mo2fa_loginform" action="<?php echo MO_HOST_NAME . '/moas/login'; ?>" target="_blank" method="post">
863
- <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
864
- <input type="text" name="redirectUrl"
865
- value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
866
- <input type="text" name="requestOrigin" id="requestOrigin"/>
867
- </form>
868
- <script>
869
- function mo2f_addonform(planType) {
870
- jQuery('#requestOrigin').val(planType);
871
- jQuery('#mo2fa_loginform').submit();
872
- }
873
- </script>
874
- <?php
875
- }
876
-
877
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $setup_dirName = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'setup'.DIRECTORY_SEPARATOR;
3
+ $test_dirName = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'test'.DIRECTORY_SEPARATOR;
4
+ include $setup_dirName.'setup_google_authenticator.php';
5
+ include $setup_dirName.'setup_google_authenticator_onpremise.php';
6
+ include $setup_dirName.'setup_authy_authenticator.php';
7
+ include $setup_dirName.'setup_kba_questions.php';
8
+ include $setup_dirName.'setup_miniorange_authenticator.php';
9
+ include $setup_dirName.'setup_otp_over_sms.php';
10
+ include $test_dirName.'test_twofa_email_verification.php';
11
+ include $test_dirName.'test_twofa_google_authy_authenticator.php';
12
+ include $test_dirName.'test_twofa_miniorange_qrcode_authentication.php';
13
+ include $test_dirName.'test_twofa_kba_questions.php';
14
+ include $test_dirName.'test_twofa_miniorange_push_notification.php';
15
+ include $test_dirName.'test_twofa_miniorange_soft_token.php';
16
+ include $test_dirName.'test_twofa_otp_over_sms.php';
17
+
18
+ function mo2f_decode_2_factor( $selected_2_factor_method, $decode_type ) {
19
+
20
+ if ( $selected_2_factor_method == 'NONE' ) {
21
+ return $selected_2_factor_method;
22
+ }else if($selected_2_factor_method == "OTP Over Email")
23
+ {
24
+ $selected_2_factor_method = "EMAIL";
25
+ }
26
+
27
+ $wpdb_2fa_methods = array(
28
+ "miniOrangeQRCodeAuthentication" => "miniOrange QR Code Authentication",
29
+ "miniOrangeSoftToken" => "miniOrange Soft Token",
30
+ "miniOrangePushNotification" => "miniOrange Push Notification",
31
+ "GoogleAuthenticator" => "Google Authenticator",
32
+ "AuthyAuthenticator" => "Authy Authenticator",
33
+ "SecurityQuestions" => "Security Questions",
34
+ "EmailVerification" => "Email Verification",
35
+ "OTPOverSMS" => "OTP Over SMS",
36
+ "OTPOverEmail" => "OTP Over Email",
37
+ "EMAIL" => "OTP Over Email",
38
+ );
39
+
40
+ $server_2fa_methods = array(
41
+ "miniOrange QR Code Authentication" => "MOBILE AUTHENTICATION",
42
+ "miniOrange Soft Token" => "SOFT TOKEN",
43
+ "miniOrange Push Notification" => "PUSH NOTIFICATIONS",
44
+ "Google Authenticator" => "GOOGLE AUTHENTICATOR",
45
+ "Authy Authenticator" => "GOOGLE AUTHENTICATOR",
46
+ "Security Questions" => "KBA",
47
+ "Email Verification" => "OUT OF BAND EMAIL",
48
+ "OTP Over SMS" => "SMS",
49
+ "EMAIL" => "OTP Over Email",
50
+ "OTPOverEmail" => "OTP Over Email"
51
+ );
52
+
53
+ $server_to_wpdb_2fa_methods = array(
54
+ "MOBILE AUTHENTICATION" => "miniOrange QR Code Authentication",
55
+ "SOFT TOKEN" => "miniOrange Soft Token",
56
+ "PUSH NOTIFICATIONS" => "miniOrange Push Notification",
57
+ "GOOGLE AUTHENTICATOR" => "Google Authenticator",
58
+ "KBA" => "Security Questions",
59
+ "OUT OF BAND EMAIL" => "Email Verification",
60
+ "SMS" => "OTP Over SMS",
61
+ "EMAIL" => "OTP Over Email",
62
+ "OTPOverEmail" => "OTP Over Email",
63
+ "OTP OVER EMAIL" => "OTP Over Email",
64
+ );
65
+ $methodname='';
66
+ if ( $decode_type == "wpdb" ) {
67
+ $methodname = isset($wpdb_2fa_methods[ $selected_2_factor_method ])?$wpdb_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
68
+ } else if ( $decode_type == "server" ) {
69
+ $methodname = isset($server_2fa_methods[ $selected_2_factor_method ])?$server_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
70
+ } else {
71
+ $methodname = isset($server_to_wpdb_2fa_methods[ $selected_2_factor_method ])?$server_to_wpdb_2fa_methods[ $selected_2_factor_method ]:$selected_2_factor_method;
72
+ }
73
+ return $methodname;
74
+
75
+ }
76
+
77
+
78
+ function mo2f_create_2fa_form( $user, $category, $auth_methods, $can_display_admin_features='' ) {
79
+ global $Mo2fdbQueries;
80
+ $all_two_factor_methods = array(
81
+ "miniOrange QR Code Authentication",
82
+ "miniOrange Soft Token",
83
+ "miniOrange Push Notification",
84
+ "Google Authenticator",
85
+ "Security Questions",
86
+ "OTP Over SMS",
87
+ "OTP Over Email",
88
+ "Authy Authenticator",
89
+ "Email Verification",
90
+ "OTP Over SMS and Email",
91
+ "Hardware Token"
92
+ );
93
+ $two_factor_methods_descriptions = array(
94
+ ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
95
+ "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
96
+ "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
97
+ "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
98
+ "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
99
+ "Security Questions" => "Answer the three security questions you had set, to login.",
100
+ "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
101
+ "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
102
+ "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
103
+ "Email Verification" => "Accept the verification link sent to your email to login.",
104
+ "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
105
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
106
+ );
107
+ $two_factor_methods_doc = array(
108
+ "Security Questions" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-security-question",
109
+ "Google Authenticator" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/google-authenticator",
110
+ "miniOrange QR Code Authentication" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-QR-code",
111
+ "Email Verification" => "",
112
+ "miniOrange Soft Token" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-soft-token",
113
+ "miniOrange Push Notification" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-miniorange-push-notification",
114
+ "Authy Authenticator" => "",
115
+ "OTP Over SMS" => "https://developers.miniorange.com/docs/security/wordpress/wp-security/step-by-setup-guide-to-set-up-otp-over-sms",
116
+ "OTP Over Email" => "",
117
+ "OTP Over SMS and Email" => "",
118
+ "Hardware Token" => "",
119
+ "" => ""
120
+ );
121
+ $two_factor_methods_video = array(
122
+ "Security Questions" => "https://www.youtube.com/watch?v=pXPqQ047o-0",
123
+ "Google Authenticator" => "https://www.youtube.com/watch?v=BS6tY-Goa1Q",
124
+ "miniOrange QR Code Authentication" => "https://www.youtube.com/watch?v=IPYizmgzTd8",
125
+ "Email Verification" => "https://www.youtube.com/watch?v=OacJWBYx_AE",
126
+ "miniOrange Soft Token" => "https://www.youtube.com/watch?v=9HV8V4f80k8",
127
+ "miniOrange Push Notification" => "https://www.youtube.com/watch?v=it_dAhFcxvw",
128
+ "Authy Authenticator" => "https://www.youtube.com/watch?v=fV-VnC_5Q5c",
129
+ "OTP Over SMS" => "https://www.youtube.com/watch?v=ag_E1Bmen-c",
130
+ "OTP Over Email" => "",
131
+ "OTP Over SMS and Email" => "",
132
+ "Hardware Token" => "",
133
+ "" => ""
134
+ );
135
+
136
+ $two_factor_methods_EC = array_slice( $all_two_factor_methods, 0, 9 );
137
+ $two_factor_methods_NC = array_slice( $all_two_factor_methods, 0, 7 );
138
+ if(MO2F_IS_ONPREM or $category != 'free_plan')
139
+ {
140
+ $all_two_factor_methods = array(
141
+ "Security Questions",
142
+ "Google Authenticator",
143
+ "Email Verification",
144
+ "miniOrange QR Code Authentication",
145
+ "miniOrange Soft Token",
146
+ "miniOrange Push Notification",
147
+ "Authy Authenticator",
148
+ "OTP Over SMS",
149
+ "OTP Over Email",
150
+ "OTP Over SMS and Email",
151
+ "Hardware Token"
152
+ );
153
+ $two_factor_methods_descriptions = array(
154
+ ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
155
+ "Security Questions" => "Answer the three security questions you had set, to login.",
156
+ "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
157
+ "Email Verification" => "Accept the verification link sent to your email to login.",
158
+ "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
159
+ "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
160
+ "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
161
+ "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
162
+ "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
163
+ "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
164
+ "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
165
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
166
+ );
167
+ }
168
+
169
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
170
+ $can_user_configure_2fa_method = $can_display_admin_features || ( !$can_display_admin_features && $is_customer_registered );
171
+ $is_NC = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
172
+ $is_EC = ! $is_NC;
173
+
174
+ $form = '<div class="overlay1" id="overlay" hidden ></div>';
175
+ $form .= '<form name="f" method="post" action="" id="mo2f_save_' . $category . '_auth_methods_form">
176
+ <div id="mo2f_' . $category . '_auth_methods" >
177
+ <br>
178
+ <table class="mo2f_auth_methods_table">';
179
+
180
+ for ( $i = 0; $i < count( $auth_methods ); $i ++ ) {
181
+
182
+ $form .= '<tr>';
183
+ for ( $j = 0; $j < count( $auth_methods[ $i ] ); $j ++ ) {
184
+ $auth_method = $auth_methods[ $i ][ $j ];
185
+ if(MO2F_IS_ONPREM and $category =='free_plan')
186
+ {
187
+
188
+ if($auth_method != 'Email Verification' and $auth_method != 'Security Questions' and $auth_method != 'Google Authenticator' and $auth_method !='miniOrange QR Code Authentication' and $auth_method !='miniOrange Soft Token' and $auth_method != 'miniOrange Push Notification' and $auth_method != 'OTP Over SMS' and $auth_method != 'OTP Over Email')
189
+ {
190
+ //continue;
191
+ }
192
+ }
193
+ $auth_method_abr = str_replace( ' ', '', $auth_method );
194
+ $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
195
+ $is_auth_method_selected = ( $configured_auth_method == $auth_method ? true : false );
196
+
197
+ $is_auth_method_av = false;
198
+ if ( ( $is_EC && in_array( $auth_method, $two_factor_methods_EC ) ) ||
199
+ ( $is_NC && in_array( $auth_method, $two_factor_methods_NC ) ) ) {
200
+ $is_auth_method_av = true;
201
+ }
202
+
203
+ $thumbnail_height = $is_auth_method_av && $category == 'free_plan' ? 190 : 160;
204
+ $is_image = $auth_method == "" ? 0 :1;
205
+
206
+ $form .= '<td style="width:33%;height: 203px;">
207
+ <div class="mo2f_thumbnail" id="'.$auth_method_abr.'_thumbnail_2_factor" style="height:' . $thumbnail_height . 'px;border:1px solid ';
208
+ if(MO2F_IS_ONPREM)
209
+ {
210
+ $iscurrentMethod = 0;
211
+ $currentMethod = $configured_auth_method;
212
+ if($currentMethod == $auth_method)
213
+ $iscurrentMethod = 1;
214
+
215
+ $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
216
+ $form .= ';border-top:3px solid ';
217
+ $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
218
+ $form .= ';">';
219
+ }
220
+ else
221
+ {
222
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
223
+ $form .= ';border-top:3px solid ';
224
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
225
+ $form .= ';">';
226
+
227
+ }
228
+ $form .= '<div>
229
+ <div class="mo2f_thumbnail_method" style="width:100%";>
230
+ <div style="width: 17%; float:left;padding-top:5px;padding-left:5px;">';
231
+
232
+ if($is_image){
233
+ $form .= '<img src="' . plugins_url( "includes/images/authmethods/" . $auth_method_abr . ".png", dirname(dirname(__FILE__ ))) . '" style="width: 40px;height: 40px !important; " line-height: 80px;" />';
234
+ }
235
+
236
+ $form .= '</div>
237
+ <div class="mo2f_thumbnail_method_desc" style="padding: 8px;width: 83%;">';
238
+ switch ($auth_method) {
239
+ case 'Google Authenticator':
240
+ $form .=' <span style="float:right">
241
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
242
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
243
+
244
+ </a>
245
+
246
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
247
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
248
+ </a>
249
+ </span>';
250
+ break;
251
+
252
+ case 'Security Questions':
253
+ $form .=' <span style="float:right">
254
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
255
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
256
+ </a>
257
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
258
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
259
+ </a>
260
+
261
+
262
+ </span>';
263
+ break;
264
+
265
+ case 'OTP Over SMS':
266
+ $form .=' <span style="float:right">
267
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
268
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
269
+
270
+ </a>
271
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
272
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
273
+ </a>
274
+
275
+ </span>';
276
+ break;
277
+
278
+
279
+ case 'miniOrange Soft Token':
280
+ $form .=' <span style="float:right">
281
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
282
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
283
+
284
+ </a>
285
+
286
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
287
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
288
+ </a>
289
+ </span>';
290
+
291
+ break;
292
+
293
+ case 'miniOrange QR Code Authentication':
294
+ $form .=' <span style="float:right">
295
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
296
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
297
+
298
+ </a>
299
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
300
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
301
+ </a>
302
+
303
+ </span>';
304
+
305
+ break;
306
+
307
+ case 'miniOrange Push Notification':
308
+ $form .=' <span style="float:right">
309
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
310
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
311
+
312
+ </a>
313
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
314
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
315
+ </a>
316
+
317
+ </span>';
318
+ break;
319
+
320
+ case 'Email Verification':
321
+ $form .=' <span style="float:right">
322
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
323
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
324
+
325
+ </a>
326
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
327
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
328
+ </a>
329
+
330
+ </span>';
331
+ break;
332
+ case 'Authy Authenticator':
333
+ $form .=' <span style="float:right">
334
+ <a href='.$two_factor_methods_doc[$auth_method].' target="_blank">
335
+ <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
336
+
337
+ </a>
338
+ <a href='.$two_factor_methods_video[$auth_method].' target="_blank">
339
+ <span class="dashicons dashicons-video-alt3" style="font-size:18px;color:red;float: right; margin-right: 5px;"></span>
340
+ </a>
341
+
342
+ </span>';
343
+
344
+ break;
345
+
346
+ default:
347
+ {$form .= "";}
348
+ break;
349
+ }
350
+ $form .=' <b>' . $auth_method .
351
+ '</b><br>
352
+ <p style="padding:0px; padding-left:0px;font-size: 14px;"> ' . $two_factor_methods_descriptions[ $auth_method ] . '</p>
353
+
354
+ </div>
355
+ </div>
356
+ </div>';
357
+
358
+ if ( $is_auth_method_av && $category == 'free_plan' ) {
359
+
360
+ $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_' . $auth_method_abr . '_config_status', $user->ID );
361
+ if(($auth_method == 'OUT OF BAND EMAIL' or $auth_method == 'OTP Over Email') and !MO2F_IS_ONPREM )
362
+ $is_auth_method_configured = 1;
363
+ $form .= '<div style="height:40px;width:100%;position: absolute;bottom: 0;background-color:';
364
+ $iscurrentMethod = 0;
365
+ if(MO2F_IS_ONPREM)
366
+ {
367
+ $currentMethod = $configured_auth_method;
368
+ if($currentMethod == $auth_method)
369
+ $iscurrentMethod = 1;
370
+ $form .= $iscurrentMethod ? '#48b74b' : '#20b2aa';
371
+ }
372
+ else
373
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
374
+ if(MO2F_IS_ONPREM)
375
+ {
376
+ $twofactor_transactions = new Mo2fDB;
377
+ $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($user->ID);
378
+ if($exceeded){
379
+ if(empty($configured_auth_method)){
380
+ $can_user_configure_2fa_method = false;
381
+ }
382
+ else{
383
+ $can_user_configure_2fa_method = true;
384
+ }
385
+ }
386
+ else{
387
+ $can_user_configure_2fa_method = true;
388
+ }
389
+ $is_customer_registered = true;
390
+ $user = wp_get_current_user();
391
+ $form .= ';color:white">';
392
+
393
+ $check = $is_customer_registered? true : false;
394
+ $show = 0;
395
+
396
+
397
+
398
+ $cloud_methods = array('miniOrange QR Code Authentication' , 'miniOrange Soft Token','miniOrange Push Notification');
399
+
400
+ if($auth_method == 'Email Verification' || $auth_method == 'Security Questions' || $auth_method == 'Google Authenticator' || $auth_method == 'miniOrange QR Code Authentication' || $auth_method =='miniOrange Soft Token' || $auth_method == 'miniOrange Push Notification' || $auth_method == 'OTP Over SMS' || $auth_method == 'OTP Over Email')
401
+ {
402
+ $show = 1;
403
+ }
404
+
405
+ if ( $check ) {
406
+ $form .= '<div class="mo2f_configure_2_factor">
407
+ <button type="button" id="'.$auth_method_abr.'_configuration" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'configure2factor\');"';
408
+ $form .= $show==1 ? "" : " disabled ";
409
+ $form .= '>';
410
+ if($show)
411
+ $form .= $is_auth_method_configured? 'Reconfigure' : 'Configure';
412
+ else
413
+ $form .= 'Available in cloud solution';
414
+ $form .= '</button></div>';
415
+ }
416
+ if ( ($is_auth_method_configured && ! $is_auth_method_selected) or MO2F_IS_ONPREM) {
417
+ $form .= '<div class="mo2f_set_2_factor">
418
+ <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\');"';
419
+ $form .= $can_user_configure_2fa_method ? "" : " disabled ";
420
+ $form .= $show==1 ? "" : " disabled ";
421
+ if($show == 1 and $is_auth_method_configured and $iscurrentMethod == 0)
422
+ $form .= '>Set as 2-factor</button>
423
+ </div>';
424
+ }
425
+
426
+ $form .= '</div>';
427
+
428
+ }
429
+ else
430
+ {
431
+ if(get_option('mo2f_miniorange_admin'))
432
+ $allowed = wp_get_current_user()->ID == get_option('mo2f_miniorange_admin');
433
+ else
434
+ $allowed = 1;
435
+ $cloudswitch = 0;
436
+ if(!$allowed)
437
+ $allowed = 2;
438
+ $form .= ';color:white">';
439
+ $check = !$is_customer_registered? true : ($auth_method != "Email Verification" and $auth_method != "OTP Over Email"? true : false);
440
+ $is_auth_method_configured = !$is_customer_registered ? 0 :1;
441
+ if(!MO2F_IS_ONPREM and ($auth_method == "Email Verification" or $auth_method == "OTP Over Email"))
442
+ $check = 0;
443
+ if ( $check ) {
444
+ $form .= '<div class="mo2f_configure_2_factor">
445
+ <button type="button" id="'.$auth_method_abr.'_configuration" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'configure2factor\','.$cloudswitch.','.$allowed.');"';
446
+ $form .= $can_user_configure_2fa_method ? "" : " ";
447
+ $form .= '>';
448
+ $form .= $is_auth_method_configured ? 'Reconfigure' : 'Configure';
449
+ $form .= '</button></div>';
450
+ }
451
+
452
+ if ( ($is_auth_method_configured && ! $is_auth_method_selected) or MO2F_IS_ONPREM ) {
453
+ $form .= '<div class="mo2f_set_2_factor">
454
+ <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\','.$cloudswitch.','.$allowed.');"';
455
+ $form .= $can_user_configure_2fa_method ? "" : " ";
456
+ $form .= '>Set as 2-factor</button>
457
+ </div>';
458
+ }
459
+
460
+ $form .= '</div>';
461
+ }
462
+ }
463
+ $form .= '</div></div></td>';
464
+ }
465
+
466
+ $form .= '</tr>';
467
+ }
468
+
469
+
470
+ $form .= '</table>';
471
+ if( $category!="free_plan")
472
+ if(current_user_can('administrator')){
473
+ $form .= '<div style="background-color: #f1f1f1;padding:10px">
474
+ <p style="font-size:16px;margin-left: 1%">In addition to these authentication methods, for other features in this plan, <a href="admin.php?page=mo_2fa_upgrade"><i>Click here.</i></a></p>
475
+ </div>';
476
+ }
477
+
478
+ $form .= '</div> <input type="hidden" name="miniorange_save_form_auth_methods_nonce"
479
+ value="'. wp_create_nonce( "miniorange-save-form-auth-methods-nonce" ) .'"/>
480
+ <input type="hidden" name="option" value="mo2f_save_' . $category . '_auth_methods" />
481
+ <input type="hidden" name="mo2f_configured_2FA_method_' . $category . '" id="mo2f_configured_2FA_method_' . $category . '" />
482
+ <input type="hidden" name="mo2f_selected_action_' . $category . '" id="mo2f_selected_action_' . $category . '" />
483
+ </form>';
484
+
485
+ return $form;
486
+ }
487
+
488
+
489
+ function mo2f_get_activated_second_factor( $user ) {
490
+
491
+ global $Mo2fdbQueries;
492
+ $user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
493
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
494
+ $useremail = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
495
+
496
+ if ( $user_registration_status == 'MO_2_FACTOR_SUCCESS' ) {
497
+ //checking this option for existing users
498
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mobile_registration_status' => true ) );
499
+ $mo2f_second_factor = 'MOBILE AUTHENTICATION';
500
+
501
+ return $mo2f_second_factor;
502
+ } else if ( $user_registration_status == 'MO_2_FACTOR_INITIALIZE_TWO_FACTOR' ) {
503
+ return 'NONE';
504
+ } else {
505
+ //for new users
506
+ if ( $user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' && $is_customer_registered ) {
507
+ $enduser = new Two_Factor_Setup();
508
+ $userinfo = json_decode( $enduser->mo2f_get_userinfo( $useremail ), true );
509
+ if ( json_last_error() == JSON_ERROR_NONE ) {
510
+ if ( $userinfo['status'] == 'ERROR' ) {
511
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $userinfo['message'] ) );
512
+ $mo2f_second_factor = 'NONE';
513
+ } else if ( $userinfo['status'] == 'SUCCESS' ) {
514
+ $mo2f_second_factor = mo2f_update_and_sync_user_two_factor( $user->ID, $userinfo );
515
+ } else if ( $userinfo['status'] == 'FAILED' ) {
516
+ $mo2f_second_factor = 'NONE';
517
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_REMOVED" ) );
518
+ } else {
519
+ $mo2f_second_factor = 'NONE';
520
+ }
521
+ } else {
522
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
523
+ $mo2f_second_factor = 'NONE';
524
+ }
525
+ } else {
526
+ $mo2f_second_factor = 'NONE';
527
+ }
528
+
529
+ return $mo2f_second_factor;
530
+ }
531
+ }
532
+
533
+ function mo2f_update_and_sync_user_two_factor( $user_id, $userinfo ) {
534
+ global $Mo2fdbQueries;
535
+ $mo2f_second_factor = isset( $userinfo['authType'] ) && ! empty( $userinfo['authType'] ) ? $userinfo['authType'] : 'NONE';
536
+ if(MO2F_IS_ONPREM)
537
+ {
538
+ $mo2f_second_factor = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user_id );
539
+ $mo2f_second_factor = $mo2f_second_factor ? $mo2f_second_factor : 'NONE';
540
+ return $mo2f_second_factor;
541
+ }
542
+
543
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_user_email' => $userinfo['email'] ) );
544
+ if ( $mo2f_second_factor == 'OUT OF BAND EMAIL' ) {
545
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_EmailVerification_config_status' => true ) );
546
+ } else if ( $mo2f_second_factor == 'SMS' and !MO2F_IS_ONPREM) {
547
+ $phone_num = $userinfo['phone'];
548
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_OTPOverSMS_config_status' => true ) );
549
+ $_SESSION['user_phone'] = $phone_num;
550
+ } else if ( in_array( $mo2f_second_factor, array(
551
+ 'SOFT TOKEN',
552
+ 'MOBILE AUTHENTICATION',
553
+ 'PUSH NOTIFICATIONS'
554
+ ) ) ) {
555
+ if(!MO2F_IS_ONPREM)
556
+ $Mo2fdbQueries->update_user_details( $user_id, array(
557
+ 'mo2f_miniOrangeSoftToken_config_status' => true,
558
+ 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
559
+ 'mo2f_miniOrangePushNotification_config_status' => true
560
+ ) );
561
+ } else if ( $mo2f_second_factor == 'KBA' ) {
562
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_SecurityQuestions_config_status' => true ) );
563
+ } else if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
564
+ $app_type = get_user_meta( $user_id, 'mo2f_external_app_type', true );
565
+
566
+ if ( $app_type == 'Google Authenticator' ) {
567
+ $Mo2fdbQueries->update_user_details( $user_id, array(
568
+ 'mo2f_GoogleAuthenticator_config_status' => true
569
+ ) );
570
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
571
+ } else if ( $app_type == 'Authy Authenticator' ) {
572
+ $Mo2fdbQueries->update_user_details( $user_id, array(
573
+ 'mo2f_AuthyAuthenticator_config_status' => true
574
+ ) );
575
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Authy Authenticator' );
576
+ } else {
577
+ $Mo2fdbQueries->update_user_details( $user_id, array(
578
+ 'mo2f_GoogleAuthenticator_config_status' => true
579
+ ) );
580
+
581
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
582
+ }
583
+ }
584
+
585
+ return $mo2f_second_factor;
586
+ }
587
+
588
+ function display_customer_registration_forms($user){
589
+
590
+ global $Mo2fdbQueries;
591
+ $mo2f_current_registration_status = get_option( 'mo_2factor_user_registration_status');
592
+ $mo2f_message = get_option( 'mo2f_message' );
593
+ ?>
594
+
595
+ <div id="smsAlertModal" class="modal" role="dialog" data-backdrop="static" data-keyboard="false" >
596
+ <div class="mo2f_modal-dialog" style="margin-left:30%;">
597
+ <!-- Modal content-->
598
+ <div class="modal-content">
599
+ <div class="mo2f_modal-header">
600
+ <h2 class="mo2f_modal-title">You are just one step away from setting up 2FA.</h2><span type="button" id="mo2f_registration_closed" class="modal-span-close" data-dismiss="modal">&times;</span>
601
+ </div>
602
+ <div class="mo2f_modal-body">
603
+ <span style="color:green;cursor: pointer;float:right;" onclick="show_content();">Why Register with miniOrange?</span><br>
604
+ <div id="mo2f_register" style="background-color:#f1f1f1;padding: 1px 4px 1px 14px;display: none;">
605
+ <p>miniOrange Two Factor plugin uses highly secure miniOrange APIs to communicate with the plugin. To keep this communication secure, we ask you to register and assign you API keys specific to your account. This way your account and users can be only accessed by API keys assigned to you. Also, you can use the same account on multiple applications and your users do not have to maintain multiple accounts or 2-factors.</p>
606
+ </div>
607
+ <?php if ( $mo2f_message ) { ?>
608
+ <div style="padding:5px;">
609
+ <div class="alert alert-info" style="margin-bottom:0px;padding:3px;">
610
+ <p style="font-size:15px;margin-left: 2%;"><?php echo $mo2f_message; ?></p>
611
+ </div>
612
+ </div>
613
+ <?php }
614
+ if(in_array($mo2f_current_registration_status, array("REGISTRATION_STARTED", "MO_2_FACTOR_OTP_DELIVERED_SUCCESS", "MO_2_FACTOR_OTP_DELIVERED_FAILURE", "MO_2_FACTOR_VERIFY_CUSTOMER")) ){
615
+ mo2f_show_registration_screen($user);
616
+ }
617
+ ?>
618
+ </div>
619
+ </div>
620
+ </div>
621
+ <form name="f" method="post" action="" class="mo2f_registration_closed_form">
622
+ <input type="hidden" name="mo2f_registration_closed_nonce"
623
+ value="<?php echo wp_create_nonce( "mo2f-registration-closed-nonce" ) ?>"/>
624
+ <input type="hidden" name="option" value="mo2f_registration_closed"/>
625
+ </form>
626
+ </div>
627
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
628
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
629
+ <script>
630
+ function show_content() {
631
+ jQuery('#mo2f_register').slideToggle();
632
+ }
633
+ jQuery(function () {
634
+ jQuery('#smsAlertModal').modal();
635
+ });
636
+
637
+ jQuery('#mo2f_registration_closed').click(function () {
638
+ jQuery('.mo2f_registration_closed_form').submit();
639
+ });
640
+ </script>
641
+
642
+ <?php
643
+ }
644
+
645
+ function mo2f_show_registration_screen($user){
646
+ global $mo2f_dirName;
647
+
648
+ include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'account.php';
649
+
650
+ }
651
+
652
+ function mo2f_show_2FA_configuration_screen( $user, $selected2FAmethod ) {
653
+ global $mo2f_dirName;
654
+ switch ( $selected2FAmethod ) {
655
+ case "Google Authenticator":
656
+ if(MO2F_IS_ONPREM){
657
+ include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR. 'gaonprem.php';
658
+ $obj = new Google_auth_onpremise();
659
+ $obj->mo_GAuth_get_details();
660
+ }
661
+ else{
662
+ Miniorange_Authentication::mo2f_get_GA_parameters($user);
663
+ mo2f_configure_google_authenticator( $user );
664
+ }
665
+ break;
666
+ case "Authy Authenticator":
667
+ mo2f_configure_authy_authenticator( $user );
668
+ break;
669
+ case "Security Questions":
670
+ mo2f_configure_for_mobile_suppport_kba( $user );
671
+ break;
672
+ case "Email Verification":
673
+ mo2f_configure_for_mobile_suppport_kba( $user );
674
+ break;
675
+ case "OTP Over SMS":
676
+ mo2f_configure_otp_over_sms( $user );
677
+ break;
678
+ case "miniOrange Soft Token":
679
+ mo2f_configure_miniorange_authenticator( $user );
680
+ break;
681
+ case "miniOrange QR Code Authentication":
682
+ mo2f_configure_miniorange_authenticator( $user );
683
+ break;
684
+ case "miniOrange Push Notification":
685
+ mo2f_configure_miniorange_authenticator( $user );
686
+ break;
687
+ case "OTP Over Email":
688
+ mo2f_test_otp_over_email($user,$selected2FAmethod);
689
+ break;
690
+ }
691
+
692
+ }
693
+
694
+ function mo2f_show_2FA_test_screen( $user, $selected2FAmethod ) {
695
+
696
+
697
+ switch ( $selected2FAmethod ) {
698
+ case "miniOrange QR Code Authentication":
699
+ mo2f_test_miniorange_qr_code_authentication( $user );
700
+ break;
701
+ case "miniOrange Push Notification":
702
+ mo2f_test_miniorange_push_notification( $user );
703
+ break;
704
+ case "miniOrange Soft Token":
705
+ mo2f_test_miniorange_soft_token( $user );
706
+ break;
707
+ case "Email Verification":
708
+ mo2f_test_email_verification();
709
+ break;
710
+ case "OTP Over SMS":
711
+ mo2f_test_otp_over_sms( $user );
712
+ break;
713
+ case "Security Questions":
714
+ mo2f_test_kba_security_questions( $user );
715
+ break;
716
+ case "OTP Over Email":
717
+ mo2f_test_otp_over_email($user,$selected2FAmethod);
718
+ break;
719
+ default:
720
+ mo2f_test_google_authy_authenticator( $user, $selected2FAmethod );
721
+ }
722
+
723
+ }
724
+
725
+ function mo2f_method_display_name($user,$mo2f_second_factor){
726
+
727
+ if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
728
+ $app_type = get_user_meta( $user->ID, 'mo2f_external_app_type', true );
729
+
730
+ if ( $app_type == 'Google Authenticator' ) {
731
+ $selectedMethod = 'Google Authenticator';
732
+ } else if ( $app_type == 'Authy Authenticator' ) {
733
+ $selectedMethod = 'Authy Authenticator';
734
+ } else {
735
+ $selectedMethod = 'Google Authenticator';
736
+ update_user_meta( $user->ID, 'mo2f_external_app_type', $selectedMethod );
737
+ }
738
+ } else {
739
+ $selectedMethod = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
740
+ }
741
+ return $selectedMethod;
742
+
743
+ }
744
+
745
+ function mo2f_lt( $string ) {
746
+ return __($string ,'miniorange-2-factor-authentication' );
747
+ }
748
+
749
+ function mo2f_rba_description($mo2f_user_email) {?>
750
+ <div id="mo2f_rba_addon">
751
+ <?php if ( get_option( 'mo2f_rba_installed' ) ) { ?>
752
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_rba_addon"
753
+ class="mo_wpns_button mo_wpns_button1"
754
+ style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
755
+ <?php } ?>
756
+ <?php if ( ! get_option( 'mo2f_rba_purchased' ) ) { ?>
757
+ <a onclick="mo2f_addonform('wp_2fa_addon_rba')" id="mo2f_purchase_rba_addon"
758
+ class="mo_wpns_button mo_wpns_button1"
759
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a><?php } ?>
760
+ <div id="mo2f_rba_addon_hide">
761
+
762
+ <br>
763
+ <div id="mo2f_hide_rba_content">
764
+
765
+ <div class="mo2f_box">
766
+ <h3><?php echo __( 'Remember Device', 'miniorange-2-factor-authentication' ); ?></h3>
767
+ <hr>
768
+ <p id="mo2f_hide_rba_content"><?php echo __( 'With this feature, User would get an option to remember the personal device where Two Factor is not required. Every time the user logs in with the same device it detects the saved device so he will directly login without being prompted for the 2nd factor. If user logs in from new device he will be prompted with 2nd Factor.', 'miniorange-2-factor-authentication' ); ?>
769
+
770
+ </p>
771
+ </div>
772
+ <br><br>
773
+ <div class="mo2f_box">
774
+ <h3><?php echo __( 'Limit Number Of Device', 'miniorange-2-factor-authentication' ); ?></h3>
775
+ <hr>
776
+ <p><?php echo __( 'With this feature, the admin can restrict the number of devices from which the user can access the website. If the device limit is exceeded the admin can set three actions where it can allow the users to login, deny the access or challenge the user for authentication.', 'miniorange-2-factor-authentication' ); ?>
777
+ </p>
778
+
779
+ </div>
780
+ <br><br>
781
+ <div class="mo2f_box">
782
+ <h3><?php echo __( 'IP Restriction: Limit users to login from specific IPs', 'miniorange-2-factor-authentication' ); ?></h3>
783
+ <hr>
784
+ <p><?php echo __( 'The Admin can enable IP restrictions for the users. It will provide additional security to the accounts and perform different action to the accounts only from the listed IP Ranges. If user tries to access with a restricted IP, Admin can set three action: Allow, challenge or deny. Depending upon the action it will allow the user to login, challenge(prompt) for authentication or deny the access.', 'miniorange-2-factor-authentication' ); ?>
785
+
786
+ </div>
787
+ <br>
788
+ </div>
789
+
790
+ </div>
791
+ <div id="mo2f_rba_addon_show">
792
+ <?php $x = apply_filters( 'mo2f_rba', "rba" );?>
793
+ </div>
794
+ </div>
795
+ <form style="display:none;" id="mo2fa_loginform"
796
+ action="<?php echo MO_HOST_NAME . '/moas/login'; ?>"
797
+ target="_blank" method="post">
798
+ <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
799
+ <input type="text" name="redirectUrl"
800
+ value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
801
+ <input type="text" name="requestOrigin" id="requestOrigin"/>
802
+ </form>
803
+ <script>
804
+ function mo2f_addonform(planType) {
805
+ jQuery('#requestOrigin').val(planType);
806
+ jQuery('#mo2fa_loginform').submit();
807
+ }
808
+ </script>
809
+ <?php
810
+ }
811
+
812
+ function mo2f_personalization_description($mo2f_user_email) {?>
813
+ <div id="mo2f_custom_addon">
814
+ <?php if ( get_option( 'mo2f_personalization_installed' ) ) { ?>
815
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_custom_addon"
816
+ class="mo_wpns_button mo_wpns_button1"
817
+ style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
818
+ <?php } ?>
819
+ <?php if ( ! get_option( 'mo2f_personalization_purchased' ) ) { ?> <a
820
+ onclick="mo2f_addonform('wp_2fa_addon_shortcode')" id="mo2f_purchase_custom_addon"
821
+ class="mo_wpns_button mo_wpns_button1"
822
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
823
+ <?php } ?>
824
+ <div id="mo2f_custom_addon_hide">
825
+
826
+
827
+ <br>
828
+ <div id="mo2f_hide_custom_content">
829
+ <div class="mo2f_box">
830
+ <h3><?php echo __( 'Customize Plugin Icon', 'miniorange-2-factor-authentication' ); ?></h3>
831
+ <hr>
832
+ <p>
833
+ <?php echo __( 'With this feature, you can customize the plugin icon in the dashboard which is useful when you want your custom logo to be displayed to the users.', 'miniorange-2-factor-authentication' ); ?>
834
+ </p>
835
+ <br>
836
+ <h3><?php echo __( 'Customize Plugin Name', 'miniorange-2-factor-authentication' ); ?></h3>
837
+ <hr>
838
+ <p>
839
+ <?php echo __( 'With this feature, you can customize the name of the plugin in the dashboard.', 'miniorange-2-factor-authentication' ); ?>
840
+ </p>
841
+
842
+ </div>
843
+ <br>
844
+ <div class="mo2f_box">
845
+ <h3><?php echo __( 'Customize UI of Login Pop up\'s', 'miniorange-2-factor-authentication' ); ?></h3>
846
+ <hr>
847
+ <p>
848
+ <?php echo __( 'With this feature, you can customize the login pop-ups during two factor authentication according to the theme of your website.', 'miniorange-2-factor-authentication' ); ?>
849
+ </p>
850
+ </div>
851
+
852
+ <br>
853
+ <div class="mo2f_box">
854
+ <h3><?php echo __( 'Custom Email and SMS Templates', 'miniorange-2-factor-authentication' ); ?></h3>
855
+ <hr>
856
+
857
+ <p><?php echo __( 'You can change the templates for Email and SMS which user receives during authentication.', 'miniorange-2-factor-authentication' ); ?></p>
858
+
859
+ </div>
860
+ </div>
861
+ </div>
862
+ <div id="mo2f_custom_addon_show"><?php $x = apply_filters( 'mo2f_custom', "custom"); ?></div>
863
+ </div>
864
+
865
+ <?php
866
+ }
867
+
868
+ function mo2f_shortcode_description($mo2f_user_email) { ?>
869
+ <div id="mo2f_Shortcode_addon_hide">
870
+ <?php if ( get_option( 'mo2f_shortcode_installed' ) ) { ?>
871
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_shortcode_addon"
872
+ class="mo_wpns_button mo_wpns_button1" style="float:right; margin-top:2%;"><?php echo __( 'Activate
873
+ Plugin', 'miniorange-2-factor-authentication' ); ?></a>
874
+ <?php } if ( ! get_option( 'mo2f_shortcode_purchased' ) ) { ?>
875
+ <a onclick="mo2f_addonform('wp_2fa_addon_personalization')" id="mo2f_purchase_shortcode_addon"
876
+ class="mo_wpns_button mo_wpns_button1"
877
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
878
+ <?php } ?>
879
+
880
+ <div id="shortcode" class="description">
881
+
882
+
883
+ <br>
884
+ <div id="mo2f_hide_shortcode_content" class="mo2f_box">
885
+ <h3><?php echo __( 'List of Shortcodes', 'miniorange-2-factor-authentication' ); ?>:</h3>
886
+ <hr>
887
+ <ol style="margin-left:2%">
888
+ <li>
889
+ <b><?php echo __( 'Enable Two Factor: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to turn on/off 2-factor by user.', 'miniorange-2-factor-authentication' ); ?>
890
+ </li>
891
+ <li>
892
+ <b><?php echo __( 'Enable Reconfiguration: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to configure the Google Authenticator and Security Questions by user.', 'miniorange-2-factor-authentication' ); ?>
893
+ </li>
894
+ <li>
895
+ <b><?php echo __( 'Enable Remember Device: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( ' This shortcode provides\'Enable Remember Device\' from your custom login form.', 'miniorange-2-factor-authentication' ); ?>
896
+ </li>
897
+ </ol>
898
+ </div>
899
+ <div id="mo2f_Shortcode_addon_show"><?php $x = apply_filters( 'mo2f_shortcode', "shortcode" ); ?></div>
900
+ </div>
901
+ <br>
902
+ </div>
903
+ <form style="display:none;" id="mo2fa_loginform" action="<?php echo MO_HOST_NAME . '/moas/login'; ?>" target="_blank" method="post">
904
+ <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
905
+ <input type="text" name="redirectUrl"
906
+ value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
907
+ <input type="text" name="requestOrigin" id="requestOrigin"/>
908
+ </form>
909
+ <script>
910
+ function mo2f_addonform(planType) {
911
+ jQuery('#requestOrigin').val(planType);
912
+ jQuery('#mo2fa_loginform').submit();
913
+ }
914
+ </script>
915
+ <?php
916
+ }
917
+
918
+ ?>
handler/twofa/two_fa_constants.php CHANGED
@@ -369,7 +369,7 @@ class Mo2fConstants {
369
  break;
370
 
371
  case 'SET_2FA_otp':
372
- Return mo2f_lt( 'is set as your Two-Factor method. You have 10 free transactions.' );
373
  break;
374
 
375
 
369
  break;
370
 
371
  case 'SET_2FA_otp':
372
+ Return mo2f_lt( 'is set as your Two-Factor method.' );
373
  break;
374
 
375
 
handler/twofa/two_fa_get_details.php CHANGED
@@ -8,13 +8,11 @@ class two_fa_get_details {
8
  }
9
  function setUserMethod($userid,$currentMethod){
10
  $response= update_user_meta($userid,'currentMethod',$currentMethod);
11
- //$userMethod = get_user_meta($userid,'currentMethod',true);
12
  return $response;
13
  }
14
 
15
  function setUserEmail($userid,$email){
16
  $response= update_user_meta($userid,'email',$email);
17
- //$userMethod = get_user_meta($userid,'currentMethod',true);
18
  return $response;
19
  }
20
 
8
  }
9
  function setUserMethod($userid,$currentMethod){
10
  $response= update_user_meta($userid,'currentMethod',$currentMethod);
 
11
  return $response;
12
  }
13
 
14
  function setUserEmail($userid,$email){
15
  $response= update_user_meta($userid,'email',$email);
 
16
  return $response;
17
  }
18
 
handler/twofa/two_fa_login.php CHANGED
@@ -30,9 +30,15 @@ class Miniorange_Mobile_Login {
30
  global $Mo2fdbQueries;
31
  $currentuser = wp_authenticate_username_password( $user, $username, $password );
32
  if ( is_wp_error( $currentuser ) ) {
33
- return $currentuser;
 
 
 
 
 
 
34
  } else {
35
- if(MO2F_IS_ONPREM and (!get_option('mo2f_login_option') or get_option('mo2f_enable_login_with_2nd_factor')))
36
  {
37
  $attributes = isset( $_POST['miniorange_rba_attribures'] ) ? $_POST['miniorange_rba_attribures'] : null;
38
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
30
  global $Mo2fdbQueries;
31
  $currentuser = wp_authenticate_username_password( $user, $username, $password );
32
  if ( is_wp_error( $currentuser ) ) {
33
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
34
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Invalid User Credentials', );
35
+ wp_send_json_success($data);
36
+ }
37
+ else{
38
+ return $currentuser;
39
+ }
40
  } else {
41
+ if(MO2F_IS_ONPREM and (!MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') or get_option('mo2f_enable_login_with_2nd_factor')))
42
  {
43
  $attributes = isset( $_POST['miniorange_rba_attribures'] ) ? $_POST['miniorange_rba_attribures'] : null;
44
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
handler/twofa/two_fa_pass2login.php CHANGED
@@ -39,8 +39,8 @@ class Miniorange_Password_2Factor_Login {
39
  $redirect_to = isset( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : null;
40
  if( $moWpnsUtility->check_empty_or_null( $email ) || $moWpnsUtility->check_empty_or_null( $password ) )
41
  {
42
- $login_message=MoWpnsMessages::showMessage('REQUIRED_FIELDS');
43
- $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
44
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
45
  return;
46
  }
@@ -91,7 +91,7 @@ class Miniorange_Password_2Factor_Login {
91
 
92
  if(strcasecmp($customerKey['status'], 'SUCCESS') == 0)
93
  {
94
- $this->inline_save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
95
  $this->inline_get_current_customer($user_id,$email,$password,$redirect_to,$session_id_encrypt);
96
  }
97
 
@@ -103,34 +103,35 @@ class Miniorange_Password_2Factor_Login {
103
 
104
  }
105
 
106
- function inline_get_current_customer($user,$email,$password,$redirect_to,$session_id_encrypt)
107
  {
108
  global $Mo2fdbQueries;
109
  $customer = new MocURL();
 
110
  $content = $customer->get_customer_key($email, $password);
111
  $customerKey = json_decode($content, true);
112
  if(json_last_error() == JSON_ERROR_NONE)
113
  {
114
  if(isset($customerKey['phone'])){
115
  update_option( 'mo_wpns_admin_phone', $customerKey['phone'] );
116
- $Mo2fdbQueries->update_user_details( $user, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
117
  }
118
  update_option('mo2f_email',$email);
119
- $this->inline_save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
120
  $login_message=MoWpnsMessages::showMessage('REG_SUCCESS');
121
  $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
122
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
123
  }
124
  else
125
  {
126
- $Mo2fdbQueries->update_user_details( $user, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
127
  $login_message=MoWpnsMessages::showMessage('ACCOUNT_EXISTS');
128
  $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
129
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
130
  }
131
  }
132
 
133
- function inline_save_success_customer_config($email, $id, $apiKey, $token, $appSecret)
134
  {
135
  global $Mo2fdbQueries;
136
  update_option( 'mo2f_customerKey' , $id );
@@ -141,6 +142,9 @@ class Miniorange_Password_2Factor_Login {
141
  update_option( 'mo2f_miniorange_admin', $id );
142
  update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
143
  update_option( 'mo_2factor_user_registration_status', 'MO_2_FACTOR_PLUGIN_SETTINGS' );
 
 
 
144
  }
145
  function mo2f_inline_validate_otp(){
146
  if(isset($_POST['miniorange_inline_validate_otp_nonce'])){
@@ -432,7 +436,6 @@ class Miniorange_Password_2Factor_Login {
432
  else if($selected_2factor_method == 'MOBILE AUTHENTICATION')
433
  $selected_2factor_method_onprem = 'miniOrange QR Code Authentication';
434
 
435
- // update_user_meta($user_id,'currentMethod',$selected_2factor_method_onprem);
436
  $response = json_decode($enduser->mo2f_update_userinfo($email,$selected_2factor_method,null,null,null),true);
437
  if(json_last_error() == JSON_ERROR_NONE) { /* Generate Qr code */
438
  if($response['status'] == 'ERROR'){
@@ -709,7 +712,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
709
 
710
  $Mo2fdbQueries->update_user_details( $user_id, array('mo2f_2factor_enable_2fa_byusers' => 0) );
711
 
712
- $this->mo2fa_pass2login($redirect_to);
713
  }
714
  }
715
  }
@@ -774,10 +777,10 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
774
  $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
775
  }
776
  }else if($selected_method == 'OTP OVER EMAIL'){
 
777
  if(!MO2F_IS_ONPREM)
778
  {
779
  $current_user = get_userdata($currentUserId);
780
- $email = $current_user->user_email;
781
  $response = $this->create_user_in_miniOrange($currentUserId,$email,$selected_method);
782
  if($response['status']=='ERROR') {
783
  $mo2fa_login_status = 'MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS';
@@ -785,31 +788,16 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
785
  }
786
  else
787
  {
788
- $enduser = new Two_Factor_Setup();
789
-
790
- $Mo2fdbQueries->update_user_details( $currentUserId,
791
- array('mo2f_OTPOverEmail_config_status'=>true,
792
- 'mo2f_configured_2FA_method' =>'OTP Over Email',
793
- 'mo2f_user_email' => $email,
794
- 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
795
- ) );
796
- $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
797
- $response = json_decode($enduser->mo2f_update_userinfo($email,'EMAIL',null,null,null),true);
798
-
799
  }
800
  }
801
  else
802
  {
803
- $enduser = new Two_Factor_Setup();
804
-
805
- $Mo2fdbQueries->update_user_details( $currentUserId,
806
- array('mo2f_OTPOverEmail_config_status'=>true,
807
- 'mo2f_configured_2FA_method' =>'OTP Over Email',
808
- 'mo2f_user_email' => $email,
809
- 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
810
- ) );
811
- $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
812
- $response = json_decode($enduser->mo2f_update_userinfo($email,'EMAIL',null,null,null),true);
813
  }
814
  }else if($selected_method == "GOOGLE AUTHENTICATOR"){
815
  $this->miniorange_pass2login_start_session();
@@ -932,7 +920,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
932
  $mo2f_rba_status = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_rba_status',$session_id_encrypt );
933
  $kba_validate = new Customer_Setup();
934
  $kba_validate_response = json_decode( $kba_validate->validate_otp_token( 'KBA', null, $mo2f_login_transaction_id, $otpToken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
935
- Global $Mo2fdbQueries;
936
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id );
937
  if ( strcasecmp( $kba_validate_response['status'], 'SUCCESS' ) == 0 ) {
938
  if ( get_option( 'mo2f_remember_device' ) && $check_trust_device == 'on' ) {
@@ -994,6 +982,25 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
994
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
995
  }
996
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
997
  function check_miniorange_challenge_forgotphone($POSTED){/*check kba validation*/
998
  $nonce = $_POST['miniorange_forgotphone'];
999
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-forgotphone' ) ) {
@@ -1054,6 +1061,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1054
  }
1055
  function check_miniorange_mobile_validation($POSTED){
1056
  /*check mobile validation */
 
1057
  $nonce = $POSTED['miniorange_mobile_validation_nonce'];
1058
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
1059
  $error = new WP_Error();
@@ -1218,10 +1226,16 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1218
  $session_id_encrypt = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
1219
  $this->remove_current_activity($session_id_encrypt);
1220
  update_option('mo2f_attempts_before_redirect', 3);
 
 
 
 
 
1221
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1222
  }
1223
  }
1224
  }
 
1225
  global $Mo2fdbQueries;
1226
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id );
1227
  if ( isset( $user_id ) ) {
@@ -1230,6 +1244,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1230
  $current_user = get_userdata($user_id);
1231
  //if the php session folder has insufficient permissions, cookies to be used
1232
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId', $session_id_encrypt );
 
1233
  if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) {
1234
  $content = json_decode( $customer->validate_otp_token( 'EMAIL', null, $mo2f_login_transaction_id, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),$current_user ), true );
1235
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS' ) {
@@ -1244,12 +1259,21 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1244
  $this->remove_current_activity($session_id_encrypt);
1245
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
1246
  }
 
1247
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1248
  update_option('mo2f_attempts_before_redirect', 3);
1249
  if ( get_option( 'mo2f_remember_device' ) ) {
1250
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1251
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1252
  } else {
 
 
 
 
 
 
 
 
1253
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1254
  }
1255
  } else {
@@ -1262,6 +1286,11 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1262
  $session_id_encrypt = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
1263
  $this->remove_current_activity($session_id_encrypt);
1264
  update_option('mo2f_attempts_before_redirect', 3);
 
 
 
 
 
1265
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1266
  }
1267
  }
@@ -1296,7 +1325,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1296
  do_action('mo2f_network_init');
1297
  global $Mo2fdbQueries;
1298
 
1299
- if ( ! get_option( 'mo2f_login_option' ) ) {
1300
  if ( isset( $_POST['miniorange_login_nonce'] ) ) {
1301
  $nonce = $_POST['miniorange_login_nonce'];
1302
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
@@ -1501,6 +1530,10 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1501
  $this->check_miniorange_challenge_forgotphone($_POST);
1502
  break;
1503
 
 
 
 
 
1504
  case 'miniorange_alternate_login_kba':
1505
 
1506
  $this->check_miniorange_alternate_login_kba($_POST);
@@ -1728,8 +1761,8 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1728
  }
1729
  }
1730
 
1731
- function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt ) {
1732
-
1733
  $login_status = $mo2fa_login_status;
1734
  $login_message = $mo2fa_login_message;
1735
  switch ($login_status) {
@@ -1745,7 +1778,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1745
  break;
1746
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL':
1747
  $user_id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_current_user_id',$session_id_encrypt );
1748
- mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id );
1749
  exit;
1750
  break;
1751
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS':
@@ -1915,6 +1948,9 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1915
  if(is_null($session_id_encrypt)) {
1916
  $session_id_encrypt=$this->create_session();
1917
  }
 
 
 
1918
  ?>
1919
  <p><input type="hidden" name="miniorange_login_nonce"
1920
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-login-nonce' ); ?>"/>
@@ -1941,7 +1977,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
1941
  }else{
1942
 
1943
 
1944
- if( get_option('mo2f_enable_2fa_prompt_on_login_page'))
1945
  {
1946
  echo "\t<p>\n";
1947
  echo "\t\t<label class=\"mo2f_instuction1\" title=\"".__('If you don\'t have 2-factor authentication enabled for your WordPress account, leave this field empty.','google-authenticator')."\">".__('2 Factor Authentication code*','google-authenticator')."<span id=\"google-auth-info\"></span><br />\n";
@@ -2019,7 +2055,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2019
  }else {
2020
  $content = $challengeMobile->send_otp_token( $user_email, $mo2f_second_factor, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) );
2021
  }
2022
- $response = json_decode( $content, true );
2023
  if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
2024
  if ( $response['status'] == 'SUCCESS' ) {
2025
  MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
@@ -2053,11 +2089,10 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2053
  if($mo2f_second_factor == 'EMAIL')
2054
  {
2055
  $mo2f_user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2056
- $wdewdeqdqq = get_option(base64_encode("remainingOTP"));
2057
-
2058
- if($wdewdeqdqq >10 or get_option(base64_encode("limitReached")))
2059
  {
2060
- update_option(base64_encode("remainingOTP"),0);
2061
  }
2062
  }
2063
  else
@@ -2075,7 +2110,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2075
  $content = '';
2076
  $response = [];
2077
  $otpLIMiTE = 0;
2078
- if(get_site_option("cmVtYWluaW5nT1RQ")>0 or $mo2f_second_factor != 'EMAIL')
2079
  {
2080
  if($mo2f_second_factor == 'OTP Over SMS')
2081
  $mo2f_second_factor = 'SMS';
@@ -2093,7 +2128,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2093
  if ( $response['status'] == 'SUCCESS' ) {
2094
  if($mo2f_second_factor == 'EMAIL')
2095
  {
2096
- $cmVtYWluaW5nT1RQ = get_site_option("cmVtYWluaW5nT1RQ");
2097
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2098
  }
2099
  elseif($mo2f_second_factor == 'SMS')
@@ -2103,7 +2138,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2103
  if(!isset($response['phoneDelivery']['contact']))
2104
  $response['phoneDelivery']['contact'] = '';
2105
  $message = 'The OTP has been sent to ' . MO2f_Utility::get_hidden_phone( $response['phoneDelivery']['contact'] ) . '. Please enter the OTP you received to Validate.';
2106
- update_option( 'mo2f_number_of_transactions', get_option( 'mo2f_number_of_transactions' ) - 1 );
2107
  MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
2108
  $this->mo2f_transactionid=$response['txId'];
2109
  $mo2fa_login_message = $message;
@@ -2187,6 +2222,32 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2187
  $session_id_encrypt=$this->create_session();
2188
  }
2189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2190
  MO2f_Utility::set_user_values($session_id_encrypt, 'mo2f_current_user_id', $currentuser->ID);
2191
  MO2f_Utility::set_user_values($session_id_encrypt, 'mo2f_1stfactor_status', 'VALIDATE_SUCCESS');
2192
 
@@ -2210,7 +2271,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2210
  $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $currentuser->ID );
2211
  $kba_configuration_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $currentuser->ID );
2212
 
2213
- if(get_option( 'mo2f_enable_brute_force' )){
2214
  $mo2f_allwed_login_attempts=get_option('mo2f_allwed_login_attempts');
2215
  }else{
2216
  $mo2f_allwed_login_attempts= 'disabled';
@@ -2219,6 +2280,9 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2219
 
2220
  $twofactor_transactions = new Mo2fDB;
2221
  $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($currentuser->ID);
 
 
 
2222
 
2223
  if ( $mo_2factor_user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' ) { //checking if user has configured any 2nd factor method
2224
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
@@ -2263,7 +2327,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2263
  else if($mo2f_second_factor == 'OTP Over Email' || $mo2f_second_factor == 'OTP OVER EMAIL' || $mo2f_second_factor == "EMAIL") {
2264
  $mo2f_second_factor = "EMAIL";
2265
 
2266
- if(get_site_option("cmVtYWluaW5nT1RQ")<=0)
2267
  {
2268
  update_site_option("bGltaXRSZWFjaGVk",1);
2269
 
@@ -2271,8 +2335,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2271
  }
2272
 
2273
 
2274
-
2275
- if((($mo2f_second_factor == 'GOOGLE AUTHENTICATOR') || ($mo2f_second_factor =='SOFT TOKEN') || ($mo2f_second_factor =='AUTHY AUTHENTICATOR')) && get_option('mo2f_enable_2fa_prompt_on_login_page')&& !get_option('mo2f_remember_device') && !isset($_POST['mo_woocommerce_login_prompt']) )
2276
  {
2277
  $error=$this->mo2f_validate_soft_token($currentuser, $redirect_to, $mo2f_second_factor, $otp_token,$session_id_encrypt);
2278
  if(is_wp_error( $error))
@@ -2295,26 +2358,41 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2295
  } else if ( $mo2f_second_factor == 'KBA' or $mo2f_second_factor == 'Security Questions') {
2296
  $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to , $session_id_encrypt );
2297
  } else if ( $mo2f_second_factor == 'NONE' ) {
2298
- return $currentuser;
 
 
 
2299
  } else {
2300
  $this->remove_current_activity($session_id_encrypt);
2301
  $error = new WP_Error();
2302
- $error->add( 'empty_username', __( '<strong>ERROR</strong>: Two Factor method has not been configured.' ) );
2303
- return $error;
 
 
 
 
 
 
2304
  }
2305
  }
2306
  }
2307
 
2308
  }
2309
- }else if(!$exceeded && get_site_option('mo2f_inline_registration')){
2310
  $this->mo2fa_inline( $currentuser, $redirect_to, $session_id_encrypt );
2311
 
2312
  } else {
2313
- return $currentuser;
 
 
 
2314
  }
2315
 
2316
  } else { //plugin is not activated for current role then logged him in without asking 2 factor
2317
- return $currentuser;
 
 
 
2318
  }
2319
 
2320
  }
@@ -2352,10 +2430,55 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2352
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
2353
  }
2354
  } else {
2355
- return new WP_Error( 'invalid_one_time_passcode', '<strong>ERROR</strong>: Invalid One Time Passcode.');
 
 
 
 
 
2356
  }
2357
  }
2358
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2359
  function mo2f_restrict_access( $identity ) {
2360
  apply_filters( 'mo2f_rba_addon', $identity );
2361
  exit;
@@ -2379,12 +2502,16 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2379
 
2380
  function mo2f_check_username_password( $user, $username, $password, $redirect_to = null ) {
2381
  if ( is_a( $user, 'WP_Error' ) && ! empty( $user ) ) {
2382
- return $user;
 
 
 
 
 
2383
  }
2384
  if($GLOBALS['pagenow'] == 'wp-login.php' && isset($_POST['mo_woocommerce_login_prompt'])){
2385
  return new WP_Error( 'Unauthorized Access.' , '<strong>ERROR</strong>: Access Denied.');
2386
  }
2387
-
2388
  // if an app password is enabled, this is an XMLRPC / APP login ?
2389
  if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
2390
 
@@ -2400,8 +2527,14 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2400
  } else {
2401
  $currentuser = wp_authenticate_username_password( $user, $username, $password );
2402
  if ( is_wp_error( $currentuser ) ) {
2403
- $currentuser->add( 'invalid_username_password', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Username or password.' ) );
2404
- return $currentuser;
 
 
 
 
 
 
2405
  } else {
2406
  global $Mo2fdbQueries;
2407
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
@@ -2419,7 +2552,7 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2419
  }
2420
  else
2421
  {
2422
- if ( empty( $_POST['mo_softtoken'] ) && get_option('mo2f_enable_2fa_prompt_on_login_page') && $mo2f_configured_2FA_method && !get_option('mo2f_remember_device') && (($mo2f_configured_2FA_method == 'Google Authenticator') ||($mo2f_configured_2FA_method == 'miniOrange Soft Token') || ($mo2f_configured_2FA_method =='Authy Authenticator')))
2423
  {
2424
 
2425
 
@@ -2427,7 +2560,12 @@ function create_user_in_miniOrange($current_user_id,$email,$currentMethod)
2427
 
2428
  $this->miniorange_initiate_2nd_factor( $currentuser, "", "","");
2429
  }
2430
- return new WP_Error( 'one_time_passcode_empty', '<strong>ERROR</strong>: Please enter the One Time Passcode.');
 
 
 
 
 
2431
  // Prevent PHP notices when using app password login
2432
 
2433
  }
39
  $redirect_to = isset( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : null;
40
  if( $moWpnsUtility->check_empty_or_null( $email ) || $moWpnsUtility->check_empty_or_null( $password ) )
41
  {
42
+ $login_message=MoWpnsMessages::showMessage('REQUIRED_FIELDS');
43
+ $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
44
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
45
  return;
46
  }
91
 
92
  if(strcasecmp($customerKey['status'], 'SUCCESS') == 0)
93
  {
94
+ $this->inline_save_success_customer_config($user_id,$email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
95
  $this->inline_get_current_customer($user_id,$email,$password,$redirect_to,$session_id_encrypt);
96
  }
97
 
103
 
104
  }
105
 
106
+ function inline_get_current_customer($user_id,$email,$password,$redirect_to,$session_id_encrypt)
107
  {
108
  global $Mo2fdbQueries;
109
  $customer = new MocURL();
110
+
111
  $content = $customer->get_customer_key($email, $password);
112
  $customerKey = json_decode($content, true);
113
  if(json_last_error() == JSON_ERROR_NONE)
114
  {
115
  if(isset($customerKey['phone'])){
116
  update_option( 'mo_wpns_admin_phone', $customerKey['phone'] );
117
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
118
  }
119
  update_option('mo2f_email',$email);
120
+ $this->inline_save_success_customer_config($user_id,$email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
121
  $login_message=MoWpnsMessages::showMessage('REG_SUCCESS');
122
  $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
123
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
124
  }
125
  else
126
  {
127
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
128
  $login_message=MoWpnsMessages::showMessage('ACCOUNT_EXISTS');
129
  $login_status="MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS";
130
  $this->miniorange_pass2login_form_fields($login_status, $login_message,$redirect_to,null,$session_id_encrypt);
131
  }
132
  }
133
 
134
+ function inline_save_success_customer_config($user_id,$email, $id, $apiKey, $token, $appSecret)
135
  {
136
  global $Mo2fdbQueries;
137
  update_option( 'mo2f_customerKey' , $id );
142
  update_option( 'mo2f_miniorange_admin', $id );
143
  update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
144
  update_option( 'mo_2factor_user_registration_status', 'MO_2_FACTOR_PLUGIN_SETTINGS' );
145
+ $Mo2fdbQueries->update_user_details( $user_id, array(
146
+ 'mo2f_user_email' =>$email
147
+ ) );
148
  }
149
  function mo2f_inline_validate_otp(){
150
  if(isset($_POST['miniorange_inline_validate_otp_nonce'])){
436
  else if($selected_2factor_method == 'MOBILE AUTHENTICATION')
437
  $selected_2factor_method_onprem = 'miniOrange QR Code Authentication';
438
 
 
439
  $response = json_decode($enduser->mo2f_update_userinfo($email,$selected_2factor_method,null,null,null),true);
440
  if(json_last_error() == JSON_ERROR_NONE) { /* Generate Qr code */
441
  if($response['status'] == 'ERROR'){
712
 
713
  $Mo2fdbQueries->update_user_details( $user_id, array('mo2f_2factor_enable_2fa_byusers' => 0) );
714
 
715
+ $this->mo2fa_pass2login($redirect_to,$session_id_encrypt);
716
  }
717
  }
718
  }
777
  $mo2fa_login_status = 'MO_2_FACTOR_SETUP_SUCCESS';
778
  }
779
  }else if($selected_method == 'OTP OVER EMAIL'){
780
+ $email = $current_user->user_email;
781
  if(!MO2F_IS_ONPREM)
782
  {
783
  $current_user = get_userdata($currentUserId);
 
784
  $response = $this->create_user_in_miniOrange($currentUserId,$email,$selected_method);
785
  if($response['status']=='ERROR') {
786
  $mo2fa_login_status = 'MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS';
788
  }
789
  else
790
  {
791
+ $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
792
+ if($user_email != '' and !is_null($user_email))
793
+ $email = $user_email;
794
+ $this->mo2f_otp_over_email_send($email,$redirect_to,$session_id_encrypt,$current_user);
795
+
 
 
 
 
 
 
796
  }
797
  }
798
  else
799
  {
800
+ $this->mo2f_otp_over_email_send($email,$redirect_to,$session_id_encrypt,$current_user);
 
 
 
 
 
 
 
 
 
801
  }
802
  }else if($selected_method == "GOOGLE AUTHENTICATOR"){
803
  $this->miniorange_pass2login_start_session();
920
  $mo2f_rba_status = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_rba_status',$session_id_encrypt );
921
  $kba_validate = new Customer_Setup();
922
  $kba_validate_response = json_decode( $kba_validate->validate_otp_token( 'KBA', null, $mo2f_login_transaction_id, $otpToken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
923
+ global $Mo2fdbQueries;
924
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id );
925
  if ( strcasecmp( $kba_validate_response['status'], 'SUCCESS' ) == 0 ) {
926
  if ( get_option( 'mo2f_remember_device' ) && $check_trust_device == 'on' ) {
982
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
983
  }
984
  }
985
+
986
+ function miniorange2f_back_to_inline_registration($POSTED)
987
+ {
988
+ $nonce = $_POST['miniorange_back_inline_reg_nonce'];
989
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-back-inline-reg-nonce' ) ) {
990
+ $error = new WP_Error();
991
+ $error->add( 'empty_username', __( '<strong>ERROR</strong>: Invalid Request.' ) );
992
+ return $error;
993
+ } else {
994
+
995
+ $session_id_encrypt = sanitize_text_field($POSTED['session_id']);
996
+ $redirect_to = sanitize_text_field($POSTED['redirect_to']);
997
+ $mo2fa_login_status = 'MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS';
998
+ $mo2fa_login_message = '';
999
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id_encrypt );
1000
+ }
1001
+
1002
+ }
1003
+
1004
  function check_miniorange_challenge_forgotphone($POSTED){/*check kba validation*/
1005
  $nonce = $_POST['miniorange_forgotphone'];
1006
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-forgotphone' ) ) {
1061
  }
1062
  function check_miniorange_mobile_validation($POSTED){
1063
  /*check mobile validation */
1064
+
1065
  $nonce = $POSTED['miniorange_mobile_validation_nonce'];
1066
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
1067
  $error = new WP_Error();
1226
  $session_id_encrypt = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
1227
  $this->remove_current_activity($session_id_encrypt);
1228
  update_option('mo2f_attempts_before_redirect', 3);
1229
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
1230
+ $data = array('reload' => "reload", );
1231
+ wp_send_json_success($data);
1232
+ }
1233
+ else
1234
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1235
  }
1236
  }
1237
  }
1238
+
1239
  global $Mo2fdbQueries;
1240
  $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user_id );
1241
  if ( isset( $user_id ) ) {
1244
  $current_user = get_userdata($user_id);
1245
  //if the php session folder has insufficient permissions, cookies to be used
1246
  $mo2f_login_transaction_id = MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId', $session_id_encrypt );
1247
+
1248
  if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL' ) {
1249
  $content = json_decode( $customer->validate_otp_token( 'EMAIL', null, $mo2f_login_transaction_id, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ),$current_user ), true );
1250
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS' ) {
1259
  $this->remove_current_activity($session_id_encrypt);
1260
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
1261
  }
1262
+
1263
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1264
  update_option('mo2f_attempts_before_redirect', 3);
1265
  if ( get_option( 'mo2f_remember_device' ) ) {
1266
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
1267
  $this->miniorange_pass2login_form_fields( $mo2fa_login_status, null, $redirect_to,null,$session_id_encrypt );
1268
  } else {
1269
+ if($mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL')
1270
+ {
1271
+ $Mo2fdbQueries->update_user_details( $user_id, array('mo2f_configured_2FA_method' =>'OTP Over Email','mo_2factor_user_registration_status' =>'MO_2_FACTOR_PLUGIN_SETTINGS') );
1272
+ $enduser = new Two_Factor_Setup();
1273
+
1274
+ $enduser->mo2f_update_userinfo( $user_email, 'OTP Over Email', null, null, null );
1275
+
1276
+ }
1277
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
1278
  }
1279
  } else {
1286
  $session_id_encrypt = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
1287
  $this->remove_current_activity($session_id_encrypt);
1288
  update_option('mo2f_attempts_before_redirect', 3);
1289
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
1290
+ $data = array('reload' => "reload", );
1291
+ wp_send_json_success($data);
1292
+ }
1293
+ else
1294
  return new WP_Error( 'limit_exceeded', '<strong>ERROR</strong>: Number of attempts exceeded.');
1295
  }
1296
  }
1325
  do_action('mo2f_network_init');
1326
  global $Mo2fdbQueries;
1327
 
1328
+ if ( ! MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') ) {
1329
  if ( isset( $_POST['miniorange_login_nonce'] ) ) {
1330
  $nonce = $_POST['miniorange_login_nonce'];
1331
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
1530
  $this->check_miniorange_challenge_forgotphone($_POST);
1531
  break;
1532
 
1533
+ case 'miniorange2f_back_to_inline_registration':
1534
+ $this->miniorange2f_back_to_inline_registration($_POST);
1535
+ exit;
1536
+
1537
  case 'miniorange_alternate_login_kba':
1538
 
1539
  $this->check_miniorange_alternate_login_kba($_POST);
1761
  }
1762
  }
1763
 
1764
+ function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt,$show_back_button =null ) {
1765
+
1766
  $login_status = $mo2fa_login_status;
1767
  $login_message = $mo2fa_login_message;
1768
  switch ($login_status) {
1778
  break;
1779
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL':
1780
  $user_id = $this->mo2f_userID ? $this->mo2f_userID : MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_current_user_id',$session_id_encrypt );
1781
+ mo2f_get_otp_authentication_prompt( $login_status, $login_message, $redirect_to, $session_id_encrypt,$user_id,$show_back_button );
1782
  exit;
1783
  break;
1784
  case 'MO_2_FACTOR_CHALLENGE_OTP_OVER_SMS':
1948
  if(is_null($session_id_encrypt)) {
1949
  $session_id_encrypt=$this->create_session();
1950
  }
1951
+ wp_enqueue_script( 'tmlajax_script', plugins_url( 'includes/js/tmlajax.js', dirname(dirname(__FILE__)) ) );
1952
+ wp_localize_script( 'tmlajax_script', 'my_ajax_object',
1953
+ array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
1954
  ?>
1955
  <p><input type="hidden" name="miniorange_login_nonce"
1956
  value="<?php echo wp_create_nonce( 'miniorange-2-factor-login-nonce' ); ?>"/>
1977
  }else{
1978
 
1979
 
1980
+ if( MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'get_option'))
1981
  {
1982
  echo "\t<p>\n";
1983
  echo "\t\t<label class=\"mo2f_instuction1\" title=\"".__('If you don\'t have 2-factor authentication enabled for your WordPress account, leave this field empty.','google-authenticator')."\">".__('2 Factor Authentication code*','google-authenticator')."<span id=\"google-auth-info\"></span><br />\n";
2055
  }else {
2056
  $content = $challengeMobile->send_otp_token( $user_email, $mo2f_second_factor, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) );
2057
  }
2058
+ $response = json_decode( $content, true );
2059
  if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
2060
  if ( $response['status'] == 'SUCCESS' ) {
2061
  MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
2089
  if($mo2f_second_factor == 'EMAIL')
2090
  {
2091
  $mo2f_user_phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2092
+ $wdewdeqdqq = get_site_option(base64_encode("remainingOTP"));
2093
+ if($wdewdeqdqq >30 or get_site_option(base64_encode("limitReached")))
 
2094
  {
2095
+ update_site_option(base64_encode("remainingOTP"),0);
2096
  }
2097
  }
2098
  else
2110
  $content = '';
2111
  $response = [];
2112
  $otpLIMiTE = 0;
2113
+ if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')>0 or $mo2f_second_factor != 'EMAIL')
2114
  {
2115
  if($mo2f_second_factor == 'OTP Over SMS')
2116
  $mo2f_second_factor = 'SMS';
2128
  if ( $response['status'] == 'SUCCESS' ) {
2129
  if($mo2f_second_factor == 'EMAIL')
2130
  {
2131
+ $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
2132
  update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2133
  }
2134
  elseif($mo2f_second_factor == 'SMS')
2138
  if(!isset($response['phoneDelivery']['contact']))
2139
  $response['phoneDelivery']['contact'] = '';
2140
  $message = 'The OTP has been sent to ' . MO2f_Utility::get_hidden_phone( $response['phoneDelivery']['contact'] ) . '. Please enter the OTP you received to Validate.';
2141
+ update_option( 'mo2f_number_of_transactions', MoWpnsUtility::get_mo2f_db_option('mo2f_number_of_transactions', 'get_option') - 1 );
2142
  MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
2143
  $this->mo2f_transactionid=$response['txId'];
2144
  $mo2fa_login_message = $message;
2222
  $session_id_encrypt=$this->create_session();
2223
  }
2224
 
2225
+ if(class_exists('UM_Functions'))
2226
+ {
2227
+ if(!isset($_POST['wp-submit']) and isset($_POST['um_request']))
2228
+ {
2229
+ $meta = get_option('um_role_'.$currentuser->roles[0].'_meta');
2230
+ if(isset($meta) and $meta != '')
2231
+ {
2232
+ if(isset($meta['_um_login_redirect_url']))
2233
+ $redirect_to = $meta['_um_login_redirect_url'];
2234
+ if($redirect_to == '')
2235
+ {
2236
+ $redirect_to = get_site_url();
2237
+ }
2238
+ }
2239
+ $login_form_url = '';
2240
+ if(isset($_POST['redirect_to']))
2241
+ $login_form_url = sanitize_text_field($_POST['redirect_to']);
2242
+
2243
+ if($login_form_url != '' and !is_null($login_form_url))
2244
+ {
2245
+ $redirect_to = $login_form_url;
2246
+ }
2247
+
2248
+ }
2249
+
2250
+ }
2251
  MO2f_Utility::set_user_values($session_id_encrypt, 'mo2f_current_user_id', $currentuser->ID);
2252
  MO2f_Utility::set_user_values($session_id_encrypt, 'mo2f_1stfactor_status', 'VALIDATE_SUCCESS');
2253
 
2271
  $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $currentuser->ID );
2272
  $kba_configuration_status = $Mo2fdbQueries->get_user_detail( 'mo2f_SecurityQuestions_config_status', $currentuser->ID );
2273
 
2274
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option')){
2275
  $mo2f_allwed_login_attempts=get_option('mo2f_allwed_login_attempts');
2276
  }else{
2277
  $mo2f_allwed_login_attempts= 'disabled';
2280
 
2281
  $twofactor_transactions = new Mo2fDB;
2282
  $exceeded = $twofactor_transactions->check_alluser_limit_exceeded($currentuser->ID);
2283
+ $tfa_enabled = $Mo2fdbQueries->get_user_detail( 'mo2f_2factor_enable_2fa_byusers', $currentuser->ID );
2284
+ if($tfa_enabled == 0 && ($mo_2factor_user_registration_status != 'MO_2_FACTOR_PLUGIN_SETTINGS') && $tfa_enabled != '')
2285
+ $exceeded =1;
2286
 
2287
  if ( $mo_2factor_user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' ) { //checking if user has configured any 2nd factor method
2288
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
2327
  else if($mo2f_second_factor == 'OTP Over Email' || $mo2f_second_factor == 'OTP OVER EMAIL' || $mo2f_second_factor == "EMAIL") {
2328
  $mo2f_second_factor = "EMAIL";
2329
 
2330
+ if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')<=0)
2331
  {
2332
  update_site_option("bGltaXRSZWFjaGVk",1);
2333
 
2335
  }
2336
 
2337
 
2338
+ if((($mo2f_second_factor == 'GOOGLE AUTHENTICATOR') || ($mo2f_second_factor =='SOFT TOKEN') || ($mo2f_second_factor =='AUTHY AUTHENTICATOR')) && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'get_option')&& !get_option('mo2f_remember_device') && !isset($_POST['mo_woocommerce_login_prompt']) )
 
2339
  {
2340
  $error=$this->mo2f_validate_soft_token($currentuser, $redirect_to, $mo2f_second_factor, $otp_token,$session_id_encrypt);
2341
  if(is_wp_error( $error))
2358
  } else if ( $mo2f_second_factor == 'KBA' or $mo2f_second_factor == 'Security Questions') {
2359
  $this->mo2f_pass2login_kba_verification( $currentuser->ID, $redirect_to , $session_id_encrypt );
2360
  } else if ( $mo2f_second_factor == 'NONE' ) {
2361
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request'))
2362
+ $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
2363
+ else
2364
+ return $currentuser;
2365
  } else {
2366
  $this->remove_current_activity($session_id_encrypt);
2367
  $error = new WP_Error();
2368
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
2369
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Two Factor method has not been configured.', );
2370
+ wp_send_json_success($data);
2371
+ }
2372
+ else{
2373
+ $error->add( 'empty_username', __( '<strong>ERROR</strong>: Two Factor method has not been configured.' ) );
2374
+ return $error;
2375
+ }
2376
  }
2377
  }
2378
  }
2379
 
2380
  }
2381
+ }else if(!$exceeded && MoWpnsUtility::get_mo2f_db_option('mo2f_inline_registration', 'site_option')){
2382
  $this->mo2fa_inline( $currentuser, $redirect_to, $session_id_encrypt );
2383
 
2384
  } else {
2385
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request'))
2386
+ $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
2387
+ else
2388
+ return $currentuser;
2389
  }
2390
 
2391
  } else { //plugin is not activated for current role then logged him in without asking 2 factor
2392
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request'))
2393
+ $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
2394
+ else
2395
+ return $currentuser;
2396
  }
2397
 
2398
  }
2430
  $this->mo2fa_pass2login( $redirect_to, $session_id_encrypt );
2431
  }
2432
  } else {
2433
+ if( MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
2434
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Invalid One Time Passcode.', );
2435
+ wp_send_json_success($data);
2436
+ }
2437
+ else
2438
+ return new WP_Error( 'invalid_one_time_passcode', '<strong>ERROR</strong>: Invalid One Time Passcode.');
2439
  }
2440
  }
2441
 
2442
+ function mo2f_otp_over_email_send($email,$redirect_to,$session_id_encrypt,$current_user)
2443
+ {
2444
+
2445
+ $challengeMobile = new Customer_Setup();
2446
+ $content = '';
2447
+ $response = [];
2448
+ $otpLIMiTE = 0;
2449
+ if(get_site_option("cmVtYWluaW5nT1RQ")>0)
2450
+ {
2451
+ $content = $challengeMobile->send_otp_token( $email, 'EMAIL', get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ,$current_user);
2452
+ $response = json_decode( $content, true );
2453
+ if(!MO2F_IS_ONPREM)
2454
+ {
2455
+ if(isset($response['txId']))
2456
+ MO2f_Utility::set_user_values( $session_id_encrypt, "mo2f_transactionId", $response['txId'] );
2457
+ }
2458
+
2459
+ }
2460
+ else
2461
+ {
2462
+ $response['status'] = 'FAILED';
2463
+ $response['message'] = '<p style = "color:red;">OTP limit has been exceeded</p>';
2464
+ $otpLIMiTE = 1;
2465
+ }
2466
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2467
+ if ( $response['status'] == 'SUCCESS' ) {
2468
+ $cmVtYWluaW5nT1RQ = get_site_option("cmVtYWluaW5nT1RQ");
2469
+ update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2470
+ $mo2fa_login_message = 'An OTP has been sent to '.$email.' please verify to set the two-factor';
2471
+ $mo2fa_login_status = 'MO_2_FACTOR_CHALLENGE_OTP_OVER_EMAIL';
2472
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id_encrypt, 1 );
2473
+ }
2474
+ else
2475
+ {
2476
+ $mo2fa_login_status = 'MO_2_FACTOR_PROMPT_USER_FOR_2FA_METHODS';
2477
+ $mo2fa_login_message = 'There was an issue while sending the OTP to '.$email.'. Please check your remaining transactions and try again.';
2478
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null, $session_id_encrypt );
2479
+ }
2480
+ }
2481
+ }
2482
  function mo2f_restrict_access( $identity ) {
2483
  apply_filters( 'mo2f_rba_addon', $identity );
2484
  exit;
2502
 
2503
  function mo2f_check_username_password( $user, $username, $password, $redirect_to = null ) {
2504
  if ( is_a( $user, 'WP_Error' ) && ! empty( $user ) ) {
2505
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
2506
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp;Invalid User Credentials', );
2507
+ wp_send_json_success($data);
2508
+ }
2509
+ else
2510
+ return $user;
2511
  }
2512
  if($GLOBALS['pagenow'] == 'wp-login.php' && isset($_POST['mo_woocommerce_login_prompt'])){
2513
  return new WP_Error( 'Unauthorized Access.' , '<strong>ERROR</strong>: Access Denied.');
2514
  }
 
2515
  // if an app password is enabled, this is an XMLRPC / APP login ?
2516
  if ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {
2517
 
2527
  } else {
2528
  $currentuser = wp_authenticate_username_password( $user, $username, $password );
2529
  if ( is_wp_error( $currentuser ) ) {
2530
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
2531
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Invalid User Credentials', );
2532
+ wp_send_json_success($data);
2533
+ }
2534
+ else{
2535
+ $currentuser->add( 'invalid_username_password', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Username or password.' ) );
2536
+ return $currentuser;
2537
+ }
2538
  } else {
2539
  global $Mo2fdbQueries;
2540
  $session_id = isset( $_POST['session_id'] ) ? $_POST['session_id'] : null;
2552
  }
2553
  else
2554
  {
2555
+ if ( empty( $_POST['mo_softtoken'] ) && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'get_option') && $mo2f_configured_2FA_method && !get_option('mo2f_remember_device') && (($mo2f_configured_2FA_method == 'Google Authenticator') ||($mo2f_configured_2FA_method == 'miniOrange Soft Token') || ($mo2f_configured_2FA_method =='Authy Authenticator')))
2556
  {
2557
 
2558
 
2560
 
2561
  $this->miniorange_initiate_2nd_factor( $currentuser, "", "","");
2562
  }
2563
+ if(MO2f_Utility::get_index_value('GLOBALS','mo2f_is_ajax_request')){
2564
+ $data = array('notice' => '<div style="border-left:3px solid #dc3232;">&nbsp; Please enter the One Time Passcode', );
2565
+ wp_send_json_success($data);
2566
+ }
2567
+ else
2568
+ return new WP_Error( 'one_time_passcode_empty', '<strong>ERROR</strong>: Please enter the One Time Passcode.');
2569
  // Prevent PHP notices when using app password login
2570
 
2571
  }
handler/twofa/two_fa_settings.php CHANGED
@@ -18,7 +18,7 @@ class Miniorange_Authentication {
18
  $wp_roles = new WP_Roles();
19
  }
20
 
21
- if ( get_option( 'mo2f_activate_plugin' ) == 1 ) {
22
  $mo2f_rba_attributes = new Miniorange_Rba_Attributes();
23
  $pass2fa_login = new Miniorange_Password_2Factor_Login();
24
  $mo2f_2factor_setup = new Two_Factor_Setup();
@@ -45,7 +45,7 @@ class Miniorange_Authentication {
45
  'miniorange_pass2login_form_fields'
46
  ), 10, 5 );
47
  add_filter( 'mo2f_gauth_service', array( $mo2f_rba_attributes, 'mo2f_google_auth_service' ), 10, 1 );
48
- if ( get_option( 'mo2f_login_option' ) ) { //password + 2nd factor enabled
49
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' or MO2F_IS_ONPREM) {
50
 
51
  remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 );
@@ -75,7 +75,7 @@ class Miniorange_Authentication {
75
  'mo_2_factor_pass2login_show_wp_login_form'
76
  ) );
77
  }
78
- else if(!get_site_option('mo2f_woocommerce_login_prompt') && get_site_option('mo2f_enable_2fa_prompt_on_login_page') ) {
79
  add_action('woocommerce_login_form_end' ,array(
80
  $pass2fa_login,
81
  'mo_2_factor_pass2login_woocommerce'
@@ -128,8 +128,8 @@ class Miniorange_Authentication {
128
  $userid = wp_get_current_user()->ID;
129
  add_option('mo2f_onprem_admin' , $userid );
130
  // Deciding on On-Premise solution
131
- $is_NC=get_option( 'mo2f_is_NC' );
132
- $is_NNC=get_option( 'mo2f_is_NNC' );
133
  // Old users
134
  if ( get_option( 'mo2f_customerKey' ) && ! $is_NC )
135
  add_option( 'is_onprem', 0 );
@@ -173,13 +173,13 @@ class Miniorange_Authentication {
173
 
174
  if ( ! get_option( 'mo2f_existing_user_values_updated' ) ) {
175
 
176
- if ( get_option( 'mo2f_customerKey' ) && ! get_option( 'mo2f_is_NC' ) ) {
177
  update_option( 'mo2f_is_NC', 0 );
178
  }
179
 
180
  $check_if_user_column_exists = false;
181
 
182
- if ( $user_id && ! get_option( 'mo2f_is_NC' ) ) {
183
  $does_table_exist = $Mo2fdbQueries->check_if_table_exists();
184
  if ( $does_table_exist ) {
185
  $check_if_user_column_exists = $Mo2fdbQueries->check_if_user_column_exists( $user_id );
@@ -268,14 +268,7 @@ class Miniorange_Authentication {
268
 
269
 
270
  }
271
-
272
-
273
- /**
274
- * Function tells where to look for translations.
275
- */
276
- function mo2fa_load_textdomain() {
277
- load_plugin_textdomain( 'miniorange-2-factor-authentication', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
278
- }
279
 
280
  function feedback_request() {
281
  display_feedback_form();
@@ -283,8 +276,8 @@ class Miniorange_Authentication {
283
 
284
  function get_customer_SMS_transactions() {
285
 
286
- if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' && get_option( 'mo2f_show_sms_transaction_message' ) ) {
287
- if ( ! get_option( 'mo2f_set_transactions' ) ) {
288
  $customer = new Customer_Setup();
289
 
290
  $content = json_decode( $customer->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
@@ -301,7 +294,7 @@ class Miniorange_Authentication {
301
  }
302
  update_option( 'mo2f_number_of_transactions', $smsRemaining );
303
  } else {
304
- $smsRemaining = get_option( 'mo2f_number_of_transactions' );
305
  }
306
 
307
  $this->display_customer_transactions( $smsRemaining );
@@ -317,7 +310,7 @@ class Miniorange_Authentication {
317
  $user = wp_get_current_user();
318
  $selected_2_Factor_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
319
  if ( $selected_2_Factor_method == 'NONE' ) {
320
- if ( get_option( 'mo2f_enable_2fa_for_users' ) || ( current_user_can( 'manage_options' ) && get_option( 'mo2f_miniorange_admin' ) == $user->ID ) ) {
321
  echo '<div class="is-dismissible notice notice-warning"><p><b>' . mo2f_lt( "miniOrange 2-Factor Plugin: " ) . '</b>' . mo2f_lt( 'You have not configured your 2-factor authentication method yet.' ) .
322
  '<a href="admin.php?page=mo_2fa_two_fa">' . mo2f_lt( ' Click here' ) . '</a>' . mo2f_lt( ' to set it up.' ) .
323
  '<button type="button" class="notice-dismiss"><span class="screen-reader-text">' . mo2f_lt( 'Dismiss this notice.' ) . '</span></button></div>';
@@ -356,9 +349,9 @@ class Miniorange_Authentication {
356
  $roles = $user->roles;
357
  $miniorange_role = array_shift( $roles );
358
 
359
- $is_plugin_activated = get_option( 'mo2f_activate_plugin' );
360
  $is_customer_admin = get_option( 'mo2f_miniorange_admin' ) == $user->ID ? true : false;
361
- $is_2fa_enabled_for_users = get_option( 'mo2f_enable_2fa_for_users' );
362
  $can_current_user_manage_options = current_user_can( 'manage_options' );
363
  $admin_registration_status = get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS'
364
  ? true : false;
@@ -386,7 +379,7 @@ class Miniorange_Authentication {
386
  else
387
  $iconurl = site_url(). '/wp-content/uploads/miniorange/plugin_icon.png';
388
  $menu_slug = 'miniOrange_2_factor_settings';
389
- add_menu_page( 'miniOrange 2 Factor Auth', get_option('mo2f_custom_plugin_name'), 'read', $menu_slug, array($this,'mo_auth_login_options'), $iconurl );
390
  }
391
 
392
  function mo_auth_login_options() {
@@ -431,11 +424,10 @@ class Miniorange_Authentication {
431
  }
432
 
433
  function miniorange_auth_save_settings() {
434
- if (get_option('mo2f_plugin_redirect')) {
435
- delete_option('mo2f_plugin_redirect');
436
- wp_redirect(admin_url() . 'admin.php?page=mo_2fa_two_fa');
437
- exit;
438
-
439
  }
440
  if ( array_key_exists( 'page', $_REQUEST ) && $_REQUEST['page'] == 'mo_2fa_two_fa' ) {
441
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
@@ -722,7 +714,7 @@ class Miniorange_Authentication {
722
  $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
723
  update_option( 'mo2f_miniorange_admin', $user->ID );
724
 
725
- $mo2f_emailVerification_config_status = get_option( 'mo2f_is_NC' ) == 0 ? true : false;
726
 
727
  delete_option( 'mo2f_password' );
728
  update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
@@ -751,7 +743,7 @@ class Miniorange_Authentication {
751
  if ( $mo2f_second_factor != 'NONE' ) {
752
  $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
753
 
754
- if ( get_option( 'mo2f_is_NC' ) == 0 ) {
755
 
756
  $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
757
  $Mo2fdbQueries->update_user_details( $user->ID, array(
@@ -773,7 +765,7 @@ class Miniorange_Authentication {
773
  }
774
 
775
  $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
776
- if ( $configured_2FA_method != 'NONE' && get_option( 'mo2f_is_NC' ) == 0 ) {
777
  $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '.';
778
  }
779
  $mo2f_message .= ' ' . '<a href=\"admin.php?page=mo_2fa_two_fa\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
@@ -1023,13 +1015,13 @@ class Miniorange_Authentication {
1023
  $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
1024
  if ( $mo_2factor_user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' or MO2F_IS_ONPREM ) {
1025
 
1026
- if($_POST['mo2f_login_option'] == 0 && get_option('mo2f_enable_2fa_prompt_on_login_page')){
1027
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "LOGIN_WITH_2ND_FACTOR" ) );
1028
  $this->mo_auth_show_error_message();
1029
  }else{
1030
  update_option( 'mo2f_login_option', isset( $_POST['mo2f_login_option'] ) ? $_POST['mo2f_login_option'] : 0 );
1031
  update_option( 'mo2f_remember_device', isset( $_POST['mo2f_remember_device'] ) ? $_POST['mo2f_remember_device'] : 0 );
1032
- if ( get_option( 'mo2f_login_option' ) == 0 ) {
1033
  update_option( 'mo2f_remember_device', 0 );
1034
  }
1035
  if(isset($_POST['mo2f_enable_login_with_2nd_factor']))
@@ -1530,7 +1522,7 @@ class Miniorange_Authentication {
1530
  $show = 1;
1531
  if(MO2F_IS_ONPREM )
1532
  {
1533
- $txid = isset($_POST['TxidEmail'])?_POST['TxidEmail']:null;
1534
  $status = get_option($txid);
1535
  if($status != '')
1536
  {
@@ -1544,6 +1536,9 @@ class Miniorange_Authentication {
1544
  }
1545
  }
1546
  $mo2f_configured_2FA_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
 
 
 
1547
  $mo2f_EmailVerification_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_EmailVerification_config_status', $user->ID );
1548
  if ( ! current_user_can( 'manage_options' ) && $mo2f_configured_2FA_method == 'OUT OF BAND EMAIL' ) {
1549
  if ( $mo2f_EmailVerification_config_status ) {
@@ -1661,6 +1656,8 @@ class Miniorange_Authentication {
1661
 
1662
  if ( current_user_can( 'manage_options' ) ) {
1663
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
 
 
1664
  } else {
1665
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1666
  }
@@ -2039,7 +2036,7 @@ class Miniorange_Authentication {
2039
  $_SESSION['mo2f_transactionId'] = $content['txId'];
2040
  update_option( 'mo2f_transactionId', $content['txId'] );
2041
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' ' . $phone . ' .' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2042
- update_option( 'mo2f_number_of_transactions', get_option( 'mo2f_number_of_transactions' ) - 1 );
2043
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')-1);
2044
  $this->mo_auth_show_success_message();
2045
  } else {
@@ -2213,8 +2210,8 @@ class Miniorange_Authentication {
2213
  $allowed = false;
2214
  if(get_option('mo2f_miniorange_admin'))
2215
  $allowed = wp_get_current_user()->ID == get_option('mo2f_miniorange_admin');
2216
-
2217
- if($is_customer_registered && !$is_end_user_registered and !$allowed){
2218
  $enduser = new Two_Factor_Setup();
2219
  $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
2220
  if(json_last_error() == JSON_ERROR_NONE){
@@ -2257,7 +2254,8 @@ class Miniorange_Authentication {
2257
  }
2258
 
2259
  }
2260
- update_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
 
2261
  if(MO2F_IS_ONPREM)
2262
  {
2263
  if($selected_2FA_method == 'EmailVerification')
@@ -2267,6 +2265,7 @@ class Miniorange_Authentication {
2267
  if($selected_2FA_method == 'OTPOverSMS')
2268
  $selected_2FA_method = 'OTP Over SMS';
2269
  }
 
2270
  if(MO2F_IS_ONPREM and ($selected_2FA_method =='Google Authenticator' or $selected_2FA_method == 'Security Questions' or $selected_2FA_method =='OTP Over Email' or $selected_2FA_method == 'Email Verification'))
2271
  $is_customer_registered = 1;
2272
 
@@ -2290,28 +2289,48 @@ class Miniorange_Authentication {
2290
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2291
  $customer_key = get_option( 'mo2f_customerKey' );
2292
  $api_key = get_option( 'mo2f_api_key' );
2293
-
2294
  $cloud_method1 = array('miniOrange QR Code Authentication','miniOrange Push Notification','miniOrange Soft Token');
2295
-
2296
- if($selected_2FA_method == "OTP Over Email" or in_array($selected_2FA_method,$cloud_method1))
2297
  {
2298
- $TwoF_setup = new Two_Factor_Setup();
2299
- $current_method = MO2f_Utility::mo2f_decode_2_factor( $selected_2FA_method, "server" );
 
 
 
 
 
 
2300
 
2301
- if($selected_2FA_method == "OTP Over Email")
2302
- $response = json_decode($TwoF_setup->mo2f_update_userinfo($email,'EMAIL',null,null,null),true);
2303
  else
2304
- $response = json_decode($TwoF_setup->mo2f_update_userinfo($email,$current_method,null,null,null),true);
2305
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => $selected_2FA_method ) );
 
 
 
 
2306
 
2307
- mo2f_display_test_2fa_notification($user);
 
 
 
 
 
 
 
 
 
 
2308
  }else if($selected_2FA_method == "Email Verification")
2309
  {
2310
  $enduser->send_otp_token($email,'OUT OF BAND EMAIL',$customer_key,$api_key);
2311
  }
2312
 
2313
- $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => $selected_2FA_method ) );
2314
 
 
 
2315
 
2316
  // update the server
2317
  if(!MO2F_IS_ONPREM)
@@ -2489,7 +2508,7 @@ class Miniorange_Authentication {
2489
  if($selected_2FA_method == 'OTP Over Email')
2490
  {
2491
  $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2492
- if(get_site_option("cmVtYWluaW5nT1RQ")<=0)
2493
  {
2494
  update_site_option("bGltaXRSZWFjaGVk",1);
2495
  $check = 0;
@@ -2505,15 +2524,15 @@ class Miniorange_Authentication {
2505
  if ( strcasecmp( $response['status'], 'SUCCESS' ) == 0 ) {
2506
  if($selected_2FA_method == 'OTP Over Email')
2507
  {
2508
- $cmVtYWluaW5nT1RQ = get_option("cmVtYWluaW5nT1RQ");
2509
- update_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2510
  }
2511
  else if($selected_2FA_method == 'OTP Over SMS')
2512
  {
2513
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')-1);
2514
  }
2515
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( $phone ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2516
- update_option( 'mo2f_number_of_transactions', get_option( 'mo2f_number_of_transactions' ) - 1 );
2517
 
2518
  $_SESSION['mo2f_transactionId'] = $response['txId'];
2519
  update_option( 'mo2f_transactionId', $response['txId'] );
@@ -2603,8 +2622,8 @@ class Miniorange_Authentication {
2603
  function mo_auth_deactivate() {
2604
  global $Mo2fdbQueries;
2605
  $mo2f_register_with_another_email = get_option( 'mo2f_register_with_another_email' );
2606
- $is_EC = ! get_option( 'mo2f_is_NC' ) ? 1 : 0;
2607
- $is_NNC = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' ) ? 1 : 0;
2608
 
2609
  if ( $mo2f_register_with_another_email || $is_EC || $is_NNC ) {
2610
  update_option( 'mo2f_register_with_another_email', 0 );
@@ -2951,14 +2970,16 @@ class Miniorange_Authentication {
2951
  $current_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_configured_2FA_method, "server" );
2952
 
2953
  $response = json_decode( $enduser->mo2f_update_userinfo( $email, $current_method, $phone, null, null ), true );
2954
-
2955
  if ( json_last_error() == JSON_ERROR_NONE ) {
2956
  if ( $response['status'] == 'ERROR' ) {
2957
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2958
  $this->mo_auth_show_error_message();
2959
  } else if ( $response['status'] == 'SUCCESS' ) {
2960
- $configured_2fa_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
2961
-
 
 
 
2962
  if ( in_array( $configured_2fa_method, array( "Google Authenticator", "Authy Authenticator" ) ) ) {
2963
  update_user_meta( $user->ID, 'mo2f_external_app_type', $configured_2fa_method );
2964
  }
@@ -2969,8 +2990,9 @@ class Miniorange_Authentication {
2969
  delete_user_meta( $user->ID, 'configure_2FA' );
2970
 
2971
  if($configured_2fa_method == 'OTP Over Email' or $configured_2fa_method=='OTP Over SMS')
2972
- update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $configured_2fa_method ) . ' ' . Mo2fConstants:: langTranslate( "SET_2FA_otp" ) );
2973
-
 
2974
  else
2975
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $configured_2fa_method ) . ' ' . Mo2fConstants:: langTranslate( "SET_2FA" ) );
2976
 
@@ -3052,13 +3074,7 @@ class Miniorange_Authentication {
3052
  $currentTimeInMillis = round(microtime(true) * 1000);
3053
  update_site_option($time,$currentTimeInMillis);
3054
  update_site_option( 'mo2f_message', Mo2fConstants::langTranslate("VERIFICATION_EMAIL_SENT") .'<b> ' . $email . '</b>. ' . Mo2fConstants::langTranslate("ACCEPT_LINK_TO_VERIFY_EMAIL"));
3055
- if ( ! $is_flow_driven_setup ) {
3056
- update_user_meta($current_user->ID,'mo2f_configure_test_option','MO2F_TEST');
3057
- $Mo2fdbQueries->update_user_details(
3058
- $current_user->ID, array('mo2f_configured_2FA_method' => 'OUT OF BAND EMAIL',
3059
- 'mo2f_2factor_enable_2fa_byusers' => 1) );
3060
- $this->mo_auth_show_success_message();
3061
- }
3062
  }else{
3063
  update_site_option( 'mo2f_message', Mo2fConstants::langTranslate("ERROR_DURING_PROCESS_EMAIL"));
3064
  $this->mo_auth_show_error_message();
@@ -3101,7 +3117,7 @@ class Miniorange_Authentication {
3101
  $get_encryption_key = MO2f_Utility::random_str(16);
3102
  update_option('mo2f_encryption_key',$get_encryption_key);
3103
 
3104
- if ( get_option( 'mo2f_customerKey' ) && ! get_option( 'mo2f_is_NC' ) ) {
3105
  update_option( 'mo2f_is_NC', 0 );
3106
  } else {
3107
  update_option( 'mo2f_is_NC', 1 );
18
  $wp_roles = new WP_Roles();
19
  }
20
 
21
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_activate_plugin', 'get_option') == 1 ) {
22
  $mo2f_rba_attributes = new Miniorange_Rba_Attributes();
23
  $pass2fa_login = new Miniorange_Password_2Factor_Login();
24
  $mo2f_2factor_setup = new Two_Factor_Setup();
45
  'miniorange_pass2login_form_fields'
46
  ), 10, 5 );
47
  add_filter( 'mo2f_gauth_service', array( $mo2f_rba_attributes, 'mo2f_google_auth_service' ), 10, 1 );
48
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') ) { //password + 2nd factor enabled
49
  if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' or MO2F_IS_ONPREM) {
50
 
51
  remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 );
75
  'mo_2_factor_pass2login_show_wp_login_form'
76
  ) );
77
  }
78
+ else if(!get_site_option('mo2f_woocommerce_login_prompt') && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'site_option') ) {
79
  add_action('woocommerce_login_form_end' ,array(
80
  $pass2fa_login,
81
  'mo_2_factor_pass2login_woocommerce'
128
  $userid = wp_get_current_user()->ID;
129
  add_option('mo2f_onprem_admin' , $userid );
130
  // Deciding on On-Premise solution
131
+ $is_NC=MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
132
+ $is_NNC=MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option');
133
  // Old users
134
  if ( get_option( 'mo2f_customerKey' ) && ! $is_NC )
135
  add_option( 'is_onprem', 0 );
173
 
174
  if ( ! get_option( 'mo2f_existing_user_values_updated' ) ) {
175
 
176
+ if ( get_option( 'mo2f_customerKey' ) && ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option')) {
177
  update_option( 'mo2f_is_NC', 0 );
178
  }
179
 
180
  $check_if_user_column_exists = false;
181
 
182
+ if ( $user_id && ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') ) {
183
  $does_table_exist = $Mo2fdbQueries->check_if_table_exists();
184
  if ( $does_table_exist ) {
185
  $check_if_user_column_exists = $Mo2fdbQueries->check_if_user_column_exists( $user_id );
268
 
269
 
270
  }
271
+
 
 
 
 
 
 
 
272
 
273
  function feedback_request() {
274
  display_feedback_form();
276
 
277
  function get_customer_SMS_transactions() {
278
 
279
+ if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' && MoWpnsUtility::get_mo2f_db_option('mo2f_show_sms_transaction_message', 'get_option') ) {
280
+ if ( ! MoWpnsUtility::get_mo2f_db_option('mo2f_set_transactions', 'get_option') ) {
281
  $customer = new Customer_Setup();
282
 
283
  $content = json_decode( $customer->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
294
  }
295
  update_option( 'mo2f_number_of_transactions', $smsRemaining );
296
  } else {
297
+ $smsRemaining = MoWpnsUtility::get_mo2f_db_option('mo2f_number_of_transactions', 'get_option');
298
  }
299
 
300
  $this->display_customer_transactions( $smsRemaining );
310
  $user = wp_get_current_user();
311
  $selected_2_Factor_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
312
  if ( $selected_2_Factor_method == 'NONE' ) {
313
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_for_users', 'get_option') || ( current_user_can( 'manage_options' ) && get_option( 'mo2f_miniorange_admin' ) == $user->ID ) ) {
314
  echo '<div class="is-dismissible notice notice-warning"><p><b>' . mo2f_lt( "miniOrange 2-Factor Plugin: " ) . '</b>' . mo2f_lt( 'You have not configured your 2-factor authentication method yet.' ) .
315
  '<a href="admin.php?page=mo_2fa_two_fa">' . mo2f_lt( ' Click here' ) . '</a>' . mo2f_lt( ' to set it up.' ) .
316
  '<button type="button" class="notice-dismiss"><span class="screen-reader-text">' . mo2f_lt( 'Dismiss this notice.' ) . '</span></button></div>';
349
  $roles = $user->roles;
350
  $miniorange_role = array_shift( $roles );
351
 
352
+ $is_plugin_activated = MoWpnsUtility::get_mo2f_db_option('mo2f_activate_plugin', 'get_option');
353
  $is_customer_admin = get_option( 'mo2f_miniorange_admin' ) == $user->ID ? true : false;
354
+ $is_2fa_enabled_for_users = MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_for_users', 'get_option');
355
  $can_current_user_manage_options = current_user_can( 'manage_options' );
356
  $admin_registration_status = get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS'
357
  ? true : false;
379
  else
380
  $iconurl = site_url(). '/wp-content/uploads/miniorange/plugin_icon.png';
381
  $menu_slug = 'miniOrange_2_factor_settings';
382
+ add_menu_page( 'miniOrange 2 Factor Auth', MoWpnsUtility::get_mo2f_db_option('mo2f_custom_plugin_name', 'get_option'), 'read', $menu_slug, array($this,'mo_auth_login_options'), $iconurl );
383
  }
384
 
385
  function mo_auth_login_options() {
424
  }
425
 
426
  function miniorange_auth_save_settings() {
427
+ if (get_site_option('mo2f_plugin_redirect')) {
428
+ delete_site_option('mo2f_plugin_redirect');
429
+ wp_redirect(admin_url() . 'admin.php?page=mo_2fa_two_fa');
430
+ exit;
 
431
  }
432
  if ( array_key_exists( 'page', $_REQUEST ) && $_REQUEST['page'] == 'mo_2fa_two_fa' ) {
433
  if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
714
  $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
715
  update_option( 'mo2f_miniorange_admin', $user->ID );
716
 
717
+ $mo2f_emailVerification_config_status = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') == 0 ? true : false;
718
 
719
  delete_option( 'mo2f_password' );
720
  update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
743
  if ( $mo2f_second_factor != 'NONE' ) {
744
  $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
745
 
746
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') == 0 ) {
747
 
748
  $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
749
  $Mo2fdbQueries->update_user_details( $user->ID, array(
765
  }
766
 
767
  $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
768
+ if ( $configured_2FA_method != 'NONE' && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') == 0 ) {
769
  $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '.';
770
  }
771
  $mo2f_message .= ' ' . '<a href=\"admin.php?page=mo_2fa_two_fa\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
1015
  $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
1016
  if ( $mo_2factor_user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' or MO2F_IS_ONPREM ) {
1017
 
1018
+ if($_POST['mo2f_login_option'] == 0 && MoWpnsUtility::get_mo2f_db_option('mo2f_enable_2fa_prompt_on_login_page', 'get_option')){
1019
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "LOGIN_WITH_2ND_FACTOR" ) );
1020
  $this->mo_auth_show_error_message();
1021
  }else{
1022
  update_option( 'mo2f_login_option', isset( $_POST['mo2f_login_option'] ) ? $_POST['mo2f_login_option'] : 0 );
1023
  update_option( 'mo2f_remember_device', isset( $_POST['mo2f_remember_device'] ) ? $_POST['mo2f_remember_device'] : 0 );
1024
+ if ( MoWpnsUtility::get_mo2f_db_option('mo2f_login_option', 'get_option') == 0 ) {
1025
  update_option( 'mo2f_remember_device', 0 );
1026
  }
1027
  if(isset($_POST['mo2f_enable_login_with_2nd_factor']))
1522
  $show = 1;
1523
  if(MO2F_IS_ONPREM )
1524
  {
1525
+ $txid = isset($_POST['TxidEmail'])? $_POST['TxidEmail']:null;
1526
  $status = get_option($txid);
1527
  if($status != '')
1528
  {
1536
  }
1537
  }
1538
  $mo2f_configured_2FA_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
1539
+ if(MO2F_IS_ONPREM and $mo2f_configured_2FA_method == 'OUT OF BAND EMAIL')
1540
+ $mo2f_configured_2FA_method = 'Email Verification';
1541
+
1542
  $mo2f_EmailVerification_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_EmailVerification_config_status', $user->ID );
1543
  if ( ! current_user_can( 'manage_options' ) && $mo2f_configured_2FA_method == 'OUT OF BAND EMAIL' ) {
1544
  if ( $mo2f_EmailVerification_config_status ) {
1656
 
1657
  if ( current_user_can( 'manage_options' ) ) {
1658
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1659
+ delete_user_meta( $user->ID, 'configure_2FA');
1660
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => 'OTP Over Email' ) );
1661
  } else {
1662
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1663
  }
2036
  $_SESSION['mo2f_transactionId'] = $content['txId'];
2037
  update_option( 'mo2f_transactionId', $content['txId'] );
2038
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' ' . $phone . ' .' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2039
+ update_option( 'mo2f_number_of_transactions', MoWpnsUtility::get_mo2f_db_option('mo2f_number_of_transactions', 'get_option') - 1 );
2040
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')-1);
2041
  $this->mo_auth_show_success_message();
2042
  } else {
2210
  $allowed = false;
2211
  if(get_option('mo2f_miniorange_admin'))
2212
  $allowed = wp_get_current_user()->ID == get_option('mo2f_miniorange_admin');
2213
+
2214
+ if($is_customer_registered && !$is_end_user_registered and !$allowed){
2215
  $enduser = new Two_Factor_Setup();
2216
  $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
2217
  if(json_last_error() == JSON_ERROR_NONE){
2254
  }
2255
 
2256
  }
2257
+
2258
+ update_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
2259
  if(MO2F_IS_ONPREM)
2260
  {
2261
  if($selected_2FA_method == 'EmailVerification')
2265
  if($selected_2FA_method == 'OTPOverSMS')
2266
  $selected_2FA_method = 'OTP Over SMS';
2267
  }
2268
+
2269
  if(MO2F_IS_ONPREM and ($selected_2FA_method =='Google Authenticator' or $selected_2FA_method == 'Security Questions' or $selected_2FA_method =='OTP Over Email' or $selected_2FA_method == 'Email Verification'))
2270
  $is_customer_registered = 1;
2271
 
2289
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2290
  $customer_key = get_option( 'mo2f_customerKey' );
2291
  $api_key = get_option( 'mo2f_api_key' );
2292
+ $customer = new Customer_Setup();
2293
  $cloud_method1 = array('miniOrange QR Code Authentication','miniOrange Push Notification','miniOrange Soft Token');
2294
+ if(($selected_2FA_method == "OTP Over Email") and MO2F_IS_ONPREM)
 
2295
  {
2296
+ $check = 1;
2297
+ if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')<=0)
2298
+ {
2299
+ update_site_option("bGltaXRSZWFjaGVk",1);
2300
+ $check = 0;
2301
+
2302
+ }
2303
+
2304
 
2305
+ if($check == 1)
2306
+ $response = json_decode( $customer->send_otp_token( $email, $selected_2FA_method, $customer_key, $api_key ), true );
2307
  else
2308
+ $response['status'] = 'FAILED';
2309
+ if ( strcasecmp( $response['status'], 'SUCCESS' ) == 0) {
2310
+ $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
2311
+ update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2312
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( $email ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2313
+ update_option( 'mo2f_number_of_transactions', MoWpnsUtility::get_mo2f_db_option('mo2f_number_of_transactions', 'get_option') - 1 );
2314
 
2315
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2316
+ update_option( 'mo2f_transactionId', $response['txId'] );
2317
+ $this->mo_auth_show_success_message();
2318
+
2319
+ } else {
2320
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_OTP_ONPREM" ) );
2321
+ $this->mo_auth_show_error_message();
2322
+
2323
+ }
2324
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
2325
+
2326
  }else if($selected_2FA_method == "Email Verification")
2327
  {
2328
  $enduser->send_otp_token($email,'OUT OF BAND EMAIL',$customer_key,$api_key);
2329
  }
2330
 
 
2331
 
2332
+ if($selected_2FA_method != 'OTP Over Email')
2333
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => $selected_2FA_method ) );
2334
 
2335
  // update the server
2336
  if(!MO2F_IS_ONPREM)
2508
  if($selected_2FA_method == 'OTP Over Email')
2509
  {
2510
  $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2511
+ if(MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option')<=0)
2512
  {
2513
  update_site_option("bGltaXRSZWFjaGVk",1);
2514
  $check = 0;
2524
  if ( strcasecmp( $response['status'], 'SUCCESS' ) == 0 ) {
2525
  if($selected_2FA_method == 'OTP Over Email')
2526
  {
2527
+ $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
2528
+ update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
2529
  }
2530
  else if($selected_2FA_method == 'OTP Over SMS')
2531
  {
2532
  update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')-1);
2533
  }
2534
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( $phone ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2535
+ update_option( 'mo2f_number_of_transactions', MoWpnsUtility::get_mo2f_db_option('mo2f_number_of_transactions', 'get_option') - 1 );
2536
 
2537
  $_SESSION['mo2f_transactionId'] = $response['txId'];
2538
  update_option( 'mo2f_transactionId', $response['txId'] );
2622
  function mo_auth_deactivate() {
2623
  global $Mo2fdbQueries;
2624
  $mo2f_register_with_another_email = get_option( 'mo2f_register_with_another_email' );
2625
+ $is_EC = ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') ? 1 : 0;
2626
+ $is_NNC = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option') ? 1 : 0;
2627
 
2628
  if ( $mo2f_register_with_another_email || $is_EC || $is_NNC ) {
2629
  update_option( 'mo2f_register_with_another_email', 0 );
2970
  $current_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_configured_2FA_method, "server" );
2971
 
2972
  $response = json_decode( $enduser->mo2f_update_userinfo( $email, $current_method, $phone, null, null ), true );
 
2973
  if ( json_last_error() == JSON_ERROR_NONE ) {
2974
  if ( $response['status'] == 'ERROR' ) {
2975
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2976
  $this->mo_auth_show_error_message();
2977
  } else if ( $response['status'] == 'SUCCESS' ) {
2978
+ $configured_2fa_method = '';
2979
+ if($mo2f_configured_2FA_method =='')
2980
+ $configured_2fa_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
2981
+ else
2982
+ $configured_2fa_method = $mo2f_configured_2FA_method;
2983
  if ( in_array( $configured_2fa_method, array( "Google Authenticator", "Authy Authenticator" ) ) ) {
2984
  update_user_meta( $user->ID, 'mo2f_external_app_type', $configured_2fa_method );
2985
  }
2990
  delete_user_meta( $user->ID, 'configure_2FA' );
2991
 
2992
  if($configured_2fa_method == 'OTP Over Email' or $configured_2fa_method=='OTP Over SMS')
2993
+ {
2994
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $configured_2fa_method ) . ' ' . Mo2fConstants:: langTranslate( "SET_2FA_otp" ) );
2995
+ }
2996
  else
2997
  update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $configured_2fa_method ) . ' ' . Mo2fConstants:: langTranslate( "SET_2FA" ) );
2998
 
3074
  $currentTimeInMillis = round(microtime(true) * 1000);
3075
  update_site_option($time,$currentTimeInMillis);
3076
  update_site_option( 'mo2f_message', Mo2fConstants::langTranslate("VERIFICATION_EMAIL_SENT") .'<b> ' . $email . '</b>. ' . Mo2fConstants::langTranslate("ACCEPT_LINK_TO_VERIFY_EMAIL"));
3077
+
 
 
 
 
 
 
3078
  }else{
3079
  update_site_option( 'mo2f_message', Mo2fConstants::langTranslate("ERROR_DURING_PROCESS_EMAIL"));
3080
  $this->mo_auth_show_error_message();
3117
  $get_encryption_key = MO2f_Utility::random_str(16);
3118
  update_option('mo2f_encryption_key',$get_encryption_key);
3119
 
3120
+ if ( get_option( 'mo2f_customerKey' ) && ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') ) {
3121
  update_option( 'mo2f_is_NC', 0 );
3122
  } else {
3123
  update_option( 'mo2f_is_NC', 1 );
handler/twofa/two_fa_short_call.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ include_once('two_fa_short_gateway.php');
4
+
5
+ class TwoFACustomRegFormAPI
6
+ {
7
+ public function __construct()
8
+ {
9
+
10
+ }
11
+
12
+ public static function challenge($phone_number,$email,$authTypeSend)
13
+ {
14
+
15
+
16
+ if($authTypeSend == 'email')
17
+ {
18
+ $auierpyasdcRy = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
19
+ $cmVtYWluaW5nT1RQ = $auierpyasdcRy? $auierpyasdcRy : 0;
20
+ if($cmVtYWluaW5nT1RQ > 0)
21
+ {
22
+ $response = TwoFAMOGateway:: mo_send_otp_token('EMAIL', '', $email);
23
+ update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
24
+ }
25
+ else
26
+ {
27
+ $response = ['status'=>'ERROR','message'=>'Email Transaction Limit Exceeded'];
28
+ wp_send_json($response);
29
+ }
30
+ }
31
+ else
32
+ {
33
+ $response = TwoFAMOGateway:: mo_send_otp_token('SMS', $phone_number, $email);
34
+ }
35
+ wp_send_json($response);
36
+
37
+ }
38
+
39
+ public static function validate($txId, $otp)
40
+ {
41
+ wp_send_json(TwoFAMOGateway :: mo_validate_otp_token('OTP',$txId, $otp));
42
+ }
43
+ }
handler/twofa/two_fa_short_custom.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ include_once('two_fa_short_call.php');
4
+
5
+ class TwoFACustomRegFormShortcode
6
+
7
+ {
8
+ public function __construct()
9
+ {
10
+ add_action('woocommerce_created_customer',array($this,'wc_post_registration'), 1, 3);
11
+ }
12
+
13
+ public function mo_enqueue_shortcode()
14
+ {
15
+ add_action("wp_ajax_mo_shortcode",array( $this, 'mo_shortcode' ));
16
+ add_action("wp_ajax_nopriv_mo_shortcode",array($this,'mo_shortcode'));
17
+ add_action("wp_ajax_mo_ajax_register",array( $this, 'mo_ajax_register' ));
18
+ add_action("wp_ajax_nopriv_mo_ajax_register",array($this,'mo_ajax_register'));
19
+ }
20
+
21
+ public function mo_shortcode()
22
+ {
23
+ switch($_POST['mo_action'])
24
+ {
25
+ case "challenge":
26
+ $email = sanitize_text_field($_POST['email']);
27
+ $phone = sanitize_text_field($_POST['phone']);
28
+ $authTypeSend = sanitize_text_field($_POST['authTypeSend']);
29
+
30
+ TwoFACustomRegFormAPI::challenge($phone,$email,$authTypeSend);
31
+ break;
32
+
33
+ case "validate":
34
+ $otp = sanitize_text_field($_POST['otp']);
35
+ $txId = sanitize_text_field($_POST['txId']);
36
+ TwoFACustomRegFormAPI::validate($txId,$otp);
37
+ break;
38
+ }
39
+ }
40
+
41
+ public function mo_ajax_register(){
42
+ switch ($_POST['mo_action']) {
43
+ case 'send_otp_over_email':
44
+ $email = isset($_POST['email'])? $_POST['email']: "";
45
+ $phone = isset($_POST['phone'])? $_POST['phone']: "";
46
+ $email = sanitize_text_field($email);
47
+ $phone = sanitize_text_field($phone);
48
+ $authTypeSend = sanitize_text_field($_POST['authTypeSend']);
49
+ TwoFACustomRegFormAPI :: challenge($phone,$email,$authTypeSend);
50
+ # code...
51
+ break;
52
+ case 'send_otp_over_sms' :
53
+ $email = isset($_POST['email'])? $_POST['email']: "";
54
+ $phone = isset($_POST['phone'])? $_POST['phone']: "";
55
+ $email = sanitize_text_field($email);
56
+ $phone = sanitize_text_field($phone);
57
+ $authTypeSend = sanitize_text_field($_POST['authTypeSend']);
58
+ TwoFACustomRegFormAPI :: challenge($phone,$email,$authTypeSend);
59
+ break;
60
+
61
+ default:
62
+ $otp = sanitize_text_field($_POST['otp']);
63
+ $txId = sanitize_text_field($_POST['txId']);
64
+ TwoFACustomRegFormAPI :: validate($txId,$otp);
65
+ # code...
66
+ break;
67
+ }
68
+ }
69
+
70
+ function wc_post_registration( $user_id, $new_customer_data, $password_generated) {
71
+ if ( isset( $_POST['phone'] ))
72
+ update_user_meta($user_id, 'billing_phone', $_POST['phone']);
73
+ }
74
+
75
+
76
+
77
+
78
+ }
79
+
80
+
handler/twofa/two_fa_short_gateway.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $mo2f_dirName;
4
+
5
+ require_once $mo2f_dirName.'helper'.DIRECTORY_SEPARATOR.'mo_twofa_sessions.php';
6
+
7
+ if(! defined( 'ABSPATH' )) exit;
8
+ define('MO2F_DEFAULT_APIKEY',"fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq");
9
+ define('MO2F_FAIL_MODE', false);
10
+ define('MO2F_SESSION_TYPE', "TRANSIENT");
11
+
12
+ class TwoFAMOGateway
13
+ {
14
+ public static function mo_send_otp_token($authType, $phone, $email)
15
+ {
16
+ if(MO2F_TEST_MODE)
17
+ {
18
+ return ['message'=>'OTP Sent Successfully','status'=>'SUCCESS','txId'=> rand(1000,9999)];
19
+ }
20
+ else
21
+ {
22
+ $customerKey = get_site_option('mo2f_customerKey');
23
+ $apiKey = get_site_option('mo2f_api_key');
24
+ TwoFAMoSessions::addSessionVar('mo2f_transactionId',true);
25
+ TwoFAMoSessions::addSessionVar('sent_on',time());
26
+
27
+ if($authType == 'EMAIL')
28
+ {
29
+ $cmVtYWluaW5nT1RQ = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
30
+ update_site_option("cmVtYWluaW5nT1RQ",$cmVtYWluaW5nT1RQ-1);
31
+ $content = (new Customer_Cloud_Setup)->send_otp_token($email,$authType,$customerKey,$apiKey);
32
+ }
33
+
34
+ else
35
+ {
36
+ update_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z',get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')-1);
37
+ $content = (new Customer_Cloud_Setup)->send_otp_token($phone,$authType,$customerKey,$apiKey);
38
+ }
39
+ return json_decode($content,TRUE);
40
+ }
41
+ }
42
+
43
+ public static function mo_validate_otp_token($authType,$txId, $otp_token)
44
+ {
45
+ if(MO2F_TEST_MODE)
46
+ {
47
+ TwoFAMoSessions::unsetSession('mo2f_transactionId');
48
+ return MO2F_FAIL_MODE ? ['status'=>"FAILED","message"=>"OTP is Invalid"]:['status'=>"SUCCESS","message"=>"Successfully Validated"];
49
+ }
50
+ else
51
+ {
52
+ $content = "";
53
+ if(TwoFAMoSessions :: getSessionVar('mo2f_transactionId'))
54
+ {
55
+ $customerKey = get_site_option('mo2f_customerKey');
56
+ $apiKey = get_site_option('mo2f_api_key');
57
+ $content = (new Customer_Cloud_Setup)->validate_otp_token($authType,null,$txId,$otp_token,$customerKey,$apiKey);
58
+ $content = json_decode($content, TRUE);
59
+ if($content["status"] == "SUCCESS")
60
+ {
61
+ TwoFAMoSessions :: unsetSession('mo2f_transactionId');
62
+ }
63
+ }
64
+ return $content;
65
+ }
66
+ }
67
+ }
handler/twofa/two_fa_utility.php CHANGED
@@ -115,6 +115,7 @@ class MO2f_Utility {
115
  global $Mo2fdbQueries;
116
  $key = get_option( 'mo2f_encryption_key' );
117
  $data_option=NULL;
 
118
  if(empty($data_option)){
119
 
120
  //setting session
@@ -261,8 +262,9 @@ class MO2f_Utility {
261
  }
262
  } else if ( $variable == 'mo_2_factor_kba_questions' ) {
263
  if ( isset( $_COOKIE['kba_question1'] ) && ! empty( $_COOKIE['kba_question1'] ) ) {
264
- $kba_question1 = MO2f_Utility::mo2f_get_cookie_values( 'kba_question1' );
265
- $kba_question2 = MO2f_Utility::mo2f_get_cookie_values( 'kba_question2' );
 
266
  $cookie_value = array( $kba_question1, $kba_question2 );
267
  }
268
  } else {
@@ -547,6 +549,18 @@ class MO2f_Utility {
547
  return FALSE;
548
  }
549
 
 
 
 
 
 
 
 
 
 
 
 
 
550
  }
551
 
552
- ?>
115
  global $Mo2fdbQueries;
116
  $key = get_option( 'mo2f_encryption_key' );
117
  $data_option=NULL;
118
+
119
  if(empty($data_option)){
120
 
121
  //setting session
262
  }
263
  } else if ( $variable == 'mo_2_factor_kba_questions' ) {
264
  if ( isset( $_COOKIE['kba_question1'] ) && ! empty( $_COOKIE['kba_question1'] ) ) {
265
+
266
+ $kba_question1['question'] = MO2f_Utility::mo2f_get_cookie_values( 'kba_question1' );
267
+ $kba_question2['question'] = MO2f_Utility::mo2f_get_cookie_values( 'kba_question2' );
268
  $cookie_value = array( $kba_question1, $kba_question2 );
269
  }
270
  } else {
549
  return FALSE;
550
  }
551
 
552
+ public static function get_index_value($var,$index){
553
+ switch ($var) {
554
+ case 'GLOBALS':
555
+ return isset($GLOBALS[$index])?$GLOBALS[$index]:false;
556
+ break;
557
+
558
+ default:
559
+ return false;
560
+ break;
561
+ }
562
+ }
563
+
564
  }
565
 
566
+ ?>
helper/constants.php CHANGED
@@ -1,97 +1,97 @@
1
- <?php
2
-
3
- class MoWpnsConstants
4
- {
5
- const SUCCESS = "success";
6
- const FAILED = "failed";
7
- const PAST_FAILED = "pastfailed";
8
- const ACCESS_DENIED = "accessDenied";
9
- const LOGIN_TRANSACTION = "User Login";
10
- const ERR_404 = "404";
11
- const ERR_403 = "403";
12
- const DEFAULT_CUSTOMER_KEY = "16555";
13
- const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
- const DB_VERSION = 150;
15
- const SUPPORT_EMAIL = 'info@xecurify.com';
16
- 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>';
17
- const CURRENT_BROWSER = '<span style="font-size:10px;color:red;">( Current Browser )</span>';
18
-
19
- //urls
20
- const RECAPTCHA_URL = 'https://www.google.com/recaptcha/api.js';
21
- const HOST_NAME = "https://login.xecurify.com";
22
-
23
- //plugins
24
- const TWO_FACTOR_SETTINGS = 'miniorange-2-factor-authentication/miniorange_2_factor_settings.php';
25
- const OTP_VERIFICATION_SETTINGS = 'miniorange-otp-verification/miniorange_validation_settings.php';
26
- const SOCIAL_LOGIN_SETTINGS = 'miniorange-login-openid/miniorange_openid_sso_settings.php';
27
-
28
- //arrays
29
- public static $domains = array('0-mail.com','20email.eu','0815.ru','0815.su','0clickemail.com','0sg.net','0wnd.net','0wnd.org','10mail.org','10minutemail.cf','10minutemail.com','10minutemail.de','10minutemail.ga','10minutemail.gq','10minutemail.ml','123-m.com','12hourmail.com','12minutemail.com','1ce.us','1chuan.com','1mail.ml','1pad.de','1zhuan.com','20mail.in','20mail.it','20minutemail.com','21cn.com','24hourmail.com','2prong.com','30minutemail.com','30minutesmail.com','3126.com','33mail.com','3d-painting.com','3mail.ga','4mail.cf','4mail.ga','4warding.com','4warding.net','4warding.org','50e.info','5mail.cf','5mail.ga','60minutemail.com','675hosting.com','675hosting.net','675hosting.org','6ip.us','6mail.cf','6mail.ga','6mail.ml','6paq.com','6url.com','75hosting.com','75hosting.net','75hosting.org','7days-printing.com','7mail.ga','7mail.ml','7tags.com','8mail.cf','8mail.ga','8mail.ml','99experts.com','9mail.cf','9ox.net','BeefMilk.com','DingBone.com','FudgeRub.com','LookUgly.com','MailScrap.com','SmellFear.com','TempEmail.net','a-bc.net','a45.in','abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com','abusemail.de','abwesend.de','abyssmail.com','ac20mail.in','acentri.com','addcom.de','advantimo.com','afrobacon.com','ag.us.to','agedmail.com','agnitumhost.net','ahk.jp','ajaxapp.net','alivance.com','alpenjodel.de','alphafrau.de','amail.com','amilegit.com','amiri.net','amiriindustries.com','amorki.pl','anappthat.com','ano-mail.net','anonbox.net','anonymail.dk','anonymbox.com','antichef.com','antichef.net','antispam.de','antispam24.de','appixie.com','armyspy.com','asdasd.nl','autosfromus.com','aver.com','azmeil.tk','baldmama.de','baldpapa.de','ballyfinance.com','baxomale.ht.cx','beddly.com','beefmilk.com','betriebsdirektor.de','big1.us','bigmir.net','bigprofessor.so','bigstring.com','bin-wieder-da.de','binkmail.com','bio-muesli.info','bio-muesli.net','bladesmail.net','bleib-bei-mir.de','blockfilter.com','blogmyway.org','bluebottle.com','bobmail.info','bodhi.lawlita.com','bofthew.com','bonbon.net','bootybay.de','boun.cr','bouncr.com','boxformail.in','boxtemp.com.br','brefmail.com','brennendesreich.de','briefemail.com','broadbandninja.com','brokenvalve.com','brokenvalve.org','bsnow.net','bspamfree.org','bu.mintemail.com','buerotiger.de','buffemail.com','bugmenot.com','bumpymail.com','bund.us','bundes-li.ga','burnthespam.info','burstmail.info','buy-24h.net.ru','buyusedlibrarybooks.org','c2.hu','cachedot.net','cashette.com','casualdx.com','cbair.com','ce.mintemail.com','cellurl.com','center-mail.de','centermail.at','centermail.ch','centermail.com','centermail.de','centermail.info','centermail.net','cghost.s-a-d.de','chammy.info','cheatmail.de','chogmail.com','choicemail1.com','chong-mail.com','chong-mail.net','chong-mail.org','chongsoft.org','clixser.com','cmail.com','cmail.net','cmail.org','coldemail.info','consumerriot.com','cool.fr.nf','coole-files.de','correo.blogos.net','cosmorph.com','courriel.fr.nf','courrieltemporaire.com','crapmail.org','crazespaces.pw','crazymailing.com','cubiclink.com','curryworld.de','cust.in','cuvox.de','cyber-matrix.com','dacoolest.com','daintly.com','dandikmail.com','dating4best.net','dayrep.com','dbunker.com','dcemail.com','deadaddress.com','deadchildren.org','deadfake.cf','deadfake.ga','deadfake.ml','deadfake.tk','deadspam.com','deagot.com','dealja.com','despam.it','despammed.com','devnullmail.com','dfgh.net','dharmatel.net','die-besten-bilder.de','die-genossen.de','die-optimisten.de','die-optimisten.net','dieMailbox.de','digital-filestore.de','digitalsanctuary.com','dingbone.com','directbox.com','discard.cf','discard.email','discard.ga','discard.gq','discard.ml','discard.tk','discardmail.*','discardmail.com','discardmail.de','discartmail.com','disposable-email.ml','disposable.cf','disposable.ga','disposable.ml','disposableaddress.com','disposableemailaddresses.com','disposableemailaddresses.emailmiser.com','disposableinbox.com','dispose.it','disposeamail.com','disposemail.com','dispostable.com','divermail.com','dm.w3internet.co.uk','example.com','docmail.cz','dodgeit.com','dodgit.com','dodgit.org','dogit.com','doiea.com','domozmail.com','donemail.ru','dontreg.com','dontsendmespam.de','dontsentmespam.de','dotmsg.com','download-privat.de','drdrb.com','drdrb.net','droplar.com','dropmail.me','duam.net','dudmail.com','dump-email.info','dumpandjunk.com','dumpmail.com','dumpmail.de','dumpyemail.com','duskmail.com','dyndns.org','e-mail.com','e-mail.org','e4ward.com','easytrashmail.com','ee2.pl','eelmail.com','einrot.com','einrot.de','eintagsmail.de','email-fake.cf','email-fake.ga','email-fake.gq','email-fake.ml','email-fake.tk','email.org','email4u.info','email60.com','emailage.cf','emailage.ga','emailage.gq','emailage.ml','emailage.tk','emaildienst.de','emailgo.de','emailias.com','emailigo.de','emailinfive.com','emailisvalid.com','emaillime.com','emailmiser.com','emailproxsy.com','emails.ga','emailsensei.com','emailspam.cf','emailspam.ga','emailspam.gq','emailspam.ml','emailspam.tk','emailtaxi.de','emailtemporanea.net','emailtemporar.ro','emailtemporario.com.br','emailthe.net','emailtmp.com','emailto.de','emailwarden.com','emailx.at.hm','emailxfer.com','emailz.cf','emailz.ga','emailz.gq','emailz.ml','emeil.in','emeil.ir','emil.com','emkei.cf','emkei.ga','emkei.gq','emkei.ml','emkei.tk','emz.net','enterto.com','ephemail.net','etranquil.com','etranquil.net','etranquil.org','evopo.com','example.com','explodemail.com','eyepaste.com','facebook-email.cf','facebook-email.ga','facebook-email.ml','facebookmail.gq','facebookmail.ml','fahr-zur-hoelle.org','fake-mail.cf','fake-mail.ga','fake-mail.ml','fakeinbox.cf','fakeinbox.com','fakeinbox.ga','fakeinbox.ml','fakeinbox.tk','fakeinformation.com','fakemail.fr','fakemailgenerator.com','fakemailz.com','falseaddress.com','fammix.com','fansworldwide.de','fantasymail.de','farifluset.mailexpire.com','fastacura.com','fastchevy.com','fastchrysler.com','fastkawasaki.com','fastmazda.com','fastmitsubishi.com','fastnissan.com','fastsubaru.com','fastsuzuki.com','fasttoyota.com','fastyamaha.com','fatflap.com','fdfdsfds.com','feinripptraeger.de','fettabernett.de','fightallspam.com','fiifke.de','filzmail.com','fishfuse.com','fixmail.tk','fizmail.com','fleckens.hu','flurred.com','flyspam.com','footard.com','forgetmail.com','fornow.eu','fr33mail.info','frapmail.com','free-email.cf','free-email.ga','freemail.ms','freemails.cf','freemails.ga','freemails.ml','freemeilaadressforall.net','freudenkinder.de','freundin.ru','friendlymail.co.uk','fromru.com','front14.org','fuckingduh.com','fudgerub.com','fux0ringduh.com','garliclife.com','gawab.com','gelitik.in','gentlemansclub.de','get-mail.cf','get-mail.ga','get-mail.ml','get-mail.tk','get1mail.com','get2mail.fr','getairmail.cf','getairmail.com','getairmail.ga','getairmail.gq','getairmail.ml','getairmail.tk','getmails.eu','getonemail.com','getonemail.net','ghosttexter.de','girlsundertheinfluence.com','gishpuppy.com','goemailgo.com','gold-profits.info','goldtoolbox.com','golfilla.info','gorillaswithdirtyarmpits.com','gotmail.com','gotmail.net','gotmail.org','gotti.otherinbox.com','gowikibooks.com','gowikicampus.com','gowikicars.com','gowikifilms.com','gowikigames.com','gowikimusic.com','gowikinetwork.com','gowikitravel.com','gowikitv.com','grandmamail.com','grandmasmail.com','great-host.in','greensloth.com','grr.la','gsrv.co.uk','guerillamail.biz','guerillamail.com','guerillamail.net','guerillamail.org','guerrillamail.biz','guerrillamail.com','guerrillamail.de','guerrillamail.info','guerrillamail.net','guerrillamail.org','guerrillamailblock.com','gustr.com','h.mintemail.com','h8s.org','hab-verschlafen.de','habmalnefrage.de','hacccc.com','haltospam.com','harakirimail.com','hartbot.de','hatespam.org','hellodream.mobi','herp.in','herr-der-mails.de','hidemail.de','hidzz.com','hmamail.com','hochsitze.com','home.de','hopemail.biz','hot-mail.cf','hot-mail.ga','hot-mail.gq','hot-mail.ml','hot-mail.tk','hotpop.com','hulapla.de','humn.ws.gy','hush.com','hushmail.com','ich-bin-verrueckt-nach-dir.de','ich-will-net.de','ieatspam.eu','ieatspam.info','ieh-mail.de','ihateyoualot.info','iheartspam.org','ikbenspamvrij.nl','imails.info','imgof.com','imstations.com','inbax.tk','inbox.si','inbox2.info','inboxalias.com','inboxclean.com','inboxclean.org','inboxproxy.com','incognitomail.com','incognitomail.net','incognitomail.org','inerted.com','inmail24.com','insorg-mail.info','instant-mail.de','instantemailaddress.com','ipoo.org','irish2me.com','iroid.com','ist-allein.info','ist-einmalig.de','ist-ganz-allein.de','ist-willig.de','iwi.net','izmail.net','jetable.com','jetable.de','jetable.fr.nf','jetable.net','jetable.org','jetfix.ee','jetzt-bin-ich-dran.com','jn-club.de','jnxjn.com','jobbikszimpatizans.hu','jourrapide.com','jsrsolutions.com','junk1e.com','junkmail.com','junkmail.ga','junkmail.gq','kaffeeschluerfer.com','kaffeeschluerfer.de','kasmail.com','kaspop.com','keepmymail.com','killmail.com','killmail.net','kimsdisk.com','kinglibrary.net','kingsq.ga','kir.ch.tc','klassmaster.com','klassmaster.net','klzlk.com','kommespaeter.de','kook.ml','koszmail.pl','krim.ws','kuh.mu','kulturbetrieb.info','kurzepost.de','l33r.eu','labetteraverouge.at','lackmail.net','lags.us','landmail.co','lass-es-geschehen.de','lastmail.co','lastmail.com','lazyinbox.com','letthemeatspam.com','lhsdv.com','liebt-dich.info','lifebyfood.com','link2mail.net','listomail.com','litedrop.com','loadby.us','login-email.cf','login-email.ga','login-email.ml','login-email.tk','lol.ovpn.to','lookugly.com','lopl.co.cc','lortemail.dk','lovemeleaveme.com','loveyouforever.de','lr7.us','lr78.com','lroid.com','luv2.us','m4ilweb.info','maboard.com','maennerversteherin.com','maennerversteherin.de','mail-filter.com','mail-temporaire.fr','mail.by','mail.htl22.at','mail.mezimages.net','mail.misterpinball.de','mail.svenz.eu','mail114.net','mail15.com','mail2rss.org','mail333.com','mail4days.com','mail4trash.com','mail4u.info','mailbidon.com','mailblocks.com','mailbucket.org','mailcat.biz','mailcatch.*','mailcatch.com','maildrop.cc','maildrop.cf','maildrop.ga','maildrop.gq','maildrop.ml','maildx.com','maileater.com','mailexpire.com','mailfa.tk','mailforspam.com','mailfree.ga','mailfree.gq','mailfree.ml','mailfreeonline.com','mailfs.com','mailguard.me','mailimate.com','mailin8r.com','mailinater.com','mailinator.com','mailinator.gq','mailinator.net','mailinator.org','mailinator.us','mailinator2.com','mailinblack.com','mailincubator.com','mailismagic.com','mailjunk.cf','mailjunk.ga','mailjunk.gq','mailjunk.ml','mailjunk.tk','mailmate.com','mailme.gq','mailme.ir','mailme.lv','mailme24.com','mailmetrash.com','mailmoat.com','mailnator.com','mailnesia.com','mailnull.com','mailpick.biz','mailproxsy.com','mailquack.com','mailrock.biz','mailsac.com','mailscrap.com','mailseal.de','mailshell.com','mailsiphon.com','mailslapping.com','mailslite.com','mailtemp.info','mailtothis.com','mailtrash.net','mailueberfall.de','mailzilla.com','mailzilla.org','mailzilla.orgmbx.cc','makemetheking.com','mamber.net','manifestgenerator.com','manybrain.com','mbx.cc','mciek.com','mega.zik.dj','meine-dateien.info','meine-diashow.de','meine-fotos.info','meine-urlaubsfotos.de','meinspamschutz.de','meltmail.com','messagebeamer.de','metaping.com','mezimages.net','mfsa.ru','mierdamail.com','migumail.com','mintemail.com','mjukglass.nu','mns.ru','moakt.com','mobi.web.id','mobileninja.co.uk','moburl.com','mohmal.com','moncourrier.fr.nf','monemail.fr.nf','monmail.fr.nf','monumentmail.com','ms9.mailslite.com','msa.minsmail.com','msh.mailslite.com','mt2009.com','mt2014.com','mufmail.com','muskelshirt.de','mx0.wwwnew.eu','my-mail.ch','my10minutemail.com','myadult.info','mycleaninbox.net','myemailboxy.com','mymail-in.net','mymailoasis.com','mynetstore.de','mypacks.net','mypartyclip.de','myphantomemail.com','myspaceinc.com','myspaceinc.net','myspaceinc.org','myspacepimpedup.com','myspamless.com','mytemp.email','mytempemail.com','mytop-in.net','mytrashmail.com','mytrashmail.compookmail.com','neomailbox.com','nepwk.com','nervmich.net','nervtmich.net','netmails.com','netmails.net','netterchef.de','netzidiot.de','neue-dateien.de','neverbox.com','nice-4u.com','nmail.cf','no-spam.ws','nobulk.com','noclickemail.com','nogmailspam.info','nomail.xl.cx','nomail2me.com','nomorespamemails.com','nonspam.eu','nonspammer.de','noref.in','nospam.wins.com.br','nospam.ze.tc','nospam4.us','nospamfor.us','nospammail.net','nospamthanks.info','notmailinator.com','notsharingmy.info','nowhere.org','nowmymail.com','ntlhelp.net','nullbox.info','nur-fuer-spam.de','nurfuerspam.de','nus.edu.sg','nwldx.com','nybella.com','objectmail.com','obobbo.com','odaymail.com','office-dateien.de','oikrach.com','one-time.email','oneoffemail.com','oneoffmail.com','onewaymail.com','online.ms','oopi.org','opayq.com','orangatango.com','ordinaryamerican.net','otherinbox.com','ourklips.com','outlawspam.com','ovpn.to','owlpic.com','pancakemail.com','paplease.com','partybombe.de','partyheld.de','pcusers.otherinbox.com','pepbot.com','pfui.ru','phreaker.net','pimpedupmyspace.com','pisem.net','pjjkp.com','pleasedontsendmespam.de','plexolan.de','poczta.onet.pl','politikerclub.de','polizisten-duzer.de','poofy.org','pookmail.com','pornobilder-mal-gratis.com','portsaid.cc','postacin.com','postfach.cc','privacy.net','privy-mail.com','privymail.de','proxymail.eu','prtnx.com','prtz.eu','prydirect.info','pryworld.info','public-files.de','punkass.com','put2.net','putthisinyourspamdatabase.com','pwrby.com','qasti.com','qisdo.com','qisoa.com','qq.com','quantentunnel.de','quickinbox.com','quickmail.nl','qv7.info','radiku.ye.vc','ralib.com','raubtierbaendiger.de','rcpt.at','reallymymail.com','receiveee.chickenkiller.com','receiveee.com','recode.me','reconmail.com','record.me','recursor.net','recyclemail.dk','regbypass.com','regbypass.comsafe-mail.net','rejectmail.com','remail.cf','remail.ga','rhyta.com','rk9.chickenkiller.com','rklips.com','rmqkr.net','rootprompt.org','royal.net','rppkn.com','rtrtr.com','ruffrey.com','s0ny.net','saeuferleber.de','safe-mail.net','safersignup.de','safetymail.info','safetypost.de','sags-per-mail.de','sandelf.de','satka.net','saynotospams.com','scatmail.com','schafmail.de','schmusemail.de','schreib-doch-mal-wieder.de','selfdestructingmail.com','selfdestructingmail.org','sendspamhere.com','senseless-entertainment.com','shared-files.de','sharedmailbox.org','sharklasers.com','shieldedmail.com','shiftmail.com','shinedyoureyes.com','shitmail.me','shitmail.org','shitware.nl','shortmail.net','showslow.de','sibmail.com','sinnlos-mail.de','siria.cc','siteposter.net','skeefmail.com','skeefmail.net','slaskpost.se','slave-auctions.net','slopsbox.com','slushmail.com','smashmail.de','smellfear.com','smellrear.com','sms.at','snakemail.com','sneakemail.com','snkmail.com','sofimail.com','sofort-mail.de','sofortmail.de','softpls.asia','sogetthis.com','sohu.com','soisz.com','solvemail.info','sonnenkinder.org','soodomail.com','soodonims.com','spam-be-gone.com','spam.la','spam.su','spam4.me','spamavert.com','spambob.com','spambob.net','spambob.org','spambog.*','spambog.com','spambog.de','spambog.net','spambog.ru','spambooger.com','spambox.info','spambox.irishspringrealty.com','spambox.us','spamcannon.com','spamcannon.net','spamcero.com','spamcon.org','spamcorptastic.com','spamcowboy.com','spamcowboy.net','spamcowboy.org','spamday.com','spamdecoy.net','spameater.com','spameater.org','spamex.com','spamfighter.cf','spamfighter.ga','spamfighter.gq','spamfighter.ml','spamfighter.tk','spamfree.eu','spamfree24.com','spamfree24.de','spamfree24.eu','spamfree24.info','spamfree24.net','spamfree24.org','spamgoes.in','spamgourmet.com','spamgourmet.net','spamgourmet.org','spamgrube.net','spamherelots.com','spamhereplease.com','spamhole.com','spamify.com','spaminator.de','spamkill.info','spaml.com','spaml.de','spammote.com','spammotel.com','spammuffel.de','spamobox.com','spamoff.de','spamreturn.com','spamsalad.in','spamslicer.com','spamspot.com','spamstack.net','spamthis.co.uk','spamthisplease.com','spamtrail.com','spamtroll.net','speed.1s.fr','sperke.net','spikio.com','spoofmail.de','squizzy.de','sriaus.com','ssoia.com','startkeys.com','stinkefinger.net','stop-my-spam.cf','stop-my-spam.com','stop-my-spam.ga','stop-my-spam.ml','stop-my-spam.tk','streber24.de','streetwisemail.com','stuffmail.de','super-auswahl.de','supergreatmail.com','supermailer.jp','superrito.com','superstachel.de','suremail.info','svk.jp','sweetville.net','sweetxxx.de','tafmail.com','tagesmail.eu','tagyourself.com','talkinator.com','tapchicuoihoi.com','teewars.org','teleworm.com','teleworm.us','temp-mail.com','temp-mail.org','temp.emeraldwebmail.com','temp.headstrong.de','tempail.com','tempalias.com','tempe-mail.com','tempemail.biz','tempemail.co.za','tempemail.com','tempemail.net','tempinbox.co.uk','tempinbox.com','tempmail.it','tempmail2.com','tempmaildemo.com','tempmailer.com','tempomail.fr','temporarily.de','temporarioemail.com.br','temporaryemail.net','temporaryemail.us','temporaryforwarding.com','temporaryinbox.com','tempsky.com','tempthe.net','tempymail.com','terminverpennt.de','test.com','test.de','thanksnospam.info','thankyou2010.com','thecloudindex.com','thepryam.info','thisisnotmyrealemail.com','throam.com','throwawayemailaddress.com','throwawaymail.com','tilien.com','tittbit.in','tmail.ws','tmailinator.com','toiea.com','toomail.biz','topmail-files.de','tortenboxer.de','totalmail.de','tradermail.info','trash-amil.com','trash-mail.at','trash-mail.cf','trash-mail.com','trash-mail.de','trash-mail.ga','trash-mail.gq','trash-mail.ml','trash-mail.tk','trash2009.com','trash2010.com','trash2011.com','trashbox.eu','trashdevil.com','trashdevil.de','trashemail.de','trashmail.at','trashmail.com','trashmail.de','trashmail.me','trashmail.net','trashmail.org','trashmail.ws','trashmailer.com','trashymail.com','trashymail.net','trayna.com','trbvm.com','trickmail.net','trillianpro.com','trimix.cn','tryalert.com','turboprinz.de','turboprinzessin.de','turual.com','twinmail.de','twoweirdtricks.com','tyldd.com','ubismail.net','uggsrock.com','uk2.net','ukr.net','umail.net','unmail.ru','unterderbruecke.de','upliftnow.com','uplipht.com','uroid.com','username.e4ward.com','valemail.net','venompen.com','verlass-mich-nicht.de','veryrealemail.com','vidchart.com','viditag.com','viewcastmedia.com','viewcastmedia.net','viewcastmedia.org','vinbazar.com','vollbio.de','volloeko.de','vomoto.com','vorsicht-bissig.de','vorsicht-scharf.de','vubby.com','walala.org','walkmail.net','war-im-urlaub.de','wbb3.de','webemail.me','webm4il.info','webmail4u.eu','webuser.in','wee.my','weg-werf-email.de','wegwerf-email-addressen.de','wegwerf-emails.de','wegwerfadresse.de','wegwerfemail.com','wegwerfemail.de','wegwerfmail.de','wegwerfmail.info','wegwerfmail.net','wegwerfmail.org','wegwerpmailadres.nl','weibsvolk.de','weibsvolk.org','weinenvorglueck.de','wetrainbayarea.com','wetrainbayarea.org','wh4f.org','whatiaas.com','whatpaas.com','whatsaas.com','whopy.com','whtjddn.33mail.com','whyspam.me','wickmail.net','wilemail.com','will-hier-weg.de','willhackforfood.biz','willselfdestruct.com','winemaven.info','wir-haben-nachwuchs.de','wir-sind-cool.org','wirsindcool.de','wmail.cf','wolke7.net','wollan.info','women-at-work.org','wormseo.cn','wronghead.com','wuzup.net','wuzupmail.net','www.e4ward.com','www.gishpuppy.com','www.mailinator.com','wwwnew.eu','xagloo.com','xemaps.com','xents.com','xmail.com','xmaily.com','xoxox.cc','xoxy.net','xsecurity.org','xyzfree.net','yapped.net','yeah.net','yep.it','yert.ye.vc','yesey.net','yogamaven.com','yomail.info','yopmail.com','yopmail.fr','yopmail.gq','yopmail.net','yopweb.com','youmail.ga','youmailr.com','ypmail.webarnak.fr.eu.org','ystea.org','yuurok.com','yzbid.com','za.com','zehnminutenmail.de','zetmail.com','zippymail.info','zoaxe.com','zoemail.com','zoemail.net','zoemail.org','zomg.info','zweb.in','zxcv.com','zxcvbnm.com','zzz.com');
30
- public static $country = array('A1' =>'ANONYMOUS PROXY','A2' =>'SATELLITE PROVIDER','O1' =>'OTHER COUNTRY','AF' => 'AFGHANISTAN','AL' => 'ALBANIA','DZ' => 'ALGERIA','AS' => 'AMERICAN SAMOA','AD' => 'ANDORRA','AO' => 'ANGOLA','AI' => 'ANGUILLA','AQ' => 'ANTARCTICA','AG' => 'ANTIGUA AND BARBUDA','AR' => 'ARGENTINA','AM' => 'ARMENIA','AW' => 'ARUBA','AU' => 'AUSTRALIA','AT' => 'AUSTRIA','AZ' => 'AZERBAIJAN','BS' => 'BAHAMAS','BH' => 'BAHRAIN','BD' => 'BANGLADESH','BB' => 'BARBADOS','BY' => 'BELARUS','BE' => 'BELGIUM','BZ' => 'BELIZE','BJ' => 'BENIN','BM' => 'BERMUDA','BT' => 'BHUTAN','BO' => 'BOLIVIA','BA' => 'BOSNIA AND HERZEGOVINA','BW' => 'BOTSWANA','BV' => 'BOUVET ISLAND','BR' => 'BRAZIL','IO' => 'BRITISH INDIAN OCEAN TERRITORY','BN' => 'BRUNEI DARUSSALAM','BG' => 'BULGARIA','BF' => 'BURKINA FASO','BI' => 'BURUNDI','KH' => 'CAMBODIA','CM' => 'CAMEROON','CA' => 'CANADA','CV' => 'CAPE VERDE','KY' => 'CAYMAN ISLANDS','CF' => 'CENTRAL AFRICAN REPUBLIC','TD' => 'CHAD','CL' => 'CHILE','CN' => 'CHINA','CX' => 'CHRISTMAS ISLAND','CC' => 'COCOS (KEELING) ISLANDS','CO' => 'COLOMBIA','KM' => 'COMOROS','CG' => 'CONGO','CD' => 'CONGO, THE DEMOCRATIC REPUBLIC OF THE','CK' => 'COOK ISLANDS','CR' => 'COSTA RICA','CI' => 'COTE D IVOIRE','HR' => 'CROATIA','CU' => 'CUBA','CY' => 'CYPRUS','CZ' => 'CZECH REPUBLIC','DK' => 'DENMARK','DJ' => 'DJIBOUTI','DM' => 'DOMINICA','DO' => 'DOMINICAN REPUBLIC','TP' => 'EAST TIMOR','EC' => 'ECUADOR','EG' => 'EGYPT','SV' => 'EL SALVADOR','GQ' => 'EQUATORIAL GUINEA','ER' => 'ERITREA','EE' => 'ESTONIA','ET' => 'ETHIOPIA','FK' => 'FALKLAND ISLANDS (MALVINAS)','FO' => 'FAROE ISLANDS','FJ' => 'FIJI','FI' => 'FINLAND','FR' => 'FRANCE','GF' => 'FRENCH GUIANA','PF' => 'FRENCH POLYNESIA','TF' => 'FRENCH SOUTHERN TERRITORIES','GA' => 'GABON','GM' => 'GAMBIA','GE' => 'GEORGIA','DE' => 'GERMANY','GH' => 'GHANA','GI' => 'GIBRALTAR','GR' => 'GREECE','GL' => 'GREENLAND','GD' => 'GRENADA','GP' => 'GUADELOUPE','GU' => 'GUAM','GT' => 'GUATEMALA','GN' => 'GUINEA','GW' => 'GUINEA-BISSAU','GY' => 'GUYANA','HT' => 'HAITI','HM' => 'HEARD ISLAND AND MCDONALD ISLANDS','VA' => 'HOLY SEE (VATICAN CITY STATE)','HN' => 'HONDURAS','HK' => 'HONG KONG','HU' => 'HUNGARY','IS' => 'ICELAND','IN' => 'INDIA','ID' => 'INDONESIA','IR' => 'IRAN, ISLAMIC REPUBLIC OF','IQ' => 'IRAQ','IE' => 'IRELAND','IL' => 'ISRAEL','IT' => 'ITALY','JM' => 'JAMAICA','JP' => 'JAPAN','JO' => 'JORDAN','KZ' => 'KAZAKSTAN','KE' => 'KENYA','KI' => 'KIRIBATI','KP' => 'KOREA DEMOCRATIC PEOPLES REPUBLIC OF','KR' => 'KOREA REPUBLIC OF','KW' => 'KUWAIT','KG' => 'KYRGYZSTAN','LA' => 'LAO PEOPLES DEMOCRATIC REPUBLIC','LV' => 'LATVIA','LB' => 'LEBANON','LS' => 'LESOTHO','LR' => 'LIBERIA','LY' => 'LIBYAN ARAB JAMAHIRIYA','LI' => 'LIECHTENSTEIN','LT' => 'LITHUANIA','LU' => 'LUXEMBOURG','MO' => 'MACAU','MK' => 'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF','MG' => 'MADAGASCAR','MW' => 'MALAWI','MY' => 'MALAYSIA','MV' => 'MALDIVES','ML' => 'MALI','MT' => 'MALTA','MH' => 'MARSHALL ISLANDS','MQ' => 'MARTINIQUE','MR' => 'MAURITANIA','MU' => 'MAURITIUS','YT' => 'MAYOTTE','MX' => 'MEXICO','FM' => 'MICRONESIA, FEDERATED STATES OF','MD' => 'MOLDOVA, REPUBLIC OF','MC' => 'MONACO','MN' => 'MONGOLIA','MS' => 'MONTSERRAT','MA' => 'MOROCCO','MZ' => 'MOZAMBIQUE','MM' => 'MYANMAR','NA' => 'NAMIBIA','NR' => 'NAURU','NP' => 'NEPAL','NL' => 'NETHERLANDS','AN' => 'NETHERLANDS ANTILLES','NC' => 'NEW CALEDONIA','NZ' => 'NEW ZEALAND','NI' => 'NICARAGUA','NE' => 'NIGER','NG' => 'NIGERIA','NU' => 'NIUE','NF' => 'NORFOLK ISLAND','MP' => 'NORTHERN MARIANA ISLANDS','NO' => 'NORWAY','OM' => 'OMAN','PK' => 'PAKISTAN','PW' => 'PALAU','PS' => 'PALESTINIAN TERRITORY, OCCUPIED','PA' => 'PANAMA','PG' => 'PAPUA NEW GUINEA','PY' => 'PARAGUAY','PE' => 'PERU','PH' => 'PHILIPPINES','PN' => 'PITCAIRN','PL' => 'POLAND','PT' => 'PORTUGAL','PR' => 'PUERTO RICO','QA' => 'QATAR','RE' => 'REUNION','RO' => 'ROMANIA','RU' => 'RUSSIAN FEDERATION','RW' => 'RWANDA','SH' => 'SAINT HELENA','KN' => 'SAINT KITTS AND NEVIS','LC' => 'SAINT LUCIA','PM' => 'SAINT PIERRE AND MIQUELON','VC' => 'SAINT VINCENT AND THE GRENADINES','WS' => 'SAMOA','SM' => 'SAN MARINO','ST' => 'SAO TOME AND PRINCIPE','SA' => 'SAUDI ARABIA','SN' => 'SENEGAL','SC' => 'SEYCHELLES','SL' => 'SIERRA LEONE','SG' => 'SINGAPORE','SK' => 'SLOVAKIA','SI' => 'SLOVENIA','SB' => 'SOLOMON ISLANDS','SO' => 'SOMALIA','ZA' => 'SOUTH AFRICA','GS' => 'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS','ES' => 'SPAIN','LK' => 'SRI LANKA','SD' => 'SUDAN','SR' => 'SURINAME','SJ' => 'SVALBARD AND JAN MAYEN','SZ' => 'SWAZILAND','SE' => 'SWEDEN','CH' => 'SWITZERLAND','SY' => 'SYRIAN ARAB REPUBLIC','TW' => 'TAIWAN, PROVINCE OF CHINA','TJ' => 'TAJIKISTAN','TZ' => 'TANZANIA, UNITED REPUBLIC OF','TH' => 'THAILAND','TG' => 'TOGO','TK' => 'TOKELAU','TO' => 'TONGA','TT' => 'TRINIDAD AND TOBAGO','TN' => 'TUNISIA','TR' => 'TURKEY','TM' => 'TURKMENISTAN','TC' => 'TURKS AND CAICOS ISLANDS','TV' => 'TUVALU','UG' => 'UGANDA','UA' => 'UKRAINE','AE' => 'UNITED ARAB EMIRATES','GB' => 'UNITED KINGDOM','US' => 'UNITED STATES','UM' => 'UNITED STATES MINOR OUTLYING ISLANDS','UY' => 'URUGUAY','UZ' => 'UZBEKISTAN','VU' => 'VANUATU','VE' => 'VENEZUELA','VN' => 'VIET NAM','VG' => 'VIRGIN ISLANDS, BRITISH','VI' => 'VIRGIN ISLANDS, U.S.','WF' => 'WALLIS AND FUTUNA','EH' => 'WESTERN SAHARA','YE' => 'YEMEN','YU' => 'YUGOSLAVIA','ZM' => 'ZAMBIA','ZW' => 'ZIMBABWE');
31
-
32
- const RECAPTCHA_VERIFY = 'https://www.google.com/recaptcha/api/siteverify';
33
- const FAQ_PAYMENT_URL = 'https://faq.miniorange.com/knowledgebase/all-i-want-to-do-is-upgrade-to-a-premium-licence/';
34
- const LOGIN_ATTEMPTS_EXCEEDED = "User exceeded allowed login attempts.";
35
- const BLOCKED_BY_ADMIN = "Blocked by Admin";
36
- const IP_RANGE_BLOCKING = "IP Range Blocking";
37
- const FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP = "Failed login attempts from new IP.";
38
- const LOGGED_IN_FROM_NEW_IP = "Logged in from new IP.";
39
- const ATTACK_LIMIT_EXCEEDED = "ale";
40
- const RATE_LIMIT_EXCEEDED = "rle";
41
- const RATE_LIMIT_EXCEEDED_CRAWLER_ATTACK= "rlecrawler";
42
- const PLUGIN = 'plugin';
43
- const THEMES = 'themes';
44
- const WPFILES = 'wpfiles';
45
- const DATABASE = 'db';
46
- const CloudLockedOut ='https://faq.miniorange.com/knowledgebase/how-to-gain-access-to-my-website-if-i-get-locked-out/';
47
- const OnPremiseLockedOut ='https://faq.miniorange.com/knowledgebase/i-am-locked-cant-access-my-account-what-do-i-do/';
48
-
49
- public static $repo_status_code = array(-96 => 'Maximum execution time exceeded while downloading files from repository. Please contact miniOrange.', -97 => '<i>Uploads Folder</i> permission denied', -98 => '2 Factor authentication plugin unable to reach wordpress repository files. Please contact miniOrange.', -99 => 'Unable to download Wordpress, plugins and themes from Repository', -100 => 'Unable to unzip the Wordpress, plugins and themes');
50
-
51
- public static $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/upload';
52
-
53
- public static $hostname = 'scanner.api.xecurify.com';
54
-
55
- public static $quick_scan_configuration = array('plugin_scan' => 1 ,
56
- 'theme_scan' => 1,
57
- 'core_scan' => 0,
58
- 'file_extension' => "",
59
- 'check_vulnerable' => 1,
60
- 'check_sql' => 1,
61
- 'check_rfi' => 1,
62
- 'ext_link_check' => 0,
63
- 'check_repo' => 0,
64
- 'path_skip' => "",
65
- 'type_scan' => "Quick Scan"
66
- );
67
- public static $standard_scan_configuration = array('plugin_scan' => 1 ,
68
- 'theme_scan' => 1,
69
- 'core_scan' => 0,
70
- 'file_extension' => "",
71
- 'check_vulnerable' => 1,
72
- 'check_sql' => 1,
73
- 'check_rfi' => 1,
74
- 'ext_link_check' => 1,
75
- 'check_repo' => 1,
76
- 'path_skip' => "",
77
- 'type_scan' => "Standard Scan"
78
- );
79
-
80
- function __construct()
81
- {
82
- $this->define_global();
83
- }
84
-
85
- function define_global()
86
- {
87
- global $wpnsDbQueries,$moWpnsUtility,$mo2f_dirName,$Mo2fdbQueries;
88
- $wpnsDbQueries = new MoWpnsDB();
89
- $moWpnsUtility = new MoWpnsUtility();
90
- $mo2f_dirName = dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR;
91
- $Mo2fdbQueries = new Mo2fDB();
92
- }
93
-
94
- }
95
- new MoWpnsConstants;
96
-
97
  ?>
1
+ <?php
2
+
3
+ class MoWpnsConstants
4
+ {
5
+ const SUCCESS = "success";
6
+ const FAILED = "failed";
7
+ const PAST_FAILED = "pastfailed";
8
+ const ACCESS_DENIED = "accessDenied";
9
+ const LOGIN_TRANSACTION = "User Login";
10
+ const ERR_404 = "404";
11
+ const ERR_403 = "403";
12
+ const DEFAULT_CUSTOMER_KEY = "16555";
13
+ const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
+ const DB_VERSION = 150;
15
+ const SUPPORT_EMAIL = 'info@xecurify.com';
16
+ 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>';
17
+ const CURRENT_BROWSER = '<span style="font-size:10px;color:red;">( Current Browser )</span>';
18
+
19
+ //urls
20
+ const RECAPTCHA_URL = 'https://www.google.com/recaptcha/api.js';
21
+ const HOST_NAME = "https://login.xecurify.com";
22
+
23
+ //plugins
24
+ const TWO_FACTOR_SETTINGS = 'miniorange-2-factor-authentication/miniorange_2_factor_settings.php';
25
+ const OTP_VERIFICATION_SETTINGS = 'miniorange-otp-verification/miniorange_validation_settings.php';
26
+ const SOCIAL_LOGIN_SETTINGS = 'miniorange-login-openid/miniorange_openid_sso_settings.php';
27
+
28
+ //arrays
29
+ public static $domains = array('0-mail.com','20email.eu','0815.ru','0815.su','0clickemail.com','0sg.net','0wnd.net','0wnd.org','10mail.org','10minutemail.cf','10minutemail.com','10minutemail.de','10minutemail.ga','10minutemail.gq','10minutemail.ml','123-m.com','12hourmail.com','12minutemail.com','1ce.us','1chuan.com','1mail.ml','1pad.de','1zhuan.com','20mail.in','20mail.it','20minutemail.com','21cn.com','24hourmail.com','2prong.com','30minutemail.com','30minutesmail.com','3126.com','33mail.com','3d-painting.com','3mail.ga','4mail.cf','4mail.ga','4warding.com','4warding.net','4warding.org','50e.info','5mail.cf','5mail.ga','60minutemail.com','675hosting.com','675hosting.net','675hosting.org','6ip.us','6mail.cf','6mail.ga','6mail.ml','6paq.com','6url.com','75hosting.com','75hosting.net','75hosting.org','7days-printing.com','7mail.ga','7mail.ml','7tags.com','8mail.cf','8mail.ga','8mail.ml','99experts.com','9mail.cf','9ox.net','BeefMilk.com','DingBone.com','FudgeRub.com','LookUgly.com','MailScrap.com','SmellFear.com','TempEmail.net','a-bc.net','a45.in','abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com','abusemail.de','abwesend.de','abyssmail.com','ac20mail.in','acentri.com','addcom.de','advantimo.com','afrobacon.com','ag.us.to','agedmail.com','agnitumhost.net','ahk.jp','ajaxapp.net','alivance.com','alpenjodel.de','alphafrau.de','amail.com','amilegit.com','amiri.net','amiriindustries.com','amorki.pl','anappthat.com','ano-mail.net','anonbox.net','anonymail.dk','anonymbox.com','antichef.com','antichef.net','antispam.de','antispam24.de','appixie.com','armyspy.com','asdasd.nl','autosfromus.com','aver.com','azmeil.tk','baldmama.de','baldpapa.de','ballyfinance.com','baxomale.ht.cx','beddly.com','beefmilk.com','betriebsdirektor.de','big1.us','bigmir.net','bigprofessor.so','bigstring.com','bin-wieder-da.de','binkmail.com','bio-muesli.info','bio-muesli.net','bladesmail.net','bleib-bei-mir.de','blockfilter.com','blogmyway.org','bluebottle.com','bobmail.info','bodhi.lawlita.com','bofthew.com','bonbon.net','bootybay.de','boun.cr','bouncr.com','boxformail.in','boxtemp.com.br','brefmail.com','brennendesreich.de','briefemail.com','broadbandninja.com','brokenvalve.com','brokenvalve.org','bsnow.net','bspamfree.org','bu.mintemail.com','buerotiger.de','buffemail.com','bugmenot.com','bumpymail.com','bund.us','bundes-li.ga','burnthespam.info','burstmail.info','buy-24h.net.ru','buyusedlibrarybooks.org','c2.hu','cachedot.net','cashette.com','casualdx.com','cbair.com','ce.mintemail.com','cellurl.com','center-mail.de','centermail.at','centermail.ch','centermail.com','centermail.de','centermail.info','centermail.net','cghost.s-a-d.de','chammy.info','cheatmail.de','chogmail.com','choicemail1.com','chong-mail.com','chong-mail.net','chong-mail.org','chongsoft.org','clixser.com','cmail.com','cmail.net','cmail.org','coldemail.info','consumerriot.com','cool.fr.nf','coole-files.de','correo.blogos.net','cosmorph.com','courriel.fr.nf','courrieltemporaire.com','crapmail.org','crazespaces.pw','crazymailing.com','cubiclink.com','curryworld.de','cust.in','cuvox.de','cyber-matrix.com','dacoolest.com','daintly.com','dandikmail.com','dating4best.net','dayrep.com','dbunker.com','dcemail.com','deadaddress.com','deadchildren.org','deadfake.cf','deadfake.ga','deadfake.ml','deadfake.tk','deadspam.com','deagot.com','dealja.com','despam.it','despammed.com','devnullmail.com','dfgh.net','dharmatel.net','die-besten-bilder.de','die-genossen.de','die-optimisten.de','die-optimisten.net','dieMailbox.de','digital-filestore.de','digitalsanctuary.com','dingbone.com','directbox.com','discard.cf','discard.email','discard.ga','discard.gq','discard.ml','discard.tk','discardmail.*','discardmail.com','discardmail.de','discartmail.com','disposable-email.ml','disposable.cf','disposable.ga','disposable.ml','disposableaddress.com','disposableemailaddresses.com','disposableemailaddresses.emailmiser.com','disposableinbox.com','dispose.it','disposeamail.com','disposemail.com','dispostable.com','divermail.com','dm.w3internet.co.uk','example.com','docmail.cz','dodgeit.com','dodgit.com','dodgit.org','dogit.com','doiea.com','domozmail.com','donemail.ru','dontreg.com','dontsendmespam.de','dontsentmespam.de','dotmsg.com','download-privat.de','drdrb.com','drdrb.net','droplar.com','dropmail.me','duam.net','dudmail.com','dump-email.info','dumpandjunk.com','dumpmail.com','dumpmail.de','dumpyemail.com','duskmail.com','dyndns.org','e-mail.com','e-mail.org','e4ward.com','easytrashmail.com','ee2.pl','eelmail.com','einrot.com','einrot.de','eintagsmail.de','email-fake.cf','email-fake.ga','email-fake.gq','email-fake.ml','email-fake.tk','email.org','email4u.info','email60.com','emailage.cf','emailage.ga','emailage.gq','emailage.ml','emailage.tk','emaildienst.de','emailgo.de','emailias.com','emailigo.de','emailinfive.com','emailisvalid.com','emaillime.com','emailmiser.com','emailproxsy.com','emails.ga','emailsensei.com','emailspam.cf','emailspam.ga','emailspam.gq','emailspam.ml','emailspam.tk','emailtaxi.de','emailtemporanea.net','emailtemporar.ro','emailtemporario.com.br','emailthe.net','emailtmp.com','emailto.de','emailwarden.com','emailx.at.hm','emailxfer.com','emailz.cf','emailz.ga','emailz.gq','emailz.ml','emeil.in','emeil.ir','emil.com','emkei.cf','emkei.ga','emkei.gq','emkei.ml','emkei.tk','emz.net','enterto.com','ephemail.net','etranquil.com','etranquil.net','etranquil.org','evopo.com','example.com','explodemail.com','eyepaste.com','facebook-email.cf','facebook-email.ga','facebook-email.ml','facebookmail.gq','facebookmail.ml','fahr-zur-hoelle.org','fake-mail.cf','fake-mail.ga','fake-mail.ml','fakeinbox.cf','fakeinbox.com','fakeinbox.ga','fakeinbox.ml','fakeinbox.tk','fakeinformation.com','fakemail.fr','fakemailgenerator.com','fakemailz.com','falseaddress.com','fammix.com','fansworldwide.de','fantasymail.de','farifluset.mailexpire.com','fastacura.com','fastchevy.com','fastchrysler.com','fastkawasaki.com','fastmazda.com','fastmitsubishi.com','fastnissan.com','fastsubaru.com','fastsuzuki.com','fasttoyota.com','fastyamaha.com','fatflap.com','fdfdsfds.com','feinripptraeger.de','fettabernett.de','fightallspam.com','fiifke.de','filzmail.com','fishfuse.com','fixmail.tk','fizmail.com','fleckens.hu','flurred.com','flyspam.com','footard.com','forgetmail.com','fornow.eu','fr33mail.info','frapmail.com','free-email.cf','free-email.ga','freemail.ms','freemails.cf','freemails.ga','freemails.ml','freemeilaadressforall.net','freudenkinder.de','freundin.ru','friendlymail.co.uk','fromru.com','front14.org','fuckingduh.com','fudgerub.com','fux0ringduh.com','garliclife.com','gawab.com','gelitik.in','gentlemansclub.de','get-mail.cf','get-mail.ga','get-mail.ml','get-mail.tk','get1mail.com','get2mail.fr','getairmail.cf','getairmail.com','getairmail.ga','getairmail.gq','getairmail.ml','getairmail.tk','getmails.eu','getonemail.com','getonemail.net','ghosttexter.de','girlsundertheinfluence.com','gishpuppy.com','goemailgo.com','gold-profits.info','goldtoolbox.com','golfilla.info','gorillaswithdirtyarmpits.com','gotmail.com','gotmail.net','gotmail.org','gotti.otherinbox.com','gowikibooks.com','gowikicampus.com','gowikicars.com','gowikifilms.com','gowikigames.com','gowikimusic.com','gowikinetwork.com','gowikitravel.com','gowikitv.com','grandmamail.com','grandmasmail.com','great-host.in','greensloth.com','grr.la','gsrv.co.uk','guerillamail.biz','guerillamail.com','guerillamail.net','guerillamail.org','guerrillamail.biz','guerrillamail.com','guerrillamail.de','guerrillamail.info','guerrillamail.net','guerrillamail.org','guerrillamailblock.com','gustr.com','h.mintemail.com','h8s.org','hab-verschlafen.de','habmalnefrage.de','hacccc.com','haltospam.com','harakirimail.com','hartbot.de','hatespam.org','hellodream.mobi','herp.in','herr-der-mails.de','hidemail.de','hidzz.com','hmamail.com','hochsitze.com','home.de','hopemail.biz','hot-mail.cf','hot-mail.ga','hot-mail.gq','hot-mail.ml','hot-mail.tk','hotpop.com','hulapla.de','humn.ws.gy','hush.com','hushmail.com','ich-bin-verrueckt-nach-dir.de','ich-will-net.de','ieatspam.eu','ieatspam.info','ieh-mail.de','ihateyoualot.info','iheartspam.org','ikbenspamvrij.nl','imails.info','imgof.com','imstations.com','inbax.tk','inbox.si','inbox2.info','inboxalias.com','inboxclean.com','inboxclean.org','inboxproxy.com','incognitomail.com','incognitomail.net','incognitomail.org','inerted.com','inmail24.com','insorg-mail.info','instant-mail.de','instantemailaddress.com','ipoo.org','irish2me.com','iroid.com','ist-allein.info','ist-einmalig.de','ist-ganz-allein.de','ist-willig.de','iwi.net','izmail.net','jetable.com','jetable.de','jetable.fr.nf','jetable.net','jetable.org','jetfix.ee','jetzt-bin-ich-dran.com','jn-club.de','jnxjn.com','jobbikszimpatizans.hu','jourrapide.com','jsrsolutions.com','junk1e.com','junkmail.com','junkmail.ga','junkmail.gq','kaffeeschluerfer.com','kaffeeschluerfer.de','kasmail.com','kaspop.com','keepmymail.com','killmail.com','killmail.net','kimsdisk.com','kinglibrary.net','kingsq.ga','kir.ch.tc','klassmaster.com','klassmaster.net','klzlk.com','kommespaeter.de','kook.ml','koszmail.pl','krim.ws','kuh.mu','kulturbetrieb.info','kurzepost.de','l33r.eu','labetteraverouge.at','lackmail.net','lags.us','landmail.co','lass-es-geschehen.de','lastmail.co','lastmail.com','lazyinbox.com','letthemeatspam.com','lhsdv.com','liebt-dich.info','lifebyfood.com','link2mail.net','listomail.com','litedrop.com','loadby.us','login-email.cf','login-email.ga','login-email.ml','login-email.tk','lol.ovpn.to','lookugly.com','lopl.co.cc','lortemail.dk','lovemeleaveme.com','loveyouforever.de','lr7.us','lr78.com','lroid.com','luv2.us','m4ilweb.info','maboard.com','maennerversteherin.com','maennerversteherin.de','mail-filter.com','mail-temporaire.fr','mail.by','mail.htl22.at','mail.mezimages.net','mail.misterpinball.de','mail.svenz.eu','mail114.net','mail15.com','mail2rss.org','mail333.com','mail4days.com','mail4trash.com','mail4u.info','mailbidon.com','mailblocks.com','mailbucket.org','mailcat.biz','mailcatch.*','mailcatch.com','maildrop.cc','maildrop.cf','maildrop.ga','maildrop.gq','maildrop.ml','maildx.com','maileater.com','mailexpire.com','mailfa.tk','mailforspam.com','mailfree.ga','mailfree.gq','mailfree.ml','mailfreeonline.com','mailfs.com','mailguard.me','mailimate.com','mailin8r.com','mailinater.com','mailinator.com','mailinator.gq','mailinator.net','mailinator.org','mailinator.us','mailinator2.com','mailinblack.com','mailincubator.com','mailismagic.com','mailjunk.cf','mailjunk.ga','mailjunk.gq','mailjunk.ml','mailjunk.tk','mailmate.com','mailme.gq','mailme.ir','mailme.lv','mailme24.com','mailmetrash.com','mailmoat.com','mailnator.com','mailnesia.com','mailnull.com','mailpick.biz','mailproxsy.com','mailquack.com','mailrock.biz','mailsac.com','mailscrap.com','mailseal.de','mailshell.com','mailsiphon.com','mailslapping.com','mailslite.com','mailtemp.info','mailtothis.com','mailtrash.net','mailueberfall.de','mailzilla.com','mailzilla.org','mailzilla.orgmbx.cc','makemetheking.com','mamber.net','manifestgenerator.com','manybrain.com','mbx.cc','mciek.com','mega.zik.dj','meine-dateien.info','meine-diashow.de','meine-fotos.info','meine-urlaubsfotos.de','meinspamschutz.de','meltmail.com','messagebeamer.de','metaping.com','mezimages.net','mfsa.ru','mierdamail.com','migumail.com','mintemail.com','mjukglass.nu','mns.ru','moakt.com','mobi.web.id','mobileninja.co.uk','moburl.com','mohmal.com','moncourrier.fr.nf','monemail.fr.nf','monmail.fr.nf','monumentmail.com','ms9.mailslite.com','msa.minsmail.com','msh.mailslite.com','mt2009.com','mt2014.com','mufmail.com','muskelshirt.de','mx0.wwwnew.eu','my-mail.ch','my10minutemail.com','myadult.info','mycleaninbox.net','myemailboxy.com','mymail-in.net','mymailoasis.com','mynetstore.de','mypacks.net','mypartyclip.de','myphantomemail.com','myspaceinc.com','myspaceinc.net','myspaceinc.org','myspacepimpedup.com','myspamless.com','mytemp.email','mytempemail.com','mytop-in.net','mytrashmail.com','mytrashmail.compookmail.com','neomailbox.com','nepwk.com','nervmich.net','nervtmich.net','netmails.com','netmails.net','netterchef.de','netzidiot.de','neue-dateien.de','neverbox.com','nice-4u.com','nmail.cf','no-spam.ws','nobulk.com','noclickemail.com','nogmailspam.info','nomail.xl.cx','nomail2me.com','nomorespamemails.com','nonspam.eu','nonspammer.de','noref.in','nospam.wins.com.br','nospam.ze.tc','nospam4.us','nospamfor.us','nospammail.net','nospamthanks.info','notmailinator.com','notsharingmy.info','nowhere.org','nowmymail.com','ntlhelp.net','nullbox.info','nur-fuer-spam.de','nurfuerspam.de','nus.edu.sg','nwldx.com','nybella.com','objectmail.com','obobbo.com','odaymail.com','office-dateien.de','oikrach.com','one-time.email','oneoffemail.com','oneoffmail.com','onewaymail.com','online.ms','oopi.org','opayq.com','orangatango.com','ordinaryamerican.net','otherinbox.com','ourklips.com','outlawspam.com','ovpn.to','owlpic.com','pancakemail.com','paplease.com','partybombe.de','partyheld.de','pcusers.otherinbox.com','pepbot.com','pfui.ru','phreaker.net','pimpedupmyspace.com','pisem.net','pjjkp.com','pleasedontsendmespam.de','plexolan.de','poczta.onet.pl','politikerclub.de','polizisten-duzer.de','poofy.org','pookmail.com','pornobilder-mal-gratis.com','portsaid.cc','postacin.com','postfach.cc','privacy.net','privy-mail.com','privymail.de','proxymail.eu','prtnx.com','prtz.eu','prydirect.info','pryworld.info','public-files.de','punkass.com','put2.net','putthisinyourspamdatabase.com','pwrby.com','qasti.com','qisdo.com','qisoa.com','qq.com','quantentunnel.de','quickinbox.com','quickmail.nl','qv7.info','radiku.ye.vc','ralib.com','raubtierbaendiger.de','rcpt.at','reallymymail.com','receiveee.chickenkiller.com','receiveee.com','recode.me','reconmail.com','record.me','recursor.net','recyclemail.dk','regbypass.com','regbypass.comsafe-mail.net','rejectmail.com','remail.cf','remail.ga','rhyta.com','rk9.chickenkiller.com','rklips.com','rmqkr.net','rootprompt.org','royal.net','rppkn.com','rtrtr.com','ruffrey.com','s0ny.net','saeuferleber.de','safe-mail.net','safersignup.de','safetymail.info','safetypost.de','sags-per-mail.de','sandelf.de','satka.net','saynotospams.com','scatmail.com','schafmail.de','schmusemail.de','schreib-doch-mal-wieder.de','selfdestructingmail.com','selfdestructingmail.org','sendspamhere.com','senseless-entertainment.com','shared-files.de','sharedmailbox.org','sharklasers.com','shieldedmail.com','shiftmail.com','shinedyoureyes.com','shitmail.me','shitmail.org','shitware.nl','shortmail.net','showslow.de','sibmail.com','sinnlos-mail.de','siria.cc','siteposter.net','skeefmail.com','skeefmail.net','slaskpost.se','slave-auctions.net','slopsbox.com','slushmail.com','smashmail.de','smellfear.com','smellrear.com','sms.at','snakemail.com','sneakemail.com','snkmail.com','sofimail.com','sofort-mail.de','sofortmail.de','softpls.asia','sogetthis.com','sohu.com','soisz.com','solvemail.info','sonnenkinder.org','soodomail.com','soodonims.com','spam-be-gone.com','spam.la','spam.su','spam4.me','spamavert.com','spambob.com','spambob.net','spambob.org','spambog.*','spambog.com','spambog.de','spambog.net','spambog.ru','spambooger.com','spambox.info','spambox.irishspringrealty.com','spambox.us','spamcannon.com','spamcannon.net','spamcero.com','spamcon.org','spamcorptastic.com','spamcowboy.com','spamcowboy.net','spamcowboy.org','spamday.com','spamdecoy.net','spameater.com','spameater.org','spamex.com','spamfighter.cf','spamfighter.ga','spamfighter.gq','spamfighter.ml','spamfighter.tk','spamfree.eu','spamfree24.com','spamfree24.de','spamfree24.eu','spamfree24.info','spamfree24.net','spamfree24.org','spamgoes.in','spamgourmet.com','spamgourmet.net','spamgourmet.org','spamgrube.net','spamherelots.com','spamhereplease.com','spamhole.com','spamify.com','spaminator.de','spamkill.info','spaml.com','spaml.de','spammote.com','spammotel.com','spammuffel.de','spamobox.com','spamoff.de','spamreturn.com','spamsalad.in','spamslicer.com','spamspot.com','spamstack.net','spamthis.co.uk','spamthisplease.com','spamtrail.com','spamtroll.net','speed.1s.fr','sperke.net','spikio.com','spoofmail.de','squizzy.de','sriaus.com','ssoia.com','startkeys.com','stinkefinger.net','stop-my-spam.cf','stop-my-spam.com','stop-my-spam.ga','stop-my-spam.ml','stop-my-spam.tk','streber24.de','streetwisemail.com','stuffmail.de','super-auswahl.de','supergreatmail.com','supermailer.jp','superrito.com','superstachel.de','suremail.info','svk.jp','sweetville.net','sweetxxx.de','tafmail.com','tagesmail.eu','tagyourself.com','talkinator.com','tapchicuoihoi.com','teewars.org','teleworm.com','teleworm.us','temp-mail.com','temp-mail.org','temp.emeraldwebmail.com','temp.headstrong.de','tempail.com','tempalias.com','tempe-mail.com','tempemail.biz','tempemail.co.za','tempemail.com','tempemail.net','tempinbox.co.uk','tempinbox.com','tempmail.it','tempmail2.com','tempmaildemo.com','tempmailer.com','tempomail.fr','temporarily.de','temporarioemail.com.br','temporaryemail.net','temporaryemail.us','temporaryforwarding.com','temporaryinbox.com','tempsky.com','tempthe.net','tempymail.com','terminverpennt.de','test.com','test.de','thanksnospam.info','thankyou2010.com','thecloudindex.com','thepryam.info','thisisnotmyrealemail.com','throam.com','throwawayemailaddress.com','throwawaymail.com','tilien.com','tittbit.in','tmail.ws','tmailinator.com','toiea.com','toomail.biz','topmail-files.de','tortenboxer.de','totalmail.de','tradermail.info','trash-amil.com','trash-mail.at','trash-mail.cf','trash-mail.com','trash-mail.de','trash-mail.ga','trash-mail.gq','trash-mail.ml','trash-mail.tk','trash2009.com','trash2010.com','trash2011.com','trashbox.eu','trashdevil.com','trashdevil.de','trashemail.de','trashmail.at','trashmail.com','trashmail.de','trashmail.me','trashmail.net','trashmail.org','trashmail.ws','trashmailer.com','trashymail.com','trashymail.net','trayna.com','trbvm.com','trickmail.net','trillianpro.com','trimix.cn','tryalert.com','turboprinz.de','turboprinzessin.de','turual.com','twinmail.de','twoweirdtricks.com','tyldd.com','ubismail.net','uggsrock.com','uk2.net','ukr.net','umail.net','unmail.ru','unterderbruecke.de','upliftnow.com','uplipht.com','uroid.com','username.e4ward.com','valemail.net','venompen.com','verlass-mich-nicht.de','veryrealemail.com','vidchart.com','viditag.com','viewcastmedia.com','viewcastmedia.net','viewcastmedia.org','vinbazar.com','vollbio.de','volloeko.de','vomoto.com','vorsicht-bissig.de','vorsicht-scharf.de','vubby.com','walala.org','walkmail.net','war-im-urlaub.de','wbb3.de','webemail.me','webm4il.info','webmail4u.eu','webuser.in','wee.my','weg-werf-email.de','wegwerf-email-addressen.de','wegwerf-emails.de','wegwerfadresse.de','wegwerfemail.com','wegwerfemail.de','wegwerfmail.de','wegwerfmail.info','wegwerfmail.net','wegwerfmail.org','wegwerpmailadres.nl','weibsvolk.de','weibsvolk.org','weinenvorglueck.de','wetrainbayarea.com','wetrainbayarea.org','wh4f.org','whatiaas.com','whatpaas.com','whatsaas.com','whopy.com','whtjddn.33mail.com','whyspam.me','wickmail.net','wilemail.com','will-hier-weg.de','willhackforfood.biz','willselfdestruct.com','winemaven.info','wir-haben-nachwuchs.de','wir-sind-cool.org','wirsindcool.de','wmail.cf','wolke7.net','wollan.info','women-at-work.org','wormseo.cn','wronghead.com','wuzup.net','wuzupmail.net','www.e4ward.com','www.gishpuppy.com','www.mailinator.com','wwwnew.eu','xagloo.com','xemaps.com','xents.com','xmail.com','xmaily.com','xoxox.cc','xoxy.net','xsecurity.org','xyzfree.net','yapped.net','yeah.net','yep.it','yert.ye.vc','yesey.net','yogamaven.com','yomail.info','yopmail.com','yopmail.fr','yopmail.gq','yopmail.net','yopweb.com','youmail.ga','youmailr.com','ypmail.webarnak.fr.eu.org','ystea.org','yuurok.com','yzbid.com','za.com','zehnminutenmail.de','zetmail.com','zippymail.info','zoaxe.com','zoemail.com','zoemail.net','zoemail.org','zomg.info','zweb.in','zxcv.com','zxcvbnm.com','zzz.com');
30
+ public static $country = array('A1' =>'ANONYMOUS PROXY','A2' =>'SATELLITE PROVIDER','O1' =>'OTHER COUNTRY','AF' => 'AFGHANISTAN','AL' => 'ALBANIA','DZ' => 'ALGERIA','AS' => 'AMERICAN SAMOA','AD' => 'ANDORRA','AO' => 'ANGOLA','AI' => 'ANGUILLA','AQ' => 'ANTARCTICA','AG' => 'ANTIGUA AND BARBUDA','AR' => 'ARGENTINA','AM' => 'ARMENIA','AW' => 'ARUBA','AU' => 'AUSTRALIA','AT' => 'AUSTRIA','AZ' => 'AZERBAIJAN','BS' => 'BAHAMAS','BH' => 'BAHRAIN','BD' => 'BANGLADESH','BB' => 'BARBADOS','BY' => 'BELARUS','BE' => 'BELGIUM','BZ' => 'BELIZE','BJ' => 'BENIN','BM' => 'BERMUDA','BT' => 'BHUTAN','BO' => 'BOLIVIA','BA' => 'BOSNIA AND HERZEGOVINA','BW' => 'BOTSWANA','BV' => 'BOUVET ISLAND','BR' => 'BRAZIL','IO' => 'BRITISH INDIAN OCEAN TERRITORY','BN' => 'BRUNEI DARUSSALAM','BG' => 'BULGARIA','BF' => 'BURKINA FASO','BI' => 'BURUNDI','KH' => 'CAMBODIA','CM' => 'CAMEROON','CA' => 'CANADA','CV' => 'CAPE VERDE','KY' => 'CAYMAN ISLANDS','CF' => 'CENTRAL AFRICAN REPUBLIC','TD' => 'CHAD','CL' => 'CHILE','CN' => 'CHINA','CX' => 'CHRISTMAS ISLAND','CC' => 'COCOS (KEELING) ISLANDS','CO' => 'COLOMBIA','KM' => 'COMOROS','CG' => 'CONGO','CD' => 'CONGO, THE DEMOCRATIC REPUBLIC OF THE','CK' => 'COOK ISLANDS','CR' => 'COSTA RICA','CI' => 'COTE D IVOIRE','HR' => 'CROATIA','CU' => 'CUBA','CY' => 'CYPRUS','CZ' => 'CZECH REPUBLIC','DK' => 'DENMARK','DJ' => 'DJIBOUTI','DM' => 'DOMINICA','DO' => 'DOMINICAN REPUBLIC','TP' => 'EAST TIMOR','EC' => 'ECUADOR','EG' => 'EGYPT','SV' => 'EL SALVADOR','GQ' => 'EQUATORIAL GUINEA','ER' => 'ERITREA','EE' => 'ESTONIA','ET' => 'ETHIOPIA','FK' => 'FALKLAND ISLANDS (MALVINAS)','FO' => 'FAROE ISLANDS','FJ' => 'FIJI','FI' => 'FINLAND','FR' => 'FRANCE','GF' => 'FRENCH GUIANA','PF' => 'FRENCH POLYNESIA','TF' => 'FRENCH SOUTHERN TERRITORIES','GA' => 'GABON','GM' => 'GAMBIA','GE' => 'GEORGIA','DE' => 'GERMANY','GH' => 'GHANA','GI' => 'GIBRALTAR','GR' => 'GREECE','GL' => 'GREENLAND','GD' => 'GRENADA','GP' => 'GUADELOUPE','GU' => 'GUAM','GT' => 'GUATEMALA','GN' => 'GUINEA','GW' => 'GUINEA-BISSAU','GY' => 'GUYANA','HT' => 'HAITI','HM' => 'HEARD ISLAND AND MCDONALD ISLANDS','VA' => 'HOLY SEE (VATICAN CITY STATE)','HN' => 'HONDURAS','HK' => 'HONG KONG','HU' => 'HUNGARY','IS' => 'ICELAND','IN' => 'INDIA','ID' => 'INDONESIA','IR' => 'IRAN, ISLAMIC REPUBLIC OF','IQ' => 'IRAQ','IE' => 'IRELAND','IL' => 'ISRAEL','IT' => 'ITALY','JM' => 'JAMAICA','JP' => 'JAPAN','JO' => 'JORDAN','KZ' => 'KAZAKSTAN','KE' => 'KENYA','KI' => 'KIRIBATI','KP' => 'KOREA DEMOCRATIC PEOPLES REPUBLIC OF','KR' => 'KOREA REPUBLIC OF','KW' => 'KUWAIT','KG' => 'KYRGYZSTAN','LA' => 'LAO PEOPLES DEMOCRATIC REPUBLIC','LV' => 'LATVIA','LB' => 'LEBANON','LS' => 'LESOTHO','LR' => 'LIBERIA','LY' => 'LIBYAN ARAB JAMAHIRIYA','LI' => 'LIECHTENSTEIN','LT' => 'LITHUANIA','LU' => 'LUXEMBOURG','MO' => 'MACAU','MK' => 'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF','MG' => 'MADAGASCAR','MW' => 'MALAWI','MY' => 'MALAYSIA','MV' => 'MALDIVES','ML' => 'MALI','MT' => 'MALTA','MH' => 'MARSHALL ISLANDS','MQ' => 'MARTINIQUE','MR' => 'MAURITANIA','MU' => 'MAURITIUS','YT' => 'MAYOTTE','MX' => 'MEXICO','FM' => 'MICRONESIA, FEDERATED STATES OF','MD' => 'MOLDOVA, REPUBLIC OF','MC' => 'MONACO','MN' => 'MONGOLIA','MS' => 'MONTSERRAT','MA' => 'MOROCCO','MZ' => 'MOZAMBIQUE','MM' => 'MYANMAR','NA' => 'NAMIBIA','NR' => 'NAURU','NP' => 'NEPAL','NL' => 'NETHERLANDS','AN' => 'NETHERLANDS ANTILLES','NC' => 'NEW CALEDONIA','NZ' => 'NEW ZEALAND','NI' => 'NICARAGUA','NE' => 'NIGER','NG' => 'NIGERIA','NU' => 'NIUE','NF' => 'NORFOLK ISLAND','MP' => 'NORTHERN MARIANA ISLANDS','NO' => 'NORWAY','OM' => 'OMAN','PK' => 'PAKISTAN','PW' => 'PALAU','PS' => 'PALESTINIAN TERRITORY, OCCUPIED','PA' => 'PANAMA','PG' => 'PAPUA NEW GUINEA','PY' => 'PARAGUAY','PE' => 'PERU','PH' => 'PHILIPPINES','PN' => 'PITCAIRN','PL' => 'POLAND','PT' => 'PORTUGAL','PR' => 'PUERTO RICO','QA' => 'QATAR','RE' => 'REUNION','RO' => 'ROMANIA','RU' => 'RUSSIAN FEDERATION','RW' => 'RWANDA','SH' => 'SAINT HELENA','KN' => 'SAINT KITTS AND NEVIS','LC' => 'SAINT LUCIA','PM' => 'SAINT PIERRE AND MIQUELON','VC' => 'SAINT VINCENT AND THE GRENADINES','WS' => 'SAMOA','SM' => 'SAN MARINO','ST' => 'SAO TOME AND PRINCIPE','SA' => 'SAUDI ARABIA','SN' => 'SENEGAL','SC' => 'SEYCHELLES','SL' => 'SIERRA LEONE','SG' => 'SINGAPORE','SK' => 'SLOVAKIA','SI' => 'SLOVENIA','SB' => 'SOLOMON ISLANDS','SO' => 'SOMALIA','ZA' => 'SOUTH AFRICA','GS' => 'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS','ES' => 'SPAIN','LK' => 'SRI LANKA','SD' => 'SUDAN','SR' => 'SURINAME','SJ' => 'SVALBARD AND JAN MAYEN','SZ' => 'SWAZILAND','SE' => 'SWEDEN','CH' => 'SWITZERLAND','SY' => 'SYRIAN ARAB REPUBLIC','TW' => 'TAIWAN, PROVINCE OF CHINA','TJ' => 'TAJIKISTAN','TZ' => 'TANZANIA, UNITED REPUBLIC OF','TH' => 'THAILAND','TG' => 'TOGO','TK' => 'TOKELAU','TO' => 'TONGA','TT' => 'TRINIDAD AND TOBAGO','TN' => 'TUNISIA','TR' => 'TURKEY','TM' => 'TURKMENISTAN','TC' => 'TURKS AND CAICOS ISLANDS','TV' => 'TUVALU','UG' => 'UGANDA','UA' => 'UKRAINE','AE' => 'UNITED ARAB EMIRATES','GB' => 'UNITED KINGDOM','US' => 'UNITED STATES','UM' => 'UNITED STATES MINOR OUTLYING ISLANDS','UY' => 'URUGUAY','UZ' => 'UZBEKISTAN','VU' => 'VANUATU','VE' => 'VENEZUELA','VN' => 'VIET NAM','VG' => 'VIRGIN ISLANDS, BRITISH','VI' => 'VIRGIN ISLANDS, U.S.','WF' => 'WALLIS AND FUTUNA','EH' => 'WESTERN SAHARA','YE' => 'YEMEN','YU' => 'YUGOSLAVIA','ZM' => 'ZAMBIA','ZW' => 'ZIMBABWE');
31
+
32
+ const RECAPTCHA_VERIFY = 'https://www.google.com/recaptcha/api/siteverify';
33
+ const FAQ_PAYMENT_URL = 'https://faq.miniorange.com/knowledgebase/all-i-want-to-do-is-upgrade-to-a-premium-licence/';
34
+ const LOGIN_ATTEMPTS_EXCEEDED = "User exceeded allowed login attempts.";
35
+ const BLOCKED_BY_ADMIN = "Blocked by Admin";
36
+ const IP_RANGE_BLOCKING = "IP Range Blocking";
37
+ const FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP = "Failed login attempts from new IP.";
38
+ const LOGGED_IN_FROM_NEW_IP = "Logged in from new IP.";
39
+ const ATTACK_LIMIT_EXCEEDED = "ale";
40
+ const RATE_LIMIT_EXCEEDED = "rle";
41
+ const RATE_LIMIT_EXCEEDED_CRAWLER_ATTACK= "rlecrawler";
42
+ const PLUGIN = 'plugin';
43
+ const THEMES = 'themes';
44
+ const WPFILES = 'wpfiles';
45
+ const DATABASE = 'db';
46
+ const CloudLockedOut ='https://faq.miniorange.com/knowledgebase/how-to-gain-access-to-my-website-if-i-get-locked-out/';
47
+ const OnPremiseLockedOut ='https://faq.miniorange.com/knowledgebase/i-am-locked-cant-access-my-account-what-do-i-do/';
48
+
49
+ public static $repo_status_code = array(-96 => 'Maximum execution time exceeded while downloading files from repository. Please contact miniOrange.', -97 => '<i>Uploads Folder</i> permission denied', -98 => '2 Factor authentication plugin unable to reach wordpress repository files. Please contact miniOrange.', -99 => 'Unable to download Wordpress, plugins and themes from Repository', -100 => 'Unable to unzip the Wordpress, plugins and themes');
50
+
51
+ public static $host = 'http://scanner.api.xecurify.com/malwareservice/rest/file/upload';
52
+
53
+ public static $hostname = 'scanner.api.xecurify.com';
54
+
55
+ public static $quick_scan_configuration = array('plugin_scan' => 1 ,
56
+ 'theme_scan' => 1,
57
+ 'core_scan' => 0,
58
+ 'file_extension' => "",
59
+ 'check_vulnerable' => 1,
60
+ 'check_sql' => 1,
61
+ 'check_rfi' => 1,
62
+ 'ext_link_check' => 0,
63
+ 'check_repo' => 0,
64
+ 'path_skip' => "",
65
+ 'type_scan' => "Quick Scan"
66
+ );
67
+ public static $standard_scan_configuration = array('plugin_scan' => 1 ,
68
+ 'theme_scan' => 1,
69
+ 'core_scan' => 0,
70
+ 'file_extension' => "",
71
+ 'check_vulnerable' => 1,
72
+ 'check_sql' => 1,
73
+ 'check_rfi' => 1,
74
+ 'ext_link_check' => 1,
75
+ 'check_repo' => 1,
76
+ 'path_skip' => "",
77
+ 'type_scan' => "Standard Scan"
78
+ );
79
+
80
+ function __construct()
81
+ {
82
+ $this->define_global();
83
+ }
84
+
85
+ function define_global()
86
+ {
87
+ global $wpnsDbQueries,$moWpnsUtility,$mo2f_dirName,$Mo2fdbQueries;
88
+ $wpnsDbQueries = new MoWpnsDB();
89
+ $moWpnsUtility = new MoWpnsUtility();
90
+ $mo2f_dirName = dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR;
91
+ $Mo2fdbQueries = new Mo2fDB();
92
+ }
93
+
94
+ }
95
+ new MoWpnsConstants;
96
+
97
  ?>
helper/curl.php CHANGED
@@ -1,284 +1,285 @@
1
- <?php
2
-
3
- class MocURL
4
- {
5
-
6
- public static function create_customer($email, $company, $password, $phone = '', $first_name = '', $last_name = '')
7
- {
8
- $url = MoWpnsConstants::HOST_NAME . '/moas/rest/customer/add';
9
- $fields = array (
10
- 'companyName' => $company,
11
- 'areaOfInterest' => 'WordPress 2 Factor Authentication Plugin',
12
- 'productInterest' => 'API_2FA',
13
- 'firstname' => $first_name,
14
- 'lastname' => $last_name,
15
- 'email' => $email,
16
- 'phone' => $phone,
17
- 'password' => $password
18
- );
19
- $json = json_encode($fields);
20
- $response = self::callAPI($url, $json);
21
- return $response;
22
- }
23
-
24
- public static function get_customer_key($email, $password)
25
- {
26
- $url = MoWpnsConstants::HOST_NAME. "/moas/rest/customer/key";
27
- $fields = array (
28
- 'email' => $email,
29
- 'password' => $password
30
- );
31
- $json = json_encode($fields);
32
- $response = self::callAPI($url, $json);
33
- return $response;
34
- }
35
-
36
- function submit_contact_us( $q_email, $q_phone, $query )
37
- {
38
- $current_user = wp_get_current_user();
39
- $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/contact-us";
40
-
41
- $is_nc_with_1_user = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' );
42
- $is_ec_with_1_user = ! get_option( 'mo2f_is_NC' );
43
- $onprem = MO2F_IS_ONPREM ?'O':'C';
44
-
45
- $customer_feature = "";
46
-
47
- if ( $is_ec_with_1_user ) {
48
- $customer_feature = "V1";
49
- }else if ( $is_nc_with_1_user ) {
50
- $customer_feature = "V3";
51
- }
52
- global $moWpnsUtility;
53
- $query = '[WordPress 2 Factor Authentication Plugin: ' .$onprem.$customer_feature . ' - V '.MO2F_VERSION.'- Ticket Id:'.$moWpnsUtility->getFeatureStatus().']: ' . $query;
54
-
55
- $fields = array(
56
- 'firstName' => $current_user->user_firstname,
57
- 'lastName' => $current_user->user_lastname,
58
- 'company' => $_SERVER['SERVER_NAME'],
59
- 'email' => $q_email,
60
- 'ccEmail' => '2fasupport@xecurify.com',
61
- 'phone' => $q_phone,
62
- 'query' => $query
63
- );
64
- $field_string = json_encode( $fields );
65
- $response = self::callAPI($url, $field_string);
66
-
67
- return true;
68
- }
69
-
70
- function lookupIP($ip)
71
- {
72
- $url = MoWpnsConstants::HOST_NAME. "/moas/rest/security/iplookup";
73
- $fields = array (
74
- 'ip' => $ip
75
- );
76
- $json = json_encode($fields);
77
- $response = self::callAPI($url, $json);
78
- return $response;
79
- }
80
- //CHECK
81
- function send_otp_token($auth_type, $phone, $email)
82
- {
83
-
84
- $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/challenge';
85
- $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
86
- $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
87
-
88
- $fields = array(
89
- 'customerKey' => $customerKey,
90
- 'email' => $email,
91
- 'phone' => $phone,
92
- 'authType' => $auth_type,
93
- 'transactionName' => 'miniOrange 2-Factor'
94
- );
95
- $json = json_encode($fields);
96
- $authHeader = $this->createAuthHeader($customerKey,$apiKey);
97
- $response = self::callAPI($url, $json, $authHeader);
98
- return $response;
99
- }
100
-
101
- function validate_recaptcha($ip,$response)
102
- {
103
- $url = MoWpnsConstants::RECAPTCHA_VERIFY;
104
- $json = "";
105
- $fields = array(
106
- 'response' => $response,
107
- 'secret' => get_option('mo_wpns_recaptcha_secret_key'),
108
- 'remoteip' => $ip
109
- );
110
- foreach($fields as $key=>$value) { $json .= $key.'='.$value.'&'; }
111
- rtrim($json, '&');
112
- $response = self::callAPI($url, $json, null);
113
- return $response;
114
- }
115
-
116
- function validate_otp_token($transactionId,$otpToken)
117
- {
118
- $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/validate';
119
- $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
120
- $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
121
-
122
- $fields = array(
123
- 'txId' => $transactionId,
124
- 'token' => $otpToken,
125
- );
126
-
127
- $json = json_encode($fields);
128
- $authHeader = $this->createAuthHeader($customerKey,$apiKey);
129
- $response = self::callAPI($url, $json, $authHeader);
130
- return $response;
131
- }
132
-
133
- function check_customer($email)
134
- {
135
- $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/check-if-exists";
136
- $fields = array(
137
- 'email' => $email,
138
- );
139
- $json = json_encode($fields);
140
- $response = self::callAPI($url, $json);
141
- return $response;
142
- }
143
-
144
- function mo_wpns_forgot_password()
145
- {
146
-
147
- $url = MoWpnsConstants::HOST_NAME . '/moas/rest/customer/password-reset';
148
- $email = get_option('mo2f_email');
149
- $customerKey = get_option('mo2f_customerKey');
150
- $apiKey = get_option('mo2f_api_key');
151
-
152
- $fields = array(
153
- 'email' => $email
154
- );
155
-
156
- $json = json_encode($fields);
157
- $authHeader = $this->createAuthHeader($customerKey,$apiKey);
158
- $response = self::callAPI($url, $json, $authHeader);
159
- return $response;
160
- }
161
-
162
- function send_notification($toEmail,$subject,$content,$fromEmail,$fromName,$toName)
163
- {
164
- $headers = "MIME-Version: 1.0" . "\r\n";
165
- $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
166
-
167
- $headers .= 'From: '.$fromName.'<'.$fromEmail.'>' . "\r\n";
168
-
169
- mail($toEmail,$subject,$content,$headers);
170
-
171
- return json_encode(array("status"=>'SUCCESS','statusMessage'=>'SUCCESS'));
172
- }
173
-
174
- //added for feedback
175
-
176
- function send_email_alert($email,$phone,$message,$feedback_option){
177
- global $moWpnsUtility;
178
- global $user;
179
- $url = MoWpnsConstants::HOST_NAME . '/moas/api/notify/send';
180
- $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
181
- $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
182
- $fromEmail = 'no-reply@xecurify.com';
183
- if ($feedback_option == 'mo_wpns_skip_feedback')
184
- {
185
- $subject = "Deactivate [Feedback Skipped]: WordPress miniOrange 2-Factor Plugin";
186
- }
187
- elseif ($feedback_option == 'mo_wpns_feedback')
188
- {
189
- $subject = "Feedback: WordPress miniOrange 2-Factor Plugin - ". $email;;
190
- }
191
- elseif ($feedback_option == 'mo_wpns_rating')
192
- {
193
- $subject = "Feedback: WordPress miniOrange 2-Factor Plugin - ". $email;;
194
- }
195
-
196
- $user = wp_get_current_user();
197
-
198
- $is_nc_with_1_user = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' );
199
- $is_ec_with_1_user = ! get_option( 'mo2f_is_NC' );
200
- $onprem = MO2F_IS_ONPREM ? 'O':'C';
201
-
202
- $customer_feature = "";
203
-
204
-
205
- if ( $is_ec_with_1_user ) {
206
- $customer_feature = "V1";
207
- }else if ( $is_nc_with_1_user ) {
208
- $customer_feature = "V3";
209
- }
210
-
211
- $query = '[WordPress 2 Factor Authentication Plugin: ' .$onprem.$customer_feature . ' - V '.MO2F_VERSION.']: ' . $message;
212
-
213
-
214
- $content='<div >Hello, <br><br>Ticket ID:'.$moWpnsUtility->getFeatureStatus().'<br><br>First Name :'.$user->user_firstname.'<br><br>Last Name :'.$user->user_lastname.' <br><br>Company :<a href="'.$_SERVER['SERVER_NAME'].'" target="_blank" >'.$_SERVER['SERVER_NAME'].'</a><br><br>Phone Number :'.$phone.'<br><br>Email :<a href="mailto:'.$email.'" target="_blank">'.$email.'</a><br><br>Query :'.$query.'</div>';
215
-
216
-
217
- $fields = array(
218
- 'customerKey' => $customerKey,
219
- 'sendEmail' => true,
220
- 'email' => array(
221
- 'customerKey' => $customerKey,
222
- 'fromEmail' => $fromEmail,
223
- 'fromName' => 'Xecurify',
224
- 'toEmail' => '2fasupport@xecurify.com',
225
- 'toName' => '2fasupport@xecurify.com',
226
- 'subject' => $subject,
227
- 'content' => $content
228
- ),
229
- );
230
- $field_string = json_encode($fields);
231
- $authHeader = $this->createAuthHeader($customerKey,$apiKey);
232
- $response = self::callAPI($url, $field_string,$authHeader);
233
- return $response;
234
-
235
- }
236
-
237
-
238
- private static function createAuthHeader($customerKey, $apiKey) {
239
- $currentTimestampInMillis = round(microtime(true) * 1000);
240
- $currentTimestampInMillis = number_format($currentTimestampInMillis, 0, '', '');
241
-
242
- $stringToHash = $customerKey . $currentTimestampInMillis . $apiKey;
243
- $authHeader = hash("sha512", $stringToHash);
244
-
245
- $header = array (
246
- "Content-Type: application/json",
247
- "Customer-Key: $customerKey",
248
- "Timestamp: $currentTimestampInMillis",
249
- "Authorization: $authHeader"
250
- );
251
- return $header;
252
- }
253
-
254
-
255
- private static function callAPI($url, $json_string, $headers = array("Content-Type: application/json")) {
256
- //For testing (0, false)
257
- //For Production (1, true)
258
-
259
- $sslhost=0;
260
- $sslpeer=false;
261
-
262
- $ch = curl_init($url);
263
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
264
- curl_setopt($ch, CURLOPT_ENCODING, "");
265
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
266
- curl_setopt($ch, CURLOPT_AUTOREFERER, true);
267
- curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslhost );
268
-
269
- curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslpeer );
270
- curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
271
- if(!is_null($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
272
- curl_setopt($ch, CURLOPT_POST, true);
273
- curl_setopt($ch, CURLOPT_POSTFIELDS, $json_string);
274
- $content = curl_exec($ch);
275
-
276
- if (curl_errno($ch)) {
277
- echo 'Request Error:' . curl_error($ch);
278
- exit();
279
- }
280
-
281
- curl_close($ch);
282
- return $content;
283
- }
284
- }
 
1
+ <?php
2
+
3
+ class MocURL
4
+ {
5
+
6
+ public static function create_customer($email, $company, $password, $phone = '', $first_name = '', $last_name = '')
7
+ {
8
+ $url = MoWpnsConstants::HOST_NAME . '/moas/rest/customer/add';
9
+ $fields = array (
10
+ 'companyName' => $company,
11
+ 'areaOfInterest' => 'WordPress 2 Factor Authentication Plugin',
12
+ 'productInterest' => 'API_2FA',
13
+ 'firstname' => $first_name,
14
+ 'lastname' => $last_name,
15
+ 'email' => $email,
16
+ 'phone' => $phone,
17
+ 'password' => $password
18
+ );
19
+ $json = json_encode($fields);
20
+ $response = self::callAPI($url, $json);
21
+ return $response;
22
+ }
23
+
24
+ public static function get_customer_key($email, $password)
25
+ {
26
+ $url = MoWpnsConstants::HOST_NAME. "/moas/rest/customer/key";
27
+ $fields = array (
28
+ 'email' => $email,
29
+ 'password' => $password
30
+ );
31
+ $json = json_encode($fields);
32
+ $response = self::callAPI($url, $json);
33
+
34
+ return $response;
35
+ }
36
+
37
+ function submit_contact_us( $q_email, $q_phone, $query )
38
+ {
39
+ $current_user = wp_get_current_user();
40
+ $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/contact-us";
41
+
42
+ $is_nc_with_1_user = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option');
43
+ $is_ec_with_1_user = ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
44
+ $onprem = MO2F_IS_ONPREM ?'O':'C';
45
+
46
+ $customer_feature = "";
47
+
48
+ if ( $is_ec_with_1_user ) {
49
+ $customer_feature = "V1";
50
+ }else if ( $is_nc_with_1_user ) {
51
+ $customer_feature = "V3";
52
+ }
53
+ global $moWpnsUtility;
54
+ $query = '[WordPress 2 Factor Authentication Plugin: ' .$onprem.$customer_feature . ' - V '.MO2F_VERSION.'- Ticket Id:'.$moWpnsUtility->getFeatureStatus().']: ' . $query;
55
+
56
+ $fields = array(
57
+ 'firstName' => $current_user->user_firstname,
58
+ 'lastName' => $current_user->user_lastname,
59
+ 'company' => $_SERVER['SERVER_NAME'],
60
+ 'email' => $q_email,
61
+ 'ccEmail' => '2fasupport@xecurify.com',
62
+ 'phone' => $q_phone,
63
+ 'query' => $query
64
+ );
65
+ $field_string = json_encode( $fields );
66
+ $response = self::callAPI($url, $field_string);
67
+
68
+ return true;
69
+ }
70
+
71
+ function lookupIP($ip)
72
+ {
73
+ $url = MoWpnsConstants::HOST_NAME. "/moas/rest/security/iplookup";
74
+ $fields = array (
75
+ 'ip' => $ip
76
+ );
77
+ $json = json_encode($fields);
78
+ $response = self::callAPI($url, $json);
79
+ return $response;
80
+ }
81
+ //CHECK
82
+ function send_otp_token($auth_type, $phone, $email)
83
+ {
84
+
85
+ $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/challenge';
86
+ $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
87
+ $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
88
+
89
+ $fields = array(
90
+ 'customerKey' => $customerKey,
91
+ 'email' => $email,
92
+ 'phone' => $phone,
93
+ 'authType' => $auth_type,
94
+ 'transactionName' => 'miniOrange 2-Factor'
95
+ );
96
+ $json = json_encode($fields);
97
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
98
+ $response = self::callAPI($url, $json, $authHeader);
99
+ return $response;
100
+ }
101
+
102
+ function validate_recaptcha($ip,$response)
103
+ {
104
+ $url = MoWpnsConstants::RECAPTCHA_VERIFY;
105
+ $json = "";
106
+ $fields = array(
107
+ 'response' => $response,
108
+ 'secret' => get_option('mo_wpns_recaptcha_secret_key'),
109
+ 'remoteip' => $ip
110
+ );
111
+ foreach($fields as $key=>$value) { $json .= $key.'='.$value.'&'; }
112
+ rtrim($json, '&');
113
+ $response = self::callAPI($url, $json, null);
114
+ return $response;
115
+ }
116
+
117
+ function validate_otp_token($transactionId,$otpToken)
118
+ {
119
+ $url = MoWpnsConstants::HOST_NAME . '/moas/api/auth/validate';
120
+ $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
121
+ $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
122
+
123
+ $fields = array(
124
+ 'txId' => $transactionId,
125
+ 'token' => $otpToken,
126
+ );
127
+
128
+ $json = json_encode($fields);
129
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
130
+ $response = self::callAPI($url, $json, $authHeader);
131
+ return $response;
132
+ }
133
+
134
+ function check_customer($email)
135
+ {
136
+ $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/check-if-exists";
137
+ $fields = array(
138
+ 'email' => $email,
139
+ );
140
+ $json = json_encode($fields);
141
+ $response = self::callAPI($url, $json);
142
+ return $response;
143
+ }
144
+
145
+ function mo_wpns_forgot_password()
146
+ {
147
+
148
+ $url = MoWpnsConstants::HOST_NAME . '/moas/rest/customer/password-reset';
149
+ $email = get_option('mo2f_email');
150
+ $customerKey = get_option('mo2f_customerKey');
151
+ $apiKey = get_option('mo2f_api_key');
152
+
153
+ $fields = array(
154
+ 'email' => $email
155
+ );
156
+
157
+ $json = json_encode($fields);
158
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
159
+ $response = self::callAPI($url, $json, $authHeader);
160
+ return $response;
161
+ }
162
+
163
+ function send_notification($toEmail,$subject,$content,$fromEmail,$fromName,$toName)
164
+ {
165
+ $headers = "MIME-Version: 1.0" . "\r\n";
166
+ $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
167
+
168
+ $headers .= 'From: '.$fromName.'<'.$fromEmail.'>' . "\r\n";
169
+
170
+ mail($toEmail,$subject,$content,$headers);
171
+
172
+ return json_encode(array("status"=>'SUCCESS','statusMessage'=>'SUCCESS'));
173
+ }
174
+
175
+ //added for feedback
176
+
177
+ function send_email_alert($email,$phone,$message,$feedback_option){
178
+ global $moWpnsUtility;
179
+ global $user;
180
+ $url = MoWpnsConstants::HOST_NAME . '/moas/api/notify/send';
181
+ $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
182
+ $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
183
+ $fromEmail = 'no-reply@xecurify.com';
184
+ if ($feedback_option == 'mo_wpns_skip_feedback')
185
+ {
186
+ $subject = "Deactivate [Feedback Skipped]: WordPress miniOrange 2-Factor Plugin";
187
+ }
188
+ elseif ($feedback_option == 'mo_wpns_feedback')
189
+ {
190
+ $subject = "Feedback: WordPress miniOrange 2-Factor Plugin - ". $email;;
191
+ }
192
+ elseif ($feedback_option == 'mo_wpns_rating')
193
+ {
194
+ $subject = "Feedback: WordPress miniOrange 2-Factor Plugin - ". $email;;
195
+ }
196
+
197
+ $user = wp_get_current_user();
198
+
199
+ $is_nc_with_1_user = MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option') && MoWpnsUtility::get_mo2f_db_option('mo2f_is_NNC', 'get_option');
200
+ $is_ec_with_1_user = ! MoWpnsUtility::get_mo2f_db_option('mo2f_is_NC', 'get_option');
201
+ $onprem = MO2F_IS_ONPREM ? 'O':'C';
202
+
203
+ $customer_feature = "";
204
+
205
+
206
+ if ( $is_ec_with_1_user ) {
207
+ $customer_feature = "V1";
208
+ }else if ( $is_nc_with_1_user ) {
209
+ $customer_feature = "V3";
210
+ }
211
+
212
+ $query = '[WordPress 2 Factor Authentication Plugin: ' .$onprem.$customer_feature . ' - V '.MO2F_VERSION.']: ' . $message;
213
+
214
+
215
+ $content='<div >Hello, <br><br>Ticket ID:'.$moWpnsUtility->getFeatureStatus().'<br><br>First Name :'.$user->user_firstname.'<br><br>Last Name :'.$user->user_lastname.' <br><br>Company :<a href="'.$_SERVER['SERVER_NAME'].'" target="_blank" >'.$_SERVER['SERVER_NAME'].'</a><br><br>Phone Number :'.$phone.'<br><br>Email :<a href="mailto:'.$email.'" target="_blank">'.$email.'</a><br><br>Query :'.$query.'</div>';
216
+
217
+
218
+ $fields = array(
219
+ 'customerKey' => $customerKey,
220
+ 'sendEmail' => true,
221
+ 'email' => array(
222
+ 'customerKey' => $customerKey,
223
+ 'fromEmail' => $fromEmail,
224
+ 'fromName' => 'Xecurify',
225
+ 'toEmail' => '2fasupport@xecurify.com',
226
+ 'toName' => '2fasupport@xecurify.com',
227
+ 'subject' => $subject,
228
+ 'content' => $content
229
+ ),
230
+ );
231
+ $field_string = json_encode($fields);
232
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
233
+ $response = self::callAPI($url, $field_string,$authHeader);
234
+ return $response;
235
+
236
+ }
237
+
238
+
239
+ private static function createAuthHeader($customerKey, $apiKey) {
240
+ $currentTimestampInMillis = round(microtime(true) * 1000);
241
+ $currentTimestampInMillis = number_format($currentTimestampInMillis, 0, '', '');
242
+
243
+ $stringToHash = $customerKey . $currentTimestampInMillis . $apiKey;
244
+ $authHeader = hash("sha512", $stringToHash);
245
+
246
+ $header = array (
247
+ "Content-Type: application/json",
248
+ "Customer-Key: $customerKey",
249
+ "Timestamp: $currentTimestampInMillis",
250
+ "Authorization: $authHeader"
251
+ );
252
+ return $header;
253
+ }
254
+
255
+
256
+ private static function callAPI($url, $json_string, $headers = array("Content-Type: application/json")) {
257
+ //For testing (0, false)
258
+ //For Production (2, true)
259
+
260
+ $sslhost=2;
261
+ $sslpeer=true;
262
+
263
+ $ch = curl_init($url);
264
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
265
+ curl_setopt($ch, CURLOPT_ENCODING, "");
266
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
267
+ curl_setopt($ch, CURLOPT_AUTOREFERER, true);
268
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslhost );
269
+
270
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslpeer );
271
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
272
+ if(!is_null($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
273
+ curl_setopt($ch, CURLOPT_POST, true);
274
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $json_string);
275
+ $content = curl_exec($ch);
276
+
277
+ if (curl_errno($ch)) {
278
+ echo 'Request Error:' . curl_error($ch);
279
+ exit();
280
+ }
281
+
282
+ curl_close($ch);
283
+ return $content;
284
+ }
285
+ }
helper/dashboard_security_notification.php CHANGED
@@ -1,264 +1,270 @@
1
- <?php
2
-
3
- class miniorange_security_notification{
4
-
5
-
6
- function my_custom_dashboard_widgets() {
7
- global $wp_meta_boxes;
8
-
9
- wp_add_dashboard_widget('custom_help_widget', 'MiniOrange Website Security',array($this, 'custom_dashboard_help'));
10
- }
11
-
12
- function custom_dashboard_help() {
13
-
14
- global $wpdb,$type_of_scan,$total_scanned_files, $wpnsDbQueries;
15
-
16
-
17
-
18
- $fake_domains = get_site_option('number_of_fake_reg');
19
- if($fake_domains == false){
20
- $fake_domains = 0;
21
- }
22
- $failed_transaction = $wpnsDbQueries->get_count_of_attacks_blocked();
23
- $weakPass = get_site_option('users_with_weak_pass');
24
- if($weakPass == false){
25
- $weakPass = 0;
26
- }
27
-
28
- $array = $wpdb->get_results("SELECT MAX(id) as id FROM ".$wpdb->base_prefix.'wpns_malware_scan_report');
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;
41
- }
42
- if($type_of_scan === null)
43
- $type_of_scan ='Not Scanned Yet';
44
-
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
- {
68
- echo "<html>
69
- <head>
70
- <style>
71
-
72
-
73
- p{
74
- margin:0px;
75
-
76
- </style>
77
- </head>
78
-
79
- <div style='width:100%;background-color:#555f5f;padding-top:10px;''>
80
- <div style='font-size:25px;color:white;text-align:center'>
81
- <strong style='font-weight:300;color:red;'>Remaining Transactions</strong>
82
- </div>";
83
-
84
- $EmailTransactions = get_site_option('cmVtYWluaW5nT1RQ')? get_site_option('cmVtYWluaW5nT1RQ') : 0;
85
- $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
86
- // $color_tras_sms = $SMSTransactions <= 2 ? 'red' : '#17ede9';
87
- // $color_tras_email = $EmailTransactions <= 2 ? 'red' : '#17ede9';
88
-
89
- $color_tras_sms = 'white';
90
- $color_tras_email = 'white';
91
-
92
- echo '<table border="1" style="background-color:#FFFFFF; border:1px solid #CCCCCC; border-collapse: collapse; padding:0px 0px 0px 10px; margin:2px; width:99%">
93
- <tr>
94
- <td style="width:45%; padding: 10px;background-color:white">Remaining SMS transactions</td>
95
- <td style="width:15%; padding: 10px;background-color:'.$color_tras_sms.'">'.$SMSTransactions.'</td>
96
- </tr>
97
- <tr>
98
- <td style="width:45%; padding: 10px;background-color:white">Remaining Email transactions</td>
99
- <td style="width:15%; padding: 10px;background-color:'.$color_tras_email.'">'.$EmailTransactions.'</td>
100
- </tr>
101
-
102
- </table><br>';
103
-
104
-
105
-
106
- echo "</div>
107
-
108
- <br><br>
109
- ";
110
-
111
- if(get_option("mo_wpns_2fa_with_network_security"))
112
- {
113
-
114
- echo "
115
-
116
- <div style='width:100%;background-color:#555f5f;padding-top:10px;''>
117
- <div style='font-size:25px;color:white;text-align:center'>
118
- <strong style='font-weight:300;''>Last Scan Result <span style='color:orange;'>[". $type_of_scan."]</span></strong>
119
- </div>
120
- <hr>
121
- <div>
122
- <table>
123
- <tbody>
124
-
125
- <tr>
126
- <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'>
127
- <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
128
- <tbody>
129
-
130
-
131
- <tr>
132
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>".$last_scan_malicious_count[0]->total."</strong></td>
133
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$total_malicious_count[0]->total."</strong></td>
134
-
135
-
136
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$total_scanned_files."</strong></td>
137
-
138
-
139
- </tr>
140
-
141
- <tr><td>&nbsp;</td><td></td></tr>
142
- <tr>
143
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Current Infected Files </strong></td>
144
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Total Infected Files Found</strong></td>
145
-
146
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Total Files Scanned</strong></td>
147
-
148
- </tr>
149
- </tbody>
150
- </table>
151
- </tr>
152
- </tbody>
153
- </table>
154
- </div>
155
- </div>
156
-
157
- ";
158
-
159
- echo '<a class="button button-primary" style="background-color:#f0a702;width:100%;text-align:center;" href="admin.php?page=mo_2fa_malwarescan&tab=default&view='.$latest_id.'"><h3 style="background-color:#f0a702">View Details</h3></a>';
160
-
161
- echo "<br><br><br>";
162
-
163
- echo "<div style='width:100%;background-color:#555f5f;padding-top:10px;'>
164
- <div style='font-size:25px;color:white;text-align:center'>
165
- <strong style='font-weight:300;'>Login and Spam<span style='color:orange;'>[ On your Website ]</span></strong>
166
- </div>
167
- <div>
168
- <table>
169
- <tbody>
170
-
171
- <tr>
172
- <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'>
173
- <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
174
- <tbody>
175
- <tr>
176
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>".$failed_transaction."</strong></td>
177
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$weakPass."</strong></td>
178
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$fake_domains."</strong></td>
179
-
180
-
181
- </tr>
182
-
183
- <tr>
184
- <td>&nbsp;
185
- </td>
186
- <td>
187
- </td>
188
- </tr>
189
- <tr>
190
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Login Attempts Failed</strong></td>
191
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Users with weak passwords</strong></td>
192
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Fake Domain Registerations</strong></td>
193
-
194
-
195
- </tr>
196
- </tbody>
197
- </table>
198
-
199
- </tr>
200
- </tbody>
201
- </table>
202
- </div>
203
- <a class='button button-primary' style='background-color:#f0a702;width:100%;text-align:center' href='admin.php?page=mo_2fa_login_and_spam&tab=default&view==".$latest_id."'><h3 style='background-color:#f0a702'>View Details</h3></a>
204
- </div>";
205
-
206
- echo '<br><br>';
207
-
208
- echo "<div style='width:100%;background-color:#555f5f;padding-top:10px;'>
209
- <div style='font-size:20px;color:white;text-align:center'>
210
- <strong style='font-weight:300;'>Backup <span style='color:orange;'>[".$last_backup." ]</span></strong>
211
- </div>
212
- <hr>
213
- <div>
214
- <table>
215
- <tbody>
216
-
217
- <tr>
218
- <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'>
219
- <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
220
- <tbody>
221
- <tr>
222
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>".$array['plugin_count']."</strong></td>
223
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$array['themes_count']."</strong></td>
224
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$array['wp_files_count']."</strong></td>
225
- <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$array['db_count']."</strong></td>
226
-
227
- </tr>
228
-
229
- <tr>
230
- <td>&nbsp;
231
- </td>
232
- <td>
233
- </td>
234
- </tr>
235
- <tr>
236
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Plugin Backup</strong></td>
237
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Themes Backup</strong></td>
238
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>WP File Backup</strong></td>
239
- <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Database Backup</strong></td>
240
-
241
- </tr>
242
- </tbody>
243
- </table>
244
-
245
- </tr>
246
- </tbody>
247
- </table>
248
- </div>
249
-
250
- <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>
251
- </div>";
252
-
253
-
254
- }
255
-
256
- }
257
-
258
-
259
-
260
- }
261
-
262
- }
263
-
264
- ?>
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class miniorange_security_notification{
4
+
5
+
6
+ function my_custom_dashboard_widgets() {
7
+ global $wp_meta_boxes;
8
+
9
+ wp_add_dashboard_widget('custom_help_widget', 'MiniOrange Website Security',array($this, 'custom_dashboard_help'));
10
+ }
11
+
12
+ function custom_dashboard_help() {
13
+
14
+ global $wpdb,$type_of_scan,$total_scanned_files, $wpnsDbQueries;
15
+
16
+
17
+
18
+ $fake_domains = get_site_option('number_of_fake_reg');
19
+ if($fake_domains == false){
20
+ $fake_domains = 0;
21
+ }
22
+ $failed_transaction = $wpnsDbQueries->get_count_of_attacks_blocked();
23
+ $weakPass = get_site_option('users_with_weak_pass');
24
+ if($weakPass == false){
25
+ $weakPass = 0;
26
+ }
27
+
28
+ $array = $wpdb->get_results("SELECT MAX(id) as id FROM ".$wpdb->base_prefix.'wpns_malware_scan_report');
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;
41
+ }
42
+ if($type_of_scan === null)
43
+ $type_of_scan ='Not Scanned Yet';
44
+
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
+ {
68
+ echo "<html>
69
+ <head>
70
+ <style>
71
+
72
+
73
+ p{
74
+ margin:0px;
75
+
76
+ </style>
77
+ </head>
78
+
79
+ <div style='width:100%;background-color:#555f5f;padding-top:10px;''>
80
+ <div style='font-size:25px;color:white;text-align:center'>
81
+ <strong style='font-weight:300;''>Remaining Transactions <span style='color:orange;'>[OTPs]</strong>
82
+
83
+ </div>
84
+ <hr>
85
+
86
+ ";
87
+
88
+ $EmailTransactions = MoWpnsUtility::get_mo2f_db_option('cmVtYWluaW5nT1RQ', 'site_option');
89
+ $EmailTransactions = $EmailTransactions? $EmailTransactions : 0;
90
+ $SMSTransactions = get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z')?get_site_option('cmVtYWluaW5nT1RQVHJhbnNhY3Rpb25z'):0;
91
+
92
+ $color_tras_sms = 'white';
93
+ $color_tras_email = 'white';
94
+
95
+ echo '<table style="solid #CCCCCC; border-collapse: collapse; padding:0px 0px 0px 10px; margin:2px; width:99%">
96
+ <tr>
97
+ <td style="font-size:18px;color:#ffffff;padding: 10px;"><strong style="font-weight:300;">Remaining SMS transactions </strong></td>
98
+ <td style="text-align:center;font-size:36px;color:#ffffff;font-weight:400" ><strong>'.$SMSTransactions.'</strong></td>
99
+
100
+ </tr>
101
+ <tr>
102
+ <td style="font-size:18px;color:#ffffff;padding: 10px;"><strong style="font-weight:300;">Remaining Email transactions </strong></td>
103
+ <td style="text-align:center;font-size:36px;color:#ffffff;font-weight:400" ><strong>'.$EmailTransactions.'</strong></td>
104
+
105
+
106
+ </tr>
107
+
108
+ </table><br>';
109
+
110
+
111
+
112
+ echo "</div>
113
+
114
+ <br><br>
115
+ ";
116
+
117
+ if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
118
+ {
119
+
120
+ echo "
121
+
122
+ <div style='width:100%;background-color:#555f5f;padding-top:10px;''>
123
+ <div style='font-size:25px;color:white;text-align:center'>
124
+ <strong style='font-weight:300;''>Last Scan Result <span style='color:orange;'>[". $type_of_scan."]</span></strong>
125
+ </div>
126
+ <hr>
127
+ <div>
128
+ <table>
129
+ <tbody>
130
+
131
+ <tr>
132
+ <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'>
133
+ <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
134
+ <tbody>
135
+
136
+
137
+ <tr>
138
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>".$last_scan_malicious_count[0]->total."</strong></td>
139
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$total_malicious_count[0]->total."</strong></td>
140
+
141
+
142
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$total_scanned_files."</strong></td>
143
+
144
+
145
+ </tr>
146
+
147
+ <tr><td>&nbsp;</td><td></td></tr>
148
+ <tr>
149
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Current Infected Files </strong></td>
150
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Total Infected Files Found</strong></td>
151
+
152
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Total Files Scanned</strong></td>
153
+
154
+ </tr>
155
+ </tbody>
156
+ </table>
157
+ </tr>
158
+ </tbody>
159
+ </table>
160
+ </div>
161
+ </div>
162
+
163
+ ";
164
+
165
+ echo '<a class="button button-primary" style="background-color:#f0a702;width:100%;text-align:center;" href="admin.php?page=mo_2fa_malwarescan&tab=default&view='.$latest_id.'"><h3 style="background-color:#f0a702">View Details</h3></a>';
166
+
167
+ echo "<br><br><br>";
168
+
169
+ echo "<div style='width:100%;background-color:#555f5f;padding-top:10px;'>
170
+ <div style='font-size:25px;color:white;text-align:center'>
171
+ <strong style='font-weight:300;'>Login and Spam<span style='color:orange;'>[ On your Website ]</span></strong>
172
+ </div>
173
+ <div>
174
+ <table>
175
+ <tbody>
176
+
177
+ <tr>
178
+ <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'>
179
+ <table dir='ltr' style='table-layout:fixed;margin:10px 0 20px 0;padding:0;vertical-align:top;width:100%'>
180
+ <tbody>
181
+ <tr>
182
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400' ><strong>".$failed_transaction."</strong></td>
183
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$weakPass."</strong></td>
184
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$fake_domains."</strong></td>
185
+
186
+
187
+ </tr>
188
+
189
+ <tr>
190
+ <td>&nbsp;
191
+ </td>
192
+ <td>
193
+ </td>
194
+ </tr>
195
+ <tr>
196
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Login Attempts Failed</strong></td>
197
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Users with weak passwords</strong></td>
198
+ <td style='font-size:18px;color:#ffffff;text-align:center'><strong style='font-weight:300;'>Fake Domain Registerations</strong></td>
199
+
200
+
201
+ </tr>
202
+ </tbody>
203
+ </table>
204
+
205
+ </tr>
206
+ </tbody>
207
+ </table>
208
+ </div>
209
+ <a class='button button-primary' style='background-color:#f0a702;width:100%;text-align:center' href='admin.php?page=mo_2fa_login_and_spam&tab=default&view==".$latest_id."'><h3 style='background-color:#f0a702'>View Details</h3></a>
210
+ </div>";
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;'>[".$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>".$array['plugin_count']."</strong></td>
229
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$array['themes_count']."</strong></td>
230
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$array['wp_files_count']."</strong></td>
231
+ <td style='text-align:center;font-size:36px;color:#ffffff;font-weight:400'><strong>".$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
+
264
+
265
+
266
+ }
267
+
268
+ }
269
+
270
+ ?>
helper/mo_twofa_sessions.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if(! defined( 'ABSPATH' )) exit;
4
+
5
+ class TwoFAMoSessions
6
+ {
7
+ static function addSessionVar($key, $val)
8
+ {
9
+ switch (MO2F_SESSION_TYPE) {
10
+ case 'TRANSIENT':
11
+ if (!isset($_COOKIE["transient_key"])) {
12
+ if (!wp_cache_get("transient_key")) {
13
+ $transient_key = MoWpnsUtility::rand();
14
+ if (ob_get_contents()) ob_clean();
15
+ setcookie('transient_key', $transient_key, time() + 12 * HOUR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
16
+ wp_cache_add('transient_key', $transient_key);
17
+ } else {
18
+ $transient_key = wp_cache_get("transient_key");
19
+ }
20
+ } else {
21
+ $transient_key = $_COOKIE["transient_key"];
22
+ }
23
+ set_site_transient($transient_key . $key, $val, 12 * HOUR_IN_SECONDS);
24
+ break;
25
+ }
26
+ }
27
+
28
+ static function getSessionVar($key)
29
+ {
30
+ switch(MO2F_SESSION_TYPE)
31
+ {
32
+ case 'TRANSIENT':
33
+ $transient_key = isset($_COOKIE["transient_key"])
34
+ ? $_COOKIE["transient_key"] : wp_cache_get("transient_key");
35
+ return get_site_transient( $transient_key.$key );
36
+ }
37
+ }
38
+
39
+ static function unsetSession($key)
40
+ {
41
+ switch(MO2F_SESSION_TYPE)
42
+ {
43
+ case 'TRANSIENT':
44
+ $transient_key = isset($_COOKIE["transient_key"])
45
+ ? $_COOKIE["transient_key"] : wp_cache_get("transient_key");
46
+ if(!MoWpnsUtility::check_empty_or_null($transient_key)) {
47
+ delete_site_transient($transient_key . $key);
48
+ }
49
+ break;
50
+ }
51
+ }
52
+
53
+ }
helper/pluginUtility.php CHANGED
@@ -70,6 +70,11 @@ class MoWpnsHandler
70
 
71
  return $ip_count;
72
  }
 
 
 
 
 
73
  function get_blocked_ips()
74
  {
75
  global $wpnsDbQueries;
@@ -135,7 +140,7 @@ class MoWpnsHandler
135
 
136
  //send notification
137
  global $moWpnsUtility;
138
- if(get_option('mo_wpns_enable_ip_blocked_email_to_admin'))
139
  $moWpnsUtility->sendIpBlockedNotification($ipAddress,MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED);
140
 
141
  }
70
 
71
  return $ip_count;
72
  }
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
  {
80
  global $wpnsDbQueries;
140
 
141
  //send notification
142
  global $moWpnsUtility;
143
+ if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_enable_ip_blocked_email_to_admin', 'get_option'))
144
  $moWpnsUtility->sendIpBlockedNotification($ipAddress,MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED);
145
 
146
  }
helper/plugins.php CHANGED
@@ -1,103 +1,103 @@
1
- <?php
2
-
3
- class FeaturePluginInterface
4
- {
5
- function __construct()
6
- {
7
- if ( ! function_exists( 'get_plugins' ) )
8
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
9
- }
10
- }
11
-
12
-
13
- class TwoFAPlugin extends FeaturePluginInterface
14
- {
15
-
16
- function getstatus()
17
- {
18
- $all_plugins = get_plugins();
19
- $status = 'NOT_INSTALLED';
20
- if(isset($all_plugins[MoWpnsConstants::TWO_FACTOR_SETTINGS]))
21
- $status = is_plugin_active(MoWpnsConstants::TWO_FACTOR_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
22
- return $status;
23
- }
24
-
25
-
26
- function updatePluginConfiguration()
27
- {
28
- if(!get_option('mo_wpns_enable_2fa'))
29
- return;
30
-
31
- if(!get_option( 'mo2f_customerKey') || !get_option( 'mo2f_api_key') || !get_option( 'mo2f_customer_token') || !get_option( 'mo2f_app_secret'))
32
- {
33
- global $mo2f_dirName;
34
- $current_user = wp_get_current_user();
35
- $mo2fa = new Two_Factor_Setup();
36
- update_option( 'mo2f_email' ,get_option( 'mo2f_email'));
37
- update_option( 'mo2f_host_name' ,MoWpnsConstants::HOST_NAME);
38
- update_option( 'mo2f_phone' ,get_option( 'mo_wpns_admin_phone'));
39
- update_option( 'mo2f_customerKey' ,get_option( 'mo2f_customerKey'));
40
- update_option( 'mo2f_api_key' ,get_option( 'mo2f_api_key'));
41
- update_option( 'mo2f_customer_token' ,get_option( 'mo2f_customer_token'));
42
- update_option( 'mo2f_app_secret' ,get_option( 'mo2f_app_secret'));
43
- update_option( 'mo2f_miniorange_admin' ,$current_user->ID);
44
- update_option( 'mo2f_new_customer' ,true);
45
-
46
- update_option( 'mo_2factor_admin_registration_status','MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS');
47
- update_user_meta($current_user->ID,'mo_2factor_user_registration_with_miniorange','SUCCESS');
48
- update_user_meta($current_user->ID,'mo_2factor_map_id_with_email',get_option( 'mo2f_email'));
49
- update_user_meta($current_user->ID,'mo_2factor_user_registration_status','MO_2_FACTOR_PLUGIN_SETTINGS');
50
- $mo2fa->mo2f_update_userinfo(get_user_meta($current_user->ID,'mo_2factor_map_id_with_email',true), 'OUT OF BAND EMAIL',null,'API_2FA',true);
51
- update_user_meta($current_user->ID,'mo2f_email_verification_status',true);
52
- }
53
- }
54
- }
55
-
56
-
57
- class OTPPlugin extends FeaturePluginInterface
58
- {
59
- function getstatus()
60
- {
61
- $all_plugins = get_plugins();
62
- $status = 'NOT_INSTALLED';
63
- if(isset($all_plugins[MoWpnsConstants::OTP_VERIFICATION_SETTINGS]))
64
- $status = is_plugin_active(MoWpnsConstants::OTP_VERIFICATION_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
65
- return $status;
66
- }
67
-
68
- function updatePluginConfiguration()
69
- {
70
- if(!get_option('mo_wpns_enable_advanced_user_verification'))
71
- return;
72
-
73
- if(!get_option( 'mo_customer_validation_admin_email') || !get_option( 'mo_customer_validation_admin_customer_key') || !get_option( 'mo_customer_validation_admin_api_key') || !get_option( 'mo_customer_validation_customer_token'))
74
- {
75
- update_option( 'mo_customer_validation_wp_default_enable' ,1);
76
- update_option( 'mo_customer_validation_admin_email' ,get_option( 'mo2f_email'));
77
- update_option( 'mo_customer_validation_admin_phone' ,get_option( 'mo_wpns_admin_phone'));
78
- update_option( 'mo_customer_validation_admin_customer_key' ,get_option( 'mo2f_customerKey') );
79
- update_option( 'mo_customer_validation_admin_api_key' ,get_option( 'mo2f_api_key') );
80
- update_option( 'mo_customer_validation_customer_token' ,get_option( 'mo2f_customer_token') );
81
- update_option( 'mo_customer_validation_admin_password' ,'');
82
- update_option( 'mo_customer_validation_message' ,'Registration complete!');
83
- update_option( 'mo_customer_validation_registration_status' ,'MO_CUSTOMER_VALIDATION_REGISTRATION_COMPLETE');
84
- update_option( 'mo_customer_email_transactions_remaining' ,10);
85
- update_option( 'mo_customer_phone_transactions_remaining' ,10);
86
- update_option( 'mo_otp_plugin_version' ,1.8);
87
- }
88
- }
89
-
90
- }
91
-
92
-
93
- class SocialPlugin extends FeaturePluginInterface
94
- {
95
- function getstatus()
96
- {
97
- $all_plugins = get_plugins();
98
- $status = 'NOT_INSTALLED';
99
- if(isset($all_plugins[MoWpnsConstants::SOCIAL_LOGIN_SETTINGS]))
100
- $status = is_plugin_active(MoWpnsConstants::SOCIAL_LOGIN_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
101
- return $status;
102
- }
103
  }
1
+ <?php
2
+
3
+ class FeaturePluginInterface
4
+ {
5
+ function __construct()
6
+ {
7
+ if ( ! function_exists( 'get_plugins' ) )
8
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
9
+ }
10
+ }
11
+
12
+
13
+ class TwoFAPlugin extends FeaturePluginInterface
14
+ {
15
+
16
+ function getstatus()
17
+ {
18
+ $all_plugins = get_plugins();
19
+ $status = 'NOT_INSTALLED';
20
+ if(isset($all_plugins[MoWpnsConstants::TWO_FACTOR_SETTINGS]))
21
+ $status = is_plugin_active(MoWpnsConstants::TWO_FACTOR_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
22
+ return $status;
23
+ }
24
+
25
+
26
+ function updatePluginConfiguration()
27
+ {
28
+ if(!get_option('mo_wpns_enable_2fa'))
29
+ return;
30
+
31
+ if(!get_option( 'mo2f_customerKey') || !get_option( 'mo2f_api_key') || !get_option( 'mo2f_customer_token') || !get_option( 'mo2f_app_secret'))
32
+ {
33
+ global $mo2f_dirName;
34
+ $current_user = wp_get_current_user();
35
+ $mo2fa = new Two_Factor_Setup();
36
+ update_option( 'mo2f_email' ,get_option( 'mo2f_email'));
37
+ update_option( 'mo2f_host_name' ,MoWpnsConstants::HOST_NAME);
38
+ update_option( 'mo2f_phone' ,get_option( 'mo_wpns_admin_phone'));
39
+ update_option( 'mo2f_customerKey' ,get_option( 'mo2f_customerKey'));
40
+ update_option( 'mo2f_api_key' ,get_option( 'mo2f_api_key'));
41
+ update_option( 'mo2f_customer_token' ,get_option( 'mo2f_customer_token'));
42
+ update_option( 'mo2f_app_secret' ,get_option( 'mo2f_app_secret'));
43
+ update_option( 'mo2f_miniorange_admin' ,$current_user->ID);
44
+ update_option( 'mo2f_new_customer' ,true);
45
+
46
+ update_option( 'mo_2factor_admin_registration_status','MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS');
47
+ update_user_meta($current_user->ID,'mo_2factor_user_registration_with_miniorange','SUCCESS');
48
+ update_user_meta($current_user->ID,'mo_2factor_map_id_with_email',get_option( 'mo2f_email'));
49
+ update_user_meta($current_user->ID,'mo_2factor_user_registration_status','MO_2_FACTOR_PLUGIN_SETTINGS');
50
+ $mo2fa->mo2f_update_userinfo(get_user_meta($current_user->ID,'mo_2factor_map_id_with_email',true), 'OUT OF BAND EMAIL',null,'API_2FA',true);
51
+ update_user_meta($current_user->ID,'mo2f_email_verification_status',true);
52
+ }
53
+ }
54
+ }
55
+
56
+
57
+ class OTPPlugin extends FeaturePluginInterface
58
+ {
59
+ function getstatus()
60
+ {
61
+ $all_plugins = get_plugins();
62
+ $status = 'NOT_INSTALLED';
63
+ if(isset($all_plugins[MoWpnsConstants::OTP_VERIFICATION_SETTINGS]))
64
+ $status = is_plugin_active(MoWpnsConstants::OTP_VERIFICATION_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
65
+ return $status;
66
+ }
67
+
68
+ function updatePluginConfiguration()
69
+ {
70
+ if(!get_option('mo_wpns_enable_advanced_user_verification'))
71
+ return;
72
+
73
+ if(!get_option( 'mo_customer_validation_admin_email') || !get_option( 'mo_customer_validation_admin_customer_key') || !get_option( 'mo_customer_validation_admin_api_key') || !get_option( 'mo_customer_validation_customer_token'))
74
+ {
75
+ update_option( 'mo_customer_validation_wp_default_enable' ,1);
76
+ update_option( 'mo_customer_validation_admin_email' ,get_option( 'mo2f_email'));
77
+ update_option( 'mo_customer_validation_admin_phone' ,get_option( 'mo_wpns_admin_phone'));
78
+ update_option( 'mo_customer_validation_admin_customer_key' ,get_option( 'mo2f_customerKey') );
79
+ update_option( 'mo_customer_validation_admin_api_key' ,get_option( 'mo2f_api_key') );
80
+ update_option( 'mo_customer_validation_customer_token' ,get_option( 'mo2f_customer_token') );
81
+ update_option( 'mo_customer_validation_admin_password' ,'');
82
+ update_option( 'mo_customer_validation_message' ,'Registration complete!');
83
+ update_option( 'mo_customer_validation_registration_status' ,'MO_CUSTOMER_VALIDATION_REGISTRATION_COMPLETE');
84
+ update_option( 'mo_customer_email_transactions_remaining' ,10);
85
+ update_option( 'mo_customer_phone_transactions_remaining' ,10);
86
+ update_option( 'mo_otp_plugin_version' ,1.8);
87
+ }
88
+ }
89
+
90
+ }
91
+
92
+
93
+ class SocialPlugin extends FeaturePluginInterface
94
+ {
95
+ function getstatus()
96
+ {
97
+ $all_plugins = get_plugins();
98
+ $status = 'NOT_INSTALLED';
99
+ if(isset($all_plugins[MoWpnsConstants::SOCIAL_LOGIN_SETTINGS]))
100
+ $status = is_plugin_active(MoWpnsConstants::SOCIAL_LOGIN_SETTINGS) ? 'ACTIVE' : 'INSTALLED';
101
+ return $status;
102
+ }
103
  }
helper/utility.php CHANGED
@@ -38,6 +38,17 @@ class MoWpnsUtility
38
  return true;
39
  return false;
40
  }
 
 
 
 
 
 
 
 
 
 
 
41
 
42
  public static function is_curl_installed()
43
  {
@@ -91,7 +102,7 @@ class MoWpnsUtility
91
 
92
  public static function check_if_strong_password_enabled_for_user_role($userroles)
93
  {
94
- $enforce_strong_pass = get_option('mo2f_enforce_strong_passswords_for_accounts');
95
 
96
  switch($enforce_strong_pass)
97
  {
@@ -148,11 +159,8 @@ class MoWpnsUtility
148
  else
149
  $content = $this->getMessageContent($reason,$ipAddress);
150
 
151
- // $mocURL = new MocURL();
152
-
153
  if(isset($content))
154
  return $this->wp_mail_send_notification($toEmail,$subject,$content);
155
- // return $mocURL->send_notification($toEmail,$subject,$content,MoWpnsConstants::SUPPORT_EMAIL,'miniOrange','Admin');
156
  }
157
 
158
  function wp_mail_send_notification($toEmail,$subject,$content){
@@ -194,9 +202,6 @@ class MoWpnsUtility
194
  else
195
  $content = $this->getMessageContent($reason,$ipAddress,$username,$fromEmail);
196
 
197
- // $mocURL = new MocURL();
198
- // return $mocURL->send_notification($toEmail,$subject,$content,$fromEmail,get_bloginfo(),$username);
199
-
200
  $mo_wpns_config->audit_email_notification_sent_to_user($username,$ipAddress,$reason);
201
  $status = $this->wp_mail_send_notification($toEmail,$subject,$content,$fromEmail);
202
  return $status;
@@ -284,7 +289,7 @@ class MoWpnsUtility
284
  $status.="F1";
285
  if(get_site_option('mo2f_visit_login_and_spam'))
286
  $status.="LS1";
287
- if(get_site_option('mo2f_enable_brute_force'))
288
  $status.="BF1";
289
  if(get_site_option('mo2f_visit_malware'))
290
  $status.="M1";
@@ -314,5 +319,14 @@ class MoWpnsUtility
314
  return $installed;
315
 
316
  }
 
 
 
 
 
 
 
 
 
317
 
318
  }
38
  return true;
39
  return false;
40
  }
41
+
42
+ public static function rand()
43
+ {
44
+ $length = wp_rand(0, 15);
45
+ $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
46
+ $randomString = '';
47
+ for ($i = 0; $i < $length; $i++) {
48
+ $randomString .= $characters[wp_rand(0, strlen($characters) - 1)];
49
+ }
50
+ return $randomString;
51
+ }
52
 
53
  public static function is_curl_installed()
54
  {
102
 
103
  public static function check_if_strong_password_enabled_for_user_role($userroles)
104
  {
105
+ $enforce_strong_pass = MoWpnsUtility::get_mo2f_db_option('mo2f_enforce_strong_passswords_for_accounts', 'get_option');
106
 
107
  switch($enforce_strong_pass)
108
  {
159
  else
160
  $content = $this->getMessageContent($reason,$ipAddress);
161
 
 
 
162
  if(isset($content))
163
  return $this->wp_mail_send_notification($toEmail,$subject,$content);
 
164
  }
165
 
166
  function wp_mail_send_notification($toEmail,$subject,$content){
202
  else
203
  $content = $this->getMessageContent($reason,$ipAddress,$username,$fromEmail);
204
 
 
 
 
205
  $mo_wpns_config->audit_email_notification_sent_to_user($username,$ipAddress,$reason);
206
  $status = $this->wp_mail_send_notification($toEmail,$subject,$content,$fromEmail);
207
  return $status;
289
  $status.="F1";
290
  if(get_site_option('mo2f_visit_login_and_spam'))
291
  $status.="LS1";
292
+ if(MoWpnsUtility::get_mo2f_db_option('mo2f_enable_brute_force', 'get_option'))
293
  $status.="BF1";
294
  if(get_site_option('mo2f_visit_malware'))
295
  $status.="M1";
319
  return $installed;
320
 
321
  }
322
+
323
+ public static function get_mo2f_db_option($value, $type){
324
+ if($type == 'site_option'){
325
+ $db_value = get_site_option($value, $GLOBALS[$value]);
326
+ }else{
327
+ $db_value = get_option($value, $GLOBALS[$value]);
328
+ }
329
+ return $db_value;
330
+ }
331
 
332
  }
includes/css/bootstrap.min.css CHANGED
@@ -1,5735 +1,5735 @@
1
- .mo2f_carousel {
2
-
3
-
4
- position: relative;
5
-
6
-
7
- padding-bottom: 18px !important;
8
-
9
-
10
-
11
-
12
-
13
- }
14
-
15
-
16
-
17
-
18
-
19
- .mo2f_carousel-inner {
20
-
21
-
22
- position: relative;
23
-
24
-
25
- width: 100%;
26
-
27
-
28
- overflow: hidden;
29
-
30
-
31
-
32
-
33
-
34
- }
35
-
36
-
37
-
38
-
39
-
40
- .mo2f_carousel-inner > .item {
41
-
42
-
43
- position: relative;
44
-
45
-
46
- display: none;
47
-
48
-
49
- -webkit-transition: .6s ease-in-out left;
50
-
51
-
52
- -o-transition: .6s ease-in-out left;
53
-
54
-
55
- transition: .6s ease-in-out left;
56
-
57
-
58
- height: 300px !important;
59
-
60
-
61
-
62
-
63
-
64
- }
65
-
66
-
67
-
68
-
69
-
70
- .mo2f_carousel-inner > .item > img, .mo2f_carousel-inner > .item > a > img {
71
-
72
-
73
- line-height: 1;
74
-
75
-
76
-
77
-
78
-
79
- max-height: 300px !important;
80
-
81
-
82
- max-width: 600px !important;
83
-
84
-
85
- }
86
-
87
-
88
-
89
-
90
-
91
- @media all and (transform-3d) , ( -webkit-transform-3d ) {
92
-
93
-
94
- .mo2f_carousel-inner > .item {
95
-
96
-
97
- -webkit-transition: -webkit-transform .6s ease-in-out;
98
-
99
-
100
- -o-transition: -o-transform .6s ease-in-out;
101
-
102
-
103
- transition: transform .6s ease-in-out;
104
-
105
-
106
- -webkit-backface-visibility: hidden;
107
-
108
-
109
- backface-visibility: hidden;
110
-
111
-
112
- -webkit-perspective: 1000;
113
-
114
-
115
- perspective: 1000
116
-
117
-
118
- }
119
-
120
-
121
-
122
-
123
-
124
- .mo2f_carousel-inner > .item.next, .mo2f_carousel-inner > .item.active.right {
125
-
126
-
127
- left: 0;
128
-
129
-
130
- -webkit-transform: translate3d(100%, 0, 0);
131
-
132
-
133
- transform: translate3d(100%, 0, 0)
134
-
135
-
136
- }
137
-
138
-
139
-
140
-
141
-
142
- .mo2f_carousel-inner > .item.prev, .mo2f_carousel-inner > .item.active.left {
143
-
144
-
145
- left: 0;
146
-
147
-
148
- -webkit-transform: translate3d(-100%, 0, 0);
149
-
150
-
151
- transform: translate3d(-100%, 0, 0)
152
-
153
-
154
- }
155
-
156
-
157
-
158
-
159
-
160
- .mo2f_carousel-inner > .item.next.left, .mo2f_carousel-inner > .item.prev.right, .mo2f_carousel-inner > .item.active {
161
-
162
-
163
- left: 0;
164
-
165
-
166
- -webkit-transform: translate3d(0, 0, 0);
167
-
168
-
169
- transform: translate3d(0, 0, 0)
170
-
171
-
172
- }
173
-
174
-
175
- }
176
-
177
-
178
-
179
-
180
-
181
- .mo2f_carousel-inner > .active, .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
182
-
183
-
184
- display: block
185
-
186
-
187
- }
188
-
189
-
190
-
191
-
192
-
193
- .mo2f_carousel-inner > .active {
194
-
195
-
196
- left: 0
197
-
198
-
199
- }
200
-
201
-
202
-
203
-
204
-
205
- .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
206
-
207
-
208
- position: absolute;
209
-
210
-
211
- top: 0;
212
-
213
-
214
- width: 100%
215
-
216
-
217
- }
218
-
219
-
220
-
221
-
222
-
223
- .mo2f_carousel-inner > .next {
224
-
225
-
226
- left: 100%
227
-
228
-
229
- }
230
-
231
-
232
-
233
-
234
-
235
- .mo2f_carousel-inner > .prev {
236
-
237
-
238
- left: -100%
239
-
240
-
241
- }
242
-
243
-
244
-
245
-
246
-
247
- .mo2f_carousel-inner > .next.left, .mo2f_carousel-inner > .prev.right {
248
-
249
-
250
- left: 0
251
-
252
-
253
- }
254
-
255
-
256
-
257
-
258
-
259
- .mo2f_carousel-inner > .active.left {
260
-
261
-
262
- left: -100%
263
-
264
-
265
- }
266
-
267
-
268
-
269
-
270
-
271
- .mo2f_carousel-inner > .active.right {
272
-
273
-
274
- left: 100%
275
-
276
-
277
- }
278
-
279
-
280
-
281
-
282
-
283
- .mo2f_carousel-control {
284
-
285
-
286
- position: absolute;
287
-
288
-
289
- top: 0;
290
-
291
-
292
- bottom: 0;
293
-
294
-
295
- left: 0;
296
-
297
-
298
- width: 15%;
299
-
300
-
301
- font-size: 20px;
302
-
303
-
304
- color: #fff;
305
-
306
-
307
- text-align: center;
308
-
309
-
310
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
311
-
312
-
313
- filter: alpha(opacity=50);
314
-
315
-
316
- opacity: .5
317
-
318
-
319
- }
320
-
321
-
322
-
323
-
324
-
325
- .mo2f_carousel-control.left {
326
-
327
-
328
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0,
329
-
330
-
331
- rgba(0, 0, 0, .0001) 100%);
332
-
333
-
334
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0,
335
-
336
-
337
- rgba(0, 0, 0, .0001) 100%);
338
-
339
-
340
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)),
341
-
342
-
343
- to(rgba(0, 0, 0, .0001)));
344
-
345
-
346
- background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0,
347
-
348
-
349
- rgba(0, 0, 0, .0001) 100%);
350
-
351
-
352
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
353
-
354
-
355
- endColorstr='#00000000', GradientType=1);
356
-
357
-
358
- background-repeat: repeat-x
359
-
360
-
361
- }
362
-
363
-
364
-
365
-
366
-
367
- .mo2f_carousel-control.right {
368
-
369
-
370
- right: 0;
371
-
372
-
373
- left: auto;
374
-
375
-
376
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
377
-
378
-
379
- rgba(0, 0, 0, .5) 100%);
380
-
381
-
382
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
383
-
384
-
385
- rgba(0, 0, 0, .5) 100%);
386
-
387
-
388
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)),
389
-
390
-
391
- to(rgba(0, 0, 0, .5)));
392
-
393
-
394
- background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0,
395
-
396
-
397
- rgba(0, 0, 0, .5) 100%);
398
-
399
-
400
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
401
-
402
-
403
- endColorstr='#80000000', GradientType=1);
404
-
405
-
406
- background-repeat: repeat-x
407
-
408
-
409
- }
410
-
411
-
412
-
413
-
414
-
415
- .mo2f_carousel-control:hover, .mo2f_carousel-control:focus {
416
-
417
-
418
- color: #fff;
419
-
420
-
421
- text-decoration: none;
422
-
423
-
424
- filter: alpha(opacity=90);
425
-
426
-
427
- outline: 0;
428
-
429
-
430
- opacity: .9
431
-
432
-
433
- }
434
-
435
-
436
-
437
-
438
-
439
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right {
440
-
441
-
442
- position: absolute;
443
-
444
-
445
- top: 50%;
446
-
447
-
448
- z-index: 5;
449
-
450
-
451
- display: inline-block
452
-
453
-
454
- }
455
-
456
-
457
-
458
-
459
-
460
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .glyphicon-chevron-left {
461
-
462
-
463
- left: 50%;
464
-
465
-
466
- margin-left: -10px
467
-
468
-
469
- }
470
-
471
-
472
-
473
-
474
-
475
- .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-right {
476
-
477
-
478
- right: 50%;
479
-
480
-
481
- margin-right: -10px
482
-
483
-
484
- }
485
-
486
-
487
-
488
-
489
-
490
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
491
-
492
-
493
- width: 20px;
494
-
495
-
496
- height: 20px;
497
-
498
-
499
- margin-top: -10px;
500
-
501
-
502
- font-family: serif
503
-
504
-
505
- }
506
-
507
-
508
-
509
-
510
-
511
- .mo2f_carousel-control .icon-prev:before {
512
-
513
-
514
- content: '\2039'
515
-
516
-
517
- }
518
-
519
-
520
-
521
-
522
-
523
- .mo2f_carousel-control .icon-next:before {
524
-
525
-
526
- content: '\203a'
527
-
528
-
529
- }
530
-
531
-
532
-
533
-
534
-
535
- .mo2f_carousel-indicators {
536
-
537
-
538
- position: absolute;
539
-
540
-
541
- bottom: -25px;
542
-
543
-
544
- left: 50%;
545
-
546
-
547
- z-index: 15;
548
-
549
-
550
- width: 60%;
551
-
552
-
553
- padding-left: 0;
554
-
555
-
556
- margin-left: -30%;
557
-
558
-
559
- text-align: center;
560
-
561
-
562
- list-style: none
563
-
564
-
565
- }
566
-
567
-
568
-
569
-
570
-
571
- .mo2f_carousel-indicators li {
572
-
573
-
574
- display: inline-block;
575
-
576
-
577
- width: 10px;
578
-
579
-
580
- height: 10px;
581
-
582
-
583
- margin: 1px;
584
-
585
-
586
- text-indent: -999px;
587
-
588
-
589
- cursor: pointer;
590
-
591
-
592
- background-color: #0 \9;
593
-
594
-
595
- background-color: rgba(0, 0, 0, 0);
596
-
597
-
598
- border: 1px solid #0073aa;
599
-
600
-
601
- border-radius: 10px
602
-
603
-
604
- }
605
-
606
-
607
-
608
-
609
-
610
- .mo2f_carousel-indicators .active {
611
-
612
-
613
- width: 12px;
614
-
615
-
616
- height: 12px;
617
-
618
-
619
- margin: 0;
620
-
621
-
622
- background-color: #0073aa;
623
-
624
-
625
- }
626
-
627
-
628
-
629
-
630
-
631
- .mo2f_carousel-caption {
632
-
633
-
634
- position: absolute;
635
-
636
-
637
- right: 15%;
638
-
639
-
640
- bottom: 20px;
641
-
642
-
643
- left: 15%;
644
-
645
-
646
- z-index: 10;
647
-
648
-
649
- padding-top: 20px;
650
-
651
-
652
- padding-bottom: 20px;
653
-
654
-
655
- color: #fff;
656
-
657
-
658
- text-align: center;
659
-
660
-
661
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6)
662
-
663
-
664
- }
665
-
666
-
667
-
668
-
669
-
670
- .mo2f_carousel-caption .btn {
671
-
672
-
673
- text-shadow: none
674
-
675
-
676
- }
677
-
678
-
679
-
680
-
681
-
682
- @media screen and (min-width: 768px) {
683
-
684
-
685
- .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
686
-
687
-
688
- width: 30px;
689
-
690
-
691
- height: 30px;
692
-
693
-
694
- margin-top: -15px;
695
-
696
-
697
- font-size: 30px
698
-
699
-
700
- }
701
-
702
-
703
-
704
-
705
-
706
- .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .icon-prev {
707
-
708
-
709
- margin-left: -15px
710
-
711
-
712
- }
713
-
714
-
715
-
716
-
717
-
718
- .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-next {
719
-
720
-
721
- margin-right: -15px
722
-
723
-
724
- }
725
-
726
-
727
-
728
-
729
-
730
- .mo2f_carousel-caption {
731
-
732
-
733
- right: 20%;
734
-
735
-
736
- left: 20%;
737
-
738
-
739
- padding-bottom: 30px
740
-
741
-
742
- }
743
-
744
-
745
-
746
-
747
-
748
- .mo2f_carousel-indicators {
749
-
750
-
751
- bottom: -14px
752
-
753
-
754
- }
755
-
756
-
757
- }
758
-
759
-
760
-
761
-
762
-
763
- .hidden {
764
-
765
-
766
- display: none;
767
-
768
-
769
- }
770
-
771
-
772
-
773
-
774
-
775
- .float-right {
776
-
777
-
778
- text-align: right;
779
-
780
-
781
- }
782
-
783
-
784
-
785
-
786
-
787
- .mo2f_collapse {
788
-
789
-
790
- display: none;
791
-
792
-
793
- / / visibility: hidden;
794
-
795
-
796
- font-size: 14px !important;
797
-
798
-
799
-
800
-
801
-
802
- }
803
-
804
-
805
-
806
-
807
-
808
- .mo2f_collapse.in {
809
-
810
-
811
- display: block;
812
-
813
-
814
- visibility: visible;
815
-
816
-
817
-
818
-
819
-
820
- }
821
-
822
-
823
-
824
-
825
-
826
- .mo2f_collapsing {
827
-
828
-
829
- position: relative;
830
-
831
-
832
- font-size: 14px !important;
833
-
834
-
835
- height: 0;
836
-
837
-
838
- overflow: hidden;
839
-
840
-
841
- -webkit-transition-timing-function: ease;
842
-
843
-
844
- -o-transition-timing-function: ease;
845
-
846
-
847
- transition-timing-function: ease;
848
-
849
-
850
- -webkit-transition-duration: .20s;
851
-
852
-
853
- -o-transition-duration: .20s;
854
-
855
-
856
- transition-duration: .20s;
857
-
858
-
859
- -webkit-transition-property: height, visibility;
860
-
861
-
862
- -o-transition-property: height, visibility;
863
-
864
-
865
- transition-property: height, visibility
866
-
867
-
868
- }
869
-
870
-
871
-
872
-
873
-
874
- .mo2f_thumbnail {
875
-
876
-
877
- width: 315px;
878
-
879
-
880
- margin-bottom: 10px;
881
-
882
-
883
- position: relative;
884
-
885
-
886
- background-color: #fff;
887
-
888
-
889
- border: 1px solid #ddd;
890
-
891
-
892
- -webkit-transition: border .2s ease-in-out;
893
-
894
-
895
- -o-transition: border .2s ease-in-out;
896
-
897
-
898
- transition: border .2s ease-in-out
899
-
900
-
901
- }
902
-
903
-
904
-
905
-
906
-
907
- .mo2f_thumbnail > img, .mo2f_thumbnail a > img {
908
-
909
-
910
- margin-right: auto;
911
-
912
-
913
- margin-left: auto
914
-
915
-
916
- }
917
-
918
-
919
-
920
-
921
-
922
- a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
923
-
924
-
925
- border-color: #337ab7
926
-
927
-
928
- }
929
-
930
-
931
-
932
-
933
-
934
- .mo2f_thumbnail .caption {
935
-
936
-
937
- padding: 9px;
938
-
939
-
940
- color: #333
941
-
942
-
943
- }
944
-
945
-
946
-
947
-
948
-
949
- .mo2f_thumbnail label {
950
-
951
-
952
- font-weight: bold;
953
-
954
-
955
-
956
-
957
-
958
- }
959
-
960
-
961
-
962
-
963
-
964
- .mo2f_close {
965
-
966
-
967
- float: right;
968
-
969
-
970
- font-size: 21px;
971
-
972
-
973
- font-weight: 700;
974
-
975
-
976
- line-height: 1;
977
-
978
-
979
- color: #000;
980
-
981
-
982
- text-shadow: 0 1px 0 #fff;
983
-
984
-
985
- filter: alpha(opacity=20);
986
-
987
-
988
- opacity: .2
989
-
990
-
991
- }
992
-
993
-
994
-
995
-
996
-
997
- .mo2f_close:hover, .mo2f_close:focus {
998
-
999
-
1000
- color: #000;
1001
-
1002
-
1003
- text-decoration: none;
1004
-
1005
-
1006
- cursor: pointer;
1007
-
1008
-
1009
- filter: alpha(opacity=50);
1010
-
1011
-
1012
- opacity: .5
1013
-
1014
-
1015
- }
1016
-
1017
-
1018
-
1019
-
1020
-
1021
- button.mo2f_close {
1022
-
1023
-
1024
- -webkit-appearance: none;
1025
-
1026
-
1027
- padding: 0;
1028
-
1029
-
1030
- cursor: pointer;
1031
-
1032
-
1033
- background: 0 0;
1034
-
1035
-
1036
- border: 0
1037
-
1038
-
1039
- }
1040
-
1041
-
1042
-
1043
-
1044
-
1045
- .mo2f_modal-open {
1046
-
1047
-
1048
- overflow: hidden !important;
1049
-
1050
-
1051
- position: fixed !important;
1052
-
1053
-
1054
- width: 100% !important;
1055
-
1056
-
1057
-
1058
-
1059
-
1060
- }
1061
-
1062
-
1063
-
1064
-
1065
-
1066
- .mo2f_modal {
1067
-
1068
-
1069
- position: fixed !important;
1070
-
1071
-
1072
- top: 0;
1073
-
1074
-
1075
- right: 0;
1076
-
1077
-
1078
- bottom: 0;
1079
-
1080
-
1081
- left: 0;
1082
-
1083
-
1084
- z-index: 100000 !important;
1085
-
1086
-
1087
-
1088
-
1089
-
1090
- overflow: hidden !important;
1091
-
1092
-
1093
- -webkit-overflow-scrolling: touch;
1094
-
1095
-
1096
- outline: 0;
1097
-
1098
-
1099
-
1100
-
1101
-
1102
- }
1103
-
1104
-
1105
-
1106
-
1107
-
1108
- .mo2f_modal_inner {
1109
-
1110
-
1111
- display: none;
1112
-
1113
-
1114
- }
1115
-
1116
-
1117
-
1118
-
1119
-
1120
- .mo2f_modal.fade .mo2f_modal-dialog {
1121
-
1122
-
1123
- -webkit-transition: -webkit-transform .3s ease-out;
1124
-
1125
-
1126
- -o-transition: -o-transform .3s ease-out;
1127
-
1128
-
1129
- transition: transform .3s ease-out;
1130
-
1131
-
1132
- -webkit-transform: translate(0, -25%);
1133
-
1134
-
1135
- -ms-transform: translate(0, -25%);
1136
-
1137
-
1138
- -o-transform: translate(0, -25%);
1139
-
1140
-
1141
- transform: translate(0, -25%)
1142
-
1143
-
1144
- }
1145
-
1146
-
1147
-
1148
-
1149
-
1150
- .mo2f_modal.in .mo2f_modal-dialog {
1151
-
1152
-
1153
- -webkit-transform: translate(0, 80px) !important;
1154
-
1155
-
1156
- -ms-transform: translate(0, 80px) !important;
1157
-
1158
-
1159
- -o-transform: translate(0, 80px) !important;
1160
-
1161
-
1162
- transform: translate(0, 80px) !important;
1163
-
1164
-
1165
-
1166
-
1167
-
1168
- }
1169
-
1170
-
1171
-
1172
-
1173
-
1174
- .mo2f_modal-open .mo2f_modal {
1175
-
1176
-
1177
- overflow-x: hidden;
1178
-
1179
-
1180
- overflow-y: hidden;
1181
-
1182
-
1183
- }
1184
-
1185
-
1186
-
1187
-
1188
-
1189
- .mo2f_modal-dialog {
1190
-
1191
-
1192
- position: relative;
1193
-
1194
-
1195
- width: auto;
1196
-
1197
-
1198
- margin: 10px;
1199
-
1200
-
1201
-
1202
-
1203
-
1204
- }
1205
-
1206
-
1207
-
1208
-
1209
-
1210
- .login mo_customer_validation-modal-content {
1211
-
1212
-
1213
- position: relative !important;
1214
-
1215
-
1216
- background-color: #fff !important;
1217
-
1218
-
1219
- -webkit-background-clip: padding-box !important;
1220
-
1221
-
1222
- background-clip: padding-box !important;
1223
-
1224
-
1225
- border: 1px solid #999 !important;
1226
-
1227
-
1228
- border: 1px solid rgba(0, 0, 0, .2) !important;
1229
-
1230
-
1231
- border-radius: 6px !important;
1232
-
1233
-
1234
- outline: 0 !important;
1235
-
1236
-
1237
-
1238
-
1239
-
1240
- -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
1241
-
1242
-
1243
- box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
1244
-
1245
-
1246
- }
1247
-
1248
-
1249
-
1250
-
1251
-
1252
- .mo2f-modal-backdrop {
1253
-
1254
-
1255
- position: absolute;
1256
-
1257
-
1258
- top: 0;
1259
-
1260
-
1261
- right: 0;
1262
-
1263
-
1264
- left: 0;
1265
-
1266
-
1267
- background-color: #f1f1f1 !important;
1268
-
1269
-
1270
- filter: alpha(opacity=50) !important;
1271
-
1272
-
1273
- opacity: 0.8 !important;
1274
-
1275
-
1276
- height: 100% !important;
1277
-
1278
-
1279
- }
1280
-
1281
-
1282
-
1283
-
1284
-
1285
- #smsAlertModal {
1286
-
1287
-
1288
- background-color: black !important;
1289
-
1290
-
1291
- opacity: 0.8 !important;
1292
-
1293
-
1294
- filter: alpha(opacity=50) !important;
1295
-
1296
-
1297
- }
1298
-
1299
-
1300
-
1301
-
1302
-
1303
- .mo2f_modal-header {
1304
-
1305
-
1306
- min-height: 14px;
1307
-
1308
-
1309
- padding: 10px;
1310
-
1311
-
1312
- border-bottom: 1px solid #e5e5e5
1313
-
1314
-
1315
- }
1316
-
1317
-
1318
-
1319
-
1320
-
1321
- .mo2f_modal-title {
1322
-
1323
-
1324
- margin: 0 !important;
1325
-
1326
-
1327
- line-height: 1.0 !important;
1328
-
1329
-
1330
- }
1331
-
1332
-
1333
-
1334
-
1335
-
1336
- .mo2f_modal-body {
1337
-
1338
-
1339
- / / width: 96 % !important;
1340
-
1341
-
1342
- position: relative !important;
1343
-
1344
-
1345
- padding: 15px !important;
1346
-
1347
-
1348
- overflow-y: auto !important;
1349
-
1350
-
1351
- max-height: 550px !important;
1352
-
1353
-
1354
- }
1355
-
1356
-
1357
-
1358
-
1359
-
1360
- .mo2f_modal-footer {
1361
-
1362
-
1363
- padding: 15px;
1364
-
1365
-
1366
- text-align: right;
1367
-
1368
-
1369
- border-top: 1px solid #e5e5e5
1370
-
1371
-
1372
- }
1373
-
1374
-
1375
-
1376
-
1377
-
1378
- .mo2f_modal-footer .btn + .btn {
1379
-
1380
-
1381
- margin-bottom: 0;
1382
-
1383
-
1384
- margin-left: 5px
1385
-
1386
-
1387
- }
1388
-
1389
-
1390
-
1391
-
1392
-
1393
- .mo2f_modal-footer .btn-group .btn + .btn {
1394
-
1395
-
1396
- margin-left: -1px
1397
-
1398
-
1399
- }
1400
-
1401
-
1402
-
1403
-
1404
-
1405
- .mo2f_modal-footer .btn-block + .btn-block {
1406
-
1407
-
1408
- margin-left: 0
1409
-
1410
-
1411
- }
1412
-
1413
-
1414
-
1415
-
1416
-
1417
- .mo2f_modal-scrollbar-measure {
1418
-
1419
-
1420
- position: absolute;
1421
-
1422
-
1423
- top: -9999px;
1424
-
1425
-
1426
- width: 50px;
1427
-
1428
-
1429
- height: 50px;
1430
-
1431
-
1432
- overflow: scroll
1433
-
1434
-
1435
- }
1436
-
1437
-
1438
-
1439
-
1440
-
1441
- @media ( min-width: 768px) {
1442
-
1443
-
1444
- .mo2f_modal-dialog {
1445
-
1446
- width: auto;
1447
- margin: 0px auto
1448
-
1449
-
1450
- }
1451
-
1452
-
1453
-
1454
-
1455
-
1456
- .login mo_customer_validation-modal-content {
1457
-
1458
-
1459
- -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
1460
-
1461
-
1462
- box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
1463
-
1464
-
1465
- }
1466
-
1467
-
1468
-
1469
-
1470
-
1471
- .mo2f_modal-sm {
1472
-
1473
-
1474
- width: 300px
1475
-
1476
-
1477
- }
1478
-
1479
-
1480
-
1481
-
1482
-
1483
- .mo2f_modal-md {
1484
-
1485
-
1486
- width: 550px
1487
-
1488
-
1489
- }
1490
-
1491
-
1492
- }
1493
-
1494
-
1495
-
1496
-
1497
-
1498
- @media ( min-width: 992px) {
1499
-
1500
-
1501
- .mo2f_modal-lg {
1502
-
1503
-
1504
- width: 900px;
1505
-
1506
-
1507
- }
1508
-
1509
-
1510
-
1511
-
1512
-
1513
- .mo2f_modal-md {
1514
-
1515
-
1516
- width: 550px
1517
-
1518
-
1519
- }
1520
-
1521
-
1522
- }
1523
-
1524
-
1525
-
1526
-
1527
-
1528
- .center{
1529
-
1530
-
1531
-
1532
-
1533
-
1534
- text-align: center !important;
1535
-
1536
-
1537
- }
1538
-
1539
-
1540
-
1541
-
1542
-
1543
- #otpMessage {
1544
-
1545
-
1546
- border-radius: 1px;
1547
-
1548
-
1549
- padding: 1px 5px;
1550
-
1551
-
1552
- background: #f1f1f1;
1553
-
1554
-
1555
- }
1556
-
1557
-
1558
-
1559
-
1560
-
1561
- .mo2f_carousel-indicators {
1562
-
1563
-
1564
- position: absolute;
1565
-
1566
-
1567
- bottom: -20px;
1568
-
1569
-
1570
- z-index: 15;
1571
-
1572
-
1573
- width: 60%;
1574
-
1575
-
1576
- list-style: none;
1577
-
1578
-
1579
- text-align: center;
1580
-
1581
-
1582
- }
1583
-
1584
-
1585
-
1586
-
1587
-
1588
- .miniorange_kba_validate:hover, .miniorange_validate_otp:hover, .miniorange_login_forgotphone:hover,
1589
-
1590
-
1591
- .miniorange_login_offline:hover, .miniorange_login_forgotphone:hover, .miniorange_otp_token_submit:hover, .miniorange_button:hover
1592
-
1593
-
1594
- {
1595
-
1596
-
1597
- background-color:#0073AA!important
1598
-
1599
-
1600
- }
1601
-
1602
-
1603
-
1604
-
1605
-
1606
- .miniorange_kba_validate, .miniorange_validate_otp, .miniorange_login_forgotphone,
1607
-
1608
-
1609
- .miniorange_login_offline, .miniorange_login_forgotphone , .miniorange_otp_token_submit,
1610
-
1611
-
1612
- .miniorange_button
1613
-
1614
-
1615
- {
1616
-
1617
-
1618
- background:#00A0D2!important;
1619
-
1620
-
1621
- border-color:#0073AA!important;
1622
-
1623
-
1624
- box-shadow:0 1px 0 rgba(120,200,230,.5) inset,0 1px 0 rgba(0,0,0,.15)!important;
1625
-
1626
-
1627
- color:#FFF!important;
1628
-
1629
-
1630
- text-decoration:none!important;
1631
-
1632
-
1633
- cursor:pointer!important;
1634
-
1635
-
1636
- border-width:1px!important;
1637
-
1638
-
1639
- border-style:solid!important;
1640
-
1641
-
1642
- border-radius:3px!important;
1643
-
1644
-
1645
- white-space:nowrap!important;
1646
-
1647
-
1648
- box-sizing:border-box!important;
1649
-
1650
-
1651
- line-height:28px!important;
1652
-
1653
-
1654
- padding:0 12px!important;
1655
-
1656
-
1657
- font-size:13px!important;
1658
-
1659
-
1660
- }
1661
-
1662
-
1663
-
1664
-
1665
-
1666
- .mo_customer_validation-modal.fade .mo_customer_validation-modal-dialog {
1667
-
1668
-
1669
- -webkit-transition: -webkit-transform .3s ease-out;
1670
-
1671
-
1672
- -o-transition: -o-transform .3s ease-out;
1673
-
1674
-
1675
- transition: transform .3s ease-out;
1676
-
1677
-
1678
- -webkit-transform: translate(0, -25%);
1679
-
1680
-
1681
- -ms-transform: translate(0, -25%);
1682
-
1683
-
1684
- -o-transform: translate(0, -25%);
1685
-
1686
-
1687
- transform: translate(0, -25%)
1688
-
1689
-
1690
- }
1691
-
1692
-
1693
-
1694
-
1695
-
1696
- .mo_customer_validation-modal.in .mo_customer_validation-modal-dialog {
1697
-
1698
-
1699
- -webkit-transform: translate(0, 80px) !important;
1700
-
1701
-
1702
- -ms-transform: translate(0, 80px) !important;
1703
-
1704
-
1705
- -o-transform: translate(0, 80px) !important;
1706
-
1707
-
1708
- transform: translate(0, 80px) !important
1709
-
1710
-
1711
- }
1712
-
1713
-
1714
-
1715
-
1716
-
1717
- .mo_customer_validation-modal-open .mo_customer_validation-modal {
1718
-
1719
-
1720
- overflow-x: hidden;
1721
-
1722
-
1723
- overflow-y: hidden
1724
-
1725
-
1726
- }
1727
-
1728
-
1729
-
1730
-
1731
-
1732
- .mo_customer_validation-modal-dialog {
1733
-
1734
-
1735
- position: relative;
1736
-
1737
-
1738
- width: auto;
1739
-
1740
-
1741
- margin: 10px
1742
-
1743
-
1744
- }
1745
-
1746
-
1747
-
1748
-
1749
-
1750
- .mo_customer_validation-modal-content {
1751
-
1752
-
1753
- position: relative;
1754
-
1755
-
1756
- -webkit-background-clip: padding-box;
1757
-
1758
-
1759
- border: 1px solid #999;
1760
-
1761
-
1762
- border: 1px solid rgba(0, 0, 0, .2);
1763
-
1764
-
1765
- outline: 0;
1766
-
1767
-
1768
- margin-top: 8%;
1769
-
1770
-
1771
- margin-left: 0;
1772
-
1773
-
1774
- padding: 15px 20px 0;
1775
-
1776
-
1777
- font-family: "Open Sans", sans-serif;
1778
-
1779
-
1780
-
1781
- font-size: 14px;
1782
-
1783
-
1784
- line-height: 1.4em;
1785
-
1786
-
1787
- background: #FFF;
1788
-
1789
-
1790
- box-shadow: 0 1px 3px rgba(0, 0, 0, .13)
1791
-
1792
-
1793
- }
1794
-
1795
-
1796
-
1797
-
1798
-
1799
- .mo_customer_validation-modal-backdrop {
1800
-
1801
-
1802
- position: absolute;
1803
-
1804
-
1805
- top: 0;
1806
-
1807
-
1808
- right: 0;
1809
-
1810
-
1811
- left: 0;
1812
-
1813
-
1814
- background-color: #000 !important;
1815
-
1816
-
1817
- filter: alpha(opacity=50) !important;
1818
-
1819
-
1820
- opacity: .9 !important;
1821
-
1822
-
1823
- height: 100% !important
1824
-
1825
-
1826
- }
1827
-
1828
-
1829
-
1830
-
1831
-
1832
- .mo_customer_validation-modal-header {
1833
-
1834
-
1835
- min-height: 14px;
1836
-
1837
-
1838
- padding: 10px 10px 20px;
1839
-
1840
-
1841
- border-bottom: 1px solid #e5e5e5
1842
-
1843
-
1844
- }
1845
-
1846
-
1847
-
1848
-
1849
-
1850
- .mo_customer_validation-modal-title {
1851
-
1852
-
1853
- margin: 0 !important;
1854
-
1855
-
1856
- line-height: 1 !important
1857
-
1858
-
1859
- }
1860
-
1861
-
1862
-
1863
-
1864
-
1865
- .mo_customer_validation-modal-body {
1866
-
1867
-
1868
- position: relative;
1869
-
1870
-
1871
- padding: 5%;
1872
-
1873
-
1874
- overflow: hidden !important;
1875
-
1876
-
1877
- max-height: 550px !important
1878
-
1879
-
1880
- }
1881
-
1882
-
1883
-
1884
-
1885
-
1886
- .mo_customer_validation-modal-footer {
1887
-
1888
-
1889
- padding: 15px;
1890
-
1891
-
1892
- text-align: right;
1893
-
1894
-
1895
- border-top: 1px solid #e5e5e5
1896
-
1897
-
1898
- }
1899
-
1900
-
1901
-
1902
-
1903
-
1904
- .mo_customer_validation-modal-footer .btn + .btn {
1905
-
1906
-
1907
- margin-bottom: 0;
1908
-
1909
-
1910
- margin-left: 5px
1911
-
1912
-
1913
- }
1914
-
1915
-
1916
-
1917
-
1918
-
1919
- .mo_customer_validation-modal-footer .btn-group .btn + .btn {
1920
-
1921
-
1922
- margin-left: -1px
1923
-
1924
-
1925
- }
1926
-
1927
-
1928
-
1929
-
1930
-
1931
- .mo_customer_validation-modal-footer .btn-block + .btn-block {
1932
-
1933
-
1934
- margin-left: 0
1935
-
1936
-
1937
- }
1938
-
1939
-
1940
-
1941
-
1942
-
1943
- .mo_customer_validation-modal-scrollbar-measure {
1944
-
1945
-
1946
- position: absolute;
1947
-
1948
-
1949
- top: -9999px;
1950
-
1951
-
1952
- width: 50px;
1953
-
1954
-
1955
- height: 50px;
1956
-
1957
-
1958
- overflow: scroll
1959
-
1960
-
1961
- }
1962
-
1963
-
1964
-
1965
-
1966
-
1967
- @media (min-width: 768px) {
1968
-
1969
-
1970
- .mo_customer_validation-modal-dialog {
1971
-
1972
-
1973
- width: auto;
1974
-
1975
-
1976
- margin: 0 auto
1977
-
1978
-
1979
- }
1980
-
1981
-
1982
-
1983
-
1984
-
1985
- .mo_customer_validation-modal-content {
1986
-
1987
-
1988
- -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
1989
-
1990
-
1991
- box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
1992
-
1993
-
1994
- }
1995
-
1996
-
1997
-
1998
-
1999
-
2000
- .mo_customer_validation-modal-sm {
2001
-
2002
-
2003
- width: 300px
2004
-
2005
-
2006
- }
2007
-
2008
-
2009
-
2010
-
2011
-
2012
- .mo_customer_validation-modal-md {
2013
-
2014
-
2015
- width: 532px
2016
-
2017
-
2018
- }
2019
-
2020
-
2021
-
2022
-
2023
-
2024
- .mo_customer_validation-modal-lg {
2025
-
2026
-
2027
- width: 50%
2028
-
2029
-
2030
- }
2031
-
2032
-
2033
- }
2034
-
2035
-
2036
-
2037
-
2038
-
2039
- @media (min-width: 992px) {
2040
-
2041
-
2042
- .mo_customer_validation-modal-dialog {
2043
-
2044
-
2045
- width: auto;
2046
-
2047
-
2048
- margin: 0 auto
2049
-
2050
-
2051
- }
2052
-
2053
-
2054
-
2055
-
2056
-
2057
- .mo_customer_validation-modal-lg {
2058
-
2059
-
2060
- width: 490px
2061
-
2062
-
2063
- }
2064
-
2065
-
2066
-
2067
-
2068
-
2069
- .mo_customer_validation-modal-md {
2070
-
2071
-
2072
- width: 532px
2073
-
2074
-
2075
- }
2076
-
2077
-
2078
- }
2079
-
2080
-
2081
-
2082
-
2083
-
2084
- .mo_customer_validation-textbox {
2085
-
2086
-
2087
- background: #FBFBFB;
2088
-
2089
-
2090
- font-family: "Open Sans", sans-serif;
2091
-
2092
-
2093
- font-size: 24px;
2094
-
2095
-
2096
- width: 100%;
2097
-
2098
-
2099
- border: 1px solid #DDD;
2100
-
2101
-
2102
- padding: 3px;
2103
-
2104
-
2105
- margin: 2px 6px 16px 0
2106
-
2107
-
2108
- }
2109
-
2110
-
2111
-
2112
-
2113
-
2114
- .mo_customer_validation-textbox:focus {
2115
-
2116
-
2117
- border-color: #5B9DD9;
2118
-
2119
-
2120
- box-shadow: 0 0 2px rgba(30, 140, 190, .8)
2121
-
2122
-
2123
- }
2124
-
2125
-
2126
-
2127
-
2128
-
2129
- .button-primary,
2130
-
2131
-
2132
- .button-secondary {
2133
-
2134
-
2135
- background: #00A0D2;
2136
-
2137
-
2138
- border-color: #0073AA;
2139
-
2140
-
2141
- box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15);
2142
-
2143
-
2144
- color: #FFF;
2145
-
2146
-
2147
- text-decoration: none;
2148
-
2149
-
2150
- cursor: pointer;
2151
-
2152
-
2153
- border-width: 1px;
2154
-
2155
-
2156
- border-style: solid;
2157
-
2158
-
2159
- border-radius: 3px;
2160
-
2161
-
2162
- white-space: nowrap;
2163
-
2164
-
2165
- box-sizing: border-box;
2166
-
2167
-
2168
- line-height: 28px;
2169
-
2170
-
2171
- padding: 0 12px;
2172
-
2173
-
2174
- font-size: 13px
2175
-
2176
-
2177
- }
2178
-
2179
-
2180
-
2181
-
2182
-
2183
- .button:hover {
2184
-
2185
-
2186
- background-color: #0073AA
2187
-
2188
-
2189
- }
2190
-
2191
-
2192
-
2193
-
2194
-
2195
- .close {
2196
-
2197
-
2198
- float: right;
2199
-
2200
-
2201
- transition: color .1s ease-in-out, background .1s ease-in-out;
2202
-
2203
-
2204
- text-decoration: none;
2205
-
2206
-
2207
- color: #999;
2208
-
2209
-
2210
- font-size: 13px
2211
-
2212
-
2213
- }
2214
-
2215
-
2216
-
2217
-
2218
-
2219
- .mo_validate_close:focus,
2220
-
2221
-
2222
- .mo_validate_close:hover {
2223
-
2224
-
2225
- color: #0085ba
2226
-
2227
-
2228
- }
2229
-
2230
-
2231
-
2232
-
2233
-
2234
- .mo_registration_pricing_text {
2235
-
2236
-
2237
- font-size: 13px;
2238
-
2239
-
2240
- color: darkblue;
2241
-
2242
-
2243
- }
2244
-
2245
-
2246
-
2247
-
2248
-
2249
- .mo_otp_token {
2250
-
2251
-
2252
- font-size: 15px;
2253
-
2254
-
2255
- color: #212F3C;
2256
-
2257
-
2258
- border: none;
2259
-
2260
-
2261
- display: block;
2262
-
2263
-
2264
- border-bottom-style: solid;
2265
-
2266
-
2267
- border-width: 2px;
2268
-
2269
-
2270
- border-color: #D0D3D4;
2271
-
2272
-
2273
- border-radius: 0px;
2274
-
2275
-
2276
- outline: none;
2277
-
2278
-
2279
- width: 140px;
2280
-
2281
-
2282
- text-align: center;
2283
-
2284
-
2285
- }
2286
-
2287
-
2288
-
2289
-
2290
-
2291
- .container {
2292
-
2293
-
2294
- max-width: 960px
2295
-
2296
-
2297
- }
2298
-
2299
-
2300
-
2301
-
2302
-
2303
- }
2304
-
2305
-
2306
- @media (min-width: 1200px) {
2307
-
2308
-
2309
- .container {
2310
-
2311
-
2312
- max-width: 1140px
2313
-
2314
-
2315
- }
2316
-
2317
-
2318
- }
2319
-
2320
-
2321
-
2322
-
2323
-
2324
- .container-fluid {
2325
-
2326
-
2327
- width: 100%;
2328
-
2329
-
2330
- padding-right: 15px;
2331
-
2332
-
2333
- padding-left: 15px;
2334
-
2335
-
2336
- margin-right: auto;
2337
-
2338
-
2339
- margin-left: auto
2340
-
2341
-
2342
- }
2343
-
2344
-
2345
-
2346
-
2347
-
2348
- .row {
2349
-
2350
-
2351
- display: -webkit-box;
2352
-
2353
-
2354
- display: -ms-flexbox;
2355
-
2356
-
2357
- display: flex;
2358
-
2359
-
2360
- -ms-flex-wrap: wrap;
2361
-
2362
-
2363
- flex-wrap: wrap;
2364
-
2365
-
2366
- margin-right: -15px;
2367
-
2368
-
2369
- margin-left: -15px
2370
-
2371
-
2372
- }
2373
-
2374
-
2375
-
2376
-
2377
-
2378
-
2379
-
2380
-
2381
- .no-gutters {
2382
-
2383
-
2384
- margin-right: 0;
2385
-
2386
-
2387
- margin-left: 0
2388
-
2389
-
2390
- }
2391
-
2392
-
2393
-
2394
-
2395
-
2396
- .no-gutters > .col, .no-gutters > [class*=col-] {
2397
-
2398
-
2399
- padding-right: 0;
2400
-
2401
-
2402
- padding-left: 0
2403
-
2404
-
2405
- }
2406
-
2407
-
2408
-
2409
-
2410
-
2411
- .col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto {
2412
-
2413
-
2414
- position: relative;
2415
-
2416
-
2417
- width: 100%;
2418
-
2419
-
2420
- min-height: 1px;
2421
-
2422
-
2423
- padding-right: 15px;
2424
-
2425
-
2426
- padding-left: 15px
2427
-
2428
-
2429
- }
2430
-
2431
-
2432
-
2433
-
2434
-
2435
- .col {
2436
-
2437
-
2438
- -ms-flex-preferred-size: 0;
2439
-
2440
-
2441
- flex-basis: 0;
2442
-
2443
-
2444
- -webkit-box-flex: 1;
2445
-
2446
-
2447
- -ms-flex-positive: 1;
2448
-
2449
-
2450
- flex-grow: 1;
2451
-
2452
-
2453
- max-width: 100%
2454
-
2455
-
2456
- }
2457
-
2458
-
2459
-
2460
-
2461
-
2462
- .col-auto {
2463
-
2464
-
2465
- -webkit-box-flex: 0;
2466
-
2467
-
2468
- -ms-flex: 0 0 auto;
2469
-
2470
-
2471
- flex: 0 0 auto;
2472
-
2473
-
2474
- width: auto;
2475
-
2476
-
2477
- max-width: none
2478
-
2479
-
2480
- }
2481
-
2482
-
2483
-
2484
-
2485
-
2486
- .col-1 {
2487
-
2488
-
2489
- -webkit-box-flex: 0;
2490
-
2491
-
2492
- -ms-flex: 0 0 8.333333%;
2493
-
2494
-
2495
- flex: 0 0 8.333333%;
2496
-
2497
-
2498
- max-width: 8.333333%
2499
-
2500
-
2501
- }
2502
-
2503
-
2504
-
2505
-
2506
-
2507
- .col-2 {
2508
-
2509
-
2510
- -webkit-box-flex: 0;
2511
-
2512
-
2513
- -ms-flex: 0 0 16.666667%;
2514
-
2515
-
2516
- flex: 0 0 16.666667%;
2517
-
2518
-
2519
- max-width: 16.666667%
2520
-
2521
-
2522
- }
2523
-
2524
-
2525
-
2526
-
2527
-
2528
- .col-3 {
2529
-
2530
-
2531
- -webkit-box-flex: 0;
2532
-
2533
-
2534
- -ms-flex: 0 0 25%;
2535
-
2536
-
2537
- flex: 0 0 25%;
2538
-
2539
-
2540
- max-width: 25%
2541
-
2542
-
2543
- }
2544
-
2545
-
2546
-
2547
-
2548
-
2549
- .col-4 {
2550
-
2551
-
2552
- -webkit-box-flex: 0;
2553
-
2554
-
2555
- -ms-flex: 0 0 33.333333%;
2556
-
2557
-
2558
- flex: 0 0 33.333333%;
2559
-
2560
-
2561
- max-width: 33.333333%
2562
-
2563
-
2564
- }
2565
-
2566
-
2567
-
2568
-
2569
-
2570
- .col-5 {
2571
-
2572
-
2573
- -webkit-box-flex: 0;
2574
-
2575
-
2576
- -ms-flex: 0 0 41.666667%;
2577
-
2578
-
2579
- flex: 0 0 41.666667%;
2580
-
2581
-
2582
- max-width: 41.666667%
2583
-
2584
-
2585
- }
2586
-
2587
-
2588
-
2589
-
2590
-
2591
- .col-6 {
2592
-
2593
-
2594
- -webkit-box-flex: 0;
2595
-
2596
-
2597
- -ms-flex: 0 0 50%;
2598
-
2599
-
2600
- flex: 0 0 50%;
2601
-
2602
-
2603
- max-width: 50%
2604
-
2605
-
2606
- }
2607
-
2608
-
2609
-
2610
-
2611
-
2612
- .col-7 {
2613
-
2614
-
2615
- -webkit-box-flex: 0;
2616
-
2617
-
2618
- -ms-flex: 0 0 58.333333%;
2619
-
2620
-
2621
- flex: 0 0 58.333333%;
2622
-
2623
-
2624
- max-width: 58.333333%
2625
-
2626
-
2627
- }
2628
-
2629
-
2630
-
2631
-
2632
-
2633
- .col-8 {
2634
-
2635
-
2636
- -webkit-box-flex: 0;
2637
-
2638
-
2639
- -ms-flex: 0 0 66.666667%;
2640
-
2641
-
2642
- flex: 0 0 66.666667%;
2643
-
2644
-
2645
- max-width: 66.666667%
2646
-
2647
-
2648
- }
2649
-
2650
-
2651
-
2652
-
2653
-
2654
- .col-9 {
2655
-
2656
-
2657
- -webkit-box-flex: 0;
2658
-
2659
-
2660
- -ms-flex: 0 0 75%;
2661
-
2662
-
2663
- flex: 0 0 75%;
2664
-
2665
-
2666
- max-width: 75%
2667
-
2668
-
2669
- }
2670
-
2671
-
2672
-
2673
-
2674
-
2675
- .col-10 {
2676
-
2677
-
2678
- -webkit-box-flex: 0;
2679
-
2680
-
2681
- -ms-flex: 0 0 83.333333%;
2682
-
2683
-
2684
- flex: 0 0 83.333333%;
2685
-
2686
-
2687
- max-width: 83.333333%
2688
-
2689
-
2690
- }
2691
-
2692
-
2693
-
2694
-
2695
-
2696
- .col-11 {
2697
-
2698
-
2699
- -webkit-box-flex: 0;
2700
-
2701
-
2702
- -ms-flex: 0 0 91.666667%;
2703
-
2704
-
2705
- flex: 0 0 91.666667%;
2706
-
2707
-
2708
- max-width: 91.666667%
2709
-
2710
-
2711
- }
2712
-
2713
-
2714
-
2715
-
2716
-
2717
- .col-12 {
2718
-
2719
-
2720
- -webkit-box-flex: 0;
2721
-
2722
-
2723
- -ms-flex: 0 0 100%;
2724
-
2725
-
2726
- flex: 0 0 100%;
2727
-
2728
-
2729
- max-width: 100%
2730
-
2731
-
2732
- }
2733
-
2734
-
2735
-
2736
-
2737
-
2738
- .order-first {
2739
-
2740
-
2741
- -webkit-box-ordinal-group: 0;
2742
-
2743
-
2744
- -ms-flex-order: -1;
2745
-
2746
-
2747
- order: -1
2748
-
2749
-
2750
- }
2751
-
2752
-
2753
-
2754
-
2755
-
2756
- .order-last {
2757
-
2758
-
2759
- -webkit-box-ordinal-group: 14;
2760
-
2761
-
2762
- -ms-flex-order: 13;
2763
-
2764
-
2765
- order: 13
2766
-
2767
-
2768
- }
2769
-
2770
-
2771
-
2772
-
2773
-
2774
- .order-0 {
2775
-
2776
-
2777
- -webkit-box-ordinal-group: 1;
2778
-
2779
-
2780
- -ms-flex-order: 0;
2781
-
2782
-
2783
- order: 0
2784
-
2785
-
2786
- }
2787
-
2788
-
2789
-
2790
-
2791
-
2792
- .order-1 {
2793
-
2794
-
2795
- -webkit-box-ordinal-group: 2;
2796
-
2797
-
2798
- -ms-flex-order: 1;
2799
-
2800
-
2801
- order: 1
2802
-
2803
-
2804
- }
2805
-
2806
-
2807
-
2808
-
2809
-
2810
- .order-2 {
2811
-
2812
-
2813
- -webkit-box-ordinal-group: 3;
2814
-
2815
-
2816
- -ms-flex-order: 2;
2817
-
2818
-
2819
- order: 2
2820
-
2821
-
2822
- }
2823
-
2824
-
2825
-
2826
-
2827
-
2828
- .order-3 {
2829
-
2830
-
2831
- -webkit-box-ordinal-group: 4;
2832
-
2833
-
2834
- -ms-flex-order: 3;
2835
-
2836
-
2837
- order: 3
2838
-
2839
-
2840
- }
2841
-
2842
-
2843
-
2844
-
2845
-
2846
- .order-4 {
2847
-
2848
-
2849
- -webkit-box-ordinal-group: 5;
2850
-
2851
-
2852
- -ms-flex-order: 4;
2853
-
2854
-
2855
- order: 4
2856
-
2857
-
2858
- }
2859
-
2860
-
2861
-
2862
-
2863
-
2864
- .order-5 {
2865
-
2866
-
2867
- -webkit-box-ordinal-group: 6;
2868
-
2869
-
2870
- -ms-flex-order: 5;
2871
-
2872
-
2873
- order: 5
2874
-
2875
-
2876
- }
2877
-
2878
-
2879
-
2880
-
2881
-
2882
- .order-6 {
2883
-
2884
-
2885
- -webkit-box-ordinal-group: 7;
2886
-
2887
-
2888
- -ms-flex-order: 6;
2889
-
2890
-
2891
- order: 6
2892
-
2893
-
2894
- }
2895
-
2896
-
2897
-
2898
-
2899
-
2900
- .order-7 {
2901
-
2902
-
2903
- -webkit-box-ordinal-group: 8;
2904
-
2905
-
2906
- -ms-flex-order: 7;
2907
-
2908
-
2909
- order: 7
2910
-
2911
-
2912
- }
2913
-
2914
-
2915
-
2916
-
2917
-
2918
- .order-8 {
2919
-
2920
-
2921
- -webkit-box-ordinal-group: 9;
2922
-
2923
-
2924
- -ms-flex-order: 8;
2925
-
2926
-
2927
- order: 8
2928
-
2929
-
2930
- }
2931
-
2932
-
2933
-
2934
-
2935
-
2936
- .order-9 {
2937
-
2938
-
2939
- -webkit-box-ordinal-group: 10;
2940
-
2941
-
2942
- -ms-flex-order: 9;
2943
-
2944
-
2945
- order: 9
2946
-
2947
-
2948
- }
2949
-
2950
-
2951
-
2952
-
2953
-
2954
- .order-10 {
2955
-
2956
-
2957
- -webkit-box-ordinal-group: 11;
2958
-
2959
-
2960
- -ms-flex-order: 10;
2961
-
2962
-
2963
- order: 10
2964
-
2965
-
2966
- }
2967
-
2968
-
2969
-
2970
-
2971
-
2972
- .order-11 {
2973
-
2974
-
2975
- -webkit-box-ordinal-group: 12;
2976
-
2977
-
2978
- -ms-flex-order: 11;
2979
-
2980
-
2981
- order: 11
2982
-
2983
-
2984
- }
2985
-
2986
-
2987
-
2988
-
2989
-
2990
- .order-12 {
2991
-
2992
-
2993
- -webkit-box-ordinal-group: 13;
2994
-
2995
-
2996
- -ms-flex-order: 12;
2997
-
2998
-
2999
- order: 12
3000
-
3001
-
3002
- }
3003
-
3004
-
3005
-
3006
-
3007
-
3008
- .offset-1 {
3009
-
3010
-
3011
- margin-left: 8.333333%
3012
-
3013
-
3014
- }
3015
-
3016
-
3017
-
3018
-
3019
-
3020
- .offset-2 {
3021
-
3022
-
3023
- margin-left: 16.666667%
3024
-
3025
-
3026
- }
3027
-
3028
-
3029
-
3030
-
3031
-
3032
- .offset-3 {
3033
-
3034
-
3035
- margin-left: 25%
3036
-
3037
-
3038
- }
3039
-
3040
-
3041
-
3042
-
3043
-
3044
- .offset-4 {
3045
-
3046
-
3047
- margin-left: 33.333333%
3048
-
3049
-
3050
- }
3051
-
3052
-
3053
-
3054
-
3055
-
3056
- .offset-5 {
3057
-
3058
-
3059
- margin-left: 41.666667%
3060
-
3061
-
3062
- }
3063
-
3064
-
3065
-
3066
-
3067
-
3068
- .offset-6 {
3069
-
3070
-
3071
- margin-left: 50%
3072
-
3073
-
3074
- }
3075
-
3076
-
3077
-
3078
-
3079
-
3080
- .offset-7 {
3081
-
3082
-
3083
- margin-left: 58.333333%
3084
-
3085
-
3086
- }
3087
-
3088
-
3089
-
3090
-
3091
-
3092
- .offset-8 {
3093
-
3094
-
3095
- margin-left: 66.666667%
3096
-
3097
-
3098
- }
3099
-
3100
-
3101
-
3102
-
3103
-
3104
- .offset-9 {
3105
-
3106
-
3107
- margin-left: 75%
3108
-
3109
-
3110
- }
3111
-
3112
-
3113
-
3114
-
3115
-
3116
- .offset-10 {
3117
-
3118
-
3119
- margin-left: 83.333333%
3120
-
3121
-
3122
- }
3123
-
3124
-
3125
-
3126
-
3127
-
3128
- .offset-11 {
3129
-
3130
-
3131
- margin-left: 91.666667%
3132
-
3133
-
3134
- }
3135
-
3136
-
3137
-
3138
-
3139
-
3140
- @media (min-width: 576px) {
3141
-
3142
-
3143
- .col-sm {
3144
-
3145
-
3146
- -ms-flex-preferred-size: 0;
3147
-
3148
-
3149
- flex-basis: 0;
3150
-
3151
-
3152
- -webkit-box-flex: 1;
3153
-
3154
-
3155
- -ms-flex-positive: 1;
3156
-
3157
-
3158
- flex-grow: 1;
3159
-
3160
-
3161
- max-width: 100%
3162
-
3163
-
3164
- }
3165
-
3166
-
3167
-
3168
-
3169
-
3170
- .col-sm-auto {
3171
-
3172
-
3173
- -webkit-box-flex: 0;
3174
-
3175
-
3176
- -ms-flex: 0 0 auto;
3177
-
3178
-
3179
- flex: 0 0 auto;
3180
-
3181
-
3182
- width: auto;
3183
-
3184
-
3185
- max-width: none
3186
-
3187
-
3188
- }
3189
-
3190
-
3191
-
3192
-
3193
-
3194
- .col-sm-1 {
3195
-
3196
-
3197
- -webkit-box-flex: 0;
3198
-
3199
-
3200
- -ms-flex: 0 0 8.333333%;
3201
-
3202
-
3203
- flex: 0 0 8.333333%;
3204
-
3205
-
3206
- max-width: 8.333333%
3207
-
3208
-
3209
- }
3210
-
3211
-
3212
-
3213
-
3214
-
3215
- .col-sm-2 {
3216
-
3217
-
3218
- -webkit-box-flex: 0;
3219
-
3220
-
3221
- -ms-flex: 0 0 16.666667%;
3222
-
3223
-
3224
- flex: 0 0 16.666667%;
3225
-
3226
-
3227
- max-width: 16.666667%
3228
-
3229
-
3230
- }
3231
-
3232
-
3233
-
3234
-
3235
-
3236
- .col-sm-3 {
3237
-
3238
-
3239
- -webkit-box-flex: 0;
3240
-
3241
-
3242
- -ms-flex: 0 0 25%;
3243
-
3244
-
3245
- flex: 0 0 25%;
3246
-
3247
-
3248
- max-width: 25%
3249
-
3250
-
3251
- }
3252
-
3253
-
3254
-
3255
-
3256
-
3257
- .col-sm-4 {
3258
-
3259
-
3260
- -webkit-box-flex: 0;
3261
-
3262
-
3263
- -ms-flex: 0 0 33.333333%;
3264
-
3265
-
3266
- flex: 0 0 33.333333%;
3267
-
3268
-
3269
- max-width: 33.333333%
3270
-
3271
-
3272
- }
3273
-
3274
-
3275
-
3276
-
3277
-
3278
- .col-sm-5 {
3279
-
3280
-
3281
- -webkit-box-flex: 0;
3282
-
3283
-
3284
- -ms-flex: 0 0 41.666667%;
3285
-
3286
-
3287
- flex: 0 0 41.666667%;
3288
-
3289
-
3290
- max-width: 41.666667%
3291
-
3292
-
3293
- }
3294
-
3295
-
3296
-
3297
-
3298
-
3299
- .col-sm-6 {
3300
-
3301
-
3302
- -webkit-box-flex: 0;
3303
-
3304
-
3305
- -ms-flex: 0 0 50%;
3306
-
3307
-
3308
- flex: 0 0 50%;
3309
-
3310
-
3311
- max-width: 50%
3312
-
3313
-
3314
- }
3315
-
3316
-
3317
-
3318
-
3319
-
3320
- .col-sm-7 {
3321
-
3322
-
3323
- -webkit-box-flex: 0;
3324
-
3325
-
3326
- -ms-flex: 0 0 58.333333%;
3327
-
3328
-
3329
- flex: 0 0 58.333333%;
3330
-
3331
-
3332
- max-width: 58.333333%
3333
-
3334
-
3335
- }
3336
-
3337
-
3338
-
3339
-
3340
-
3341
- .col-sm-8 {
3342
-
3343
-
3344
- -webkit-box-flex: 0;
3345
-
3346
-
3347
- -ms-flex: 0 0 66.666667%;
3348
-
3349
-
3350
- flex: 0 0 66.666667%;
3351
-
3352
-
3353
- max-width: 66.666667%
3354
-
3355
-
3356
- }
3357
-
3358
-
3359
-
3360
-
3361
-
3362
- .col-sm-9 {
3363
-
3364
-
3365
- -webkit-box-flex: 0;
3366
-
3367
-
3368
- -ms-flex: 0 0 75%;
3369
-
3370
-
3371
- flex: 0 0 75%;
3372
-
3373
-
3374
- max-width: 75%
3375
-
3376
-
3377
- }
3378
-
3379
-
3380
-
3381
-
3382
-
3383
- .col-sm-10 {
3384
-
3385
-
3386
- -webkit-box-flex: 0;
3387
-
3388
-
3389
- -ms-flex: 0 0 83.333333%;
3390
-
3391
-
3392
- flex: 0 0 83.333333%;
3393
-
3394
-
3395
- max-width: 83.333333%
3396
-
3397
-
3398
- }
3399
-
3400
-
3401
-
3402
-
3403
-
3404
- .col-sm-11 {
3405
-
3406
-
3407
- -webkit-box-flex: 0;
3408
-
3409
-
3410
- -ms-flex: 0 0 91.666667%;
3411
-
3412
-
3413
- flex: 0 0 91.666667%;
3414
-
3415
-
3416
- max-width: 91.666667%
3417
-
3418
-
3419
- }
3420
-
3421
-
3422
-
3423
-
3424
-
3425
- .col-sm-12 {
3426
-
3427
-
3428
- -webkit-box-flex: 0;
3429
-
3430
-
3431
- -ms-flex: 0 0 100%;
3432
-
3433
-
3434
- flex: 0 0 100%;
3435
-
3436
-
3437
- max-width: 100%
3438
-
3439
-
3440
- }
3441
-
3442
-
3443
-
3444
-
3445
-
3446
- .order-sm-first {
3447
-
3448
-
3449
- -webkit-box-ordinal-group: 0;
3450
-
3451
-
3452
- -ms-flex-order: -1;
3453
-
3454
-
3455
- order: -1
3456
-
3457
-
3458
- }
3459
-
3460
-
3461
-
3462
-
3463
-
3464
- .order-sm-last {
3465
-
3466
-
3467
- -webkit-box-ordinal-group: 14;
3468
-
3469
-
3470
- -ms-flex-order: 13;
3471
-
3472
-
3473
- order: 13
3474
-
3475
-
3476
- }
3477
-
3478
-
3479
-
3480
-
3481
-
3482
- .order-sm-0 {
3483
-
3484
-
3485
- -webkit-box-ordinal-group: 1;
3486
-
3487
-
3488
- -ms-flex-order: 0;
3489
-
3490
-
3491
- order: 0
3492
-
3493
-
3494
- }
3495
-
3496
-
3497
-
3498
-
3499
-
3500
- .order-sm-1 {
3501
-
3502
-
3503
- -webkit-box-ordinal-group: 2;
3504
-
3505
-
3506
- -ms-flex-order: 1;
3507
-
3508
-
3509
- order: 1
3510
-
3511
-
3512
- }
3513
-
3514
-
3515
-
3516
-
3517
-
3518
- .order-sm-2 {
3519
-
3520
-
3521
- -webkit-box-ordinal-group: 3;
3522
-
3523
-
3524
- -ms-flex-order: 2;
3525
-
3526
-
3527
- order: 2
3528
-
3529
-
3530
- }
3531
-
3532
-
3533
-
3534
-
3535
-
3536
- .order-sm-3 {
3537
-
3538
-
3539
- -webkit-box-ordinal-group: 4;
3540
-
3541
-
3542
- -ms-flex-order: 3;
3543
-
3544
-
3545
- order: 3
3546
-
3547
-
3548
- }
3549
-
3550
-
3551
-
3552
-
3553
-
3554
- .order-sm-4 {
3555
-
3556
-
3557
- -webkit-box-ordinal-group: 5;
3558
-
3559
-
3560
- -ms-flex-order: 4;
3561
-
3562
-
3563
- order: 4
3564
-
3565
-
3566
- }
3567
-
3568
-
3569
-
3570
-
3571
-
3572
- .order-sm-5 {
3573
-
3574
-
3575
- -webkit-box-ordinal-group: 6;
3576
-
3577
-
3578
- -ms-flex-order: 5;
3579
-
3580
-
3581
- order: 5
3582
-
3583
-
3584
- }
3585
-
3586
-
3587
-
3588
-
3589
-
3590
- .order-sm-6 {
3591
-
3592
-
3593
- -webkit-box-ordinal-group: 7;
3594
-
3595
-
3596
- -ms-flex-order: 6;
3597
-
3598
-
3599
- order: 6
3600
-
3601
-
3602
- }
3603
-
3604
-
3605
-
3606
-
3607
-
3608
- .order-sm-7 {
3609
-
3610
-
3611
- -webkit-box-ordinal-group: 8;
3612
-
3613
-
3614
- -ms-flex-order: 7;
3615
-
3616
-
3617
- order: 7
3618
-
3619
-
3620
- }
3621
-
3622
-
3623
-
3624
-
3625
-
3626
- .order-sm-8 {
3627
-
3628
-
3629
- -webkit-box-ordinal-group: 9;
3630
-
3631
-
3632
- -ms-flex-order: 8;
3633
-
3634
-
3635
- order: 8
3636
-
3637
-
3638
- }
3639
-
3640
-
3641
-
3642
-
3643
-
3644
- .order-sm-9 {
3645
-
3646
-
3647
- -webkit-box-ordinal-group: 10;
3648
-
3649
-
3650
- -ms-flex-order: 9;
3651
-
3652
-
3653
- order: 9
3654
-
3655
-
3656
- }
3657
-
3658
-
3659
-
3660
-
3661
-
3662
- .order-sm-10 {
3663
-
3664
-
3665
- -webkit-box-ordinal-group: 11;
3666
-
3667
-
3668
- -ms-flex-order: 10;
3669
-
3670
-
3671
- order: 10
3672
-
3673
-
3674
- }
3675
-
3676
-
3677
-
3678
-
3679
-
3680
- .order-sm-11 {
3681
-
3682
-
3683
- -webkit-box-ordinal-group: 12;
3684
-
3685
-
3686
- -ms-flex-order: 11;
3687
-
3688
-
3689
- order: 11
3690
-
3691
-
3692
- }
3693
-
3694
-
3695
-
3696
-
3697
-
3698
- .order-sm-12 {
3699
-
3700
-
3701
- -webkit-box-ordinal-group: 13;
3702
-
3703
-
3704
- -ms-flex-order: 12;
3705
-
3706
-
3707
- order: 12
3708
-
3709
-
3710
- }
3711
-
3712
-
3713
-
3714
-
3715
-
3716
- .offset-sm-0 {
3717
-
3718
-
3719
- margin-left: 0
3720
-
3721
-
3722
- }
3723
-
3724
-
3725
-
3726
-
3727
-
3728
- .offset-sm-1 {
3729
-
3730
-
3731
- margin-left: 8.333333%
3732
-
3733
-
3734
- }
3735
-
3736
-
3737
-
3738
-
3739
-
3740
- .offset-sm-2 {
3741
-
3742
-
3743
- margin-left: 16.666667%
3744
-
3745
-
3746
- }
3747
-
3748
-
3749
-
3750
-
3751
-
3752
- .offset-sm-3 {
3753
-
3754
-
3755
- margin-left: 25%
3756
-
3757
-
3758
- }
3759
-
3760
-
3761
-
3762
-
3763
-
3764
- .offset-sm-4 {
3765
-
3766
-
3767
- margin-left: 33.333333%
3768
-
3769
-
3770
- }
3771
-
3772
-
3773
-
3774
-
3775
-
3776
- .offset-sm-5 {
3777
-
3778
-
3779
- margin-left: 41.666667%
3780
-
3781
-
3782
- }
3783
-
3784
-
3785
-
3786
-
3787
-
3788
- .offset-sm-6 {
3789
-
3790
-
3791
- margin-left: 50%
3792
-
3793
-
3794
- }
3795
-
3796
-
3797
-
3798
-
3799
-
3800
- .offset-sm-7 {
3801
-
3802
-
3803
- margin-left: 58.333333%
3804
-
3805
-
3806
- }
3807
-
3808
-
3809
-
3810
-
3811
-
3812
- .offset-sm-8 {
3813
-
3814
-
3815
- margin-left: 66.666667%
3816
-
3817
-
3818
- }
3819
-
3820
-
3821
-
3822
-
3823
-
3824
- .offset-sm-9 {
3825
-
3826
-
3827
- margin-left: 75%
3828
-
3829
-
3830
- }
3831
-
3832
-
3833
-
3834
-
3835
-
3836
- .offset-sm-10 {
3837
-
3838
-
3839
- margin-left: 83.333333%
3840
-
3841
-
3842
- }
3843
-
3844
-
3845
-
3846
-
3847
-
3848
- .offset-sm-11 {
3849
-
3850
-
3851
- margin-left: 91.666667%
3852
-
3853
-
3854
- }
3855
-
3856
-
3857
- }
3858
-
3859
-
3860
-
3861
-
3862
-
3863
- @media (min-width: 768px) {
3864
-
3865
-
3866
- .col-md {
3867
-
3868
-
3869
- -ms-flex-preferred-size: 0;
3870
-
3871
-
3872
- flex-basis: 0;
3873
-
3874
-
3875
- -webkit-box-flex: 1;
3876
-
3877
-
3878
- -ms-flex-positive: 1;
3879
-
3880
-
3881
- flex-grow: 1;
3882
-
3883
-
3884
- max-width: 100%
3885
-
3886
-
3887
- }
3888
-
3889
-
3890
-
3891
-
3892
-
3893
- .col-md-auto {
3894
-
3895
-
3896
- -webkit-box-flex: 0;
3897
-
3898
-
3899
- -ms-flex: 0 0 auto;
3900
-
3901
-
3902
- flex: 0 0 auto;
3903
-
3904
-
3905
- width: auto;
3906
-
3907
-
3908
- max-width: none
3909
-
3910
-
3911
- }
3912
-
3913
-
3914
-
3915
-
3916
-
3917
- .col-md-1 {
3918
-
3919
-
3920
- -webkit-box-flex: 0;
3921
-
3922
-
3923
- -ms-flex: 0 0 8.333333%;
3924
-
3925
-
3926
- flex: 0 0 8.333333%;
3927
-
3928
-
3929
- max-width: 8.333333%
3930
-
3931
-
3932
- }
3933
-
3934
-
3935
-
3936
-
3937
-
3938
- .col-md-2 {
3939
-
3940
-
3941
- -webkit-box-flex: 0;
3942
-
3943
-
3944
- -ms-flex: 0 0 16.666667%;
3945
-
3946
-
3947
- flex: 0 0 16.666667%;
3948
-
3949
-
3950
- max-width: 16.666667%
3951
-
3952
-
3953
- }
3954
-
3955
-
3956
-
3957
-
3958
-
3959
- .col-md-3 {
3960
-
3961
-
3962
- -webkit-box-flex: 0;
3963
-
3964
-
3965
- -ms-flex: 0 0 25%;
3966
-
3967
-
3968
- flex: 0 0 25%;
3969
-
3970
-
3971
- max-width: 25%
3972
-
3973
-
3974
- }
3975
-
3976
-
3977
-
3978
-
3979
-
3980
- .col-md-4 {
3981
-
3982
-
3983
- -webkit-box-flex: 0;
3984
-
3985
-
3986
- -ms-flex: 0 0 33.333333%;
3987
-
3988
-
3989
- flex: 0 0 33.333333%;
3990
-
3991
-
3992
- max-width: 33.333333%
3993
-
3994
-
3995
- }
3996
-
3997
-
3998
-
3999
-
4000
-
4001
- .col-md-5 {
4002
-
4003
-
4004
- -webkit-box-flex: 0;
4005
-
4006
-
4007
- -ms-flex: 0 0 41.666667%;
4008
-
4009
-
4010
- flex: 0 0 41.666667%;
4011
-
4012
-
4013
- max-width: 41.666667%
4014
-
4015
-
4016
- }
4017
-
4018
-
4019
-
4020
-
4021
-
4022
- .col-md-6 {
4023
-
4024
-
4025
- -webkit-box-flex: 0;
4026
-
4027
-
4028
- -ms-flex: 0 0 50%;
4029
-
4030
-
4031
- flex: 0 0 50%;
4032
-
4033
-
4034
- max-width: 50%
4035
-
4036
-
4037
- }
4038
-
4039
-
4040
-
4041
-
4042
-
4043
- .col-md-7 {
4044
-
4045
-
4046
- -webkit-box-flex: 0;
4047
-
4048
-
4049
- -ms-flex: 0 0 58.333333%;
4050
-
4051
-
4052
- flex: 0 0 58.333333%;
4053
-
4054
-
4055
- max-width: 58.333333%
4056
-
4057
-
4058
- }
4059
-
4060
-
4061
-
4062
-
4063
-
4064
- .col-md-8 {
4065
-
4066
-
4067
- -webkit-box-flex: 0;
4068
-
4069
-
4070
- -ms-flex: 0 0 66.666667%;
4071
-
4072
-
4073
- flex: 0 0 66.666667%;
4074
-
4075
-
4076
- max-width: 66.666667%
4077
-
4078
-
4079
- }
4080
-
4081
-
4082
-
4083
-
4084
-
4085
- .col-md-9 {
4086
-
4087
-
4088
- -webkit-box-flex: 0;
4089
-
4090
-
4091
- -ms-flex: 0 0 75%;
4092
-
4093
-
4094
- flex: 0 0 75%;
4095
-
4096
-
4097
- max-width: 75%
4098
-
4099
-
4100
- }
4101
-
4102
-
4103
-
4104
-
4105
-
4106
- .col-md-10 {
4107
-
4108
-
4109
- -webkit-box-flex: 0;
4110
-
4111
-
4112
- -ms-flex: 0 0 83.333333%;
4113
-
4114
-
4115
- flex: 0 0 83.333333%;
4116
-
4117
-
4118
- max-width: 83.333333%
4119
-
4120
-
4121
- }
4122
-
4123
-
4124
-
4125
-
4126
-
4127
- .col-md-11 {
4128
-
4129
-
4130
- -webkit-box-flex: 0;
4131
-
4132
-
4133
- -ms-flex: 0 0 91.666667%;
4134
-
4135
-
4136
- flex: 0 0 91.666667%;
4137
-
4138
-
4139
- max-width: 91.666667%
4140
-
4141
-
4142
- }
4143
-
4144
-
4145
-
4146
-
4147
-
4148
- .col-md-12 {
4149
-
4150
-
4151
- -webkit-box-flex: 0;
4152
-
4153
-
4154
- -ms-flex: 0 0 100%;
4155
-
4156
-
4157
- flex: 0 0 100%;
4158
-
4159
-
4160
- max-width: 100%
4161
-
4162
-
4163
- }
4164
-
4165
-
4166
-
4167
-
4168
-
4169
- .order-md-first {
4170
-
4171
-
4172
- -webkit-box-ordinal-group: 0;
4173
-
4174
-
4175
- -ms-flex-order: -1;
4176
-
4177
-
4178
- order: -1
4179
-
4180
-
4181
- }
4182
-
4183
-
4184
-
4185
-
4186
-
4187
- .order-md-last {
4188
-
4189
-
4190
- -webkit-box-ordinal-group: 14;
4191
-
4192
-
4193
- -ms-flex-order: 13;
4194
-
4195
-
4196
- order: 13
4197
-
4198
-
4199
- }
4200
-
4201
-
4202
-
4203
-
4204
-
4205
- .order-md-0 {
4206
-
4207
-
4208
- -webkit-box-ordinal-group: 1;
4209
-
4210
-
4211
- -ms-flex-order: 0;
4212
-
4213
-
4214
- order: 0
4215
-
4216
-
4217
- }
4218
-
4219
-
4220
-
4221
-
4222
-
4223
- .order-md-1 {
4224
-
4225
-
4226
- -webkit-box-ordinal-group: 2;
4227
-
4228
-
4229
- -ms-flex-order: 1;
4230
-
4231
-
4232
- order: 1
4233
-
4234
-
4235
- }
4236
-
4237
-
4238
-
4239
-
4240
-
4241
- .order-md-2 {
4242
-
4243
-
4244
- -webkit-box-ordinal-group: 3;
4245
-
4246
-
4247
- -ms-flex-order: 2;
4248
-
4249
-
4250
- order: 2
4251
-
4252
-
4253
- }
4254
-
4255
-
4256
-
4257
-
4258
-
4259
- .order-md-3 {
4260
-
4261
-
4262
- -webkit-box-ordinal-group: 4;
4263
-
4264
-
4265
- -ms-flex-order: 3;
4266
-
4267
-
4268
- order: 3
4269
-
4270
-
4271
- }
4272
-
4273
-
4274
-
4275
-
4276
-
4277
- .order-md-4 {
4278
-
4279
-
4280
- -webkit-box-ordinal-group: 5;
4281
-
4282
-
4283
- -ms-flex-order: 4;
4284
-
4285
-
4286
- order: 4
4287
-
4288
-
4289
- }
4290
-
4291
-
4292
-
4293
-
4294
-
4295
- .order-md-5 {
4296
-
4297
-
4298
- -webkit-box-ordinal-group: 6;
4299
-
4300
-
4301
- -ms-flex-order: 5;
4302
-
4303
-
4304
- order: 5
4305
-
4306
-
4307
- }
4308
-
4309
-
4310
-
4311
-
4312
-
4313
- .order-md-6 {
4314
-
4315
-
4316
- -webkit-box-ordinal-group: 7;
4317
-
4318
-
4319
- -ms-flex-order: 6;
4320
-
4321
-
4322
- order: 6
4323
-
4324
-
4325
- }
4326
-
4327
-
4328
-
4329
-
4330
-
4331
- .order-md-7 {
4332
-
4333
-
4334
- -webkit-box-ordinal-group: 8;
4335
-
4336
-
4337
- -ms-flex-order: 7;
4338
-
4339
-
4340
- order: 7
4341
-
4342
-
4343
- }
4344
-
4345
-
4346
-
4347
-
4348
-
4349
- .order-md-8 {
4350
-
4351
-
4352
- -webkit-box-ordinal-group: 9;
4353
-
4354
-
4355
- -ms-flex-order: 8;
4356
-
4357
-
4358
- order: 8
4359
-
4360
-
4361
- }
4362
-
4363
-
4364
-
4365
-
4366
-
4367
- .order-md-9 {
4368
-
4369
-
4370
- -webkit-box-ordinal-group: 10;
4371
-
4372
-
4373
- -ms-flex-order: 9;
4374
-
4375
-
4376
- order: 9
4377
-
4378
-
4379
- }
4380
-
4381
-
4382
-
4383
-
4384
-
4385
- .order-md-10 {
4386
-
4387
-
4388
- -webkit-box-ordinal-group: 11;
4389
-
4390
-
4391
- -ms-flex-order: 10;
4392
-
4393
-
4394
- order: 10
4395
-
4396
-
4397
- }
4398
-
4399
-
4400
-
4401
-
4402
-
4403
- .order-md-11 {
4404
-
4405
-
4406
- -webkit-box-ordinal-group: 12;
4407
-
4408
-
4409
- -ms-flex-order: 11;
4410
-
4411
-
4412
- order: 11
4413
-
4414
-
4415
- }
4416
-
4417
-
4418
-
4419
-
4420
-
4421
- .order-md-12 {
4422
-
4423
-
4424
- -webkit-box-ordinal-group: 13;
4425
-
4426
-
4427
- -ms-flex-order: 12;
4428
-
4429
-
4430
- order: 12
4431
-
4432
-
4433
- }
4434
-
4435
-
4436
-
4437
-
4438
-
4439
- .offset-md-0 {
4440
-
4441
-
4442
- margin-left: 0
4443
-
4444
-
4445
- }
4446
-
4447
-
4448
-
4449
-
4450
-
4451
- .offset-md-1 {
4452
-
4453
-
4454
- margin-left: 8.333333%
4455
-
4456
-
4457
- }
4458
-
4459
-
4460
-
4461
-
4462
-
4463
- .offset-md-2 {
4464
-
4465
-
4466
- margin-left: 16.666667%
4467
-
4468
-
4469
- }
4470
-
4471
-
4472
-
4473
-
4474
-
4475
- .offset-md-3 {
4476
-
4477
-
4478
- margin-left: 25%
4479
-
4480
-
4481
- }
4482
-
4483
-
4484
-
4485
-
4486
-
4487
- .offset-md-4 {
4488
-
4489
-
4490
- margin-left: 33.333333%
4491
-
4492
-
4493
- }
4494
-
4495
-
4496
-
4497
-
4498
-
4499
- .offset-md-5 {
4500
-
4501
-
4502
- margin-left: 41.666667%
4503
-
4504
-
4505
- }
4506
-
4507
-
4508
-
4509
-
4510
-
4511
- .offset-md-6 {
4512
-
4513
-
4514
- margin-left: 50%
4515
-
4516
-
4517
- }
4518
-
4519
-
4520
-
4521
-
4522
-
4523
- .offset-md-7 {
4524
-
4525
-
4526
- margin-left: 58.333333%
4527
-
4528
-
4529
- }
4530
-
4531
-
4532
-
4533
-
4534
-
4535
- .offset-md-8 {
4536
-
4537
-
4538
- margin-left: 66.666667%
4539
-
4540
-
4541
- }
4542
-
4543
-
4544
-
4545
-
4546
-
4547
- .offset-md-9 {
4548
-
4549
-
4550
- margin-left: 75%
4551
-
4552
-
4553
- }
4554
-
4555
-
4556
-
4557
-
4558
-
4559
- .offset-md-10 {
4560
-
4561
-
4562
- margin-left: 83.333333%
4563
-
4564
-
4565
- }
4566
-
4567
-
4568
-
4569
-
4570
-
4571
- .offset-md-11 {
4572
-
4573
-
4574
- margin-left: 91.666667%
4575
-
4576
-
4577
- }
4578
-
4579
-
4580
- }
4581
-
4582
-
4583
-
4584
-
4585
-
4586
- @media (min-width: 992px) {
4587
-
4588
-
4589
- .col-lg {
4590
-
4591
-
4592
- -ms-flex-preferred-size: 0;
4593
-
4594
-
4595
- flex-basis: 0;
4596
-
4597
-
4598
- -webkit-box-flex: 1;
4599
-
4600
-
4601
- -ms-flex-positive: 1;
4602
-
4603
-
4604
- flex-grow: 1;
4605
-
4606
-
4607
- max-width: 100%
4608
-
4609
-
4610
- }
4611
-
4612
-
4613
-
4614
-
4615
-
4616
- .col-lg-auto {
4617
-
4618
-
4619
- -webkit-box-flex: 0;
4620
-
4621
-
4622
- -ms-flex: 0 0 auto;
4623
-
4624
-
4625
- flex: 0 0 auto;
4626
-
4627
-
4628
- width: auto;
4629
-
4630
-
4631
- max-width: none
4632
-
4633
-
4634
- }
4635
-
4636
-
4637
-
4638
-
4639
-
4640
- .col-lg-1 {
4641
-
4642
-
4643
- -webkit-box-flex: 0;
4644
-
4645
-
4646
- -ms-flex: 0 0 8.333333%;
4647
-
4648
-
4649
- flex: 0 0 8.333333%;
4650
-
4651
-
4652
- max-width: 8.333333%
4653
-
4654
-
4655
- }
4656
-
4657
-
4658
-
4659
-
4660
-
4661
- .col-lg-2 {
4662
-
4663
-
4664
- -webkit-box-flex: 0;
4665
-
4666
-
4667
- -ms-flex: 0 0 16.666667%;
4668
-
4669
-
4670
- flex: 0 0 16.666667%;
4671
-
4672
-
4673
- max-width: 16.666667%
4674
-
4675
-
4676
- }
4677
-
4678
-
4679
-
4680
-
4681
-
4682
- .col-lg-3 {
4683
-
4684
-
4685
- -webkit-box-flex: 0;
4686
-
4687
-
4688
- -ms-flex: 0 0 25%;
4689
-
4690
-
4691
- flex: 0 0 25%;
4692
-
4693
-
4694
- max-width: 25%
4695
-
4696
-
4697
- }
4698
-
4699
-
4700
-
4701
-
4702
-
4703
- .col-lg-4 {
4704
-
4705
-
4706
- -webkit-box-flex: 0;
4707
-
4708
-
4709
- -ms-flex: 0 0 33.333333%;
4710
-
4711
-
4712
- flex: 0 0 33.333333%;
4713
-
4714
-
4715
- max-width: 33.333333%
4716
-
4717
-
4718
- }
4719
-
4720
-
4721
-
4722
-
4723
-
4724
- .col-lg-5 {
4725
-
4726
-
4727
- -webkit-box-flex: 0;
4728
-
4729
-
4730
- -ms-flex: 0 0 41.666667%;
4731
-
4732
-
4733
- flex: 0 0 41.666667%;
4734
-
4735
-
4736
- max-width: 41.666667%
4737
-
4738
-
4739
- }
4740
-
4741
-
4742
-
4743
-
4744
-
4745
- .col-lg-6 {
4746
-
4747
-
4748
- -webkit-box-flex: 0;
4749
-
4750
-
4751
- -ms-flex: 0 0 50%;
4752
-
4753
-
4754
- flex: 0 0 50%;
4755
-
4756
-
4757
- max-width: 50%
4758
-
4759
-
4760
- }
4761
-
4762
-
4763
-
4764
-
4765
-
4766
- .col-lg-7 {
4767
-
4768
-
4769
- -webkit-box-flex: 0;
4770
-
4771
-
4772
- -ms-flex: 0 0 58.333333%;
4773
-
4774
-
4775
- flex: 0 0 58.333333%;
4776
-
4777
-
4778
- max-width: 58.333333%
4779
-
4780
-
4781
- }
4782
-
4783
-
4784
-
4785
-
4786
-
4787
- .col-lg-8 {
4788
-
4789
-
4790
- -webkit-box-flex: 0;
4791
-
4792
-
4793
- -ms-flex: 0 0 66.666667%;
4794
-
4795
-
4796
- flex: 0 0 66.666667%;
4797
-
4798
-
4799
- max-width: 66.666667%
4800
-
4801
-
4802
- }
4803
-
4804
-
4805
-
4806
-
4807
-
4808
- .col-lg-9 {
4809
-
4810
-
4811
- -webkit-box-flex: 0;
4812
-
4813
-
4814
- -ms-flex: 0 0 75%;
4815
-
4816
-
4817
- flex: 0 0 75%;
4818
-
4819
-
4820
- max-width: 75%
4821
-
4822
-
4823
- }
4824
-
4825
-
4826
-
4827
-
4828
-
4829
- .col-lg-10 {
4830
-
4831
-
4832
- -webkit-box-flex: 0;
4833
-
4834
-
4835
- -ms-flex: 0 0 83.333333%;
4836
-
4837
-
4838
- flex: 0 0 83.333333%;
4839
-
4840
-
4841
- max-width: 83.333333%
4842
-
4843
-
4844
- }
4845
-
4846
-
4847
-
4848
-
4849
-
4850
- .col-lg-11 {
4851
-
4852
-
4853
- -webkit-box-flex: 0;
4854
-
4855
-
4856
- -ms-flex: 0 0 91.666667%;
4857
-
4858
-
4859
- flex: 0 0 91.666667%;
4860
-
4861
-
4862
- max-width: 91.666667%
4863
-
4864
-
4865
- }
4866
-
4867
-
4868
-
4869
-
4870
-
4871
- .col-lg-12 {
4872
-
4873
-
4874
- -webkit-box-flex: 0;
4875
-
4876
-
4877
- -ms-flex: 0 0 100%;
4878
-
4879
-
4880
- flex: 0 0 100%;
4881
-
4882
-
4883
- max-width: 100%
4884
-
4885
-
4886
- }
4887
-
4888
-
4889
-
4890
-
4891
-
4892
- .order-lg-first {
4893
-
4894
-
4895
- -webkit-box-ordinal-group: 0;
4896
-
4897
-
4898
- -ms-flex-order: -1;
4899
-
4900
-
4901
- order: -1
4902
-
4903
-
4904
- }
4905
-
4906
-
4907
-
4908
-
4909
-
4910
- .order-lg-last {
4911
-
4912
-
4913
- -webkit-box-ordinal-group: 14;
4914
-
4915
-
4916
- -ms-flex-order: 13;
4917
-
4918
-
4919
- order: 13
4920
-
4921
-
4922
- }
4923
-
4924
-
4925
-
4926
-
4927
-
4928
- .order-lg-0 {
4929
-
4930
-
4931
- -webkit-box-ordinal-group: 1;
4932
-
4933
-
4934
- -ms-flex-order: 0;
4935
-
4936
-
4937
- order: 0
4938
-
4939
-
4940
- }
4941
-
4942
-
4943
-
4944
-
4945
-
4946
- .order-lg-1 {
4947
-
4948
-
4949
- -webkit-box-ordinal-group: 2;
4950
-
4951
-
4952
- -ms-flex-order: 1;
4953
-
4954
-
4955
- order: 1
4956
-
4957
-
4958
- }
4959
-
4960
-
4961
-
4962
-
4963
-
4964
- .order-lg-2 {
4965
-
4966
-
4967
- -webkit-box-ordinal-group: 3;
4968
-
4969
-
4970
- -ms-flex-order: 2;
4971
-
4972
-
4973
- order: 2
4974
-
4975
-
4976
- }
4977
-
4978
-
4979
-
4980
-
4981
-
4982
- .order-lg-3 {
4983
-
4984
-
4985
- -webkit-box-ordinal-group: 4;
4986
-
4987
-
4988
- -ms-flex-order: 3;
4989
-
4990
-
4991
- order: 3
4992
-
4993
-
4994
- }
4995
-
4996
-
4997
-
4998
-
4999
-
5000
- .order-lg-4 {
5001
-
5002
-
5003
- -webkit-box-ordinal-group: 5;
5004
-
5005
-
5006
- -ms-flex-order: 4;
5007
-
5008
-
5009
- order: 4
5010
-
5011
-
5012
- }
5013
-
5014
-
5015
-
5016
-
5017
-
5018
- .order-lg-5 {
5019
-
5020
-
5021
- -webkit-box-ordinal-group: 6;
5022
-
5023
-
5024
- -ms-flex-order: 5;
5025
-
5026
-
5027
- order: 5
5028
-
5029
-
5030
- }
5031
-
5032
-
5033
-
5034
-
5035
-
5036
- .order-lg-6 {
5037
-
5038
-
5039
- -webkit-box-ordinal-group: 7;
5040
-
5041
-
5042
- -ms-flex-order: 6;
5043
-
5044
-
5045
- order: 6
5046
-
5047
-
5048
- }
5049
-
5050
-
5051
-
5052
-
5053
-
5054
- .order-lg-7 {
5055
-
5056
-
5057
- -webkit-box-ordinal-group: 8;
5058
-
5059
-
5060
- -ms-flex-order: 7;
5061
-
5062
-
5063
- order: 7
5064
-
5065
-
5066
- }
5067
-
5068
-
5069
-
5070
-
5071
-
5072
- .order-lg-8 {
5073
-
5074
-
5075
- -webkit-box-ordinal-group: 9;
5076
-
5077
-
5078
- -ms-flex-order: 8;
5079
-
5080
-
5081
- order: 8
5082
-
5083
-
5084
- }
5085
-
5086
-
5087
-
5088
-
5089
-
5090
- .order-lg-9 {
5091
-
5092
-
5093
- -webkit-box-ordinal-group: 10;
5094
-
5095
-
5096
- -ms-flex-order: 9;
5097
-
5098
-
5099
- order: 9
5100
-
5101
-
5102
- }
5103
-
5104
-
5105
-
5106
-
5107
-
5108
- .order-lg-10 {
5109
-
5110
-
5111
- -webkit-box-ordinal-group: 11;
5112
-
5113
-
5114
- -ms-flex-order: 10;
5115
-
5116
-
5117
- order: 10
5118
-
5119
-
5120
- }
5121
-
5122
-
5123
-
5124
-
5125
-
5126
- .order-lg-11 {
5127
-
5128
-
5129
- -webkit-box-ordinal-group: 12;
5130
-
5131
-
5132
- -ms-flex-order: 11;
5133
-
5134
-
5135
- order: 11
5136
-
5137
-
5138
- }
5139
-
5140
-
5141
-
5142
-
5143
-
5144
- .order-lg-12 {
5145
-
5146
-
5147
- -webkit-box-ordinal-group: 13;
5148
-
5149
-
5150
- -ms-flex-order: 12;
5151
-
5152
-
5153
- order: 12
5154
-
5155
-
5156
- }
5157
-
5158
-
5159
-
5160
-
5161
-
5162
- .offset-lg-0 {
5163
-
5164
-
5165
- margin-left: 0
5166
-
5167
-
5168
- }
5169
-
5170
-
5171
-
5172
-
5173
-
5174
- .offset-lg-1 {
5175
-
5176
-
5177
- margin-left: 8.333333%
5178
-
5179
-
5180
- }
5181
-
5182
-
5183
-
5184
-
5185
-
5186
- .offset-lg-2 {
5187
-
5188
-
5189
- margin-left: 16.666667%
5190
-
5191
-
5192
- }
5193
-
5194
-
5195
-
5196
-
5197
-
5198
- .offset-lg-3 {
5199
-
5200
-
5201
- margin-left: 25%
5202
-
5203
-
5204
- }
5205
-
5206
-
5207
-
5208
-
5209
-
5210
- .offset-lg-4 {
5211
-
5212
-
5213
- margin-left: 33.333333%
5214
-
5215
-
5216
- }
5217
-
5218
-
5219
-
5220
-
5221
-
5222
- .offset-lg-5 {
5223
-
5224
-
5225
- margin-left: 41.666667%
5226
-
5227
-
5228
- }
5229
-
5230
-
5231
-
5232
-
5233
-
5234
- .offset-lg-6 {
5235
-
5236
-
5237
- margin-left: 50%
5238
-
5239
-
5240
- }
5241
-
5242
-
5243
-
5244
-
5245
-
5246
- .offset-lg-7 {
5247
-
5248
-
5249
- margin-left: 58.333333%
5250
-
5251
-
5252
- }
5253
-
5254
-
5255
-
5256
-
5257
-
5258
- .offset-lg-8 {
5259
-
5260
-
5261
- margin-left: 66.666667%
5262
-
5263
-
5264
- }
5265
-
5266
-
5267
-
5268
-
5269
-
5270
- .offset-lg-9 {
5271
-
5272
-
5273
- margin-left: 75%
5274
-
5275
-
5276
- }
5277
-
5278
-
5279
-
5280
-
5281
-
5282
- .offset-lg-10 {
5283
-
5284
-
5285
- margin-left: 83.333333%
5286
-
5287
-
5288
- }
5289
-
5290
-
5291
-
5292
-
5293
-
5294
- .offset-lg-11 {
5295
-
5296
-
5297
- margin-left: 91.666667%
5298
-
5299
-
5300
- }
5301
-
5302
-
5303
- }
5304
-
5305
-
5306
-
5307
-
5308
-
5309
- @media (min-width: 1200px) {
5310
-
5311
-
5312
- .col-xl {
5313
-
5314
-
5315
- -ms-flex-preferred-size: 0;
5316
-
5317
-
5318
- flex-basis: 0;
5319
-
5320
-
5321
- -webkit-box-flex: 1;
5322
-
5323
-
5324
- -ms-flex-positive: 1;
5325
-
5326
-
5327
- flex-grow: 1;
5328
-
5329
-
5330
- max-width: 100%
5331
-
5332
-
5333
- }
5334
-
5335
-
5336
-
5337
-
5338
-
5339
- .col-xl-auto {
5340
-
5341
-
5342
- -webkit-box-flex: 0;
5343
-
5344
-
5345
- -ms-flex: 0 0 auto;
5346
-
5347
-
5348
- flex: 0 0 auto;
5349
-
5350
-
5351
- width: auto;
5352
-
5353
-
5354
- max-width: none
5355
-
5356
-
5357
- }
5358
-
5359
-
5360
-
5361
-
5362
-
5363
- .col-xl-1 {
5364
-
5365
-
5366
- -webkit-box-flex: 0;
5367
-
5368
-
5369
- -ms-flex: 0 0 8.333333%;
5370
-
5371
-
5372
- flex: 0 0 8.333333%;
5373
-
5374
-
5375
- max-width: 8.333333%
5376
-
5377
-
5378
- }
5379
-
5380
-
5381
-
5382
-
5383
-
5384
- .col-xl-2 {
5385
-
5386
-
5387
- -webkit-box-flex: 0;
5388
-
5389
-
5390
- -ms-flex: 0 0 16.666667%;
5391
-
5392
-
5393
- flex: 0 0 16.666667%;
5394
-
5395
-
5396
- max-width: 16.666667%
5397
-
5398
-
5399
- }
5400
-
5401
-
5402
-
5403
-
5404
-
5405
- .col-xl-3 {
5406
-
5407
-
5408
- -webkit-box-flex: 0;
5409
-
5410
-
5411
- -ms-flex: 0 0 25%;
5412
-
5413
-
5414
- flex: 0 0 25%;
5415
-
5416
-
5417
- max-width: 25%
5418
-
5419
-
5420
- }
5421
-
5422
-
5423
-
5424
-
5425
-
5426
- .col-xl-4 {
5427
-
5428
-
5429
- -webkit-box-flex: 0;
5430
-
5431
-
5432
- -ms-flex: 0 0 33.333333%;
5433
-
5434
-
5435
- flex: 0 0 33.333333%;
5436
-
5437
-
5438
- max-width: 33.333333%
5439
-
5440
-
5441
- }
5442
-
5443
-
5444
-
5445
-
5446
-
5447
- .col-xl-5 {
5448
-
5449
-
5450
- -webkit-box-flex: 0;
5451
-
5452
-
5453
- -ms-flex: 0 0 41.666667%;
5454
-
5455
-
5456
- flex: 0 0 41.666667%;
5457
-
5458
-
5459
- max-width: 41.666667%
5460
-
5461
-
5462
- }
5463
-
5464
-
5465
-
5466
-
5467
-
5468
- .col-xl-6 {
5469
-
5470
-
5471
- -webkit-box-flex: 0;
5472
-
5473
-
5474
- -ms-flex: 0 0 50%;
5475
-
5476
-
5477
- flex: 0 0 50%;
5478
-
5479
-
5480
- max-width: 50%
5481
-
5482
-
5483
- }
5484
-
5485
-
5486
-
5487
-
5488
-
5489
- .col-xl-7 {
5490
-
5491
-
5492
- -webkit-box-flex: 0;
5493
-
5494
-
5495
- -ms-flex: 0 0 58.333333%;
5496
-
5497
-
5498
- flex: 0 0 58.333333%;
5499
-
5500
-
5501
- max-width: 58.333333%
5502
-
5503
-
5504
- }
5505
-
5506
-
5507
-
5508
-
5509
-
5510
- .col-xl-8 {
5511
-
5512
-
5513
- -webkit-box-flex: 0;
5514
-
5515
-
5516
- -ms-flex: 0 0 66.666667%;
5517
-
5518
-
5519
- flex: 0 0 66.666667%;
5520
-
5521
-
5522
- max-width: 66.666667%
5523
-
5524
-
5525
- }
5526
-
5527
-
5528
-
5529
-
5530
-
5531
- .col-xl-9 {
5532
-
5533
-
5534
- -webkit-box-flex: 0;
5535
-
5536
-
5537
- -ms-flex: 0 0 75%;
5538
-
5539
-
5540
- flex: 0 0 75%;
5541
-
5542
-
5543
- max-width: 75%
5544
-
5545
-
5546
- }
5547
-
5548
-
5549
-
5550
-
5551
-
5552
- .col-xl-10 {
5553
-
5554
-
5555
- -webkit-box-flex: 0;
5556
-
5557
-
5558
- -ms-flex: 0 0 83.333333%;
5559
-
5560
-
5561
- flex: 0 0 83.333333%;
5562
-
5563
-
5564
- max-width: 83.333333%
5565
-
5566
-
5567
- }
5568
-
5569
-
5570
-
5571
-
5572
-
5573
- .col-xl-11 {
5574
-
5575
-
5576
- -webkit-box-flex: 0;
5577
-
5578
-
5579
- -ms-flex: 0 0 91.666667%;
5580
-
5581
-
5582
- flex: 0 0 91.666667%;
5583
-
5584
-
5585
- max-width: 91.666667%
5586
-
5587
-
5588
- }
5589
-
5590
-
5591
-
5592
-
5593
-
5594
- .col-xl-12 {
5595
-
5596
-
5597
- -webkit-box-flex: 0;
5598
-
5599
-
5600
- -ms-flex: 0 0 100%;
5601
-
5602
-
5603
- flex: 0 0 100%;
5604
-
5605
-
5606
- max-width: 100%
5607
-
5608
-
5609
- }
5610
-
5611
-
5612
- }
5613
-
5614
-
5615
-
5616
-
5617
-
5618
-
5619
-
5620
-
5621
- .mo_otp_token, .mo2f_user_email, .mo2f_IR_phone,
5622
-
5623
-
5624
- .mo_IR_otp_token, .mo2f_IR_GA_token, .mo2f_IR_phone_OTP {
5625
-
5626
-
5627
- color:#212F3C;
5628
-
5629
-
5630
- border:none;
5631
-
5632
-
5633
- display:block;
5634
-
5635
-
5636
- border-bottom-style: solid;
5637
-
5638
-
5639
- border-width: 2px;
5640
-
5641
-
5642
- border-color:#D0D3D4;
5643
-
5644
-
5645
- border-radius:0px;
5646
-
5647
-
5648
- outline:none;
5649
-
5650
-
5651
- padding:5px;
5652
-
5653
-
5654
- }
5655
-
5656
-
5657
-
5658
-
5659
-
5660
- .mo_otp_token {
5661
-
5662
-
5663
- font-size:15px;
5664
-
5665
-
5666
- width:130px;
5667
-
5668
-
5669
- text-align:center;
5670
-
5671
-
5672
- }
5673
-
5674
-
5675
-
5676
-
5677
-
5678
- .mo2f_user_email{
5679
-
5680
-
5681
- font-size:16px;
5682
-
5683
-
5684
- width:220px;
5685
-
5686
-
5687
- text-align:center;
5688
-
5689
-
5690
- }
5691
-
5692
-
5693
-
5694
-
5695
-
5696
- .mo2f_IR_phone{
5697
-
5698
-
5699
- font-size:14px;
5700
-
5701
-
5702
- width:170px !important;
5703
-
5704
-
5705
- }
5706
-
5707
-
5708
-
5709
-
5710
-
5711
- .mo2f_IR_GA_token{
5712
-
5713
-
5714
- font-size:15px;
5715
-
5716
-
5717
- width:100px !important;
5718
-
5719
-
5720
- }
5721
-
5722
-
5723
-
5724
-
5725
-
5726
- .mo2f_IR_phone_OTP{
5727
-
5728
-
5729
- font-size:15px;
5730
-
5731
-
5732
- width:150px !important;
5733
-
5734
-
5735
  }
1
+ .mo2f_carousel {
2
+
3
+
4
+ position: relative;
5
+
6
+
7
+ padding-bottom: 18px !important;
8
+
9
+
10
+
11
+
12
+
13
+ }
14
+
15
+
16
+
17
+
18
+
19
+ .mo2f_carousel-inner {
20
+
21
+
22
+ position: relative;
23
+
24
+
25
+ width: 100%;
26
+
27
+
28
+ overflow: hidden;
29
+
30
+
31
+
32
+
33
+
34
+ }
35
+
36
+
37
+
38
+
39
+
40
+ .mo2f_carousel-inner > .item {
41
+
42
+
43
+ position: relative;
44
+
45
+
46
+ display: none;
47
+
48
+
49
+ -webkit-transition: .6s ease-in-out left;
50
+
51
+
52
+ -o-transition: .6s ease-in-out left;
53
+
54
+
55
+ transition: .6s ease-in-out left;
56
+
57
+
58
+ height: 300px !important;
59
+
60
+
61
+
62
+
63
+
64
+ }
65
+
66
+
67
+
68
+
69
+
70
+ .mo2f_carousel-inner > .item > img, .mo2f_carousel-inner > .item > a > img {
71
+
72
+
73
+ line-height: 1;
74
+
75
+
76
+
77
+
78
+
79
+ max-height: 300px !important;
80
+
81
+
82
+ max-width: 600px !important;
83
+
84
+
85
+ }
86
+
87
+
88
+
89
+
90
+
91
+ @media all and (transform-3d) , ( -webkit-transform-3d ) {
92
+
93
+
94
+ .mo2f_carousel-inner > .item {
95
+
96
+
97
+ -webkit-transition: -webkit-transform .6s ease-in-out;
98
+
99
+
100
+ -o-transition: -o-transform .6s ease-in-out;
101
+
102
+
103
+ transition: transform .6s ease-in-out;
104
+
105
+
106
+ -webkit-backface-visibility: hidden;
107
+
108
+
109
+ backface-visibility: hidden;
110
+
111
+
112
+ -webkit-perspective: 1000;
113
+
114
+
115
+ perspective: 1000
116
+
117
+
118
+ }
119
+
120
+
121
+
122
+
123
+
124
+ .mo2f_carousel-inner > .item.next, .mo2f_carousel-inner > .item.active.right {
125
+
126
+
127
+ left: 0;
128
+
129
+
130
+ -webkit-transform: translate3d(100%, 0, 0);
131
+
132
+
133
+ transform: translate3d(100%, 0, 0)
134
+
135
+
136
+ }
137
+
138
+
139
+
140
+
141
+
142
+ .mo2f_carousel-inner > .item.prev, .mo2f_carousel-inner > .item.active.left {
143
+
144
+
145
+ left: 0;
146
+
147
+
148
+ -webkit-transform: translate3d(-100%, 0, 0);
149
+
150
+
151
+ transform: translate3d(-100%, 0, 0)
152
+
153
+
154
+ }
155
+
156
+
157
+
158
+
159
+
160
+ .mo2f_carousel-inner > .item.next.left, .mo2f_carousel-inner > .item.prev.right, .mo2f_carousel-inner > .item.active {
161
+
162
+
163
+ left: 0;
164
+
165
+
166
+ -webkit-transform: translate3d(0, 0, 0);
167
+
168
+
169
+ transform: translate3d(0, 0, 0)
170
+
171
+
172
+ }
173
+
174
+
175
+ }
176
+
177
+
178
+
179
+
180
+
181
+ .mo2f_carousel-inner > .active, .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
182
+
183
+
184
+ display: block
185
+
186
+
187
+ }
188
+
189
+
190
+
191
+
192
+
193
+ .mo2f_carousel-inner > .active {
194
+
195
+
196
+ left: 0
197
+
198
+
199
+ }
200
+
201
+
202
+
203
+
204
+
205
+ .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
206
+
207
+
208
+ position: absolute;
209
+
210
+
211
+ top: 0;
212
+
213
+
214
+ width: 100%
215
+
216
+
217
+ }
218
+
219
+
220
+
221
+
222
+
223
+ .mo2f_carousel-inner > .next {
224
+
225
+
226
+ left: 100%
227
+
228
+
229
+ }
230
+
231
+
232
+
233
+
234
+
235
+ .mo2f_carousel-inner > .prev {
236
+
237
+
238
+ left: -100%
239
+
240
+
241
+ }
242
+
243
+
244
+
245
+
246
+
247
+ .mo2f_carousel-inner > .next.left, .mo2f_carousel-inner > .prev.right {
248
+
249
+
250
+ left: 0
251
+
252
+
253
+ }
254
+
255
+
256
+
257
+
258
+
259
+ .mo2f_carousel-inner > .active.left {
260
+
261
+
262
+ left: -100%
263
+
264
+
265
+ }
266
+
267
+
268
+
269
+
270
+
271
+ .mo2f_carousel-inner > .active.right {
272
+
273
+
274
+ left: 100%
275
+
276
+
277
+ }
278
+
279
+
280
+
281
+
282
+
283
+ .mo2f_carousel-control {
284
+
285
+
286
+ position: absolute;
287
+
288
+
289
+ top: 0;
290
+
291
+
292
+ bottom: 0;
293
+
294
+
295
+ left: 0;
296
+
297
+
298
+ width: 15%;
299
+
300
+
301
+ font-size: 20px;
302
+
303
+
304
+ color: #fff;
305
+
306
+
307
+ text-align: center;
308
+
309
+
310
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
311
+
312
+
313
+ filter: alpha(opacity=50);
314
+
315
+
316
+ opacity: .5
317
+
318
+
319
+ }
320
+
321
+
322
+
323
+
324
+
325
+ .mo2f_carousel-control.left {
326
+
327
+
328
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0,
329
+
330
+
331
+ rgba(0, 0, 0, .0001) 100%);
332
+
333
+
334
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0,
335
+
336
+
337
+ rgba(0, 0, 0, .0001) 100%);
338
+
339
+
340
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)),
341
+
342
+
343
+ to(rgba(0, 0, 0, .0001)));
344
+
345
+
346
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0,
347
+
348
+
349
+ rgba(0, 0, 0, .0001) 100%);
350
+
351
+
352
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
353
+
354
+
355
+ endColorstr='#00000000', GradientType=1);
356
+
357
+
358
+ background-repeat: repeat-x
359
+
360
+
361
+ }
362
+
363
+
364
+
365
+
366
+
367
+ .mo2f_carousel-control.right {
368
+
369
+
370
+ right: 0;
371
+
372
+
373
+ left: auto;
374
+
375
+
376
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
377
+
378
+
379
+ rgba(0, 0, 0, .5) 100%);
380
+
381
+
382
+ background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
383
+
384
+
385
+ rgba(0, 0, 0, .5) 100%);
386
+
387
+
388
+ background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)),
389
+
390
+
391
+ to(rgba(0, 0, 0, .5)));
392
+
393
+
394
+ background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0,
395
+
396
+
397
+ rgba(0, 0, 0, .5) 100%);
398
+
399
+
400
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
401
+
402
+
403
+ endColorstr='#80000000', GradientType=1);
404
+
405
+
406
+ background-repeat: repeat-x
407
+
408
+
409
+ }
410
+
411
+
412
+
413
+
414
+
415
+ .mo2f_carousel-control:hover, .mo2f_carousel-control:focus {
416
+
417
+
418
+ color: #fff;
419
+
420
+
421
+ text-decoration: none;
422
+
423
+
424
+ filter: alpha(opacity=90);
425
+
426
+
427
+ outline: 0;
428
+
429
+
430
+ opacity: .9
431
+
432
+
433
+ }
434
+
435
+
436
+
437
+
438
+
439
+ .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right {
440
+
441
+
442
+ position: absolute;
443
+
444
+
445
+ top: 50%;
446
+
447
+
448
+ z-index: 5;
449
+
450
+
451
+ display: inline-block
452
+
453
+
454
+ }
455
+
456
+
457
+
458
+
459
+
460
+ .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .glyphicon-chevron-left {
461
+
462
+
463
+ left: 50%;
464
+
465
+
466
+ margin-left: -10px
467
+
468
+
469
+ }
470
+
471
+
472
+
473
+
474
+
475
+ .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-right {
476
+
477
+
478
+ right: 50%;
479
+
480
+
481
+ margin-right: -10px
482
+
483
+
484
+ }
485
+
486
+
487
+
488
+
489
+
490
+ .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
491
+
492
+
493
+ width: 20px;
494
+
495
+
496
+ height: 20px;
497
+
498
+
499
+ margin-top: -10px;
500
+
501
+
502
+ font-family: serif
503
+
504
+
505
+ }
506
+
507
+
508
+
509
+
510
+
511
+ .mo2f_carousel-control .icon-prev:before {
512
+
513
+
514
+ content: '\2039'
515
+
516
+
517
+ }
518
+
519
+
520
+
521
+
522
+
523
+ .mo2f_carousel-control .icon-next:before {
524
+
525
+
526
+ content: '\203a'
527
+
528
+
529
+ }
530
+
531
+
532
+
533
+
534
+
535
+ .mo2f_carousel-indicators {
536
+
537
+
538
+ position: absolute;
539
+
540
+
541
+ bottom: -25px;
542
+
543
+
544
+ left: 50%;
545
+
546
+
547
+ z-index: 15;
548
+
549
+
550
+ width: 60%;
551
+
552
+
553
+ padding-left: 0;
554
+
555
+
556
+ margin-left: -30%;
557
+
558
+
559
+ text-align: center;
560
+
561
+
562
+ list-style: none
563
+
564
+
565
+ }
566
+
567
+
568
+
569
+
570
+
571
+ .mo2f_carousel-indicators li {
572
+
573
+
574
+ display: inline-block;
575
+
576
+
577
+ width: 10px;
578
+
579
+
580
+ height: 10px;
581
+
582
+
583
+ margin: 1px;
584
+
585
+
586
+ text-indent: -999px;
587
+
588
+
589
+ cursor: pointer;
590
+
591
+
592
+ background-color: #0 \9;
593
+
594
+
595
+ background-color: rgba(0, 0, 0, 0);
596
+
597
+
598
+ border: 1px solid #0073aa;
599
+
600
+
601
+ border-radius: 10px
602
+
603
+
604
+ }
605
+
606
+
607
+
608
+
609
+
610
+ .mo2f_carousel-indicators .active {
611
+
612
+
613
+ width: 12px;
614
+
615
+
616
+ height: 12px;
617
+
618
+
619
+ margin: 0;
620
+
621
+
622
+ background-color: #0073aa;
623
+
624
+
625
+ }
626
+
627
+
628
+
629
+
630
+
631
+ .mo2f_carousel-caption {
632
+
633
+
634
+ position: absolute;
635
+
636
+
637
+ right: 15%;
638
+
639
+
640
+ bottom: 20px;
641
+
642
+
643
+ left: 15%;
644
+
645
+
646
+ z-index: 10;
647
+
648
+
649
+ padding-top: 20px;
650
+
651
+
652
+ padding-bottom: 20px;
653
+
654
+
655
+ color: #fff;
656
+
657
+
658
+ text-align: center;
659
+
660
+
661
+ text-shadow: 0 1px 2px rgba(0, 0, 0, .6)
662
+
663
+
664
+ }
665
+
666
+
667
+
668
+
669
+
670
+ .mo2f_carousel-caption .btn {
671
+
672
+
673
+ text-shadow: none
674
+
675
+
676
+ }
677
+
678
+
679
+
680
+
681
+
682
+ @media screen and (min-width: 768px) {
683
+
684
+
685
+ .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
686
+
687
+
688
+ width: 30px;
689
+
690
+
691
+ height: 30px;
692
+
693
+
694
+ margin-top: -15px;
695
+
696
+
697
+ font-size: 30px
698
+
699
+
700
+ }
701
+
702
+
703
+
704
+
705
+
706
+ .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .icon-prev {
707
+
708
+
709
+ margin-left: -15px
710
+
711
+
712
+ }
713
+
714
+
715
+
716
+
717
+
718
+ .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-next {
719
+
720
+
721
+ margin-right: -15px
722
+
723
+
724
+ }
725
+
726
+
727
+
728
+
729
+
730
+ .mo2f_carousel-caption {
731
+
732
+
733
+ right: 20%;
734
+
735
+
736
+ left: 20%;
737
+
738
+
739
+ padding-bottom: 30px
740
+
741
+
742
+ }
743
+
744
+
745
+
746
+
747
+
748
+ .mo2f_carousel-indicators {
749
+
750
+
751
+ bottom: -14px
752
+
753
+
754
+ }
755
+
756
+
757
+ }
758
+
759
+
760
+
761
+
762
+
763
+ .hidden {
764
+
765
+
766
+ display: none;
767
+
768
+
769
+ }
770
+
771
+
772
+
773
+
774
+
775
+ .float-right {
776
+
777
+
778
+ text-align: right;
779
+
780
+
781
+ }
782
+
783
+
784
+
785
+
786
+
787
+ .mo2f_collapse {
788
+
789
+
790
+ display: none;
791
+
792
+
793
+ / / visibility: hidden;
794
+
795
+
796
+ font-size: 14px !important;
797
+
798
+
799
+
800
+
801
+
802
+ }
803
+
804
+
805
+
806
+
807
+
808
+ .mo2f_collapse.in {
809
+
810
+
811
+ display: block;
812
+
813
+
814
+ visibility: visible;
815
+
816
+
817
+
818
+
819
+
820
+ }
821
+
822
+
823
+
824
+
825
+
826
+ .mo2f_collapsing {
827
+
828
+
829
+ position: relative;
830
+
831
+
832
+ font-size: 14px !important;
833
+
834
+
835
+ height: 0;
836
+
837
+
838
+ overflow: hidden;
839
+
840
+
841
+ -webkit-transition-timing-function: ease;
842
+
843
+
844
+ -o-transition-timing-function: ease;
845
+
846
+
847
+ transition-timing-function: ease;
848
+
849
+
850
+ -webkit-transition-duration: .20s;
851
+
852
+
853
+ -o-transition-duration: .20s;
854
+
855
+
856
+ transition-duration: .20s;
857
+
858
+
859
+ -webkit-transition-property: height, visibility;
860
+
861
+
862
+ -o-transition-property: height, visibility;
863
+
864
+
865
+ transition-property: height, visibility
866
+
867
+
868
+ }
869
+
870
+
871
+
872
+
873
+
874
+ .mo2f_thumbnail {
875
+
876
+
877
+ width: 315px;
878
+
879
+
880
+ margin-bottom: 10px;
881
+
882
+
883
+ position: relative;
884
+
885
+
886
+ background-color: #fff;
887
+
888
+
889
+ border: 1px solid #ddd;
890
+
891
+
892
+ -webkit-transition: border .2s ease-in-out;
893
+
894
+
895
+ -o-transition: border .2s ease-in-out;
896
+
897
+
898
+ transition: border .2s ease-in-out
899
+
900
+
901
+ }
902
+
903
+
904
+
905
+
906
+
907
+ .mo2f_thumbnail > img, .mo2f_thumbnail a > img {
908
+
909
+
910
+ margin-right: auto;
911
+
912
+
913
+ margin-left: auto
914
+
915
+
916
+ }
917
+
918
+
919
+
920
+
921
+
922
+ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
923
+
924
+
925
+ border-color: #337ab7
926
+
927
+
928
+ }
929
+
930
+
931
+
932
+
933
+
934
+ .mo2f_thumbnail .caption {
935
+
936
+
937
+ padding: 9px;
938
+
939
+
940
+ color: #333
941
+
942
+
943
+ }
944
+
945
+
946
+
947
+
948
+
949
+ .mo2f_thumbnail label {
950
+
951
+
952
+ font-weight: bold;
953
+
954
+
955
+
956
+
957
+
958
+ }
959
+
960
+
961
+
962
+
963
+
964
+ .mo2f_close {
965
+
966
+
967
+ float: right;
968
+
969
+
970
+ font-size: 21px;
971
+
972
+
973
+ font-weight: 700;
974
+
975
+
976
+ line-height: 1;
977
+
978
+
979
+ color: #000;
980
+
981
+
982
+ text-shadow: 0 1px 0 #fff;
983
+
984
+
985
+ filter: alpha(opacity=20);
986
+
987
+
988
+ opacity: .2
989
+
990
+
991
+ }
992
+
993
+
994
+
995
+
996
+
997
+ .mo2f_close:hover, .mo2f_close:focus {
998
+
999
+
1000
+ color: #000;
1001
+
1002
+
1003
+ text-decoration: none;
1004
+
1005
+
1006
+ cursor: pointer;
1007
+
1008
+
1009
+ filter: alpha(opacity=50);
1010
+
1011
+
1012
+ opacity: .5
1013
+
1014
+
1015
+ }
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+ button.mo2f_close {
1022
+
1023
+
1024
+ -webkit-appearance: none;
1025
+
1026
+
1027
+ padding: 0;
1028
+
1029
+
1030
+ cursor: pointer;
1031
+
1032
+
1033
+ background: 0 0;
1034
+
1035
+
1036
+ border: 0
1037
+
1038
+
1039
+ }
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+ .mo2f_modal-open {
1046
+
1047
+
1048
+ overflow: hidden !important;
1049
+
1050
+
1051
+ position: fixed !important;
1052
+
1053
+
1054
+ width: 100% !important;
1055
+
1056
+
1057
+
1058
+
1059
+
1060
+ }
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+ .mo2f_modal {
1067
+
1068
+
1069
+ position: fixed !important;
1070
+
1071
+
1072
+ top: 0;
1073
+
1074
+
1075
+ right: 0;
1076
+
1077
+
1078
+ bottom: 0;
1079
+
1080
+
1081
+ left: 0;
1082
+
1083
+
1084
+ z-index: 100000 !important;
1085
+
1086
+
1087
+
1088
+
1089
+
1090
+ overflow: hidden !important;
1091
+
1092
+
1093
+ -webkit-overflow-scrolling: touch;
1094
+
1095
+
1096
+ outline: 0;
1097
+
1098
+
1099
+
1100
+
1101
+
1102
+ }
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+ .mo2f_modal_inner {
1109
+
1110
+
1111
+ display: none;
1112
+
1113
+
1114
+ }
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+ .mo2f_modal.fade .mo2f_modal-dialog {
1121
+
1122
+
1123
+ -webkit-transition: -webkit-transform .3s ease-out;
1124
+
1125
+
1126
+ -o-transition: -o-transform .3s ease-out;
1127
+
1128
+
1129
+ transition: transform .3s ease-out;
1130
+
1131
+
1132
+ -webkit-transform: translate(0, -25%);
1133
+
1134
+
1135
+ -ms-transform: translate(0, -25%);
1136
+
1137
+
1138
+ -o-transform: translate(0, -25%);
1139
+
1140
+
1141
+ transform: translate(0, -25%)
1142
+
1143
+
1144
+ }
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+ .mo2f_modal.in .mo2f_modal-dialog {
1151
+
1152
+
1153
+ -webkit-transform: translate(0, 80px) !important;
1154
+
1155
+
1156
+ -ms-transform: translate(0, 80px) !important;
1157
+
1158
+
1159
+ -o-transform: translate(0, 80px) !important;
1160
+
1161
+
1162
+ transform: translate(0, 80px) !important;
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+ }
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+ .mo2f_modal-open .mo2f_modal {
1175
+
1176
+
1177
+ overflow-x: hidden;
1178
+
1179
+
1180
+ overflow-y: hidden;
1181
+
1182
+
1183
+ }
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+ .mo2f_modal-dialog {
1190
+
1191
+
1192
+ position: relative;
1193
+
1194
+
1195
+ width: auto;
1196
+
1197
+
1198
+ margin: 10px;
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+ }
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+ .login mo_customer_validation-modal-content {
1211
+
1212
+
1213
+ position: relative !important;
1214
+
1215
+
1216
+ background-color: #fff !important;
1217
+
1218
+
1219
+ -webkit-background-clip: padding-box !important;
1220
+
1221
+
1222
+ background-clip: padding-box !important;
1223
+
1224
+
1225
+ border: 1px solid #999 !important;
1226
+
1227
+
1228
+ border: 1px solid rgba(0, 0, 0, .2) !important;
1229
+
1230
+
1231
+ border-radius: 6px !important;
1232
+
1233
+
1234
+ outline: 0 !important;
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
1241
+
1242
+
1243
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
1244
+
1245
+
1246
+ }
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+ .mo2f-modal-backdrop {
1253
+
1254
+
1255
+ position: absolute;
1256
+
1257
+
1258
+ top: 0;
1259
+
1260
+
1261
+ right: 0;
1262
+
1263
+
1264
+ left: 0;
1265
+
1266
+
1267
+ background-color: #f1f1f1 !important;
1268
+
1269
+
1270
+ filter: alpha(opacity=50) !important;
1271
+
1272
+
1273
+ opacity: 0.8 !important;
1274
+
1275
+
1276
+ height: 100% !important;
1277
+
1278
+
1279
+ }
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+ #smsAlertModal {
1286
+
1287
+
1288
+ background-color: black !important;
1289
+
1290
+
1291
+ opacity: 0.8 !important;
1292
+
1293
+
1294
+ filter: alpha(opacity=50) !important;
1295
+
1296
+
1297
+ }
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+ .mo2f_modal-header {
1304
+
1305
+
1306
+ min-height: 14px;
1307
+
1308
+
1309
+ padding: 10px;
1310
+
1311
+
1312
+ border-bottom: 1px solid #e5e5e5
1313
+
1314
+
1315
+ }
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+ .mo2f_modal-title {
1322
+
1323
+
1324
+ margin: 0 !important;
1325
+
1326
+
1327
+ line-height: 1.0 !important;
1328
+
1329
+
1330
+ }
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+ .mo2f_modal-body {
1337
+
1338
+
1339
+ / / width: 96 % !important;
1340
+
1341
+
1342
+ position: relative !important;
1343
+
1344
+
1345
+ padding: 15px !important;
1346
+
1347
+
1348
+ overflow-y: auto !important;
1349
+
1350
+
1351
+ max-height: 550px !important;
1352
+
1353
+
1354
+ }
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+ .mo2f_modal-footer {
1361
+
1362
+
1363
+ padding: 15px;
1364
+
1365
+
1366
+ text-align: right;
1367
+
1368
+
1369
+ border-top: 1px solid #e5e5e5
1370
+
1371
+
1372
+ }
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+ .mo2f_modal-footer .btn + .btn {
1379
+
1380
+
1381
+ margin-bottom: 0;
1382
+
1383
+
1384
+ margin-left: 5px
1385
+
1386
+
1387
+ }
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+ .mo2f_modal-footer .btn-group .btn + .btn {
1394
+
1395
+
1396
+ margin-left: -1px
1397
+
1398
+
1399
+ }
1400
+
1401
+
1402
+
1403
+
1404
+
1405
+ .mo2f_modal-footer .btn-block + .btn-block {
1406
+
1407
+
1408
+ margin-left: 0
1409
+
1410
+
1411
+ }
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+ .mo2f_modal-scrollbar-measure {
1418
+
1419
+
1420
+ position: absolute;
1421
+
1422
+
1423
+ top: -9999px;
1424
+
1425
+
1426
+ width: 50px;
1427
+
1428
+
1429
+ height: 50px;
1430
+
1431
+
1432
+ overflow: scroll
1433
+
1434
+
1435
+ }
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+ @media ( min-width: 768px) {
1442
+
1443
+
1444
+ .mo2f_modal-dialog {
1445
+
1446
+ width: auto;
1447
+ margin: 0px auto
1448
+
1449
+
1450
+ }
1451
+
1452
+
1453
+
1454
+
1455
+
1456
+ .login mo_customer_validation-modal-content {
1457
+
1458
+
1459
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
1460
+
1461
+
1462
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
1463
+
1464
+
1465
+ }
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+ .mo2f_modal-sm {
1472
+
1473
+
1474
+ width: 300px
1475
+
1476
+
1477
+ }
1478
+
1479
+
1480
+
1481
+
1482
+
1483
+ .mo2f_modal-md {
1484
+
1485
+
1486
+ width: 550px
1487
+
1488
+
1489
+ }
1490
+
1491
+
1492
+ }
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+ @media ( min-width: 992px) {
1499
+
1500
+
1501
+ .mo2f_modal-lg {
1502
+
1503
+
1504
+ width: 900px;
1505
+
1506
+
1507
+ }
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+ .mo2f_modal-md {
1514
+
1515
+
1516
+ width: 550px
1517
+
1518
+
1519
+ }
1520
+
1521
+
1522
+ }
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+ .center{
1529
+
1530
+
1531
+
1532
+
1533
+
1534
+ text-align: center !important;
1535
+
1536
+
1537
+ }
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+ #otpMessage {
1544
+
1545
+
1546
+ border-radius: 1px;
1547
+
1548
+
1549
+ padding: 1px 5px;
1550
+
1551
+
1552
+ background: #f1f1f1;
1553
+
1554
+
1555
+ }
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+ .mo2f_carousel-indicators {
1562
+
1563
+
1564
+ position: absolute;
1565
+
1566
+
1567
+ bottom: -20px;
1568
+
1569
+
1570
+ z-index: 15;
1571
+
1572
+
1573
+ width: 60%;
1574
+
1575
+
1576
+ list-style: none;
1577
+
1578
+
1579
+ text-align: center;
1580
+
1581
+
1582
+ }
1583
+
1584
+
1585
+
1586
+
1587
+
1588
+ .miniorange_kba_validate:hover, .miniorange_validate_otp:hover, .miniorange_login_forgotphone:hover,
1589
+
1590
+
1591
+ .miniorange_login_offline:hover, .miniorange_login_forgotphone:hover, .miniorange_otp_token_submit:hover, .miniorange_button:hover
1592
+
1593
+
1594
+ {
1595
+
1596
+
1597
+ background-color:#0073AA!important
1598
+
1599
+
1600
+ }
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+ .miniorange_kba_validate, .miniorange_validate_otp, .miniorange_login_forgotphone,
1607
+
1608
+
1609
+ .miniorange_login_offline, .miniorange_login_forgotphone , .miniorange_otp_token_submit,
1610
+
1611
+
1612
+ .miniorange_button
1613
+
1614
+
1615
+ {
1616
+
1617
+
1618
+ background:#00A0D2!important;
1619
+
1620
+
1621
+ border-color:#0073AA!important;
1622
+
1623
+
1624
+ box-shadow:0 1px 0 rgba(120,200,230,.5) inset,0 1px 0 rgba(0,0,0,.15)!important;
1625
+
1626
+
1627
+ color:#FFF!important;
1628
+
1629
+
1630
+ text-decoration:none!important;
1631
+
1632
+
1633
+ cursor:pointer!important;
1634
+
1635
+
1636
+ border-width:1px!important;
1637
+
1638
+
1639
+ border-style:solid!important;
1640
+
1641
+
1642
+ border-radius:3px!important;
1643
+
1644
+
1645
+ white-space:nowrap!important;
1646
+
1647
+
1648
+ box-sizing:border-box!important;
1649
+
1650
+
1651
+ line-height:28px!important;
1652
+
1653
+
1654
+ padding:0 12px!important;
1655
+
1656
+
1657
+ font-size:13px!important;
1658
+
1659
+
1660
+ }
1661
+
1662
+
1663
+
1664
+
1665
+
1666
+ .mo_customer_validation-modal.fade .mo_customer_validation-modal-dialog {
1667
+
1668
+
1669
+ -webkit-transition: -webkit-transform .3s ease-out;
1670
+
1671
+
1672
+ -o-transition: -o-transform .3s ease-out;
1673
+
1674
+
1675
+ transition: transform .3s ease-out;
1676
+
1677
+
1678
+ -webkit-transform: translate(0, -25%);
1679
+
1680
+
1681
+ -ms-transform: translate(0, -25%);
1682
+
1683
+
1684
+ -o-transform: translate(0, -25%);
1685
+
1686
+
1687
+ transform: translate(0, -25%)
1688
+
1689
+
1690
+ }
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+ .mo_customer_validation-modal.in .mo_customer_validation-modal-dialog {
1697
+
1698
+
1699
+ -webkit-transform: translate(0, 80px) !important;
1700
+
1701
+
1702
+ -ms-transform: translate(0, 80px) !important;
1703
+
1704
+
1705
+ -o-transform: translate(0, 80px) !important;
1706
+
1707
+
1708
+ transform: translate(0, 80px) !important
1709
+
1710
+
1711
+ }
1712
+
1713
+
1714
+
1715
+
1716
+
1717
+ .mo_customer_validation-modal-open .mo_customer_validation-modal {
1718
+
1719
+
1720
+ overflow-x: hidden;
1721
+
1722
+
1723
+ overflow-y: hidden
1724
+
1725
+
1726
+ }
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+ .mo_customer_validation-modal-dialog {
1733
+
1734
+
1735
+ position: relative;
1736
+
1737
+
1738
+ width: auto;
1739
+
1740
+
1741
+ margin: 10px
1742
+
1743
+
1744
+ }
1745
+
1746
+
1747
+
1748
+
1749
+
1750
+ .mo_customer_validation-modal-content {
1751
+
1752
+
1753
+ position: relative;
1754
+
1755
+
1756
+ -webkit-background-clip: padding-box;
1757
+
1758
+
1759
+ border: 1px solid #999;
1760
+
1761
+
1762
+ border: 1px solid rgba(0, 0, 0, .2);
1763
+
1764
+
1765
+ outline: 0;
1766
+
1767
+
1768
+ margin-top: 8%;
1769
+
1770
+
1771
+ margin-left: 0;
1772
+
1773
+
1774
+ padding: 15px 20px 0;
1775
+
1776
+
1777
+ font-family: "Open Sans", sans-serif;
1778
+
1779
+
1780
+
1781
+ font-size: 14px;
1782
+
1783
+
1784
+ line-height: 1.4em;
1785
+
1786
+
1787
+ background: #FFF;
1788
+
1789
+
1790
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .13)
1791
+
1792
+
1793
+ }
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+ .mo_customer_validation-modal-backdrop {
1800
+
1801
+
1802
+ position: absolute;
1803
+
1804
+
1805
+ top: 0;
1806
+
1807
+
1808
+ right: 0;
1809
+
1810
+
1811
+ left: 0;
1812
+
1813
+
1814
+ background-color: #000 !important;
1815
+
1816
+
1817
+ filter: alpha(opacity=50) !important;
1818
+
1819
+
1820
+ opacity: .9 !important;
1821
+
1822
+
1823
+ height: 100% !important
1824
+
1825
+
1826
+ }
1827
+
1828
+
1829
+
1830
+
1831
+
1832
+ .mo_customer_validation-modal-header {
1833
+
1834
+
1835
+ min-height: 14px;
1836
+
1837
+
1838
+ padding: 10px 10px 20px;
1839
+
1840
+
1841
+ border-bottom: 1px solid #e5e5e5
1842
+
1843
+
1844
+ }
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+ .mo_customer_validation-modal-title {
1851
+
1852
+
1853
+ margin: 0 !important;
1854
+
1855
+
1856
+ line-height: 1 !important
1857
+
1858
+
1859
+ }
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+ .mo_customer_validation-modal-body {
1866
+
1867
+
1868
+ position: relative;
1869
+
1870
+
1871
+ padding: 5%;
1872
+
1873
+
1874
+ overflow: hidden !important;
1875
+
1876
+
1877
+ max-height: 550px !important
1878
+
1879
+
1880
+ }
1881
+
1882
+
1883
+
1884
+
1885
+
1886
+ .mo_customer_validation-modal-footer {
1887
+
1888
+
1889
+ padding: 15px;
1890
+
1891
+
1892
+ text-align: right;
1893
+
1894
+
1895
+ border-top: 1px solid #e5e5e5
1896
+
1897
+
1898
+ }
1899
+
1900
+
1901
+
1902
+
1903
+
1904
+ .mo_customer_validation-modal-footer .btn + .btn {
1905
+
1906
+
1907
+ margin-bottom: 0;
1908
+
1909
+
1910
+ margin-left: 5px
1911
+
1912
+
1913
+ }
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+ .mo_customer_validation-modal-footer .btn-group .btn + .btn {
1920
+
1921
+
1922
+ margin-left: -1px
1923
+
1924
+
1925
+ }
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+ .mo_customer_validation-modal-footer .btn-block + .btn-block {
1932
+
1933
+
1934
+ margin-left: 0
1935
+
1936
+
1937
+ }
1938
+
1939
+
1940
+
1941
+
1942
+
1943
+ .mo_customer_validation-modal-scrollbar-measure {
1944
+
1945
+
1946
+ position: absolute;
1947
+
1948
+
1949
+ top: -9999px;
1950
+
1951
+
1952
+ width: 50px;
1953
+
1954
+
1955
+ height: 50px;
1956
+
1957
+
1958
+ overflow: scroll
1959
+
1960
+
1961
+ }
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+ @media (min-width: 768px) {
1968
+
1969
+
1970
+ .mo_customer_validation-modal-dialog {
1971
+
1972
+
1973
+ width: auto;
1974
+
1975
+
1976
+ margin: 0 auto
1977
+
1978
+
1979
+ }
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+ .mo_customer_validation-modal-content {
1986
+
1987
+
1988
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
1989
+
1990
+
1991
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
1992
+
1993
+
1994
+ }
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+ .mo_customer_validation-modal-sm {
2001
+
2002
+
2003
+ width: 300px
2004
+
2005
+
2006
+ }
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+ .mo_customer_validation-modal-md {
2013
+
2014
+
2015
+ width: 532px
2016
+
2017
+
2018
+ }
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+ .mo_customer_validation-modal-lg {
2025
+
2026
+
2027
+ width: 50%
2028
+
2029
+
2030
+ }
2031
+
2032
+
2033
+ }
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+ @media (min-width: 992px) {
2040
+
2041
+
2042
+ .mo_customer_validation-modal-dialog {
2043
+
2044
+
2045
+ width: auto;
2046
+
2047
+
2048
+ margin: 0 auto
2049
+
2050
+
2051
+ }
2052
+
2053
+
2054
+
2055
+
2056
+
2057
+ .mo_customer_validation-modal-lg {
2058
+
2059
+
2060
+ width: 490px
2061
+
2062
+
2063
+ }
2064
+
2065
+
2066
+
2067
+
2068
+
2069
+ .mo_customer_validation-modal-md {
2070
+
2071
+
2072
+ width: 532px
2073
+
2074
+
2075
+ }
2076
+
2077
+
2078
+ }
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+ .mo_customer_validation-textbox {
2085
+
2086
+
2087
+ background: #FBFBFB;
2088
+
2089
+
2090
+ font-family: "Open Sans", sans-serif;
2091
+
2092
+
2093
+ font-size: 24px;
2094
+
2095
+
2096
+ width: 100%;
2097
+
2098
+
2099
+ border: 1px solid #DDD;
2100
+
2101
+
2102
+ padding: 3px;
2103
+
2104
+
2105
+ margin: 2px 6px 16px 0
2106
+
2107
+
2108
+ }
2109
+
2110
+
2111
+
2112
+
2113
+
2114
+ .mo_customer_validation-textbox:focus {
2115
+
2116
+
2117
+ border-color: #5B9DD9;
2118
+
2119
+
2120
+ box-shadow: 0 0 2px rgba(30, 140, 190, .8)
2121
+
2122
+
2123
+ }
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+ .button-primary,
2130
+
2131
+
2132
+ .button-secondary {
2133
+
2134
+
2135
+ background: #00A0D2;
2136
+
2137
+
2138
+ border-color: #0073AA;
2139
+
2140
+
2141
+ box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15);
2142
+
2143
+
2144
+ color: #FFF;
2145
+
2146
+
2147
+ text-decoration: none;
2148
+
2149
+
2150
+ cursor: pointer;
2151
+
2152
+
2153
+ border-width: 1px;
2154
+
2155
+
2156
+ border-style: solid;
2157
+
2158
+
2159
+ border-radius: 3px;
2160
+
2161
+
2162
+ white-space: nowrap;
2163
+
2164
+
2165
+ box-sizing: border-box;
2166
+
2167
+
2168
+ line-height: 28px;
2169
+
2170
+
2171
+ padding: 0 12px;
2172
+
2173
+
2174
+ font-size: 13px
2175
+
2176
+
2177
+ }
2178
+
2179
+
2180
+
2181
+
2182
+
2183
+ .button:hover {
2184
+
2185
+
2186
+ background-color: #0073AA
2187
+
2188
+
2189
+ }
2190
+
2191
+
2192
+
2193
+
2194
+
2195
+ .close {
2196
+
2197
+
2198
+ float: right;
2199
+
2200
+
2201
+ transition: color .1s ease-in-out, background .1s ease-in-out;
2202
+
2203
+
2204
+ text-decoration: none;
2205
+
2206
+
2207
+ color: #999;
2208
+
2209
+
2210
+ font-size: 13px
2211
+
2212
+
2213
+ }
2214
+
2215
+
2216
+
2217
+
2218
+
2219
+ .mo_validate_close:focus,
2220
+
2221
+
2222
+ .mo_validate_close:hover {
2223
+
2224
+
2225
+ color: #0085ba
2226
+
2227
+
2228
+ }
2229
+
2230
+
2231
+
2232
+
2233
+
2234
+ .mo_registration_pricing_text {
2235
+
2236
+
2237
+ font-size: 13px;
2238
+
2239
+
2240
+ color: darkblue;
2241
+
2242
+
2243
+ }
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+ .mo_otp_token {
2250
+
2251
+
2252
+ font-size: 15px;
2253
+
2254
+
2255
+ color: #212F3C;
2256
+
2257
+
2258
+ border: none;
2259
+
2260
+
2261
+ display: block;
2262
+
2263
+
2264
+ border-bottom-style: solid;
2265
+
2266
+
2267
+ border-width: 2px;
2268
+
2269
+
2270
+ border-color: #D0D3D4;
2271
+
2272
+
2273
+ border-radius: 0px;
2274
+
2275
+
2276
+ outline: none;
2277
+
2278
+
2279
+ width: 140px;
2280
+
2281
+
2282
+ text-align: center;
2283
+
2284
+
2285
+ }
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+ .container {
2292
+
2293
+
2294
+ max-width: 960px
2295
+
2296
+
2297
+ }
2298
+
2299
+
2300
+
2301
+
2302
+
2303
+ }
2304
+
2305
+
2306
+ @media (min-width: 1200px) {
2307
+
2308
+
2309
+ .container {
2310
+
2311
+
2312
+ max-width: 1140px
2313
+
2314
+
2315
+ }
2316
+
2317
+
2318
+ }
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+ .container-fluid {
2325
+
2326
+
2327
+ width: 100%;
2328
+
2329
+
2330
+ padding-right: 15px;
2331
+
2332
+
2333
+ padding-left: 15px;
2334
+
2335
+
2336
+ margin-right: auto;
2337
+
2338
+
2339
+ margin-left: auto
2340
+
2341
+
2342
+ }
2343
+
2344
+
2345
+
2346
+
2347
+
2348
+ .row {
2349
+
2350
+
2351
+ display: -webkit-box;
2352
+
2353
+
2354
+ display: -ms-flexbox;
2355
+
2356
+
2357
+ display: flex;
2358
+
2359
+
2360
+ -ms-flex-wrap: wrap;
2361
+
2362
+
2363
+ flex-wrap: wrap;
2364
+
2365
+
2366
+ margin-right: -15px;
2367
+
2368
+
2369
+ margin-left: -15px
2370
+
2371
+
2372
+ }
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+ .no-gutters {
2382
+
2383
+
2384
+ margin-right: 0;
2385
+
2386
+
2387
+ margin-left: 0
2388
+
2389
+
2390
+ }
2391
+
2392
+
2393
+
2394
+
2395
+
2396
+ .no-gutters > .col, .no-gutters > [class*=col-] {
2397
+
2398
+
2399
+ padding-right: 0;
2400
+
2401
+
2402
+ padding-left: 0
2403
+
2404
+
2405
+ }
2406
+
2407
+
2408
+
2409
+
2410
+
2411
+ .col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto {
2412
+
2413
+
2414
+ position: relative;
2415
+
2416
+
2417
+ width: 100%;
2418
+
2419
+
2420
+ min-height: 1px;
2421
+
2422
+
2423
+ padding-right: 15px;
2424
+
2425
+
2426
+ padding-left: 15px
2427
+
2428
+
2429
+ }
2430
+
2431
+
2432
+
2433
+
2434
+
2435
+ .col {
2436
+
2437
+
2438
+ -ms-flex-preferred-size: 0;
2439
+
2440
+
2441
+ flex-basis: 0;
2442
+
2443
+
2444
+ -webkit-box-flex: 1;
2445
+
2446
+
2447
+ -ms-flex-positive: 1;
2448
+
2449
+
2450
+ flex-grow: 1;
2451
+
2452
+
2453
+ max-width: 100%
2454
+
2455
+
2456
+ }
2457
+
2458
+
2459
+
2460
+
2461
+
2462
+ .col-auto {
2463
+
2464
+
2465
+ -webkit-box-flex: 0;
2466
+
2467
+
2468
+ -ms-flex: 0 0 auto;
2469
+
2470
+
2471
+ flex: 0 0 auto;
2472
+
2473
+
2474
+ width: auto;
2475
+
2476
+
2477
+ max-width: none
2478
+
2479
+
2480
+ }
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+ .col-1 {
2487
+
2488
+
2489
+ -webkit-box-flex: 0;
2490
+
2491
+
2492
+ -ms-flex: 0 0 8.333333%;
2493
+
2494
+
2495
+ flex: 0 0 8.333333%;
2496
+
2497
+
2498
+ max-width: 8.333333%
2499
+
2500
+
2501
+ }
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+ .col-2 {
2508
+
2509
+
2510
+ -webkit-box-flex: 0;
2511
+
2512
+
2513
+ -ms-flex: 0 0 16.666667%;
2514
+
2515
+
2516
+ flex: 0 0 16.666667%;
2517
+
2518
+
2519
+ max-width: 16.666667%
2520
+
2521
+
2522
+ }
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+ .col-3 {
2529
+
2530
+
2531
+ -webkit-box-flex: 0;
2532
+
2533
+
2534
+ -ms-flex: 0 0 25%;
2535
+
2536
+
2537
+ flex: 0 0 25%;
2538
+
2539
+
2540
+ max-width: 25%
2541
+
2542
+
2543
+ }
2544
+
2545
+
2546
+
2547
+
2548
+
2549
+ .col-4 {
2550
+
2551
+
2552
+ -webkit-box-flex: 0;
2553
+
2554
+
2555
+ -ms-flex: 0 0 33.333333%;
2556
+
2557
+
2558
+ flex: 0 0 33.333333%;
2559
+
2560
+
2561
+ max-width: 33.333333%
2562
+
2563
+
2564
+ }
2565
+
2566
+
2567
+
2568
+
2569
+
2570
+ .col-5 {
2571
+
2572
+
2573
+ -webkit-box-flex: 0;
2574
+
2575
+
2576
+ -ms-flex: 0 0 41.666667%;
2577
+
2578
+
2579
+ flex: 0 0 41.666667%;
2580
+
2581
+
2582
+ max-width: 41.666667%
2583
+
2584
+
2585
+ }
2586
+
2587
+
2588
+
2589
+
2590
+
2591
+ .col-6 {
2592
+
2593
+
2594
+ -webkit-box-flex: 0;
2595
+
2596
+
2597
+ -ms-flex: 0 0 50%;
2598
+
2599
+
2600
+ flex: 0 0 50%;
2601
+
2602
+
2603
+ max-width: 50%
2604
+
2605
+
2606
+ }
2607
+
2608
+
2609
+
2610
+
2611
+
2612
+ .col-7 {
2613
+
2614
+
2615
+ -webkit-box-flex: 0;
2616
+
2617
+
2618
+ -ms-flex: 0 0 58.333333%;
2619
+
2620
+
2621
+ flex: 0 0 58.333333%;
2622
+
2623
+
2624
+ max-width: 58.333333%
2625
+
2626
+
2627
+ }
2628
+
2629
+
2630
+
2631
+
2632
+
2633
+ .col-8 {
2634
+
2635
+
2636
+ -webkit-box-flex: 0;
2637
+
2638
+
2639
+ -ms-flex: 0 0 66.666667%;
2640
+
2641
+
2642
+ flex: 0 0 66.666667%;
2643
+
2644
+
2645
+ max-width: 66.666667%
2646
+
2647
+
2648
+ }
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+ .col-9 {
2655
+
2656
+
2657
+ -webkit-box-flex: 0;
2658
+
2659
+
2660
+ -ms-flex: 0 0 75%;
2661
+
2662
+
2663
+ flex: 0 0 75%;
2664
+
2665
+
2666
+ max-width: 75%
2667
+
2668
+
2669
+ }
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+ .col-10 {
2676
+
2677
+
2678
+ -webkit-box-flex: 0;
2679
+
2680
+
2681
+ -ms-flex: 0 0 83.333333%;
2682
+
2683
+
2684
+ flex: 0 0 83.333333%;
2685
+
2686
+
2687
+ max-width: 83.333333%
2688
+
2689
+
2690
+ }
2691
+
2692
+
2693
+
2694
+
2695
+
2696
+ .col-11 {
2697
+
2698
+
2699
+ -webkit-box-flex: 0;
2700
+
2701
+
2702
+ -ms-flex: 0 0 91.666667%;
2703
+
2704
+
2705
+ flex: 0 0 91.666667%;
2706
+
2707
+
2708
+ max-width: 91.666667%
2709
+
2710
+
2711
+ }
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+ .col-12 {
2718
+
2719
+
2720
+ -webkit-box-flex: 0;
2721
+
2722
+
2723
+ -ms-flex: 0 0 100%;
2724
+
2725
+
2726
+ flex: 0 0 100%;
2727
+
2728
+
2729
+ max-width: 100%
2730
+
2731
+
2732
+ }
2733
+
2734
+
2735
+
2736
+
2737
+
2738
+ .order-first {
2739
+
2740
+
2741
+ -webkit-box-ordinal-group: 0;
2742
+
2743
+
2744
+ -ms-flex-order: -1;
2745
+
2746
+
2747
+ order: -1
2748
+
2749
+
2750
+ }
2751
+
2752
+
2753
+
2754
+
2755
+
2756
+ .order-last {
2757
+
2758
+
2759
+ -webkit-box-ordinal-group: 14;
2760
+
2761
+
2762
+ -ms-flex-order: 13;
2763
+
2764
+
2765
+ order: 13
2766
+
2767
+
2768
+ }
2769
+
2770
+
2771
+
2772
+
2773
+
2774
+ .order-0 {
2775
+
2776
+
2777
+ -webkit-box-ordinal-group: 1;
2778
+
2779
+
2780
+ -ms-flex-order: 0;
2781
+
2782
+
2783
+ order: 0
2784
+
2785
+
2786
+ }
2787
+
2788
+
2789
+
2790
+
2791
+
2792
+ .order-1 {
2793
+
2794
+
2795
+ -webkit-box-ordinal-group: 2;
2796
+
2797
+
2798
+ -ms-flex-order: 1;
2799
+
2800
+
2801
+ order: 1
2802
+
2803
+
2804
+ }
2805
+
2806
+
2807
+
2808
+
2809
+
2810
+ .order-2 {
2811
+
2812
+
2813
+ -webkit-box-ordinal-group: 3;
2814
+
2815
+
2816
+ -ms-flex-order: 2;
2817
+
2818
+
2819
+ order: 2
2820
+
2821
+
2822
+ }
2823
+
2824
+
2825
+
2826
+
2827
+
2828
+ .order-3 {
2829
+
2830
+
2831
+ -webkit-box-ordinal-group: 4;
2832
+
2833
+
2834
+ -ms-flex-order: 3;
2835
+
2836
+
2837
+ order: 3
2838
+
2839
+
2840
+ }
2841
+
2842
+
2843
+
2844
+
2845
+
2846
+ .order-4 {
2847
+
2848
+
2849
+ -webkit-box-ordinal-group: 5;
2850
+
2851
+
2852
+ -ms-flex-order: 4;
2853
+
2854
+
2855
+ order: 4
2856
+
2857
+
2858
+ }
2859
+
2860
+
2861
+
2862
+
2863
+
2864
+ .order-5 {
2865
+
2866
+
2867
+ -webkit-box-ordinal-group: 6;
2868
+
2869
+
2870
+ -ms-flex-order: 5;
2871
+
2872
+
2873
+ order: 5
2874
+
2875
+
2876
+ }
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+ .order-6 {
2883
+
2884
+
2885
+ -webkit-box-ordinal-group: 7;
2886
+
2887
+
2888
+ -ms-flex-order: 6;
2889
+
2890
+
2891
+ order: 6
2892
+
2893
+
2894
+ }
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+ .order-7 {
2901
+
2902
+
2903
+ -webkit-box-ordinal-group: 8;
2904
+
2905
+
2906
+ -ms-flex-order: 7;
2907
+
2908
+
2909
+ order: 7
2910
+
2911
+
2912
+ }
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+ .order-8 {
2919
+
2920
+
2921
+ -webkit-box-ordinal-group: 9;
2922
+
2923
+
2924
+ -ms-flex-order: 8;
2925
+
2926
+
2927
+ order: 8
2928
+
2929
+
2930
+ }
2931
+
2932
+
2933
+
2934
+
2935
+
2936
+ .order-9 {
2937
+
2938
+
2939
+ -webkit-box-ordinal-group: 10;
2940
+
2941
+
2942
+ -ms-flex-order: 9;
2943
+
2944
+
2945
+ order: 9
2946
+
2947
+
2948
+ }
2949
+
2950
+
2951
+
2952
+
2953
+
2954
+ .order-10 {
2955
+
2956
+
2957
+ -webkit-box-ordinal-group: 11;
2958
+
2959
+
2960
+ -ms-flex-order: 10;
2961
+
2962
+
2963
+ order: 10
2964
+
2965
+
2966
+ }
2967
+
2968
+
2969
+
2970
+
2971
+
2972
+ .order-11 {
2973
+
2974
+
2975
+ -webkit-box-ordinal-group: 12;
2976
+
2977
+
2978
+ -ms-flex-order: 11;
2979
+
2980
+
2981
+ order: 11
2982
+
2983
+
2984
+ }
2985
+
2986
+
2987
+
2988
+
2989
+
2990
+ .order-12 {
2991
+
2992
+
2993
+ -webkit-box-ordinal-group: 13;
2994
+
2995
+
2996
+ -ms-flex-order: 12;
2997
+
2998
+
2999
+ order: 12
3000
+
3001
+
3002
+ }
3003
+
3004
+
3005
+
3006
+
3007
+
3008
+ .offset-1 {
3009
+
3010
+
3011
+ margin-left: 8.333333%
3012
+
3013
+
3014
+ }
3015
+
3016
+
3017
+
3018
+
3019
+
3020
+ .offset-2 {
3021
+
3022
+
3023
+ margin-left: 16.666667%
3024
+
3025
+
3026
+ }
3027
+
3028
+
3029
+
3030
+
3031
+
3032
+ .offset-3 {
3033
+
3034
+
3035
+ margin-left: 25%
3036
+
3037
+
3038
+ }
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+ .offset-4 {
3045
+
3046
+
3047
+ margin-left: 33.333333%
3048
+
3049
+
3050
+ }
3051
+
3052
+
3053
+
3054
+
3055
+
3056
+ .offset-5 {
3057
+
3058
+
3059
+ margin-left: 41.666667%
3060
+
3061
+
3062
+ }
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+ .offset-6 {
3069
+
3070
+
3071
+ margin-left: 50%
3072
+
3073
+
3074
+ }
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+ .offset-7 {
3081
+
3082
+
3083
+ margin-left: 58.333333%
3084
+
3085
+
3086
+ }
3087
+
3088
+
3089
+
3090
+
3091
+
3092
+ .offset-8 {
3093
+
3094
+
3095
+ margin-left: 66.666667%
3096
+
3097
+
3098
+ }
3099
+
3100
+
3101
+
3102
+
3103
+
3104
+ .offset-9 {
3105
+
3106
+
3107
+ margin-left: 75%
3108
+
3109
+
3110
+ }
3111
+
3112
+
3113
+
3114
+
3115
+
3116
+ .offset-10 {
3117
+
3118
+
3119
+ margin-left: 83.333333%
3120
+
3121
+
3122
+ }
3123
+
3124
+
3125
+
3126
+
3127
+
3128
+ .offset-11 {
3129
+
3130
+
3131
+ margin-left: 91.666667%
3132
+
3133
+
3134
+ }
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+ @media (min-width: 576px) {
3141
+
3142
+
3143
+ .col-sm {
3144
+
3145
+
3146
+ -ms-flex-preferred-size: 0;
3147
+
3148
+
3149
+ flex-basis: 0;
3150
+
3151
+
3152
+ -webkit-box-flex: 1;
3153
+
3154
+
3155
+ -ms-flex-positive: 1;
3156
+
3157
+
3158
+ flex-grow: 1;
3159
+
3160
+
3161
+ max-width: 100%
3162
+
3163
+
3164
+ }
3165
+
3166
+
3167
+
3168
+
3169
+
3170
+ .col-sm-auto {
3171
+
3172
+
3173
+ -webkit-box-flex: 0;
3174
+
3175
+
3176
+ -ms-flex: 0 0 auto;
3177
+
3178
+
3179
+ flex: 0 0 auto;
3180
+
3181
+
3182
+ width: auto;
3183
+
3184
+
3185
+ max-width: none
3186
+
3187
+
3188
+ }
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+ .col-sm-1 {
3195
+
3196
+
3197
+ -webkit-box-flex: 0;
3198
+
3199
+
3200
+ -ms-flex: 0 0 8.333333%;
3201
+
3202
+
3203
+ flex: 0 0 8.333333%;
3204
+
3205
+
3206
+ max-width: 8.333333%
3207
+
3208
+
3209
+ }
3210
+
3211
+
3212
+
3213
+
3214
+
3215
+ .col-sm-2 {
3216
+
3217
+
3218
+ -webkit-box-flex: 0;
3219
+
3220
+
3221
+ -ms-flex: 0 0 16.666667%;
3222
+
3223
+
3224
+ flex: 0 0 16.666667%;
3225
+
3226
+
3227
+ max-width: 16.666667%
3228
+
3229
+
3230
+ }
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+ .col-sm-3 {
3237
+
3238
+
3239
+ -webkit-box-flex: 0;
3240
+
3241
+
3242
+ -ms-flex: 0 0 25%;
3243
+
3244
+
3245
+ flex: 0 0 25%;
3246
+
3247
+
3248
+ max-width: 25%
3249
+
3250
+
3251
+ }
3252
+
3253
+
3254
+
3255
+
3256
+
3257
+ .col-sm-4 {
3258
+
3259
+
3260
+ -webkit-box-flex: 0;
3261
+
3262
+
3263
+ -ms-flex: 0 0 33.333333%;
3264
+
3265
+
3266
+ flex: 0 0 33.333333%;
3267
+
3268
+
3269
+ max-width: 33.333333%
3270
+
3271
+
3272
+ }
3273
+
3274
+
3275
+
3276
+
3277
+
3278
+ .col-sm-5 {
3279
+
3280
+
3281
+ -webkit-box-flex: 0;
3282
+
3283
+
3284
+ -ms-flex: 0 0 41.666667%;
3285
+
3286
+
3287
+ flex: 0 0 41.666667%;
3288
+
3289
+
3290
+ max-width: 41.666667%
3291
+
3292
+
3293
+ }
3294
+
3295
+
3296
+
3297
+
3298
+
3299
+ .col-sm-6 {
3300
+
3301
+
3302
+ -webkit-box-flex: 0;
3303
+
3304
+
3305
+ -ms-flex: 0 0 50%;
3306
+
3307
+
3308
+ flex: 0 0 50%;
3309
+
3310
+
3311
+ max-width: 50%
3312
+
3313
+
3314
+ }
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+ .col-sm-7 {
3321
+
3322
+
3323
+ -webkit-box-flex: 0;
3324
+
3325
+
3326
+ -ms-flex: 0 0 58.333333%;
3327
+
3328
+
3329
+ flex: 0 0 58.333333%;
3330
+
3331
+
3332
+ max-width: 58.333333%
3333
+
3334
+
3335
+ }
3336
+
3337
+
3338
+
3339
+
3340
+
3341
+ .col-sm-8 {
3342
+
3343
+
3344
+ -webkit-box-flex: 0;
3345
+
3346
+
3347
+ -ms-flex: 0 0 66.666667%;
3348
+
3349
+
3350
+ flex: 0 0 66.666667%;
3351
+
3352
+
3353
+ max-width: 66.666667%
3354
+
3355
+
3356
+ }
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+ .col-sm-9 {
3363
+
3364
+
3365
+ -webkit-box-flex: 0;
3366
+
3367
+
3368
+ -ms-flex: 0 0 75%;
3369
+
3370
+
3371
+ flex: 0 0 75%;
3372
+
3373
+
3374
+ max-width: 75%
3375
+
3376
+
3377
+ }
3378
+
3379
+
3380
+
3381
+
3382
+
3383
+ .col-sm-10 {
3384
+
3385
+
3386
+ -webkit-box-flex: 0;
3387
+
3388
+
3389
+ -ms-flex: 0 0 83.333333%;
3390
+
3391
+
3392
+ flex: 0 0 83.333333%;
3393
+
3394
+
3395
+ max-width: 83.333333%
3396
+
3397
+
3398
+ }
3399
+
3400
+
3401
+
3402
+
3403
+
3404
+ .col-sm-11 {
3405
+
3406
+
3407
+ -webkit-box-flex: 0;
3408
+
3409
+
3410
+ -ms-flex: 0 0 91.666667%;
3411
+
3412
+
3413
+ flex: 0 0 91.666667%;
3414
+
3415
+
3416
+ max-width: 91.666667%
3417
+
3418
+
3419
+ }
3420
+
3421
+
3422
+
3423
+
3424
+
3425
+ .col-sm-12 {
3426
+
3427
+
3428
+ -webkit-box-flex: 0;
3429
+
3430
+
3431
+ -ms-flex: 0 0 100%;
3432
+
3433
+
3434
+ flex: 0 0 100%;
3435
+
3436
+
3437
+ max-width: 100%
3438
+
3439
+
3440
+ }
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+ .order-sm-first {
3447
+
3448
+
3449
+ -webkit-box-ordinal-group: 0;
3450
+
3451
+
3452
+ -ms-flex-order: -1;
3453
+
3454
+
3455
+ order: -1
3456
+
3457
+
3458
+ }
3459
+
3460
+
3461
+
3462
+
3463
+
3464
+ .order-sm-last {
3465
+
3466
+
3467
+ -webkit-box-ordinal-group: 14;
3468
+
3469
+
3470
+ -ms-flex-order: 13;
3471
+
3472
+
3473
+ order: 13
3474
+
3475
+
3476
+ }
3477
+
3478
+
3479
+
3480
+
3481
+
3482
+ .order-sm-0 {
3483
+
3484
+
3485
+ -webkit-box-ordinal-group: 1;
3486
+
3487
+
3488
+ -ms-flex-order: 0;
3489
+
3490
+
3491
+ order: 0
3492
+
3493
+
3494
+ }
3495
+
3496
+
3497
+
3498
+
3499
+
3500
+ .order-sm-1 {
3501
+
3502
+
3503
+ -webkit-box-ordinal-group: 2;
3504
+
3505
+
3506
+ -ms-flex-order: 1;
3507
+
3508
+
3509
+ order: 1
3510
+
3511
+
3512
+ }
3513
+
3514
+
3515
+
3516
+
3517
+
3518
+ .order-sm-2 {
3519
+
3520
+
3521
+ -webkit-box-ordinal-group: 3;
3522
+
3523
+
3524
+ -ms-flex-order: 2;
3525
+
3526
+
3527
+ order: 2
3528
+
3529
+
3530
+ }
3531
+
3532
+
3533
+
3534
+
3535
+
3536
+ .order-sm-3 {
3537
+
3538
+
3539
+ -webkit-box-ordinal-group: 4;
3540
+
3541
+
3542
+ -ms-flex-order: 3;
3543
+
3544
+
3545
+ order: 3
3546
+
3547
+
3548
+ }
3549
+
3550
+
3551
+
3552
+
3553
+
3554
+ .order-sm-4 {
3555
+
3556
+
3557
+ -webkit-box-ordinal-group: 5;
3558
+
3559
+
3560
+ -ms-flex-order: 4;
3561
+
3562
+
3563
+ order: 4
3564
+
3565
+
3566
+ }
3567
+
3568
+
3569
+
3570
+
3571
+
3572
+ .order-sm-5 {
3573
+
3574
+
3575
+ -webkit-box-ordinal-group: 6;
3576
+
3577
+
3578
+ -ms-flex-order: 5;
3579
+
3580
+
3581
+ order: 5
3582
+
3583
+
3584
+ }
3585
+
3586
+
3587
+
3588
+
3589
+
3590
+ .order-sm-6 {
3591
+
3592
+
3593
+ -webkit-box-ordinal-group: 7;
3594
+
3595
+
3596
+ -ms-flex-order: 6;
3597
+
3598
+
3599
+ order: 6
3600
+
3601
+
3602
+ }
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+ .order-sm-7 {
3609
+
3610
+
3611
+ -webkit-box-ordinal-group: 8;
3612
+
3613
+
3614
+ -ms-flex-order: 7;
3615
+
3616
+
3617
+ order: 7
3618
+
3619
+
3620
+ }
3621
+
3622
+
3623
+
3624
+
3625
+
3626
+ .order-sm-8 {
3627
+
3628
+
3629
+ -webkit-box-ordinal-group: 9;
3630
+
3631
+
3632
+ -ms-flex-order: 8;
3633
+
3634
+
3635
+ order: 8
3636
+
3637
+
3638
+ }
3639
+
3640
+
3641
+
3642
+
3643
+
3644
+ .order-sm-9 {
3645
+
3646
+
3647
+ -webkit-box-ordinal-group: 10;
3648
+
3649
+
3650
+ -ms-flex-order: 9;
3651
+
3652
+
3653
+ order: 9
3654
+
3655
+
3656
+ }
3657
+
3658
+
3659
+
3660
+
3661
+
3662
+ .order-sm-10 {
3663
+
3664
+
3665
+ -webkit-box-ordinal-group: 11;
3666
+
3667
+
3668
+ -ms-flex-order: 10;
3669
+
3670
+
3671
+ order: 10
3672
+
3673
+
3674
+ }
3675
+
3676
+
3677
+
3678
+
3679
+
3680
+ .order-sm-11 {
3681
+
3682
+
3683
+ -webkit-box-ordinal-group: 12;
3684
+
3685
+
3686
+ -ms-flex-order: 11;
3687
+
3688
+
3689
+ order: 11
3690
+
3691
+
3692
+ }
3693
+
3694
+
3695
+
3696
+
3697
+
3698
+ .order-sm-12 {
3699
+
3700
+
3701
+ -webkit-box-ordinal-group: 13;
3702
+
3703
+
3704
+ -ms-flex-order: 12;
3705
+
3706
+
3707
+ order: 12
3708
+
3709
+
3710
+ }
3711
+
3712
+
3713
+
3714
+
3715
+
3716
+ .offset-sm-0 {
3717
+
3718
+
3719
+ margin-left: 0
3720
+
3721
+
3722
+ }
3723
+
3724
+
3725
+
3726
+
3727
+
3728
+ .offset-sm-1 {
3729
+
3730
+
3731
+ margin-left: 8.333333%
3732
+
3733
+
3734
+ }
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+ .offset-sm-2 {
3741
+
3742
+
3743
+ margin-left: 16.666667%
3744
+
3745
+
3746
+ }
3747
+
3748
+
3749
+
3750
+
3751
+
3752
+ .offset-sm-3 {
3753
+
3754
+
3755
+ margin-left: 25%
3756
+
3757
+
3758
+ }
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+ .offset-sm-4 {
3765
+
3766
+
3767
+ margin-left: 33.333333%
3768
+
3769
+
3770
+ }
3771
+
3772
+
3773
+
3774
+
3775
+
3776
+ .offset-sm-5 {
3777
+
3778
+
3779
+ margin-left: 41.666667%
3780
+
3781
+
3782
+ }
3783
+
3784
+
3785
+
3786
+
3787
+
3788
+ .offset-sm-6 {
3789
+
3790
+
3791
+ margin-left: 50%
3792
+
3793
+
3794
+ }
3795
+
3796
+
3797
+
3798
+
3799
+
3800
+ .offset-sm-7 {
3801
+
3802
+
3803
+ margin-left: 58.333333%
3804
+
3805
+
3806
+ }
3807
+
3808
+
3809
+
3810
+
3811
+
3812
+ .offset-sm-8 {
3813
+
3814
+
3815
+ margin-left: 66.666667%
3816
+
3817
+
3818
+ }
3819
+
3820
+
3821
+
3822
+
3823
+
3824
+ .offset-sm-9 {
3825
+
3826
+
3827
+ margin-left: 75%
3828
+
3829
+
3830
+ }
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+ .offset-sm-10 {
3837
+
3838
+
3839
+ margin-left: 83.333333%
3840
+
3841
+
3842
+ }
3843
+
3844
+
3845
+
3846
+
3847
+
3848
+ .offset-sm-11 {
3849
+
3850
+
3851
+ margin-left: 91.666667%
3852
+
3853
+
3854
+ }
3855
+
3856
+
3857
+ }
3858
+
3859
+
3860
+
3861
+
3862
+
3863
+ @media (min-width: 768px) {
3864
+
3865
+
3866
+ .col-md {
3867
+
3868
+
3869
+ -ms-flex-preferred-size: 0;
3870
+
3871
+
3872
+ flex-basis: 0;
3873
+
3874
+
3875
+ -webkit-box-flex: 1;
3876
+
3877
+
3878
+ -ms-flex-positive: 1;
3879
+
3880
+
3881
+ flex-grow: 1;
3882
+
3883
+
3884
+ max-width: 100%
3885
+
3886
+
3887
+ }
3888
+
3889
+
3890
+
3891
+
3892
+
3893
+ .col-md-auto {
3894
+
3895
+
3896
+ -webkit-box-flex: 0;
3897
+
3898
+
3899
+ -ms-flex: 0 0 auto;
3900
+
3901
+
3902
+ flex: 0 0 auto;
3903
+
3904
+
3905
+ width: auto;
3906
+
3907
+
3908
+ max-width: none
3909
+
3910
+
3911
+ }
3912
+
3913
+
3914
+
3915
+
3916
+
3917
+ .col-md-1 {
3918
+
3919
+
3920
+ -webkit-box-flex: 0;
3921
+
3922
+
3923
+ -ms-flex: 0 0 8.333333%;
3924
+
3925
+
3926
+ flex: 0 0 8.333333%;
3927
+
3928
+
3929
+ max-width: 8.333333%
3930
+
3931
+
3932
+ }
3933
+
3934
+
3935
+
3936
+
3937
+
3938
+ .col-md-2 {
3939
+
3940
+
3941
+ -webkit-box-flex: 0;
3942
+
3943
+
3944
+ -ms-flex: 0 0 16.666667%;
3945
+
3946
+
3947
+ flex: 0 0 16.666667%;
3948
+
3949
+
3950
+ max-width: 16.666667%
3951
+
3952
+
3953
+ }
3954
+
3955
+
3956
+
3957
+
3958
+
3959
+ .col-md-3 {
3960
+
3961
+
3962
+ -webkit-box-flex: 0;
3963
+
3964
+
3965
+ -ms-flex: 0 0 25%;
3966
+
3967
+
3968
+ flex: 0 0 25%;
3969
+
3970
+
3971
+ max-width: 25%
3972
+
3973
+
3974
+ }
3975
+
3976
+
3977
+
3978
+
3979
+
3980
+ .col-md-4 {
3981
+
3982
+
3983
+ -webkit-box-flex: 0;
3984
+
3985
+
3986
+ -ms-flex: 0 0 33.333333%;
3987
+
3988
+
3989
+ flex: 0 0 33.333333%;
3990
+
3991
+
3992
+ max-width: 33.333333%
3993
+
3994
+
3995
+ }
3996
+
3997
+
3998
+
3999
+
4000
+
4001
+ .col-md-5 {
4002
+
4003
+
4004
+ -webkit-box-flex: 0;
4005
+
4006
+
4007
+ -ms-flex: 0 0 41.666667%;
4008
+
4009
+
4010
+ flex: 0 0 41.666667%;
4011
+
4012
+
4013
+ max-width: 41.666667%
4014
+
4015
+
4016
+ }
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+ .col-md-6 {
4023
+
4024
+
4025
+ -webkit-box-flex: 0;
4026
+
4027
+
4028
+ -ms-flex: 0 0 50%;
4029
+
4030
+
4031
+ flex: 0 0 50%;
4032
+
4033
+
4034
+ max-width: 50%
4035
+
4036
+
4037
+ }
4038
+
4039
+
4040
+
4041
+
4042
+
4043
+ .col-md-7 {
4044
+
4045
+
4046
+ -webkit-box-flex: 0;
4047
+
4048
+
4049
+ -ms-flex: 0 0 58.333333%;
4050
+
4051
+
4052
+ flex: 0 0 58.333333%;
4053
+
4054
+
4055
+ max-width: 58.333333%
4056
+
4057
+
4058
+ }
4059
+
4060
+
4061
+
4062
+
4063
+
4064
+ .col-md-8 {
4065
+
4066
+
4067
+ -webkit-box-flex: 0;
4068
+
4069
+
4070
+ -ms-flex: 0 0 66.666667%;
4071
+
4072
+
4073
+ flex: 0 0 66.666667%;
4074
+
4075
+
4076
+ max-width: 66.666667%
4077
+
4078
+
4079
+ }
4080
+
4081
+
4082
+
4083
+
4084
+
4085
+ .col-md-9 {
4086
+
4087
+
4088
+ -webkit-box-flex: 0;
4089
+
4090
+
4091
+ -ms-flex: 0 0 75%;
4092
+
4093
+
4094
+ flex: 0 0 75%;
4095
+
4096
+
4097
+ max-width: 75%
4098
+
4099
+
4100
+ }
4101
+
4102
+
4103
+
4104
+
4105
+
4106
+ .col-md-10 {
4107
+
4108
+
4109
+ -webkit-box-flex: 0;
4110
+
4111
+
4112
+ -ms-flex: 0 0 83.333333%;
4113
+
4114
+
4115
+ flex: 0 0 83.333333%;
4116
+
4117
+
4118
+ max-width: 83.333333%
4119
+
4120
+
4121
+ }
4122
+
4123
+
4124
+
4125
+
4126
+
4127
+ .col-md-11 {
4128
+
4129
+
4130
+ -webkit-box-flex: 0;
4131
+
4132
+
4133
+ -ms-flex: 0 0 91.666667%;
4134
+
4135
+
4136
+ flex: 0 0 91.666667%;
4137
+
4138
+
4139
+ max-width: 91.666667%
4140
+
4141
+
4142
+ }
4143
+
4144
+
4145
+
4146
+
4147
+
4148
+ .col-md-12 {
4149
+
4150
+
4151
+ -webkit-box-flex: 0;
4152
+
4153
+
4154
+ -ms-flex: 0 0 100%;
4155
+
4156
+
4157
+ flex: 0 0 100%;
4158
+
4159
+
4160
+ max-width: 100%
4161
+
4162
+
4163
+ }
4164
+
4165
+
4166
+
4167
+
4168
+
4169
+ .order-md-first {
4170
+
4171
+
4172
+ -webkit-box-ordinal-group: 0;
4173
+
4174
+
4175
+ -ms-flex-order: -1;
4176
+
4177
+
4178
+ order: -1
4179
+
4180
+
4181
+ }
4182
+
4183
+
4184
+
4185
+
4186
+
4187
+ .order-md-last {
4188
+
4189
+
4190
+ -webkit-box-ordinal-group: 14;
4191
+
4192
+
4193
+ -ms-flex-order: 13;
4194
+
4195
+
4196
+ order: 13
4197
+
4198
+
4199
+ }
4200
+
4201
+
4202
+
4203
+
4204
+
4205
+ .order-md-0 {
4206
+
4207
+
4208
+ -webkit-box-ordinal-group: 1;
4209
+
4210
+
4211
+ -ms-flex-order: 0;
4212
+
4213
+
4214
+ order: 0
4215
+
4216
+
4217
+ }
4218
+
4219
+
4220
+
4221
+
4222
+
4223
+ .order-md-1 {
4224
+
4225
+
4226
+ -webkit-box-ordinal-group: 2;
4227
+
4228
+
4229
+ -ms-flex-order: 1;
4230
+
4231
+
4232
+ order: 1
4233
+
4234
+
4235
+ }
4236
+
4237
+
4238
+
4239
+
4240
+
4241
+ .order-md-2 {
4242
+
4243
+
4244
+ -webkit-box-ordinal-group: 3;
4245
+
4246
+
4247
+ -ms-flex-order: 2;
4248
+
4249
+
4250
+ order: 2
4251
+
4252
+
4253
+ }
4254
+
4255
+
4256
+
4257
+
4258
+
4259
+ .order-md-3 {
4260
+
4261
+
4262
+ -webkit-box-ordinal-group: 4;
4263
+
4264
+
4265
+ -ms-flex-order: 3;
4266
+
4267
+
4268
+ order: 3
4269
+
4270
+
4271
+ }
4272
+
4273
+
4274
+
4275
+
4276
+
4277
+ .order-md-4 {
4278
+
4279
+
4280
+ -webkit-box-ordinal-group: 5;
4281
+
4282
+
4283
+ -ms-flex-order: 4;
4284
+
4285
+
4286
+ order: 4
4287
+
4288
+
4289
+ }
4290
+
4291
+
4292
+
4293
+
4294
+
4295
+ .order-md-5 {
4296
+
4297
+
4298
+ -webkit-box-ordinal-group: 6;
4299
+
4300
+
4301
+ -ms-flex-order: 5;
4302
+
4303
+
4304
+ order: 5
4305
+
4306
+
4307
+ }
4308
+
4309
+
4310
+
4311
+
4312
+
4313
+ .order-md-6 {
4314
+
4315
+
4316
+ -webkit-box-ordinal-group: 7;
4317
+
4318
+
4319
+ -ms-flex-order: 6;
4320
+
4321
+
4322
+ order: 6
4323
+
4324
+
4325
+ }
4326
+
4327
+
4328
+
4329
+
4330
+
4331
+ .order-md-7 {
4332
+
4333
+
4334
+ -webkit-box-ordinal-group: 8;
4335
+
4336
+
4337
+ -ms-flex-order: 7;
4338
+
4339
+
4340
+ order: 7
4341
+
4342
+
4343
+ }
4344
+
4345
+
4346
+
4347
+
4348
+
4349
+ .order-md-8 {
4350
+
4351
+
4352
+ -webkit-box-ordinal-group: 9;
4353
+
4354
+
4355
+ -ms-flex-order: 8;
4356
+
4357
+
4358
+ order: 8
4359
+
4360
+
4361
+ }
4362
+
4363
+
4364
+
4365
+
4366
+
4367
+ .order-md-9 {
4368
+
4369
+
4370
+ -webkit-box-ordinal-group: 10;
4371
+
4372
+
4373
+ -ms-flex-order: 9;
4374
+
4375
+
4376
+ order: 9
4377
+
4378
+
4379
+ }
4380
+
4381
+
4382
+
4383
+
4384
+
4385
+ .order-md-10 {
4386
+
4387
+
4388
+ -webkit-box-ordinal-group: 11;
4389
+
4390
+
4391
+ -ms-flex-order: 10;
4392
+
4393
+
4394
+ order: 10
4395
+
4396
+
4397
+ }
4398
+
4399
+
4400
+
4401
+
4402
+
4403
+ .order-md-11 {
4404
+
4405
+
4406
+ -webkit-box-ordinal-group: 12;
4407
+
4408
+
4409
+ -ms-flex-order: 11;
4410
+
4411
+
4412
+ order: 11
4413
+
4414
+
4415
+ }
4416
+
4417
+
4418
+
4419
+
4420
+
4421
+ .order-md-12 {
4422
+
4423
+
4424
+ -webkit-box-ordinal-group: 13;
4425
+
4426
+
4427
+ -ms-flex-order: 12;
4428
+
4429
+
4430
+ order: 12
4431
+
4432
+
4433
+ }
4434
+
4435
+
4436
+
4437
+
4438
+
4439
+ .offset-md-0 {
4440
+
4441
+
4442
+ margin-left: 0
4443
+
4444
+
4445
+ }
4446
+
4447
+
4448
+
4449
+
4450
+
4451
+ .offset-md-1 {
4452
+
4453
+
4454
+ margin-left: 8.333333%
4455
+
4456
+
4457
+ }
4458
+
4459
+
4460
+
4461
+
4462
+
4463
+ .offset-md-2 {
4464
+
4465
+
4466
+ margin-left: 16.666667%
4467
+
4468
+
4469
+ }
4470
+
4471
+
4472
+
4473
+
4474
+
4475
+ .offset-md-3 {
4476
+
4477
+
4478
+ margin-left: 25%
4479
+
4480
+
4481
+ }
4482
+
4483
+
4484
+
4485
+
4486
+
4487
+ .offset-md-4 {
4488
+
4489
+
4490
+ margin-left: 33.333333%
4491
+
4492
+
4493
+ }
4494
+
4495
+
4496
+
4497
+
4498
+
4499
+ .offset-md-5 {
4500
+
4501
+
4502
+ margin-left: 41.666667%
4503
+
4504
+
4505
+ }
4506
+
4507
+
4508
+
4509
+
4510
+
4511
+ .offset-md-6 {
4512
+
4513
+
4514
+ margin-left: 50%
4515
+
4516
+
4517
+ }
4518
+
4519
+
4520
+
4521
+
4522
+
4523
+ .offset-md-7 {
4524
+
4525
+
4526
+ margin-left: 58.333333%
4527
+
4528
+
4529
+ }
4530
+
4531
+
4532
+
4533
+
4534
+
4535
+ .offset-md-8 {
4536
+
4537
+
4538
+ margin-left: 66.666667%
4539
+
4540
+
4541
+ }
4542
+
4543
+
4544
+
4545
+
4546
+
4547
+ .offset-md-9 {
4548
+
4549
+
4550
+ margin-left: 75%
4551
+
4552
+
4553
+ }
4554
+
4555
+
4556
+
4557
+
4558
+
4559
+ .offset-md-10 {
4560
+
4561
+
4562
+ margin-left: 83.333333%
4563
+
4564
+
4565
+ }
4566
+
4567
+
4568
+
4569
+
4570
+
4571
+ .offset-md-11 {
4572
+
4573
+
4574
+ margin-left: 91.666667%
4575
+
4576
+
4577
+ }
4578
+
4579
+
4580
+ }
4581
+
4582
+
4583
+
4584
+
4585
+
4586
+ @media (min-width: 992px) {
4587
+
4588
+
4589
+ .col-lg {
4590
+
4591
+
4592
+ -ms-flex-preferred-size: 0;
4593
+
4594
+
4595
+ flex-basis: 0;
4596
+
4597
+
4598
+ -webkit-box-flex: 1;
4599
+
4600
+
4601
+ -ms-flex-positive: 1;
4602
+
4603
+
4604
+ flex-grow: 1;
4605
+
4606
+
4607
+ max-width: 100%
4608
+
4609
+
4610
+ }
4611
+
4612
+
4613
+
4614
+
4615
+
4616
+ .col-lg-auto {
4617
+
4618
+
4619
+ -webkit-box-flex: 0;
4620
+
4621
+
4622
+ -ms-flex: 0 0 auto;
4623
+
4624
+
4625
+ flex: 0 0 auto;
4626
+
4627
+
4628
+ width: auto;
4629
+
4630
+
4631
+ max-width: none
4632
+
4633
+
4634
+ }
4635
+
4636
+
4637
+
4638
+
4639
+
4640
+ .col-lg-1 {
4641
+
4642
+
4643
+ -webkit-box-flex: 0;
4644
+
4645
+
4646
+ -ms-flex: 0 0 8.333333%;
4647
+
4648
+
4649
+ flex: 0 0 8.333333%;
4650
+
4651
+
4652
+ max-width: 8.333333%
4653
+
4654
+
4655
+ }
4656
+
4657
+
4658
+
4659
+
4660
+
4661
+ .col-lg-2 {
4662
+
4663
+
4664
+ -webkit-box-flex: 0;
4665
+
4666
+
4667
+ -ms-flex: 0 0 16.666667%;
4668
+
4669
+
4670
+ flex: 0 0 16.666667%;
4671
+
4672
+
4673
+ max-width: 16.666667%
4674
+
4675
+
4676
+ }
4677
+
4678
+
4679
+
4680
+
4681
+
4682
+ .col-lg-3 {
4683
+
4684
+
4685
+ -webkit-box-flex: 0;
4686
+
4687
+
4688
+ -ms-flex: 0 0 25%;
4689
+
4690
+
4691
+ flex: 0 0 25%;
4692
+
4693
+
4694
+ max-width: 25%
4695
+
4696
+
4697
+ }
4698
+
4699
+
4700
+
4701
+
4702
+
4703
+ .col-lg-4 {
4704
+
4705
+
4706
+ -webkit-box-flex: 0;
4707
+
4708
+
4709
+ -ms-flex: 0 0 33.333333%;
4710
+
4711
+
4712
+ flex: 0 0 33.333333%;
4713
+
4714
+
4715
+ max-width: 33.333333%
4716
+
4717
+
4718
+ }
4719
+
4720
+
4721
+
4722
+
4723
+
4724
+ .col-lg-5 {
4725
+
4726
+
4727
+ -webkit-box-flex: 0;
4728
+
4729
+
4730
+ -ms-flex: 0 0 41.666667%;
4731
+
4732
+
4733
+ flex: 0 0 41.666667%;
4734
+
4735
+
4736
+ max-width: 41.666667%
4737
+
4738
+
4739
+ }
4740
+
4741
+
4742
+
4743
+
4744
+
4745
+ .col-lg-6 {
4746
+
4747
+
4748
+ -webkit-box-flex: 0;
4749
+
4750
+
4751
+ -ms-flex: 0 0 50%;
4752
+
4753
+
4754
+ flex: 0 0 50%;
4755
+
4756
+
4757
+ max-width: 50%
4758
+
4759
+
4760
+ }
4761
+
4762
+
4763
+
4764
+
4765
+
4766
+ .col-lg-7 {
4767
+
4768
+
4769
+ -webkit-box-flex: 0;
4770
+
4771
+
4772
+ -ms-flex: 0 0 58.333333%;
4773
+
4774
+
4775
+ flex: 0 0 58.333333%;
4776
+
4777
+
4778
+ max-width: 58.333333%
4779
+
4780
+
4781
+ }
4782
+
4783
+
4784
+
4785
+
4786
+
4787
+ .col-lg-8 {
4788
+
4789
+
4790
+ -webkit-box-flex: 0;
4791
+
4792
+
4793
+ -ms-flex: 0 0 66.666667%;
4794
+
4795
+
4796
+ flex: 0 0 66.666667%;
4797
+
4798
+
4799
+ max-width: 66.666667%
4800
+
4801
+
4802
+ }
4803
+
4804
+
4805
+
4806
+
4807
+
4808
+ .col-lg-9 {
4809
+
4810
+
4811
+ -webkit-box-flex: 0;
4812
+
4813
+
4814
+ -ms-flex: 0 0 75%;
4815
+
4816
+
4817
+ flex: 0 0 75%;
4818
+
4819
+
4820
+ max-width: 75%
4821
+
4822
+
4823
+ }
4824
+
4825
+
4826
+
4827
+
4828
+
4829
+ .col-lg-10 {
4830
+
4831
+
4832
+ -webkit-box-flex: 0;
4833
+
4834
+
4835
+ -ms-flex: 0 0 83.333333%;
4836
+
4837
+
4838
+ flex: 0 0 83.333333%;
4839
+
4840
+
4841
+ max-width: 83.333333%
4842
+
4843
+
4844
+ }
4845
+
4846
+
4847
+
4848
+
4849
+
4850
+ .col-lg-11 {
4851
+
4852
+
4853
+ -webkit-box-flex: 0;
4854
+
4855
+
4856
+ -ms-flex: 0 0 91.666667%;
4857
+
4858
+
4859
+ flex: 0 0 91.666667%;
4860
+
4861
+
4862
+ max-width: 91.666667%
4863
+
4864
+
4865
+ }
4866
+
4867
+
4868
+
4869
+
4870
+
4871
+ .col-lg-12 {
4872
+
4873
+
4874
+ -webkit-box-flex: 0;
4875
+
4876
+
4877
+ -ms-flex: 0 0 100%;
4878
+
4879
+
4880
+ flex: 0 0 100%;
4881
+
4882
+
4883
+ max-width: 100%
4884
+
4885
+
4886
+ }
4887
+
4888
+
4889
+
4890
+
4891
+
4892
+ .order-lg-first {
4893
+
4894
+
4895
+ -webkit-box-ordinal-group: 0;
4896
+
4897
+
4898
+ -ms-flex-order: -1;
4899
+
4900
+
4901
+ order: -1
4902
+
4903
+
4904
+ }
4905
+
4906
+
4907
+
4908
+
4909
+
4910
+ .order-lg-last {
4911
+
4912
+
4913
+ -webkit-box-ordinal-group: 14;
4914
+
4915
+
4916
+ -ms-flex-order: 13;
4917
+
4918
+
4919
+ order: 13
4920
+
4921
+
4922
+ }
4923
+
4924
+
4925
+
4926
+
4927
+
4928
+ .order-lg-0 {
4929
+
4930
+
4931
+ -webkit-box-ordinal-group: 1;
4932
+
4933
+
4934
+ -ms-flex-order: 0;
4935
+
4936
+
4937
+ order: 0
4938
+
4939
+
4940
+ }
4941
+
4942
+
4943
+
4944
+
4945
+
4946
+ .order-lg-1 {
4947
+
4948
+
4949
+ -webkit-box-ordinal-group: 2;
4950
+
4951
+
4952
+ -ms-flex-order: 1;
4953
+
4954
+
4955
+ order: 1
4956
+
4957
+
4958
+ }
4959
+
4960
+
4961
+
4962
+
4963
+
4964
+ .order-lg-2 {
4965
+
4966
+
4967
+ -webkit-box-ordinal-group: 3;
4968
+
4969
+
4970
+ -ms-flex-order: 2;
4971
+
4972
+
4973
+ order: 2
4974
+
4975
+
4976
+ }
4977
+
4978
+
4979
+
4980
+
4981
+
4982
+ .order-lg-3 {
4983
+
4984
+
4985
+ -webkit-box-ordinal-group: 4;
4986
+
4987
+
4988
+ -ms-flex-order: 3;
4989
+
4990
+
4991
+ order: 3
4992
+
4993
+
4994
+ }
4995
+
4996
+
4997
+
4998
+
4999
+
5000
+ .order-lg-4 {
5001
+
5002
+
5003
+ -webkit-box-ordinal-group: 5;
5004
+
5005
+
5006
+ -ms-flex-order: 4;
5007
+
5008
+
5009
+ order: 4
5010
+
5011
+
5012
+ }
5013
+
5014
+
5015
+
5016
+
5017
+
5018
+ .order-lg-5 {
5019
+
5020
+
5021
+ -webkit-box-ordinal-group: 6;
5022
+
5023
+
5024
+ -ms-flex-order: 5;
5025
+
5026
+
5027
+ order: 5
5028
+
5029
+
5030
+ }
5031
+
5032
+
5033
+
5034
+
5035
+
5036
+ .order-lg-6 {
5037
+
5038
+
5039
+ -webkit-box-ordinal-group: 7;
5040
+
5041
+
5042
+ -ms-flex-order: 6;
5043
+
5044
+
5045
+ order: 6
5046
+
5047
+
5048
+ }
5049
+
5050
+
5051
+
5052
+
5053
+
5054
+ .order-lg-7 {
5055
+
5056
+
5057
+ -webkit-box-ordinal-group: 8;
5058
+
5059
+
5060
+ -ms-flex-order: 7;
5061
+
5062
+
5063
+ order: 7
5064
+
5065
+
5066
+ }
5067
+
5068
+
5069
+
5070
+
5071
+
5072
+ .order-lg-8 {
5073
+
5074
+
5075
+ -webkit-box-ordinal-group: 9;
5076
+
5077
+
5078
+ -ms-flex-order: 8;
5079
+
5080
+
5081
+ order: 8
5082
+
5083
+
5084
+ }
5085
+
5086
+
5087
+
5088
+
5089
+
5090
+ .order-lg-9 {
5091
+
5092
+
5093
+ -webkit-box-ordinal-group: 10;
5094
+
5095
+
5096
+ -ms-flex-order: 9;
5097
+
5098
+
5099
+ order: 9
5100
+
5101
+
5102
+ }
5103
+
5104
+
5105
+
5106
+
5107
+
5108
+ .order-lg-10 {
5109
+
5110
+
5111
+ -webkit-box-ordinal-group: 11;
5112
+
5113
+
5114
+ -ms-flex-order: 10;
5115
+
5116
+
5117
+ order: 10
5118
+
5119
+
5120
+ }
5121
+
5122
+
5123
+
5124
+
5125
+
5126
+ .order-lg-11 {
5127
+
5128
+
5129
+ -webkit-box-ordinal-group: 12;
5130
+
5131
+
5132
+ -ms-flex-order: 11;
5133
+
5134
+
5135
+ order: 11
5136
+
5137
+
5138
+ }
5139
+
5140
+
5141
+
5142
+
5143
+
5144
+ .order-lg-12 {
5145
+
5146
+
5147
+ -webkit-box-ordinal-group: 13;
5148
+
5149
+
5150
+ -ms-flex-order: 12;
5151
+
5152
+
5153
+ order: 12
5154
+
5155
+
5156
+ }
5157
+
5158
+
5159
+
5160
+
5161
+
5162
+ .offset-lg-0 {
5163
+
5164
+
5165
+ margin-left: 0
5166
+
5167
+
5168
+ }
5169
+
5170
+
5171
+
5172
+
5173
+
5174
+ .offset-lg-1 {
5175
+
5176
+
5177
+ margin-left: 8.333333%
5178
+
5179
+
5180
+ }
5181
+
5182
+
5183
+
5184
+
5185
+
5186
+ .offset-lg-2 {
5187
+
5188
+
5189
+ margin-left: 16.666667%
5190
+
5191
+
5192
+ }
5193
+
5194
+
5195
+
5196
+
5197
+
5198
+ .offset-lg-3 {
5199
+
5200
+
5201
+ margin-left: 25%
5202
+
5203
+
5204
+ }
5205
+
5206
+
5207
+
5208
+
5209
+
5210
+ .offset-lg-4 {
5211
+
5212
+
5213
+ margin-left: 33.333333%
5214
+
5215
+
5216
+ }
5217
+
5218
+
5219
+
5220
+
5221
+
5222
+ .offset-lg-5 {
5223
+
5224
+
5225
+ margin-left: 41.666667%
5226
+
5227
+
5228
+ }
5229
+
5230
+
5231
+
5232
+
5233
+
5234
+ .offset-lg-6 {
5235
+
5236
+
5237
+ margin-left: 50%
5238
+
5239
+
5240
+ }
5241
+
5242
+
5243
+
5244
+
5245
+
5246
+ .offset-lg-7 {
5247
+
5248
+
5249
+ margin-left: 58.333333%
5250
+
5251
+
5252
+ }
5253
+
5254
+
5255
+
5256
+
5257
+
5258
+ .offset-lg-8 {
5259
+
5260
+
5261
+ margin-left: 66.666667%
5262
+
5263
+
5264
+ }
5265
+
5266
+
5267
+
5268
+
5269
+
5270
+ .offset-lg-9 {
5271
+
5272
+
5273
+ margin-left: 75%
5274
+
5275
+
5276
+ }
5277
+
5278
+
5279
+
5280
+
5281
+
5282
+ .offset-lg-10 {
5283
+
5284
+
5285
+ margin-left: 83.333333%
5286
+
5287
+
5288
+ }
5289
+
5290
+
5291
+
5292
+
5293
+
5294
+ .offset-lg-11 {
5295
+
5296
+
5297
+ margin-left: 91.666667%
5298
+
5299
+
5300
+ }
5301
+
5302
+
5303
+ }
5304
+
5305
+
5306
+
5307
+
5308
+
5309
+ @media (min-width: 1200px) {
5310
+
5311
+
5312
+ .col-xl {
5313
+
5314
+
5315
+ -ms-flex-preferred-size: 0;
5316
+
5317
+
5318
+ flex-basis: 0;
5319
+
5320
+
5321
+ -webkit-box-flex: 1;
5322
+
5323
+
5324
+ -ms-flex-positive: 1;
5325
+
5326
+
5327
+ flex-grow: 1;
5328
+
5329
+
5330
+ max-width: 100%
5331
+
5332
+
5333
+ }
5334
+
5335
+
5336
+
5337
+
5338
+
5339
+ .col-xl-auto {
5340
+
5341
+
5342
+ -webkit-box-flex: 0;
5343
+
5344
+
5345
+ -ms-flex: 0 0 auto;
5346
+
5347
+
5348
+ flex: 0 0 auto;
5349
+
5350
+
5351
+ width: auto;
5352
+
5353
+
5354
+ max-width: none
5355
+
5356
+
5357
+ }
5358
+
5359
+
5360
+
5361
+
5362
+
5363
+ .col-xl-1 {
5364
+
5365
+
5366
+ -webkit-box-flex: 0;
5367
+
5368
+
5369
+ -ms-flex: 0 0 8.333333%;
5370
+
5371
+
5372
+ flex: 0 0 8.333333%;
5373
+
5374
+
5375
+ max-width: 8.333333%
5376
+
5377
+
5378
+ }
5379
+
5380
+
5381
+
5382
+
5383
+
5384
+ .col-xl-2 {
5385
+
5386
+
5387
+ -webkit-box-flex: 0;
5388
+
5389
+
5390
+ -ms-flex: 0 0 16.666667%;
5391
+
5392
+
5393
+ flex: 0 0 16.666667%;
5394
+
5395
+
5396
+ max-width: 16.666667%
5397
+
5398
+
5399
+ }
5400
+
5401
+
5402
+
5403
+
5404
+
5405
+ .col-xl-3 {
5406
+
5407
+
5408
+ -webkit-box-flex: 0;
5409
+
5410
+
5411
+ -ms-flex: 0 0 25%;
5412
+
5413
+
5414
+ flex: 0 0 25%;
5415
+
5416
+
5417
+ max-width: 25%
5418
+
5419
+
5420
+ }
5421
+
5422
+
5423
+
5424
+
5425
+
5426
+ .col-xl-4 {
5427
+
5428
+
5429
+ -webkit-box-flex: 0;
5430
+
5431
+
5432
+ -ms-flex: 0 0 33.333333%;
5433
+
5434
+
5435
+ flex: 0 0 33.333333%;
5436
+
5437
+
5438
+ max-width: 33.333333%
5439
+
5440
+
5441
+ }
5442
+
5443
+
5444
+
5445
+
5446
+
5447
+ .col-xl-5 {
5448
+
5449
+
5450
+ -webkit-box-flex: 0;
5451
+
5452
+
5453
+ -ms-flex: 0 0 41.666667%;
5454
+
5455
+
5456
+ flex: 0 0 41.666667%;
5457
+
5458
+
5459
+ max-width: 41.666667%
5460
+
5461
+
5462
+ }
5463
+
5464
+
5465
+
5466
+
5467
+
5468
+ .col-xl-6 {
5469
+
5470
+
5471
+ -webkit-box-flex: 0;
5472
+
5473
+
5474
+ -ms-flex: 0 0 50%;
5475
+
5476
+
5477
+ flex: 0 0 50%;
5478
+
5479
+
5480
+ max-width: 50%
5481
+
5482
+
5483
+ }
5484
+
5485
+
5486
+
5487
+
5488
+
5489
+ .col-xl-7 {
5490
+
5491
+
5492
+ -webkit-box-flex: 0;
5493
+
5494
+
5495
+ -ms-flex: 0 0 58.333333%;
5496
+
5497
+
5498
+ flex: 0 0 58.333333%;
5499
+
5500
+
5501
+ max-width: 58.333333%
5502
+
5503
+
5504
+ }
5505
+
5506
+
5507
+
5508
+
5509
+
5510
+ .col-xl-8 {
5511
+
5512
+
5513
+ -webkit-box-flex: 0;
5514
+
5515
+
5516
+ -ms-flex: 0 0 66.666667%;
5517
+
5518
+
5519
+ flex: 0 0 66.666667%;
5520
+
5521
+
5522
+ max-width: 66.666667%
5523
+
5524
+
5525
+ }
5526
+
5527
+
5528
+
5529
+
5530
+
5531
+ .col-xl-9 {
5532
+
5533
+
5534
+ -webkit-box-flex: 0;
5535
+
5536
+
5537
+ -ms-flex: 0 0 75%;
5538
+
5539
+
5540
+ flex: 0 0 75%;
5541
+
5542
+
5543
+ max-width: 75%
5544
+
5545
+
5546
+ }
5547
+
5548
+
5549
+
5550
+
5551
+
5552
+ .col-xl-10 {
5553
+
5554
+
5555
+ -webkit-box-flex: 0;
5556
+
5557
+
5558
+ -ms-flex: 0 0 83.333333%;
5559
+
5560
+
5561
+ flex: 0 0 83.333333%;
5562
+
5563
+
5564
+ max-width: 83.333333%
5565
+
5566
+
5567
+ }
5568
+
5569
+
5570
+
5571
+
5572
+
5573
+ .col-xl-11 {
5574
+
5575
+
5576
+ -webkit-box-flex: 0;
5577
+
5578
+
5579
+ -ms-flex: 0 0 91.666667%;
5580
+
5581
+
5582
+ flex: 0 0 91.666667%;
5583
+
5584
+
5585
+ max-width: 91.666667%
5586
+
5587
+
5588
+ }
5589
+
5590
+
5591
+
5592
+
5593
+
5594
+ .col-xl-12 {
5595
+
5596
+
5597
+ -webkit-box-flex: 0;
5598
+
5599
+
5600
+ -ms-flex: 0 0 100%;
5601
+
5602
+
5603
+ flex: 0 0 100%;
5604
+
5605
+
5606
+ max-width: 100%
5607
+
5608
+
5609
+ }
5610
+
5611
+
5612
+ }
5613
+
5614
+
5615
+
5616
+
5617
+
5618
+
5619
+
5620
+
5621
+ .mo_otp_token, .mo2f_user_email, .mo2f_IR_phone,
5622
+
5623
+
5624
+ .mo_IR_otp_token, .mo2f_IR_GA_token, .mo2f_IR_phone_OTP {
5625
+
5626
+
5627
+ color:#212F3C;
5628
+
5629
+
5630
+ border:none;
5631
+
5632
+
5633
+ display:block;
5634
+
5635
+
5636
+ border-bottom-style: solid;
5637
+
5638
+
5639
+ border-width: 2px;
5640
+
5641
+
5642
+ border-color:#D0D3D4;
5643
+
5644
+
5645
+ border-radius:0px;
5646
+
5647
+
5648
+ outline:none;
5649
+
5650
+
5651
+ padding:5px;
5652
+
5653
+
5654
+ }
5655
+
5656
+
5657
+
5658
+
5659
+
5660
+ .mo_otp_token {
5661
+
5662
+
5663
+ font-size:15px;
5664
+
5665
+
5666
+ width:130px;
5667
+
5668
+
5669
+ text-align:center;
5670
+
5671
+
5672
+ }
5673
+
5674
+
5675
+
5676
+
5677
+
5678
+ .mo2f_user_email{
5679
+
5680
+
5681
+ font-size:16px;
5682
+
5683
+
5684
+ width:220px;
5685
+
5686
+
5687
+ text-align:center;
5688
+
5689
+
5690
+ }
5691
+
5692
+
5693
+
5694
+
5695
+
5696
+ .mo2f_IR_phone{
5697
+
5698
+
5699
+ font-size:14px;
5700
+
5701
+
5702
+ width:170px !important;
5703
+
5704
+
5705
+ }
5706
+
5707
+
5708
+
5709
+
5710
+
5711
+ .mo2f_IR_GA_token{
5712
+
5713
+
5714
+ font-size:15px;
5715
+
5716
+
5717
+ width:100px !important;
5718
+
5719
+
5720
+ }
5721
+
5722
+
5723
+
5724
+
5725
+
5726
+ .mo2f_IR_phone_OTP{
5727
+
5728
+
5729
+ font-size:15px;
5730
+
5731
+
5732
+ width:150px !important;
5733
+
5734
+
5735
  }
includes/css/front_end_login.css CHANGED
@@ -1,618 +1,618 @@
1
- .mo2f_powered_by_miniorange {
2
-
3
-
4
- width: 100px;
5
-
6
-
7
- height: 30px;
8
-
9
-
10
- -webkit-background-size: 100px 25px;
11
-
12
-
13
- background-size: 100px 25px;
14
-
15
-
16
- background-repeat: no-repeat;
17
-
18
-
19
- display: inline-block;
20
-
21
-
22
- vertical-align: middle;
23
-
24
-
25
- }
26
-
27
-
28
-
29
-
30
-
31
- .mo2f_powered_by_div {
32
-
33
-
34
- text-align: right;
35
-
36
-
37
- font-size: 9px;
38
-
39
-
40
- padding-right: 5px;
41
-
42
-
43
- background-color: #FFFFFF;
44
-
45
-
46
- width: 92%;
47
-
48
-
49
- border-radius: 6px;
50
-
51
-
52
- }
53
-
54
-
55
-
56
-
57
-
58
- .mo2f-login-container {
59
-
60
-
61
- display: inline-block !important;
62
-
63
-
64
- display: -moz-inline-stack !important;
65
-
66
-
67
- text-align: center !important;
68
-
69
-
70
- width: 100%;
71
-
72
-
73
-
74
-
75
-
76
- }
77
-
78
-
79
-
80
-
81
-
82
- .mo2f-textbox {
83
-
84
-
85
- width: 160px;
86
-
87
-
88
- margin: 15px 0px !important;
89
-
90
-
91
- background-color: rgba(123, 110, 110, 0.06) !important;
92
-
93
-
94
- border-radius: 4px !important;
95
-
96
-
97
- padding: 3px !important;
98
-
99
-
100
- }
101
-
102
-
103
-
104
-
105
-
106
- .mo2f-button {
107
-
108
-
109
- width: 100% !important;
110
-
111
-
112
- color: #fff !important;
113
-
114
-
115
- line-height: normal;
116
-
117
-
118
- height: 30px !important;
119
-
120
-
121
- margin: 0px !important;
122
-
123
-
124
- font-size: 14px !important;
125
-
126
-
127
- padding: 7px !important;
128
-
129
-
130
- background-color: #f0ad4e !important;
131
-
132
-
133
- border-color: #eea236 !important;
134
-
135
-
136
- -webkit-appearance: none;
137
-
138
-
139
- -webkit-border-radius: 3px !important;
140
-
141
-
142
- border-radius: 3px !important;
143
-
144
-
145
-
146
-
147
-
148
- }
149
-
150
-
151
-
152
-
153
-
154
- .mo2fa_display_message_login {
155
-
156
-
157
- text-align: left !important;
158
-
159
-
160
- font-size: 13px !important;
161
-
162
-
163
- }
164
-
165
-
166
-
167
-
168
-
169
- .mo2f-link {
170
-
171
-
172
- color: #0191BF !important;
173
-
174
-
175
- font-size: 14px !important;
176
-
177
-
178
- font-weight: bold !important;
179
-
180
-
181
- cursor: pointer !important;
182
-
183
-
184
- }
185
-
186
-
187
-
188
-
189
-
190
- .mo_green {
191
-
192
-
193
- background: #2ECC71 !important;
194
-
195
-
196
- border-color: #2ECC71 !important;
197
-
198
-
199
- width: 26% !important;
200
-
201
-
202
- border-width: 1px;
203
-
204
-
205
- vertical-align: middle !important;
206
-
207
-
208
- border-radius: 3px !important;
209
-
210
-
211
- color: white;
212
-
213
-
214
- height: 30px;
215
-
216
-
217
- cursor: pointer;
218
-
219
-
220
- }
221
-
222
-
223
-
224
-
225
-
226
- .mo_red {
227
-
228
-
229
- background: #E74C3C !important;
230
-
231
-
232
- border-color: #E74C3C !important;
233
-
234
-
235
- width: 26% !important;
236
-
237
-
238
- border-width: 1px;
239
-
240
-
241
- vertical-align: middle !important;
242
-
243
-
244
- border-radius: 3px !important;
245
-
246
-
247
- color: white;
248
-
249
-
250
- height: 30px;
251
-
252
-
253
- cursor: pointer;
254
-
255
-
256
- }
257
-
258
-
259
-
260
-
261
-
262
- .showQRHelp, .showOTPHelp {
263
-
264
-
265
- text-align: center !important;
266
-
267
-
268
-
269
-
270
-
271
- }
272
-
273
-
274
-
275
-
276
-
277
- .mo2f_device {
278
-
279
-
280
- padding-left: 200 px !important;
281
-
282
-
283
- vertical-align: -webkit-baseline-middle !important;
284
-
285
-
286
- line-height: 3 !important;
287
-
288
-
289
- }
290
-
291
-
292
-
293
-
294
-
295
- .miniorange-button {
296
-
297
-
298
- height: 30px;
299
-
300
-
301
- font-size: 14px !important;
302
-
303
-
304
- line-height: 5px !important;
305
-
306
-
307
- padding: 16px !important;
308
-
309
-
310
- border-width: 1px;
311
-
312
-
313
- vertical-align: middle !important;
314
-
315
-
316
- background-color: #f0ad4e !important;
317
-
318
-
319
- border-color: #eea236 !important;
320
-
321
-
322
- -webkit-appearance: none;
323
-
324
-
325
- border-style: solid;
326
-
327
-
328
- -webkit-border-radius: 3px !important;
329
-
330
-
331
- border-radius: 3px !important;
332
-
333
-
334
- white-space: nowrap;
335
-
336
-
337
- -webkit-box-sizing: border-box;
338
-
339
-
340
- -moz-box-sizing: border-box;
341
-
342
-
343
- box-sizing: border-box;
344
-
345
-
346
- color: #fff;
347
-
348
-
349
- text-decoration: none;
350
-
351
-
352
- cursor: pointer;
353
-
354
-
355
- }
356
-
357
-
358
-
359
-
360
-
361
- .mo_hr {
362
-
363
-
364
- border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
365
-
366
-
367
- margin-top: 5px !important;
368
-
369
-
370
- margin-right: 10px !important;
371
-
372
-
373
- }
374
-
375
-
376
-
377
-
378
-
379
- .mo_margin_left {
380
-
381
-
382
- margin-left: 20px !important;
383
-
384
-
385
- }
386
-
387
-
388
-
389
-
390
-
391
- .mo_app_link {
392
-
393
-
394
- text-decoration: none !important;
395
-
396
-
397
- color: #000 !important;
398
-
399
-
400
- }
401
-
402
-
403
-
404
-
405
-
406
- .mo2f_td_show {
407
-
408
-
409
- display: grid !important;
410
-
411
-
412
- }
413
-
414
-
415
-
416
-
417
-
418
- .mo2f_td_hide {
419
-
420
-
421
- display: none !important;
422
-
423
-
424
- }
425
-
426
-
427
-
428
-
429
-
430
- .mo2f_label {
431
-
432
-
433
- font-weight: 100 !important;
434
-
435
-
436
- margin-left: 10px !important;
437
-
438
-
439
-
440
-
441
-
442
- }
443
-
444
-
445
-
446
-
447
-
448
- .mo2f_kba_ques {
449
-
450
-
451
- width: 394px !important;
452
-
453
-
454
- border-radius: 4px !important;
455
-
456
-
457
- height: 40px !important;
458
-
459
-
460
- font-size: 14px !important;
461
-
462
-
463
- }
464
-
465
-
466
-
467
-
468
-
469
- .mo2f_kba_table {
470
-
471
-
472
- padding: 0 10px;
473
-
474
-
475
- width: 100%;
476
-
477
-
478
- border: hidden !important;
479
-
480
-
481
- }
482
-
483
-
484
-
485
-
486
-
487
- .mo2f_kba_tb_data {
488
-
489
-
490
- padding-left: 15px;
491
-
492
-
493
- }
494
-
495
-
496
-
497
-
498
-
499
- .mo2f_table_textbox_1 {
500
-
501
-
502
- width: 150px;
503
-
504
-
505
- height: 30px !important;
506
-
507
-
508
- font-size: 14px !important;
509
-
510
-
511
- }
512
-
513
-
514
-
515
-
516
-
517
- .mo2f_table_textbox {
518
-
519
-
520
- width: 200px;
521
-
522
-
523
- height: 40px !important;
524
-
525
-
526
- font-size: 14px !important;
527
-
528
-
529
-
530
-
531
-
532
- }
533
-
534
-
535
-
536
-
537
-
538
- .mo2f_kba_header {
539
-
540
-
541
- font-weight: bold;
542
-
543
-
544
- border: hidden !important;
545
-
546
-
547
- }
548
-
549
-
550
-
551
-
552
-
553
- .mo2f_kba_body {
554
-
555
-
556
- border: hidden !important;
557
-
558
-
559
- }
560
-
561
-
562
-
563
-
564
-
565
- .mo2f_separator {
566
-
567
-
568
- border-left: 1px solid #EBECEC;
569
-
570
-
571
- padding: 5px;
572
-
573
-
574
- }
575
-
576
-
577
-
578
-
579
-
580
- .mo2f_authn_header {
581
-
582
-
583
- font-size: 14px !important;
584
-
585
-
586
- }
587
-
588
-
589
-
590
-
591
-
592
- #mo2f_inline_table {
593
-
594
-
595
- border: hidden !important;
596
-
597
-
598
- }
599
-
600
-
601
-
602
-
603
-
604
- .mo2f_ordered_list {
605
-
606
-
607
- margin: 0 0 0 1em !important;
608
-
609
-
610
- }
611
-
612
- .mo2f_list {
613
-
614
-
615
- font-size: 14px !important;
616
-
617
-
618
- }
1
+ .mo2f_powered_by_miniorange {
2
+
3
+
4
+ width: 100px;
5
+
6
+
7
+ height: 30px;
8
+
9
+
10
+ -webkit-background-size: 100px 25px;
11
+
12
+
13
+ background-size: 100px 25px;
14
+
15
+
16
+ background-repeat: no-repeat;
17
+
18
+
19
+ display: inline-block;
20
+
21
+
22
+ vertical-align: middle;
23
+
24
+
25
+ }
26
+
27
+
28
+
29
+
30
+
31
+ .mo2f_powered_by_div {
32
+
33
+
34
+ text-align: right;
35
+
36
+
37
+ font-size: 9px;
38
+
39
+
40
+ padding-right: 5px;
41
+
42
+
43
+ background-color: #FFFFFF;
44
+
45
+
46
+ width: 92%;
47
+
48
+
49
+ border-radius: 6px;
50
+
51
+
52
+ }
53
+
54
+
55
+
56
+
57
+
58
+ .mo2f-login-container {
59
+
60
+
61
+ display: inline-block !important;
62
+
63
+
64
+ display: -moz-inline-stack !important;
65
+
66
+
67
+ text-align: center !important;
68
+
69
+
70
+ width: 100%;
71
+
72
+
73
+
74
+
75
+
76
+ }
77
+
78
+
79
+
80
+
81
+
82
+ .mo2f-textbox {
83
+
84
+
85
+ width: 160px;
86
+
87
+
88
+ margin: 15px 0px !important;
89
+
90
+
91
+ background-color: rgba(123, 110, 110, 0.06) !important;
92
+
93
+
94
+ border-radius: 4px !important;
95
+
96
+
97
+ padding: 3px !important;
98
+
99
+
100
+ }
101
+
102
+
103
+
104
+
105
+
106
+ .mo2f-button {
107
+
108
+
109
+ width: 100% !important;
110
+
111
+
112
+ color: #fff !important;
113
+
114
+
115
+ line-height: normal;
116
+
117
+
118
+ height: 30px !important;
119
+
120
+
121
+ margin: 0px !important;
122
+
123
+
124
+ font-size: 14px !important;
125
+
126
+
127
+ padding: 7px !important;
128
+
129
+
130
+ background-color: #f0ad4e !important;
131
+
132
+
133
+ border-color: #eea236 !important;
134
+
135
+
136
+ -webkit-appearance: none;
137
+
138
+
139
+ -webkit-border-radius: 3px !important;
140
+
141
+
142
+ border-radius: 3px !important;
143
+
144
+
145
+
146
+
147
+
148
+ }
149
+
150
+
151
+
152
+
153
+
154
+ .mo2fa_display_message_login {
155
+
156
+
157
+ text-align: left !important;
158
+
159
+
160
+ font-size: 13px !important;
161
+
162
+
163
+ }
164
+
165
+
166
+
167
+
168
+
169
+ .mo2f-link {
170
+
171
+
172
+ color: #0191BF !important;
173
+
174
+
175
+ font-size: 14px !important;
176
+
177
+
178
+ font-weight: bold !important;
179
+
180
+
181
+ cursor: pointer !important;
182
+
183
+
184
+ }
185
+
186
+
187
+
188
+
189
+
190
+ .mo_green {
191
+
192
+
193
+ background: #2ECC71 !important;
194
+
195
+
196
+ border-color: #2ECC71 !important;
197
+
198
+
199
+ width: 26% !important;
200
+
201
+
202
+ border-width: 1px;
203
+
204
+
205
+ vertical-align: middle !important;
206
+
207
+
208
+ border-radius: 3px !important;
209
+
210
+
211
+ color: white;
212
+
213
+
214
+ height: 30px;
215
+
216
+
217
+ cursor: pointer;
218
+
219
+
220
+ }
221
+
222
+
223
+
224
+
225
+
226
+ .mo_red {
227
+
228
+
229
+ background: #E74C3C !important;
230
+
231
+
232
+ border-color: #E74C3C !important;
233
+
234
+
235
+ width: 26% !important;
236
+
237
+
238
+ border-width: 1px;
239
+
240
+
241
+ vertical-align: middle !important;
242
+
243
+
244
+ border-radius: 3px !important;
245
+
246
+
247
+ color: white;
248
+
249
+
250
+ height: 30px;
251
+
252
+
253
+ cursor: pointer;
254
+
255
+
256
+ }
257
+
258
+
259
+
260
+
261
+
262
+ .showQRHelp, .showOTPHelp {
263
+
264
+
265
+ text-align: center !important;
266
+
267
+
268
+
269
+
270
+
271
+ }
272
+
273
+
274
+
275
+
276
+
277
+ .mo2f_device {
278
+
279
+
280
+ padding-left: 200 px !important;
281
+
282
+
283
+ vertical-align: -webkit-baseline-middle !important;
284
+
285
+
286
+ line-height: 3 !important;
287
+
288
+
289
+ }
290
+
291
+
292
+
293
+
294
+
295
+ .miniorange-button {
296
+
297
+
298
+ height: 30px;
299
+
300
+
301
+ font-size: 14px !important;
302
+
303
+
304
+ line-height: 5px !important;
305
+
306
+
307
+ padding: 16px !important;
308
+
309
+
310
+ border-width: 1px;
311
+
312
+
313
+ vertical-align: middle !important;
314
+
315
+
316
+ background-color: #f0ad4e !important;
317
+
318
+
319
+ border-color: #eea236 !important;
320
+
321
+
322
+ -webkit-appearance: none;
323
+
324
+
325
+ border-style: solid;
326
+
327
+
328
+ -webkit-border-radius: 3px !important;
329
+
330
+
331
+ border-radius: 3px !important;
332
+
333
+
334
+ white-space: nowrap;
335
+
336
+
337
+ -webkit-box-sizing: border-box;
338
+
339
+
340
+ -moz-box-sizing: border-box;
341
+
342
+
343
+ box-sizing: border-box;
344
+
345
+
346
+ color: #fff;
347
+
348
+
349
+ text-decoration: none;
350
+
351
+
352
+ cursor: pointer;
353
+
354
+
355
+ }
356
+
357
+
358
+
359
+
360
+
361
+ .mo_hr {
362
+
363
+
364
+ border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
365
+
366
+
367
+ margin-top: 5px !important;
368
+
369
+
370
+ margin-right: 10px !important;
371
+
372
+
373
+ }
374
+
375
+
376
+
377
+
378
+
379
+ .mo_margin_left {
380
+
381
+
382
+ margin-left: 20px !important;
383
+
384
+
385
+ }
386
+
387
+
388
+
389
+
390
+
391
+ .mo_app_link {
392
+
393
+
394
+ text-decoration: none !important;
395
+
396
+
397
+ color: #000 !important;
398
+
399
+
400
+ }
401
+
402
+
403
+
404
+
405
+
406
+ .mo2f_td_show {
407
+
408
+
409
+ display: grid !important;
410
+
411
+
412
+ }
413
+
414
+
415
+
416
+
417
+
418
+ .mo2f_td_hide {
419
+
420
+
421
+ display: none !important;
422
+
423
+
424
+ }
425
+
426
+
427
+
428
+
429
+
430
+ .mo2f_label {
431
+
432
+
433
+ font-weight: 100 !important;
434
+
435
+
436
+ margin-left: 10px !important;
437
+
438
+
439
+
440
+
441
+
442
+ }
443
+
444
+
445
+
446
+
447
+
448
+ .mo2f_kba_ques {
449
+
450
+
451
+ width: 394px !important;
452
+
453
+
454
+ border-radius: 4px !important;
455
+
456
+
457
+ height: 40px !important;
458
+
459
+
460
+ font-size: 14px !important;
461
+
462
+
463
+ }
464
+
465
+
466
+
467
+
468
+
469
+ .mo2f_kba_table {
470
+
471
+
472
+ padding: 0 10px;
473
+
474
+
475
+ width: 100%;
476
+
477
+
478
+ border: hidden !important;
479
+
480
+
481
+ }
482
+
483
+
484
+
485
+
486
+
487
+ .mo2f_kba_tb_data {
488
+
489
+
490
+ padding-left: 15px;
491
+
492
+
493
+ }
494
+
495
+
496
+
497
+
498
+
499
+ .mo2f_table_textbox_1 {
500
+
501
+
502
+ width: 150px;
503
+
504
+
505
+ height: 30px !important;
506
+
507
+
508
+ font-size: 14px !important;
509
+
510
+
511
+ }
512
+
513
+
514
+
515
+
516
+
517
+ .mo2f_table_textbox {
518
+
519
+
520
+ width: 200px;
521
+
522
+
523
+ height: 40px !important;
524
+
525
+
526
+ font-size: 14px !important;
527
+
528
+
529
+
530
+
531
+
532
+ }
533
+
534
+
535
+
536
+
537
+
538
+ .mo2f_kba_header {
539
+
540
+
541
+ font-weight: bold;
542
+
543
+
544
+ border: hidden !important;
545
+
546
+
547
+ }
548
+
549
+
550
+
551
+
552
+
553
+ .mo2f_kba_body {
554
+
555
+
556
+ border: hidden !important;
557
+
558
+
559
+ }
560
+
561
+
562
+
563
+
564
+
565
+ .mo2f_separator {
566
+
567
+
568
+ border-left: 1px solid #EBECEC;
569
+
570
+
571
+ padding: 5px;
572
+
573
+
574
+ }
575
+
576
+
577
+
578
+
579
+
580
+ .mo2f_authn_header {
581
+
582
+
583
+ font-size: 14px !important;
584
+
585
+
586
+ }
587
+
588
+
589
+
590
+
591
+
592
+ #mo2f_inline_table {
593
+
594
+
595
+ border: hidden !important;
596
+
597
+
598
+ }
599
+
600
+
601
+
602
+
603
+
604
+ .mo2f_ordered_list {
605
+
606
+
607
+ margin: 0 0 0 1em !important;
608
+
609
+
610
+ }
611
+
612
+ .mo2f_list {
613
+
614
+
615
+ font-size: 14px !important;
616
+
617
+
618
+ }
includes/css/jquery.ui.css CHANGED
@@ -1,743 +1,743 @@
1
- /*! jQuery UI - v1.11.4 - 2015-07-30
2
- * http://jqueryui.com
3
- * Includes: core.css, draggable.css, resizable.css, button.css, dialog.css, theme.css
4
- * To view and modify this theme, visit http://jqueryui.com/themeroller/
5
- * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
6
-
7
- /* Layout helpers
8
- ----------------------------------*/
9
- .ui-helper-hidden {
10
- display: none;
11
- }
12
- .ui-helper-hidden-accessible {
13
- border: 0;
14
- clip: rect(0 0 0 0);
15
- height: 1px;
16
- margin: -1px;
17
- overflow: hidden;
18
- padding: 0;
19
- position: absolute;
20
- width: 1px;
21
- }
22
- .ui-helper-reset {
23
- margin: 0;
24
- padding: 0;
25
- border: 0;
26
- outline: 0;
27
- line-height: 1.3;
28
- text-decoration: none;
29
- font-size: 100%;
30
- list-style: none;
31
- }
32
- .ui-helper-clearfix:before,
33
- .ui-helper-clearfix:after {
34
- content: "";
35
- display: table;
36
- border-collapse: collapse;
37
- }
38
- .ui-helper-clearfix:after {
39
- clear: both;
40
- }
41
- .ui-helper-clearfix {
42
- min-height: 0; /* support: IE7 */
43
- }
44
- .ui-helper-zfix {
45
- width: 100%;
46
- height: 100%;
47
- top: 0;
48
- left: 0;
49
- position: absolute;
50
- opacity: 0;
51
- filter:Alpha(Opacity=0); /* support: IE8 */
52
- }
53
-
54
- .ui-front {
55
- z-index: 100;
56
- }
57
-
58
-
59
- /* Interaction Cues
60
- ----------------------------------*/
61
- .ui-state-disabled {
62
- cursor: default !important;
63
- }
64
-
65
-
66
- /* Icons
67
- ----------------------------------*/
68
-
69
- /* states and images */
70
- .ui-icon {
71
- display: block;
72
- text-indent: -99999px;
73
- overflow: hidden;
74
- background-repeat: no-repeat;
75
- }
76
-
77
-
78
- /* Misc visuals
79
- ----------------------------------*/
80
-
81
- /* Overlays */
82
- .ui-widget-overlay {
83
- position: fixed;
84
- top: 0;
85
- left: 0;
86
- width: 100%;
87
- height: 100%;
88
- }
89
- .ui-draggable-handle {
90
- -ms-touch-action: none;
91
- touch-action: none;
92
- }
93
- .ui-resizable {
94
- position: relative;
95
- }
96
- .ui-resizable-handle {
97
- position: absolute;
98
- font-size: 0.1px;
99
- display: block;
100
- -ms-touch-action: none;
101
- touch-action: none;
102
- }
103
- .ui-resizable-disabled .ui-resizable-handle,
104
- .ui-resizable-autohide .ui-resizable-handle {
105
- display: none;
106
- }
107
- .ui-resizable-n {
108
- cursor: n-resize;
109
- height: 7px;
110
- width: 100%;
111
- top: -5px;
112
- left: 0;
113
- }
114
- .ui-resizable-s {
115
- cursor: s-resize;
116
- height: 7px;
117
- width: 100%;
118
- bottom: -5px;
119
- left: 0;
120
- }
121
- .ui-resizable-e {
122
- cursor: e-resize;
123
- width: 7px;
124
- right: -5px;
125
- top: 0;
126
- height: 100%;
127
- }
128
- .ui-resizable-w {
129
- cursor: w-resize;
130
- width: 7px;
131
- left: -5px;
132
- top: 0;
133
- height: 100%;
134
- }
135
- .ui-resizable-se {
136
- cursor: se-resize;
137
- width: 12px;
138
- height: 12px;
139
- right: 1px;
140
- bottom: 1px;
141
- }
142
- .ui-resizable-sw {
143
- cursor: sw-resize;
144
- width: 9px;
145
- height: 9px;
146
- left: -5px;
147
- bottom: -5px;
148
- }
149
- .ui-resizable-nw {
150
- cursor: nw-resize;
151
- width: 9px;
152
- height: 9px;
153
- left: -5px;
154
- top: -5px;
155
- }
156
- .ui-resizable-ne {
157
- cursor: ne-resize;
158
- width: 9px;
159
- height: 9px;
160
- right: -5px;
161
- top: -5px;
162
- }
163
- .ui-button {
164
- display: inline-block;
165
- position: relative;
166
- padding: 0;
167
- line-height: normal;
168
- margin-right: .1em;
169
- cursor: pointer;
170
- vertical-align: middle;
171
- text-align: center;
172
- overflow: visible; /* removes extra width in IE */
173
- }
174
- .ui-button,
175
- .ui-button:link,
176
- .ui-button:visited,
177
- .ui-button:hover,
178
- .ui-button:active {
179
- text-decoration: none;
180
- }
181
- /* to make room for the icon, a width needs to be set here */
182
- .ui-button-icon-only {
183
- width: 2.2em;
184
- }
185
- /* button elements seem to need a little more width */
186
- button.ui-button-icon-only {
187
- width: 2.4em;
188
- }
189
- .ui-button-icons-only {
190
- width: 3.4em;
191
- }
192
- button.ui-button-icons-only {
193
- width: 3.7em;
194
- }
195
-
196
- /* button text element */
197
- .ui-button .ui-button-text {
198
- display: block;
199
- line-height: normal;
200
- }
201
- .ui-button-text-only .ui-button-text {
202
- padding: .4em 1em;
203
- }
204
- .ui-button-icon-only .ui-button-text,
205
- .ui-button-icons-only .ui-button-text {
206
- padding: .4em;
207
- text-indent: -9999999px;
208
- }
209
- .ui-button-text-icon-primary .ui-button-text,
210
- .ui-button-text-icons .ui-button-text {
211
- padding: .4em 1em .4em 2.1em;
212
- }
213
- .ui-button-text-icon-secondary .ui-button-text,
214
- .ui-button-text-icons .ui-button-text {
215
- padding: .4em 2.1em .4em 1em;
216
- }
217
- .ui-button-text-icons .ui-button-text {
218
- padding-left: 2.1em;
219
- padding-right: 2.1em;
220
- }
221
- /* no icon support for input elements, provide padding by default */
222
- input.ui-button {
223
- padding: .4em 1em;
224
- }
225
-
226
- /* button icon element(s) */
227
- .ui-button-icon-only .ui-icon,
228
- .ui-button-text-icon-primary .ui-icon,
229
- .ui-button-text-icon-secondary .ui-icon,
230
- .ui-button-text-icons .ui-icon,
231
- .ui-button-icons-only .ui-icon {
232
- position: absolute;
233
- top: 50%;
234
- margin-top: -8px;
235
- }
236
- .ui-button-icon-only .ui-icon {
237
- left: 50%;
238
- margin-left: -8px;
239
- }
240
- .ui-button-text-icon-primary .ui-button-icon-primary,
241
- .ui-button-text-icons .ui-button-icon-primary,
242
- .ui-button-icons-only .ui-button-icon-primary {
243
- left: .5em;
244
- }
245
- .ui-button-text-icon-secondary .ui-button-icon-secondary,
246
- .ui-button-text-icons .ui-button-icon-secondary,
247
- .ui-button-icons-only .ui-button-icon-secondary {
248
- right: .5em;
249
- }
250
-
251
- /* button sets */
252
- .ui-buttonset {
253
- margin-right: 7px;
254
- }
255
- .ui-buttonset .ui-button {
256
- margin-left: 0;
257
- margin-right: -.3em;
258
- }
259
-
260
- /* workarounds */
261
- /* reset extra padding in Firefox, see h5bp.com/l */
262
- input.ui-button::-moz-focus-inner,
263
- button.ui-button::-moz-focus-inner {
264
- border: 0;
265
- padding: 0;
266
- }
267
- .ui-dialog {
268
- overflow: hidden;
269
- position: absolute;
270
- top: 0;
271
- left: 0;
272
- padding: .2em;
273
- outline: 0;
274
- width: 450px !important;
275
- font-family: "Times New Roman", Times, serif !important;
276
- font-size:16px !important;
277
- z-index:200 !important;
278
-
279
- }
280
- .ui-dialog .ui-dialog-titlebar {
281
- padding: .4em 1em;
282
- position: relative;
283
- }
284
- .ui-dialog .ui-dialog-title {
285
- float: left;
286
- margin: .1em 0;
287
- white-space: nowrap;
288
- width: 90%;
289
- overflow: hidden;
290
- text-overflow: ellipsis;
291
- }
292
- .ui-dialog .ui-dialog-titlebar-close {
293
- position: absolute;
294
- right: .3em;
295
- top: 50%;
296
- width: 20px;
297
- margin: -10px 0 0 0;
298
- padding: 1px;
299
- height: 20px;
300
- }
301
- .ui-dialog .ui-dialog-content {
302
- position: relative;
303
- border: 0;
304
- padding: .5em 1em;
305
- background: none;
306
- overflow: auto;
307
- }
308
- .ui-dialog .ui-dialog-buttonpane {
309
- text-align: left;
310
- border-width: 1px 0 0 0;
311
- background-image: none;
312
- margin-top: .5em;
313
- padding: .3em 1em .5em .4em;
314
- }
315
- .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
316
- float: right;
317
- }
318
- .ui-dialog .ui-dialog-buttonpane button {
319
- margin: .5em .4em .5em 0;
320
- cursor: pointer;
321
- }
322
- .ui-dialog .ui-resizable-se {
323
- width: 12px;
324
- height: 12px;
325
- right: -5px;
326
- bottom: -5px;
327
- background-position: 16px 16px;
328
- }
329
- .ui-draggable .ui-dialog-titlebar {
330
- cursor: move;
331
- }
332
-
333
- /* Component containers
334
- ----------------------------------*/
335
- .ui-widget {
336
- font-family: Verdana,Arial,sans-serif;
337
- font-size: 1.1em;
338
- }
339
- .ui-widget .ui-widget {
340
- font-size: 1em;
341
- }
342
- .ui-widget input,
343
- .ui-widget select,
344
- .ui-widget textarea,
345
- .ui-widget button {
346
- font-family: Verdana,Arial,sans-serif;
347
- font-size: 1em;
348
- }
349
- .ui-widget-content {
350
- border: 1px solid #aaaaaa;
351
- background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
352
- color: #222222;
353
- }
354
- .ui-widget-content a {
355
- color: #222222;
356
- }
357
- .ui-widget-header {
358
- border: 1px solid #aaaaaa;
359
- background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
360
- color: #222222;
361
- font-weight: bold;
362
- }
363
- .ui-widget-header a {
364
- color: #222222;
365
- }
366
-
367
- /* Interaction states
368
- ----------------------------------*/
369
- .ui-state-default,
370
- .ui-widget-content .ui-state-default,
371
- .ui-widget-header .ui-state-default {
372
- border: 1px solid #d3d3d3;
373
- background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
374
- font-weight: normal;
375
- color: #555555;
376
- }
377
- .ui-state-default a,
378
- .ui-state-default a:link,
379
- .ui-state-default a:visited {
380
- color: #555555;
381
- text-decoration: none;
382
- }
383
- .ui-state-hover,
384
- .ui-widget-content .ui-state-hover,
385
- .ui-widget-header .ui-state-hover,
386
- .ui-state-focus,
387
- .ui-widget-content .ui-state-focus,
388
- .ui-widget-header .ui-state-focus {
389
- border: 1px solid #999999;
390
- background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
391
- font-weight: normal;
392
- color: #212121;
393
- }
394
- .ui-state-hover a,
395
- .ui-state-hover a:hover,
396
- .ui-state-hover a:link,
397
- .ui-state-hover a:visited,
398
- .ui-state-focus a,
399
- .ui-state-focus a:hover,
400
- .ui-state-focus a:link,
401
- .ui-state-focus a:visited {
402
- color: #212121;
403
- text-decoration: none;
404
- }
405
- .ui-state-active,
406
- .ui-widget-content .ui-state-active,
407
- .ui-widget-header .ui-state-active {
408
- border: 1px solid #aaaaaa;
409
- background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
410
- font-weight: normal;
411
- color: #212121;
412
- }
413
- .ui-state-active a,
414
- .ui-state-active a:link,
415
- .ui-state-active a:visited {
416
- color: #212121;
417
- text-decoration: none;
418
- }
419
-
420
- /* Interaction Cues
421
- ----------------------------------*/
422
- .ui-state-highlight,
423
- .ui-widget-content .ui-state-highlight,
424
- .ui-widget-header .ui-state-highlight {
425
- border: 1px solid #fcefa1;
426
- background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
427
- color: #363636;
428
- }
429
- .ui-state-highlight a,
430
- .ui-widget-content .ui-state-highlight a,
431
- .ui-widget-header .ui-state-highlight a {
432
- color: #363636;
433
- }
434
- .ui-state-error,
435
- .ui-widget-content .ui-state-error,
436
- .ui-widget-header .ui-state-error {
437
- border: 1px solid #cd0a0a;
438
- background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
439
- color: #cd0a0a;
440
- }
441
- .ui-state-error a,
442
- .ui-widget-content .ui-state-error a,
443
- .ui-widget-header .ui-state-error a {
444
- color: #cd0a0a;
445
- }
446
- .ui-state-error-text,
447
- .ui-widget-content .ui-state-error-text,
448
- .ui-widget-header .ui-state-error-text {
449
- color: #cd0a0a;
450
- }
451
- .ui-priority-primary,
452
- .ui-widget-content .ui-priority-primary,
453
- .ui-widget-header .ui-priority-primary {
454
- font-weight: bold;
455
- }
456
- .ui-priority-secondary,
457
- .ui-widget-content .ui-priority-secondary,
458
- .ui-widget-header .ui-priority-secondary {
459
- opacity: .7;
460
- filter:Alpha(Opacity=70); /* support: IE8 */
461
- font-weight: normal;
462
- }
463
- .ui-state-disabled,
464
- .ui-widget-content .ui-state-disabled,
465
- .ui-widget-header .ui-state-disabled {
466
- opacity: .35;
467
- filter:Alpha(Opacity=35); /* support: IE8 */
468
- background-image: none;
469
- }
470
- .ui-state-disabled .ui-icon {
471
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
472
- }
473
-
474
- /* Icons
475
- ----------------------------------*/
476
-
477
- /* states and images */
478
- .ui-icon {
479
- width: 16px;
480
- height: 16px;
481
- }
482
- .ui-icon,
483
- .ui-widget-content .ui-icon {
484
- background-image: url("images/ui-icons_222222_256x240.png");
485
- }
486
- .ui-widget-header .ui-icon {
487
- background-image: url("images/ui-icons_222222_256x240.png");
488
- }
489
- .ui-state-default .ui-icon {
490
- background-image: url("images/ui-icons_888888_256x240.png");
491
- }
492
- .ui-state-hover .ui-icon,
493
- .ui-state-focus .ui-icon {
494
- background-image: url("images/ui-icons_454545_256x240.png");
495
- }
496
- .ui-state-active .ui-icon {
497
- background-image: url("images/ui-icons_454545_256x240.png");
498
- }
499
- .ui-state-highlight .ui-icon {
500
- background-image: url("images/ui-icons_2e83ff_256x240.png");
501
- }
502
- .ui-state-error .ui-icon,
503
- .ui-state-error-text .ui-icon {
504
- background-image: url("images/ui-icons_cd0a0a_256x240.png");
505
- }
506
-
507
- /* positioning */
508
- .ui-icon-blank { background-position: 16px 16px; }
509
- .ui-icon-carat-1-n { background-position: 0 0; }
510
- .ui-icon-carat-1-ne { background-position: -16px 0; }
511
- .ui-icon-carat-1-e { background-position: -32px 0; }
512
- .ui-icon-carat-1-se { background-position: -48px 0; }
513
- .ui-icon-carat-1-s { background-position: -64px 0; }
514
- .ui-icon-carat-1-sw { background-position: -80px 0; }
515
- .ui-icon-carat-1-w { background-position: -96px 0; }
516
- .ui-icon-carat-1-nw { background-position: -112px 0; }
517
- .ui-icon-carat-2-n-s { background-position: -128px 0; }
518
- .ui-icon-carat-2-e-w { background-position: -144px 0; }
519
- .ui-icon-triangle-1-n { background-position: 0 -16px; }
520
- .ui-icon-triangle-1-ne { background-position: -16px -16px; }
521
- .ui-icon-triangle-1-e { background-position: -32px -16px; }
522
- .ui-icon-triangle-1-se { background-position: -48px -16px; }
523
- .ui-icon-triangle-1-s { background-position: -64px -16px; }
524
- .ui-icon-triangle-1-sw { background-position: -80px -16px; }
525
- .ui-icon-triangle-1-w { background-position: -96px -16px; }
526
- .ui-icon-triangle-1-nw { background-position: -112px -16px; }
527
- .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
528
- .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
529
- .ui-icon-arrow-1-n { background-position: 0 -32px; }
530
- .ui-icon-arrow-1-ne { background-position: -16px -32px; }
531
- .ui-icon-arrow-1-e { background-position: -32px -32px; }
532
- .ui-icon-arrow-1-se { background-position: -48px -32px; }
533
- .ui-icon-arrow-1-s { background-position: -64px -32px; }
534
- .ui-icon-arrow-1-sw { background-position: -80px -32px; }
535
- .ui-icon-arrow-1-w { background-position: -96px -32px; }
536
- .ui-icon-arrow-1-nw { background-position: -112px -32px; }
537
- .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
538
- .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
539
- .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
540
- .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
541
- .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
542
- .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
543
- .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
544
- .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
545
- .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
546
- .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
547
- .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
548
- .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
549
- .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
550
- .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
551
- .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
552
- .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
553
- .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
554
- .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
555
- .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
556
- .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
557
- .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
558
- .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
559
- .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
560
- .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
561
- .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
562
- .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
563
- .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
564
- .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
565
- .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
566
- .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
567
- .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
568
- .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
569
- .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
570
- .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
571
- .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
572
- .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
573
- .ui-icon-arrow-4 { background-position: 0 -80px; }
574
- .ui-icon-arrow-4-diag { background-position: -16px -80px; }
575
- .ui-icon-extlink { background-position: -32px -80px; }
576
- .ui-icon-newwin { background-position: -48px -80px; }
577
- .ui-icon-refresh { background-position: -64px -80px; }
578
- .ui-icon-shuffle { background-position: -80px -80px; }
579
- .ui-icon-transfer-e-w { background-position: -96px -80px; }
580
- .ui-icon-transferthick-e-w { background-position: -112px -80px; }
581
- .ui-icon-folder-collapsed { background-position: 0 -96px; }
582
- .ui-icon-folder-open { background-position: -16px -96px; }
583
- .ui-icon-document { background-position: -32px -96px; }
584
- .ui-icon-document-b { background-position: -48px -96px; }
585
- .ui-icon-note { background-position: -64px -96px; }
586
- .ui-icon-mail-closed { background-position: -80px -96px; }
587
- .ui-icon-mail-open { background-position: -96px -96px; }
588
- .ui-icon-suitcase { background-position: -112px -96px; }
589
- .ui-icon-comment { background-position: -128px -96px; }
590
- .ui-icon-person { background-position: -144px -96px; }
591
- .ui-icon-print { background-position: -160px -96px; }
592
- .ui-icon-trash { background-position: -176px -96px; }
593
- .ui-icon-locked { background-position: -192px -96px; }
594
- .ui-icon-unlocked { background-position: -208px -96px; }
595
- .ui-icon-bookmark { background-position: -224px -96px; }
596
- .ui-icon-tag { background-position: -240px -96px; }
597
- .ui-icon-home { background-position: 0 -112px; }
598
- .ui-icon-flag { background-position: -16px -112px; }
599
- .ui-icon-calendar { background-position: -32px -112px; }
600
- .ui-icon-cart { background-position: -48px -112px; }
601
- .ui-icon-pencil { background-position: -64px -112px; }
602
- .ui-icon-clock { background-position: -80px -112px; }
603
- .ui-icon-disk { background-position: -96px -112px; }
604
- .ui-icon-calculator { background-position: -112px -112px; }
605
- .ui-icon-zoomin { background-position: -128px -112px; }
606
- .ui-icon-zoomout { background-position: -144px -112px; }
607
- .ui-icon-search { background-position: -160px -112px; }
608
- .ui-icon-wrench { background-position: -176px -112px; }
609
- .ui-icon-gear { background-position: -192px -112px; }
610
- .ui-icon-heart { background-position: -208px -112px; }
611
- .ui-icon-star { background-position: -224px -112px; }
612
- .ui-icon-link { background-position: -240px -112px; }
613
- .ui-icon-cancel { background-position: 0 -128px; }
614
- .ui-icon-plus { background-position: -16px -128px; }
615
- .ui-icon-plusthick { background-position: -32px -128px; }
616
- .ui-icon-minus { background-position: -48px -128px; }
617
- .ui-icon-minusthick { background-position: -64px -128px; }
618
- .ui-icon-close { background-position: -80px -128px; }
619
- .ui-icon-closethick { background-position: -96px -128px; }
620
- .ui-icon-key { background-position: -112px -128px; }
621
- .ui-icon-lightbulb { background-position: -128px -128px; }
622
- .ui-icon-scissors { background-position: -144px -128px; }
623
- .ui-icon-clipboard { background-position: -160px -128px; }
624
- .ui-icon-copy { background-position: -176px -128px; }
625
- .ui-icon-contact { background-position: -192px -128px; }
626
- .ui-icon-image { background-position: -208px -128px; }
627
- .ui-icon-video { background-position: -224px -128px; }
628
- .ui-icon-script { background-position: -240px -128px; }
629
- .ui-icon-alert { background-position: 0 -144px; }
630
- .ui-icon-info { background-position: -16px -144px; }
631
- .ui-icon-notice { background-position: -32px -144px; }
632
- .ui-icon-help { background-position: -48px -144px; }
633
- .ui-icon-check { background-position: -64px -144px; }
634
- .ui-icon-bullet { background-position: -80px -144px; }
635
- .ui-icon-radio-on { background-position: -96px -144px; }
636
- .ui-icon-radio-off { background-position: -112px -144px; }
637
- .ui-icon-pin-w { background-position: -128px -144px; }
638
- .ui-icon-pin-s { background-position: -144px -144px; }
639
- .ui-icon-play { background-position: 0 -160px; }
640
- .ui-icon-pause { background-position: -16px -160px; }
641
- .ui-icon-seek-next { background-position: -32px -160px; }
642
- .ui-icon-seek-prev { background-position: -48px -160px; }
643
- .ui-icon-seek-end { background-position: -64px -160px; }
644
- .ui-icon-seek-start { background-position: -80px -160px; }
645
- /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
646
- .ui-icon-seek-first { background-position: -80px -160px; }
647
- .ui-icon-stop { background-position: -96px -160px; }
648
- .ui-icon-eject { background-position: -112px -160px; }
649
- .ui-icon-volume-off { background-position: -128px -160px; }
650
- .ui-icon-volume-on { background-position: -144px -160px; }
651
- .ui-icon-power { background-position: 0 -176px; }
652
- .ui-icon-signal-diag { background-position: -16px -176px; }
653
- .ui-icon-signal { background-position: -32px -176px; }
654
- .ui-icon-battery-0 { background-position: -48px -176px; }
655
- .ui-icon-battery-1 { background-position: -64px -176px; }
656
- .ui-icon-battery-2 { background-position: -80px -176px; }
657
- .ui-icon-battery-3 { background-position: -96px -176px; }
658
- .ui-icon-circle-plus { background-position: 0 -192px; }
659
- .ui-icon-circle-minus { background-position: -16px -192px; }
660
- .ui-icon-circle-close { background-position: -32px -192px; }
661
- .ui-icon-circle-triangle-e { background-position: -48px -192px; }
662
- .ui-icon-circle-triangle-s { background-position: -64px -192px; }
663
- .ui-icon-circle-triangle-w { background-position: -80px -192px; }
664
- .ui-icon-circle-triangle-n { background-position: -96px -192px; }
665
- .ui-icon-circle-arrow-e { background-position: -112px -192px; }
666
- .ui-icon-circle-arrow-s { background-position: -128px -192px; }
667
- .ui-icon-circle-arrow-w { background-position: -144px -192px; }
668
- .ui-icon-circle-arrow-n { background-position: -160px -192px; }
669
- .ui-icon-circle-zoomin { background-position: -176px -192px; }
670
- .ui-icon-circle-zoomout { background-position: -192px -192px; }
671
- .ui-icon-circle-check { background-position: -208px -192px; }
672
- .ui-icon-circlesmall-plus { background-position: 0 -208px; }
673
- .ui-icon-circlesmall-minus { background-position: -16px -208px; }
674
- .ui-icon-circlesmall-close { background-position: -32px -208px; }
675
- .ui-icon-squaresmall-plus { background-position: -48px -208px; }
676
- .ui-icon-squaresmall-minus { background-position: -64px -208px; }
677
- .ui-icon-squaresmall-close { background-position: -80px -208px; }
678
- .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
679
- .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
680
- .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
681
- .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
682
- .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
683
- .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
684
-
685
-
686
- /* Misc visuals
687
- ----------------------------------*/
688
-
689
- /* Corner radius */
690
- .ui-corner-all,
691
- .ui-corner-top,
692
- .ui-corner-left,
693
- .ui-corner-tl {
694
- border-top-left-radius: 4px;
695
- }
696
- .ui-corner-all,
697
- .ui-corner-top,
698
- .ui-corner-right,
699
- .ui-corner-tr {
700
- border-top-right-radius: 4px;
701
- }
702
- .ui-corner-all,
703
- .ui-corner-bottom,
704
- .ui-corner-left,
705
- .ui-corner-bl {
706
- border-bottom-left-radius: 4px;
707
- }
708
- .ui-corner-all,
709
- .ui-corner-bottom,
710
- .ui-corner-right,
711
- .ui-corner-br {
712
- border-bottom-right-radius: 4px;
713
- }
714
-
715
- /* Overlays */
716
- .overlay_back {
717
- position:fixed;
718
- display:none;
719
-
720
- /* color with alpha channel */
721
- background-color: rgba(0, 0, 0, 0.7); /* 0.7 = 70% opacity */
722
-
723
- /* stretch to screen edges */
724
- top: 0;
725
- left: 0;
726
- bottom: 0;
727
- right: 0;
728
- min-height:100%;
729
- width:100%;
730
- z-index:111;
731
- }
732
- .ui-widget-overlay {
733
- background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
734
-
735
- }
736
- .ui-widget-shadow {
737
- margin: -8px 0 0 -8px;
738
- padding: 8px;
739
- background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
740
- opacity: .3;
741
- filter: Alpha(Opacity=30); /* support: IE8 */
742
- border-radius: 8px;
743
- }
1
+ /*! jQuery UI - v1.11.4 - 2015-07-30
2
+ * http://jqueryui.com
3
+ * Includes: core.css, draggable.css, resizable.css, button.css, dialog.css, theme.css
4
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
5
+ * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
6
+
7
+ /* Layout helpers
8
+ ----------------------------------*/
9
+ .ui-helper-hidden {
10
+ display: none;
11
+ }
12
+ .ui-helper-hidden-accessible {
13
+ border: 0;
14
+ clip: rect(0 0 0 0);
15
+ height: 1px;
16
+ margin: -1px;
17
+ overflow: hidden;
18
+ padding: 0;
19
+ position: absolute;
20
+ width: 1px;
21
+ }
22
+ .ui-helper-reset {
23
+ margin: 0;
24
+ padding: 0;
25
+ border: 0;
26
+ outline: 0;
27
+ line-height: 1.3;
28
+ text-decoration: none;
29
+ font-size: 100%;
30
+ list-style: none;
31
+ }
32
+ .ui-helper-clearfix:before,
33
+ .ui-helper-clearfix:after {
34
+ content: "";
35
+ display: table;
36
+ border-collapse: collapse;
37
+ }
38
+ .ui-helper-clearfix:after {
39
+ clear: both;
40
+ }
41
+ .ui-helper-clearfix {
42
+ min-height: 0; /* support: IE7 */
43
+ }
44
+ .ui-helper-zfix {
45
+ width: 100%;
46
+ height: 100%;
47
+ top: 0;
48
+ left: 0;
49
+ position: absolute;
50
+ opacity: 0;
51
+ filter:Alpha(Opacity=0); /* support: IE8 */
52
+ }
53
+
54
+ .ui-front {
55
+ z-index: 100;
56
+ }
57
+
58
+
59
+ /* Interaction Cues
60
+ ----------------------------------*/
61
+ .ui-state-disabled {
62
+ cursor: default !important;
63
+ }
64
+
65
+
66
+ /* Icons
67
+ ----------------------------------*/
68
+
69
+ /* states and images */
70
+ .ui-icon {
71
+ display: block;
72
+ text-indent: -99999px;
73
+ overflow: hidden;
74
+ background-repeat: no-repeat;
75
+ }
76
+
77
+
78
+ /* Misc visuals
79
+ ----------------------------------*/
80
+
81
+ /* Overlays */
82
+ .ui-widget-overlay {
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+ .ui-draggable-handle {
90
+ -ms-touch-action: none;
91
+ touch-action: none;
92
+ }
93
+ .ui-resizable {
94
+ position: relative;
95
+ }
96
+ .ui-resizable-handle {
97
+ position: absolute;
98
+ font-size: 0.1px;
99
+ display: block;
100
+ -ms-touch-action: none;
101
+ touch-action: none;
102
+ }
103
+ .ui-resizable-disabled .ui-resizable-handle,
104
+ .ui-resizable-autohide .ui-resizable-handle {
105
+ display: none;
106
+ }
107
+ .ui-resizable-n {
108
+ cursor: n-resize;
109
+ height: 7px;
110
+ width: 100%;
111
+ top: -5px;
112
+ left: 0;
113
+ }
114
+ .ui-resizable-s {
115
+ cursor: s-resize;
116
+ height: 7px;
117
+ width: 100%;
118
+ bottom: -5px;
119
+ left: 0;
120
+ }
121
+ .ui-resizable-e {
122
+ cursor: e-resize;
123
+ width: 7px;
124
+ right: -5px;
125
+ top: 0;
126
+ height: 100%;
127
+ }
128
+ .ui-resizable-w {
129
+ cursor: w-resize;
130
+ width: 7px;
131
+ left: -5px;
132
+ top: 0;
133
+ height: 100%;
134
+ }
135
+ .ui-resizable-se {
136
+ cursor: se-resize;
137
+ width: 12px;
138
+ height: 12px;
139
+ right: 1px;
140
+ bottom: 1px;
141
+ }
142
+ .ui-resizable-sw {
143
+ cursor: sw-resize;
144
+ width: 9px;
145
+ height: 9px;
146
+ left: -5px;
147
+ bottom: -5px;
148
+ }
149
+ .ui-resizable-nw {
150
+ cursor: nw-resize;
151
+ width: 9px;
152
+ height: 9px;
153
+ left: -5px;
154
+ top: -5px;
155
+ }
156
+ .ui-resizable-ne {
157
+ cursor: ne-resize;
158
+ width: 9px;
159
+ height: 9px;
160
+ right: -5px;
161
+ top: -5px;
162
+ }
163
+ .ui-button {
164
+ display: inline-block;
165
+ position: relative;
166
+ padding: 0;
167
+ line-height: normal;
168
+ margin-right: .1em;
169
+ cursor: pointer;
170
+ vertical-align: middle;
171
+ text-align: center;
172
+ overflow: visible; /* removes extra width in IE */
173
+ }
174
+ .ui-button,
175
+ .ui-button:link,
176
+ .ui-button:visited,
177
+ .ui-button:hover,
178
+ .ui-button:active {
179
+ text-decoration: none;
180
+ }
181
+ /* to make room for the icon, a width needs to be set here */
182
+ .ui-button-icon-only {
183
+ width: 2.2em;
184
+ }
185
+ /* button elements seem to need a little more width */
186
+ button.ui-button-icon-only {
187
+ width: 2.4em;
188
+ }
189
+ .ui-button-icons-only {
190
+ width: 3.4em;
191
+ }
192
+ button.ui-button-icons-only {
193
+ width: 3.7em;
194
+ }
195
+
196
+ /* button text element */
197
+ .ui-button .ui-button-text {
198
+ display: block;
199
+ line-height: normal;
200
+ }
201
+ .ui-button-text-only .ui-button-text {
202
+ padding: .4em 1em;
203
+ }
204
+ .ui-button-icon-only .ui-button-text,
205
+ .ui-button-icons-only .ui-button-text {
206
+ padding: .4em;
207
+ text-indent: -9999999px;
208
+ }
209
+ .ui-button-text-icon-primary .ui-button-text,
210
+ .ui-button-text-icons .ui-button-text {
211
+ padding: .4em 1em .4em 2.1em;
212
+ }
213
+ .ui-button-text-icon-secondary .ui-button-text,
214
+ .ui-button-text-icons .ui-button-text {
215
+ padding: .4em 2.1em .4em 1em;
216
+ }
217
+ .ui-button-text-icons .ui-button-text {
218
+ padding-left: 2.1em;
219
+ padding-right: 2.1em;
220
+ }
221
+ /* no icon support for input elements, provide padding by default */
222
+ input.ui-button {
223
+ padding: .4em 1em;
224
+ }
225
+
226
+ /* button icon element(s) */
227
+ .ui-button-icon-only .ui-icon,
228
+ .ui-button-text-icon-primary .ui-icon,
229
+ .ui-button-text-icon-secondary .ui-icon,
230
+ .ui-button-text-icons .ui-icon,
231
+ .ui-button-icons-only .ui-icon {
232
+ position: absolute;
233
+ top: 50%;
234
+ margin-top: -8px;
235
+ }
236
+ .ui-button-icon-only .ui-icon {
237
+ left: 50%;
238
+ margin-left: -8px;
239
+ }
240
+ .ui-button-text-icon-primary .ui-button-icon-primary,
241
+ .ui-button-text-icons .ui-button-icon-primary,
242
+ .ui-button-icons-only .ui-button-icon-primary {
243
+ left: .5em;
244
+ }
245
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
246
+ .ui-button-text-icons .ui-button-icon-secondary,
247
+ .ui-button-icons-only .ui-button-icon-secondary {
248
+ right: .5em;
249
+ }
250
+
251
+ /* button sets */
252
+ .ui-buttonset {
253
+ margin-right: 7px;
254
+ }
255
+ .ui-buttonset .ui-button {
256
+ margin-left: 0;
257
+ margin-right: -.3em;
258
+ }
259
+
260
+ /* workarounds */
261
+ /* reset extra padding in Firefox, see h5bp.com/l */
262
+ input.ui-button::-moz-focus-inner,
263
+ button.ui-button::-moz-focus-inner {
264
+ border: 0;
265
+ padding: 0;
266
+ }
267
+ .ui-dialog {
268
+ overflow: hidden;
269
+ position: absolute;
270
+ top: 0;
271
+ left: 0;
272
+ padding: .2em;
273
+ outline: 0;
274
+ width: 450px !important;
275
+ font-family: "Times New Roman", Times, serif !important;
276
+ font-size:16px !important;
277
+ z-index:200 !important;
278
+
279
+ }
280
+ .ui-dialog .ui-dialog-titlebar {
281
+ padding: .4em 1em;
282
+ position: relative;
283
+ }
284
+ .ui-dialog .ui-dialog-title {
285
+ float: left;
286
+ margin: .1em 0;
287
+ white-space: nowrap;
288
+ width: 90%;
289
+ overflow: hidden;
290
+ text-overflow: ellipsis;
291
+ }
292
+ .ui-dialog .ui-dialog-titlebar-close {
293
+ position: absolute;
294
+ right: .3em;
295
+ top: 50%;
296
+ width: 20px;
297
+ margin: -10px 0 0 0;
298
+ padding: 1px;
299
+ height: 20px;
300
+ }
301
+ .ui-dialog .ui-dialog-content {
302
+ position: relative;
303
+ border: 0;
304
+ padding: .5em 1em;
305
+ background: none;
306
+ overflow: auto;
307
+ }
308
+ .ui-dialog .ui-dialog-buttonpane {
309
+ text-align: left;
310
+ border-width: 1px 0 0 0;
311
+ background-image: none;
312
+ margin-top: .5em;
313
+ padding: .3em 1em .5em .4em;
314
+ }
315
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
316
+ float: right;
317
+ }
318
+ .ui-dialog .ui-dialog-buttonpane button {
319
+ margin: .5em .4em .5em 0;
320
+ cursor: pointer;
321
+ }
322
+ .ui-dialog .ui-resizable-se {
323
+ width: 12px;
324
+ height: 12px;
325
+ right: -5px;
326
+ bottom: -5px;
327
+ background-position: 16px 16px;
328
+ }
329
+ .ui-draggable .ui-dialog-titlebar {
330
+ cursor: move;
331
+ }
332
+
333
+ /* Component containers
334
+ ----------------------------------*/
335
+ .ui-widget {
336
+ font-family: Verdana,Arial,sans-serif;
337
+ font-size: 1.1em;
338
+ }
339
+ .ui-widget .ui-widget {
340
+ font-size: 1em;
341
+ }
342
+ .ui-widget input,
343
+ .ui-widget select,
344
+ .ui-widget textarea,
345
+ .ui-widget button {
346
+ font-family: Verdana,Arial,sans-serif;
347
+ font-size: 1em;
348
+ }
349
+ .ui-widget-content {
350
+ border: 1px solid #aaaaaa;
351
+ background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;
352
+ color: #222222;
353
+ }
354
+ .ui-widget-content a {
355
+ color: #222222;
356
+ }
357
+ .ui-widget-header {
358
+ border: 1px solid #aaaaaa;
359
+ background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
360
+ color: #222222;
361
+ font-weight: bold;
362
+ }
363
+ .ui-widget-header a {
364
+ color: #222222;
365
+ }
366
+
367
+ /* Interaction states
368
+ ----------------------------------*/
369
+ .ui-state-default,
370
+ .ui-widget-content .ui-state-default,
371
+ .ui-widget-header .ui-state-default {
372
+ border: 1px solid #d3d3d3;
373
+ background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
374
+ font-weight: normal;
375
+ color: #555555;
376
+ }
377
+ .ui-state-default a,
378
+ .ui-state-default a:link,
379
+ .ui-state-default a:visited {
380
+ color: #555555;
381
+ text-decoration: none;
382
+ }
383
+ .ui-state-hover,
384
+ .ui-widget-content .ui-state-hover,
385
+ .ui-widget-header .ui-state-hover,
386
+ .ui-state-focus,
387
+ .ui-widget-content .ui-state-focus,
388
+ .ui-widget-header .ui-state-focus {
389
+ border: 1px solid #999999;
390
+ background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
391
+ font-weight: normal;
392
+ color: #212121;
393
+ }
394
+ .ui-state-hover a,
395
+ .ui-state-hover a:hover,
396
+ .ui-state-hover a:link,
397
+ .ui-state-hover a:visited,
398
+ .ui-state-focus a,
399
+ .ui-state-focus a:hover,
400
+ .ui-state-focus a:link,
401
+ .ui-state-focus a:visited {
402
+ color: #212121;
403
+ text-decoration: none;
404
+ }
405
+ .ui-state-active,
406
+ .ui-widget-content .ui-state-active,
407
+ .ui-widget-header .ui-state-active {
408
+ border: 1px solid #aaaaaa;
409
+ background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
410
+ font-weight: normal;
411
+ color: #212121;
412
+ }
413
+ .ui-state-active a,
414
+ .ui-state-active a:link,
415
+ .ui-state-active a:visited {
416
+ color: #212121;
417
+ text-decoration: none;
418
+ }
419
+
420
+ /* Interaction Cues
421
+ ----------------------------------*/
422
+ .ui-state-highlight,
423
+ .ui-widget-content .ui-state-highlight,
424
+ .ui-widget-header .ui-state-highlight {
425
+ border: 1px solid #fcefa1;
426
+ background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
427
+ color: #363636;
428
+ }
429
+ .ui-state-highlight a,
430
+ .ui-widget-content .ui-state-highlight a,
431
+ .ui-widget-header .ui-state-highlight a {
432
+ color: #363636;
433
+ }
434
+ .ui-state-error,
435
+ .ui-widget-content .ui-state-error,
436
+ .ui-widget-header .ui-state-error {
437
+ border: 1px solid #cd0a0a;
438
+ background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
439
+ color: #cd0a0a;
440
+ }
441
+ .ui-state-error a,
442
+ .ui-widget-content .ui-state-error a,
443
+ .ui-widget-header .ui-state-error a {
444
+ color: #cd0a0a;
445
+ }
446
+ .ui-state-error-text,
447
+ .ui-widget-content .ui-state-error-text,
448
+ .ui-widget-header .ui-state-error-text {
449
+ color: #cd0a0a;
450
+ }
451
+ .ui-priority-primary,
452
+ .ui-widget-content .ui-priority-primary,
453
+ .ui-widget-header .ui-priority-primary {
454
+ font-weight: bold;
455
+ }
456
+ .ui-priority-secondary,
457
+ .ui-widget-content .ui-priority-secondary,
458
+ .ui-widget-header .ui-priority-secondary {
459
+ opacity: .7;
460
+ filter:Alpha(Opacity=70); /* support: IE8 */
461
+ font-weight: normal;
462
+ }
463
+ .ui-state-disabled,
464
+ .ui-widget-content .ui-state-disabled,
465
+ .ui-widget-header .ui-state-disabled {
466
+ opacity: .35;
467
+ filter:Alpha(Opacity=35); /* support: IE8 */
468
+ background-image: none;
469
+ }
470
+ .ui-state-disabled .ui-icon {
471
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
472
+ }
473
+
474
+ /* Icons
475
+ ----------------------------------*/
476
+
477
+ /* states and images */
478
+ .ui-icon {
479
+ width: 16px;
480
+ height: 16px;
481
+ }
482
+ .ui-icon,
483
+ .ui-widget-content .ui-icon {
484
+ background-image: url("images/ui-icons_222222_256x240.png");
485
+ }
486
+ .ui-widget-header .ui-icon {
487
+ background-image: url("images/ui-icons_222222_256x240.png");
488
+ }
489
+ .ui-state-default .ui-icon {
490
+ background-image: url("images/ui-icons_888888_256x240.png");
491
+ }
492
+ .ui-state-hover .ui-icon,
493
+ .ui-state-focus .ui-icon {
494
+ background-image: url("images/ui-icons_454545_256x240.png");
495
+ }
496
+ .ui-state-active .ui-icon {
497
+ background-image: url("images/ui-icons_454545_256x240.png");
498
+ }
499
+ .ui-state-highlight .ui-icon {
500
+ background-image: url("images/ui-icons_2e83ff_256x240.png");
501
+ }
502
+ .ui-state-error .ui-icon,
503
+ .ui-state-error-text .ui-icon {
504
+ background-image: url("images/ui-icons_cd0a0a_256x240.png");
505
+ }
506
+
507
+ /* positioning */
508
+ .ui-icon-blank { background-position: 16px 16px; }
509
+ .ui-icon-carat-1-n { background-position: 0 0; }
510
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
511
+ .ui-icon-carat-1-e { background-position: -32px 0; }
512
+ .ui-icon-carat-1-se { background-position: -48px 0; }
513
+ .ui-icon-carat-1-s { background-position: -64px 0; }
514
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
515
+ .ui-icon-carat-1-w { background-position: -96px 0; }
516
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
517
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
518
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
519
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
520
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
521
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
522
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
523
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
524
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
525
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
526
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
527
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
528
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
529
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
530
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
531
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
532
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
533
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
534
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
535
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
536
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
537
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
538
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
539
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
540
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
541
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
542
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
543
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
544
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
545
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
546
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
547
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
548
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
549
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
550
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
551
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
552
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
553
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
554
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
555
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
556
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
557
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
558
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
559
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
560
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
561
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
562
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
563
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
564
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
565
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
566
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
567
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
568
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
569
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
570
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
571
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
572
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
573
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
574
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
575
+ .ui-icon-extlink { background-position: -32px -80px; }
576
+ .ui-icon-newwin { background-position: -48px -80px; }
577
+ .ui-icon-refresh { background-position: -64px -80px; }
578
+ .ui-icon-shuffle { background-position: -80px -80px; }
579
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
580
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
581
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
582
+ .ui-icon-folder-open { background-position: -16px -96px; }
583
+ .ui-icon-document { background-position: -32px -96px; }
584
+ .ui-icon-document-b { background-position: -48px -96px; }
585
+ .ui-icon-note { background-position: -64px -96px; }
586
+ .ui-icon-mail-closed { background-position: -80px -96px; }
587
+ .ui-icon-mail-open { background-position: -96px -96px; }
588
+ .ui-icon-suitcase { background-position: -112px -96px; }
589
+ .ui-icon-comment { background-position: -128px -96px; }
590
+ .ui-icon-person { background-position: -144px -96px; }
591
+ .ui-icon-print { background-position: -160px -96px; }
592
+ .ui-icon-trash { background-position: -176px -96px; }
593
+ .ui-icon-locked { background-position: -192px -96px; }
594
+ .ui-icon-unlocked { background-position: -208px -96px; }
595
+ .ui-icon-bookmark { background-position: -224px -96px; }
596
+ .ui-icon-tag { background-position: -240px -96px; }
597
+ .ui-icon-home { background-position: 0 -112px; }
598
+ .ui-icon-flag { background-position: -16px -112px; }
599
+ .ui-icon-calendar { background-position: -32px -112px; }
600
+ .ui-icon-cart { background-position: -48px -112px; }
601
+ .ui-icon-pencil { background-position: -64px -112px; }
602
+ .ui-icon-clock { background-position: -80px -112px; }
603
+ .ui-icon-disk { background-position: -96px -112px; }
604
+ .ui-icon-calculator { background-position: -112px -112px; }
605
+ .ui-icon-zoomin { background-position: -128px -112px; }
606
+ .ui-icon-zoomout { background-position: -144px -112px; }
607
+ .ui-icon-search { background-position: -160px -112px; }
608
+ .ui-icon-wrench { background-position: -176px -112px; }
609
+ .ui-icon-gear { background-position: -192px -112px; }
610
+ .ui-icon-heart { background-position: -208px -112px; }
611
+ .ui-icon-star { background-position: -224px -112px; }
612
+ .ui-icon-link { background-position: -240px -112px; }
613
+ .ui-icon-cancel { background-position: 0 -128px; }
614
+ .ui-icon-plus { background-position: -16px -128px; }
615
+ .ui-icon-plusthick { background-position: -32px -128px; }
616
+ .ui-icon-minus { background-position: -48px -128px; }
617
+ .ui-icon-minusthick { background-position: -64px -128px; }
618
+ .ui-icon-close { background-position: -80px -128px; }
619
+ .ui-icon-closethick { background-position: -96px -128px; }
620
+ .ui-icon-key { background-position: -112px -128px; }
621
+ .ui-icon-lightbulb { background-position: -128px -128px; }
622
+ .ui-icon-scissors { background-position: -144px -128px; }
623
+ .ui-icon-clipboard { background-position: -160px -128px; }
624
+ .ui-icon-copy { background-position: -176px -128px; }
625
+ .ui-icon-contact { background-position: -192px -128px; }
626
+ .ui-icon-image { background-position: -208px -128px; }
627
+ .ui-icon-video { background-position: -224px -128px; }
628
+ .ui-icon-script { background-position: -240px -128px; }
629
+ .ui-icon-alert { background-position: 0 -144px; }
630
+ .ui-icon-info { background-position: -16px -144px; }
631
+ .ui-icon-notice { background-position: -32px -144px; }
632
+ .ui-icon-help { background-position: -48px -144px; }
633
+ .ui-icon-check { background-position: -64px -144px; }
634
+ .ui-icon-bullet { background-position: -80px -144px; }
635
+ .ui-icon-radio-on { background-position: -96px -144px; }
636
+ .ui-icon-radio-off { background-position: -112px -144px; }
637
+ .ui-icon-pin-w { background-position: -128px -144px; }
638
+ .ui-icon-pin-s { background-position: -144px -144px; }
639
+ .ui-icon-play { background-position: 0 -160px; }
640
+ .ui-icon-pause { background-position: -16px -160px; }
641
+ .ui-icon-seek-next { background-position: -32px -160px; }
642
+ .ui-icon-seek-prev { background-position: -48px -160px; }
643
+ .ui-icon-seek-end { background-position: -64px -160px; }
644
+ .ui-icon-seek-start { background-position: -80px -160px; }
645
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
646
+ .ui-icon-seek-first { background-position: -80px -160px; }
647
+ .ui-icon-stop { background-position: -96px -160px; }
648
+ .ui-icon-eject { background-position: -112px -160px; }
649
+ .ui-icon-volume-off { background-position: -128px -160px; }
650
+ .ui-icon-volume-on { background-position: -144px -160px; }
651
+ .ui-icon-power { background-position: 0 -176px; }
652
+ .ui-icon-signal-diag { background-position: -16px -176px; }
653
+ .ui-icon-signal { background-position: -32px -176px; }
654
+ .ui-icon-battery-0 { background-position: -48px -176px; }
655
+ .ui-icon-battery-1 { background-position: -64px -176px; }
656
+ .ui-icon-battery-2 { background-position: -80px -176px; }
657
+ .ui-icon-battery-3 { background-position: -96px -176px; }
658
+ .ui-icon-circle-plus { background-position: 0 -192px; }
659
+ .ui-icon-circle-minus { background-position: -16px -192px; }
660
+ .ui-icon-circle-close { background-position: -32px -192px; }
661
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
662
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
663
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
664
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
665
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
666
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
667
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
668
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
669
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
670
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
671
+ .ui-icon-circle-check { background-position: -208px -192px; }
672
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
673
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
674
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
675
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
676
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
677
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
678
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
679
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
680
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
681
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
682
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
683
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
684
+
685
+
686
+ /* Misc visuals
687
+ ----------------------------------*/
688
+
689
+ /* Corner radius */
690
+ .ui-corner-all,
691
+ .ui-corner-top,
692
+ .ui-corner-left,
693
+ .ui-corner-tl {
694
+ border-top-left-radius: 4px;
695
+ }
696
+ .ui-corner-all,
697
+ .ui-corner-top,
698
+ .ui-corner-right,
699
+ .ui-corner-tr {
700
+ border-top-right-radius: 4px;
701
+ }
702
+ .ui-corner-all,
703
+ .ui-corner-bottom,
704
+ .ui-corner-left,
705
+ .ui-corner-bl {
706
+ border-bottom-left-radius: 4px;
707
+ }
708
+ .ui-corner-all,
709
+ .ui-corner-bottom,
710
+ .ui-corner-right,
711
+ .ui-corner-br {
712
+ border-bottom-right-radius: 4px;
713
+ }
714
+
715
+ /* Overlays */
716
+ .overlay_back {
717
+ position:fixed;
718
+ display:none;
719
+
720
+ /* color with alpha channel */
721
+ background-color: rgba(0, 0, 0, 0.7); /* 0.7 = 70% opacity */
722
+
723
+ /* stretch to screen edges */
724
+ top: 0;
725
+ left: 0;
726
+ bottom: 0;
727
+ right: 0;
728
+ min-height:100%;
729
+ width:100%;
730
+ z-index:111;
731
+ }
732
+ .ui-widget-overlay {
733
+ background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
734
+
735
+ }
736
+ .ui-widget-shadow {
737
+ margin: -8px 0 0 -8px;
738
+ padding: 8px;
739
+ background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;
740
+ opacity: .3;
741
+ filter: Alpha(Opacity=30); /* support: IE8 */
742
+ border-radius: 8px;
743
+ }
includes/css/phone.css CHANGED
@@ -1,3 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  .intl-number-input { position: inherit; }
2
  .intl-number-input .hide { display: none; }
3
  .intl-number-input .flag-dropdown { position: absolute; cursor: pointer; }
1
+
2
+ .buttonInsideEmail{
3
+ position:relative;
4
+ margin-bottom:10px;
5
+ }
6
+
7
+ .buttonInsidePhone{
8
+ position:relative;
9
+ margin-bottom:10px;
10
+ }
11
+
12
+ .mo2f_send_emailotp_button {
13
+ position:absolute;
14
+ right: 0px;
15
+ top: 0%;
16
+ border:none;
17
+ height:100%;
18
+ width:max-content;
19
+ outline:none;
20
+ text-align:center;
21
+ padding:2px;
22
+ }
23
+
24
+ .mo2f_send_phoneotp_button {
25
+ position:absolute;
26
+ right: 0px;
27
+ top: 0%;
28
+ border:none;
29
+ height:100%;
30
+ width:max-content;
31
+ outline:none;
32
+ text-align:center;
33
+ padding:2px;
34
+ }
35
+
36
  .intl-number-input { position: inherit; }
37
  .intl-number-input .hide { display: none; }
38
  .intl-number-input .flag-dropdown { position: absolute; cursor: pointer; }
includes/css/popup.css CHANGED
@@ -1,82 +1,82 @@
1
-
2
- .mo_popup {
3
- display: flex;
4
- flex-flow: row wrap;
5
- width:100%;
6
- }
7
- .mo_popup_div {
8
- flex: 1;
9
- padding: 0.5rem;
10
- }
11
- #mo_popup_id input[type="radio"] {
12
- display: none;
13
- &:not(:disabled) ~ label {
14
- cursor: pointer;
15
- }
16
- &:disabled ~ label {
17
- color: hsla(150, 5%, 75%, 1);
18
- border-color: hsla(150, 5%, 75%, 1);
19
- box-shadow: none;
20
- cursor: not-allowed;
21
- }
22
- }
23
- .mo_popup_lable {
24
- height: 80%;
25
- display: block;
26
- background: white;
27
- border: 2px solid #20b2aa;
28
- border-radius: 20px;
29
- padding: 1rem;
30
- padding-top: 0px;
31
- /*//margin: 1rem;*/
32
- text-align: center;
33
- box-shadow: 0px 3px 10px -2px hsla(150, 5%, 65%, 0.5);
34
- position: relative;
35
- margin-top: 10px;
36
- }
37
-
38
- #mo_popup_id input[type="radio"]:checked + label {
39
- background: #20b2aa;
40
- color: hsla(215, 0%, 100%, 1);
41
- &::after {
42
- color: hsla(215, 5%, 25%, 1);
43
- font-family: FontAwesome;
44
- border: 2px solid hsla(150, 75%, 45%, 1);
45
- content: "\f00c";
46
- font-size: 24px;
47
- position: absolute;
48
- top: -25px;
49
- left: 50%;
50
- transform: translateX(-50%);
51
- height: 50px;
52
- width: 50px;
53
- line-height: 50px;
54
- text-align: center;
55
- border-radius: 50%;
56
- background: white;
57
- box-shadow: 0px 2px 5px -2px hsla(0, 0%, 0%, 0.25);
58
- }
59
- }
60
-
61
- #mo_popup_id input[type="radio"]#control_05:checked + label {
62
- background: red;
63
- border-color: red;
64
- }
65
-
66
-
67
- @media only screen and (max-width: 700px) {
68
- section {
69
- flex-direction: column;
70
- }
71
- }
72
-
73
-
74
- .logout:hover{
75
- /*border: 2px solid black;*/
76
- text-decoration: underline;
77
- }
78
- .modalhover:hover{
79
- border:2px solid #2EB150;
80
- background: #2EB150 !important;
81
- color:white !important;
82
- }
1
+
2
+ .mo_popup {
3
+ display: flex;
4
+ flex-flow: row wrap;
5
+ width:100%;
6
+ }
7
+ .mo_popup_div {
8
+ flex: 1;
9
+ padding: 0.5rem;
10
+ }
11
+ #mo_popup_id input[type="radio"] {
12
+ display: none;
13
+ &:not(:disabled) ~ label {
14
+ cursor: pointer;
15
+ }
16
+ &:disabled ~ label {
17
+ color: hsla(150, 5%, 75%, 1);
18
+ border-color: hsla(150, 5%, 75%, 1);
19
+ box-shadow: none;
20
+ cursor: not-allowed;
21
+ }
22
+ }
23
+ .mo_popup_lable {
24
+ height: 80%;
25
+ display: block;
26
+ background: white;
27
+ border: 2px solid #20b2aa;
28
+ border-radius: 20px;
29
+ padding: 1rem;
30
+ padding-top: 0px;
31
+ /*//margin: 1rem;*/
32
+ text-align: center;
33
+ box-shadow: 0px 3px 10px -2px hsla(150, 5%, 65%, 0.5);
34
+ position: relative;
35
+ margin-top: 10px;
36
+ }
37
+
38
+ #mo_popup_id input[type="radio"]:checked + label {
39
+ background: #20b2aa;
40
+ color: hsla(215, 0%, 100%, 1);
41
+ &::after {
42
+ color: hsla(215, 5%, 25%, 1);
43
+ font-family: FontAwesome;
44
+ border: 2px solid hsla(150, 75%, 45%, 1);
45
+ content: "\f00c";
46
+ font-size: 24px;
47
+ position: absolute;
48
+ top: -25px;
49
+ left: 50%;
50
+ transform: translateX(-50%);
51
+ height: 50px;
52
+ width: 50px;
53
+ line-height: 50px;
54
+ text-align: center;
55
+ border-radius: 50%;
56
+ background: white;
57
+ box-shadow: 0px 2px 5px -2px hsla(0, 0%, 0%, 0.25);
58
+ }
59
+ }
60
+
61
+ #mo_popup_id input[type="radio"]#control_05:checked + label {
62
+ background: red;
63
+ border-color: red;
64
+ }
65
+
66
+
67
+ @media only screen and (max-width: 700px) {
68
+ section {
69
+ flex-direction: column;
70
+ }
71
+ }
72
+
73
+
74
+ .logout:hover{
75
+ /*border: 2px solid black;*/
76
+ text-decoration: underline;
77
+ }
78
+ .modalhover:hover{
79
+ border:2px solid #2EB150;
80
+ background: #2EB150 !important;
81
+ color:white !important;
82
+ }
includes/css/style_settings.css CHANGED
@@ -249,7 +249,8 @@
249
  }
250
  .mo2f_black_background
251
  {
252
- background: gainsboro;
 
253
  }
254
  .mo2f_2fa_plan_title
255
  {
@@ -259,6 +260,7 @@
259
  .mo2f_padding_style
260
  {
261
  padding: 2px 0px;
 
262
  }
263
  .mo2f_white_color_style
264
  {
@@ -266,8 +268,8 @@
266
  }
267
  .mo2f_2fa_lite_plan_title
268
  {
269
- background-color: #20b2aa;
270
- border: 2px solid #20b2aa;
271
  width: 25%
272
  }
273
  .mo2f_tooltip {
@@ -466,24 +468,24 @@
466
  .mo_wpns_upgrade_security_title
467
  {
468
  width: 23%;
469
- min-height: 511px;
470
  background-color: white;
471
  float: left;
472
  border: 2px solid black;
 
473
  }
474
  .mo_wpns_upgrade_title_2fa_lite
475
  {
476
  width: 23%;
477
- min-height: 500px;
478
  background-color: white;
479
  float: left;
480
- border: 2px solid black;
481
  }
482
  .mo_wpns_upgrade_page_title_name
483
  {
484
  text-align: center;
485
- background-color: black;
486
- text-shadow: 3px 2px 2px black;
487
  min-height: 62px;
488
 
489
  }
@@ -492,7 +494,7 @@
492
  margin-top: 0%;
493
  padding: 6% 0% 0% 0%;
494
  color: white;
495
- font-size: 280%;
496
  }
497
  .mo_wpns_upgrade_page_2fa_integration_plan_name
498
  {
@@ -503,7 +505,7 @@
503
  }
504
  .mo_wpns_upgrade_page_hr
505
  {
506
- border:1px solid black;
507
  }
508
  .mo_wpns_upgrade_page_2fa_background
509
  {
@@ -513,9 +515,9 @@
513
  }
514
  .mo_wpns_upgrade_page_2fa_lite_background
515
  {
516
- width: 100%;
517
- min-height: 379px;
518
- background-color: #4dbfb9;
519
  }
520
  .mo_wpns_upgrade_page_show_feature_arrow
521
  {
@@ -536,8 +538,8 @@
536
  }
537
  .mo_wpns_upgrade_page_space_in_div
538
  {
539
- width: 1%;
540
- min-height: 500px;
541
  background-color: none;
542
  float: left;
543
  }
@@ -547,48 +549,48 @@
547
  }
548
  .mo_wpns_upgrade_pade_pricing
549
  {
550
- color: white;
551
  font-size: 350%;
552
  }
553
  .mo_wpns_upgrade_page_starting_price
554
  {
555
- color: white;
556
  padding-top: 2%;
 
557
  }
558
  .mo_wpns_upgrade_page_2fa_ns
559
  {
560
- width: 96.2%;
561
- background-color: white;
562
  color: #6cd3cd;
563
  float: left;
564
  text-align: center;
565
- border-top: 4px solid #24a49d;
566
  }
567
  .mo_wpns_upgrade_page_show_feature
568
  {
569
- color: #20b2aa;
570
  background-color: white;
571
  font-size: 250%;
572
  font-weight: 500;
 
573
  }
574
  .mo_wpns_upgrade_page_hide_feature
575
  {
576
- color: #20b2aa;
577
  background-color: white;
578
  font-size: 250%;
579
  font-weight: 500;
580
- display: none;
581
  }
582
  .mo_wpns_upgrade_page_2fa_ns_1
583
  {
584
- color: #13817b;
585
  font-size: 250%;
586
  }
587
  .mo_wpns_upgrade_page_ns_background
588
  {
589
  width: 100%;
590
  min-height: 277px;
591
- background-color: #4dbfb9;
592
  }
593
  .mo_wpns_button_info_tab {
594
  background-color: #20b2aa;
@@ -667,7 +669,8 @@
667
  }
668
  .overlay_error {
669
  width: min-content;
670
- height: 40px;
 
671
  position: fixed;
672
  float: right;
673
  z-index: 1;
@@ -1018,23 +1021,8 @@
1018
  text-align: center;
1019
  color: black;
1020
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1021
- /*margin-top: 20px;
1022
- padding: 5px 20px;
1023
- background-color: #20b2aa;
1024
- border: 1px solid #CCCCCC;
1025
- float: left;
1026
- width: 227px;
1027
- height: 170px;
1028
- margin-left: 1%;
1029
- color: white;
1030
- box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
1031
  }
1032
- /*.mo_wpns_container{
1033
-
1034
- width: 1100px;
1035
- background-color: yellow;
1036
- height: auto;
1037
- }*/
1038
 
1039
  h2.mo_wpns_nav-tab-wrapper
1040
  {
@@ -1110,7 +1098,6 @@ h2.mo_wpns_nav-tab-wrapper
1110
  height: auto;
1111
  width: 100%;
1112
  float: left;
1113
- /*background-color: yellow;*/
1114
  }
1115
  .mo_wpns_setting_layout
1116
  {
@@ -1121,7 +1108,6 @@ h2.mo_wpns_nav-tab-wrapper
1121
  border: 2px solid #20b2aa;
1122
  float: left;
1123
  width: 94%;
1124
- /*margin-left: 1%;*/
1125
 
1126
  overflow: hidden;
1127
  text-align: left;
@@ -1142,8 +1128,6 @@ h2.mo_wpns_nav-tab-wrapper
1142
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1143
  }
1144
  .mo_wpns_sub_nav_tab {
1145
- /*overflow: hidden;*/
1146
- /*border: 1px solid #ccc;*/
1147
  background-color: #f1f1f1;
1148
  margin:22px;
1149
  }
@@ -1276,11 +1260,10 @@ h2.mo_wpns_nav-tab-wrapper
1276
  }
1277
  .mo_wpns_upgrade_page_button
1278
  {
1279
- border: 1px solid;
1280
- background-color: black;
1281
- padding: 5% 10% 5% 10%;
1282
- border-radius: 7%;
1283
- box-shadow: 0px 2px 10px black;
1284
  }
1285
  .mo_wpns_products-dollar-amount {
1286
  color: #797878;
@@ -2838,7 +2821,6 @@ padding-right: 11px;
2838
  border-color: lightgrey;
2839
  border-radius: 4px;
2840
  border-width: 1px;
2841
- padding: 10px;
2842
  }
2843
 
2844
  .mo2f_licensing_plans_tr {
@@ -3420,3 +3402,100 @@ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
3420
  background-color: #2EB150;
3421
  color: white;
3422
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  }
250
  .mo2f_black_background
251
  {
252
+ background: #f1f1f1;
253
+ width: 1.4%;
254
  }
255
  .mo2f_2fa_plan_title
256
  {
260
  .mo2f_padding_style
261
  {
262
  padding: 2px 0px;
263
+ width: 23%;
264
  }
265
  .mo2f_white_color_style
266
  {
268
  }
269
  .mo2f_2fa_lite_plan_title
270
  {
271
+ background-color: #7ccbc7;
272
+ border: 1.5px solid black;
273
  width: 25%
274
  }
275
  .mo2f_tooltip {
468
  .mo_wpns_upgrade_security_title
469
  {
470
  width: 23%;
471
+ min-height: 480px;
472
  background-color: white;
473
  float: left;
474
  border: 2px solid black;
475
+ border-top: none;
476
  }
477
  .mo_wpns_upgrade_title_2fa_lite
478
  {
479
  width: 23%;
480
+ min-height: 332px;
481
  background-color: white;
482
  float: left;
483
+ border-top: none;
484
  }
485
  .mo_wpns_upgrade_page_title_name
486
  {
487
  text-align: center;
488
+ background-color: #393939;
 
489
  min-height: 62px;
490
 
491
  }
494
  margin-top: 0%;
495
  padding: 6% 0% 0% 0%;
496
  color: white;
497
+ font-size: 220%;
498
  }
499
  .mo_wpns_upgrade_page_2fa_integration_plan_name
500
  {
505
  }
506
  .mo_wpns_upgrade_page_hr
507
  {
508
+ border:1px solid #393939;
509
  }
510
  .mo_wpns_upgrade_page_2fa_background
511
  {
515
  }
516
  .mo_wpns_upgrade_page_2fa_lite_background
517
  {
518
+ min-height: 231px;
519
+ background-color: white;
520
+ padding: 5px;
521
  }
522
  .mo_wpns_upgrade_page_show_feature_arrow
523
  {
538
  }
539
  .mo_wpns_upgrade_page_space_in_div
540
  {
541
+ width: 1.3%;
542
+ min-height: 332px;
543
  background-color: none;
544
  float: left;
545
  }
549
  }
550
  .mo_wpns_upgrade_pade_pricing
551
  {
552
+ color: #2ca29c;
553
  font-size: 350%;
554
  }
555
  .mo_wpns_upgrade_page_starting_price
556
  {
557
+ color: black;
558
  padding-top: 2%;
559
+ margin-top: 0px;
560
  }
561
  .mo_wpns_upgrade_page_2fa_ns
562
  {
563
+ width: 96.8%;
 
564
  color: #6cd3cd;
565
  float: left;
566
  text-align: center;
 
567
  }
568
  .mo_wpns_upgrade_page_show_feature
569
  {
570
+ color: #007cba;
571
  background-color: white;
572
  font-size: 250%;
573
  font-weight: 500;
574
+ display: none;
575
  }
576
  .mo_wpns_upgrade_page_hide_feature
577
  {
578
+ color: #007cba;
579
  background-color: white;
580
  font-size: 250%;
581
  font-weight: 500;
582
+
583
  }
584
  .mo_wpns_upgrade_page_2fa_ns_1
585
  {
586
+ color: white;
587
  font-size: 250%;
588
  }
589
  .mo_wpns_upgrade_page_ns_background
590
  {
591
  width: 100%;
592
  min-height: 277px;
593
+ background-color: white;
594
  }
595
  .mo_wpns_button_info_tab {
596
  background-color: #20b2aa;
669
  }
670
  .overlay_error {
671
  width: min-content;
672
+ height: min-content;
673
+ padding-bottom: 1%;
674
  position: fixed;
675
  float: right;
676
  z-index: 1;
1021
  text-align: center;
1022
  color: black;
1023
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
 
 
 
 
 
 
 
 
 
 
1024
  }
1025
+
 
 
 
 
 
1026
 
1027
  h2.mo_wpns_nav-tab-wrapper
1028
  {
1098
  height: auto;
1099
  width: 100%;
1100
  float: left;
 
1101
  }
1102
  .mo_wpns_setting_layout
1103
  {
1108
  border: 2px solid #20b2aa;
1109
  float: left;
1110
  width: 94%;
 
1111
 
1112
  overflow: hidden;
1113
  text-align: left;
1128
  box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1129
  }
1130
  .mo_wpns_sub_nav_tab {
 
 
1131
  background-color: #f1f1f1;
1132
  margin:22px;
1133
  }
1260
  }
1261
  .mo_wpns_upgrade_page_button
1262
  {
1263
+ border: 1px solid black;
1264
+ background-color: #7ccbc7;
1265
+ padding: 12px 0px;
1266
+ width: 98.5%;
 
1267
  }
1268
  .mo_wpns_products-dollar-amount {
1269
  color: #797878;
2821
  border-color: lightgrey;
2822
  border-radius: 4px;
2823
  border-width: 1px;
 
2824
  }
2825
 
2826
  .mo2f_licensing_plans_tr {
3402
  background-color: #2EB150;
3403
  color: white;
3404
  }
3405
+ .mo2f_boder_radius
3406
+ {
3407
+ border-bottom-left-radius: 25px;
3408
+ }
3409
+ .mo2f_back_button
3410
+ {
3411
+ margin-left: 4px;
3412
+ padding: 4px 8px;
3413
+ position: relative;
3414
+ top: -3px;
3415
+ text-decoration: none;
3416
+ border: 1px solid #0071a1;
3417
+ border-radius: 2px;
3418
+ text-shadow: none;
3419
+ font-weight: 600;
3420
+ font-size: 13px;
3421
+ line-height: normal;
3422
+ color: #0071a1;
3423
+ background: #f3f5f6;
3424
+ cursor: pointer;
3425
+ }
3426
+ .mo2f_back_button:hover
3427
+ {
3428
+ background-color: #daf0f2;
3429
+ }
3430
+ .mo2f_plan_based_title
3431
+ {
3432
+ width: 47%;
3433
+ background-color: #7ccbc7;
3434
+ float: left;
3435
+ border: 2px solid black;
3436
+ border-bottom: none;
3437
+ border-top-left-radius: 10px;
3438
+ border-top-right-radius: 10px;
3439
+ }
3440
+ .mo2f_plan_based_title_div
3441
+ {
3442
+ color: white;
3443
+ font-size: 264%;
3444
+
3445
+ }
3446
+ .mo2f_addons_alignment
3447
+ {
3448
+ color:#20b2aa;
3449
+ font-size: large;
3450
+ float: left;
3451
+ margin-right: 5px;
3452
+ }
3453
+ .mo2f_addons_not_included
3454
+ {
3455
+ color:red;
3456
+ font-size: x-large;
3457
+ float: left;
3458
+ margin-right: 5px;
3459
+ }
3460
+ .mo2f_auth_method_style
3461
+ {
3462
+ font-size: 15px;
3463
+ line-height: initial;
3464
+ }
3465
+ .mo2f_active_plan
3466
+ {
3467
+ background-color: #7ccbc7;
3468
+ border-radius: 50em;
3469
+ }
3470
+ .mo_wpns_upgrade_page_2fa_ns_styles
3471
+ {
3472
+ background-color: #7ccbc7;
3473
+ border: 2px solid black;
3474
+ border-top-left-radius: 25px;
3475
+ border-top-right-radius: 25px;
3476
+ border-bottom: none;
3477
+ }
3478
+ .mo2f_tooltip .mo2f_site_based_vs_user_based
3479
+ {
3480
+ min-height: 200px;
3481
+ margin-top: 10%;
3482
+ background-color: #ffffff;
3483
+ color: black;
3484
+ border: 1px solid black;
3485
+ width: 300px;
3486
+ padding: 0px;
3487
+ margin-left: -146px;
3488
+ box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);
3489
+ }
3490
+ .mo2f_tooltip .mo2f_site_based_vs_user_based_title
3491
+ {
3492
+ background-color: #ccf2f1;
3493
+ color: black;
3494
+ padding: 10px;
3495
+ }
3496
+ .mo2f_site_based_vs_user_based_info_icon
3497
+ {
3498
+ font-size: 25px;
3499
+ color: #ffffff;
3500
+ margin-left: 15px;
3501
+ }
includes/js/bootstrap.min.js CHANGED
@@ -1,7 +1,7 @@
1
- /*!
2
- * Bootstrap v3.3.4 (http://getbootstrap.com)
3
- * Copyright 2011-2015 Twitter, Inc.
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
- */
6
- if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.mo2f_carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.mo2f_carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".mo2f_carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.mo2f_carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.mo2f_carousel",a.proxy(this.pause,this)).on("mouseleave.bs.mo2f_carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.mo2f_carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.mo2f_carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.mo2f_carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("mo2f_carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.mo2f_carousel").to(h),c.preventDefault()}};a(document).on("click.bs.mo2f_carousel.data-api","[data-slide]",e).on("click.bs.mo2f_carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.mo2f_collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.mo2f_collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .mo2f_collapsing");if(!(e&&e.length&&(b=e.data("bs.mo2f_collapse"),b&&b.transitioning))){var f=a.Event("show.bs.mo2f_collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.mo2f_collapse",null));var g=this.dimension();this.$element.removeClass("mo2f_collapse").addClass("mo2f_collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("mo2f_collapsing").addClass("mo2f_collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.mo2f_collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.mo2f_collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("mo2f_collapsing").removeClass("mo2f_collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("mo2f_collapsing").addClass("mo2f_collapse").trigger("hidden.bs.mo2f_collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.mo2f_collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.mo2f_collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.mo2f_modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.mo2f_modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".mo2f_modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".mo2f_modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.mo2f_modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.mo2f_modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("mo2f_modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.mo2f_modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.mo2f_modal",function(){d.$element.one("mouseup.dismiss.bs.mo2f_modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.mo2f_modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.mo2f_modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.mo2f_modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.mo2f_modal").off("mouseup.dismiss.bs.mo2f_modal"),this.$dialog.off("mousedown.dismiss.bs.mo2f_modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.mo2f_modal").on("focusin.bs.mo2f_modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.mo2f_modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.mo2f_modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.mo2f_modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.mo2f_modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("mo2f_modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.mo2f_modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="mo2f-modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.mo2f_modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="mo2f_modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.mo2f_modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.mo2f_modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.mo2f_modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.mo2f_modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
7
  var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
1
+ /*!
2
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.mo2f_carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.mo2f_carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".mo2f_carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.mo2f_carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.mo2f_carousel",a.proxy(this.pause,this)).on("mouseleave.bs.mo2f_carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.mo2f_carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.mo2f_carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.mo2f_carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("mo2f_carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.mo2f_carousel").to(h),c.preventDefault()}};a(document).on("click.bs.mo2f_carousel.data-api","[data-slide]",e).on("click.bs.mo2f_carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.mo2f_collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.mo2f_collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .mo2f_collapsing");if(!(e&&e.length&&(b=e.data("bs.mo2f_collapse"),b&&b.transitioning))){var f=a.Event("show.bs.mo2f_collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.mo2f_collapse",null));var g=this.dimension();this.$element.removeClass("mo2f_collapse").addClass("mo2f_collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("mo2f_collapsing").addClass("mo2f_collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.mo2f_collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.mo2f_collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("mo2f_collapsing").removeClass("mo2f_collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("mo2f_collapsing").addClass("mo2f_collapse").trigger("hidden.bs.mo2f_collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.mo2f_collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.mo2f_collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.mo2f_modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.mo2f_modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".mo2f_modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".mo2f_modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.mo2f_modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.mo2f_modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("mo2f_modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.mo2f_modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.mo2f_modal",function(){d.$element.one("mouseup.dismiss.bs.mo2f_modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.mo2f_modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.mo2f_modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.mo2f_modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.mo2f_modal").off("mouseup.dismiss.bs.mo2f_modal"),this.$dialog.off("mousedown.dismiss.bs.mo2f_modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.mo2f_modal").on("focusin.bs.mo2f_modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.mo2f_modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.mo2f_modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.mo2f_modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.mo2f_modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("mo2f_modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.mo2f_modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="mo2f-modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.mo2f_modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="mo2f_modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.mo2f_modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.mo2f_modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.mo2f_modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.mo2f_modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
7
  var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
includes/js/custom-ajax-rcp.js ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function()
2
+ {
3
+ let $mo = jQuery;
4
+
5
+ let ajaxurl = otpverificationObj.siteURL;
6
+ let nonce = otpverificationObj.nonce;
7
+ let submitSelector = otpverificationObj.submitSelector;
8
+ let formName = otpverificationObj.formname;
9
+ let emailSelector = otpverificationObj.emailselector;
10
+ let phoneSelector = otpverificationObj.phoneSelector;
11
+ let loaderUrl = otpverificationObj.loaderUrl;
12
+ let isValidated = false
13
+ let isEmailValidated = false
14
+ let isPhoneValidated = false
15
+ let email_txId = ""
16
+ let sms_txId = ""
17
+ let validated = false
18
+ let isBoth = false
19
+ let authType = otpverificationObj.authType;
20
+ let isShortEnabled = otpverificationObj.isEnabledShortcode;
21
+ let formAction = jQuery(formName).attr('action');
22
+ let formMethod = jQuery(formName).attr('method');
23
+ let submitSelectorName = jQuery(submitSelector).attr('name');
24
+ let submitSelectorId = jQuery(submitSelector).attr('id')
25
+
26
+ const otp_over_email = '<label for="mo2f_reg_email">OTP Over Email&nbsp;<span class="required">*</span></label> <input type="text" name="mo2f_email_otp" id="mo2f_email_otp" placeholder="Enter OTP sent on email" />';
27
+ const otp_over_sms = '<label for="mo2f_reg_sms">OTP Over SMS&nbsp;<span class="required">*</span></label> <input type="text" name="mo2f_phone_otp" id="mo2f_phone_otp" placeholder="Enter OTP sent on phone number" />';
28
+ authType = 'email';
29
+
30
+ switch (authType)
31
+ {
32
+ case 'phone':
33
+ jQuery(phoneSelector).wrap( "<div class='buttonInsidePhone'></div>" );
34
+ jQuery(phoneSelector).after('<button class="mo2f_send_phoneotp_button" id="mo2f_send_ajax_sms">Send OTP</button> ');
35
+ mo2f_ajax_before_reg();
36
+ break;
37
+
38
+ case 'email':
39
+ jQuery(emailSelector).wrap( "<div class='buttonInsideEmail'></div>" );
40
+ jQuery(emailSelector).after('<button class="mo2f_send_emailotp_button" id="mo2f_send_ajax_email">Send OTP</button>');
41
+ mo2f_ajax_before_reg();
42
+ break;
43
+
44
+ case 'both':
45
+ isBoth = true;
46
+ jQuery(phoneSelector).wrap( "<div class='buttonInsidePhone'></div>" );
47
+ jQuery(phoneSelector).after('<button class="mo2f_send_phoneotp_button" id="mo2f_send_ajax_sms">Send OTP</button> ');
48
+ jQuery(emailSelector).wrap( "<div class='buttonInsideEmail'></div>" );
49
+ jQuery(emailSelector).after('<button class="mo2f_send_emailotp_button" id="mo2f_send_ajax_email">Send OTP</button>');
50
+ mo2f_ajax_before_reg();
51
+ break;
52
+
53
+ default:
54
+ break;
55
+ }
56
+
57
+
58
+ jQuery("#mo2f_send_ajax_email").click(function(e){
59
+ e.preventDefault();
60
+ var mo2f_email = jQuery(emailSelector).val();
61
+ if (validateEmail(mo2f_email))
62
+ {
63
+ let data =
64
+ {
65
+ 'action' : 'mo_ajax_register',
66
+ 'mo_action' : 'send_otp_over_email',
67
+ 'email' : mo2f_email,
68
+ 'nonce' : nonce,
69
+ 'authTypeSend' : 'email'
70
+ }
71
+
72
+ $mo.post(ajaxurl, data,function (response){
73
+ jQuery("#mo2f_send_ajax_email").html("Resend OTP");
74
+ if(response.status=='SUCCESS'){
75
+ email_txId = response.txId;
76
+ if(typeof jQuery('#mo2f_email_otp').val() == 'undefined')
77
+ jQuery(".buttonInsideEmail").after(otp_over_email);
78
+ }
79
+ });
80
+ }else{
81
+ jQuery("<p class='rc-error rcp-error'><span>Please enter valid email address</span></p>").insertBefore("#miniorange_submit");
82
+ }
83
+
84
+ });
85
+
86
+ jQuery("#mo2f_send_ajax_sms").click(function(e){
87
+ e.preventDefault();
88
+ var mo2f_phone = jQuery(phoneSelector).val();
89
+ if (validatePhone(mo2f_phone))
90
+ {
91
+ let data =
92
+ {
93
+ 'action' : 'mo_ajax_register',
94
+ 'mo_action' : 'send_otp_over_sms',
95
+ 'phone' : mo2f_phone,
96
+ 'nonce' : nonce,
97
+ 'authTypeSend' : 'phone'
98
+ }
99
+
100
+ $mo.post(ajaxurl, data,function (response){
101
+ jQuery("#mo2f_send_ajax_sms").html("Resend OTP");
102
+ if(response.status=='SUCCESS'){
103
+ sms_txId = response.txId;
104
+ jQuery(".buttonInsidePhone").after(otp_over_sms);
105
+ }
106
+ });
107
+ }else{
108
+ jQuery("<p class='rc-error rcp-error'><span>Please enter valid phone number</span></p>").insertBefore("#miniorange_submit");
109
+ }
110
+
111
+ });
112
+
113
+ function validate_otp(txId,otp,authType,isBoth){
114
+ let data =
115
+ {
116
+ 'action' : 'mo_ajax_register',
117
+ 'mo_action' : 'validate',
118
+ 'otp' : otp,
119
+ 'nonce' : nonce,
120
+ 'txId' : txId,
121
+ }
122
+
123
+ $mo.post(ajaxurl,data,function(response)
124
+ {
125
+ if(response.status == 'SUCCESS'){
126
+ if(authType == 'email'){
127
+ isEmailValidated = true;
128
+ if(!isBoth)
129
+ mo2f_rcp_ajax();
130
+ }
131
+ else if(authType == 'phone'){
132
+ isPhoneValidated = true;
133
+ if(!isBoth)
134
+ mo2f_rcp_ajax();
135
+ }
136
+
137
+ if(isBoth){
138
+ if(isEmailValidated && isPhoneValidated)
139
+ mo2f_rcp_ajax();
140
+ }
141
+ }else{
142
+ jQuery("<p class='rc-error rcp-error'><span>Please enter valid OTP</span></p>").insertBefore("#miniorange_submit");
143
+ jQuery('#loading').css('display', 'none');
144
+ jQuery("#miniorange_submit").prop('disabled',false);
145
+ }
146
+
147
+ });
148
+ }
149
+
150
+ jQuery("#miniorange_submit").click(function(e){
151
+ e.preventDefault();
152
+ if(!validated){
153
+ jQuery("#miniorange_submit").after("<div id='loading' ><div id='loaderMsg'></div><div><img src='"+loaderUrl+"' alt='' /></div></div>");
154
+ jQuery("#miniorange_submit").prop('disabled',true);
155
+ switch(authType){
156
+ case 'email':
157
+ if(isEmailValidated)
158
+ mo2f_rcp_ajax();
159
+ else{
160
+ otp = jQuery("#mo2f_email_otp").val();
161
+ if(typeof otp != 'undefined'){
162
+ addLoaderMessage("Validating Email");
163
+ validate_otp(email_txId,otp,'email',isBoth);
164
+ }
165
+ else{
166
+ jQuery("<p class='rc-error rcp-error'><span>Please validate Email</span></p>").insertBefore("#miniorange_submit");
167
+ jQuery("#loading").css('display','none');
168
+ jQuery("#miniorange_submit").prop('disabled',false);
169
+ }
170
+ }
171
+ break;
172
+ case 'phone':
173
+ if(isPhoneValidated)
174
+ mo2f_rcp_ajax();
175
+ else{
176
+ otp = jQuery("#mo2f_phone_otp").val();
177
+ if(typeof otp != 'undefined'){
178
+ addLoaderMessage("Validating Phone");
179
+ validate_otp(sms_txId,otp,'phone',isBoth);
180
+ }
181
+ else{
182
+ jQuery("<p class='rc-error rcp-error'><span>Please validate Phone</span></p>").insertBefore("#miniorange_submit");
183
+ jQuery("#loading").css('display','none');
184
+ jQuery("#miniorange_submit").prop('disabled',false);
185
+ }
186
+ }
187
+ break;
188
+ default:
189
+ if(isEmailValidated && isPhoneValidated)
190
+ mo2f_rcp_ajax();
191
+ else{
192
+ if(!isEmailValidated)
193
+ otp = jQuery("#mo2f_email_otp").val();
194
+ if(typeof otp != 'undefined'){
195
+ addLoaderMessage("Validating Email");
196
+ validate_otp(email_txId,otp,'email',isBoth);
197
+ }
198
+ else{
199
+ jQuery("<p class='rc-error rcp-error'><span>Please validate Email</span></p>").insertBefore("#miniorange_submit");
200
+ jQuery("#loading").css('display','none');
201
+ jQuery("#miniorange_submit").prop('disabled',false);
202
+ }
203
+ if(!isPhoneValidated){
204
+ otp = jQuery("#mo2f_phone_otp").val();
205
+ if(typeof otp != 'undefined'){
206
+ addLoaderMessage("Validating Phone");
207
+ validate_otp(sms_txId,otp,'phone',isBoth);
208
+ }
209
+ else{
210
+ jQuery("<p class='rc-error rcp-error'><span>Please validate Phone</span></p>").insertBefore("#miniorange_submit");
211
+ jQuery("#loading").css('display','none');
212
+ jQuery("#miniorange_submit").prop('disabled',false);
213
+ }
214
+ }
215
+ }
216
+ break;
217
+ }
218
+ }
219
+
220
+ });
221
+
222
+ function validateEmail(email_address){
223
+ let email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i
224
+ if (!email_regex.test(email_address))
225
+ {
226
+ return false
227
+ }
228
+ return true
229
+ }
230
+
231
+ function validatePhone(phone){
232
+ let intRegex = /[0-9 -()+]+$/;
233
+ if(phone.length < 10 || phone.length == 0 || (!intRegex.test(phone)))
234
+ {
235
+ return false
236
+ }
237
+ return true
238
+ }
239
+
240
+ function mo2f_ajax_before_reg(){
241
+ jQuery(formName).removeAttr('action');
242
+ jQuery(formName).removeAttr('method');
243
+ if(/^#/.test(submitSelector)){
244
+ jQuery(submitSelector).attr('name','miniorange_submit');
245
+ jQuery('input[name="miniorange_submit"]').attr('id','miniorange_submit');
246
+ }else{
247
+ jQuery(submitSelector).attr('id','miniorange_submit');
248
+ jQuery('#miniorange_submit').attr('name','miniorange_submit');
249
+ }
250
+ }
251
+
252
+ function mo2f_rcp_ajax(){
253
+ validated = true;
254
+ jQuery("#loading").css('display','none');
255
+ jQuery("#miniorange_submit").prop('disabled',false);
256
+ jQuery(formName).attr('action',formAction);
257
+ jQuery(formName).attr('method',formMethod);
258
+ jQuery("#miniorange_submit").attr('name',submitSelectorName);
259
+ jQuery('input[name="'+submitSelectorName+'"').removeAttr('id');
260
+ jQuery('input[name="'+submitSelectorName+'"').attr('id', submitSelectorId);
261
+ jQuery(submitSelector).click();
262
+ }
263
+
264
+ function addLoaderMessage(msg){
265
+ jQuery("#loaderMsg").empty();
266
+ jQuery("#loaderMsg").append(msg);
267
+ }
268
+ });
includes/js/custom-form-ajax.js ADDED
@@ -0,0 +1,487 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function()
2
+ {
3
+ let $mo = jQuery;
4
+ let ajaxurl = otpverificationObj.siteURL;
5
+ let nonce = otpverificationObj.nonce;
6
+ let submitSelector = otpverificationObj.submitSelector;
7
+ let formName = otpverificationObj.formname;
8
+ let emailSelector = otpverificationObj.emailselector;
9
+ let phoneSelector = otpverificationObj.phoneSelector
10
+ let txId="";
11
+ let txIdNew =""
12
+ let isValidated = false
13
+ let isEmailResend = false
14
+ let isSecond = false
15
+ let authType = otpverificationObj.authType;
16
+ let isShortEnabled = otpverificationObj.isEnabledShortcode;
17
+ let isRegistered = otpverificationObj.isRegistered;
18
+
19
+
20
+ const otpEdit = '<input type="text"' +
21
+ 'name="edit_otp"' +
22
+ 'id="edit_otp"' +
23
+ 'placeholder="Enter the OTP you have received"' +
24
+ 'style="display:none;"><br>';
25
+ const messageTextMobile='<br><p id="otpmessage"> An OTP will be sent to your Mobile Number</p>';
26
+ const messageTextBoth = ' <p id="otpmessage">An OTP will be sent to your Mobile Number and Email</p>'
27
+ const messageTextEmail = '<br><p id="otpmessage"> An OTP will be sent to your Email ID</p>';
28
+
29
+ const sendButton = '<div class="button" ' +
30
+ 'id ="otp_send_button">Send OTP</div> ' +
31
+ '<div class="button" ' +
32
+ 'id ="timer" ' +
33
+ 'style="visibility:hidden;">00</div><br><br>';
34
+
35
+ const phonelabel = '<label for="reg_phone">Phone Number&nbsp;<span class="required">*</span></label>';
36
+
37
+ if(isRegistered === 'false')
38
+ {
39
+ const messageNotRegistered = '<p id="registermessage" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Register/Login with miniOrange to Enable 2FA for this Form</p>';
40
+ $mo(emailSelector).after('<br>'+messageNotRegistered);
41
+ }
42
+ else
43
+ if(($mo(formName).length || $mo(submitSelector).length) && isRegistered!==false && isShortEnabled !== 'false')
44
+
45
+ { let counter = 0
46
+
47
+ function setMessage(message,color) {
48
+ $mo('#otpmessage').text("")
49
+ $mo('#otpmessage').text(message).css('color',color)
50
+ }
51
+ function sendChallenge(authType, phone, email,nonce, ajaxurl) {
52
+ txId = ""
53
+ let timeLeft = 0
54
+ let timerId
55
+ let data =
56
+ {
57
+ 'action' : 'mo_shortcode',
58
+ 'mo_action' : 'challenge',
59
+ 'email' : email,
60
+ 'phone' : phone,
61
+ 'nonce' : nonce ,
62
+ 'authTypeSend' : authType
63
+ }
64
+
65
+ $mo("#otp_send_button").text("Sending")
66
+ $mo.post(ajaxurl, data,function (response)
67
+ {
68
+ if(response === null)
69
+ {
70
+ setMessage('Contact Site Administrator','red')
71
+ }
72
+ else
73
+ {
74
+ switch (response.status)
75
+ {
76
+ case "SUCCESS":
77
+ $mo("#edit_otp").css("display", "inherit")
78
+ setMessage(response.message, 'green')
79
+
80
+ if(isSecond)
81
+ {
82
+ txIdNew = response.txId
83
+ clearInterval(timerId)
84
+ }
85
+
86
+ else
87
+ {
88
+ txId = response.txId
89
+ timeLeft = 30
90
+ }
91
+
92
+ timerId = setInterval(countdown, 1000)
93
+
94
+ function countdown() {
95
+ if (timeLeft === 0)
96
+ {
97
+ clearTimeout(timerId)
98
+ $mo("#otp_send_button").css("display", "initial");
99
+ $mo("#timer").css("visibility", "hidden");
100
+ $mo("#otp_send_button").text("Resend");
101
+
102
+ } else {
103
+ $mo("#timer").css("visibility", "visible");
104
+ $mo("#otp_send_button").css("display", "none");
105
+ $mo("#timer").text(timeLeft);
106
+ timeLeft--;
107
+ }
108
+ }
109
+ break;
110
+ case "FAILED":
111
+ setMessage(response.message,'red')
112
+ break;
113
+ case "ERROR":
114
+ setMessage(response.message,'red')
115
+ break
116
+ }
117
+ }
118
+ })
119
+
120
+
121
+ }
122
+
123
+ function validateOTP(otp,nonce,phone,txId,email){
124
+
125
+ let data =
126
+ {
127
+ 'action' : 'mo_shortcode',
128
+ 'mo_action' : 'validate',
129
+ 'otp' : otp,
130
+ 'nonce' : nonce,
131
+ 'mobile' : phone,
132
+ 'txId' : txId,
133
+ 'email' : email
134
+ }
135
+
136
+ if(isValidated === false)
137
+ {
138
+
139
+ $mo.post(ajaxurl,data,function(response)
140
+ {
141
+ if(response === null)
142
+ {
143
+ setMessage('Error Validating OTP','red')
144
+ $mo(formName).unbind('submit')
145
+ isValidated = false
146
+ }
147
+ else
148
+ switch (response.status)
149
+ {
150
+ case "SUCCESS":
151
+ setMessage(response.message,'green')
152
+ isValidated = true
153
+ $mo(submitSelector).removeAttr("disabled")
154
+ $mo(submitSelector).prop('disabled',false)
155
+ $mo(formName).unbind('submit')
156
+ $mo(submitSelector).unbind('click').click()
157
+ break
158
+ case "FAILED":
159
+ setMessage(response.message,'red')
160
+ $mo(submitSelector).removeAttr("disabled")
161
+ $mo(submitSelector).prop('disabled',false)
162
+ break
163
+ case "ERROR":
164
+ $mo(submitSelector).removeAttr("disabled")
165
+ setMessage('Invalid OTP','red')
166
+ $mo(submitSelector).prop('disabled',false)
167
+ break
168
+ }
169
+ })
170
+ }
171
+ }
172
+ function validateBoth(otp,nonce,phone,txId,email,isFirst) {
173
+ let data =
174
+ {
175
+ 'action' : 'mo_shortcode',
176
+ 'mo_action' : 'validate',
177
+ 'otp' : otp,
178
+ 'nonce' : nonce,
179
+ 'mobile' : phone,
180
+ 'txId' : txId,
181
+ 'email' : email
182
+ }
183
+
184
+ if(isValidated == false)
185
+ {
186
+ if(isFirst)
187
+ $mo.post(ajaxurl,data,function(response)
188
+ {
189
+ isFirst = false
190
+ if(response === null)
191
+ {
192
+ setMessage('Error Validating OTP','red')
193
+ isValidated = false
194
+ }
195
+ else
196
+ switch (response.status)
197
+ {
198
+ case "SUCCESS":
199
+ $mo(submitSelector).removeAttr("disabled");
200
+ setMessage(phone+' '+response.message +' '+ 'Sending OTP on '+email,'green')
201
+ isValidated = false
202
+ isSecond = true
203
+
204
+ setTimeout(function () {
205
+ sendChallenge('email',null,email,nonce,ajaxurl)
206
+ },3000)
207
+
208
+ $mo('#edit_otp').val("")
209
+ $mo('#edit_otp').css('placeholder','Enter OTP Sent on your email')
210
+ $mo(phoneSelector).after('<br><p style="color:green;"> Phone Number Validated ☑</p>')
211
+ $mo(phoneSelector).attr('disabled','true')
212
+ $mo(submitSelector).text('Register')
213
+
214
+ $mo(submitSelector).click(function(e) {
215
+ if (isValidated == false)
216
+ {
217
+ e.preventDefault()
218
+ otp = $mo('#edit_otp').val()
219
+ validateOTP(otp, nonce, phone, txIdNew, email)
220
+ }
221
+ })
222
+ break;
223
+ case "FAILED":
224
+ setMessage(response.message,'red')
225
+ $mo(submitSelector).removeAttr("disabled");
226
+ break
227
+ case "ERROR":
228
+ setMessage(response.message,'red')
229
+ $mo(submitSelector).removeAttr("disabled");
230
+ break
231
+ }
232
+ })
233
+ }
234
+ else
235
+ {
236
+ setMessage('Already Validated', 'red')
237
+ jQuery.reload()
238
+ }
239
+ }
240
+
241
+ let phone,email,otp;
242
+
243
+
244
+ switch (authType)
245
+ {
246
+ case 'phone':
247
+ $mo(phoneSelector).after(messageTextMobile+ otpEdit+ sendButton);
248
+ $mo(phoneSelector).intlTelInput({})
249
+
250
+ if (!$mo(phoneSelector).length)
251
+ {
252
+ const messageNotRegistered = '<p id="phoneFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Phone Field not Found.</p>';
253
+ $mo(emailSelector).after('<br>'+messageNotRegistered)
254
+ return
255
+ }
256
+
257
+ $mo( "#otp_send_button" ).click(function()
258
+ {
259
+ phone = $mo(phoneSelector).val()
260
+ phone = phone.replace(/\s+/g, '')
261
+ email = $mo(emailSelector).val()
262
+ if(!validatePhone(phone)) {
263
+ $mo('#otpmessage').text('Invalid Phone Number').css('color','red')
264
+ return
265
+ }
266
+ if(!validateEmail(email)) {
267
+ $mo('#otpmessage').text('Invalid Email Address').css('color','red')
268
+ return
269
+ }
270
+ isSecond = false
271
+ sendChallenge(authType,phone,null,nonce,ajaxurl)
272
+ })
273
+
274
+ $mo(submitSelector).click(function(e)
275
+ {
276
+ e.preventDefault()
277
+ if(isValidated === false)
278
+ {
279
+ otp = $mo('#edit_otp').val()
280
+ if(!otp || !txId)
281
+ {
282
+ setMessage("Please Validate Phone first", "red")
283
+ }
284
+ else
285
+ validateOTP(otp, nonce, phone, txId, email)
286
+ }
287
+ else
288
+ {
289
+
290
+ }
291
+ $mo(submitSelector).unbind('click')
292
+
293
+ })
294
+
295
+ $mo(formName).on("submit", function(e){
296
+ e.preventDefault()
297
+
298
+ if(isValidated === false)
299
+ {
300
+ otp = $mo('#edit_otp').val()
301
+ if(!otp || !txId)
302
+ {
303
+ setMessage("Please Validate Email first","red")
304
+ $mo(submitSelector).prop("disabled",false)
305
+ $mo(submitSelector).removeAttr("disabled")
306
+ return true
307
+ }
308
+ else
309
+ validateOTP(otp, nonce, phone, txId, email)
310
+ }
311
+
312
+ else
313
+ {
314
+
315
+ }
316
+
317
+ })
318
+ break;
319
+
320
+ case 'email':
321
+ if (!$mo(emailSelector).length)
322
+ {
323
+ const messageNotRegistered = '<p id="emailFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Email Field '+emailSelector+' not Found. Please check Selector</p>';
324
+ if($mo(formName).length)
325
+ $mo(formName).after('<br>'+messageNotRegistered)
326
+ else if($mo(submitSelector).length)
327
+ $mo(submitSelector).after('<br>'+messageNotRegistered)
328
+ return
329
+ }
330
+ $mo(emailSelector).after(messageTextEmail + otpEdit + sendButton)
331
+ $mo( "#otp_send_button" ).click(function()
332
+ {
333
+ email = $mo(emailSelector).val()
334
+ if(!validateEmail(email) || !email) {
335
+ setMessage("Email Address is Invalid or Empty", "red")
336
+ return
337
+ }
338
+ isSecond = false
339
+ sendChallenge(authType,null,email,nonce,ajaxurl)
340
+ })
341
+
342
+ $mo(submitSelector).click(function(e)
343
+ {
344
+ e.preventDefault()
345
+ if(isValidated === false)
346
+ {
347
+ otp = $mo('#edit_otp').val()
348
+ if(!otp || !txId)
349
+ {
350
+ setMessage("Please Validate Email first", "red")
351
+ }
352
+ else
353
+ validateOTP(otp, nonce, phone, txId, email)
354
+ }
355
+ else
356
+ {
357
+
358
+ }
359
+ $mo(submitSelector).unbind('click')
360
+
361
+ })
362
+
363
+ $mo(formName).on("submit", function(e){
364
+ e.preventDefault()
365
+
366
+ if(isValidated === false)
367
+ {
368
+ otp = $mo('#edit_otp').val()
369
+ if(!otp || !txId)
370
+ {
371
+ setMessage("Please Validate Email first","red")
372
+ $mo(submitSelector).prop("disabled",false)
373
+ $mo(submitSelector).removeAttr("disabled")
374
+ return true
375
+ }
376
+ else
377
+ validateOTP(otp, nonce, phone, txId, email)
378
+ }
379
+
380
+ else
381
+ {
382
+
383
+ }
384
+
385
+ })
386
+ break;
387
+
388
+ case 'both':
389
+
390
+ $mo(phoneSelector).after(messageTextBoth + otpEdit + sendButton);
391
+ $mo(phoneSelector).intlTelInput({})
392
+
393
+ if (!$mo(phoneSelector).length)
394
+ {
395
+ const messageNotRegistered = '<p id="phoneFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Phone Field not Found.</p>';
396
+ $mo(emailSelector).after('<br>'+messageNotRegistered)
397
+ return
398
+ }
399
+
400
+ $mo( "#otp_send_button" ).click(function() {
401
+ phone = $mo(phoneSelector).val()
402
+ phone = phone.replace(/\s+/g, '')
403
+ email = $mo(emailSelector).val()
404
+ if (!validatePhone(phone)) {
405
+ $mo('#otpmessage').text('Invalid Phone Number').css('color', 'red')
406
+ return
407
+ }
408
+ if (!validateEmail(email)) {
409
+ $mo('#otpmessage').text('Invalid Email Address').css('color', 'red')
410
+ return
411
+ }
412
+ if (!isSecond)
413
+ sendChallenge('phone', phone, null, nonce, ajaxurl)
414
+ else
415
+ {
416
+ sendChallenge('email', null, email, nonce, ajaxurl)
417
+ $mo(submitSelector).text('Register')
418
+ $(submitSelector).removeAttr("disabled")
419
+ }
420
+ $mo(submitSelector).text('Validate')
421
+ })
422
+
423
+ $mo(submitSelector).click(function(e)
424
+ {
425
+ e.preventDefault()
426
+ if(isValidated === false)
427
+ {
428
+ otp = $mo('#edit_otp').val()
429
+ if(!otp || !txId)
430
+ {
431
+ setMessage("Please Validate Email and Phone first", "red")
432
+ }
433
+ else
434
+ validateBoth(otp, nonce, phone, txId, email,true)
435
+ }
436
+ else
437
+ {
438
+
439
+ }
440
+ $mo(submitSelector).unbind('click')
441
+
442
+ })
443
+
444
+ $mo(formName).on("submit", function(e){
445
+ e.preventDefault()
446
+
447
+ if(isValidated === false)
448
+ {
449
+ otp = $mo('#edit_otp').val()
450
+ if(!otp || !txId)
451
+ {
452
+ setMessage("Please Validate Email and Phone first","red")
453
+ $mo(submitSelector).prop("disabled",false)
454
+ $mo(submitSelector).removeAttr("disabled")
455
+ return true
456
+ }
457
+ else
458
+ validateBoth(otp, nonce, phone, txId, email)
459
+ }
460
+
461
+ else
462
+ {
463
+
464
+ }
465
+
466
+ })
467
+
468
+ }
469
+
470
+ function validateEmail(email_address) {
471
+ let email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i
472
+ return email_regex.test(email_address);
473
+
474
+ }
475
+ function validatePhone(phone) {
476
+ let intRegex = /[0-9 -()+]+$/;
477
+ return !(phone.length < 10 || phone.length === 0 || (!intRegex.test(phone)));
478
+
479
+ }
480
+
481
+ }
482
+ else
483
+ {
484
+ }
485
+
486
+
487
+ });
includes/js/custom-form.js ADDED
@@ -0,0 +1,407 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function()
2
+ {
3
+ let $mo = jQuery;
4
+ let ajaxurl = otpverificationObj.siteURL;
5
+ let nonce = otpverificationObj.nonce;
6
+ let submitSelector = otpverificationObj.submitSelector;
7
+ let formName = otpverificationObj.formname;
8
+ let emailSelector = otpverificationObj.emailselector;
9
+ let phoneSelector = otpverificationObj.phoneSelector
10
+ let txId="";
11
+ let txIdNew =""
12
+ let isValidated = false
13
+ let isEmailResend = false
14
+ let isSecond = false
15
+ let authType = otpverificationObj.authType;
16
+ let isShortEnabled = otpverificationObj.isEnabledShortcode;
17
+ let isRegistered = otpverificationObj.isRegistered;
18
+ const otpEdit = '<input type="text"' +
19
+ 'name="edit_otp"' +
20
+ 'id="edit_otp"' +
21
+ 'placeholder="Enter OTP"' +
22
+ 'style="display:none; ">';
23
+ const messageTextMobile='<br><p id="otpmessage"> An OTP will be sent to your Mobile Number</p>';
24
+ const messageTextBoth = ' <p id="otpmessage">An OTP will be sent to your Mobile Number and Email</p>'
25
+ const messageTextEmail = '<br><p id="otpmessage"> An OTP will be sent to your Email ID</p>';
26
+ const sendButton = '<div class="button" ' +
27
+ 'id ="otp_send_button">Send OTP</div> ' +
28
+ '<div class="button" ' +
29
+ 'id ="timer" ' +
30
+ 'style="visibility:hidden;">00</div><br>';
31
+
32
+ const phonelabel = '<label for="reg_phone">Phone Number&nbsp;<span class="required">*</span></label>';
33
+
34
+ if(isRegistered === 'false')
35
+ {
36
+ const messageNotRegistered = '<p id="registermessage" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Register/Login with miniOrange to Enable 2FA for this Form</p>';
37
+ $mo(emailSelector).after('<br>'+messageNotRegistered);
38
+ }
39
+ else
40
+ if(($mo(formName).length || $mo(submitSelector).length) && isRegistered!==false && isShortEnabled !== 'false')
41
+ {
42
+ function setMessage(message,color) {
43
+ $mo('#otpmessage').text("")
44
+ $mo('#otpmessage').text(message).css('color',color)
45
+ }
46
+
47
+ function sendChallenge(authType, phone, email,nonce, ajaxurl) {
48
+ txId = ""
49
+ let timeLeft = 0
50
+ let timerId
51
+ let data =
52
+ {
53
+ 'action' : 'mo_shortcode',
54
+ 'mo_action' : 'challenge',
55
+ 'email' : email,
56
+ 'phone' : phone,
57
+ 'nonce' : nonce ,
58
+ 'authTypeSend' : authType
59
+ }
60
+
61
+ $mo("#otp_send_button").text("Sending")
62
+ $mo.post(ajaxurl, data,function (response)
63
+ {
64
+ if(response === null)
65
+ {
66
+ setMessage('Contact Site Administrator','red')
67
+ }
68
+ else
69
+ {
70
+ switch (response.status)
71
+ {
72
+ case "SUCCESS":
73
+ $mo("#edit_otp").css("display", "inherit")
74
+ setMessage(response.message, 'green')
75
+
76
+ if(isSecond)
77
+ {
78
+ txIdNew = response.txId
79
+ clearInterval(timerId)
80
+ }
81
+
82
+ else
83
+ {
84
+ txId = response.txId
85
+ timeLeft = 30
86
+ }
87
+
88
+ timerId = setInterval(countdown, 1000)
89
+
90
+ function countdown() {
91
+ if (timeLeft === 0)
92
+ {
93
+ clearTimeout(timerId)
94
+ $mo("#otp_send_button").css("display", "initial");
95
+ $mo("#timer").css("visibility", "hidden");
96
+ $mo("#otp_send_button").text("Resend");
97
+
98
+ } else {
99
+ $mo("#timer").css("visibility", "visible");
100
+ $mo("#otp_send_button").css("display", "none");
101
+ $mo("#timer").text(timeLeft);
102
+ timeLeft--;
103
+ }
104
+ }
105
+ break;
106
+ case "FAILED":
107
+ setMessage(response.message,'red')
108
+ break;
109
+ case "ERROR":
110
+ setMessage(response.message,'red')
111
+ break
112
+ }
113
+ }
114
+ })
115
+
116
+
117
+ }
118
+ function validateOTP(otp,nonce,phone,txId,email){
119
+
120
+ let data =
121
+ {
122
+ 'action' : 'mo_shortcode',
123
+ 'mo_action' : 'validate',
124
+ 'otp' : otp,
125
+ 'nonce' : nonce,
126
+ 'mobile' : phone,
127
+ 'txId' : txId,
128
+ 'email' : email
129
+ }
130
+
131
+ if(isValidated === false)
132
+ {
133
+ $mo.post(ajaxurl,data,function(response)
134
+ {
135
+ if(response === null)
136
+ {
137
+ setMessage('Error Validating OTP','red')
138
+ isValidated = false
139
+ }
140
+ else
141
+ switch (response.status)
142
+ {
143
+ case "SUCCESS":
144
+ setMessage(response.message,'green')
145
+ isValidated = true
146
+ if(submitSelector === ".ur-submit-button")
147
+ {
148
+ setTimeout(function () {
149
+ location.reload()
150
+ }, 15000)
151
+ }
152
+ $mo(submitSelector).unbind("click").click()
153
+ return true
154
+ case "FAILED":
155
+ setMessage(response.message,'red')
156
+ $mo(submitSelector).removeAttr("disabled");
157
+ return false
158
+ case "ERROR":
159
+ $mo(submitSelector).removeAttr("disabled");
160
+ return false
161
+ }
162
+ })
163
+ }
164
+ else {
165
+
166
+ }
167
+ }
168
+ function validateBoth(otp,nonce,phone,txId,email,isFirst) {
169
+ let data =
170
+ {
171
+ 'action' : 'mo_shortcode',
172
+ 'mo_action' : 'validate',
173
+ 'otp' : otp,
174
+ 'nonce' : nonce,
175
+ 'mobile' : phone,
176
+ 'txId' : txId,
177
+ 'email' : email
178
+ }
179
+
180
+ if(isValidated === false)
181
+ {
182
+ if(isFirst)
183
+ $mo.post(ajaxurl,data,function(response)
184
+ {
185
+ isFirst = false
186
+
187
+ if(response === null)
188
+ {
189
+ setMessage('Error Validating OTP','red')
190
+ isValidated = false
191
+ }
192
+ else
193
+ switch (response.status)
194
+ {
195
+ case "SUCCESS":
196
+ setMessage(phone+' '+response.message +' '+ 'Sending OTP on '+email,'green')
197
+
198
+ isValidated = false
199
+ isSecond = true
200
+
201
+ setTimeout(function () {
202
+ sendChallenge('email',null,email,nonce,ajaxurl)
203
+ },3000)
204
+
205
+ $mo('#edit_otp').val("")
206
+ $mo('#edit_otp').css('placeholder','Enter OTP Sent on your email')
207
+ $mo('#reg_phone').after('<br><p style="color:green;"> Phone Number Validated ☑</p>')
208
+ $mo("#reg_phone").attr('disabled','true')
209
+ $mo(submitSelector).text('Register')
210
+
211
+ $mo(submitSelector).click(function(e) {
212
+ if (isValidated == false)
213
+ {
214
+ e.preventDefault()
215
+ otp = $mo('#edit_otp').val()
216
+ validateOTP(otp, nonce, phone, txIdNew, email)
217
+ }
218
+ })
219
+ break;
220
+ case "FAILED":
221
+ setMessage(response.message,'red')
222
+ break
223
+ case "ERROR":
224
+ setMessage(response.message,'red')
225
+ break
226
+ }
227
+ })
228
+ }
229
+ else
230
+ {
231
+ setMessage('Already Validated', 'red')
232
+ jQuery.reload()
233
+ }
234
+ }
235
+
236
+ let phone,email,otp;
237
+ switch (authType) {
238
+ case 'phone':
239
+ if (!$mo(phoneSelector).length)
240
+ {
241
+ const messageNotRegistered = '<p id="phoneFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Phone Field not Found.</p>';
242
+ $mo(emailSelector).after('<br>'+messageNotRegistered)
243
+ return
244
+ }
245
+ $mo(phoneSelector).after(messageTextMobile + otpEdit+ sendButton);
246
+ $mo(phoneSelector).intlTelInput({})
247
+ $mo( "#otp_send_button" ).click(function()
248
+ {
249
+ phone = $mo(phoneSelector).val()
250
+ phone = phone.replace(/\s+/g, '')
251
+ email = $mo(emailSelector).val()
252
+ if(!validatePhone(phone)) {
253
+ $mo('#otpmessage').text('Invalid Phone Number').css('color','red')
254
+ return
255
+ }
256
+ if(!validateEmail(email)) {
257
+ $mo('#otpmessage').text('Invalid Email Address').css('color','red')
258
+ return
259
+ }
260
+ isSecond = false
261
+ sendChallenge(authType,phone,null,nonce,ajaxurl)
262
+ })
263
+
264
+
265
+ $mo(submitSelector).click(function(e) {
266
+ e.preventDefault()
267
+ if(isValidated === false)
268
+ {
269
+ otp = $mo('#edit_otp').val()
270
+ if(!otp)
271
+ {
272
+ setMessage("Please Validate Phone first", "red")
273
+ }
274
+ else
275
+ validateOTP(otp, nonce, phone, txId, email)
276
+ }
277
+ else
278
+ {
279
+
280
+ }
281
+ })
282
+
283
+
284
+ break;
285
+
286
+ case 'email':
287
+ if (!$mo(emailSelector).length)
288
+ {
289
+ const messageNotRegistered = '<p id="emailFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Email Field '+emailSelector+' not Found. Please check Selector</p>';
290
+ if($mo(formName).length)
291
+ $mo(formName).after('<br>'+messageNotRegistered)
292
+ else if($mo(submitSelector).length)
293
+ $mo(submitSelector).after('<br>'+messageNotRegistered)
294
+ return
295
+ }
296
+ $mo(emailSelector).after(messageTextEmail + otpEdit + sendButton)
297
+ $mo( "#otp_send_button" ).click(function()
298
+ { email = $mo(emailSelector).val()
299
+ if(!validateEmail(email)) {
300
+ $mo('#otpmessage').text('Invalid Email Address').css('color','red')
301
+ return
302
+ }
303
+ isSecond = false
304
+ sendChallenge(authType,null,email,nonce,ajaxurl)
305
+ })
306
+
307
+ $mo(submitSelector).click(function(e)
308
+ {
309
+ e.preventDefault()
310
+ if(isValidated === false)
311
+ {
312
+ otp = $mo('#edit_otp').val()
313
+ if(!otp)
314
+ {
315
+ setMessage("Please Validate Email first", "red")
316
+ }
317
+ else
318
+ validateOTP(otp, nonce, phone, txId, email)
319
+ }
320
+ else
321
+ {
322
+
323
+ }
324
+
325
+ })
326
+
327
+ break;
328
+
329
+ case 'both':
330
+ $mo(emailSelector).after('<br>'+ messageTextBoth + otpEdit + sendButton);
331
+ $mo(phoneSelector).intlTelInput({})
332
+ if (!$mo(phoneSelector).length)
333
+ {
334
+ const messageNotRegistered = '<p id="phoneFieldLabel" style="color: red;font-size: 18px;border: red 1px solid;padding: 5px" > miniOrange : Phone Field not Found.</p>';
335
+ $mo(emailSelector).after('<br>'+messageNotRegistered)
336
+ return
337
+ }
338
+ $mo( "#otp_send_button" ).click(function() {
339
+ phone = $mo(phoneSelector).val()
340
+ phone = phone.replace(/\s+/g, '')
341
+ email = $mo(emailSelector).val()
342
+ if (!validatePhone(phone)) {
343
+ $mo('#otpmessage').text('Invalid Phone Number').css('color', 'red')
344
+ return
345
+ }
346
+ if (!validateEmail(email)) {
347
+ $mo('#otpmessage').text('Invalid Email Address').css('color', 'red')
348
+ return
349
+ }
350
+ if (!isSecond)
351
+ sendChallenge('phone', phone, null, nonce, ajaxurl)
352
+ else
353
+ {
354
+ sendChallenge('email', null, email, nonce, ajaxurl)
355
+ $mo(submitSelector).text('Register')
356
+ }
357
+ $mo(submitSelector).text('Validate')
358
+ })
359
+
360
+
361
+
362
+ $mo(submitSelector).click(function(e)
363
+ {
364
+ e.preventDefault()
365
+ if(isValidated === false)
366
+ {
367
+ email = $mo(emailSelector).val()
368
+ otp = $mo('#edit_otp').val()
369
+ if(!otp || !email)
370
+ {
371
+ setMessage("Please Validate Email and Phone first", "red")
372
+ }
373
+ else
374
+ validateBoth(otp,nonce,phone,txId,email,true)
375
+ }
376
+ else
377
+ {
378
+
379
+ }
380
+
381
+ })
382
+ }
383
+
384
+ function validateEmail(email_address) {
385
+ let email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i
386
+ if (!email_regex.test(email_address))
387
+ {
388
+ return false
389
+ }
390
+ return true
391
+ }
392
+ function validatePhone(phone) {
393
+ let intRegex = /[0-9 -()+]+$/;
394
+ if(phone.length < 10 || phone.length == 0 || (!intRegex.test(phone)))
395
+ {
396
+ return false
397
+ }
398
+ return true
399
+ }
400
+
401
+ }
402
+ else
403
+ {
404
+
405
+ }
406
+
407
+ });
includes/js/dmajax.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ mo2f_has_dm_class = jQuery('.dm_signin_form');
2
+ if(mo2f_has_dm_class.length){
3
+ jQuery('form[name="login_1_form"]').removeAttr('action');
4
+ jQuery('form[name="login_1_form"]').removeAttr('method');
5
+ jQuery('form[name="login_1_form"]').attr('data-ajax','2');
6
+ jQuery('form[name="login_1_form"]').prepend( "<div id='mo2f_msg'></div>" );
7
+ jQuery('input[name="save"]').removeAttr('onclick');
8
+
9
+ jQuery('#ncore_username0').keypress(function (e) {
10
+ if (e.which == 13) {//Enter key pressed
11
+ e.preventDefault();
12
+ mo2f_dmajax();
13
+ }
14
+ });
15
+ jQuery('#ncore_password0').keypress(function (e) {
16
+ if (e.which == 13) {//Enter key pressed
17
+ e.preventDefault();
18
+ mo2f_dmajax();
19
+ }
20
+ });
21
+
22
+ jQuery('input[name="save"]' ).click(function(e){
23
+ e.preventDefault();
24
+ mo2f_dmajax();
25
+ });
26
+
27
+ function mo2f_dmajax(){
28
+ jQuery('#ncore_ajax_wait').attr('class','ncore_waiting');
29
+ if(typeof jQuery('#miniorange_rba_attribures').val() != 'undefined'){
30
+ jQuery('#miniorange_rba_attribures').val(JSON.stringify(rbaAttributes.attributes));
31
+ var rba = jQuery('#miniorange_rba_attribures').val();
32
+ }
33
+ else
34
+ var rba = "";
35
+ var data = {
36
+ 'action' : 'mo2f_ajax',
37
+ 'mo2f_ajax_option' : 'mo2f_ajax_login',
38
+ 'username' : jQuery('#ncore_username0').val(),
39
+ 'password' : jQuery('#ncore_password0').val(),
40
+ 'mo_softtoken' : jQuery('#mo2f_2fa_code').val(),
41
+ 'nonce' : jQuery("input[name=miniorange_login_nonce]").val(),
42
+ 'miniorange_rba_attribures' : rba,
43
+ };
44
+ jQuery.post(my_ajax_object.ajax_url, data, function(response) {
45
+ if ( typeof response.data === "undefined") {
46
+ jQuery("html").html(response);
47
+ }
48
+ else if ( response.data.notice ) {
49
+ jQuery("#mo2f_msg").append( response.data.notice ).fadeIn();
50
+ jQuery('#ncore_ajax_wait').removeAttr('class');
51
+ }
52
+ else if(response.data.reload)
53
+ location.reload( true );
54
+ else
55
+ location.href = response.data.redirect;
56
+ });
57
+ }
58
+ }
includes/js/jquery.dataTables.min.js CHANGED
@@ -1,164 +1,164 @@
1
- /*!
2
- DataTables 1.10.10
3
- ©2008-2015 SpryMedia Ltd - datatables.net/license
4
- */
5
- (function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
6
- d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
7
- a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
8
- a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&J(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1,
9
- width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&
10
- (g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=
11
- (e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&
12
- (c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=
13
- d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Z(a);v(a,null,"column-sizing",[a])}function $(a,b){var c=aa(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function ba(a,b){var c=aa(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function ca(a){return aa(a,
14
- "bVisible").length}function aa(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,u;e=0;for(f=b.length;e<f;e++)if(l=b[e],u=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){u[i]===k&&(u[i]=B(a,i,e,"type"));q=d[g](u[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,
15
- b,c,d){var e,f,g,j,i,o,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){o=b[e];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],o)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,o)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,
16
- {},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});
17
- if(i===k)return a.iDrawError!=e&&null===j&&(K(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\./g,"