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

Version Description

  • Google Authenticator-Two Factor Authentication (2FA, OTP) : *Digimember Form Support *Memberpress Form Support *SMS Verification Support *OTP Verification on Woocommerce Registration
Download this release

Release Info

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

Code changes from version 5.4.12 to 5.4.17

Files changed (94) hide show
  1. api/Mo2f_OnPremRedirect.php +17 -6
  2. api/class-customer-common-setup.php +6 -6
  3. api/class-customer-onprem-setup.php +72 -72
  4. api/class-rba-attributes.php +177 -177
  5. api/class-two-factor-setup.php +1 -1
  6. api/mo2f_api.php +71 -70
  7. controllers/PointersManager.php +53 -53
  8. controllers/account.php +5 -4
  9. controllers/advanced-blocking.php +186 -186
  10. controllers/backup/backup.php +1 -1
  11. controllers/backup/backup_ajax.php +156 -156
  12. controllers/backup/backup_schdule.php +6 -6
  13. controllers/content-protection.php +93 -93
  14. controllers/dashboard_ajax.php +210 -210
  15. controllers/feedback_footer.php +46 -46
  16. controllers/licensing.php +49 -49
  17. controllers/login-security.php +4 -4
  18. controllers/main_controller.php +111 -111
  19. controllers/malware_scanner/malware_scan_ajax.php +396 -396
  20. controllers/malware_scanner/scan_malware.php +9 -10
  21. controllers/malware_scanner/scan_malware_report.php +4 -4
  22. controllers/malware_scanner/scan_malware_settings.php +2 -4
  23. controllers/navbar.php +1 -1
  24. controllers/newtork_security_features.php +1 -1
  25. controllers/notification-settings.php +2 -2
  26. controllers/pointers.php +2 -1
  27. controllers/support.php +50 -50
  28. controllers/tour-model.php +1 -1
  29. controllers/tour/tour_ajax.php +145 -145
  30. controllers/two-fa-intro.php +222 -222
  31. controllers/twofa/mo2fa_common_login.php +132 -20
  32. controllers/twofa/mo2fa_inline_registration.php +16 -12
  33. controllers/twofa/setup_twofa.php +38 -35
  34. controllers/twofa/two_fa_custom_form.php +9 -2
  35. controllers/twofa/two_fa_premium_feature.php +2 -2
  36. controllers/twofa/two_fa_rba.php +2 -2
  37. controllers/twofa/two_fa_unlimittedUser.php +3 -3
  38. controllers/twofa/two_fa_unlimittedUser_ajax.php +46 -46
  39. controllers/twofa/two_factor_ajax.php +121 -28
  40. controllers/waf.php +48 -48
  41. controllers/wpns-loginsecurity-ajax.php +38 -0
  42. database/database_functions.php +819 -813
  43. database/database_functions_2fa.php +4 -2
  44. database/mo2f_db_options.php +37 -0
  45. handler/WAF/database/mo-waf-db-common.php +25 -0
  46. handler/WAF/database/mo-waf-db.php +1 -1
  47. handler/WAF/database/mo-waf-plugin-db.php +90 -87
  48. handler/WAF/mo-waf-plugin.php +2 -1
  49. handler/WAF/mo-waf.php +1 -1
  50. handler/ajax.php +136 -136
  51. handler/backup.php +321 -319
  52. handler/feedback_form.php +1 -1
  53. handler/logger.php +36 -36
  54. handler/login.php +354 -354
  55. handler/mo-block.html +9 -9
  56. handler/mo-waf-plugin.php +409 -409
  57. handler/recaptcha.php +1 -1
  58. handler/security_features.php +47 -47
  59. handler/signature/APXSS.php +6 -6
  60. handler/spam.php +41 -41
  61. handler/twofa/class_miniorange_2fa_strong_password.php +6 -9
  62. handler/twofa/setup_twofa.php +58 -17
  63. handler/twofa/two_fa_constants.php +1 -1
  64. handler/twofa/two_fa_get_details.php +23 -25
  65. handler/twofa/two_fa_login.php +11 -5
  66. handler/twofa/two_fa_pass2login.php +201 -63
  67. handler/twofa/two_fa_settings.php +83 -67
  68. handler/twofa/two_fa_short_call.php +43 -0
  69. handler/twofa/two_fa_short_custom.php +80 -0
  70. handler/twofa/two_fa_short_gateway.php +67 -0
  71. handler/twofa/two_fa_utility.php +17 -3
  72. helper/curl.php +285 -284
  73. helper/dashboard_security_notification.php +23 -17
  74. helper/mo_twofa_sessions.php +53 -0
  75. helper/pluginUtility.php +6 -1
  76. helper/plugins.php +102 -102
  77. helper/utility.php +22 -8
  78. includes/css/bootstrap.min.css +5734 -5734
  79. includes/css/button_styles.css +110 -110
  80. includes/css/front_end_login.css +618 -618
  81. includes/css/hide-login.css +317 -317
  82. includes/css/phone.css +35 -0
  83. includes/css/popup.css +82 -82
  84. includes/css/style_settings.css +131 -52
  85. includes/jquery-qrcode/jquery-qrcode.min.js +1 -1
  86. includes/js/bootstrap.min.js +6 -6
  87. includes/js/custom-ajax-mepr.js +278 -0
  88. includes/js/custom-ajax-rcp.js +268 -0
  89. includes/js/custom-form-ajax.js +487 -0
  90. includes/js/custom-form.js +407 -0
  91. includes/js/dmajax.js +58 -0
  92. includes/js/phone.js +8 -8
  93. includes/js/pointers.js +2 -2
  94. includes/js/rba/js/jquery-1.9.1.js +41 -181
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-customer-onprem-setup.php CHANGED
@@ -1,73 +1,73 @@
1
- <?php
2
- /** miniOrange enables user to log in through mobile authentication as an additional layer of security over password.
3
- * Copyright (C) 2015 miniOrange
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>
17
- * @package miniOrange OAuth
18
- * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
19
- */
20
-
21
- /**
22
- * This library is miniOrange Authentication Service.
23
- * Contains Request Calls to Customer service.
24
- **/
25
-
26
- include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'mo2f_api.php';
27
-
28
- class Customer_Setup extends Customer_Cloud_Setup {
29
-
30
-
31
-
32
- function send_otp_token( $uKey, $authType, $cKey, $apiKey,$currentuser=null ) {
33
-
34
- $cloud_methods = array('MOBILE AUTHENTICATION','PUSH NOTIFICATIONS','SMS');
35
- if(MO2F_IS_ONPREM and !in_array($authType, $cloud_methods)){
36
- include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
37
- $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
38
- if(is_null($currentuser) or !isset($currentuser))
39
- $currentuser = wp_get_current_user();
40
- $content = $mo2fOnPremRedirect->OnpremSendRedirect($uKey,$authType,$currentuser);//change parameters as per your requirement but make sure other methods are not affected.
41
-
42
- }else {
43
-
44
- $content= parent::send_otp_token($uKey, $authType, $cKey, $apiKey,$currentuser=null);
45
-
46
- }
47
-
48
- return $content;
49
- }
50
-
51
-
52
- function validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null) {
53
- $content='';
54
- if(MO2F_IS_ONPREM and $authType != 'SOFT TOKEN' and $authType !='OTP Over Email' and $authType != 'SMS' and $authType != 'OTP Over SMS'){
55
- include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
56
- $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
57
- if(!isset($current_user) or is_null($current_user) )
58
- $current_user = wp_get_current_user();
59
- $content = $mo2fOnPremRedirect->OnpremValidateRedirect($authType, $otpToken,$current_user );
60
- //change parameters as per your requirement but make sure other methods are not affected.
61
-
62
- }else{
63
-
64
- $content= parent::validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null);
65
-
66
- }
67
- return $content;
68
- }
69
-
70
-
71
- }
72
-
73
  ?>
1
+ <?php
2
+ /** miniOrange enables user to log in through mobile authentication as an additional layer of security over password.
3
+ * Copyright (C) 2015 miniOrange
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
17
+ * @package miniOrange OAuth
18
+ * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
19
+ */
20
+
21
+ /**
22
+ * This library is miniOrange Authentication Service.
23
+ * Contains Request Calls to Customer service.
24
+ **/
25
+
26
+ include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'mo2f_api.php';
27
+
28
+ class Customer_Setup extends Customer_Cloud_Setup {
29
+
30
+
31
+
32
+ function send_otp_token( $uKey, $authType, $cKey, $apiKey,$currentuser=null ) {
33
+
34
+ $cloud_methods = array('MOBILE AUTHENTICATION','PUSH NOTIFICATIONS','SMS');
35
+ if(MO2F_IS_ONPREM and !in_array($authType, $cloud_methods)){
36
+ include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
37
+ $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
38
+ if(is_null($currentuser) or !isset($currentuser))
39
+ $currentuser = wp_get_current_user();
40
+ $content = $mo2fOnPremRedirect->OnpremSendRedirect($uKey,$authType,$currentuser);//change parameters as per your requirement but make sure other methods are not affected.
41
+
42
+ }else {
43
+
44
+ $content= parent::send_otp_token($uKey, $authType, $cKey, $apiKey,$currentuser=null);
45
+
46
+ }
47
+
48
+ return $content;
49
+ }
50
+
51
+
52
+ function validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null) {
53
+ $content='';
54
+ if(MO2F_IS_ONPREM and $authType != 'SOFT TOKEN' and $authType !='OTP Over Email' and $authType != 'SMS' and $authType != 'OTP Over SMS'){
55
+ include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'Mo2f_OnPremRedirect.php';
56
+ $mo2fOnPremRedirect = new Mo2f_OnPremRedirect();
57
+ if(!isset($current_user) or is_null($current_user) )
58
+ $current_user = wp_get_current_user();
59
+ $content = $mo2fOnPremRedirect->OnpremValidateRedirect($authType, $otpToken,$current_user );
60
+ //change parameters as per your requirement but make sure other methods are not affected.
61
+
62
+ }else{
63
+
64
+ $content= parent::validate_otp_token( $authType, $username, $transactionId, $otpToken, $cKey, $customerApiKey, $current_user =null);
65
+
66
+ }
67
+ return $content;
68
+ }
69
+
70
+
71
+ }
72
+
73
  ?>
api/class-rba-attributes.php CHANGED
@@ -1,178 +1,178 @@
1
- <?php
2
- /** miniOrange enables user to log in through mobile authentication as an additional layer of security over password.
3
- * Copyright (C) 2015 miniOrange
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>
17
- * @package miniOrange OAuth
18
- * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
19
- */
20
-
21
- /**
22
- * This library is miniOrange Authentication Service.
23
- * Contains Request Calls to Customer service.
24
- **/
25
-
26
- include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'mo2f_api.php';
27
-
28
- class Miniorange_Rba_Attributes {
29
-
30
- private $auth_mode = 2; // miniorange test or not
31
- private $https_mode = false; // website http or https
32
-
33
- function mo2f_collect_attributes( $useremail, $rba_attributes ) {
34
-
35
- if ( ! MO2f_Utility::is_curl_installed() ) {
36
- return $this->get_curl_error_message();
37
- }
38
-
39
- $url = MO_HOST_NAME . '/moas/rest/rba/acs';
40
- $customerKey = get_option( 'mo2f_customerKey' );
41
- $field_string = "{\"customerKey\":\"" . $customerKey . "\",\"userKey\":\"" . $useremail . "\",\"attributes\":" . $rba_attributes . "}";
42
- $mo2fApi= new Mo2f_Api();
43
- $http_header_array = $mo2fApi->get_http_header_array();
44
-
45
- return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
46
- }
47
-
48
- function get_curl_error_message() {
49
- $message = mo2f_lt( 'Please enable curl extension.' ) .
50
- ' <a href="admin.php?page=mo_2fa_troubleshooting">' .
51
- mo2f_lt( 'Click here' ) .
52
- ' </a> ' .
53
- mo2f_lt( 'for the steps to enable curl.' );
54
-
55
- return json_encode( array( "status" => 'ERROR', "message" => $message ) );
56
- }
57
-
58
- function mo2f_evaluate_risk( $useremail, $sessionUuid ) {
59
-
60
- if ( ! MO2f_Utility::is_curl_installed() ) {
61
- return $this->get_curl_error_message();
62
- }
63
-
64
- $url = MO_HOST_NAME . '/moas/rest/rba/evaluate-risk';
65
- $customerKey = get_option( 'mo2f_customerKey' );
66
- $field_string = array(
67
- 'customerKey' => $customerKey,
68
- 'appSecret' => get_option( 'mo2f_app_secret' ),
69
- 'userKey' => $useremail,
70
- 'sessionUuid' => $sessionUuid
71
- );
72
- $mo2fApi= new Mo2f_Api();
73
-
74
- $http_header_array = $mo2fApi->get_http_header_array();
75
-
76
- return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
77
- }
78
-
79
- function mo2f_register_rba_profile( $useremail, $sessionUuid ) {
80
-
81
- if ( ! MO2f_Utility::is_curl_installed() ) {
82
- return $this->get_curl_error_message();
83
- }
84
-
85
- $url = MO_HOST_NAME . '/moas/rest/rba/register-profile';
86
- $customerKey = get_option( 'mo2f_customerKey' );
87
- $field_string = array(
88
- 'customerKey' => $customerKey,
89
- 'userKey' => $useremail,
90
- 'sessionUuid' => $sessionUuid
91
- );
92
- $mo2fApi= new Mo2f_Api();
93
- $http_header_array = $mo2fApi->get_http_header_array();
94
-
95
- return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
96
- }
97
-
98
- function mo2f_get_app_secret() {
99
-
100
- if ( ! MO2f_Utility::is_curl_installed() ) {
101
- return $this->get_curl_error_message();
102
- }
103
-
104
- $mo2fApi= new Mo2f_Api();
105
-
106
- $url = MO_HOST_NAME . '/moas/rest/customer/getapp-secret';
107
- $customerKey = get_option( 'mo2f_customerKey' );
108
- $field_string = array(
109
- 'customerId' => $customerKey
110
- );
111
-
112
- $http_header_array = $mo2fApi->get_http_header_array();
113
-
114
- return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
115
- }
116
-
117
- function mo2f_google_auth_service( $useremail, $googleAuthenticatorName="" ) {
118
-
119
- if ( ! MO2f_Utility::is_curl_installed() ) {
120
- return $this->get_curl_error_message();
121
- }
122
- $mo2fApi= new Mo2f_Api();
123
- $url = MO_HOST_NAME . '/moas/api/auth/google-auth-secret';
124
- $customerKey = get_option( 'mo2f_customerKey' );
125
- $field_string = array(
126
- 'customerKey' => $customerKey,
127
- 'username' => $useremail,
128
- 'googleAuthenticatorName' => $googleAuthenticatorName
129
- );
130
-
131
- $http_header_array = $mo2fApi->get_http_header_array();
132
-
133
- return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
134
- }
135
-
136
- function mo2f_validate_google_auth( $useremail, $otptoken, $secret ) {
137
- if(MO2F_IS_ONPREM){
138
- include_once dirname(dirname( __FILE__ )) . DIRECTORY_SEPARATOR. 'handler'.DIRECTORY_SEPARATOR. 'twofa' . DIRECTORY_SEPARATOR . 'gaonprem.php';
139
- $gauth_obj= new Google_auth_onpremise();
140
- $secret = isset($_SESSION['secret_ga'])? $_SESSION['secret_ga'] : $secret;
141
- $content=$gauth_obj->verifyCode($secret , $otptoken );
142
- $value = json_decode($content,true);
143
- if($value['status'] == 'SUCCESS'){
144
- $user = wp_get_current_user();
145
- $user_id = $user->ID;
146
- $gauth_obj->mo_GAuth_set_secret($user_id, $secret);
147
- update_user_meta($user_id,'mo2f_2FA_method_to_configure','Google Authenticator');
148
- update_user_meta( $user_id, 'mo2f_external_app_type', "Google Authenticator" );
149
- global $Mo2fdbQueries;//might not need this
150
- $Mo2fdbQueries->update_user_details( $user_id, array('mo2f_configured_2FA_method' =>'Google Authenticator') );
151
- }
152
- }else{
153
- if ( ! MO2f_Utility::is_curl_installed() ) {
154
- return $this->get_curl_error_message();
155
- }
156
-
157
-
158
- $url = MO_HOST_NAME . '/moas/api/auth/validate-google-auth-secret';
159
- $mo2fApi= new Mo2f_Api();
160
-
161
- $customerKey = get_option( 'mo2f_customerKey' );
162
- $field_string = array(
163
- 'customerKey' => $customerKey,
164
- 'username' => $useremail,
165
- 'secret' => $secret,
166
- 'otpToken' => $otptoken
167
- );
168
-
169
- $http_header_array = $mo2fApi->get_http_header_array();
170
- $content = $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
171
- }
172
-
173
- return $content;
174
- }
175
-
176
- }
177
-
178
  ?>
1
+ <?php
2
+ /** miniOrange enables user to log in through mobile authentication as an additional layer of security over password.
3
+ * Copyright (C) 2015 miniOrange
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
17
+ * @package miniOrange OAuth
18
+ * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
19
+ */
20
+
21
+ /**
22
+ * This library is miniOrange Authentication Service.
23
+ * Contains Request Calls to Customer service.
24
+ **/
25
+
26
+ include_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'mo2f_api.php';
27
+
28
+ class Miniorange_Rba_Attributes {
29
+
30
+ private $auth_mode = 2; // miniorange test or not
31
+ private $https_mode = false; // website http or https
32
+
33
+ function mo2f_collect_attributes( $useremail, $rba_attributes ) {
34
+
35
+ if ( ! MO2f_Utility::is_curl_installed() ) {
36
+ return $this->get_curl_error_message();
37
+ }
38
+
39
+ $url = MO_HOST_NAME . '/moas/rest/rba/acs';
40
+ $customerKey = get_option( 'mo2f_customerKey' );
41
+ $field_string = "{\"customerKey\":\"" . $customerKey . "\",\"userKey\":\"" . $useremail . "\",\"attributes\":" . $rba_attributes . "}";
42
+ $mo2fApi= new Mo2f_Api();
43
+ $http_header_array = $mo2fApi->get_http_header_array();
44
+
45
+ return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
46
+ }
47
+
48
+ function get_curl_error_message() {
49
+ $message = mo2f_lt( 'Please enable curl extension.' ) .
50
+ ' <a href="admin.php?page=mo_2fa_troubleshooting">' .
51
+ mo2f_lt( 'Click here' ) .
52
+ ' </a> ' .
53
+ mo2f_lt( 'for the steps to enable curl.' );
54
+
55
+ return json_encode( array( "status" => 'ERROR', "message" => $message ) );
56
+ }
57
+
58
+ function mo2f_evaluate_risk( $useremail, $sessionUuid ) {
59
+
60
+ if ( ! MO2f_Utility::is_curl_installed() ) {
61
+ return $this->get_curl_error_message();
62
+ }
63
+
64
+ $url = MO_HOST_NAME . '/moas/rest/rba/evaluate-risk';
65
+ $customerKey = get_option( 'mo2f_customerKey' );
66
+ $field_string = array(
67
+ 'customerKey' => $customerKey,
68
+ 'appSecret' => get_option( 'mo2f_app_secret' ),
69
+ 'userKey' => $useremail,
70
+ 'sessionUuid' => $sessionUuid
71
+ );
72
+ $mo2fApi= new Mo2f_Api();
73
+
74
+ $http_header_array = $mo2fApi->get_http_header_array();
75
+
76
+ return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
77
+ }
78
+
79
+ function mo2f_register_rba_profile( $useremail, $sessionUuid ) {
80
+
81
+ if ( ! MO2f_Utility::is_curl_installed() ) {
82
+ return $this->get_curl_error_message();
83
+ }
84
+
85
+ $url = MO_HOST_NAME . '/moas/rest/rba/register-profile';
86
+ $customerKey = get_option( 'mo2f_customerKey' );
87
+ $field_string = array(
88
+ 'customerKey' => $customerKey,
89
+ 'userKey' => $useremail,
90
+ 'sessionUuid' => $sessionUuid
91
+ );
92
+ $mo2fApi= new Mo2f_Api();
93
+ $http_header_array = $mo2fApi->get_http_header_array();
94
+
95
+ return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
96
+ }
97
+
98
+ function mo2f_get_app_secret() {
99
+
100
+ if ( ! MO2f_Utility::is_curl_installed() ) {
101
+ return $this->get_curl_error_message();
102
+ }
103
+
104
+ $mo2fApi= new Mo2f_Api();
105
+
106
+ $url = MO_HOST_NAME . '/moas/rest/customer/getapp-secret';
107
+ $customerKey = get_option( 'mo2f_customerKey' );
108
+ $field_string = array(
109
+ 'customerId' => $customerKey
110
+ );
111
+
112
+ $http_header_array = $mo2fApi->get_http_header_array();
113
+
114
+ return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
115
+ }
116
+
117
+ function mo2f_google_auth_service( $useremail, $googleAuthenticatorName="" ) {
118
+
119
+ if ( ! MO2f_Utility::is_curl_installed() ) {
120
+ return $this->get_curl_error_message();
121
+ }
122
+ $mo2fApi= new Mo2f_Api();
123
+ $url = MO_HOST_NAME . '/moas/api/auth/google-auth-secret';
124
+ $customerKey = get_option( 'mo2f_customerKey' );
125
+ $field_string = array(
126
+ 'customerKey' => $customerKey,
127
+ 'username' => $useremail,
128
+ 'googleAuthenticatorName' => $googleAuthenticatorName
129
+ );
130
+
131
+ $http_header_array = $mo2fApi->get_http_header_array();
132
+
133
+ return $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
134
+ }
135
+
136
+ function mo2f_validate_google_auth( $useremail, $otptoken, $secret ) {
137
+ if(MO2F_IS_ONPREM){
138
+ include_once dirname(dirname( __FILE__ )) . DIRECTORY_SEPARATOR. 'handler'.DIRECTORY_SEPARATOR. 'twofa' . DIRECTORY_SEPARATOR . 'gaonprem.php';
139
+ $gauth_obj= new Google_auth_onpremise();
140
+ $secret = isset($_SESSION['secret_ga'])? $_SESSION['secret_ga'] : $secret;
141
+ $content=$gauth_obj->verifyCode($secret , $otptoken );
142
+ $value = json_decode($content,true);
143
+ if($value['status'] == 'SUCCESS'){
144
+ $user = wp_get_current_user();
145
+ $user_id = $user->ID;
146
+ $gauth_obj->mo_GAuth_set_secret($user_id, $secret);
147
+ update_user_meta($user_id,'mo2f_2FA_method_to_configure','Google Authenticator');
148
+ update_user_meta( $user_id, 'mo2f_external_app_type', "Google Authenticator" );
149
+ global $Mo2fdbQueries;//might not need this
150
+ $Mo2fdbQueries->update_user_details( $user_id, array('mo2f_configured_2FA_method' =>'Google Authenticator') );
151
+ }
152
+ }else{
153
+ if ( ! MO2f_Utility::is_curl_installed() ) {
154
+ return $this->get_curl_error_message();
155
+ }
156
+
157
+
158
+ $url = MO_HOST_NAME . '/moas/api/auth/validate-google-auth-secret';
159
+ $mo2fApi= new Mo2f_Api();
160
+
161
+ $customerKey = get_option( 'mo2f_customerKey' );
162
+ $field_string = array(
163
+ 'customerKey' => $customerKey,
164
+ 'username' => $useremail,
165
+ 'secret' => $secret,
166
+ 'otpToken' => $otptoken
167
+ );
168
+
169
+ $http_header_array = $mo2fApi->get_http_header_array();
170
+ $content = $mo2fApi->make_curl_call( $url, $field_string, $http_header_array );
171
+ }
172
+
173
+ return $content;
174
+ }
175
+
176
+ }
177
+
178
  ?>
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/PointersManager.php CHANGED
@@ -1,54 +1,54 @@
1
- <?php
2
-
3
- class Mo2FAPointersManager {
4
-
5
- private $pfile;
6
- private $version;
7
- private $prefix;
8
- private $pointers = array();
9
-
10
- public function __construct( $file, $version, $prefix ) {
11
- $this->pfile = file_exists( $file ) ? $file : FALSE;
12
- $this->version = str_replace( '.', '_', $version );
13
- $this->prefix = $prefix;
14
- }
15
-
16
- public function parse() {
17
- if ( empty( $this->pfile ) ) return;
18
- $pointers = (array) require_once $this->pfile;
19
- if ( empty($pointers) ) return;
20
- foreach ( $pointers as $i => $pointer ) {
21
- if(is_array($pointer)){
22
- $pointer['id'] = "{$this->prefix}{$this->version}_{$i}";
23
- $this->pointers[$pointer['id']] = (object) $pointer;
24
- }
25
- }
26
- }
27
-
28
- public function filter( $page ) {
29
- if ( empty( $this->pointers ) ) return array();
30
- $uid = get_current_user_id();
31
- $visited = explode( ',', (string) get_user_meta( $uid, 'mo2f_visited_pointers', TRUE ) );
32
-
33
- $active_ids = array_diff( array_keys( $this->pointers ), $visited );
34
-
35
-
36
- $good = array();
37
-
38
- foreach( $this->pointers as $i => $pointer ) {
39
- if (
40
- in_array( $i, $active_ids, TRUE ) // is active
41
- && isset( $pointer->where ) // has where
42
- && in_array( $page, (array) $pointer->where, TRUE ) // current page is in where
43
- ) {
44
- $good[] = $pointer;
45
- }
46
- }
47
- $count = count( $good );
48
- if ( $good === 0 ) return array();
49
- foreach( array_values( $good ) as $i => $pointer ) {
50
- $good[$i]->next = $i+1 < $count ? $good[$i+1]->id : '';
51
- }
52
- return $good;
53
- }
54
  }
1
+ <?php
2
+
3
+ class Mo2FAPointersManager {
4
+
5
+ private $pfile;
6
+ private $version;
7
+ private $prefix;
8
+ private $pointers = array();
9
+
10
+ public function __construct( $file, $version, $prefix ) {
11
+ $this->pfile = file_exists( $file ) ? $file : FALSE;
12
+ $this->version = str_replace( '.', '_', $version );
13
+ $this->prefix = $prefix;
14
+ }
15
+
16
+ public function parse() {
17
+ if ( empty( $this->pfile ) ) return;
18
+ $pointers = (array) require_once $this->pfile;
19
+ if ( empty($pointers) ) return;
20
+ foreach ( $pointers as $i => $pointer ) {
21
+ if(is_array($pointer)){
22
+ $pointer['id'] = "{$this->prefix}{$this->version}_{$i}";
23
+ $this->pointers[$pointer['id']] = (object) $pointer;
24
+ }
25
+ }
26
+ }
27
+
28
+ public function filter( $page ) {
29
+ if ( empty( $this->pointers ) ) return array();
30
+ $uid = get_current_user_id();
31
+ $visited = explode( ',', (string) get_user_meta( $uid, 'mo2f_visited_pointers', TRUE ) );
32
+
33
+ $active_ids = array_diff( array_keys( $this->pointers ), $visited );
34
+
35
+
36
+ $good = array();
37
+
38
+ foreach( $this->pointers as $i => $pointer ) {
39
+ if (
40
+ in_array( $i, $active_ids, TRUE ) // is active
41
+ && isset( $pointer->where ) // has where
42
+ && in_array( $page, (array) $pointer->where, TRUE ) // current page is in where
43
+ ) {
44
+ $good[] = $pointer;
45
+ }
46
+ }
47
+ $count = count( $good );
48
+ if ( $good === 0 ) return array();
49
+ foreach( array_values( $good ) as $i => $pointer ) {
50
+ $good[$i]->next = $i+1 < $count ? $good[$i+1]->id : '';
51
+ }
52
+ return $good;
53
+ }
54
  }
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.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
  include $mo2f_dirName. 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup.php';
1
+ <?php
2
  include $mo2f_dirName. 'views'.DIRECTORY_SEPARATOR.'backup'.DIRECTORY_SEPARATOR.'backup.php';
controllers/backup/backup_ajax.php CHANGED
@@ -1,157 +1,157 @@
1
- <?php
2
- class Mo_wpns_file_db_backup{
3
-
4
- function __construct(){
5
- add_action( 'admin_init' , array( $this, 'mo_wpns_file_db_backup_functions' ) );
6
- }
7
-
8
- public function mo_wpns_file_db_backup_functions(){
9
- add_action('wp_ajax_mo_wpns_backup_redirect', array( $this, 'mo_wpns_backup_redirect' ));
10
- }
11
-
12
- public function mo_wpns_backup_redirect(){
13
-
14
- switch($_POST['call_type'])
15
- {
16
- case "submit_backup_settings_form":
17
- $this->mo_wpns_save_backup_config_form($_POST);
18
- break;
19
- case "submit_schedule_settings_form":
20
- $this->mo_wpns_save_schedule_backup_config_form($_POST);
21
- break;
22
- case "delete_backup":
23
- $this->delete_backup($_POST);
24
- break;
25
- }
26
- }
27
-
28
- public function mo_wpns_save_backup_config_form($postData){
29
- $nonce = $postData['nonce'];
30
- if ( ! wp_verify_nonce( $nonce, 'wpns-backup-settings' ) ){
31
- wp_send_json('ERROR');
32
- }
33
-
34
- if(! isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database'])){
35
- wp_send_json('folder_error');
36
- }
37
-
38
- isset($postData['backup_plugin']) ? update_site_option( 'mo_file_manual_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_manual_backup_plugins', 0);
39
-
40
- isset($postData['backup_themes']) ? update_site_option( 'mo_file_manual_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_manual_backup_themes', 0);
41
-
42
- isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_manual_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_manual_backup_wp_files', 0);
43
-
44
- isset($postData['database']) ? update_site_option( 'mo_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_database_backup', 0);
45
-
46
- if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
47
- $handler_obj = new MoBackupSite();
48
- update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
49
- $handler_obj->file_manual_backup();
50
- }
51
- if(isset($postData['database'])) {
52
- $handler_obj = new MoBackupSite();
53
- update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
54
- $handler_obj->backupDB();
55
- }
56
- wp_send_json('created_backup');
57
- }
58
-
59
- function mo_wpns_save_schedule_backup_config_form($postData){
60
- $nonce = $postData['nonce'];
61
- if ( ! wp_verify_nonce( $nonce, 'wpns-schedule-backup' ) ){
62
- wp_send_json('ERROR');
63
-
64
- }
65
-
66
- $handler_obj = new MoBackupSite;
67
- if(!isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database']))
68
- {
69
- wp_send_json('folder_error');
70
-
71
- }
72
-
73
- isset($postData['backup_plugin']) ? update_site_option( 'mo_file_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_backup_plugins', 0);
74
-
75
- isset($postData['backup_themes']) ? update_site_option( 'mo_file_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_backup_themes', 0);
76
-
77
- isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_backup_wp_files', 0);
78
-
79
- isset($postData['database']) ? update_site_option( 'mo_schedule_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_schedule_database_backup', 0);
80
-
81
- if($postData['backup_time']==='12'||$postData['backup_time']==='24'||$postData['backup_time']==='168'||$postData['backup_time']==='360'||$postData['backup_time']==='720')
82
- {
83
- isset($postData['backup_time']) ? update_site_option( 'mo_wpns_backup_time', sanitize_text_field($postData['backup_time'])) : update_site_option( 'mo_wpns_backup_time', 0);
84
- }else{
85
- wp_send_json('invalid_hours');
86
-
87
- }
88
-
89
- isset($postData['enable_backup_schedule']) ? update_site_option( 'enable_backup_schedule', sanitize_text_field($postData['enable_backup_schedule'])) : update_site_option( 'enable_backup_schedule', 0);
90
-
91
- isset($postData['local_storage']) ? update_site_option( 'storage_type', sanitize_text_field($postData['local_storage'])) : update_site_option( 'storage_type', 0);
92
-
93
- if(get_site_option('enable_backup_schedule') === '1'){
94
-
95
- if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
96
- $handler_obj-> file_backup_deactivate();
97
- if (!wp_next_scheduled( 'mo_eb_file_cron_hook')) {
98
- wp_schedule_event( time(), 'file_eb_backup_time', 'mo_eb_file_cron_hook' );
99
- }
100
- update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
101
- update_site_option('scheduled_file_backup',1);
102
- }
103
- else
104
- $handler_obj-> file_backup_deactivate();
105
-
106
- if(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' );
110
- }
111
- update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
112
- update_site_option('scheduled_db_backup',1);
113
- }
114
- else
115
- $handler_obj->bl_deactivate();
116
-
117
- wp_send_json('success');
118
-
119
- }else{
120
- $handler_obj-> file_backup_deactivate();
121
- $handler_obj->bl_deactivate();
122
- update_site_option('scheduled_db_backup',0);
123
- update_site_option('scheduled_file_backup',0);
124
- wp_send_json('disable');
125
-
126
- }
127
- }
128
-
129
-
130
-
131
- function delete_backup($postData){
132
-
133
- $nonce = $postData['nonce'];
134
- if ( ! wp_verify_nonce( $nonce, 'delete_entry' ) ){
135
- wp_send_json('ERROR');
136
-
137
- }
138
-
139
- if(current_user_can('administrator')){
140
- global $wpnsDbQueries;
141
- $id = $postData['id'];
142
- $row_exist = (int)$wpnsDbQueries->row_exist($id);
143
- $status = file_exists($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
144
- if($status){
145
- unlink($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
146
- if($row_exist)
147
- $wpnsDbQueries->delete_file($id);
148
- wp_send_json('success');
149
-
150
- }else{
151
- $wpnsDbQueries->delete_file($id);
152
- wp_send_json('notexist');
153
- }
154
- }
155
- }
156
- }new Mo_wpns_file_db_backup();
157
  ?>
1
+ <?php
2
+ class Mo_wpns_file_db_backup{
3
+
4
+ function __construct(){
5
+ add_action( 'admin_init' , array( $this, 'mo_wpns_file_db_backup_functions' ) );
6
+ }
7
+
8
+ public function mo_wpns_file_db_backup_functions(){
9
+ add_action('wp_ajax_mo_wpns_backup_redirect', array( $this, 'mo_wpns_backup_redirect' ));
10
+ }
11
+
12
+ public function mo_wpns_backup_redirect(){
13
+
14
+ switch($_POST['call_type'])
15
+ {
16
+ case "submit_backup_settings_form":
17
+ $this->mo_wpns_save_backup_config_form($_POST);
18
+ break;
19
+ case "submit_schedule_settings_form":
20
+ $this->mo_wpns_save_schedule_backup_config_form($_POST);
21
+ break;
22
+ case "delete_backup":
23
+ $this->delete_backup($_POST);
24
+ break;
25
+ }
26
+ }
27
+
28
+ public function mo_wpns_save_backup_config_form($postData){
29
+ $nonce = $postData['nonce'];
30
+ if ( ! wp_verify_nonce( $nonce, 'wpns-backup-settings' ) ){
31
+ wp_send_json('ERROR');
32
+ }
33
+
34
+ if(! isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database'])){
35
+ wp_send_json('folder_error');
36
+ }
37
+
38
+ isset($postData['backup_plugin']) ? update_site_option( 'mo_file_manual_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_manual_backup_plugins', 0);
39
+
40
+ isset($postData['backup_themes']) ? update_site_option( 'mo_file_manual_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_manual_backup_themes', 0);
41
+
42
+ isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_manual_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_manual_backup_wp_files', 0);
43
+
44
+ isset($postData['database']) ? update_site_option( 'mo_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_database_backup', 0);
45
+
46
+ if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
47
+ $handler_obj = new MoBackupSite();
48
+ update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
49
+ $handler_obj->file_manual_backup();
50
+ }
51
+ if(isset($postData['database'])) {
52
+ $handler_obj = new MoBackupSite();
53
+ update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
54
+ $handler_obj->backupDB();
55
+ }
56
+ wp_send_json('created_backup');
57
+ }
58
+
59
+ function mo_wpns_save_schedule_backup_config_form($postData){
60
+ $nonce = $postData['nonce'];
61
+ if ( ! wp_verify_nonce( $nonce, 'wpns-schedule-backup' ) ){
62
+ wp_send_json('ERROR');
63
+
64
+ }
65
+
66
+ $handler_obj = new MoBackupSite;
67
+ if(!isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files']) && ! isset($postData['database']))
68
+ {
69
+ wp_send_json('folder_error');
70
+
71
+ }
72
+
73
+ isset($postData['backup_plugin']) ? update_site_option( 'mo_file_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_site_option( 'mo_file_backup_plugins', 0);
74
+
75
+ isset($postData['backup_themes']) ? update_site_option( 'mo_file_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_site_option( 'mo_file_backup_themes', 0);
76
+
77
+ isset($postData['backup_wp_files']) ? update_site_option( 'mo_file_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_site_option( 'mo_file_backup_wp_files', 0);
78
+
79
+ isset($postData['database']) ? update_site_option( 'mo_schedule_database_backup', sanitize_text_field($postData['database'])) : update_site_option( 'mo_schedule_database_backup', 0);
80
+
81
+ if($postData['backup_time']==='12'||$postData['backup_time']==='24'||$postData['backup_time']==='168'||$postData['backup_time']==='360'||$postData['backup_time']==='720')
82
+ {
83
+ isset($postData['backup_time']) ? update_site_option( 'mo_wpns_backup_time', sanitize_text_field($postData['backup_time'])) : update_site_option( 'mo_wpns_backup_time', 0);
84
+ }else{
85
+ wp_send_json('invalid_hours');
86
+
87
+ }
88
+
89
+ isset($postData['enable_backup_schedule']) ? update_site_option( 'enable_backup_schedule', sanitize_text_field($postData['enable_backup_schedule'])) : update_site_option( 'enable_backup_schedule', 0);
90
+
91
+ isset($postData['local_storage']) ? update_site_option( 'storage_type', sanitize_text_field($postData['local_storage'])) : update_site_option( 'storage_type', 0);
92
+
93
+ if(get_site_option('enable_backup_schedule') === '1'){
94
+
95
+ if(isset($postData['backup_plugin']) || isset($postData['backup_themes']) || isset($postData['backup_wp_files'])){
96
+ $handler_obj-> file_backup_deactivate();
97
+ if (!wp_next_scheduled( 'mo_eb_file_cron_hook')) {
98
+ wp_schedule_event( time(), 'file_eb_backup_time', 'mo_eb_file_cron_hook' );
99
+ }
100
+ update_site_option('file_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
101
+ update_site_option('scheduled_file_backup',1);
102
+ }
103
+ else
104
+ $handler_obj-> file_backup_deactivate();
105
+
106
+ if(MoWpnsUtility::get_mo2f_db_option('mo_schedule_database_backup', 'site_option') === '1'){
107
+ $handler_obj->bl_deactivate();
108
+ if ( ! wp_next_scheduled( 'mo_eb_bl_cron_hook' ) ) {
109
+ wp_schedule_event( time(), 'db_eb_backup_time', 'mo_eb_bl_cron_hook' );
110
+ }
111
+ update_site_option('db_backup_created_time',date("l").' , '.date("d-m-Y") .' '.date("h:i"));
112
+ update_site_option('scheduled_db_backup',1);
113
+ }
114
+ else
115
+ $handler_obj->bl_deactivate();
116
+
117
+ wp_send_json('success');
118
+
119
+ }else{
120
+ $handler_obj-> file_backup_deactivate();
121
+ $handler_obj->bl_deactivate();
122
+ update_site_option('scheduled_db_backup',0);
123
+ update_site_option('scheduled_file_backup',0);
124
+ wp_send_json('disable');
125
+
126
+ }
127
+ }
128
+
129
+
130
+
131
+ function delete_backup($postData){
132
+
133
+ $nonce = $postData['nonce'];
134
+ if ( ! wp_verify_nonce( $nonce, 'delete_entry' ) ){
135
+ wp_send_json('ERROR');
136
+
137
+ }
138
+
139
+ if(current_user_can('administrator')){
140
+ global $wpnsDbQueries;
141
+ $id = $postData['id'];
142
+ $row_exist = (int)$wpnsDbQueries->row_exist($id);
143
+ $status = file_exists($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
144
+ if($status){
145
+ unlink($postData["folder_name"].DIRECTORY_SEPARATOR. $postData['file_name']);
146
+ if($row_exist)
147
+ $wpnsDbQueries->delete_file($id);
148
+ wp_send_json('success');
149
+
150
+ }else{
151
+ $wpnsDbQueries->delete_file($id);
152
+ wp_send_json('notexist');
153
+ }
154
+ }
155
+ }
156
+ }new Mo_wpns_file_db_backup();
157
  ?>
controllers/backup/backup_schdule.php CHANGED
@@ -1,11 +1,11 @@
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' );
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' );
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/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_ajax.php CHANGED
@@ -1,396 +1,396 @@
1
- <?php
2
- class Mo_wpns_scan_malware
3
- {
4
- function __construct(){
5
- add_action( 'admin_init' , array( $this, 'mo_wpns_malware_scanner_functions' ) );
6
-
7
- }
8
-
9
- public function mo_wpns_malware_scanner_functions(){
10
- add_action('wp_ajax_mo_wpns_malware_redirect', array( $this, 'mo_wpns_malware_redirect' ));
11
- }
12
-
13
- public function mo_wpns_malware_redirect(){
14
- switch($_POST['call_type'])
15
- {
16
- case "submit_malware_settings_form":
17
- $this->mo_wpns_save_malware_config_form($_POST);
18
- break;
19
- case "malware_scan_initiate":
20
- $this->mo_wpns_start_malware_scan($_POST);
21
- break;
22
- case "wpns_enable_tour":
23
- update_option('skip_tour', 0);
24
- break;
25
- case "wpns_disable_tour":
26
- update_option('skip_tour', 1);
27
- break;
28
- case "malware_progress_bar":
29
- $this->mo_wpns_get_progress();
30
- break;
31
- case "malware_scan_last_result":
32
- $this->mo_wpns_get_scan_result();
33
- break;
34
- case "malware_scan_terminate":
35
- $this->mo_wpns_stop_scan();
36
- break;
37
- }
38
- }
39
-
40
- public function mo_wpns_save_malware_config_form($POSTED){
41
- $nonce = $POSTED['nonce'];
42
- if ( ! wp_verify_nonce( $nonce, 'mo-wpns-scan-settings' ) ){
43
- wp_send_json('ERROR');
44
- return;
45
- }
46
- if(! isset($POSTED['scan_plugin']) && ! isset($POSTED['scan_themes']) && ! isset($POSTED['scan_core'])){
47
- wp_send_json('folder_error');
48
- }elseif (! isset($POSTED['vulnerable_check']) && ! isset($POSTED['sql_check']) && ! isset($POSTED['rfi_check']) && ! isset($POSTED['ext_link']) && ! isset($POSTED['repo_check'])) {
49
- wp_send_json('level_error');
50
- }
51
- else{
52
- $mo_wpns_scan_plugins=isset($POSTED['scan_plugin']) ? sanitize_text_field($POSTED['scan_plugin']) : 0;
53
- $mo_wpns_scan_themes=isset($POSTED['scan_themes']) ? sanitize_text_field($POSTED['scan_themes']) : 0;
54
- $mo_wpns_scan_wp_files= isset($POSTED['scan_core']) ? sanitize_text_field($POSTED['scan_core']) : 0;
55
- $mo_wpns_scan_files_extensions= sanitize_text_field($POSTED['file_type']);
56
- $mo_wpns_check_vulnerable_code=isset($POSTED['vulnerable_check']) ? sanitize_text_field($POSTED['vulnerable_check']) : 0;
57
- $mo_wpns_check_sql_injection=isset($POSTED['sql_check']) ? sanitize_text_field($POSTED['sql_check']) : 0;
58
- $mo_wpns_check_external_link=isset($POSTED['ext_link']) ? sanitize_text_field($POSTED['ext_link']) : 0;
59
- $mo_wpns_scan_files_with_repo=isset($POSTED['repo_check']) ? sanitize_text_field($POSTED['repo_check']) : 0;
60
- $folders_to_skip= sanitize_text_field($POSTED['skip_path']);
61
- $folders_to_skip = str_replace('\\\\', '/', $folders_to_skip);
62
- $str="";
63
-
64
- $mo_wpns_skip_folders="";
65
- if(!empty($folders_to_skip)){
66
- $folders_to_skip_array=explode(";",$folders_to_skip);
67
- for($i=0; $i< count($folders_to_skip_array); $i++){
68
- if(is_dir($folders_to_skip_array[$i])){
69
- $str.= $folders_to_skip_array[$i];
70
- if($i!= count($folders_to_skip_array)-1){
71
- $str.=";";
72
- }
73
- }elseif($folders_to_skip_array[$i] == ''){
74
- $str.= $folders_to_skip_array[$i];
75
- }
76
- else{
77
- wp_send_json('path_error');
78
- }
79
- }
80
- $mo_wpns_skip_folders=$str;
81
- }else{
82
- $mo_wpns_skip_folders=$folders_to_skip;
83
- }
84
-
85
- $scan_configuration = array(
86
- 'plugin_scan' => $mo_wpns_scan_plugins,
87
- 'theme_scan' => $mo_wpns_scan_themes,
88
- 'core_scan' => $mo_wpns_scan_wp_files,
89
- 'file_extension' => $mo_wpns_scan_files_extensions,
90
- 'check_vulnerable' => $mo_wpns_check_vulnerable_code,
91
- 'check_sql' => $mo_wpns_check_sql_injection,
92
- 'ext_link_check' => $mo_wpns_check_external_link,
93
- 'check_repo' => $mo_wpns_scan_files_with_repo,
94
- 'path_skip' => $mo_wpns_skip_folders,
95
- 'type_scan' => "",
96
- );
97
-
98
- $encoded_scan_configuration=json_encode($scan_configuration);
99
- update_option("mo_wpns_scan_configuration",$encoded_scan_configuration);
100
- wp_send_json('save_success');
101
- }
102
- }
103
-
104
- public function mo_wpns_start_malware_scan($POSTED){
105
- $decoded_scan_configuration=json_decode(get_option('mo_wpns_scan_status'));
106
- if(isset($decoded_scan_configuration)){
107
- $status = $decoded_scan_configuration->scan_progress;
108
- }else{
109
- $status=false;
110
- $scan_mode=false;
111
- }
112
- if($status == "IN PROGRESS"){
113
- wp_send_json('scanning_already');
114
- }
115
- global $moWpnsUtility, $mo2f_dirName;
116
-
117
- $mo_wpns_scan_handler = new Mo_wpns_Scan_Handler_Cron();
118
- $mo2f_malware_db_handler = new MoWpnsDB();
119
-
120
- $current_time= time();
121
- update_option('mo_wpns_last_scan_time', $current_time);
122
- $plugin_current= get_plugins();
123
- update_option('mo_wpns_last_plugins', $plugin_current);
124
- $args=array();
125
- $theme_current= wp_get_themes($args);
126
- update_option('mo_wpns_last_themes', $theme_current);
127
-
128
- update_option('mo2f_scan_initialize', 0);
129
- update_option('mo_wpns_hide_malware_popup', 1);
130
-
131
- $mo_wpns_malware_scan_in_progress="IN PROGRESS";
132
- $mo_wpns_files_scanned=0;
133
- $mo_wpns_infected_files=0;
134
- $mo_wpns_warning_files=0;
135
- $wordpress_download_status=false;
136
-
137
- update_option('mo_wpns_infected_files',0);
138
- update_option('mo_wpns_warning_files',0);
139
-
140
-
141
- $scan_status = array(
142
- 'scan_progress' => $mo_wpns_malware_scan_in_progress,
143
- 'files_scanned' => $mo_wpns_files_scanned,
144
- 'infected_files' => $mo_wpns_infected_files,
145
- 'warning_files' => $mo_wpns_warning_files,
146
- 'total_files' => 0,
147
- 'check_with_repo' => 0,
148
- 'extlink_check' => 0,
149
- 'scan_mode' => "",
150
- 'average_time_each_file' => 0,
151
- 'total_files_processed' => 0,
152
- 'status_download_time' => $wordpress_download_status
153
- );
154
-
155
- $encoded_scan_status=json_encode($scan_status);
156
- update_option("mo_wpns_scan_status",$encoded_scan_status);
157
-
158
-
159
- $mo2f_malware_db_handler->delete_files_parts();
160
-
161
- if(isset($POSTED['scan']) && $POSTED['scan']=='scan_start'){
162
- $scan_configuration = array();
163
- switch($POSTED['scantype'])
164
- {
165
- case "quick_scan":
166
- $nonce = $POSTED['nonce'];
167
- if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
168
- wp_send_json('ERROR');
169
- return;
170
- }
171
- $scan_configuration = MoWpnsConstants::$quick_scan_configuration;
172
- update_option('mo_wpns_scan_mode','quick_scan');
173
- $scan_status = array(
174
- 'scan_progress' => $mo_wpns_malware_scan_in_progress,
175
- 'files_scanned' => $mo_wpns_files_scanned,
176
- 'infected_files' => $mo_wpns_infected_files,
177
- 'warning_files' => $mo_wpns_warning_files,
178
- 'total_files' => 0,
179
- 'check_with_repo' => 0,
180
- 'extlink_check' => 0,
181
- 'average_time_each_file' => 0,
182
- 'total_files_processed' => 0,
183
- 'scan_mode' => "quick_scan",
184
- 'status_download_time' => $wordpress_download_status
185
- );
186
-
187
- $encoded_scan_status=json_encode($scan_status);
188
- update_option("mo_wpns_scan_status",$encoded_scan_status);
189
- $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
190
- break;
191
- case "standard_scan":
192
- $nonce = $POSTED['nonce'];
193
- if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
194
- wp_send_json('ERROR');
195
- return;
196
- }
197
- $scan_configuration = MoWpnsConstants::$standard_scan_configuration;
198
- update_option('mo_wpns_scan_mode','standard_scan');
199
- $scan_status = array(
200
- 'scan_progress' => $mo_wpns_malware_scan_in_progress,
201
- 'files_scanned' => $mo_wpns_files_scanned,
202
- 'infected_files' => $mo_wpns_infected_files,
203
- 'warning_files' => $mo_wpns_warning_files,
204
- 'total_files' => 0,
205
- 'check_with_repo' => 1,
206
- 'extlink_check' => 1,
207
- 'total_files_processed' => 0,
208
- 'average_time_each_file' => 0,
209
- 'scan_mode' => "standard_scan",
210
- 'status_download_time' => $wordpress_download_status
211
- );
212
-
213
- $encoded_scan_status=json_encode($scan_status);
214
- update_option("mo_wpns_scan_status",$encoded_scan_status);
215
- $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
216
- break;
217
- case "custom_scan":
218
- $nonce = $POSTED['nonce'];
219
- if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
220
- wp_send_json('ERROR');
221
- return;
222
- }
223
- $decode_scan_configuration=json_decode(get_option("mo_wpns_scan_configuration"));
224
- if(is_null($decode_scan_configuration))
225
- {
226
- delete_option("mo_wpns_scan_status",$encoded_scan_status);
227
- wp_send_json("RECONFIGURE");
228
- }
229
-
230
- $scan_configuration = array('plugin_scan' => $decode_scan_configuration->plugin_scan,
231
- 'theme_scan' => $decode_scan_configuration->theme_scan,
232
- 'core_scan' => $decode_scan_configuration->core_scan,
233
- 'file_extension' => $decode_scan_configuration->file_extension,
234
- 'check_vulnerable' => $decode_scan_configuration->check_vulnerable,
235
- 'check_sql' => $decode_scan_configuration->check_sql,
236
- 'ext_link_check' => $decode_scan_configuration->ext_link_check,
237
- 'check_repo' => $decode_scan_configuration->check_repo,
238
- 'path_skip' => $decode_scan_configuration->path_skip,
239
- 'type_scan' => "Custom Scan"
240
- );
241
-
242
-
243
- $scan_status = array(
244
- 'scan_progress' => $mo_wpns_malware_scan_in_progress,
245
- 'files_scanned' => $mo_wpns_files_scanned,
246
- 'infected_files' => $mo_wpns_infected_files,
247
- 'warning_files' => $mo_wpns_warning_files,
248
- 'total_files' => 0,
249
- 'extlink_check' => $decode_scan_configuration->ext_link_check,
250
- 'check_with_repo' => $decode_scan_configuration->check_repo,
251
- 'average_time_each_file' => 0,
252
- 'total_files_processed' => 0,
253
- 'scan_mode' => "custom_scan",
254
- 'status_download_time' => $wordpress_download_status
255
- );
256
-
257
- $encoded_scan_status=json_encode($scan_status);
258
- update_option("mo_wpns_scan_status",$encoded_scan_status);
259
- update_option('mo_wpns_scan_mode','custom_scan');
260
- update_option('mo2f_custom_scan_config', $scan_configuration);
261
- $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
262
- break;
263
- }
264
- }
265
- }
266
-
267
-
268
- public function mo_wpns_get_progress(){
269
-
270
- $decoded_scan_status=json_decode(get_option('mo_wpns_scan_status'));
271
- $status= $decoded_scan_status->scan_progress;;
272
- $files_scanned= $decoded_scan_status->files_scanned;
273
- $total_files = $decoded_scan_status->total_files;
274
- $check_repo = $decoded_scan_status->check_with_repo;
275
- $extlink_check = $decoded_scan_status->extlink_check;
276
- $scan_mode= $decoded_scan_status->scan_mode;
277
- $status_download= $decoded_scan_status->status_download_time;
278
- $averageFileScanTime= $decoded_scan_status->average_time_each_file;
279
- $total_files_processed= $decoded_scan_status->total_files_processed;
280
- if($status_download != false && $status == "IN PROGRESS"){
281
- $time_spent_in_downloading= time()-$status_download;
282
-
283
- if($time_spent_in_downloading > 600){
284
- $mo2f_malware_db_handler = new MoWpnsDB();
285
- $reportid= get_option('mo2f_report_id');
286
- $last_report = $mo2f_malware_db_handler->get_report_with_id($reportid);
287
- if(!empty($last_report)){
288
- $response['file_count']= $last_report[0]->scanned_files;
289
- $response['malware_count'] = $last_report[0]->malware_count;
290
- $response['repo_issues'] = -96;
291
- $response['malicious_link'] = $last_report[0]->malicious_links;
292
-
293
- $mo2f_malware_db_handler->scan_report_complete($reportid, $response['file_count'], $response['malware_count'], $response['repo_issues'], $response['malicious_link']);
294
- }
295
-
296
- $scan_handler_obj = new mo2f_scanner_parts;
297
- $scan_handler_obj->mo2f_end_scan();
298
- }
299
- }
300
- $repo_scan=0;
301
- if($scan_mode == "standard_scan" || ($scan_mode == "custom_scan" && $check_repo == 1)){
302
- $repo_scan=1;
303
- }
304
- if($status == "IN PROGRESS"){
305
- $result=array("status"=>$status, "scanned"=>$files_scanned, "total"=>$total_files, "repo_scan"=> $repo_scan,"extlink_check"=> $extlink_check,"AverageFileTime"=>$averageFileScanTime,"total_files_processed"=>$total_files_processed);
306
- wp_send_json($result);
307
- }
308
- else{
309
- //stop scan check
310
- $stop_scan=get_option('mo_stop_scan');
311
-
312
- $mo_wpns_db_handler = new MoWpnsDB();
313
- $total_scan=$mo_wpns_db_handler->count_files();
314
- $total_malicious=$mo_wpns_db_handler->count_malicious_files();
315
- $last_id=$mo_wpns_db_handler->get_last_id();
316
- $send_id=$last_id[0]->max;
317
- $last_scan=$mo_wpns_db_handler->count_files_last_scan($send_id);
318
- $malicious_last_scan= get_option('mo_wpns_infected_files');
319
- $warning_last_scan = get_option('mo_wpns_warning_files');
320
- if($total_scan > 999){
321
- $total_scan=($total_scan/1000);
322
- $total_scan= round($total_scan,1)."k";
323
- }
324
- if($total_malicious > 999){
325
- $total_malicious=($total_malicious/1000);
326
- $total_malicious= round($total_malicious,1)."k";
327
- }
328
- if($last_scan > 999){
329
- $last_scan = ($last_scan/1000);
330
- $last_scan = round($last_scan,1)."k";
331
- }
332
- if($stop_scan){
333
- $status="ABORTED";
334
- $result = array("status"=>$status, 'total_files'=>$total_scan,"AverageFileTime"=>$averageFileScanTime, 'total_mal'=>$total_malicious, 'scan_files'=>$last_scan, 'mal_files'=>$malicious_last_scan, 'warnings'=>$warning_last_scan,"total_files_processed"=>$total_files_processed);
335
- wp_send_json($result);
336
- }
337
- $result = array("status"=>$status, 'total_files'=>$total_scan, 'total_mal'=>$total_malicious,"AverageFileTime"=>$averageFileScanTime, 'scan_files'=>$total_files, 'mal_files'=>$malicious_last_scan, 'warnings'=>$warning_last_scan,"total_files_processed"=>$total_files_processed);
338
- wp_send_json($result);
339
- }
340
- }
341
-
342
- function mo_wpns_stop_scan(){
343
- update_option('mo_stop_scan','1');
344
- $mo2f_malware_db_handler = new MoWpnsDB();
345
- $mo2f_malware_db_handler->delete_files_parts();
346
- wp_send_json('success');
347
- }
348
-
349
- function mo_wpns_get_scan_result(){
350
- $decoded_scan_configuration=json_decode(get_option('mo_wpns_scan_status'));
351
- $status=$decoded_scan_configuration->scan_progress;
352
- $mo_wpns_db_handler = new MoWpnsDB();
353
- $result = $mo_wpns_db_handler->get_report();
354
- $str1= $_SERVER['REQUEST_URI'];
355
- $str1= str_replace("admin-ajax.php", "admin.php?page=mo_2fa_malwarescan", $str1);
356
- $currenturl = remove_query_arg('delete',$str1);
357
- $currenturl = remove_query_arg('view',$currenturl);
358
- $currenturl = remove_query_arg('trust',$currenturl);
359
- $currenturl = remove_query_arg('trustchanged',$currenturl);
360
- $htmldata = "";
361
- if(!empty($result)){
362
- foreach($result as $report){
363
- if(empty($report->scan_mode)){
364
- $report->scan_mode="Custom Scan";
365
- }
366
- $repo_count = $report->repo_issues >= 0 ? $report->repo_issues : 0;
367
- $htmldata .= "<tr><td style=text-align:center>".$report->scan_mode."</td>";
368
- $htmldata .= "<td style=text-align:center>";
369
- if(!empty($report->scanned_folders)){
370
- foreach(explode(";",$report->scanned_folders) as $folder){
371
- if(!empty($folder)){
372
- $htmldata .= $folder."<br>";
373
- }
374
- }
375
- }
376
- $htmldata .= "</td><td style=text-align:center>";
377
- $htmldata .= "<span style=color:green id=scan_files>".$report->scanned_files." files scanned<br></span>";
378
- $htmldata .= "<span style=color:red id=malicious_files>".$report->malware_count." malware found<br></span>";
379
- if($report->repo_issues < 0){
380
- $htmldata .= "<span style=color:orange id=malicious_files>Issues with repository check<br></span>";
381
- }
382
- $htmldata .= "<span style=color:orange id=warning_files>".($repo_count+$report->malicious_links)." warnings found</span>";
383
- $htmldata .= "</td><td style=text-align:center id=start_time>".date("M j, Y, g:i:s a",$report->start_timestamp)."</td>";
384
- $htmldata .= "<td><a href='".add_query_arg( array('tab' => 'default', 'view' => $report->id), $currenturl )."'>View Details</a> <a href='".add_query_arg( array('tab' => 'default', 'delete' => $report->id), $currenturl )."'>Delete</a></td>";
385
- $htmldata .= "</tr>";
386
-
387
- }
388
- }else{
389
- $htmldata .= '<tr class="odd"><td valign="top" colspan="5" class="dataTables_empty">No data available in table</td></tr>';
390
- }
391
- wp_send_json($htmldata);
392
-
393
- }
394
- }
395
- new Mo_wpns_scan_malware();
396
- ?>
1
+ <?php
2
+ class Mo_wpns_scan_malware
3
+ {
4
+ function __construct(){
5
+ add_action( 'admin_init' , array( $this, 'mo_wpns_malware_scanner_functions' ) );
6
+
7
+ }
8
+
9
+ public function mo_wpns_malware_scanner_functions(){
10
+ add_action('wp_ajax_mo_wpns_malware_redirect', array( $this, 'mo_wpns_malware_redirect' ));
11
+ }
12
+
13
+ public function mo_wpns_malware_redirect(){
14
+ switch($_POST['call_type'])
15
+ {
16
+ case "submit_malware_settings_form":
17
+ $this->mo_wpns_save_malware_config_form($_POST);
18
+ break;
19
+ case "malware_scan_initiate":
20
+ $this->mo_wpns_start_malware_scan($_POST);
21
+ break;
22
+ case "wpns_enable_tour":
23
+ update_option('skip_tour', 0);
24
+ break;
25
+ case "wpns_disable_tour":
26
+ update_option('skip_tour', 1);
27
+ break;
28
+ case "malware_progress_bar":
29
+ $this->mo_wpns_get_progress();
30
+ break;
31
+ case "malware_scan_last_result":
32
+ $this->mo_wpns_get_scan_result();
33
+ break;
34
+ case "malware_scan_terminate":
35
+ $this->mo_wpns_stop_scan();
36
+ break;
37
+ }
38
+ }
39
+
40
+ public function mo_wpns_save_malware_config_form($POSTED){
41
+ $nonce = $POSTED['nonce'];
42
+ if ( ! wp_verify_nonce( $nonce, 'mo-wpns-scan-settings' ) ){
43
+ wp_send_json('ERROR');
44
+ return;
45
+ }
46
+ if(! isset($POSTED['scan_plugin']) && ! isset($POSTED['scan_themes']) && ! isset($POSTED['scan_core'])){
47
+ wp_send_json('folder_error');
48
+ }elseif (! isset($POSTED['vulnerable_check']) && ! isset($POSTED['sql_check']) && ! isset($POSTED['rfi_check']) && ! isset($POSTED['ext_link']) && ! isset($POSTED['repo_check'])) {
49
+ wp_send_json('level_error');
50
+ }
51
+ else{
52
+ $mo_wpns_scan_plugins=isset($POSTED['scan_plugin']) ? sanitize_text_field($POSTED['scan_plugin']) : 0;
53
+ $mo_wpns_scan_themes=isset($POSTED['scan_themes']) ? sanitize_text_field($POSTED['scan_themes']) : 0;
54
+ $mo_wpns_scan_wp_files= isset($POSTED['scan_core']) ? sanitize_text_field($POSTED['scan_core']) : 0;
55
+ $mo_wpns_scan_files_extensions= sanitize_text_field($POSTED['file_type']);
56
+ $mo_wpns_check_vulnerable_code=isset($POSTED['vulnerable_check']) ? sanitize_text_field($POSTED['vulnerable_check']) : 0;
57
+ $mo_wpns_check_sql_injection=isset($POSTED['sql_check']) ? sanitize_text_field($POSTED['sql_check']) : 0;
58
+ $mo_wpns_check_external_link=isset($POSTED['ext_link']) ? sanitize_text_field($POSTED['ext_link']) : 0;
59
+ $mo_wpns_scan_files_with_repo=isset($POSTED['repo_check']) ? sanitize_text_field($POSTED['repo_check']) : 0;
60
+ $folders_to_skip= sanitize_text_field($POSTED['skip_path']);
61
+ $folders_to_skip = str_replace('\\\\', '/', $folders_to_skip);
62
+ $str="";
63
+
64
+ $mo_wpns_skip_folders="";
65
+ if(!empty($folders_to_skip)){
66
+ $folders_to_skip_array=explode(";",$folders_to_skip);
67
+ for($i=0; $i< count($folders_to_skip_array); $i++){
68
+ if(is_dir($folders_to_skip_array[$i])){
69
+ $str.= $folders_to_skip_array[$i];
70
+ if($i!= count($folders_to_skip_array)-1){
71
+ $str.=";";
72
+ }
73
+ }elseif($folders_to_skip_array[$i] == ''){
74
+ $str.= $folders_to_skip_array[$i];
75
+ }
76
+ else{
77
+ wp_send_json('path_error');
78
+ }
79
+ }
80
+ $mo_wpns_skip_folders=$str;
81
+ }else{
82
+ $mo_wpns_skip_folders=$folders_to_skip;
83
+ }
84
+
85
+ $scan_configuration = array(
86
+ 'plugin_scan' => $mo_wpns_scan_plugins,
87
+ 'theme_scan' => $mo_wpns_scan_themes,
88
+ 'core_scan' => $mo_wpns_scan_wp_files,
89
+ 'file_extension' => $mo_wpns_scan_files_extensions,
90
+ 'check_vulnerable' => $mo_wpns_check_vulnerable_code,
91
+ 'check_sql' => $mo_wpns_check_sql_injection,
92
+ 'ext_link_check' => $mo_wpns_check_external_link,
93
+ 'check_repo' => $mo_wpns_scan_files_with_repo,
94
+ 'path_skip' => $mo_wpns_skip_folders,
95
+ 'type_scan' => "",
96
+ );
97
+
98
+ $encoded_scan_configuration=json_encode($scan_configuration);
99
+ update_option("mo_wpns_scan_configuration",$encoded_scan_configuration);
100
+ wp_send_json('save_success');
101
+ }
102
+ }
103
+
104
+ public function mo_wpns_start_malware_scan($POSTED){
105
+ $decoded_scan_configuration=json_decode(get_option('mo_wpns_scan_status'));
106
+ if(isset($decoded_scan_configuration)){
107
+ $status = $decoded_scan_configuration->scan_progress;
108
+ }else{
109
+ $status=false;
110
+ $scan_mode=false;
111
+ }
112
+ if($status == "IN PROGRESS"){
113
+ wp_send_json('scanning_already');
114
+ }
115
+ global $moWpnsUtility, $mo2f_dirName;
116
+
117
+ $mo_wpns_scan_handler = new Mo_wpns_Scan_Handler_Cron();
118
+ $mo2f_malware_db_handler = new MoWpnsDB();
119
+
120
+ $current_time= time();
121
+ update_option('mo_wpns_last_scan_time', $current_time);
122
+ $plugin_current= get_plugins();
123
+ update_option('mo_wpns_last_plugins', $plugin_current);
124
+ $args=array();
125
+ $theme_current= wp_get_themes($args);
126
+ update_option('mo_wpns_last_themes', $theme_current);
127
+
128
+ update_option('mo2f_scan_initialize', 0);
129
+ update_option('mo_wpns_hide_malware_popup', 1);
130
+
131
+ $mo_wpns_malware_scan_in_progress="IN PROGRESS";
132
+ $mo_wpns_files_scanned=0;
133
+ $mo_wpns_infected_files=0;
134
+ $mo_wpns_warning_files=0;
135
+ $wordpress_download_status=false;
136
+
137
+ update_option('mo_wpns_infected_files',0);
138
+ update_option('mo_wpns_warning_files',0);
139
+
140
+
141
+ $scan_status = array(
142
+ 'scan_progress' => $mo_wpns_malware_scan_in_progress,
143
+ 'files_scanned' => $mo_wpns_files_scanned,
144
+ 'infected_files' => $mo_wpns_infected_files,
145
+ 'warning_files' => $mo_wpns_warning_files,
146
+ 'total_files' => 0,
147
+ 'check_with_repo' => 0,
148
+ 'extlink_check' => 0,
149
+ 'scan_mode' => "",
150
+ 'average_time_each_file' => 0,
151
+ 'total_files_processed' => 0,
152
+ 'status_download_time' => $wordpress_download_status
153
+ );
154
+
155
+ $encoded_scan_status=json_encode($scan_status);
156
+ update_option("mo_wpns_scan_status",$encoded_scan_status);
157
+
158
+
159
+ $mo2f_malware_db_handler->delete_files_parts();
160
+
161
+ if(isset($POSTED['scan']) && $POSTED['scan']=='scan_start'){
162
+ $scan_configuration = array();
163
+ switch($POSTED['scantype'])
164
+ {
165
+ case "quick_scan":
166
+ $nonce = $POSTED['nonce'];
167
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
168
+ wp_send_json('ERROR');
169
+ return;
170
+ }
171
+ $scan_configuration = MoWpnsConstants::$quick_scan_configuration;
172
+ update_option('mo_wpns_scan_mode','quick_scan');
173
+ $scan_status = array(
174
+ 'scan_progress' => $mo_wpns_malware_scan_in_progress,
175
+ 'files_scanned' => $mo_wpns_files_scanned,
176
+ 'infected_files' => $mo_wpns_infected_files,
177
+ 'warning_files' => $mo_wpns_warning_files,
178
+ 'total_files' => 0,
179
+ 'check_with_repo' => 0,
180
+ 'extlink_check' => 0,
181
+ 'average_time_each_file' => 0,
182
+ 'total_files_processed' => 0,
183
+ 'scan_mode' => "quick_scan",
184
+ 'status_download_time' => $wordpress_download_status
185
+ );
186
+
187
+ $encoded_scan_status=json_encode($scan_status);
188
+ update_option("mo_wpns_scan_status",$encoded_scan_status);
189
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
190
+ break;
191
+ case "standard_scan":
192
+ $nonce = $POSTED['nonce'];
193
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
194
+ wp_send_json('ERROR');
195
+ return;
196
+ }
197
+ $scan_configuration = MoWpnsConstants::$standard_scan_configuration;
198
+ update_option('mo_wpns_scan_mode','standard_scan');
199
+ $scan_status = array(
200
+ 'scan_progress' => $mo_wpns_malware_scan_in_progress,
201
+ 'files_scanned' => $mo_wpns_files_scanned,
202
+ 'infected_files' => $mo_wpns_infected_files,
203
+ 'warning_files' => $mo_wpns_warning_files,
204
+ 'total_files' => 0,
205
+ 'check_with_repo' => 1,
206
+ 'extlink_check' => 1,
207
+ 'total_files_processed' => 0,
208
+ 'average_time_each_file' => 0,
209
+ 'scan_mode' => "standard_scan",
210
+ 'status_download_time' => $wordpress_download_status
211
+ );
212
+
213
+ $encoded_scan_status=json_encode($scan_status);
214
+ update_option("mo_wpns_scan_status",$encoded_scan_status);
215
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
216
+ break;
217
+ case "custom_scan":
218
+ $nonce = $POSTED['nonce'];
219
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-nonce' ) ){
220
+ wp_send_json('ERROR');
221
+ return;
222
+ }
223
+ $decode_scan_configuration=json_decode(get_option("mo_wpns_scan_configuration"));
224
+ if(is_null($decode_scan_configuration))
225
+ {
226
+ delete_option("mo_wpns_scan_status",$encoded_scan_status);
227
+ wp_send_json("RECONFIGURE");
228
+ }
229
+
230
+ $scan_configuration = array('plugin_scan' => $decode_scan_configuration->plugin_scan,
231
+ 'theme_scan' => $decode_scan_configuration->theme_scan,
232
+ 'core_scan' => $decode_scan_configuration->core_scan,
233
+ 'file_extension' => $decode_scan_configuration->file_extension,
234
+ 'check_vulnerable' => $decode_scan_configuration->check_vulnerable,
235
+ 'check_sql' => $decode_scan_configuration->check_sql,
236
+ 'ext_link_check' => $decode_scan_configuration->ext_link_check,
237
+ 'check_repo' => $decode_scan_configuration->check_repo,
238
+ 'path_skip' => $decode_scan_configuration->path_skip,
239
+ 'type_scan' => "Custom Scan"
240
+ );
241
+
242
+
243
+ $scan_status = array(
244
+ 'scan_progress' => $mo_wpns_malware_scan_in_progress,
245
+ 'files_scanned' => $mo_wpns_files_scanned,
246
+ 'infected_files' => $mo_wpns_infected_files,
247
+ 'warning_files' => $mo_wpns_warning_files,
248
+ 'total_files' => 0,
249
+ 'extlink_check' => $decode_scan_configuration->ext_link_check,
250
+ 'check_with_repo' => $decode_scan_configuration->check_repo,
251
+ 'average_time_each_file' => 0,
252
+ 'total_files_processed' => 0,
253
+ 'scan_mode' => "custom_scan",
254
+ 'status_download_time' => $wordpress_download_status
255
+ );
256
+
257
+ $encoded_scan_status=json_encode($scan_status);
258
+ update_option("mo_wpns_scan_status",$encoded_scan_status);
259
+ update_option('mo_wpns_scan_mode','custom_scan');
260
+ update_option('mo2f_custom_scan_config', $scan_configuration);
261
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration, $current_time); //recheck
262
+ break;
263
+ }
264
+ }
265
+ }
266
+
267
+
268
+ public function mo_wpns_get_progress(){
269
+
270
+ $decoded_scan_status=json_decode(get_option('mo_wpns_scan_status'));
271
+ $status= $decoded_scan_status->scan_progress;;
272
+ $files_scanned= $decoded_scan_status->files_scanned;
273
+ $total_files = $decoded_scan_status->total_files;
274
+ $check_repo = $decoded_scan_status->check_with_repo;
275
+ $extlink_check = $decoded_scan_status->extlink_check;
276
+ $scan_mode= $decoded_scan_status->scan_mode;
277
+ $status_download= $decoded_scan_status->status_download_time;
278
+ $averageFileScanTime= $decoded_scan_status->average_time_each_file;
279
+ $total_files_processed= $decoded_scan_status->total_files_processed;
280
+ if($status_download != false && $status == "IN PROGRESS"){
281
+ $time_spent_in_downloading= time()-$status_download;
282
+
283
+ if($time_spent_in_downloading > 600){
284
+ $mo2f_malware_db_handler = new MoWpnsDB();
285
+ $reportid= get_option('mo2f_report_id');
286
+ $last_report = $mo2f_malware_db_handler->get_report_with_id($reportid);
287
+ if(!empty($last_report)){
288
+ $response['file_count']= $last_report[0]->scanned_files;
289
+ $response['malware_count'] = $last_report[0]->malware_count;
290
+ $response['repo_issues'] = -96;
291
+ $response['malicious_link'] = $last_report[0]->malicious_links;
292
+
293
+ $mo2f_malware_db_handler->scan_report_complete($reportid, $response['file_count'], $response['malware_count'], $response['repo_issues'], $response['malicious_link']);
294
+ }
295
+
296
+ $scan_handler_obj = new mo2f_scanner_parts;
297
+ $scan_handler_obj->mo2f_end_scan();
298
+ }
299
+ }
300
+ $repo_scan=0;
301
+ if($scan_mode == "standard_scan" || ($scan_mode == "custom_scan" && $check_repo == 1)){
302
+ $repo_scan=1;
303
+ }
304
+ if($status == "IN PROGRESS"){
305
+ $result=array("status"=>$status, "scanned"=>$files_scanned, "total"=>$total_files, "repo_scan"=> $repo_scan,"extlink_check"=> $extlink_check,"AverageFileTime"=>$averageFileScanTime,"total_files_processed"=>$total_files_processed);
306
+ wp_send_json($result);
307
+ }
308
+ else{
309
+ //stop scan check
310
+ $stop_scan=get_option('mo_stop_scan');
311
+
312
+ $mo_wpns_db_handler = new MoWpnsDB();
313
+ $total_scan=$mo_wpns_db_handler->count_files();
314
+ $total_malicious=$mo_wpns_db_handler->count_malicious_files();
315
+ $last_id=$mo_wpns_db_handler->get_last_id();
316
+ $send_id=$last_id[0]->max;
317
+ $last_scan=$mo_wpns_db_handler->count_files_last_scan($send_id);
318
+ $malicious_last_scan= get_option('mo_wpns_infected_files');
319
+ $warning_last_scan = get_option('mo_wpns_warning_files');
320
+ if($total_scan > 999){
321
+ $total_scan=($total_scan/1000);
322
+ $total_scan= round($total_scan,1)."k";
323
+ }
324
+ if($total_malicious > 999){
325
+ $total_malicious=($total_malicious/1000);
326
+ $total_malicious= round($total_malicious,1)."k";
327
+ }
328
+ if($last_scan > 999){
329
+ $last_scan = ($last_scan/1000);
330
+ $last_scan = round($last_scan,1)."k";
331
+ }
332
+ if($stop_scan){
333
+ $status="ABORTED";
334
+ $result = array("status"=>$status, 'total_files'=>$total_scan,"AverageFileTime"=>$averageFileScanTime, 'total_mal'=>$total_malicious, 'scan_files'=>$last_scan, 'mal_files'=>$malicious_last_scan, 'warnings'=>$warning_last_scan,"total_files_processed"=>$total_files_processed);
335
+ wp_send_json($result);
336
+ }
337
+ $result = array("status"=>$status, 'total_files'=>$total_scan, 'total_mal'=>$total_malicious,"AverageFileTime"=>$averageFileScanTime, 'scan_files'=>$total_files, 'mal_files'=>$malicious_last_scan, 'warnings'=>$warning_last_scan,"total_files_processed"=>$total_files_processed);
338
+ wp_send_json($result);
339
+ }
340
+ }
341
+
342
+ function mo_wpns_stop_scan(){
343
+ update_option('mo_stop_scan','1');
344
+ $mo2f_malware_db_handler = new MoWpnsDB();
345
+ $mo2f_malware_db_handler->delete_files_parts();
346
+ wp_send_json('success');
347
+ }
348
+
349
+ function mo_wpns_get_scan_result(){
350
+ $decoded_scan_configuration=json_decode(get_option('mo_wpns_scan_status'));
351
+ $status=$decoded_scan_configuration->scan_progress;
352
+ $mo_wpns_db_handler = new MoWpnsDB();
353
+ $result = $mo_wpns_db_handler->get_report();
354
+ $str1= $_SERVER['REQUEST_URI'];
355
+ $str1= str_replace("admin-ajax.php", "admin.php?page=mo_2fa_malwarescan", $str1);
356
+ $currenturl = remove_query_arg('delete',$str1);
357
+ $currenturl = remove_query_arg('view',$currenturl);
358
+ $currenturl = remove_query_arg('trust',$currenturl);
359
+ $currenturl = remove_query_arg('trustchanged',$currenturl);
360
+ $htmldata = "";
361
+ if(!empty($result)){
362
+ foreach($result as $report){
363
+ if(empty($report->scan_mode)){
364
+ $report->scan_mode="Custom Scan";
365
+ }
366
+ $repo_count = $report->repo_issues >= 0 ? $report->repo_issues : 0;
367
+ $htmldata .= "<tr><td style=text-align:center>".$report->scan_mode."</td>";
368
+ $htmldata .= "<td style=text-align:center>";
369
+ if(!empty($report->scanned_folders)){
370
+ foreach(explode(";",$report->scanned_folders) as $folder){
371
+ if(!empty($folder)){
372
+ $htmldata .= $folder."<br>";
373
+ }
374
+ }
375
+ }
376
+ $htmldata .= "</td><td style=text-align:center>";
377
+ $htmldata .= "<span style=color:green id=scan_files>".$report->scanned_files." files scanned<br></span>";
378
+ $htmldata .= "<span style=color:red id=malicious_files>".$report->malware_count." malware found<br></span>";
379
+ if($report->repo_issues < 0){
380
+ $htmldata .= "<span style=color:orange id=malicious_files>Issues with repository check<br></span>";
381
+ }
382
+ $htmldata .= "<span style=color:orange id=warning_files>".($repo_count+$report->malicious_links)." warnings found</span>";
383
+ $htmldata .= "</td><td style=text-align:center id=start_time>".date("M j, Y, g:i:s a",$report->start_timestamp)."</td>";
384
+ $htmldata .= "<td><a href='".add_query_arg( array('tab' => 'default', 'view' => $report->id), $currenturl )."'>View Details</a> <a href='".add_query_arg( array('tab' => 'default', 'delete' => $report->id), $currenturl )."'>Delete</a></td>";
385
+ $htmldata .= "</tr>";
386
+
387
+ }
388
+ }else{
389
+ $htmldata .= '<tr class="odd"><td valign="top" colspan="5" class="dataTables_empty">No data available in table</td></tr>';
390
+ }
391
+ wp_send_json($htmldata);
392
+
393
+ }
394
+ }
395
+ new Mo_wpns_scan_malware();
396
+ ?>
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/navbar.php CHANGED
@@ -10,7 +10,7 @@
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);
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);
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
@@ -23,9 +23,9 @@
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;
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;
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/support.php CHANGED
@@ -1,51 +1,51 @@
1
- <?php
2
-
3
- global $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_support_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
- if(empty($email))
20
- $email = $current_user->user_email;
21
-
22
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'support.php';
23
-
24
-
25
- /* SUPPORT FORM RELATED FUNCTIONS */
26
-
27
- //Function to handle support form submit
28
- function wpns_handle_support_form($email,$query,$phone)
29
- {
30
-
31
- if( empty($email) || empty($query) )
32
- {
33
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'SUCCESS');
34
- return;
35
- }
36
-
37
-
38
- $query = sanitize_text_field( $query );
39
- $email = sanitize_text_field( $email );
40
- $phone = sanitize_text_field( $phone );
41
- $contact_us = new MocURL();
42
- $submited = json_decode($contact_us->submit_contact_us($email, $phone, $query),true);
43
-
44
- if(json_last_error() == JSON_ERROR_NONE && $submited)
45
- {
46
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
47
- return;
48
- }
49
-
50
- do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
51
  }
1
+ <?php
2
+
3
+ global $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_support_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
+ if(empty($email))
20
+ $email = $current_user->user_email;
21
+
22
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'support.php';
23
+
24
+
25
+ /* SUPPORT FORM RELATED FUNCTIONS */
26
+
27
+ //Function to handle support form submit
28
+ function wpns_handle_support_form($email,$query,$phone)
29
+ {
30
+
31
+ if( empty($email) || empty($query) )
32
+ {
33
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_VALUES'),'SUCCESS');
34
+ return;
35
+ }
36
+
37
+
38
+ $query = sanitize_text_field( $query );
39
+ $email = sanitize_text_field( $email );
40
+ $phone = sanitize_text_field( $phone );
41
+ $contact_us = new MocURL();
42
+ $submited = json_decode($contact_us->submit_contact_us($email, $phone, $query),true);
43
+
44
+ if(json_last_error() == JSON_ERROR_NONE && $submited)
45
+ {
46
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_SENT'),'SUCCESS');
47
+ return;
48
+ }
49
+
50
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('SUPPORT_FORM_ERROR'),'ERROR');
51
  }
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
@@ -1,146 +1,146 @@
1
- <?php
2
- class Mo_wpns_Tour
3
- {
4
- function __construct(){
5
- add_action( 'admin_init' , array( $this, 'mo_wpns_save_tour_details' ) );
6
-
7
- }
8
-
9
- public function mo_wpns_save_tour_details(){
10
- if(isset($_REQUEST['page']))
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;
18
- case 'mo_2fa_waf':
19
- if(!get_option('mo2f_tour_firewall'))
20
- update_option('mo2f_tour_firewall',1);
21
- break;
22
- case 'mo_2fa_login_and_spam':
23
- if(!get_option('mo2f_tour_loginSpam'))
24
- update_option('mo2f_tour_loginSpam',1);
25
- break;
26
-
27
- case 'mo_2fa_backup':
28
- if(!get_option('mo2f_tour_backup'))
29
- update_option('mo2f_tour_backup',1);
30
-
31
- break;
32
- case 'mo_2fa_malwarescan':
33
- if(!get_option('mo2f_tour_malware_scan'))
34
- update_option('mo2f_tour_malware_scan',1);
35
-
36
- break;
37
- case 'mo_2fa_advancedblocking':
38
- if(!get_option('mo2f_tour_advance_blocking'))
39
- update_option('mo2f_tour_advance_blocking',1);
40
- break;
41
-
42
- default:
43
- break;
44
- }
45
- }
46
- add_action('wp_ajax_mo_wpns_tour', array( $this, 'mo_wpns_tour' ));
47
-
48
- }
49
-
50
- public function mo_wpns_tour(){
51
- switch($_POST['call_type'])
52
- {
53
- case "wpns_enable_tour":
54
- update_option('skip_tour', 0);
55
- break;
56
- case "skip_entire_plugin_tour":
57
- $this->handle_skip_entire_plugin();
58
- break;
59
- case 'entire_plugin_tour_started':
60
- $this->entire_plugin_tour_started();
61
- break;
62
- case "mo2f_close_tour_details":
63
- $this->mo2f_close_tour_details();
64
- break;
65
- case "mo2f_visit_page_tour_details":
66
- $this->mo2f_visit_page_tour_details();
67
- break;
68
- case "mo2f_last_visit_tab":
69
- $this->mo2f_last_visit_tab();
70
- break;
71
- }
72
- }
73
-
74
-
75
- function mo2f_last_visit_tab()
76
- {
77
- $lasttab = sanitize_text_field($_POST['tab']);
78
- update_option('mo2f_tour_tab',$lasttab);
79
- }
80
- function mo2f_visit_page_tour_details()
81
- {
82
- $currentPointer = '';
83
- if(isset($_POST['index']))
84
- $currentPointer = sanitize_text_field($_POST['index']);
85
-
86
- if(strpos($currentPointer, 'support') != false)
87
- {
88
- exit;
89
- }
90
- $uid = get_current_user_id();
91
- $visited = get_user_meta($uid,'mo2f_visited_pointers',true);
92
- $visited = $visited.',custom_admin_pointers4_8_52_'.$currentPointer;
93
- update_user_meta($uid,'mo2f_visited_pointers',$visited);
94
- }
95
- function entire_plugin_tour_started()
96
- {
97
- update_option('mo2f_tour_started',3);
98
- exit;
99
- }
100
-
101
- function handle_skip_entire_plugin(){
102
- update_option('mo2f_two_factor_tour',-1);
103
- update_option('mo2f_tour_firewall',-1);
104
- update_option('mo2f_tour_malware_scan',-1);
105
- update_option('mo2f_tour_advance_blocking',-1);
106
- update_option('mo2f_tour_backup',-1);
107
- update_option('mo2f_tour_loginSpam',-1);
108
- update_option('mo2f_tour_started',3);
109
- exit;
110
- }
111
-
112
-
113
- function mo2f_close_tour_details()
114
- {
115
- $uid = get_current_user_id();
116
- delete_user_meta($uid,'mo2f_visited_pointers');
117
- $page = $_POST['page'];
118
- $page = sanitize_text_field($page[0]);
119
- update_option('mo2f_tour_tab','');
120
- update_option("yeah",1);
121
- switch ($page) {
122
- case 'toplevel_page_mo_2fa_two_fa':
123
- update_option('mo2f_two_factor_tour',-1);
124
- break;
125
- case 'miniorange-2-factor_page_mo_2fa_waf':
126
- update_option('mo2f_tour_firewall',-1);
127
- break;
128
- case 'miniorange-2-factor_page_mo_2fa_malwarescan':
129
- update_option('mo2f_tour_malware_scan',-1);
130
- break;
131
- case 'miniorange-2-factor_page_mo_2fa_advancedblocking':
132
- update_option('mo2f_tour_advance_blocking',-1);
133
- break;
134
- case 'miniorange-2-factor_page_mo_2fa_backup':
135
- update_option('mo2f_tour_backup',-1);
136
- break;
137
- case 'miniorange-2-factor_page_mo_2fa_login_and_spam':
138
- update_option('mo2f_tour_loginSpam',-1);
139
- break;
140
- }
141
-
142
- }
143
-
144
- }
145
- new Mo_wpns_Tour();
146
  ?>
1
+ <?php
2
+ class Mo_wpns_Tour
3
+ {
4
+ function __construct(){
5
+ add_action( 'admin_init' , array( $this, 'mo_wpns_save_tour_details' ) );
6
+
7
+ }
8
+
9
+ public function mo_wpns_save_tour_details(){
10
+ if(isset($_REQUEST['page']))
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;
18
+ case 'mo_2fa_waf':
19
+ if(!get_option('mo2f_tour_firewall'))
20
+ update_option('mo2f_tour_firewall',1);
21
+ break;
22
+ case 'mo_2fa_login_and_spam':
23
+ if(!get_option('mo2f_tour_loginSpam'))
24
+ update_option('mo2f_tour_loginSpam',1);
25
+ break;
26
+
27
+ case 'mo_2fa_backup':
28
+ if(!get_option('mo2f_tour_backup'))
29
+ update_option('mo2f_tour_backup',1);
30
+
31
+ break;
32
+ case 'mo_2fa_malwarescan':
33
+ if(!get_option('mo2f_tour_malware_scan'))
34
+ update_option('mo2f_tour_malware_scan',1);
35
+
36
+ break;
37
+ case 'mo_2fa_advancedblocking':
38
+ if(!get_option('mo2f_tour_advance_blocking'))
39
+ update_option('mo2f_tour_advance_blocking',1);
40
+ break;
41
+
42
+ default:
43
+ break;
44
+ }
45
+ }
46
+ add_action('wp_ajax_mo_wpns_tour', array( $this, 'mo_wpns_tour' ));
47
+
48
+ }
49
+
50
+ public function mo_wpns_tour(){
51
+ switch($_POST['call_type'])
52
+ {
53
+ case "wpns_enable_tour":
54
+ update_option('skip_tour', 0);
55
+ break;
56
+ case "skip_entire_plugin_tour":
57
+ $this->handle_skip_entire_plugin();
58
+ break;
59
+ case 'entire_plugin_tour_started':
60
+ $this->entire_plugin_tour_started();
61
+ break;
62
+ case "mo2f_close_tour_details":
63
+ $this->mo2f_close_tour_details();
64
+ break;
65
+ case "mo2f_visit_page_tour_details":
66
+ $this->mo2f_visit_page_tour_details();
67
+ break;
68
+ case "mo2f_last_visit_tab":
69
+ $this->mo2f_last_visit_tab();
70
+ break;
71
+ }
72
+ }
73
+
74
+
75
+ function mo2f_last_visit_tab()
76
+ {
77
+ $lasttab = sanitize_text_field($_POST['tab']);
78
+ update_option('mo2f_tour_tab',$lasttab);
79
+ }
80
+ function mo2f_visit_page_tour_details()
81
+ {
82
+ $currentPointer = '';
83
+ if(isset($_POST['index']))
84
+ $currentPointer = sanitize_text_field($_POST['index']);
85
+
86
+ if(strpos($currentPointer, 'support') != false)
87
+ {
88
+ exit;
89
+ }
90
+ $uid = get_current_user_id();
91
+ $visited = get_user_meta($uid,'mo2f_visited_pointers',true);
92
+ $visited = $visited.',custom_admin_pointers4_8_52_'.$currentPointer;
93
+ update_user_meta($uid,'mo2f_visited_pointers',$visited);
94
+ }
95
+ function entire_plugin_tour_started()
96
+ {
97
+ update_option('mo2f_tour_started',3);
98
+ exit;
99
+ }
100
+
101
+ function handle_skip_entire_plugin(){
102
+ update_option('mo2f_two_factor_tour',-1);
103
+ update_option('mo2f_tour_firewall',-1);
104
+ update_option('mo2f_tour_malware_scan',-1);
105
+ update_option('mo2f_tour_advance_blocking',-1);
106
+ update_option('mo2f_tour_backup',-1);
107
+ update_option('mo2f_tour_loginSpam',-1);
108
+ update_option('mo2f_tour_started',3);
109
+ exit;
110
+ }
111
+
112
+
113
+ function mo2f_close_tour_details()
114
+ {
115
+ $uid = get_current_user_id();
116
+ delete_user_meta($uid,'mo2f_visited_pointers');
117
+ $page = $_POST['page'];
118
+ $page = sanitize_text_field($page[0]);
119
+ update_option('mo2f_tour_tab','');
120
+ update_option("yeah",1);
121
+ switch ($page) {
122
+ case 'toplevel_page_mo_2fa_two_fa':
123
+ update_option('mo2f_two_factor_tour',-1);
124
+ break;
125
+ case 'miniorange-2-factor_page_mo_2fa_waf':
126
+ update_option('mo2f_tour_firewall',-1);
127
+ break;
128
+ case 'miniorange-2-factor_page_mo_2fa_malwarescan':
129
+ update_option('mo2f_tour_malware_scan',-1);
130
+ break;
131
+ case 'miniorange-2-factor_page_mo_2fa_advancedblocking':
132
+ update_option('mo2f_tour_advance_blocking',-1);
133
+ break;
134
+ case 'miniorange-2-factor_page_mo_2fa_backup':
135
+ update_option('mo2f_tour_backup',-1);
136
+ break;
137
+ case 'miniorange-2-factor_page_mo_2fa_login_and_spam':
138
+ update_option('mo2f_tour_loginSpam',-1);
139
+ break;
140
+ }
141
+
142
+ }
143
+
144
+ }
145
+ new Mo_wpns_Tour();
146
  ?>
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_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_fa_rba.php CHANGED
@@ -1,3 +1,3 @@
1
- <?php
2
-
3
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_rba.php';
1
+ <?php
2
+
3
  include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_rba.php';
controllers/twofa/two_fa_unlimittedUser.php CHANGED
@@ -1,3 +1,3 @@
1
- <?php
2
- global $moWpnsUtility, $mo2f_dirName;
3
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_unlimittedUser.php';
1
+ <?php
2
+ global $moWpnsUtility, $mo2f_dirName;
3
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'twofa'.DIRECTORY_SEPARATOR.'two_fa_unlimittedUser.php';
controllers/twofa/two_fa_unlimittedUser_ajax.php CHANGED
@@ -1,47 +1,47 @@
1
- <?php
2
-
3
- class WPNS_unlimittedUser
4
- {
5
- function __construct(){
6
-
7
- add_action( 'admin_init' , array( $this, 'mo_two_fa_unlimittedUser_ajax' ));
8
- }
9
-
10
- function mo_two_fa_unlimittedUser_ajax(){
11
- add_action( 'wp_ajax_wpns_two_fa_unlimittedUser', array($this,'wpns_two_fa_unlimittedUser') );
12
- }
13
-
14
- function wpns_two_fa_unlimittedUser(){
15
- switch($_POST['wpns_unlimittedUser_ajax'])
16
- {
17
- case 'save':
18
- $this->wpns_handle_save(); break;
19
- }
20
- }
21
- function wpns_handle_save()
22
- {
23
-
24
- if ( !wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce') ){
25
- wp_send_json('ERROR');
26
- return;
27
- }
28
- global $wp_roles;
29
- if (!isset($wp_roles))
30
- $wp_roles = new WP_Roles();
31
- foreach($wp_roles->role_names as $id => $name) {
32
- update_option('mo2fa_'.$id, 0);
33
- }
34
- $enabledrole = $_POST['enabledrole'];
35
- foreach($enabledrole as $role){
36
- update_option($role, 1);
37
- }
38
- update_option('mo2fa_author_login_url',$_POST['mo2fa_author_login_url']);
39
- update_option('mo2fa_subscriber_login_url',$_POST['mo2fa_subscriber_login_url']);
40
- update_option('mo2fa_contributor_login_url',$_POST['mo2fa_contributor_login_url']);
41
- update_option('mo2fa_editor_login_url',$_POST['mo2fa_editor_login_url']);
42
- update_option('mo2fa_administrator_login_url',$_POST['mo2fa_administrator_login_url']);
43
- wp_send_json('true');
44
- return;
45
- }
46
- }new WPNS_unlimittedUser();
47
  ?>
1
+ <?php
2
+
3
+ class WPNS_unlimittedUser
4
+ {
5
+ function __construct(){
6
+
7
+ add_action( 'admin_init' , array( $this, 'mo_two_fa_unlimittedUser_ajax' ));
8
+ }
9
+
10
+ function mo_two_fa_unlimittedUser_ajax(){
11
+ add_action( 'wp_ajax_wpns_two_fa_unlimittedUser', array($this,'wpns_two_fa_unlimittedUser') );
12
+ }
13
+
14
+ function wpns_two_fa_unlimittedUser(){
15
+ switch($_POST['wpns_unlimittedUser_ajax'])
16
+ {
17
+ case 'save':
18
+ $this->wpns_handle_save(); break;
19
+ }
20
+ }
21
+ function wpns_handle_save()
22
+ {
23
+
24
+ if ( !wp_verify_nonce($_POST['nonce'],'unlimittedUserNonce') ){
25
+ wp_send_json('ERROR');
26
+ return;
27
+ }
28
+ global $wp_roles;
29
+ if (!isset($wp_roles))
30
+ $wp_roles = new WP_Roles();
31
+ foreach($wp_roles->role_names as $id => $name) {
32
+ update_option('mo2fa_'.$id, 0);
33
+ }
34
+ $enabledrole = $_POST['enabledrole'];
35
+ foreach($enabledrole as $role){
36
+ update_option($role, 1);
37
+ }
38
+ update_option('mo2fa_author_login_url',$_POST['mo2fa_author_login_url']);
39
+ update_option('mo2fa_subscriber_login_url',$_POST['mo2fa_subscriber_login_url']);
40
+ update_option('mo2fa_contributor_login_url',$_POST['mo2fa_contributor_login_url']);
41
+ update_option('mo2fa_editor_login_url',$_POST['mo2fa_editor_login_url']);
42
+ update_option('mo2fa_administrator_login_url',$_POST['mo2fa_administrator_login_url']);
43
+ wp_send_json('true');
44
+ return;
45
+ }
46
+ }new WPNS_unlimittedUser();
47
  ?>
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/waf.php CHANGED
@@ -1,48 +1,48 @@
1
- <?php
2
- global $moWpnsUtility,$mo2f_dirName;
3
- $mo_wpns_handler = new MoWpnsHandler();
4
- $sqlC = $mo_wpns_handler->get_blocked_attacks_count("SQL");
5
- $rceC = $mo_wpns_handler->get_blocked_attacks_count("RCE");
6
- $rfiC = $mo_wpns_handler->get_blocked_attacks_count("RFI");
7
- $lfiC = $mo_wpns_handler->get_blocked_attacks_count("LFI");
8
- $xssC = $mo_wpns_handler->get_blocked_attacks_count("XSS");
9
- $totalAttacks = $sqlC+$lfiC+$rfiC+$xssC+$rceC;
10
- $manualBlocks = $mo_wpns_handler->get_manual_blocked_ip_count();
11
- $realTime = 0;
12
- $countryBlocked = $mo_wpns_handler->get_blocked_countries();
13
- $IPblockedByWAF = $mo_wpns_handler->get_blocked_ip_waf();
14
- $totalIPBlocked = $manualBlocks+$realTime+$IPblockedByWAF;
15
- $mo_waf = get_site_option('WAFEnabled');
16
- if(!get_option('mo2f_tour_firewall'))
17
- update_option('mo2f_tour_firewall',1);
18
- if($mo_waf)
19
- {
20
- $mo_waf = false;
21
- }
22
- else
23
- {
24
- $mo_waf = true;
25
- }
26
-
27
-
28
- $path = dirname(dirname(__FILE__)).'/includes/images/loader.gif';
29
- $path = explode('plugins', $path);
30
-
31
-
32
- $img_loader_url = plugins_url().'/'.$path[1];
33
- if($totalIPBlocked>999)
34
- {
35
- $totalIPBlocked = strval(intval($totalIPBlocked/1000)).'k+';
36
- }
37
-
38
- if($totalAttacks>999)
39
- {
40
- $totalAttacks = strval(intval($totalAttacks/1000)).'k+';
41
- }
42
- update_site_option('mo2f_visit_waf',true);
43
-
44
- include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'waf.php';
45
-
46
-
47
-
48
-
1
+ <?php
2
+ global $moWpnsUtility,$mo2f_dirName;
3
+ $mo_wpns_handler = new MoWpnsHandler();
4
+ $sqlC = $mo_wpns_handler->get_blocked_attacks_count("SQL");
5
+ $rceC = $mo_wpns_handler->get_blocked_attacks_count("RCE");
6
+ $rfiC = $mo_wpns_handler->get_blocked_attacks_count("RFI");
7
+ $lfiC = $mo_wpns_handler->get_blocked_attacks_count("LFI");
8
+ $xssC = $mo_wpns_handler->get_blocked_attacks_count("XSS");
9
+ $totalAttacks = $sqlC+$lfiC+$rfiC+$xssC+$rceC;
10
+ $manualBlocks = $mo_wpns_handler->get_manual_blocked_ip_count();
11
+ $realTime = 0;
12
+ $countryBlocked = $mo_wpns_handler->get_blocked_countries();
13
+ $IPblockedByWAF = $mo_wpns_handler->get_blocked_ip_waf();
14
+ $totalIPBlocked = $manualBlocks+$realTime+$IPblockedByWAF;
15
+ $mo_waf = get_site_option('WAFEnabled');
16
+ if(!get_option('mo2f_tour_firewall'))
17
+ update_option('mo2f_tour_firewall',1);
18
+ if($mo_waf)
19
+ {
20
+ $mo_waf = false;
21
+ }
22
+ else
23
+ {
24
+ $mo_waf = true;
25
+ }
26
+
27
+
28
+ $path = dirname(dirname(__FILE__)).'/includes/images/loader.gif';
29
+ $path = explode('plugins', $path);
30
+
31
+
32
+ $img_loader_url = plugins_url().'/'.$path[1];
33
+ if($totalIPBlocked>999)
34
+ {
35
+ $totalIPBlocked = strval(intval($totalIPBlocked/1000)).'k+';
36
+ }
37
+
38
+ if($totalAttacks>999)
39
+ {
40
+ $totalAttacks = strval(intval($totalAttacks/1000)).'k+';
41
+ }
42
+ update_site_option('mo2f_visit_waf',true);
43
+
44
+ include $mo2f_dirName . 'views'.DIRECTORY_SEPARATOR.'waf.php';
45
+
46
+
47
+
48
+
controllers/wpns-loginsecurity-ajax.php CHANGED
@@ -9,6 +9,20 @@ class wpns_ajax
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(){
@@ -37,6 +51,30 @@ class wpns_ajax
37
 
38
  }
39
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  function wpns_logout_form()
41
  {
42
  global $moWpnsUtility;
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(){
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;
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,88 +1,91 @@
1
- <?php
2
- function setting_file()
3
- {
4
- global $prefix,$dbcon;
5
- $dir_name = dirname(__FILE__);
6
- $dir_name1 = explode('wp-content', $dir_name);
7
- $dir_name = $dir_name1[0];
8
- $filepath = str_replace('\\', '/', $dir_name1[0]);
9
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
10
- $missingFile = 0;
11
- if(!file_exists($fileName))
12
- {
13
- $missingFile = 1;
14
- }
15
- if($missingFile==1)
16
- {
17
- $file = fopen($fileName, "a+");
18
- $string = "<?php".PHP_EOL;
19
- $string .= '$SQL='.get_option("SQLInjection").';'.PHP_EOL;
20
- $string .= '$XSS='.get_option("XSSAttack").';'.PHP_EOL;
21
- $string .= '$RFI='.get_option("RFIAttack").';'.PHP_EOL;
22
- $string .= '$LFI='.get_option("LFIAttack").';'.PHP_EOL;
23
- $string .= '$RCE='.get_option("RCEAttack").';'.PHP_EOL;
24
- $string .= '$RateLimiting='.get_option("Rate_limiting").';'.PHP_EOL;
25
- $string .= '$RequestsPMin='.get_option("Rate_request").';'.PHP_EOL;
26
-
27
- if(get_option('actionRateL') == 0)
28
- $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
29
- else
30
- $string .= '$actionRateL="BlockIP";'.PHP_EOL;
31
-
32
- $string .= '?>'.PHP_EOL;
33
- fwrite($file, $string);
34
- fclose($file);
35
- return $fileName;
36
- }
37
- return "notMissing";
38
-
39
- }
40
-
41
- function getRLEAttack($ipaddress)
42
- {
43
- global $wpdb;
44
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
45
- $results = $wpdb->get_results($query);
46
- return $results[0]->time;
47
- }
48
- function log_attack($ipaddress,$value1,$value)
49
- {
50
- global $wpdb;
51
- $value = htmlspecialchars($value);
52
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
53
- $results = $wpdb->get_results($query);
54
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
55
- $results = $wpdb->get_results($query);
56
- return $results[0]->count;
57
- }
58
-
59
- function CheckRate($ipaddress)
60
- {
61
- global $wpdb;
62
- $time = 60;
63
- clearRate($time);
64
- insertRate($ipaddress);
65
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
66
- $results = $wpdb->get_results($query);
67
-
68
- if(isset($results[0]->count))
69
- {
70
- return $results[0]->count;
71
- }
72
- return 0;
73
-
74
- }
75
- function clearRate($time)
76
- {
77
- global $wpdb;
78
- $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
79
- $results = $wpdb->get_results($query);
80
- }
81
- function insertRate($ipaddress)
82
- {
83
- global $wpdb;
84
- $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
85
- $results = $wpdb->get_results($query);
86
- }
87
-
 
 
 
88
  ?>
1
+ <?php
2
+
3
+ include_once('mo-waf-db-common.php');
4
+ function setting_file()
5
+ {
6
+ global $prefix,$dbcon;
7
+ $dir_name = dirname(__FILE__);
8
+ $dir_name1 = explode('wp-content', $dir_name);
9
+ $dir_name = $dir_name1[0];
10
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
11
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
12
+ $missingFile = 0;
13
+ if(!file_exists($fileName))
14
+ {
15
+ $missingFile = 1;
16
+ }
17
+ if($missingFile==1)
18
+ {
19
+ $file = fopen($fileName, "a+");
20
+ $string = "<?php".PHP_EOL;
21
+ $string .= '$SQL='.get_option("SQLInjection").';'.PHP_EOL;
22
+ $string .= '$XSS='.get_option("XSSAttack").';'.PHP_EOL;
23
+ $string .= '$RFI='.get_option("RFIAttack").';'.PHP_EOL;
24
+ $string .= '$LFI='.get_option("LFIAttack").';'.PHP_EOL;
25
+ $string .= '$RCE='.get_option("RCEAttack").';'.PHP_EOL;
26
+ $string .= '$RateLimiting='.get_option("Rate_limiting").';'.PHP_EOL;
27
+ $string .= '$RequestsPMin='.get_option("Rate_request").';'.PHP_EOL;
28
+
29
+ if(get_option('actionRateL') == 0)
30
+ $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
31
+ else
32
+ $string .= '$actionRateL="BlockIP";'.PHP_EOL;
33
+
34
+ $string .= '?>'.PHP_EOL;
35
+ fwrite($file, $string);
36
+ fclose($file);
37
+ return $fileName;
38
+ }
39
+ return "notMissing";
40
+
41
+ }
42
+
43
+ function getRLEAttack($ipaddress)
44
+ {
45
+ global $wpdb;
46
+ $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
47
+ $results = $wpdb->get_results($query);
48
+ return $results[0]->time;
49
+ }
50
+ function log_attack($ipaddress,$value1,$value)
51
+ {
52
+ global $wpdb;
53
+ $value = htmlspecialchars($value);
54
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
55
+ $results = $wpdb->get_results($query);
56
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
57
+ $results = $wpdb->get_results($query);
58
+ return $results[0]->count;
59
+ }
60
+
61
+
62
+ function CheckRate($ipaddress)
63
+ {
64
+ global $wpdb;
65
+ $time = 60;
66
+ clearRate($time);
67
+ insertRate($ipaddress);
68
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
69
+ $results = $wpdb->get_results($query);
70
+
71
+ if(isset($results[0]->count))
72
+ {
73
+ return $results[0]->count;
74
+ }
75
+ return 0;
76
+
77
+ }
78
+ function clearRate($time)
79
+ {
80
+ global $wpdb;
81
+ $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
82
+ $results = $wpdb->get_results($query);
83
+ }
84
+ function insertRate($ipaddress)
85
+ {
86
+ global $wpdb;
87
+ $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
88
+ $results = $wpdb->get_results($query);
89
+ }
90
+
91
  ?>
handler/WAF/mo-waf-plugin.php CHANGED
@@ -17,6 +17,7 @@
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))
@@ -121,7 +122,7 @@
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
 
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))
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
 
handler/WAF/mo-waf.php CHANGED
@@ -116,7 +116,7 @@
116
  {
117
  if(!is_ip_whitelisted($ipaddress))
118
  {
119
- block_ip($ipaddress,'ALE'); //Attack Limit Exceed
120
  }
121
  }
122
 
116
  {
117
  if(!is_ip_whitelisted($ipaddress))
118
  {
119
+ block_ip($ipaddress,'Attack limit Exceeded'); //Attack Limit Exceed
120
  }
121
  }
122
 
handler/ajax.php CHANGED
@@ -1,137 +1,137 @@
1
- <?php
2
-
3
- class AjaxHandler
4
- {
5
- function __construct()
6
- {
7
- add_action( 'admin_init' , array( $this, 'mo_wpns_2fa_actions' ) );
8
- }
9
-
10
- function mo_wpns_2fa_actions()
11
- {
12
- global $moWpnsUtility,$mo2f_dirName;
13
-
14
- if (current_user_can( 'manage_options' ) && isset( $_REQUEST['option'] ))
15
- {
16
- switch($_REQUEST['option'])
17
- {
18
- case "iplookup":
19
- $this->lookupIP($_GET['ip']); break;
20
-
21
- case "dissmissfeedback":
22
- $this->handle_feedback(); break;
23
- case "dissmissSMTP":
24
- $this->handle_smtp(); break;
25
- case "whitelistself":
26
- $this->whitelist_self(); break;
27
- case "dismissinfected":
28
- $this->wpns_infected_notice(); break;
29
- case "dismissinfected_always":
30
- $this->wpns_infected_notice_always(); break;
31
- case "dismissplugin":
32
- $this->wpns_plugin_notice(); break;
33
- case "dismissplugin_always":
34
- $this->wpns_plugin_notice_always(); break;
35
- case "dismissweekly":
36
- $this->wpns_weekly_notice(); break;
37
- case "dismissweekly_always":
38
- $this->wpns_weekly_notice_always(); break;
39
- }
40
- }
41
- }
42
-
43
- private function lookupIP($ip)
44
- {
45
- $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
46
- $hostname = gethostbyaddr($result["geoplugin_request"]);
47
- try{
48
- $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
49
- $timeoffset = $timeoffset/3600;
50
-
51
- }catch(Exception $e){
52
- $result["geoplugin_timezone"]="";
53
- $timeoffset="";
54
- }
55
-
56
- $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
57
- if($result['geoplugin_request']==$ip) {
58
-
59
- $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
60
- $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
61
- $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
62
- $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
63
- $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
64
- $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
65
- $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
66
- $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
67
- $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
68
- $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
69
- $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
70
- $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
71
- $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
72
- $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
73
-
74
- $result['ipDetails'] = $ipLookUpTemplate;
75
- }else{
76
- $result["ipDetails"]["status"]="ERROR";
77
- }
78
-
79
- wp_send_json( $result );
80
-
81
- }
82
-
83
- private function handle_feedback()
84
- {
85
- update_option('donot_show_feedback_message',1);
86
- wp_send_json('success');
87
- }
88
-
89
- private function whitelist_self()
90
- {
91
- global $moWpnsUtility;
92
- $moPluginsUtility = new MoWpnsHandler();
93
- $moPluginsUtility->whitelist_ip($moWpnsUtility->get_client_ip());
94
- wp_send_json('success');
95
- }
96
-
97
- private function wpns_infected_notice()
98
- {
99
- update_option('infected_dismiss', time());
100
- wp_send_json('success');
101
- }
102
-
103
- private function wpns_infected_notice_always()
104
- {
105
- update_option('donot_show_infected_file_notice', 1);
106
- wp_send_json('success');
107
- }
108
-
109
- private function wpns_plugin_notice()
110
- {
111
- $plugin_current= get_plugins();
112
- update_option('mo_wpns_last_plugins', $plugin_current);
113
- $args=array();
114
- $theme_current= wp_get_themes($args);
115
- update_option('mo_wpns_last_themes', $theme_current);
116
- wp_send_json('success');
117
- }
118
-
119
- private function wpns_plugin_notice_always()
120
- {
121
- update_option('donot_show_new_plugin_theme_notice', 1);
122
- wp_send_json('success');
123
- }
124
-
125
- private function wpns_weekly_notice()
126
- {
127
- update_option('weekly_dismiss', time());
128
- wp_send_json('success');
129
- }
130
-
131
- private function wpns_weekly_notice_always()
132
- {
133
- update_option('donot_show_weekly_scan_notice', 1);
134
- wp_send_json('success');
135
- }
136
-
137
  }new AjaxHandler;
1
+ <?php
2
+
3
+ class AjaxHandler
4
+ {
5
+ function __construct()
6
+ {
7
+ add_action( 'admin_init' , array( $this, 'mo_wpns_2fa_actions' ) );
8
+ }
9
+
10
+ function mo_wpns_2fa_actions()
11
+ {
12
+ global $moWpnsUtility,$mo2f_dirName;
13
+
14
+ if (current_user_can( 'manage_options' ) && isset( $_REQUEST['option'] ))
15
+ {
16
+ switch($_REQUEST['option'])
17
+ {
18
+ case "iplookup":
19
+ $this->lookupIP($_GET['ip']); break;
20
+
21
+ case "dissmissfeedback":
22
+ $this->handle_feedback(); break;
23
+ case "dissmissSMTP":
24
+ $this->handle_smtp(); break;
25
+ case "whitelistself":
26
+ $this->whitelist_self(); break;
27
+ case "dismissinfected":
28
+ $this->wpns_infected_notice(); break;
29
+ case "dismissinfected_always":
30
+ $this->wpns_infected_notice_always(); break;
31
+ case "dismissplugin":
32
+ $this->wpns_plugin_notice(); break;
33
+ case "dismissplugin_always":
34
+ $this->wpns_plugin_notice_always(); break;
35
+ case "dismissweekly":
36
+ $this->wpns_weekly_notice(); break;
37
+ case "dismissweekly_always":
38
+ $this->wpns_weekly_notice_always(); break;
39
+ }
40
+ }
41
+ }
42
+
43
+ private function lookupIP($ip)
44
+ {
45
+ $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
46
+ $hostname = gethostbyaddr($result["geoplugin_request"]);
47
+ try{
48
+ $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
49
+ $timeoffset = $timeoffset/3600;
50
+
51
+ }catch(Exception $e){
52
+ $result["geoplugin_timezone"]="";
53
+ $timeoffset="";
54
+ }
55
+
56
+ $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
57
+ if($result['geoplugin_request']==$ip) {
58
+
59
+ $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
60
+ $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
61
+ $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
62
+ $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
63
+ $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
64
+ $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
65
+ $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
66
+ $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
67
+ $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
68
+ $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
69
+ $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
70
+ $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
71
+ $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
72
+ $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
73
+
74
+ $result['ipDetails'] = $ipLookUpTemplate;
75
+ }else{
76
+ $result["ipDetails"]["status"]="ERROR";
77
+ }
78
+
79
+ wp_send_json( $result );
80
+
81
+ }
82
+
83
+ private function handle_feedback()
84
+ {
85
+ update_option('donot_show_feedback_message',1);
86
+ wp_send_json('success');
87
+ }
88
+
89
+ private function whitelist_self()
90
+ {
91
+ global $moWpnsUtility;
92
+ $moPluginsUtility = new MoWpnsHandler();
93
+ $moPluginsUtility->whitelist_ip($moWpnsUtility->get_client_ip());
94
+ wp_send_json('success');
95
+ }
96
+
97
+ private function wpns_infected_notice()
98
+ {
99
+ update_option('infected_dismiss', time());
100
+ wp_send_json('success');
101
+ }
102
+
103
+ private function wpns_infected_notice_always()
104
+ {
105
+ update_option('donot_show_infected_file_notice', 1);
106
+ wp_send_json('success');
107
+ }
108
+
109
+ private function wpns_plugin_notice()
110
+ {
111
+ $plugin_current= get_plugins();
112
+ update_option('mo_wpns_last_plugins', $plugin_current);
113
+ $args=array();
114
+ $theme_current= wp_get_themes($args);
115
+ update_option('mo_wpns_last_themes', $theme_current);
116
+ wp_send_json('success');
117
+ }
118
+
119
+ private function wpns_plugin_notice_always()
120
+ {
121
+ update_option('donot_show_new_plugin_theme_notice', 1);
122
+ wp_send_json('success');
123
+ }
124
+
125
+ private function wpns_weekly_notice()
126
+ {
127
+ update_option('weekly_dismiss', time());
128
+ wp_send_json('success');
129
+ }
130
+
131
+ private function wpns_weekly_notice_always()
132
+ {
133
+ update_option('donot_show_weekly_scan_notice', 1);
134
+ wp_send_json('success');
135
+ }
136
+
137
  }new AjaxHandler;
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
@@ -1,354 +1,354 @@
1
- <?php
2
- class LoginHandler
3
- {
4
- function __construct()
5
- {
6
- add_action( 'init' , array( $this, 'mo_wpns_init' ) );
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
-
14
- remove_filter('authenticate' , 'wp_authenticate_username_password' ,20 );
15
- add_filter ('authenticate' , array( $this, 'custom_authenticate' ) ,1, 3 );
16
- }
17
-
18
- add_action('wp_login' , array( $this, 'mo_wpns_login_success' ) );
19
- add_action('wp_login_failed' , array( $this, 'mo_wpns_login_failed' ) );
20
- //add_action('auth_cookie_bad_username', array( $this, 'mo_wpns_login_failed' ) );
21
- //add_action('auth_cookie_bad_hash' , array( $this, 'mo_wpns_login_failed' ) );
22
-
23
- if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration') ){
24
- add_action( 'woocommerce_register_post', array( $this,'wooc_validate_user_captcha_register'), 1, 3);
25
- }
26
- }
27
-
28
- function mo_block_restAPI(){
29
- global $moWpnsUtility,$mo2f_dirName;
30
- if(strpos($_SERVER['REQUEST_URI'], '/wp-json/wp/v2/users')){
31
- include_once("mo-block.html");
32
- exit;
33
- }
34
- }
35
-
36
- function mo_wpns_init()
37
- {
38
-
39
- global $moWpnsUtility,$mo2f_dirName;
40
- $WAFEnabled = get_option('WAFEnabled');
41
- $WAFLevel = get_option('WAF');
42
-
43
- $mo2f_scanner_parts = new mo2f_scanner_parts();
44
- $mo2f_scanner_parts->file_cron_scan();
45
-
46
- if($WAFEnabled == 1)
47
- {
48
- if($WAFLevel == 'PluginLevel')
49
- {
50
- if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php'))
51
- include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php');
52
- else
53
- {
54
- //UNable to find file. Please reconfigure.
55
- }
56
- }
57
- }
58
-
59
-
60
- $userIp = $moWpnsUtility->get_client_ip();
61
- $mo_wpns_config = new MoWpnsHandler();
62
- $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
63
- $isIpBlocked = false;
64
- if(!$isWhitelisted){
65
- $isIpBlocked = $mo_wpns_config->is_ip_blocked_in_anyway($userIp);
66
- }
67
- if($isIpBlocked){
68
- include_once("mo-block.html");
69
- exit;
70
- }
71
-
72
- $requested_uri = $_SERVER["REQUEST_URI"];
73
- $option = false;
74
- if (is_user_logged_in()) { //chr?
75
- if (strpos($requested_uri, chr(get_option('login_page_url'))) != false) {
76
- wp_redirect(site_url());
77
- die;
78
- }
79
- } else {
80
- $option = get_option('mo_wpns_enable_rename_login_url');
81
- }
82
- if ($option) {
83
- if (strpos($requested_uri, '/wp-login.php?checkemail=confirm') !== false) {
84
- $requested_uri = str_replace("wp-login.php","",$requested_uri);
85
- wp_redirect($requested_uri);
86
- die;
87
- } else if (strpos($requested_uri, '/wp-login.php?checkemail=registered') !== false) {
88
- $requested_uri = str_replace("wp-login.php","",$requested_uri);
89
- wp_redirect($requested_uri);
90
- die;
91
- }
92
-
93
- if (strpos($requested_uri, '/wp-login.php') !== false) {
94
- wp_redirect(site_url());
95
- }
96
- else if (strpos($requested_uri, get_option('login_page_url')) !== false ) {
97
- @require_once ABSPATH . 'wp-login.php';
98
- die;
99
- }
100
- }
101
-
102
- if(isset($_POST['option']))
103
- {
104
- switch($_POST['option'])
105
- {
106
- case "mo_wpns_change_password":
107
- $this->handle_change_password($_POST['username']
108
- ,$_POST['new_password'],$_POST['confirm_password']);
109
- break;
110
- }
111
- }
112
-
113
- }
114
-
115
- function wooc_validate_user_captcha_register($username, $email, $validation_errors) {
116
-
117
- if (empty($_POST['g-recaptcha-response'])) {
118
- $validation_errors->add( 'woocommerce_recaptcha_error', __('Please verify the captcha', 'woocommerce' ) );
119
- }
120
- }
121
-
122
- //Function to Handle Change Password Form
123
- function handle_change_password($username,$newpassword,$confirmpassword)
124
- {
125
- global $mo2f_dirName;
126
- $user = get_user_by("login",$username);
127
- $error = wp_authenticate_username_password($user,$username,$newpassword);
128
-
129
- if(is_wp_error($error))
130
- {
131
- $this->mo_wpns_login_failed($username);
132
- return $error;
133
- }
134
-
135
- if($this->update_strong_password($username,$newpassword,$confirmpassword)=="success")
136
- {
137
- wp_set_auth_cookie($user->ID,false,false);
138
- $this->mo_wpns_login_success($username);
139
- wp_redirect(get_site_option('siteurl'),301);
140
- }
141
- }
142
-
143
-
144
- //Function to Update User password
145
- function update_strong_password($username,$newpassword,$confirmpassword)
146
- {
147
- global $mo2f_dirName;
148
-
149
- if(strlen($newpassword) > 5 && preg_match("#[0-9]+#", $newpassword) && preg_match("#[a-zA-Z]+#", $newpassword)
150
- && preg_match('/[^a-zA-Z\d]/', $newpassword) && $newpassword==$confirmpassword)
151
- {
152
- $user = get_user_by("login",$username);
153
- wp_set_password($_POST['new_password'],$user->ID);
154
- return "success";
155
- }
156
- else
157
- include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
158
- }
159
-
160
-
161
- //Our custom logic for user authentication
162
- function custom_authenticate($user, $username, $password)
163
- {
164
- global $moWpnsUtility;
165
- $error = new WP_Error();
166
-
167
- if(empty($username) && empty ($password))
168
- return $error;
169
-
170
- if(empty($username)) {
171
- $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
172
- }
173
- if(empty($password)) {
174
- $error->add('empty_password', __('<strong>ERROR</strong>: Invalid username or Password.'));
175
- }
176
-
177
- $user = wp_authenticate_username_password( $user, $username, $password );
178
-
179
- if ( is_wp_error( $user ) ) {
180
- $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
181
- return $user;
182
- }
183
- if(empty($error->errors))
184
- {
185
- $user = get_user_by("login",$username);
186
-
187
- if($user)
188
- {
189
- if(get_option('mo_wpns_activate_recaptcha_for_login'))
190
- $recaptchaError = $moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response']);
191
-
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
- }
199
- return $user;
200
- }
201
- }
202
- else
203
- $error->add('empty_password', __('<strong>ERROR</strong>: Invalid Username or password.'));
204
-
205
- }
206
-
207
- return $error;
208
- }
209
-
210
-
211
- //Function to check user password
212
- function check_password($user,$error,$password)
213
- {
214
- global $moWpnsUtility, $mo2f_dirName;
215
- if ( wp_check_password( $password, $user->data->user_pass, $user->ID) )
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
- }
223
- else
224
- include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
225
- }
226
- else
227
- $error->add('empty_password', __('<strong>ERROR</strong>: Wrong password.'));
228
-
229
- return $error;
230
- }
231
-
232
-
233
- //Function to handle successful user login
234
- function mo_wpns_login_success($username)
235
- {
236
- global $moWpnsUtility;
237
-
238
- $mo_wpns_config = new MoWpnsHandler();
239
- $userIp = $moWpnsUtility->get_client_ip();
240
-
241
- $mo_wpns_config->move_failed_transactions_to_past_failed($userIp);
242
-
243
- if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
244
- $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::LOGGED_IN_FROM_NEW_IP);
245
-
246
-
247
- $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::SUCCESS);
248
-
249
- if(isset($_POST['log']) && isset($_POST['pwd'])){
250
- $username = $_POST['log'];
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);
258
- $count = get_site_option('users_with_weak_pass');
259
- $count = $count + 1;
260
- update_site_option('users_with_weak_pass', $count);
261
- }
262
- }
263
- else{
264
- if(get_user_meta($user->ID,'password_strong?')){
265
- $count = get_site_option('users_with_weak_pass');
266
- $count = $count - 1;
267
- update_site_option('users_with_weak_pass', $count);
268
- }
269
- delete_user_meta($user->ID,'password_strong?');
270
- }
271
-
272
-
273
- }
274
-
275
- }
276
- }
277
-
278
-
279
- //Function to handle failed user login attempt
280
- function mo_wpns_login_failed($username)
281
- {
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();
289
- $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
290
-
291
- $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::FAILED);
292
-
293
- if(!$isWhitelisted)
294
- {
295
-
296
-
297
- if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
298
- $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP);
299
-
300
- $failedAttempts = $mo_wpns_config->get_failed_attempts_count($userIp);
301
- $allowedLoginAttepts = get_option('mo2f_allwed_login_attempts') ? get_option('mo2f_allwed_login_attempts') : 10;
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
-
309
- }
310
-
311
-
312
-
313
-
314
-
315
- //Function to show number of attempts remaining
316
- function show_limit_login_left($allowedLoginAttepts,$failedAttempts)
317
- {
318
- global $error;
319
- $diff = $allowedLoginAttepts - $failedAttempts;
320
- $error = "<br>You have <b>".$diff."</b> login attempts remaining.";
321
- }
322
-
323
-
324
- //Function to handle login limit exceeded
325
- function handle_login_attempt_exceeded($userIp)
326
- {
327
- global $moWpnsUtility, $mo2f_dirName;
328
- $mo_wpns_config = new MoWpnsHandler();
329
- $mo_wpns_config->block_ip($userIp, MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED, false);
330
- include_once("mo-block.html");
331
- exit;
332
-
333
- }
334
-
335
- function setup_registration_closed($user){
336
- global $Mo2fdbQueries;
337
- if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
338
- $nonce = $_POST['mo2f_registration_closed_nonce'];
339
- if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
340
- $error = new WP_Error();
341
- $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
342
- return $error;
343
- } else {
344
- if(!$Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID) =='MO_2_FACTOR_PLUGIN_SETTINGS'){
345
- //$Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => '' ) );
346
- delete_user_meta( $user->ID, 'register_account_popup' );
347
-
348
- }
349
- }
350
- }
351
- }
352
-
353
- }
354
- new LoginHandler;
1
+ <?php
2
+ class LoginHandler
3
+ {
4
+ function __construct()
5
+ {
6
+ add_action( 'init' , array( $this, 'mo_wpns_init' ) );
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
+
14
+ remove_filter('authenticate' , 'wp_authenticate_username_password' ,20 );
15
+ add_filter ('authenticate' , array( $this, 'custom_authenticate' ) ,1, 3 );
16
+ }
17
+
18
+ add_action('wp_login' , array( $this, 'mo_wpns_login_success' ) );
19
+ add_action('wp_login_failed' , array( $this, 'mo_wpns_login_failed' ) );
20
+ //add_action('auth_cookie_bad_username', array( $this, 'mo_wpns_login_failed' ) );
21
+ //add_action('auth_cookie_bad_hash' , array( $this, 'mo_wpns_login_failed' ) );
22
+
23
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration') ){
24
+ add_action( 'woocommerce_register_post', array( $this,'wooc_validate_user_captcha_register'), 1, 3);
25
+ }
26
+ }
27
+
28
+ function mo_block_restAPI(){
29
+ global $moWpnsUtility,$mo2f_dirName;
30
+ if(strpos($_SERVER['REQUEST_URI'], '/wp-json/wp/v2/users')){
31
+ include_once("mo-block.html");
32
+ exit;
33
+ }
34
+ }
35
+
36
+ function mo_wpns_init()
37
+ {
38
+
39
+ global $moWpnsUtility,$mo2f_dirName;
40
+ $WAFEnabled = get_option('WAFEnabled');
41
+ $WAFLevel = get_option('WAF');
42
+
43
+ $mo2f_scanner_parts = new mo2f_scanner_parts();
44
+ $mo2f_scanner_parts->file_cron_scan();
45
+
46
+ if($WAFEnabled == 1)
47
+ {
48
+ if($WAFLevel == 'PluginLevel')
49
+ {
50
+ if(file_exists($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php'))
51
+ include_once($mo2f_dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php');
52
+ else
53
+ {
54
+ //UNable to find file. Please reconfigure.
55
+ }
56
+ }
57
+ }
58
+
59
+
60
+ $userIp = $moWpnsUtility->get_client_ip();
61
+ $mo_wpns_config = new MoWpnsHandler();
62
+ $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
63
+ $isIpBlocked = false;
64
+ if(!$isWhitelisted){
65
+ $isIpBlocked = $mo_wpns_config->is_ip_blocked_in_anyway($userIp);
66
+ }
67
+ if($isIpBlocked){
68
+ include_once("mo-block.html");
69
+ exit;
70
+ }
71
+
72
+ $requested_uri = $_SERVER["REQUEST_URI"];
73
+ $option = false;
74
+ if (is_user_logged_in()) { //chr?
75
+ if (strpos($requested_uri, chr(get_option('login_page_url'))) != false) {
76
+ wp_redirect(site_url());
77
+ die;
78
+ }
79
+ } else {
80
+ $option = get_option('mo_wpns_enable_rename_login_url');
81
+ }
82
+ if ($option) {
83
+ if (strpos($requested_uri, '/wp-login.php?checkemail=confirm') !== false) {
84
+ $requested_uri = str_replace("wp-login.php","",$requested_uri);
85
+ wp_redirect($requested_uri);
86
+ die;
87
+ } else if (strpos($requested_uri, '/wp-login.php?checkemail=registered') !== false) {
88
+ $requested_uri = str_replace("wp-login.php","",$requested_uri);
89
+ wp_redirect($requested_uri);
90
+ die;
91
+ }
92
+
93
+ if (strpos($requested_uri, '/wp-login.php') !== false) {
94
+ wp_redirect(site_url());
95
+ }
96
+ else if (strpos($requested_uri, get_option('login_page_url')) !== false ) {
97
+ @require_once ABSPATH . 'wp-login.php';
98
+ die;
99
+ }
100
+ }
101
+
102
+ if(isset($_POST['option']))
103
+ {
104
+ switch($_POST['option'])
105
+ {
106
+ case "mo_wpns_change_password":
107
+ $this->handle_change_password($_POST['username']
108
+ ,$_POST['new_password'],$_POST['confirm_password']);
109
+ break;
110
+ }
111
+ }
112
+
113
+ }
114
+
115
+ function wooc_validate_user_captcha_register($username, $email, $validation_errors) {
116
+
117
+ if (empty($_POST['g-recaptcha-response'])) {
118
+ $validation_errors->add( 'woocommerce_recaptcha_error', __('Please verify the captcha', 'woocommerce' ) );
119
+ }
120
+ }
121
+
122
+ //Function to Handle Change Password Form
123
+ function handle_change_password($username,$newpassword,$confirmpassword)
124
+ {
125
+ global $mo2f_dirName;
126
+ $user = get_user_by("login",$username);
127
+ $error = wp_authenticate_username_password($user,$username,$newpassword);
128
+
129
+ if(is_wp_error($error))
130
+ {
131
+ $this->mo_wpns_login_failed($username);
132
+ return $error;
133
+ }
134
+
135
+ if($this->update_strong_password($username,$newpassword,$confirmpassword)=="success")
136
+ {
137
+ wp_set_auth_cookie($user->ID,false,false);
138
+ $this->mo_wpns_login_success($username);
139
+ wp_redirect(get_site_option('siteurl'),301);
140
+ }
141
+ }
142
+
143
+
144
+ //Function to Update User password
145
+ function update_strong_password($username,$newpassword,$confirmpassword)
146
+ {
147
+ global $mo2f_dirName;
148
+
149
+ if(strlen($newpassword) > 5 && preg_match("#[0-9]+#", $newpassword) && preg_match("#[a-zA-Z]+#", $newpassword)
150
+ && preg_match('/[^a-zA-Z\d]/', $newpassword) && $newpassword==$confirmpassword)
151
+ {
152
+ $user = get_user_by("login",$username);
153
+ wp_set_password($_POST['new_password'],$user->ID);
154
+ return "success";
155
+ }
156
+ else
157
+ include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
158
+ }
159
+
160
+
161
+ //Our custom logic for user authentication
162
+ function custom_authenticate($user, $username, $password)
163
+ {
164
+ global $moWpnsUtility;
165
+ $error = new WP_Error();
166
+
167
+ if(empty($username) && empty ($password))
168
+ return $error;
169
+
170
+ if(empty($username)) {
171
+ $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
172
+ }
173
+ if(empty($password)) {
174
+ $error->add('empty_password', __('<strong>ERROR</strong>: Invalid username or Password.'));
175
+ }
176
+
177
+ $user = wp_authenticate_username_password( $user, $username, $password );
178
+
179
+ if ( is_wp_error( $user ) ) {
180
+ $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
181
+ return $user;
182
+ }
183
+ if(empty($error->errors))
184
+ {
185
+ $user = get_user_by("login",$username);
186
+
187
+ if($user)
188
+ {
189
+ if(get_option('mo_wpns_activate_recaptcha_for_login'))
190
+ $recaptchaError = $moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response']);
191
+
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
+ }
199
+ return $user;
200
+ }
201
+ }
202
+ else
203
+ $error->add('empty_password', __('<strong>ERROR</strong>: Invalid Username or password.'));
204
+
205
+ }
206
+
207
+ return $error;
208
+ }
209
+
210
+
211
+ //Function to check user password
212
+ function check_password($user,$error,$password)
213
+ {
214
+ global $moWpnsUtility, $mo2f_dirName;
215
+ if ( wp_check_password( $password, $user->data->user_pass, $user->ID) )
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
+ }
223
+ else
224
+ include $mo2f_dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
225
+ }
226
+ else
227
+ $error->add('empty_password', __('<strong>ERROR</strong>: Wrong password.'));
228
+
229
+ return $error;
230
+ }
231
+
232
+
233
+ //Function to handle successful user login
234
+ function mo_wpns_login_success($username)
235
+ {
236
+ global $moWpnsUtility;
237
+
238
+ $mo_wpns_config = new MoWpnsHandler();
239
+ $userIp = $moWpnsUtility->get_client_ip();
240
+
241
+ $mo_wpns_config->move_failed_transactions_to_past_failed($userIp);
242
+
243
+ if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
244
+ $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::LOGGED_IN_FROM_NEW_IP);
245
+
246
+
247
+ $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::SUCCESS);
248
+
249
+ if(isset($_POST['log']) && isset($_POST['pwd'])){
250
+ $username = $_POST['log'];
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);
258
+ $count = get_site_option('users_with_weak_pass');
259
+ $count = $count + 1;
260
+ update_site_option('users_with_weak_pass', $count);
261
+ }
262
+ }
263
+ else{
264
+ if(get_user_meta($user->ID,'password_strong?')){
265
+ $count = get_site_option('users_with_weak_pass');
266
+ $count = $count - 1;
267
+ update_site_option('users_with_weak_pass', $count);
268
+ }
269
+ delete_user_meta($user->ID,'password_strong?');
270
+ }
271
+
272
+
273
+ }
274
+
275
+ }
276
+ }
277
+
278
+
279
+ //Function to handle failed user login attempt
280
+ function mo_wpns_login_failed($username)
281
+ {
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();
289
+ $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
290
+
291
+ $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::FAILED);
292
+
293
+ if(!$isWhitelisted)
294
+ {
295
+
296
+
297
+ if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
298
+ $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP);
299
+
300
+ $failedAttempts = $mo_wpns_config->get_failed_attempts_count($userIp);
301
+ $allowedLoginAttepts = get_option('mo2f_allwed_login_attempts') ? get_option('mo2f_allwed_login_attempts') : 10;
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
+
309
+ }
310
+
311
+
312
+
313
+
314
+
315
+ //Function to show number of attempts remaining
316
+ function show_limit_login_left($allowedLoginAttepts,$failedAttempts)
317
+ {
318
+ global $error;
319
+ $diff = $allowedLoginAttepts - $failedAttempts;
320
+ $error = "<br>You have <b>".$diff."</b> login attempts remaining.";
321
+ }
322
+
323
+
324
+ //Function to handle login limit exceeded
325
+ function handle_login_attempt_exceeded($userIp)
326
+ {
327
+ global $moWpnsUtility, $mo2f_dirName;
328
+ $mo_wpns_config = new MoWpnsHandler();
329
+ $mo_wpns_config->block_ip($userIp, MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED, false);
330
+ include_once("mo-block.html");
331
+ exit;
332
+
333
+ }
334
+
335
+ function setup_registration_closed($user){
336
+ global $Mo2fdbQueries;
337
+ if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
338
+ $nonce = $_POST['mo2f_registration_closed_nonce'];
339
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
340
+ $error = new WP_Error();
341
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
342
+ return $error;
343
+ } else {
344
+ if(!$Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID) =='MO_2_FACTOR_PLUGIN_SETTINGS'){
345
+ //$Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => '' ) );
346
+ delete_user_meta( $user->ID, 'register_account_popup' );
347
+
348
+ }
349
+ }
350
+ }
351
+ }
352
+
353
+ }
354
+ new LoginHandler;
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/mo-waf-plugin.php CHANGED
@@ -1,410 +1,410 @@
1
- <?php
2
-
3
- $dir =dirname(__FILE__);
4
- $dir = str_replace('\\', "/", $dir);
5
- $sqlInjectionFile = $dir.'/signature/APSQLI.php';
6
- $xssFile = $dir.'/signature/APXSS.php';
7
- $lfiFile = $dir.'/signature/APLFI.php';
8
- $configfilepath = explode('wp-content', $dir);
9
- $configfile = $configfilepath[0].'/wp-includes/mo-waf-config.php';
10
-
11
- $missingFile = 0;
12
-
13
- if(file_exists($configfile))
14
- {
15
- include($configfile);
16
- }
17
- else
18
- {
19
- $missingFile = 1;
20
- }
21
- include_once($sqlInjectionFile);
22
- include_once($xssFile);
23
- include_once($lfiFile);
24
-
25
-
26
- global $wpdb;
27
- $ipaddress = '';
28
- if (isset($_SERVER['HTTP_CLIENT_IP']))
29
- $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
30
- else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
31
- $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
32
- else if(isset($_SERVER['HTTP_X_FORWARDED']))
33
- $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
34
- else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
35
- $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
36
- else if(isset($_SERVER['HTTP_FORWARDED']))
37
- $ipaddress = $_SERVER['HTTP_FORWARDED'];
38
- else if(isset($_SERVER['REMOTE_ADDR']))
39
- $ipaddress = $_SERVER['REMOTE_ADDR'];
40
- else
41
- $ipaddress = 'UNKNOWN';
42
-
43
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
44
- $results = $wpdb->get_results($query);
45
-
46
- if(sizeof($results)!=0)
47
- {
48
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
49
- $results1 = $wpdb->get_results($query);
50
- if(sizeof($results1)!=0)
51
- {
52
- //IP whitelisted
53
- }
54
- else
55
- {
56
- header('HTTP/1.1 403 Forbidden');
57
- include_once("mo-block.html");
58
- exit;
59
- }
60
- }
61
- $dir_name = dirname(__FILE__);
62
- $dir_name1 = explode('wp-content', $dir_name);
63
- $dir_name = $dir_name1[0];
64
- $filepath = str_replace('\\', '/', $dir_name1[0]);
65
- $fileName = $filepath.'/wp-includes/mo-waf-config.php';
66
-
67
- if($missingFile==1)
68
- {
69
- if(!file_exists($fileName))
70
- {
71
- $file = fopen($fileName, "a+");
72
- $string = "<?php".PHP_EOL;
73
- $string .= '$SQL = '.get_option("SQLInjection").';'.PHP_EOL;
74
- $string .= '$XSS = '.get_option("XSSAttack").';'.PHP_EOL;
75
- $string .= '$RFI = '.get_option("RFIAttack").';'.PHP_EOL;
76
- $string .= '$LFI = '.get_option("LFIAttack").';'.PHP_EOL;
77
- $string .= '$RCE = '.get_option("RCEAttack").';'.PHP_EOL;
78
- $string .= '$RateLimiting = '.get_option("Rate_limiting").';'.PHP_EOL;
79
- $string .= '$RequestsPMin = '.get_option("Rate_request").';'.PHP_EOL;
80
-
81
- if(get_option('actionRateL') == 0)
82
- $string .= '$actionRateL = "ThrottleIP";'.PHP_EOL;
83
- else
84
- $string .= '$actionRateL = "BlockIP";'.PHP_EOL;
85
-
86
- $string .= '?>'.PHP_EOL;
87
- fwrite($file, $string);
88
- fclose($file);
89
-
90
- }
91
-
92
- }
93
- include_once($fileName);
94
-
95
-
96
- if($RateLimiting == 1)
97
- {
98
- $time = 60;
99
- $reqLimit = $RequestsPMin;
100
-
101
- $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
102
- $results = $wpdb->get_results($query);
103
-
104
- $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
105
- $results = $wpdb->get_results($query);
106
-
107
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
108
- $results = $wpdb->get_results($query);
109
-
110
- if($results[0]->count>=$reqLimit)
111
- {
112
- $action = $actionRateL;
113
- if($action == 'ThrottleIP')
114
- {
115
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
116
- $results = $wpdb->get_results($query);
117
- $current_time = time();
118
- if($results[0]->time < $current_time-60)
119
- {
120
- $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
121
- $results = $wpdb->get_results($query);
122
- }
123
- header('HTTP/1.1 403 Forbidden');
124
- include_once("mo-error.html");
125
- exit;
126
- }
127
- else
128
- {
129
- $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
130
- $results = $wpdb->get_results($query);
131
- $current_time = time();
132
- if($results[0]->time < $current_time-60)
133
- {
134
- $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
135
- $results = $wpdb->get_results($query);
136
- }
137
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
138
- $results1 = $wpdb->get_results($query);
139
- if(sizeof($results1)!=0)
140
- {
141
- //IP whitelisted
142
- }
143
- else
144
- {
145
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','Rate limit exceed',NULL,".current_time( 'timestamp' ).");";
146
- $results =$wpdb->get_results($query);
147
- }
148
- header('HTTP/1.1 403 Forbidden');
149
- include_once("mo-error.html");
150
- exit;
151
- }
152
- }
153
- }
154
- $attack = array();
155
- if($SQL==1)
156
- {
157
- array_push($attack,"SQL");
158
- }
159
- if($XSS==1)
160
- {
161
- array_push($attack,"XSS");
162
- }
163
- if($LFI==1)
164
- {
165
- array_push($attack,"LFI");
166
- }
167
-
168
- $attackC = $attack;
169
- $ParanoiaLevel = 1;
170
- $annomalyS = 0;
171
- $SQLScore = 0;
172
- $XSSScore = 0;
173
- $limitAttack = get_option('limitAttack');
174
-
175
-
176
- foreach ($attackC as $key1 => $value1) {
177
- for($lev=1;$lev<=$ParanoiaLevel;$lev++)
178
- {
179
- if(isset($regex[$value1][$lev]))
180
- {
181
- for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
182
- {
183
- foreach ($_REQUEST as $key => $value) {
184
- if($regex[$value1][$lev][$i] != "")
185
- {
186
- if(strpos($regex[$value1][$lev][$i], '/') == false)
187
- {
188
- if(is_string($value))
189
- {
190
-
191
- if(preg_match('/'.$regex[$value1][$lev][$i].'/', $value))
192
- {
193
- $scoreValue = 0;
194
-
195
- $annomalyMS = $score[$value1][$lev][$i];
196
- if(strcmp($annomalyMS,"CRITICAL")==0)
197
- {
198
- $scoreValue = 5;
199
- }
200
-
201
- elseif(strcmp($annomalyMS,"WARNING")==0)
202
- {
203
- $scoreValue = 3;
204
- }
205
- elseif(strcmp($annomalyMS,"ERROR")==0)
206
- {
207
- $scoreValue = 4;
208
- }
209
- elseif(strcmp($annomalyMS,"NOTICE")==0)
210
- {
211
- $scoreValue =2;
212
- }
213
-
214
- if($value1 == "SQL")
215
- {
216
- $SQLScore += $scoreValue;
217
-
218
- }
219
- elseif ($value1 == "XSS")
220
- {
221
- $XSSScore += $scoreValue;
222
- }
223
- else
224
- {
225
- $annomalyS += $scoreValue;
226
- }
227
- if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
228
- {
229
- $value = htmlspecialchars($value);
230
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
231
- $results = $wpdb->get_results($query);
232
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
233
- $results = $wpdb->get_results($query);
234
- if($results[0]->count>$limitAttack)
235
- {
236
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
237
- $results = $wpdb->get_results($query);
238
- if(sizeof($results)!=0)
239
- {
240
- //IP whitelisted
241
- }
242
- else
243
- {
244
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
245
- $results =$wpdb->get_results($query);
246
- }
247
- }
248
- header('HTTP/1.1 403 Forbidden');
249
- include_once("mo-error.html");
250
- exit;
251
- }
252
-
253
- }
254
- }
255
- }
256
- else if (strpos($regex[$value1][$lev][$i], '#') == false) {
257
- if(is_string($value))
258
- {
259
-
260
- if(preg_match('#'.$regex[$value1][$lev][$i].'#', $value))
261
- {
262
- $scoreValue = 0;
263
- $annomalyMS = $score[$value1][$lev][$i];
264
- if(strcmp($annomalyMS,"CRITICAL")==0)
265
- {
266
- $scoreValue = 5;
267
- }
268
-
269
- elseif(strcmp($annomalyMS,"WARNING")==0)
270
- {
271
- $scoreValue = 3;
272
- }
273
- elseif(strcmp($annomalyMS,"ERROR")==0)
274
- {
275
- $scoreValue = 4;
276
- }
277
- elseif(strcmp($annomalyMS,"NOTICE")==0)
278
- {
279
- $scoreValue =2;
280
- }
281
-
282
-
283
- if($value1 == "SQL")
284
- {
285
- $SQLScore += $scoreValue;
286
-
287
- }
288
- elseif ($value1 == "XSS")
289
- {
290
- $XSSScore += $scoreValue;
291
- }
292
- else
293
- {
294
- $annomalyS += $scoreValue;
295
- }
296
- if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
297
- {
298
- $value = htmlspecialchars($value);
299
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
300
- $results = $wpdb->get_results($query);
301
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
302
- $results = $wpdb->get_results($query);
303
-
304
- if($results[0]->count>$limitAttack)
305
- {
306
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
307
- $results = $wpdb->get_results($query);
308
- if(sizeof($results)!=0)
309
- {
310
- //IP whitelisted
311
- }
312
- else
313
- {
314
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
315
- $results =$wpdb->get_results($query);
316
- }
317
- }
318
- header('HTTP/1.1 403 Forbidden');
319
- include_once("mo-error.html");
320
- exit;
321
- }
322
- }
323
- }
324
- }
325
-
326
- elseif (strpos($regex[$value1][$lev][$i], '@') == false) {
327
- if(is_string($value))
328
- {
329
-
330
- if(preg_match('@'.$regex[$value1][$lev][$i].'@', $value))
331
- {
332
- $scoreValue = 0;
333
- $annomalyMS = $score[$value1][$lev][$i];
334
- if(strcmp($annomalyMS,"CRITICAL")==0)
335
- {
336
- $scoreValue = 5;
337
- }
338
-
339
- elseif(strcmp($annomalyMS,"WARNING")==0)
340
- {
341
- $scoreValue = 3;
342
- }
343
- elseif(strcmp($annomalyMS,"ERROR")==0)
344
- {
345
- $scoreValue = 4;
346
- }
347
- elseif(strcmp($annomalyMS,"NOTICE")==0)
348
- {
349
- $scoreValue =2;
350
- }
351
-
352
-
353
- if($value1 == "SQL")
354
- {
355
- $SQLScore += $scoreValue;
356
-
357
- }
358
- elseif ($value1 == "XSS")
359
- {
360
- $XSSScore += $scoreValue;
361
- }
362
- else
363
- {
364
- $annomalyS += $scoreValue;
365
- }
366
- if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
367
- {
368
- $value = htmlspecialchars($value);
369
- $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
370
- $results = $wpdb->get_results($query);
371
- $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
372
- $results = $wpdb->get_results($query);
373
-
374
- if($results[0]->count>$limitAttack)
375
- {
376
- $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
377
- $results = $wpdb->get_results($query);
378
- if(sizeof($results)!=0)
379
- {
380
- //IP whitelisted
381
- }
382
- else
383
- {
384
- $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
385
- $results =$wpdb->get_results($query);
386
- }
387
- }
388
- header('HTTP/1.1 403 Forbidden');
389
- include_once("mo-error.html");
390
- exit;
391
- }
392
- }
393
- }
394
-
395
- }
396
-
397
- }
398
- }
399
-
400
- }
401
- }
402
-
403
- }
404
- }
405
-
406
-
407
-
408
-
409
-
410
  ?>
1
+ <?php
2
+
3
+ $dir =dirname(__FILE__);
4
+ $dir = str_replace('\\', "/", $dir);
5
+ $sqlInjectionFile = $dir.'/signature/APSQLI.php';
6
+ $xssFile = $dir.'/signature/APXSS.php';
7
+ $lfiFile = $dir.'/signature/APLFI.php';
8
+ $configfilepath = explode('wp-content', $dir);
9
+ $configfile = $configfilepath[0].'/wp-includes/mo-waf-config.php';
10
+
11
+ $missingFile = 0;
12
+
13
+ if(file_exists($configfile))
14
+ {
15
+ include($configfile);
16
+ }
17
+ else
18
+ {
19
+ $missingFile = 1;
20
+ }
21
+ include_once($sqlInjectionFile);
22
+ include_once($xssFile);
23
+ include_once($lfiFile);
24
+
25
+
26
+ global $wpdb;
27
+ $ipaddress = '';
28
+ if (isset($_SERVER['HTTP_CLIENT_IP']))
29
+ $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
30
+ else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
31
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
32
+ else if(isset($_SERVER['HTTP_X_FORWARDED']))
33
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
34
+ else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
35
+ $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
36
+ else if(isset($_SERVER['HTTP_FORWARDED']))
37
+ $ipaddress = $_SERVER['HTTP_FORWARDED'];
38
+ else if(isset($_SERVER['REMOTE_ADDR']))
39
+ $ipaddress = $_SERVER['REMOTE_ADDR'];
40
+ else
41
+ $ipaddress = 'UNKNOWN';
42
+
43
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
44
+ $results = $wpdb->get_results($query);
45
+
46
+ if(sizeof($results)!=0)
47
+ {
48
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
49
+ $results1 = $wpdb->get_results($query);
50
+ if(sizeof($results1)!=0)
51
+ {
52
+ //IP whitelisted
53
+ }
54
+ else
55
+ {
56
+ header('HTTP/1.1 403 Forbidden');
57
+ include_once("mo-block.html");
58
+ exit;
59
+ }
60
+ }
61
+ $dir_name = dirname(__FILE__);
62
+ $dir_name1 = explode('wp-content', $dir_name);
63
+ $dir_name = $dir_name1[0];
64
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
65
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
66
+
67
+ if($missingFile==1)
68
+ {
69
+ if(!file_exists($fileName))
70
+ {
71
+ $file = fopen($fileName, "a+");
72
+ $string = "<?php".PHP_EOL;
73
+ $string .= '$SQL = '.get_option("SQLInjection").';'.PHP_EOL;
74
+ $string .= '$XSS = '.get_option("XSSAttack").';'.PHP_EOL;
75
+ $string .= '$RFI = '.get_option("RFIAttack").';'.PHP_EOL;
76
+ $string .= '$LFI = '.get_option("LFIAttack").';'.PHP_EOL;
77
+ $string .= '$RCE = '.get_option("RCEAttack").';'.PHP_EOL;
78
+ $string .= '$RateLimiting = '.get_option("Rate_limiting").';'.PHP_EOL;
79
+ $string .= '$RequestsPMin = '.get_option("Rate_request").';'.PHP_EOL;
80
+
81
+ if(get_option('actionRateL') == 0)
82
+ $string .= '$actionRateL = "ThrottleIP";'.PHP_EOL;
83
+ else
84
+ $string .= '$actionRateL = "BlockIP";'.PHP_EOL;
85
+
86
+ $string .= '?>'.PHP_EOL;
87
+ fwrite($file, $string);
88
+ fclose($file);
89
+
90
+ }
91
+
92
+ }
93
+ include_once($fileName);
94
+
95
+
96
+ if($RateLimiting == 1)
97
+ {
98
+ $time = 60;
99
+ $reqLimit = $RequestsPMin;
100
+
101
+ $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
102
+ $results = $wpdb->get_results($query);
103
+
104
+ $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
105
+ $results = $wpdb->get_results($query);
106
+
107
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
108
+ $results = $wpdb->get_results($query);
109
+
110
+ if($results[0]->count>=$reqLimit)
111
+ {
112
+ $action = $actionRateL;
113
+ if($action == 'ThrottleIP')
114
+ {
115
+ $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
116
+ $results = $wpdb->get_results($query);
117
+ $current_time = time();
118
+ if($results[0]->time < $current_time-60)
119
+ {
120
+ $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
121
+ $results = $wpdb->get_results($query);
122
+ }
123
+ header('HTTP/1.1 403 Forbidden');
124
+ include_once("mo-error.html");
125
+ exit;
126
+ }
127
+ else
128
+ {
129
+ $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
130
+ $results = $wpdb->get_results($query);
131
+ $current_time = time();
132
+ if($results[0]->time < $current_time-60)
133
+ {
134
+ $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'".MoWpnsConstants::RATE_LIMIT_EXCEEDED."');";
135
+ $results = $wpdb->get_results($query);
136
+ }
137
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
138
+ $results1 = $wpdb->get_results($query);
139
+ if(sizeof($results1)!=0)
140
+ {
141
+ //IP whitelisted
142
+ }
143
+ else
144
+ {
145
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','Rate limit exceed',NULL,".current_time( 'timestamp' ).");";
146
+ $results =$wpdb->get_results($query);
147
+ }
148
+ header('HTTP/1.1 403 Forbidden');
149
+ include_once("mo-error.html");
150
+ exit;
151
+ }
152
+ }
153
+ }
154
+ $attack = array();
155
+ if($SQL==1)
156
+ {
157
+ array_push($attack,"SQL");
158
+ }
159
+ if($XSS==1)
160
+ {
161
+ array_push($attack,"XSS");
162
+ }
163
+ if($LFI==1)
164
+ {
165
+ array_push($attack,"LFI");
166
+ }
167
+
168
+ $attackC = $attack;
169
+ $ParanoiaLevel = 1;
170
+ $annomalyS = 0;
171
+ $SQLScore = 0;
172
+ $XSSScore = 0;
173
+ $limitAttack = get_option('limitAttack');
174
+
175
+
176
+ foreach ($attackC as $key1 => $value1) {
177
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
178
+ {
179
+ if(isset($regex[$value1][$lev]))
180
+ {
181
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
182
+ {
183
+ foreach ($_REQUEST as $key => $value) {
184
+ if($regex[$value1][$lev][$i] != "")
185
+ {
186
+ if(strpos($regex[$value1][$lev][$i], '/') == false)
187
+ {
188
+ if(is_string($value))
189
+ {
190
+
191
+ if(preg_match('/'.$regex[$value1][$lev][$i].'/', $value))
192
+ {
193
+ $scoreValue = 0;
194
+
195
+ $annomalyMS = $score[$value1][$lev][$i];
196
+ if(strcmp($annomalyMS,"CRITICAL")==0)
197
+ {
198
+ $scoreValue = 5;
199
+ }
200
+
201
+ elseif(strcmp($annomalyMS,"WARNING")==0)
202
+ {
203
+ $scoreValue = 3;
204
+ }
205
+ elseif(strcmp($annomalyMS,"ERROR")==0)
206
+ {
207
+ $scoreValue = 4;
208
+ }
209
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
210
+ {
211
+ $scoreValue =2;
212
+ }
213
+
214
+ if($value1 == "SQL")
215
+ {
216
+ $SQLScore += $scoreValue;
217
+
218
+ }
219
+ elseif ($value1 == "XSS")
220
+ {
221
+ $XSSScore += $scoreValue;
222
+ }
223
+ else
224
+ {
225
+ $annomalyS += $scoreValue;
226
+ }
227
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
228
+ {
229
+ $value = htmlspecialchars($value);
230
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
231
+ $results = $wpdb->get_results($query);
232
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
233
+ $results = $wpdb->get_results($query);
234
+ if($results[0]->count>$limitAttack)
235
+ {
236
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
237
+ $results = $wpdb->get_results($query);
238
+ if(sizeof($results)!=0)
239
+ {
240
+ //IP whitelisted
241
+ }
242
+ else
243
+ {
244
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
245
+ $results =$wpdb->get_results($query);
246
+ }
247
+ }
248
+ header('HTTP/1.1 403 Forbidden');
249
+ include_once("mo-error.html");
250
+ exit;
251
+ }
252
+
253
+ }
254
+ }
255
+ }
256
+ else if (strpos($regex[$value1][$lev][$i], '#') == false) {
257
+ if(is_string($value))
258
+ {
259
+
260
+ if(preg_match('#'.$regex[$value1][$lev][$i].'#', $value))
261
+ {
262
+ $scoreValue = 0;
263
+ $annomalyMS = $score[$value1][$lev][$i];
264
+ if(strcmp($annomalyMS,"CRITICAL")==0)
265
+ {
266
+ $scoreValue = 5;
267
+ }
268
+
269
+ elseif(strcmp($annomalyMS,"WARNING")==0)
270
+ {
271
+ $scoreValue = 3;
272
+ }
273
+ elseif(strcmp($annomalyMS,"ERROR")==0)
274
+ {
275
+ $scoreValue = 4;
276
+ }
277
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
278
+ {
279
+ $scoreValue =2;
280
+ }
281
+
282
+
283
+ if($value1 == "SQL")
284
+ {
285
+ $SQLScore += $scoreValue;
286
+
287
+ }
288
+ elseif ($value1 == "XSS")
289
+ {
290
+ $XSSScore += $scoreValue;
291
+ }
292
+ else
293
+ {
294
+ $annomalyS += $scoreValue;
295
+ }
296
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
297
+ {
298
+ $value = htmlspecialchars($value);
299
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
300
+ $results = $wpdb->get_results($query);
301
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
302
+ $results = $wpdb->get_results($query);
303
+
304
+ if($results[0]->count>$limitAttack)
305
+ {
306
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
307
+ $results = $wpdb->get_results($query);
308
+ if(sizeof($results)!=0)
309
+ {
310
+ //IP whitelisted
311
+ }
312
+ else
313
+ {
314
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
315
+ $results =$wpdb->get_results($query);
316
+ }
317
+ }
318
+ header('HTTP/1.1 403 Forbidden');
319
+ include_once("mo-error.html");
320
+ exit;
321
+ }
322
+ }
323
+ }
324
+ }
325
+
326
+ elseif (strpos($regex[$value1][$lev][$i], '@') == false) {
327
+ if(is_string($value))
328
+ {
329
+
330
+ if(preg_match('@'.$regex[$value1][$lev][$i].'@', $value))
331
+ {
332
+ $scoreValue = 0;
333
+ $annomalyMS = $score[$value1][$lev][$i];
334
+ if(strcmp($annomalyMS,"CRITICAL")==0)
335
+ {
336
+ $scoreValue = 5;
337
+ }
338
+
339
+ elseif(strcmp($annomalyMS,"WARNING")==0)
340
+ {
341
+ $scoreValue = 3;
342
+ }
343
+ elseif(strcmp($annomalyMS,"ERROR")==0)
344
+ {
345
+ $scoreValue = 4;
346
+ }
347
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
348
+ {
349
+ $scoreValue =2;
350
+ }
351
+
352
+
353
+ if($value1 == "SQL")
354
+ {
355
+ $SQLScore += $scoreValue;
356
+
357
+ }
358
+ elseif ($value1 == "XSS")
359
+ {
360
+ $XSSScore += $scoreValue;
361
+ }
362
+ else
363
+ {
364
+ $annomalyS += $scoreValue;
365
+ }
366
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
367
+ {
368
+ $value = htmlspecialchars($value);
369
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
370
+ $results = $wpdb->get_results($query);
371
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != '".MoWpnsConstants::RATE_LIMIT_EXCEEDED."';";
372
+ $results = $wpdb->get_results($query);
373
+
374
+ if($results[0]->count>$limitAttack)
375
+ {
376
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
377
+ $results = $wpdb->get_results($query);
378
+ if(sizeof($results)!=0)
379
+ {
380
+ //IP whitelisted
381
+ }
382
+ else
383
+ {
384
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
385
+ $results =$wpdb->get_results($query);
386
+ }
387
+ }
388
+ header('HTTP/1.1 403 Forbidden');
389
+ include_once("mo-error.html");
390
+ exit;
391
+ }
392
+ }
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+ }
399
+
400
+ }
401
+ }
402
+
403
+ }
404
+ }
405
+
406
+
407
+
408
+
409
+
410
  ?>
handler/recaptcha.php CHANGED
@@ -42,7 +42,7 @@
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>';
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>';
handler/security_features.php CHANGED
@@ -1,47 +1,47 @@
1
- <?php
2
- class Mo_2fa_security_features
3
- {
4
- function wpns_2fa_features_only()
5
- {
6
- update_option( 'mo_wpns_2fa_with_network_security', 0);
7
- update_option( 'mo_wpns_2fa_with_network_security_popup_visible', 0);
8
- ?><script>window.location.href="admin.php?page=mo_2fa_two_fa";</script><?php
9
-
10
- }
11
-
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;
19
-
20
- update_option( 'mo_wpns_2fa_with_network_security', $enable_newtwork_security_features);
21
-
22
- if ($enable_newtwork_security_features)
23
- {
24
- $mo2f_enable_all_enable = new Mo2f_ajax_dashboard();
25
- $mo2f_enable_all_enable -> mo2f_handle_all_enable(1);
26
- }
27
-
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
- }
35
- else
36
- {
37
- ?><script>window.location.href="admin.php?page=mo_2fa_two_fa";</script><?php
38
- }
39
-
40
-
41
- }
42
- else
43
- do_action('wpns_show_message',MoWpnsMessages::showMessage('NONCE_ERROR'),'ERROR');
44
-
45
- }
46
- }new Mo_2fa_security_features;
47
- ?>
1
+ <?php
2
+ class Mo_2fa_security_features
3
+ {
4
+ function wpns_2fa_features_only()
5
+ {
6
+ update_option( 'mo_wpns_2fa_with_network_security', 0);
7
+ update_option( 'mo_wpns_2fa_with_network_security_popup_visible', 0);
8
+ ?><script>window.location.href="admin.php?page=mo_2fa_two_fa";</script><?php
9
+
10
+ }
11
+
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;
19
+
20
+ update_option( 'mo_wpns_2fa_with_network_security', $enable_newtwork_security_features);
21
+
22
+ if ($enable_newtwork_security_features)
23
+ {
24
+ $mo2f_enable_all_enable = new Mo2f_ajax_dashboard();
25
+ $mo2f_enable_all_enable -> mo2f_handle_all_enable(1);
26
+ }
27
+
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
+ }
35
+ else
36
+ {
37
+ ?><script>window.location.href="admin.php?page=mo_2fa_two_fa";</script><?php
38
+ }
39
+
40
+
41
+ }
42
+ else
43
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('NONCE_ERROR'),'ERROR');
44
+
45
+ }
46
+ }new Mo_2fa_security_features;
47
+ ?>
handler/signature/APXSS.php CHANGED
@@ -1,7 +1,7 @@
1
- <?php
2
-
3
- $regex['XSS'][1] = array( "#(?i)<script[^>]*>[\s\S]*?#" , "#(?i)[\s\'`;\/0-9=\x0B\x09\x0C\x3B\x2C\x28\x3B]+on[a-zA-Z]+[\s\x0B\x09\x0C\x3B\x2C\x28\x3B]*?=#" , "#(?i)[\s\S]((?:x(?:link:href|html|mlns)|!ENTITY.*?(?:SYSTEM|PUBLIC)|data:text\/html|formaction|\@import|base64)\b|pattern\b.*?=)#" , "#(?i)(?:<(?:(?:apple|objec)t|isindex|embed|style|form|meta)\b[^>]*?>[\s\S]*?|(?:=|U\s*?R\s*?L\s*?\()\s*?[^>]*?\s*?S\s*?C\s*?R\s*?I\s*?P\s*?T\s*?:)#" , "#(?i:(?:<\w[\s\S]*[\s\/]|['\](?:[\s\S]*[\s\/])?)(?:on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|(?:peech|ound)(?:start|end)|u(?:ccess|spend|bmit)|croll|how)|m(?:o(?:z(?:(?:pointerlock|fullscreen)(?:change|error)|(?:orientation|time)change|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|b(?:e(?:fore(?:(?:(?:de)?activa|scriptexecu)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ransition(?:cancel|end|run)|ime(?:update|out)|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom)|s(?:tyle|rc)|background|formaction|lowsrc|ping)[\s\x08]*?=|<[^\w<>]*(?:[^<>\'\s]*:)?[^\w<>]*\W*?(?:(?:a\W*?(?:n\W*?i\W*?m\W*?a\W*?t\W*?e|p\W*?p\W*?l\W*?e\W*?t|u\W*?d\W*?i\W*?o)|b\W*?(?:i\W*?n\W*?d\W*?i\W*?n\W*?g\W*?s|a\W*?s\W*?e|o\W*?d\W*?y)|i?\W*?f\W*?r\W*?a\W*?m\W*?e|o\W*?b\W*?j\W*?e\W*?c\W*?t|i\W*?m\W*?a?\W*?g\W*?e?|e\W*?m\W*?b\W*?e\W*?d|p\W*?a\W*?r\W*?a\W*?m|v\W*?i\W*?d\W*?e\W*?o|l\W*?i\W*?n\W*?k)[^>\w]|s\W*?(?:c\W*?r\W*?i\W*?p\W*?t|t\W*?y\W*?l\W*?e|e\W*?t[^>\w]|v\W*?g)|m\W*?(?:a\W*?r\W*?q\W*?u\W*?e\W*?e|e\W*?t\W*?a[^>\w])|f\W*?o\W*?r\W*?m)#" , "%(?i:<style.*?>.*?(?:@[i\\\\]|(?:[:=]|&#x?0*(?:58|3A|61|3D);?).*?(?:[(\\\\]|&#x?0*(?:40|28|92|5C);?)))%" , "#(?i:<.*[:]?vmlframe.*?[\s/+]*?src[\s/+]*=)#" , "@(?i:(?:j|&#x?0*(?:74|4A|106|6A);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:a|&#x?0*(?:65|41|97|61);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:v|&#x?0*(?:86|56|118|76);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:a|&#x?0*(?:65|41|97|61);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:s|&#x?0*(?:83|53|115|73);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:c|&#x?0*(?:67|43|99|63);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:r|&#x?0*(?:82|52|114|72);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:i|&#x?0*(?:73|49|105|69);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:p|&#x?0*(?:80|50|112|70);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:t|&#x?0*(?:84|54|116|74);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?::|&(?:#x?0*(?:58|3A);?|colon;)).)@" , "@(?i:(?:v|&#x?0*(?:86|56|118|76);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:b|&#x?0*(?:66|42|98|62);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:s|&#x?0*(?:83|53|115|73);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:c|&#x?0*(?:67|43|99|63);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:r|&#x?0*(?:82|52|114|72);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:i|&#x?0*(?:73|49|105|69);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:p|&#x?0*(?:80|50|112|70);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:t|&#x?0*(?:84|54|116|74);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?::|&(?:#x?0*(?:58|3A);?|colon;)).)@" , "#(?i)<EMBED[\s/+].*?(?:src|type).*?=#" , "#<[?]?import[\s\/+\S]*?implementation[\s\/+]*?=#" , "@(?i:<META[\s/+].*?http-equiv[\s/+]*=[\s/+]*[\'`]?(?:(?:c|&#x?0*(?:67|43|99|63);?)|(?:r|&#x?0*(?:82|52|114|72);?)|(?:s|&#x?0*(?:83|53|115|73);?)))@" , "#(?i:<META[\s/+].*?charset[\s/+]*=)#" , "#(?i)<LINK[\s/+].*?href[\s/+]*=#" , "#(?i)<BASE[\s/+].*?href[\s/+]*=#" , "#(?i)<APPLET[\s/+>]#" , "#(?i)<OBJECT[\s/+].*?(?:type|codetype|classid|code|data)[\s/+]*=#" , "#(?:¾|¼).*(?:¾|¼|>)|(?:¾|¼|<).*(?:¾|¼)#" , "#(?:\+ADw\-|\+AD4\-).*(?:\+ADw\-|\+AD4\-|>)|(?:\+ADw\-|\+AD4\-|<).*(?:\+ADw\-|\+AD4\-)#" , "#![!+]\[\]#" , " #(?:self|document|this|top|window)\s*\)*(?:\[[^\]]+\]|\.\s*document|\.\s*cookie)#" );
4
- $score['XSS'][1] = array( 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 );
5
- $regex['XSS'][2] = array( "#(?i)\b(?:s(?:tyle|rc)|href)\b[\s\S]*?=#" , "#<(?:a|abbr|acronym|address|applet|area|audioscope|b|base|basefront|bdo|bgsound|big|blackface|blink|blockquote|body|bq|br|button|caption|center|cite|code|col|colgroup|comment|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|fn|font|form|frame|frameset|h1|head|hr|html|i|iframe|ilayer|img|input|ins|isindex|kdb|keygen|label|layer|legend|li|limittext|link|listing|map|marquee|menu|meta|multicol|nobr|noembed|noframes|noscript|nosmartquotes|object|ol|optgroup|option|p|param|plaintext|pre|q|rt|ruby|s|samp|script|select|server|shadow|sidebar|small|spacer|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|ul|var|wbr|xml|xmp)\W#" , "#(?i:[\'][]*(?:[^a-z0-9~_:']|in).*?(?:(?:l|\\\\u006C)(?:o|\\\\u006F)(?:c|\\\\u0063)(?:a|\\\\u0061)(?:t|\\\\u0074)(?:i|\\\\u0069)(?:o|\\\\u006F)(?:n|\\\\u006E)|(?:n|\\\\u006E)(?:a|\\\\u0061)(?:m|\\\\u006D)(?:e|\\\\u0065)|(?:o|\\\\u006F)(?:n|\\\\u006E)(?:e|\\\\u0065)(?:r|\\\\u0072)(?:r|\\\\u0072)(?:o|\\\\u006F)(?:r|\\\\u0072)|(?:v|\\\\u0076)(?:a|\\\\u0061)(?:l|\\\\u006C)(?:u|\\\\u0075)(?:e|\\\\u0065)(?:O|\\\\u004F)(?:f|\\\\u0066)).*?=)#" , "#(?i)[\\'][]*(?:[^a-z0-9~_:\']|in).+?[.].+?=#" , " {{.*?}}" );
6
- $score['XSS'][2] = array( 5 , 5 , 5 , 5 , 5 );
7
  ?>
1
+ <?php
2
+
3
+ $regex['XSS'][1] = array( "#(?i)<script[^>]*>[\s\S]*?#" , "#(?i)[\s\'`;\/0-9=\x0B\x09\x0C\x3B\x2C\x28\x3B]+on[a-zA-Z]+[\s\x0B\x09\x0C\x3B\x2C\x28\x3B]*?=#" , "#(?i)[\s\S]((?:x(?:link:href|html|mlns)|!ENTITY.*?(?:SYSTEM|PUBLIC)|data:text\/html|formaction|\@import|base64)\b|pattern\b.*?=)#" , "#(?i)(?:<(?:(?:apple|objec)t|isindex|embed|style|form|meta)\b[^>]*?>[\s\S]*?|(?:=|U\s*?R\s*?L\s*?\()\s*?[^>]*?\s*?S\s*?C\s*?R\s*?I\s*?P\s*?T\s*?:)#" , "#(?i:(?:<\w[\s\S]*[\s\/]|['\](?:[\s\S]*[\s\/])?)(?:on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|(?:peech|ound)(?:start|end)|u(?:ccess|spend|bmit)|croll|how)|m(?:o(?:z(?:(?:pointerlock|fullscreen)(?:change|error)|(?:orientation|time)change|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|b(?:e(?:fore(?:(?:(?:de)?activa|scriptexecu)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ransition(?:cancel|end|run)|ime(?:update|out)|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom)|s(?:tyle|rc)|background|formaction|lowsrc|ping)[\s\x08]*?=|<[^\w<>]*(?:[^<>\'\s]*:)?[^\w<>]*\W*?(?:(?:a\W*?(?:n\W*?i\W*?m\W*?a\W*?t\W*?e|p\W*?p\W*?l\W*?e\W*?t|u\W*?d\W*?i\W*?o)|b\W*?(?:i\W*?n\W*?d\W*?i\W*?n\W*?g\W*?s|a\W*?s\W*?e|o\W*?d\W*?y)|i?\W*?f\W*?r\W*?a\W*?m\W*?e|o\W*?b\W*?j\W*?e\W*?c\W*?t|i\W*?m\W*?a?\W*?g\W*?e?|e\W*?m\W*?b\W*?e\W*?d|p\W*?a\W*?r\W*?a\W*?m|v\W*?i\W*?d\W*?e\W*?o|l\W*?i\W*?n\W*?k)[^>\w]|s\W*?(?:c\W*?r\W*?i\W*?p\W*?t|t\W*?y\W*?l\W*?e|e\W*?t[^>\w]|v\W*?g)|m\W*?(?:a\W*?r\W*?q\W*?u\W*?e\W*?e|e\W*?t\W*?a[^>\w])|f\W*?o\W*?r\W*?m)#" , "%(?i:<style.*?>.*?(?:@[i\\\\]|(?:[:=]|&#x?0*(?:58|3A|61|3D);?).*?(?:[(\\\\]|&#x?0*(?:40|28|92|5C);?)))%" , "#(?i:<.*[:]?vmlframe.*?[\s/+]*?src[\s/+]*=)#" , "@(?i:(?:j|&#x?0*(?:74|4A|106|6A);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:a|&#x?0*(?:65|41|97|61);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:v|&#x?0*(?:86|56|118|76);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:a|&#x?0*(?:65|41|97|61);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:s|&#x?0*(?:83|53|115|73);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:c|&#x?0*(?:67|43|99|63);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:r|&#x?0*(?:82|52|114|72);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:i|&#x?0*(?:73|49|105|69);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:p|&#x?0*(?:80|50|112|70);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:t|&#x?0*(?:84|54|116|74);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?::|&(?:#x?0*(?:58|3A);?|colon;)).)@" , "@(?i:(?:v|&#x?0*(?:86|56|118|76);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:b|&#x?0*(?:66|42|98|62);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:s|&#x?0*(?:83|53|115|73);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:c|&#x?0*(?:67|43|99|63);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:r|&#x?0*(?:82|52|114|72);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:i|&#x?0*(?:73|49|105|69);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:p|&#x?0*(?:80|50|112|70);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?:t|&#x?0*(?:84|54|116|74);?)(?:\t|&(?:#x?0*(?:9|13|10|A|D);?|tab;|newline;))*(?::|&(?:#x?0*(?:58|3A);?|colon;)).)@" , "#(?i)<EMBED[\s/+].*?(?:src|type).*?=#" , "#<[?]?import[\s\/+\S]*?implementation[\s\/+]*?=#" , "@(?i:<META[\s/+].*?http-equiv[\s/+]*=[\s/+]*[\'`]?(?:(?:c|&#x?0*(?:67|43|99|63);?)|(?:r|&#x?0*(?:82|52|114|72);?)|(?:s|&#x?0*(?:83|53|115|73);?)))@" , "#(?i:<META[\s/+].*?charset[\s/+]*=)#" , "#(?i)<LINK[\s/+].*?href[\s/+]*=#" , "#(?i)<BASE[\s/+].*?href[\s/+]*=#" , "#(?i)<APPLET[\s/+>]#" , "#(?i)<OBJECT[\s/+].*?(?:type|codetype|classid|code|data)[\s/+]*=#" , "#(?:¾|¼).*(?:¾|¼|>)|(?:¾|¼|<).*(?:¾|¼)#" , "#(?:\+ADw\-|\+AD4\-).*(?:\+ADw\-|\+AD4\-|>)|(?:\+ADw\-|\+AD4\-|<).*(?:\+ADw\-|\+AD4\-)#" , "#![!+]\[\]#" , " #(?:self|document|this|top|window)\s*\)*(?:\[[^\]]+\]|\.\s*document|\.\s*cookie)#" );
4
+ $score['XSS'][1] = array( 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 );
5
+ $regex['XSS'][2] = array( "#(?i)\b(?:s(?:tyle|rc)|href)\b[\s\S]*?=#" , "#<(?:a|abbr|acronym|address|applet|area|audioscope|b|base|basefront|bdo|bgsound|big|blackface|blink|blockquote|body|bq|br|button|caption|center|cite|code|col|colgroup|comment|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|fn|font|form|frame|frameset|h1|head|hr|html|i|iframe|ilayer|img|input|ins|isindex|kdb|keygen|label|layer|legend|li|limittext|link|listing|map|marquee|menu|meta|multicol|nobr|noembed|noframes|noscript|nosmartquotes|object|ol|optgroup|option|p|param|plaintext|pre|q|rt|ruby|s|samp|script|select|server|shadow|sidebar|small|spacer|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|ul|var|wbr|xml|xmp)\W#" , "#(?i:[\'][]*(?:[^a-z0-9~_:']|in).*?(?:(?:l|\\\\u006C)(?:o|\\\\u006F)(?:c|\\\\u0063)(?:a|\\\\u0061)(?:t|\\\\u0074)(?:i|\\\\u0069)(?:o|\\\\u006F)(?:n|\\\\u006E)|(?:n|\\\\u006E)(?:a|\\\\u0061)(?:m|\\\\u006D)(?:e|\\\\u0065)|(?:o|\\\\u006F)(?:n|\\\\u006E)(?:e|\\\\u0065)(?:r|\\\\u0072)(?:r|\\\\u0072)(?:o|\\\\u006F)(?:r|\\\\u0072)|(?:v|\\\\u0076)(?:a|\\\\u0061)(?:l|\\\\u006C)(?:u|\\\\u0075)(?:e|\\\\u0065)(?:O|\\\\u004F)(?:f|\\\\u0066)).*?=)#" , "#(?i)[\\'][]*(?:[^a-z0-9~_:\']|in).+?[.].+?=#" , " {{.*?}}" );
6
+ $score['XSS'][2] = array( 5 , 5 , 5 , 5 , 5 );
7
  ?>
handler/spam.php CHANGED
@@ -1,42 +1,42 @@
1
- <?php
2
-
3
- class Spam
4
- {
5
- function __construct()
6
- {
7
- if(get_option('mo_wpns_enable_comment_spam_blocking') || get_option('mo_wpns_enable_comment_recaptcha'))
8
- {
9
- add_filter( 'preprocess_comment' , array($this, 'comment_spam_check' ) );
10
- add_action( 'comment_form_after_fields' , array($this, 'comment_spam_custom_field' ) );
11
- }
12
- }
13
-
14
- function comment_spam_check( $comment_data )
15
- {
16
- if(!is_user_logged_in()){
17
- global $moWpnsUtility;
18
- if( isset($_POST['mocomment']) && !empty($_POST['mocomment']))
19
- wp_die( __( 'You are not authorised to perform this action.'));
20
- else if(get_option('mo_wpns_enable_comment_recaptcha'))
21
- {
22
- if(is_wp_error($moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response'])))
23
- wp_die( __( 'Invalid captcha. Please verify captcha again.'));
24
- }
25
- return $comment_data;
26
- }
27
- else{
28
- return $comment_data;
29
- }
30
- }
31
-
32
- function comment_spam_custom_field()
33
- {
34
- echo '<input type="hidden" name="mocomment" />';
35
- if(get_option('mo_wpns_enable_comment_recaptcha'))
36
- {
37
- echo '<script src="'.MoWpnsConstants::RECAPTCHA_URL.'"></script>';
38
- echo '<div class="g-recaptcha" data-sitekey="'.get_option('mo_wpns_recaptcha_site_key').'"></div>';
39
- }
40
- }
41
- }
42
  new Spam;
1
+ <?php
2
+
3
+ class Spam
4
+ {
5
+ function __construct()
6
+ {
7
+ if(get_option('mo_wpns_enable_comment_spam_blocking') || get_option('mo_wpns_enable_comment_recaptcha'))
8
+ {
9
+ add_filter( 'preprocess_comment' , array($this, 'comment_spam_check' ) );
10
+ add_action( 'comment_form_after_fields' , array($this, 'comment_spam_custom_field' ) );
11
+ }
12
+ }
13
+
14
+ function comment_spam_check( $comment_data )
15
+ {
16
+ if(!is_user_logged_in()){
17
+ global $moWpnsUtility;
18
+ if( isset($_POST['mocomment']) && !empty($_POST['mocomment']))
19
+ wp_die( __( 'You are not authorised to perform this action.'));
20
+ else if(get_option('mo_wpns_enable_comment_recaptcha'))
21
+ {
22
+ if(is_wp_error($moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response'])))
23
+ wp_die( __( 'Invalid captcha. Please verify captcha again.'));
24
+ }
25
+ return $comment_data;
26
+ }
27
+ else{
28
+ return $comment_data;
29
+ }
30
+ }
31
+
32
+ function comment_spam_custom_field()
33
+ {
34
+ echo '<input type="hidden" name="mocomment" />';
35
+ if(get_option('mo_wpns_enable_comment_recaptcha'))
36
+ {
37
+ echo '<script src="'.MoWpnsConstants::RECAPTCHA_URL.'"></script>';
38
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option('mo_wpns_recaptcha_site_key').'"></div>';
39
+ }
40
+ }
41
+ }
42
  new Spam;
handler/twofa/class_miniorange_2fa_strong_password.php CHANGED
@@ -2,17 +2,14 @@
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.'));
@@ -22,7 +19,7 @@ class class_miniorange_2fa_strong_password {
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
  {
@@ -39,7 +36,7 @@ class class_miniorange_2fa_strong_password {
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;
@@ -61,7 +58,7 @@ class class_miniorange_2fa_strong_password {
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.'));
@@ -71,7 +68,7 @@ class class_miniorange_2fa_strong_password {
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;
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.'));
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
  {
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;
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.'));
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;
handler/twofa/setup_twofa.php CHANGED
@@ -119,14 +119,14 @@
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" => "",
@@ -168,7 +168,7 @@
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>';
@@ -253,7 +253,9 @@
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
 
@@ -266,7 +268,9 @@
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;
@@ -279,7 +283,9 @@
279
 
280
  </a>
281
 
282
-
 
 
283
  </span>';
284
 
285
  break;
@@ -290,7 +296,9 @@
290
  <span class="dashicons dashicons-text-page" style="font-size:19px;color:#269eb3;float: right;"></span>
291
 
292
  </a>
293
-
 
 
294
 
295
  </span>';
296
 
@@ -302,10 +310,38 @@
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 .= "";}
@@ -322,7 +358,8 @@
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)
@@ -400,7 +437,9 @@
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.');"';
@@ -494,7 +533,6 @@ function mo2f_get_activated_second_factor( $user ) {
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 );
@@ -646,6 +684,9 @@ function mo2f_show_2FA_configuration_screen( $user, $selected2FAmethod ) {
646
  case "miniOrange Push Notification":
647
  mo2f_configure_miniorange_authenticator( $user );
648
  break;
 
 
 
649
  }
650
 
651
  }
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" => "",
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>';
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
 
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;
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;
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
 
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 .= "";}
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)
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.');"';
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 );
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
  }
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
@@ -1,26 +1,24 @@
1
- <?php
2
-
3
- class two_fa_get_details {
4
-
5
- function getUserMethod($userid){
6
- $userMethod = get_user_meta($userid,'currentMethod',true);
7
- return $userMethod;
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
-
21
- function getUserEmail($userid){
22
- $userEmail = get_user_meta($userid , 'email',true);
23
- return $userEmail;
24
-
25
- }
26
  }
1
+ <?php
2
+
3
+ class two_fa_get_details {
4
+
5
+ function getUserMethod($userid){
6
+ $userMethod = get_user_meta($userid,'currentMethod',true);
7
+ return $userMethod;
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
+
19
+ function getUserEmail($userid){
20
+ $userEmail = get_user_meta($userid , 'email',true);
21
+ return $userEmail;
22
+
23
+ }
 
 
24
  }
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;
@@ -161,7 +167,7 @@ class Miniorange_Mobile_Login {
161
  $bootstrappath = plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', dirname(dirname(__FILE__)) );
162
  $bootstrappath = str_replace('/handler/includes/css', '/includes/css', $bootstrappath);
163
  wp_enqueue_style( 'bootstrap_script', $bootstrappath );
164
- wp_enqueue_script( 'bootstrap_script', plugins_url( 'includes/js/bootstrap.min.js', dirname(__FILE__ )) );
165
  }
166
 
167
  function mo_2_factor_hide_login() {
@@ -327,10 +333,10 @@ class Miniorange_Mobile_Login {
327
  ?>
328
  <input type="button" name="miniorange_login_submit" style="width:100% !important;"
329
  onclick="mouserloginsubmit();" id="miniorange_login_submit"
330
- class="button button-primary button-large"
331
  value="<?php echo mo2f_lt( 'Login with 2nd factor' ); ?>"/>
332
  </p>
333
- <br><br><br>
334
  <?php if ( ! $mo2f_enable_login_with_2nd_factor ) { ?><br><br><?php } ?>
335
  </div>
336
  </div>
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;
167
  $bootstrappath = plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', dirname(dirname(__FILE__)) );
168
  $bootstrappath = str_replace('/handler/includes/css', '/includes/css', $bootstrappath);
169
  wp_enqueue_style( 'bootstrap_script', $bootstrappath );
170
+ wp_enqueue_script( 'bootstrap_script', plugins_url( 'includes/js/bootstrap.min.js', dirname(dirname(__FILE__ ))) );
171
  }
172
 
173
  function mo_2_factor_hide_login() {
333
  ?>
334
  <input type="button" name="miniorange_login_submit" style="width:100% !important;"
335
  onclick="mouserloginsubmit();" id="miniorange_login_submit"
336
+ class="miniorange-button button-add"
337
  value="<?php echo mo2f_lt( 'Login with 2nd factor' ); ?>"/>
338
  </p>
339
+ <br>
340
  <?php if ( ! $mo2f_enable_login_with_2nd_factor ) { ?><br><br><?php } ?>
341
  </div>
342
  </div>
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/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=false;
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
@@ -76,27 +76,33 @@ class miniorange_security_notification{
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>';
@@ -108,7 +114,7 @@ class miniorange_security_notification{
108
  <br><br>
109
  ";
110
 
111
- if(get_option("mo_wpns_2fa_with_network_security"))
112
  {
113
 
114
  echo "
@@ -261,4 +267,4 @@ class miniorange_security_notification{
261
 
262
  }
263
 
264
- ?>
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>';
114
  <br><br>
115
  ";
116
 
117
+ if(MoWpnsUtility::get_mo2f_db_option('mo_wpns_2fa_with_network_security', 'get_option'))
118
  {
119
 
120
  echo "
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/button_styles.css CHANGED
@@ -1,111 +1,111 @@
1
- .mo_wpns_switch {
2
- position: relative;
3
- display: inline-block;
4
- width: 60px;
5
- height: 34px;
6
- }
7
-
8
- .mo_wpns_switch input {
9
- opacity: 0;
10
- width: 0;
11
- height: 0;
12
- }
13
-
14
- .mo_wpns_slider {
15
- position: absolute;
16
- cursor: pointer;
17
- top: 0;
18
- left: 0;
19
- right: 0;
20
- bottom: 0;
21
- background-color: #ccc;
22
- -webkit-transition: .4s;
23
- transition: .4s;
24
- }
25
-
26
- .mo_wpns_slider:before {
27
- position: absolute;
28
- content: "";
29
- height: 26px;
30
- width: 26px;
31
- left: 4px;
32
- bottom: 4px;
33
- background-color: white;
34
- -webkit-transition: .4s;
35
- transition: .4s;
36
- }
37
-
38
- input:checked + .mo_wpns_slider {
39
- background-color: #20b2aa;
40
- }
41
-
42
- input:focus + .mo_wpns_slider {
43
- box-shadow: 0 0 1px #20b2aa;
44
- }
45
-
46
- input:checked + .mo_wpns_slider:before {
47
- -webkit-transform: translateX(26px);
48
- -ms-transform: translateX(26px);
49
- transform: translateX(26px);
50
- }
51
-
52
- /* Rounded sliders */
53
- .mo_wpns_slider.mo_wpns_round {
54
- border-radius: 34px;
55
- }
56
-
57
- .mo_wpns_slider.mo_wpns_round:before {
58
- border-radius: 50%;
59
- }
60
- .mo_wpns_switch_small {
61
- position: relative;
62
- display: inline-block;
63
- width: 44px;
64
- height: 24px;
65
- }
66
- .mo_wpns_switch_small input {
67
- opacity: 0;
68
- width: 0;
69
- height: 0;
70
- }
71
- .mo_wpns_slider_small {
72
- position: absolute;
73
- cursor: pointer;
74
- top: 0;
75
- left: 0;
76
- right: 0;
77
- bottom: 0;
78
- background-color: #ccc;
79
- -webkit-transition: .4s;
80
- transition: .4s;
81
- }
82
- .mo_wpns_slider_small:before {
83
- position: absolute;
84
- content: "";
85
- height: 18px;
86
- width: 18px;
87
- left: 3px;
88
- bottom: 3px;
89
- background-color: white;
90
- -webkit-transition: .4s;
91
- transition: .4s;
92
- }
93
- input:checked + .mo_wpns_slider_small {
94
- background-color: #20b2aa;
95
- }
96
- input:focus + .mo_wpns_slider_small {
97
- box-shadow: 0 0 1px #20b2aa;
98
- }
99
-
100
- input:checked + .mo_wpns_slider_small:before {
101
- -webkit-transform: translateX(17px);
102
- -ms-transform: translateX(17px);
103
- transform: translateX(17px);
104
- }
105
- .mo_wpns_slider_small.mo_wpns_round_small {
106
- border-radius: 24px;
107
- }
108
-
109
- .mo_wpns_slider_small.mo_wpns_round_small:before {
110
- border-radius: 50%;
111
  }
1
+ .mo_wpns_switch {
2
+ position: relative;
3
+ display: inline-block;
4
+ width: 60px;
5
+ height: 34px;
6
+ }
7
+
8
+ .mo_wpns_switch input {
9
+ opacity: 0;
10
+ width: 0;
11
+ height: 0;
12
+ }
13
+
14
+ .mo_wpns_slider {
15
+ position: absolute;
16
+ cursor: pointer;
17
+ top: 0;
18
+ left: 0;
19
+ right: 0;
20
+ bottom: 0;
21
+ background-color: #ccc;
22
+ -webkit-transition: .4s;
23
+ transition: .4s;
24
+ }
25
+
26
+ .mo_wpns_slider:before {
27
+ position: absolute;
28
+ content: "";
29
+ height: 26px;
30
+ width: 26px;
31
+ left: 4px;
32
+ bottom: 4px;
33
+ background-color: white;
34
+ -webkit-transition: .4s;
35
+ transition: .4s;
36
+ }
37
+
38
+ input:checked + .mo_wpns_slider {
39
+ background-color: #20b2aa;
40
+ }
41
+
42
+ input:focus + .mo_wpns_slider {
43
+ box-shadow: 0 0 1px #20b2aa;
44
+ }
45
+
46
+ input:checked + .mo_wpns_slider:before {
47
+ -webkit-transform: translateX(26px);
48
+ -ms-transform: translateX(26px);
49
+ transform: translateX(26px);
50
+ }
51
+
52
+ /* Rounded sliders */
53
+ .mo_wpns_slider.mo_wpns_round {
54
+ border-radius: 34px;
55
+ }
56
+
57
+ .mo_wpns_slider.mo_wpns_round:before {
58
+ border-radius: 50%;
59
+ }
60
+ .mo_wpns_switch_small {
61
+ position: relative;
62
+ display: inline-block;
63
+ width: 44px;
64
+ height: 24px;
65
+ }
66
+ .mo_wpns_switch_small input {
67
+ opacity: 0;
68
+ width: 0;
69
+ height: 0;
70
+ }
71
+ .mo_wpns_slider_small {
72
+ position: absolute;
73
+ cursor: pointer;
74
+ top: 0;
75
+ left: 0;
76
+ right: 0;
77
+ bottom: 0;
78
+ background-color: #ccc;
79
+ -webkit-transition: .4s;
80
+ transition: .4s;
81
+ }
82
+ .mo_wpns_slider_small:before {
83
+ position: absolute;
84
+ content: "";
85
+ height: 18px;
86
+ width: 18px;
87
+ left: 3px;
88
+ bottom: 3px;
89
+ background-color: white;
90
+ -webkit-transition: .4s;
91
+ transition: .4s;
92
+ }
93
+ input:checked + .mo_wpns_slider_small {
94
+ background-color: #20b2aa;
95
+ }
96
+ input:focus + .mo_wpns_slider_small {
97
+ box-shadow: 0 0 1px #20b2aa;
98
+ }
99
+
100
+ input:checked + .mo_wpns_slider_small:before {
101
+ -webkit-transform: translateX(17px);
102
+ -ms-transform: translateX(17px);
103
+ transform: translateX(17px);
104
+ }
105
+ .mo_wpns_slider_small.mo_wpns_round_small {
106
+ border-radius: 24px;
107
+ }
108
+
109
+ .mo_wpns_slider_small.mo_wpns_round_small:before {
110
+ border-radius: 50%;
111
  }
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/hide-login.css CHANGED
@@ -1,317 +1,317 @@
1
- body.login-action-login div#login {
2
- display: none;
3
- }
4
-
5
- body.login-action-login div#login form#loginform input#user_login {
6
- display: none;
7
- }
8
-
9
- body.login-action-login div#login form#loginform p.forgetmenot {
10
- display: none;
11
- }
12
-
13
- body.login-action-login div#login form#loginform p.submit input#wp-submit {
14
- display: none;
15
- }
16
-
17
- body.login-action-login div#login form#loginform p label {
18
- display: none;
19
- }
20
-
21
- body.login-action-login div#login p#nav {
22
- display: none;
23
- }
24
-
25
- body.login-action-login div#login form#loginform input#user_pass {
26
- display: none;
27
- }
28
-
29
- body.login-action-login div#login div#login_error {
30
- display: none;
31
- }
32
-
33
- body.login-action-login p.message {
34
- display: none;
35
- }
36
-
37
- body.login-action-login div#login #loginform {
38
- box-shadow: inherit;
39
- }
40
-
41
- body.login-action-login div#login div#login_error1 {
42
- border-left: 4px solid #dd3d36;
43
- margin-left: 0;
44
- padding: 12px;
45
- background: #fff;
46
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
47
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
48
- }
49
-
50
- .mo2f_header {
51
- font-size: 28px;
52
- font-family: -webkit-body;
53
- color: #777;
54
- }
55
-
56
- .mo2f_powered_by_miniorange {
57
- width: 100px;
58
- height: 25px;
59
- -webkit-background-size: 100px 25px;
60
- background-size: 100px 25px;
61
- background-repeat: no-repeat;
62
- display: inline-block;
63
- vertical-align: middle;
64
- }
65
-
66
- .mo2f_powered_by_div {
67
- text-align: right;
68
- font-size: 9px;
69
- padding-right: 2%;
70
- background-color: #FFFFFF;
71
- }
72
-
73
- .button-green {
74
- color: rgb(0, 160, 210);
75
- background: none !important;
76
- border: none;
77
- padding: 0 !important;
78
- font: inherit;
79
- border-color: transparent !important;
80
- /*border is optional*/
81
- border-bottom: 1px solid #444;
82
- cursor: pointer;
83
- }
84
-
85
- .mo2fa_display_message {
86
- padding: 12px;
87
- border-left: 4px solid #00a0d2;
88
- background-color: #fff;
89
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
90
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
91
-
92
- }
93
-
94
- .mo2fa_messages_container {
95
- width: 300px;
96
- }
97
-
98
- .mo2fa_otp_messages_container {
99
- width: 400px;
100
- }
101
-
102
- .mo2fa_push_messages_container {
103
- width: 300px;
104
- }
105
-
106
- .miniorange_mobile_auth, .miniorange_app_setup_page {
107
- border: 1px none transparent;
108
- padding: 10% 24px 10px 20px;
109
- min-height: 360px;
110
- background: transparent;
111
- z-index: 99999;
112
- }
113
-
114
- .miniorange_kba_page {
115
- border: 1px none transparent;
116
- padding: 10% 24px 10px 20px;
117
- min-height: 360px;
118
- background: transparent;
119
- z-index: 99999;
120
-
121
- }
122
-
123
- .miniorange_push_oobemail_auth, .miniorange_trust_device {
124
- border: 1px none transparent;
125
- padding: 10% 24px 10px 20px;
126
- min-height: 360px;
127
- background: transparent;
128
- z-index: 99999;
129
- }
130
-
131
- .miniorange_soft_auth {
132
- border: 1px none transparent;
133
- padding: 10% 24px 10px 20px;
134
- min-height: 360px;
135
- background: transparent;
136
- z-index: 99999;
137
- }
138
-
139
- .miniorange-inner-login-container {
140
- background-color: #fff;
141
- margin: 0px auto !important;
142
- width: 400px;
143
- border-radius: 5px;
144
- border: 1px solid rgba(128, 128, 128, 0.06);
145
- }
146
-
147
- .miniorange-inner-kba-login-container {
148
- background-color: #fff;
149
- margin: 0px auto !important;
150
- width: 500px;
151
- border-radius: 5px;
152
- z-index: 99999;
153
- border: 1px solid rgba(128, 128, 128, 0.06);
154
- }
155
-
156
- .miniorange-inner-push-login-container {
157
- background-color: #fff;
158
- margin: 0px auto !important;
159
- width: 300px;
160
- border-radius: 5px;
161
-
162
- z-index: 99999;
163
- border: 1px solid rgba(128, 128, 128, 0.06);
164
- }
165
-
166
- .miniorange-button {
167
- height: 30px;
168
- display: inline-block;
169
- font-size: 14px;
170
- line-height: 28px;
171
- padding: 0 12px 2px;
172
- border-width: 1px;
173
- vertical-align: baseline;
174
- background: #00a0d2;
175
- border-style: solid;
176
- border-color: #0073aa;
177
- -webkit-appearance: none;
178
- -webkit-border-radius: 3px;
179
- border-radius: 3px;
180
- white-space: nowrap;
181
- -webkit-box-sizing: border-box;
182
- -moz-box-sizing: border-box;
183
- box-sizing: border-box;
184
- -webkit-box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
185
- box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
186
- color: #fff;
187
- text-decoration: none;
188
- cursor: pointer;
189
- }
190
-
191
- .mo_green {
192
- background: #2ECC71;
193
- border-color: #2ECC71;
194
- width: 37%;
195
- }
196
-
197
- .mo_red {
198
- background: #E74C3C;
199
- border-color: #E74C3C;
200
- width: 37%;
201
- }
202
-
203
- .showQRHelp, .showOTPHelp {
204
- text-align: center !important;
205
- }
206
-
207
- .mo_email_textbox {
208
- width: 48%;
209
- text-align: center;
210
- height: 40px;
211
- font-size: 18px;
212
- border-radius: 5px;
213
- }
214
-
215
- .mo_header_background {
216
- padding: 5px !important;
217
- background-color: beige !important;
218
- }
219
-
220
- .mo2f_textbox {
221
- width: 60% !important;
222
- border-radius: 4px !important;
223
- height: 30px !important;
224
- font-size: 14px !important;
225
- }
226
-
227
- .mo2f_kba_textbox {
228
- width: 100% !important;
229
- border-radius: 4px !important;
230
- height: 30px !important;
231
- font-size: 14px !important;
232
- }
233
-
234
- .mo_hr {
235
- border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
236
- margin-top: 5px !important;
237
- margin-right: 10px !important;
238
- }
239
-
240
- .mo_margin_left {
241
- margin-left: 20px !important;
242
- }
243
-
244
- .miniorange-app-setup-container {
245
- background-color: #fff;
246
- margin: 0px auto !important;
247
- width: 700px;
248
- border-radius: 5px;
249
- margin-top: -100px !important;
250
- z-index: 99999;
251
- border: 1px solid rgba(128, 128, 128, 0.06);
252
-
253
- }
254
-
255
- .miniorange-ga-setup-container {
256
- background-color: #fff;
257
- margin: 0px auto !important;
258
- width: 900px;
259
- border-radius: 5px;
260
- margin-top: -50px !important;
261
- z-index: 99999;
262
- border: 1px solid rgba(128, 128, 128, 0.06);
263
- }
264
-
265
- .mo_app_link {
266
- text-decoration: none !important;
267
- color: #000 !important;
268
- }
269
-
270
- .mo2fa_app_setup_messages {
271
- width: 700px;
272
- }
273
-
274
- .mo2f_td_show {
275
- display: grid !important;
276
- }
277
-
278
- .mo2f_td_hide {
279
- display: none !important;
280
- }
281
-
282
- .mo2f_kba_ques {
283
- width: 370px !important;
284
- border-radius: 4px !important;
285
- height: 30px !important;
286
- font-size: 14px !important;
287
- }
288
-
289
- .mo2f_kba_table {
290
- padding: 0 10px;
291
- width: 100%;
292
- }
293
-
294
- .mo2f_kba_tb_data {
295
- padding-left: 15px;
296
- }
297
-
298
- .mo2f_table_textbox {
299
- width: 150px;
300
- height: 30px !important;
301
- font-size: 14px !important;
302
-
303
- }
304
-
305
- .mo2f_kba_header {
306
- font-weight: bold;
307
- }
308
-
309
- .mo2f_separator {
310
- border-left: 1px solid #EBECEC;
311
- padding: 5px;
312
- }
313
-
314
- .mo2f_inline_padding {
315
- padding-left: 20px;
316
- padding-right: 20px;
317
- }
1
+ body.login-action-login div#login {
2
+ display: none;
3
+ }
4
+
5
+ body.login-action-login div#login form#loginform input#user_login {
6
+ display: none;
7
+ }
8
+
9
+ body.login-action-login div#login form#loginform p.forgetmenot {
10
+ display: none;
11
+ }
12
+
13
+ body.login-action-login div#login form#loginform p.submit input#wp-submit {
14
+ display: none;
15
+ }
16
+
17
+ body.login-action-login div#login form#loginform p label {
18
+ display: none;
19
+ }
20
+
21
+ body.login-action-login div#login p#nav {
22
+ display: none;
23
+ }
24
+
25
+ body.login-action-login div#login form#loginform input#user_pass {
26
+ display: none;
27
+ }
28
+
29
+ body.login-action-login div#login div#login_error {
30
+ display: none;
31
+ }
32
+
33
+ body.login-action-login p.message {
34
+ display: none;
35
+ }
36
+
37
+ body.login-action-login div#login #loginform {
38
+ box-shadow: inherit;
39
+ }
40
+
41
+ body.login-action-login div#login div#login_error1 {
42
+ border-left: 4px solid #dd3d36;
43
+ margin-left: 0;
44
+ padding: 12px;
45
+ background: #fff;
46
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
47
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
48
+ }
49
+
50
+ .mo2f_header {
51
+ font-size: 28px;
52
+ font-family: -webkit-body;
53
+ color: #777;
54
+ }
55
+
56
+ .mo2f_powered_by_miniorange {
57
+ width: 100px;
58
+ height: 25px;
59
+ -webkit-background-size: 100px 25px;
60
+ background-size: 100px 25px;
61
+ background-repeat: no-repeat;
62
+ display: inline-block;
63
+ vertical-align: middle;
64
+ }
65
+
66
+ .mo2f_powered_by_div {
67
+ text-align: right;
68
+ font-size: 9px;
69
+ padding-right: 2%;
70
+ background-color: #FFFFFF;
71
+ }
72
+
73
+ .button-green {
74
+ color: rgb(0, 160, 210);
75
+ background: none !important;
76
+ border: none;
77
+ padding: 0 !important;
78
+ font: inherit;
79
+ border-color: transparent !important;
80
+ /*border is optional*/
81
+ border-bottom: 1px solid #444;
82
+ cursor: pointer;
83
+ }
84
+
85
+ .mo2fa_display_message {
86
+ padding: 12px;
87
+ border-left: 4px solid #00a0d2;
88
+ background-color: #fff;
89
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
90
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
91
+
92
+ }
93
+
94
+ .mo2fa_messages_container {
95
+ width: 300px;
96
+ }
97
+
98
+ .mo2fa_otp_messages_container {
99
+ width: 400px;
100
+ }
101
+
102
+ .mo2fa_push_messages_container {
103
+ width: 300px;
104
+ }
105
+
106
+ .miniorange_mobile_auth, .miniorange_app_setup_page {
107
+ border: 1px none transparent;
108
+ padding: 10% 24px 10px 20px;
109
+ min-height: 360px;
110
+ background: transparent;
111
+ z-index: 99999;
112
+ }
113
+
114
+ .miniorange_kba_page {
115
+ border: 1px none transparent;
116
+ padding: 10% 24px 10px 20px;
117
+ min-height: 360px;
118
+ background: transparent;
119
+ z-index: 99999;
120
+
121
+ }
122
+
123
+ .miniorange_push_oobemail_auth, .miniorange_trust_device {
124
+ border: 1px none transparent;
125
+ padding: 10% 24px 10px 20px;
126
+ min-height: 360px;
127
+ background: transparent;
128
+ z-index: 99999;
129
+ }
130
+
131
+ .miniorange_soft_auth {
132
+ border: 1px none transparent;
133
+ padding: 10% 24px 10px 20px;
134
+ min-height: 360px;
135
+ background: transparent;
136
+ z-index: 99999;
137
+ }
138
+
139
+ .miniorange-inner-login-container {
140
+ background-color: #fff;
141
+ margin: 0px auto !important;
142
+ width: 400px;
143
+ border-radius: 5px;
144
+ border: 1px solid rgba(128, 128, 128, 0.06);
145
+ }
146
+
147
+ .miniorange-inner-kba-login-container {
148
+ background-color: #fff;
149
+ margin: 0px auto !important;
150
+ width: 500px;
151
+ border-radius: 5px;
152
+ z-index: 99999;
153
+ border: 1px solid rgba(128, 128, 128, 0.06);
154
+ }
155
+
156
+ .miniorange-inner-push-login-container {
157
+ background-color: #fff;
158
+ margin: 0px auto !important;
159
+ width: 300px;
160
+ border-radius: 5px;
161
+
162
+ z-index: 99999;
163
+ border: 1px solid rgba(128, 128, 128, 0.06);
164
+ }
165
+
166
+ .miniorange-button {
167
+ height: 30px;
168
+ display: inline-block;
169
+ font-size: 14px;
170
+ line-height: 28px;
171
+ padding: 0 12px 2px;
172
+ border-width: 1px;
173
+ vertical-align: baseline;
174
+ background: #00a0d2;
175
+ border-style: solid;
176
+ border-color: #0073aa;
177
+ -webkit-appearance: none;
178
+ -webkit-border-radius: 3px;
179
+ border-radius: 3px;
180
+ white-space: nowrap;
181
+ -webkit-box-sizing: border-box;
182
+ -moz-box-sizing: border-box;
183
+ box-sizing: border-box;
184
+ -webkit-box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
185
+ box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
186
+ color: #fff;
187
+ text-decoration: none;
188
+ cursor: pointer;
189
+ }
190
+
191
+ .mo_green {
192
+ background: #2ECC71;
193
+ border-color: #2ECC71;
194
+ width: 37%;
195
+ }
196
+
197
+ .mo_red {
198
+ background: #E74C3C;
199
+ border-color: #E74C3C;
200
+ width: 37%;
201
+ }
202
+
203
+ .showQRHelp, .showOTPHelp {
204
+ text-align: center !important;
205
+ }
206
+
207
+ .mo_email_textbox {
208
+ width: 48%;
209
+ text-align: center;
210
+ height: 40px;
211
+ font-size: 18px;
212
+ border-radius: 5px;
213
+ }
214
+
215
+ .mo_header_background {
216
+ padding: 5px !important;
217
+ background-color: beige !important;
218
+ }
219
+
220
+ .mo2f_textbox {
221
+ width: 60% !important;
222
+ border-radius: 4px !important;
223
+ height: 30px !important;
224
+ font-size: 14px !important;
225
+ }
226
+
227
+ .mo2f_kba_textbox {
228
+ width: 100% !important;
229
+ border-radius: 4px !important;
230
+ height: 30px !important;
231
+ font-size: 14px !important;
232
+ }
233
+
234
+ .mo_hr {
235
+ border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
236
+ margin-top: 5px !important;
237
+ margin-right: 10px !important;
238
+ }
239
+
240
+ .mo_margin_left {
241
+ margin-left: 20px !important;
242
+ }
243
+
244
+ .miniorange-app-setup-container {
245
+ background-color: #fff;
246
+ margin: 0px auto !important;
247
+ width: 700px;
248
+ border-radius: 5px;
249
+ margin-top: -100px !important;
250
+ z-index: 99999;
251
+ border: 1px solid rgba(128, 128, 128, 0.06);
252
+
253
+ }
254
+
255
+ .miniorange-ga-setup-container {
256
+ background-color: #fff;
257
+ margin: 0px auto !important;
258
+ width: 900px;
259
+ border-radius: 5px;
260
+ margin-top: -50px !important;
261
+ z-index: 99999;
262
+ border: 1px solid rgba(128, 128, 128, 0.06);
263
+ }
264
+
265
+ .mo_app_link {
266
+ text-decoration: none !important;
267
+ color: #000 !important;
268
+ }
269
+
270
+ .mo2fa_app_setup_messages {
271
+ width: 700px;
272
+ }
273
+
274
+ .mo2f_td_show {
275
+ display: grid !important;
276
+ }
277
+
278
+ .mo2f_td_hide {
279
+ display: none !important;
280
+ }
281
+
282
+ .mo2f_kba_ques {
283
+ width: 370px !important;
284
+ border-radius: 4px !important;
285
+ height: 30px !important;
286
+ font-size: 14px !important;
287
+ }
288
+
289
+ .mo2f_kba_table {
290
+ padding: 0 10px;
291
+ width: 100%;
292
+ }
293
+
294
+ .mo2f_kba_tb_data {
295
+ padding-left: 15px;
296
+ }
297
+
298
+ .mo2f_table_textbox {
299
+ width: 150px;
300
+ height: 30px !important;
301
+ font-size: 14px !important;
302
+
303
+ }
304
+
305
+ .mo2f_kba_header {
306
+ font-weight: bold;
307
+ }
308
+
309
+ .mo2f_separator {
310
+ border-left: 1px solid #EBECEC;
311
+ padding: 5px;
312
+ }
313
+
314
+ .mo2f_inline_padding {
315
+ padding-left: 20px;
316
+ padding-right: 20px;
317
+ }
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/jquery-qrcode/jquery-qrcode.min.js CHANGED
@@ -1,2 +1,2 @@
1
- /*! jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */
2
  !function(r){"use strict";function t(t,e,n,o){function a(r,t){return r-=o,t-=o,0>r||r>=c||0>t||t>=c?!1:f.isDark(r,t)}function i(r,t,e,n){var o=u.isDark,a=1/l;u.isDark=function(i,u){var f=u*a,c=i*a,l=f+a,g=c+a;return o(i,u)&&(r>l||f>e||t>g||c>n)}}var u={},f=r(n,e);f.addData(t),f.make(),o=o||0;var c=f.getModuleCount(),l=f.getModuleCount()+2*o;return u.text=t,u.level=e,u.version=n,u.moduleCount=l,u.isDark=a,u.addBlank=i,u}function e(r,e,n,o,a){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var i=n;o>=i;i+=1)try{return t(r,e,i,a)}catch(u){}}function n(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,a=w("<canvas/>")[0].getContext("2d");a.font=o;var i=a.measureText(e.label).width,u=e.mSize,f=i/n,c=(1-f)*e.mPosX,l=(1-u)*e.mPosY,g=c+f,s=l+u,v=.01;1===e.mode?r.addBlank(0,l-v,n,s+v):r.addBlank(c-v,l-v,g+v,s+v),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,c*n,l*n+.75*e.mSize*n)}function o(r,t,e){var n=e.size,o=e.image.naturalWidth||1,a=e.image.naturalHeight||1,i=e.mSize,u=i*o/a,f=(1-u)*e.mPosX,c=(1-i)*e.mPosY,l=f+u,g=c+i,s=.01;3===e.mode?r.addBlank(0,c-s,n,g+s):r.addBlank(f-s,c-s,l+s,g+s),t.drawImage(e.image,f*n,c*n,u*n,i*n)}function a(r,t,e){w(e.background).is("img")?t.drawImage(e.background,0,0,e.size,e.size):e.background&&(t.fillStyle=e.background,t.fillRect(e.left,e.top,e.size,e.size));var a=e.mode;1===a||2===a?n(r,t,e):(3===a||4===a)&&o(r,t,e)}function i(r,t,e,n,o,a,i,u){r.isDark(i,u)&&t.rect(n,o,a,a)}function u(r,t,e,n,o,a,i,u,f,c){i?r.moveTo(t+a,e):r.moveTo(t,e),u?(r.lineTo(n-a,e),r.arcTo(n,e,n,o,a)):r.lineTo(n,e),f?(r.lineTo(n,o-a),r.arcTo(n,o,t,o,a)):r.lineTo(n,o),c?(r.lineTo(t+a,o),r.arcTo(t,o,t,e,a)):r.lineTo(t,o),i?(r.lineTo(t,e+a),r.arcTo(t,e,n,e,a)):r.lineTo(t,e)}function f(r,t,e,n,o,a,i,u,f,c){i&&(r.moveTo(t+a,e),r.lineTo(t,e),r.lineTo(t,e+a),r.arcTo(t,e,t+a,e,a)),u&&(r.moveTo(n-a,e),r.lineTo(n,e),r.lineTo(n,e+a),r.arcTo(n,e,n-a,e,a)),f&&(r.moveTo(n-a,o),r.lineTo(n,o),r.lineTo(n,o-a),r.arcTo(n,o,n-a,o,a)),c&&(r.moveTo(t+a,o),r.lineTo(t,o),r.lineTo(t,o-a),r.arcTo(t,o,t+a,o,a))}function c(r,t,e,n,o,a,i,c){var l=r.isDark,g=n+a,s=o+a,v=e.radius*a,h=i-1,d=i+1,w=c-1,m=c+1,y=l(i,c),T=l(h,w),p=l(h,c),B=l(h,m),A=l(i,m),E=l(d,m),k=l(d,c),M=l(d,w),C=l(i,w);y?u(t,n,o,g,s,v,!p&&!C,!p&&!A,!k&&!A,!k&&!C):f(t,n,o,g,s,v,p&&C&&T,p&&A&&B,k&&A&&E,k&&C&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,f=i;for(e.radius>0&&e.radius<=.5&&(f=c),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var l=e.left+o*u,g=e.top+n*u,s=u;f(r,t,e,l,g,s,n,o)}if(w(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var v=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=v,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function g(r,t){var n=e(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!n)return null;var o=w(r).data("qrcode",n),i=o[0].getContext("2d");return a(n,i,t),l(n,i,t),o}function s(r){var t=w("<canvas/>").attr("width",r.size).attr("height",r.size);return g(t,r)}function v(r){return w("<img/>").attr("src",s(r)[0].toDataURL("image/png"))}function h(r){var t=e(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!t)return null;var n,o,a=r.size,i=r.background,u=Math.floor,f=t.moduleCount,c=u(a/f),l=u(.5*(a-c*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},s={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":r.fill},v=w("<div/>").data("qrcode",t).css(g);for(i&&v.css("background-color",i),n=0;f>n;n+=1)for(o=0;f>o;o+=1)t.isDark(n,o)&&w("<div/>").css(s).css({left:l+o*c,top:l+n*c}).appendTo(v);return v}function d(r){return m&&"canvas"===r.render?s(r):m&&"image"===r.render?v(r):h(r)}var w=window.jQuery,m=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),y={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};w.fn.qrcode=function(r){var t=w.extend({},y,r);return this.each(function(r,e){"canvas"===e.nodeName.toLowerCase()?g(e,t):w(e).append(d(t))})}}(function(){var r=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;r<t.length&&0==t[r];)r+=1;for(var n=new Array(t.length-r+e),o=0;o<t.length-r;o+=1)n[o]=t[o+r];return n}(),o={};return o.getAt=function(r){return n[r]},o.getLength=function(){return n.length},o.multiply=function(t){for(var e=new Array(o.getLength()+t.getLength()-1),n=0;n<o.getLength();n+=1)for(var a=0;a<t.getLength();a+=1)e[n+a]^=i.gexp(i.glog(o.getAt(n))+i.glog(t.getAt(a)));return r(e,0)},o.mod=function(t){if(o.getLength()-t.getLength()<0)return o;for(var e=i.glog(o.getAt(0))-i.glog(t.getAt(0)),n=new Array(o.getLength()),a=0;a<o.getLength();a+=1)n[a]=o.getAt(a);for(var a=0;a<t.getLength();a+=1)n[a]^=i.gexp(i.glog(t.getAt(a))+e);return r(n,0).mod(t)},o}var t=function(t,e){var o=236,i=17,l=t,g=n[e],s=null,v=0,d=null,w=new Array,m={},y=function(r,t){v=4*l+17,s=function(r){for(var t=new Array(r),e=0;r>e;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(v),T(0,0),T(v-7,0),T(0,v-7),A(),B(),k(r,t),l>=7&&E(r),null==d&&(d=D(l,g,w)),M(d,t)},T=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=v))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=v||(e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?s[r+e][t+n]=!0:s[r+e][t+n]=!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){y(!0,e);var n=a.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;v-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;v-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},A=function(){for(var r=a.getPatternPosition(l),t=0;t<r.length;t+=1)for(var e=0;e<r.length;e+=1){var n=r[t],o=r[e];if(null==s[n][o])for(var i=-2;2>=i;i+=1)for(var u=-2;2>=u;u+=1)-2==i||2==i||-2==u||2==u||0==i&&0==u?s[n+i][o+u]=!0:s[n+i][o+u]=!1}},E=function(r){for(var t=a.getBCHTypeNumber(l),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+v-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+v-8-3][Math.floor(e/3)]=n}},k=function(r,t){for(var e=g<<3|t,n=a.getBCHTypeInfo(e),o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);6>o?s[o][8]=i:8>o?s[o+1][8]=i:s[v-15+o][8]=i}for(var o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);8>o?s[8][v-o-1]=i:9>o?s[8][15-o-1+1]=i:s[8][15-o-1]=i}s[v-8][8]=!r},M=function(r,t){for(var e=-1,n=v-1,o=7,i=0,u=a.getMaskFunction(t),f=v-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var c=0;2>c;c+=1)if(null==s[n][f-c]){var l=!1;i<r.length&&(l=1==(r[i]>>>o&1));var g=u(n,f-c);g&&(l=!l),s[n][f-c]=l,o-=1,-1==o&&(i+=1,o=7)}if(n+=e,0>n||n>=v){n-=e,e=-e;break}}},C=function(t,e){for(var n=0,o=0,i=0,u=new Array(e.length),f=new Array(e.length),c=0;c<e.length;c+=1){var l=e[c].dataCount,g=e[c].totalCount-l;o=Math.max(o,l),i=Math.max(i,g),u[c]=new Array(l);for(var s=0;s<u[c].length;s+=1)u[c][s]=255&t.getBuffer()[s+n];n+=l;var v=a.getErrorCorrectPolynomial(g),h=r(u[c],v.getLength()-1),d=h.mod(v);f[c]=new Array(v.getLength()-1);for(var s=0;s<f[c].length;s+=1){var w=s+d.getLength()-f[c].length;f[c][s]=w>=0?d.getAt(w):0}}for(var m=0,s=0;s<e.length;s+=1)m+=e[s].totalCount;for(var y=new Array(m),T=0,s=0;o>s;s+=1)for(var c=0;c<e.length;c+=1)s<u[c].length&&(y[T]=u[c][s],T+=1);for(var s=0;i>s;s+=1)for(var c=0;c<e.length;c+=1)s<f[c].length&&(y[T]=f[c][s],T+=1);return y},D=function(r,t,e){for(var n=u.getRSBlocks(r,t),c=f(),l=0;l<e.length;l+=1){var g=e[l];c.put(g.getMode(),4),c.put(g.getLength(),a.getLengthInBits(g.getMode(),r)),g.write(c)}for(var s=0,l=0;l<n.length;l+=1)s+=n[l].dataCount;if(c.getLengthInBits()>8*s)throw new Error("code length overflow. ("+c.getLengthInBits()+">"+8*s+")");for(c.getLengthInBits()+4<=8*s&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;;){if(c.getLengthInBits()>=8*s)break;if(c.put(o,8),c.getLengthInBits()>=8*s)break;c.put(i,8)}return C(c,n)};return m.addData=function(r){var t=c(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=v||0>t||t>=v)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return v},m.make=function(){y(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='<table style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: "+t+"px;",e+='">',e+="<tbody>";for(var n=0;n<m.getModuleCount();n+=1){e+="<tr>";for(var o=0;o<m.getModuleCount();o+=1)e+='<td style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: 0px;",e+=" width: "+r+"px;",e+=" height: "+r+"px;",e+=" background-color: ",e+=m.isDark(n,o)?"#000000":"#ffffff",e+=";",e+='"/>';e+="</tr>"}return e+="</tbody>",e+="</table>"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return h(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return m.isDark(i,a)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;e<r.length;e+=1){var n=r.charCodeAt(e);t.push(255&n)}return t},t.createStringToBytes=function(r,t){var e=function(){for(var e=s(r),n=function(){var r=e.read();if(-1==r)throw new Error;return r},o=0,a={};;){var i=e.read();if(-1==i)break;var u=n(),f=n(),c=n(),l=String.fromCharCode(i<<8|u),g=f<<8|c;a[l]=g,o+=1}if(o!=t)throw new Error(o+" != "+t);return a}(),n="?".charCodeAt(0);return function(r){for(var t=new Array,o=0;o<r.length;o+=1){var a=r.charCodeAt(o);if(128>a)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},a=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,a=7973,u=21522,f={},c=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;c(t)-c(n)>=0;)t^=n<<c(t)-c(n);return(r<<10|t)^u},f.getBCHTypeNumber=function(r){for(var t=r<<12;c(t)-c(a)>=0;)t^=a<<c(t)-c(a);return r<<12|t},f.getPatternPosition=function(r){return t[r-1]},f.getMaskFunction=function(r){switch(r){case o.PATTERN000:return function(r,t){return(r+t)%2==0};case o.PATTERN001:return function(r,t){return r%2==0};case o.PATTERN010:return function(r,t){return t%3==0};case o.PATTERN011:return function(r,t){return(r+t)%3==0};case o.PATTERN100:return function(r,t){return(Math.floor(r/2)+Math.floor(t/3))%2==0};case o.PATTERN101:return function(r,t){return r*t%2+r*t%3==0};case o.PATTERN110:return function(r,t){return(r*t%2+r*t%3)%2==0};case o.PATTERN111:return function(r,t){return(r*t%3+(r+t)%2)%2==0};default:throw new Error("bad maskPattern:"+r)}},f.getErrorCorrectPolynomial=function(t){for(var e=r([1],0),n=0;t>n;n+=1)e=e.multiply(r([1,i.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),(0==c||4==c)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var l=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(l+=1);var g=Math.abs(100*l/t/t-50)/5;return e+=10*g},f}(),i=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<<e;for(var e=8;256>e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=n.length/3,i=new Array,u=0;a>u;u+=1)for(var f=n[3*u+0],c=n[3*u+1],l=n[3*u+2],g=0;f>g;g+=1)i.push(t(c,l));return i},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},c=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),a={};return a.getMode=function(){return n},a.getLength=function(r){return o.length},a.write=function(r){for(var t=0;t<o.length;t+=1)r.put(o[t],8)},a},l=function(){var r=new Array,t={};return t.writeByte=function(t){r.push(255&t)},t.writeShort=function(r){t.writeByte(r),t.writeByte(r>>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e<r.length;e+=1)t.writeByte(r.charCodeAt(e))},t.toByteArray=function(){return r},t.toString=function(){var t="";t+="[";for(var e=0;e<r.length;e+=1)e>0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;o>i;i+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},v=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<<e|n)),o-=8-e,r>>>=8-e,n=0,e=0;n=r<<e|n,e+=o},o.flush=function(){e>0&&t.writeByte(n)},o},u=function(r){for(var t=1<<r,e=(1<<r)+1,n=r+1,a=f(),u=0;t>u;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=l(),g=i(c);g.write(t,n);var s=0,v=String.fromCharCode(o[s]);for(s+=1;s<o.length;){var h=String.fromCharCode(o[s]);s+=1,a.contains(v+h)?v+=h:(g.write(a.indexOf(v),n),a.size()<4095&&(a.size()==1<<n&&(n+=1),a.add(v+h)),v=h)}return g.write(a.indexOf(v),n),g.write(e,n),g.flush(),c.toByteArray()},f=function(){var r={},t=0,e={};return e.add=function(n){if(e.contains(n))throw new Error("dup key:"+n);r[n]=t,t+=1},e.size=function(){return t},e.indexOf=function(t){return r[t]},e.contains=function(t){return"undefined"!=typeof r[t]},e};return a},h=function(r,t,e,n){for(var o=v(r,t),a=0;t>a;a+=1)for(var i=0;r>i;i+=1)o.setPixel(i,a,e(i,a));var u=l();o.write(u);for(var f=g(),c=u.toByteArray(),s=0;s<c.length;s+=1)f.writeByte(c[s]);f.flush();var h="";return h+="<img",h+=' src="',h+="data:image/gif;base64,",h+=f,h+='"',h+=' width="',h+=r,h+='"',h+=' height="',h+=t,h+='"',n&&(h+=' alt="',h+=n,h+='"'),h+="/>"};return t}();return function(r){"function"==typeof define&&define.amd?define([],r):"object"==typeof exports&&(module.exports=r())}(function(){return r}),!function(r){r.stringToBytes=function(r){function t(r){for(var t=[],e=0;e<r.length;e++){var n=r.charCodeAt(e);128>n?t.push(n):2048>n?t.push(192|n>>6,128|63&n):55296>n||n>=57344?t.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&r.charCodeAt(e)),t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return t}return t(r)}}(r),r}());
1
+ /*! jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */
2
  !function(r){"use strict";function t(t,e,n,o){function a(r,t){return r-=o,t-=o,0>r||r>=c||0>t||t>=c?!1:f.isDark(r,t)}function i(r,t,e,n){var o=u.isDark,a=1/l;u.isDark=function(i,u){var f=u*a,c=i*a,l=f+a,g=c+a;return o(i,u)&&(r>l||f>e||t>g||c>n)}}var u={},f=r(n,e);f.addData(t),f.make(),o=o||0;var c=f.getModuleCount(),l=f.getModuleCount()+2*o;return u.text=t,u.level=e,u.version=n,u.moduleCount=l,u.isDark=a,u.addBlank=i,u}function e(r,e,n,o,a){n=Math.max(1,n||1),o=Math.min(40,o||40);for(var i=n;o>=i;i+=1)try{return t(r,e,i,a)}catch(u){}}function n(r,t,e){var n=e.size,o="bold "+e.mSize*n+"px "+e.fontname,a=w("<canvas/>")[0].getContext("2d");a.font=o;var i=a.measureText(e.label).width,u=e.mSize,f=i/n,c=(1-f)*e.mPosX,l=(1-u)*e.mPosY,g=c+f,s=l+u,v=.01;1===e.mode?r.addBlank(0,l-v,n,s+v):r.addBlank(c-v,l-v,g+v,s+v),t.fillStyle=e.fontcolor,t.font=o,t.fillText(e.label,c*n,l*n+.75*e.mSize*n)}function o(r,t,e){var n=e.size,o=e.image.naturalWidth||1,a=e.image.naturalHeight||1,i=e.mSize,u=i*o/a,f=(1-u)*e.mPosX,c=(1-i)*e.mPosY,l=f+u,g=c+i,s=.01;3===e.mode?r.addBlank(0,c-s,n,g+s):r.addBlank(f-s,c-s,l+s,g+s),t.drawImage(e.image,f*n,c*n,u*n,i*n)}function a(r,t,e){w(e.background).is("img")?t.drawImage(e.background,0,0,e.size,e.size):e.background&&(t.fillStyle=e.background,t.fillRect(e.left,e.top,e.size,e.size));var a=e.mode;1===a||2===a?n(r,t,e):(3===a||4===a)&&o(r,t,e)}function i(r,t,e,n,o,a,i,u){r.isDark(i,u)&&t.rect(n,o,a,a)}function u(r,t,e,n,o,a,i,u,f,c){i?r.moveTo(t+a,e):r.moveTo(t,e),u?(r.lineTo(n-a,e),r.arcTo(n,e,n,o,a)):r.lineTo(n,e),f?(r.lineTo(n,o-a),r.arcTo(n,o,t,o,a)):r.lineTo(n,o),c?(r.lineTo(t+a,o),r.arcTo(t,o,t,e,a)):r.lineTo(t,o),i?(r.lineTo(t,e+a),r.arcTo(t,e,n,e,a)):r.lineTo(t,e)}function f(r,t,e,n,o,a,i,u,f,c){i&&(r.moveTo(t+a,e),r.lineTo(t,e),r.lineTo(t,e+a),r.arcTo(t,e,t+a,e,a)),u&&(r.moveTo(n-a,e),r.lineTo(n,e),r.lineTo(n,e+a),r.arcTo(n,e,n-a,e,a)),f&&(r.moveTo(n-a,o),r.lineTo(n,o),r.lineTo(n,o-a),r.arcTo(n,o,n-a,o,a)),c&&(r.moveTo(t+a,o),r.lineTo(t,o),r.lineTo(t,o-a),r.arcTo(t,o,t+a,o,a))}function c(r,t,e,n,o,a,i,c){var l=r.isDark,g=n+a,s=o+a,v=e.radius*a,h=i-1,d=i+1,w=c-1,m=c+1,y=l(i,c),T=l(h,w),p=l(h,c),B=l(h,m),A=l(i,m),E=l(d,m),k=l(d,c),M=l(d,w),C=l(i,w);y?u(t,n,o,g,s,v,!p&&!C,!p&&!A,!k&&!A,!k&&!C):f(t,n,o,g,s,v,p&&C&&T,p&&A&&B,k&&A&&E,k&&C&&M)}function l(r,t,e){var n,o,a=r.moduleCount,u=e.size/a,f=i;for(e.radius>0&&e.radius<=.5&&(f=c),t.beginPath(),n=0;a>n;n+=1)for(o=0;a>o;o+=1){var l=e.left+o*u,g=e.top+n*u,s=u;f(r,t,e,l,g,s,n,o)}if(w(e.fill).is("img")){t.strokeStyle="rgba(0,0,0,0.5)",t.lineWidth=2,t.stroke();var v=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",t.fill(),t.globalCompositeOperation=v,t.clip(),t.drawImage(e.fill,0,0,e.size,e.size),t.restore()}else t.fillStyle=e.fill,t.fill()}function g(r,t){var n=e(t.text,t.ecLevel,t.minVersion,t.maxVersion,t.quiet);if(!n)return null;var o=w(r).data("qrcode",n),i=o[0].getContext("2d");return a(n,i,t),l(n,i,t),o}function s(r){var t=w("<canvas/>").attr("width",r.size).attr("height",r.size);return g(t,r)}function v(r){return w("<img/>").attr("src",s(r)[0].toDataURL("image/png"))}function h(r){var t=e(r.text,r.ecLevel,r.minVersion,r.maxVersion,r.quiet);if(!t)return null;var n,o,a=r.size,i=r.background,u=Math.floor,f=t.moduleCount,c=u(a/f),l=u(.5*(a-c*f)),g={position:"relative",left:0,top:0,padding:0,margin:0,width:a,height:a},s={position:"absolute",padding:0,margin:0,width:c,height:c,"background-color":r.fill},v=w("<div/>").data("qrcode",t).css(g);for(i&&v.css("background-color",i),n=0;f>n;n+=1)for(o=0;f>o;o+=1)t.isDark(n,o)&&w("<div/>").css(s).css({left:l+o*c,top:l+n*c}).appendTo(v);return v}function d(r){return m&&"canvas"===r.render?s(r):m&&"image"===r.render?v(r):h(r)}var w=window.jQuery,m=function(){var r=document.createElement("canvas");return!(!r.getContext||!r.getContext("2d"))}(),y={render:"canvas",minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:0,quiet:0,mode:0,mSize:.1,mPosX:.5,mPosY:.5,label:"no label",fontname:"sans",fontcolor:"#000",image:null};w.fn.qrcode=function(r){var t=w.extend({},y,r);return this.each(function(r,e){"canvas"===e.nodeName.toLowerCase()?g(e,t):w(e).append(d(t))})}}(function(){var r=function(){function r(t,e){if("undefined"==typeof t.length)throw new Error(t.length+"/"+e);var n=function(){for(var r=0;r<t.length&&0==t[r];)r+=1;for(var n=new Array(t.length-r+e),o=0;o<t.length-r;o+=1)n[o]=t[o+r];return n}(),o={};return o.getAt=function(r){return n[r]},o.getLength=function(){return n.length},o.multiply=function(t){for(var e=new Array(o.getLength()+t.getLength()-1),n=0;n<o.getLength();n+=1)for(var a=0;a<t.getLength();a+=1)e[n+a]^=i.gexp(i.glog(o.getAt(n))+i.glog(t.getAt(a)));return r(e,0)},o.mod=function(t){if(o.getLength()-t.getLength()<0)return o;for(var e=i.glog(o.getAt(0))-i.glog(t.getAt(0)),n=new Array(o.getLength()),a=0;a<o.getLength();a+=1)n[a]=o.getAt(a);for(var a=0;a<t.getLength();a+=1)n[a]^=i.gexp(i.glog(t.getAt(a))+e);return r(n,0).mod(t)},o}var t=function(t,e){var o=236,i=17,l=t,g=n[e],s=null,v=0,d=null,w=new Array,m={},y=function(r,t){v=4*l+17,s=function(r){for(var t=new Array(r),e=0;r>e;e+=1){t[e]=new Array(r);for(var n=0;r>n;n+=1)t[e][n]=null}return t}(v),T(0,0),T(v-7,0),T(0,v-7),A(),B(),k(r,t),l>=7&&E(r),null==d&&(d=D(l,g,w)),M(d,t)},T=function(r,t){for(var e=-1;7>=e;e+=1)if(!(-1>=r+e||r+e>=v))for(var n=-1;7>=n;n+=1)-1>=t+n||t+n>=v||(e>=0&&6>=e&&(0==n||6==n)||n>=0&&6>=n&&(0==e||6==e)||e>=2&&4>=e&&n>=2&&4>=n?s[r+e][t+n]=!0:s[r+e][t+n]=!1)},p=function(){for(var r=0,t=0,e=0;8>e;e+=1){y(!0,e);var n=a.getLostPoint(m);(0==e||r>n)&&(r=n,t=e)}return t},B=function(){for(var r=8;v-8>r;r+=1)null==s[r][6]&&(s[r][6]=r%2==0);for(var t=8;v-8>t;t+=1)null==s[6][t]&&(s[6][t]=t%2==0)},A=function(){for(var r=a.getPatternPosition(l),t=0;t<r.length;t+=1)for(var e=0;e<r.length;e+=1){var n=r[t],o=r[e];if(null==s[n][o])for(var i=-2;2>=i;i+=1)for(var u=-2;2>=u;u+=1)-2==i||2==i||-2==u||2==u||0==i&&0==u?s[n+i][o+u]=!0:s[n+i][o+u]=!1}},E=function(r){for(var t=a.getBCHTypeNumber(l),e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[Math.floor(e/3)][e%3+v-8-3]=n}for(var e=0;18>e;e+=1){var n=!r&&1==(t>>e&1);s[e%3+v-8-3][Math.floor(e/3)]=n}},k=function(r,t){for(var e=g<<3|t,n=a.getBCHTypeInfo(e),o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);6>o?s[o][8]=i:8>o?s[o+1][8]=i:s[v-15+o][8]=i}for(var o=0;15>o;o+=1){var i=!r&&1==(n>>o&1);8>o?s[8][v-o-1]=i:9>o?s[8][15-o-1+1]=i:s[8][15-o-1]=i}s[v-8][8]=!r},M=function(r,t){for(var e=-1,n=v-1,o=7,i=0,u=a.getMaskFunction(t),f=v-1;f>0;f-=2)for(6==f&&(f-=1);;){for(var c=0;2>c;c+=1)if(null==s[n][f-c]){var l=!1;i<r.length&&(l=1==(r[i]>>>o&1));var g=u(n,f-c);g&&(l=!l),s[n][f-c]=l,o-=1,-1==o&&(i+=1,o=7)}if(n+=e,0>n||n>=v){n-=e,e=-e;break}}},C=function(t,e){for(var n=0,o=0,i=0,u=new Array(e.length),f=new Array(e.length),c=0;c<e.length;c+=1){var l=e[c].dataCount,g=e[c].totalCount-l;o=Math.max(o,l),i=Math.max(i,g),u[c]=new Array(l);for(var s=0;s<u[c].length;s+=1)u[c][s]=255&t.getBuffer()[s+n];n+=l;var v=a.getErrorCorrectPolynomial(g),h=r(u[c],v.getLength()-1),d=h.mod(v);f[c]=new Array(v.getLength()-1);for(var s=0;s<f[c].length;s+=1){var w=s+d.getLength()-f[c].length;f[c][s]=w>=0?d.getAt(w):0}}for(var m=0,s=0;s<e.length;s+=1)m+=e[s].totalCount;for(var y=new Array(m),T=0,s=0;o>s;s+=1)for(var c=0;c<e.length;c+=1)s<u[c].length&&(y[T]=u[c][s],T+=1);for(var s=0;i>s;s+=1)for(var c=0;c<e.length;c+=1)s<f[c].length&&(y[T]=f[c][s],T+=1);return y},D=function(r,t,e){for(var n=u.getRSBlocks(r,t),c=f(),l=0;l<e.length;l+=1){var g=e[l];c.put(g.getMode(),4),c.put(g.getLength(),a.getLengthInBits(g.getMode(),r)),g.write(c)}for(var s=0,l=0;l<n.length;l+=1)s+=n[l].dataCount;if(c.getLengthInBits()>8*s)throw new Error("code length overflow. ("+c.getLengthInBits()+">"+8*s+")");for(c.getLengthInBits()+4<=8*s&&c.put(0,4);c.getLengthInBits()%8!=0;)c.putBit(!1);for(;;){if(c.getLengthInBits()>=8*s)break;if(c.put(o,8),c.getLengthInBits()>=8*s)break;c.put(i,8)}return C(c,n)};return m.addData=function(r){var t=c(r);w.push(t),d=null},m.isDark=function(r,t){if(0>r||r>=v||0>t||t>=v)throw new Error(r+","+t);return s[r][t]},m.getModuleCount=function(){return v},m.make=function(){y(!1,p())},m.createTableTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e="";e+='<table style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: "+t+"px;",e+='">',e+="<tbody>";for(var n=0;n<m.getModuleCount();n+=1){e+="<tr>";for(var o=0;o<m.getModuleCount();o+=1)e+='<td style="',e+=" border-width: 0px; border-style: none;",e+=" border-collapse: collapse;",e+=" padding: 0px; margin: 0px;",e+=" width: "+r+"px;",e+=" height: "+r+"px;",e+=" background-color: ",e+=m.isDark(n,o)?"#000000":"#ffffff",e+=";",e+='"/>';e+="</tr>"}return e+="</tbody>",e+="</table>"},m.createImgTag=function(r,t){r=r||2,t="undefined"==typeof t?4*r:t;var e=m.getModuleCount()*r+2*t,n=t,o=e-t;return h(e,e,function(t,e){if(t>=n&&o>t&&e>=n&&o>e){var a=Math.floor((t-n)/r),i=Math.floor((e-n)/r);return m.isDark(i,a)?0:1}return 1})},m};t.stringToBytes=function(r){for(var t=new Array,e=0;e<r.length;e+=1){var n=r.charCodeAt(e);t.push(255&n)}return t},t.createStringToBytes=function(r,t){var e=function(){for(var e=s(r),n=function(){var r=e.read();if(-1==r)throw new Error;return r},o=0,a={};;){var i=e.read();if(-1==i)break;var u=n(),f=n(),c=n(),l=String.fromCharCode(i<<8|u),g=f<<8|c;a[l]=g,o+=1}if(o!=t)throw new Error(o+" != "+t);return a}(),n="?".charCodeAt(0);return function(r){for(var t=new Array,o=0;o<r.length;o+=1){var a=r.charCodeAt(o);if(128>a)t.push(a);else{var i=e[r.charAt(o)];"number"==typeof i?(255&i)==i?t.push(i):(t.push(i>>>8),t.push(255&i)):t.push(n)}}return t}};var e={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},n={L:1,M:0,Q:3,H:2},o={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},a=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],n=1335,a=7973,u=21522,f={},c=function(r){for(var t=0;0!=r;)t+=1,r>>>=1;return t};return f.getBCHTypeInfo=function(r){for(var t=r<<10;c(t)-c(n)>=0;)t^=n<<c(t)-c(n);return(r<<10|t)^u},f.getBCHTypeNumber=function(r){for(var t=r<<12;c(t)-c(a)>=0;)t^=a<<c(t)-c(a);return r<<12|t},f.getPatternPosition=function(r){return t[r-1]},f.getMaskFunction=function(r){switch(r){case o.PATTERN000:return function(r,t){return(r+t)%2==0};case o.PATTERN001:return function(r,t){return r%2==0};case o.PATTERN010:return function(r,t){return t%3==0};case o.PATTERN011:return function(r,t){return(r+t)%3==0};case o.PATTERN100:return function(r,t){return(Math.floor(r/2)+Math.floor(t/3))%2==0};case o.PATTERN101:return function(r,t){return r*t%2+r*t%3==0};case o.PATTERN110:return function(r,t){return(r*t%2+r*t%3)%2==0};case o.PATTERN111:return function(r,t){return(r*t%3+(r+t)%2)%2==0};default:throw new Error("bad maskPattern:"+r)}},f.getErrorCorrectPolynomial=function(t){for(var e=r([1],0),n=0;t>n;n+=1)e=e.multiply(r([1,i.gexp(n)],0));return e},f.getLengthInBits=function(r,t){if(t>=1&&10>t)switch(r){case e.MODE_NUMBER:return 10;case e.MODE_ALPHA_NUM:return 9;case e.MODE_8BIT_BYTE:return 8;case e.MODE_KANJI:return 8;default:throw new Error("mode:"+r)}else if(27>t)switch(r){case e.MODE_NUMBER:return 12;case e.MODE_ALPHA_NUM:return 11;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 10;default:throw new Error("mode:"+r)}else{if(!(41>t))throw new Error("type:"+t);switch(r){case e.MODE_NUMBER:return 14;case e.MODE_ALPHA_NUM:return 13;case e.MODE_8BIT_BYTE:return 16;case e.MODE_KANJI:return 12;default:throw new Error("mode:"+r)}}},f.getLostPoint=function(r){for(var t=r.getModuleCount(),e=0,n=0;t>n;n+=1)for(var o=0;t>o;o+=1){for(var a=0,i=r.isDark(n,o),u=-1;1>=u;u+=1)if(!(0>n+u||n+u>=t))for(var f=-1;1>=f;f+=1)0>o+f||o+f>=t||(0!=u||0!=f)&&i==r.isDark(n+u,o+f)&&(a+=1);a>5&&(e+=3+a-5)}for(var n=0;t-1>n;n+=1)for(var o=0;t-1>o;o+=1){var c=0;r.isDark(n,o)&&(c+=1),r.isDark(n+1,o)&&(c+=1),r.isDark(n,o+1)&&(c+=1),r.isDark(n+1,o+1)&&(c+=1),(0==c||4==c)&&(e+=3)}for(var n=0;t>n;n+=1)for(var o=0;t-6>o;o+=1)r.isDark(n,o)&&!r.isDark(n,o+1)&&r.isDark(n,o+2)&&r.isDark(n,o+3)&&r.isDark(n,o+4)&&!r.isDark(n,o+5)&&r.isDark(n,o+6)&&(e+=40);for(var o=0;t>o;o+=1)for(var n=0;t-6>n;n+=1)r.isDark(n,o)&&!r.isDark(n+1,o)&&r.isDark(n+2,o)&&r.isDark(n+3,o)&&r.isDark(n+4,o)&&!r.isDark(n+5,o)&&r.isDark(n+6,o)&&(e+=40);for(var l=0,o=0;t>o;o+=1)for(var n=0;t>n;n+=1)r.isDark(n,o)&&(l+=1);var g=Math.abs(100*l/t/t-50)/5;return e+=10*g},f}(),i=function(){for(var r=new Array(256),t=new Array(256),e=0;8>e;e+=1)r[e]=1<<e;for(var e=8;256>e;e+=1)r[e]=r[e-4]^r[e-5]^r[e-6]^r[e-8];for(var e=0;255>e;e+=1)t[r[e]]=e;var n={};return n.glog=function(r){if(1>r)throw new Error("glog("+r+")");return t[r]},n.gexp=function(t){for(;0>t;)t+=255;for(;t>=256;)t-=255;return r[t]},n}(),u=function(){var r=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(r,t){var e={};return e.totalCount=r,e.dataCount=t,e},e={},o=function(t,e){switch(e){case n.L:return r[4*(t-1)+0];case n.M:return r[4*(t-1)+1];case n.Q:return r[4*(t-1)+2];case n.H:return r[4*(t-1)+3];default:return}};return e.getRSBlocks=function(r,e){var n=o(r,e);if("undefined"==typeof n)throw new Error("bad rs block @ typeNumber:"+r+"/errorCorrectLevel:"+e);for(var a=n.length/3,i=new Array,u=0;a>u;u+=1)for(var f=n[3*u+0],c=n[3*u+1],l=n[3*u+2],g=0;f>g;g+=1)i.push(t(c,l));return i},e}(),f=function(){var r=new Array,t=0,e={};return e.getBuffer=function(){return r},e.getAt=function(t){var e=Math.floor(t/8);return 1==(r[e]>>>7-t%8&1)},e.put=function(r,t){for(var n=0;t>n;n+=1)e.putBit(1==(r>>>t-n-1&1))},e.getLengthInBits=function(){return t},e.putBit=function(e){var n=Math.floor(t/8);r.length<=n&&r.push(0),e&&(r[n]|=128>>>t%8),t+=1},e},c=function(r){var n=e.MODE_8BIT_BYTE,o=t.stringToBytes(r),a={};return a.getMode=function(){return n},a.getLength=function(r){return o.length},a.write=function(r){for(var t=0;t<o.length;t+=1)r.put(o[t],8)},a},l=function(){var r=new Array,t={};return t.writeByte=function(t){r.push(255&t)},t.writeShort=function(r){t.writeByte(r),t.writeByte(r>>>8)},t.writeBytes=function(r,e,n){e=e||0,n=n||r.length;for(var o=0;n>o;o+=1)t.writeByte(r[o+e])},t.writeString=function(r){for(var e=0;e<r.length;e+=1)t.writeByte(r.charCodeAt(e))},t.toByteArray=function(){return r},t.toString=function(){var t="";t+="[";for(var e=0;e<r.length;e+=1)e>0&&(t+=","),t+=r[e];return t+="]"},t},g=function(){var r=0,t=0,e=0,n="",o={},a=function(r){n+=String.fromCharCode(i(63&r))},i=function(r){if(0>r);else{if(26>r)return 65+r;if(52>r)return 97+(r-26);if(62>r)return 48+(r-52);if(62==r)return 43;if(63==r)return 47}throw new Error("n:"+r)};return o.writeByte=function(n){for(r=r<<8|255&n,t+=8,e+=1;t>=6;)a(r>>>t-6),t-=6},o.flush=function(){if(t>0&&(a(r<<6-t),r=0,t=0),e%3!=0)for(var o=3-e%3,i=0;o>i;i+=1)n+="="},o.toString=function(){return n},o},s=function(r){var t=r,e=0,n=0,o=0,a={};a.read=function(){for(;8>o;){if(e>=t.length){if(0==o)return-1;throw new Error("unexpected end of file./"+o)}var r=t.charAt(e);if(e+=1,"="==r)return o=0,-1;r.match(/^\s$/)||(n=n<<6|i(r.charCodeAt(0)),o+=6)}var a=n>>>o-8&255;return o-=8,a};var i=function(r){if(r>=65&&90>=r)return r-65;if(r>=97&&122>=r)return r-97+26;if(r>=48&&57>=r)return r-48+52;if(43==r)return 62;if(47==r)return 63;throw new Error("c:"+r)};return a},v=function(r,t){var e=r,n=t,o=new Array(r*t),a={};a.setPixel=function(r,t,n){o[t*e+r]=n},a.write=function(r){r.writeString("GIF87a"),r.writeShort(e),r.writeShort(n),r.writeByte(128),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(0),r.writeByte(255),r.writeByte(255),r.writeByte(255),r.writeString(","),r.writeShort(0),r.writeShort(0),r.writeShort(e),r.writeShort(n),r.writeByte(0);var t=2,o=u(t);r.writeByte(t);for(var a=0;o.length-a>255;)r.writeByte(255),r.writeBytes(o,a,255),a+=255;r.writeByte(o.length-a),r.writeBytes(o,a,o.length-a),r.writeByte(0),r.writeString(";")};var i=function(r){var t=r,e=0,n=0,o={};return o.write=function(r,o){if(r>>>o!=0)throw new Error("length over");for(;e+o>=8;)t.writeByte(255&(r<<e|n)),o-=8-e,r>>>=8-e,n=0,e=0;n=r<<e|n,e+=o},o.flush=function(){e>0&&t.writeByte(n)},o},u=function(r){for(var t=1<<r,e=(1<<r)+1,n=r+1,a=f(),u=0;t>u;u+=1)a.add(String.fromCharCode(u));a.add(String.fromCharCode(t)),a.add(String.fromCharCode(e));var c=l(),g=i(c);g.write(t,n);var s=0,v=String.fromCharCode(o[s]);for(s+=1;s<o.length;){var h=String.fromCharCode(o[s]);s+=1,a.contains(v+h)?v+=h:(g.write(a.indexOf(v),n),a.size()<4095&&(a.size()==1<<n&&(n+=1),a.add(v+h)),v=h)}return g.write(a.indexOf(v),n),g.write(e,n),g.flush(),c.toByteArray()},f=function(){var r={},t=0,e={};return e.add=function(n){if(e.contains(n))throw new Error("dup key:"+n);r[n]=t,t+=1},e.size=function(){return t},e.indexOf=function(t){return r[t]},e.contains=function(t){return"undefined"!=typeof r[t]},e};return a},h=function(r,t,e,n){for(var o=v(r,t),a=0;t>a;a+=1)for(var i=0;r>i;i+=1)o.setPixel(i,a,e(i,a));var u=l();o.write(u);for(var f=g(),c=u.toByteArray(),s=0;s<c.length;s+=1)f.writeByte(c[s]);f.flush();var h="";return h+="<img",h+=' src="',h+="data:image/gif;base64,",h+=f,h+='"',h+=' width="',h+=r,h+='"',h+=' height="',h+=t,h+='"',n&&(h+=' alt="',h+=n,h+='"'),h+="/>"};return t}();return function(r){"function"==typeof define&&define.amd?define([],r):"object"==typeof exports&&(module.exports=r())}(function(){return r}),!function(r){r.stringToBytes=function(r){function t(r){for(var t=[],e=0;e<r.length;e++){var n=r.charCodeAt(e);128>n?t.push(n):2048>n?t.push(192|n>>6,128|63&n):55296>n||n>=57344?t.push(224|n>>12,128|n>>6&63,128|63&n):(e++,n=65536+((1023&n)<<10|1023&r.charCodeAt(e)),t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return t}return t(r)}}(r),r}());
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-mepr.js ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ let submitSelectorClass = jQuery(submitSelector).attr('class');
26
+
27
+ 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" />';
28
+ 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" />';
29
+ authType = 'email';
30
+
31
+ switch (authType)
32
+ {
33
+ case 'phone':
34
+ jQuery(phoneSelector).wrap( "<div class='buttonInsidePhone'></div>" );
35
+ jQuery(phoneSelector).after('<button class="mo2f_send_phoneotp_button" id="mo2f_send_ajax_sms">Send OTP</button> ');
36
+ mo2f_ajax_before_reg();
37
+ break;
38
+
39
+ case 'email':
40
+ jQuery(emailSelector).wrap( "<div class='buttonInsideEmail'></div>" );
41
+ jQuery(emailSelector).after('<button class="mo2f_send_emailotp_button" id="mo2f_send_ajax_email">Send OTP</button>');
42
+ mo2f_ajax_before_reg();
43
+ break;
44
+
45
+ case 'both':
46
+ isBoth = true;
47
+ jQuery(phoneSelector).wrap( "<div class='buttonInsidePhone'></div>" );
48
+ jQuery(phoneSelector).after('<button class="mo2f_send_phoneotp_button" id="mo2f_send_ajax_sms">Send OTP</button> ');
49
+ jQuery(emailSelector).wrap( "<div class='buttonInsideEmail'></div>" );
50
+ jQuery(emailSelector).after('<button class="mo2f_send_emailotp_button" id="mo2f_send_ajax_email">Send OTP</button>');
51
+ mo2f_ajax_before_reg();
52
+ break;
53
+
54
+ default:
55
+ break;
56
+ }
57
+
58
+
59
+ jQuery("#mo2f_send_ajax_email").click(function(e){
60
+ e.preventDefault();
61
+ var mo2f_email = jQuery(emailSelector).val();
62
+ if (validateEmail(mo2f_email))
63
+ {
64
+ let data =
65
+ {
66
+ 'action' : 'mo_ajax_register',
67
+ 'mo_action' : 'send_otp_over_email',
68
+ 'email' : mo2f_email,
69
+ 'nonce' : nonce,
70
+ 'authTypeSend' : 'email'
71
+ }
72
+
73
+ $mo.post(ajaxurl, data,function (response){
74
+ jQuery("#mo2f_send_ajax_email").html("Resend OTP");
75
+ if(response.status=='SUCCESS'){
76
+ email_txId = response.txId;
77
+ if(typeof jQuery('#mo2f_email_otp').val() == 'undefined')
78
+ jQuery(".buttonInsideEmail").after(otp_over_email);
79
+ }
80
+ });
81
+ }else
82
+ { jQuery("#mo2f_error").empty();
83
+ jQuery(".buttonInsideEmail").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please enter valid email address</span></p>");
84
+ }
85
+
86
+ });
87
+
88
+ jQuery("#mo2f_send_ajax_sms").click(function(e){
89
+ e.preventDefault();
90
+ var mo2f_phone = jQuery(phoneSelector).val();
91
+ if (validatePhone(mo2f_phone))
92
+ {
93
+ let data =
94
+ {
95
+ 'action' : 'mo_ajax_register',
96
+ 'mo_action' : 'send_otp_over_sms',
97
+ 'phone' : mo2f_phone,
98
+ 'nonce' : nonce,
99
+ 'authTypeSend' : 'phone'
100
+ }
101
+
102
+ $mo.post(ajaxurl, data,function (response){
103
+ jQuery("#mo2f_send_ajax_sms").html("Resend OTP");
104
+ if(response.status=='SUCCESS'){
105
+ sms_txId = response.txId;
106
+ jQuery(".buttonInsidePhone").after(otp_over_sms);
107
+ }
108
+ });
109
+ }else{
110
+ jQuery("#mo2f_error").empty();
111
+ jQuery(".buttonInsidePhone").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please enter valid phone number</span></p>");
112
+ }
113
+
114
+ });
115
+
116
+ function validate_otp(txId,otp,authType,isBoth){
117
+ let data =
118
+ {
119
+ 'action' : 'mo_ajax_register',
120
+ 'mo_action' : 'validate',
121
+ 'otp' : otp,
122
+ 'nonce' : nonce,
123
+ 'txId' : txId,
124
+ }
125
+
126
+ $mo.post(ajaxurl,data,function(response)
127
+ {
128
+ if(response.status == 'SUCCESS'){
129
+ if(authType == 'email'){
130
+ isEmailValidated = true;
131
+ if(!isBoth)
132
+ mo2f_rcp_ajax();
133
+ }
134
+ else if(authType == 'phone'){
135
+ isPhoneValidated = true;
136
+ if(!isBoth)
137
+ mo2f_rcp_ajax();
138
+ }
139
+
140
+ if(isBoth){
141
+ if(isEmailValidated && isPhoneValidated)
142
+ mo2f_rcp_ajax();
143
+ }
144
+ }else{
145
+ jQuery("#mo2f_error").empty();
146
+ jQuery(".buttonInsideEmail").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please enter valid OTP</span></p>");
147
+ jQuery('#loading').css('display', 'none');
148
+ jQuery("#miniorange_submit").prop('disabled',false);
149
+ }
150
+
151
+ });
152
+ }
153
+
154
+ jQuery("#miniorange_submit").click(function(e){
155
+ e.preventDefault();
156
+ if(!validated){
157
+ jQuery("#miniorange_submit").after("<div id='loading' ><div id='loaderMsg'></div><div><img src='"+loaderUrl+"' alt='' /></div></div>");
158
+ jQuery("#miniorange_submit").prop('disabled',true);
159
+ switch(authType){
160
+ case 'email':
161
+ if(isEmailValidated)
162
+ mo2f_rcp_ajax();
163
+ else{
164
+ otp = jQuery("#mo2f_email_otp").val();
165
+ if(typeof otp != 'undefined'){
166
+ addLoaderMessage("Validating Email");
167
+ validate_otp(email_txId,otp,'email',isBoth);
168
+ }
169
+ else{
170
+ jQuery("#mo2f_error").empty();
171
+ jQuery(".buttonInsideEmail").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please validate Email</span></p>");
172
+ jQuery("#loading").css('display','none');
173
+ jQuery("#miniorange_submit").prop('disabled',false);
174
+ }
175
+ }
176
+ break;
177
+ case 'phone':
178
+ if(isPhoneValidated)
179
+ mo2f_rcp_ajax();
180
+ else{
181
+ otp = jQuery("#mo2f_phone_otp").val();
182
+ if(typeof otp != 'undefined'){
183
+ addLoaderMessage("Validating Phone");
184
+ validate_otp(sms_txId,otp,'phone',isBoth);
185
+ }
186
+ else{
187
+ jQuery("#mo2f_error").empty();
188
+ jQuery(".buttonInsidePhone").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please validate Phone</span></p>");
189
+ jQuery("#loading").css('display','none');
190
+ jQuery("#miniorange_submit").prop('disabled',false);
191
+ }
192
+ }
193
+ break;
194
+ default:
195
+ if(isEmailValidated && isPhoneValidated)
196
+ mo2f_rcp_ajax();
197
+ else{
198
+ if(!isEmailValidated)
199
+ otp = jQuery("#mo2f_email_otp").val();
200
+ if(typeof otp != 'undefined'){
201
+ addLoaderMessage("Validating Email");
202
+ validate_otp(email_txId,otp,'email',isBoth);
203
+ }
204
+ else{
205
+ jQuery("#mo2f_error").empty();
206
+ jQuery(".buttonInsideEmail").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please validate Email</span></p>");
207
+ jQuery("#loading").css('display','none');
208
+ jQuery("#miniorange_submit").prop('disabled',false);
209
+ }
210
+ if(!isPhoneValidated){
211
+ otp = jQuery("#mo2f_phone_otp").val();
212
+ if(typeof otp != 'undefined'){
213
+ addLoaderMessage("Validating Phone");
214
+ validate_otp(sms_txId,otp,'phone',isBoth);
215
+ }
216
+ else{
217
+ jQuery("#mo2f_error").empty();
218
+ jQuery(".buttonInsidePhone").after("<p class='mepr-form-has-errors' style='display:block;'><span id='mo2f_error'>Please validate Phone</span></p>");
219
+ jQuery("#loading").css('display','none');
220
+ jQuery("#miniorange_submit").prop('disabled',false);
221
+ }
222
+ }
223
+ }
224
+ break;
225
+ }
226
+ }
227
+
228
+ });
229
+
230
+ function validateEmail(email_address){
231
+ let email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i
232
+ if (!email_regex.test(email_address))
233
+ {
234
+ return false
235
+ }
236
+ return true
237
+ }
238
+
239
+ function validatePhone(phone){
240
+ let intRegex = /[0-9 -()+]+$/;
241
+ if(phone.length < 10 || phone.length == 0 || (!intRegex.test(phone)))
242
+ {
243
+ return false
244
+ }
245
+ return true
246
+ }
247
+
248
+ function mo2f_ajax_before_reg(){
249
+ jQuery(formName).removeAttr('action');
250
+ jQuery(formName).removeAttr('method');
251
+
252
+ if(/^#/.test(submitSelector)){
253
+ jQuery(submitSelector).attr('name','miniorange_submit');
254
+ jQuery('input[name="miniorange_submit"]').attr('id','miniorange_submit');
255
+ }else{
256
+ jQuery(submitSelector).attr('id','miniorange_submit');
257
+ jQuery('#miniorange_submit').attr('name','miniorange_submit');
258
+ }
259
+ jQuery('#miniorange_submit').removeAttr('class');
260
+ }
261
+
262
+ function mo2f_rcp_ajax(){
263
+ validated = true;
264
+ jQuery("#loading").css('display','none');
265
+ jQuery("#miniorange_submit").prop('disabled',false);
266
+ jQuery(formName).attr('action',formAction);
267
+ jQuery(formName).attr('method',formMethod);
268
+ jQuery("#miniorange_submit").attr('class',submitSelectorClass);
269
+ jQuery('.'+submitSelectorClass).removeAttr('id');
270
+ jQuery('.'+submitSelectorClass).attr('id', submitSelectorId);
271
+ jQuery(submitSelector).click();
272
+ }
273
+
274
+ function addLoaderMessage(msg){
275
+ jQuery("#loaderMsg").empty();
276
+ jQuery("#loaderMsg").append(msg);
277
+ }
278
+ });
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/phone.js CHANGED
@@ -1,9 +1,9 @@
1
- /*
2
- intl-tel-input
3
- version: 0.8.3
4
- description: A jQuery plugin for entering international telephone numbers
5
- repository: https://github.com/Bluefieldscom/intl-tel-input.git
6
- license: MIT
7
- author: Jack O'Connor (http://jackocnr.com)
8
- */
9
  !function(a,b,c){function d(b,c){this.element=b,this.options=a.extend({},f,c),this._defaults=f,this._name=e,this.init()}var e="intlTelInput",f={preferredCountries:["IN","US"],americaMode:false};d.prototype={init:function(){var b=this,d=[];a.each(this.options.preferredCountries,function(b,c){var e=a.grep(intlTelInput.countries,function(a){return a.cca2==c});e.length&&d.push(e[0])});var e=a(this.element);""!==e.val()||this.options.americaMode||e.val("+1 "),e.wrap(a("<div>",{"class":"intl-number-input"}));var f=a("<div>",{"class":"flag-dropdown f16"}).insertBefore(e),g=a("<div>",{"class":"selected-flag"}).appendTo(f),h=d[0].cca2.toLowerCase(),i=a("<div>",{"class":"flag "+h}).appendTo(g);a("<div>",{"class":"down-arrow"}).appendTo(i);var j=a("<ul>",{"class":"country-list hide"}).appendTo(f);this.appendListItems(d,j),a("<li>",{"class":"divider"}).appendTo(j),this.appendListItems(intlTelInput.countries,j);var k=j.children(".country");k.first().addClass("active"),e.keyup(function(){var c=b.getDialCode(e.val())||"1",d=intlTelInput.countryCodes[c],f=!1;if(a.each(d,function(a,b){i.hasClass(b.toLowerCase())&&(f=!0)}),!f){var g=intlTelInput.countryCodes[c][0].toLowerCase();i.attr("class","flag "+g),k.removeClass("active"),k.children(".flag."+g).parent().addClass("active")}}),e.keyup(),g.click(function(d){if(d.stopPropagation(),j.hasClass("hide")){k.removeClass("highlight");var f=j.children(".active").addClass("highlight");b.scrollTo(f,j),j.removeClass("hide"),a(c).bind("keydown.intlTelInput",function(c){if(38==c.which||40==c.which){var d=j.children(".highlight").first(),f=38==c.which?d.prev():d.next();f&&(f.hasClass("divider")&&(f=38==c.which?f.prev():f.next()),k.removeClass("highlight"),f.addClass("highlight"),b.scrollTo(f,j))}else if(13==c.which){var h=j.children(".highlight").first();h.length&&b.selectCountry(h,g,e,j)}else if(9==c.which||27==c.which)b.closeDropdown(j);else if(c.which>=97&&c.which<=122||c.which>=65&&c.which<=90){var i=String.fromCharCode(c.which),l=k.filter(function(){return a(this).text().charAt(0)==i});if(l.length){var m,n=l.filter(".highlight").first();m=n&&n.next()&&n.next().text().charAt(0)==i?n.next():l.first(),k.removeClass("highlight"),m.addClass("highlight"),b.scrollTo(m,j)}}})}else b.closeDropdown(j)}),k.mouseover(function(){k.removeClass("highlight"),a(this).addClass("highlight")}),k.click(function(c){var d=a(c.currentTarget);b.selectCountry(d,g,e,j)}),a("html").click(function(c){a(c.target).closest(".country-list").length||b.closeDropdown(j)})},selectCountry:function(a,b,c,d){var e=a.attr("data-country-code").toLowerCase();b.find(".flag").attr("class","flag "+e);var f=this.updateNumber(c.val(),a.attr("data-dial-code"));c.val(f),this.closeDropdown(d),c.focus(),d.children(".country").removeClass("active highlight"),a.addClass("active")},closeDropdown:function(b){b.addClass("hide"),a(c).unbind("keydown.intlTelInput")},scrollTo:function(a,b){var c=b.height(),d=b.offset().top,e=d+c,f=a.outerHeight(),g=a.offset().top,h=g+f,i=g-d+b.scrollTop();if(d>g)b.scrollTop(i);else if(h>e){var j=c-f;b.scrollTop(i-j)}},updateNumber:function(a,b){var c,d="+"+this.getDialCode(a),e="+"+b;return d.length>1?(c=a.replace(d,e),a==d&&(c+=" ")):c=a.length&&"+"!=a.substr(0,1)?e+" "+a.trim():e+" ",this.options.americaMode&&"+1 "==c.substring(0,3)&&(c=c.substring(3)),c},getDialCode:function(a){var b=a.trim().split(" ")[0];if("+"==b.substring(0,1))for(var c=b.replace(/\D/g,"").substring(0,4),d=c.length;d>0;d--)if(c=c.substring(0,d),intlTelInput.countryCodes[c])return c;return""},appendListItems:function(b,c){var d="";a.each(b,function(a,b){d+="<li class='country' data-dial-code='"+b["calling-code"]+"' data-country-code='"+b.cca2+"'>",d+="<div class='flag "+b.cca2.toLowerCase()+"'></div>",d+="<span class='country-name'>"+b.name+"</span>",d+="<span class='dial-code'>+"+b["calling-code"]+"</span>",d+="</li>"}),c.append(d)}},a.fn[e]=function(b){return this.each(function(){a.data(this,"plugin_"+e)||a.data(this,"plugin_"+e,new d(this,b))})}}(jQuery,window,document);var intlTelInput={countries:[{name:"Afghanistan",cca2:"AF","calling-code":"93"},{name:"Albania",cca2:"AL","calling-code":"355"},{name:"Algeria",cca2:"DZ","calling-code":"213"},{name:"American Samoa",cca2:"AS","calling-code":"1684"},{name:"Andorra",cca2:"AD","calling-code":"376"},{name:"Angola",cca2:"AO","calling-code":"244"},{name:"Anguilla",cca2:"AI","calling-code":"1264"},{name:"Antigua and Barbuda",cca2:"AG","calling-code":"1268"},{name:"Argentina",cca2:"AR","calling-code":"54"},{name:"Armenia",cca2:"AM","calling-code":"374"},{name:"Aruba",cca2:"AW","calling-code":"297"},{name:"Australia",cca2:"AU","calling-code":"61"},{name:"Austria",cca2:"AT","calling-code":"43"},{name:"Azerbaijan",cca2:"AZ","calling-code":"994"},{name:"Bahamas",cca2:"BS","calling-code":"1242"},{name:"Bahrain",cca2:"BH","calling-code":"973"},{name:"Bangladesh",cca2:"BD","calling-code":"880"},{name:"Barbados",cca2:"BB","calling-code":"1246"},{name:"Belarus",cca2:"BY","calling-code":"375"},{name:"Belgium",cca2:"BE","calling-code":"32"},{name:"Belize",cca2:"BZ","calling-code":"501"},{name:"Benin",cca2:"BJ","calling-code":"229"},{name:"Bermuda",cca2:"BM","calling-code":"1441"},{name:"Bhutan",cca2:"BT","calling-code":"975"},{name:"Bolivia",cca2:"BO","calling-code":"591"},{name:"Bosnia and Herzegovina",cca2:"BA","calling-code":"387"},{name:"Botswana",cca2:"BW","calling-code":"267"},{name:"Brazil",cca2:"BR","calling-code":"55"},{name:"Brunei Darussalam",cca2:"BN","calling-code":"673"},{name:"Bulgaria",cca2:"BG","calling-code":"359"},{name:"Burkina Faso",cca2:"BF","calling-code":"226"},{name:"Burundi",cca2:"BI","calling-code":"257"},{name:"Cambodia",cca2:"KH","calling-code":"855"},{name:"Cameroon",cca2:"CM","calling-code":"237"},{name:"Canada",cca2:"CA","calling-code":"1"},{name:"Cape Verde",cca2:"CV","calling-code":"238"},{name:"Cayman Islands",cca2:"KY","calling-code":"1345"},{name:"Central African Republic",cca2:"CF","calling-code":"236"},{name:"Chad",cca2:"TD","calling-code":"235"},{name:"Chile",cca2:"CL","calling-code":"56"},{name:"China",cca2:"CN","calling-code":"86"},{name:"Colombia",cca2:"CO","calling-code":"57"},{name:"Comoros",cca2:"KM","calling-code":"269"},{name:"Congo (DRC)",cca2:"CD","calling-code":"243"},{name:"Congo (Republic)",cca2:"CG","calling-code":"242"},{name:"Cook Islands",cca2:"CK","calling-code":"682"},{name:"Costa Rica",cca2:"CR","calling-code":"506"},{name:"Côte d'Ivoire",cca2:"CI","calling-code":"225"},{name:"Croatia",cca2:"HR","calling-code":"385"},{name:"Cuba",cca2:"CU","calling-code":"53"},{name:"Cyprus",cca2:"CY","calling-code":"357"},{name:"Czech Republic",cca2:"CZ","calling-code":"420"},{name:"Denmark",cca2:"DK","calling-code":"45"},{name:"Djibouti",cca2:"DJ","calling-code":"253"},{name:"Dominica",cca2:"DM","calling-code":"1767"},{name:"Dominican Republic",cca2:"DO","calling-code":"1809"},{name:"Ecuador",cca2:"EC","calling-code":"593"},{name:"Egypt",cca2:"EG","calling-code":"20"},{name:"El Salvador",cca2:"SV","calling-code":"503"},{name:"Equatorial Guinea",cca2:"GQ","calling-code":"240"},{name:"Eritrea",cca2:"ER","calling-code":"291"},{name:"Estonia",cca2:"EE","calling-code":"372"},{name:"Ethiopia",cca2:"ET","calling-code":"251"},{name:"Faroe Islands",cca2:"FO","calling-code":"298"},{name:"Fiji",cca2:"FJ","calling-code":"679"},{name:"Finland",cca2:"FI","calling-code":"358"},{name:"France",cca2:"FR","calling-code":"33"},{name:"French Polynesia",cca2:"PF","calling-code":"689"},{name:"Gabon",cca2:"GA","calling-code":"241"},{name:"Gambia",cca2:"GM","calling-code":"220"},{name:"Georgia",cca2:"GE","calling-code":"995"},{name:"Germany",cca2:"DE","calling-code":"49"},{name:"Ghana",cca2:"GH","calling-code":"233"},{name:"Gibraltar",cca2:"GI","calling-code":"350"},{name:"Greece",cca2:"GR","calling-code":"30"},{name:"Greenland",cca2:"GL","calling-code":"299"},{name:"Grenada",cca2:"GD","calling-code":"1473"},{name:"Guadeloupe",cca2:"GP","calling-code":"590"},{name:"Guam",cca2:"GU","calling-code":"1671"},{name:"Guatemala",cca2:"GT","calling-code":"502"},{name:"Guernsey",cca2:"GG","calling-code":"44"},{name:"Guinea",cca2:"GN","calling-code":"224"},{name:"Guinea-Bissau",cca2:"GW","calling-code":"245"},{name:"Guyana",cca2:"GY","calling-code":"592"},{name:"Haiti",cca2:"HT","calling-code":"509"},{name:"Honduras",cca2:"HN","calling-code":"504"},{name:"Hong Kong",cca2:"HK","calling-code":"852"},{name:"Hungary",cca2:"HU","calling-code":"36"},{name:"Iceland",cca2:"IS","calling-code":"354"},{name:"India",cca2:"IN","calling-code":"91"},{name:"Indonesia",cca2:"ID","calling-code":"62"},{name:"Iran",cca2:"IR","calling-code":"98"},{name:"Iraq",cca2:"IQ","calling-code":"964"},{name:"Ireland",cca2:"IE","calling-code":"353"},{name:"Isle of Man",cca2:"IM","calling-code":"44"},{name:"Israel",cca2:"IL","calling-code":"972"},{name:"Italy",cca2:"IT","calling-code":"39"},{name:"Jamaica",cca2:"JM","calling-code":"1876"},{name:"Japan",cca2:"JP","calling-code":"81"},{name:"Jersey",cca2:"JE","calling-code":"44"},{name:"Jordan",cca2:"JO","calling-code":"962"},{name:"Kazakhstan",cca2:"KZ","calling-code":"7"},{name:"Kenya",cca2:"KE","calling-code":"254"},{name:"Kiribati",cca2:"KI","calling-code":"686"},{name:"Kuwait",cca2:"KW","calling-code":"965"},{name:"Kyrgyzstan",cca2:"KG","calling-code":"996"},{name:"Laos",cca2:"LA","calling-code":"856"},{name:"Latvia",cca2:"LV","calling-code":"371"},{name:"Lebanon",cca2:"LB","calling-code":"961"},{name:"Lesotho",cca2:"LS","calling-code":"266"},{name:"Liberia",cca2:"LR","calling-code":"231"},{name:"Libya",cca2:"LY","calling-code":"218"},{name:"Liechtenstein",cca2:"LI","calling-code":"423"},{name:"Lithuania",cca2:"LT","calling-code":"370"},{name:"Luxembourg",cca2:"LU","calling-code":"352"},{name:"Macao",cca2:"MO","calling-code":"853"},{name:"Macedonia",cca2:"MK","calling-code":"389"},{name:"Madagascar",cca2:"MG","calling-code":"261"},{name:"Malawi",cca2:"MW","calling-code":"265"},{name:"Malaysia",cca2:"MY","calling-code":"60"},{name:"Maldives",cca2:"MV","calling-code":"960"},{name:"Mali",cca2:"ML","calling-code":"223"},{name:"Malta",cca2:"MT","calling-code":"356"},{name:"Marshall Islands",cca2:"MH","calling-code":"692"},{name:"Martinique",cca2:"MQ","calling-code":"596"},{name:"Mauritania",cca2:"MR","calling-code":"222"},{name:"Mauritius",cca2:"MU","calling-code":"230"},{name:"Mexico",cca2:"MX","calling-code":"52"},{name:"Micronesia",cca2:"FM","calling-code":"691"},{name:"Moldova",cca2:"MD","calling-code":"373"},{name:"Monaco",cca2:"MC","calling-code":"377"},{name:"Mongolia",cca2:"MN","calling-code":"976"},{name:"Montenegro",cca2:"ME","calling-code":"382"},{name:"Montserrat",cca2:"MS","calling-code":"1664"},{name:"Morocco",cca2:"MA","calling-code":"212"},{name:"Mozambique",cca2:"MZ","calling-code":"258"},{name:"Myanmar (Burma)",cca2:"MM","calling-code":"95"},{name:"Namibia",cca2:"NA","calling-code":"264"},{name:"Nauru",cca2:"NR","calling-code":"674"},{name:"Nepal",cca2:"NP","calling-code":"977"},{name:"Netherlands",cca2:"NL","calling-code":"31"},{name:"New Caledonia",cca2:"NC","calling-code":"687"},{name:"New Zealand",cca2:"NZ","calling-code":"64"},{name:"Nicaragua",cca2:"NI","calling-code":"505"},{name:"Niger",cca2:"NE","calling-code":"227"},{name:"Nigeria",cca2:"NG","calling-code":"234"},{name:"North Korea",cca2:"KP","calling-code":"850"},{name:"Norway",cca2:"NO","calling-code":"47"},{name:"Oman",cca2:"OM","calling-code":"968"},{name:"Pakistan",cca2:"PK","calling-code":"92"},{name:"Palau",cca2:"PW","calling-code":"680"},{name:"Palestinian Territory",cca2:"PS","calling-code":"970"},{name:"Panama",cca2:"PA","calling-code":"507"},{name:"Papua New Guinea",cca2:"PG","calling-code":"675"},{name:"Paraguay",cca2:"PY","calling-code":"595"},{name:"Peru",cca2:"PE","calling-code":"51"},{name:"Philippines",cca2:"PH","calling-code":"63"},{name:"Poland",cca2:"PL","calling-code":"48"},{name:"Portugal",cca2:"PT","calling-code":"351"},{name:"Puerto Rico",cca2:"PR","calling-code":"1787"},{name:"Qatar",cca2:"QA","calling-code":"974"},{name:"Réunion",cca2:"RE","calling-code":"262"},{name:"Romania",cca2:"RO","calling-code":"40"},{name:"Russian Federation",cca2:"RU","calling-code":"7"},{name:"Rwanda",cca2:"RW","calling-code":"250"},{name:"Saint Kitts and Nevis",cca2:"KN","calling-code":"1869"},{name:"Saint Lucia",cca2:"LC","calling-code":"1758"},{name:"Saint Vincent and the Grenadines",cca2:"VC","calling-code":"1784"},{name:"Samoa",cca2:"WS","calling-code":"685"},{name:"San Marino",cca2:"SM","calling-code":"378"},{name:"São Tomé and Príncipe",cca2:"ST","calling-code":"239"},{name:"Saudi Arabia",cca2:"SA","calling-code":"966"},{name:"Senegal",cca2:"SN","calling-code":"221"},{name:"Serbia",cca2:"RS","calling-code":"381"},{name:"Seychelles",cca2:"SC","calling-code":"248"},{name:"Sierra Leone",cca2:"SL","calling-code":"232"},{name:"Singapore",cca2:"SG","calling-code":"65"},{name:"Slovakia",cca2:"SK","calling-code":"421"},{name:"Slovenia",cca2:"SI","calling-code":"386"},{name:"Solomon Islands",cca2:"SB","calling-code":"677"},{name:"Somalia",cca2:"SO","calling-code":"252"},{name:"South Africa",cca2:"ZA","calling-code":"27"},{name:"South Korea",cca2:"KR","calling-code":"82"},{name:"Spain",cca2:"ES","calling-code":"34"},{name:"Sri Lanka",cca2:"LK","calling-code":"94"},{name:"Sudan",cca2:"SD","calling-code":"249"},{name:"Suriname",cca2:"SR","calling-code":"597"},{name:"Swaziland",cca2:"SZ","calling-code":"268"},{name:"Sweden",cca2:"SE","calling-code":"46"},{name:"Switzerland",cca2:"CH","calling-code":"41"},{name:"Syrian Arab Republic",cca2:"SY","calling-code":"963"},{name:"Taiwan, Province of China",cca2:"TW","calling-code":"886"},{name:"Tajikistan",cca2:"TJ","calling-code":"992"},{name:"Tanzania",cca2:"TZ","calling-code":"255"},{name:"Thailand",cca2:"TH","calling-code":"66"},{name:"Timor-Leste",cca2:"TL","calling-code":"670"},{name:"Togo",cca2:"TG","calling-code":"228"},{name:"Tonga",cca2:"TO","calling-code":"676"},{name:"Trinidad and Tobago",cca2:"TT","calling-code":"1868"},{name:"Tunisia",cca2:"TN","calling-code":"216"},{name:"Turkey",cca2:"TR","calling-code":"90"},{name:"Turkmenistan",cca2:"TM","calling-code":"993"},{name:"Turks and Caicos Islands",cca2:"TC","calling-code":"1649"},{name:"Tuvalu",cca2:"TV","calling-code":"688"},{name:"Uganda",cca2:"UG","calling-code":"256"},{name:"Ukraine",cca2:"UA","calling-code":"380"},{name:"United Arab Emirates",cca2:"AE","calling-code":"971"},{name:"United Kingdom",cca2:"GB","calling-code":"44"},{name:"United States",cca2:"US","calling-code":"1"},{name:"Uruguay",cca2:"UY","calling-code":"598"},{name:"Uzbekistan",cca2:"UZ","calling-code":"998"},{name:"Vanuatu",cca2:"VU","calling-code":"678"},{name:"Vatican City",cca2:"VA","calling-code":"379"},{name:"Venezuela",cca2:"VE","calling-code":"58"},{name:"Viet Nam",cca2:"VN","calling-code":"84"},{name:"Virgin Islands (British)",cca2:"VG","calling-code":"1284"},{name:"Virgin Islands (U.S.)",cca2:"VI","calling-code":"1340"},{name:"Western Sahara",cca2:"EH","calling-code":"212"},{name:"Yemen",cca2:"YE","calling-code":"967"},{name:"Zambia",cca2:"ZM","calling-code":"260"},{name:"Zimbabwe",cca2:"ZW","calling-code":"263"}],countryCodes:{1:["US"],7:["RU","KZ"],20:["EG"],27:["ZA"],30:["GR"],31:["NL"],32:["BE"],33:["FR"],34:["ES"],36:["HU"],39:["IT"],40:["RO"],41:["CH"],43:["AT"],44:["GB","GG","IM","JE"],45:["DK"],46:["SE"],47:["NO","SJ"],48:["PL"],49:["DE"],51:["PE"],52:["MX"],53:["CU"],54:["AR"],55:["BR"],56:["CL"],57:["CO"],58:["VE"],60:["MY"],61:["AU","CC","CX"],62:["ID"],63:["PH"],64:["NZ"],65:["SG"],66:["TH"],81:["JP"],82:["KR"],84:["VN"],86:["CN"],90:["TR"],91:["IN"],92:["PK"],93:["AF"],94:["LK"],95:["MM"],98:["IR"],211:["SS"],212:["MA","EH"],213:["DZ"],216:["TN"],218:["LY"],220:["GM"],221:["SN"],222:["MR"],223:["ML"],224:["GN"],225:["CI"],226:["BF"],227:["NE"],228:["TG"],229:["BJ"],230:["MU"],231:["LR"],232:["SL"],233:["GH"],234:["NG"],235:["TD"],236:["CF"],237:["CM"],238:["CV"],239:["ST"],240:["GQ"],241:["GA"],242:["CG"],243:["CD"],244:["AO"],245:["GW"],246:["IO"],247:["AC"],248:["SC"],249:["SD"],250:["RW"],251:["ET"],252:["SO"],253:["DJ"],254:["KE"],255:["TZ"],256:["UG"],257:["BI"],258:["MZ"],260:["ZM"],261:["MG"],262:["RE","YT"],263:["ZW"],264:["NA"],265:["MW"],266:["LS"],267:["BW"],268:["SZ"],269:["KM"],290:["SH"],291:["ER"],297:["AW"],298:["FO"],299:["GL"],350:["GI"],351:["PT"],352:["LU"],353:["IE"],354:["IS"],355:["AL"],356:["MT"],357:["CY"],358:["FI","AX"],359:["BG"],370:["LT"],371:["LV"],372:["EE"],373:["MD"],374:["AM"],375:["BY"],376:["AD"],377:["MC"],378:["SM"],379:["VA"],380:["UA"],381:["RS"],382:["ME"],385:["HR"],386:["SI"],387:["BA"],389:["MK"],420:["CZ"],421:["SK"],423:["LI"],500:["FK"],501:["BZ"],502:["GT"],503:["SV"],504:["HN"],505:["NI"],506:["CR"],507:["PA"],508:["PM"],509:["HT"],590:["GP","BL","MF"],591:["BO"],592:["GY"],593:["EC"],594:["GF"],595:["PY"],596:["MQ"],597:["SR"],598:["UY"],599:["CW","BQ"],670:["TL"],672:["NF"],673:["BN"],674:["NR"],675:["PG"],676:["TO"],677:["SB"],678:["VU"],679:["FJ"],680:["PW"],681:["WF"],682:["CK"],683:["NU"],685:["WS"],686:["KI"],687:["NC"],688:["TV"],689:["PF"],690:["TK"],691:["FM"],692:["MH"],850:["KP"],852:["HK"],853:["MO"],855:["KH"],856:["LA"],880:["BD"],886:["TW"],960:["MV"],961:["LB"],962:["JO"],963:["SY"],964:["IQ"],965:["KW"],966:["SA"],967:["YE"],968:["OM"],970:["PS"],971:["AE"],972:["IL"],973:["BH"],974:["QA"],975:["BT"],976:["MN"],977:["NP"],992:["TJ"],993:["TM"],994:["AZ"],995:["GE"],996:["KG"],998:["UZ"],1242:["BS"],1246:["BB"],1264:["AI"],1268:["AG"],1284:["VG"],1340:["VI"],1345:["KY"],1441:["BM"],1473:["GD"],1649:["TC"],1664:["MS"],1671:["GU"],1684:["AS"],1758:["LC"],1767:["DM"],1784:["VC"],1787:["PR"],1809:["DO"],1868:["TT"],1869:["KN"],1876:["JM"]}};
1
+ /*
2
+ intl-tel-input
3
+ version: 0.8.3
4
+ description: A jQuery plugin for entering international telephone numbers
5
+ repository: https://github.com/Bluefieldscom/intl-tel-input.git
6
+ license: MIT
7
+ author: Jack O'Connor (http://jackocnr.com)
8
+ */
9
  !function(a,b,c){function d(b,c){this.element=b,this.options=a.extend({},f,c),this._defaults=f,this._name=e,this.init()}var e="intlTelInput",f={preferredCountries:["IN","US"],americaMode:false};d.prototype={init:function(){var b=this,d=[];a.each(this.options.preferredCountries,function(b,c){var e=a.grep(intlTelInput.countries,function(a){return a.cca2==c});e.length&&d.push(e[0])});var e=a(this.element);""!==e.val()||this.options.americaMode||e.val("+1 "),e.wrap(a("<div>",{"class":"intl-number-input"}));var f=a("<div>",{"class":"flag-dropdown f16"}).insertBefore(e),g=a("<div>",{"class":"selected-flag"}).appendTo(f),h=d[0].cca2.toLowerCase(),i=a("<div>",{"class":"flag "+h}).appendTo(g);a("<div>",{"class":"down-arrow"}).appendTo(i);var j=a("<ul>",{"class":"country-list hide"}).appendTo(f);this.appendListItems(d,j),a("<li>",{"class":"divider"}).appendTo(j),this.appendListItems(intlTelInput.countries,j);var k=j.children(".country");k.first().addClass("active"),e.keyup(function(){var c=b.getDialCode(e.val())||"1",d=intlTelInput.countryCodes[c],f=!1;if(a.each(d,function(a,b){i.hasClass(b.toLowerCase())&&(f=!0)}),!f){var g=intlTelInput.countryCodes[c][0].toLowerCase();i.attr("class","flag "+g),k.removeClass("active"),k.children(".flag."+g).parent().addClass("active")}}),e.keyup(),g.click(function(d){if(d.stopPropagation(),j.hasClass("hide")){k.removeClass("highlight");var f=j.children(".active").addClass("highlight");b.scrollTo(f,j),j.removeClass("hide"),a(c).bind("keydown.intlTelInput",function(c){if(38==c.which||40==c.which){var d=j.children(".highlight").first(),f=38==c.which?d.prev():d.next();f&&(f.hasClass("divider")&&(f=38==c.which?f.prev():f.next()),k.removeClass("highlight"),f.addClass("highlight"),b.scrollTo(f,j))}else if(13==c.which){var h=j.children(".highlight").first();h.length&&b.selectCountry(h,g,e,j)}else if(9==c.which||27==c.which)b.closeDropdown(j);else if(c.which>=97&&c.which<=122||c.which>=65&&c.which<=90){var i=String.fromCharCode(c.which),l=k.filter(function(){return a(this).text().charAt(0)==i});if(l.length){var m,n=l.filter(".highlight").first();m=n&&n.next()&&n.next().text().charAt(0)==i?n.next():l.first(),k.removeClass("highlight"),m.addClass("highlight"),b.scrollTo(m,j)}}})}else b.closeDropdown(j)}),k.mouseover(function(){k.removeClass("highlight"),a(this).addClass("highlight")}),k.click(function(c){var d=a(c.currentTarget);b.selectCountry(d,g,e,j)}),a("html").click(function(c){a(c.target).closest(".country-list").length||b.closeDropdown(j)})},selectCountry:function(a,b,c,d){var e=a.attr("data-country-code").toLowerCase();b.find(".flag").attr("class","flag "+e);var f=this.updateNumber(c.val(),a.attr("data-dial-code"));c.val(f),this.closeDropdown(d),c.focus(),d.children(".country").removeClass("active highlight"),a.addClass("active")},closeDropdown:function(b){b.addClass("hide"),a(c).unbind("keydown.intlTelInput")},scrollTo:function(a,b){var c=b.height(),d=b.offset().top,e=d+c,f=a.outerHeight(),g=a.offset().top,h=g+f,i=g-d+b.scrollTop();if(d>g)b.scrollTop(i);else if(h>e){var j=c-f;b.scrollTop(i-j)}},updateNumber:function(a,b){var c,d="+"+this.getDialCode(a),e="+"+b;return d.length>1?(c=a.replace(d,e),a==d&&(c+=" ")):c=a.length&&"+"!=a.substr(0,1)?e+" "+a.trim():e+" ",this.options.americaMode&&"+1 "==c.substring(0,3)&&(c=c.substring(3)),c},getDialCode:function(a){var b=a.trim().split(" ")[0];if("+"==b.substring(0,1))for(var c=b.replace(/\D/g,"").substring(0,4),d=c.length;d>0;d--)if(c=c.substring(0,d),intlTelInput.countryCodes[c])return c;return""},appendListItems:function(b,c){var d="";a.each(b,function(a,b){d+="<li class='country' data-dial-code='"+b["calling-code"]+"' data-country-code='"+b.cca2+"'>",d+="<div class='flag "+b.cca2.toLowerCase()+"'></div>",d+="<span class='country-name'>"+b.name+"</span>",d+="<span class='dial-code'>+"+b["calling-code"]+"</span>",d+="</li>"}),c.append(d)}},a.fn[e]=function(b){return this.each(function(){a.data(this,"plugin_"+e)||a.data(this,"plugin_"+e,new d(this,b))})}}(jQuery,window,document);var intlTelInput={countries:[{name:"Afghanistan",cca2:"AF","calling-code":"93"},{name:"Albania",cca2:"AL","calling-code":"355"},{name:"Algeria",cca2:"DZ","calling-code":"213"},{name:"American Samoa",cca2:"AS","calling-code":"1684"},{name:"Andorra",cca2:"AD","calling-code":"376"},{name:"Angola",cca2:"AO","calling-code":"244"},{name:"Anguilla",cca2:"AI","calling-code":"1264"},{name:"Antigua and Barbuda",cca2:"AG","calling-code":"1268"},{name:"Argentina",cca2:"AR","calling-code":"54"},{name:"Armenia",cca2:"AM","calling-code":"374"},{name:"Aruba",cca2:"AW","calling-code":"297"},{name:"Australia",cca2:"AU","calling-code":"61"},{name:"Austria",cca2:"AT","calling-code":"43"},{name:"Azerbaijan",cca2:"AZ","calling-code":"994"},{name:"Bahamas",cca2:"BS","calling-code":"1242"},{name:"Bahrain",cca2:"BH","calling-code":"973"},{name:"Bangladesh",cca2:"BD","calling-code":"880"},{name:"Barbados",cca2:"BB","calling-code":"1246"},{name:"Belarus",cca2:"BY","calling-code":"375"},{name:"Belgium",cca2:"BE","calling-code":"32"},{name:"Belize",cca2:"BZ","calling-code":"501"},{name:"Benin",cca2:"BJ","calling-code":"229"},{name:"Bermuda",cca2:"BM","calling-code":"1441"},{name:"Bhutan",cca2:"BT","calling-code":"975"},{name:"Bolivia",cca2:"BO","calling-code":"591"},{name:"Bosnia and Herzegovina",cca2:"BA","calling-code":"387"},{name:"Botswana",cca2:"BW","calling-code":"267"},{name:"Brazil",cca2:"BR","calling-code":"55"},{name:"Brunei Darussalam",cca2:"BN","calling-code":"673"},{name:"Bulgaria",cca2:"BG","calling-code":"359"},{name:"Burkina Faso",cca2:"BF","calling-code":"226"},{name:"Burundi",cca2:"BI","calling-code":"257"},{name:"Cambodia",cca2:"KH","calling-code":"855"},{name:"Cameroon",cca2:"CM","calling-code":"237"},{name:"Canada",cca2:"CA","calling-code":"1"},{name:"Cape Verde",cca2:"CV","calling-code":"238"},{name:"Cayman Islands",cca2:"KY","calling-code":"1345"},{name:"Central African Republic",cca2:"CF","calling-code":"236"},{name:"Chad",cca2:"TD","calling-code":"235"},{name:"Chile",cca2:"CL","calling-code":"56"},{name:"China",cca2:"CN","calling-code":"86"},{name:"Colombia",cca2:"CO","calling-code":"57"},{name:"Comoros",cca2:"KM","calling-code":"269"},{name:"Congo (DRC)",cca2:"CD","calling-code":"243"},{name:"Congo (Republic)",cca2:"CG","calling-code":"242"},{name:"Cook Islands",cca2:"CK","calling-code":"682"},{name:"Costa Rica",cca2:"CR","calling-code":"506"},{name:"Côte d'Ivoire",cca2:"CI","calling-code":"225"},{name:"Croatia",cca2:"HR","calling-code":"385"},{name:"Cuba",cca2:"CU","calling-code":"53"},{name:"Cyprus",cca2:"CY","calling-code":"357"},{name:"Czech Republic",cca2:"CZ","calling-code":"420"},{name:"Denmark",cca2:"DK","calling-code":"45"},{name:"Djibouti",cca2:"DJ","calling-code":"253"},{name:"Dominica",cca2:"DM","calling-code":"1767"},{name:"Dominican Republic",cca2:"DO","calling-code":"1809"},{name:"Ecuador",cca2:"EC","calling-code":"593"},{name:"Egypt",cca2:"EG","calling-code":"20"},{name:"El Salvador",cca2:"SV","calling-code":"503"},{name:"Equatorial Guinea",cca2:"GQ","calling-code":"240"},{name:"Eritrea",cca2:"ER","calling-code":"291"},{name:"Estonia",cca2:"EE","calling-code":"372"},{name:"Ethiopia",cca2:"ET","calling-code":"251"},{name:"Faroe Islands",cca2:"FO","calling-code":"298"},{name:"Fiji",cca2:"FJ","calling-code":"679"},{name:"Finland",cca2:"FI","calling-code":"358"},{name:"France",cca2:"FR","calling-code":"33"},{name:"French Polynesia",cca2:"PF","calling-code":"689"},{name:"Gabon",cca2:"GA","calling-code":"241"},{name:"Gambia",cca2:"GM","calling-code":"220"},{name:"Georgia",cca2:"GE","calling-code":"995"},{name:"Germany",cca2:"DE","calling-code":"49"},{name:"Ghana",cca2:"GH","calling-code":"233"},{name:"Gibraltar",cca2:"GI","calling-code":"350"},{name:"Greece",cca2:"GR","calling-code":"30"},{name:"Greenland",cca2:"GL","calling-code":"299"},{name:"Grenada",cca2:"GD","calling-code":"1473"},{name:"Guadeloupe",cca2:"GP","calling-code":"590"},{name:"Guam",cca2:"GU","calling-code":"1671"},{name:"Guatemala",cca2:"GT","calling-code":"502"},{name:"Guernsey",cca2:"GG","calling-code":"44"},{name:"Guinea",cca2:"GN","calling-code":"224"},{name:"Guinea-Bissau",cca2:"GW","calling-code":"245"},{name:"Guyana",cca2:"GY","calling-code":"592"},{name:"Haiti",cca2:"HT","calling-code":"509"},{name:"Honduras",cca2:"HN","calling-code":"504"},{name:"Hong Kong",cca2:"HK","calling-code":"852"},{name:"Hungary",cca2:"HU","calling-code":"36"},{name:"Iceland",cca2:"IS","calling-code":"354"},{name:"India",cca2:"IN","calling-code":"91"},{name:"Indonesia",cca2:"ID","calling-code":"62"},{name:"Iran",cca2:"IR","calling-code":"98"},{name:"Iraq",cca2:"IQ","calling-code":"964"},{name:"Ireland",cca2:"IE","calling-code":"353"},{name:"Isle of Man",cca2:"IM","calling-code":"44"},{name:"Israel",cca2:"IL","calling-code":"972"},{name:"Italy",cca2:"IT","calling-code":"39"},{name:"Jamaica",cca2:"JM","calling-code":"1876"},{name:"Japan",cca2:"JP","calling-code":"81"},{name:"Jersey",cca2:"JE","calling-code":"44"},{name:"Jordan",cca2:"JO","calling-code":"962"},{name:"Kazakhstan",cca2:"KZ","calling-code":"7"},{name:"Kenya",cca2:"KE","calling-code":"254"},{name:"Kiribati",cca2:"KI","calling-code":"686"},{name:"Kuwait",cca2:"KW","calling-code":"965"},{name:"Kyrgyzstan",cca2:"KG","calling-code":"996"},{name:"Laos",cca2:"LA","calling-code":"856"},{name:"Latvia",cca2:"LV","calling-code":"371"},{name:"Lebanon",cca2:"LB","calling-code":"961"},{name:"Lesotho",cca2:"LS","calling-code":"266"},{name:"Liberia",cca2:"LR","calling-code":"231"},{name:"Libya",cca2:"LY","calling-code":"218"},{name:"Liechtenstein",cca2:"LI","calling-code":"423"},{name:"Lithuania",cca2:"LT","calling-code":"370"},{name:"Luxembourg",cca2:"LU","calling-code":"352"},{name:"Macao",cca2:"MO","calling-code":"853"},{name:"Macedonia",cca2:"MK","calling-code":"389"},{name:"Madagascar",cca2:"MG","calling-code":"261"},{name:"Malawi",cca2:"MW","calling-code":"265"},{name:"Malaysia",cca2:"MY","calling-code":"60"},{name:"Maldives",cca2:"MV","calling-code":"960"},{name:"Mali",cca2:"ML","calling-code":"223"},{name:"Malta",cca2:"MT","calling-code":"356"},{name:"Marshall Islands",cca2:"MH","calling-code":"692"},{name:"Martinique",cca2:"MQ","calling-code":"596"},{name:"Mauritania",cca2:"MR","calling-code":"222"},{name:"Mauritius",cca2:"MU","calling-code":"230"},{name:"Mexico",cca2:"MX","calling-code":"52"},{name:"Micronesia",cca2:"FM","calling-code":"691"},{name:"Moldova",cca2:"MD","calling-code":"373"},{name:"Monaco",cca2:"MC","calling-code":"377"},{name:"Mongolia",cca2:"MN","calling-code":"976"},{name:"Montenegro",cca2:"ME","calling-code":"382"},{name:"Montserrat",cca2:"MS","calling-code":"1664"},{name:"Morocco",cca2:"MA","calling-code":"212"},{name:"Mozambique",cca2:"MZ","calling-code":"258"},{name:"Myanmar (Burma)",cca2:"MM","calling-code":"95"},{name:"Namibia",cca2:"NA","calling-code":"264"},{name:"Nauru",cca2:"NR","calling-code":"674"},{name:"Nepal",cca2:"NP","calling-code":"977"},{name:"Netherlands",cca2:"NL","calling-code":"31"},{name:"New Caledonia",cca2:"NC","calling-code":"687"},{name:"New Zealand",cca2:"NZ","calling-code":"64"},{name:"Nicaragua",cca2:"NI","calling-code":"505"},{name:"Niger",cca2:"NE","calling-code":"227"},{name:"Nigeria",cca2:"NG","calling-code":"234"},{name:"North Korea",cca2:"KP","calling-code":"850"},{name:"Norway",cca2:"NO","calling-code":"47"},{name:"Oman",cca2:"OM","calling-code":"968"},{name:"Pakistan",cca2:"PK","calling-code":"92"},{name:"Palau",cca2:"PW","calling-code":"680"},{name:"Palestinian Territory",cca2:"PS","calling-code":"970"},{name:"Panama",cca2:"PA","calling-code":"507"},{name:"Papua New Guinea",cca2:"PG","calling-code":"675"},{name:"Paraguay",cca2:"PY","calling-code":"595"},{name:"Peru",cca2:"PE","calling-code":"51"},{name:"Philippines",cca2:"PH","calling-code":"63"},{name:"Poland",cca2:"PL","calling-code":"48"},{name:"Portugal",cca2:"PT","calling-code":"351"},{name:"Puerto Rico",cca2:"PR","calling-code":"1787"},{name:"Qatar",cca2:"QA","calling-code":"974"},{name:"Réunion",cca2:"RE","calling-code":"262"},{name:"Romania",cca2:"RO","calling-code":"40"},{name:"Russian Federation",cca2:"RU","calling-code":"7"},{name:"Rwanda",cca2:"RW","calling-code":"250"},{name:"Saint Kitts and Nevis",cca2:"KN","calling-code":"1869"},{name:"Saint Lucia",cca2:"LC","calling-code":"1758"},{name:"Saint Vincent and the Grenadines",cca2:"VC","calling-code":"1784"},{name:"Samoa",cca2:"WS","calling-code":"685"},{name:"San Marino",cca2:"SM","calling-code":"378"},{name:"São Tomé and Príncipe",cca2:"ST","calling-code":"239"},{name:"Saudi Arabia",cca2:"SA","calling-code":"966"},{name:"Senegal",cca2:"SN","calling-code":"221"},{name:"Serbia",cca2:"RS","calling-code":"381"},{name:"Seychelles",cca2:"SC","calling-code":"248"},{name:"Sierra Leone",cca2:"SL","calling-code":"232"},{name:"Singapore",cca2:"SG","calling-code":"65"},{name:"Slovakia",cca2:"SK","calling-code":"421"},{name:"Slovenia",cca2:"SI","calling-code":"386"},{name:"Solomon Islands",cca2:"SB","calling-code":"677"},{name:"Somalia",cca2:"SO","calling-code":"252"},{name:"South Africa",cca2:"ZA","calling-code":"27"},{name:"South Korea",cca2:"KR","calling-code":"82"},{name:"Spain",cca2:"ES","calling-code":"34"},{name:"Sri Lanka",cca2:"LK","calling-code":"94"},{name:"Sudan",cca2:"SD","calling-code":"249"},{name:"Suriname",cca2:"SR","calling-code":"597"},{name:"Swaziland",cca2:"SZ","calling-code":"268"},{name:"Sweden",cca2:"SE","calling-code":"46"},{name:"Switzerland",cca2:"CH","calling-code":"41"},{name:"Syrian Arab Republic",cca2:"SY","calling-code":"963"},{name:"Taiwan, Province of China",cca2:"TW","calling-code":"886"},{name:"Tajikistan",cca2:"TJ","calling-code":"992"},{name:"Tanzania",cca2:"TZ","calling-code":"255"},{name:"Thailand",cca2:"TH","calling-code":"66"},{name:"Timor-Leste",cca2:"TL","calling-code":"670"},{name:"Togo",cca2:"TG","calling-code":"228"},{name:"Tonga",cca2:"TO","calling-code":"676"},{name:"Trinidad and Tobago",cca2:"TT","calling-code":"1868"},{name:"Tunisia",cca2:"TN","calling-code":"216"},{name:"Turkey",cca2:"TR","calling-code":"90"},{name:"Turkmenistan",cca2:"TM","calling-code":"993"},{name:"Turks and Caicos Islands",cca2:"TC","calling-code":"1649"},{name:"Tuvalu",cca2:"TV","calling-code":"688"},{name:"Uganda",cca2:"UG","calling-code":"256"},{name:"Ukraine",cca2:"UA","calling-code":"380"},{name:"United Arab Emirates",cca2:"AE","calling-code":"971"},{name:"United Kingdom",cca2:"GB","calling-code":"44"},{name:"United States",cca2:"US","calling-code":"1"},{name:"Uruguay",cca2:"UY","calling-code":"598"},{name:"Uzbekistan",cca2:"UZ","calling-code":"998"},{name:"Vanuatu",cca2:"VU","calling-code":"678"},{name:"Vatican City",cca2:"VA","calling-code":"379"},{name:"Venezuela",cca2:"VE","calling-code":"58"},{name:"Viet Nam",cca2:"VN","calling-code":"84"},{name:"Virgin Islands (British)",cca2:"VG","calling-code":"1284"},{name:"Virgin Islands (U.S.)",cca2:"VI","calling-code":"1340"},{name:"Western Sahara",cca2:"EH","calling-code":"212"},{name:"Yemen",cca2:"YE","calling-code":"967"},{name:"Zambia",cca2:"ZM","calling-code":"260"},{name:"Zimbabwe",cca2:"ZW","calling-code":"263"}],countryCodes:{1:["US"],7:["RU","KZ"],20:["EG"],27:["ZA"],30:["GR"],31:["NL"],32:["BE"],33:["FR"],34:["ES"],36:["HU"],39:["IT"],40:["RO"],41:["CH"],43:["AT"],44:["GB","GG","IM","JE"],45:["DK"],46:["SE"],47:["NO","SJ"],48:["PL"],49:["DE"],51:["PE"],52:["MX"],53:["CU"],54:["AR"],55:["BR"],56:["CL"],57:["CO"],58:["VE"],60:["MY"],61:["AU","CC","CX"],62:["ID"],63:["PH"],64:["NZ"],65:["SG"],66:["TH"],81:["JP"],82:["KR"],84:["VN"],86:["CN"],90:["TR"],91:["IN"],92:["PK"],93:["AF"],94:["LK"],95:["MM"],98:["IR"],211:["SS"],212:["MA","EH"],213:["DZ"],216:["TN"],218:["LY"],220:["GM"],221:["SN"],222:["MR"],223:["ML"],224:["GN"],225:["CI"],226:["BF"],227:["NE"],228:["TG"],229:["BJ"],230:["MU"],231:["LR"],232:["SL"],233:["GH"],234:["NG"],235:["TD"],236:["CF"],237:["CM"],238:["CV"],239:["ST"],240:["GQ"],241:["GA"],242:["CG"],243:["CD"],244:["AO"],245:["GW"],246:["IO"],247:["AC"],248:["SC"],249:["SD"],250:["RW"],251:["ET"],252:["SO"],253:["DJ"],254:["KE"],255:["TZ"],256:["UG"],257:["BI"],258:["MZ"],260:["ZM"],261:["MG"],262:["RE","YT"],263:["ZW"],264:["NA"],265:["MW"],266:["LS"],267:["BW"],268:["SZ"],269:["KM"],290:["SH"],291:["ER"],297:["AW"],298:["FO"],299:["GL"],350:["GI"],351:["PT"],352:["LU"],353:["IE"],354:["IS"],355:["AL"],356:["MT"],357:["CY"],358:["FI","AX"],359:["BG"],370:["LT"],371:["LV"],372:["EE"],373:["MD"],374:["AM"],375:["BY"],376:["AD"],377:["MC"],378:["SM"],379:["VA"],380:["UA"],381:["RS"],382:["ME"],385:["HR"],386:["SI"],387:["BA"],389:["MK"],420:["CZ"],421:["SK"],423:["LI"],500:["FK"],501:["BZ"],502:["GT"],503:["SV"],504:["HN"],505:["NI"],506:["CR"],507:["PA"],508:["PM"],509:["HT"],590:["GP","BL","MF"],591:["BO"],592:["GY"],593:["EC"],594:["GF"],595:["PY"],596:["MQ"],597:["SR"],598:["UY"],599:["CW","BQ"],670:["TL"],672:["NF"],673:["BN"],674:["NR"],675:["PG"],676:["TO"],677:["SB"],678:["VU"],679:["FJ"],680:["PW"],681:["WF"],682:["CK"],683:["NU"],685:["WS"],686:["KI"],687:["NC"],688:["TV"],689:["PF"],690:["TK"],691:["FM"],692:["MH"],850:["KP"],852:["HK"],853:["MO"],855:["KH"],856:["LA"],880:["BD"],886:["TW"],960:["MV"],961:["LB"],962:["JO"],963:["SY"],964:["IQ"],965:["KW"],966:["SA"],967:["YE"],968:["OM"],970:["PS"],971:["AE"],972:["IL"],973:["BH"],974:["QA"],975:["BT"],976:["MN"],977:["NP"],992:["TJ"],993:["TM"],994:["AZ"],995:["GE"],996:["KG"],998:["UZ"],1242:["BS"],1246:["BB"],1264:["AI"],1268:["AG"],1284:["VG"],1340:["VI"],1345:["KY"],1441:["BM"],1473:["GD"],1649:["TC"],1664:["MS"],1671:["GU"],1684:["AS"],1758:["LC"],1767:["DM"],1784:["VC"],1787:["PR"],1809:["DO"],1868:["TT"],1869:["KN"],1876:["JM"]}};
includes/js/pointers.js CHANGED
@@ -171,7 +171,7 @@
171
  scrollTop: $pointer.offset().top-120
172
  }, 300, function() { // when scroll complete
173
 
174
- console.log($pointer);
175
  MAP.last_pointer = $pointer;
176
 
177
  var $widget = $pointer.pointer('widget');
@@ -427,7 +427,7 @@
427
  $('html, body').animate({ // scroll page to pointer
428
  scrollTop: $pointer.offset().top+30
429
  }, 100, function() { // when scroll complete
430
- console.log($pointer);
431
  MAP.last_pointer = $pointer;
432
  var $widget = $pointer.pointer('widget');
433
  MAP.setNext( $widget, MAP.current_pointer.data );
171
  scrollTop: $pointer.offset().top-120
172
  }, 300, function() { // when scroll complete
173
 
174
+
175
  MAP.last_pointer = $pointer;
176
 
177
  var $widget = $pointer.pointer('widget');
427
  $('html, body').animate({ // scroll page to pointer
428
  scrollTop: $pointer.offset().top+30
429
  }, 100, function() { // when scroll complete
430
+
431
  MAP.last_pointer = $pointer;
432
  var $widget = $pointer.pointer('widget');
433
  MAP.setNext( $widget, MAP.current_pointer.data );
includes/js/rba/js/jquery-1.9.1.js CHANGED
@@ -1,182 +1,182 @@
1
- (function(r,m){function ya(a){var b=a.length,d=c.type(a);return c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||"function"!==d&&(0===b||"number"===typeof b&&0<b&&b-1 in a)}function Rb(a){var b=Ua[a]={};c.each(a.match(O)||[],function(a,c){b[c]=!0});return b}function Va(a,b,d,e){if(c.acceptData(a)){var f=c.expando,g="string"===typeof b,h=a.nodeType,k=h?c.cache:a,l=h?a[f]:a[f]&&f;if(l&&k[l]&&(e||k[l].data)||!g||d!==m){l||(h?a[f]=l=I.pop()||c.guid++:l=f);k[l]||(k[l]={},h||(k[l].toJSON=c.noop));if("object"===
2
- typeof b||"function"===typeof b)e?k[l]=c.extend(k[l],b):k[l].data=c.extend(k[l].data,b);a=k[l];e||(a.data||(a.data={}),a=a.data);d!==m&&(a[c.camelCase(b)]=d);g?(d=a[b],null==d&&(d=a[c.camelCase(b)])):d=a;return d}}}function Wa(a,b,d){if(c.acceptData(a)){var e,f,g,h=a.nodeType,k=h?c.cache:a,l=h?a[c.expando]:c.expando;if(k[l]){if(b&&(g=d?k[l]:k[l].data)){c.isArray(b)?b=b.concat(c.map(b,c.camelCase)):b in g?b=[b]:(b=c.camelCase(b),b=b in g?[b]:b.split(" "));e=0;for(f=b.length;e<f;e++)delete g[b[e]];
3
- if(!(d?za:c.isEmptyObject)(g))return}if(!d&&(delete k[l].data,!za(k[l])))return;h?c.cleanData([a],!0):c.support.deleteExpando||k!=k.window?delete k[l]:k[l]=null}}}function Xa(a,b,d){if(d===m&&1===a.nodeType)if(d="data-"+b.replace(Sb,"-$1").toLowerCase(),d=a.getAttribute(d),"string"===typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:Tb.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=m;return d}function za(a){for(var b in a)if(("data"!==b||!c.isEmptyObject(a[b]))&&"toJSON"!==
4
- b)return!1;return!0}function ba(){return!0}function R(){return!1}function Ya(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function Za(a,b,d){b=b||0;if(c.isFunction(b))return c.grep(a,function(a,c){return!!b.call(a,c,a)===d});if(b.nodeType)return c.grep(a,function(a){return a===b===d});if("string"===typeof b){var e=c.grep(a,function(a){return 1===a.nodeType});if(Ub.test(b))return c.filter(b,e,!d);b=c.filter(b,e)}return c.grep(a,function(a){return 0<=c.inArray(a,b)===d})}function $a(a){var b=ab.split("|");
5
- a=a.createDocumentFragment();if(a.createElement)for(;b.length;)a.createElement(b.pop());return a}function Vb(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bb(a){var b=a.getAttributeNode("type");a.type=(b&&b.specified)+"/"+a.type;return a}function cb(a){var b=Wb.exec(a.type);b?a.type=b[1]:a.removeAttribute("type");return a}function Aa(a,b){for(var d,e=0;null!=(d=a[e]);e++)c._data(d,"globalEval",!b||c._data(b[e],"globalEval"))}function db(a,b){if(1===
6
- b.nodeType&&c.hasData(a)){var d,e,f;e=c._data(a);var g=c._data(b,e),h=e.events;if(h)for(d in delete g.handle,g.events={},h)for(e=0,f=h[d].length;e<f;e++)c.event.add(b,d,h[d][e]);g.data&&(g.data=c.extend({},g.data))}}function B(a,b){var d,e,f=0,g=typeof a.getElementsByTagName!==z?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==z?a.querySelectorAll(b||"*"):m;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!b||c.nodeName(e,b)?g.push(e):c.merge(g,B(e,b));return b===m||b&&c.nodeName(a,b)?
7
- c.merge([a],g):g}function Xb(a){Ba.test(a.type)&&(a.defaultChecked=a.checked)}function eb(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),e=b,f=fb.length;f--;)if(b=fb[f]+c,b in a)return b;return e}function fa(a,b){a=b||a;return"none"===c.css(a,"display")||!c.contains(a.ownerDocument,a)}function gb(a,b){for(var d,e,f,g=[],h=0,k=a.length;h<k;h++)e=a[h],e.style&&(g[h]=c._data(e,"olddisplay"),d=e.style.display,b?(g[h]||"none"!==d||(e.style.display=""),""===e.style.display&&fa(e)&&
8
- (g[h]=c._data(e,"olddisplay",hb(e.nodeName)))):g[h]||(f=fa(e),(d&&"none"!==d||!f)&&c._data(e,"olddisplay",f?d:c.css(e,"display"))));for(h=0;h<k;h++)e=a[h],!e.style||b&&"none"!==e.style.display&&""!==e.style.display||(e.style.display=b?g[h]||"":"none");return a}function ib(a,b,c){return(a=Yb.exec(b))?Math.max(0,a[1]-(c||0))+(a[2]||"px"):b}function jb(a,b,d,e,f){b=d===(e?"border":"content")?4:"width"===b?1:0;for(var g=0;4>b;b+=2)"margin"===d&&(g+=c.css(a,d+S[b],!0,f)),e?("content"===d&&(g-=c.css(a,
9
- "padding"+S[b],!0,f)),"margin"!==d&&(g-=c.css(a,"border"+S[b]+"Width",!0,f))):(g+=c.css(a,"padding"+S[b],!0,f),"padding"!==d&&(g+=c.css(a,"border"+S[b]+"Width",!0,f)));return g}function kb(a,b,d){var e=!0,f="width"===b?a.offsetWidth:a.offsetHeight,g=T(a),h=c.support.boxSizing&&"border-box"===c.css(a,"boxSizing",!1,g);if(0>=f||null==f){f=U(a,b,g);if(0>f||null==f)f=a.style[b];if(ka.test(f))return f;e=h&&(c.support.boxSizingReliable||f===a.style[b]);f=parseFloat(f)||0}return f+jb(a,b,d||(h?"border":
10
- "content"),e,g)+"px"}function hb(a){var b=p,d=lb[a];d||(d=mb(a,b),"none"!==d&&d||(ga=(ga||c("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(b.documentElement),b=(ga[0].contentWindow||ga[0].contentDocument).document,b.write("<!doctype html><html><body>"),b.close(),d=mb(a,b),ga.detach()),lb[a]=d);return d}function mb(a,b){var d=c(b.createElement(a)).appendTo(b.body),e=c.css(d[0],"display");d.remove();return e}function Ca(a,b,d,e){var f;if(c.isArray(b))c.each(b,
11
- function(b,c){d||Zb.test(a)?e(a,c):Ca(a+"["+("object"===typeof c?b:"")+"]",c,d,e)});else if(d||"object"!==c.type(b))e(a,b);else for(f in b)Ca(a+"["+f+"]",b[f],d,e)}function nb(a){return function(b,d){"string"!==typeof b&&(d=b,b="*");var e,f=0,g=b.toLowerCase().match(O)||[];if(c.isFunction(d))for(;e=g[f++];)"+"===e[0]?(e=e.slice(1)||"*",(a[e]=a[e]||[]).unshift(d)):(a[e]=a[e]||[]).push(d)}}function ob(a,b,d,e){function f(k){var l;g[k]=!0;c.each(a[k]||[],function(a,c){var k=c(b,d,e);if("string"===typeof k&&
12
- !h&&!g[k])return b.dataTypes.unshift(k),f(k),!1;if(h)return!(l=k)});return l}var g={},h=a===Da;return f(b.dataTypes[0])||!g["*"]&&f("*")}function Ea(a,b){var d,e,f=c.ajaxSettings.flatOptions||{};for(e in b)b[e]!==m&&((f[e]?a:d||(d={}))[e]=b[e]);d&&c.extend(!0,a,d);return a}function pb(){try{return new r.XMLHttpRequest}catch(a){}}function qb(){setTimeout(function(){Y=m});return Y=c.now()}function $b(a,b){c.each(b,function(b,c){for(var f=(ha[b]||[]).concat(ha["*"]),g=0,h=f.length;g<h&&!f[g].call(a,
13
- b,c);g++);})}function rb(a,b,d){var e,f=0,g=la.length,h=c.Deferred().always(function(){delete k.elem}),k=function(){if(e)return!1;for(var b=Y||qb(),b=Math.max(0,l.startTime+l.duration-b),c=1-(b/l.duration||0),d=0,f=l.tweens.length;d<f;d++)l.tweens[d].run(c);h.notifyWith(a,[l,c,b]);if(1>c&&f)return b;h.resolveWith(a,[l]);return!1},l=h.promise({elem:a,props:c.extend({},b),opts:c.extend(!0,{specialEasing:{}},d),originalProperties:b,originalOptions:d,startTime:Y||qb(),duration:d.duration,tweens:[],createTween:function(b,
14
- d){var e=c.Tween(a,l.opts,b,d,l.opts.specialEasing[b]||l.opts.easing);l.tweens.push(e);return e},stop:function(b){var c=0,d=b?l.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)l.tweens[c].run(1);b?h.resolveWith(a,[l,b]):h.rejectWith(a,[l,b]);return this}});d=l.props;for(ac(d,l.opts.specialEasing);f<g;f++)if(b=la[f].call(l,a,d,l.opts))return b;$b(l,d);c.isFunction(l.opts.start)&&l.opts.start.call(a,l);c.fx.timer(c.extend(k,{elem:a,anim:l,queue:l.opts.queue}));return l.progress(l.opts.progress).done(l.opts.done,
15
- l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function ac(a,b){var d,e,f,g,h;for(f in a)if(e=c.camelCase(f),g=b[e],d=a[f],c.isArray(d)&&(g=d[1],d=a[f]=d[0]),f!==e&&(a[e]=d,delete a[f]),(h=c.cssHooks[e])&&"expand"in h)for(f in d=h.expand(d),delete a[e],d)f in a||(a[f]=d[f],b[f]=g);else b[e]=g}function A(a,b,c,e,f){return new A.prototype.init(a,b,c,e,f)}function ma(a,b){var c,e={height:a},f=0;for(b=b?1:0;4>f;f+=2-b)c=S[f],e["margin"+c]=e["padding"+c]=a;b&&(e.opacity=e.width=a);return e}function sb(a){return c.isWindow(a)?
16
- a:9===a.nodeType?a.defaultView||a.parentWindow:!1}var na,tb,z=typeof m,p=r.document,bc=r.location,cc=r.jQuery,dc=r.$,oa={},I=[],ub=I.concat,Fa=I.push,C=I.slice,vb=I.indexOf,ec=oa.toString,ia=oa.hasOwnProperty,Ga="1.9.1".trim,c=function(a,b){return new c.fn.init(a,b,tb)},pa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,O=/\S+/g,fc=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,gc=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,wb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hc=/^[\],:{}\s]*$/,ic=/(?:^|:|,)(?:\s*\[)+/g,jc=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
17
- kc=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,lc=/^-ms-/,mc=/-([\da-z])/gi,nc=function(a,b){return b.toUpperCase()},L=function(a){if(p.addEventListener||"load"===a.type||"complete"===p.readyState)xb(),c.ready()},xb=function(){p.addEventListener?(p.removeEventListener("DOMContentLoaded",L,!1),r.removeEventListener("load",L,!1)):(p.detachEvent("onreadystatechange",L),r.detachEvent("onload",L))};c.fn=c.prototype={jquery:"1.9.1",constructor:c,init:function(a,b,d){var e;if(!a)return this;
18
- if("string"===typeof a){e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&3<=a.length?[null,a,null]:gc.exec(a);if(!e||!e[1]&&b)return!b||b.jquery?(b||d).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof c?b[0]:b,c.merge(this,c.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:p,!0)),wb.test(e[1])&&c.isPlainObject(b))for(e in b)if(c.isFunction(this[e]))this[e](b[e]);else this.attr(e,b[e])}else{if((b=p.getElementById(e[2]))&&b.parentNode){if(b.id!==e[2])return d.find(a);this.length=1;this[0]=
19
- b}this.context=p;this.selector=a}return this}if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(c.isFunction(a))return d.ready(a);a.selector!==m&&(this.selector=a.selector,this.context=a.context);return c.makeArray(a,this)},selector:"",length:0,size:function(){return this.length},toArray:function(){return C.call(this)},get:function(a){return null==a?this.toArray():0>a?this[this.length+a]:this[a]},pushStack:function(a){a=c.merge(this.constructor(),a);a.prevObject=this;a.context=this.context;
20
- return a},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.ready.promise().done(a);return this},slice:function(){return this.pushStack(C.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length;a=+a+(0>a?b:0);return this.pushStack(0<=a&&a<b?[this[a]]:[])},map:function(a){return this.pushStack(c.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:Fa,
21
- sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a,b,d,e,f,g=arguments[0]||{},h=1,k=arguments.length,l=!1;"boolean"===typeof g&&(l=g,g=arguments[1]||{},h=2);"object"===typeof g||c.isFunction(g)||(g={});k===h&&(g=this,--h);for(;h<k;h++)if(null!=(f=arguments[h]))for(e in f)a=g[e],d=f[e],g!==d&&(l&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,a=a&&c.isArray(a)?a:[]):a=a&&c.isPlainObject(a)?a:{},g[e]=c.extend(l,a,d)):d!==m&&(g[e]=d));return g};c.extend({noConflict:function(a){r.$===
22
- c&&(r.$=dc);a&&r.jQuery===c&&(r.jQuery=cc);return c},isReady:!1,readyWait:1,holdReady:function(a){a?c.readyWait++:c.ready(!0)},ready:function(a){if(!0===a?!--c.readyWait:!c.isReady){if(!p.body)return setTimeout(c.ready);c.isReady=!0;!0!==a&&0<--c.readyWait||(na.resolveWith(p,[c]),c.fn.trigger&&c(p).trigger("ready").off("ready"))}},isFunction:function(a){return"function"===c.type(a)},isArray:Array.isArray||function(a){return"array"===c.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&
23
- isFinite(a)},type:function(a){return null==a?String(a):"object"===typeof a||"function"===typeof a?oa[ec.call(a)]||"object":typeof a},isPlainObject:function(a){if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!ia.call(a,"constructor")&&!ia.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(var b in a);return b===m||ia.call(a,b)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw Error(a);},parseHTML:function(a,
24
- b,d){if(!a||"string"!==typeof a)return null;"boolean"===typeof b&&(d=b,b=!1);b=b||p;var e=wb.exec(a);d=!d&&[];if(e)return[b.createElement(e[1])];e=c.buildFragment([a],b,d);d&&c(d).remove();return c.merge([],e.childNodes)},parseJSON:function(a){if(r.JSON&&r.JSON.parse)return r.JSON.parse(a);if(null===a)return a;if("string"===typeof a&&(a=c.trim(a))&&hc.test(a.replace(jc,"@").replace(kc,"]").replace(ic,"")))return(new Function("return "+a))();c.error("Invalid JSON: "+a)},parseXML:function(a){var b,
25
- d;if(!a||"string"!==typeof a)return null;try{r.DOMParser?(d=new DOMParser,b=d.parseFromString(a,"text/xml")):(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a))}catch(e){b=m}b&&b.documentElement&&!b.getElementsByTagName("parsererror").length||c.error("Invalid XML: "+a);return b},noop:function(){},globalEval:function(a){a&&c.trim(a)&&(r.execScript||function(a){r.eval.call(r,a)})(a)},camelCase:function(a){return a.replace(lc,"ms-").replace(mc,nc)},nodeName:function(a,b){return a.nodeName&&
26
- a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var e,f=0,g=a.length;e=ya(a);if(c)if(e)for(;f<g&&(e=b.apply(a[f],c),!1!==e);f++);else for(f in a){if(e=b.apply(a[f],c),!1===e)break}else if(e)for(;f<g&&(e=b.call(a[f],f,a[f]),!1!==e);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),!1===e)break;return a},trim:Ga&&!Ga.call("\ufeff\u00a0")?function(a){return null==a?"":Ga.call(a)}:function(a){return null==a?"":(a+"").replace(fc,"")},makeArray:function(a,b){var d=b||[];null!=a&&(ya(Object(a))?
27
- c.merge(d,"string"===typeof a?[a]:a):Fa.call(d,a));return d},inArray:function(a,b,c){var e;if(b){if(vb)return vb.call(b,a,c);e=b.length;for(c=c?0>c?Math.max(0,e+c):c:0;c<e;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=b.length,e=a.length,f=0;if("number"===typeof c)for(;f<c;f++)a[e++]=b[f];else for(;b[f]!==m;)a[e++]=b[f++];a.length=e;return a},grep:function(a,b,c){var e,f=[],g=0,h=a.length;for(c=!!c;g<h;g++)e=!!b(a[g],g),c!==e&&f.push(a[g]);return f},map:function(a,b,c){var e,
28
- f=0,g=a.length,h=[];if(ya(a))for(;f<g;f++)e=b(a[f],f,c),null!=e&&(h[h.length]=e);else for(f in a)e=b(a[f],f,c),null!=e&&(h[h.length]=e);return ub.apply([],h)},guid:1,proxy:function(a,b){var d,e;"string"===typeof b&&(e=a[b],b=a,a=e);if(!c.isFunction(a))return m;d=C.call(arguments,2);e=function(){return a.apply(b||this,d.concat(C.call(arguments)))};e.guid=a.guid=a.guid||c.guid++;return e},access:function(a,b,d,e,f,g,h){var k=0,l=a.length,u=null==d;if("object"===c.type(d))for(k in f=!0,d)c.access(a,
29
- b,k,d[k],!0,g,h);else if(e!==m&&(f=!0,c.isFunction(e)||(h=!0),u&&(h?(b.call(a,e),b=null):(u=b,b=function(a,b,d){return u.call(c(a),d)})),b))for(;k<l;k++)b(a[k],d,h?e:e.call(a[k],k,b(a[k],d)));return f?a:u?b.call(a):l?b(a[0],d):g},now:function(){return(new Date).getTime()}});c.ready.promise=function(a){if(!na)if(na=c.Deferred(),"complete"===p.readyState)setTimeout(c.ready);else if(p.addEventListener)p.addEventListener("DOMContentLoaded",L,!1),r.addEventListener("load",L,!1);else{p.attachEvent("onreadystatechange",
30
- L);r.attachEvent("onload",L);var b=!1;try{b=null==r.frameElement&&p.documentElement}catch(d){}b&&b.doScroll&&function e(){if(!c.isReady){try{b.doScroll("left")}catch(a){return setTimeout(e,50)}xb();c.ready()}}()}return na.promise(a)};c.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){oa["[object "+b+"]"]=b.toLowerCase()});tb=c(p);var Ua={};c.Callbacks=function(a){a="string"===typeof a?Ua[a]||Rb(a):c.extend({},a);var b,d,e,f,g,h,k=[],l=!a.once&&[],u=function(c){d=
31
- a.memory&&c;e=!0;g=h||0;h=0;f=k.length;for(b=!0;k&&g<f;g++)if(!1===k[g].apply(c[0],c[1])&&a.stopOnFalse){d=!1;break}b=!1;k&&(l?l.length&&u(l.shift()):d?k=[]:t.disable())},t={add:function(){if(k){var e=k.length;(function oc(b){c.each(b,function(b,d){var e=c.type(d);"function"===e?a.unique&&t.has(d)||k.push(d):d&&d.length&&"string"!==e&&oc(d)})})(arguments);b?f=k.length:d&&(h=e,u(d))}return this},remove:function(){k&&c.each(arguments,function(a,d){for(var e;-1<(e=c.inArray(d,k,e));)k.splice(e,1),b&&
32
- (e<=f&&f--,e<=g&&g--)});return this},has:function(a){return a?-1<c.inArray(a,k):!(!k||!k.length)},empty:function(){k=[];return this},disable:function(){k=l=d=m;return this},disabled:function(){return!k},lock:function(){l=m;d||t.disable();return this},locked:function(){return!l},fireWith:function(a,c){c=c||[];c=[a,c.slice?c.slice():c];!k||e&&!l||(b?l.push(c):u(c));return this},fire:function(){t.fireWith(this,arguments);return this},fired:function(){return!!e}};return t};c.extend({Deferred:function(a){var b=
33
- [["resolve","done",c.Callbacks("once memory"),"resolved"],["reject","fail",c.Callbacks("once memory"),"rejected"],["notify","progress",c.Callbacks("memory")]],d="pending",e={state:function(){return d},always:function(){f.done(arguments).fail(arguments);return this},then:function(){var a=arguments;return c.Deferred(function(d){c.each(b,function(b,l){var u=l[0],m=c.isFunction(a[b])&&a[b];f[l[1]](function(){var a=m&&m.apply(this,arguments);if(a&&c.isFunction(a.promise))a.promise().done(d.resolve).fail(d.reject).progress(d.notify);
34
- else d[u+"With"](this===e?d.promise():this,m?[a]:arguments)})});a=null}).promise()},promise:function(a){return null!=a?c.extend(a,e):e}},f={};e.pipe=e.then;c.each(b,function(a,c){var k=c[2],l=c[3];e[c[1]]=k.add;l&&k.add(function(){d=l},b[a^1][2].disable,b[2][2].lock);f[c[0]]=function(){f[c[0]+"With"](this===f?e:this,arguments);return this};f[c[0]+"With"]=k.fireWith});e.promise(f);a&&a.call(f,f);return f},when:function(a){var b=0,d=C.call(arguments),e=d.length,f=1!==e||a&&c.isFunction(a.promise)?e:
35
- 0,g=1===f?a:c.Deferred(),h=function(a,b,c){return function(d){b[a]=this;c[a]=1<arguments.length?C.call(arguments):d;c===k?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},k,l,u;if(1<e)for(k=Array(e),l=Array(e),u=Array(e);b<e;b++)d[b]&&c.isFunction(d[b].promise)?d[b].promise().done(h(b,u,d)).fail(g.reject).progress(h(b,l,k)):--f;f||g.resolveWith(u,d);return g.promise()}});c.support=function(){var a,b,d,e,f,g,h,k=p.createElement("div");k.setAttribute("className","t");k.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
36
- b=k.getElementsByTagName("*");d=k.getElementsByTagName("a")[0];if(!b||!d||!b.length)return{};e=p.createElement("select");f=e.appendChild(p.createElement("option"));b=k.getElementsByTagName("input")[0];d.style.cssText="top:1px;float:left;opacity:.5";a={getSetAttribute:"t"!==k.className,leadingWhitespace:3===k.firstChild.nodeType,tbody:!k.getElementsByTagName("tbody").length,htmlSerialize:!!k.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:"/a"===d.getAttribute("href"),
37
- opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:!!b.value,optSelected:f.selected,enctype:!!p.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==p.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===p.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1};b.checked=!0;a.noCloneChecked=b.cloneNode(!0).checked;e.disabled=!0;a.optDisabled=!f.disabled;try{delete k.test}catch(l){a.deleteExpando=
38
- !1}b=p.createElement("input");b.setAttribute("value","");a.input=""===b.getAttribute("value");b.value="t";b.setAttribute("type","radio");a.radioValue="t"===b.value;b.setAttribute("checked","t");b.setAttribute("name","t");d=p.createDocumentFragment();d.appendChild(b);a.appendChecked=b.checked;a.checkClone=d.cloneNode(!0).cloneNode(!0).lastChild.checked;k.attachEvent&&(k.attachEvent("onclick",function(){a.noCloneEvent=!1}),k.cloneNode(!0).click());for(h in{submit:!0,change:!0,focusin:!0})k.setAttribute(d=
39
- "on"+h,"t"),a[h+"Bubbles"]=d in r||!1===k.attributes[d].expando;k.style.backgroundClip="content-box";k.cloneNode(!0).style.backgroundClip="";a.clearCloneStyle="content-box"===k.style.backgroundClip;c(function(){var b,c,d=p.getElementsByTagName("body")[0];d&&(b=p.createElement("div"),b.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",d.appendChild(b).appendChild(k),k.innerHTML="<table><tr><td></td><td>t</td></tr></table>",c=k.getElementsByTagName("td"),
40
- c[0].style.cssText="padding:0;margin:0;border:0;display:none",g=0===c[0].offsetHeight,c[0].style.display="",c[1].style.display="none",a.reliableHiddenOffsets=g&&0===c[0].offsetHeight,k.innerHTML="",k.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",a.boxSizing=4===k.offsetWidth,a.doesNotIncludeMarginInBodyOffset=1!==d.offsetTop,r.getComputedStyle&&(a.pixelPosition="1%"!==
41
- (r.getComputedStyle(k,null)||{}).top,a.boxSizingReliable="4px"===(r.getComputedStyle(k,null)||{width:"4px"}).width,c=k.appendChild(p.createElement("div")),c.style.cssText=k.style.cssText="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",c.style.marginRight=c.style.width="0",k.style.width="1px",a.reliableMarginRight=!parseFloat((r.getComputedStyle(c,null)||{}).marginRight)),typeof k.style.zoom!==z&&(k.innerHTML="",k.style.cssText=
42
- "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;width:1px;padding:1px;display:inline;zoom:1",a.inlineBlockNeedsLayout=3===k.offsetWidth,k.style.display="block",k.innerHTML="<div></div>",k.firstChild.style.width="5px",a.shrinkWrapBlocks=3!==k.offsetWidth,a.inlineBlockNeedsLayout&&(d.style.zoom=1)),d.removeChild(b),k=null)});b=e=d=f=d=b=null;return a}();var Tb=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,Sb=/([A-Z])/g;c.extend({cache:{},
43
- expando:"jQuery"+("1.9.1"+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?c.cache[a[c.expando]]:a[c.expando];return!!a&&!za(a)},data:function(a,b,c){return Va(a,b,c)},removeData:function(a,b){return Wa(a,b)},_data:function(a,b,c){return Va(a,b,c,!0)},_removeData:function(a,b){return Wa(a,b,!0)},acceptData:function(a){if(a.nodeType&&1!==a.nodeType&&9!==a.nodeType)return!1;var b=a.nodeName&&c.noData[a.nodeName.toLowerCase()];
44
- return!b||!0!==b&&a.getAttribute("classid")===b}});c.fn.extend({data:function(a,b){var d,e,f=this[0],g=0,h=null;if(a===m){if(this.length&&(h=c.data(f),1===f.nodeType&&!c._data(f,"parsedAttrs"))){for(d=f.attributes;g<d.length;g++)e=d[g].name,e.indexOf("data-")||(e=c.camelCase(e.slice(5)),Xa(f,e,h[e]));c._data(f,"parsedAttrs",!0)}return h}return"object"===typeof a?this.each(function(){c.data(this,a)}):c.access(this,function(b){if(b===m)return f?Xa(f,a,c.data(f,a)):null;this.each(function(){c.data(this,
45
- a,b)})},null,b,1<arguments.length,null,!0)},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){var e;if(a)return b=(b||"fx")+"queue",e=c._data(a,b),d&&(!e||c.isArray(d)?e=c._data(a,b,c.makeArray(d)):e.push(d)),e||[]},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.length,f=d.shift(),g=c._queueHooks(a,b),h=function(){c.dequeue(a,b)};"inprogress"===f&&(f=d.shift(),e--);if(g.cur=f)"fx"===b&&d.unshift("inprogress"),delete g.stop,f.call(a,
46
- h,g);!e&&g&&g.empty.fire()},_queueHooks:function(a,b){var d=b+"queueHooks";return c._data(a,d)||c._data(a,d,{empty:c.Callbacks("once memory").add(function(){c._removeData(a,b+"queue");c._removeData(a,d)})})}});c.fn.extend({queue:function(a,b){var d=2;"string"!==typeof a&&(b=a,a="fx",d--);return arguments.length<d?c.queue(this[0],a):b===m?this:this.each(function(){var d=c.queue(this,a,b);c._queueHooks(this,a);"fx"===a&&"inprogress"!==d[0]&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
47
- a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;return this.queue(b||"fx",function(b,c){var f=setTimeout(b,a);c.stop=function(){clearTimeout(f)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var d,e=1,f=c.Deferred(),g=this,h=this.length,k=function(){--e||f.resolveWith(g,[g])};"string"!==typeof a&&(b=a,a=m);for(a=a||"fx";h--;)(d=c._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(k));k();return f.promise(b)}});var V,yb,Ha=/[\t\r\n]/g,pc=/\r/g,qc=/^(?:input|select|textarea|button|object)$/i,
48
- rc=/^(?:a|area)$/i,zb=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,Ia=/^(?:checked|selected)$/i,Z=c.support.getSetAttribute,Ja=c.support.input;c.fn.extend({attr:function(a,b){return c.access(this,c.attr,a,b,1<arguments.length)},removeAttr:function(a){return this.each(function(){c.removeAttr(this,a)})},prop:function(a,b){return c.access(this,c.prop,a,b,1<arguments.length)},removeProp:function(a){a=c.propFix[a]||a;return this.each(function(){try{this[a]=
49
- m,delete this[a]}catch(b){}})},addClass:function(a){var b,d,e,f,g,h=0,k=this.length;b="string"===typeof a&&a;if(c.isFunction(a))return this.each(function(b){c(this).addClass(a.call(this,b,this.className))});if(b)for(b=(a||"").match(O)||[];h<k;h++)if(d=this[h],e=1===d.nodeType&&(d.className?(" "+d.className+" ").replace(Ha," "):" ")){for(g=0;f=b[g++];)0>e.indexOf(" "+f+" ")&&(e+=f+" ");d.className=c.trim(e)}return this},removeClass:function(a){var b,d,e,f,g,h=0,k=this.length;b=0===arguments.length||
50
- "string"===typeof a&&a;if(c.isFunction(a))return this.each(function(b){c(this).removeClass(a.call(this,b,this.className))});if(b)for(b=(a||"").match(O)||[];h<k;h++)if(d=this[h],e=1===d.nodeType&&(d.className?(" "+d.className+" ").replace(Ha," "):"")){for(g=0;f=b[g++];)for(;0<=e.indexOf(" "+f+" ");)e=e.replace(" "+f+" "," ");d.className=a?c.trim(e):""}return this},toggleClass:function(a,b){var d=typeof a,e="boolean"===typeof b;return c.isFunction(a)?this.each(function(d){c(this).toggleClass(a.call(this,
51
- d,this.className,b),b)}):this.each(function(){if("string"===d)for(var f,g=0,h=c(this),k=b,l=a.match(O)||[];f=l[g++];)k=e?k:!h.hasClass(f),h[k?"addClass":"removeClass"](f);else if(d===z||"boolean"===d)this.className&&c._data(this,"__className__",this.className),this.className=this.className||!1===a?"":c._data(this,"__className__")||""})},hasClass:function(a){a=" "+a+" ";for(var b=0,c=this.length;b<c;b++)if(1===this[b].nodeType&&0<=(" "+this[b].className+" ").replace(Ha," ").indexOf(a))return!0;return!1},
52
- val:function(a){var b,d,e,f=this[0];if(arguments.length)return e=c.isFunction(a),this.each(function(b){var f=c(this);1===this.nodeType&&(b=e?a.call(this,b,f.val()):a,null==b?b="":"number"===typeof b?b+="":c.isArray(b)&&(b=c.map(b,function(a){return null==a?"":a+""})),d=c.valHooks[this.type]||c.valHooks[this.nodeName.toLowerCase()],d&&"set"in d&&d.set(this,b,"value")!==m||(this.value=b))});if(f){if((d=c.valHooks[f.type]||c.valHooks[f.nodeName.toLowerCase()])&&"get"in d&&(b=d.get(f,"value"))!==m)return b;
53
- b=f.value;return"string"===typeof b?b.replace(pc,""):null==b?"":b}}});c.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){for(var b,d=a.options,e=a.selectedIndex,f=(a="select-one"===a.type||0>e)?null:[],g=a?e+1:d.length,h=0>e?g:a?e:0;h<g;h++)if(b=d[h],!(!b.selected&&h!==e||(c.support.optDisabled?b.disabled:null!==b.getAttribute("disabled"))||b.parentNode.disabled&&c.nodeName(b.parentNode,"optgroup"))){b=c(b).val();if(a)return b;
54
- f.push(b)}return f},set:function(a,b){var d=c.makeArray(b);c(a).find("option").each(function(){this.selected=0<=c.inArray(c(this).val(),d)});d.length||(a.selectedIndex=-1);return d}}},attr:function(a,b,d){var e,f,g;f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f){if(typeof a.getAttribute===z)return c.prop(a,b,d);if(f=1!==f||!c.isXMLDoc(a))b=b.toLowerCase(),e=c.attrHooks[b]||(zb.test(b)?yb:V);if(d!==m)if(null===d)c.removeAttr(a,b);else{if(e&&f&&"set"in e&&(g=e.set(a,d,b))!==m)return g;a.setAttribute(b,d+"");
55
- return d}else{if(e&&f&&"get"in e&&null!==(g=e.get(a,b)))return g;typeof a.getAttribute!==z&&(g=a.getAttribute(b));return null==g?m:g}}},removeAttr:function(a,b){var d,e,f=0,g=b&&b.match(O);if(g&&1===a.nodeType)for(;d=g[f++];)e=c.propFix[d]||d,zb.test(d)?!Z&&Ia.test(d)?a[c.camelCase("default-"+d)]=a[e]=!1:a[e]=!1:c.attr(a,d,""),a.removeAttribute(Z?d:e)},attrHooks:{type:{set:function(a,b){if(!c.support.radioValue&&"radio"===b&&c.nodeName(a,"input")){var d=a.value;a.setAttribute("type",b);d&&(a.value=
56
- d);return b}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,b,d){var e,f,g;g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g){if(g=1!==g||!c.isXMLDoc(a))b=c.propFix[b]||b,f=c.propHooks[b];return d!==m?f&&"set"in f&&(e=f.set(a,d,b))!==m?e:a[b]=d:f&&"get"in f&&null!==(e=
57
- f.get(a,b))?e:a[b]}},propHooks:{tabIndex:{get:function(a){var b=a.getAttributeNode("tabindex");return b&&b.specified?parseInt(b.value,10):qc.test(a.nodeName)||rc.test(a.nodeName)&&a.href?0:m}}}});yb={get:function(a,b){var d=c.prop(a,b),e="boolean"===typeof d&&a.getAttribute(b);return(d="boolean"===typeof d?Ja&&Z?null!=e:Ia.test(b)?a[c.camelCase("default-"+b)]:!!e:a.getAttributeNode(b))&&!1!==d.value?b.toLowerCase():m},set:function(a,b,d){!1===b?c.removeAttr(a,d):Ja&&Z||!Ia.test(d)?a.setAttribute(!Z&&
58
- c.propFix[d]||d,d):a[c.camelCase("default-"+d)]=a[d]=!0;return d}};Ja&&Z||(c.attrHooks.value={get:function(a,b){var d=a.getAttributeNode(b);return c.nodeName(a,"input")?a.defaultValue:d&&d.specified?d.value:m},set:function(a,b,d){if(c.nodeName(a,"input"))a.defaultValue=b;else return V&&V.set(a,b,d)}});Z||(V=c.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&("id"===b||"name"===b||"coords"===b?""!==c.value:c.specified)?c.value:m},set:function(a,b,c){var e=a.getAttributeNode(c);
59
- e||a.setAttributeNode(e=a.ownerDocument.createAttribute(c));e.value=b+="";return"value"===c||b===a.getAttribute(c)?b:m}},c.attrHooks.contenteditable={get:V.get,set:function(a,b,c){V.set(a,""===b?!1:b,c)}},c.each(["width","height"],function(a,b){c.attrHooks[b]=c.extend(c.attrHooks[b],{set:function(a,c){if(""===c)return a.setAttribute(b,"auto"),c}})}));c.support.hrefNormalized||(c.each(["href","src","width","height"],function(a,b){c.attrHooks[b]=c.extend(c.attrHooks[b],{get:function(a){a=a.getAttribute(b,
60
- 2);return null==a?m:a}})}),c.each(["href","src"],function(a,b){c.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}));c.support.style||(c.attrHooks.style={get:function(a){return a.style.cssText||m},set:function(a,b){return a.style.cssText=b+""}});c.support.optSelected||(c.propHooks.selected=c.extend(c.propHooks.selected,{get:function(a){if(a=a.parentNode)a.selectedIndex,a.parentNode&&a.parentNode.selectedIndex;return null}}));c.support.enctype||(c.propFix.enctype="encoding");c.support.checkOn||
61
- c.each(["radio","checkbox"],function(){c.valHooks[this]={get:function(a){return null===a.getAttribute("value")?"on":a.value}}});c.each(["radio","checkbox"],function(){c.valHooks[this]=c.extend(c.valHooks[this],{set:function(a,b){if(c.isArray(b))return a.checked=0<=c.inArray(c(a).val(),b)}})});var Ka=/^(?:input|select|textarea)$/i,sc=/^key/,tc=/^(?:mouse|contextmenu)|click/,Ab=/^(?:focusinfocus|focusoutblur)$/,Bb=/^([^.]*)(?:\.(.+)|)$/;c.event={global:{},add:function(a,b,d,e,f){var g,h,k,l,u,t,n,q,
62
- p;if(k=c._data(a)){d.handler&&(l=d,d=l.handler,f=l.selector);d.guid||(d.guid=c.guid++);(h=k.events)||(h=k.events={});(u=k.handle)||(u=k.handle=function(a){return typeof c===z||a&&c.event.triggered===a.type?m:c.event.dispatch.apply(u.elem,arguments)},u.elem=a);b=(b||"").match(O)||[""];for(k=b.length;k--;)g=Bb.exec(b[k])||[],q=t=g[1],p=(g[2]||"").split(".").sort(),g=c.event.special[q]||{},q=(f?g.delegateType:g.bindType)||q,g=c.event.special[q]||{},t=c.extend({type:q,origType:t,data:e,handler:d,guid:d.guid,
63
- selector:f,needsContext:f&&c.expr.match.needsContext.test(f),namespace:p.join(".")},l),(n=h[q])||(n=h[q]=[],n.delegateCount=0,g.setup&&!1!==g.setup.call(a,e,p,u)||(a.addEventListener?a.addEventListener(q,u,!1):a.attachEvent&&a.attachEvent("on"+q,u))),g.add&&(g.add.call(a,t),t.handler.guid||(t.handler.guid=d.guid)),f?n.splice(n.delegateCount++,0,t):n.push(t),c.event.global[q]=!0;a=null}},remove:function(a,b,d,e,f){var g,h,k,l,u,m,n,q,p,r,B,A=c.hasData(a)&&c._data(a);if(A&&(m=A.events)){b=(b||"").match(O)||
64
- [""];for(u=b.length;u--;)if(k=Bb.exec(b[u])||[],p=B=k[1],r=(k[2]||"").split(".").sort(),p){n=c.event.special[p]||{};p=(e?n.delegateType:n.bindType)||p;q=m[p]||[];k=k[2]&&new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)");for(l=g=q.length;g--;)h=q[g],!f&&B!==h.origType||d&&d.guid!==h.guid||k&&!k.test(h.namespace)||e&&e!==h.selector&&("**"!==e||!h.selector)||(q.splice(g,1),h.selector&&q.delegateCount--,n.remove&&n.remove.call(a,h));l&&!q.length&&(n.teardown&&!1!==n.teardown.call(a,r,A.handle)||
65
- c.removeEvent(a,p,A.handle),delete m[p])}else for(p in m)c.event.remove(a,p+b[u],d,e,!0);c.isEmptyObject(m)&&(delete A.handle,c._removeData(a,"events"))}},trigger:function(a,b,d,e){var f,g,h,k,l,u,t=[d||p],n=ia.call(a,"type")?a.type:a;l=ia.call(a,"namespace")?a.namespace.split("."):[];h=f=d=d||p;if(3!==d.nodeType&&8!==d.nodeType&&!Ab.test(n+c.event.triggered)&&(0<=n.indexOf(".")&&(l=n.split("."),n=l.shift(),l.sort()),g=0>n.indexOf(":")&&"on"+n,a=a[c.expando]?a:new c.Event(n,"object"===typeof a&&a),
66
- a.isTrigger=!0,a.namespace=l.join("."),a.namespace_re=a.namespace?new RegExp("(^|\\.)"+l.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,a.result=m,a.target||(a.target=d),b=null==b?[a]:c.makeArray(b,[a]),l=c.event.special[n]||{},e||!l.trigger||!1!==l.trigger.apply(d,b))){if(!e&&!l.noBubble&&!c.isWindow(d)){k=l.delegateType||n;Ab.test(k+n)||(h=h.parentNode);for(;h;h=h.parentNode)t.push(h),f=h;f===(d.ownerDocument||p)&&t.push(f.defaultView||f.parentWindow||r)}for(u=0;(h=t[u++])&&!a.isPropagationStopped();)a.type=
67
- 1<u?k:l.bindType||n,(f=(c._data(h,"events")||{})[a.type]&&c._data(h,"handle"))&&f.apply(h,b),(f=g&&h[g])&&c.acceptData(h)&&f.apply&&!1===f.apply(h,b)&&a.preventDefault();a.type=n;if(!(e||a.isDefaultPrevented()||l._default&&!1!==l._default.apply(d.ownerDocument,b)||"click"===n&&c.nodeName(d,"a"))&&c.acceptData(d)&&g&&d[n]&&!c.isWindow(d)){(f=d[g])&&(d[g]=null);c.event.triggered=n;try{d[n]()}catch(q){}c.event.triggered=m;f&&(d[g]=f)}return a.result}},dispatch:function(a){a=c.event.fix(a);var b,d,e,
68
- f,g=[],h=C.call(arguments);b=(c._data(this,"events")||{})[a.type]||[];var k=c.event.special[a.type]||{};h[0]=a;a.delegateTarget=this;if(!k.preDispatch||!1!==k.preDispatch.call(this,a)){g=c.event.handlers.call(this,a,b);for(b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,f=0;(d=e.handlers[f++])&&!a.isImmediatePropagationStopped();)if(!a.namespace_re||a.namespace_re.test(d.namespace))a.handleObj=d,a.data=d.data,d=((c.event.special[d.origType]||{}).handle||d.handler).apply(e.elem,
69
- h),d!==m&&!1===(a.result=d)&&(a.preventDefault(),a.stopPropagation());k.postDispatch&&k.postDispatch.call(this,a);return a.result}},handlers:function(a,b){var d,e,f,g,h=[],k=b.delegateCount,l=a.target;if(k&&l.nodeType&&(!a.button||"click"!==a.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(!0!==l.disabled||"click"!==a.type)){f=[];for(g=0;g<k;g++)e=b[g],d=e.selector+" ",f[d]===m&&(f[d]=e.needsContext?0<=c(d,this).index(l):c.find(d,this,null,[l]).length),f[d]&&f.push(e);f.length&&h.push({elem:l,
70
- handlers:f})}k<b.length&&h.push({elem:this,handlers:b.slice(k)});return h},fix:function(a){if(a[c.expando])return a;var b,d,e;b=a.type;var f=a,g=this.fixHooks[b];g||(this.fixHooks[b]=g=tc.test(b)?this.mouseHooks:sc.test(b)?this.keyHooks:{});e=g.props?this.props.concat(g.props):this.props;a=new c.Event(f);for(b=e.length;b--;)d=e[b],a[d]=f[d];a.target||(a.target=f.srcElement||p);3===a.target.nodeType&&(a.target=a.target.parentNode);a.metaKey=!!a.metaKey;return g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
71
- fixHooks:{},keyHooks:{props:["char","charCode","key","keyCode"],filter:function(a,b){null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f=b.button,g=b.fromElement;null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||p,e=c.documentElement,c=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||
72
- c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0));!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g);a.which||f===m||(a.which=f&1?1:f&2?3:f&4?2:0);return a}},special:{load:{noBubble:!0},click:{trigger:function(){if(c.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1}},focus:{trigger:function(){if(this!==p.activeElement&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},
73
- blur:{trigger:function(){if(this===p.activeElement&&this.blur)return this.blur(),!1},delegateType:"focusout"},beforeunload:{postDispatch:function(a){a.result!==m&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,d,e){a=c.extend(new c.Event,d,{type:a,isSimulated:!0,originalEvent:{}});e?c.event.trigger(a,null,b):c.event.dispatch.call(b,a);a.isDefaultPrevented()&&d.preventDefault()}};c.removeEvent=p.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:
74
- function(a,b,c){b="on"+b;a.detachEvent&&(typeof a[b]===z&&(a[b]=null),a.detachEvent(b,c))};c.Event=function(a,b){if(!(this instanceof c.Event))return new c.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||!1===a.returnValue||a.getPreventDefault&&a.getPreventDefault()?ba:R):this.type=a;b&&c.extend(this,b);this.timeStamp=a&&a.timeStamp||c.now();this[c.expando]=!0};c.Event.prototype={isDefaultPrevented:R,isPropagationStopped:R,isImmediatePropagationStopped:R,
75
- preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ba;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ba;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()}};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={delegateType:b,bindType:b,handle:function(a){var e,
76
- f=a.relatedTarget,g=a.handleObj;if(!f||f!==this&&!c.contains(this,f))a.type=g.origType,e=g.handler.apply(this,arguments),a.type=b;return e}}});c.support.submitBubbles||(c.event.special.submit={setup:function(){if(c.nodeName(this,"form"))return!1;c.event.add(this,"click._submit keypress._submit",function(a){a=a.target;(a=c.nodeName(a,"input")||c.nodeName(a,"button")?a.form:m)&&!c._data(a,"submitBubbles")&&(c.event.add(a,"submit._submit",function(a){a._submit_bubble=!0}),c._data(a,"submitBubbles",!0))})},
77
- postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&c.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(c.nodeName(this,"form"))return!1;c.event.remove(this,"._submit")}});c.support.changeBubbles||(c.event.special.change={setup:function(){if(Ka.test(this.nodeName)){if("checkbox"===this.type||"radio"===this.type)c.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),
78
- c.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1);c.event.simulate("change",this,a,!0)});return!1}c.event.add(this,"beforeactivate._change",function(a){a=a.target;Ka.test(a.nodeName)&&!c._data(a,"changeBubbles")&&(c.event.add(a,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||c.event.simulate("change",this.parentNode,a,!0)}),c._data(a,"changeBubbles",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||
79
- a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type)return a.handleObj.handler.apply(this,arguments)},teardown:function(){c.event.remove(this,"._change");return!Ka.test(this.nodeName)}});c.support.focusinBubbles||c.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){c.event.simulate(b,a.target,c.event.fix(a),!0)};c.event.special[b]={setup:function(){0===d++&&p.addEventListener(a,e,!0)},teardown:function(){0===--d&&p.removeEventListener(a,e,!0)}}});c.fn.extend({on:function(a,
80
- b,d,e,f){var g,h;if("object"===typeof a){"string"!==typeof b&&(d=d||b,b=m);for(g in a)this.on(g,b,d,a[g],f);return this}null==d&&null==e?(e=b,d=b=m):null==e&&("string"===typeof b?(e=d,d=m):(e=d,d=b,b=m));if(!1===e)e=R;else if(!e)return this;1===f&&(h=e,e=function(a){c().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=c.guid++));return this.each(function(){c.event.add(this,a,e,d,b)})},one:function(a,b,c,e){return this.on(a,b,c,e,1)},off:function(a,b,d){var e;if(a&&a.preventDefault&&a.handleObj)return e=
81
- a.handleObj,c(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if("object"===typeof a){for(e in a)this.off(e,b,a[e]);return this}if(!1===b||"function"===typeof b)d=b,b=m;!1===d&&(d=R);return this.each(function(){c.event.remove(this,a,d,b)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,e){return this.on(b,a,c,e)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,
82
- "**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){var d=this[0];if(d)return c.event.trigger(a,b,d,!0)}});(function(a,b){function d(a){return ka.test(a+"")}function e(){var a,b=[];return a=function(c,d){b.push(c+=" ")>w.cacheLength&&delete a[b.shift()];return a[c]=d}}function f(a){a[D]=!0;return a}function g(a){var b=E.createElement("div");try{return a(b)}catch(c){return!1}finally{}}function h(a,b,c,d){var e,f,g,
83
- h,k;(b?b.ownerDocument||b:ja)!==E&&J(b);b=b||E;c=c||[];if(!a||"string"!==typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(!P&&!d){if(e=la.exec(a))if(g=e[1])if(9===h)if((f=b.getElementById(g))&&f.parentNode){if(f.id===g)return c.push(f),c}else return c;else{if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&sa(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return F.apply(c,I.call(b.getElementsByTagName(a),0)),c;if((g=e[3])&&x.getByClassName&&b.getElementsByClassName)return F.apply(c,
84
- I.call(b.getElementsByClassName(g),0)),c}if(x.qsa&&!K.test(a)){e=!0;f=D;g=b;k=9===h&&a;if(1===h&&"object"!==b.nodeName.toLowerCase()){h=n(a);(e=b.getAttribute("id"))?f=e.replace(oa,"\\$&"):b.setAttribute("id",f);f="[id='"+f+"'] ";for(g=h.length;g--;)h[g]=f+p(h[g]);g=ba.test(a)&&b.parentNode||b;k=h.join(",")}if(k)try{return F.apply(c,I.call(g.querySelectorAll(k),0)),c}catch(l){}finally{e||b.removeAttribute("id")}}}var m;a:{a=a.replace(Q,"$1");f=n(a);if(!d&&1===f.length){e=f[0]=f[0].slice(0);if(2<e.length&&
85
- "ID"===(m=e[0]).type&&9===b.nodeType&&!P&&w.relative[e[1].type]){b=w.find.ID(m.matches[0].replace(da,ea),b)[0];if(!b){m=c;break a}a=a.slice(e.shift().value.length)}for(h=X.needsContext.test(a)?0:e.length;h--;){m=e[h];if(w.relative[g=m.type])break;if(g=w.find[g])if(d=g(m.matches[0].replace(da,ea),ba.test(e[0].type)&&b.parentNode||b)){e.splice(h,1);a=d.length&&p(e);if(!a){F.apply(c,I.call(d,0));m=c;break a}break}}}L(a,f)(d,b,P,c,ba.test(a));m=c}return m}function k(a,b){var c=b&&a,d=c&&(~b.sourceIndex||
86
- -2147483648)-(~a.sourceIndex||-2147483648);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function l(a){return function(b){return"input"===b.nodeName.toLowerCase()&&b.type===a}}function u(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function m(a){return f(function(b){b=+b;return f(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function n(a,b){var c,d,e,f,g,k,l;if(g=T[a+" "])return b?
87
- 0:g.slice(0);g=a;k=[];for(l=w.preFilter;g;){if(!c||(d=fa.exec(g)))d&&(g=g.slice(d[0].length)||g),k.push(e=[]);c=!1;if(d=ga.exec(g))c=d.shift(),e.push({value:c,type:d[0].replace(Q," ")}),g=g.slice(c.length);for(f in w.filter)!(d=X[f].exec(g))||l[f]&&!(d=l[f](d))||(c=d.shift(),e.push({value:c,type:f,matches:d}),g=g.slice(c.length));if(!c)break}return b?g.length:g?h.error(a):T(a,k).slice(0)}function p(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function r(a,b,c){var d=b.dir,e=c&&"parentNode"===
88
- d,f=W++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,k,La,l=N+" "+f;if(g)for(;b=b[d];){if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(La=b[D]||(b[D]={}),(k=La[d])&&k[0]===l){if(!0===(h=k[1])||h===v)return!0===h}else if(k=La[d]=[l],k[1]=a(b,c,g)||v,!0===k[1])return!0}}function A(a){return 1<a.length?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function B(a,b,c,d,e){for(var f,
89
- g=[],h=0,k=a.length,l=null!=b;h<k;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),l&&b.push(h);return g}function H(a,b,c,d,e,g){d&&!d[D]&&(d=H(d));e&&!e[D]&&(e=H(e,g));return f(function(f,g,k,l){var n,m,u=[],p=[],w=g.length,t;if(!(t=f)){t=b||"*";for(var q=k.nodeType?[k]:k,r=[],ca=0,v=q.length;ca<v;ca++)h(t,q[ca],r);t=r}t=!a||!f&&b?t:B(t,u,a,k,l);q=c?e||(f?a:w||d)?[]:g:t;c&&c(t,q,k,l);if(d)for(n=B(q,p),d(n,[],k,l),k=n.length;k--;)if(m=n[k])q[p[k]]=!(t[p[k]]=m);if(f){if(e||a){if(e){n=[];for(k=q.length;k--;)(m=
90
- q[k])&&n.push(t[k]=m);e(null,q=[],n,l)}for(k=q.length;k--;)(m=q[k])&&-1<(n=e?R.call(f,m):u[k])&&(f[n]=!(g[n]=m))}}else q=B(q===g?q.splice(w,q.length):q),e?e(null,g,q,l):F.apply(g,q)})}function z(a){var b,c,d,e=a.length,f=w.relative[a[0].type];c=f||w.relative[" "];for(var g=f?1:0,h=r(function(a){return a===b},c,!0),k=r(function(a){return-1<R.call(b,a)},c,!0),l=[function(a,c,d){return!f&&(d||c!==ua)||((b=c).nodeType?h(a,c,d):k(a,c,d))}];g<e;g++)if(c=w.relative[a[g].type])l=[r(A(l),c)];else{c=w.filter[a[g].type].apply(null,
91
- a[g].matches);if(c[D]){for(d=++g;d<e&&!w.relative[a[d].type];d++);return H(1<g&&A(l),1<g&&p(a.slice(0,g-1)).replace(Q,"$1"),c,g<d&&z(a.slice(g,d)),d<e&&z(a=a.slice(d)),d<e&&p(a))}l.push(c)}return A(l)}function O(a,b){var c=0,d=0<b.length,e=0<a.length,g=function(f,g,k,l,n){var m,u,p=[],q=0,t="0",r=f&&[],ca=null!=n,x=ua,y=f||e&&w.find.TAG("*",n&&g.parentNode||g),ta=N+=null==x?1:Math.random()||.1;ca&&(ua=g!==E&&g,v=c);for(;null!=(n=y[t]);t++){if(e&&n){for(m=0;u=a[m++];)if(u(n,g,k)){l.push(n);break}ca&&
92
- (N=ta,v=++c)}d&&((n=!u&&n)&&q--,f&&r.push(n))}q+=t;if(d&&t!==q){for(m=0;u=b[m++];)u(r,p,g,k);if(f){if(0<q)for(;t--;)r[t]||p[t]||(p[t]=Z.call(l));p=B(p)}F.apply(l,p);ca&&!f&&0<p.length&&1<q+b.length&&h.uniqueSort(l)}ca&&(N=ta,ua=x);return r};return d?f(g):g}function M(){}var qa,v,w,va,ta,L,ra,ua,J,E,y,P,K,G,wa,sa,Ma,D="sizzle"+-new Date,ja=a.document,x={},N=0,W=0,S=e(),T=e(),U=e(),aa=typeof b,C=[],Z=C.pop,F=C.push,I=C.slice,R=C.indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]===a)return b;
93
- return-1},C="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+".replace("w","w#"),Y="\\[[\\x20\\t\\r\\n\\f]*((?:\\\\.|[\\w-]|[^\\x00-\\xa0])+)[\\x20\\t\\r\\n\\f]*(?:([*^$|!~]?=)[\\x20\\t\\r\\n\\f]*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+C+")|)|)[\\x20\\t\\r\\n\\f]*\\]",V=":((?:\\\\.|[\\w-]|[^\\x00-\\xa0])+)(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+Y.replace(3,8)+")*)|.*)\\)|)",Q=RegExp("^[\\x20\\t\\r\\n\\f]+|((?:^|[^\\\\])(?:\\\\.)*)[\\x20\\t\\r\\n\\f]+$","g"),fa=/^[\x20\t\r\n\f]*,[\x20\t\r\n\f]*/,
94
- ga=/^[\x20\t\r\n\f]*([\x20\t\r\n\f>+~])[\x20\t\r\n\f]*/,ha=new RegExp(V),ia=new RegExp("^"+C+"$"),X={ID:/^#((?:\\.|[\w-]|[^\x00-\xa0])+)/,CLASS:/^\.((?:\\.|[\w-]|[^\x00-\xa0])+)/,NAME:/^\[name=['"]?((?:\\.|[\w-]|[^\x00-\xa0])+)['"]?\]/,TAG:new RegExp("^("+"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+".replace("w","w*")+")"),ATTR:new RegExp("^"+Y),PSEUDO:new RegExp("^"+V),CHILD:/^:(only|first|last|nth|nth-last)-(child|of-type)(?:\([\x20\t\r\n\f]*(even|odd|(([+-]|)(\d*)n|)[\x20\t\r\n\f]*(?:([+-]|)[\x20\t\r\n\f]*(\d+)|))[\x20\t\r\n\f]*\)|)/i,
95
- needsContext:/^[\x20\t\r\n\f]*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\([\x20\t\r\n\f]*((?:-\d)?\d*)[\x20\t\r\n\f]*\)|)(?=[^-]|$)/i},ba=/[\x20\t\r\n\f]*[+~]/,ka=/^[^{]+\{\s*\[native code/,la=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ma=/^(?:input|select|textarea|button)$/i,na=/^h\d$/i,oa=/'|\\/g,pa=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,da=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,ea=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,
96
- c&1023|56320)};try{I.call(ja.documentElement.childNodes,0)[0].nodeType}catch(Sc){I=function(a){for(var b,c=[];b=this[a++];)c.push(b);return c}}ta=h.isXML=function(a){return(a=a&&(a.ownerDocument||a).documentElement)?"HTML"!==a.nodeName:!1};J=h.setDocument=function(a){var c=a?a.ownerDocument||a:ja;if(c===E||9!==c.nodeType||!c.documentElement)return E;E=c;y=c.documentElement;P=ta(c);x.tagNameNoComments=g(function(a){a.appendChild(c.createComment(""));return!a.getElementsByTagName("*").length});x.attributes=
97
- g(function(a){a.innerHTML="<select></select>";a=typeof a.lastChild.getAttribute("multiple");return"boolean"!==a&&"string"!==a});x.getByClassName=g(function(a){a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>";if(!a.getElementsByClassName||!a.getElementsByClassName("e").length)return!1;a.lastChild.className="e";return 2===a.getElementsByClassName("e").length});x.getByName=g(function(a){a.id=D+0;a.innerHTML="<a name='"+D+"'></a><div name='"+D+"'></div>";y.insertBefore(a,y.firstChild);
98
- var b=c.getElementsByName&&c.getElementsByName(D).length===2+c.getElementsByName(D+0).length;x.getIdNotName=!c.getElementById(D);y.removeChild(a);return b});w.attrHandle=g(function(a){a.innerHTML="<a href='#'></a>";return a.firstChild&&typeof a.firstChild.getAttribute!==aa&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}};x.getIdNotName?(w.find.ID=function(a,b){if(typeof b.getElementById!==aa&&!P){var c=
99
- b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(da,ea);return function(a){return a.getAttribute("id")===b}}):(w.find.ID=function(a,c){if(typeof c.getElementById!==aa&&!P){var d=c.getElementById(a);return d?d.id===a||typeof d.getAttributeNode!==aa&&d.getAttributeNode("id").value===a?[d]:b:[]}},w.filter.ID=function(a){var b=a.replace(da,ea);return function(a){return(a=typeof a.getAttributeNode!==aa&&a.getAttributeNode("id"))&&a.value===b}});w.find.TAG=x.tagNameNoComments?
100
- function(a,b){if(typeof b.getElementsByTagName!==aa)return b.getElementsByTagName(a)}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f};w.find.NAME=x.getByName&&function(a,b){if(typeof b.getElementsByName!==aa)return b.getElementsByName(name)};w.find.CLASS=x.getByClassName&&function(a,b){if(typeof b.getElementsByClassName!==aa&&!P)return b.getElementsByClassName(a)};G=[];K=[":focus"];if(x.qsa=d(c.querySelectorAll))g(function(a){a.innerHTML=
101
- "<select><option selected=''></option></select>";a.querySelectorAll("[selected]").length||K.push("\\[[\\x20\\t\\r\\n\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)");a.querySelectorAll(":checked").length||K.push(":checked")}),g(function(a){a.innerHTML="<input type='hidden' i=''/>";a.querySelectorAll("[i^='']").length&&K.push("[*^$]=[\\x20\\t\\r\\n\\f]*(?:\"\"|'')");a.querySelectorAll(":enabled").length||K.push(":enabled",":disabled");a.querySelectorAll("*,:x");K.push(",.*:")});(x.matchesSelector=
102
- d(wa=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector))&&g(function(a){x.disconnectedMatch=wa.call(a,"div");wa.call(a,"[s!='']:x");G.push("!=",V)});K=new RegExp(K.join("|"));G=new RegExp(G.join("|"));sa=d(y.contains)||y.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&1===d.nodeType&&(c.contains?c.contains(d):a.compareDocumentPosition&&a.compareDocumentPosition(d)&16))}:function(a,
103
- b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1};Ma=y.compareDocumentPosition?function(a,b){var d;return a===b?(ra=!0,0):(d=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b))?d&1||a.parentNode&&11===a.parentNode.nodeType?a===c||sa(ja,a)?-1:b===c||sa(ja,b)?1:0:d&4?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var d,e=0;d=a.parentNode;var f=b.parentNode,g=[a],h=[b];if(a===b)return ra=!0,0;if(!d||!f)return a===c?-1:b===c?1:d?-1:f?1:0;if(d===f)return k(a,
104
- b);for(d=a;d=d.parentNode;)g.unshift(d);for(d=b;d=d.parentNode;)h.unshift(d);for(;g[e]===h[e];)e++;return e?k(g[e],h[e]):g[e]===ja?-1:h[e]===ja?1:0};ra=!1;[0,0].sort(Ma);x.detectDuplicates=ra;return E};h.matches=function(a,b){return h(a,null,null,b)};h.matchesSelector=function(a,b){(a.ownerDocument||a)!==E&&J(a);b=b.replace(pa,"='$1']");if(!(!x.matchesSelector||P||G&&G.test(b)||K.test(b)))try{var c=wa.call(a,b);if(c||x.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return 0<
105
- h(b,E,null,[a]).length};h.contains=function(a,b){(a.ownerDocument||a)!==E&&J(a);return sa(a,b)};h.attr=function(a,b){var c;(a.ownerDocument||a)!==E&&J(a);P||(b=b.toLowerCase());return(c=w.attrHandle[b])?c(a):P||x.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&!0===a[b]?b:c&&c.specified?c.value:null};h.error=function(a){throw Error("Syntax error, unrecognized expression: "+a);};h.uniqueSort=function(a){var b,c=[],d=1,e=0;ra=!x.detectDuplicates;a.sort(Ma);if(ra){for(;b=
106
- a[d];d++)b===a[d-1]&&(e=c.push(d));for(;e--;)a.splice(c[e],1)}return a};va=h.getText=function(a){var b,c="",d=0;b=a.nodeType;if(!b)for(;b=a[d];d++)c+=va(b);else if(1===b||9===b||11===b){if("string"===typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=va(a)}else if(3===b||4===b)return a.nodeValue;return c};w=h.selectors={cacheLength:50,createPseudo:f,match:X,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},
107
- "~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){a[1]=a[1].replace(da,ea);a[3]=(a[4]||a[5]||"").replace(da,ea);"~="===a[2]&&(a[3]=" "+a[3]+" ");return a.slice(0,4)},CHILD:function(a){a[1]=a[1].toLowerCase();"nth"===a[1].slice(0,3)?(a[3]||h.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&h.error(a[0]);return a},PSEUDO:function(a){var b,c=!a[5]&&a[2];if(X.CHILD.test(a[0]))return null;a[4]?a[2]=a[4]:c&&ha.test(c)&&(b=n(c,!0))&&(b=
108
- c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b));return a.slice(0,3)}},filter:{TAG:function(a){if("*"===a)return function(){return!0};a=a.replace(da,ea).toLowerCase();return function(b){return b.nodeName&&b.nodeName.toLowerCase()===a}},CLASS:function(a){var b=S[a+" "];return b||(b=new RegExp("(^|[\\x20\\t\\r\\n\\f])"+a+"([\\x20\\t\\r\\n\\f]|$)"))&&S(a,function(a){return b.test(a.className||typeof a.getAttribute!==aa&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){d=
109
- h.attr(d,a);if(null==d)return"!="===b;if(!b)return!0;d+="";return"="===b?d===c:"!="===b?d!==c:"^="===b?c&&0===d.indexOf(c):"*="===b?c&&-1<d.indexOf(c):"$="===b?c&&d.slice(-c.length)===c:"~="===b?-1<(" "+d+" ").indexOf(c):"|="===b?d===c||d.slice(0,c.length+1)===c+"-":!1}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,k){var l,n,m,u,p;c=f!==g?"nextSibling":"previousSibling";var q=b.parentNode,
110
- t=h&&b.nodeName.toLowerCase();k=!k&&!h;if(q){if(f){for(;c;){for(n=b;n=n[c];)if(h?n.nodeName.toLowerCase()===t:1===n.nodeType)return!1;p=c="only"===a&&!p&&"nextSibling"}return!0}p=[g?q.firstChild:q.lastChild];if(g&&k)for(k=q[D]||(q[D]={}),l=k[a]||[],u=l[0]===N&&l[1],m=l[0]===N&&l[2],n=u&&q.childNodes[u];n=++u&&n&&n[c]||(m=u=0)||p.pop();){if(1===n.nodeType&&++m&&n===b){k[a]=[N,u,m];break}}else if(k&&(l=(b[D]||(b[D]={}))[a])&&l[0]===N)m=l[1];else for(;(n=++u&&n&&n[c]||(m=u=0)||p.pop())&&((h?n.nodeName.toLowerCase()!==
111
- t:1!==n.nodeType)||!++m||(k&&((n[D]||(n[D]={}))[a]=[N,m]),n!==b)););m-=e;return m===d||0===m%d&&0<=m/d}}},PSEUDO:function(a,b){var c,d=w.pseudos[a]||w.setFilters[a.toLowerCase()]||h.error("unsupported pseudo: "+a);return d[D]?d(b):1<d.length?(c=[a,a,"",b],w.setFilters.hasOwnProperty(a.toLowerCase())?f(function(a,c){for(var e,f=d(a,b),g=f.length;g--;)e=R.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:f(function(a){var b=[],c=[],d=L(a.replace(Q,"$1"));return d[D]?f(function(a,
112
- b,c,e){e=d(a,null,e,[]);for(var f=a.length;f--;)if(c=e[f])a[f]=!(b[f]=c)}):function(a,e,f){b[0]=a;d(b,null,f,c);return!c.pop()}}),has:f(function(a){return function(b){return 0<h(a,b).length}}),contains:f(function(a){return function(b){return-1<(b.textContent||b.innerText||va(b)).indexOf(a)}}),lang:f(function(a){ia.test(a||"")||h.error("unsupported lang: "+a);a=a.replace(da,ea).toLowerCase();return function(b){var c;do if(c=P?b.getAttribute("xml:lang")||b.getAttribute("lang"):b.lang)return c=c.toLowerCase(),
113
- c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===y},focus:function(a){return a===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return!1===a.disabled},disabled:function(a){return!0===a.disabled},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){a.parentNode&&
114
- a.parentNode.selectedIndex;return!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if("@"<a.nodeName||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return na.test(a.nodeName)},input:function(a){return ma.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==
115
- (b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:m(function(){return[0]}),last:m(function(a,b){return[b-1]}),eq:m(function(a,b,c){return[0>c?c+b:c]}),even:m(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:m(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:m(function(a,b,c){for(b=0>c?c+b:c;0<=--b;)a.push(b);return a}),gt:m(function(a,b,c){for(c=0>c?c+b:c;++c<b;)a.push(c);return a})}};for(qa in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[qa]=l(qa);
116
- for(qa in{submit:!0,reset:!0})w.pseudos[qa]=u(qa);L=h.compile=function(a,b){var c,d=[],e=[],f=U[a+" "];if(!f){b||(b=n(a));for(c=b.length;c--;)f=z(b[c]),f[D]?d.push(f):e.push(f);f=U(a,O(e,d))}return f};w.pseudos.nth=w.pseudos.eq;w.filters=M.prototype=w.pseudos;w.setFilters=new M;J();h.attr=c.attr;c.find=h;c.expr=h.selectors;c.expr[":"]=c.expr.pseudos;c.unique=h.uniqueSort;c.text=h.getText;c.isXMLDoc=h.isXML;c.contains=h.contains})(r);var uc=/Until$/,vc=/^(?:parents|prev(?:Until|All))/,Ub=/^.[^:#\[\.,]*$/,
117
- Cb=c.expr.match.needsContext,wc={children:!0,contents:!0,next:!0,prev:!0};c.fn.extend({find:function(a){var b,d,e,f=this.length;if("string"!==typeof a)return e=this,this.pushStack(c(a).filter(function(){for(b=0;b<f;b++)if(c.contains(e[b],this))return!0}));d=[];for(b=0;b<f;b++)c.find(a,this[b],d);d=this.pushStack(1<f?c.unique(d):d);d.selector=(this.selector?this.selector+" ":"")+a;return d},has:function(a){var b,d=c(a,this),e=d.length;return this.filter(function(){for(b=0;b<e;b++)if(c.contains(this,
118
- d[b]))return!0})},not:function(a){return this.pushStack(Za(this,a,!1))},filter:function(a){return this.pushStack(Za(this,a,!0))},is:function(a){return!!a&&("string"===typeof a?Cb.test(a)?0<=c(a,this.context).index(this[0]):0<c.filter(a,this).length:0<this.filter(a).length)},closest:function(a,b){for(var d,e=0,f=this.length,g=[],h=Cb.test(a)||"string"!==typeof a?c(a,b||this.context):0;e<f;e++)for(d=this[e];d&&d.ownerDocument&&d!==b&&11!==d.nodeType;){if(h?-1<h.index(d):c.find.matchesSelector(d,a)){g.push(d);
119
- break}d=d.parentNode}return this.pushStack(1<g.length?c.unique(g):g)},index:function(a){return a?"string"===typeof a?c.inArray(this[0],c(a)):c.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){var d="string"===typeof a?c(a,b):c.makeArray(a&&a.nodeType?[a]:a),d=c.merge(this.get(),d);return this.pushStack(c.unique(d))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});c.fn.andSelf=c.fn.addBack;c.each({parent:function(a){return(a=
120
- a.parentNode)&&11!==a.nodeType?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return Ya(a,"nextSibling")},prev:function(a){return Ya(a,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling((a.parentNode||
121
- {}).firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.merge([],a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);uc.test(a)||(e=d);e&&"string"===typeof e&&(f=c.filter(e,f));f=1<this.length&&!wc[a]?c.unique(f):f;1<this.length&&vc.test(a)&&(f=f.reverse());return this.pushStack(f)}});c.extend({filter:function(a,b,d){d&&(a=":not("+a+")");return 1===b.length?c.find.matchesSelector(b[0],
122
- a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&9!==a.nodeType&&(d===m||1!==a.nodeType||!c(a).is(d));)1===a.nodeType&&e.push(a),a=a[b];return e},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}});var ab="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",xc=/ jQuery\d+="(?:null|\d+)"/g,Db=new RegExp("<(?:"+ab+")[\\s/>]",
123
- "i"),Na=/^\s+/,Eb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Fb=/<([\w:]+)/,Gb=/<tbody/i,yc=/<|&#?\w+;/,zc=/<(?:script|style|link)/i,Ba=/^(?:checkbox|radio)$/i,Ac=/checked\s*(?:[^=]|=\s*.checked.)/i,Hb=/^$|\/(?:java|ecma)script/i,Wb=/^true\/(.*)/,Bc=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,H={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],
124
- tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:c.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},Oa=$a(p).appendChild(p.createElement("div"));H.optgroup=H.option;H.tbody=H.tfoot=H.colgroup=H.caption=H.thead;H.th=H.td;c.fn.extend({text:function(a){return c.access(this,function(a){return a===m?c.text(this):this.empty().append((this[0]&&this[0].ownerDocument||p).createTextNode(a))},
125
- null,a,arguments.length)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapAll(a.call(this,b))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var a=this;a.firstChild&&1===a.firstChild.nodeType;)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return c.isFunction(a)?this.each(function(b){c(this).wrapInner(a.call(this,b))}):this.each(function(){var b=c(this),d=b.contents();
126
- d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){var b=c.isFunction(a);return this.each(function(d){c(this).wrapAll(b?a.call(this,d):a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){1!==this.nodeType&&11!==
127
- this.nodeType&&9!==this.nodeType||this.insertBefore(a,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,!1,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var d,e=0;null!=(d=this[e]);e++)if(!a||0<c.filter(a,[d]).length)b||1!==d.nodeType||c.cleanData(B(d)),d.parentNode&&(b&&c.contains(d.ownerDocument,d)&&
128
- Aa(B(d,"script")),d.parentNode.removeChild(d));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){for(1===a.nodeType&&c.cleanData(B(a,!1));a.firstChild;)a.removeChild(a.firstChild);a.options&&c.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){a=null==a?!1:a;b=null==b?a:b;return this.map(function(){return c.clone(this,a,b)})},html:function(a){return c.access(this,function(a){var d=this[0]||{},e=0,f=this.length;if(a===m)return 1===d.nodeType?d.innerHTML.replace(xc,
129
- ""):m;if(!("string"!==typeof a||zc.test(a)||!c.support.htmlSerialize&&Db.test(a)||!c.support.leadingWhitespace&&Na.test(a)||H[(Fb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(Eb,"<$1></$2>");try{for(;e<f;e++)d=this[e]||{},1===d.nodeType&&(c.cleanData(B(d,!1)),d.innerHTML=a);d=0}catch(g){}}d&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){c.isFunction(a)||"string"===typeof a||(a=c(a).not(this).detach());return this.domManip([a],!0,function(a){var d=this.nextSibling,
130
- e=this.parentNode;e&&(c(this).remove(),e.insertBefore(a,d))})},detach:function(a){return this.remove(a,!0)},domManip:function(a,b,d){a=ub.apply([],a);var e,f,g,h,k=0,l=this.length,u=this,p=l-1,n=a[0],q=c.isFunction(n);if(q||!(1>=l||"string"!==typeof n||c.support.checkClone)&&Ac.test(n))return this.each(function(c){var e=u.eq(c);q&&(a[0]=n.call(this,c,b?e.html():m));e.domManip(a,b,d)});if(l&&(h=c.buildFragment(a,this[0].ownerDocument,!1,this),e=h.firstChild,1===h.childNodes.length&&(h=e),e)){b=b&&
131
- c.nodeName(e,"tr");g=c.map(B(h,"script"),bb);for(f=g.length;k<l;k++)e=h,k!==p&&(e=c.clone(e,!0,!0),f&&c.merge(g,B(e,"script"))),d.call(b&&c.nodeName(this[k],"table")?Vb(this[k],"tbody"):this[k],e,k);if(f)for(h=g[g.length-1].ownerDocument,c.map(g,cb),k=0;k<f;k++)e=g[k],Hb.test(e.type||"")&&!c._data(e,"globalEval")&&c.contains(h,e)&&(e.src?c.ajax({url:e.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):c.globalEval((e.text||e.textContent||e.innerHTML||"").replace(Bc,"")));h=e=null}return this}});
132
- c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(a){for(var e=0,f=[],g=c(a),h=g.length-1;e<=h;e++)a=e===h?this:this.clone(!0),c(g[e])[b](a),Fa.apply(f,a.get());return this.pushStack(f)}});c.extend({clone:function(a,b,d){var e,f,g,h,k,l=c.contains(a.ownerDocument,a);c.support.html5Clone||c.isXMLDoc(a)||!Db.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(Oa.innerHTML=a.outerHTML,Oa.removeChild(g=Oa.firstChild));
133
- if(!(c.support.noCloneEvent&&c.support.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||c.isXMLDoc(a)))for(e=B(g),k=B(a),h=0;null!=(f=k[h]);++h)if(e[h]){var m=e[h],p=void 0,n=void 0,q=void 0;if(1===m.nodeType){p=m.nodeName.toLowerCase();if(!c.support.noCloneEvent&&m[c.expando]){q=c._data(m);for(n in q.events)c.removeEvent(m,n,q.handle);m.removeAttribute(c.expando)}if("script"===p&&m.text!==f.text)bb(m).text=f.text,cb(m);else if("object"===p)m.parentNode&&(m.outerHTML=f.outerHTML),c.support.html5Clone&&
134
- f.innerHTML&&!c.trim(m.innerHTML)&&(m.innerHTML=f.innerHTML);else if("input"===p&&Ba.test(f.type))m.defaultChecked=m.checked=f.checked,m.value!==f.value&&(m.value=f.value);else if("option"===p)m.defaultSelected=m.selected=f.defaultSelected;else if("input"===p||"textarea"===p)m.defaultValue=f.defaultValue}}if(b)if(d)for(k=k||B(a),e=e||B(g),h=0;null!=(f=k[h]);h++)db(f,e[h]);else db(a,g);e=B(g,"script");0<e.length&&Aa(e,!l&&B(a,"script"));return g},buildFragment:function(a,b,d,e){for(var f,g,h,k,l,m,
135
- p=a.length,n=$a(b),q=[],r=0;r<p;r++)if((g=a[r])||0===g)if("object"===c.type(g))c.merge(q,g.nodeType?[g]:g);else if(yc.test(g)){h=h||n.appendChild(b.createElement("div"));k=(Fb.exec(g)||["",""])[1].toLowerCase();m=H[k]||H._default;h.innerHTML=m[1]+g.replace(Eb,"<$1></$2>")+m[2];for(f=m[0];f--;)h=h.lastChild;!c.support.leadingWhitespace&&Na.test(g)&&q.push(b.createTextNode(Na.exec(g)[0]));if(!c.support.tbody)for(f=(g="table"!==k||Gb.test(g)?"<table>"!==m[1]||Gb.test(g)?0:h:h.firstChild)&&g.childNodes.length;f--;)c.nodeName(l=
136
- g.childNodes[f],"tbody")&&!l.childNodes.length&&g.removeChild(l);c.merge(q,h.childNodes);for(h.textContent="";h.firstChild;)h.removeChild(h.firstChild);h=n.lastChild}else q.push(b.createTextNode(g));h&&n.removeChild(h);c.support.appendChecked||c.grep(B(q,"input"),Xb);for(r=0;g=q[r++];)if(!e||-1===c.inArray(g,e))if(a=c.contains(g.ownerDocument,g),h=B(n.appendChild(g),"script"),a&&Aa(h),d)for(f=0;g=h[f++];)Hb.test(g.type||"")&&d.push(g);return n},cleanData:function(a,b){for(var d,e,f,g,h=0,k=c.expando,
137
- l=c.cache,m=c.support.deleteExpando,p=c.event.special;null!=(d=a[h]);h++)if(b||c.acceptData(d))if(g=(f=d[k])&&l[f]){if(g.events)for(e in g.events)p[e]?c.event.remove(d,e):c.removeEvent(d,e,g.handle);l[f]&&(delete l[f],m?delete d[k]:typeof d.removeAttribute!==z?d.removeAttribute(k):d[k]=null,I.push(f))}}});var ga,T,U,Pa=/alpha\([^)]*\)/i,Cc=/opacity\s*=\s*([^)]*)/,Dc=/^(top|right|bottom|left)$/,Ec=/^(none|table(?!-c[ea]).+)/,Ib=/^margin/,Yb=new RegExp("^("+pa+")(.*)$","i"),ka=new RegExp("^("+pa+")(?!px)[a-z%]+$",
138
- "i"),Fc=new RegExp("^([+-])=("+pa+")","i"),lb={BODY:"block"},Gc={position:"absolute",visibility:"hidden",display:"block"},Jb={letterSpacing:0,fontWeight:400},S=["Top","Right","Bottom","Left"],fb=["Webkit","O","Moz","ms"];c.fn.extend({css:function(a,b){return c.access(this,function(a,b,f){var g,h={},k=0;if(c.isArray(b)){g=T(a);for(f=b.length;k<f;k++)h[b[k]]=c.css(a,b[k],!1,g);return h}return f!==m?c.style(a,b,f):c.css(a,b)},a,b,1<arguments.length)},show:function(){return gb(this,!0)},hide:function(){return gb(this)},
139
- toggle:function(a){var b="boolean"===typeof a;return this.each(function(){(b?a:fa(this))?c(this).show():c(this).hide()})}});c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=U(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var f,g,h,k=c.camelCase(b),
140
- l=a.style;b=c.cssProps[k]||(c.cssProps[k]=eb(l,k));h=c.cssHooks[b]||c.cssHooks[k];if(d!==m){if(g=typeof d,"string"===g&&(f=Fc.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(c.css(a,b)),g="number"),!(null==d||"number"===g&&isNaN(d)||("number"!==g||c.cssNumber[k]||(d+="px"),c.support.clearCloneStyle||""!==d||0!==b.indexOf("background")||(l[b]="inherit"),h&&"set"in h&&(d=h.set(a,d,e))===m)))try{l[b]=d}catch(p){}}else return h&&"get"in h&&(f=h.get(a,!1,e))!==m?f:l[b]}},css:function(a,b,d,e){var f,g;g=c.camelCase(b);
141
- b=c.cssProps[g]||(c.cssProps[g]=eb(a.style,g));(g=c.cssHooks[b]||c.cssHooks[g])&&"get"in g&&(f=g.get(a,!0,d));f===m&&(f=U(a,b,e));"normal"===f&&b in Jb&&(f=Jb[b]);return""===d||d?(a=parseFloat(f),!0===d||c.isNumeric(a)?a||0:f):f},swap:function(a,b,c,e){var f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];c=c.apply(a,e||[]);for(f in b)a.style[f]=g[f];return c}});r.getComputedStyle?(T=function(a){return r.getComputedStyle(a,null)},U=function(a,b,d){var e,f=(d=d||T(a))?d.getPropertyValue(b)||d[b]:m,
142
- g=a.style;d&&(""!==f||c.contains(a.ownerDocument,a)||(f=c.style(a,b)),ka.test(f)&&Ib.test(b)&&(a=g.width,b=g.minWidth,e=g.maxWidth,g.minWidth=g.maxWidth=g.width=f,f=d.width,g.width=a,g.minWidth=b,g.maxWidth=e));return f}):p.documentElement.currentStyle&&(T=function(a){return a.currentStyle},U=function(a,b,c){var e,f,g=(c=c||T(a))?c[b]:m,h=a.style;null==g&&h&&h[b]&&(g=h[b]);if(ka.test(g)&&!Dc.test(b)){c=h.left;if(f=(e=a.runtimeStyle)&&e.left)e.left=a.currentStyle.left;h.left="fontSize"===b?"1em":g;
143
- g=h.pixelLeft+"px";h.left=c;f&&(e.left=f)}return""===g?"auto":g});c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(a,e,f){if(e)return 0===a.offsetWidth&&Ec.test(c.css(a,"display"))?c.swap(a,Gc,function(){return kb(a,b,f)}):kb(a,b,f)},set:function(a,e,f){var g=f&&T(a);return ib(a,e,f?jb(a,b,f,c.support.boxSizing&&"border-box"===c.css(a,"boxSizing",!1,g),g):0)}}});c.support.opacity||(c.cssHooks.opacity={get:function(a,b){return Cc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||
144
- "")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var d=a.style,e=a.currentStyle,f=c.isNumeric(b)?"alpha(opacity="+100*b+")":"",g=e&&e.filter||d.filter||"";d.zoom=1;if((1<=b||""===b)&&""===c.trim(g.replace(Pa,""))&&d.removeAttribute&&(d.removeAttribute("filter"),""===b||e&&!e.filter))return;d.filter=Pa.test(g)?g.replace(Pa,f):g+" "+f}});c(function(){c.support.reliableMarginRight||(c.cssHooks.marginRight={get:function(a,b){if(b)return c.swap(a,{display:"inline-block"},U,[a,"marginRight"])}});
145
- !c.support.pixelPosition&&c.fn.position&&c.each(["top","left"],function(a,b){c.cssHooks[b]={get:function(a,e){if(e)return e=U(a,b),ka.test(e)?c(a).position()[b]+"px":e}}})});c.expr&&c.expr.filters&&(c.expr.filters.hidden=function(a){return 0>=a.offsetWidth&&0>=a.offsetHeight||!c.support.reliableHiddenOffsets&&"none"===(a.style&&a.style.display||c.css(a,"display"))},c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)});c.each({margin:"",padding:"",border:"Width"},function(a,b){c.cssHooks[a+
146
- b]={expand:function(c){var e=0,f={};for(c="string"===typeof c?c.split(" "):[c];4>e;e++)f[a+S[e]+b]=c[e]||c[e-2]||c[0];return f}};Ib.test(a)||(c.cssHooks[a+b].set=ib)});var Hc=/%20/g,Zb=/\[\]$/,Kb=/\r?\n/g,Ic=/^(?:submit|button|image|reset|file)$/i,Jc=/^(?:input|select|textarea|keygen)/i;c.fn.extend({serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=c.prop(this,"elements");return a?c.makeArray(a):this}).filter(function(){var a=this.type;
147
- return this.name&&!c(this).is(":disabled")&&Jc.test(this.nodeName)&&!Ic.test(a)&&(this.checked||!Ba.test(a))}).map(function(a,b){var d=c(this).val();return null==d?null:c.isArray(d)?c.map(d,function(a){return{name:b.name,value:a.replace(Kb,"\r\n")}}):{name:b.name,value:d.replace(Kb,"\r\n")}}).get()}});c.param=function(a,b){var d,e=[],f=function(a,b){b=c.isFunction(b)?b():null==b?"":b;e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};b===m&&(b=c.ajaxSettings&&c.ajaxSettings.traditional);
148
- if(c.isArray(a)||a.jquery&&!c.isPlainObject(a))c.each(a,function(){f(this.name,this.value)});else for(d in a)Ca(d,a[d],b,f);return e.join("&").replace(Hc,"+")};c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){c.fn[b]=function(a,c){return 0<arguments.length?this.on(b,null,a,c):this.trigger(b)}});c.fn.hover=function(a,
149
- b){return this.mouseenter(a).mouseleave(b||a)};var F,W,Qa=c.now(),Ra=/\?/,Kc=/#.*$/,Lb=/([?&])_=[^&]*/,Lc=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,Mc=/^(?:GET|HEAD)$/,Nc=/^\/\//,Mb=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Nb=c.fn.load,Ob={},Da={},Pb="*/".concat("*");try{W=bc.href}catch(a){W=p.createElement("a"),W.href="",W=W.href}F=Mb.exec(W.toLowerCase())||[];c.fn.load=function(a,b,d){if("string"!==typeof a&&Nb)return Nb.apply(this,arguments);var e,f,g,h=this,k=a.indexOf(" ");0<=k&&(e=a.slice(k,a.length),
150
- a=a.slice(0,k));c.isFunction(b)?(d=b,b=m):b&&"object"===typeof b&&(g="POST");0<h.length&&c.ajax({url:a,type:g,dataType:"html",data:b}).done(function(a){f=arguments;h.html(e?c("<div>").append(c.parseHTML(a)).find(e):a)}).complete(d&&function(a,b){h.each(d,f||[a.responseText,b,a])});return this};c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(a){return this.on(b,a)}});c.each(["get","post"],function(a,b){c[b]=function(a,e,f,g){c.isFunction(e)&&
151
- (g=g||f,f=e,e=m);return c.ajax({url:a,type:b,dataType:g,data:e,success:f})}});c.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:W,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(F[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Pb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",
152
- text:"responseText"},converters:{"* text":r.String,"text html":!0,"text json":c.parseJSON,"text xml":c.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ea(Ea(a,c.ajaxSettings),b):Ea(c.ajaxSettings,a)},ajaxPrefilter:nb(Ob),ajaxTransport:nb(Da),ajax:function(a,b){function d(a,b,d,e){var f,t,J,E,y=b;if(2!==M){M=2;k&&clearTimeout(k);p=m;h=e||"";v.readyState=0<a?4:0;if(d){E=n;e=v;var C,K,G,z,I=E.contents,F=E.dataTypes,D=E.responseFields;for(z in D)z in d&&(e[D[z]]=d[z]);for(;"*"===
153
- F[0];)F.shift(),K===m&&(K=E.mimeType||e.getResponseHeader("Content-Type"));if(K)for(z in I)if(I[z]&&I[z].test(K)){F.unshift(z);break}if(F[0]in d)G=F[0];else{for(z in d){if(!F[0]||E.converters[z+" "+F[0]]){G=z;break}C||(C=z)}G=G||C}G?(G!==F[0]&&F.unshift(G),E=d[G]):E=void 0}if(200<=a&&300>a||304===a)if(n.ifModified&&((d=v.getResponseHeader("Last-Modified"))&&(c.lastModified[g]=d),(d=v.getResponseHeader("etag"))&&(c.etag[g]=d)),204===a)f=!0,y="nocontent";else if(304===a)f=!0,y="notmodified";else{a:{t=
154
- n;J=E;var L,x,y={};C=0;K=t.dataTypes.slice();G=K[0];t.dataFilter&&(J=t.dataFilter(J,t.dataType));if(K[1])for(x in t.converters)y[x.toLowerCase()]=t.converters[x];for(;d=K[++C];)if("*"!==d){if("*"!==G&&G!==d){x=y[G+" "+d]||y["* "+d];if(!x)for(L in y)if(f=L.split(" "),f[1]===d&&(x=y[G+" "+f[0]]||y["* "+f[0]])){!0===x?x=y[L]:!0!==y[L]&&(d=f[0],K.splice(C--,0,d));break}if(!0!==x)if(x&&t["throws"])J=x(J);else try{J=x(J)}catch(N){f={state:"parsererror",error:x?N:"No conversion from "+G+" to "+d};break a}}G=
155
- d}f={state:"success",data:J}}y=f.state;t=f.data;J=f.error;f=!J}else if(J=y,a||!y)y="error",0>a&&(a=0);v.status=a;v.statusText=(b||y)+"";f?A.resolveWith(q,[t,y,v]):A.rejectWith(q,[v,y,J]);v.statusCode(H);H=m;l&&r.trigger(f?"ajaxSuccess":"ajaxError",[v,n,f?t:J]);B.fireWith(q,[v,y]);l&&(r.trigger("ajaxComplete",[v,n]),--c.active||c.event.trigger("ajaxStop"))}}"object"===typeof a&&(b=a,a=m);b=b||{};var e,f,g,h,k,l,p,t,n=c.ajaxSetup({},b),q=n.context||n,r=n.context&&(q.nodeType||q.jquery)?c(q):c.event,
156
- A=c.Deferred(),B=c.Callbacks("once memory"),H=n.statusCode||{},C={},z={},M=0,I="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===M){if(!t)for(t={};b=Lc.exec(h);)t[b[1].toLowerCase()]=b[2];b=t[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===M?h:null},setRequestHeader:function(a,b){var c=a.toLowerCase();M||(a=z[c]=z[c]||a,C[a]=b);return this},overrideMimeType:function(a){M||(n.mimeType=a);return this},statusCode:function(a){var b;if(a)if(2>M)for(b in a)H[b]=
157
- [H[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){a=a||I;p&&p.abort(a);d(0,a);return this}};A.promise(v).complete=B.add;v.success=v.done;v.error=v.fail;n.url=((a||n.url||W)+"").replace(Kc,"").replace(Nc,F[1]+"//");n.type=b.method||b.type||n.method||n.type;n.dataTypes=c.trim(n.dataType||"*").toLowerCase().match(O)||[""];null==n.crossDomain&&(e=Mb.exec(n.url.toLowerCase()),n.crossDomain=!(!e||e[1]===F[1]&&e[2]===F[2]&&(e[3]||("http:"===e[1]?80:443))==(F[3]||("http:"===F[1]?80:443))));
158
- n.data&&n.processData&&"string"!==typeof n.data&&(n.data=c.param(n.data,n.traditional));ob(Ob,n,b,v);if(2===M)return v;(l=n.global)&&0===c.active++&&c.event.trigger("ajaxStart");n.type=n.type.toUpperCase();n.hasContent=!Mc.test(n.type);g=n.url;n.hasContent||(n.data&&(g=n.url+=(Ra.test(g)?"&":"?")+n.data,delete n.data),!1===n.cache&&(n.url=Lb.test(g)?g.replace(Lb,"$1_="+Qa++):g+(Ra.test(g)?"&":"?")+"_="+Qa++));n.ifModified&&(c.lastModified[g]&&v.setRequestHeader("If-Modified-Since",c.lastModified[g]),
159
- c.etag[g]&&v.setRequestHeader("If-None-Match",c.etag[g]));(n.data&&n.hasContent&&!1!==n.contentType||b.contentType)&&v.setRequestHeader("Content-Type",n.contentType);v.setRequestHeader("Accept",n.dataTypes[0]&&n.accepts[n.dataTypes[0]]?n.accepts[n.dataTypes[0]]+("*"!==n.dataTypes[0]?", "+Pb+"; q=0.01":""):n.accepts["*"]);for(f in n.headers)v.setRequestHeader(f,n.headers[f]);if(n.beforeSend&&(!1===n.beforeSend.call(q,v,n)||2===M))return v.abort();I="abort";for(f in{success:1,error:1,complete:1})v[f](n[f]);
160
- if(p=ob(Da,n,b,v)){v.readyState=1;l&&r.trigger("ajaxSend",[v,n]);n.async&&0<n.timeout&&(k=setTimeout(function(){v.abort("timeout")},n.timeout));try{M=1,p.send(C,d)}catch(w){if(2>M)d(-1,w);else throw w;}}else d(-1,"No Transport");return v},getScript:function(a,b){return c.get(a,m,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")}});c.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},
161
- converters:{"text script":function(a){c.globalEval(a);return a}}});c.ajaxPrefilter("script",function(a){a.cache===m&&(a.cache=!1);a.crossDomain&&(a.type="GET",a.global=!1)});c.ajaxTransport("script",function(a){if(a.crossDomain){var b,d=p.head||c("head")[0]||p.documentElement;return{send:function(c,f){b=p.createElement("script");b.async=!0;a.scriptCharset&&(b.charset=a.scriptCharset);b.src=a.url;b.onload=b.onreadystatechange=function(a,c){if(c||!b.readyState||/loaded|complete/.test(b.readyState))b.onload=
162
- b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success")};d.insertBefore(b,d.firstChild)},abort:function(){if(b)b.onload(m,!0)}}}});var Qb=[],Sa=/(=)\?(?=&|$)|\?\?/;c.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||c.expando+"_"+Qa++;this[a]=!0;return a}});c.ajaxPrefilter("json jsonp",function(a,b,d){var e,f,g,h=!1!==a.jsonp&&(Sa.test(a.url)?"url":"string"===typeof a.data&&!(a.contentType||"").indexOf("application/x-www-form-urlencoded")&&
163
- Sa.test(a.data)&&"data");if(h||"jsonp"===a.dataTypes[0])return e=a.jsonpCallback=c.isFunction(a.jsonpCallback)?a.jsonpCallback():a.jsonpCallback,h?a[h]=a[h].replace(Sa,"$1"+e):!1!==a.jsonp&&(a.url+=(Ra.test(a.url)?"&":"?")+a.jsonp+"="+e),a.converters["script json"]=function(){g||c.error(e+" was not called");return g[0]},a.dataTypes[0]="json",f=r[e],r[e]=function(){g=arguments},d.always(function(){r[e]=f;a[e]&&(a.jsonpCallback=b.jsonpCallback,Qb.push(e));g&&c.isFunction(f)&&f(g[0]);g=f=m}),"script"});
164
- var Q,X,Oc=0,Ta=r.ActiveXObject&&function(){for(var a in Q)Q[a](m,!0)};c.ajaxSettings.xhr=r.ActiveXObject?function(){var a;if(!(a=!this.isLocal&&pb()))a:{try{a=new r.ActiveXObject("Microsoft.XMLHTTP");break a}catch(b){}a=void 0}return a}:pb;X=c.ajaxSettings.xhr();c.support.cors=!!X&&"withCredentials"in X;(X=c.support.ajax=!!X)&&c.ajaxTransport(function(a){if(!a.crossDomain||c.support.cors){var b;return{send:function(d,e){var f,g,h=a.xhr();a.username?h.open(a.type,a.url,a.async,a.username,a.password):
165
- h.open(a.type,a.url,a.async);if(a.xhrFields)for(g in a.xhrFields)h[g]=a.xhrFields[g];a.mimeType&&h.overrideMimeType&&h.overrideMimeType(a.mimeType);a.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");try{for(g in d)h.setRequestHeader(g,d[g])}catch(k){}h.send(a.hasContent&&a.data||null);b=function(d,g){var p,t,n,q;try{if(b&&(g||4===h.readyState))if(b=m,f&&(h.onreadystatechange=c.noop,Ta&&delete Q[f]),g)4!==h.readyState&&h.abort();else{q={};p=h.status;t=h.getAllResponseHeaders();
166
- "string"===typeof h.responseText&&(q.text=h.responseText);try{n=h.statusText}catch(r){n=""}p||!a.isLocal||a.crossDomain?1223===p&&(p=204):p=q.text?200:404}}catch(r){g||e(-1,r)}q&&e(p,n,q,t)};a.async?4===h.readyState?setTimeout(b):(f=++Oc,Ta&&(Q||(Q={},c(r).unload(Ta)),Q[f]=b),h.onreadystatechange=b):b()},abort:function(){b&&b(m,!0)}}}});var Y,xa,Pc=/^(?:toggle|show|hide)$/,Qc=new RegExp("^(?:([+-])=|)("+pa+")([a-z%]*)$","i"),Rc=/queueHooks$/,la=[function(a,b,d){var e,f,g,h,k,l,m=this,p=a.style,n=
167
- {},q=[],r=a.nodeType&&fa(a);d.queue||(k=c._queueHooks(a,"fx"),null==k.unqueued&&(k.unqueued=0,l=k.empty.fire,k.empty.fire=function(){k.unqueued||l()}),k.unqueued++,m.always(function(){m.always(function(){k.unqueued--;c.queue(a,"fx").length||k.empty.fire()})}));1===a.nodeType&&("height"in b||"width"in b)&&(d.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===c.css(a,"display")&&"none"===c.css(a,"float")&&(c.support.inlineBlockNeedsLayout&&"inline"!==hb(a.nodeName)?p.zoom=1:p.display="inline-block"));
168
- d.overflow&&(p.overflow="hidden",c.support.shrinkWrapBlocks||m.always(function(){p.overflow=d.overflow[0];p.overflowX=d.overflow[1];p.overflowY=d.overflow[2]}));for(f in b)g=b[f],Pc.exec(g)&&(delete b[f],e=e||"toggle"===g,g!==(r?"hide":"show")&&q.push(f));if(b=q.length)for(g=c._data(a,"fxshow")||c._data(a,"fxshow",{}),("hidden"in g)&&(r=g.hidden),e&&(g.hidden=!r),r?c(a).show():m.done(function(){c(a).hide()}),m.done(function(){var b;c._removeData(a,"fxshow");for(b in n)c.style(a,b,n[b])}),f=0;f<b;f++)e=
169
- q[f],h=m.createTween(e,r?g[e]:0),n[e]=g[e]||c.style(a,e),e in g||(g[e]=h.start,r&&(h.end=h.start,h.start="width"===e||"height"===e?1:0))}],ha={"*":[function(a,b){var d,e,f=this.createTween(a,b),g=Qc.exec(b),h=f.cur(),k=+h||0,l=1,m=20;if(g){d=+g[2];e=g[3]||(c.cssNumber[a]?"":"px");if("px"!==e&&k){k=c.css(f.elem,a,!0)||d||1;do l=l||".5",k/=l,c.style(f.elem,a,k+e);while(l!==(l=f.cur()/h)&&1!==l&&--m)}f.unit=e;f.start=k;f.end=g[1]?k+(g[1]+1)*d:d}return f}]};c.Animation=c.extend(rb,{tweener:function(a,
170
- b){c.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var d,e=0,f=a.length;e<f;e++)d=a[e],ha[d]=ha[d]||[],ha[d].unshift(b)},prefilter:function(a,b){b?la.unshift(a):la.push(a)}});c.Tween=A;A.prototype={constructor:A,init:function(a,b,d,e,f,g){this.elem=a;this.prop=d;this.easing=f||"swing";this.options=b;this.start=this.now=this.cur();this.end=e;this.unit=g||(c.cssNumber[d]?"":"px")},cur:function(){var a=A.propHooks[this.prop];return a&&a.get?a.get(this):A.propHooks._default.get(this)},run:function(a){var b,
171
- d=A.propHooks[this.prop];this.pos=this.options.duration?b=c.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):b=a;this.now=(this.end-this.start)*b+this.start;this.options.step&&this.options.step.call(this.elem,this.now,this);d&&d.set?d.set(this):A.propHooks._default.set(this);return this}};A.prototype.init.prototype=A.prototype;A.propHooks={_default:{get:function(a){return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(a=c.css(a.elem,a.prop,""))&&"auto"!==a?
172
- a:0:a.elem[a.prop]},set:function(a){if(c.fx.step[a.prop])c.fx.step[a.prop](a);else a.elem.style&&(null!=a.elem.style[c.cssProps[a.prop]]||c.cssHooks[a.prop])?c.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}};A.propHooks.scrollTop=A.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}};c.each(["toggle","show","hide"],function(a,b){var d=c.fn[b];c.fn[b]=function(a,c,g){return null==a||"boolean"===typeof a?d.apply(this,arguments):this.animate(ma(b,
173
- !0),a,c,g)}});c.fn.extend({fadeTo:function(a,b,c,e){return this.filter(fa).css("opacity",0).show().end().animate({opacity:b},a,c,e)},animate:function(a,b,d,e){var f=c.isEmptyObject(a),g=c.speed(b,d,e),h=function(){var b=rb(this,c.extend({},a),g);h.finish=function(){b.stop(!0)};(f||c._data(this,"finish"))&&b.stop(!0)};h.finish=h;return f||!1===g.queue?this.each(h):this.queue(g.queue,h)},stop:function(a,b,d){var e=function(a){var b=a.stop;delete a.stop;b(d)};"string"!==typeof a&&(d=b,b=a,a=m);b&&!1!==
174
- a&&this.queue(a||"fx",[]);return this.each(function(){var b=!0,g=null!=a&&a+"queueHooks",h=c.timers,k=c._data(this);if(g)k[g]&&k[g].stop&&e(k[g]);else for(g in k)k[g]&&k[g].stop&&Rc.test(g)&&e(k[g]);for(g=h.length;g--;)h[g].elem!==this||null!=a&&h[g].queue!==a||(h[g].anim.stop(d),b=!1,h.splice(g,1));!b&&d||c.dequeue(this,a)})},finish:function(a){!1!==a&&(a=a||"fx");return this.each(function(){var b,d=c._data(this),e=d[a+"queue"];b=d[a+"queueHooks"];var f=c.timers,g=e?e.length:0;d.finish=!0;c.queue(this,
175
- a,[]);b&&b.cur&&b.cur.finish&&b.cur.finish.call(this);for(b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)e[b]&&e[b].finish&&e[b].finish.call(this);delete d.finish})}});c.each({slideDown:ma("show"),slideUp:ma("hide"),slideToggle:ma("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(a,c,f){return this.animate(b,a,c,f)}});c.speed=function(a,b,d){var e=a&&"object"===typeof a?c.extend({},
176
- a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:"number"===typeof e.duration?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;if(null==e.queue||!0===e.queue)e.queue="fx";e.old=e.complete;e.complete=function(){c.isFunction(e.old)&&e.old.call(this);e.queue&&c.dequeue(this,e.queue)};return e};c.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}};c.timers=[];c.fx=A.prototype.init;
177
- c.fx.tick=function(){var a,b=c.timers,d=0;for(Y=c.now();d<b.length;d++)a=b[d],a()||b[d]!==a||b.splice(d--,1);b.length||c.fx.stop();Y=m};c.fx.timer=function(a){a()&&c.timers.push(a)&&c.fx.start()};c.fx.interval=13;c.fx.start=function(){xa||(xa=setInterval(c.fx.tick,c.fx.interval))};c.fx.stop=function(){clearInterval(xa);xa=null};c.fx.speeds={slow:600,fast:200,_default:400};c.fx.step={};c.expr&&c.expr.filters&&(c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length});
178
- c.fn.offset=function(a){if(arguments.length)return a===m?this:this.each(function(b){c.offset.setOffset(this,a,b)});var b,d,e={top:0,left:0},f=(d=this[0])&&d.ownerDocument;if(f){b=f.documentElement;if(!c.contains(b,d))return e;typeof d.getBoundingClientRect!==z&&(e=d.getBoundingClientRect());d=sb(f);return{top:e.top+(d.pageYOffset||b.scrollTop)-(b.clientTop||0),left:e.left+(d.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}}};c.offset={setOffset:function(a,b,d){var e=c.css(a,"position");"static"===e&&
179
- (a.style.position="relative");var f=c(a),g=f.offset(),h=c.css(a,"top"),k=c.css(a,"left"),l={},m={};("absolute"===e||"fixed"===e)&&-1<c.inArray("auto",[h,k])?(m=f.position(),e=m.top,k=m.left):(e=parseFloat(h)||0,k=parseFloat(k)||0);c.isFunction(b)&&(b=b.call(a,d,g));null!=b.top&&(l.top=b.top-g.top+e);null!=b.left&&(l.left=b.left-g.left+k);"using"in b?b.using.call(a,l):f.css(l)}};c.fn.extend({position:function(){if(this[0]){var a,b,d={top:0,left:0},e=this[0];"fixed"===c.css(e,"position")?b=e.getBoundingClientRect():
180
- (a=this.offsetParent(),b=this.offset(),c.nodeName(a[0],"html")||(d=a.offset()),d.top+=c.css(a[0],"borderTopWidth",!0),d.left+=c.css(a[0],"borderLeftWidth",!0));return{top:b.top-d.top-c.css(e,"marginTop",!0),left:b.left-d.left-c.css(e,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||p.documentElement;a&&!c.nodeName(a,"html")&&"static"===c.css(a,"position");)a=a.offsetParent;return a||p.documentElement})}});c.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},
181
- function(a,b){var d=/Y/.test(b);c.fn[a]=function(e){return c.access(this,function(a,e,h){var k=sb(a);if(h===m)return k?b in k?k[b]:k.document.documentElement[e]:a[e];k?k.scrollTo(d?c(k).scrollLeft():h,d?h:c(k).scrollTop()):a[e]=h},a,e,arguments.length,null)}});c.each({Height:"height",Width:"width"},function(a,b){c.each({padding:"inner"+a,content:b,"":"outer"+a},function(d,e){c.fn[e]=function(e,g){var h=arguments.length&&(d||"boolean"!==typeof e),k=d||(!0===e||!0===g?"margin":"border");return c.access(this,
1
+ (function(r,m){function ya(a){var b=a.length,d=c.type(a);return c.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===d||"function"!==d&&(0===b||"number"===typeof b&&0<b&&b-1 in a)}function Rb(a){var b=Ua[a]={};c.each(a.match(O)||[],function(a,c){b[c]=!0});return b}function Va(a,b,d,e){if(c.acceptData(a)){var f=c.expando,g="string"===typeof b,h=a.nodeType,k=h?c.cache:a,l=h?a[f]:a[f]&&f;if(l&&k[l]&&(e||k[l].data)||!g||d!==m){l||(h?a[f]=l=I.pop()||c.guid++:l=f);k[l]||(k[l]={},h||(k[l].toJSON=c.noop));if("object"===
2
+ typeof b||"function"===typeof b)e?k[l]=c.extend(k[l],b):k[l].data=c.extend(k[l].data,b);a=k[l];e||(a.data||(a.data={}),a=a.data);d!==m&&(a[c.camelCase(b)]=d);g?(d=a[b],null==d&&(d=a[c.camelCase(b)])):d=a;return d}}}function Wa(a,b,d){if(c.acceptData(a)){var e,f,g,h=a.nodeType,k=h?c.cache:a,l=h?a[c.expando]:c.expando;if(k[l]){if(b&&(g=d?k[l]:k[l].data)){c.isArray(b)?b=b.concat(c.map(b,c.camelCase)):b in g?b=[b]:(b=c.camelCase(b),b=b in g?[b]:b.split(" "));e=0;for(f=b.length;e<f;e++)delete g[b[e]];
3
+ if(!(d?za:c.isEmptyObject)(g))return}if(!d&&(delete k[l].data,!za(k[l])))return;h?c.cleanData([a],!0):c.support.deleteExpando||k!=k.window?delete k[l]:k[l]=null}}}function Xa(a,b,d){if(d===m&&1===a.nodeType)if(d="data-"+b.replace(Sb,"-$1").toLowerCase(),d=a.getAttribute(d),"string"===typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:Tb.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=m;return d}function za(a){for(var b in a)if(("data"!==b||!c.isEmptyObject(a[b]))&&"toJSON"!==
4
+ b)return!1;return!0}function ba(){return!0}function R(){return!1}function Ya(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function Za(a,b,d){b=b||0;if(c.isFunction(b))return c.grep(a,function(a,c){return!!b.call(a,c,a)===d});if(b.nodeType)return c.grep(a,function(a){return a===b===d});if("string"===typeof b){var e=c.grep(a,function(a){return 1===a.nodeType});if(Ub.test(b))return c.filter(b,e,!d);b=c.filter(b,e)}return c.grep(a,function(a){return 0<=c.inArray(a,b)===d})}function $a(a){var b=ab.split("|");
5
+ a=a.createDocumentFragment();if(a.createElement)for(;b.length;)a.createElement(b.pop());return a}function Vb(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bb(a){var b=a.getAttributeNode("type");a.type=(b&&b.specified)+"/"+a.type;return a}function cb(a){var b=Wb.exec(a.type);b?a.type=b[1]:a.removeAttribute("type");return a}function Aa(a,b){for(var d,e=0;null!=(d=a[e]);e++)c._data(d,"globalEval",!b||c._data(b[e],"globalEval"))}function db(a,b){if(1===
6
+ b.nodeType&&c.hasData(a)){var d,e,f;e=c._data(a);var g=c._data(b,e),h=e.events;if(h)for(d in delete g.handle,g.events={},h)for(e=0,f=h[d].length;e<f;e++)c.event.add(b,d,h[d][e]);g.data&&(g.data=c.extend({},g.data))}}function B(a,b){var d,e,f=0,g=typeof a.getElementsByTagName!==z?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==z?a.querySelectorAll(b||"*"):m;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!b||c.nodeName(e,b)?g.push(e):c.merge(g,B(e,b));return b===m||b&&c.nodeName(a,b)?
7
+ c.merge([a],g):g}function Xb(a){Ba.test(a.type)&&(a.defaultChecked=a.checked)}function eb(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),e=b,f=fb.length;f--;)if(b=fb[f]+c,b in a)return b;return e}function fa(a,b){a=b||a;return"none"===c.css(a,"display")||!c.contains(a.ownerDocument,a)}function gb(a,b){for(var d,e,f,g=[],h=0,k=a.length;h<k;h++)e=a[h],e.style&&(g[h]=c._data(e,"olddisplay"),d=e.style.display,b?(g[h]||"none"!==d||(e.style.display=""),""===e.style.display&&fa(e)&&
8
+ (g[h]=c._data(e,"olddisplay",hb(e.nodeName)))):g[h]||(f=fa(e),(d&&"none"!==d||!f)&&c._data(e,"olddisplay",f?d:c.css(e,"display"))));for(h=0;h<k;h++)e=a[h],!e.style||b&&"none"!==e.style.display&&""!==e.style.display||(e.style.display=b?g[h]||"":"none");return a}function ib(a,b,c){return(a=Yb.exec(b))?Math.max(0,a[1]-(c||0))+(a[2]||"px"):b}function jb(a,b,d,e,f){b=d===(e?"border":"content")?4:"width"===b?1:0;for(var g=0;4>b;b+=2)"margin"===d&&(g+=c.css(a,d+S[b],!0,f)),e?("content"===d&&(g-=c.css(a,
9
+ "padding"+S[b],!0,f)),"margin"!==d&&(g-=c.css(a,"border"+S[b]+"Width",!0,f))):(g+=c.css(a,"padding"+S[b],!0,f),"padding"!==d&&(g+=c.css(a,"border"+S[b]+"Width",!0,f)));return g}function kb(a,b,d){var e=!0,f="width"===b?a.offsetWidth:a.offsetHeight,g=T(a),h=c.support.boxSizing&&"border-box"===c.css(a,"boxSizing",!1,g);if(0>=f||null==f){f=U(a,b,g);if(0>f||null==f)f=a.style[b];if(ka.test(f))return f;e=h&&(c.support.boxSizingReliable||f===a.style[b]);f=parseFloat(f)||0}return f+jb(a,b,d||(h?"border":
10
+ "content"),e,g)+"px"}function hb(a){var b=p,d=lb[a];d||(d=mb(a,b),"none"!==d&&d||(ga=(ga||c("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(b.documentElement),b=(ga[0].contentWindow||ga[0].contentDocument).document,b.write("<!doctype html><html><body>"),b.close(),d=mb(a,b),ga.detach()),lb[a]=d);return d}function mb(a,b){var d=c(b.createElement(a)).appendTo(b.body),e=c.css(d[0],"display");d.remove();return e}function Ca(a,b,d,e){var f;if(c.isArray(b))c.each(b,
11
+ function(b,c){d||Zb.test(a)?e(a,c):Ca(a+"["+("object"===typeof c?b:"")+"]",c,d,e)});else if(d||"object"!==c.type(b))e(a,b);else for(f in b)Ca(a+"["+f+"]",b[f],d,e)}function nb(a){return function(b,d){"string"!==typeof b&&(d=b,b="*");var e,f=0,g=b.toLowerCase().match(O)||[];if(c.isFunction(d))for(;e=g[f++];)"+"===e[0]?(e=e.slice(1)||"*",(a[e]=a[e]||[]).unshift(d)):(a[e]=a[e]||[]).push(d)}}function ob(a,b,d,e){function f(k){var l;g[k]=!0;c.each(a[k]||[],function(a,c){var k=c(b,d,e);if("string"===typeof k&&
12
+ !h&&!g[k])return b.dataTypes.unshift(k),f(k),!1;if(h)return!(l=k)});return l}var g={},h=a===Da;return f(b.dataTypes[0])||!g["*"]&&f("*")}function Ea(a,b){var d,e,f=c.ajaxSettings.flatOptions||{};for(e in b)b[e]!==m&&((f[e]?a:d||(d={}))[e]=b[e]);d&&c.extend(!0,a,d);return a}function pb(){try{return new r.XMLHttpRequest}catch(a){}}function qb(){setTimeout(function(){Y=m});return Y=c.now()}function $b(a,b){c.each(b,function(b,c){for(var f=(ha[b]||[]).concat(ha["*"]),g=0,h=f.length;g<h&&!f[g].call(a,
13
+ b,c);g++);})}function rb(a,b,d){var e,f=0,g=la.length,h=c.Deferred().always(function(){delete k.elem}),k=function(){if(e)return!1;for(var b=Y||qb(),b=Math.max(0,l.startTime+l.duration-b),c=1-(b/l.duration||0),d=0,f=l.tweens.length;d<f;d++)l.tweens[d].run(c);h.notifyWith(a,[l,c,b]);if(1>c&&f)return b;h.resolveWith(a,[l]);return!1},l=h.promise({elem:a,props:c.extend({},b),opts:c.extend(!0,{specialEasing:{}},d),originalProperties:b,originalOptions:d,startTime:Y||qb(),duration:d.duration,tweens:[],createTween:function(b,
14
+ d){var e=c.Tween(a,l.opts,b,d,l.opts.specialEasing[b]||l.opts.easing);l.tweens.push(e);return e},stop:function(b){var c=0,d=b?l.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)l.tweens[c].run(1);b?h.resolveWith(a,[l,b]):h.rejectWith(a,[l,b]);return this}});d=l.props;for(ac(d,l.opts.specialEasing);f<g;f++)if(b=la[f].call(l,a,d,l.opts))return b;$b(l,d);c.isFunction(l.opts.start)&&l.opts.start.call(a,l);c.fx.timer(c.extend(k,{elem:a,anim:l,queue:l.opts.queue}));return l.progress(l.opts.progress).done(l.opts.done,
15
+ l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function ac(a,b){var d,e,f,g,h;for(f in a)if(e=c.camelCase(f),g=b[e],d=a[f],c.isArray(d)&&(g=d[1],d=a[f]=d[0]),f!==e&&(a[e]=d,delete a[f]),(h=c.cssHooks[e])&&"expand"in h)for(f in d=h.expand(d),delete a[e],d)f in a||(a[f]=d[f],b[f]=g);else b[e]=g}function A(a,b,c,e,f){return new A.prototype.init(a,b,c,e,f)}function ma(a,b){var c,e={height:a},f=0;for(b=b?1:0;4>f;f+=2-b)c=S[f],e["margin"+c]=e["padding"+c]=a;b&&(e.opacity=e.width=a);return e}function sb(a){return c.isWindow(a)?
16
+ a:9===a.nodeType?a.defaultView||a.parentWindow:!1}var na,tb,z=typeof m,p=r.document,bc=r.location,cc=r.jQuery,dc=r.$,oa={},I=[],ub=I.concat,Fa=I.push,C=I.slice,vb=I.indexOf,ec=oa.toString,ia=oa.hasOwnProperty,Ga="1.9.1".trim,c=function(a,b){return new c.fn.init(a,b,tb)},pa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,O=/\S+/g,fc=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,gc=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,wb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,hc=/^[\],:{}\s]*$/,ic=/(?:^|:|,)(?:\s*\[)+/g,jc=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
17
+ kc=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,lc=/^-ms-/,mc=/-([\da-z])/gi,nc=function(a,b){return b.toUpperCase()},L=function(a){if(p.addEventListener||"load"===a.type||"complete"===p.readyState)xb(),c.ready()},xb=function(){p.addEventListener?(p.removeEventListener("DOMContentLoaded",L,!1),r.removeEventListener("load",L,!1)):(p.detachEvent("onreadystatechange",L),r.detachEvent("onload",L))};c.fn=c.prototype={jquery:"1.9.1",constructor:c,init:function(a,b,d){var e;if(!a)return this;
18
+ if("string"===typeof a){e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&3<=a.length?[null,a,null]:gc.exec(a);if(!e||!e[1]&&b)return!b||b.jquery?(b||d).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof c?b[0]:b,c.merge(this,c.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:p,!0)),wb.test(e[1])&&c.isPlainObject(b))for(e in b)if(c.isFunction(this[e]))this[e](b[e]);else this.attr(e,b[e])}else{if((b=p.getElementById(e[2]))&&b.parentNode){if(b.id!==e[2])return d.find(a);this.length=1;this[0]=
19
+ b}this.context=p;this.selector=a}return this}if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(c.isFunction(a))return d.ready(a);a.selector!==m&&(this.selector=a.selector,this.context=a.context);return c.makeArray(a,this)},selector:"",length:0,size:function(){return this.length},toArray:function(){return C.call(this)},get:function(a){return null==a?this.toArray():0>a?this[this.length+a]:this[a]},pushStack:function(a){a=c.merge(this.constructor(),a);a.prevObject=this;a.context=this.context;
20
+ return a},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.ready.promise().done(a);return this},slice:function(){return this.pushStack(C.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length;a=+a+(0>a?b:0);return this.pushStack(0<=a&&a<b?[this[a]]:[])},map:function(a){return this.pushStack(c.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:Fa,
21
+ sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a,b,d,e,f,g=arguments[0]||{},h=1,k=arguments.length,l=!1;"boolean"===typeof g&&(l=g,g=arguments[1]||{},h=2);"object"===typeof g||c.isFunction(g)||(g={});k===h&&(g=this,--h);for(;h<k;h++)if(null!=(f=arguments[h]))for(e in f)a=g[e],d=f[e],g!==d&&(l&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,a=a&&c.isArray(a)?a:[]):a=a&&c.isPlainObject(a)?a:{},g[e]=c.extend(l,a,d)):d!==m&&(g[e]=d));return g};c.extend({noConflict:function(a){r.$===
22
+ c&&(r.$=dc);a&&r.jQuery===c&&(r.jQuery=cc);return c},isReady:!1,readyWait:1,holdReady:function(a){a?c.readyWait++:c.ready(!0)},ready:function(a){if(!0===a?!--c.readyWait:!c.isReady){if(!p.body)return setTimeout(c.ready);c.isReady=!0;!0!==a&&0<--c.readyWait||(na.resolveWith(p,[c]),c.fn.trigger&&c(p).trigger("ready").off("ready"))}},isFunction:function(a){return"function"===c.type(a)},isArray:Array.isArray||function(a){return"array"===c.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&
23
+ isFinite(a)},type:function(a){return null==a?String(a):"object"===typeof a||"function"===typeof a?oa[ec.call(a)]||"object":typeof a},isPlainObject:function(a){if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!ia.call(a,"constructor")&&!ia.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(var b in a);return b===m||ia.call(a,b)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw Error(a);},parseHTML:function(a,
24
+ b,d){if(!a||"string"!==typeof a)return null;"boolean"===typeof b&&(d=b,b=!1);b=b||p;var e=wb.exec(a);d=!d&&[];if(e)return[b.createElement(e[1])];e=c.buildFragment([a],b,d);d&&c(d).remove();return c.merge([],e.childNodes)},parseJSON:function(a){if(r.JSON&&r.JSON.parse)return r.JSON.parse(a);if(null===a)return a;if("string"===typeof a&&(a=c.trim(a))&&hc.test(a.replace(jc,"@").replace(kc,"]").replace(ic,"")))return(new Function("return "+a))();c.error("Invalid JSON: "+a)},parseXML:function(a){var b,
25
+ d;if(!a||"string"!==typeof a)return null;try{r.DOMParser?(d=new DOMParser,b=d.parseFromString(a,"text/xml")):(b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(a))}catch(e){b=m}b&&b.documentElement&&!b.getElementsByTagName("parsererror").length||c.error("Invalid XML: "+a);return b},noop:function(){},globalEval:function(a){a&&c.trim(a)&&(r.execScript||function(a){r.eval.call(r,a)})(a)},camelCase:function(a){return a.replace(lc,"ms-").replace(mc,nc)},nodeName:function(a,b){return a.nodeName&&
26
+ a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var e,f=0,g=a.length;e=ya(a);if(c)if(e)for(;f<g&&(e=b.apply(a[f],c),!1!==e);f++);else for(f in a){if(e=b.apply(a[f],c),!1===e)break}else if(e)for(;f<g&&(e=b.call(a[f],f,a[f]),!1!==e);f++);else for(f in a)if(e=b.call(a[f],f,a[f]),!1===e)break;return a},trim:Ga&&!Ga.call("\ufeff\u00a0")?function(a){return null==a?"":Ga.call(a)}:function(a){return null==a?"":(a+"").replace(fc,"")},makeArray:function(a,b){var d=b||[];null!=a&&(ya(Object(a))?
27
+ c.merge(d,"string"===typeof a?[a]:a):Fa.call(d,a));return d},inArray:function(a,b,c){var e;if(b){if(vb)return vb.call(b,a,c);e=b.length;for(c=c?0>c?Math.max(0,e+c):c:0;c<e;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=b.length,e=a.length,f=0;if("number"===typeof c)for(;f<c;f++)a[e++]=b[f];else for(;b[f]!==m;)a[e++]=b[f++];a.length=e;return a},grep:function(a,b,c){var e,f=[],g=0,h=a.length;for(c=!!c;g<h;g++)e=!!b(a[g],g),c!==e&&f.push(a[g]);return f},map:function(a,b,c){var e,
28
+ f=0,g=a.length,h=[];if(ya(a))for(;f<g;f++)e=b(a[f],f,c),null!=e&&(h[h.length]=e);else for(f in a)e=b(a[f],f,c),null!=e&&(h[h.length]=e);return ub.apply([],h)},guid:1,proxy:function(a,b){var d,e;"string"===typeof b&&(e=a[b],b=a,a=e);if(!c.isFunction(a))return m;d=C.call(arguments,2);e=function(){return a.apply(b||this,d.concat(C.call(arguments)))};e.guid=a.guid=a.guid||c.guid++;return e},access:function(a,b,d,e,f,g,h){var k=0,l=a.length,u=null==d;if("object"===c.type(d))for(k in f=!0,d)c.access(a,
29
+ b,k,d[k],!0,g,h);else if(e!==m&&(f=!0,c.isFunction(e)||(h=!0),u&&(h?(b.call(a,e),b=null):(u=b,b=function(a,b,d){return u.call(c(a),d)})),b))for(;k<l;k++)b(a[k],d,h?e:e.call(a[k],k,b(a[k],d)));return f?a:u?b.call(a):l?b(a[0],d):g},now:function(){return(new Date).getTime()}});c.ready.promise=function(a){if(!na)if(na=c.Deferred(),"complete"===p.readyState)setTimeout(c.ready);else if(p.addEventListener)p.addEventListener("DOMContentLoaded",L,!1),r.addEventListener("load",L,!1);else{p.attachEvent("onreadystatechange",
30
+ L);r.attachEvent("onload",L);var b=!1;try{b=null==r.frameElement&&p.documentElement}catch(d){}b&&b.doScroll&&function e(){if(!c.isReady){try{b.doScroll("left")}catch(a){return setTimeout(e,50)}xb();c.ready()}}()}return na.promise(a)};c.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){oa["[object "+b+"]"]=b.toLowerCase()});tb=c(p);var Ua={};c.Callbacks=function(a){a="string"===typeof a?Ua[a]||Rb(a):c.extend({},a);var b,d,e,f,g,h,k=[],l=!a.once&&[],u=function(c){d=
31
+ a.memory&&c;e=!0;g=h||0;h=0;f=k.length;for(b=!0;k&&g<f;g++)if(!1===k[g].apply(c[0],c[1])&&a.stopOnFalse){d=!1;break}b=!1;k&&(l?l.length&&u(l.shift()):d?k=[]:t.disable())},t={add:function(){if(k){var e=k.length;(function oc(b){c.each(b,function(b,d){var e=c.type(d);"function"===e?a.unique&&t.has(d)||k.push(d):d&&d.length&&"string"!==e&&oc(d)})})(arguments);b?f=k.length:d&&(h=e,u(d))}return this},remove:function(){k&&c.each(arguments,function(a,d){for(var e;-1<(e=c.inArray(d,k,e));)k.splice(e,1),b&&
32
+ (e<=f&&f--,e<=g&&g--)});return this},has:function(a){return a?-1<c.inArray(a,k):!(!k||!k.length)},empty:function(){k=[];return this},disable:function(){k=l=d=m;return this},disabled:function(){return!k},lock:function(){l=m;d||t.disable();return this},locked:function(){return!l},fireWith:function(a,c){c=c||[];c=[a,c.slice?c.slice():c];!k||e&&!l||(b?l.push(c):u(c));return this},fire:function(){t.fireWith(this,arguments);return this},fired:function(){return!!e}};return t};c.extend({Deferred:function(a){var b=
33
+ [["resolve","done",c.Callbacks("once memory"),"resolved"],["reject","fail",c.Callbacks("once memory"),"rejected"],["notify","progress",c.Callbacks("memory")]],d="pending",e={state:function(){return d},always:function(){f.done(arguments).fail(arguments);return this},then:function(){var a=arguments;return c.Deferred(function(d){c.each(b,function(b,l){var u=l[0],m=c.isFunction(a[b])&&a[b];f[l[1]](function(){var a=m&&m.apply(this,arguments);if(a&&c.isFunction(a.promise))a.promise().done(d.resolve).fail(d.reject).progress(d.notify);
34
+ else d[u+"With"](this===e?d.promise():this,m?[a]:arguments)})});a=null}).promise()},promise:function(a){return null!=a?c.extend(a,e):e}},f={};e.pipe=e.then;c.each(b,function(a,c){var k=c[2],l=c[3];e[c[1]]=k.add;l&&k.add(function(){d=l},b[a^1][2].disable,b[2][2].lock);f[c[0]]=function(){f[c[0]+"With"](this===f?e:this,arguments);return this};f[c[0]+"With"]=k.fireWith});e.promise(f);a&&a.call(f,f);return f},when:function(a){var b=0,d=C.call(arguments),e=d.length,f=1!==e||a&&c.isFunction(a.promise)?e:
35
+ 0,g=1===f?a:c.Deferred(),h=function(a,b,c){return function(d){b[a]=this;c[a]=1<arguments.length?C.call(arguments):d;c===k?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},k,l,u;if(1<e)for(k=Array(e),l=Array(e),u=Array(e);b<e;b++)d[b]&&c.isFunction(d[b].promise)?d[b].promise().done(h(b,u,d)).fail(g.reject).progress(h(b,l,k)):--f;f||g.resolveWith(u,d);return g.promise()}});c.support=function(){var a,b,d,e,f,g,h,k=p.createElement("div");k.setAttribute("className","t");k.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
36
+ b=k.getElementsByTagName("*");d=k.getElementsByTagName("a")[0];if(!b||!d||!b.length)return{};e=p.createElement("select");f=e.appendChild(p.createElement("option"));b=k.getElementsByTagName("input")[0];d.style.cssText="top:1px;float:left;opacity:.5";a={getSetAttribute:"t"!==k.className,leadingWhitespace:3===k.firstChild.nodeType,tbody:!k.getElementsByTagName("tbody").length,htmlSerialize:!!k.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:"/a"===d.getAttribute("href"),
37
+ opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:!!b.value,optSelected:f.selected,enctype:!!p.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==p.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===p.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1};b.checked=!0;a.noCloneChecked=b.cloneNode(!0).checked;e.disabled=!0;a.optDisabled=!f.disabled;try{delete k.test}catch(l){a.deleteExpando=
38
+ !1}b=p.createElement("input");b.setAttribute("value","");a.input=""===b.getAttribute("value");b.value="t";b.setAttribute("type","radio");a.radioValue="t"===b.value;b.setAttribute("checked","t");b.setAttribute("name","t");d=p.createDocumentFragment();d.appendChild(b);a.appendChecked=b.checked;a.checkClone=d.cloneNode(!0).cloneNode(!0).lastChild.checked;k.attachEvent&&(k.attachEvent("onclick",function(){a.noCloneEvent=!1}),k.cloneNode(!0).click());for(h in{submit:!0,change:!0,focusin:!0})k.setAttribute(d=
39
+ "on"+h,"t"),a[h+"Bubbles"]=d in r||!1===k.attributes[d].expando;k.style.backgroundClip="content-box";k.cloneNode(!0).style.backgroundClip="";a.clearCloneStyle="content-box"===k.style.backgroundClip;c(function(){var b,c,d=p.getElementsByTagName("body")[0];d&&(b=p.createElement("div"),b.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",d.appendChild(b).appendChild(k),k.innerHTML="<table><tr><td></td><td>t</td></tr></table>",c=k.getElementsByTagName("td"),
40
+ c[0].style.cssText="padding:0;margin:0;border:0;display:none",g=0===c[0].offsetHeight,c[0].style.display="",c[1].style.display="none",a.reliableHiddenOffsets=g&&0===c[0].offsetHeight,k.innerHTML="",k.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",a.boxSizing=4===k.offsetWidth,a.doesNotIncludeMarginInBodyOffset=1!==d.offsetTop,r.getComputedStyle&&(a.pixelPosition="1%"!==
41
+ (r.get