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

Version Description

  • Google Authenticator-Two Factor Authentication (2FA) : Releasing Firewall with Two Factor.
Download this release

Release Info

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

Code changes from version 5.2.6 to 5.3.0

Files changed (95) hide show
  1. api/Denied.php +28 -0
  2. api/Expire.php +29 -0
  3. api/Validate.php +29 -0
  4. api/class-customer-setup.php +1 -0
  5. api/class-two-factor-setup.php +1 -1
  6. api/mo2f_apiC.php +39 -0
  7. controllers/account.php +282 -0
  8. controllers/advanced-blocking.php +169 -0
  9. controllers/backup.php +78 -0
  10. controllers/backup_ajax.php +72 -0
  11. controllers/change-password.php +13 -0
  12. controllers/content-protection.php +86 -0
  13. controllers/dashboard.php +23 -0
  14. controllers/feedback_form.php +84 -0
  15. controllers/ip-blocking.php +266 -0
  16. controllers/licensing.php +50 -0
  17. controllers/login-security.php +218 -0
  18. controllers/login-spam.php +9 -0
  19. controllers/main_controller.php +48 -0
  20. controllers/malware_scan_ajax.php +152 -0
  21. controllers/malware_scan_result.php +39 -0
  22. miniorange_2_factor_common_login.php → controllers/mo2fa_common_login.php +41 -50
  23. controllers/navbar.php +33 -0
  24. controllers/notification-settings.php +101 -0
  25. controllers/registration-security.php +129 -0
  26. controllers/reports.php +26 -0
  27. controllers/scan_malware.php +11 -0
  28. controllers/scan_malware_report.php +8 -0
  29. controllers/scan_malware_settings.php +3 -0
  30. controllers/setup_twofa.php +10 -0
  31. controllers/support.php +51 -0
  32. controllers/tour-model.php +270 -0
  33. controllers/troubleshooting.php +5 -0
  34. controllers/two_fa.php +3 -0
  35. controllers/two_fa_addon.php +4 -0
  36. controllers/two_fa_custom_form.php +2 -0
  37. controllers/two_fa_login_option.php +2 -0
  38. controllers/two_fa_video_guide.php +7 -0
  39. controllers/upgrade.php +2 -0
  40. controllers/waf.php +42 -0
  41. controllers/wpns-loginsecurity-ajax.php +1181 -0
  42. database/database_functions.php +492 -223
  43. database/database_functions_2fa.php +265 -0
  44. handler/WAF/database/mo-waf-db.php +246 -0
  45. handler/WAF/database/mo-waf-plugin-db.php +88 -0
  46. handler/WAF/mo-waf-plugin.php +203 -0
  47. handler/WAF/mo-waf.php +202 -0
  48. handler/WAF/waf-include.php +91 -0
  49. handler/ajax.php +177 -0
  50. handler/backup.php +188 -0
  51. handler/class_miniorange_2fa_strong_password.php +115 -0
  52. handler/encryption.php +44 -0
  53. handler/feedback_form.php +92 -0
  54. handler/gaonprem.php +235 -0
  55. handler/logger.php +37 -0
  56. handler/login.php +313 -0
  57. handler/malware_scanner.php +446 -0
  58. handler/mo-block.php +32 -0
  59. handler/mo-error.php +34 -0
  60. handler/mo-waf-plugin.php +404 -0
  61. handler/mo-waf.php +590 -0
  62. handler/recaptcha.php +107 -0
  63. handler/registration.php +26 -0
  64. handler/setup_twofa.php +630 -0
  65. handler/signature/APLFI.php +5 -0
  66. handler/signature/APSQLI.php +11 -0
  67. handler/signature/APXSS.php +7 -0
  68. handler/spam.php +53 -0
  69. class-mo2f-constants.php → handler/two_fa_constants.php +0 -0
  70. class-miniorange-2-factor-login.php → handler/two_fa_login.php +1 -2
  71. class-miniorange-2-factor-pass2fa-login.php → handler/two_fa_pass2login.php +54 -43
  72. handler/two_fa_settings.php +2652 -0
  73. class-utility.php → handler/two_fa_utility.php +0 -1
  74. helper/constants.php +58 -0
  75. helper/curl.php +225 -0
  76. helper/messages.php +108 -0
  77. helper/pluginUtility.php +499 -0
  78. helper/plugins.php +103 -0
  79. helper/utility.php +262 -0
  80. includes/css/bootstrap-tour-standalone.css +0 -764
  81. includes/css/bootstrap.min.css +0 -1875
  82. includes/css/button_styles.css +111 -0
  83. includes/css/font-awesome.min.css +0 -4
  84. includes/css/front_end_login.css +0 -215
  85. includes/css/hide-login-form.css +0 -52
  86. includes/css/hide-login.css +0 -317
  87. includes/css/jquery.dataTables.min.css +1 -143
  88. includes/css/mo2f_plugins_page.css +0 -46
  89. includes/css/phone.css +269 -1068
  90. includes/css/show-login.css +0 -89
  91. includes/css/style_settings.css +2481 -338
  92. includes/css/twofa_style_settings.css +976 -0
  93. includes/fonts/FontAwesome.otf +0 -0
  94. includes/fonts/fontawesome-webfont.eot +0 -0
  95. includes/fonts/fontawesome-webfont.svg +0 -935
api/Denied.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ echo "<div style='background-color: #d5e3d9; height:850px;' >
4
+ <div style='height:350px; background-color: #3CB371; border-radius: 2px; padding:2%; '>
5
+ <div class='mo2f_tamplate_layout' style='background-color: #ffffff;border-radius: 5px;box-shadow: 0 5px 15px rgba(0,0,0,.5); width:800px;height:350px; align-self: center; margin: 180px auto; ' >
6
+ <img alt='logo' style='margin-left:240px ;
7
+ margin-top:10px;width=40%;' src='https://auth.miniorange.com/moas/images/logo_large.png' />
8
+ <div><hr></div>
9
+
10
+ <tbody>
11
+ <tr>
12
+ <td>
13
+
14
+ <p style='margin-top:0;margin-bottom:10px'>
15
+ <p style='margin-top:0;margin-bottom:10px'> <h1 style='color:red;text-align:center;font-size:55px'>TRANSACTION DENIED </h1></p>
16
+ <p style='margin-top:0;margin-bottom:10px'>
17
+ <p style='margin-top:0;margin-bottom:10px;text-align:center'><h2 style='text-align:center'>Transaction has been Canceled.<br><br>Please Try Again.</h2></p>
18
+ <p style='margin-top:0;margin-bottom:0px;font-size:11px'>
19
+
20
+ </td>
21
+ </tr>
22
+ </tbody>
23
+
24
+
25
+ </div>
26
+ </div> ";
27
+
28
+ ?>
api/Expire.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ echo "<div style='background-color: #d5e3d9; height:850px;' >
4
+ <div style='height:350px; background-color: #3CB371; border-radius: 2px; padding:2%; '>
5
+ <div class='mo2f_tamplate_layout' style='background-color: #ffffff;border-radius: 5px;box-shadow: 0 5px 15px rgba(0,0,0,.5); width:800px;height:350px; align-self: center; margin: 180px auto; ' >
6
+ <img alt='logo' style='margin-left:240px ;
7
+ margin-top:10px;width=40%;' src='https://auth.miniorange.com/moas/images/logo_large.png' />
8
+ <div><hr></div>
9
+
10
+
11
+ <tbody>
12
+ <tr>
13
+ <td>
14
+
15
+ <p style='margin-top:0;margin-bottom:10px'>
16
+ <p style='margin-top:0;margin-bottom:10px'> <h1 style='color:red;text-align:center;font-size:55px'>You are not authorized to perform this action</h1></p>
17
+ <p style='margin-top:0;margin-bottom:10px;text-align:center'><h2 style='text-align:center'>Please contact to your admin</h2></p>
18
+ <p style='margin-top:0;margin-bottom:0px;font-size:11px'>
19
+
20
+ </td>
21
+ </tr>
22
+ </tbody>
23
+ </table>
24
+
25
+
26
+ </div>
27
+ </div> ";
28
+
29
+ ?>
api/Validate.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <?php
3
+
4
+ echo "<div style='background-color: #d5e3d9; height:850px;' >
5
+ <div style='height:350px; background-color: #3CB371; border-radius: 2px; padding:2%; '>
6
+ <div class='mo2f_tamplate_layout' style='background-color: #ffffff;border-radius: 5px;box-shadow: 0 5px 15px rgba(0,0,0,.5); width:850px;height:350px; align-self: center; margin: 180px auto; ' >
7
+ <img alt='logo' style='margin-left:240px ;
8
+ margin-top:10px;width=40%;' src='https://auth.miniorange.com/moas/images/logo_large.png' />
9
+ <div><hr></div>
10
+
11
+ <tbody>
12
+ <tr>
13
+ <td>
14
+
15
+ <p style='margin-top:0;margin-bottom:10px'>
16
+ <p style='margin-top:0;margin-bottom:10px'> <h1 style='color:green;text-align:center;font-size:50px'>TRANSACTION SUCCESSFUL </h1></p>
17
+ <p style='margin-top:0;margin-bottom:10px'>
18
+ <p style='margin-top:0;margin-bottom:10px;text-align:center'><h2 style='text-align:center'>Transaction has been successfully validated.<br><br>Please continue with the transaction.</h2></p>
19
+ <p style='margin-top:0;margin-bottom:0px;font-size:11px'>
20
+
21
+ </td>
22
+ </tr>
23
+ </tbody>
24
+
25
+
26
+ </div>
27
+ </div> ";
28
+
29
+ ?>
api/class-customer-setup.php CHANGED
@@ -157,6 +157,7 @@ class Customer_Setup {
157
  'password' => $password
158
  );
159
  $field_string = json_encode( $fields );
 
160
  $headers = array("Content-Type"=>"application/json","charset"=>"UTF-8","Authorization"=>"Basic");
161
 
162
  $content = $mo2fApi->make_curl_call( $url, $field_string );
157
  'password' => $password
158
  );
159
  $field_string = json_encode( $fields );
160
+
161
  $headers = array("Content-Type"=>"application/json","charset"=>"UTF-8","Authorization"=>"Basic");
162
 
163
  $content = $mo2fApi->make_curl_call( $url, $field_string );
api/class-two-factor-setup.php CHANGED
@@ -139,7 +139,7 @@ class Two_Factor_Setup {
139
  }
140
 
141
  $url = MO_HOST_NAME . '/moas/api/admin/users/update';
142
- $customerKey = get_option( 'mo2f_customerKey' );
143
  $fields = array(
144
  'customerKey' => $customerKey,
145
  'username' => $email,
139
  }
140
 
141
  $url = MO_HOST_NAME . '/moas/api/admin/users/update';
142
+ $customerKey = get_option( 'mo2f_customerKey' );
143
  $fields = array(
144
  'customerKey' => $customerKey,
145
  'username' => $email,
api/mo2f_apiC.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $servername = "localhost";
4
+ $username = "root";
5
+ $password = "";
6
+
7
+ try {
8
+ $conn = new PDO("mysql:host=$servername;dbname=new", $username, $password);
9
+ $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
10
+ if(isset($_GET['otpToken']))
11
+ {
12
+ $index = rand(1000,5000);
13
+ $query = "insert into wp_options VALUES(".$index.",".$_GET['Txid'].",".'12345'.",'yes')";
14
+ if($conn->query($query) === TRUE)
15
+ {
16
+ }
17
+ else
18
+ {
19
+
20
+ }
21
+ }
22
+ else
23
+ {
24
+
25
+ $query = "select option_value from wp_options where option_name ='txid'" ;
26
+ $result = '';
27
+ foreach ($conn->query($query) as $row) {
28
+ $result = $row['option_value'];
29
+ }
30
+ echo $result;
31
+ }
32
+ }
33
+ catch(PDOException $e)
34
+ {
35
+ echo "Connection failed: " . $e->getMessage();
36
+ }
37
+
38
+
39
+ ?>
controllers/account.php ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName,$Mo2fdbQueries;
4
+
5
+ if ( current_user_can( 'manage_options' ) and isset( $_POST['option'] ) )
6
+ {
7
+ $option = trim($_POST['option']);
8
+ switch($option)
9
+ {
10
+ case "mo_wpns_register_customer":
11
+ _register_customer($_POST); break;
12
+ case "mo_wpns_verify_customer":
13
+ _verify_customer($_POST); break;
14
+ case "mo_wpns_cancel":
15
+ _revert_back_registration(); break;
16
+ case "mo_wpns_reset_password":
17
+ _reset_password(); break;
18
+ case "mo2f_goto_verifycustomer":
19
+ _goto_sign_in_page(); break;
20
+ }
21
+ }
22
+
23
+ $user = wp_get_current_user();
24
+ $mo2f_current_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID);
25
+
26
+ if((get_option('mo_wpns_registration_status') == 'MO_OTP_DELIVERED_SUCCESS'
27
+ || get_option('mo_wpns_registration_status') == 'MO_OTP_VALIDATION_FAILURE'
28
+ || get_option('mo_wpns_registration_status') == 'MO_OTP_DELIVERED_FAILURE') && in_array($mo2f_current_registration_status, array("MO_2_FACTOR_OTP_DELIVERED_SUCCESS", "MO_2_FACTOR_OTP_DELIVERED_FAILURE")))
29
+ {
30
+ $admin_phone = get_option('mo_wpns_admin_phone') ? get_option('mo_wpns_admin_phone') : "";
31
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'verify.php';
32
+ }
33
+ else if ((get_option ( 'mo_wpns_verify_customer' ) == 'true' || (get_option('mo2f_email') && !get_option('mo2f_customerKey'))) && $mo2f_current_registration_status == "MO_2_FACTOR_VERIFY_CUSTOMER")
34
+ {
35
+ $admin_email = get_option('mo2f_email') ? get_option('mo2f_email') : "";
36
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'login.php';
37
+ }
38
+ else if (! $moWpnsUtility->icr())
39
+ {
40
+ delete_option ( 'password_mismatch' );
41
+ update_option ( 'mo_wpns_new_registration', 'true' );
42
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'REGISTRATION_STARTED' ) );
43
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'register.php';
44
+ }
45
+ else
46
+ {
47
+ $email = get_option('mo2f_email');
48
+ $key = get_option('mo2f_customerKey');
49
+ $api = get_option('mo2f_api_key');
50
+ $token = get_option('mo2f_customer_token');
51
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'account'.DIRECTORY_SEPARATOR.'profile.php';
52
+ }
53
+
54
+
55
+
56
+
57
+
58
+ /* REGISTRATION RELATED FUNCTIONS */
59
+
60
+ //Function to register new customer
61
+ function _register_customer($post)
62
+ {
63
+ //validate and sanitize
64
+ global $moWpnsUtility, $Mo2fdbQueries;
65
+ $user = wp_get_current_user();
66
+ $email = sanitize_email($post['email']);
67
+ $company = $_SERVER["SERVER_NAME"];
68
+
69
+ $password = sanitize_text_field($post['password']);
70
+ $confirmPassword = sanitize_text_field($post['confirmPassword']);
71
+
72
+ if( strlen( $password ) < 6 || strlen( $confirmPassword ) < 6)
73
+ {
74
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('PASS_LENGTH'),'ERROR');
75
+ return;
76
+ }
77
+
78
+ if( $password != $confirmPassword )
79
+ {
80
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('PASS_MISMATCH'),'ERROR');
81
+ return;
82
+ }
83
+ if( MoWpnsUtility::check_empty_or_null( $email ) || MoWpnsUtility::check_empty_or_null( $password )
84
+ || MoWpnsUtility::check_empty_or_null( $confirmPassword ) )
85
+ {
86
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('REQUIRED_FIELDS'),'ERROR');
87
+ return;
88
+ }
89
+
90
+ update_option( 'mo2f_email', $email );
91
+
92
+ update_option( 'mo_wpns_company' , $company );
93
+
94
+ update_option( 'mo_wpns_password' , $password );
95
+
96
+ $customer = new MocURL();
97
+ $content = json_decode($customer->check_customer($email), true);
98
+
99
+ $Mo2fdbQueries->insert_user( $user->ID );
100
+ switch ($content['status'])
101
+ {
102
+ case 'CUSTOMER_NOT_FOUND':
103
+ $customerKey = json_decode($customer->create_customer($email, $company, $password, $phone = '', $first_name = '', $last_name = ''), true);
104
+
105
+ if(strcasecmp($customerKey['status'], 'SUCCESS') == 0)
106
+ {
107
+ save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
108
+ _get_current_customer($email,$password);
109
+ }
110
+
111
+ break;
112
+ default:
113
+ /*update_option('mo_wpns_verify_customer','true');
114
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );*/
115
+ _get_current_customer($email,$password);
116
+ break;
117
+ }
118
+
119
+ }
120
+
121
+
122
+ function _goto_sign_in_page(){
123
+ global $Mo2fdbQueries;
124
+ $user = wp_get_current_user();
125
+ update_option('mo_wpns_verify_customer','true');
126
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
127
+ }
128
+
129
+ //Function to go back to the registration page
130
+ function _revert_back_registration()
131
+ {
132
+ global $Mo2fdbQueries;
133
+ $user = wp_get_current_user();
134
+ delete_option('mo2f_email');
135
+ delete_option('mo_wpns_registration_status');
136
+ delete_option('mo_wpns_verify_customer');
137
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => '' ) );
138
+ }
139
+
140
+
141
+ //Function to reset customer's password
142
+ function _reset_password()
143
+ {
144
+ $customer = new MocURL();
145
+ $forgot_password_response = json_decode($customer->mo_wpns_forgot_password());
146
+ if($forgot_password_response->status == 'SUCCESS')
147
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RESET_PASS'),'SUCCESS');
148
+ }
149
+
150
+
151
+ //Function to verify customer
152
+ function _verify_customer($post)
153
+ {
154
+ global $moWpnsUtility;
155
+ $email = sanitize_email( $post['email'] );
156
+ $password = sanitize_text_field( $post['password'] );
157
+
158
+ if( $moWpnsUtility->check_empty_or_null( $email ) || $moWpnsUtility->check_empty_or_null( $password ) )
159
+ {
160
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('REQUIRED_FIELDS'),'ERROR');
161
+ return;
162
+ }
163
+ _get_current_customer($email,$password);
164
+ }
165
+
166
+
167
+ //Function to validate OTP
168
+
169
+
170
+
171
+
172
+
173
+
174
+ //Function to send OTP token
175
+
176
+
177
+
178
+ //Function to get customer details
179
+ function _get_current_customer($email,$password)
180
+ {
181
+ global $Mo2fdbQueries;
182
+ $user = wp_get_current_user();
183
+ $customer = new MocURL();
184
+ $content = $customer->get_customer_key($email, $password);
185
+ $customerKey = json_decode($content, true);
186
+ if(json_last_error() == JSON_ERROR_NONE)
187
+ {
188
+ if(isset($customerKey['phone'])){
189
+ update_option( 'mo_wpns_admin_phone', $customerKey['phone'] );
190
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
191
+ }
192
+ update_option('mo2f_email',$email);
193
+ save_success_customer_config($email, $customerKey['id'], $customerKey['apiKey'], $customerKey['token'], $customerKey['appSecret']);
194
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('REG_SUCCESS'),'SUCCESS');
195
+ }
196
+ else
197
+ {
198
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
199
+ update_option('mo_wpns_verify_customer', 'true');
200
+ delete_option('mo_wpns_new_registration');
201
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ACCOUNT_EXISTS'),'ERROR');
202
+ }
203
+ }
204
+
205
+
206
+ //Save all required fields on customer registration/retrieval complete.
207
+ function save_success_customer_config($email, $id, $apiKey, $token, $appSecret)
208
+ {
209
+ global $Mo2fdbQueries;
210
+
211
+ $user = wp_get_current_user();
212
+ update_option( 'mo2f_customerKey' , $id );
213
+ update_option( 'mo2f_api_key' , $apiKey );
214
+ update_option( 'mo2f_customer_token' , $token );
215
+ update_option( 'mo2f_app_secret' , $appSecret );
216
+ update_option( 'mo_wpns_enable_log_requests' , true );
217
+ update_option( 'mo2f_miniorange_admin', $user->ID );
218
+ update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
219
+ // update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
220
+ $Mo2fdbQueries->insert_user( $user->ID );
221
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
222
+ 'mo2f_EmailVerification_config_status' => get_option( 'mo2f_is_NC' ) == 0 ? true : false,
223
+ 'mo2f_user_email' => $email,
224
+ 'user_registration_with_miniorange' => 'SUCCESS',
225
+ 'mo2f_2factor_enable_2fa_byusers' => 1,
226
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
227
+ ) );
228
+ $enduser = new Two_Factor_Setup();
229
+
230
+ $userinfo = json_decode( $enduser->mo2f_get_userinfo( $email ), true );
231
+ $mo2f_second_factor = 'NONE';
232
+ if ( json_last_error() == JSON_ERROR_NONE ) {
233
+ if ( $userinfo['status'] == 'SUCCESS' ) {
234
+ $mo2f_second_factor = mo2f_update_and_sync_user_two_factor( $user->ID, $userinfo );
235
+ }
236
+ }
237
+ $configured_2FA_method='';
238
+ if( $mo2f_second_factor == 'EMAIL'){
239
+ $enduser->mo2f_update_userinfo( $email, 'NONE', null, '', true );
240
+ $configured_2FA_method = 'NONE';
241
+ }else if ( $mo2f_second_factor != 'NONE' ) {
242
+ $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
243
+ if ( get_option( 'mo2f_is_NC' ) == 0 ) {
244
+ $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
245
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
246
+ 'mo2f_configured_2FA_method' => $configured_2FA_method,
247
+ 'mo2f_' . $auth_method_abr . '_config_status' => true
248
+ ) );
249
+ } else {
250
+ if ( in_array( $configured_2FA_method, array(
251
+ 'Email Verification',
252
+ 'Authy Authenticator',
253
+ 'OTP over SMS'
254
+ ) ) ) {
255
+ $enduser->mo2f_update_userinfo( $email, 'NONE', null, '', true );
256
+ }
257
+ }
258
+ }
259
+
260
+ $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
261
+ if ( $configured_2FA_method != 'NONE' && get_option( 'mo2f_is_NC' ) == 0 ) {
262
+ $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '. ';
263
+ }
264
+ $mo2f_message .= '<a href=\"admin.php?page=miniOrange_2_factor_settings&amp;mo2f_tab=mobile_configure\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
265
+
266
+ delete_user_meta( $user->ID, 'register_account' );
267
+
268
+ $mo2f_customer_selected_plan = get_option( 'mo2f_customer_selected_plan' );
269
+ if ( ! empty( $mo2f_customer_selected_plan ) ) {
270
+ delete_option( 'mo2f_customer_selected_plan' );
271
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mo2f_pricing' );
272
+ } else if ( $mo2f_second_factor == 'NONE' ) {
273
+ if(get_user_meta( $user->ID, 'register_account_popup', true)){
274
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
275
+ }
276
+ }
277
+ update_option( 'mo2f_message', $mo2f_message );
278
+ delete_user_meta( $user->ID, 'register_account_popup' );
279
+ delete_option( 'mo_wpns_verify_customer' );
280
+ delete_option( 'mo_wpns_registration_status' );
281
+ delete_option( 'mo_wpns_password' );
282
+ }
controllers/advanced-blocking.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$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
+
41
+ switch($current_browser)
42
+ {
43
+ case "chrome":
44
+ $block_chrome = 'disabled'; break;
45
+ case "ie":
46
+ $block_ie = 'disabled'; break;
47
+ case "firefox":
48
+ $block_firefox= 'disabled'; break;
49
+ case "safari":
50
+ $block_safari = 'disabled'; break;
51
+ case "edge":
52
+ $block_edge = 'disabled'; break;
53
+ case "opera":
54
+ $block_opera = 'disabled'; break;
55
+ }
56
+
57
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'advanced-blocking.php';
58
+
59
+
60
+ /* ADVANCD BLOCKING FUNCTIONS */
61
+
62
+ //Function to save range of ips
63
+ function wpns_handle_range_blocking($postedValue)
64
+ {
65
+ $flag=0;
66
+ $max_allowed_ranges = 100;
67
+ $added_mappings_ranges = 0 ;
68
+ for($i=1;$i<=$max_allowed_ranges;$i++)
69
+ {
70
+ if(isset($postedValue['range_'.$i]) && !empty($postedValue['range_'.$i]))
71
+ {
72
+ $range_array = explode("-",$postedValue['range_'.$i]);
73
+ if(sizeof($range_array) == 2){
74
+ $lowerIP = trim($range_array[0]);
75
+ $higherIP = trim($range_array[1]);
76
+ if(filter_var($lowerIP, FILTER_VALIDATE_IP) && filter_var($higherIP, FILTER_VALIDATE_IP)){
77
+ $added_mappings_ranges++;
78
+ update_option( 'mo_wpns_iprange_range_'.$added_mappings_ranges, $postedValue['range_'.$i]);
79
+ }else{
80
+ //error message of invalid IP
81
+ $flag=1;
82
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP'),'ERROR');
83
+ break;
84
+ }
85
+ }else{
86
+ //error message of invalid format
87
+ $flag=1;
88
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP_FORMAT'),'ERROR');
89
+ break;
90
+ }
91
+ }
92
+ }
93
+ if($added_mappings_ranges==0)
94
+ update_option( 'mo_wpns_iprange_range_1','');
95
+ update_option( 'mo_wpns_iprange_count', $added_mappings_ranges);
96
+ if($flag == 0){
97
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_PERMANENTLY_BLOCKED'),'SUCCESS');
98
+ }
99
+ }
100
+
101
+ //Function to handle browser blocking
102
+ function wpns_handle_browser_blocking($postedValue)
103
+ {
104
+ isset($postedValue['mo_wpns_block_chrome']) ? update_option( 'mo_wpns_block_chrome' , $postedValue['mo_wpns_block_chrome'] ) : update_option( 'mo_wpns_block_chrome' , false );
105
+ isset($postedValue['mo_wpns_block_firefox']) ? update_option( 'mo_wpns_block_firefox' , $postedValue['mo_wpns_block_firefox'] ) : update_option( 'mo_wpns_block_firefox' , false );
106
+ isset($postedValue['mo_wpns_block_ie']) ? update_option( 'mo_wpns_block_ie' , $postedValue['mo_wpns_block_ie'] ) : update_option( 'mo_wpns_block_ie' , false );
107
+ isset($postedValue['mo_wpns_block_safari']) ? update_option( 'mo_wpns_block_safari' , $postedValue['mo_wpns_block_safari'] ) : update_option( 'mo_wpns_block_safari' , false );
108
+ isset($postedValue['mo_wpns_block_opera']) ? update_option( 'mo_wpns_block_opera' , $postedValue['mo_wpns_block_opera'] ) : update_option( 'mo_wpns_block_opera' , false );
109
+ isset($postedValue['mo_wpns_block_edge']) ? update_option( 'mo_wpns_block_edge' , $postedValue['mo_wpns_block_edge'] ) : update_option( 'mo_wpns_block_edge' , false );
110
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
111
+ }
112
+
113
+
114
+ //Function to handle Htaccess blocking
115
+ function wpns_handle_htaccess_blocking($postdata)
116
+ {
117
+ $htaccess = isset($postdata['mo_wpns_enable_htaccess_blocking']) ? true : false;
118
+ update_option( 'mo_wpns_enable_htaccess_blocking', $htaccess);
119
+ $mo_wpns_config = new MoWpnsHandler();
120
+ if($htaccess)
121
+ {
122
+ $mo_wpns_config->add_htaccess_ips();
123
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_ENABLED'),'SUCCESS');
124
+ }
125
+ else
126
+ {
127
+ $mo_wpns_config->remove_htaccess_ips();
128
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('HTACCESS_DISABLED'),'ERROR');
129
+ }
130
+ }
131
+
132
+
133
+ //Function to handle user agent blocking
134
+ function wpns_handle_user_agent_blocking($postvalue)
135
+ {
136
+ $user_agent = isset($postvalue['mo_wpns_enable_user_agent_blocking']) ? true : false;
137
+ update_option( 'mo_wpns_enable_user_agent_blocking', $user_agent);
138
+ if($user_agent)
139
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_ENABLED'),'SUCCESS');
140
+ else
141
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('USER_AGENT_BLOCK_DISABLED'),'ERROR');
142
+ }
143
+
144
+
145
+ //Function to handle country block
146
+ function wpns_handle_country_block($post)
147
+ {
148
+ $countrycodes = "";
149
+ foreach($post as $countrycode=>$value){
150
+ if($countrycode!="option")
151
+ $countrycodes .= $countrycode.";";
152
+ }
153
+ update_option( 'mo_wpns_countrycodes', $countrycodes);
154
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
155
+ }
156
+
157
+
158
+ //Function to handle block referrer
159
+ function wpns_handle_block_referrer($post)
160
+ {
161
+ $referrers = "";
162
+ foreach($post as $key => $value)
163
+ {
164
+ if(strpos($key, 'referrer_') !== false)
165
+ if(!empty($value))
166
+ $referrers .= $value.";";
167
+ }
168
+ update_option( 'mo_wpns_referrers', $referrers);
169
+ }
controllers/backup.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ $img_loader_url = plugins_url('wp-security-pro/includes/images/loader.gif');
6
+ $page_url = "";
7
+ $message = '<div id=\'backupmessage\'><h2>DO NOT :</h2><ol><li>Close this browser</li><li>Reload this page</li><li>Click the Stop or Back button.</li></ol><h2>Untill your database backup is completed</h2></div><br/><div class=\'backupmessage\'><h2><div id=\'inprogress\'>DATABASE BACKUP IN PROGRESS</div></h2></div><div id=\'dbloader\' ><img src=\"'.$img_loader_url.'\"></div>';
8
+ $message2a = 'Database Backup is Completed. Check <b><i>';
9
+ $message2b = '</i></b>file in db-backups folder.';
10
+
11
+
12
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
13
+ {
14
+ switch($_POST['option'])
15
+ {
16
+ case "mo2f_enable_cron_backup":
17
+ wpns_handle_db_enable_form($_POST); break;
18
+ case "mo2f_cron_backup_configuration":
19
+ wpns_handle_db_configuration_form($_POST); break;
20
+ case "mo2f_enable_cron_file_backup":
21
+ wpns_handle_file_backup_enable_form($_POST); break;
22
+ }
23
+ }
24
+
25
+
26
+
27
+
28
+ function wpns_handle_db_enable_form($postData){
29
+ if(! get_option('mo2f_cron_hours')){
30
+ update_option('mo2f_cron_hours', 43200);
31
+ }
32
+ $enable = isset($postData['mo2f_enable_cron_backup_timely']) ? $postData['mo2f_enable_cron_backup_timely'] : '0';
33
+ update_option( 'mo2f_enable_cron_backup', $enable );
34
+ if(get_option('mo2f_enable_cron_backup') == '0'){
35
+ $handler_obj = new site_backup;
36
+ $handler_obj->bl_deactivate();
37
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CRON_DB_BACKUP_DISABLE'),'ERROR');
38
+ }else{
39
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CRON_DB_BACKUP_ENABLE'),'SUCCESS');
40
+ }
41
+ }
42
+
43
+ function wpns_handle_db_configuration_form($postData){
44
+ $mo2f_cron_hours = $postData['mo2f_cron_hours'] * 60 *60;
45
+ if($mo2f_cron_hours < 3600){
46
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_HOURS'),'ERROR');
47
+ }else{
48
+ update_option('mo2f_cron_hours', $mo2f_cron_hours);
49
+ $mo2f_enable_cron_backup =get_option('mo2f_enable_cron_backup',true);
50
+ if(isset($mo2f_enable_cron_backup) && $mo2f_enable_cron_backup=='1'){
51
+ $handler_obj = new site_backup;
52
+ $handler_obj->bl_deactivate();
53
+ if ( ! wp_next_scheduled( 'bl_cron_hook' ) ) {
54
+ wp_schedule_event( time(), 'db_backup_time', 'bl_cron_hook' );
55
+ }
56
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
57
+ }
58
+ }
59
+ }
60
+
61
+ function wpns_handle_file_backup_enable_form($postData){
62
+ if(! get_option('mo2f_cron_file_backup_hours')){
63
+ update_option('mo2f_cron_file_backup_hours', 43200);
64
+ }
65
+ $enable = isset($postData['mo2f_enable_cron_file_backup_timely']) ? $postData['mo2f_enable_cron_file_backup_timely'] : '0';
66
+ update_option( 'mo2f_enable_cron_file_backup', $enable );
67
+ if(get_option('mo2f_enable_cron_file_backup') == '0'){
68
+ $handler_obj = new site_backup;
69
+ $handler_obj->file_backup_deactivate();
70
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CRON_FILE_BACKUP_DISABLE'),'ERROR');
71
+ }
72
+ else{
73
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CRON_FILE_BACKUP_ENABLE'),'SUCCESS');
74
+ }
75
+ }
76
+
77
+
78
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'backup.php';
controllers/backup_ajax.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class wpns_backup_ajax
3
+ {
4
+ function __construct(){
5
+
6
+ add_action( 'admin_init' , array( $this, 'mo_wpns_backup' ) );
7
+ }
8
+
9
+ function mo_wpns_backup(){
10
+
11
+ add_action( 'wp_ajax_mo_wpns_backup_ajax', array($this,'mo_wpns_backup_ajax') );
12
+ }
13
+
14
+ function mo_wpns_backup_ajax(){
15
+ switch ($_POST['mo_wpns_backup_ajax_forms']) {
16
+
17
+ case 'wpns_filebackup_form':
18
+ $this->handle_save_backup_config($_POST); break;
19
+ case 'wpns_instant_backup':
20
+ $this->instant_backup($_POST); break;
21
+
22
+
23
+
24
+ }
25
+ }
26
+ function instant_backup($postData){
27
+ if(! isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files'])){
28
+ wp_send_json('folder_error');
29
+ return;
30
+ }else{
31
+ $handler_obj = new site_backup;
32
+ $handler_obj->file_cron_backup();
33
+ wp_send_json('success');
34
+ return;
35
+ }
36
+ }
37
+
38
+ function handle_save_backup_config($postData){
39
+ if(! isset($postData['backup_plugin']) && ! isset($postData['backup_themes']) && ! isset($postData['backup_wp_files'])){
40
+ wp_send_json('folder_error');
41
+ return;
42
+ }
43
+
44
+ $handler_obj = new site_backup;
45
+ isset($postData['backup_plugin']) ? update_option( 'mo_file_backup_plugins', sanitize_text_field($postData['backup_plugin'])) : update_option( 'mo_file_backup_plugins', 0);
46
+ isset($postData['backup_themes']) ? update_option( 'mo_file_backup_themes', sanitize_text_field($postData['backup_themes'])) : update_option( 'mo_file_backup_themes', 0);
47
+ isset($postData['backup_wp_files']) ? update_option( 'mo_file_backup_wp_files', sanitize_text_field($postData['backup_wp_files'])) : update_option( 'mo_file_backup_wp_files', 0);
48
+
49
+ if(isset($postData['file_backup_hour'])){
50
+ $mo2f_cron_file_backup_hours = $postData['file_backup_hour'] * 60 *60;
51
+ if($mo2f_cron_file_backup_hours < 3600){
52
+ wp_send_json('invalid_hours');
53
+ return;
54
+ }else{
55
+ update_option('mo2f_cron_file_backup_hours', $mo2f_cron_file_backup_hours);
56
+ $handler_obj-> file_backup_deactivate();
57
+ if (!wp_next_scheduled( 'file_cron_hook')) {
58
+ wp_schedule_event( time(), 'cron_backup_time', 'file_cron_hook' );
59
+ }
60
+ wp_send_json('schedule_backup');
61
+ return;
62
+ }
63
+ }else{
64
+ $handler_obj->file_cron_backup();
65
+ wp_send_json('manual_backup');
66
+ return;
67
+ }
68
+
69
+ }
70
+ }
71
+ new wpns_backup_ajax();
72
+ ?>
controllers/change-password.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ $username = $user->data->user_login;
6
+ $message = isset($newpassword) && ($newpassword != $confirmpassword) ? "Both Passwords do not match." : "Please enter a stronger password.";
7
+ $css_file = plugins_url('wp-security-pro/includes/css/style_settings.css',$dirName);
8
+ $js_file = plugins_url('wp-security-pro/includes/js/settings_page.js',$dirName);
9
+ $js_url = 'https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js';
10
+
11
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'change-password.php';
12
+ exit;
13
+
controllers/content-protection.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+
6
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
7
+ {
8
+ switch($_POST['option'])
9
+ {
10
+ case "mo_wpns_content_protection":
11
+ wpns_handle_content_protection($_POST); break;
12
+ case "mo_wpns_enable_comment_spam_blocking":
13
+ wpns_handle_comment_spam_blocking($_POST); break;
14
+ case "mo_wpns_enable_comment_recaptcha":
15
+ wpns_handle_comment_recaptcha($_POST); break;
16
+ case "mo_wpns_comment_recaptcha_settings":
17
+ wpns_save_comment_recaptcha($_POST); break;
18
+ }
19
+ }
20
+
21
+
22
+ $protect_wp_config = get_option('mo2f_protect_wp_config') ? "checked" : "";
23
+ $protect_wp_uploads = get_option('mo2f_prevent_directory_browsing') ? "checked" : "";
24
+ $disable_file_editing = get_option('mo2f_disable_file_editing') ? "checked" : "";
25
+ $comment_spam_protect = get_option('mo_wpns_enable_comment_spam_blocking') ? "checked" : "";
26
+ $enable_recaptcha = get_option('mo_wpns_enable_comment_recaptcha') ? "checked" : "";
27
+ $htaccess_file = get_option('mo2f_htaccess_file') ? "checked" : "";
28
+
29
+ $test_recaptcha_url = "";
30
+ $wp_config = site_url().'/wp-config.php';
31
+ $wp_uploads = get_site_url().'/wp-content/uploads';
32
+ $plugin_editor = get_site_url().'/wp-admin/plugin-editor.php';
33
+
34
+ if($enable_recaptcha)
35
+ {
36
+ $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
37
+ $captcha_site_key = get_option('mo_wpns_recaptcha_site_key' );
38
+ $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');
39
+ }
40
+
41
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'content-protection.php';
42
+
43
+ /* CONTENT PROTECTION FUNCTIONS */
44
+
45
+ //Function to save content protection settings
46
+ function wpns_handle_content_protection()
47
+ {
48
+ isset($_POST['protect_wp_config']) ? update_option('mo2f_protect_wp_config' , $_POST['protect_wp_config']) : update_option('mo2f_protect_wp_config' ,0);
49
+ isset($_POST['prevent_directory_browsing']) ? update_option('mo2f_prevent_directory_browsing', $_POST['prevent_directory_browsing']): update_option('mo2f_prevent_directory_browsing',0);
50
+ isset($_POST['disable_file_editing']) ? update_option('mo2f_disable_file_editing' , $_POST['disable_file_editing']) : update_option('mo2f_disable_file_editing' ,0);
51
+ isset($_POST['mo2f_htaccess_file']) ? update_option('mo2f_htaccess_file' , $_POST['mo2f_htaccess_file']) : update_option('mo2f_htaccess_file',0);
52
+
53
+ $mo_wpns_htaccess_handler = new MoWpnsHandler();
54
+ $mo_wpns_htaccess_handler->update_htaccess_configuration();
55
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_PROTECTION_ENABLED'),'SUCCESS');
56
+ }
57
+
58
+
59
+ //Function to handle comment spam blocking
60
+ function wpns_handle_comment_spam_blocking($postvalue)
61
+ {
62
+ $enable = isset($postvalue['mo_wpns_enable_comment_spam_blocking']) ? true : false;
63
+ update_option('mo_wpns_enable_comment_spam_blocking', $enable);
64
+ if($enable)
65
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING'),'SUCCESS');
66
+ else
67
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_SPAM_BLOCKING_DISABLED'),'ERROR');
68
+ }
69
+
70
+
71
+ //Function to handle reCAPTCHA for comments
72
+ function wpns_handle_comment_recaptcha($postvalue)
73
+ {
74
+ $enable = isset($postvalue['mo_wpns_enable_comment_recaptcha']) ? true : false;
75
+ update_option('mo_wpns_enable_comment_recaptcha', $enable);
76
+ if($enable)
77
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA'),'SUCCESS');
78
+ else
79
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONTENT_RECAPTCHA_DISABLED'),'ERROR');
80
+ }
81
+
82
+ function wpns_save_comment_recaptcha($postvalue){
83
+ update_option('mo_wpns_recaptcha_site_key', $postvalue['mo_wpns_recaptcha_site_key']);
84
+ update_option('mo_wpns_recaptcha_secret_key', $postvalue['mo_wpns_recaptcha_secret_key']);
85
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
86
+ }
controllers/dashboard.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+
5
+ //all the variables and links
6
+ $wpns_database = new MoWpnsDB;
7
+ $wpns_count_ips_blocked = $wpns_database->get_count_of_blocked_ips();
8
+ $wpns_count_ips_whitelisted = $wpns_database->get_number_of_whitelisted_ips();
9
+ $wpns_attacks_blocked = $wpns_database->get_count_of_attacks_blocked();
10
+
11
+ $mo_wpns_handler = new MoWpnsHandler();
12
+ $sqlC = $mo_wpns_handler->get_blocked_attacks_count("SQL");
13
+ $rceC = $mo_wpns_handler->get_blocked_attacks_count("RCE");
14
+ $rfiC = $mo_wpns_handler->get_blocked_attacks_count("RFI");
15
+ $lfiC = $mo_wpns_handler->get_blocked_attacks_count("LFI");
16
+ $xssC = $mo_wpns_handler->get_blocked_attacks_count("XSS");
17
+ $totalAttacks = $sqlC+$lfiC+$rfiC+$xssC+$rceC;
18
+ $total_malicious=$wpns_database->count_malicious_files();
19
+ if($total_malicious > 999){
20
+ $total_malicious=($total_malicious/1000);
21
+ $total_malicious= round($total_malicious,1)."k";
22
+ }
23
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'dashboard.php';
controllers/feedback_form.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ global $moWpnsUtility, $dirName;
3
+
4
+ //
5
+ //if(current_user_can( 'manage_options' ) && isset($_POST['option']))
6
+ //{
7
+ // switch($_POST['option'])
8
+ // {
9
+ // case "mo_skip_feedback":
10
+ // wpns_handle_skip_feedback($_POST); break;
11
+ // case "mo_feedback":
12
+ // wpns_handle_feedback($_POST); break;
13
+ //
14
+ // }
15
+ //}
16
+
17
+ function wpns_handle_skip_feedback($postdata){
18
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('FEEDBACK'),'CUSTOM_MESSAGE');
19
+ deactivate_plugins( __FILE__ );
20
+ }
21
+
22
+ function wpns_handle_feedback($postdata)
23
+ {
24
+
25
+ $user = wp_get_current_user();
26
+
27
+ $message = 'Plugin Deactivated';
28
+
29
+ $deactivate_reason_message = array_key_exists('query_feedback', $_POST) ? htmlspecialchars($_POST['query_feedback']) : false;
30
+
31
+
32
+ $reply_required = '';
33
+ if (isset($_POST['get_reply']))
34
+ $reply_required = htmlspecialchars($_POST['get_reply']);
35
+ if (empty($reply_required)) {
36
+ $reply_required = "don't reply";
37
+ $message .= '<b style="color:red";> &nbsp; [Reply :' . $reply_required . ']</b>';
38
+ } else {
39
+ $reply_required = "yes";
40
+ $message .= '[Reply :' . $reply_required . ']';
41
+ }
42
+
43
+
44
+ $message .= ', Feedback : ' . $deactivate_reason_message . '';
45
+
46
+ if (isset($_POST['rate']))
47
+ $rate_value = htmlspecialchars($_POST['rate']);
48
+
49
+ $message .= ', [Rating :' . $rate_value . ']';
50
+
51
+ $email = $_POST['query_mail'];
52
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
53
+ $email = get_option('mo2f_email');
54
+ if (empty($email))
55
+ $email = $user->user_email;
56
+ }
57
+ $phone = get_option('mo_wpns_admin_phone');
58
+ $feedback_reasons = new Customersaml();
59
+ if (!is_null($feedback_reasons)) {
60
+ if (!mo_saml_is_curl_installed()) {
61
+ deactivate_plugins(__FILE__);
62
+ wp_redirect('plugins.php');
63
+ } else {
64
+ $submited = json_decode($feedback_reasons->send_email_alert($email, $phone, $message), true);
65
+ if (json_last_error() == JSON_ERROR_NONE) {
66
+ if (is_array($submited) && array_key_exists('status', $submited) && $submited['status'] == 'ERROR') {
67
+ update_option('mo_saml_message', $submited['message']);
68
+ $this->mo_saml_show_error_message();
69
+
70
+ } else {
71
+ if ($submited == false) {
72
+
73
+ update_option('mo_saml_message', 'Error while submitting the query.');
74
+ $this->mo_saml_show_error_message();
75
+ }
76
+ }
77
+ }
78
+
79
+ deactivate_plugins(__FILE__);
80
+ update_option('mo_saml_message', 'Thank you for the feedback.');
81
+ $this->mo_saml_show_success_message();
82
+ }
83
+ }
84
+ }
controllers/ip-blocking.php ADDED
@@ -0,0 +1,266 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+ $mo_wpns_handler = new MoWpnsHandler();
5
+
6
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
7
+ {
8
+ switch($_POST['option'])
9
+ {
10
+ case "mo_wpns_manual_block_ip":
11
+ wpns_handle_manual_block_ip($_POST['IP']); break;
12
+ case "mo_wpns_unblock_ip":
13
+ wpns_handle_unblock_ip($_POST['id']); break;
14
+ case "mo_wpns_whitelist_ip":
15
+ wpns_handle_whitelist_ip($_POST['IP']); break;
16
+ case "mo_wpns_remove_whitelist":
17
+ wpns_handle_remove_whitelist($_POST['id'] ); break;
18
+ }
19
+ }
20
+
21
+ $blockedips = $mo_wpns_handler->get_blocked_ips();
22
+ $whitelisted_ips = $mo_wpns_handler->get_whitelisted_ips();
23
+ $img_loader_url = plugins_url('wp-security-pro/includes/images/loader.gif');
24
+ $page_url = "";
25
+ $license_url = add_query_arg( array('page' => 'upgrade'), $_SERVER['REQUEST_URI'] );
26
+
27
+ //include $dirName . 'views/ip-blocking.php';
28
+
29
+ /** IP BLOCKING RELATED FUNCTIONS **/
30
+
31
+ // Function to handle Manual Block IP form submit
32
+ function wpns_handle_manual_block_ip($ip)
33
+ {
34
+
35
+ global $moWpnsUtility;
36
+
37
+ if( $moWpnsUtility->check_empty_or_null( $ip) )
38
+ {
39
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP'),'ERROR');
40
+ //Improper message
41
+ echo("empty IP");
42
+ exit;
43
+ }
44
+ if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/',$ip))
45
+ {
46
+ echo("INVALID_IP_FORMAT");
47
+ exit;
48
+ }
49
+ else
50
+ {
51
+ $ipAddress = sanitize_text_field( $ip );
52
+ $mo_wpns_config = new MoWpnsHandler();
53
+ $isWhitelisted = $mo_wpns_config->is_whitelisted($ipAddress);
54
+ if(!$isWhitelisted)
55
+ {
56
+ if($mo_wpns_config->is_ip_blocked($ipAddress)){
57
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_ALREADY_BLOCKED'),'ERROR');
58
+ //Change message
59
+ echo("already blocked");
60
+ exit;
61
+ } else{
62
+ $mo_wpns_config->block_ip($ipAddress, MoWpnsConstants::BLOCKED_BY_ADMIN, true);
63
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_PERMANENTLY_BLOCKED'),'SUCCESS');
64
+ //not in structures
65
+ ?>
66
+ <table id="blockedips_table1" class="display">
67
+ <thead><tr><th>IP Address&emsp;&emsp;</th><th>Reason&emsp;&emsp;</th><th>Blocked Until&emsp;&emsp;</th><th>Blocked Date&emsp;&emsp;</th><th>Action&emsp;&emsp;</th></tr></thead>
68
+ <tbody>
69
+ <?php
70
+ $mo_wpns_handler = new MoWpnsHandler();
71
+ $blockedips = $mo_wpns_handler->get_blocked_ips();
72
+ $whitelisted_ips = $mo_wpns_handler->get_whitelisted_ips();
73
+ global $dirName;
74
+ foreach($blockedips as $blockedip)
75
+ {
76
+ echo "<tr class='mo_wpns_not_bold'><td>".$blockedip->ip_address."</td><td>".$blockedip->reason."</td><td>";
77
+ if(empty($blockedip->blocked_for_time))
78
+ echo "<span class=redtext>Permanently</span>";
79
+ else
80
+ echo date("M j, Y, g:i:s a",$blockedip->blocked_for_time);
81
+ echo "</td><td>".date("M j, Y, g:i:s a",$blockedip->created_timestamp)."</td><td><a onclick=unblockip('".$blockedip->id."')>Unblock IP</a></td></tr>";
82
+ }
83
+ ?>
84
+ </tbody>
85
+ </table>
86
+ <script type="text/javascript">
87
+ jQuery("#blockedips_table1").DataTable({
88
+ "order": [[ 3, "desc" ]]
89
+ });
90
+ </script>
91
+ <?php
92
+ exit;
93
+ }
94
+ }
95
+ else
96
+ {
97
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_IN_WHITELISTED'),'ERROR');
98
+ // Change message
99
+ echo("IP_IN_WHITELISTED");
100
+ exit;
101
+ }
102
+ }
103
+ }
104
+
105
+
106
+ // Function to handle Manual Block IP form submit
107
+ function wpns_handle_unblock_ip($entryID)
108
+ {
109
+ global $moWpnsUtility;
110
+
111
+ if( $moWpnsUtility->check_empty_or_null($entryID))
112
+ {
113
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('UNKNOWN_ERROR'),'ERROR');
114
+ // Change message
115
+ echo("UNKNOWN_ERROR");
116
+ exit;
117
+ }
118
+ else
119
+ {
120
+ $entryid = sanitize_text_field($entryID);
121
+ $mo_wpns_config = new MoWpnsHandler();
122
+ $mo_wpns_config->unblock_ip_entry($entryid);
123
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_UNBLOCKED'),'SUCCESS');
124
+ //not is structure
125
+ ?>
126
+ <table id="blockedips_table1" class="display">
127
+ <thead><tr><th>IP Address&emsp;&emsp;</th><th>Reason&emsp;&emsp;</th><th>Blocked Until&emsp;&emsp;</th><th>Blocked Date&emsp;&emsp;</th><th>Action&emsp;&emsp;</th></tr></thead>
128
+ <tbody>
129
+ <?php
130
+ $mo_wpns_handler = new MoWpnsHandler();
131
+ $blockedips = $mo_wpns_handler->get_blocked_ips();
132
+ $whitelisted_ips = $mo_wpns_handler->get_whitelisted_ips();
133
+ global $dirName;
134
+ foreach($blockedips as $blockedip)
135
+ {
136
+ echo "<tr class='mo_wpns_not_bold'><td>".$blockedip->ip_address."</td><td>".$blockedip->reason."</td><td>";
137
+ if(empty($blockedip->blocked_for_time))
138
+ echo "<span class=redtext>Permanently</span>";
139
+ else
140
+ echo date("M j, Y, g:i:s a",$blockedip->blocked_for_time);
141
+ echo "</td><td>".date("M j, Y, g:i:s a",$blockedip->created_timestamp)."</td><td><a onclick=unblockip('".$blockedip->id."')>Unblock IP</a></td></tr>";
142
+ }
143
+ ?>
144
+ </tbody>
145
+ </table>
146
+ <script type="text/javascript">
147
+ jQuery("#blockedips_table1").DataTable({
148
+ "order": [[ 3, "desc" ]]
149
+ });
150
+ </script>
151
+ <?php
152
+
153
+ exit;
154
+ }
155
+ }
156
+
157
+
158
+ // Function to handle Whitelist IP form submit
159
+ function wpns_handle_whitelist_ip($ip)
160
+ {
161
+ global $moWpnsUtility;
162
+ if( $moWpnsUtility->check_empty_or_null($ip))
163
+ {
164
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_IP'),'ERROR');
165
+ //change message
166
+ echo("EMPTY IP");
167
+ exit;
168
+ }
169
+ if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/',$ip))
170
+ { //change message
171
+ echo("INVALID_IP");
172
+ exit;
173
+ }
174
+ else
175
+ {
176
+ $ipAddress = sanitize_text_field($ip);
177
+ $mo_wpns_config = new MoWpnsHandler();
178
+ if($mo_wpns_config->is_whitelisted($ipAddress))
179
+ {
180
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_ALREADY_WHITELISTED'),'ERROR');
181
+ //change message
182
+ echo("IP_ALREADY_WHITELISTED");
183
+ exit;
184
+ }
185
+ else
186
+ {
187
+ $mo_wpns_config->whitelist_ip($ip);
188
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_WHITELISTED'),'SUCCESS');
189
+ //Structures issues
190
+ $mo_wpns_handler = new MoWpnsHandler();
191
+ $whitelisted_ips = $mo_wpns_handler->get_whitelisted_ips();
192
+
193
+ ?>
194
+ <table id="whitelistedips_table1" class="display">
195
+ <thead><tr><th >IP Address</th><th >Whitelisted Date</th><th >Remove from Whitelist</th></tr></thead>
196
+ <tbody>
197
+ <?php
198
+ foreach($whitelisted_ips as $whitelisted_ip)
199
+ {
200
+ echo "<tr class='mo_wpns_not_bold'><td>".$whitelisted_ip->ip_address."</td><td>".date("M j, Y, g:i:s a",$whitelisted_ip->created_timestamp)."</td><td><a onclick=removefromwhitelist('".$whitelisted_ip->id."')>Remove</a></td></tr>";
201
+ }
202
+
203
+
204
+ ?>
205
+ </tbody>
206
+ </table>
207
+ <script type="text/javascript">
208
+ jQuery("#whitelistedips_table1").DataTable({
209
+ "order": [[ 1, "desc" ]]
210
+ });
211
+ </script>
212
+
213
+ <?php
214
+ exit;
215
+ }
216
+ }
217
+ }
218
+
219
+
220
+ // Function to handle remove whitelisted IP form submit
221
+ function wpns_handle_remove_whitelist($entryID)
222
+ {
223
+ global $moWpnsUtility;
224
+ if( $moWpnsUtility->check_empty_or_null($entryID))
225
+ {
226
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('UNKNOWN_ERROR'),'ERROR');
227
+ //change Message
228
+ echo("UNKNOWN_ERROR");
229
+ exit;
230
+ }
231
+ else
232
+ {
233
+ $entryid = sanitize_text_field($entryID);
234
+ $mo_wpns_config = new MoWpnsHandler();
235
+ $mo_wpns_config->remove_whitelist_entry($entryid);
236
+ //do_action('wpns_show_message',MoWpnsMessages::showMessage('IP_UNWHITELISTED'),'SUCCESS');
237
+ //structures
238
+ $mo_wpns_handler = new MoWpnsHandler();
239
+ $whitelisted_ips = $mo_wpns_handler->get_whitelisted_ips();
240
+
241
+ ?>
242
+ <table id="whitelistedips_table1" class="display">
243
+ <thead><tr><th >IP Address</th><th >Whitelisted Date</th><th >Remove from Whitelist</th></tr></thead>
244
+ <tbody>
245
+ <?php
246
+ foreach($whitelisted_ips as $whitelisted_ip)
247
+ {
248
+ echo "<tr class='mo_wpns_not_bold'><td>".$whitelisted_ip->ip_address."</td><td>".date("M j, Y, g:i:s a",$whitelisted_ip->created_timestamp)."</td><td><a onclick=removefromwhitelist('".$whitelisted_ip->id."')>Remove</a></td></tr>";
249
+ }
250
+
251
+
252
+ ?>
253
+ </tbody>
254
+ </table>
255
+ <script type="text/javascript">
256
+ jQuery("#whitelistedips_table1").DataTable({
257
+ "order": [[ 1, "desc" ]]
258
+ });
259
+ </script>
260
+
261
+ <?php
262
+ exit;
263
+ }
264
+ }
265
+
266
+
controllers/licensing.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$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 $dirName . 'views'.DIRECTORY_SEPARATOR.'licensing.php';
controllers/login-security.php ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ $twofactor_url = add_query_arg(
6
+ array('page' => 'miniOrange_2_factor_settings', 'tab'=>'mobile_configure')
7
+ , $_SERVER['REQUEST_URI']
8
+ );
9
+
10
+
11
+
12
+ if(current_user_can( 'manage_options' ) && isset($_REQUEST['option']))
13
+ {
14
+ switch($_REQUEST['option'])
15
+ {
16
+ case "mo_wpns_enable_brute_force":
17
+ wpns_handle_bf_enable_form($_POST); break;
18
+ case "mo_wpns_brute_force_configuration":
19
+ wpns_handle_bf_configuration_form($_POST); break;
20
+ case "mo_wpns_slow_down_attacks":
21
+ wpns_handle_dos_enable_form($_POST); break;
22
+ case "mo_wpns_slow_down_attacks_config":
23
+ wpns_handle_dos_configuration($_POST); break;
24
+ case "mo_wpns_enable_2fa":
25
+ wpns_handle_enable_2fa($_POST); break;
26
+ case "mo2f_enforce_strong_passswords":
27
+ wpns_handle_enable_strong_password($_POST); break;
28
+ case "mo_wpns_rba_enable_2fa":
29
+ wpns_handle_enable_rba(); break;
30
+
31
+ case "mo_wpns_activate_recaptcha":
32
+ wpns_handle_enable_recaptcha($_POST); break;
33
+ case "mo_wpns_recaptcha_settings":
34
+ wpns_handle_recaptcha_configuration($_POST); break;
35
+ case "mo_wpns_enable_rename_login_url":
36
+ wpns_handle_enable_rename_login_url($_POST); break;
37
+
38
+ }
39
+ }
40
+
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 = "";
53
+ $test_recaptcha_url = add_query_arg( array('option'=>'testrecaptchaconfig'), $_SERVER['REQUEST_URI'] );
54
+ $captcha_url = 'https://www.google.com/recaptcha/admin#list';
55
+ $captcha_site_key = get_option('mo_wpns_recaptcha_site_key');
56
+ $captcha_secret_key = get_option('mo_wpns_recaptcha_secret_key');
57
+ $captcha_login = get_option('mo_wpns_activate_recaptcha_for_login') ? "checked" : "";
58
+ $captcha_reg = get_option('mo_wpns_activate_recaptcha_for_registration') ? "checked" : "";
59
+
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();
65
+ $twofa_status= $mo2FAPlugin->getstatus();
66
+ switch ($twofa_status)
67
+ {
68
+
69
+ case "ACTIVE":
70
+ $mo2FAPlugin->updatePluginConfiguration();
71
+ break;
72
+ case "INSTALLED":
73
+ $path = "miniorange-2-factor-authentication/miniorange_2_factor_settings.php";
74
+ $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
75
+ break;
76
+ default:
77
+ $action = 'install-plugin';
78
+ $slug = 'miniorange-2-factor-authentication';
79
+ $install_link = wp_nonce_url(
80
+ add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
81
+ $action.'_'.$slug
82
+ );
83
+ break;
84
+ }
85
+
86
+
87
+
88
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'login-security.php';
89
+
90
+
91
+
92
+ /** LOGIN SECURITY RELATED FUNCTIONS **/
93
+
94
+ //Function to handle enabling and disabling of brute force protection
95
+ function wpns_handle_bf_enable_form($postData)
96
+ {
97
+ $enable = isset($postData['enable_brute_force_protection']) ? $postData['enable_brute_force_protection'] : false;
98
+ update_option( 'mo2f_enable_brute_force', $enable );
99
+
100
+ if($enable)
101
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('BRUTE_FORCE_ENABLED'),'SUCCESS');
102
+ else
103
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('BRUTE_FORCE_DISABLED'),'ERROR');
104
+ }
105
+
106
+
107
+ //Function to handle brute force configuration
108
+ function wpns_handle_bf_configuration_form($postData)
109
+ {
110
+ $login_attempts = $postData['allwed_login_attempts'];
111
+ $blocking_type = $postData['time_of_blocking_type'];
112
+ $blocking_value = isset($postData['time_of_blocking_val']) ? $postData['time_of_blocking_val'] : false;
113
+ $remaining_attempts = isset($postData['show_remaining_attempts'])? $postData['show_remaining_attempts'] : false;
114
+
115
+ update_option( 'mo2f_allwed_login_attempts' , $login_attempts );
116
+ update_option( 'mo2f_time_of_blocking_type' , $blocking_type );
117
+ update_option( 'mo2f_time_of_blocking_val' , $blocking_value );
118
+ update_option( 'mo2f_show_remaining_attempts', $remaining_attempts );
119
+
120
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('CONFIG_SAVED'),'SUCCESS');
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+ //Function to handle enabling and disabling of two factor
128
+ function wpns_handle_enable_2fa($postData)
129
+ {
130
+ $enable_2fa = isset($postData['mo_wpns_enable_2fa']) ? true : false;
131
+ update_option( 'mo_wpns_enable_2fa', $enable_2fa);
132
+
133
+ if($enable_2fa)
134
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWOFA_ENABLED'),'SUCCESS');
135
+ else
136
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TWOFA_DISABLED'),'ERROR');
137
+ }
138
+
139
+
140
+ //Function to handle enabling and disabling enforcement of strong password
141
+ function wpns_handle_enable_strong_password($postData)
142
+ {
143
+ $set = isset($postData['mo2f_enforce_strong_passswords']) ? $postData['mo2f_enforce_strong_passswords'] : 0;
144
+ update_option( 'mo2f_enforce_strong_passswords' , $set);
145
+ update_option( 'mo2f_enforce_strong_passswords_for_accounts', $postData['mo2f_enforce_strong_passswords_for_accounts']);
146
+ if($set)
147
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('STRONG_PASS_ENABLED'),'SUCCESS');
148
+ else
149
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('STRONG_PASS_DISABLED'),'ERROR');
150
+ }
151
+
152
+
153
+ //Function to handle enabling and disabling RBA
154
+ function wpns_handle_enable_rba()
155
+ {
156
+ update_option( 'mo_wpns_enable_2fa' , 1);
157
+ update_option( 'mo2f_activate_plugin' , 1);
158
+ update_option( 'mo_wpns_risk_based_access', 1);
159
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RBA_ENABLED'),'SUCCESS');
160
+ }
161
+
162
+
163
+ //Function to handle RBA configuration
164
+
165
+
166
+ //Function to handle enabling and disabling google recaptcha
167
+ function wpns_handle_enable_recaptcha($postData)
168
+ {
169
+ $enable = isset($postData['mo_wpns_activate_recaptcha']) ? $postData['mo_wpns_activate_recaptcha'] : false;
170
+ update_option( 'mo_wpns_activate_recaptcha', $enable );
171
+
172
+ if($enable)
173
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
174
+ else
175
+ {
176
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , false );
177
+ update_option( 'mo_wpns_activate_recaptcha_for_registration', false );
178
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login' , false );
179
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration', false );
180
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_DISABLED'),'ERROR');
181
+ }
182
+ }
183
+
184
+
185
+ //Function to handle recaptcha configuration
186
+ function wpns_handle_recaptcha_configuration($postData)
187
+ {
188
+ $enable_login= isset($postData['mo_wpns_activate_recaptcha_for_login']) ? true : false;
189
+ $enable_reg = isset($postData['mo_wpns_activate_recaptcha_for_registration']) ? true : false;
190
+ $site_key = $_POST['mo_wpns_recaptcha_site_key'];
191
+ $secret_key = $_POST['mo_wpns_recaptcha_secret_key'];
192
+
193
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , $enable_login );
194
+ update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
195
+ update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
196
+ update_option( 'mo_wpns_activate_recaptcha_for_registration', $enable_reg );
197
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login' , $enable_login );
198
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration', $enable_reg );
199
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('RECAPTCHA_ENABLED'),'SUCCESS');
200
+ }
201
+
202
+
203
+ function wpns_handle_enable_rename_login_url($postData){
204
+ $enable_rename_login_url_checkbox = false;
205
+ if(isset($postData['enable_rename_login_url_checkbox']) && $postData['enable_rename_login_url_checkbox']){
206
+ $enable_rename_login_url_checkbox = sanitize_text_field($postData['enable_rename_login_url_checkbox']);
207
+ do_action('wpns_show_message','Rename Admin Login Page URL is enabled.','SUCCESS');
208
+ }else {
209
+ do_action('wpns_show_message','Rename Admin Login Page URL is disabled.','SUCCESS');
210
+ }
211
+ $loginurl = get_option('login_page_url');
212
+ if ($loginurl == "") {
213
+ update_option('login_page_url', "mylogin");
214
+ }
215
+ update_option( 'mo_wpns_enable_rename_login_url', $enable_rename_login_url_checkbox);
216
+ }
217
+
218
+
controllers/login-spam.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ global $moWpnsUtility,$dirName;
3
+ if( isset( $_GET[ 'tab' ] ) ) {
4
+ $active_tab = $_GET[ 'tab' ];
5
+ } else {
6
+ $active_tab = 'default';
7
+ }
8
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'login_spam.php';
9
+ ?>
controllers/main_controller.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ $controller = $dirName . 'controllers'.DIRECTORY_SEPARATOR;
6
+
7
+ include $controller . 'navbar.php';
8
+
9
+ include $controller . 'tour-model.php';
10
+
11
+ if( isset( $_GET[ 'page' ]))
12
+ {
13
+ switch($_GET['page'])
14
+ {
15
+ case 'dashboard':
16
+ include $controller . 'dashboard.php'; break;
17
+ case 'login_and_spam':
18
+ include $controller . 'login-spam.php'; break;
19
+ case 'default':
20
+ include $controller . 'login-security.php'; break;
21
+ case 'wpnsaccount':
22
+ include $controller . 'account.php'; break;
23
+ case 'backup':
24
+ include $controller . 'backup.php'; break;
25
+ case 'upgrade':
26
+ include $controller . 'upgrade.php'; break;
27
+ case 'waf':
28
+ include $controller . 'waf.php'; break;
29
+ case 'blockedips':
30
+ include $controller . 'ip-blocking.php'; break;
31
+ case 'advancedblocking':
32
+ include $controller . 'advanced-blocking.php'; break;
33
+ case 'notifications':
34
+ include $controller . 'notification-settings.php'; break;
35
+ case 'reports':
36
+ include $controller . 'reports.php'; break;
37
+ case 'licencing':
38
+ include $controller . 'licensing.php'; break;
39
+ case 'troubleshooting':
40
+ include $controller . 'troubleshooting.php'; break;
41
+ case 'malwarescan':
42
+ include $controller . 'scan_malware.php'; break;
43
+ case 'two_fa':
44
+ include $controller . 'two_fa.php'; break;
45
+ }
46
+ }
47
+
48
+ include $controller . 'support.php';
controllers/malware_scan_ajax.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ public function mo_wpns_malware_scanner_functions(){
9
+ add_action('wp_ajax_mo_wpns_malware_redirect', array( $this, 'mo_wpns_malware_redirect' ));
10
+ }
11
+
12
+ public function mo_wpns_malware_redirect(){
13
+ switch($_POST['call_type'])
14
+ {
15
+ case "submit_malware_settings_form":
16
+ $this->mo_wpns_save_malware_config_form($_POST);
17
+ break;
18
+ case "malware_scan_initiate":
19
+ $this->mo_wpns_start_malware_scan($_POST);
20
+ break;
21
+ case "malware_scan_status":
22
+ $this->mo_wpns_get_status();
23
+ break;
24
+ case "wpns_enable_tour":
25
+ update_option('skip_tour', 0);
26
+ break;
27
+ case "wpns_disable_tour":
28
+ update_option('skip_tour', 1);
29
+ break;
30
+ }
31
+ }
32
+
33
+ public function mo_wpns_save_malware_config_form($POSTED){
34
+ $nonce = $POSTED['nonce'];
35
+ if ( ! wp_verify_nonce( $nonce, 'wpns-scan-settings' ) ){
36
+ wp_send_json('ERROR');
37
+ return;
38
+ }
39
+ if(! isset($POSTED['scan_plugin']) && ! isset($POSTED['scan_themes']) && ! isset($POSTED['scan_core'])){
40
+ wp_send_json('folder_error');
41
+ }elseif (! isset($POSTED['vulnerable_check']) && ! isset($POSTED['sql_check']) && ! isset($POSTED['rfi_check']) && ! isset($POSTED['ext_link']) && ! isset($POSTED['repo_check'])) {
42
+ wp_send_json('level_error');
43
+ }
44
+ else{
45
+ isset($POSTED['scan_plugin']) ? update_option('mo_wpns_scan_plugins',sanitize_text_field($POSTED['scan_plugin'])) : update_option('mo_wpns_scan_plugins',0);
46
+ isset($POSTED['scan_themes']) ? update_option('mo_wpns_scan_themes',sanitize_text_field($POSTED['scan_themes'])) : update_option('mo_wpns_scan_themes',0);
47
+ isset($POSTED['scan_core']) ? update_option('mo_wpns_scan_wp_files',sanitize_text_field($POSTED['scan_core'])) : update_option('mo_wpns_scan_wp_files',0);
48
+ update_option('mo_wpns_scan_files_extensions',sanitize_text_field($POSTED['file_type']));
49
+ isset($POSTED['vulnerable_check']) ? update_option('mo_wpns_check_vulnerable_code',sanitize_text_field($POSTED['vulnerable_check'])) : update_option('mo_wpns_check_vulnerable_code',0);
50
+ isset($POSTED['sql_check']) ? update_option('mo_wpns_check_sql_injection',sanitize_text_field($POSTED['sql_check'])) : update_option('mo_wpns_check_sql_injection',0);
51
+ isset($POSTED['ext_link']) ? update_option('mo_wpns_check_external_link',sanitize_text_field($POSTED['ext_link'])) : update_option('mo_wpns_check_external_link',0);
52
+ isset($POSTED['repo_check']) ? update_option('mo_wpns_scan_files_with_repo',sanitize_text_field($POSTED['repo_check'])) : update_option('mo_wpns_scan_files_with_repo',0);
53
+
54
+ $folders_to_skip= $POSTED['skip_path'];
55
+ if(!empty($folders_to_skip)){
56
+ $folders_to_skip_array=explode(";",$folders_to_skip);
57
+ for($i=0; $i< count($folders_to_skip_array); $i++){
58
+ $str.= $folders_to_skip_array[$i];
59
+ if($i!= count($folders_to_skip_array)-1){
60
+ $str.=";";
61
+ }
62
+ }
63
+ update_option( 'mo_wpns_skip_folders', $str);
64
+ }
65
+
66
+ wp_send_json('save_success');
67
+ }
68
+ }
69
+
70
+ public function mo_wpns_start_malware_scan($POSTED){
71
+ global $moWpnsUtility, $dirName;
72
+ include_once $dirName. DIRECTORY_SEPARATOR.'handler'.DIRECTORY_SEPARATOR.'malware_scanner.php';
73
+ $mo_wpns_scan_handler = new Mo_wpns_Scan_Handler();
74
+ if(isset($POSTED['scan']) && $POSTED['scan']=='scan_start'){
75
+ $scan_configuration = array();
76
+ switch($POSTED['scantype'])
77
+ {
78
+ case "quick_scan":
79
+ $nonce = $POSTED['nonce'];
80
+ if ( ! wp_verify_nonce( $nonce, 'wpns-quick-scan' ) ){
81
+ wp_send_json('ERROR');
82
+ return;
83
+ }
84
+ $scan_configuration = array('plugin_scan' => 1 ,
85
+ 'theme_scan' => 1,
86
+ 'core_scan' => 1,
87
+ 'file_extension' => "php",
88
+ 'check_vulnerable' => 1,
89
+ 'check_sql' => 1,
90
+ 'ext_link_check' => 0,
91
+ 'check_repo' => 0,
92
+ 'path_skip' => "",
93
+ 'type_scan' => "Quick Scan"
94
+ );
95
+ update_option('mo_wpns_scan_mode','quick_scan');
96
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration);
97
+ break;
98
+ case "standard_scan":
99
+ $nonce = $POSTED['nonce'];
100
+ if ( ! wp_verify_nonce( $nonce, 'wpns-standard-scan' ) ){
101
+ wp_send_json('ERROR');
102
+ return;
103
+ }
104
+ $scan_configuration = array('plugin_scan' => 1 ,
105
+ 'theme_scan' => 1,
106
+ 'core_scan' => 1,
107
+ 'file_extension' => "php",
108
+ 'check_vulnerable' => 1,
109
+ 'check_sql' => 1,
110
+ 'ext_link_check' => 1,
111
+ 'check_repo' => 1,
112
+ 'path_skip' => "",
113
+ 'type_scan' => "Standard Scan"
114
+ );
115
+ update_option('mo_wpns_scan_mode','standard_scan');
116
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration);
117
+ break;
118
+ case "custom_scan":
119
+ $nonce = $POSTED['nonce'];
120
+ if ( ! wp_verify_nonce( $nonce, 'wpns-custom-scan' ) ){
121
+ wp_send_json('ERROR');
122
+ return;
123
+ }
124
+ $scan_configuration = array('plugin_scan' => get_option('mo_wpns_scan_plugins') ,
125
+ 'theme_scan' => get_option('mo_wpns_scan_themes'),
126
+ 'core_scan' => get_option('mo_wpns_scan_wp_files'),
127
+ 'file_extension' => get_option('mo_wpns_scan_files_extensions'),
128
+ 'check_vulnerable' => get_option('mo_wpns_check_vulnerable_code') ,
129
+ 'check_sql' => get_option('mo_wpns_check_sql_injection'),
130
+ 'ext_link_check' => get_option('mo_wpns_check_external_link'),
131
+ 'check_repo' => get_option('mo_wpns_scan_files_with_repo'),
132
+ 'path_skip' => get_option('mo_wpns_skip_folders'),
133
+ 'type_scan' => "Custom Scan"
134
+ );
135
+ update_option('mo_wpns_scan_mode','custom_scan');
136
+ $mo_wpns_scan_handler->mo2f_scan_all_files($scan_configuration);
137
+ break;
138
+ }
139
+ }
140
+ }
141
+
142
+ public function mo_wpns_get_status(){
143
+ $status= get_option('mo_wpns_malware_scan_in_progress');
144
+ $files_scanned = get_option('mo_wpns_files_scanned');
145
+ $infected_files= get_option('mo_wpns_infected_files');
146
+ $scan_fail= get_option('scan_failed');
147
+ $result=array("status"=>$status, "scanned"=>$files_scanned, "infected"=>$infected_files, "scan_fail"=>$scan_fail);
148
+ wp_send_json($result);
149
+ }
150
+ }
151
+ new Mo_wpns_scan_malware();
152
+ ?>
controllers/malware_scan_result.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ function showScanResults(){
4
+ $mo_wpns_db_handler = new MoWpnsDB();
5
+ if(isset($_GET['view'])){
6
+ if(isset($_GET['trust'])){
7
+ $mo_wpns_db_handler->ignorefile(base64_decode($_GET['trust']));
8
+ }
9
+ else if(isset($_GET['trustchanged'])){
10
+ $mo_wpns_db_handler->ignorechangedfile($_GET['trustchanged']);
11
+ }
12
+
13
+ $listofignorefiles = $mo_wpns_db_handler->getlistofignorefiles();
14
+ $ignorefiles = array();
15
+ foreach($listofignorefiles as $row)
16
+ $ignorefiles[$row->path] = array('signature'=>$row->signature,"id"=>$row->id);
17
+
18
+ $result = $mo_wpns_db_handler->get_report_with_id($_GET['view']);
19
+ if(sizeof($result)>0){
20
+ $detailreport = $mo_wpns_db_handler->get_detail_report_with_id($_GET['view']);
21
+ show_scan_details($detailreport, $result, $ignorefiles);
22
+ }
23
+ }
24
+ else{
25
+ $str1= $_SERVER['REQUEST_URI'];
26
+ $str1= str_replace("admin-ajax.php", "admin.php?page=malwarescan", $str1);
27
+ $currenturl = remove_query_arg('delete',$str1);
28
+ $currenturl = remove_query_arg('view',$currenturl);
29
+ $currenturl = remove_query_arg('trust',$currenturl);
30
+ $currenturl = remove_query_arg('trustchanged',$currenturl);
31
+ if(isset($_GET['delete'])){
32
+ $mo_wpns_db_handler->delete_report($_GET['delete']);
33
+ }
34
+ $result = $mo_wpns_db_handler->get_report();
35
+ show_scan_report($currenturl, $result);
36
+ }
37
+ }
38
+
39
+ ?>
miniorange_2_factor_common_login.php → controllers/mo2fa_common_login.php RENAMED
@@ -13,21 +13,21 @@ function mo2f_collect_device_attributes_handler( $redirect_to = null,$session_id
13
  <div>
14
  <form id="morba_loginform" method="post">
15
  <h1><?php echo mo2f_lt( 'Please wait' ); ?>...</h1>
16
- <img src="<?php echo plugins_url( 'includes/images/ajax-loader-login.gif', __FILE__ ); ?>"/>
17
  <?php
18
  if ( get_option( 'mo2f_remember_device' ) ) {
19
  ?>
20
  <p><input type="hidden" id="miniorange_rba_attribures" name="miniorange_rba_attribures" value=""/></p>
21
  <?php
22
- echo '<script src="' . plugins_url( 'includes/js/rba/js/jquery-1.9.1.js', __FILE__ ) . '" ></script>';
23
- echo '<script src="' . plugins_url( 'includes/js/rba/js/jquery.flash.js', __FILE__ ) . '" ></script>';
24
- echo '<script src="' . plugins_url( 'includes/js/rba/js/ua-parser.js', __FILE__ ) . '" ></script>';
25
- echo '<script src="' . plugins_url( 'includes/js/rba/js/client.js', __FILE__ ) . '" ></script>';
26
- echo '<script src="' . plugins_url( 'includes/js/rba/js/device_attributes.js', __FILE__ ) . '" ></script>';
27
- echo '<script src="' . plugins_url( 'includes/js/rba/js/swfobject.js', __FILE__ ) . '" ></script>';
28
- echo '<script src="' . plugins_url( 'includes/js/rba/js/fontdetect.js', __FILE__ ) . '" ></script>';
29
- echo '<script src="' . plugins_url( 'includes/js/rba/js/murmurhash3.js', __FILE__ ) . '" ></script>';
30
- echo '<script src="' . plugins_url( 'includes/js/rba/js/miniorange-fp.js', __FILE__ ) . '" ></script>';
31
  }
32
  ?>
33
  <input type="hidden" name="miniorange_attribute_collection_nonce"
@@ -208,8 +208,7 @@ function mo2f_get_forgotphone_form( $login_status, $login_message, $redirect_to,
208
  value="KBA"/><?php echo mo2f_lt( 'Answer your Security Questions (KBA)' ); ?>
209
  <?php } ?>
210
  <br><br>
211
- <input type="button" name="miniorange_validate_otp"
212
- value=<?php echo mo2f_lt( 'Continue' ); ?> class="miniorange_validate_otp"
213
  onclick="mo2fselectforgotphoneoption();"/>
214
  </div>
215
  <?php mo2f_customize_logo();
@@ -386,7 +385,7 @@ function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_
386
  </div>
387
  <div id="showPushImage">
388
  <center>
389
- <img src="<?php echo plugins_url( 'includes/images/ajax-loader-login.gif', __FILE__ ); ?>"/>
390
  </center>
391
  </div>
392
 
@@ -459,31 +458,32 @@ function mo2f_get_push_notification_oobemail_prompt( $id, $login_status, $login_
459
 
460
  <script>
461
  var timeout;
462
- pollPushValidation();
463
 
464
- function pollPushValidation() {
465
- var transId = "<?php echo $cookievalue;// echo MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId',$session_id_encrypt ); ?>";
466
- var jsonString = "{\"txId\":\"" + transId + "\"}";
467
- var postUrl = "<?php echo MO_HOST_NAME; ?>" + "/moas/api/auth/auth-status";
468
-
469
- jQuery.ajax({
470
- url: postUrl,
471
- type: "POST",
472
- dataType: "json",
473
- data: jsonString,
474
- contentType: "application/json; charset=utf-8",
475
- success: function (result) {
476
- var status = JSON.parse(JSON.stringify(result)).status;
477
- if (status == 'SUCCESS') {
478
- jQuery('#mo2f_mobile_validation_form').submit();
479
- } else if (status == 'ERROR' || status == 'FAILED' || status == 'DENIED') {
480
- jQuery('#mo2f_backto_mo_loginform').submit();
481
- } else {
482
- timeout = setTimeout(pollPushValidation, 3000);
 
 
483
  }
484
- }
485
- });
486
- }
487
 
488
  function mologinoffline() {
489
  jQuery('#mo2f_show_softtoken_loginform').submit();
@@ -613,14 +613,14 @@ function mo2f_get_qrcode_authentication_prompt( $login_status, $login_message, $
613
  success: function (result) {
614
  var status = JSON.parse(JSON.stringify(result)).status;
615
  if (status == 'SUCCESS') {
616
- var content = "<div id='success'><center><img src='" + "<?php echo plugins_url( 'includes/images/right.png', __FILE__ );?>" + "' /></center></div>";
617
  jQuery("#showQrCode").empty();
618
  jQuery("#showQrCode").append(content);
619
  setTimeout(function () {
620
  jQuery("#mo2f_mobile_validation_form").submit();
621
  }, 100);
622
  } else if (status == 'ERROR' || status == 'FAILED') {
623
- var content = "<div id='error'><center><img src='" + "<?php echo plugins_url( 'includes/images/wrong.png', __FILE__ );?>" + "' /></center></div>";
624
  jQuery("#showQrCode").empty();
625
  jQuery("#showQrCode").append(content);
626
  setTimeout(function () {
@@ -853,22 +853,13 @@ function mo2f_get_device_form( $redirect_to, $session_id_encrypt ) {
853
  function mo2f_customize_logo() { ?>
854
  <div style="float:right;"><a target="_blank" href="http://miniorange.com/2-factor-authentication"><img
855
  alt="logo"
856
- src="<?php echo plugins_url( '/includes/images/miniOrange2.png', __FILE__ ); ?>"/></a></div>
857
 
858
  <?php }
859
 
860
  function echo_js_css_files() {
861
  echo '<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>';
862
- echo '<script src="' . plugins_url( 'includes/js/bootstrap.min.js', __FILE__ ) . '" ></script>';
863
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/bootstrap.min.css?version=5.1.21', __FILE__ ) . '" />';
864
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/front_end_login.css?version=5.1.21', __FILE__ ) . '" />';
865
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/style_settings.css?version=5.1.21', __FILE__ ) . '" />';
866
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/hide-login.css?version=5.1.21', __FILE__ ) . '" />';
867
-
868
- if ( get_option( 'mo2f_personalization_ui' ) ) {
869
- echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/mo2f_login_popup_ui.css', __FILE__ ) . '" />';
870
- }
871
  }
872
-
873
-
874
  ?>
13
  <div>
14
  <form id="morba_loginform" method="post">
15
  <h1><?php echo mo2f_lt( 'Please wait' ); ?>...</h1>
16
+ <img src="<?php echo plugins_url( 'includes/images/ajax-loader-login.gif', dirname(__FILE__) ); ?>"/>
17
  <?php
18
  if ( get_option( 'mo2f_remember_device' ) ) {
19
  ?>
20
  <p><input type="hidden" id="miniorange_rba_attribures" name="miniorange_rba_attribures" value=""/></p>
21
  <?php
22
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/jquery-1.9.1.js', dirname(__FILE__) ) . '" ></script>';
23
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/jquery.flash.js', dirname(__FILE__) ) . '" ></script>';
24
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/ua-parser.js', dirname(__FILE__) ) . '" ></script>';
25
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/client.js', dirname(__FILE__) ) . '" ></script>';
26
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/device_attributes.js', dirname(__FILE__) ) . '" ></script>';
27
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/swfobject.js', dirname(__FILE__) ) . '" ></script>';
28
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/fontdetect.js', dirname(__FILE__) ) . '" ></script>';
29
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/murmurhash3.js', dirname(__FILE__) ) . '" ></script>';
30
+ echo '<script src="' . plugins_url( 'includes/js/rba/js/miniorange-fp.js', dirname(__FILE__) ) . '" ></script>';
31
  }
32
  ?>
33
  <input type="hidden" name="miniorange_attribute_collection_nonce"
208
  value="KBA"/><?php echo mo2f_lt( 'Answer your Security Questions (KBA)' ); ?>
209
  <?php } ?>
210
  <br><br>
211
+ <input type="button" name="miniorange_validate_otp" value="<?php echo mo2f_lt( 'Continue' ); ?>" class="miniorange_validate_otp"
 
212
  onclick="mo2fselectforgotphoneoption();"/>
213
  </div>
214
  <?php mo2f_customize_logo();
385
  </div>
386
  <div id="showPushImage">
387
  <center>
388
+ <img src="<?php echo plugins_url( '/../includes/images/ajax-loader-login.gif', __FILE__ ); ?>"/>
389
  </center>
390
  </div>
391
 
458
 
459
  <script>
460
  var timeout;
 
461
 
462
+ pollPushValidation();
463
+ function pollPushValidation() {
464
+ var transId = "<?php echo $cookievalue;// echo MO2f_Utility::mo2f_retrieve_user_temp_values( 'mo2f_transactionId',$session_id_encrypt ); ?>";
465
+ var jsonString = "{\"txId\":\"" + transId + "\"}";
466
+ var postUrl = "<?php echo MO_HOST_NAME; ?>" + "/moas/api/auth/auth-status";
467
+
468
+ jQuery.ajax({
469
+ url: postUrl,
470
+ type: "POST",
471
+ dataType: "json",
472
+ data: jsonString,
473
+ contentType: "application/json; charset=utf-8",
474
+ success: function (result) {
475
+ var status = JSON.parse(JSON.stringify(result)).status;
476
+ if (status == 'SUCCESS') {
477
+ jQuery('#mo2f_mobile_validation_form').submit();
478
+ } else if (status == 'ERROR' || status == 'FAILED' || status == 'DENIED') {
479
+ jQuery('#mo2f_backto_mo_loginform').submit();
480
+ } else {
481
+ timeout = setTimeout(pollPushValidation, 3000);
482
+ }
483
  }
484
+ });
485
+ }
486
+
487
 
488
  function mologinoffline() {
489
  jQuery('#mo2f_show_softtoken_loginform').submit();
613
  success: function (result) {
614
  var status = JSON.parse(JSON.stringify(result)).status;
615
  if (status == 'SUCCESS') {
616
+ var content = "<div id='success'><center><img src='" + "<?php echo plugins_url( 'includes/images/right.png', dirname(__FILE__ ));?>" + "' /></center></div>";
617
  jQuery("#showQrCode").empty();
618
  jQuery("#showQrCode").append(content);
619
  setTimeout(function () {
620
  jQuery("#mo2f_mobile_validation_form").submit();
621
  }, 100);
622
  } else if (status == 'ERROR' || status == 'FAILED') {
623
+ var content = "<div id='error'><center><img src='" + "<?php echo plugins_url( 'includes/images/wrong.png', dirname(__FILE__ ));?>" + "' /></center></div>";
624
  jQuery("#showQrCode").empty();
625
  jQuery("#showQrCode").append(content);
626
  setTimeout(function () {
853
  function mo2f_customize_logo() { ?>
854
  <div style="float:right;"><a target="_blank" href="http://miniorange.com/2-factor-authentication"><img
855
  alt="logo"
856
+ src="<?php echo plugins_url( '/includes/images/miniOrange2.png', dirname(__FILE__ )); ?>"/></a></div>
857
 
858
  <?php }
859
 
860
  function echo_js_css_files() {
861
  echo '<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>';
862
+ echo '<script src="' . plugins_url( 'includes/js/bootstrap.min.js', dirname(__FILE__ ) ) . '" ></script>';
863
+ echo '<link rel="stylesheet" type="text/css" href="' . plugins_url( 'includes/css/twofa_style_settings.css?version=5.1.21', dirname(__FILE__ )) . '" />';
 
 
 
 
 
 
 
864
  }
 
 
865
  ?>
controllers/navbar.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+
6
+ $profile_url = add_query_arg( array('page' => 'wpnsaccount' ), $_SERVER['REQUEST_URI'] );
7
+ $login_security = add_query_arg( array('page' => 'default' ), $_SERVER['REQUEST_URI'] );
8
+ $waf = add_query_arg( array('page' => 'waf' ), $_SERVER['REQUEST_URI'] );
9
+ $login_and_spam = add_query_arg( array('page' => 'login_and_spam' ), $_SERVER['REQUEST_URI'] );
10
+ $register_url = add_query_arg( array('page' => 'registration' ), $_SERVER['REQUEST_URI'] );
11
+ $blocked_ips = add_query_arg( array('page' => 'blockedips' ), $_SERVER['REQUEST_URI'] );
12
+ $advance_block = add_query_arg( array('page' => 'advancedblocking' ), $_SERVER['REQUEST_URI'] );
13
+ $notif_url = add_query_arg( array('page' => 'notifications' ), $_SERVER['REQUEST_URI'] );
14
+ $reports_url = add_query_arg( array('page' => 'reports' ), $_SERVER['REQUEST_URI'] );
15
+ $license_url = add_query_arg( array('page' => 'upgrade' ), $_SERVER['REQUEST_URI'] );
16
+ $help_url = add_query_arg( array('page' => 'troubleshooting' ), $_SERVER['REQUEST_URI'] );
17
+ $content_protect= add_query_arg( array('page' => 'content_protect' ), $_SERVER['REQUEST_URI'] );
18
+ $backup = add_query_arg( array('page' => 'backup' ), $_SERVER['REQUEST_URI'] );
19
+ $scan_url = add_query_arg( array('page' => 'malwarescan' ), $_SERVER['REQUEST_URI'] );
20
+ $two_fa = add_query_arg( array('page' => 'two_fa' ), $_SERVER['REQUEST_URI'] );
21
+ //Added for new design
22
+ $dashboard_url = add_query_arg(array('page' => 'dashboard' ), $_SERVER['REQUEST_URI']);
23
+ $upgrade_url = add_query_arg(array('page' => 'upgrade' ), $_SERVER['REQUEST_URI']);
24
+ //dynamic
25
+ $logo_url = plugin_dir_url(dirname(__FILE__)) . 'includes/images/miniorange_logo.png';
26
+ // $logo_url = plugin_dir_url($dirName) . 'wp-security-pro/includes/images/miniorange_logo.png';
27
+ $shw_feedback = get_option('donot_show_feedback_message') ? false: true;
28
+ $moPluginHandler= new MoWpnsHandler();
29
+ $safe = $moPluginHandler->is_whitelisted($moWpnsUtility->get_client_ip());
30
+
31
+ $active_tab = $_GET['page'];
32
+
33
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'navbar.php';
controllers/notification-settings.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ $template1 = "Hello,<br><br>The user with IP Address <b>##ipaddress##</b> has exceeded allowed trasaction limit on your website <b>".get_bloginfo()."</b> and we have blocked his IP address for further access to website.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange";
6
+ $template2 = "Hello ##username##,<br><br>Your account was logged in from new IP Address <b>##ipaddress##</b> on website <b>".get_bloginfo()."</b>. Please <a href='mailto:".MoWpnsConstants::SUPPORT_EMAIL."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo();
7
+
8
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']) )
9
+ {
10
+ switch($_POST['option'])
11
+ {
12
+ case "mo_wpns_enable_ip_blocked_email_to_admin":
13
+ wpns_handle_notify_admin_on_ip_block($_POST); break;
14
+ case "mo_wpns_enable_unusual_activity_email_to_user":
15
+ wpns_handle_notify_unusual_activity($_POST); break;
16
+ case "custom_user_template":
17
+ wpns_handle_custom_template($_POST['custom_user_template']); break;
18
+ case "mo_wpns_get_manual_email" :
19
+ wpns_handle_admin_email($_POST); break;
20
+ case "custom_admin_template":
21
+ wpns_handle_custom_template(null,$_POST['custom_admin_template']); break;
22
+ }
23
+ }
24
+ if(!get_option("admin_email_address_status")|| get_option("admin_email_address") ==''){
25
+ update_option('mo_wpns_enable_ip_blocked_email_to_admin','0');
26
+ $notify_admin_on_ip_block = get_option('mo_wpns_enable_ip_blocked_email_to_admin') ? "" : "unchacked";
27
+ }
28
+ $notify_admin_on_ip_block = get_option('mo_wpns_enable_ip_blocked_email_to_admin') ? "checked" : "";
29
+ $notify_admin_unusual_activity = get_option('mo_wpns_enable_unusual_activity_email_to_user') ? "checked" : "";
30
+
31
+ $template1 = get_option('custom_admin_template') ? get_option('custom_admin_template') : $template1;
32
+ $template_type1 = 'custom_admin_template';
33
+ $ip_blocking_template = array(
34
+ 'textarea_name' => 'custom_admin_template',
35
+ 'wpautop' => false
36
+ );
37
+ $fromEmail = get_option('mo2f_email');
38
+ $template2 = get_option('custom_user_template') ? get_option('custom_user_template') : $template2;
39
+ $template_type2 = 'custom_user_template';
40
+ $user_activity_template = array(
41
+ 'textarea_name' => 'custom_user_template',
42
+ 'wpautop' => false
43
+ );
44
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'notification-settings.php';
45
+
46
+
47
+
48
+ /* ADMIN NOTIFICATION SETTINGS */
49
+ function wpns_handle_admin_email($postValue)
50
+ {
51
+
52
+ if(validate_email($_POST['admin_email_address'])){
53
+ $admin_email_address_status = isset($postValue['admin_email_address']) ? '1' :'0';
54
+ update_option('admin_email_address',$postValue['admin_email_address']);
55
+ update_option( 'admin_email_address_status', $admin_email_address_status);
56
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('EMAIL_SAVED'),'SUCCESS');
57
+ }else{
58
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('INVALID_EMAIL'),'ERROR');
59
+ }
60
+ }
61
+ function validate_email($str) {
62
+ return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
63
+ }
64
+
65
+ //Function to handle enabling and disabling of admin notification on ip blocking
66
+ function wpns_handle_notify_admin_on_ip_block($postValue)
67
+ {
68
+ $enable_ip_blocked_email_to_admin = isset($postValue['enable_ip_blocked_email_to_admin']) ? true : false;
69
+ update_option( 'mo_wpns_enable_ip_blocked_email_to_admin', $enable_ip_blocked_email_to_admin);
70
+
71
+ if($enable_ip_blocked_email_to_admin)
72
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_IP_BLOCKED'),'SUCCESS');
73
+ else
74
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_IP_BLOCKED'),'ERROR');
75
+ }
76
+
77
+
78
+ //Function to handle enabling and disabling of admin notification on unusual activity
79
+ function wpns_handle_notify_unusual_activity($postValue)
80
+ {
81
+ $enable_unusual_activity_email_to_user = isset($postValue['enable_unusual_activity_email_to_user']) ? true : false;
82
+ update_option( 'mo_wpns_enable_unusual_activity_email_to_user', $enable_unusual_activity_email_to_user);
83
+
84
+ if($enable_unusual_activity_email_to_user)
85
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('NOTIFY_ON_UNUSUAL_ACTIVITY'),'SUCCESS');
86
+ else
87
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DONOT_NOTIFY_ON_UNUSUAL_ACTIVITY'),'ERROR');
88
+ }
89
+
90
+
91
+ //Function to save unusual activity email template
92
+ function wpns_handle_custom_template($template1,$template2=null)
93
+ {
94
+ if(!is_null($template1))
95
+ update_option('custom_user_template', stripslashes($template1));
96
+
97
+ if(!is_null($template2))
98
+ update_option('custom_admin_template', stripslashes($template2));
99
+
100
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('TEMPLATE_SAVED'),'SUCCESS');
101
+ }
controllers/registration-security.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility, $dirName;
4
+
5
+
6
+ if(current_user_can( 'manage_options' ) && isset($_POST['option']))
7
+ {
8
+ switch($_POST['option'])
9
+ {
10
+ case "mo_wpns_enable_fake_domain_blocking":
11
+ wpns_handle_domain_blocking($_POST); break;
12
+ case "mo_wpns_advanced_user_verification":
13
+ wpns_handle_advanced_user_verification($_POST); break;
14
+ case "mo_wpns_social_integration":
15
+ wpns_handle_enable_social_login($_POST); break;
16
+
17
+ }
18
+ }
19
+
20
+ $otpVerify_url = add_query_arg( array('page' => 'mo_customer_validation_settings', 'tab'=>'settings'), $_SERVER['REQUEST_URI'] );
21
+ $openid_url = add_query_arg( array('page' => 'mo_openid_settings' ), $_SERVER['REQUEST_URI'] );
22
+ $domain_blocking= get_option('mo_wpns_enable_fake_domain_blocking') ? "checked" : "";
23
+ $user_verify = get_option('mo_wpns_enable_advanced_user_verification') ? "checked" : "";
24
+ $social_login = get_option('mo_wpns_enable_social_integration') ? "checked" : "";
25
+
26
+ if($user_verify)
27
+ {
28
+ $moOTPPlugin = new OTPPlugin();
29
+ $status = $moOTPPlugin->getstatus();
30
+ switch ($status)
31
+ {
32
+ case "ACTIVE":
33
+ $html1 = "<br><a href='".$otpVerify_url."'>Click here to configure.</a>";
34
+ $moOTPPlugin->updatePluginConfiguration();
35
+ break;
36
+ case "INSTALLED":
37
+ $path = "miniorange-otp-verification/miniorange_validation_settings.php";
38
+ $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
39
+ $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate OTP Verification Plugin</a>';
40
+ break;
41
+ default:
42
+ $action = 'install-plugin';
43
+ $slug = 'miniorange-otp-verification';
44
+ $install_link = wp_nonce_url(
45
+ add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
46
+ $action.'_'.$slug
47
+ );
48
+ $html1 = '<br><span style="color:red">For Advanced User Verification you need to have miniOrange OTP Verification plugin installed.</span><br><a href="'.$install_link.'">Install OTP Verification plugin</a>';
49
+ break;
50
+ }
51
+ }
52
+
53
+
54
+ if($social_login)
55
+ {
56
+ $moSocialLogin = new SocialPlugin();
57
+ $status = $moSocialLogin->getstatus();
58
+ switch ($status)
59
+ {
60
+ case "ACTIVE":
61
+ $html2 = "<br><a href='".$openid_url."'>Click here to configure.</a>";
62
+ break;
63
+ case "INSTALLED":
64
+ $path = "miniorange-login-openid/miniorange_openid_sso_settings.php";
65
+ $activateUrl = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$path), 'activate-plugin_'.$path);
66
+ $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin activated.</span><br><a href="'.$activateUrl.'">Click here to activate Social Login, Sharing Plugin</a>';
67
+ break;
68
+ default:
69
+ $action = 'install-plugin';
70
+ $slug = 'miniorange-login-openid';
71
+ $install_link = wp_nonce_url(
72
+ add_query_arg( array( 'action' => $action, 'plugin' => $slug ), admin_url( 'update.php' ) ),
73
+ $action.'_'.$slug
74
+ );
75
+ $html2 = '<br><span style="color:red">For Social Login Integration you need to have miniOrange Social Login, Sharing plugin installed.</span><br><a href="'.$install_link.'">Install Social Login, Sharing plugin</a>';
76
+ break;
77
+ }
78
+ }
79
+
80
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'registration-security.php';
81
+
82
+
83
+
84
+
85
+ /* REGISTRATION SECURITY RELATED FUNCTIONS*/
86
+
87
+ //Function to handle enabling and disabling domain blocking
88
+ function wpns_handle_domain_blocking($postvalue)
89
+ {
90
+ $enable_fake_emails = isset($postvalue['mo_wpns_enable_fake_domain_blocking']) ? true : false;
91
+ update_option( 'mo_wpns_enable_fake_domain_blocking', $enable_fake_emails);
92
+
93
+ if($enable_fake_emails)
94
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_ENABLED'),'SUCCESS');
95
+ else
96
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DOMAIN_BLOCKING_DISABLED'),'ERROR');
97
+ }
98
+
99
+
100
+ //Function to enable and disable User Verification for the Default Registration Page
101
+ function wpns_handle_advanced_user_verification($postvalue)
102
+ {
103
+ $enable_advanced_user_verification = isset($postvalue['mo_wpns_enable_advanced_user_verification']) ? true : false;
104
+ update_option( 'mo_wpns_enable_advanced_user_verification', $enable_advanced_user_verification);
105
+
106
+ if($enable_advanced_user_verification)
107
+ {
108
+ update_option('mo_customer_validation_wp_default_enable',1);
109
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_ADVANCED_USER_VERIFY'),'SUCCESS');
110
+ }
111
+ else
112
+ {
113
+ update_option('mo_customer_validation_wp_default_enable',0);
114
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_ADVANCED_USER_VERIFY'),'ERROR');
115
+ }
116
+ }
117
+
118
+
119
+ //Function to enable and disable Social Login
120
+ function wpns_handle_enable_social_login($postvalue)
121
+ {
122
+ $social_login = isset($postvalue['mo_wpns_enable_social_integration']) ? true : false;
123
+ update_option( 'mo_wpns_enable_social_integration', $social_login);
124
+
125
+ if($social_login)
126
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('ENABLE_SOCIAL_LOGIN'),'SUCCESS');
127
+ else
128
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('DISABLE_SOCIAL_LOGIN'),'ERROR');
129
+ }
controllers/reports.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ if(isset($_POST['option']) and $_POST['option']=='mo_wpns_manual_clear'){
6
+ global $wpdb;
7
+ $wpdb->query("DELETE FROM ".$wpdb->prefix."mo2f_network_transactions WHERE Status='success' or Status= 'pastfailed' or Status='failed' ");
8
+
9
+ }
10
+
11
+
12
+
13
+ if(isset($_POST['option']) and $_POST['option']=='mo_wpns_manual_errorclear'){
14
+ global $wpdb;
15
+ $wpdb->query("DELETE FROM ".$wpdb->prefix."mo2f_network_transactions WHERE Status='accessDenied'");
16
+
17
+ }
18
+
19
+ $mo_wpns_handler = new MoWpnsHandler();
20
+ $logintranscations = $mo_wpns_handler->get_login_transaction_report();
21
+ $errortranscations = $mo_wpns_handler->get_error_transaction_report();
22
+
23
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'reports.php';
24
+
25
+ ?>
26
+
controllers/scan_malware.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ if(!get_option( 'mo_wpns_scan_files_extensions'))
6
+ update_option( 'mo_wpns_scan_files_extensions','php');
7
+ add_option('mo_wpns_skip_folders');
8
+
9
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'malware_scan.php';
10
+ ?>
11
+
controllers/scan_malware_report.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if(get_option('mo_wpns_malware_scan_in_progress')=='IN PROGRESS')
3
+ $scan_in_progress="disabled";
4
+ else
5
+ $scan_in_progress="";
6
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'scan_report_view.php';
7
+
8
+ ?>
controllers/scan_malware_settings.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'scan_settings_view.php';
3
+ ?>
controllers/setup_twofa.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $email_registered = 1;
4
+ global $Mo2fdbQueries;
5
+ $email = get_user_meta(get_current_user_id(),'email',true);
6
+ if(isset($email))
7
+ $email_registered = 1;
8
+ else
9
+ $email_registered = 0;
10
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'setup_twofa.php';
controllers/support.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $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 $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 ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ global $dirName;
4
+ $current_user = wp_get_current_user();
5
+ $email = get_option("mo2f_email");
6
+ $phone = get_option("mo_wpns_admin_phone");
7
+ $display = get_option('skip_tour')?'none':'block';
8
+ if(empty($email))
9
+ $email = $current_user->user_email;
10
+ $counter = 0;
11
+ $tour_body = '<p class="modal-body-para">Hey, Thank you for installing <b style="color: #E85700">miniOrange 2-Factor plugin</b>.</p>
12
+ <p class="modal-body-para">Wordpress is open-source CMS and it can be used by anyone. So, attacker knows the ways to hack it, spoil organizaton\'s reputation, data theft, etc.</p>
13
+ <div><table style="width: 100%; text-align: center; table-layout: fixed; font-size: medium;"><tr><td><img src="'.plugin_dir_url(dirname(__FILE__)) . 'includes/images/mo-waf-logo.png"></td><td><img src="'.plugin_dir_url(dirname(__FILE__)) . 'includes/images/login-protection-logo.png"></td><td><img src="'.plugin_dir_url(dirname(__FILE__)) . 'includes/images/database-backup-logo.png"></td><td><img src="'.plugin_dir_url(dirname(__FILE__)) . 'includes/images/malware-scanner-logo.png"></td></tr><tr><th>Web Application Firewall(WAF)</th><th>Login Protection</th><th>Database Backup</th><th>Malware scanner</th></tr></table></div>
14
+ <p class="modal-body-para">How you will protect your site? We are here to take care of you site and provide high end security.</p>
15
+ <p id="body-para-instr" class="modal-body-para" style="font-size: large;text-align: center;font-weight: 700;color: black;">Please select type of site to take a quick tour of setting up the plugin</p>
16
+ <div style="text-align: center; padding-bottom: 10px;"><span id="span-ecommerce" onclick="change_span_css(this);" class="modal-span">Ecommerce</span><span id="span-business" onclick="change_span_css(this);" class="modal-span">Business</span><span id="span-blog" onclick="change_span_css(this);" class="modal-span">Blogs/News</span><span id="span-other" onclick="change_span_css(this);" class="modal-span">Other</span></div>';
17
+
18
+ // $waf_data = array('ecommerce' => , 'business'=> , 'blog'=> , 'other'=> );
19
+ // $waf_data = array('ecommerce' => 'It includes sensitive data such as user details, credit/debit card details.', 'business'=> '', 'blog'=> 'It includes users data, post data.', 'other'=> '');
20
+
21
+ $waf_arr_ecc = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-1" style="width: 98%; overflow: ; height: ;line-height: 1.5;"><b><u>Data theft and manipulation</u>:</b> Data manipulation can lead to alter, delete, destroy data. The manipulated data may or may not be regained. It includes very sensitive data such as user details, credit/debit card or bank details. It is very necessary to fix the existing data vulnerability issues, data leaks, change weak passwords and provide high end security to stop data breach and manipulation.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection is web security vulnerability through SQL queries executed to modify, delete and destroy data. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-1" onclick="open_hide(this);">-</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-2" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Web Scraping</u>:</b> Web scraping is a used to extract large amount of data from websites and saved on local computer. The web scraping involves fetching and extracting data from it. It can be used to web indexing, web mining, data mining, research, tracking online presence and reputation, etc. Media scraping, price scraping are also some scraping techniques which are used to degrade/destroy media files and change the price of products.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site scripts used to web scraping and data extraction.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-2" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-3" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>File manipualtion</u>:</b> The file manipuaiton used to alter, delete, execution of files on the sever. It leads to spoil site, spread malicious content which will harm to the business. <div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Remote File Inclusion attacks:</span> Remote file inclusion used to include local file into the server. RFI is type of vulnerability which can lead to add malicious file through a script on server.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Local File Inclusion attacks:</span> Local file inclusion used to access local file available on the server. LFI can be achieved by uploading malicious file to the server.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-3" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-4" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Content modification</u>:</b> Cross-site scripting used to change or modify data shown on website. Content modification affects a lot on business due to irrelevent content, malicious links which leads to spoil the trust of clients and reputation of organizations.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection attack can change data in database. The data used to view content such as statistical data, charts, graphs, etc. It may mislead to business.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site script can add malicious links, change content of site. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-4" onclick="open_hide(this);">+</a></div></div>';
22
+
23
+ $waf_arr_busi = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-1" style="width: 98%; overflow: ; height: ;line-height: 1.5;"><b><u>Data theft and manipulation</u>:</b> Data manipulation can lead to alter, delete, destroy data. The manipulated data may or may not be regained. It may include company privileged data, admin users data which will affect on the business. It is very necessary to fix the existing data vulnerability issues, data leaks, change weak passwords and provide high end security to stop data breach and manipulation.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection is web security vulnerability through SQL queries executed to modify, delete and destroy data. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-1" onclick="open_hide(this);">-</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-2" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Web Scraping</u>:</b> Web scraping is a used to extract large amount of data from websites and saved on local computer. The web scraping involves fetching and extracting data from it. It can be used to web indexing, web mining, data mining, research, tracking online presence and reputation, etc. Price scraping is part of web scraping which is used to change prices of the products which affects a lot on business.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site scripts used to web scraping and data extraction.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-2" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-3" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>File manipualtion</u>:</b> The file manipuaiton used to alter, delete, execution of files on the sever. It leads to spoil site, spread malicious content which will harm to the business.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Remote File Inclusion attacks:</span> Remote file inclusion used to include local file into the server. RFI is type of vulnerability which can lead to add malicious file through a script on server.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Local File Inclusion attacks:</span> Local file inclusion used to access local file available on the server. LFI can be achieved by uploading malicious file to the server.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-3" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-4" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Content modification</u>:</b> Cross-site scripting used to change or modify data shown on website. Content modification affects a lot on business due to irrelevent content, malicious links which leads to spoil the trust of clients and reputation of organizations.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection attack can change data in database. The data used to view content such as statistical data, charts, graphs, etc. It may mislead to business.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site script can add malicious links, change content of site. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-4" onclick="open_hide(this);">+</a></div></div>';
24
+
25
+ $waf_arr_blog = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-1" style="width: 98%; overflow: ; height: ;line-height: 1.5;"><b><u>Data theft and manipulation</u>:</b> Data manipulation can lead to alter, delete, destroy data. The manipulated data may or may not be regained. It is very necessary to fix the existing data vulnerability issues, data leaks, change weak passwords and provide high end security to stop data breach and manipulation. The data may include user details, privileged data, privileged blogs, etc.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection is web security vulnerability through SQL queries executed to modify, delete and destroy data. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-1" onclick="open_hide(this);">-</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-2" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Web Scraping</u>:</b> Web scraping is a used to extract large amount of data from websites and saved on local computer. The web scraping involves fetching and extracting data from it. It can be used to web indexing, web mining, data mining, research, tracking online presence and reputation, etc. Media scraping can be done in the blog/news site which alter, degrade or destroy media files.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site scripts used to web scraping and data extraction.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-2" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-3" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>File manipualtion</u>:</b> The file manipuaiton used to alter, delete, execution of files on the sever. It leads to spoil site, spread malicious content which will harm to the business.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Remote File Inclusion attacks:</span> Remote file inclusion used to include local file into the server. RFI is type of vulnerability which can lead to add malicious file through a script on server.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Local File Inclusion attacks:</span> Local file inclusion used to access local file available on the server. LFI can be achieved by uploading malicious file to the server.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-3" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-4" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Content modification</u>:</b> Cross-site scripting used to change or modify data shown on website. Content modification affects a lot on business due to irrelevent content, malicious links which leads to spoil the trust of clients and reputation of organizations. Content modification may mislead to blog/news site subscriber. It can be used to spread fake/malicious imformation.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection attack can change data in database. The data used to view content such as statistical data, charts, graphs, etc. It may mislead to business.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site script can add malicious links, change content of site. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-4" onclick="open_hide(this);">+</a></div></div>';
26
+
27
+ $waf_arr_other = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-1" style="width: 98%; overflow: ; height: ;line-height: 1.5;"><b><u>Data theft and manipulation</u>:</b> Data manipulation can lead to alter, delete, destroy data. The manipulated data may or may not be regained. It is very necessary to fix the existing data vulnerability issues, data leaks, change weak passwords and provide high end security to stop data breach and manipulation.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection is web security vulnerability through SQL queries executed to modify, delete and destroy data. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-1" onclick="open_hide(this);">-</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-2" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Web Scraping</u>:</b> Web scraping is a used to extract large amount of data from websites and saved on local computer. The web scraping involves fetching and extracting data from it. It can be used to web indexing, web mining, data mining, research, tracking online presence and reputation, etc.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site scripts used to web scraping and data extraction.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-2" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-3" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>File manipualtion</u>:</b> The file manipuaiton used to alter, delete, execution of files on the sever. It leads to spoil site, spread malicious content which will harm to the business.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Remote File Inclusion attacks:</span> Remote file inclusion used to include local file into the server. RFI is type of vulnerability which can lead to add malicious file through a script on server.</div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Local File Inclusion attacks:</span> Local file inclusion used to access local file available on the server. LFI can be achieved by uploading malicious file to the server.</div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-3" onclick="open_hide(this);">+</a></div></div><div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-4" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Content modification</u>:</b> Cross-site scripting used to change or modify data shown on website. Content modification affects a lot on business due to irrelevent content, malicious links which leads to spoil the trust of clients and reputation of organizations.<div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent SQL-Injection attacks:</span> SQL-Injection attack can change data in database. The data used to view content such as statistical data, charts, graphs, etc. It may mislead to business. </div><div class="modal-waf-dinner"><span class="modal-waf-sinner">Prevent Cross-site scripting(XSS) attacks:</span> Cross site script can add malicious links, change content of site. </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-4" onclick="open_hide(this);">+</a></div></div>';
28
+
29
+ $waf_body_ecommerce = '<div class="modal-body-div">
30
+ <p class="modal-body-para" style="margin: 0;">Ecommerce sites are always under attack to spoil organizations reputaion, data theft and manipualation, file manipualation, web scraping, etc. WAF controls the access of web applications using rules designed to recognize and restrict suspicious activities.</p>';
31
+ $waf_body_business = '<div class="modal-body-div">
32
+ <p class="modal-body-para" style="margin: 0;">Business sites are always under attack to spoil organizations reputaion, data theft and manipualation, file manipualation, web scraping, etc. WAF controls the access of web applications using rules designed to recognize and restrict suspicious activities.</p>';
33
+ $waf_body_blog = '<div class="modal-body-div">
34
+ <p class="modal-body-para" style="margin: 0;">Blogs/News sites are attacked to spoil organizations reputaion, data theft and manipualation, file manipualation, web scraping, etc. WAF controls the access of web applications using rules designed to recognize and restrict suspicious activities.</p>';
35
+ $waf_body_other = '<div class="modal-body-div">
36
+ <p class="modal-body-para" style="margin: 0;">Other sites such as employment, portfolio, multilingual, etc are attacked to spoil organizations reputaion, data theft and manipualation, file manipualation, web scraping, etc. WAF controls the access of web applications using rules designed to recognize and restrict suspicious activities.</p>';
37
+
38
+ $waf_body = '<div style="width:100%; display:inline-flex; margin-left: 20px;">
39
+ <div style="width:50%;font-size: medium;">1: <b>Data theft and manipulation</b></div>
40
+ <div style="width:50%;font-size: medium;">2: <b>Web Scraping</b></div></div>
41
+ <div style="width:100%; display:inline-flex; margin-left: 20px;">
42
+ <div style="width:50%;font-size: medium;">3: <b>File manipulation</b></div>
43
+ <div style="width:50%;font-size: medium;">4: <b>Content modification</b></div></div>
44
+ </div>';
45
+
46
+ // foreach ($waf_arr as $key => $value) {
47
+ // $waf_body.= '<div class="modal-body-div-c modal-body-div-d">';
48
+ // if($counter==0)
49
+ // $waf_body.= '<div id="div-show-hide-'.$counter.'" style="width: 98%; overflow:; height: ;line-height: 1.5;"><b><u>'.$key.'</u></b> '.$value.'</div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-'.$counter.'" onclick="open_hide(this);">-</a></div></div>';
50
+ // else
51
+ // $waf_body.= '<div id="div-show-hide-'.$counter.'" style="width: 98%; overflow:hidden; height: 50px;line-height: 1.5;"><b><u>'.$key.'</u></b> '.$value.'</div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-'.$counter.'" onclick="open_hide(this);">+</a></div></div>';
52
+ // $counter+=$counter+1;
53
+ // }
54
+
55
+ $registration_security_ecommerce = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-13" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Registratoin security:</u></b> Ecommerce sites need to prevent fake registrations. It helps to keep site safe from suspicious user.';
56
+ $registration_security_business = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-13" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Registratoin security:</u></b> Business sites need to prevent fake registrations. It helps to keep site safe from suspicious user.';
57
+
58
+ $registration_security_other = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-13" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Registratoin security:</u></b> The sites such as employment, social networking, etc. need to prevent fake user registrations. The user will spam other users and share private data of others.';
59
+
60
+ $registration_security = '<div style="margin:1em;"><ul>
61
+ <li>
62
+ <p class="modal-body-para" style="margin: 0;">1. Temporary/Fake email ban</p>
63
+ </li>
64
+ <li>
65
+ <p class="modal-body-para" style="margin: 0;">2. OTP Verification during registrations</p>
66
+ </li>
67
+ <li>
68
+ <p class="modal-body-para" style="margin: 0;">3. Social login</p>
69
+ </li>
70
+ </ul>
71
+ </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-13" onclick="open_hide(this);">+</a></div></div>';
72
+
73
+ $login_security_ecommerce = '<div class="modal-body-div"><p class="modal-body-para">Ecommerce sites should have strong login security to prevent unauthorised access.</p></div>';
74
+ $login_security_business = '<div class="modal-body-div"><p class="modal-body-para">Business sites should have strong login security to prevent unauthorised access.</p></div>';
75
+ $login_security_blog = '<div class="modal-body-div"><p class="modal-body-para">Blogs/News sites should have strong login security to prevent unauthorised access.</p></div>';
76
+ $login_security_other = '<div class="modal-body-div"><p class="modal-body-para">Other sites such as employment, portfolio, etc. should have strong login security to prevent unauthorised access.</p></div>';
77
+
78
+ $login_security_body = '<div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-10" style="width: 98%; overflow:; height: ;line-height: 1.5;"><b><u>Limit Login:</u></b> Password guessing/Brute force attack can be controlled/prevented by limiting the login attempts. Paasword guessing can be protected by:
79
+ <div style="margin:1em;">
80
+ <ul>
81
+ <li>
82
+ <p class="modal-body-para">1. Limit Login attempts: 10 (<b>Recommended</b>)</p>
83
+ </li>
84
+ <li>
85
+ <p class="modal-body-para">2. Enforce Strong passwords</p>
86
+ </li>
87
+ </ul>
88
+ </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-10" onclick="open_hide(this);">-</a></div></div>
89
+
90
+ <div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-11" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>2-Factor:</u></b> 2-factor authentication is important to prevent unauthorised login. 2-factor authentication can be enabled on top of login credentials at the time of login. Google authenticator, Authy authenticator, Lastpass authenticator applications can be used to configure 2FA. miniOrange supports 15+ 2FA methods, it includes OTP over SMS, Email, Security Questions, QR code authentication, push notification, Hardware Token, etc. 2FA can enabled to:
91
+ <div style="margin:1em;">
92
+ <ul>
93
+ <li>
94
+ <p class="modal-body-para">1. Enable 2FA for employees (<b>Recommended</b>)</p>
95
+ </li>
96
+ <li>
97
+ <p class="modal-body-para">2. Enable 2FA for users</p>
98
+ </li>
99
+ <li>
100
+ <p class="modal-body-para">3. Backup methods in case of emergency login</p>
101
+ </li>
102
+ </ul>
103
+ </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-11" onclick="open_hide(this);">+</a></div></div>
104
+ <div class="modal-body-div-c modal-body-div-d"><div id="div-show-hide-12" style="width: 98%; overflow: hidden; height: 50px;line-height: 1.5;"><b><u>Remember device:</u></b> Remember device allows user to login from trusted devices. It keeps safe from unauthorised users who tries to gain access. It improves your login security by allowing you to login from limited and trusted deivces.
105
+ <div style="margin:1em;">
106
+ <ul>
107
+ <li>
108
+ <p class="modal-body-para">1. Allows multiple trusted devices</p>
109
+ </li>
110
+ <li>
111
+ <p class="modal-body-para">2. Limit no. of trusted devices</p>
112
+ </li>
113
+ <li>
114
+ <p class="modal-body-para">3. Block IP\'s of unauthorised users</p>
115
+ </li>
116
+ </ul>
117
+ </div></div><div style="width: 2%; font-size: xx-large;"><a id="show-hide-12" onclick="open_hide(this);">+</a></div></div>';
118
+
119
+
120
+ $media_body = '<div class="modal-body-div"><p class="modal-body-para">Ecommerce sites are often attacked to degrade and destroy media files such as images of product, audios and videos about products. You need to secure your media data. Media protection is important because the users of ecommerce site buy product by viewing the media of products. The broad word media scraping can be used for these types attacks.</p>
121
+ <div class="modal-body-div modal-body-para">Here is our <a target="_blank" href="https://wordpress.org/plugins/prevent-file-access/">Media protection</a> plugin.</div>
122
+ <div class="modal-body-div">The Media protection prevents media files listed below:</div>
123
+ </div>
124
+ <div style="margin:1em;">
125
+ <ul>
126
+ <li>
127
+ <p class="modal-body-para">1. It protects all type of image files, audio, video and gif files.</p>
128
+ </li>
129
+ <li>
130
+ <p class="modal-body-para">2. It also prevents access to documents such as pdf, doc, docx, txt, xls, xlsx, etc.</p>
131
+ </li>
132
+ </ul>
133
+ </div>';
134
+
135
+ $media_body_1 = '<div class="modal-body-div"><p class="modal-body-para">Some sites such as Photo Gallery or other site which contains media files are often attacked to degrade and destroy media files. You need to secure your media data. Media protection is important because the these sites are totally based on media files.</p>
136
+ <div class="modal-body-div modal-body-para">Here is our <a target="_blank" href="https://wordpress.org/plugins/prevent-file-access/">Media protection</a> plugin.</div>
137
+ <div class="modal-body-div">The Media protection prevents media files listed below:</div>
138
+ </div>
139
+ <div style="margin:1em;">
140
+ <ul>
141
+ <li>
142
+ <p class="modal-body-para">1. It protects all type of image files, audio, video and gif files.</p>
143
+ </li>
144
+ <li>
145
+ <p class="modal-body-para">2. It also prevents access to documents such as pdf, doc, docx, txt, xls, xlsx, etc.</p>
146
+ </li>
147
+ </ul>
148
+ </div>';
149
+
150
+ $backup_ecommerce = '<div class="modal-body-div"><p class="modal-body-para">The data is backbone of any e-commerce site. The ecommerce sites are attacked to steal data, data manipulation and files manipulation. You can take a backup of your data and files securely.</p></div>';
151
+ $backup_business = '<div class="modal-body-div"><p class="modal-body-para">The data is backbone of any Business site. The business sites are attacked to steal data, data manipulation and files manipulation. You can take a backup of your data and files securely.</p></div>';
152
+ $backup_blog = '<div class="modal-body-div"><p class="modal-body-para">The data is backbone of any Blog/News site. These sites are attacked to steal data, data manipulation and files manipulation. You can take a backup of your data and files securely.</p></div>';
153
+ $backup_blog = '<div class="modal-body-div"><p class="modal-body-para">The data is backbone of any site such as social networking, employment, etc. There are several attacks happens on these sites to steal data, data manipulation and files manipulation. You can take a backup of your data and files securely.</p></div>';
154
+
155
+
156
+ $backup_body = '<div class="modal-body-div">
157
+ <ul>
158
+ <li>
159
+ <p class="modal-body-para"><b>1. <u>Scheduled backup:</u></b> Scheduled backup used to create automatic backup after scheduled time. It allows you to relax because you know that all of your information is being backed up, and you are limiting what you may lose. Using this feature you can set a time interval to create a continuous backup. ';
160
+ $backup_body_1 = '<div class="modal-waf-dinner"><span class="modal-waf-sinner">Set scheduled backup time 1/2 hr for ecommerce site.</span></div>';
161
+ $backup_body_2 = '<div class="modal-waf-dinner"><span class="modal-waf-sinner">You can set automatic backup after 12 hrs time interval.</span></div>';
162
+ $backup_body_3 = '<div class="modal-waf-dinner"><span class="modal-waf-sinner">You can set automatic backup after 4-5 hrs time interval.</span></div>';
163
+ $backup_body_4 = '</p>
164
+ </li>
165
+ <li>
166
+ <p class="modal-body-para"><b>2. <u>Manual backup:</u></b> Manual backup can be taken manually whenever user wants. It is important when you made any crucial changes and don\'t want to loose data then you can immediately take a backup and keep it securely.</p>
167
+ </li>
168
+ <li>
169
+ <p class="modal-body-para"><b>3. <u>Password protected encrypted backup:</u></b> Password protected encrypted backup is very secure way to take a backup. If anyone gets it still no one can decode it because of its highly secure nature.</p>
170
+ </li>
171
+ <li>
172
+ <p class="modal-body-para"><b>4. <u>Easy restoring and recovering:</u></b> Simple one-click restore using installer files created for your website. During backup, we create an installer.php file. At the time of restore and recovery, you just need to upload the zip file of backup and installer.php and run the installer file and follow instructions to set up your website.</p>
173
+ </li>
174
+ </ul>
175
+ </div>';
176
+
177
+ $comment_ecommerce = '<div class="modal-body-div"><p class="modal-body-para">Ecommerce websites are attacked to spread unwanted or irrelevant content by submitting automated posts, comments, contact forms, etc. A spam message, content or comment includes backlinks or excessive links that redirect to illegal websites or websites containing inappropriate content. Automated scripts and botnets are used to spread such spam comments and posts to spoil the organizations reputation or product reputation. </p></div>';
178
+ $comment_business = '<div class="modal-body-div"><p class="modal-body-para">Business websites are used to spread unwanted or irrelevant content by submitting automated posts, comments, contact forms, etc. A spam message, content or comment includes backlinks or excessive links that redirect to illegal websites or websites containing inappropriate content. Automated scripts and botnets are used to spread such spam comments and posts to spoil the organizations reputation or product reputation. </p></div>';
179
+ $comment_blog = '<div class="modal-body-div"><p class="modal-body-para">Blog/News websites are used to spread unwanted or irrelevant content by submitting automated posts, comments, contact forms, etc. A spam message, content or comment includes backlinks or excessive links that redirect to illegal websites or websites containing inappropriate content. Automated scripts and botnets are used to spread such spam comments and posts to spoil the organizations reputation or product reputation. </p></div>';
180
+ $comment_other = '<div class="modal-body-div"><p class="modal-body-para">Other websites such as employment, multilingual, etc. are used to spread unwanted or irrelevant content by submitting automated posts, comments, contact forms, etc. A spam message, content or comment includes backlinks or excessive links that redirect to illegal websites or websites containing inappropriate content. Automated scripts and botnets are used to spread such spam comments and posts to spoil the organizations reputation or product reputation. </p></div>';
181
+
182
+ $comment_spam = '<div style="margin:1em;">
183
+ <ul>
184
+ <li>
185
+ <p class="modal-body-para"><b>1. <u>Comment protection:</u></b> Spam comments generated by automated scripts can be prevented using captcha. Honeypot is another widely used technique to catch bots and block them.</p>
186
+ </li>
187
+ <li>
188
+ <p class="modal-body-para"><b>2. <u>Post protection:</u></b> Automated scripts or botnets can prevented by using captcha. There are three forms of captcha availble text, math and google recaptcha. Honeypot is also another way to detect spam posts. Malware scanner can also used to scan the malware in the posts.</p>
189
+ </li>
190
+ </ul>
191
+ </div>';
192
+
193
+
194
+ $scanner = '<div class="modal-body-div"><p class="modal-body-para">Malware scanner detects the malicious code in the files. Compares the wordpress, plugins and theme files with Wordpress repo files. Detects changes present in any wordpress, theme and plugin files. It also checks outdated/vulnerable plugins, themes. It is also useful to detect malware in posts and comments.</p></div>
195
+ <div style="margin:1em;">
196
+ <ul>
197
+ <li>
198
+ <p class="modal-body-para"><b>1. <u>Malware scan:</u></b> Malware scan scans the wordpress core files, plugins and theme files to check malware. It detects the trojans, backdoors, viruses, worms, etc. in the files. </p>
199
+ </li>
200
+ <li>
201
+ <p class="modal-body-para"><b>2. <u>Wordpress version and file compare:</u></b> Checks WordPress, plugins and themes version with Wordpress.org repository and compare WordPress core, plugins and themes files with the repository to detect any file changes. Detect any changes in the files present in the WordPress plugins and themes folder.</p>
202
+ </li>
203
+ <li>
204
+ <p class="modal-body-para"><b>3. <u>Check vulnerable plugins and themes:</u></b> Checks vulnerable plugins and themes which contains malicious code. You can remove it to enhance your site security.</p>
205
+ </li>
206
+ </ul>
207
+ </div>';
208
+
209
+ $support_modal = '<div>
210
+
211
+ <div style="width: unset; float: unset; margin: 10px 20%;" class="mo_wpns_support_layout_model">
212
+
213
+ <img src="'.dirname(plugin_dir_url(__FILE__)).'/includes/images/support3.png">
214
+ <h1>Support</h1>
215
+ <p>Need any help? We are available any time, Just send us a query so we can help you.</p>
216
+ <form name="f" method="post" action="">
217
+ <input type="hidden" name="option" value="mo_wpns_send_query"/>
218
+ <table class="mo_wpns_settings_table">
219
+ <tr><td>
220
+ <input type="email" class="mo_wpns_table_textbox" id="query_email" name="query_email" value="'.$email.'" placeholder="Enter your email" required />
221
+ </td>
222
+ </tr>
223
+ <tr><td>
224
+ <input type="text" class="mo_wpns_table_textbox" name="query_phone" id="query_phone" value="'.$phone.'" placeholder="Enter your phone"/>
225
+ </td>
226
+ </tr>
227
+ <tr>
228
+ <td>
229
+ <textarea id="query" name="query" class="mo_wpns_settings_textarea" style="resize: vertical;width:100%" cols="52" rows="7" onkeyup="mo_wpns_valid(this)" onblur="mo_wpns_valid(this)" onkeypress="mo_wpns_valid(this)" placeholder="Write your query here"></textarea>
230
+ </td>
231
+ </tr>
232
+ </table>
233
+ <input type="submit" name="send_query" id="send_query" value="Submit Query" class="mo_wpns_button mo_wpns_button1" />
234
+ </form>
235
+ <br />
236
+ </div>
237
+ </div>
238
+ <script>
239
+ function moSharingSizeValidate(e){
240
+ var t=parseInt(e.value.trim());t>60?e.value=60:10>t&&(e.value=10)
241
+ }
242
+ function moSharingSpaceValidate(e){
243
+ var t=parseInt(e.value.trim());t>50?e.value=50:0>t&&(e.value=0)
244
+ }
245
+ function moLoginSizeValidate(e){
246
+ var t=parseInt(e.value.trim());t>60?e.value=60:20>t&&(e.value=20)
247
+ }
248
+ function moLoginSpaceValidate(e){
249
+ var t=parseInt(e.value.trim());t>60?e.value=60:0>t&&(e.value=0)
250
+ }
251
+ function moLoginWidthValidate(e){
252
+ var t=parseInt(e.value.trim());t>1000?e.value=1000:140>t&&(e.value=140)
253
+ }
254
+ function moLoginHeightValidate(e){
255
+ var t=parseInt(e.value.trim());t>50?e.value=50:35>t&&(e.value=35)
256
+ }
257
+ </script>';
258
+
259
+
260
+ $ecommerce_site = array(array('Web Application Firewall(WAF)', $waf_body_ecommerce.$waf_body.$waf_arr_ecc), array('Login Security', $login_security_ecommerce.$login_security_body.$registration_security_ecommerce.$registration_security), array('Media Protection', $media_body), array('Encrypted Backup', $backup_ecommerce.$backup_body.$backup_body_1.$backup_body_4), array('Comment and Spam Protection', $comment_ecommerce.$comment_spam), array('Malware Scanner', $scanner), array('Support', $support_modal));
261
+
262
+ $business_site = array(array('Web Application Firewall(WAF)', $waf_body_business.$waf_body.$waf_arr_busi), array('Encrypted Backup', $backup_business.$backup_body.$backup_body_2.$backup_body_4), array('Comment and Spam Protection', $comment_business.$comment_spam), array('Login Security', $login_security_business.$login_security_body.$registration_security_business.$registration_security), array('Malware Scanner', $scanner), array('Support', $support_modal));
263
+
264
+ $blog_site = array(array('Web Application Firewall(WAF)', $waf_body_blog.$waf_body.$waf_arr_blog), array('Comment and Spam Protection', $comment_blog.$comment_spam), array('Login Security', $login_security_blog.$login_security_body), array('Encrypted Backup', $backup_blog.$backup_body.$backup_body_3.$backup_body_4), array('Malware Scanner', $scanner), array('Support', $support_modal));
265
+
266
+ $other_site = array(array('Web Application Firewall(WAF)', $waf_body_other.$waf_body.$waf_arr_other), array('Comment and Spam Protection', $comment_other.$comment_spam), array('Login Security', $login_security_other.$login_security_body), array('Encrypted Backup', $backup_blog.$backup_body.$backup_body_4), array('Media Protection', $media_body_1), array('Malware Scanner', $scanner), array('Support', $support_modal));
267
+
268
+ $main_pointer = array('Main' => array('Let\'s get Started', $tour_body), 'Ecommerce' => $ecommerce_site, 'Business' => $business_site, 'Blogs/News' => $blog_site, 'Other' => $other_site);
269
+
270
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'tour-model.php';
controllers/troubleshooting.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ global $moWpnsUtility,$dirName;
4
+
5
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'troubleshooting.php';
controllers/two_fa.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+
3
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'two_fa.php';
controllers/two_fa_addon.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ global $Mo2fdbQueries;
3
+ $mo2f_user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
4
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'two_fa_addon.php';
controllers/two_fa_custom_form.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'two_fa_custom_form.php';
controllers/two_fa_login_option.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ include_once $dirName . 'views'.DIRECTORY_SEPARATOR.'two_fa_login_option.php';
controllers/two_fa_video_guide.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <div class="mo_wpns_setting_layout">
2
+ <h2>How to configure Two Factor Method?</h2>
3
+ <p>You can configure any method of your choice. We will give a demo on how we can configure Google Authenticator.</p><br>
4
+ <div style="margin:2%;">
5
+ <iframe width="100%" height="350" src="https://www.youtube.com/embed/vVGXjedIaGs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
6
+ </div>
7
+ </div>
controllers/upgrade.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'upgrade.php';
controllers/waf.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ global $moWpnsUtility,$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($mo_waf)
17
+ {
18
+ $mo_waf = false;
19
+ }
20
+ else
21
+ {
22
+ $mo_waf = true;
23
+ }
24
+
25
+ $img_loader_url = plugins_url('wp-security-pro/includes/images/loader.gif');
26
+
27
+ if($totalIPBlocked>999)
28
+ {
29
+ $totalIPBlocked = strval(intval($totalIPBlocked/1000)).'k+';
30
+ }
31
+
32
+ if($totalAttacks>999)
33
+ {
34
+ $totalAttacks = strval(intval($totalAttacks/1000)).'k+';
35
+ }
36
+
37
+
38
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'waf.php';
39
+
40
+
41
+
42
+
controllers/wpns-loginsecurity-ajax.php ADDED
@@ -0,0 +1,1181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class wpns_ajax
3
+ {
4
+ function __construct(){
5
+ //add comment here
6
+ add_action( 'admin_init' , array( $this, 'mo_login_security_ajax' ) );
7
+ }
8
+
9
+ function mo_login_security_ajax(){
10
+
11
+ add_action( 'wp_ajax_wpns_login_security', array($this,'wpns_login_security') );
12
+ }
13
+
14
+ function wpns_login_security(){
15
+ switch($_POST['wpns_loginsecurity_ajax'])
16
+ {
17
+ case "wpns_bruteforce_form":
18
+ $this->wpns_handle_bf_configuration_form(); break;
19
+ case "wpns_save_captcha":
20
+ $this->wpns_captcha_settings();break;
21
+ case "save_strong_password":
22
+ $this->wpns_strong_password_settings();break;
23
+ case 'wpns_ManualIPBlock_form':
24
+ $this->wpns_handle_IP_blocking();break;
25
+ case 'wpns_WhitelistIP_form':
26
+ $this->wpns_whitelist_ip(); break;
27
+ case 'wpns_waf_settings_form':
28
+ $this->wpns_waf_settings_form(); break;
29
+ case 'wpns_waf_rate_limiting_form':
30
+ $this->wpns_waf_rate_limiting_form(); break;
31
+ case 'wpns_ip_lookup':
32
+ $this->wpns_ip_lookup(); break;
33
+ case 'wpns_save_email_verification':
34
+ $this->wpns_save_email_verification(); break;
35
+ }
36
+ }
37
+
38
+
39
+ function wpns_handle_bf_configuration_form(){
40
+
41
+ $nonce = $_POST['nonce'];
42
+ if ( ! wp_verify_nonce( $nonce, 'wpns-brute-force' ) ){
43
+ wp_send_json('ERROR');
44
+ return;
45
+ }
46
+ $brute_force = $_POST['bf_enabled/disabled'];
47
+ if($brute_force == 'true'){$brute_force = "on";}else if($brute_force == 'false') {$brute_force = "";}
48
+ $login_attempts = $_POST['allwed_login_attempts'];
49
+ $blocking_type = $_POST['time_of_blocking_type'];
50
+ $blocking_value = isset($_POST['time_of_blocking_val']) ? $_POST['time_of_blocking_val'] : false;
51
+ $show_login_attempts= $_POST['show_remaining_attempts'];
52
+ if($show_login_attempts == 'true'){$show_login_attempts = "on";} else if($show_login_attempts == 'false') { $show_login_attempts = "";}
53
+ if($brute_force == 'on' && $login_attempts == "" ){
54
+ wp_send_json('empty');
55
+ return;
56
+ }
57
+ update_option( 'mo2f_enable_brute_force' , $brute_force );
58
+ update_option( 'mo2f_allwed_login_attempts' , $login_attempts );
59
+ update_option( 'mo_wpns_time_of_blocking_type' , $blocking_type );
60
+ update_option( 'mo_wpns_time_of_blocking_val' , $blocking_value );
61
+ update_option('mo2f_show_remaining_attempts' , $show_login_attempts );
62
+ if($brute_force == "on"){
63
+ wp_send_json('true');
64
+ }
65
+ else if($brute_force == ""){
66
+ wp_send_json('false');
67
+ }
68
+
69
+ }
70
+ function wpns_handle_IP_blocking()
71
+ {
72
+
73
+ global $dirName;
74
+ if(!wp_verify_nonce($_POST['nonce'],'manualIPBlockingNonce'))
75
+ {
76
+ echo "NonceDidNotMatch";
77
+ exit;
78
+ }
79
+ else
80
+ {
81
+ include_once($dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
82
+ }
83
+ }
84
+ function wpns_whitelist_ip()
85
+ {
86
+ global $dirName;
87
+ if(!wp_verify_nonce($_POST['nonce'],'IPWhiteListingNonce'))
88
+ {
89
+ echo "NonceDidNotMatch";
90
+ exit;
91
+ }
92
+ else
93
+ {
94
+ include_once($dirName.'controllers'.DIRECTORY_SEPARATOR.'ip-blocking.php');
95
+ }
96
+ }
97
+ function wpns_save_email_verification()
98
+ {
99
+ if(!wp_verify_nonce($_POST['nonce'],'EmailVerificationSaveNonce'))
100
+ {
101
+ echo "NonceDidNotMatch";
102
+ exit;
103
+ }
104
+ else
105
+ {
106
+ $email = sanitize_text_field($_POST['email']);
107
+ $error = false;
108
+ $user_id = sanitize_text_field($_POST['user_id']);
109
+
110
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL))
111
+ {
112
+ $error = true;
113
+ }
114
+ if($email!='' && !$error)
115
+ {
116
+ global $Mo2fdbQueries;
117
+ $Mo2fdbQueries->update_user_details(get_current_user_id(),array('mo2f_EmailVerification_config_status'=>true));
118
+ $Mo2fdbQueries->update_user_details(get_current_user_id(),array('mo2f_configured_2FA_method'=>"Email Verification"));
119
+ update_user_meta($user_id,'email',$email);
120
+ echo "settingsSaved";
121
+ exit;
122
+ }
123
+ else
124
+ {
125
+ echo "invalidEmail";
126
+ exit;
127
+ }
128
+
129
+ }
130
+
131
+ }
132
+ function wpns_ip_lookup()
133
+ {
134
+
135
+ if(!wp_verify_nonce($_POST['nonce'],'IPLookUPNonce'))
136
+ {
137
+ echo "NonceDidNotMatch";
138
+ exit;
139
+ }
140
+ else
141
+ {
142
+ $ip = $_POST['IP'];
143
+ if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/',$ip))
144
+ {
145
+ echo("INVALID_IP_FORMAT");
146
+ exit;
147
+ }
148
+ else if(! filter_var($ip, FILTER_VALIDATE_IP)){
149
+ echo("INVALID_IP");
150
+ exit;
151
+ }
152
+ $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
153
+ $hostname = gethostbyaddr($result["geoplugin_request"]);
154
+ try{
155
+ $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
156
+ $timeoffset = $timeoffset/3600;
157
+
158
+ }catch(Exception $e){
159
+ $result["geoplugin_timezone"]="";
160
+ $timeoffset="";
161
+ }
162
+ $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
163
+ if($result['geoplugin_request']==$ip) {
164
+
165
+ $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
166
+ $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
167
+ $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
168
+ $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
169
+ $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
170
+ $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
171
+ $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
172
+ $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
173
+ $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
174
+ $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
175
+ $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
176
+ $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
177
+ $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
178
+ $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
179
+
180
+ $result['ipDetails'] = $ipLookUpTemplate;
181
+ }else{
182
+ $result["ipDetails"]["status"]="ERROR";
183
+ }
184
+ wp_send_json( $result );
185
+ }
186
+ }
187
+ function wpns_waf_settings_form()
188
+ {
189
+ $dir_name = dirname(__FILE__);
190
+ $dir_name1 = explode('wp-content', $dir_name);
191
+ $dir_name = $dir_name1[0];
192
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
193
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
194
+
195
+ if(!file_exists($fileName))
196
+ {
197
+ $file = fopen($fileName, "a+");
198
+ $string = "<?php".PHP_EOL;
199
+ $string .= '$SQL=1;'.PHP_EOL;
200
+ $string .= '$XSS=1;'.PHP_EOL;
201
+ $string .= '$RCE=0;'.PHP_EOL;
202
+ $string .= '$LFI=0;'.PHP_EOL;
203
+ $string .= '$RFI=0;'.PHP_EOL;
204
+ $string .= '$RateLimiting=1;'.PHP_EOL;
205
+ $string .= '$RequestsPMin=120;'.PHP_EOL;
206
+ $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
207
+ $string .= '?>'.PHP_EOL;
208
+
209
+ fwrite($file, $string);
210
+ fclose($file);
211
+ }
212
+ else
213
+ {
214
+ if(!is_writable($fileName) or !is_readable($fileName))
215
+ {
216
+ echo "FilePermissionDenied";
217
+ exit;
218
+ }
219
+ }
220
+
221
+ if(!wp_verify_nonce($_POST['nonce'],'WAFsettingNonce'))
222
+ {
223
+ var_dump("NonceDidNotMatch");
224
+ exit;
225
+ }
226
+ else
227
+ {
228
+ switch ($_POST['optionValue']) {
229
+ case "SQL":
230
+ $this->savesql(); break;
231
+ case "XSS":
232
+ $this->savexss(); break;
233
+ case "RCE":
234
+ $this->saverce(); break;
235
+ case "RFI":
236
+ $this->saverfi(); break;
237
+ case "LFI":
238
+ $this->savelfi(); break;
239
+ case "WAF":
240
+ $this->saveWAF(); break;
241
+ case "HWAF":
242
+ $this->saveHWAF(); break;
243
+ case "backupHtaccess":
244
+ $this->backupHtaccess(); break;
245
+ case "limitAttack":
246
+ $this->limitAttack(); break;
247
+ default:
248
+ break;
249
+ }
250
+
251
+ }
252
+
253
+ }
254
+ function wpns_waf_rate_limiting_form()
255
+ {
256
+ if(!wp_verify_nonce($_POST['nonce'],'RateLimitingNonce'))
257
+ {
258
+ echo "NonceDidNotMatch";
259
+ exit;
260
+ }
261
+ else
262
+ {
263
+ if(get_site_option('WAFEnabled') != 1)
264
+ {
265
+ echo "WAFNotEnabled";
266
+ exit;
267
+ }
268
+
269
+ if($_POST['Requests']!='')
270
+ {
271
+ if(is_numeric($_POST['Requests']))
272
+ {
273
+ $dir_name = dirname(__FILE__);
274
+ $dir_name1 = explode('wp-content', $dir_name);
275
+ $dir_name = $dir_name1[0];
276
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
277
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
278
+
279
+ $file = file_get_contents($fileName);
280
+ $data = $file;
281
+
282
+ $req = sanitize_text_field($_POST['Requests']);
283
+ if($req >1)
284
+ {
285
+ update_option('Rate_request',$req);
286
+ if(isset($_POST['rateCheck']))
287
+ {
288
+ if($_POST['rateCheck'] == 'on')
289
+ {
290
+ update_option('Rate_limiting','1');
291
+ echo "RateEnabled";
292
+ if(strpos($file, 'RateLimiting')!=false)
293
+ {
294
+ $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
295
+ $data = $file;
296
+ file_put_contents($fileName,$file);
297
+
298
+ }
299
+ else
300
+ {
301
+ $content = explode('?>', $file);
302
+ $file = $content[0];
303
+ $file .= PHP_EOL;
304
+ $file .= '$RateLimiting=1;'.PHP_EOL;
305
+ $file .='?>';
306
+ file_put_contents($fileName,$file);
307
+ $data = $file;
308
+ }
309
+
310
+
311
+ }
312
+ }
313
+ else
314
+ {
315
+ update_option('Rate_limiting','0');
316
+ echo "Ratedisabled";
317
+ if(strpos($file, 'RateLimiting')!=false)
318
+ {
319
+ $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
320
+ $data = $file;
321
+ file_put_contents($fileName,$file);
322
+ }
323
+ else
324
+ {
325
+ $content = explode('?>', $file);
326
+ $file = $content[0];
327
+ $file .= PHP_EOL;
328
+ $file .= '$RateLimiting=0;'.PHP_EOL;
329
+ $file .='?>';
330
+ file_put_contents($fileName,$file);
331
+ $data = $file;
332
+ }
333
+
334
+ }
335
+
336
+
337
+ $file = $data;
338
+ if(strpos($file, 'RequestsPMin')!=false)
339
+ {
340
+ $content = explode(PHP_EOL, $file);
341
+ $con = '';
342
+ $len = sizeof($content);
343
+
344
+ for($i=0;$i<$len;$i++)
345
+ {
346
+ if(strpos($content[$i], 'RequestsPMin')!=false)
347
+ {
348
+ $con.='$RequestsPMin='.$req.';'.PHP_EOL;
349
+ }
350
+ else
351
+ {
352
+ $con .= $content[$i].PHP_EOL;
353
+ }
354
+ }
355
+
356
+ file_put_contents($fileName,$con);
357
+ $data = $con;
358
+
359
+ }
360
+
361
+ else
362
+ {
363
+ $content = explode('?>', $file);
364
+ $file = $content[0];
365
+ $file .= PHP_EOL;
366
+ $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
367
+ $file .='?>';
368
+ file_put_contents($fileName,$file);
369
+ $data = $file;
370
+ }
371
+
372
+ if($_POST['actionOnLimitE']=='BlockIP' || $_POST['actionOnLimitE'] == 1)
373
+ {
374
+ update_option('actionRateL',1);
375
+
376
+ $file = $data;
377
+ if(strpos($file, 'actionRateL')!=false)
378
+ {
379
+ $content = explode(PHP_EOL, $file);
380
+ $con = '';
381
+ foreach ($content as $line => $lineV) {
382
+ if(strpos($lineV, 'actionRateL')!=false)
383
+ {
384
+ $con.='$actionRateL="BlockIP";'.PHP_EOL;
385
+ }
386
+ else
387
+ {
388
+ $con .= $lineV.PHP_EOL;
389
+ }
390
+ }
391
+ file_put_contents($fileName,$con);
392
+ }
393
+ else
394
+ {
395
+ $content = explode('?>', $file);
396
+ $file = $content[0];
397
+ $file .= PHP_EOL;
398
+ $file .= '$actionRateL="BlockIP";'.PHP_EOL;
399
+ $file .='?>';
400
+ file_put_contents($fileName,$file);
401
+ $file = $data;
402
+ }
403
+ }
404
+ else if($_POST['actionOnLimitE']=='ThrottleIP' || $_POST['actionOnLimitE'] == 0)
405
+ {
406
+
407
+ $file = $data;
408
+ update_option('actionRateL',0);
409
+ if(strpos($file, 'actionRateL')!=false)
410
+ {
411
+ $content = explode(PHP_EOL, $file);
412
+ $con = '';
413
+ foreach ($content as $line => $lineV) {
414
+ if(strpos($lineV, 'actionRateL')!=false)
415
+ {
416
+ $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
417
+ }
418
+ else
419
+ {
420
+ $con .= $lineV.PHP_EOL;
421
+ }
422
+ }
423
+ file_put_contents($fileName,$con);
424
+ }
425
+ else
426
+ {
427
+ $content = explode('?>', $file);
428
+ $file = $content[0];
429
+ $file .= PHP_EOL;
430
+ $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
431
+ $file .='?>';
432
+ file_put_contents($fileName,$file);
433
+ }
434
+ }
435
+
436
+ }
437
+ exit;
438
+ }
439
+
440
+
441
+
442
+ }
443
+ echo("Error");
444
+ exit;
445
+ }
446
+
447
+
448
+ }
449
+
450
+ private function saveWAF()
451
+ {
452
+ if(isset($_POST['pluginWAF']))
453
+ {
454
+ if($_POST['pluginWAF']=='on')
455
+ {
456
+ update_option('WAF','PluginLevel');
457
+ update_option('WAFEnabled','1');
458
+ echo("PWAFenabled");exit;
459
+ }
460
+ }
461
+ else
462
+ {
463
+ update_option('WAFEnabled','0');
464
+ update_option('WAF','wafDisable');
465
+ echo("PWAFdisabled");exit;
466
+ }
467
+ }
468
+ private function saveHWAF()
469
+ {
470
+ if(!function_exists('mysqli_connect'))
471
+ {
472
+ echo "mysqliDoesNotExit";
473
+ exit;
474
+ }
475
+ if(isset($_POST['htaccessWAF']))
476
+ {
477
+ if($_POST['htaccessWAF']=='on')
478
+ {
479
+ update_option('WAF','HtaccessLevel');
480
+ update_option('WAFEnabled','1');
481
+ $dir_name = dirname(__FILE__);
482
+ $dirN = $dir_name;
483
+ $dirN = str_replace('\\', '/', $dirN);
484
+ $dirN = str_replace('controllers', 'handler', $dirN);
485
+
486
+ $dir_name1 = explode('wp-content', $dir_name);
487
+ $dir_name = $dir_name1[0];
488
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
489
+ $dir_name .='.htaccess';
490
+ $file = file_get_contents($dir_name);
491
+ if(strpos($file, 'php_value auto_prepend_file')!=false)
492
+ {
493
+ echo("WAFConflicts");
494
+ exit;
495
+ }
496
+
497
+ $cont = $file.PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
498
+ $cont .= 'php_value auto_prepend_file '.$dir_name1.'mo-check.php'.PHP_EOL;
499
+ $cont .= '# END miniOrange WAF'.PHP_EOL;
500
+ file_put_contents($dir_name, $cont);
501
+
502
+
503
+ // $content = explode('<IfModule mod_rewrite.c>', $file);
504
+ // $content[0].= '<IfModule mod_rewrite.c>'.PHP_EOL;
505
+ // $content[0].= 'php_value auto_prepend_file '.$dir_name1.'mo-check.php'.PHP_EOL;
506
+ // $content[0].= $content[1];
507
+ // file_put_contents($dir_name, $content[0]);
508
+
509
+ $filecontent = file_get_contents($dir_name);
510
+
511
+ $dir_name = dirname(__FILE__);
512
+ $dir_name1 = explode('wp-content', $dir_name);
513
+ $dir_name = $dir_name1[0];
514
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
515
+ $fileName = $filepath.'mo-check.php';
516
+ $file = fopen($fileName, 'w+');
517
+ $dir_name = dirname(__FILE__);
518
+ $filepath = str_replace('\\', '/', $dir_name);
519
+ $filepath = explode('controllers', $filepath);
520
+ $filepath = $filepath[0].'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf.php';
521
+
522
+ $string = '<?php'.PHP_EOL;
523
+ $string .= 'if(file_exists("'.$filepath.'"))'.PHP_EOL;
524
+ $string .= 'include_once("'.$filepath.'");'.PHP_EOL;
525
+ $string .= '?>'.PHP_EOL;
526
+
527
+ fwrite($file, $string);
528
+ fclose($file);
529
+
530
+ if(strpos($filecontent,'mo-check.php')!=false)
531
+ {
532
+ echo "HWAFEnabled";
533
+ exit;
534
+ }
535
+ else
536
+ {
537
+ echo "HWAFEnabledFailed";
538
+ exit;
539
+ }
540
+ }
541
+ }
542
+ else
543
+ {
544
+ update_option('WAF','wafDisable');
545
+ if(isset($_POST['pluginWAF']))
546
+ {
547
+ if($_POST['pluginWAF'] == 'on')
548
+ {
549
+ update_option('WAFEnabled',1);
550
+ update_option('WAF','PluginLevel');
551
+ }
552
+ }
553
+ else
554
+ update_option('WAFEnabled',0);
555
+ $dir_name = dirname(__FILE__);
556
+ $dirN = $dir_name;
557
+ $dirN = str_replace('\\', '/', $dirN);
558
+ $dirN = explode('wp-content', $dirN);
559
+ $dir_name1 = explode('wp-content', $dir_name);
560
+ $dir_name = $dir_name1[0];
561
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
562
+ $dir_name00 = $dir_name1;
563
+ $dir_name1 .='.htaccess';
564
+ $file = file_get_contents($dir_name1);
565
+
566
+ $cont = PHP_EOL.'# BEGIN miniOrange WAF'.PHP_EOL;
567
+ $cont .= 'php_value auto_prepend_file '.$dir_name00.'mo-check.php'.PHP_EOL;
568
+ $cont .= '# END miniOrange WAF'.PHP_EOL;
569
+ $file =str_replace($cont,'',$file);
570
+ file_put_contents($dir_name1, $file);
571
+
572
+ $filecontent = file_get_contents($dir_name1);
573
+ if(strpos($filecontent,'mo-check.php')==false)
574
+ {
575
+ echo "HWAFdisabled";
576
+ exit;
577
+ }
578
+ else
579
+ {
580
+ echo "HWAFdisabledFailed";
581
+ exit;
582
+ }
583
+ }
584
+
585
+
586
+ }
587
+ private function savesql()
588
+ {
589
+ if(isset($_POST['SQL']))
590
+ {
591
+ if($_POST['SQL']=='on')
592
+ {
593
+ update_option('SQLInjection',1);
594
+ $dir_name = dirname(__FILE__);
595
+ $dir_name1 = explode('wp-content', $dir_name);
596
+ $dir_name = $dir_name1[0];
597
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
598
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
599
+
600
+ $file = file_get_contents($fileName);
601
+ if(strpos($file, 'SQL')!=false)
602
+ {
603
+ $file = str_replace('$SQL=0;', '$SQL=1;', $file);
604
+ file_put_contents($fileName,$file);
605
+ }
606
+ else
607
+ {
608
+ $content = explode('?>', $file);
609
+ $file = $content[0];
610
+ $file .= PHP_EOL;
611
+ $file .= '$SQL=1;'.PHP_EOL;
612
+ $file .='?>';
613
+ file_put_contents($fileName,$file);
614
+ }
615
+ echo("SQLenable");
616
+ exit;
617
+
618
+ }
619
+ }
620
+ else
621
+ {
622
+ update_option('SQLInjection',0);
623
+
624
+ $dir_name = dirname(__FILE__);
625
+ $dir_name1 = explode('wp-content', $dir_name);
626
+ $dir_name = $dir_name1[0];
627
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
628
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
629
+
630
+ $file = file_get_contents($fileName);
631
+ if(strpos($file, '$SQL')!=false)
632
+ {
633
+ $file = str_replace('$SQL=1;', '$SQL=0;', $file);
634
+ file_put_contents($fileName,$file);
635
+ }
636
+ else
637
+ {
638
+ $content = explode('?>', $file);
639
+ $file = $content[0];
640
+ $file .= PHP_EOL;
641
+ $file .= '$SQL=0;'.PHP_EOL;
642
+ $file .='?>';
643
+ file_put_contents($fileName,$file);
644
+ }
645
+
646
+ echo("SQLdisable");
647
+ exit;
648
+
649
+ }
650
+
651
+ }
652
+ private function saverce()
653
+ {
654
+ if(isset($_POST['RCE']))
655
+ {
656
+ if($_POST['RCE']=='on')
657
+ {
658
+ update_option('RCEAttack',1);
659
+
660
+ $dir_name = dirname(__FILE__);
661
+ $dir_name1 = explode('wp-content', $dir_name);
662
+ $dir_name = $dir_name1[0];
663
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
664
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
665
+
666
+ $file = file_get_contents($fileName);
667
+ if(strpos($file, 'RCE')!=false)
668
+ {
669
+ $file = str_replace('$RCE=0;', '$RCE=1;', $file);
670
+ file_put_contents($fileName,$file);
671
+ }
672
+ else
673
+ {
674
+ $content = explode('?>', $file);
675
+ $file = $content[0];
676
+ $file .= PHP_EOL;
677
+ $file .= '$RCE=1;'.PHP_EOL;
678
+ $file .='?>';
679
+ file_put_contents($fileName,$file);
680
+ }
681
+ echo("RCEenable");
682
+ exit;
683
+ }
684
+ }
685
+ else
686
+ {
687
+ update_option('RCEAttack',0);
688
+
689
+ $dir_name = dirname(__FILE__);
690
+ $dir_name1 = explode('wp-content', $dir_name);
691
+ $dir_name = $dir_name1[0];
692
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
693
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
694
+
695
+ $file = file_get_contents($fileName);
696
+ if(strpos($file, '$RCE')!=false)
697
+ {
698
+ $file = str_replace('$RCE=1;', '$RCE=0;', $file);
699
+ file_put_contents($fileName,$file);
700
+ }
701
+ else
702
+ {
703
+ $content = explode('?>', $file);
704
+ $file = $content[0];
705
+ $file .= PHP_EOL;
706
+ $file .= '$RCE=0;'.PHP_EOL;
707
+ $file .='?>';
708
+ file_put_contents($fileName,$file);
709
+ }
710
+ echo("RCEdisable");
711
+ exit;
712
+
713
+ }
714
+
715
+ }
716
+ private function savexss()
717
+ {
718
+ if(isset($_POST['XSS']))
719
+ {
720
+ if($_POST['XSS']=='on')
721
+ {
722
+ update_option('XSSAttack',1);
723
+ $dir_name = dirname(__FILE__);
724
+ $dir_name1 = explode('wp-content', $dir_name);
725
+ $dir_name = $dir_name1[0];
726
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
727
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
728
+
729
+ $file = file_get_contents($fileName);
730
+ if(strpos($file, 'XSS')!=false)
731
+ {
732
+ $file = str_replace('$XSS=0;', '$XSS=1;', $file);
733
+ file_put_contents($fileName,$file);
734
+ }
735
+ else
736
+ {
737
+ $content = explode('?>', $file);
738
+ $file = $content[0];
739
+ $file .= PHP_EOL;
740
+ $file .= '$XSS=1;'.PHP_EOL;
741
+ $file .='?>';
742
+ file_put_contents($fileName,$file);
743
+ }
744
+ echo("XSSenable");
745
+ exit;
746
+ }
747
+ }
748
+ else
749
+ {
750
+ update_option('XSSAttack',0);
751
+ $dir_name = dirname(__FILE__);
752
+ $dir_name1 = explode('wp-content', $dir_name);
753
+ $dir_name = $dir_name1[0];
754
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
755
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
756
+
757
+ $file = file_get_contents($fileName);
758
+ if(strpos($file, '$XSS')!=false)
759
+ {
760
+ $file = str_replace('$XSS=1;', '$XSS=0;', $file);
761
+ file_put_contents($fileName,$file);
762
+ }
763
+ else
764
+ {
765
+ $content = explode('?>', $file);
766
+ $file = $content[0];
767
+ $file .= PHP_EOL;
768
+ $file .= '$XSS=0;'.PHP_EOL;
769
+ $file .='?>';
770
+ file_put_contents($fileName,$file);
771
+ }
772
+ echo("XSSdisable");
773
+ exit;
774
+ }
775
+
776
+ }
777
+ private function savelfi()
778
+ {
779
+ if(isset($_POST['LFI']))
780
+ {
781
+ if($_POST['LFI']=='on')
782
+ {
783
+ update_option('LFIAttack',1);
784
+ $dir_name = dirname(__FILE__);
785
+ $dir_name1 = explode('wp-content', $dir_name);
786
+ $dir_name = $dir_name1[0];
787
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
788
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
789
+
790
+ $file = file_get_contents($fileName);
791
+ if(strpos($file, 'LFI')!=false)
792
+ {
793
+ $file = str_replace("LFI=0;", "LFI=1;", $file);
794
+ file_put_contents($fileName,$file);
795
+ }
796
+ else
797
+ {
798
+ $content = explode('?>', $file);
799
+ $file = $content[0];
800
+ $file .= PHP_EOL;
801
+ $file .= '$LFI=1;'.PHP_EOL;
802
+ $file .='?>';
803
+ file_put_contents($fileName,$file);
804
+ }
805
+ $file = file_get_contents($fileName);
806
+
807
+ echo("LFIenable");
808
+ exit;
809
+ }
810
+ }
811
+ else
812
+ {
813
+ update_option('LFIAttack',0);
814
+ $dir_name = dirname(__FILE__);
815
+ $dir_name1 = explode('wp-content', $dir_name);
816
+ $dir_name = $dir_name1[0];
817
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
818
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
819
+
820
+ $file = file_get_contents($fileName);
821
+ if(strpos($file, '$LFI')!=false)
822
+ {
823
+ $file = str_replace('$LFI=1;', '$LFI=0;', $file);
824
+ file_put_contents($fileName,$file);
825
+ }
826
+ else
827
+ {
828
+ $content = explode('?>', $file);
829
+ $file = $content[0];
830
+ $file .= PHP_EOL;
831
+ $file .= '$LFI=0;'.PHP_EOL;
832
+ $file .='?>';
833
+ file_put_contents($fileName,$file);
834
+ }
835
+ echo("LFIdisable");
836
+ exit;
837
+ }
838
+
839
+ }
840
+ private function saverfi()
841
+ {
842
+ if(isset($_POST['RFI']))
843
+ {
844
+ if($_POST['RFI']=='on')
845
+ {
846
+ update_option('RFIAttack',1);
847
+ $dir_name = dirname(__FILE__);
848
+ $dir_name1 = explode('wp-content', $dir_name);
849
+ $dir_name = $dir_name1[0];
850
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
851
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
852
+
853
+ $file = file_get_contents($fileName);
854
+ if(strpos($file, 'RFI')!=false)
855
+ {
856
+ $file = str_replace('$RFI=0;', '$RFI=1;', $file);
857
+ file_put_contents($fileName,$file);
858
+ }
859
+ else
860
+ {
861
+ $content = explode('?>', $file);
862
+ $file = $content[0];
863
+ $file .= PHP_EOL;
864
+ $file .= '$RFI=1;'.PHP_EOL;
865
+ $file .='?>';
866
+ file_put_contents($fileName,$file);
867
+ }
868
+ echo("RFIenable");
869
+ exit;
870
+ }
871
+ }
872
+ else
873
+ {
874
+ update_option('RFIAttack',0);
875
+ $dir_name = dirname(__FILE__);
876
+ $dir_name1 = explode('wp-content', $dir_name);
877
+ $dir_name = $dir_name1[0];
878
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
879
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
880
+
881
+ $file = file_get_contents($fileName);
882
+ if(strpos($file, '$RFI')!=false)
883
+ {
884
+ $file = str_replace('$RFI=1;', '$RFI=0;', $file);
885
+ file_put_contents($fileName,$file);
886
+ }
887
+ else
888
+ {
889
+ $content = explode('?>', $file);
890
+ $file = $content[0];
891
+ $file .= PHP_EOL;
892
+ $file .= '$RFI=0;'.PHP_EOL;
893
+ $file .='?>';
894
+ file_put_contents($fileName,$file);
895
+ }
896
+ echo("RFIdisable");
897
+ exit;
898
+ }
899
+
900
+ }
901
+ private function saveRateL()
902
+ {
903
+
904
+ if($_POST['time']!='' && $_POST['req']!='')
905
+ {
906
+ if(is_numeric($_POST['time']) && is_numeric($_POST['req']))
907
+ {
908
+ $dir_name = dirname(__FILE__);
909
+ $dir_name1 = explode('wp-content', $dir_name);
910
+ $dir_name = $dir_name1[0];
911
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
912
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
913
+
914
+ $file = file_get_contents($fileName);
915
+ $data = $file;
916
+ $time = sanitize_text_field($_POST['time']);
917
+ $req = sanitize_text_field($_POST['req']);
918
+ if($time>0 && $req >0)
919
+ {
920
+ update_option('Rate_time',$time);
921
+ update_option('Rate_request',$req);
922
+ update_option('Rate_limiting','1');
923
+
924
+ if(strpos($file, 'RateLimiting')!=false)
925
+ {
926
+ $file = str_replace('$RateLimiting=0;', '$RateLimiting=1;', $file);
927
+ $data = $file;
928
+ file_put_contents($fileName,$file);
929
+ }
930
+ else
931
+ {
932
+ $content = explode('?>', $file);
933
+ $file = $content[0];
934
+ $file .= PHP_EOL;
935
+ $file .= '$RateLimiting=1;'.PHP_EOL;
936
+ $file .='?>';
937
+ file_put_contents($fileName,$file);
938
+ $data = $file;
939
+ }
940
+
941
+ $file = $data;
942
+ if(strpos($file, 'RequestsPMin')!=false)
943
+ {
944
+ $content = explode(PHP_EOL, $file);
945
+ $con = '';
946
+ $len = sizeof($content);
947
+
948
+ for($i=0;$i<$len;$i++)
949
+ {
950
+ if(strpos($content[$i], 'RequestsPMin')!=false)
951
+ {
952
+ $con.='$RequestsPMin='.$req.';'.PHP_EOL;
953
+ }
954
+ else
955
+ {
956
+ $con .= $content[$i].PHP_EOL;
957
+ }
958
+ }
959
+
960
+ file_put_contents($fileName,$con);
961
+ $data = $con;
962
+
963
+ }
964
+
965
+ else
966
+ {
967
+ $content = explode('?>', $file);
968
+ $file = $content[0];
969
+ $file .= PHP_EOL;
970
+ $file .= '$RequestsPMin='.$req.';'.PHP_EOL;
971
+ $file .='?>';
972
+ file_put_contents($fileName,$file);
973
+ $data = $file;
974
+ }
975
+
976
+
977
+
978
+ if($_POST['action']=='BlockIP')
979
+ {
980
+ update_option('actionRateL',1);
981
+
982
+ $file = $data;
983
+ if(strpos($file, 'actionRateL')!=false)
984
+ {
985
+ $content = explode(PHP_EOL, $file);
986
+ $con = '';
987
+ foreach ($content as $line => $lineV) {
988
+ if(strpos($lineV, 'actionRateL')!=false)
989
+ {
990
+ $con.='$actionRateL="BlockIP";'.PHP_EOL;
991
+ }
992
+ else
993
+ {
994
+ $con .= $lineV.PHP_EOL;
995
+ }
996
+ }
997
+ file_put_contents($fileName,$con);
998
+ }
999
+ else
1000
+ {
1001
+ $content = explode('?>', $file);
1002
+ $file = $content[0];
1003
+ $file .= PHP_EOL;
1004
+ $file .= '$actionRateL="BlockIP";'.PHP_EOL;
1005
+ $file .='?>';
1006
+ file_put_contents($fileName,$file);
1007
+ $file = $data;
1008
+ }
1009
+ }
1010
+ elseif($_POST['action']=='ThrottleIP')
1011
+ {
1012
+ $file = $data;
1013
+ update_option('actionRateL',0);
1014
+ if(strpos($file, 'actionRateL')!=false)
1015
+ {
1016
+ $content = explode(PHP_EOL, $file);
1017
+ $con = '';
1018
+ foreach ($content as $line => $lineV) {
1019
+ if(strpos($lineV, 'actionRateL')!=false)
1020
+ {
1021
+ $con.='$actionRateL="ThrottleIP";'.PHP_EOL;
1022
+ }
1023
+ else
1024
+ {
1025
+ $con .= $lineV.PHP_EOL;
1026
+ }
1027
+ }
1028
+ file_put_contents($fileName,$con);
1029
+ }
1030
+ else
1031
+ {
1032
+ $content = explode('?>', $file);
1033
+ $file = $content[0];
1034
+ $file .= PHP_EOL;
1035
+ $file .= '$actionRateL="ThrottleIP";'.PHP_EOL;
1036
+ $file .='?>';
1037
+ file_put_contents($fileName,$file);
1038
+ }
1039
+ }
1040
+
1041
+ }
1042
+
1043
+ }
1044
+
1045
+ }
1046
+
1047
+ }
1048
+ private function disableRL()
1049
+ {
1050
+ update_option('Rate_limiting',0);
1051
+
1052
+ $dir_name = dirname(__FILE__);
1053
+ $dir_name1 = explode('wp-content', $dir_name);
1054
+ $dir_name = $dir_name1[0];
1055
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
1056
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
1057
+ $file = file_get_contents($fileName);
1058
+
1059
+ if(strpos($file, 'RateLimiting')!=false)
1060
+ {
1061
+ $file = str_replace('$RateLimiting=1;', '$RateLimiting=0;', $file);
1062
+ file_put_contents($fileName,$file);
1063
+ }
1064
+ else
1065
+ {
1066
+ $content = explode('?>', $file);
1067
+ $file = $content[0];
1068
+ $file .= PHP_EOL;
1069
+ $file .= '$RateLimiting=0;'.PHP_EOL;
1070
+ $file .='?>';
1071
+ file_put_contents($fileName,$file);
1072
+ }
1073
+
1074
+ }
1075
+ private function backupHtaccess()
1076
+ {
1077
+ if(isset($_POST['htaccessWAF']))
1078
+ {
1079
+ if($_POST['htaccessWAF']=='on')
1080
+ {
1081
+ $dir_name = dirname(__FILE__);
1082
+ $dirN = $dir_name;
1083
+ $dirN = str_replace('\\', '/', $dirN);
1084
+ $dir_name1 = explode('wp-content', $dir_name);
1085
+ $dir_name = $dir_name1[0];
1086
+ $dir_name1 = str_replace('\\', '/', $dir_name1[0]);
1087
+ $dir_name =$dir_name1.'.htaccess';
1088
+ $file = file_get_contents($dir_name);
1089
+ $dir_backup = $dir_name1.'htaccess';
1090
+ $handle = fopen($dir_backup, 'c+');
1091
+ fwrite($handle,$file);
1092
+ }
1093
+ }
1094
+ }
1095
+ private function limitAttack()
1096
+ {
1097
+ if(isset($_POST['limitAttack']))
1098
+ {
1099
+ $value = sanitize_text_field($_POST['limitAttack']);
1100
+ if($value>1)
1101
+ {
1102
+ update_option('limitAttack',$value);
1103
+ echo "limitSaved";
1104
+ exit;
1105
+ }
1106
+ else
1107
+ {
1108
+ echo "limitIsLT1";
1109
+ exit;
1110
+ }
1111
+
1112
+ }
1113
+ }
1114
+
1115
+
1116
+
1117
+ function wpns_captcha_settings(){
1118
+ $nonce = $_POST['nonce'];
1119
+ if ( ! wp_verify_nonce( $nonce, 'wpns-captcha' ) ){
1120
+ wp_send_json('ERROR');
1121
+ return;
1122
+ }
1123
+ $site_key = sanitize_text_field($_POST['site_key']);
1124
+ $secret_key = sanitize_text_field($_POST['secret_key']);
1125
+ $enable_captcha = $_POST['enable_captcha'];
1126
+ if($enable_captcha == 'true'){$enable_captcha = "on";}else if($enable_captcha == 'false') {$enable_captcha = "";}
1127
+ $login_form_captcha = $_POST['login_form'];
1128
+ if($login_form_captcha == 'true'){$login_form_captcha = "on";}else if($login_form_captcha == 'false') {$login_form_captcha = "";}
1129
+ $reg_form_captcha = $_POST['registeration_form'];
1130
+ if($reg_form_captcha == 'true'){$reg_form_captcha = "on";}else if($reg_form_captcha == 'false') {$reg_form_captcha = "";}
1131
+
1132
+ if(($site_key == "" || $secret_key == "")){
1133
+ wp_send_json('empty');
1134
+ return;
1135
+ }
1136
+
1137
+ update_option( 'mo_wpns_recaptcha_site_key' , $site_key );
1138
+ update_option( 'mo_wpns_recaptcha_secret_key' , $secret_key );
1139
+ update_option( 'mo_wpns_activate_recaptcha' , $enable_captcha );
1140
+
1141
+ if($enable_captcha == "on"){
1142
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , $login_form_captcha );
1143
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', $login_form_captcha );
1144
+ update_option('mo_wpns_activate_recaptcha_for_registration', $reg_form_captcha );
1145
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration',$reg_form_captcha );
1146
+ wp_send_json('true');
1147
+ }
1148
+ else if($enable_captcha == ""){
1149
+ update_option( 'mo_wpns_activate_recaptcha_for_login' , '' );
1150
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_login', '' );
1151
+ update_option('mo_wpns_activate_recaptcha_for_registration', '' );
1152
+ update_option( 'mo_wpns_activate_recaptcha_for_woocommerce_registration','' );
1153
+ wp_send_json('false');
1154
+ }
1155
+
1156
+ }
1157
+
1158
+ function wpns_strong_password_settings(){
1159
+ $nonce = $_POST['nonce'];
1160
+ if ( ! wp_verify_nonce( $nonce, 'wpns-strn-pass' ) ){
1161
+ wp_send_json('ERROR');
1162
+ return;
1163
+ }
1164
+ $enable_strong_pass = $_POST['enable_strong_pass'];
1165
+ if($enable_strong_pass == 'true'){$enable_strong_pass = 1;}else if($enable_strong_pass == 'false') {$enable_strong_pass = 0;}
1166
+ $strong_pass_accounts = $_POST['accounts_strong_pass'];
1167
+ update_option('mo2f_enforce_strong_passswords_for_accounts',$strong_pass_accounts);
1168
+ update_option('mo2f_enforce_strong_passswords' , $enable_strong_pass);
1169
+ if($enable_strong_pass){
1170
+ update_option('mo_wpns_enable_rename_login_url',"");
1171
+ wp_send_json('true');
1172
+ }
1173
+ else{
1174
+ wp_send_json('false');
1175
+ }
1176
+ }
1177
+
1178
+ }
1179
+ new wpns_ajax;
1180
+
1181
+ ?>
database/database_functions.php CHANGED
@@ -1,263 +1,532 @@
1
  <?php
2
 
3
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
4
-
5
- class Mo2fDB {
6
- private $userDetailsTable;
7
- private $userLoginInfoTable;
8
-
9
- function __construct() {
10
- global $wpdb;
11
- $this->userDetailsTable = $wpdb->prefix . 'mo2f_user_details';
12
- $this->userLoginInfoTable = $wpdb->prefix . 'mo2f_user_login_info';
13
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- function mo_plugin_activate() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- global $wpdb;
19
- if ( ! get_option( 'mo2f_dbversion' ) ) {
20
- update_option( 'mo2f_dbversion', 143 );
21
- $this->generate_tables();
22
- } else {
23
- $current_db_version = get_option( 'mo2f_dbversion' );
24
- if ( $current_db_version < 143 ) {
25
- update_option( 'mo2f_dbversion', 143 );
26
- $this->generate_tables();
27
  }
28
- //update the tables based on DB_VERSION.
29
- }
30
- }
31
-
32
- function generate_tables() {
33
- global $wpdb;
34
-
35
- $tableName = $this->userDetailsTable;
36
-
37
- if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
38
-
39
- $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
40
- `user_id` bigint NOT NULL,
41
- `mo2f_OTPOverSMS_config_status` tinyint,
42
- `mo2f_miniOrangePushNotification_config_status` tinyint,
43
- `mo2f_miniOrangeQRCodeAuthentication_config_status` tinyint,
44
- `mo2f_miniOrangeSoftToken_config_status` tinyint,
45
- `mo2f_AuthyAuthenticator_config_status` tinyint,
46
- `mo2f_EmailVerification_config_status` tinyint,
47
- `mo2f_SecurityQuestions_config_status` tinyint,
48
- `mo2f_GoogleAuthenticator_config_status` tinyint,
49
- `mobile_registration_status` tinyint,
50
- `mo2f_2factor_enable_2fa_byusers` tinyint DEFAULT 1,
51
- `mo2f_configured_2FA_method` mediumtext NOT NULL ,
52
- `mo2f_user_phone` mediumtext NOT NULL ,
53
- `mo2f_user_email` mediumtext NOT NULL,
54
- `user_registration_with_miniorange` mediumtext NOT NULL,
55
- `mo_2factor_user_registration_status` mediumtext NOT NULL,
56
- UNIQUE KEY user_id (user_id) );";
57
-
58
- dbDelta( $sql );
59
- }
60
-
61
- $tableName = $this->userLoginInfoTable;
62
-
63
- if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
64
-
65
- $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
66
- `session_id` mediumtext NOT NULL,
67
- `mo2f_login_message` mediumtext NOT NULL ,
68
- `mo2f_current_user_id` tinyint NOT NULL ,
69
- `mo2f_1stfactor_status` mediumtext NOT NULL ,
70
- `mo_2factor_login_status` mediumtext NOT NULL ,
71
- `mo2f_transactionId` mediumtext NOT NULL ,
72
- `mo_2_factor_kba_questions` longtext NOT NULL ,
73
- `mo2f_rba_status` longtext NOT NULL ,
74
- `ts_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
75
- PRIMARY KEY (`session_id`(100)));";
76
 
77
- dbDelta( $sql );
78
- }
79
-
80
- $check_if_column_exists = $this->check_if_column_exists( "user_login_info_table", "mo_2factor_login_status" );
81
 
82
- if ( ! $check_if_column_exists ) {
83
- $query = "ALTER TABLE `$tableName` ADD COLUMN `mo_2factor_login_status` mediumtext NOT NULL";
84
- $this->execute_add_column( $query );
 
 
 
 
85
 
86
- }
87
 
88
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
- function database_table_issue(){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
 
92
- global $wpdb;
93
- $tableName = $this->userLoginInfoTable;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
 
95
- if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
96
-
97
- $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
98
- `session_id` mediumtext NOT NULL,
99
- `mo2f_login_message` mediumtext NOT NULL ,
100
- `mo2f_current_user_id` tinyint NOT NULL ,
101
- `mo2f_1stfactor_status` mediumtext NOT NULL ,
102
- `mo_2factor_login_status` mediumtext NOT NULL ,
103
- `mo2f_transactionId` mediumtext NOT NULL ,
104
- `mo_2_factor_kba_questions` longtext NOT NULL ,
105
- `mo2f_rba_status` longtext NOT NULL ,
106
- `ts_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
107
- PRIMARY KEY (`session_id`(100)));";
108
- dbDelta( $sql );
109
- }
 
 
 
 
 
 
 
 
 
 
 
110
 
111
- $check_if_column_exists = $this->check_if_column_exists( "user_login_info_table", "mo_2factor_login_status" );
 
 
 
112
 
113
- if ( ! $check_if_column_exists ) {
114
- $query = "ALTER TABLE `$tableName` ADD COLUMN `mo_2factor_login_status` mediumtext NOT NULL";
115
- $this->execute_add_column( $query );
116
 
117
- }
 
 
 
 
118
 
119
- }
 
 
 
 
120
 
121
 
122
- function insert_user( $user_id ) {
123
- global $wpdb;
124
- $sql = "INSERT INTO $this->userDetailsTable (user_id) VALUES($user_id) ON DUPLICATE KEY UPDATE user_id=$user_id";
125
- $wpdb->query( $sql );
126
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
- function drop_table( $table_name ) {
129
- global $wpdb;
130
- $sql = "DROP TABLE $table_name";
131
- $wpdb->query( $sql );
132
- }
 
 
 
 
 
 
 
 
 
133
 
 
 
 
 
 
 
 
 
 
134
 
135
- function get_user_detail( $column_name, $user_id ) {
136
- global $wpdb;
137
- $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userDetailsTable . " WHERE user_id = " . $user_id . ";" );
138
- $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
 
139
 
140
- return $value == '' ? '' : $value[ $column_name ];
141
- }
 
 
 
 
 
 
 
 
 
142
 
143
- function delete_user_details( $user_id ) {
144
- global $wpdb;
145
- $wpdb->query(
146
- "DELETE FROM " . $this->userDetailsTable . "
147
- WHERE user_id = " . $user_id
148
- );
149
 
150
- return;
151
- }
 
 
 
 
 
 
 
152
 
 
 
 
 
 
153
 
154
- function check_if_table_exists( ) {
155
- global $wpdb;
156
- $does_table_exist= $wpdb->query(
157
- "SHOW TABLES LIKE '" . $this->userDetailsTable . "';"
158
- );
 
159
 
160
- return $does_table_exist;
161
- }
 
 
 
 
 
 
 
 
 
 
 
 
162
 
163
- function check_if_user_column_exists($user_id){
164
- global $wpdb;
165
- $value = $wpdb->query(
166
- "SELECT * FROM " . $this->userDetailsTable . "
167
- WHERE user_id = " . $user_id
168
- );
 
 
 
 
 
 
 
 
169
 
170
- return $value;
 
 
 
 
171
 
172
- }
 
 
 
 
173
 
174
- function check_if_column_exists( $table_type, $column_name ){
175
-
176
- if($table_type == "user_login_info_table")
177
- $table = $this->userLoginInfoTable;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
 
 
 
 
 
 
179
  global $wpdb;
180
- $sql="SHOW COLUMNS FROM " . $table . "
181
- LIKE '" . $column_name . "'";
182
- $value = $wpdb->query($sql);
183
-
184
- return $value;
185
 
 
 
 
 
 
186
  }
187
 
188
- function update_user_details( $user_id, $update ) {
189
- global $wpdb;
190
- $count = count( $update );
191
- $sql = "UPDATE " . $this->userDetailsTable . " SET ";
192
- $i = 1;
193
- foreach ( $update as $key => $value ) {
 
 
 
194
 
195
- $sql .= $key . "='" . $value . "'";
196
- if ( $i < $count ) {
197
- $sql .= ' , ';
 
 
 
 
 
 
 
 
 
 
 
 
198
  }
199
- $i ++;
200
- }
201
- $sql .= " WHERE user_id=" . $user_id . ";";
202
- $wpdb->query( $sql );
203
-
204
- return;
205
-
206
- }
207
-
208
- function insert_user_login_session( $session_id ) {
209
- global $wpdb;
210
- $sql = "INSERT INTO $this->userLoginInfoTable (session_id) VALUES('$session_id') ON DUPLICATE KEY UPDATE session_id='$session_id'";
211
-
212
- $wpdb->query( $sql );
213
- $sql = "DELETE FROM $this->userLoginInfoTable WHERE ts_created < DATE_ADD(NOW(),INTERVAL - 2 MINUTE);";
214
- $wpdb->query( $sql );
215
- }
216
-
217
- function save_user_login_details( $session_id, $user_values ) {
218
- global $wpdb;
219
- $count = count( $user_values );
220
- $sql = "UPDATE " . $this->userLoginInfoTable . " SET ";
221
- $i = 1;
222
- foreach ( $user_values as $key => $value ) {
223
-
224
- $sql .= $key . "='" . $value . "'";
225
- if ( $i < $count ) {
226
- $sql .= ' , ';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  }
228
- $i ++;
229
- }
230
- $sql .= " WHERE session_id='" . $session_id . "';";
231
- $wpdb->query( $sql );
232
-
233
- return;
234
-
235
- }
236
-
237
- function execute_add_column ( $query ){
238
- global $wpdb;
239
- $wpdb->query( $query );
240
-
241
- return;
242
- }
243
-
244
- function get_user_login_details( $column_name, $session_id ) {
245
- global $wpdb;
246
- $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userLoginInfoTable . " WHERE session_id = '" . $session_id . "';" );
247
- $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
248
-
249
- return $value == '' ? '' : $value[ $column_name ];
250
- }
251
-
252
- function delete_user_login_sessions($session_id ) {
253
- global $wpdb;
254
- $wpdb->query(
255
- "DELETE FROM " . $this->userLoginInfoTable . "
256
- WHERE session_id='$session_id';"
257
- );
258
-
259
- return;
260
- }
261
-
262
-
263
- }
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
+
31
+ }
32
 
33
+ function mo_plugin_activate()
34
+ {
35
+ global $wpdb;
36
+ if(!get_option('mo_wpns_dbversion')||get_option('mo_wpns_dbversion')<142)
37
+ {
38
+ update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
39
+ $this->generate_tables();
40
+ }
41
+ else
42
+ {
43
+ $current_db_version = get_option('mo_wpns_dbversion');
44
+ if($current_db_version < MoWpnsConstants::DB_VERSION)
45
+ update_option('mo_wpns_dbversion', MoWpnsConstants::DB_VERSION );
46
+ }
47
+ }
48
 
49
+ function generate_tables()
50
+ {
51
+ global $wpdb;
52
+
53
+ $tableName = $this->transactionTable;
54
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
55
+ {
56
+ $sql = "CREATE TABLE " . $tableName . " (
57
+ `id` bigint NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL ,
58
+ `type` mediumtext NOT NULL , `url` mediumtext NOT NULL , `status` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
59
+ dbDelta($sql);
60
+ }
61
 
62
+ $tableName = $this->blockedIPsTable;
63
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
64
+ {
65
+ $sql = "CREATE TABLE " . $tableName . " (
66
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `reason` mediumtext, `blocked_for_time` int,
67
+ `created_timestamp` int, UNIQUE KEY id (id) );";
68
+ dbDelta($sql);
 
 
69
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
 
 
 
 
71
 
72
+ $tableName = $this->whitelistIPsTable;
73
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
74
+ {
75
+ $sql = "CREATE TABLE " . $tableName . " (
76
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
77
+ dbDelta($sql);
78
+ }
79
 
 
80
 
81
+ $tableName = $this->emailAuditTable;
82
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
83
+ {
84
+ $sql = "CREATE TABLE " . $tableName . " (
85
+ `id` int NOT NULL AUTO_INCREMENT, `ip_address` mediumtext NOT NULL , `username` mediumtext NOT NULL, `reason` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
86
+ dbDelta($sql);
87
+ }
88
+ $tableName = $this->IPrateDetails;
89
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
90
+ {
91
+ $sql = "CREATE TABLE " . $tableName . " (
92
+ ip varchar(20) , time bigint );";
93
+ dbDelta($sql);
94
+ }
95
 
96
+ $tableName = $this->attackLogs;
97
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
98
+ {
99
+ $sql = "create table ". $tableName ." (
100
+ ip varchar(20),
101
+ type varchar(20),
102
+ time bigint,
103
+ input mediumtext );";
104
+ //dbDelta($sql);
105
+ $results = $wpdb->get_results($sql);
106
+
107
+ }
108
+ $tableName = $this->malwarereportTable;
109
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
110
+ {
111
+ $sql = "CREATE TABLE " . $tableName . " (
112
+ `id` bigint NOT NULL AUTO_INCREMENT, `scan_mode` mediumtext NOT NULL, `scanned_folders` mediumtext NOT NULL, `scanned_files` int, `start_timestamp` int, `completed_timestamp` int, UNIQUE KEY id (id) );";
113
+ dbDelta($sql);
114
+ }
115
 
116
+ $tableName = $this->scanreportdetails;
117
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
118
+ {
119
+ $sql = "CREATE TABLE " . $tableName . " (
120
+ `id` bigint NOT NULL AUTO_INCREMENT, `report_id` bigint, `filename` mediumtext NOT NULL, `report` mediumtext NOT NULL , `created_timestamp` int, UNIQUE KEY id (id) );";
121
+ dbDelta($sql);
122
+ }
123
+
124
+ $tableName = $this->skipfiles;
125
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
126
+ {
127
+ $sql = "CREATE TABLE " . $tableName . " (
128
+ `id` bigint NOT NULL AUTO_INCREMENT, `path` mediumtext NOT NULL , `signature` mediumtext, `created_timestamp` int, UNIQUE KEY id (id) );";
129
+ dbDelta($sql);
130
+ }
131
+
132
+ $tableName = $this->hashfile;
133
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName)
134
+ {
135
+ $sql = "CREATE TABLE " . $tableName . " (
136
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,`file name` varchar(500) NOT NULL,`file hash` mediumtext NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `file name` (`file name`), UNIQUE KEY `id_2`(`id`));";
137
+ dbDelta($sql);
138
+ }
139
+ }
140
 
141
+ function get_ip_blocked_count($ipAddress)
142
+ {
143
+ global $wpdb;
144
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE ip_address = '".$ipAddress."'" );
145
+ }
146
+ function get_total_blocked_ips()
147
+ {
148
+ global $wpdb;
149
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
150
+ }
151
+ function get_total_manual_blocked_ips()
152
+ {
153
+ global $wpdb;
154
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
155
+ }
156
+ function get_total_blocked_ips_waf()
157
+ {
158
+ global $wpdb;
159
+ $totalIPBlocked = $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable);
160
+ return $totalIPBlocked - $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->blockedIPsTable." WHERE reason = 'Blocked by Admin';");
161
+ }
162
+ function get_blocked_attack_count($attack)
163
+ {
164
+ global $wpdb;
165
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->attackList." WHERE type = '".$attack."'" );
166
+ }
167
 
168
+ function get_count_of_blocked_ips(){
169
+ global $wpdb;
170
+ return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->blockedIPsTable."");
171
+ }
172
 
 
 
 
173
 
174
+ function get_blocked_ip($entryid)
175
+ {
176
+ global $wpdb;
177
+ return $wpdb->get_results( "SELECT ip_address FROM ".$this->blockedIPsTable." WHERE id=".$entryid );
178
+ }
179
 
180
+ function get_blocked_ip_list()
181
+ {
182
+ global $wpdb;
183
+ return $wpdb->get_results("SELECT id, reason, ip_address, created_timestamp FROM ".$this->blockedIPsTable);
184
+ }
185
 
186
 
187
+ function get_blocked_sqli_list()
188
+ {
189
+ global $wpdb;
190
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='SQL attack'");
191
+ }
192
+ function get_blocked_rfi_list()
193
+ {
194
+ global $wpdb;
195
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RFI attack'");
196
+ }
197
+ function get_blocked_lfi_list()
198
+ {
199
+ global $wpdb;
200
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='LFI attack'");
201
+ }
202
+ function get_blocked_rce_list()
203
+ {
204
+ global $wpdb;
205
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='RCE attack'");
206
+ }
207
+ function get_blocked_xss_list()
208
+ {
209
+ global $wpdb;
210
+ return $wpdb->get_results("SELECT ip, type, time, input FROM ".$this->attackList."WHERE type='XSS attack'");
211
+ }
212
 
213
+ function insert_blocked_ip($ipAddress,$reason,$blocked_for_time)
214
+ {
215
+ global $wpdb;
216
+ $wpdb->insert(
217
+ $this->blockedIPsTable,
218
+ array(
219
+ 'ip_address' => $ipAddress,
220
+ 'reason' => $reason,
221
+ 'blocked_for_time' => $blocked_for_time,
222
+ 'created_timestamp' => current_time( 'timestamp' )
223
+ )
224
+ );
225
+ return;
226
+ }
227
 
228
+ function delete_blocked_ip($entryid)
229
+ {
230
+ global $wpdb;
231
+ $wpdb->query(
232
+ "DELETE FROM ".$this->blockedIPsTable."
233
+ WHERE id = ".$entryid
234
+ );
235
+ return;
236
+ }
237
 
238
+ function get_whitelisted_ip_count($ipAddress)
239
+ {
240
+ global $wpdb;
241
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->whitelistIPsTable." WHERE ip_address = '".$ipAddress."'" );
242
+ }
243
 
244
+ function insert_whitelisted_ip($ipAddress)
245
+ {
246
+ global $wpdb;
247
+ $wpdb->insert(
248
+ $this->whitelistIPsTable,
249
+ array(
250
+ 'ip_address' => $ipAddress,
251
+ 'created_timestamp' => current_time( 'timestamp' )
252
+ )
253
+ );
254
+ }
255
 
256
+ function get_number_of_whitelisted_ips(){
257
+ global $wpdb;
258
+ return $wpdb->get_var("SELECT COUNT(*) FROM ".$this->whitelistIPsTable."");
259
+ }
 
 
260
 
261
+ function delete_whitelisted_ip($entryid)
262
+ {
263
+ global $wpdb;
264
+ $wpdb->query(
265
+ "DELETE FROM ".$this->whitelistIPsTable."
266
+ WHERE id = ".$entryid
267
+ );
268
+ return;
269
+ }
270
 
271
+ function get_whitelisted_ips_list()
272
+ {
273
+ global $wpdb;
274
+ return $wpdb->get_results( "SELECT id, ip_address, created_timestamp FROM ".$this->whitelistIPsTable );
275
+ }
276
 
277
+ function get_email_audit_count($ipAddress,$username)
278
+ {
279
+ global $wpdb;
280
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->emailAuditTable." WHERE ip_address = '".$ipAddress."' AND
281
+ username='".$username."'" );
282
+ }
283
 
284
+ function insert_email_audit($ipAddress,$username,$reason)
285
+ {
286
+ global $wpdb;
287
+ $wpdb->insert(
288
+ $this->emailAuditTable,
289
+ array(
290
+ 'ip_address' => $ipAddress,
291
+ 'username' => $username,
292
+ 'reason' => $reason,
293
+ 'created_timestamp' => current_time( 'timestamp' )
294
+ )
295
+ );
296
+ return;
297
+ }
298
 
299
+ function insert_transaction_audit($ipAddress,$username,$type,$status,$url=null)
300
+ {
301
+ global $wpdb;
302
+ $data = array(
303
+ 'ip_address' => $ipAddress,
304
+ 'username' => $username,
305
+ 'type' => $type,
306
+ 'status' => $status,
307
+ 'created_timestamp' => current_time( 'timestamp' )
308
+ );
309
+ $data['url'] = is_null($url) ? '' : $url;
310
+ $wpdb->insert( $this->transactionTable, $data);
311
+ return;
312
+ }
313
 
314
+ function get_transasction_list()
315
+ {
316
+ global $wpdb;
317
+ return $wpdb->get_results( "SELECT ip_address, username, type, status, created_timestamp FROM ".$this->transactionTable." order by id desc limit 5000" );
318
+ }
319
 
320
+ function get_login_transaction_report()
321
+ {
322
+ global $wpdb;
323
+ return $wpdb->get_results( "SELECT ip_address, username, status, created_timestamp FROM ".$this->transactionTable." WHERE type='User Login' order by id desc limit 5000" );
324
+ }
325
 
326
+ function get_error_transaction_report()
327
+ {
328
+ global $wpdb;
329
+ 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" );
330
+ }
331
+
332
+ function update_transaction_table($where,$update)
333
+ {
334
+ global $wpdb;
335
+
336
+ $sql = "UPDATE ".$this->transactionTable." SET ";
337
+ $i = 0;
338
+ foreach($update as $key=>$value)
339
+ {
340
+ if($i%2!=0)
341
+ $sql .= ' , ';
342
+ $sql .= $key."='".$value."'";
343
+ $i++;
344
+ }
345
+ $sql .= " WHERE ";
346
+ $i = 0;
347
+ foreach($where as $key=>$value)
348
+ {
349
+ if($i%2!=0)
350
+ $sql .= ' AND ';
351
+ $sql .= $key."='".$value."'";
352
+ $i++;
353
+ }
354
 
355
+ $wpdb->query($sql);
356
+ return;
357
+ }
358
+
359
+ function get_count_of_attacks_blocked(){
360
  global $wpdb;
361
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE status = '".MoWpnsConstants::FAILED."' OR status = '".MoWpnsConstants::PAST_FAILED."'" );
362
+ }
 
 
 
363
 
364
+ function get_failed_transaction_count($ipAddress)
365
+ {
366
+ global $wpdb;
367
+ return $wpdb->get_var( "SELECT COUNT(*) FROM ".$this->transactionTable." WHERE ip_address = '".$ipAddress."'
368
+ AND status = '".MoWpnsConstants::FAILED."'" );
369
  }
370
 
371
+ function delete_transaction($ipAddress)
372
+ {
373
+ global $wpdb;
374
+ $wpdb->query(
375
+ "DELETE FROM ".$this->transactionTable."
376
+ WHERE ip_address = '".$ipAddress."' AND status='".MoWpnsConstants::FAILED."'"
377
+ );
378
+ return;
379
+ }
380
 
381
+ function create_scan_report($folderNames, $scan_type){
382
+ global $wpdb;
383
+ $wpdb->insert(
384
+ $this->malwarereportTable,
385
+ array(
386
+ 'scan_mode' => $scan_type,
387
+ 'scanned_folders' => $folderNames,
388
+ 'scanned_files' => 0,
389
+ 'start_timestamp' => current_time('timestamp')
390
+ )
391
+ );
392
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id DESC LIMIT 1");
393
+ if($result){
394
+ $record = $result[0];
395
+ return $record->id;
396
  }
397
+ }
398
+
399
+ function add_report_details($reportid, $filename, $report){
400
+ global $wpdb;
401
+ $wpdb->insert(
402
+ $this->scanreportdetails,
403
+ array(
404
+ 'report_id' => $reportid,
405
+ 'filename' => $filename,
406
+ 'report' => serialize($report),
407
+ 'created_timestamp' => current_time('timestamp')
408
+ )
409
+ );
410
+ }
411
+
412
+ function scan_report_complete($recordId,$no_of_scanned_files){
413
+ global $wpdb;
414
+ $wpdb->query(
415
+ "UPDATE ".$this->malwarereportTable." set completed_timestamp = ".current_time('timestamp').", scanned_files=".$no_of_scanned_files." WHERE id = ".$recordId
416
+ );
417
+ }
418
+
419
+ function count_files(){
420
+ global $wpdb;
421
+ $sql= $wpdb->get_results("SELECT SUM(`scanned_files`) AS scan_count FROM ".$this->malwarereportTable);
422
+ return $sql[0]->scan_count;
423
+ }
424
+
425
+ function count_malicious_files(){
426
+ global $wpdb;
427
+ $sql= $wpdb->get_results("SELECT COUNT(*) AS total_mal FROM ".$this->scanreportdetails);
428
+ return $sql[0]->total_mal;
429
+ }
430
+
431
+ function count_files_last_scan($reportid){
432
+ global $wpdb;
433
+ $sql= $wpdb->get_results('SELECT * FROM '.$this->malwarereportTable.' WHERE `id`="'.$reportid.'"');
434
+ return $sql[0]->scanned_files;
435
+ }
436
+
437
+ function count_malicious_last_scan($reportid){
438
+ global $wpdb;
439
+ $sql= $wpdb->get_results('SELECT COUNT(*) AS mal_file FROM '.$this->scanreportdetails.' WHERE `report_id`="'.$reportid.'"');
440
+ return $sql[0]->mal_file;
441
+ }
442
+
443
+ function check_hash($hash_of_file){
444
+ global $wpdb;
445
+ $sql= 'SELECT * FROM '.$this->hashfile.' WHERE `file hash`="'.$hash_of_file.'"';
446
+ $result=$wpdb->query( $sql );
447
+ return $result;
448
+ }
449
+
450
+ function insert_hash($source_file_path,$hash_of_file){
451
+ global $wpdb;
452
+ $query= 'INSERT INTO '.$this->hashfile.'(`file name`,`file hash`) VALUES("'.$source_file_path.'", "'.$hash_of_file.'") ON DUPLICATE KEY UPDATE `file hash`="'.$hash_of_file.'"';
453
+ $res=$wpdb->query( $query );
454
+ }
455
+
456
+ function get_last_id(){
457
+ global $wpdb;
458
+ $result= $wpdb->get_results("SELECT MAX(Id) AS max FROM ".$this->malwarereportTable);
459
+ return $result;
460
+ }
461
+
462
+ function get_report_with_id($reportid){
463
+ global $wpdb;
464
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." where id=".$reportid );
465
+ return $result;
466
+ }
467
+
468
+ function delete_report($reportid){
469
+ global $wpdb;
470
+ $wpdb->query(
471
+ "DELETE FROM ".$this->malwarereportTable." WHERE id = ".$reportid
472
+ );
473
+ }
474
+
475
+ function get_report(){
476
+ global $wpdb;
477
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->malwarereportTable." order by id desc" );
478
+ return $result;
479
+ }
480
+
481
+ function get_vulnerable_files_count_for_reportid($reportid){
482
+ global $wpdb;
483
+ $result = $wpdb->get_results( "SELECT count(*) as count FROM ".$this->scanreportdetails." where report_id=".$reportid );
484
+ return $result;
485
+ }
486
+
487
+ function ignorefile($filename){
488
+ $signature = md5_file($filename);
489
+ global $wpdb;
490
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where path = '".$filename."'" );
491
+ if($result){
492
+ $wpdb->query(
493
+ "UPDATE ".$this->skipfiles." SET signature = '".$signature."' WHERE path = '".$filename."'"
494
+ );
495
+ } else {
496
+ $wpdb->insert(
497
+ $this->skipfiles,
498
+ array(
499
+ 'path' => $filename,
500
+ 'signature' => $signature,
501
+ 'created_timestamp' => current_time('timestamp')
502
+ )
503
+ );
504
+ }
505
+ }
506
+
507
+ function ignorechangedfile($recordId){
508
+ global $wpdb;
509
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles." where id = ".$recordId );
510
+ if($result){
511
+ $record = $result[0];
512
+ $signature = md5_file($record->path);
513
+ $wpdb->query(
514
+ "UPDATE ".$this->skipfiles." set signature = '".$signature."' WHERE id = ".$recordId
515
+ );
516
  }
517
+ }
518
+
519
+ function getlistofignorefiles(){
520
+ global $wpdb;
521
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->skipfiles."" );
522
+ return $result;
523
+ }
524
+
525
+ function get_detail_report_with_id($reportid){
526
+ global $wpdb;
527
+ $result = $wpdb->get_results( "SELECT * FROM ".$this->scanreportdetails." where report_id=".$reportid );
528
+ return $result;
529
+ }
530
+
531
+
532
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
database/database_functions_2fa.php ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
4
+
5
+ class Mo2fDB {
6
+ private $userDetailsTable;
7
+ private $userLoginInfoTable;
8
+
9
+ function __construct() {
10
+ global $wpdb;
11
+ $this->userDetailsTable = $wpdb->prefix . 'mo2f_user_details';
12
+ $this->userLoginInfoTable = $wpdb->prefix . 'mo2f_user_login_info';
13
+ }
14
+
15
+ function mo_plugin_activate() {
16
+ global $wpdb;
17
+ if ( ! get_option( 'mo2f_dbversion' ) ) {
18
+ update_option( 'mo2f_dbversion', 143 );
19
+ $this->generate_tables();
20
+ } else {
21
+ $current_db_version = get_option( 'mo2f_dbversion' );
22
+ if ( $current_db_version < 143 ) {
23
+ update_option( 'mo2f_dbversion', 143 );
24
+ $this->generate_tables();
25
+ }
26
+ //update the tables based on DB_VERSION.
27
+ }
28
+ }
29
+
30
+ function generate_tables() {
31
+ global $wpdb;
32
+
33
+ $tableName = $this->userDetailsTable;
34
+
35
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
36
+
37
+ $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
38
+ `user_id` bigint NOT NULL,
39
+ `mo2f_OTPOverSMS_config_status` tinyint,
40
+ `mo2f_miniOrangePushNotification_config_status` tinyint,
41
+ `mo2f_miniOrangeQRCodeAuthentication_config_status` tinyint,
42
+ `mo2f_miniOrangeSoftToken_config_status` tinyint,
43
+ `mo2f_AuthyAuthenticator_config_status` tinyint,
44
+ `mo2f_EmailVerification_config_status` tinyint,
45
+ `mo2f_SecurityQuestions_config_status` tinyint,
46
+ `mo2f_GoogleAuthenticator_config_status` tinyint,
47
+ `mobile_registration_status` tinyint,
48
+ `mo2f_2factor_enable_2fa_byusers` tinyint DEFAULT 1,
49
+ `mo2f_configured_2FA_method` mediumtext NOT NULL ,
50
+ `mo2f_user_phone` mediumtext NOT NULL ,
51
+ `mo2f_user_email` mediumtext NOT NULL,
52
+ `user_registration_with_miniorange` mediumtext NOT NULL,
53
+ `mo_2factor_user_registration_status` mediumtext NOT NULL,
54
+ UNIQUE KEY user_id (user_id) );";
55
+
56
+ dbDelta( $sql );
57
+ }
58
+
59
+ $tableName = $this->userLoginInfoTable;
60
+
61
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
62
+
63
+ $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
64
+ `session_id` mediumtext NOT NULL,
65
+ `mo2f_login_message` mediumtext NOT NULL ,
66
+ `mo2f_current_user_id` tinyint NOT NULL ,
67
+ `mo2f_1stfactor_status` mediumtext NOT NULL ,
68
+ `mo_2factor_login_status` mediumtext NOT NULL ,
69
+ `mo2f_transactionId` mediumtext NOT NULL ,
70
+ `mo_2_factor_kba_questions` longtext NOT NULL ,
71
+ `mo2f_rba_status` longtext NOT NULL ,
72
+ `ts_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
73
+ PRIMARY KEY (`session_id`(100)));";
74
+
75
+ dbDelta( $sql );
76
+ }
77
+
78
+ $check_if_column_exists = $this->check_if_column_exists( "user_login_info_table", "mo_2factor_login_status" );
79
+
80
+ if ( ! $check_if_column_exists ) {
81
+ $query = "ALTER TABLE `$tableName` ADD COLUMN `mo_2factor_login_status` mediumtext NOT NULL";
82
+ $this->execute_add_column( $query );
83
+
84
+ }
85
+
86
+ }
87
+ function get_current_user_email($id)
88
+ {
89
+ global $wpdb;
90
+ $sql = 'select user_email from wp_users where ID='.$id.';';
91
+ return $wpdb->get_var($sql);
92
+ }
93
+ function database_table_issue(){
94
+
95
+ global $wpdb;
96
+ $tableName = $this->userLoginInfoTable;
97
+
98
+ if($wpdb->get_var("show tables like '$tableName'") != $tableName) {
99
+
100
+ $sql = "CREATE TABLE IF NOT EXISTS " . $tableName . " (
101
+ `session_id` mediumtext NOT NULL,
102
+ `mo2f_login_message` mediumtext NOT NULL ,
103
+ `mo2f_current_user_id` tinyint NOT NULL ,
104
+ `mo2f_1stfactor_status` mediumtext NOT NULL ,
105
+ `mo_2factor_login_status` mediumtext NOT NULL ,
106
+ `mo2f_transactionId` mediumtext NOT NULL ,
107
+ `mo_2_factor_kba_questions` longtext NOT NULL ,
108
+ `mo2f_rba_status` longtext NOT NULL ,
109
+ `ts_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
110
+ PRIMARY KEY (`session_id`(100)));";
111
+ dbDelta( $sql );
112
+ }
113
+
114
+ $check_if_column_exists = $this->check_if_column_exists( "user_login_info_table", "mo_2factor_login_status" );
115
+
116
+ if ( ! $check_if_column_exists ) {
117
+ $query = "ALTER TABLE `$tableName` ADD COLUMN `mo_2factor_login_status` mediumtext NOT NULL";
118
+ $this->execute_add_column( $query );
119
+
120
+ }
121
+
122
+ }
123
+
124
+
125
+ function insert_user( $user_id ) {
126
+ global $wpdb;
127
+ $sql = "INSERT INTO $this->userDetailsTable (user_id) VALUES($user_id) ON DUPLICATE KEY UPDATE user_id=$user_id";
128
+ $wpdb->query( $sql );
129
+ }
130
+
131
+ function drop_table( $table_name ) {
132
+ global $wpdb;
133
+ $sql = "DROP TABLE $table_name";
134
+ $wpdb->query( $sql );
135
+ }
136
+
137
+
138
+ function get_user_detail( $column_name, $user_id ) {
139
+ global $wpdb;
140
+ $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userDetailsTable . " WHERE user_id = " . $user_id . ";" );
141
+ $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
142
+
143
+ return $value == '' ? '' : $value[ $column_name ];
144
+ }
145
+
146
+ function delete_user_details( $user_id ) {
147
+ global $wpdb;
148
+ $wpdb->query(
149
+ "DELETE FROM " . $this->userDetailsTable . "
150
+ WHERE user_id = " . $user_id
151
+ );
152
+
153
+ return;
154
+ }
155
+
156
+
157
+ function check_if_table_exists( ) {
158
+ global $wpdb;
159
+ $does_table_exist= $wpdb->query(
160
+ "SHOW TABLES LIKE '" . $this->userDetailsTable . "';"
161
+ );
162
+
163
+ return $does_table_exist;
164
+ }
165
+
166
+ function check_if_user_column_exists($user_id){
167
+ global $wpdb;
168
+ $value = $wpdb->query(
169
+ "SELECT * FROM " . $this->userDetailsTable . "
170
+ WHERE user_id = " . $user_id
171
+ );
172
+
173
+ return $value;
174
+
175
+ }
176
+
177
+ function check_if_column_exists( $table_type, $column_name ){
178
+
179
+ if($table_type == "user_login_info_table")
180
+ $table = $this->userLoginInfoTable;
181
+
182
+ global $wpdb;
183
+ $sql="SHOW COLUMNS FROM " . $table . "
184
+ LIKE '" . $column_name . "'";
185
+ $value = $wpdb->query($sql);
186
+
187
+ return $value;
188
+
189
+ }
190
+
191
+ function update_user_details( $user_id, $update ) {
192
+ global $wpdb;
193
+ $count = count( $update );
194
+ $sql = "UPDATE " . $this->userDetailsTable . " SET ";
195
+ $i = 1;
196
+ foreach ( $update as $key => $value ) {
197
+
198
+ $sql .= $key . "='" . $value . "'";
199
+ if ( $i < $count ) {
200
+ $sql .= ' , ';
201
+ }
202
+ $i ++;
203
+ }
204
+ $sql .= " WHERE user_id=" . $user_id . ";";
205
+ $wpdb->query( $sql );
206
+
207
+ return;
208
+
209
+ }
210
+
211
+ function insert_user_login_session( $session_id ) {
212
+ global $wpdb;
213
+ $sql = "INSERT INTO $this->userLoginInfoTable (session_id) VALUES('$session_id') ON DUPLICATE KEY UPDATE session_id='$session_id'";
214
+
215
+ $wpdb->query( $sql );
216
+ $sql = "DELETE FROM $this->userLoginInfoTable WHERE ts_created < DATE_ADD(NOW(),INTERVAL - 2 MINUTE);";
217
+ $wpdb->query( $sql );
218
+ }
219
+
220
+ function save_user_login_details( $session_id, $user_values ) {
221
+ global $wpdb;
222
+ $count = count( $user_values );
223
+ $sql = "UPDATE " . $this->userLoginInfoTable . " SET ";
224
+ $i = 1;
225
+ foreach ( $user_values as $key => $value ) {
226
+
227
+ $sql .= $key . "='" . $value . "'";
228
+ if ( $i < $count ) {
229
+ $sql .= ' , ';
230
+ }
231
+ $i ++;
232
+ }
233
+ $sql .= " WHERE session_id='" . $session_id . "';";
234
+ $wpdb->query( $sql );
235
+
236
+ return;
237
+
238
+ }
239
+
240
+ function execute_add_column ( $query ){
241
+ global $wpdb;
242
+ $wpdb->query( $query );
243
+
244
+ return;
245
+ }
246
+
247
+ function get_user_login_details( $column_name, $session_id ) {
248
+ global $wpdb;
249
+ $user_column_detail = $wpdb->get_results( "SELECT " . $column_name . " FROM " . $this->userLoginInfoTable . " WHERE session_id = '" . $session_id . "';" );
250
+ $value = empty( $user_column_detail ) ? '' : get_object_vars( $user_column_detail[0] );
251
+
252
+ return $value == '' ? '' : $value[ $column_name ];
253
+ }
254
+
255
+ function delete_user_login_sessions($session_id ) {
256
+ global $wpdb;
257
+ $wpdb->query(
258
+ "DELETE FROM " . $this->userLoginInfoTable . "
259
+ WHERE session_id='$session_id';"
260
+ );
261
+
262
+ return;
263
+ }
264
+
265
+ }
handler/WAF/database/mo-waf-db.php ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ global $dbcon,$prefix;
3
+ function log_attack($ipaddress,$value1,$value)
4
+ {
5
+ global $prefix,$dbcon;
6
+ $value = htmlspecialchars($value);
7
+ $query = 'insert into '.$prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
8
+ $results = mysqli_query($dbcon,$query);
9
+ $query = "select count(*) from ".$prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
10
+ $results = mysqli_query($dbcon,$query);
11
+ $rows = mysqli_fetch_array($results);
12
+ return $rows['count(*)'];
13
+ }
14
+
15
+ function setting_file()
16
+ {
17
+ global $prefix,$dbcon;
18
+ $dir_name = dirname(__FILE__);
19
+ $dir_name1 = explode('wp-content', $dir_name);
20
+ $dir_name = $dir_name1[0];
21
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
22
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
23
+ $missingFile = 0;
24
+ if(!file_exists($fileName))
25
+ {
26
+ $missingFile = 1;
27
+ }
28
+ if($missingFile==1)
29
+ {
30
+ $file = fopen($fileName, "a+");
31
+ $string = "<?php".PHP_EOL;
32
+
33
+ $sqlInjection = get_option_value("SQLInjection");
34
+ $string .= '$SQL='.$sqlInjection.';'.PHP_EOL;
35
+
36
+ $XSSAttack = get_option_value("XSSAttack");
37
+ $string .= '$XSS='.$XSSAttack.';'.PHP_EOL;
38
+
39
+ $RFIAttack = get_option_value("RFIAttack");
40
+ $string .= '$RFI='.$RFIAttack.';'.PHP_EOL;
41
+
42
+ $LFIAttack = get_option_value("LFIAttack");
43
+ $string .= '$LFI='.$LFIAttack.';'.PHP_EOL;
44
+
45
+ $RCEAttack = get_option_value("RCEAttack");
46
+ $string .= '$RCE='.$RCEAttack.';'.PHP_EOL;
47
+
48
+ $Rate_limiting = get_option_value("Rate_limiting");
49
+ if($Rate_limiting!='')
50
+ $string .= '$RateLimiting='.$Rate_limiting.';'.PHP_EOL;
51
+ else
52
+ $string .= '$RateLimiting=0;'.PHP_EOL;
53
+
54
+ $Rate_request = get_option_value("Rate_request");
55
+ if($Rate_request!='')
56
+ $string .= '$RequestsPMin='.$Rate_request.';'.PHP_EOL;
57
+ else
58
+ $string .= '$RequestsPMin=0;'.PHP_EOL;
59
+
60
+ $actionRateL = get_option_value("actionRateL");
61
+ if($actionRateL==1)
62
+ $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
63
+ else
64
+ $string .= '$actionRateL="BlockIP";'.PHP_EOL;
65
+
66
+ $string .= '?>'.PHP_EOL;
67
+ fwrite($file, $string);
68
+ fclose($file);
69
+
70
+ return $fileName;
71
+ }
72
+ return "notMissing";
73
+ }
74
+ function is_ip_whitelisted($ipaddress)
75
+ {
76
+ global $dbcon,$prefix;
77
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
78
+ $results = mysqli_query($dbcon,$query);
79
+ if($results)
80
+ {
81
+ $row = mysqli_fetch_array($results);
82
+ if(is_null($row))
83
+ {
84
+ return false;
85
+ }
86
+ else
87
+ {
88
+ return true;
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ function is_ip_blocked($ipaddress)
94
+ {
95
+ global $dbcon,$prefix;
96
+ $query = 'select * from '.$prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
97
+ $results = mysqli_query($dbcon,$query);
98
+ if($results)
99
+ {
100
+ $row = mysqli_fetch_array($results);
101
+ if(is_null($row))
102
+ {
103
+ return false;
104
+ }
105
+ else
106
+ {
107
+ return true;
108
+ }
109
+ }
110
+ return false;
111
+ }
112
+ function block_ip($ipaddress,$reason)
113
+ {
114
+ global $dbcon, $prefix;
115
+ $query ="insert into ".$prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','".$reason."',NULL,".time().");";
116
+ $results = mysqli_query($dbcon,$query);
117
+ }
118
+ function dbconnection()
119
+ {
120
+ global $dbcon,$prefix;
121
+ $dir = dirname(__FILE__);
122
+ $dir = str_replace('\\', "/", $dir);
123
+ $dir_name = explode('wp-content', $dir);
124
+ $file = file_get_contents($dir_name[0].'wp-config.php');
125
+ $content = explode("\n", $file);
126
+ $len = sizeof($content);
127
+ $Ismultisite = 0;
128
+ $dbD = array('DB_NAME' =>'' ,'DB_USER' => '' ,'DB_PASSWORD' =>'','DB_HOST' =>'','DB_CHARSET' =>'','DB_COLLATE' =>'' );
129
+
130
+ $prefix = 'wp_';
131
+
132
+ for($i=0;$i<$len;$i++)
133
+ {
134
+
135
+ if(preg_match("/define/", $content[$i]))
136
+ {
137
+ $cont = explode(",", $content[$i]);
138
+ $string = str_replace(array('define(',' ','\''), '', $cont[0]);
139
+ switch ($string) {
140
+ case "DB_NAME":
141
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
142
+ $res = preg_replace('/\s/', '', $res);
143
+ $dbD['DB_NAME'] = $res;
144
+ break;
145
+ case 'DB_USER':
146
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
147
+ $res = preg_replace('/\s/', '', $res);
148
+ $dbD['DB_USER'] = $res;
149
+ break;
150
+ case "DB_PASSWORD":
151
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
152
+ $res = preg_replace('/\s/', '', $res);
153
+ $dbD['DB_PASSWORD'] = $res;
154
+ break;
155
+ case 'DB_HOST':
156
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
157
+ $res = preg_replace('/\s/', '', $res);
158
+ $dbD['DB_HOST'] = $res;
159
+ break;
160
+ case "DB_CHARSET":
161
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
162
+ $res = preg_replace('/\s/', '', $res);
163
+ $dbD['DB_CHARSET'] = $res;
164
+ break;
165
+ case 'DB_COLLATE':
166
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
167
+ $res = preg_replace('/\s/', '', $res);
168
+ $dbD['DB_COLLATE'] = $res;
169
+ break;
170
+ default:
171
+
172
+ break;
173
+ }
174
+ }
175
+ if(preg_match('/\$table_prefix/', $content[$i]))
176
+ {
177
+ $cont = explode("'", $content[$i]);
178
+
179
+ $prefix = $cont['1'];
180
+ }
181
+ }
182
+ $dbcon = new mysqli($dbD['DB_HOST'],$dbD['DB_USER'],$dbD['DB_PASSWORD']);
183
+ if(!$dbcon)
184
+ {
185
+ echo "database connection error";
186
+ exit;
187
+ }
188
+ $connection = mysqli_select_db($dbcon,$dbD['DB_NAME']);
189
+ return $connection;
190
+ }
191
+ function get_option_value($option)
192
+ {
193
+ global $dbcon,$prefix;
194
+ $query = 'select option_value from '.$prefix.'options where option_name ="'.$option.'";';
195
+ $results = mysqli_query($dbcon,$query);
196
+ if($results)
197
+ {
198
+ $rows = mysqli_fetch_array($results);
199
+ $option_value = intval($rows['option_value']);
200
+ return $option_value;
201
+ }
202
+ return '';
203
+ }
204
+
205
+ function getRLEattack($ipaddress)
206
+ {
207
+ global $dbcon,$prefix;
208
+ $query = "select time from ".$prefix."wpns_attack_logs where ip ='".$ipaddress."' and type = 'RLE' ORDER BY time DESC LIMIT 1;";
209
+ $results = mysqli_query($dbcon,$query);
210
+ if($results)
211
+ {
212
+ $results = mysqli_fetch_array($results);
213
+ return $results['time'];
214
+ }
215
+ return 0;
216
+ }
217
+ function CheckRate($ipaddress)
218
+ {
219
+ global $dbcon,$prefix;
220
+ $time = 60;
221
+ clearRate($time);
222
+ insertRate($ipaddress);
223
+ $query = "select count(*) from ".$prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
224
+ $results = mysqli_query($dbcon,$query);
225
+
226
+ if($results)
227
+ {
228
+ $row = mysqli_fetch_array($results);
229
+ return $row['count(*)'];
230
+ }
231
+ return 0;
232
+ }
233
+ function clearRate($time)
234
+ {
235
+ global $dbcon,$prefix;
236
+ $query = "delete from ".$prefix."wpns_ip_rate_details where time<".(time()-$time);
237
+ $results = mysqli_query($dbcon,$query);
238
+ }
239
+ function insertRate($ipaddress)
240
+ {
241
+ global $dbcon,$prefix;
242
+ $query = "insert into ".$prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
243
+ $results = mysqli_query($dbcon,$query);
244
+ }
245
+
246
+ ?>
handler/WAF/database/mo-waf-plugin-db.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ ?>
handler/WAF/mo-waf-plugin.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $dir = dirname(__FILE__);
4
+ $dir = str_replace('\\', "/", $dir);
5
+ $dir = explode('handler', $dir);
6
+ $wafInclude = $dir[0].'/handler/WAF/waf-include.php';
7
+ $pluginU = $dir[0].'helper/pluginUtility.php';
8
+ $wafDB = $dir[0].'/handler/WAF/database/mo-waf-plugin-db.php';
9
+ $errorPage = $dir[0].'handler/mo-error.php';
10
+ $blockPage = $dir[0].'handler/mo-block.php';
11
+
12
+ include_once($wafInclude);
13
+ include_once($pluginU);
14
+ include_once($wafDB);
15
+
16
+
17
+ global $wpdb,$mowpnshandle;
18
+ $mowpnshandle = new MoWpnsHandler();
19
+ $ipaddress = get_ipaddress();
20
+ if($mowpnshandle->is_ip_blocked($ipaddress))
21
+ {
22
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
23
+ {
24
+ header('HTTP/1.1 403 Forbidden');
25
+ include_once($blockPage);
26
+ }
27
+ }
28
+ $fileName = setting_file();
29
+ if($fileName != "notMissing")
30
+ {
31
+ include_once($fileName);
32
+ }
33
+ if(isset($RateLimiting) and $RateLimiting == 1)
34
+ {
35
+ if(!is_crawler())
36
+ {
37
+ applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
38
+ }
39
+ }
40
+ if(isset($RateLimitingCrawler))
41
+ {
42
+ if($RateLimitingCrawler == 1)
43
+ {
44
+ if(is_crawler())
45
+ {
46
+ if(is_fake_googlebot($ipaddress))
47
+ {
48
+ header('HTTP/1.1 403 Forbidden');
49
+ include_once($errorPage);
50
+ }
51
+ if($RateLimitingCrawler == '1')
52
+ {
53
+ applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
54
+ }
55
+
56
+ }
57
+ }
58
+ }
59
+ $attack = array();
60
+ if($SQL==1)
61
+ {
62
+ array_push($attack,"SQL");
63
+ }
64
+ if($XSS==1)
65
+ {
66
+ array_push($attack,"XSS");
67
+ }
68
+ if($LFI==1)
69
+ {
70
+ array_push($attack,"LFI");
71
+ }
72
+
73
+ $attackC = $attack;
74
+ $ParanoiaLevel = 1;
75
+ $annomalyS = 0;
76
+ $SQLScore = 0;
77
+ $XSSScore = 0;
78
+ $limitAttack = get_option('limitAttack');
79
+
80
+
81
+ foreach ($attackC as $key1 => $value1)
82
+ {
83
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
84
+ {
85
+ if(isset($regex[$value1][$lev]))
86
+ { $ooo = 0;
87
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
88
+ {
89
+ foreach ($_REQUEST as $key => $value) {
90
+
91
+ if($regex[$value1][$lev][$i] != "")
92
+ {
93
+ if(is_string($value))
94
+ {
95
+ if(preg_match($regex[$value1][$lev][$i], $value))
96
+ {
97
+
98
+ if($value1 == "SQL")
99
+ {
100
+ $SQLScore += $score[$value1][$lev][$i];
101
+ }
102
+ elseif ($value1 == "XSS")
103
+ {
104
+ $XSSScore += $score[$value1][$lev][$i];
105
+ }
106
+ else
107
+ {
108
+ $annomalyS += $score[$value1][$lev][$i];
109
+ }
110
+
111
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
112
+ {
113
+ $attackCount = log_attack($ipaddress,$value1,$value);
114
+ if($attackCount>$limitAttack)
115
+ {
116
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
117
+ {
118
+ if(!$mowpnshandle->is_ip_blocked($ipaddress))
119
+ $mowpnshandle->block_ip($ipaddress,'ALE',true); //Attack Limit Exceed
120
+ }
121
+ }
122
+
123
+ header('HTTP/1.1 403 Forbidden');
124
+ include_once($errorPage);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
136
+ {
137
+ global $wpdb,$mowpnshandle;
138
+ $rate = CheckRate($ipaddress);
139
+ if($rate>=$reqLimit)
140
+ {
141
+ $lastAttack = getRLEAttack($ipaddress)+60;
142
+ $current_time = time();
143
+ if($lastAttack < $current_time-60)
144
+ {
145
+ log_attack($ipaddress,'RLE','RLE');
146
+ }
147
+ if($action != 'ThrottleIP')
148
+ {
149
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
150
+ {
151
+ $mowpnshandle->block_ip($ipaddress,'RLE',true);
152
+ }
153
+ }
154
+ header('HTTP/1.1 403 Forbidden');
155
+ include_once($errorPage);
156
+ }
157
+ }
158
+ function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
159
+ {
160
+ if(file_exists($filename))
161
+ {
162
+ include($filename);
163
+ }
164
+ global $wpdb,$mowpnshandle;
165
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
166
+ if(isset($RateLimitingCrawler))
167
+ {
168
+ if($RateLimitingCrawler=='1')
169
+ {
170
+ if(isset($RequestsPMinCrawler))
171
+ {
172
+ $reqLimit = $RequestsPMinCrawler;
173
+ $rate = CheckRate($ipaddress);
174
+ if($rate>=$reqLimit)
175
+ {
176
+ $action = $actionRateLCrawler;
177
+ $lastAttack = getRLEattack($ipaddress)+60;
178
+ $current_time = time();
179
+ if($current_time>$lastAttack)
180
+ {
181
+ log_attack($ipaddress,'RLECrawler',$USER_AGENT);
182
+ }
183
+ if($action != 'ThrottleIP')
184
+ {
185
+ if(!$mowpnshandle->is_whitelisted($ipaddress))
186
+ {
187
+ if(!$mowpnshandle->is_ip_blocked($ipaddress))
188
+ {
189
+ $mowpnshandle->block_ip($ipaddress,'RLECrawler',true);
190
+ }
191
+ }
192
+ }
193
+ header('HTTP/1.1 403 Forbidden');
194
+ include_once($errorPage);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+
202
+
203
+ ?>
handler/WAF/mo-waf.php ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $dir = dirname(__FILE__);
3
+ $dir = str_replace('\\', "/", $dir);
4
+ $dir = explode('WAF', $dir);
5
+ $wafInclude = $dir[0].'WAF/waf-include.php';
6
+ $wafdb = $dir[0].'WAF/database/mo-waf-db.php';
7
+ $errorPage = $dir[0].'mo-error.php';
8
+ $blockPage = $dir[0].'mo-block.php';
9
+
10
+ include_once($wafInclude);
11
+ include_once($wafdb);
12
+
13
+ global $dbcon,$prefix;
14
+ $connection = dbconnection();
15
+ if($connection)
16
+ {
17
+ $wafLevel = get_option_value('WAF');
18
+ if($wafLevel=='HtaccessLevel')
19
+ {
20
+ $ipaddress = get_ipaddress();
21
+ if(is_ip_blocked($ipaddress))
22
+ {
23
+ if(!is_ip_whitelisted($ipaddress))
24
+ {
25
+ header('HTTP/1.1 403 Forbidden');
26
+ include_once($blockPage);
27
+ }
28
+ }
29
+ $fileName = setting_file();
30
+
31
+ if($fileName != 'notMissing')
32
+ {
33
+ include_once($fileName);
34
+ }
35
+ if(isset($RateLimiting) && $RateLimiting == 1)
36
+ {
37
+ if(!is_crawler())
38
+ {
39
+ if(isset($RequestsPMin) && isset($actionRateL))
40
+ applyRateLimiting($RequestsPMin,$actionRateL,$ipaddress,$errorPage);
41
+ }
42
+ }
43
+ if(isset($RateLimitingCrawler) && $RateLimitingCrawler == 1)
44
+ {
45
+ if(is_crawler())
46
+ {
47
+ if(is_fake_googlebot($ipaddress))
48
+ {
49
+ header('HTTP/1.1 403 Forbidden');
50
+ include_once($errorPage);
51
+ }
52
+ if($RateLimitingCrawler == '1')
53
+ {
54
+ applyRateLimitingCrawler($ipaddress,$fileName,$errorPage);
55
+ }
56
+
57
+ }
58
+ }
59
+ $attack = array();
60
+ if(isset($SQL) && $SQL==1)
61
+ {
62
+ array_push($attack,"SQL");
63
+ }
64
+ if(isset($XSS) && $XSS==1)
65
+ {
66
+ array_push($attack,"XSS");
67
+ }
68
+ if(isset($LFI) && $LFI==1)
69
+ {
70
+ array_push($attack,"LFI");
71
+ }
72
+
73
+ $attackC = $attack;
74
+ $ParanoiaLevel = 1;
75
+ $annomalyS = 0;
76
+ $SQLScore = 0;
77
+ $XSSScore = 0;
78
+ $limitAttack = get_option_value("limitAttack");
79
+
80
+ foreach ($attackC as $key1 => $value1)
81
+ {
82
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
83
+ {
84
+ if(isset($regex[$value1][$lev]))
85
+ { $ooo = 0;
86
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
87
+ {
88
+ foreach ($_REQUEST as $key => $value) {
89
+
90
+ if($regex[$value1][$lev][$i] != "")
91
+ {
92
+ if(is_string($value))
93
+ {
94
+ if(preg_match($regex[$value1][$lev][$i], $value))
95
+ {
96
+
97
+ if($value1 == "SQL")
98
+ {
99
+ $SQLScore += $score[$value1][$lev][$i];
100
+ }
101
+ elseif ($value1 == "XSS")
102
+ {
103
+ $XSSScore += $score[$value1][$lev][$i];
104
+ }
105
+ else
106
+ {
107
+ $annomalyS += $score[$value1][$lev][$i];
108
+ }
109
+
110
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
111
+ {
112
+ $attackCount = log_attack($ipaddress,$value1,$value);
113
+ if($attackCount>$limitAttack)
114
+ {
115
+ if(!is_ip_whitelisted($ipaddress))
116
+ {
117
+ block_ip($ipaddress,'ALE'); //Attack Limit Exceed
118
+ }
119
+ }
120
+
121
+ header('HTTP/1.1 403 Forbidden');
122
+ include_once($errorPage);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+
136
+ function applyRateLimiting($reqLimit,$action,$ipaddress,$errorPage)
137
+ {
138
+ global $dbcon, $prefix;
139
+ $rate = CheckRate($ipaddress);
140
+ if($rate>$reqLimit)
141
+ {
142
+ $lastAttack = getRLEattack($ipaddress)+60;
143
+ $current_time = time();
144
+ if($current_time > $lastAttack)
145
+ {
146
+ log_attack($ipaddress,'RLE','RLE');
147
+ }
148
+ if($action != 'ThrottleIP')
149
+ {
150
+ if(!is_ip_whitelisted($ipaddress))
151
+ {
152
+ block_ip($ipaddress,'RLE'); //Rate Limit Exceed
153
+ }
154
+ }
155
+ header('HTTP/1.1 403 Forbidden');
156
+ include_once($errorPage);
157
+ }
158
+ }
159
+
160
+ function applyRateLimitingCrawler($ipaddress,$filename,$errorPage)
161
+ {
162
+ if(file_exists($filename))
163
+ {
164
+ include($filename);
165
+ }
166
+ global $dbcon,$prefix;
167
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
168
+ if(isset($RateLimitingCrawler))
169
+ {
170
+ if(isset($RateLimitingCrawler) && $RateLimitingCrawler=='1')
171
+ {
172
+ if(isset($RequestsPMinCrawler) && isset($actionRateLCrawler) )
173
+ {
174
+ $reqLimit = $RequestsPMinCrawler;
175
+ $rate = CheckRate($ipaddress);
176
+ if($rate>=$reqLimit)
177
+ {
178
+ $action = $actionRateLCrawler;
179
+ $lastAttack = getRLEattack($ipaddress)+60;
180
+ $current_time = time();
181
+ if($current_time>$lastAttack)
182
+ {
183
+ log_attack($ipaddress,'RLECrawler',$USER_AGENT);
184
+ }
185
+ if($action != 'ThrottleIP')
186
+ {
187
+ if(!is_ip_whitelisted($ipaddress))
188
+ {
189
+ block_ip($ipaddress,'RLECrawler'); //Rate Limit Exceed for Crawler
190
+ }
191
+ }
192
+ header('HTTP/1.1 403 Forbidden');
193
+ include_once($errorPage);
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+
200
+
201
+ $dbcon->close();
202
+ ?>
handler/WAF/waf-include.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $dir = dirname(__FILE__);
3
+ $dir = str_replace('\\', "/", $dir);
4
+ $dir = explode('WAF', $dir);
5
+ $dir = $dir[0];
6
+ $sqlInjectionFile = $dir.DIRECTORY_SEPARATOR.'signature/APSQLI.php';
7
+ $xssFile = $dir.DIRECTORY_SEPARATOR.'signature/APXSS.php';
8
+ $lfiFile = $dir.DIRECTORY_SEPARATOR.'signature/APLFI.php';
9
+ $configfilepath = explode('wp-content', $dir);
10
+ $configfile = $configfilepath[0].DIRECTORY_SEPARATOR.'wp-includes/mo-waf-config.php';
11
+ $missingFile = 0;
12
+
13
+ if(file_exists($configfile))
14
+ {
15
+ include_once($configfile);
16
+ }
17
+ else
18
+ {
19
+ $missingFile = 1;
20
+ }
21
+ include_once($sqlInjectionFile);
22
+ include_once($xssFile);
23
+ include_once($lfiFile);
24
+
25
+ function get_ipaddress()
26
+ {
27
+ $ipaddress = '';
28
+ if (isset($_SERVER['HTTP_CLIENT_IP']))
29
+ $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
30
+ else if(isset($_SERVER['REMOTE_ADDR']))
31
+ $ipaddress = $_SERVER['REMOTE_ADDR'];
32
+ else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
33
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
34
+ else if(isset($_SERVER['HTTP_X_FORWARDED']))
35
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
36
+ else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
37
+ $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
38
+ else if(isset($_SERVER['HTTP_FORWARDED']))
39
+ $ipaddress = $_SERVER['HTTP_FORWARDED'];
40
+ else
41
+ $ipaddress = 'UNKNOWN';
42
+
43
+ return $ipaddress;
44
+ }
45
+ function is_crawler()
46
+ {
47
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
48
+ $Botsign = array('bot','apache','crawler','elinks','http', 'java', 'spider','link','fetcher','scanner','grabber','collector','capture','seo','.com');
49
+ foreach ($Botsign as $key => $value)
50
+ {
51
+ if(preg_match('/'.$value.'/', $USER_AGENT))
52
+ {
53
+ return true;
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ function is_fake_googlebot($ipaddress)
59
+ {
60
+ $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
61
+ if(preg_match('/Googlebot/', $USER_AGENT))
62
+ {
63
+ if(is_fake('Googlebot',$USER_AGENT,$ipaddress))
64
+ {
65
+ header('HTTP/1.1 403 Forbidden');
66
+ include_once("mo-error.php");
67
+ }
68
+ }
69
+ }
70
+ function is_fake($crawler,$USER_AGENT,$ipaddress)
71
+ {
72
+ // $hostName = gethostbyaddr($ipaddress);
73
+ // $hostIP = gethostbyname($hostName);
74
+ // if(is_numeric(get_option('mo_wpns_iprange_count')))
75
+ // $range_count = intval(get_option('mo_wpns_iprange_count'));
76
+ // for($i = 1 ; $i <= $range_count ; $i++){
77
+ // $blockedrange = get_option('mo_wpns_iprange_range_'.$i);
78
+ // $rangearray = explode("-",$blockedrange);
79
+ // if(sizeof($rangearray)==2){
80
+ // $lowip = ip2long(trim($rangearray[0]));
81
+ // $highip = ip2long(trim($rangearray[1]));
82
+ // if(ip2long($userIp)>=$lowip && ip2long($userIp)<=$highip){
83
+ // $mo_wpns_config = new MoWpnsHandler();
84
+ // $mo_wpns_config->block_ip($userIp, MoWpnsConstants::IP_RANGE_BLOCKING, true);
85
+ // return true;
86
+ // }
87
+ // }
88
+ // }
89
+ // return false;
90
+ }
91
+ ?>
handler/ajax.php ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class AjaxHandler
4
+ {
5
+ function __construct()
6
+ {
7
+ add_action( 'admin_init' , array( $this, 'mo_wpns_saml_actions' ) );
8
+ }
9
+
10
+ function mo_wpns_saml_actions()
11
+ {
12
+ global $moWpnsUtility,$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
+ case "backupDB":
21
+ $this->backupDB(); break;
22
+ case "dissmissfeedback":
23
+ $this->handle_feedback(); break;
24
+ case "whitelistself":
25
+ $this->whitelist_self(); break;
26
+
27
+ }
28
+ }
29
+ }
30
+
31
+ private function lookupIP($ip)
32
+ {
33
+ $result=@json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip),true);
34
+ $hostname = gethostbyaddr($result["geoplugin_request"]);
35
+ try{
36
+ $timeoffset = timezone_offset_get(new DateTimeZone($result["geoplugin_timezone"]),new DateTime('now'));
37
+ $timeoffset = $timeoffset/3600;
38
+
39
+ }catch(Exception $e){
40
+ $result["geoplugin_timezone"]="";
41
+ $timeoffset="";
42
+ }
43
+
44
+ $ipLookUpTemplate = MoWpnsConstants::IP_LOOKUP_TEMPLATE;
45
+ if($result['geoplugin_request']==$ip) {
46
+
47
+ $ipLookUpTemplate = str_replace("{{status}}", $result["geoplugin_status"], $ipLookUpTemplate);
48
+ $ipLookUpTemplate = str_replace("{{ip}}", $result["geoplugin_request"], $ipLookUpTemplate);
49
+ $ipLookUpTemplate = str_replace("{{region}}", $result["geoplugin_region"], $ipLookUpTemplate);
50
+ $ipLookUpTemplate = str_replace("{{country}}", $result["geoplugin_countryName"], $ipLookUpTemplate);
51
+ $ipLookUpTemplate = str_replace("{{city}}", $result["geoplugin_city"], $ipLookUpTemplate);
52
+ $ipLookUpTemplate = str_replace("{{continent}}", $result["geoplugin_continentName"], $ipLookUpTemplate);
53
+ $ipLookUpTemplate = str_replace("{{latitude}}", $result["geoplugin_latitude"], $ipLookUpTemplate);
54
+ $ipLookUpTemplate = str_replace("{{longitude}}", $result["geoplugin_longitude"], $ipLookUpTemplate);
55
+ $ipLookUpTemplate = str_replace("{{timezone}}", $result["geoplugin_timezone"], $ipLookUpTemplate);
56
+ $ipLookUpTemplate = str_replace("{{curreny_code}}", $result["geoplugin_currencyCode"], $ipLookUpTemplate);
57
+ $ipLookUpTemplate = str_replace("{{curreny_symbol}}", $result["geoplugin_currencySymbol"], $ipLookUpTemplate);
58
+ $ipLookUpTemplate = str_replace("{{per_dollar_value}}", $result["geoplugin_currencyConverter"], $ipLookUpTemplate);
59
+ $ipLookUpTemplate = str_replace("{{hostname}}", $hostname, $ipLookUpTemplate);
60
+ $ipLookUpTemplate = str_replace("{{offset}}", $timeoffset, $ipLookUpTemplate);
61
+
62
+ $result['ipDetails'] = $ipLookUpTemplate;
63
+ }else{
64
+ $result["ipDetails"]["status"]="ERROR";
65
+ }
66
+
67
+ wp_send_json( $result );
68
+
69
+ }
70
+ // private function backupDB()
71
+ function backupDB()
72
+ {
73
+ if ( function_exists('memory_get_usage') && ( (int) ini_get('memory_limit') < 128 ) )
74
+ ini_set('memory_limit', '128M' );
75
+ global $wpdb;
76
+ $tables = $wpdb->get_results("SHOW TABLES", ARRAY_N);
77
+ $nooftables = count($tables);
78
+ $query = "";
79
+ $tableswithfk = array();
80
+ $tableswithoutfk= array();
81
+
82
+ foreach($tables as $table)
83
+ {
84
+ if(is_array($table))
85
+ $table = $table[0];
86
+ $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
87
+ if(!empty($createtable[0]))
88
+ {
89
+ $createquery = $createtable[0]['Create Table'];
90
+ if (strpos($createquery, 'FOREIGN KEY') !== false)
91
+ array_push($tableswithfk,$table);
92
+ else
93
+ array_push($tableswithoutfk, $table);
94
+ }
95
+ }
96
+
97
+ $query .= $this->get_table_query($query,$tableswithoutfk);
98
+
99
+ $query .= $this->get_table_query($query,$tableswithfk);
100
+
101
+ $fileName = $this->create_db_backup_file($query);
102
+ wp_send_json($fileName);
103
+ }
104
+
105
+ private function get_table_query($query,$tables)
106
+ {
107
+ global $wpdb;
108
+ foreach($tables as $table)
109
+ {
110
+ $createtable = $wpdb->get_results("SHOW CREATE TABLE $table", ARRAY_A);
111
+ if(!empty($createtable[0]))
112
+ {
113
+ $createquery = $createtable[0]['Create Table'];
114
+ $query .= 'DROP TABLE IF EXISTS '.$table.";\n";
115
+ $query .= $createquery.";\n\n";
116
+ $data = $wpdb->get_results("SELECT * FROM $table", ARRAY_A);
117
+ foreach($data as $record)
118
+ {
119
+ if(count($record)>0)
120
+ {
121
+ $query.= 'INSERT INTO '.$table.' VALUES(';
122
+ $i=0;
123
+ foreach($record as $key=>$value)
124
+ {
125
+ $value = addslashes($value);
126
+ if (isset($value))
127
+ $query.= '"'.$value.'"' ;
128
+ else
129
+ $query.= '""';
130
+ if ($i < (count($record)-1)) { $query.= ','; }
131
+ $i++;
132
+ }
133
+ $query.= ");\n";
134
+ }
135
+ }
136
+ $query.="\n\n";
137
+ }
138
+ }
139
+ return $query;
140
+ }
141
+
142
+
143
+ private function create_db_backup_file($data)
144
+ { $folderName = date("Ymd");
145
+ $basepath = get_home_path();
146
+ if(!file_exists($basepath."db-backups")){
147
+ mkdir($basepath."db-backups");
148
+ }
149
+ $basepath = get_home_path().'db-backups/';
150
+ $handler_obj = new site_backup;
151
+ $handler_obj->create_index_file($basepath);
152
+ if(!file_exists($basepath.$folderName)){
153
+ mkdir($basepath.$folderName);
154
+ }
155
+
156
+ $filename = 'db-backup-'.time().'.sql';
157
+ $handle = fopen(get_home_path()."db-backups".DIRECTORY_SEPARATOR.$folderName.DIRECTORY_SEPARATOR.$filename,'w+');
158
+ fwrite($handle,$data);
159
+ fclose($handle);
160
+ return $filename;
161
+ }
162
+
163
+ private function handle_feedback()
164
+ {
165
+ update_option('donot_show_feedback_message',1);
166
+ wp_send_json('success');
167
+ }
168
+
169
+ private function whitelist_self()
170
+ {
171
+ global $moWpnsUtility;
172
+ $moPluginsUtility = new MoWpnsHandler();
173
+ $moPluginsUtility->whitelist_ip($moWpnsUtility->get_client_ip());
174
+ wp_send_json('success');
175
+ }
176
+
177
+ }new AjaxHandler;
handler/backup.php ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class site_backup
4
+
5
+ {
6
+
7
+ function __construct()
8
+ {
9
+ add_filter( 'cron_schedules', array($this,'db_backup_interval'));
10
+ add_action( 'bl_cron_hook', array($this,'db_cron_backup') );
11
+ add_filter( 'cron_schedules', array($this,'file_backup_interval'));
12
+ add_action( 'file_cron_hook', array($this,'file_cron_backup') );
13
+ }
14
+
15
+ function db_cron_backup(){
16
+
17
+ $obj = new AjaxHandler;
18
+ $obj->backupDB();
19
+
20
+ }
21
+
22
+ function db_backup_interval($schedules){
23
+ $mo2f_cron_hours = get_option('mo2f_cron_hours');
24
+ $schedules['db_backup_time'] = array(
25
+ 'interval' => $mo2f_cron_hours,
26
+ 'display' => esc_html__( 'Cron Activated' ),
27
+ );
28
+
29
+ return $schedules;
30
+ }
31
+
32
+ function bl_deactivate() {
33
+ $timestamp = wp_next_scheduled( 'bl_cron_hook' );
34
+ wp_unschedule_event( $timestamp, 'bl_cron_hook' );
35
+ }
36
+
37
+ function file_cron_backup(){
38
+
39
+ if(get_option('mo_file_backup_plugins') =='1'){
40
+ $folderName = $this->mkdirectory('plugins');
41
+ $real_path=get_home_path().'wp-content/plugins';
42
+ $filename = 'plugins-backup-'.time().'.zip';
43
+ $this->file_backup($real_path,$filename,$folderName,'plugins');
44
+ }if(get_option('mo_file_backup_themes')=='1'){
45
+ $folderName = $this->mkdirectory('themes');
46
+ $real_path=get_home_path().'wp-content/themes';
47
+ $filename = 'themes-backup-'.time().'.zip';
48
+ $this->file_backup($real_path,$filename, $folderName, 'themes');
49
+ }if(get_option('mo_file_backup_wp_files') == '1'){
50
+ $folderName = $this->mkdirectory('wp_files');
51
+ $real_path=get_home_path();
52
+ $filename = 'wp-files-backup-'.time().'.zip';
53
+ $this->file_backup($real_path,$filename,$folderName, 'wp_files');
54
+ }
55
+
56
+ }
57
+
58
+ function file_backup_interval($schedules){
59
+ $mo2f_cron_file_backup_hours = get_option('mo2f_cron_file_backup_hours');
60
+ $schedules['cron_backup_time'] = array(
61
+ 'interval' => $mo2f_cron_file_backup_hours,
62
+ 'display' => esc_html__( 'Cron Activated' ),
63
+ );
64
+
65
+ return $schedules;
66
+ }
67
+
68
+ function file_backup_deactivate(){
69
+ $timestamp = wp_next_scheduled( 'file_cron_hook' );
70
+ wp_unschedule_event( $timestamp, 'file_cron_hook' );
71
+ }
72
+
73
+ function mkdirectory($foldername){
74
+ $folderName = date("Ymd");
75
+ $basepath = get_home_path();
76
+ if(!file_exists($basepath."file-backups")){
77
+ mkdir($basepath."file-backups");
78
+ }
79
+
80
+ $basepath = get_home_path().'file-backups/';
81
+ $this-> create_index_file($basepath);
82
+
83
+ if(!file_exists($basepath.$foldername)){
84
+ mkdir($basepath.$foldername);
85
+ }
86
+
87
+ $basepath = get_home_path().'file-backups'.'/'.$foldername.'/';
88
+ if(!file_exists($basepath.$folderName)){
89
+ mkdir($basepath.$folderName);
90
+ }
91
+ return $folderName;
92
+ }
93
+
94
+ function create_index_file($folder_path){
95
+
96
+ $html_path=$folder_path."index.html";
97
+ $htaccess_path= $folder_path.".htaccess";
98
+
99
+ if(!file_exists($html_path)){
100
+ $f = fopen($html_path, "a");
101
+ fwrite($f, '<html><body><a href="https://miniorange.com" target="_blank">WordPress backups by miniorange</a></body></html>');
102
+ fclose($f);
103
+ }
104
+ if(!file_exists($htaccess_path)){
105
+ $f = fopen($htaccess_path, "a");
106
+ fwrite($f, "deny from all");
107
+ fclose($f);
108
+ }
109
+ }
110
+
111
+ function randomPassword() {
112
+ $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
113
+ $pass = array(); //remember to declare $pass as an array
114
+ $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
115
+ for ($i = 0; $i < 16; $i++) {
116
+ $n = rand(0, $alphaLength);
117
+ $pass[] = $alphabet[$n];
118
+ }
119
+ return implode($pass); //turn the array into a string
120
+ }
121
+
122
+ function send_email_backup($pass,$filename) {
123
+ $toEmail = get_option('mo2f_email');
124
+
125
+
126
+
127
+ $style="<style>.button {background-color: #008CBA;border: none;color: white;text-align: center;
128
+ text-decoration: none;display: inline-block;font-size: 16px;padding: 14px 40px;margin: 4px 2px;cursor: pointer;}</style>";
129
+
130
+ $content=$style.'<table cellpadding="25" style="margin:0px auto"><tbody><tr><td><table cellpadding="24" width="584px" style="margin:0 auto;max-width:584px;background-color:#f6f4f4;border:1px solid #a8adad">
131
+ <tbody><tr><td><img src="https://ci3.googleusercontent.com/proxy/bsqfwxlN_rHFOhApsbPGugF_GTN5hDO9LSLj6XI-u5TRUBW2scP-4M6HDfkRrGLKd5VLbNV_zI4V1jXKwsjOEvf0woDkXYbmbKhgnNYfbfdqari89aTVuY0mVQ=s0-d-e1-ft#https://miniorange.s3.amazonaws.com/public/images/miniorange-logo.png" style="color:#5fb336;text-decoration:none;display:block;width:auto;height:auto;max-height:35px"></td>
132
+ </tr></tbody></table><table cellpadding="24" style="background:#fff;border:1px solid #a8adad;width:584px;border-top:none;color:#4d4b48;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:18px">
133
+ <tbody><tr><td>
134
+ <p style="margin-top:0;margin-bottom:20px">Dear User,</p><p style="margin-top:0;margin-bottom:10px"><p style="margin-top:0;margin-bottom:10px">A backup for your'.$filename.' has been created for you. The ZIP is password protected and password is <b>'.$pass.'</b> </p></p>
135
+ <p style="margin-top:0;margin-bottom:10px"><p style="margin-top:0;margin-bottom:10px">Your backup is created under "/WordPress/file-backups" directory<br><br><p style="margin-top:0;margin-bottom:15px">Thank you,<br>miniOrange Team</p><p style="margin-top:0;margin-bottom:0px;font-size:11px">Disclaimer: This email and any files transmitted with it are confidential and intended solely for the use of the individual or entity to whom they are addressed.</p>
136
+ </span></td></tr></tbody></table></td></tr></tbody></table>';
137
+
138
+
139
+
140
+ $headers = array('Content-Type: text/html; charset=UTF-8');
141
+ $subject='Backup For Database';
142
+
143
+ $sent= wp_mail( $toEmail, $subject, $content, $headers);
144
+
145
+ }
146
+
147
+
148
+
149
+ function file_backup($real_path, $filename,$folderName, $foldername){
150
+
151
+ $basepath=get_home_path();
152
+ $rootPath = realpath($real_path);
153
+ $zip = new ZipArchive();
154
+ $res = $zip->open($basepath.'file-backups'.'/'.$foldername.'/'.$folderName.'/'.$filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);
155
+
156
+
157
+ // $pass = $this->randomPassword();
158
+ // $zip->setPassword($pass);
159
+ // update_option('zip_file_password',$pass);
160
+
161
+
162
+ $files = new RecursiveIteratorIterator(
163
+ new RecursiveDirectoryIterator($rootPath),
164
+ RecursiveIteratorIterator::LEAVES_ONLY
165
+ );
166
+ foreach ($files as $name => $file)
167
+ {
168
+ // Skip directories (they would be added automatically)
169
+ if (!$file->isDir())
170
+ {
171
+ // Get real and relative path for current file
172
+ $filePath = $file->getRealPath();
173
+ $relativePath = substr($filePath, strlen($rootPath) + 1);
174
+
175
+ // Add current file to archive
176
+ $zip->addFile($filePath, $relativePath);
177
+ /*if(get_option('mo2f_zip_file_password')){
178
+ $zip->setEncryptionName($relativePath, ZipArchive::EM_AES_256,$pass );
179
+ }*/
180
+
181
+ }
182
+ }
183
+
184
+
185
+ $zip->close();
186
+ }
187
+
188
+ }new site_backup;
handler/class_miniorange_2fa_strong_password.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class class_miniorange_2fa_strong_password {
4
+
5
+ function __construct(){
6
+
7
+ add_option( 'mo2f_enforce_strong_passswords', false);
8
+
9
+ }
10
+
11
+ public static function woocommerce_password_protection($errors, $username, $password, $email) {
12
+ if ($password == false) { return $errors; }
13
+ if ($errors->get_error_data("pass")) { return $errors; }
14
+
15
+ $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
16
+
17
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
18
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
19
+ return $errors;
20
+ }
21
+
22
+ return $errors;
23
+ }
24
+ public static function validatePassword($errors, $update, $userData){
25
+ $Users = get_option('mo2f_enforce_strong_passswords_for_accounts');
26
+ $UserRole = $_POST['role'];
27
+ if(is_null($UserRole) and $Users == 'user')
28
+ {
29
+ return true;
30
+ }
31
+ // $currentUser = wp_get_current_user();
32
+ // $admin = 0;
33
+ // if ( in_array( 'administrator', (array) $user->roles ) ) {
34
+ // $admin = 1;
35
+ // }
36
+ if($Users == 'all' or ($Users == 'admin' and $UserRole == 'administrator') or ($Users == 'user' and $UserRole != 'administrator' ) or ($Users == 'admin' and is_null($UserRole)))
37
+ {
38
+ $password = (isset($_POST['pass1']) && trim($_POST['pass1'])) ? $_POST['pass1'] : false;
39
+ $password=($password==false)?(isset($_POST['password_1'])?$_POST['password_1']:false):$password ;
40
+ $user_id = isset($userData->ID) ? $userData->ID : false;
41
+ $username = isset($_POST["user_login"]) ? $_POST["user_login"] : isset($userData->user_login)?$userData->user_login:$userData->user_email;
42
+
43
+ if ($password == false) { return $errors; }
44
+ if ($errors->get_error_data("pass")) { return $errors; }
45
+
46
+ $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
47
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
48
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
49
+ return $errors;
50
+ }
51
+
52
+ return $errors;
53
+ }
54
+
55
+ return true;
56
+ }
57
+ public static function woocommerce_password_registration_protection($errors, $username, $email) {
58
+ if(get_option( 'woocommerce_registration_generate_password' )=='yes')
59
+ return $errors;
60
+ $password=$_POST['account_password'];
61
+ return class_miniorange_2fa_strong_password::is_validPassword($errors, $username, $password);
62
+ }
63
+
64
+ public static function woocommerce_password_edit_account($errors, $user) {
65
+ $password=$_POST['password_1'];
66
+ $user =get_userdata($user->ID);
67
+ $username=$user->user_login;
68
+ $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
69
+
70
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
71
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
72
+ return $errors;
73
+ }
74
+ }
75
+
76
+ public static function is_validPassword($errors, $username, $password){
77
+
78
+ $enforceStrongPasswds = get_option('mo2f_enforce_strong_passswords');
79
+ if ($enforceStrongPasswds && !class_miniorange_2fa_strong_password::mo2f_isStrongPasswd($password, $username)) {
80
+ $errors->add('pass', __('Please choose a stronger password. Try including numbers, symbols, and a mix of upper and lowercase letters and remove common words.'));
81
+ return $errors;
82
+ }
83
+
84
+ return $errors;
85
+
86
+ }
87
+ public static function mo2f_isStrongPasswd($passwd, $username ) {
88
+ $strength = 0;
89
+
90
+ if(strlen( trim( $passwd ) ) < 5)
91
+ return false;
92
+
93
+ if(strtolower( $passwd ) == strtolower( $username ) )
94
+ return false;
95
+
96
+ if(preg_match('/(?:password|passwd|mypass|wordpress)/i', $passwd)){
97
+ return false;
98
+ }
99
+ if($num = preg_match_all( "/\d/", $passwd, $matches) ){
100
+ $strength += ((int)$num * 10);
101
+ }
102
+ if ( preg_match( "/[a-z]/", $passwd ) )
103
+ $strength += 26;
104
+ if ( preg_match( "/[A-Z]/", $passwd ) )
105
+ $strength += 26;
106
+ if ($num = preg_match_all( "/[^a-zA-Z0-9]/", $passwd, $matches)){
107
+ $strength += (31 * (int)$num);
108
+
109
+ }
110
+ if($strength > 60){
111
+ return true;
112
+ }
113
+ }
114
+ }
115
+ ?>
handler/encryption.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package miniOrange
4
+ * @author miniOrange Security Software Pvt. Ltd.
5
+ * @license GNU/GPLv3
6
+ * @copyright Copyright 2015 miniOrange. All Rights Reserved.
7
+ *
8
+ *
9
+ * This file is part of miniOrange Gauth plugin.
10
+ */
11
+
12
+ class mo2f_GAuth_AESEncryption {
13
+ /**
14
+ * @param string $data - the key=value pairs separated with &
15
+ * @return string
16
+ */
17
+ public static function encrypt_data($data, $key) {
18
+ $key = openssl_digest($key, 'sha256');
19
+ $method = 'AES-128-ECB';
20
+ $ivSize = openssl_cipher_iv_length($method);
21
+ $iv = openssl_random_pseudo_bytes($ivSize);
22
+ $strCrypt = openssl_encrypt ($data, $method, $key,OPENSSL_RAW_DATA||OPENSSL_ZERO_PADDING, $iv);
23
+ return base64_encode($strCrypt);
24
+ }
25
+
26
+
27
+ /**
28
+ * @param string $data - crypt response from Sagepay
29
+ * @return string
30
+ */
31
+ public static function decrypt_data($data, $key) {
32
+ $strIn = base64_decode($data) ;
33
+ $key = openssl_digest($key, 'sha256');
34
+ $method = 'AES-128-ECB';
35
+ $ivSize = openssl_cipher_iv_length($method);
36
+ $iv = substr($strIn,0,$ivSize);
37
+ $data = substr($strIn,$ivSize);
38
+ $clear = openssl_decrypt ($data, $method, $key, OPENSSL_RAW_DATA||OPENSSL_ZERO_PADDING, $iv);
39
+
40
+ return $clear;
41
+ }
42
+
43
+ }
44
+ ?>
handler/feedback_form.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class FeedbackHandler
3
+ {
4
+ function __construct()
5
+ {
6
+ add_action('admin_init', array($this, 'mo_wpns_feedback_actions'));
7
+ }
8
+
9
+ function mo_wpns_feedback_actions()
10
+ {
11
+
12
+ global $moWpnsUtility, $dirName;
13
+
14
+ if (current_user_can('manage_options') && isset($_POST['option'])) {
15
+ switch ($_REQUEST['option']) {
16
+ case "mo_wpns_skip_feedback":
17
+ $this->wpns_handle_skip_feedback($_POST); break;
18
+ case "mo_wpns_feedback":
19
+ $this->wpns_handle_feedback($_POST); break;
20
+
21
+ }
22
+ }
23
+ }
24
+
25
+ function wpns_handle_skip_feedback($postdata){
26
+ do_action('wpns_show_message',MoWpnsMessages::showMessage('FEEDBACK'),'CUSTOM_MESSAGE');
27
+ deactivate_plugins( dirname(dirname(__FILE__ ))."\\miniorange_2_factor_settings.php");
28
+ }
29
+
30
+ function wpns_handle_feedback($postdata)
31
+ {
32
+
33
+ $user = wp_get_current_user();
34
+
35
+ $message = 'Plugin Deactivated';
36
+
37
+ $deactivate_reason_message = array_key_exists('wpns_query_feedback', $_POST) ? htmlspecialchars($_POST['wpns_query_feedback']) : false;
38
+
39
+
40
+ $reply_required = '';
41
+ if (isset($_POST['get_reply']))
42
+ $reply_required = htmlspecialchars($_POST['get_reply']);
43
+ if (empty($reply_required)) {
44
+ $reply_required = "don't reply";
45
+ $message .= '<b style="color:red";> &nbsp; [Reply :' . $reply_required . ']</b>';
46
+ } else {
47
+ $reply_required = "yes";
48
+ $message .= '[Reply :' . $reply_required . ']';
49
+ }
50
+
51
+
52
+ $message .= ', Feedback : ' . $deactivate_reason_message . '';
53
+
54
+ if (isset($_POST['rate']))
55
+ $rate_value = htmlspecialchars($_POST['rate']);
56
+
57
+ $message .= ', [Rating :' . $rate_value . ']';
58
+
59
+ $email = $_POST['query_mail'];
60
+ if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
61
+ $email = get_option('mo2f_email');
62
+ if (empty($email))
63
+ $email = $user->user_email;
64
+ }
65
+ $phone = get_option('mo_wpns_admin_phone');
66
+ $feedback_reasons = new MocURL();
67
+ global $moWpnsUtility;
68
+ if (!is_null($feedback_reasons)) {
69
+ if (!$moWpnsUtility->is_curl_installed()) {
70
+ deactivate_plugins(dirname(dirname(__FILE__ ))."\\miniorange_2_factor_settings.php");
71
+ wp_redirect('plugins.php');
72
+ } else {
73
+ $submited = json_decode($feedback_reasons->send_email_alert($email, $phone, $message), true);
74
+ if (json_last_error() == JSON_ERROR_NONE) {
75
+ if (is_array($submited) && array_key_exists('status', $submited) && $submited['status'] == 'ERROR') {
76
+ do_action('wpns_show_message',$submited['message'],'ERROR');
77
+
78
+ } else {
79
+ if ($submited == false) {
80
+ do_action('wpns_show_message','Error while submitting the query.','ERROR');
81
+ }
82
+ }
83
+ }
84
+
85
+ deactivate_plugins(dirname(dirname(__FILE__ ))."\\miniorange_2_factor_settings.php");
86
+ do_action('wpns_show_message','Thank you for the feedback.','SUCCESS');
87
+
88
+ }
89
+ }
90
+ }
91
+
92
+ }new FeedbackHandler();
handler/gaonprem.php ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ include_once dirname( __FILE__ ) . '/encryption.php';
3
+ class Google_auth_onpremise{
4
+ protected $_codeLength = 6;
5
+ function __construct(){
6
+
7
+ }
8
+
9
+ function mo_GAuth_get_details()
10
+ {
11
+ $user=wp_get_current_user();
12
+ $user_id=$user->ID;
13
+ $secret = $this->createSecret();
14
+ $this->mo_GAuth_set_secret($user_id,$secret);
15
+ $issuer=get_option('mo2f_google_appname', 'miniOrangeAuth');
16
+ $email=$user->user_email;
17
+
18
+ $otpcode=$this->getCode($secret);
19
+
20
+ $url=$this->geturl($secret,$issuer,$email);
21
+ mo2f_configure_google_authenticator_onprem( $secret,$url,$otpcode );
22
+
23
+ }
24
+
25
+ function mo_GAuth_set_secret($user_id,$secret){
26
+ global $Mo2fdbQueries;
27
+ $key=$this->random_str(8);
28
+ update_user_meta( $user_id, 'mo2f_get_auth_rnd_string', $key);
29
+ $secret=mo2f_GAuth_AESEncryption::encrypt_data($secret,$key);
30
+ update_user_meta( $user_id, 'mo2f_gauth_key', $secret);
31
+ }
32
+
33
+ function mo_GAuth_get_secret($user_id){
34
+ global $Mo2fdbQueries;
35
+ $key=get_user_meta( $user_id, 'mo2f_get_auth_rnd_string', true);
36
+ $secret=get_user_meta( $user_id, 'mo2f_gauth_key', true);
37
+ $secret=mo2f_GAuth_AESEncryption::decrypt_data($secret,$key);
38
+
39
+ return $secret;
40
+ }
41
+
42
+ function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
43
+ {
44
+ $randomString = '';
45
+ $charactersLength = strlen($keyspace);
46
+ for ($i = 0; $i < $length; $i++) {
47
+ $randomString .= $keyspace[rand(0, $charactersLength - 1)];
48
+ }
49
+ return $randomString;
50
+
51
+ }
52
+
53
+
54
+
55
+
56
+ function createSecret($secretLength = 16)
57
+ {
58
+ $validChars = $this->_getBase32LookupTable();
59
+
60
+ // Valid secret lengths are 80 to 640 bits
61
+ if ($secretLength < 16 || $secretLength > 128) {
62
+ throw new Exception('Bad secret length');
63
+ }
64
+ $secret = '';
65
+ $rnd = false;
66
+ if (function_exists('random_bytes')) {
67
+ $rnd = random_bytes($secretLength);
68
+ } elseif (function_exists('mcrypt_create_iv')) {
69
+ $rnd = mcrypt_create_iv($secretLength, MCRYPT_DEV_URANDOM);
70
+ } elseif (function_exists('openssl_random_pseudo_bytes')) {
71
+ $rnd = openssl_random_pseudo_bytes($secretLength, $cryptoStrong);
72
+ if (!$cryptoStrong) {
73
+ $rnd = false;
74
+ }
75
+ }
76
+ if ($rnd !== false) {
77
+ for ($i = 0; $i < $secretLength; ++$i) {
78
+ $secret .= $validChars[ord($rnd[$i]) & 31];
79
+ }
80
+ } else {
81
+ throw new Exception('No source of secure random');
82
+ }
83
+
84
+ return $secret;
85
+ }
86
+
87
+ function _getBase32LookupTable()
88
+ {
89
+ return array(
90
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
91
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
92
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
93
+ 'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
94
+ '=', // padding char
95
+ );
96
+ }
97
+
98
+ function verifyCode($secret, $code,$discrepancy = 1, $currentTimeSlice = null)
99
+ {
100
+ global $Mo2fdbQueries;
101
+
102
+ if ($currentTimeSlice === null) {
103
+ $currentTimeSlice = floor(time() / 30);
104
+ }
105
+
106
+ if (strlen($code) != 6) {
107
+ return false;
108
+ }
109
+ for ($i = -$discrepancy; $i <= $discrepancy; ++$i) {
110
+ $calculatedCode = $this->getCode($secret, $currentTimeSlice + $i);
111
+ if ($this->timingSafeEquals($calculatedCode, $code)) {
112
+ $response=array("status"=>'SUCCESS');
113
+ return $response;
114
+ }
115
+ }
116
+
117
+ return false;
118
+ }
119
+
120
+ function geturl($secret,$issuer,$email){
121
+ // id can be email or name
122
+ $url="otpauth://totp/";
123
+
124
+ $url.=$email."?secret=".$secret."&issuer=".$issuer;
125
+ return $url;
126
+
127
+ //aksjdbdzcaasd?secret=4RNWQWBQH4JDPABP&issuer=miniOrange/competits";
128
+
129
+ }
130
+
131
+ function timingSafeEquals($safeString, $userString)
132
+ {
133
+ if (function_exists('hash_equals')) {
134
+ return hash_equals($safeString, $userString);
135
+ }
136
+ $safeLen = strlen($safeString);
137
+ $userLen = strlen($userString);
138
+
139
+ if ($userLen != $safeLen) {
140
+ return false;
141
+ }
142
+
143
+ $result = 0;
144
+
145
+ for ($i = 0; $i < $userLen; ++$i) {
146
+ $result |= (ord($safeString[$i]) ^ ord($userString[$i]));
147
+ }
148
+
149
+ // They are only identical strings if $result is exactly 0...
150
+ return $result === 0;
151
+ }
152
+
153
+ function getCode($secret, $timeSlice = null)
154
+ {
155
+ if ($timeSlice === null) {
156
+ $timeSlice = floor(time() / 30);
157
+ }
158
+
159
+ $secretkey = $this->_base32Decode($secret);
160
+ // Pack time into binary string
161
+ $time = chr(0).chr(0).chr(0).chr(0). pack('N*', $timeSlice);
162
+ // Hash it with users secret key
163
+ $hm = hash_hmac('SHA1', $time, $secretkey, true);
164
+
165
+ // Use last nipple of result as index/offset
166
+ $offset = ord(substr($hm, -1)) & 0x0F;
167
+
168
+ // grab 4 bytes of the result
169
+ $hashpart = substr($hm, $offset, 4);
170
+ // Unpak binary value
171
+ $value = unpack('N', $hashpart);
172
+ $value = $value[1];
173
+ // Only 32 bits
174
+ $value = $value & 0x7FFFFFFF;
175
+ $modulo = pow(10, $this->_codeLength);
176
+ return str_pad($value % $modulo, $this->_codeLength, '0', STR_PAD_LEFT);
177
+ }
178
+
179
+ function _base32Decode($secret)
180
+ {
181
+ if (empty($secret)) {
182
+ return '';
183
+ }
184
+ $base32chars = $this->_getBase32LookupTable();
185
+ $base32charsFlipped = array_flip($base32chars);
186
+
187
+ $paddingCharCount = substr_count($secret, $base32chars[32]);
188
+ $allowedValues = array(6, 4, 3, 1, 0);
189
+ if (!in_array($paddingCharCount, $allowedValues)) {
190
+ return false;
191
+ }
192
+
193
+
194
+ for ($i = 0; $i < 4; ++$i) {
195
+ if ($paddingCharCount == $allowedValues[$i] &&
196
+ substr($secret, -($allowedValues[$i])) != str_repeat($base32chars[32], $allowedValues[$i])) {
197
+ return false;
198
+ }
199
+ }
200
+ $secret = str_replace('=', '', $secret);
201
+ $secret = str_split($secret);
202
+ $binaryString = '';
203
+ for ($i = 0; $i < count($secret); $i = $i + 8) {
204
+ $x = '';
205
+ if (!in_array($secret[$i], $base32chars)) {
206
+ return false;
207
+ }
208
+ for ($j = 0; $j < 8; ++$j) {
209
+
210
+ $x .= str_pad(base_convert(@$base32charsFlipped[@$secret[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
211
+ }
212
+ $eightBits = str_split($x, 8);
213
+ for ($z = 0; $z < count($eightBits); ++$z) {
214
+ $binaryString .= (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
215
+
216
+ }
217
+ }
218
+
219
+ return $binaryString;
220
+ }
221
+
222
+ public static function mo2f_GAuth_get_option($option,$val=null){
223
+ if(is_multisite()){
224
+
225
+ $val=get_site_option($option,$val);
226
+
227
+ }else{
228
+ $val=get_option($option,$val);
229
+ }
230
+
231
+ return $val;
232
+
233
+ }
234
+ }
235
+ ?>
handler/logger.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class 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 Logger;
handler/login.php ADDED
@@ -0,0 +1,313 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class LoginHandler
4
+ {
5
+ function __construct()
6
+ {
7
+ add_action( 'init' , array( $this, 'mo_wpns_init' ) );
8
+
9
+ if(get_option('mo2f_enforce_strong_passswords') || get_option('mo_wpns_activate_recaptcha_for_login')
10
+ || get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
11
+ {
12
+
13
+ remove_filter('authenticate' , 'wp_authenticate_username_password' ,20 );
14
+ add_filter ('authenticate' , array( $this, 'custom_authenticate' ) ,1, 3 );
15
+ }
16
+ if(get_option('mo2f_enable_brute_force'))
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
+
29
+ function mo_wpns_init()
30
+ {
31
+ global $moWpnsUtility,$dirName;
32
+ $WAFEnabled = get_option('WAFEnabled');
33
+ $WAFLevel = get_option('WAF');
34
+ if($WAFEnabled == 1)
35
+ {
36
+ if($WAFLevel == 'PluginLevel')
37
+ {
38
+ if(file_exists($dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php'))
39
+ include_once($dirName .'handler'.DIRECTORY_SEPARATOR.'WAF'.DIRECTORY_SEPARATOR.'mo-waf-plugin.php');
40
+ else
41
+ {
42
+ //UNable to find file. Please reconfigure.
43
+ }
44
+ }
45
+ }
46
+
47
+
48
+ $userIp = $moWpnsUtility->get_client_ip();
49
+ $mo_wpns_config = new MoWpnsHandler();
50
+ $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
51
+ $isIpBlocked = false;
52
+ if(!$isWhitelisted){
53
+ $isIpBlocked = $mo_wpns_config->is_ip_blocked_in_anyway($userIp);
54
+ }
55
+ if($isIpBlocked)
56
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'error'.DIRECTORY_SEPARATOR.'403.php';
57
+
58
+
59
+ $requested_uri = $_SERVER["REQUEST_URI"];
60
+ $option = false;
61
+ if (is_user_logged_in()) { //chr?
62
+ if (strpos($requested_uri, chr(get_option('login_page_url'))) != false) {
63
+ wp_redirect(site_url());
64
+ die;
65
+ }
66
+ } else {
67
+ $option = get_option('mo_wpns_enable_rename_login_url');
68
+ }
69
+ if ($option) {
70
+ if (strpos($requested_uri, '/wp-login.php?checkemail=confirm') !== false) {
71
+ $requested_uri = str_replace("wp-login.php","",$requested_uri);
72
+ wp_redirect($requested_uri);
73
+ die;
74
+ } else if (strpos($requested_uri, '/wp-login.php?checkemail=registered') !== false) {
75
+ $requested_uri = str_replace("wp-login.php","",$requested_uri);
76
+ wp_redirect($requested_uri);
77
+ die;
78
+ }
79
+
80
+ if (strpos($requested_uri, '/wp-login.php') !== false) {
81
+ wp_redirect(site_url());
82
+ }
83
+ else if (strpos($requested_uri, get_option('login_page_url')) !== false ) {
84
+ @require_once ABSPATH . 'wp-login.php';
85
+ die;
86
+ }
87
+ }
88
+
89
+ if(isset($_POST['option']))
90
+ {
91
+ switch($_POST['option'])
92
+ {
93
+ case "mo_wpns_change_password":
94
+ $this->handle_change_password($_POST['username']
95
+ ,$_POST['new_password'],$_POST['confirm_password']);
96
+ break;
97
+ }
98
+ }
99
+
100
+ }
101
+
102
+ function wooc_validate_user_captcha_register($username, $email, $validation_errors) {
103
+
104
+ if (empty($_POST['g-recaptcha-response'])) {
105
+ $validation_errors->add( 'woocommerce_recaptcha_error', __('Please verify the captcha', 'woocommerce' ) );
106
+ }
107
+ }
108
+
109
+ //Function to Handle Change Password Form
110
+ function handle_change_password($username,$newpassword,$confirmpassword)
111
+ {
112
+ global $dirName;
113
+ $user = get_user_by("login",$username);
114
+ $error = wp_authenticate_username_password($user,$username,$newpassword);
115
+
116
+ if(is_wp_error($error))
117
+ {
118
+ $this->mo_wpns_login_failed($username);
119
+ return $error;
120
+ }
121
+
122
+ if($this->update_strong_password($username,$newpassword,$confirmpassword)=="success")
123
+ {
124
+ wp_set_auth_cookie($user->ID,false,false);
125
+ $this->mo_wpns_login_success($username);
126
+ wp_redirect(get_option('siteurl'),301);
127
+ }
128
+ }
129
+
130
+
131
+ //Function to Update User password
132
+ function update_strong_password($username,$newpassword,$confirmpassword)
133
+ {
134
+ global $dirName;
135
+
136
+ if(strlen($newpassword) > 5 && preg_match("#[0-9]+#", $newpassword) && preg_match("#[a-zA-Z]+#", $newpassword)
137
+ && preg_match('/[^a-zA-Z\d]/', $newpassword) && $newpassword==$confirmpassword)
138
+ {
139
+ $user = get_user_by("login",$username);
140
+ wp_set_password($_POST['new_password'],$user->ID);
141
+ return "success";
142
+ }
143
+ else
144
+ include $dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
145
+ }
146
+
147
+
148
+ //Our custom logic for user authentication
149
+ function custom_authenticate($user, $username, $password)
150
+ {
151
+ global $moWpnsUtility;
152
+ $error = new WP_Error();
153
+
154
+ if(empty($username) && empty ($password))
155
+ return $error;
156
+
157
+ if(empty($username)) {
158
+ $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
159
+ }
160
+ if(empty($password)) {
161
+ $error->add('empty_password', __('<strong>ERROR</strong>: Invalid username or Password.'));
162
+ }
163
+
164
+ $user = wp_authenticate_username_password( $user, $username, $password );
165
+
166
+ if ( is_wp_error( $user ) ) {
167
+ $error->add('empty_username', __('<strong>ERROR</strong>: Invalid username or Password.'));
168
+ return $user;
169
+ }
170
+
171
+ if(empty($error->errors))
172
+ {
173
+ $user = get_user_by("login",$username);
174
+
175
+ if($user)
176
+ {
177
+
178
+ if(get_option('mo_wpns_activate_recaptcha_for_login'))
179
+ $recaptchaError = $moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response']);
180
+
181
+ if(!empty($recaptchaError->errors))
182
+ $error = $recaptchaError;
183
+ if(empty($error->errors)){
184
+ if(!get_option('mo2f_enable_brute_force'))
185
+ {
186
+ $this->mo_wpns_login_success($username);
187
+ }
188
+ return $user;
189
+ }
190
+ }
191
+ else
192
+ $error->add('empty_password', __('<strong>ERROR</strong>: Invalid Username or password.'));
193
+
194
+ }
195
+
196
+ return $error;
197
+ }
198
+
199
+
200
+ //Function to check user password
201
+ function check_password($user,$error,$password)
202
+ {
203
+ global $moWpnsUtility, $dirName;
204
+
205
+ if ( wp_check_password( $password, $user->data->user_pass, $user->ID) )
206
+ {
207
+ if($moWpnsUtility->check_user_password_strength($user,$password,"")=="success")
208
+ {
209
+ if(get_option('mo2f_enable_brute_force'))
210
+ $this->mo_wpns_login_success($user->data->user_login);
211
+ return $user;
212
+ }
213
+ else
214
+ include $dirName . 'controllers'.DIRECTORY_SEPARATOR.'change-password.php';
215
+ }
216
+ else
217
+ $error->add('empty_password', __('<strong>ERROR</strong>: Wrong password.'));
218
+
219
+ return $error;
220
+ }
221
+
222
+
223
+ //Function to handle successful user login
224
+ function mo_wpns_login_success($username)
225
+ {
226
+ global $moWpnsUtility;
227
+
228
+ $mo_wpns_config = new MoWpnsHandler();
229
+ $userIp = $moWpnsUtility->get_client_ip();
230
+
231
+ $mo_wpns_config->move_failed_transactions_to_past_failed($userIp);
232
+
233
+ if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
234
+ $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::LOGGED_IN_FROM_NEW_IP);
235
+
236
+
237
+ $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::SUCCESS);
238
+ }
239
+
240
+
241
+ //Function to handle failed user login attempt
242
+ function mo_wpns_login_failed($username)
243
+ {
244
+ global $moWpnsUtility;
245
+ $userIp = $moWpnsUtility->get_client_ip();
246
+
247
+ if(empty($userIp) || empty($username) || !get_option('mo2f_enable_brute_force'))
248
+ return;
249
+
250
+ $mo_wpns_config = new MoWpnsHandler();
251
+ $isWhitelisted = $mo_wpns_config->is_whitelisted($userIp);
252
+
253
+ $mo_wpns_config->add_transactions($userIp, $username, MoWpnsConstants::LOGIN_TRANSACTION, MoWpnsConstants::FAILED);
254
+
255
+ if(!$isWhitelisted)
256
+ {
257
+
258
+
259
+ if(get_option('mo_wpns_enable_unusual_activity_email_to_user'))
260
+ $moWpnsUtility->sendNotificationToUserForUnusualActivities($username, $userIp, MoWpnsConstants::FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP);
261
+
262
+ $failedAttempts = $mo_wpns_config->get_failed_attempts_count($userIp);
263
+ $allowedLoginAttepts = get_option('mo2f_allwed_login_attempts') ? get_option('mo2f_allwed_login_attempts') : 10;
264
+
265
+ if($allowedLoginAttepts - $failedAttempts<=0)
266
+ $this->handle_login_attempt_exceeded($userIp);
267
+ else if(get_option('mo2f_show_remaining_attempts'))
268
+ $this->show_limit_login_left($allowedLoginAttepts,$failedAttempts);
269
+ }
270
+
271
+ }
272
+
273
+
274
+
275
+
276
+
277
+ //Function to show number of attempts remaining
278
+ function show_limit_login_left($allowedLoginAttepts,$failedAttempts)
279
+ {
280
+ global $error;
281
+ $diff = $allowedLoginAttepts - $failedAttempts;
282
+ $error = "<br>You have <b>".$diff."</b> login attempts remaining.";
283
+ }
284
+
285
+
286
+ //Function to handle login limit exceeded
287
+ function handle_login_attempt_exceeded($userIp)
288
+ {
289
+ global $moWpnsUtility, $dirName;
290
+ $mo_wpns_config = new MoWpnsHandler();
291
+ $mo_wpns_config->block_ip($userIp, MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED, false);
292
+ include $dirName . 'views'.DIRECTORY_SEPARATOR.'error'.DIRECTORY_SEPARATOR.'403.php';
293
+ }
294
+
295
+ function setup_registration_closed($user){
296
+ global $Mo2fdbQueries;
297
+ if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
298
+ $nonce = $_POST['mo2f_registration_closed_nonce'];
299
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
300
+ $error = new WP_Error();
301
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
302
+ return $error;
303
+ } else {
304
+ if(!$Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID) =='MO_2_FACTOR_PLUGIN_SETTINGS'){
305
+ //$Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => '' ) );
306
+ delete_user_meta( $user->ID, 'register_account_popup' );
307
+ }
308
+ }
309
+ }
310
+ }
311
+
312
+ }
313
+ new LoginHandler;
handler/malware_scanner.php ADDED
@@ -0,0 +1,446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Mo_wpns_Scan_Handler{
4
+ private $nooffiles=0;
5
+ private $total_files_to_scan;
6
+ public $scanned_files = array();
7
+ function __construct(){
8
+
9
+ }
10
+ function mo2f_scan_all_files($scan_config){
11
+ update_option('mo_wpns_malware_scan_in_progress','IN PROGRESS');
12
+ ini_set('memory_limit', '-1');
13
+ ini_set('max_execution_time', 0);
14
+ $result = array();
15
+ $folderpaths = array();
16
+ $filepaths = array();
17
+ $wp_repo_file = array();
18
+ $folderNames = "";
19
+ $base = dirname(dirname(dirname(dirname(plugin_dir_path(__FILE__)))));
20
+ $repo_file_path=$base.DIRECTORY_SEPARATOR."wp-content".DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR."miniorange";
21
+ if($scan_config['core_scan'] == 1){
22
+ $folderpaths['base'] = $base;
23
+ $folderNames .= "WP Files;";
24
+ }
25
+ if($scan_config['plugin_scan'] == 1){
26
+ $folderpaths['plugins'] = $base.DIRECTORY_SEPARATOR."wp-content".DIRECTORY_SEPARATOR."plugins";
27
+ $folderNames .= "Plugins;";
28
+ }
29
+ if($scan_config['theme_scan'] == 1){
30
+ $folderpaths['themes'] = $base.DIRECTORY_SEPARATOR."wp-content".DIRECTORY_SEPARATOR."themes";
31
+ $folderNames .= "Themes;";
32
+ }
33
+ if ( ! function_exists( 'get_plugins' ) ) {
34
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
35
+ }
36
+ if ( ! function_exists( 'plugins_api' ) ) {
37
+ require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' );
38
+ }
39
+ if($scan_config['check_repo'] == 1){
40
+ if(!is_dir($repo_file_path)){
41
+ mkdir($repo_file_path);
42
+ }
43
+ if($scan_config['core_scan'] == 1){
44
+ require(ABSPATH . 'wp-includes/version.php');
45
+ //wordpress name to be changed to be changed based on version
46
+ $folderNames .= "WP Repo Files;";
47
+ $zip_name="wp-".$wp_version;
48
+ $wp_repo_file['base']=$repo_file_path.DIRECTORY_SEPARATOR.$zip_name;
49
+ update_option('downloaded_wordpress_repo_name', $zip_name);
50
+ if(!is_dir($repo_file_path.DIRECTORY_SEPARATOR.$zip_name)){
51
+ $this->download_repo($zip_name, $wp_version, $repo_file_path);
52
+ }
53
+ }
54
+ if($scan_config['plugin_scan'] == 1){
55
+ $wp_plugin_repo_file=$repo_file_path.DIRECTORY_SEPARATOR."plugins";
56
+ if(!is_dir($wp_plugin_repo_file)){
57
+ mkdir($wp_plugin_repo_file);
58
+ }
59
+ $wp_repo_file['plugins']=$wp_plugin_repo_file;
60
+ $plugin_list=get_site_transient( 'update_plugins' );
61
+ $all_plugins=array();
62
+ foreach ($plugin_list as $key => $value) {
63
+ if($key=='response'||$key=='no_update'){
64
+ foreach ($value as $ke => $val) {
65
+ $all_plugins[$ke] = $val;
66
+ }
67
+ }
68
+ }
69
+ $this->iterator_plugins_themes($all_plugins, $wp_plugin_repo_file, 'plugins');
70
+ }
71
+ if($scan_config['theme_scan'] == 1){
72
+ $wp_theme_repo_file=$repo_file_path.DIRECTORY_SEPARATOR."themes";
73
+ if(!is_dir($wp_theme_repo_file)){
74
+ mkdir($wp_theme_repo_file);
75
+ }
76
+ $wp_repo_file['themes']=$wp_theme_repo_file;
77
+ $all_themes=get_site_transient( 'update_themes' )->checked;
78
+ $this->iterator_plugins_themes($all_themes, $wp_theme_repo_file, 'themes');
79
+ }
80
+ }
81
+ $mo2f_malware_db_handler = new MoWpnsDB();
82
+ $reportid = $mo2f_malware_db_handler->create_scan_report($folderNames, $scan_config['type_scan']);
83
+ $result = $this->get_scan_result($folderpaths, $wp_repo_file, $scan_config);
84
+ if($result){
85
+ foreach ($result as $key => $value) {
86
+ $mo2f_malware_db_handler->add_report_details($reportid, $key, $value);
87
+ }
88
+ }
89
+ $mo2f_malware_db_handler->scan_report_complete($reportid, $this->nooffiles);
90
+ if(is_dir($repo_file_path)){
91
+ $this->remove_dir($repo_file_path);
92
+ }
93
+ global $dirName;
94
+ update_option('mo_wpns_malware_scan_in_progress','COMPLETE');
95
+ include_once $dirName. DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'malware_scan_result.php';
96
+ include_once $dirName.DIRECTORY_SEPARATOR. 'views'.DIRECTORY_SEPARATOR.'scan_report_view.php';
97
+ $total_scan=$mo2f_malware_db_handler->count_files();
98
+ $total_malicious=$mo2f_malware_db_handler->count_malicious_files();
99
+ $last_scan=$mo2f_malware_db_handler->count_files_last_scan($reportid);
100
+ $malicious_last_scan=$mo2f_malware_db_handler->count_malicious_last_scan($reportid);
101
+ $response=array('total_files'=>$total_scan, 'total_mal'=>$total_malicious, 'scan_files'=>$last_scan, 'mal_files'=>$malicious_last_scan);
102
+ echo showScanResults();
103
+ echo show_summary();
104
+ exit;
105
+ }
106
+
107
+ function iterator_plugins_themes($themes_or_plugins, $path, $type=''){
108
+ foreach($themes_or_plugins as $key => $data){
109
+ if($type=='plugins'){
110
+ $plugin_slug=$data->slug;
111
+ $plugin_directory_location=dirname(dirname(dirname($path))).DIRECTORY_SEPARATOR.'plugins';
112
+ $plugin_data=get_plugin_data($plugin_directory_location.DIRECTORY_SEPARATOR.$data->plugin);
113
+ $plugin_version=$plugin_data['Version'];
114
+ if(!is_dir($path.DIRECTORY_SEPARATOR.$plugin_slug)){
115
+ $result= $this->download_repo($plugin_slug, $plugin_version, $path, $type);
116
+ }
117
+ } else if($type=='themes'){
118
+ if(!is_dir($path.DIRECTORY_SEPARATOR.$key)){
119
+ $result= $this->download_repo($key, $data, $path, $type);
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ function download_repo($zip_name, $version, $path, $type=''){
126
+ if ($type=='plugins') {
127
+ $download_link="https://downloads.wordpress.org/plugin/".$zip_name.".".$version.".zip";
128
+ $plugin_name=$zip_name.'.'.$version;
129
+ $download_result=@file_put_contents($path.DIRECTORY_SEPARATOR.$zip_name.".zip", file_get_contents($download_link));
130
+ if( $download_result){
131
+ $result = $this->unzip_downloaded_repo($zip_name, $path);
132
+ }else {
133
+ $download_link="https://downloads.wordpress.org/plugin/".$zip_name.".zip";
134
+ $download_result=@file_put_contents($path.DIRECTORY_SEPARATOR.$zip_name.".zip", file_get_contents($download_link));
135
+ if( $download_result){
136
+ $result = $this->unzip_downloaded_repo($zip_name, $path);
137
+ }else {
138
+ error_log("Unable to download Plugins");
139
+ }
140
+ }
141
+ } else if($type=='themes'){
142
+ $download_link="https://downloads.wordpress.org/theme/".$zip_name.".".$version.".zip";
143
+ $plugin_name=$zip_name.'.'.$version;
144
+ $download_result=@file_put_contents($path.DIRECTORY_SEPARATOR.$zip_name.".zip", file_get_contents($download_link));
145
+ if( $download_result){
146
+ $result = $this->unzip_downloaded_repo($zip_name, $path);
147
+ }else {
148
+ $download_link="https://downloads.wordpress.org/theme/".$zip_name.".zip";
149
+ $download_result=@file_put_contents($path.DIRECTORY_SEPARATOR.$zip_name.".zip", file_get_contents($download_link));
150
+ if( $download_result){
151
+ $result = $this->unzip_downloaded_repo($zip_name, $path);
152
+ }else {
153
+ error_log("Unable to download Themes");
154
+ }
155
+ }
156
+ } else {
157
+ $download_link="https://wordpress.org/wordpress-".$version.".zip";
158
+ $download_result=@file_put_contents($path.DIRECTORY_SEPARATOR.$zip_name.'.zip', file_get_contents($download_link));
159
+ if($download_result){
160
+ $result=$this->unzip_downloaded_repo($zip_name, $path);
161
+ } else {
162
+ error_log("Unable to download wordpress");
163
+ }
164
+ }
165
+ }
166
+
167
+ function unzip_downloaded_repo($name, $path){
168
+ $zip = new ZipArchive;
169
+ $folder_path=$path.DIRECTORY_SEPARATOR.$name.".zip";
170
+ $res = $zip->open($folder_path);
171
+ if ($res === TRUE) {
172
+ // extract it to the path we determined above
173
+ $zip->extractTo($path);
174
+ $zip->close();
175
+ if ($name == get_option('downloaded_wordpress_repo_name')) {
176
+ rename($path.DIRECTORY_SEPARATOR."wordpress", $path.DIRECTORY_SEPARATOR.$name);
177
+ }
178
+ unlink($folder_path);
179
+ return true;
180
+ } else {
181
+ return false;
182
+ }
183
+ }
184
+
185
+ function get_scan_result($folderpaths=array(), $repo_folder_path=array(), $scan_config){
186
+ $nooffiles=0;
187
+ if(!empty($folderpaths)){
188
+ if ( in_array( 'curl', get_loaded_extensions() ) ) {
189
+ $base = dirname(dirname(dirname(dirname(plugin_dir_path(__FILE__)))));
190
+ $wp_default_plugins = ['index.php', 'hello.php', 'akismet'];
191
+ $wp_default_themes = ['index.php', 'twentynineteen', 'twentyseventeen', 'twentysixteen'];
192
+ $wp_repo_files=array();
193
+ $plugin_repo_files=array();
194
+ $theme_repo_files=array();
195
+ $scanresults=array();
196
+ $extensions=['php'];
197
+ $mo2f_malware_db_handler = new MoWpnsDB();
198
+
199
+ $folder_paths=array();
200
+ if($scan_config['core_scan'] == 1){
201
+ $folder_paths[0]=$folderpaths['base'];
202
+ }
203
+ else{
204
+ $folder_paths=$folderpaths;
205
+ }
206
+ foreach ($folder_paths as $value) {
207
+ if (is_dir($value)) {
208
+ foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($value, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) {
209
+ if ($item->isFile()) {
210
+ $scanresult=array();
211
+ $source_file_path = $value . DIRECTORY_SEPARATOR . $iterator->getSubPathName();
212
+ if ($value == $base.DIRECTORY_SEPARATOR.'wp-content'.DIRECTORY_SEPARATOR.'plugins' && in_array(explode(DIRECTORY_SEPARATOR,$iterator->getSubPathName())[0], $wp_default_themes)){
213
+ continue;
214
+ } elseif ($value == $base.DIRECTORY_SEPARATOR.'wp-content'.DIRECTORY_SEPARATOR.'themes' && in_array(explode(DIRECTORY_SEPARATOR,$iterator->getSubPathName())[0], $wp_default_plugins)){
215
+ continue;
216
+ } elseif ($value == $base && ($scan_config['core_scan'] == 1)){
217
+ if(count(explode('wp-content'.DIRECTORY_SEPARATOR, $iterator->getSubPathName()))>1){
218
+ if(explode(DIRECTORY_SEPARATOR,explode('wp-content'.DIRECTORY_SEPARATOR, $iterator->getSubPathName())[1])[0]=='plugins'){
219
+ if (!in_array(explode(DIRECTORY_SEPARATOR,explode('wp-content'.DIRECTORY_SEPARATOR.'plugins'.DIRECTORY_SEPARATOR,$iterator->getSubPathName())[1])[0], $wp_default_plugins)) {
220
+ continue;
221
+ }
222
+ } else if(explode(DIRECTORY_SEPARATOR,explode('wp-content'.DIRECTORY_SEPARATOR,$iterator->getSubPathName())[1])[0]=='themes'){
223
+ if (!in_array(explode(DIRECTORY_SEPARATOR,explode('wp-content'.DIRECTORY_SEPARATOR.'themes'.DIRECTORY_SEPARATOR,$iterator->getSubPathName())[1])[0], $wp_default_themes)) {
224
+ continue;
225
+ }
226
+ } else if(count(explode('wp-content'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR, $iterator->getSubPathName()))>1){
227
+ if(explode(DIRECTORY_SEPARATOR,explode('wp-content'.DIRECTORY_SEPARATOR.'uploads'.DIRECTORY_SEPARATOR,$iterator->getSubPathName())[1])[0]=='miniorange'){
228
+ continue;
229
+ }
230
+ }
231
+ }
232
+ }
233
+ $this->nooffiles++;
234
+ $file_content=file_get_contents($source_file_path);
235
+ if($scan_config['check_repo'] == 1){
236
+ $repo_path=$base.DIRECTORY_SEPARATOR."wp-content".DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR."miniorange";
237
+ if($value==$base){
238
+ array_push($wp_repo_files, $iterator->getSubPathName());
239
+ $repo_file_path=$repo_path . DIRECTORY_SEPARATOR . get_option('downloaded_wordpress_repo_name');
240
+
241
+ } elseif ($value == $base.DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins') {
242
+ array_push($plugin_repo_files, $iterator->getSubPathName());
243
+ $repo_file_path=$repo_path . DIRECTORY_SEPARATOR . 'plugins';
244
+
245
+ } elseif ($value == $base.DIRECTORY_SEPARATOR . 'wp-content' . DIRECTORY_SEPARATOR . 'themes') {
246
+ array_push($theme_repo_files, $iterator->getSubPathName());
247
+ $repo_file_path=$repo_path . DIRECTORY_SEPARATOR . 'themes';
248
+ }
249
+ $issues = $this->check_with_repo_files($file_content, $repo_file_path.DIRECTORY_SEPARATOR.$iterator->getSubPathName());
250
+ if(!empty($issues)){
251
+ $scanresult['repo']=$issues;
252
+ }
253
+ }
254
+
255
+ $hash_of_file= md5_file($source_file_path);
256
+ $res=$mo2f_malware_db_handler->check_hash($hash_of_file);
257
+ if($res){}
258
+ else{
259
+ $flag_update=0;
260
+ if(($scan_config['check_vulnerable'] == 1) || ($scan_config['check_sql'] == 1)){
261
+ $contents = file_get_contents($source_file_path);
262
+ $result = array();
263
+ $result = $this->check_vulnerable_code($contents);
264
+ if(!empty($result)){
265
+ $flag_update=1;
266
+ foreach ($result as $index => $type_inf) {
267
+ if($type_inf['i'] == 'vlc'){
268
+ $scanresult['Vulnerable Code'] = $result;
269
+ }else if($type_inf['i'] == 'shc'){
270
+ $scanresult['Shell Script'] = $result;
271
+ }else if($type_inf['i'] == 'sqc'){
272
+ $scanresult['SQL Injection'] = $result;
273
+ }
274
+ }
275
+ }
276
+ }
277
+ $ext = pathinfo($source_file_path, PATHINFO_EXTENSION);
278
+ if(in_array($ext,$extensions)){
279
+
280
+ if($scan_config['ext_link_check'] == 1){
281
+ $elresult= $this->check_external_link($file_content);
282
+ if(!empty($elresult)){
283
+ $flag_update=1;
284
+ $scanresult['extl']=$elresult;
285
+ }
286
+ }
287
+ }
288
+ if($flag_update == 0){
289
+ $mo2f_malware_db_handler->insert_hash($source_file_path,$hash_of_file);
290
+ }
291
+ }
292
+
293
+
294
+ if(!empty($scanresult))
295
+ $scanresults[$source_file_path]=$scanresult;
296
+
297
+ }
298
+ }
299
+ }
300
+ }
301
+
302
+
303
+ return $scanresults;
304
+ }else{
305
+ return array('message'=>'CURL not installed on the server.');
306
+ }
307
+ } else {
308
+ return array('message'=>'No folder selected for scanning.');
309
+ }
310
+ }
311
+
312
+ function check_with_repo_files($file_content, $repo_file_path){
313
+ $issues = array();
314
+ if(file_exists($repo_file_path)){
315
+ $content=@file_get_contents($repo_file_path);
316
+ $hash_repo = md5($content);
317
+ $hash_file = md5($file_content);
318
+ if ($hash_file != $hash_repo) {
319
+ $issues=array("exist" => "Mismatch in Files");
320
+ }
321
+ } else {
322
+ $issues=array('exist'=>'Unwanted File Found');
323
+ }
324
+ return $issues;
325
+ }
326
+
327
+ function getlines($contents, $href){
328
+ $newissues = 0;
329
+ $lines = preg_split("/((\r?\n)|(\r\n?))/", $contents);
330
+ for($i=0; $i<count($lines); $i++){
331
+ $line = $lines[$i];
332
+ if (strpos($line, $href) !== false) {
333
+ $newissues = $i+1;
334
+ }
335
+ }
336
+ return $newissues;
337
+ }
338
+
339
+ function check_external_link($contents){
340
+ $issues = array();
341
+ $hrefs = preg_match_all('/<a\s+(?:[^"\'>]+|"[^"]*"|\'[^\']*\')*href=("[^"]+"|\'[^\'‌​]+\'|[^<>\s]+)/i', $contents, $matches) ? $matches: array();
342
+ if(isset($hrefs[1])){
343
+ foreach($hrefs[1] as $href){
344
+ if($this->isexternal($href)){
345
+ $line=$this->getlines($contents, $href);
346
+ $issues[] = array("i"=>"eld", "d"=>$href, "l"=>$line);
347
+ }
348
+ }
349
+ }
350
+ return $issues;
351
+ }
352
+
353
+ function isexternal($url) {
354
+ $url = trim($url);
355
+ $url = trim($url,';');
356
+ $url = trim($url,'(');
357
+ $url = trim($url,')');
358
+ $url = trim($url,"'");
359
+ $url = trim($url,'"');
360
+ $components = parse_url($url);
361
+ if(!empty($components['host']) && strpos(strtolower($components['host']),strtolower($_SERVER['HTTP_HOST'])) === false){
362
+ return true;
363
+ }
364
+ return false;
365
+ }
366
+ function check_vulnerable_code($contents){
367
+ $issues = array();
368
+ $tokens = token_get_all($contents);
369
+
370
+ for($i=0; $i< sizeof($tokens); $i++) {
371
+ $token = $tokens[$i];
372
+ if (is_array($token)) {
373
+ if(in_array(token_name($token[0]), array("T_EVAL"))){
374
+ $issue = $this->getFunctionArgumentsOrEnclosedString("eval", $tokens, $i+1, "vlc", false);
375
+ if(!empty($issue))
376
+ $issues[] = $issue;
377
+ } else if(in_array(token_name($token[0]), array("T_STRING"))){
378
+ if(in_array($token[1],array("fopen","popen","fsockopen","file_get_contents"))){
379
+ $issue = $this->getFunctionArgumentsOrEnclosedString($token[1], $tokens, $i+1, "vlc", true);
380
+ if(!empty($issue))
381
+ $issues[] = $issue;
382
+ } else if(in_array($token[1],array("assert"))){
383
+ $issue = $this->getFunctionArgumentsOrEnclosedString($token[1], $tokens, $i+1, "vlc", false);
384
+ if(!empty($issue))
385
+ $issues[] = $issue;
386
+ } else if(in_array($token[1],array("exec","shell_exec","passthru","system","proc_"))){
387
+ $issue = $this->getFunctionArgumentsOrEnclosedString($token[1], $tokens, $i+1, "shc", false);
388
+ if(!empty($issue))
389
+ $issues[] = $issue;
390
+ } else if(in_array($token[1],array("mysqli","mysql_connect","mysqli_connect","mysqli_real_connect","PDO"))){
391
+ $issue = $this->getFunctionArgumentsOrEnclosedString($token[1], $tokens, $i+1, "sqc", false);
392
+ if(!empty($issue))
393
+ $issues[] = $issue;
394
+ }
395
+ }
396
+ }
397
+ }
398
+ return $issues;
399
+ }
400
+
401
+ function getFunctionArgumentsOrEnclosedString($issueFunction, $tokens, $start, $issuetype, $checkForExternalLink){
402
+
403
+ $flag = 1;
404
+ $argument = "";
405
+ $line = "";
406
+ $issue = array();
407
+ for($j=$start; $j< sizeof($tokens); $j++) {
408
+ $innertoken = $tokens[$j];
409
+ if ($flag==1 && is_array($innertoken)) {
410
+ $argument .= $innertoken[1];
411
+ if(empty($line))
412
+ $line = $innertoken[2];
413
+ } else if($innertoken==";"){
414
+ $argument .= ";";
415
+ if($checkForExternalLink){
416
+ if($this->isexternal($argument)){
417
+ $issue = array("l"=>$line, "t"=> $issueFunction, "i"=>$issuetype, "d"=>$argument);
418
+ }
419
+ } else {
420
+ $issue = array("l"=>$line, "t"=> $issueFunction, "i"=>$issuetype, "d"=>$argument);
421
+ }
422
+ break;
423
+ } else if($flag==1){
424
+ $argument .= $innertoken;
425
+ }
426
+ }
427
+ return $issue;
428
+ }
429
+
430
+ function remove_dir($repo_path){
431
+ $dir=$repo_path;
432
+ $it = new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS);
433
+ $files = new RecursiveIteratorIterator($it,RecursiveIteratorIterator::CHILD_FIRST);
434
+ foreach($files as $file) {
435
+ if ($file->isDir()){
436
+ rmdir($file->getRealPath());
437
+ } else {
438
+ unlink($file->getRealPath());
439
+ }
440
+ }
441
+ rmdir($dir);
442
+ }
443
+
444
+ }
445
+
446
+ ?>
handler/mo-block.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ ?>
3
+ <div style='background-color: #d5e3d9; height:850px;' >
4
+ <div style='height:250px;text-align:center; background-color: #3CB371; border-radius: 2px; padding:2%; '>
5
+ <div class='mo2f_tamplate_layout' style='background-color: #ffffff;border-radius: 4px;box-shadow: 0 5px 15px rgba(0,0,0,.5); width:400px;height:500px; align-self: center; margin: 0 auto; ' >
6
+ <img alt='logo' style='margin-left:10 ;
7
+ margin-top:10px;width:40%;' src='https://auth.miniorange.com/moas/images/logo_large.png' />
8
+ <div><hr></div>
9
+ <b><p style='margin-left:10px; font-size:18px ;margin-top:0px;text-align:center' >
10
+ <?php echo "Blocked"; ?>
11
+ </p></b>
12
+
13
+
14
+ <p style='margin-left: 10px;font-size:large; margin-top: 0px; '>
15
+ <?php echo "Your IP has been blocked."; ?>
16
+ </p>
17
+
18
+ <p style='padding-left: 10px;font-size:large;margin-top: 0; margin-bottom: 10px'>
19
+ <?php echo "Please Contact your Administrator"; ?>
20
+ </p>
21
+
22
+ <table style='margin-left:10px' >
23
+
24
+ </table>
25
+ <p style='margin-left:0px; font-size:1.5em; text-align:center;color:red'>403 Forbidden!</p>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ <?php
30
+ exit();
31
+
32
+ ?>
handler/mo-error.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ ?>
4
+ <div style='background-color: #d5e3d9; height:850px;' >
5
+ <div style='height:250px;text-align:center; background-color: #3CB371; border-radius: 2px; padding:2%; '>
6
+ <div class='mo2f_tamplate_layout' style='background-color: #ffffff;border-radius: 4px;box-shadow: 0 5px 15px rgba(0,0,0,.5); width:400px;height:500px; align-self: center; margin: 0 auto; ' >
7
+ <img alt='logo' style='margin-left:10 ;
8
+ margin-top:10px;width:40%;' src='https://auth.miniorange.com/moas/images/logo_large.png' />
9
+ <div><hr></div>
10
+ <b><p style='margin-left:10px; font-size:18px ;margin-top:0px;text-align:center' >
11
+ Forbidden
12
+
13
+ </p></b>
14
+
15
+
16
+ <p style='margin-left: 10px;font-size:large; margin-top: 0px; '>
17
+ Your request was detected as suspicious.
18
+ </p>
19
+
20
+ <p style='padding-left: 10px;font-size:large;margin-top: 0; margin-bottom: 10px'>
21
+ Please Contact Your Site Administrator if you feel the request is legitimate.
22
+ </p>
23
+
24
+ <table style='margin-left:10px' >
25
+
26
+ </table>
27
+ <p style='margin-left:0px; font-size:1.5em; text-align:center;color:red'>403 Forbidden!</p>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <?php
32
+ exit();
33
+
34
+ ?>
handler/mo-waf-plugin.php ADDED
@@ -0,0 +1,404 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.php");
58
+ }
59
+ }
60
+ $dir_name = dirname(__FILE__);
61
+ $dir_name1 = explode('wp-content', $dir_name);
62
+ $dir_name = $dir_name1[0];
63
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
64
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
65
+
66
+ if($missingFile==1)
67
+ {
68
+ if(!file_exists($fileName))
69
+ {
70
+ $file = fopen($fileName, "a+");
71
+ $string = "<?php".PHP_EOL;
72
+ $string .= '$SQL = '.get_option("SQLInjection").';'.PHP_EOL;
73
+ $string .= '$XSS = '.get_option("XSSAttack").';'.PHP_EOL;
74
+ $string .= '$RFI = '.get_option("RFIAttack").';'.PHP_EOL;
75
+ $string .= '$LFI = '.get_option("LFIAttack").';'.PHP_EOL;
76
+ $string .= '$RCE = '.get_option("RCEAttack").';'.PHP_EOL;
77
+ $string .= '$RateLimiting = '.get_option("Rate_limiting").';'.PHP_EOL;
78
+ $string .= '$RequestsPMin = '.get_option("Rate_request").';'.PHP_EOL;
79
+
80
+ if(get_option('actionRateL') == 0)
81
+ $string .= '$actionRateL = "ThrottleIP";'.PHP_EOL;
82
+ else
83
+ $string .= '$actionRateL = "BlockIP";'.PHP_EOL;
84
+
85
+ $string .= '?>'.PHP_EOL;
86
+ fwrite($file, $string);
87
+ fclose($file);
88
+
89
+ }
90
+
91
+ }
92
+ include_once($fileName);
93
+
94
+
95
+ if($RateLimiting == 1)
96
+ {
97
+ $time = 60;
98
+ $reqLimit = $RequestsPMin;
99
+
100
+ $query = "delete from ".$wpdb->base_prefix."wpns_ip_rate_details where time<".(time()-$time);
101
+ $results = $wpdb->get_results($query);
102
+
103
+ $query = "insert into ".$wpdb->base_prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
104
+ $results = $wpdb->get_results($query);
105
+
106
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
107
+ $results = $wpdb->get_results($query);
108
+
109
+ if($results[0]->count>=$reqLimit)
110
+ {
111
+ $action = $actionRateL;
112
+ if($action == 'ThrottleIP')
113
+ {
114
+ $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
115
+ $results = $wpdb->get_results($query);
116
+ $current_time = time();
117
+ if($results[0]->time < $current_time-60)
118
+ {
119
+ $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'RLE');";
120
+ $results = $wpdb->get_results($query);
121
+ }
122
+ header('HTTP/1.1 403 Forbidden');
123
+ include_once("mo-error.php");
124
+ }
125
+ else
126
+ {
127
+ $query = "select time from ".$wpdb->base_prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
128
+ $results = $wpdb->get_results($query);
129
+ $current_time = time();
130
+ if($results[0]->time < $current_time-60)
131
+ {
132
+ $query = "insert into ".$wpdb->base_prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'RLE');";
133
+ $results = $wpdb->get_results($query);
134
+ }
135
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
136
+ $results1 = $wpdb->get_results($query);
137
+ if(sizeof($results1)!=0)
138
+ {
139
+ //IP whitelisted
140
+ }
141
+ else
142
+ {
143
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','Rate limit exceed',NULL,".current_time( 'timestamp' ).");";
144
+ $results =$wpdb->get_results($query);
145
+ }
146
+ header('HTTP/1.1 403 Forbidden');
147
+ include_once("mo-error.php");
148
+ }
149
+ }
150
+ }
151
+ $attack = array();
152
+ if($SQL==1)
153
+ {
154
+ array_push($attack,"SQL");
155
+ }
156
+ if($XSS==1)
157
+ {
158
+ array_push($attack,"XSS");
159
+ }
160
+ if($LFI==1)
161
+ {
162
+ array_push($attack,"LFI");
163
+ }
164
+
165
+ $attackC = $attack;
166
+ $ParanoiaLevel = 1;
167
+ $annomalyS = 0;
168
+ $SQLScore = 0;
169
+ $XSSScore = 0;
170
+ $limitAttack = get_option('limitAttack');
171
+
172
+
173
+ foreach ($attackC as $key1 => $value1) {
174
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
175
+ {
176
+ if(isset($regex[$value1][$lev]))
177
+ {
178
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
179
+ {
180
+ foreach ($_REQUEST as $key => $value) {
181
+ if($regex[$value1][$lev][$i] != "")
182
+ {
183
+ if(strpos($regex[$value1][$lev][$i], '/') == false)
184
+ {
185
+ if(is_string($value))
186
+ {
187
+
188
+ if(preg_match('/'.$regex[$value1][$lev][$i].'/', $value))
189
+ {
190
+ $scoreValue = 0;
191
+
192
+ $annomalyMS = $score[$value1][$lev][$i];
193
+ if(strcmp($annomalyMS,"CRITICAL")==0)
194
+ {
195
+ $scoreValue = 5;
196
+ }
197
+
198
+ elseif(strcmp($annomalyMS,"WARNING")==0)
199
+ {
200
+ $scoreValue = 3;
201
+ }
202
+ elseif(strcmp($annomalyMS,"ERROR")==0)
203
+ {
204
+ $scoreValue = 4;
205
+ }
206
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
207
+ {
208
+ $scoreValue =2;
209
+ }
210
+
211
+ if($value1 == "SQL")
212
+ {
213
+ $SQLScore += $scoreValue;
214
+
215
+ }
216
+ elseif ($value1 == "XSS")
217
+ {
218
+ $XSSScore += $scoreValue;
219
+ }
220
+ else
221
+ {
222
+ $annomalyS += $scoreValue;
223
+ }
224
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
225
+ {
226
+ $value = htmlspecialchars($value);
227
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
228
+ $results = $wpdb->get_results($query);
229
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
230
+ $results = $wpdb->get_results($query);
231
+ if($results[0]->count>$limitAttack)
232
+ {
233
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
234
+ $results = $wpdb->get_results($query);
235
+ if(sizeof($results)!=0)
236
+ {
237
+ //IP whitelisted
238
+ }
239
+ else
240
+ {
241
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
242
+ $results =$wpdb->get_results($query);
243
+ }
244
+ }
245
+ header('HTTP/1.1 403 Forbidden');
246
+ include_once("mo-error.php");
247
+ }
248
+
249
+ }
250
+ }
251
+ }
252
+ else if (strpos($regex[$value1][$lev][$i], '#') == false) {
253
+ if(is_string($value))
254
+ {
255
+
256
+ if(preg_match('#'.$regex[$value1][$lev][$i].'#', $value))
257
+ {
258
+ $scoreValue = 0;
259
+ $annomalyMS = $score[$value1][$lev][$i];
260
+ if(strcmp($annomalyMS,"CRITICAL")==0)
261
+ {
262
+ $scoreValue = 5;
263
+ }
264
+
265
+ elseif(strcmp($annomalyMS,"WARNING")==0)
266
+ {
267
+ $scoreValue = 3;
268
+ }
269
+ elseif(strcmp($annomalyMS,"ERROR")==0)
270
+ {
271
+ $scoreValue = 4;
272
+ }
273
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
274
+ {
275
+ $scoreValue =2;
276
+ }
277
+
278
+
279
+ if($value1 == "SQL")
280
+ {
281
+ $SQLScore += $scoreValue;
282
+
283
+ }
284
+ elseif ($value1 == "XSS")
285
+ {
286
+ $XSSScore += $scoreValue;
287
+ }
288
+ else
289
+ {
290
+ $annomalyS += $scoreValue;
291
+ }
292
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
293
+ {
294
+ $value = htmlspecialchars($value);
295
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
296
+ $results = $wpdb->get_results($query);
297
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
298
+ $results = $wpdb->get_results($query);
299
+
300
+ if($results[0]->count>$limitAttack)
301
+ {
302
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
303
+ $results = $wpdb->get_results($query);
304
+ if(sizeof($results)!=0)
305
+ {
306
+ //IP whitelisted
307
+ }
308
+ else
309
+ {
310
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
311
+ $results =$wpdb->get_results($query);
312
+ }
313
+ }
314
+ header('HTTP/1.1 403 Forbidden');
315
+ include_once("mo-error.php");
316
+ }
317
+ }
318
+ }
319
+ }
320
+
321
+ elseif (strpos($regex[$value1][$lev][$i], '@') == false) {
322
+ if(is_string($value))
323
+ {
324
+
325
+ if(preg_match('@'.$regex[$value1][$lev][$i].'@', $value))
326
+ {
327
+ $scoreValue = 0;
328
+ $annomalyMS = $score[$value1][$lev][$i];
329
+ if(strcmp($annomalyMS,"CRITICAL")==0)
330
+ {
331
+ $scoreValue = 5;
332
+ }
333
+
334
+ elseif(strcmp($annomalyMS,"WARNING")==0)
335
+ {
336
+ $scoreValue = 3;
337
+ }
338
+ elseif(strcmp($annomalyMS,"ERROR")==0)
339
+ {
340
+ $scoreValue = 4;
341
+ }
342
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
343
+ {
344
+ $scoreValue =2;
345
+ }
346
+
347
+
348
+ if($value1 == "SQL")
349
+ {
350
+ $SQLScore += $scoreValue;
351
+
352
+ }
353
+ elseif ($value1 == "XSS")
354
+ {
355
+ $XSSScore += $scoreValue;
356
+ }
357
+ else
358
+ {
359
+ $annomalyS += $scoreValue;
360
+ }
361
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
362
+ {
363
+ $value = htmlspecialchars($value);
364
+ $query = 'insert into '.$wpdb->base_prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
365
+ $results = $wpdb->get_results($query);
366
+ $query = "select count(*) as count from ".$wpdb->base_prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
367
+ $results = $wpdb->get_results($query);
368
+
369
+ if($results[0]->count>$limitAttack)
370
+ {
371
+ $query = 'select * from '.$wpdb->base_prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
372
+ $results = $wpdb->get_results($query);
373
+ if(sizeof($results)!=0)
374
+ {
375
+ //IP whitelisted
376
+ }
377
+ else
378
+ {
379
+ $query ="insert into ".$wpdb->base_prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".current_time( 'timestamp' ).");";
380
+ $results =$wpdb->get_results($query);
381
+ }
382
+ }
383
+ header('HTTP/1.1 403 Forbidden');
384
+ include_once("mo-error.php");
385
+ }
386
+ }
387
+ }
388
+
389
+ }
390
+
391
+ }
392
+ }
393
+
394
+ }
395
+ }
396
+
397
+ }
398
+ }
399
+
400
+
401
+
402
+
403
+
404
+ ?>
handler/mo-waf.php ADDED
@@ -0,0 +1,590 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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_once($configfile);
16
+ }
17
+ else
18
+ {
19
+ $missingFile = 1;
20
+ }
21
+ include_once($sqlInjectionFile);
22
+ include_once($xssFile);
23
+ include_once($lfiFile);
24
+
25
+ $dir_name = explode('wp-content', $dir);
26
+ $file = file_get_contents($dir_name[0].'wp-config.php');
27
+ $content = explode("\n", $file);
28
+ $len = sizeof($content);
29
+ $Ismultisite = 0;
30
+ $dbD = array('DB_NAME' =>'' ,'DB_USER' => '' ,'DB_PASSWORD' =>'','DB_HOST' =>'','DB_CHARSET' =>'','DB_COLLATE' =>'' );
31
+
32
+ $prefix = 'wp_';
33
+
34
+ for($i=0;$i<$len;$i++)
35
+ {
36
+
37
+ if(preg_match("/define/", $content[$i]))
38
+ {
39
+ $cont = explode(",", $content[$i]);
40
+ $string = str_replace(array('define(',' ','\''), '', $cont[0]);
41
+ switch ($string) {
42
+ case "DB_NAME":
43
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
44
+ $res = preg_replace('/\s/', '', $res);
45
+ $dbD['DB_NAME'] = $res;
46
+ break;
47
+ case 'DB_USER':
48
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
49
+ $res = preg_replace('/\s/', '', $res);
50
+ $dbD['DB_USER'] = $res;
51
+ break;
52
+ case "DB_PASSWORD":
53
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
54
+ $res = preg_replace('/\s/', '', $res);
55
+ $dbD['DB_PASSWORD'] = $res;
56
+ break;
57
+ case 'DB_HOST':
58
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
59
+ $res = preg_replace('/\s/', '', $res);
60
+ $dbD['DB_HOST'] = $res;
61
+ break;
62
+ case "DB_CHARSET":
63
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
64
+ $res = preg_replace('/\s/', '', $res);
65
+ $dbD['DB_CHARSET'] = $res;
66
+ break;
67
+ case 'DB_COLLATE':
68
+ $res = str_replace(array('\'',')',';',' '), '', $cont[1]);
69
+ $res = preg_replace('/\s/', '', $res);
70
+ $dbD['DB_COLLATE'] = $res;
71
+ break;
72
+ default:
73
+
74
+ break;
75
+ }
76
+ }
77
+ if(preg_match('/\$table_prefix/', $content[$i]))
78
+ {
79
+ $cont = explode("'", $content[$i]);
80
+
81
+ $prefix = $cont['1'];
82
+ }
83
+ }
84
+
85
+
86
+ global $dbcon;
87
+ $dbcon = new mysqli($dbD['DB_HOST'],$dbD['DB_USER'],$dbD['DB_PASSWORD']);
88
+ if(!$dbcon)
89
+ {
90
+ echo "database connection error";
91
+ exit;
92
+
93
+ }
94
+
95
+ if(mysqli_select_db($dbcon,$dbD['DB_NAME']))
96
+ {
97
+ $query = 'SELECT * FROM '.$prefix.'options WHERE `option_name`="WAF";';
98
+ $results1 = mysqli_query($dbcon,$query);
99
+ $row = mysqli_fetch_array($results1);
100
+ if(isset($row['option_value']) && $row['option_value']=='HtaccessLevel'){
101
+ $ipaddress = '';
102
+ if (isset($_SERVER['HTTP_CLIENT_IP']))
103
+ $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
104
+ else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
105
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
106
+ else if(isset($_SERVER['HTTP_X_FORWARDED']))
107
+ $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
108
+ else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
109
+ $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
110
+ else if(isset($_SERVER['HTTP_FORWARDED']))
111
+ $ipaddress = $_SERVER['HTTP_FORWARDED'];
112
+ else if(isset($_SERVER['REMOTE_ADDR']))
113
+ $ipaddress = $_SERVER['REMOTE_ADDR'];
114
+ else
115
+ $ipaddress = 'UNKNOWN';
116
+
117
+ $query = 'select * from '.$prefix.'mo2f_network_blocked_ips where ip_address="'.$ipaddress.'";';
118
+ $results = mysqli_query($dbcon,$query);
119
+ if($results)
120
+ {
121
+ $row = mysqli_fetch_array($results);
122
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
123
+ $results = mysqli_query($dbcon,$query);
124
+ if($results)
125
+ {
126
+ $row1 = mysqli_fetch_array($results);
127
+ if(!is_null($row1['ip_address']))
128
+ {
129
+
130
+ }
131
+ else if(!is_null($row['ip_address']))
132
+ {
133
+ header('HTTP/1.1 403 Forbidden');
134
+ include_once("mo-block.php");
135
+ }
136
+ }
137
+ else if(!is_null($row['ip_address']))
138
+ {
139
+ header('HTTP/1.1 403 Forbidden');
140
+ include_once("mo-block.php");
141
+
142
+ }
143
+
144
+ }
145
+
146
+
147
+ $dir_name = dirname(__FILE__);
148
+ $dir_name1 = explode('wp-content', $dir_name);
149
+ $dir_name = $dir_name1[0];
150
+ $filepath = str_replace('\\', '/', $dir_name1[0]);
151
+ $fileName = $filepath.'/wp-includes/mo-waf-config.php';
152
+ if($missingFile==1)
153
+ {
154
+ if(!file_exists($fileName))
155
+ {
156
+ $file = fopen($fileName, "a+");
157
+ $string = "<?php".PHP_EOL;
158
+ $query = 'select option_value from '.$prefix.'options where option_name = "SQLInjection";' ;
159
+ $results = mysqli_query($dbcon,$query);
160
+ if($results)
161
+ {
162
+ $row = mysqli_fetch_array($results);
163
+ $string .= '$SQL='.$row["option_value"].';'.PHP_EOL;
164
+ }
165
+ $query = 'select option_value from '.$prefix.'options where option_name = "XSSAttack";' ;
166
+ $results = mysqli_query($dbcon,$query);
167
+ if($results)
168
+ {
169
+ $row = mysqli_fetch_array($results);
170
+ $string .= '$XSS='.$row["option_value"].';'.PHP_EOL;
171
+ }
172
+ $query = 'select option_value from '.$prefix.'options where option_name = "RFIAttack";' ;
173
+ $results = mysqli_query($dbcon,$query);
174
+ if($results)
175
+ {
176
+ $row = mysqli_fetch_array($results);
177
+ $string .= '$RFI='.$row["option_value"].';'.PHP_EOL;
178
+ }
179
+ $query = 'select option_value from '.$prefix.'options where option_name = "LFIAttack";' ;
180
+ $results = mysqli_query($dbcon,$query);
181
+ if($results)
182
+ {
183
+ $row = mysqli_fetch_array($results);
184
+ $string .= '$LFI='.$row["option_value"].';'.PHP_EOL;
185
+ }
186
+ $query = 'select option_value from '.$prefix.'options where option_name = "RCEAttack";' ;
187
+ $results = mysqli_query($dbcon,$query);
188
+ if($results)
189
+ {
190
+ $row = mysqli_fetch_array($results);
191
+ $string .= '$RCE='.$row["option_value"].';'.PHP_EOL;
192
+ }
193
+ $query = 'select option_value from '.$prefix.'options where option_name = "Rate_limiting";' ;
194
+ $results = mysqli_query($dbcon,$query);
195
+ if($results)
196
+ {
197
+ $row = mysqli_fetch_array($results);
198
+ if($row["option_value"]!='')
199
+ $string .= '$RateLimiting='.$row["option_value"].';'.PHP_EOL;
200
+ else
201
+ $string .= '$RateLimiting=0;'.PHP_EOL;
202
+ }
203
+ $query = 'select option_value from '.$prefix.'options where option_name = "Rate_request";' ;
204
+ $results = mysqli_query($dbcon,$query);
205
+ if($results)
206
+ {
207
+ $row = mysqli_fetch_array($results);
208
+ if($row["option_value"]!='')
209
+ $string .= '$RequestsPMin='.$row["option_value"].';'.PHP_EOL;
210
+ else
211
+ $string .= '$RequestsPMin=120;'.PHP_EOL;
212
+ }
213
+
214
+ $query = 'select option_value from '.$prefix.'options where option_name = "actionRateL";' ;
215
+ $results = mysqli_query($dbcon,$query);
216
+ if($results)
217
+ {
218
+
219
+ $row = mysqli_fetch_array($results);
220
+ if($row["option_value"] == 1)
221
+ $string .= '$actionRateL="ThrottleIP";'.PHP_EOL;
222
+ else
223
+ $string .= '$actionRateL="BlockIP";'.PHP_EOL;
224
+ }
225
+ $string .= '?>'.PHP_EOL;
226
+ fwrite($file, $string);
227
+ fclose($file);
228
+
229
+ }
230
+
231
+ }
232
+
233
+ include_once($fileName);
234
+ if($RateLimiting == 1)
235
+ {
236
+
237
+ // if(!is_crawler())
238
+ // {
239
+ $time = 60;
240
+ $reqLimit = $RequestsPMin;
241
+ $query = "delete from ".$prefix."wpns_ip_rate_details where time<".(time()-$time);
242
+ $results = mysqli_query($dbcon,$query);
243
+
244
+ $query = "insert into ".$prefix."wpns_ip_rate_details values('".$ipaddress."',".time().");";
245
+ $results = mysqli_query($dbcon,$query);
246
+
247
+ $query = "select count(*) from ".$prefix."wpns_ip_rate_details where ip='".$ipaddress."';";
248
+ $results = mysqli_query($dbcon,$query);
249
+
250
+ if($results)
251
+ {
252
+ $row = mysqli_fetch_array($results);
253
+ if($row['count(*)']>=$reqLimit)
254
+ {
255
+ $action = $actionRateL;
256
+ if($action == 'ThrottleIP')
257
+ {
258
+ $query = "select time from ".$prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
259
+ $results = mysqli_query($dbcon,$query);
260
+ $results = mysqli_fetch_array($results);
261
+ $current_time = time();
262
+ if($current_time>$results['time']+60)
263
+ {
264
+ $query = "insert into ".$prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'RLE');";
265
+ $results = mysqli_query($dbcon,$query);
266
+ }
267
+ header('HTTP/1.1 403 Forbidden');
268
+ include_once("mo-error.php");
269
+ }
270
+ else
271
+ {
272
+ $query = "select time from ".$prefix."wpns_attack_logs where ip ='".$ipaddress."' ORDER BY time DESC LIMIT 1;";
273
+ $results = mysqli_query($dbcon,$query);
274
+ $results = mysqli_fetch_array($results);
275
+ $current_time = time();
276
+ if($current_time>$results['time']+60)
277
+ {
278
+ $query = "insert into ".$prefix."wpns_attack_logs values('".$ipaddress."','Rate Limit',".time().",'RLE');";
279
+ $results = mysqli_query($dbcon,$query);
280
+ }
281
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
282
+ $results = mysqli_query($dbcon,$query);
283
+ if($results)
284
+ {
285
+ $row1 = mysqli_fetch_array($results);
286
+ if(!is_null($row1['ip_address']))
287
+ {
288
+
289
+ }
290
+ else
291
+ {
292
+ $query ="insert into ".$prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','Rate limit exceed',NULL,".time().");";
293
+ $results = mysqli_query($dbcon,$query);
294
+ }
295
+ header('HTTP/1.1 403 Forbidden');
296
+ include_once("mo-error.php");
297
+ }
298
+ }
299
+ }
300
+ }
301
+ // }
302
+ // else
303
+ // {
304
+ // if($RateLimitingCrawler == '1')
305
+ // {
306
+ // $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
307
+ // applyRateLimitingCrawler($ipaddress,$fileName);
308
+
309
+ // }
310
+
311
+ // }
312
+ }
313
+
314
+ $attack = array();
315
+ if($SQL==1)
316
+ {
317
+ array_push($attack,"SQL");
318
+ }
319
+ if($XSS==1)
320
+ {
321
+ array_push($attack,"XSS");
322
+ }
323
+
324
+ if($LFI==1)
325
+ {
326
+ array_push($attack,"LFI");
327
+ }
328
+
329
+
330
+
331
+ $attackC = $attack;
332
+ $ParanoiaLevel = 1;
333
+ $annomalyS = 0;
334
+ $SQLScore = 0;
335
+ $XSSScore = 0;
336
+ $query = 'select option_value from '.$prefix.'options where option_name ="limitAttack";';
337
+ $results = mysqli_query($dbcon,$query);
338
+ $rows = mysqli_fetch_array($results);
339
+
340
+ $limitAttack = intval($rows['option_value']);
341
+
342
+
343
+ foreach ($attackC as $key1 => $value1) {
344
+ for($lev=1;$lev<=$ParanoiaLevel;$lev++)
345
+ {
346
+ if(isset($regex[$value1][$lev]))
347
+ { $ooo = 0;
348
+ for($i=0;$i<sizeof($regex[$value1][$lev]);$i++)
349
+ {
350
+ foreach ($_REQUEST as $key => $value) {
351
+
352
+ if($regex[$value1][$lev][$i] != "")
353
+ {
354
+ if(strpos($regex[$value1][$lev][$i], '/') == false)
355
+ {
356
+ if(is_string($value))
357
+ {
358
+ if(preg_match('/'.$regex[$value1][$lev][$i].'/', $value))
359
+ {
360
+
361
+ $scoreValue = 0;
362
+
363
+ $annomalyMS = $score[$value1][$lev][$i];
364
+ if(strcmp($annomalyMS,"CRITICAL")==0)
365
+ {
366
+ $scoreValue = 5;
367
+ }
368
+
369
+ elseif(strcmp($annomalyMS,"WARNING")==0)
370
+ {
371
+ $scoreValue = 3;
372
+ }
373
+ elseif(strcmp($annomalyMS,"ERROR")==0)
374
+ {
375
+ $scoreValue = 4;
376
+ }
377
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
378
+ {
379
+ $scoreValue =2;
380
+ }
381
+
382
+
383
+ if($value1 == "SQL")
384
+ {
385
+ $SQLScore += $scoreValue;
386
+ }
387
+ elseif ($value1 == "XSS")
388
+ {
389
+ $XSSScore += $scoreValue;
390
+ }
391
+ else
392
+ {
393
+ $annomalyS += $scoreValue;
394
+ }
395
+
396
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
397
+ {
398
+ $value = htmlspecialchars($value);
399
+ $query = 'insert into '.$prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
400
+ $results = mysqli_query($dbcon,$query);
401
+ $query = "select count(*) from ".$prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
402
+ $results = mysqli_query($dbcon,$query);
403
+ $rows = mysqli_fetch_array($results);
404
+ if($rows['count(*)']>$limitAttack)
405
+ {
406
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
407
+ $results = mysqli_query($dbcon,$query);
408
+ if($results)
409
+ {
410
+ $row1 = mysqli_fetch_array($results);
411
+ if(!is_null($row1['ip_address']))
412
+ {
413
+ //IP WHiTELISTED
414
+ }
415
+ else
416
+ {
417
+ $query ="insert into ".$prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".time().");";
418
+ $results = mysqli_query($dbcon,$query);
419
+ }
420
+ }
421
+ }
422
+
423
+
424
+ header('HTTP/1.1 403 Forbidden');
425
+ include_once("mo-error.php");
426
+ }
427
+
428
+ }}
429
+ }
430
+ else if (strpos($regex[$value1][$lev][$i], '#') == false) {
431
+ if(is_string($value))
432
+ {
433
+ if(preg_match('#'.$regex[$value1][$lev][$i].'#', $value))
434
+ {
435
+ $scoreValue = 0;
436
+ $annomalyMS = $score[$value1][$lev][$i];
437
+ if(strcmp($annomalyMS,"CRITICAL")==0)
438
+ {
439
+ $scoreValue = 5;
440
+ }
441
+
442
+ elseif(strcmp($annomalyMS,"WARNING")==0)
443
+ {
444
+ $scoreValue = 3;
445
+ }
446
+ elseif(strcmp($annomalyMS,"ERROR")==0)
447
+ {
448
+ $scoreValue = 4;
449
+ }
450
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
451
+ {
452
+ $scoreValue =2;
453
+ }
454
+
455
+
456
+ if($value1 == "SQL")
457
+ {
458
+ $SQLScore += $scoreValue;
459
+ }
460
+ elseif ($value1 == "XSS")
461
+ {
462
+ $XSSScore += $scoreValue;
463
+ }
464
+ else
465
+ {
466
+ $annomalyS += $scoreValue;
467
+ }
468
+
469
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
470
+ {
471
+ $value = htmlspecialchars($value);
472
+ $query = 'insert into '.$prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
473
+ $results = mysqli_query($dbcon,$query);
474
+ $query = "select count(*) from ".$prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
475
+ $results = mysqli_query($dbcon,$query);
476
+ $rows = mysqli_fetch_array($results);
477
+ if($rows['count(*)']>$limitAttack)
478
+ {
479
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
480
+ $results = mysqli_query($dbcon,$query);
481
+ if($results)
482
+ {
483
+ $row1 = mysqli_fetch_array($results);
484
+ if(!is_null($row1['ip_address']))
485
+ {
486
+ //IP WHiTELISTED
487
+ }
488
+ else
489
+ {
490
+ $query ="insert into ".$prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".time().");";
491
+ $results = mysqli_query($dbcon,$query);
492
+ }
493
+ }
494
+ }
495
+
496
+
497
+ header('HTTP/1.1 403 Forbidden');
498
+ include_once("mo-error.php");
499
+ }
500
+ }}
501
+ }
502
+
503
+ elseif (strpos($regex[$value1][$lev][$i], '@') == false) {
504
+ if(is_string($value))
505
+ {
506
+ if(preg_match('@'.$regex[$value1][$lev][$i].'@', $value))
507
+ {
508
+ $scoreValue = 0;
509
+ $annomalyMS = $score[$value1][$lev][$i];
510
+ if(strcmp($annomalyMS,"CRITICAL")==0)
511
+ {
512
+ $scoreValue = 5;
513
+ }
514
+
515
+ elseif(strcmp($annomalyMS,"WARNING")==0)
516
+ {
517
+ $scoreValue = 3;
518
+ }
519
+ elseif(strcmp($annomalyMS,"ERROR")==0)
520
+ {
521
+ $scoreValue = 4;
522
+ }
523
+ elseif(strcmp($annomalyMS,"NOTICE")==0)
524
+ {
525
+ $scoreValue =2;
526
+ }
527
+
528
+
529
+ if($value1 == "SQL")
530
+ {
531
+ $SQLScore += $scoreValue;
532
+ }
533
+ elseif ($value1 == "XSS")
534
+ {
535
+ $XSSScore += $scoreValue;
536
+ }
537
+ else
538
+ {
539
+ $annomalyS += $scoreValue;
540
+ }
541
+
542
+ if($annomalyS>=5 || $SQLScore>=10 || $XSSScore >=10)
543
+ {
544
+ $value = htmlspecialchars($value);
545
+ $query = 'insert into '.$prefix.'wpns_attack_logs values ("'.$ipaddress.'","'.$value1.'",'.time().',"'.$value.'");';
546
+ $results = mysqli_query($dbcon,$query);
547
+ $query = "select count(*) from ".$prefix."wpns_attack_logs where ip='".$ipaddress."' and input != 'RLE';";
548
+ $results = mysqli_query($dbcon,$query);
549
+ $rows = mysqli_fetch_array($results);
550
+ if($rows['count(*)']>$limitAttack)
551
+ {
552
+ $query = 'select * from '.$prefix.'mo2f_network_whitelisted_ips where ip_address="'.$ipaddress.'";';
553
+ $results = mysqli_query($dbcon,$query);
554
+ if($results)
555
+ {
556
+ $row1 = mysqli_fetch_array($results);
557
+ if(!is_null($row1['ip_address']))
558
+ {
559
+ //IP WHiTELISTED
560
+ }
561
+ else
562
+ {
563
+ $query ="insert into ".$prefix."mo2f_network_blocked_ips values(NULL,'".$ipaddress."','attack limit exceed',NULL,".time().");";
564
+ $results = mysqli_query($dbcon,$query);
565
+ }
566
+ }
567
+ }
568
+
569
+
570
+ header('HTTP/1.1 403 Forbidden');
571
+ include_once("mo-error.php");
572
+ }
573
+ }
574
+ }
575
+
576
+ }
577
+
578
+ }
579
+ }
580
+
581
+ }
582
+ }
583
+
584
+ }
585
+ }
586
+ }
587
+ }
588
+
589
+ $dbcon->close();
590
+ ?>
handler/recaptcha.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class reCaptcha
4
+ {
5
+ function __construct()
6
+ {
7
+ add_filter( 'admin_init' , array($this, 'handle_recaptcha' ), 11, 3 );
8
+ add_action( 'login_form' , array($this, 'custom_login_fields' ) );
9
+ add_action( 'register_form' , array($this, 'register_with_captcha') );
10
+ add_action( 'woocommerce_register_form' , array($this, 'woocommerce_register_with_captcha'));
11
+ add_action( 'woocommerce_login_form', array($this, 'woocommerce_login_with_captcha'));
12
+ add_action( 'woocommerce_review_order_before_submit', array($this, 'woocommerce_register_with_captcha_checkout'));
13
+ }
14
+
15
+
16
+ //Function to handle Testing reCaptcha
17
+ function handle_recaptcha()
18
+ {
19
+ global $moWpnsUtility,$dirName;
20
+ if (current_user_can( 'manage_options' ))
21
+ {
22
+ if(isset($_REQUEST['option']) && $_REQUEST['option']=='testrecaptchaconfig')
23
+ {
24
+ if(array_key_exists('g-recaptcha-response',$_POST))
25
+ {
26
+ $userIp = $moWpnsUtility->get_client_ip();
27
+ $mocURL = new MocURL;
28
+ $response = $mocURL->validate_recaptcha($userIp,$_POST['g-recaptcha-response']);
29
+ $content = json_decode($response, true);
30
+ if(isset($content['error-codes']) && in_array("invalid-input-secret", $content['error-codes']))
31
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid Secret Key.</h2>";
32
+ else if(isset($content['success']) && $content['success']==1)
33
+ echo "<br><br><h2 style=color:green;text-align:center>Test was successful and captcha verified.</h2>";
34
+ else
35
+ echo "<br><br><h2 style=color:red;text-align:center>Invalid captcha. Please try again.</h2>";
36
+ }
37
+ show_google_recaptcha_form();
38
+ }
39
+ }
40
+ }
41
+
42
+
43
+ function custom_login_fields()
44
+ {
45
+ if(get_option('mo_wpns_activate_recaptcha_for_login'))
46
+ {
47
+
48
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
49
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
50
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
51
+ }
52
+ }
53
+
54
+ function register_with_captcha(){
55
+ if(get_option('mo_wpns_activate_recaptcha_for_registration'))
56
+ {
57
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
58
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
59
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
60
+ }
61
+ }
62
+
63
+ function woocommerce_register_with_captcha(){
64
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
65
+ {
66
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
67
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
68
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
69
+ }
70
+ }
71
+
72
+ function woocommerce_login_with_captcha(){
73
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_login'))
74
+ {
75
+
76
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
77
+
78
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
79
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#loginform{padding-bottom:20px;}</style>';
80
+ }
81
+ }
82
+
83
+ function woocommerce_register_with_captcha_checkout(){
84
+
85
+ if (!is_user_logged_in()){
86
+ if(get_option('mo_wpns_activate_recaptcha_for_woocommerce_registration'))
87
+ {
88
+ echo "<script src='".MoWpnsConstants::RECAPTCHA_URL."'></script>";
89
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option("mo_wpns_recaptcha_site_key").'"></div>';
90
+ echo '<style>#login{ width:349px;padding:2% 0 0; }.g-recaptcha{margin-bottom:5%;}#registerform{padding-bottom:20px;}</style>';
91
+ }
92
+ }
93
+ }
94
+
95
+ public static function recaptcha_verify($response)
96
+ {
97
+ global $moWpnsUtility;
98
+ $userIp = $moWpnsUtility->get_client_ip();
99
+ $mocURL = new MocURL;
100
+ $response = $mocURL->validate_recaptcha($userIp,$response);
101
+ $content = json_decode($response, true);
102
+ $isvalid = isset($content['success']) && $content['success']==1 ? true : false;
103
+ return $isvalid;
104
+ }
105
+
106
+ }
107
+ new reCaptcha;
handler/registration.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class RegistrationHandler
4
+ {
5
+ function __construct()
6
+ {
7
+ add_filter( 'registration_errors' , array($this, 'mo_wpns_registration_validations' ), 10, 3 );
8
+ }
9
+
10
+ function mo_wpns_registration_validations( $errors, $sanitized_user_login, $user_email )
11
+ {
12
+ global $moWpnsUtility;
13
+
14
+ if(get_option('mo_wpns_activate_recaptcha_for_registration'))
15
+ $recaptchaError = $moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response']);
16
+
17
+ if($moWpnsUtility->check_if_valid_email($user_email) && empty($recaptchaError->errors))
18
+ $errors->add( 'blocked_email_error', __( '<strong>ERROR</strong>: Your email address is not allowed to register. Please select different email address.') );
19
+ else if(!empty($recaptchaError->errors))
20
+ $errors = $recaptchaError;
21
+
22
+ return $errors;
23
+ }
24
+
25
+ }
26
+ new RegistrationHandler;
handler/setup_twofa.php ADDED
@@ -0,0 +1,630 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $dirName = dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR;
4
+ include $dirName.'setup_google_authenticator.php';
5
+ include $dirName.'setup_google_authenticator_onpremise.php';
6
+ include $dirName.'setup_authy_authenticator.php';
7
+ include $dirName.'setup_kba_questions.php';
8
+ include $dirName.'setup_miniorange_authenticator.php';
9
+ include $dirName.'setup_otp_over_sms.php';
10
+ include $dirName.'test_twofa_email_verification.php';
11
+ include $dirName.'test_twofa_google_authy_authenticator.php';
12
+ include $dirName.'test_twofa_miniorange_qrcode_authentication.php';
13
+ include $dirName.'test_twofa_kba_questions.php';
14
+ include $dirName.'test_twofa_miniorange_push_notification.php';
15
+ include $dirName.'test_twofa_miniorange_soft_token.php';
16
+ include $dirName.'test_twofa_otp_over_sms.php';
17
+
18
+ function mo2f_decode_2_factor( $selected_2_factor_method, $decode_type ) {
19
+
20
+ if ( $selected_2_factor_method == 'NONE' ) {
21
+ return $selected_2_factor_method;
22
+ }
23
+
24
+ $wpdb_2fa_methods = array(
25
+ "miniOrangeQRCodeAuthentication" => "miniOrange QR Code Authentication",
26
+ "miniOrangeSoftToken" => "miniOrange Soft Token",
27
+ "miniOrangePushNotification" => "miniOrange Push Notification",
28
+ "GoogleAuthenticator" => "Google Authenticator",
29
+ "AuthyAuthenticator" => "Authy Authenticator",
30
+ "SecurityQuestions" => "Security Questions",
31
+ "EmailVerification" => "Email Verification",
32
+ "OTPOverSMS" => "OTP Over SMS"
33
+ );
34
+
35
+ $server_2fa_methods = array(
36
+ "miniOrange QR Code Authentication" => "MOBILE AUTHENTICATION",
37
+ "miniOrange Soft Token" => "SOFT TOKEN",
38
+ "miniOrange Push Notification" => "PUSH NOTIFICATIONS",
39
+ "Google Authenticator" => "GOOGLE AUTHENTICATOR",
40
+ "Authy Authenticator" => "GOOGLE AUTHENTICATOR",
41
+ "Security Questions" => "KBA",
42
+ "Email Verification" => "OUT OF BAND EMAIL",
43
+ "OTP Over SMS" => "SMS",
44
+ "EMAIL" => "OTP Over Email",
45
+
46
+ );
47
+
48
+ $server_to_wpdb_2fa_methods = array(
49
+ "MOBILE AUTHENTICATION" => "miniOrange QR Code Authentication",
50
+ "SOFT TOKEN" => "miniOrange Soft Token",
51
+ "PUSH NOTIFICATIONS" => "miniOrange Push Notification",
52
+ "GOOGLE AUTHENTICATOR" => "Google Authenticator",
53
+ "KBA" => "Security Questions",
54
+ "OUT OF BAND EMAIL" => "Email Verification",
55
+ "SMS" => "OTP Over SMS",
56
+ "EMAIL" => "OTP Over Email"
57
+ );
58
+
59
+ if ( $decode_type == "wpdb" ) {
60
+ return $wpdb_2fa_methods[ $selected_2_factor_method ];
61
+ } else if ( $decode_type == "server" ) {
62
+ return $server_2fa_methods[ $selected_2_factor_method ];
63
+ } else {
64
+ return $server_to_wpdb_2fa_methods[ $selected_2_factor_method ];
65
+ }
66
+
67
+ }
68
+
69
+
70
+ function mo2f_create_2fa_form( $user, $category, $auth_methods, $can_display_admin_features='' ) {
71
+ global $Mo2fdbQueries;
72
+ $all_two_factor_methods = array(
73
+ "miniOrange QR Code Authentication",
74
+ "miniOrange Soft Token",
75
+ "miniOrange Push Notification",
76
+ "Google Authenticator",
77
+ "Security Questions",
78
+ "Authy Authenticator",
79
+ "Email Verification",
80
+ "OTP Over SMS",
81
+ "OTP Over Email",
82
+ "OTP Over SMS and Email",
83
+ "Hardware Token"
84
+ );
85
+
86
+ $two_factor_methods_descriptions = array(
87
+ ""=>"<b>All methods in the FREE Plan in addition to the following methods.</b>",
88
+ "miniOrange QR Code Authentication" => "Scan the QR code from the account in your miniOrange Authenticator App to login.",
89
+ "miniOrange Soft Token" => "Enter the soft token from the account in your miniOrange Authenticator App to login.",
90
+ "miniOrange Push Notification" => "Accept a push notification in your miniOrange Authenticator App to login.",
91
+ "Google Authenticator" => "Enter the soft token from the account in your <b>Google/Authy/LastPass Authenticator App</b> to login.",
92
+ "Security Questions" => "Answer the three security questions you had set, to login.",
93
+ "Authy Authenticator" => "Enter the soft token from the account in your Authy Authenticator App to login.",
94
+ "Email Verification" => "Accept the verification link sent to your email to login.",
95
+ "OTP Over SMS" => "Enter the One Time Passcode sent to your phone to login.",
96
+ "OTP Over Email" => "Enter the One Time Passcode sent to your email to login.",
97
+ "OTP Over SMS and Email" => "Enter the One Time Passcode sent to your phone and email to login.",
98
+ "Hardware Token" => "Enter the One Time Passcode on your Hardware Token to login."
99
+ );
100
+
101
+ $two_factor_methods_EC = array_slice( $all_two_factor_methods, 0, 8 );
102
+ $two_factor_methods_NC = array_slice( $all_two_factor_methods, 0, 5 );
103
+
104
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
105
+
106
+ $can_user_configure_2fa_method = $can_display_admin_features || ( !$can_display_admin_features && $is_customer_registered );
107
+ $is_NC = get_option( 'mo2f_is_NC' );
108
+ $is_EC = ! $is_NC;
109
+
110
+ $form = '';
111
+ $form .= '<form name="f" method="post" action="" id="mo2f_save_' . $category . '_auth_methods_form">
112
+ <div id="mo2f_' . $category . '_auth_methods" >
113
+ <br>
114
+ <table class="mo2f_auth_methods_table">';
115
+
116
+ for ( $i = 0; $i < count( $auth_methods ); $i ++ ) {
117
+
118
+ $form .= '<tr>';
119
+ for ( $j = 0; $j < count( $auth_methods[ $i ] ); $j ++ ) {
120
+ $auth_method = $auth_methods[ $i ][ $j ];
121
+ $auth_method_abr = str_replace( ' ', '', $auth_method );
122
+ $configured_auth_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
123
+ $is_auth_method_selected = ( $configured_auth_method == $auth_method ? true : false );
124
+
125
+ $is_auth_method_av = false;
126
+ if ( ( $is_EC && in_array( $auth_method, $two_factor_methods_EC ) ) ||
127
+ ( $is_NC && in_array( $auth_method, $two_factor_methods_NC ) ) ) {
128
+ $is_auth_method_av = true;
129
+ }
130
+
131
+
132
+ $thumbnail_height = $is_auth_method_av && $category == 'free_plan' ? 190 : 160;
133
+ $is_image = $auth_method == "" ? 0 :1;
134
+
135
+ $form .= '<td style="width:33%;height: 203px;">
136
+ <div class="mo2f_thumbnail" id="'.$auth_method_abr.'_thumbnail_2_factor" style="height:' . $thumbnail_height . 'px;border:1px solid ';
137
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
138
+ $form .= ';border-top:3px solid ';
139
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
140
+ $form .= ';">';
141
+ $form .= '<div>
142
+ <div class="mo2f_thumbnail_method">
143
+ <div style="width: 30%; float:left;">';
144
+
145
+ if($is_image){
146
+ $form .= '<img src="' . plugins_url( "includes/images/authmethods/" . $auth_method_abr . ".png", dirname(__FILE__ )) . '" style="width: 40px;height: 40px !important; padding: 20px; line-height: 80px;" />';
147
+ }
148
+
149
+ $form .= '</div>
150
+ <div class="mo2f_thumbnail_method_desc"><b>' . $auth_method .
151
+ '</b><br>
152
+ <p style="padding:0px; padding-left:0px;"> ' . $two_factor_methods_descriptions[ $auth_method ] . '</p>
153
+
154
+ </div>
155
+ </div>
156
+ </div>';
157
+
158
+ if ( $is_auth_method_av && $category == 'free_plan' ) {
159
+ $is_auth_method_configured = $Mo2fdbQueries->get_user_detail( 'mo2f_' . $auth_method_abr . '_config_status', $user->ID );
160
+
161
+ $form .= '<div style="height:40px;width:100%;position: absolute;bottom: 0;background-color:';
162
+ $form .= $is_auth_method_selected ? '#48b74b' : '#20b2aa';
163
+
164
+ $form .= ';color:white">';
165
+ $check = !$is_customer_registered? true : $auth_method != "Email Verification"? true : false;
166
+ if ( $check ) {
167
+ $form .= '<div class="mo2f_configure_2_factor">
168
+ <button type="button" id="'.$auth_method_abr.'_configuration" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'configure2factor\');"';
169
+ $form .= $can_user_configure_2fa_method ? "" : " disabled ";
170
+ $form .= '>';
171
+ $form .= $is_auth_method_configured ? 'Reconfigure' : 'Configure';
172
+ $form .= '</button></div>';
173
+ }
174
+ if ( $is_auth_method_configured && ! $is_auth_method_selected ) {
175
+ $form .= '<div class="mo2f_set_2_factor">
176
+ <button type="button" id="'.$auth_method_abr.'_set_2_factor" class="mo2f_configure_set_2_factor" onclick="configureOrSet2ndFactor_' . $category . '(\'' . $auth_method_abr . '\', \'select2factor\');"';
177
+ $form .= $can_user_configure_2fa_method ? "" : " disabled ";
178
+ $form .= '>Set as 2-factor</button>
179
+ </div>';
180
+ }
181
+
182
+ $form .= '</div>';
183
+
184
+ }
185
+ $form .= '</div></div></td>';
186
+ }
187
+
188
+ $form .= '</tr>';
189
+ }
190
+
191
+
192
+ $form .= '</table>';
193
+ if( $category!="free_plan")
194
+ $form .= '<div style="background-color: #f1f1f1;padding:10px">
195
+ <p style="font-size:16px;margin-left: 1%">In addition to these authentication methods, for other features in this plan, <a href="admin.php?page=upgrade"><i>Click here.</i></a></p>
196
+ </div>';
197
+
198
+ $form .= '</div> <input type="hidden" name="miniorange_save_form_auth_methods_nonce"
199
+ value="'. wp_create_nonce( "miniorange-save-form-auth-methods-nonce" ) .'"/>
200
+ <input type="hidden" name="option" value="mo2f_save_' . $category . '_auth_methods" />
201
+ <input type="hidden" name="mo2f_configured_2FA_method_' . $category . '" id="mo2f_configured_2FA_method_' . $category . '" />
202
+ <input type="hidden" name="mo2f_selected_action_' . $category . '" id="mo2f_selected_action_' . $category . '" />
203
+ </form>';
204
+
205
+ return $form;
206
+ }
207
+
208
+
209
+ function mo2f_get_activated_second_factor( $user ) {
210
+ global $Mo2fdbQueries;
211
+ $user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
212
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
213
+ $useremail = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
214
+
215
+ if ( $user_registration_status == 'MO_2_FACTOR_SUCCESS' ) {
216
+ //checking this option for existing users
217
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mobile_registration_status' => true ) );
218
+ $mo2f_second_factor = 'MOBILE AUTHENTICATION';
219
+
220
+ return $mo2f_second_factor;
221
+ } else if ( $user_registration_status == 'MO_2_FACTOR_INITIALIZE_TWO_FACTOR' ) {
222
+ return 'NONE';
223
+ } else {
224
+ //for new users
225
+ if ( $user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' && $is_customer_registered ) {
226
+ $enduser = new Two_Factor_Setup();
227
+ $userinfo = json_decode( $enduser->mo2f_get_userinfo( $useremail ), true );
228
+
229
+ if ( json_last_error() == JSON_ERROR_NONE ) {
230
+ if ( $userinfo['status'] == 'ERROR' ) {
231
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $userinfo['message'] ) );
232
+ $mo2f_second_factor = 'NONE';
233
+ } else if ( $userinfo['status'] == 'SUCCESS' ) {
234
+ $mo2f_second_factor = mo2f_update_and_sync_user_two_factor( $user->ID, $userinfo );
235
+ } else if ( $userinfo['status'] == 'FAILED' ) {
236
+ $mo2f_second_factor = 'NONE';
237
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_REMOVED" ) );
238
+ } else {
239
+ $mo2f_second_factor = 'NONE';
240
+ }
241
+ } else {
242
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
243
+ $mo2f_second_factor = 'NONE';
244
+ }
245
+ } else {
246
+ $mo2f_second_factor = 'NONE';
247
+ }
248
+
249
+ return $mo2f_second_factor;
250
+ }
251
+ }
252
+
253
+ function mo2f_update_and_sync_user_two_factor( $user_id, $userinfo ) {
254
+ global $Mo2fdbQueries;
255
+ $mo2f_second_factor = isset( $userinfo['authType'] ) && ! empty( $userinfo['authType'] ) ? $userinfo['authType'] : 'NONE';
256
+
257
+ if ( $mo2f_second_factor == 'OUT OF BAND EMAIL' ) {
258
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_EmailVerification_config_status' => true ) );
259
+ } else if ( $mo2f_second_factor == 'SMS' ) {
260
+ $phone_num = $userinfo['phone'];
261
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_OTPOverSMS_config_status' => true ) );
262
+ $_SESSION['user_phone'] = $phone_num;
263
+ } else if ( in_array( $mo2f_second_factor, array(
264
+ 'SOFT TOKEN',
265
+ 'MOBILE AUTHENTICATION',
266
+ 'PUSH NOTIFICATIONS'
267
+ ) ) ) {
268
+ $Mo2fdbQueries->update_user_details( $user_id, array(
269
+ 'mo2f_miniOrangeSoftToken_config_status' => true,
270
+ 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
271
+ 'mo2f_miniOrangePushNotification_config_status' => true
272
+ ) );
273
+ } else if ( $mo2f_second_factor == 'KBA' ) {
274
+ $Mo2fdbQueries->update_user_details( $user_id, array( 'mo2f_SecurityQuestions_config_status' => true ) );
275
+ } else if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
276
+ $app_type = get_user_meta( $user_id, 'mo2f_external_app_type', true );
277
+
278
+ if ( $app_type == 'Google Authenticator' ) {
279
+ $Mo2fdbQueries->update_user_details( $user_id, array(
280
+ 'mo2f_GoogleAuthenticator_config_status' => true
281
+ ) );
282
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
283
+ } else if ( $app_type == 'Authy Authenticator' ) {
284
+ $Mo2fdbQueries->update_user_details( $user_id, array(
285
+ 'mo2f_AuthyAuthenticator_config_status' => true
286
+ ) );
287
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Authy Authenticator' );
288
+ } else {
289
+ $Mo2fdbQueries->update_user_details( $user_id, array(
290
+ 'mo2f_GoogleAuthenticator_config_status' => true
291
+ ) );
292
+
293
+ update_user_meta( $user_id, 'mo2f_external_app_type', 'Google Authenticator' );
294
+ }
295
+ }
296
+
297
+ return $mo2f_second_factor;
298
+ }
299
+
300
+ function display_customer_registration_forms($user){
301
+
302
+ global $Mo2fdbQueries;
303
+ $mo2f_current_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID);
304
+ $mo2f_message = get_option( 'mo2f_message' );
305
+ ?>
306
+
307
+ <div id="smsAlertModal" class="modal" role="dialog" data-backdrop="static" data-keyboard="false" >
308
+ <div class="mo2f_modal-dialog" style="margin-left:30%;">
309
+ <!-- Modal content-->
310
+ <div class="modal-content">
311
+ <div class="mo2f_modal-header">
312
+ <h2 class="mo2f_modal-title">You are just one step away from setting up 2FA.</h2><span type="button" id="mo2f_registration_closed" class="modal-span-close" data-dismiss="modal">&times;</span>
313
+ </div>
314
+ <div class="mo2f_modal-body">
315
+ <span style="color:green;cursor: pointer;float:right;" onclick="show_content();">Why Register with miniOrange?</span><br>
316
+ <div id="mo2f_register" style="background-color:#f1f1f1;padding: 1px 4px 1px 14px;display: none;">
317
+ <p>miniOrange Two Factor plugin uses highly secure miniOrange APIs to communicate with the plugin. To keep this communication secure, we ask you to register and assign you API keys specific to your account. This way your account and users can be only accessed by API keys assigned to you. Also, you can use the same account on multiple applications and your users do not have to maintain multiple accounts or 2-factors.</p>
318
+ </div>
319
+ <?php if ( $mo2f_message ) { ?>
320
+ <div style="padding:5px;">
321
+ <div class="alert alert-info" style="margin-bottom:0px;padding:3px;">
322
+ <p style="font-size:15px;margin-left: 2%;"><?php echo $mo2f_message; ?></p>
323
+ </div>
324
+ </div>
325
+ <?php }
326
+ if(in_array($mo2f_current_registration_status, array("REGISTRATION_STARTED", "MO_2_FACTOR_OTP_DELIVERED_SUCCESS", "MO_2_FACTOR_OTP_DELIVERED_FAILURE", "MO_2_FACTOR_VERIFY_CUSTOMER"))){
327
+ mo2f_show_registration_screen($user);
328
+ }
329
+ ?>
330
+ </div>
331
+ </div>
332
+ </div>
333
+ <form name="f" method="post" action="" class="mo2f_registration_closed_form">
334
+ <input type="hidden" name="mo2f_registration_closed_nonce"
335
+ value="<?php echo wp_create_nonce( "mo2f-registration-closed-nonce" ) ?>"/>
336
+ <input type="hidden" name="option" value="mo2f_registration_closed"/>
337
+ </form>
338
+ </div>
339
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
340
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
341
+ <script>
342
+ function show_content() {
343
+ jQuery('#mo2f_register').slideToggle();
344
+ }
345
+ jQuery(function () {
346
+ jQuery('#smsAlertModal').modal();
347
+ });
348
+
349
+ jQuery('#mo2f_registration_closed').click(function () {
350
+ jQuery('.mo2f_registration_closed_form').submit();
351
+ });
352
+ </script>
353
+
354
+ <?php
355
+ }
356
+
357
+ function mo2f_show_registration_screen($user){
358
+ global $dirName;
359
+
360
+ include $dirName . 'controllers/account.php';
361
+ // if(in_array($mo2f_current_registration_status, array("MO_2_FACTOR_OTP_DELIVERED_SUCCESS", "MO_2_FACTOR_OTP_DELIVERED_FAILURE"))){
362
+ // include $dirName . 'views/account/verify.php';
363
+ // }else if($mo2f_current_registration_status == "MO_2_FACTOR_VERIFY_CUSTOMER"){
364
+ // include $dirName . 'views/account/login.php';
365
+ // }else if($mo2f_current_registration_status == "REGISTRATION_STARTED"){
366
+ // include $dirName . 'views/account/register.php';
367
+ // }
368
+ }
369
+
370
+ function mo2f_show_2FA_configuration_screen( $user, $selected2FAmethod ) {
371
+ global $dirName;
372
+ switch ( $selected2FAmethod ) {
373
+ case "Google Authenticator":
374
+ Miniorange_Authentication::mo2f_get_GA_parameters($user);
375
+ mo2f_configure_google_authenticator( $user );
376
+ break;
377
+ case "Authy Authenticator":
378
+ mo2f_configure_authy_authenticator( $user );
379
+ break;
380
+ case "Security Questions":
381
+ mo2f_configure_for_mobile_suppport_kba( $user );
382
+ break;
383
+ case "Email Verification":
384
+ mo2f_configure_for_mobile_suppport_kba( $user );
385
+ break;
386
+ case "OTP Over SMS":
387
+ mo2f_configure_otp_over_sms( $user );
388
+ break;
389
+ case "miniOrange Soft Token":
390
+ mo2f_configure_miniorange_authenticator( $user );
391
+ break;
392
+ case "miniOrange QR Code Authentication":
393
+ mo2f_configure_miniorange_authenticator( $user );
394
+ break;
395
+ case "miniOrange Push Notification":
396
+ mo2f_configure_miniorange_authenticator( $user );
397
+ break;
398
+ }
399
+
400
+ }
401
+
402
+ function mo2f_show_2FA_test_screen( $user, $selected2FAmethod ) {
403
+
404
+ switch ( $selected2FAmethod ) {
405
+ case "miniOrange QR Code Authentication":
406
+ mo2f_test_miniorange_qr_code_authentication( $user );
407
+ break;
408
+ case "miniOrange Push Notification":
409
+ mo2f_test_miniorange_push_notification( $user );
410
+ break;
411
+ case "miniOrange Soft Token":
412
+ mo2f_test_miniorange_soft_token( $user );
413
+ break;
414
+ case "Email Verification":
415
+ mo2f_test_email_verification();
416
+ break;
417
+ case "OTP Over SMS":
418
+ mo2f_test_otp_over_sms( $user );
419
+ break;
420
+ case "Security Questions":
421
+ mo2f_test_kba_security_questions( $user );
422
+ break;
423
+ default:
424
+ mo2f_test_google_authy_authenticator( $user, $selected2FAmethod );
425
+ }
426
+
427
+ }
428
+
429
+ function mo2f_method_display_name($user,$mo2f_second_factor){
430
+
431
+ if ( $mo2f_second_factor == 'GOOGLE AUTHENTICATOR' ) {
432
+ $app_type = get_user_meta( $user->ID, 'mo2f_external_app_type', true );
433
+
434
+ if ( $app_type == 'Google Authenticator' ) {
435
+ $selectedMethod = 'Google Authenticator';
436
+ } else if ( $app_type == 'Authy Authenticator' ) {
437
+ $selectedMethod = 'Authy Authenticator';
438
+ } else {
439
+ $selectedMethod = 'Google Authenticator';
440
+ update_user_meta( $user->ID, 'mo2f_external_app_type', $selectedMethod );
441
+ }
442
+ } else {
443
+ $selectedMethod = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
444
+ }
445
+ return $selectedMethod;
446
+
447
+ }
448
+
449
+ function mo2f_lt( $string ) {
450
+ return __($string ,'miniorange-2-factor-authentication' );
451
+ }
452
+
453
+ function mo2f_rba_description($mo2f_user_email) {?>
454
+ <div id="mo2f_rba_addon">
455
+ <?php if ( get_option( 'mo2f_rba_installed' ) ) { ?>
456
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_rba_addon"
457
+ class="mo_wpns_button mo_wpns_button1"
458
+ style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
459
+ <?php } ?>
460
+ <?php if ( ! get_option( 'mo2f_rba_purchased' ) ) { ?>
461
+ <a onclick="mo2f_addonform('wp_2fa_addon_rba')" id="mo2f_purchase_rba_addon"
462
+ class="mo_wpns_button mo_wpns_button1"
463
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a><?php } ?>
464
+ <div id="mo2f_rba_addon_hide"><h3 id="toggle_rba_description"
465
+ class="mo2f_pointer"><?php echo __( 'Description', 'miniorange-2-factor-authentication' ); ?> </h3>
466
+ <p id="rba_description" style="margin:2% 2% 2% 4%">
467
+ <?php echo __( 'This Add-On helps you in remembering the device, in which case you will not be prompted for the 2-factor authentication
468
+ if you login from the remembered device again. You can also decide the number of devices that can be remembered. Users can also be restricted access to the site based on the IP address they are logging in from.', 'miniorange-2-factor-authentication' ); ?>
469
+ </p>
470
+ <br>
471
+ <div id="mo2f_hide_rba_content">
472
+
473
+ <div class="mo2f_box">
474
+ <h3><?php echo __( 'Remember Device', 'miniorange-2-factor-authentication' ); ?></h3>
475
+ <hr>
476
+ <p id="mo2f_hide_rba_content"><?php echo __( 'With this feature, User would get an option to remember the personal device where Two Factor is not required. Every time the user logs in with the same device it detects the saved device so he will directly login without being prompted for the 2nd factor. If user logs in from new device he will be prompted with 2nd Factor.', 'miniorange-2-factor-authentication' ); ?>
477
+
478
+ </p>
479
+ </div>
480
+ <br><br>
481
+ <div class="mo2f_box">
482
+ <h3><?php echo __( 'Limit Number Of Device', 'miniorange-2-factor-authentication' ); ?></h3>
483
+ <hr>
484
+ <p><?php echo __( 'With this feature, the admin can restrict the number of devices from which the user can access the website. If the device limit is exceeded the admin can set three actions where it can allow the users to login, deny the access or challenge the user for authentication.', 'miniorange-2-factor-authentication' ); ?>
485
+ </p>
486
+
487
+ </div>
488
+ <br><br>
489
+ <div class="mo2f_box">
490
+ <h3><?php echo __( 'IP Restriction: Limit users to login from specific IPs', 'miniorange-2-factor-authentication' ); ?></h3>
491
+ <hr>
492
+ <p><?php echo __( 'The Admin can enable IP restrictions for the users. It will provide additional security to the accounts and perform different action to the accounts only from the listed IP Ranges. If user tries to access with a restricted IP, Admin can set three action: Allow, challenge or deny. Depending upon the action it will allow the user to login, challenge(prompt) for authentication or deny the access.', 'miniorange-2-factor-authentication' ); ?>
493
+
494
+ </div>
495
+ <br>
496
+ </div>
497
+
498
+ </div>
499
+ <div id="mo2f_rba_addon_show">
500
+ <?php $x = apply_filters( 'mo2f_rba', "rba" );?>
501
+ </div>
502
+ </div>
503
+ <form style="display:none;" id="mo2fa_loginform"
504
+ action="<?php echo MO_HOST_NAME . '/moas/login'; ?>"
505
+ target="_blank" method="post">
506
+ <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
507
+ <input type="text" name="redirectUrl"
508
+ value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
509
+ <input type="text" name="requestOrigin" id="requestOrigin"/>
510
+ </form>
511
+ <script>
512
+ function mo2f_addonform(planType) {
513
+ jQuery('#requestOrigin').val(planType);
514
+ jQuery('#mo2fa_loginform').submit();
515
+ }
516
+ </script>
517
+ <?php
518
+ }
519
+
520
+ function mo2f_personalization_description($mo2f_user_email) {?>
521
+ <div id="mo2f_custom_addon">
522
+ <?php if ( get_option( 'mo2f_personalization_installed' ) ) { ?>
523
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_custom_addon"
524
+ class="mo_wpns_button mo_wpns_button1"
525
+ style="float:right; margin-top:2%;"><?php echo __( 'Activate Plugin', 'miniorange-2-factor-authentication' ); ?></a>
526
+ <?php } ?>
527
+ <?php if ( ! get_option( 'mo2f_personalization_purchased' ) ) { ?> <a
528
+ onclick="mo2f_addonform('wp_2fa_addon_shortcode')" id="mo2f_purchase_custom_addon"
529
+ class="mo_wpns_button mo_wpns_button1"
530
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
531
+ <?php } ?>
532
+ <div id="mo2f_custom_addon_hide">
533
+ <h3 id="toggle_personalization_description" class="mo2f_pointer"><?php echo __( 'Description', 'miniorange-2-factor-authentication' ); ?> </h3>
534
+ <p id="custom_description" style="margin:2% 2% 2% 4%">
535
+ <?php echo __( 'This Add-On helps you modify and redesign the login screen\'s UI, and various customizations in the plugin dashboard. Along with customizing the plugin Icon and name, you can also customize the email and sms templates you and your users receive during authentication.', 'miniorange-2-factor-authentication' ); ?>
536
+ </p>
537
+ <br>
538
+ <div id="mo2f_hide_custom_content">
539
+ <div class="mo2f_box">
540
+ <h3><?php echo __( 'Customize Plugin Icon', 'miniorange-2-factor-authentication' ); ?></h3>
541
+ <hr>
542
+ <p>
543
+ <?php echo __( 'With this feature, you can customize the plugin icon in the dashboard which is useful when you want your custom logo to be displayed to the users.', 'miniorange-2-factor-authentication' ); ?>
544
+ </p>
545
+ <br>
546
+ <h3><?php echo __( 'Customize Plugin Name', 'miniorange-2-factor-authentication' ); ?></h3>
547
+ <hr>
548
+ <p>
549
+ <?php echo __( 'With this feature, you can customize the name of the plugin in the dashboard.', 'miniorange-2-factor-authentication' ); ?>
550
+ </p>
551
+
552
+ </div>
553
+ <br>
554
+ <div class="mo2f_box">
555
+ <h3><?php echo __( 'Customize UI of Login Pop up\'s', 'miniorange-2-factor-authentication' ); ?></h3>
556
+ <hr>
557
+ <p>
558
+ <?php echo __( 'With this feature, you can customize the login pop-ups during two factor authentication according to the theme of your website.', 'miniorange-2-factor-authentication' ); ?>
559
+ </p>
560
+ </div>
561
+
562
+ <br>
563
+ <div class="mo2f_box">
564
+ <h3><?php echo __( 'Custom Email and SMS Templates', 'miniorange-2-factor-authentication' ); ?></h3>
565
+ <hr>
566
+
567
+ <p><?php echo __( 'You can change the templates for Email and SMS which user receives during authentication.', 'miniorange-2-factor-authentication' ); ?></p>
568
+
569
+ </div>
570
+ </div>
571
+ </div>
572
+ <div id="mo2f_custom_addon_show"><?php $x = apply_filters( 'mo2f_custom', "custom"); ?></div>
573
+ </div>
574
+
575
+ <?php
576
+ }
577
+
578
+ function mo2f_shortcode_description($mo2f_user_email) { ?>
579
+ <div id="mo2f_Shortcode_addon_hide">
580
+ <?php if ( get_option( 'mo2f_shortcode_installed' ) ) { ?>
581
+ <a href="<?php echo admin_url(); ?>plugins.php" id="mo2f_activate_shortcode_addon"
582
+ class="mo_wpns_button mo_wpns_button1" style="float:right; margin-top:2%;"><?php echo __( 'Activate
583
+ Plugin', 'miniorange-2-factor-authentication' ); ?></a>
584
+ <?php } if ( ! get_option( 'mo2f_shortcode_purchased' ) ) { ?>
585
+ <a onclick="mo2f_addonform('wp_2fa_addon_personalization')" id="mo2f_purchase_shortcode_addon"
586
+ class="mo_wpns_button mo_wpns_button1"
587
+ style="float:right;"><?php echo __( 'Purchase', 'miniorange-2-factor-authentication' ); ?></a>
588
+ <?php } ?>
589
+
590
+ <div id="shortcode" class="description">
591
+ <h3 id="toggle_shortcode_description" class="mo2f_pointer"><?php echo __( 'Description ', 'miniorange-2-factor-authentication' ); ?></h3>
592
+ <p id="shortcode_description" style="margin:2% 2% 2% 4%">
593
+ <?php echo __( 'A shortcode is a WordPress-specific code that lets you do things with very little effort. Shortcodes can embed ugly code in just one line. You can use these shortcodes on any custom page. Just include the shortcode on your page and boom!', 'miniorange-2-factor-authentication' ); ?>
594
+ </p>
595
+ <br>
596
+ <div id="mo2f_hide_shortcode_content" class="mo2f_box">
597
+ <h3><?php echo __( 'List of Shortcodes', 'miniorange-2-factor-authentication' ); ?>:</h3>
598
+ <hr>
599
+ <ol style="margin-left:2%">
600
+ <li>
601
+ <b><?php echo __( 'Enable Two Factor: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to turn on/off 2-factor by user.', 'miniorange-2-factor-authentication' ); ?>
602
+ </li>
603
+ <li>
604
+ <b><?php echo __( 'Enable Reconfiguration: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( 'This shortcode provides an option to configure the Google Authenticator and Security Questions by user.', 'miniorange-2-factor-authentication' ); ?>
605
+ </li>
606
+ <li>
607
+ <b><?php echo __( 'Enable Remember Device: ', 'miniorange-2-factor-authentication' ); ?></b> <?php echo __( ' This shortcode provides\'Enable Remember Device\' from your custom login form.', 'miniorange-2-factor-authentication' ); ?>
608
+ </li>
609
+ </ol>
610
+ </div>
611
+ <div id="mo2f_Shortcode_addon_show"><?php $x = apply_filters( 'mo2f_shortcode', "shortcode" ); ?></div>
612
+ </div>
613
+ <br>
614
+ </div>
615
+ <form style="display:none;" id="mo2fa_loginform" action="<?php echo MO_HOST_NAME . '/moas/login'; ?>" target="_blank" method="post">
616
+ <input type="email" name="username" value="<?php echo $mo2f_user_email; ?>"/>
617
+ <input type="text" name="redirectUrl"
618
+ value="<?php echo MO_HOST_NAME . '/moas/initializepayment'; ?>"/>
619
+ <input type="text" name="requestOrigin" id="requestOrigin"/>
620
+ </form>
621
+ <script>
622
+ function mo2f_addonform(planType) {
623
+ jQuery('#requestOrigin').val(planType);
624
+ jQuery('#mo2fa_loginform').submit();
625
+ }
626
+ </script>
627
+ <?php
628
+ }
629
+
630
+ ?>
handler/signature/APLFI.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ $regex['LFI'][1] = array( "#(?i)(?:\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\/))(?:%(?:(?:f(?:(?:c%80|8)%8)?0%8|e)0%80%ae|2(?:(?:5(?:c0%25a|2))?e|%45)|u(?:(?:002|ff0)e|2024)|%32(?:%(?:%6|4)5|E)|c0(?:%[256aef]e|\.))|\.(?:%0[01]|\?)?|\?\.?|0x2e){2}(?:\x5c|(?:%(?:c(?:0%(?:[2aq]f|5c|9v)|1%(?:[19p]c|8s|af))|2(?:5(?:c(?:0%25af|1%259c)|2f|5c)|%46|f)|(?:(?:f(?:8%8)?0%8|e)0%80%a|bg%q)f|%3(?:2(?:%(?:%6|4)6|F)|5%%63)|u(?:221[56]|002f|EFC8|F025)|1u|5c)|0x(?:2f|5c)|\/))#" , "# (?:^|[\\/])\.\.(?:[\\/]|$)#","$(?:.(?:(?:(?:(?:mini)?kub|vmwar)e|d(?:ocker|bus)|cups)/|a(?:ws/c(?:redentials|onfig)|(?:nydesk|tom)/)|g(?:(?:nonme|sutil|em)/|itlab-ci.yml)|t(?:hunderbird/|ravis.yml)|j(?:shintrc|ava/)|n(?:[pv]m/|etrc)|bo(?:werrc|to)|eslintrc|idea)|# (?:New (?:Top Level dotf|Per-Project F)iles|common, old network config file|WS FTP|OSX)|/.(?:ws_ftp.ini|DS_Store|env)|database.yml|Dockerfile|bower.json|nbproject/)$","#(?:etc/(?:s(?:e(?:curity/(?:(?:(?:namespac|tim)e|sepermit|access).conf|l(?:imits(?:.conf)?|astlog)|(?:failedlogi|enviro)n|pa(?:m_env.conf|sswd)|group(?:.conf)?|opasswd|user)|nsors3?.conf)|ys(?:c(?:tl(?:.d/(?:10-(?:(?:network|process)-security|console-messages)|wine.sysctl))?.conf|onfig/network-scripts/ifcfg-eth0)|log.conf)|quirrelmail/(?:(?:config(?:_(?:default|local)|/config)?|sqspell_config|filters_setup|index).php|(?:default_pre|apache.con)f)|amba/(?:s(?:mb(?:.conf(?:.user)?|passwd|users)|amba.conf)|private/smbpasswd|dhcp.conf|netlogon)|(?:w-cp-server/applications.d/(?:00-sso-cpserver|plesk)|tunnel/stunnel).conf|u(?:bversion/config|se-release|doers)|s(?:o/sso_config.ini|h/sshd_config)|m(?:b(?:passwd|.conf)|i.conf)|lackware-release|hadow[-~]?)|a(?:p(?:ache(?:2(?:/(?:(?:mods-(?:available/(?:m(?:em_cach|im)e|s(?:etenvif|sl)|d(?:eflate|ir)|autoindex|proxy)|enabled/(?:(?:statu|alia)s|d(?:eflate|ir)|negotiation|mime|php5))|(?:apache|httpd)2?|default-server|ports).conf|s(?:ites-(?:available/default(?:-ssl)?|enabled/(?:000-)?default)|sl-global.conf)|conf(?:.d/(?:phpmyadmin.conf|security|charset)|/httpd.conf)|vhosts.d/(?:00_default_vhost.conf|default_vhost.include)|envvars)|2(?:/conf)?/httpd.conf)|/(?:a(?:ccess|pache)|(?:conf/)?httpd|default-server).conf)|t/apt.conf)|(?:vahi/avahi-daemon|dduser).conf|lias)|p(?:hp(?:(?:(?:(?:4(?:/(?:apache2?|cgi)|.4/fcgi)|5/(?:apache2?|cgi))/|/(?:(?:apache2?|cgi)/|(?:php4/)?))php)?.ini|myadmin/config.inc.php)|u(?:re(?:-ftpd(?:/pure(?:-ftpd.(?:conf|pdb)|ftpd.pdb)|.conf)|ftpd.p(?:asswd|db))|lse/client.conf)|ro(?:f(?:tp(?:d/modules)?.conf|ile)|tpd/proftpd.conf)|a(?:ssw(?:ord.master|d[-~]?)|m.(?:d/proftpd|conf))|ostgresql/p(?:ostgresql|g_hba).conf)|m(?:o(?:no/(?:(?:2.0/(?:machine|web)|1.0/machine).)?config|d(?:probe.d/vmware-tools.conf|ules)|td)|(?:y(?:sql/(?:conf.d/old_passwords|my))?.c|iredo(?:/miredo)?(?:-server)?.co)nf|uddleftpd(?:/(?:mud(?:dleftpd.(?:passwd|conf)|log(?:d.conf)?)|passwd)|.com)|a(?:n(?:drake-release|path.config)|il/sendmail.conf)|t(?:ools.conf|ab))|h(?:ttp(?:d(?:/(?:conf(?:.d(?:/(?:squirrelmail|php).conf)?|/(?:apache2?|httpd).conf)?|(?:extra/httpd-ssl|apache2?|mod_php|httpd).conf|logs/(?:access.)log|php.ini)|.conf)|(?:/conf)?/httpd.conf)|ost(?:s(?:.(?:allow|deny))?|.conf|name)|dparm.conf)|c(?:ups/(?:(?:p(?:rinter|dftop)s|acroread).conf|cupsd.conf(?:.default)?)|(?:lamav/(?:freshclam|clamd)|vs-(?:pserver|cron)).conf|a(?:-certificates.conf(?:.dpkg-old)?|sper.conf)|h(?:krootkit.conf|rootusers)|r(?:ypt|on)tab)|w(?:icd/(?:(?:wire(?:less|d)|manager)-settings.conf|dhclient.conf.template.default)|u-ftpd/ftp(?:acces|host|user)s|ebmin/miniserv.(?:users|conf))|v(?:mware-tools/(?:(?:vmware-tools-libraries|tpvmlp).conf|config)|sftpd(?:.c(?:hroot_list|onf)|/vsftpd.conf)|hcs2/proftpd/proftpd.conf)|l(?:og(?:rotate.(?:d/(?:vsftpd.log|proftpd|ftp)|conf)|in.defs)|(?:ighttpd/lighthttpd|d(?:ap/ldap|.so)|trace).conf)|r(?:e(?:solv(?:conf/update-libc.d/sendmail|.conf)|d(?:is(?:-sentinel)?.conf|hat-release))|c.(?:d/rc.httpd|conf))|d(?:e(?:b(?:ian_version|conf.conf)|fault/grub|luser.conf)|(?:hcp(?:3/dhc(?:lient|pd)|/dhclient)|ns2tcpd).conf)|f(?:tp(?:(?:host|user)s|chroot)|(?:oremost|use).conf|edora-release|irewall.rules|stab)|b(?:luetooth/(?:network|rfcomm|input|main).conf|ash(?:_completion.d/debconf|.bashrc))|x11/xorg.conf(?:.(?:beforevmwaretoolsinstall|orig)|-v(?:mware|esa))?|i(?:n(?:it(?:tab|.d|/)|etd.conf)|pfw.(?:rules|conf)|ssue(?:.net)?)|t(?:i(?:nyproxy/tinyproxy.conf|mezone)|(?:or/tor-t)?socks.conf)|o(?:s(?:xhttpd/osxhttpd.conf|-release)|penldap/ldap.conf)|u(?:pdatedb.conf(?:.beforevmwaretoolsinstall)?|tmp)|n(?:e(?:wsyslog.conf|twork[/s])|ginx/nginx.conf)|e(?:(?:sound/esd|2fsck|tter).conf|xports)|k(?:ernel-(?:im|pk)g.conf|bd/config)|group-?)|usr(?:/(?:l(?:ocal/(?:p(?:hp(?:4/(?:apache(?:2.conf(?:.php)?|.conf(?:.php)?)|httpd.conf(?:.php)?|lib/php.ini)|5/(?:apache(?:2.conf(?:.php)?|.conf(?:.php)?)|httpd.conf(?:.php)?|lib/php.ini)|/(?:apache(?:2.conf(?:.php)?|.conf(?:.php)?)|httpd.conf(?:.php)?|lib/php.ini))|sa/admin/(?:htdocs/domains/databases/phpmyadmin/libraries/config.default.php|conf/(?:site_isolation_settings|php).ini|logs/(?:httpsd_access_|panel.)log)|gsql/(?:data/p(?:ostgresql.(?:conf|log)|g_(?:hba.conf|log)|asswd)|bin/pg_passwd)|ureftpd/(?:etc/pure(?:-ftpd.conf|ftpd.pdb)|sbin/pure-config.pl))|ap(?:ache(?:2(?:/(?:(?:conf/(?:(?:extra/httpd-)?ssl|vhosts(?:-custom)?|apache2?|modsec|httpd)|apache2?|httpd).conf|logs/(?:a(?:ccess.|udit_))?log)|2(?:/conf)?/httpd.conf)|/(?:conf/(?:(?:a(?:pache2?|ccess)|vhosts(?:-custom)?|modsec).conf|httpd.conf(?:.default)?|php.ini)|logs/(?:a(?:ccess.|udit_))?log|(?:apache2?|httpd).conf)|1.3/conf/httpd.conf)|ps/apache(?:2?2)?/conf/httpd.conf)|jakarta/(?:tomcat/(?:conf/(?:(?:logging|workers).properties|(?:context|server).xml|jakarta.conf)|logs/(?:catalina.(?:err|out)|mod_jk.log))|dist/tomcat/(?:conf/(?:(?:logging|workers).properties|(?:context|server).xml|jakarta.conf)|logs/mod_jk.log))|etc/(?:(?:(?:apache(?:2(?:/(?:(?:conf/)?httpd|vhosts)|2(?:/conf)?/httpd)|/(?:(?:conf/)?httpd|vhosts))|nginx/nginx|smb).|httpd/(?:conf/httpd.)?)conf|p(?:ure(?:-ftpd.conf|ftpd.pdb)|hp.ini)|webmin/miniserv.(?:users|conf)|lighttpd.conf(?:.new)?)|l(?:i(?:ghttpd/(?:log/(?:lighttpd.error|access).log|conf/lighttpd.conf)|b/php.ini)|sws/(?:conf/httpd_conf.xml|logs/error.log)|ogs/(?:access|samba).log)|mysql/data/mysql(?:-(?:bin.(?:index|log)|slow.log)|.(?:err|log)|derror.log)|s(?:amba/lib/(?:smb.conf|log).user|quirrelmail/www/readme|b/config)|cpanel/logs/(?:l(?:icense|ogin)|(?:acces|stat)s|error)_log|ze(?:us/web/(?:global.cfg|log/errors)|nd/etc/php.ini)|(?:httpd/conf/httpd|nginx/conf/nginx).conf)|ib/(?:security/mkuser.default|(?:php/)?php.ini|cron/log))|s(?:hare/(?:tomcat(?:6/(?:conf/(?:(?:logging|workers).properties|(?:context|server).xml)|logs/catalina.(?:err|out))|/logs/catalina.(?:err|out))|squirrelmail/(?:plugins/squirrel_logger/setup|config/config).php|logs/catalina.(?:err|out)|adduser/adduser.conf)|bin/(?:mud(?:passw|log)d|pure-config.pl)|pool/(?:mqueue/sys|lp/)log)|p(?:orts/(?:contrib/pure-ftpd/pure(?:ftpd.p(?:asswd|db)|-ftpd.conf)|ftp/pure-ftpd/pure(?:ftpd.p(?:asswd|db)|-ftpd.conf)|net/pure-ftpd/pure(?:ftpd.p(?:asswd|db)|-ftpd.conf))|kg(?:src/net/pureftpd/pure(?:ftpd.p(?:asswd|db)|-ftpd.conf)|/etc/httpd/httpd(?:-(?:default|vhosts))?.conf))|home/user/(?:var/log/(?:lighttpd.error|apache).log|lighttpd/lighttpd.conf)|internet/pgsql/data/p(?:ostmaster.log|g_hba.conf)|(?:apache2?/conf/ht|etc/pure-f)tpd.conf)|\/local\/(?:[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log)|mysql\/data\/\{host\}.err))|v(?:ar(?:/(?:l(?:o(?:g(?:/(?:p(?:(?:o(?:stgres(?:ql(?:/(?:postgres(?:ql(?:-(?:8.[134]|9.[01])-main)?)?|main))?|/p(?:g_backup|ostgres)).|p)|(?:ure(?:-ftpd/pure-)?ftpd|m-powersave).|gsql(?:(?:/pgsql|8).|_))log|roftpd(?:.(?:access_|xfer)log|/xferlog.legacy)?)|(?:(?:v(?:mware/hostd(?:-1)?|sftpd)|cron/var/log/postgres|webmin/miniserv|boot).|a(?:pache(?:2/(?:(?:access|error).)|/(?:access.))|ccess.|uth.?)|e(?:xim[/_](?:reject|panic|main)|rror.)|httpd/(?:access.)|x(?:org.0.|fer))log|m(?:ysql(?:/(?:mysql(?:-(?:bin.(?:index|log)|slow.log)|.log)|data/mysql-bin.index)|.(?:err|log)|-bin.index|derror.log)|ail(?:.(?:info|warn|err|log)|log)|uddleftpd(?:.conf)?|essages(?:.1)?)|n(?:ews(?:/(?:news.(?:notice|crit|all|err)|suck.(?:notice|err))|.all)|ginx(?:.(?:access|error)_|/(?:access.))log)|s(?:(?:(?:quirrelmail|so/sso).|w-cp-server/error_)log|amba(?:/log.[ns]mbd|.log[12]?)|yslog(?:.1)?)|l(?:ighttpd(?:/(?:(?:access|error)(?:.www)?.log)?|.(?:access|error).log)|og.smb)|da(?:ta/mysql-bin.index|emon.log(?:.1)?)|ftp(?:-proxy(?:/ftp-proxy.log)?|log)|ipfw(?:.(?:today|log)|/ipfw.log)?|u(?:ser.log(?:.1)?|fw.log)|tomcat6/catalina.out|kern.log(?:.1)?)|s/access.log)|cal/www/conf/php.ini)|i(?:b/(?:(?:pgsql/data/postgresql.co|mysql/my.c)nf|squirrelmail/prefs/squirrelmail.log)|ghttpd.log)|p/logs/(?:lp(?:sched|net)|requests))|a(?:dm/(?:l(?:og(?:/(?:asppp.|xfer)|in)log|astlog/username|p/lpd-errs)|(?:ras/(?:boot|err)|s(?:ys|u)|vold.)log|cr(?:ash/(?:vmcore|unix)|on/log)|ac(?:ct/sum/loginlog|ulogs?)|(?:message|x0msg)s|[pq]acct|utmpx?|wtmpx?|dtmp)|pache/conf/httpd.conf)|www/(?:(?:html/squirrelmail(?:-1.2.9)?|squirrelmail)/config/config.php|(?:conf/httpd.)?conf|logs/(?:access.)log|.lighttpdpassword)|postgresql/(?:db/postgresql.conf|log/postgresql.log)|c(?:panel/(?:tomcat.options|cpanel.config)|ron/log)|m(?:ysql(?:-bin.index|.log)|ail/www-data)|data/mysql-bin.index|nm2/postgresql.conf|saf/(?:port/|_)log)|\/log\/lighttpd\/\{domain\}\/(?:access|error).log)|olumes/(?:macintosh_hd1/(?:usr/local/php(?:/(?:httpd.conf.php|lib/php.ini)|[45]/httpd.conf.php)|opt/(?:apache2?|httpd)/conf/httpd.conf)|webbackup/(?:private/etc/httpd/httpd.conf(?:.default)?|opt/apache2/conf/httpd.conf)))|p(?:r(?:o(?:gram files(?:/(?:apache (?:group/apache(?:/(?:(?:conf/(?:apache2?|httpd)|apache2?).conf|logs/(?:access|error).log)|2/conf/(?:apache2?|httpd).conf)|software foundation/apache2.2/(?:logs/(?:access|error).log|conf/httpd.conf))|mysql/(?:my(?:sql server 5.0/(?:data/mysql(?:-bin.(?:index|log)|.(?:err|log))|my.(?:cnf|ini))|.(?:cnf|ini))|data/mysql(?:-bin.(?:index|log)|.(?:err|log)))|(?:postgresql/(?:8.[34]|9.[01])/data/p(?:g_(?:ident|hba)|ostgresql)|xampp/apache/conf/(?:apache2?|httpd)|vidalia bundle/polipo/polipo).conf)|\/(?:[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log)|mysql(?:\/mysql server 5.0)?\/data\/\{host\}.err))|c/(?:self/(?:fd/(?:[023456789]|1[012345]?)|stat(?:us)?|cmdline|environ|mounts)|(?:cpu|mem)info|net/(?:tc|ud)p|devices|version))|ivate(?:\/tmp\/[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log)|/etc/(?:httpd/(?:httpd.conf(?:.default)?|apache2?.conf)|squirrelmail/config/config.php)))|a(?:ckage(?:-lock)?.json|rameters.yml)|ostgresql/log/pgadmin.log|hp[45]?/php.ini)|w(?:in(?:dows/(?:s(?:ystem32/(?:logfiles/(?:firewall/pfirewall.log(?:.old)?|w3svc[123]?/inetsvn1.log|smtpsvc[12345]?|msftpsvc[12]?)|drivers/etc/(?:(?:network|service|host)s|lmhosts.sam|protocol)|macromed/flash/(?:flash)?install.log)|etup(?:a(?:ct|pi)|err).log)|(?:(?:debug/net|repair/|com)setup|w(?:indowsupdate|msetup)|updspapi).log|(?:odbc|php).ini)|nt/(?:system32/logfiles/(?:firewall/pfirewall.log(?:.old)?|w3svc[123]?/inetsvn1.log|smtpsvc[12345]?|msftpsvc[12]?)|repair/sam._|php.ini))|amp/(?:bin/(?:apache/apache2.2.2(?:2/(?:(?:conf/(?:wampserver|httpd)|wampserver).conf|logs/(?:access|error).log)|1/(?:(?:conf/httpd|wampserver).conf|logs/(?:access|error).log))|mysql/mysql5.5.(?:16/(?:data/mysql-bin.index|wampserver.conf|my.ini)|24/(?:data/mysql-bin.index|wampserver.conf|my.ini))|php/php5.(?:3.8|4.3)/php.ini)|logs/(?:a(?:pache_error|ccess)|(?:slow|gen)query|mysql).log)|ww/(?:logs/(?:freebsddiary-(?:access_|error.)|proftpd.system.)log|(?:apache/)?conf/httpd.conf)|p-config.(?:t(?:e?mp|xt)|bak|old|php)|eb(?:pack.config.js|/conf/php.ini))|\.(?:s(?:sh/(?:id(?:_(?:dsa(?:.pub)?|rsa(?:.pub)?)|entity(?:.pub)?)|(?:authorized_key|known_host)s|config)|ubversion/(?:servers|config|auth)|(?:qlite|h)_history)|c(?:onfig/odesk/odesk team.conf|ache/notify-osd.log|shrc)|l(?:(?:ocal/share/mc|ftp)/|(?:ldb-)?history|esshst)|h(?:t(?:access|digest|passwd)|plip/hplip.conf)|p(?:(?:ython|sql|hp)_history|rofile|earrc|ki/)|bash(?:_(?:history|profile|config|logout)|rc)|(?:(?:(?:rediscli|ksh)_|R)histor|xauthorit)y|vi(?:dalia/vidalia.conf|m(?:info|rc))|n(?:(?:ode_repl|ano)_history|sr)|z(?:sh(?:_history|rc)|history)|tc(?:onn/tconn.conf|shrc)|my(?:sql_history|.cnf)|g(?:itconfig|nupg/)|aptitude/config|drush/)|o(?:pt(?:/(?:(?:apache(?:2(?:/(?:conf/(?:apache2?|httpd)|apache2?)|2/conf/httpd)|/(?:conf/(?:apache2?|httpd)|apache2?))|httpd/(?:conf/)?apache2?).conf|l(?:sws/(?:logs/(?:access|error).log|conf/httpd_conf.xml)|ampp/(?:logs/(?:access.)log|etc/httpd.conf))|xampp/(?:logs/(?:access.)log|etc/php.ini)|tomcat/logs/catalina.(?:err|out))|\/[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log))|rmconfig.json)|xampp(?:/(?:apache/(?:logs/(?:access|error).log|conf/httpd.conf|bin/php.ini)|m(?:ysql/data/mysql(?:-bin.index|.err)|ercurymail/mercury.ini)|htdocs/(?:a(?:dmin.php|ca.txt)|leer.txt)|php(?:myadmin/config.inc.php|/php.ini)|filezillaftp/filezilla server.xml|sendmail/sendmail.(?:ini|log)|webalizer/webalizer.conf)|\/mysql\/data\/\{host\}.err)|s(?:ystem(?:32/(?:inetsrv/config/(?:a(?:pplicationhost|dministration)|redirection).config|config/(?:s(?:(?:yste|a)m|oftware)|default))|/library/webobjects/adaptors/apache2.2/apache.conf)|(?:ites/default/(?:settings(?:.local)?|default.settings)|rv/www/htdos/squirrelmail/config/config).php|e(?:curity|rvices).yml|ftp-config.json)|t(?:mp(?:\/[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log)|/access.log)|ypo3conf/localconf.php|sconfig.json)|[jboss]\/server\/default\/(?:conf\/(?:s(?:tandardj(?:bos|aw)s.xml|erver.log.properties)|j(?:boss-(?:minimal|service).xml|ndi.properties)|log(?:in-config|4j).xml)|deploy\/jboss-logging.xml|log\/(?:server|boot).log)|h(?:ome(?:/(?:postgres/data/p(?:g_(?:(?:ident|hba).conf|version)|ostgresql.conf)|user/lighttpd/lighttpd.conf|bin/stable/apache/php.ini)|2/bin/stable/apache/php.ini)|ttp/httpd.conf)|ap(?:ache(?:/(?:logs/(?:access|error).log|conf/httpd.conf|php/php.ini)|2/logs/(?:access|error).log)|p/etc/local.xml)|l(?:ibrary/webserver/documents/(?:default.(?:html?|php)|index.(?:html?|php))|ogs/(?:security(?:_debug)?_)?log)|mysql(?:/(?:data/mysql(?:-bin.(?:index|log)|.(?:err|log))|my.(?:cnf|ini)|bin/my.ini)|\/data\/\{host\}.err)|ro(?:ot/.(?:bash(?:_(?:history|config|logout)|rc)|(?:ksh_histor|xauthorit)y)|uting.yml)|config(?:/(?:database|custom|app).php|_(?:prod|test|dev).yml|.(?:inc.php|yml))|in(?:c(?:ludes/config(?:ure)?|/config).php|etpub/wwwroot/global.asa)|n(?:etserver/bin/stable/apache/php.ini|pm-debug.log)|b(?:oot/grub/(?:grub.cfg|menu.lst)|in/php.ini)|/(?:config(?:uration)?.php|boot.ini|etc/)|LocalSettings.php|gruntfile.js|Web.config|yarn.lock)#" );
4
+ $score['LFI'][1] = array( 5 , 5, 5, 5 );
5
+ ?>
handler/signature/APSQLI.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $regex['SQL'][1] = array( "#(?i:\b(?:(?:m(?:s(?:ys(?:ac(?:cess(?:objects|storage|xml)|es)|(?:relationship|object|querie)s|modules2?)|db)|aster\.\.sysdatabases|ysql\.db)|pg_(?:catalog|toast)|information_schema|northwind|tempdb)\b|s(?:(?:ys(?:\.database_name|aux)|qlite(?:_temp)?_master)\b|chema(?:_name\b|\W*\())|d(?:atabas|b_nam)e\W*\())#" , "#(?i:sleep\(\s*?\d*?\s*?\)|benchmark\(.*?\,.*?\))#" , "#(?i:(?:select|;)\s+(?:benchmark|sleep|if)\s*?\(\s*?\(?\s*?\w+)#" , "#(?i:(?:[\'`](?:;?\s*?(?:having|select|union)\b\s*?[^\s]|\s*?!\s*?[\'`\w])|(?:c(?:onnection_id|urrent_user)|database)\s*?\([^\)]*?|u(?:nion(?:[\w(\s]*?select|select@)|ser\s*?\([^\)]*?)|s(?:chema\s*?\([^\)]*?|elect.*?\w?user\()|into[\s+]+(?:dump|out)file\s*?[\'`]|\s*?exec(?:ute)?.*?\Wxp_cmdshell|from\W+information_schema\W|exec(?:ute)?\s+master\.|\wiif\s*?\())#" , "#^(?i:-0000023456|4294967295|4294967296|2147483648|2147483647|0000012345|-2147483648|-2147483649|0000023456|3.0.00738585072007e-308|1e309)$#" , "#(?i:[\s()]case\s*?\(|\)\s*?like\s*?\(|having\s*?[^\s]+\s*?[^\w\s]|if\s?\([\d\w]\s*?[=<>~])#" , "#(?i:(?:[\'`](?:;*?\s*?waitfor\s+(?:delay|time)\s+[\'`]|;.*?:\s*?goto)|alter\s*?\w+.*?cha(?:racte)?r\s+set\s+\w+))#" , "#(?i:merge.*?using\s*?\(|execute\s*?immediate\s*?[\'`]|match\s*?[\w(),+-]+\s*?against\s*?\()#" , "#(?i)union.*?select.*?from#" , "@(?i:(?:;\s*?shutdown\s*?(?:[#;]|\/\*|--|\{)|waitfor\s*?delay\s?[\'`]+\s?\d|select\s*?pg_sleep))@" , "#(?i:(?:\[\$(?:ne|eq|lte?|gte?|n?in|mod|all|size|exists|type|slice|x?or|div|like|between|and)\]))#" , "%(?i:(?:create\s+(?:procedure|function)\s*?\w+\s*?\(\s*?\)\s*?-|;\s*?(?:declare|open)\s+[\w-]+|procedure\s+analyse\s*?\(|declare[^\w]+[@#]\s*?\w+|exec\s*?\(\s*?\@))%" , "#(?i:(?:;\s*?(?:(?:(?:trunc|cre|upd)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|alter|load)\s*?[\[(]?\w{2,}|create\s+function\s+.+\s+returns))#" , "#(?i:(?:^[\W\d]+\s*?(?:alter\s*(?:a(?:(?:pplication\s*rol|ggregat)e|s(?:ymmetric\s*ke|sembl)y|u(?:thorization|dit)|vailability\s*group)|c(?:r(?:yptographic\s*provider|edential)|o(?:l(?:latio|um)|nversio)n|ertificate|luster)|s(?:e(?:rv(?:ice|er)|curity|quence|ssion|arch)|y(?:mmetric\s*key|nonym)|togroup|chema)|m(?:a(?:s(?:ter\s*key|k)|terialized)|e(?:ssage\s*type|thod)|odule)|l(?:o(?:g(?:file\s*group|in)|ckdown)|a(?:ngua|r)ge|ibrary)|t(?:(?:abl(?:espac)?|yp)e|r(?:igger|usted)|hreshold|ext)|p(?:a(?:rtition|ckage)|ro(?:cedur|fil)e|ermission)|d(?:i(?:mension|skgroup)|atabase|efault|omain)|r(?:o(?:l(?:lback|e)|ute)|e(?:sourc|mot)e)|f(?:u(?:lltext|nction)|lashback|oreign)|e(?:xte(?:nsion|rnal)|(?:ndpoi|ve)nt)|in(?:dex(?:type)?|memory|stance)|b(?:roker\s*priority|ufferpool)|x(?:ml\s*schema|srobject)|w(?:ork(?:load)?|rapper)|hi(?:erarchy|stogram)|o(?:perator|utline)|(?:nicknam|queu)e|us(?:age|er)|group|java|view)|u(?:nion\s*(?:(?:distin|sele)ct|all)|pdate)|(?:(?:trunc|cre)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|load)\b|(?:(?:(?:trunc|cre|upd)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|alter|load)\s+(?:group_concat|load_file|char)\s?\(?|[\d\W]\s+as\s*?[\'`\w]+\s*?from|[\s(]load_file\s*?\(|[\'`]\s+regexp\W|end\s*?\);))#" , "#(?i:/\*[!+](?:[\w\s=_\-()]+)?\*/)#" );
3
+ $score['SQL'][1] = array( 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 );
4
+ $regex['SQL'][2] = array( "#(?:^\s*[\'`;]+|[\'`]+\s*$)#" , "#(?i:(?:(?:^|\W)in[+\s]*\([\s\d\]+[^()]*\)|\b(?:r(?:egexp|like)|isnull|xor)\b|<(?:>(?:\s+binary)?|=>?|<)|r(?:egexp|like)\s+binary|not\s+between\s+0\s+and|(?:like|is)\s+null|>[=>]|\|\||!=|&&))#" , "#(?i:[\s'\`()]*?([\d\w]++)[\s'\`()]*?(?:<(?:=(?:[\s'\`()]*?(?!\1)[\d\w]+|>[\s'\`()]*?(?:\1))|>?[\s'\`()]*?(?!\1)[\d\w]+)|(?:not\s+(?:regexp|like)|is\s+not|>=?|!=|\^)[\s'\`()]*?(?!\1)[\d\w]+|(?:(?:sounds\s+)?like|r(?:egexp|like)|=)[\s'\`()]*?(?:\1)))#" , "#(?i)\b(?:c(?:o(?:n(?:v(?:ert(?:_tz)?)?|cat(?:_ws)?|nection_id)|(?:mpres)?s|ercibility|(?:un)?t|llation|alesce)|ur(?:rent_(?:time(?:stamp)?|date|user)|(?:dat|tim)e)|h(?:ar(?:(?:acter)?_length|set)?|r)|iel(?:ing)?|ast|r32)|s(?:u(?:b(?:str(?:ing(?:_index)?)?|(?:dat|tim)e)|m)|t(?:d(?:dev_(?:sam|po)p)?|r(?:_to_date|cmp))|e(?:c(?:_to_time|ond)|ssion_user)|ys(?:tem_user|date)|ha[12]?|oundex|chema|ig?n|leep|pace|qrt)|i(?:s(?:_(?:ipv(?:4(?:_(?:compat|mapped))?|6)|n(?:ot(?:_null)?|ull)|(?:free|used)_lock)|null)|n(?:et(?:6_(?:aton|ntoa)|_(?:aton|ntoa))|s(?:ert|tr)|terval)?|f(?:null)?)|d(?:a(?:t(?:e(?:_(?:format|add|sub)|diff)?|abase)|y(?:of(?:month|week|year)|name)?)|e(?:(?:s_(?:de|en)cryp|faul)t|grees|code)|count|ump)|l(?:o(?:ca(?:l(?:timestamp)?|te)|g(?:10|2)?|ad_file|wer)|ast(?:_(?:inser_id|day))?|e(?:(?:as|f)t|ngth)|case|trim|pad|n)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(?:time(?:stamp)?|date)|p(?:datexml|per)|uid(?:_short)?|case|ser)|t(?:ime(?:_(?:format|to_sec)|stamp(?:diff|add)?|diff)?|o(?:(?:second|day)s|_base64|n?char)|r(?:uncate|im)|an)|m(?:a(?:ke(?:_set|date)|ster_pos_wait|x)|i(?:(?:crosecon)?d|n(?:ute)?)|o(?:nth(?:name)?|d)|d5)|r(?:e(?:p(?:lace|eat)|lease_lock|verse)|a(?:wtohex|dians|nd)|o(?:w_count|und)|ight|trim|pad)|f(?:i(?:eld(?:_in_set)?|nd_in_set)|rom_(?:unixtime|base64|days)|o(?:und_rows|rmat)|loor)|p(?:o(?:w(?:er)?|sition)|eriod_(?:diff|add)|rocedure_analyse|assword|g_sleep|i)|a(?:s(?:cii(?:str)?|in)|es_(?:de|en)crypt|dd(?:dat|tim)e|(?:co|b)s|tan2?|vg)|b(?:i(?:t_(?:length|count|x?or|and)|n(?:_to_num)?)|enchmark)|e(?:x(?:tract(?:value)?|p(?:ort_set)?)|nc(?:rypt|ode)|lt)|g(?:r(?:oup_conca|eates)t|et_(?:format|lock))|v(?:a(?:r(?:_(?:sam|po)p|iance)|lues)|ersion)|o(?:(?:ld_passwo)?rd|ct(?:et_length)?)|we(?:ek(?:ofyear|day)?|ight_string)|n(?:o(?:t_in|w)|ame_const|ullif)|h(?:ex(?:toraw)?|our)|qu(?:arter|ote)|year(?:week)?|xmltype)\W*\(#" , "@(?i:[\'`](?:\s*?(?:(?:between|x?or|and|div)[\w\s-]+\s*?[+<>=(),-]\s*?[\d\'`]|like(?:[\w\s-]+\s*?[+<>=(),-]\s*?[\d\'`]|\W+[\w\'`(])|[!=|](?:[\d\s!=+-]+.*?[\'`(].*?|[\d\s!=]+.*?\d+)$|[^\w\s]?=\s*?[\'`])|(?:\W*?[+=]+\W*?|[<>~]+)[\'`])|(?:/\*)+[\'`]+\s?(?:\/\*|--|\{|#)?|\d[\'`]\s+[\'`]\s+\d|where\s[\s\w\.,-]+\s=|^admin\s*?[\'`]|\sis\s*?0\W)@" , "#(?i:(?:(?:(?:(?:trunc|cre|upd)at|renam)e|(?:inser|selec)t|de(?:lete|sc)|alter|load)\s*?\(\s*?space\s*?\(|,.*?[)\da-f\'`][\'`](?:[\'`].*?[\'`]|(?:\r?\n)?\z|[^\'`]+)|\Wselect.+\W*?from))#" , "%(?i:(?:(?:n(?:and|ot)|(?:x?x)?or|between|\|\||like|and|div|&&)[\s(]+\w+[\s)]*?[!=+]+[\s\d]*?[\'`=()]|\/\w+;?\s+(?:between|having|select|like|x?or|and|div)\W|\d+\s*?(?:between|like|x?or|and|div)\s*?\d+\s*?[\-+]|--\s*?(?:(?:insert|update)\s*?\w{2,}|alter|drop)|#\s*?(?:(?:insert|update)\s*?\w{2,}|alter|drop)|;\s*?(?:(?:insert|update)\s*?\w{2,}|alter|drop)|\@.+=\s*?\(\s*?select|\d\s+group\s+by.+\(|[^\w]SET\s*?\@\w+))%" , "#(?i:[\'`]\s*?(?:(?:n(?:and|ot)|(?:x?x)?or|between|\|\||and|div|&&)\s+[\s\w]+=\s*?\w+\s*?having\s+|like(?:\s+[\s\w]+=\s*?\w+\s*?having\s+|\W*?[\'`\d])|[^?\w\s=.,;)(]++\s*?[(@\'`]*?\s*?\w+\W+\w|\*\s*?\w+\W+[\'`])|(?:union\s*?(?:distinct|[(!@]*?|all)?\s*?[([]*?\s*?select|select\s+?[\[\]()\s\w\.,\'`-]+from)\s+|\w+\s+like\s+[\'`]|find_in_set\s*?\(|like\s*?[\'`]%)#" , "@(?i:(?:(?:n(?:and|ot)|(?:x?x)?or|between|\|\||like|and|div|&&)\s+\s*?\w+\(|\)\s*?when\s*?\d+\s*?then|[\'`]\s*?(?:--|\{|#)|cha?r\s*?\(\s*?\d|\/\*!\s?\d+))@" , "#(?i:(?:[\'`](?:;\s*?(?:begin|while|if)|[\s\d]+=\s*?\d|\s+and\s*?=\W)|(?:\(\s*?select\s*?\w+|order\s+by\s+if\w*?|coalesce)\s*?\(|\w[\'`]\s*?(?:(?:[-+=|@]+\s+?)+|[-+=|@]+)[\d(]|[\s(]+case\d*?\W.+[tw]hen[\s(]|\+\s*?\d+\s*?\+\s*?\@|\@\@\w+\s*?[^\w\s]|\W!+[\'`]\w|\*\/from))#" , "#(?i:(?:(?:(?:^[\'`\\\\]*?[^\'`]+[\'`])+|(?:^[\'`\\\\]*?[\d\'`]+)+)\s*?(?:n(?:and|ot)|(?:x?x)?or|between|\|\||like|and|div|&&)\s*?[\w\'`][+&!@(),.-]|\@(?:[\w-]+\s(?:between|like|x?or|and|div)\s*?[^\w\s]|\w+\s+(?:between|like|x?or|and|div)\s*?[\'`\d]+)|[\'`]\s*?(?:between|like|x?or|and|div)\s*?[\'`]?\d|[^\w\s:]\s*?\d\W+[^\w\s]\s*?[\'`].|[^\w\s]\w+\s*?[|-]\s*?[\'`]\s*?\w|\Winformation_schema|\\\\x(?:23|27|3d)|table_name\W|^.?[\'`]$))#" , "@(?i:(?:[\'`](?:\s*?(?:is\s*?(?:[\d.]+\s*?\W.*?[\'`]|\d.+[\'`]?\w)|\d\s*?(?:--|#))|(?:\W+[\w+-]+\s*?=\s*?\d\W+|\|?[\w-]{3,}[^\w\s.,]+)[\'`]|[\%&<>^=]+\d\s*?(?:between|like|x?or|and|div|=))|(?i:n?and|x?x?or|div|like|between|not|\|\||\&\&)\s+[\s\w+]+(?:sounds\s+like\s*?[\'`]|regexp\s*?\(|[=\d]+x)|in\s*?\(+\s*?select))@" , "#(?i:^[\W\d]+\s*?(?:alter|union)\b)#" , "@(?i:[\'`](?:\s*?(?:(?:\*.+(?:(?:an|i)d|between|like|x?or|div)\W*?[\'`]|(?:between|like|x?or|and|div)\s[^\d]+[\w-]+.*?)\d|[^\w\s?]+\s*?[^\w\s]+\s*?[\'`]|[^\w\s]+\s*?[\W\d].*?(?:--|#))|.*?\*\s*?\d)|[()\*<>%+-][\w-]+[^\w\s]+[\'`][^,]|\^[\'`])@" , "#(?:\b(?:having\b?(?:[\'\][^=]{1,10}[\'\?[=<>]+|\d{1,10}?[=<>]+)|(?i:having)\b\s+(?:'[^=]{1,10}'|\d{1,10})\s*?[=<>])|exists\s(?:s(?:elect\S(?:if(?:null)?\s\(|concat|top)|ystem\s\()|\b(?i:having)\b\s+\d{1,10}|'[^=]{1,10}'|\sselect)|(?i:\bexecute\s{1,5}[\w\.$]{1,5}\s{0,3})|(?i:\bcreate\s+?table.{0,20}?\()|(?i:\blike\W*?char\W*?\()|(?i:select.*?case)|(?i:from.*?limit)|(?i:\bexecute\()|(?i:order\sby))#" , "#(?:\b(?:(?i:xor)\b\s+(?:'[^=]{1,10}'(?:\s*?[=<>])?|\d{1,10}(?:\s*?[=<>])?)|(?i:or)\b\s+(?:'[^=]{1,10}'(?:\s*?[=<>])?|\d{1,10}(?:\s*?[=<>])?))|(?i:\bor\b?[\'\][^=]{1,10}[\'\]?[=<>]+)|(?i:'\s+xor\s+.{1,20}[+\-!<>=])|(?i:'\s+or\s+.{1,20}[+\-!<>=])|(?i:\bor\b?\d{1,10}?[=<>]+))#" , "#(?i:\band\b(?:\s+(?:'[^=]{1,10}'(?:\s*?[=<>])?|\d{1,10}(?:\s*?[=<>])?)|?(?:[\'\][^=]{1,10}[\'\]|\d{1,10})?[=<>]+))#" , "#(?i:\b(?:c(?:o(?:n(?:v(?:ert(?:_tz)?)?|cat(?:_ws)?|nection_id)|(?:mpres)?s|ercibility|(?:un)?t|alesce)|ur(?:rent_(?:time(?:stamp)?|date|user)|(?:dat|tim)e)|h(?:ar(?:(?:acter)?_length|set)?|r)|iel(?:ing)?|ast|r32)|s(?:t(?:d(?:dev(?:_(?:sam|po)p)?)?|r(?:_to_date|cmp))|u(?:b(?:str(?:ing(?:_index)?)?|(?:dat|tim)e)|m)|e(?:c(?:_to_time|ond)|ssion_user)|ys(?:tem_user|date)|ha[12]?|oundex|chema|ig?n|leep|pace|qrt)|i(?:s(?:_(?:ipv(?:4(?:_(?:compat|mapped))?|6)|n(?:ot(?:_null)?|ull)|(?:free|used)_lock)|null)?|n(?:et(?:6_(?:aton|ntoa)|_(?:aton|ntoa))|s(?:ert|tr)|terval)?|f(?:null)?)|d(?:a(?:t(?:e(?:_(?:format|add|sub)|diff)?|abase)|y(?:of(?:month|week|year)|name)?)|e(?:(?:s_(?:de|en)cryp|faul)t|grees|code)|count|ump)|l(?:o(?:ca(?:l(?:timestamp)?|te)|g(?:10|2)?|ad_file|wer)|ast(?:_(?:insert_id|day))?|e(?:(?:as|f)t|ngth)|case|trim|pad|n)|u(?:n(?:compress(?:ed_length)?|ix_timestamp|hex)|tc_(?:time(?:stamp)?|date)|p(?:datexml|per)|uid(?:_short)?|case|ser)|r(?:a(?:wto(?:nhex(?:toraw)?|hex)|dians|nd)|e(?:p(?:lace|eat)|lease_lock|verse)|o(?:w_count|und)|ight|trim|pad)|t(?:ime(?:_(?:format|to_sec)|stamp(?:diff|add)?|diff)?|o_(?:(?:second|day)s|base64|n?char)|r(?:uncate|im)|an)|m(?:a(?:ke(?:_set|date)|ster_pos_wait|x)|i(?:(?:crosecon)?d|n(?:ute)?)|o(?:nth(?:name)?|d)|d5)|f(?:i(?:eld(?:_in_set)?|nd_in_set)|rom_(?:unixtime|base64|days)|o(?:und_rows|rmat)|loor)|p(?:o(?:w(?:er)?|sition)|eriod_(?:diff|add)|rocedure_analyse|assword|g_sleep|i)|a(?:s(?:cii(?:str)?|in)|es_(?:de|en)crypt|dd(?:dat|tim)e|(?:co|b)s|tan2?|vg)|b(?:i(?:t_(?:length|count|x?or|and)|n(?:_to_num)?)|enchmark)|e(?:x(?:tract(?:value)?|p(?:ort_set)?)|nc(?:rypt|ode)|lt)|g(?:r(?:oup_conca|eates)t|et_(?:format|lock))|v(?:a(?:r(?:_(?:sam|po)p|iance)|lues)|ersion)|o(?:(?:ld_passwo)?rd|ct(?:et_length)?)|we(?:ek(?:ofyear|day)?|ight_string)|n(?:o(?:t_in|w)|ame_const|ullif)|h(?:ex(?:toraw)?|our)|qu(?:arter|ote)|year(?:week)?|xmltype)\W*?\()#" , "#(?i:(?:xp_(?:reg(?:re(?:movemultistring|ad)|delete(?:value|key)|enum(?:value|key)s|addmultistring|write)|(?:servicecontro|cmdshel)l|e(?:xecresultset|numdsn)|ntsec(?:_enumdomains)?|terminate(?:_process)?|availablemedia|loginconfig|filelist|dirtree|makecab)|s(?:p_(?:(?:addextendedpro|sqlexe)c|p(?:assword|repare)|replwritetovarbin|is_srvrolemember|execute(?:sql)?|makewebtask|oacreate|help)|ql_(?:longvarchar|variant))|open(?:owa_util|rowset|query)|(?:n?varcha|tbcreato)r|autonomous_transaction|db(?:a_users|ms_java)|utl_(?:file|http)))#" , "#(?i:(?:\b(?:(?:s(?:elect\b.{1,100}?\b(?:(?:(?:length|count)\b.{1,100}?|.*?\bdump\b.*)\bfrom|to(?:p\b.{1,100}?\bfrom|_(?:numbe|cha)r)|(?:from\b.{1,100}?\bwher|data_typ)e|instr)|ys_context)|in(?:to\b\W*?\b(?:dump|out)file|sert\b\W*?\binto|ner\b\W*?\bjoin)|u(?:nion\b.{1,100}?\bselect|tl_inaddr)|group\b.*?\bby\b.{1,100}?\bhaving|d(?:elete\b\W*?\bfrom|bms_\w+\.)|load\b\W*?\bdata\b.*?\binfile)\b|print\b\W*?\@\@)|(?:;\W*?\b(?:shutdown|drop)|collation\W*?\(a|\@\@version)\b|'(?:s(?:qloledb|a)|msdasql|dbo)'))#" , "/((?:[~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>][^~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>]*?){12})/ " , "@(?:/\*!?|\*/|[';]--|--[\s\r\n\v\f]|--[^-]*?-|[^&-]#.*?[\s\r\n\v\f]|;?\\x00)@" , "#(?i:(?:\A|[^\d])0x[a-f\d]{3,})#" , " (?:`((?:[\w\s=_\-+{}()<@]){2,29}|(?:[A-Za-z0-9+\/]{4})+(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?)`)" );
5
+ $score['SQL'][2] = array( 3 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 3 , 5 , 5 , 5 );
6
+ $regex['SQL'][3] = array( "#(?i)\W+\d*?\s*?having\s*?[^\s\-]#" , "#[\'`][\s\d]*?[^\w\s]\W*?\d\W*?.*?[\'`\d]#" , "/((?:[~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>][^~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>]*?){8})/ " , "/((?:[~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>][^~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>]*?){6})/ " , " /(?:'((?:[\w\s=_\-+{}()<@]){2,29}|(?:[A-Za-z0-9+\/]{4})+(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?)')/ " );
7
+ $score['SQL'][3] = array( 5 , 5 , 3 , 3 , 3 , 5 );
8
+ $regex['SQL'][4] = array( "/((?:[~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>][^~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\'´’‘`<>]*?){3})/ " , " /((?:[~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\"'´’‘`<>][^~!@#\$%\^&\*\(\)\-\+=\{\}\[\]\|:;\"'´’‘`<>]*?){2})/" );
9
+ $score['SQL'][4] = array( 3 , 3 );
10
+
11
+ ?>
handler/signature/APXSS.php ADDED
@@ -0,0 +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
+ ?>
handler/spam.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ //add_filter( 'comment_form_submit_button', array($this, 'captcha_on_submit' ) );
12
+ }
13
+ }
14
+
15
+ /*function captcha_on_submit(){
16
+ echo '<input type="hidden" name="mocomment" />';
17
+ if(get_option('mo_wpns_enable_comment_recaptcha'))
18
+ {
19
+ echo '<script src="'.MoWpnsConstants::RECAPTCHA_URL.'"></script>';
20
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option('mo_wpns_recaptcha_site_key').'"></div> ';
21
+ }
22
+ echo '<input type="submit" value ="Post Comment">';
23
+
24
+ }*/
25
+ function comment_spam_check( $comment_data )
26
+ {
27
+ if(!is_user_logged_in()){
28
+ global $moWpnsUtility;
29
+ if( isset($_POST['mocomment']) && !empty($_POST['mocomment']))
30
+ wp_die( __( 'You are not authorised to perform this action.'));
31
+ else if(get_option('mo_wpns_enable_comment_recaptcha'))
32
+ {
33
+ if(is_wp_error($moWpnsUtility->verify_recaptcha($_POST['g-recaptcha-response'])))
34
+ wp_die( __( 'Invalid captcha. Please verify captcha again.'));
35
+ }
36
+ return $comment_data;
37
+ }
38
+ else{
39
+ return $comment_data;
40
+ }
41
+ }
42
+
43
+ function comment_spam_custom_field()
44
+ {
45
+ echo '<input type="hidden" name="mocomment" />';
46
+ if(get_option('mo_wpns_enable_comment_recaptcha'))
47
+ {
48
+ echo '<script src="'.MoWpnsConstants::RECAPTCHA_URL.'"></script>';
49
+ echo '<div class="g-recaptcha" data-sitekey="'.get_option('mo_wpns_recaptcha_site_key').'"></div>';
50
+ }
51
+ }
52
+ }
53
+ new Spam;
class-mo2f-constants.php → handler/two_fa_constants.php RENAMED
File without changes
class-miniorange-2-factor-login.php → handler/two_fa_login.php RENAMED
@@ -21,8 +21,7 @@
21
  * This library is miniOrange Authentication Service.
22
  * Contains Request Calls to Customer service.
23
  **/
24
- include_once dirname( __FILE__ ) . '/miniorange_2_factor_common_login.php';
25
-
26
 
27
  class Miniorange_Mobile_Login {
28
 
21
  * This library is miniOrange Authentication Service.
22
  * Contains Request Calls to Customer service.
23
  **/
24
+ include dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'mo2fa_common_login.php';
 
25
 
26
  class Miniorange_Mobile_Login {
27
 
class-miniorange-2-factor-pass2fa-login.php → handler/two_fa_pass2login.php RENAMED
@@ -21,9 +21,8 @@
21
  * This library is miniOrange Authentication Service.
22
  * Contains Request Calls to Customer service.
23
  **/
24
- include_once dirname( __FILE__ ) . '/miniorange_2_factor_common_login.php';
25
- include_once dirname( __FILE__ ) . '/api/class-rba-attributes.php';
26
 
 
27
  class Miniorange_Password_2Factor_Login {
28
 
29
  private $mo2f_kbaquestions;
@@ -32,6 +31,7 @@ class Miniorange_Password_2Factor_Login {
32
  private $mo2f_transactionid;
33
 
34
  public function miniorange_pass2login_redirect() {
 
35
  do_action('mo2f_network_init');
36
  global $Mo2fdbQueries;
37
 
@@ -201,6 +201,7 @@ class Miniorange_Password_2Factor_Login {
201
  $this->mo2f_pass2login_kba_verification( $user_id, $redirect_to,$session_id_encrypt );
202
  }
203
  }else if ( isset( $_POST['miniorange_kba_nonce'] ) ) { /*check kba validation*/
 
204
  $nonce = $_POST['miniorange_kba_nonce'];
205
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-kba-nonce' ) ) {
206
  $error = new WP_Error();
@@ -254,6 +255,7 @@ class Miniorange_Password_2Factor_Login {
254
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
255
  }
256
  }
 
257
  }else if ( isset( $_POST['miniorange_mobile_validation_nonce'] ) ) { /*check mobile validation */
258
  $nonce = $_POST['miniorange_mobile_validation_nonce'];
259
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
@@ -269,6 +271,7 @@ class Miniorange_Password_2Factor_Login {
269
  $checkMobileStatus = new Two_Factor_Setup();
270
  $content = $checkMobileStatus->check_mobile_status( $mo2f_login_transaction_id );
271
  $response = json_decode( $content, true );
 
272
  if ( json_last_error() == JSON_ERROR_NONE ) {
273
  if ( $response['status'] == 'SUCCESS' ) {
274
  if ( get_option( 'mo2f_remember_device' ) ) {
@@ -424,7 +427,9 @@ class Miniorange_Password_2Factor_Login {
424
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN' ) {
425
  $content = json_decode( $customer->validate_otp_token( 'SOFT TOKEN', $user_email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
426
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_GOOGLE_AUTHENTICATION' ) {
427
- $content = json_decode( $customer->validate_otp_token( 'GOOGLE AUTHENTICATOR', $user_email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
 
 
428
  } else {
429
  $this->remove_current_activity($session_id_encrypt);
430
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
@@ -601,6 +606,7 @@ class Miniorange_Password_2Factor_Login {
601
 
602
  return $error;
603
  }
 
604
  }
605
 
606
  function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt ) {
@@ -736,15 +742,15 @@ class Miniorange_Password_2Factor_Login {
736
  ?>
737
  <p><input type="hidden" id="miniorange_rba_attribures" name="miniorange_rba_attribures" value=""/></p>
738
  <?php
739
- wp_enqueue_script( 'jquery_script', plugins_url( 'includes/js/rba/js/jquery-1.9.1.js', __FILE__ ) );
740
- wp_enqueue_script( 'flash_script', plugins_url( 'includes/js/rba/js/jquery.flash.js', __FILE__ ) );
741
- wp_enqueue_script( 'uaparser_script', plugins_url( 'includes/js/rba/js/ua-parser.js', __FILE__ ) );
742
- wp_enqueue_script( 'client_script', plugins_url( 'includes/js/rba/js/client.js', __FILE__ ) );
743
- wp_enqueue_script( 'device_script', plugins_url( 'includes/js/rba/js/device_attributes.js', __FILE__ ) );
744
- wp_enqueue_script( 'swf_script', plugins_url( 'includes/js/rba/js/swfobject.js', __FILE__ ) );
745
- wp_enqueue_script( 'font_script', plugins_url( 'includes/js/rba/js/fontdetect.js', __FILE__ ) );
746
- wp_enqueue_script( 'murmur_script', plugins_url( 'includes/js/rba/js/murmurhash3.js', __FILE__ ) );
747
- wp_enqueue_script( 'miniorange_script', plugins_url( 'includes/js/rba/js/miniorange-fp.js', __FILE__ ) );
748
  }else{
749
 
750
 
@@ -810,37 +816,40 @@ class Miniorange_Password_2Factor_Login {
810
 
811
  }
812
 
813
- function mo2f_pass2login_push_oobemail_verification( $user, $mo2f_second_factor, $redirect_to, $session_id=null ) {
814
- global $Mo2fdbQueries;
815
- if(is_null($session_id)){
816
- $session_id=$this->create_session();
817
- }
818
- $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
819
- $challengeMobile = new Customer_Setup();
820
- $content = $challengeMobile->send_otp_token( $user_email, $mo2f_second_factor, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) );
821
- $response = json_decode( $content, true );
822
- if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
823
- if ( $response['status'] == 'SUCCESS' ) {
824
- MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
825
- $this->mo2f_transactionid=$response['txId'];
826
-
827
- $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'A Push Notification has been sent to your phone. We are waiting for your approval.' : 'An email has been sent to ' . MO2f_Utility::mo2f_get_hidden_email( $user_email ) . '. We are waiting for your approval.';
828
- $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
829
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id);
830
- } else if ( $response['status'] == 'ERROR' || $response['status'] == 'FAILED' ) {
831
- MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
832
- $this->mo2f_transactionid=$response['txId'];
833
- $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'An error occured while sending push notification to your app. You can click on <b>Phone is Offline</b> button to enter soft token from app or <b>Forgot your phone</b> button to receive OTP to your registered email.' : 'An error occured while sending email. Please try again.';
834
- $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
835
- $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
 
 
 
 
 
 
 
 
836
  }
837
- } else {
838
- $this->remove_current_activity($session_id);
839
- $error = new WP_Error();
840
- $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
841
 
842
- return $error;
843
- }
844
  }
845
 
846
  function mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to,$session_id=null ) {
@@ -1016,8 +1025,10 @@ class Miniorange_Password_2Factor_Login {
1016
  function mo2f_validate_soft_token($currentuser, $redirect_to = null, $mo2f_second_factor, $softtoken,$session_id_encrypt){
1017
  global $Mo2fdbQueries;
1018
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
1019
- $customer = new Customer_Setup();
1020
- $content = json_decode( $customer->validate_otp_token( $mo2f_second_factor, $email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
 
 
1021
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1022
  if ( get_option( 'mo2f_remember_device' ) ) {
1023
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
21
  * This library is miniOrange Authentication Service.
22
  * Contains Request Calls to Customer service.
23
  **/
 
 
24
 
25
+ include 'two_fa_login.php';
26
  class Miniorange_Password_2Factor_Login {
27
 
28
  private $mo2f_kbaquestions;
31
  private $mo2f_transactionid;
32
 
33
  public function miniorange_pass2login_redirect() {
34
+
35
  do_action('mo2f_network_init');
36
  global $Mo2fdbQueries;
37
 
201
  $this->mo2f_pass2login_kba_verification( $user_id, $redirect_to,$session_id_encrypt );
202
  }
203
  }else if ( isset( $_POST['miniorange_kba_nonce'] ) ) { /*check kba validation*/
204
+
205
  $nonce = $_POST['miniorange_kba_nonce'];
206
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-kba-nonce' ) ) {
207
  $error = new WP_Error();
255
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Please try again..' ) );
256
  }
257
  }
258
+
259
  }else if ( isset( $_POST['miniorange_mobile_validation_nonce'] ) ) { /*check mobile validation */
260
  $nonce = $_POST['miniorange_mobile_validation_nonce'];
261
  if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-mobile-validation-nonce' ) ) {
271
  $checkMobileStatus = new Two_Factor_Setup();
272
  $content = $checkMobileStatus->check_mobile_status( $mo2f_login_transaction_id );
273
  $response = json_decode( $content, true );
274
+
275
  if ( json_last_error() == JSON_ERROR_NONE ) {
276
  if ( $response['status'] == 'SUCCESS' ) {
277
  if ( get_option( 'mo2f_remember_device' ) ) {
427
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_SOFT_TOKEN' ) {
428
  $content = json_decode( $customer->validate_otp_token( 'SOFT TOKEN', $user_email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
429
  } else if ( isset( $mo2fa_login_status ) && $mo2fa_login_status == 'MO_2_FACTOR_CHALLENGE_GOOGLE_AUTHENTICATION' ) {
430
+
431
+ $content = json_decode( $customer->validate_otp_token( 'GOOGLE AUTHENTICATOR', $user_email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
432
+
433
  } else {
434
  $this->remove_current_activity($session_id_encrypt);
435
  return new WP_Error( 'invalid_username', __( '<strong>ERROR</strong>: Invalid Request. Please try again.' ) );
606
 
607
  return $error;
608
  }
609
+
610
  }
611
 
612
  function miniorange_pass2login_form_fields( $mo2fa_login_status = null, $mo2fa_login_message = null, $redirect_to = null, $qrCode = null, $session_id_encrypt ) {
742
  ?>
743
  <p><input type="hidden" id="miniorange_rba_attribures" name="miniorange_rba_attribures" value=""/></p>
744
  <?php
745
+ wp_enqueue_script( 'jquery_script', plugins_url( 'includes/js/rba/js/jquery-1.9.1.js', dirname(__FILE__) ) );
746
+ wp_enqueue_script( 'flash_script', plugins_url( 'includes/js/rba/js/jquery.flash.js', dirname(__FILE__) ) );
747
+ wp_enqueue_script( 'uaparser_script', plugins_url( 'includes/js/rba/js/ua-parser.js', dirname(__FILE__) ) );
748
+ wp_enqueue_script( 'client_script', plugins_url( 'includes/js/rba/js/client.js', dirname(__FILE__) ) );
749
+ wp_enqueue_script( 'device_script', plugins_url( 'includes/js/rba/js/device_attributes.js', dirname(__FILE__) ) );
750
+ wp_enqueue_script( 'swf_script', plugins_url( 'includes/js/rba/js/swfobject.js', dirname(__FILE__) ) );
751
+ wp_enqueue_script( 'font_script', plugins_url( 'includes/js/rba/js/fontdetect.js', dirname(__FILE__) ) );
752
+ wp_enqueue_script( 'murmur_script', plugins_url( 'includes/js/rba/js/murmurhash3.js', dirname(__FILE__) ) );
753
+ wp_enqueue_script( 'miniorange_script', plugins_url( 'includes/js/rba/js/miniorange-fp.js', dirname(__FILE__) ) );
754
  }else{
755
 
756
 
816
 
817
  }
818
 
819
+ function mo2f_pass2login_push_oobemail_verification( $current_user, $mo2f_second_factor, $redirect_to, $session_id=null ) {
820
+
821
+ global $Mo2fdbQueries;
822
+ if(is_null($session_id)){
823
+ $session_id=$this->create_session();
824
+ }
825
+ $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
826
+ $challengeMobile = new Customer_Setup();
827
+ $content = $challengeMobile->send_otp_token( $user_email, $mo2f_second_factor, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) );
828
+ $response = json_decode( $content, true );
829
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
830
+ if ( $response['status'] == 'SUCCESS' ) {
831
+ MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
832
+ $this->mo2f_transactionid=$response['txId'];
833
+
834
+ $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'A Push Notification has been sent to your phone. We are waiting for your approval.' : 'An email has been sent to ' . MO2f_Utility::mo2f_get_hidden_email( $user_email ) . '. We are waiting for your approval.';
835
+ $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
836
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to,null,$session_id);
837
+ } else if ( $response['status'] == 'ERROR' || $response['status'] == 'FAILED' ) {
838
+ MO2f_Utility::set_user_values( $session_id, "mo2f_transactionId", $response['txId'] );
839
+ $this->mo2f_transactionid=$response['txId'];
840
+ $mo2fa_login_message = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'An error occured while sending push notification to your app. You can click on <b>Phone is Offline</b> button to enter soft token from app or <b>Forgot your phone</b> button to receive OTP to your registered email.' : 'An error occured while sending email. Please try again.';
841
+ $mo2fa_login_status = $mo2f_second_factor == 'PUSH NOTIFICATIONS' ? 'MO_2_FACTOR_CHALLENGE_PUSH_NOTIFICATIONS' : 'MO_2_FACTOR_CHALLENGE_OOB_EMAIL';
842
+ $this->miniorange_pass2login_form_fields( $mo2fa_login_status, $mo2fa_login_message, $redirect_to, null,$session_id );
843
+ }
844
+ } else {
845
+ $this->remove_current_activity($session_id);
846
+ $error = new WP_Error();
847
+ $error->add( 'empty_username', __( '<strong>ERROR</strong>: An error occured while processing your request. Please Try again.' ) );
848
+
849
+ return $error;
850
  }
 
 
 
 
851
 
852
+
 
853
  }
854
 
855
  function mo2f_pass2login_otp_verification( $user, $mo2f_second_factor, $redirect_to,$session_id=null ) {
1025
  function mo2f_validate_soft_token($currentuser, $redirect_to = null, $mo2f_second_factor, $softtoken,$session_id_encrypt){
1026
  global $Mo2fdbQueries;
1027
  $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $currentuser->ID );
1028
+
1029
+ $customer = new Customer_Setup();
1030
+ $content = json_decode( $customer->validate_otp_token( $mo2f_second_factor, $email, null, $softtoken, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1031
+
1032
  if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1033
  if ( get_option( 'mo2f_remember_device' ) ) {
1034
  $mo2fa_login_status = 'MO_2_FACTOR_REMEMBER_TRUSTED_DEVICE';
handler/two_fa_settings.php ADDED
@@ -0,0 +1,2652 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ include 'two_fa_pass2login.php';
4
+ include dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'two_fa_setup_notification.php';
5
+ include 'class_miniorange_2fa_strong_password.php';
6
+ class Miniorange_Authentication {
7
+
8
+ private $defaultCustomerKey = "16555";
9
+ private $defaultApiKey = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
10
+
11
+ function __construct() {
12
+ // add_action( 'admin_notices', array( $this, 'get_customer_SMS_transactions' ) );
13
+ // add_action( 'admin_notices', array( $this, 'prompt_user_to_setup_two_factor' ) );
14
+ add_action( 'admin_init', array( $this, 'miniorange_auth_save_settings' ) );
15
+ add_action( 'plugins_loaded', array( $this, 'mo2f_update_db_check' ) );
16
+ global $wp_roles;
17
+ if ( ! isset( $wp_roles ) ) {
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();
25
+ add_action( 'init', array( $pass2fa_login, 'miniorange_pass2login_redirect' ) );
26
+ //for shortcode addon
27
+ $mo2f_ns_config = new MoWpnsUtility();
28
+
29
+ //strong password file
30
+ $mo2f_strong_password = new class_miniorange_2fa_strong_password();
31
+
32
+ if($mo2f_ns_config->hasLoginCookie())
33
+ {
34
+ add_action('user_profile_update_errors', array( $mo2f_strong_password, 'validatePassword'), 0, 3 );
35
+ add_action( 'woocommerce_save_account_details_errors', array( $mo2f_strong_password, 'woocommerce_password_edit_account' ),1,2 );
36
+ }
37
+ add_filter( 'woocommerce_process_registration_errors', array($mo2f_strong_password,'woocommerce_password_protection'),1,4);
38
+ add_filter( 'woocommerce_registration_errors', array($mo2f_strong_password,'woocommerce_password_registration_protection'),1,3);
39
+
40
+ add_filter( 'mo2f_shortcode_rba_gauth', array( $mo2f_rba_attributes, 'mo2f_validate_google_auth' ), 10, 3 );
41
+ add_filter( 'mo2f_shortcode_kba', array( $mo2f_2factor_setup, 'register_kba_details' ), 10, 7 );
42
+ add_filter( 'mo2f_update_info', array( $mo2f_2factor_setup, 'mo2f_update_userinfo' ), 10, 5 );
43
+ add_action( 'mo2f_shortcode_form_fields', array(
44
+ $pass2fa_login,
45
+ 'miniorange_pass2login_form_fields'
46
+ ), 10, 5 );
47
+ add_filter( 'mo2f_gauth_service', array( $mo2f_rba_attributes, 'mo2f_google_auth_service' ), 10, 1 );
48
+
49
+
50
+ if ( get_option( 'mo2f_login_option' ) ) { //password + 2nd factor enabled
51
+ if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' ) {
52
+
53
+ remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 );
54
+ add_filter( 'authenticate', array( $pass2fa_login, 'mo2f_check_username_password' ), 99999, 4 );
55
+ add_action( 'init', array( $pass2fa_login, 'miniorange_pass2login_redirect' ) );
56
+ add_action( 'login_form', array(
57
+ $pass2fa_login,
58
+ 'mo_2_factor_pass2login_show_wp_login_form'
59
+ ), 10 );
60
+
61
+ if ( get_option( 'mo2f_remember_device' ) ) {
62
+ add_action( 'login_footer', array( $pass2fa_login, 'miniorange_pass2login_footer_form' ) );
63
+ add_action( 'woocommerce_before_customer_login_form', array(
64
+ $pass2fa_login,
65
+ 'miniorange_pass2login_footer_form'
66
+ ) );
67
+ }
68
+ add_action( 'login_enqueue_scripts', array(
69
+ $pass2fa_login,
70
+ 'mo_2_factor_enable_jquery_default_login'
71
+ ) );
72
+
73
+ add_action( 'woocommerce_login_form_end', array(
74
+ $pass2fa_login,
75
+ 'mo_2_factor_pass2login_show_wp_login_form'
76
+ ) );
77
+ add_action( 'wp_enqueue_scripts', array(
78
+ $pass2fa_login,
79
+ 'mo_2_factor_enable_jquery_default_login'
80
+ ) );
81
+
82
+ //Actions for other plugins to use miniOrange 2FA plugin
83
+ add_action( 'miniorange_pre_authenticate_user_login', array(
84
+ $pass2fa_login,
85
+ 'mo2f_check_username_password'
86
+ ), 1, 4 );
87
+ add_action( 'miniorange_post_authenticate_user_login', array(
88
+ $pass2fa_login,
89
+ 'miniorange_initiate_2nd_factor'
90
+ ), 1, 3 );
91
+ add_action( 'miniorange_collect_attributes_for_authenticated_user', array(
92
+ $pass2fa_login,
93
+ 'mo2f_collect_device_attributes_for_authenticated_user'
94
+ ), 1, 2 );
95
+
96
+ }
97
+
98
+ } else { //login with phone enabled
99
+
100
+ if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' ) {
101
+
102
+ $mobile_login = new Miniorange_Mobile_Login();
103
+ add_action( 'login_form', array( $mobile_login, 'miniorange_login_form_fields' ), 10 );
104
+ add_action( 'login_footer', array( $mobile_login, 'miniorange_login_footer_form' ) );
105
+
106
+ remove_filter( 'authenticate', 'wp_authenticate_username_password', 20 );
107
+ add_filter( 'authenticate', array( $mobile_login, 'mo2fa_default_login' ), 99999, 3 );
108
+ add_action( 'login_enqueue_scripts', array( $mobile_login, 'custom_login_enqueue_scripts' ) );
109
+ }
110
+ }
111
+ }
112
+ }
113
+
114
+ function define_global() {
115
+ global $Mo2fdbQueries;
116
+ $Mo2fdbQueries = new Mo2fDB();
117
+ }
118
+
119
+ function mo2f_update_db_check() {
120
+ if(get_option('mo2f_network_features',"not_exits")=="not_exits"){
121
+ do_action('mo2f_network_create_db');
122
+ update_option('mo2f_network_features',1);
123
+ }
124
+ if(get_option('mo2f_encryption_key',"not_exits")=="not_exits"){
125
+ $get_encryption_key = MO2f_Utility::random_str(16);
126
+ update_option('mo2f_encryption_key',$get_encryption_key);
127
+
128
+ }
129
+ global $Mo2fdbQueries;
130
+ $user_id = get_option( 'mo2f_miniorange_admin' );
131
+ $current_db_version = get_option( 'mo2f_dbversion' );
132
+
133
+ if ( $current_db_version < 143 ) {
134
+ update_option( 'mo2f_dbversion', 143 );
135
+ $Mo2fdbQueries->generate_tables();
136
+
137
+ }
138
+ if ( ! get_option( 'mo2f_existing_user_values_updated' ) ) {
139
+
140
+ if ( get_option( 'mo2f_customerKey' ) && ! get_option( 'mo2f_is_NC' ) ) {
141
+ update_option( 'mo2f_is_NC', 0 );
142
+ }
143
+
144
+ $check_if_user_column_exists = false;
145
+
146
+ if ( $user_id && ! get_option( 'mo2f_is_NC' ) ) {
147
+ $does_table_exist = $Mo2fdbQueries->check_if_table_exists();
148
+ if ( $does_table_exist ) {
149
+ $check_if_user_column_exists = $Mo2fdbQueries->check_if_user_column_exists( $user_id );
150
+ }
151
+ if ( ! $check_if_user_column_exists ) {
152
+ $Mo2fdbQueries->generate_tables();
153
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
154
+
155
+ add_option( 'mo2f_phone', get_option( 'user_phone' ) );
156
+ add_option( 'mo2f_enable_login_with_2nd_factor', get_option( 'mo2f_show_loginwith_phone' ) );
157
+ add_option( 'mo2f_remember_device', get_option( 'mo2f_deviceid_enabled' ) );
158
+ add_option( 'mo2f_transactionId', get_option( 'mo2f-login-transactionId' ) );
159
+ add_option( 'mo2f_is_NC', 0 );
160
+ $phone = get_user_meta( $user_id, 'mo2f_user_phone', true );
161
+ $user_phone = $phone ? $phone : get_user_meta( $user_id, 'mo2f_phone', true );
162
+
163
+ $Mo2fdbQueries->update_user_details( $user_id,
164
+ array(
165
+ 'mo2f_GoogleAuthenticator_config_status' => get_user_meta( $user_id, 'mo2f_google_authentication_status', true ),
166
+ 'mo2f_SecurityQuestions_config_status' => get_user_meta( $user_id, 'mo2f_kba_registration_status', true ),
167
+ 'mo2f_EmailVerification_config_status' => true,
168
+ 'mo2f_AuthyAuthenticator_config_status' => get_user_meta( $user_id, 'mo2f_authy_authentication_status', true ),
169
+ 'mo2f_user_email' => get_user_meta( $user_id, 'mo_2factor_map_id_with_email', true ),
170
+ 'mo2f_user_phone' => $user_phone,
171
+ 'user_registration_with_miniorange' => get_user_meta( $user_id, 'mo_2factor_user_registration_with_miniorange', true ),
172
+ 'mobile_registration_status' => get_user_meta( $user_id, 'mo2f_mobile_registration_status', true ),
173
+ 'mo2f_configured_2FA_method' => get_user_meta( $user_id, 'mo2f_selected_2factor_method', true ),
174
+ 'mo_2factor_user_registration_status' => get_user_meta( $user_id, 'mo_2factor_user_registration_status', true )
175
+ ) );
176
+
177
+ if ( get_user_meta( $user_id, 'mo2f_mobile_registration_status', true ) ) {
178
+ $Mo2fdbQueries->update_user_details( $user_id,
179
+ array(
180
+ 'mo2f_miniOrangeSoftToken_config_status' => true,
181
+ 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
182
+ 'mo2f_miniOrangePushNotification_config_status' => true
183
+ ) );
184
+ }
185
+
186
+ if ( get_user_meta( $user_id, 'mo2f_otp_registration_status', true ) ) {
187
+ $Mo2fdbQueries->update_user_details( $user_id,
188
+ array(
189
+ 'mo2f_OTPOverSMS_config_status' => true
190
+ ) );
191
+ }
192
+
193
+ $mo2f_external_app_type = get_user_meta( $user_id, 'mo2f_external_app_type', true ) == 'AUTHY 2-FACTOR AUTHENTICATION' ?
194
+ 'Authy Authenticator' : 'Google Authenticator';
195
+
196
+ update_user_meta( $user_id, 'mo2f_external_app_type', $mo2f_external_app_type );
197
+
198
+ delete_option( 'mo2f_show_loginwith_phone' );
199
+ delete_option( 'mo2f_deviceid_enabled' );
200
+ delete_option( 'mo2f-login-transactionId' );
201
+ delete_user_meta( $user_id, 'mo2f_google_authentication_status' );
202
+ delete_user_meta( $user_id, 'mo2f_kba_registration_status' );
203
+ delete_user_meta( $user_id, 'mo2f_email_verification_status' );
204
+ delete_user_meta( $user_id, 'mo2f_authy_authentication_status' );
205
+ delete_user_meta( $user_id, 'mo_2factor_map_id_with_email' );
206
+ delete_user_meta( $user_id, 'mo_2factor_user_registration_with_miniorange' );
207
+ delete_user_meta( $user_id, 'mo2f_mobile_registration_status' );
208
+ delete_user_meta( $user_id, 'mo2f_otp_registration_status' );
209
+ delete_user_meta( $user_id, 'mo2f_selected_2factor_method' );
210
+ delete_user_meta( $user_id, 'mo2f_configure_test_option' );
211
+ delete_user_meta( $user_id, 'mo_2factor_user_registration_status' );
212
+
213
+ update_option( 'mo2f_existing_user_values_updated', 1 );
214
+
215
+ }
216
+ }
217
+ }
218
+
219
+ if ( $user_id && ! get_option( 'mo2f_login_option_updated' ) ) {
220
+
221
+ $does_table_exist = $Mo2fdbQueries->check_if_table_exists();
222
+ if ( $does_table_exist ) {
223
+ $check_if_user_column_exists = $Mo2fdbQueries->check_if_user_column_exists( $user_id );
224
+ if ( $check_if_user_column_exists ) {
225
+ $selected_2FA_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user_id );
226
+
227
+ if ( in_array( $selected_2FA_method, array(
228
+ "Google Authenticator",
229
+ "miniOrange Soft Token",
230
+ "Authy Authenticator"
231
+ ) ) ) {
232
+ update_option( 'mo2f_enable_2fa_prompt_on_login_page', 1 );
233
+ }
234
+ update_option( 'mo2f_login_option_updated', 1 );
235
+ }
236
+ }
237
+
238
+ }
239
+
240
+
241
+ }
242
+
243
+
244
+ /**
245
+ * Function tells where to look for translations.
246
+ */
247
+ function mo2fa_load_textdomain() {
248
+ load_plugin_textdomain( 'miniorange-2-factor-authentication', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
249
+ }
250
+
251
+ function feedback_request() {
252
+ display_feedback_form();
253
+ }
254
+
255
+ function get_customer_SMS_transactions() {
256
+
257
+ if ( get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' && get_option( 'mo2f_show_sms_transaction_message' ) ) {
258
+ if ( ! get_option( 'mo2f_set_transactions' ) ) {
259
+ $customer = new Customer_Setup();
260
+
261
+ $content = json_decode( $customer->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
262
+
263
+ update_option( 'mo2f_set_transactions', 1 );
264
+ if ( ! array_key_exists( 'smsRemaining', $content ) ) {
265
+ $smsRemaining = 0;
266
+ } else {
267
+ $smsRemaining = $content['smsRemaining'];
268
+
269
+ if ( $smsRemaining == null ) {
270
+ $smsRemaining = 0;
271
+ }
272
+ }
273
+ update_option( 'mo2f_number_of_transactions', $smsRemaining );
274
+ } else {
275
+ $smsRemaining = get_option( 'mo2f_number_of_transactions' );
276
+ }
277
+
278
+ $this->display_customer_transactions( $smsRemaining );
279
+ }
280
+ }
281
+
282
+ function display_customer_transactions( $content ) {
283
+ echo '<div class="is-dismissible notice notice-warning"> <form name="f" method="post" action=""><input type="hidden" name="option" value="mo_auth_sync_sms_transactions" /><p><b>' . mo2f_lt( 'miniOrange 2-Factor Plugin:' ) . '</b> ' . mo2f_lt( 'You have' ) . ' <b style="color:red">' . $content . ' ' . mo2f_lt( 'SMS transactions' ) . ' </b>' . mo2f_lt( 'remaining' ) . '<input type="submit" name="submit" value="' . mo2f_lt( 'Check Transactions' ) . ' " class="button button-primary button-large" /></form><button type="button" class="notice-dismiss"><span class="screen-reader-text">' . mo2f_lt( 'Dismiss this notice.' ) . '</span></button></div>';
284
+ }
285
+
286
+ function prompt_user_to_setup_two_factor() {
287
+ global $Mo2fdbQueries;
288
+ $user = wp_get_current_user();
289
+ $selected_2_Factor_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
290
+ if ( $selected_2_Factor_method == 'NONE' ) {
291
+ if ( get_option( 'mo2f_enable_2fa_for_users' ) || ( current_user_can( 'manage_options' ) && get_option( 'mo2f_miniorange_admin' ) == $user->ID ) ) {
292
+ 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.' ) .
293
+ '<a href="admin.php?page=miniOrange_2_factor_settings&amp;mo2f_tab=mobile_configure">' . mo2f_lt( ' Click here' ) . '</a>' . mo2f_lt( ' to set it up.' ) .
294
+ '<button type="button" class="notice-dismiss"><span class="screen-reader-text">' . mo2f_lt( 'Dismiss this notice.' ) . '</span></button></div>';
295
+ }
296
+ }
297
+ }
298
+
299
+
300
+ function mo_auth_success_message() {
301
+ $message = get_option( 'mo2f_message' ); ?>
302
+ <script>
303
+ jQuery(document).ready(function () {
304
+ var message = "<?php echo $message; ?>";
305
+ jQuery('#messages').append("<div style='padding:5px;'><div class='error notice is-dismissible mo2f_error_container' style='position: fixed;left: 60.4%;top: 6%;width: 37%;z-index: 99999;background-color: bisque;font-weight: bold;'> <p class='mo2f_msgs'>" + message + "</p></div></div>");
306
+ });
307
+ </script>
308
+ <?php
309
+ }
310
+
311
+ function mo_auth_error_message() {
312
+ $message = get_option( 'mo2f_message' ); ?>
313
+
314
+ <script>
315
+ jQuery(document).ready(function () {
316
+ var message = "<?php echo $message; ?>";
317
+ jQuery('#messages').append("<div style='padding:5px;'><div class='updated notice is-dismissible mo2f_success_container' style='position: fixed;left: 60.4%;top: 6%;width: 37%;z-index: 9999;background-color: #bcffb4;font-weight: bold;'> <p class='mo2f_msgs'>" + message + "</p></div></div>");
318
+ });
319
+ </script>
320
+ <?php
321
+
322
+ }
323
+
324
+ function miniorange_auth_menu() {
325
+ global $user;
326
+ $user = wp_get_current_user();
327
+
328
+
329
+ $roles = $user->roles;
330
+ $miniorange_role = array_shift( $roles );
331
+
332
+ $is_plugin_activated = get_option( 'mo2f_activate_plugin' );
333
+ $is_customer_admin = get_option( 'mo2f_miniorange_admin' ) == $user->ID ? true : false;
334
+ $is_2fa_enabled_for_users = get_option( 'mo2f_enable_2fa_for_users' );
335
+ $can_current_user_manage_options = current_user_can( 'manage_options' );
336
+ $admin_registration_status = get_option( 'mo_2factor_admin_registration_status' ) == 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS'
337
+ ? true : false;
338
+
339
+
340
+
341
+ if ( $admin_registration_status ) {
342
+ if ( $can_current_user_manage_options && $is_customer_admin ) {
343
+ $mo2fa_hook_page = $this->hookpages();
344
+ }
345
+ } else if ( $can_current_user_manage_options ) {
346
+ $mo2fa_hook_page = $this->hookpages();
347
+ }
348
+
349
+
350
+ }
351
+
352
+ function hookpages() {
353
+ if(get_site_option('mo2f_enable_custom_icon')!=1)
354
+ $iconurl = plugin_dir_url(__FILE__) . 'includes/images/miniorange_icon.png';
355
+ else
356
+ $iconurl = site_url(). '/wp-content/uploads/miniorange/plugin_icon.png';
357
+ $menu_slug = 'miniOrange_2_factor_settings';
358
+
359
+ add_menu_page( 'miniOrange 2 Factor Auth', get_option('mo2f_custom_plugin_name'), 'manage_options', $menu_slug, array($this,'mo_auth_login_options'), $iconurl );
360
+
361
+ }
362
+
363
+ function mo_auth_login_options() {
364
+ global $user;
365
+ $user = wp_get_current_user();
366
+ update_option( 'mo2f_host_name', 'https://login.xecurify.com' );
367
+ mo_2_factor_register( $user );
368
+ }
369
+
370
+ function mo_2_factor_enable_frontend_style() {
371
+ wp_enqueue_style( 'mo2f_frontend_login_style', plugins_url( 'includes/css/front_end_login.css?version='.MO2F_VERSION.'', __FILE__ ) );
372
+ wp_enqueue_style( 'bootstrap_style', plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', __FILE__ ) );
373
+ wp_enqueue_style( 'mo_2_factor_admin_settings_phone_style', plugins_url( 'includes/css/phone.css?version='.MO2F_VERSION.'', __FILE__ ) );
374
+ wp_enqueue_style( 'mo_2_factor_wpb-fa', plugins_url( 'includes/css/font-awesome.min.css', __FILE__ ) );
375
+ wp_enqueue_style( 'mo2f_login_popup_style', plugins_url( "includes/css/mo2f_login_popup_ui.css?version=".MO2F_VERSION."", __FILE__ ) );
376
+ }
377
+
378
+ function plugin_settings_style( $mo2fa_hook_page ) {
379
+ if ( 'toplevel_page_miniOrange_2_factor_settings' != $mo2fa_hook_page ) {
380
+ return;
381
+ }
382
+ wp_enqueue_style( 'mo_2_factor_admin_settings_style', plugins_url( 'includes/css/style_settings.css?version='.MO2F_VERSION.'', __FILE__ ) );
383
+ wp_enqueue_style( 'mo_2_factor_admin_settings_phone_style', plugins_url( 'includes/css/phone.css?version='.MO2F_VERSION.'', __FILE__ ) );
384
+ wp_enqueue_style( 'bootstrap_style', plugins_url( 'includes/css/bootstrap.min.css?version='.MO2F_VERSION.'', __FILE__ ) );
385
+ wp_enqueue_style( 'bootstrap_style_ass', plugins_url( 'includes/css/bootstrap-tour-standalone.css?version='.MO2F_VERSION.'', __FILE__ ) );
386
+ wp_enqueue_style( 'mo_2_factor_wpb-fa', plugins_url( 'includes/css/font-awesome.min.css', __FILE__ ) );
387
+ wp_enqueue_style( 'mo2f_ns_admin_settings_datatable_style', plugins_url('includes/css/jquery.dataTables.min.css', __FILE__));
388
+ }
389
+
390
+ function plugin_settings_script( $mo2fa_hook_page ) {
391
+ if ( 'toplevel_page_miniOrange_2_factor_settings' != $mo2fa_hook_page ) {
392
+ return;
393
+ }
394
+ wp_enqueue_script( 'jquery' );
395
+ wp_enqueue_script( 'mo_2_factor_admin_settings_phone_script', plugins_url( 'includes/js/phone.js', __FILE__ ) );
396
+ wp_enqueue_script( 'bootstrap_script', plugins_url( 'includes/js/bootstrap.min.js', __FILE__ ) );
397
+ wp_enqueue_script( 'bootstrap_script_hehe', plugins_url( 'includes/js/bootstrap-tour-standalone.min.js', __FILE__ ) );
398
+ wp_enqueue_script( 'mo2f_ns_admin_datatable_script', plugins_url('includes/js/jquery.dataTables.min.js', __FILE__ ), array('jquery'));
399
+
400
+ }
401
+
402
+ function miniorange_auth_save_settings() {
403
+ if ( array_key_exists( 'page', $_REQUEST ) && $_REQUEST['page'] == 'two_fa' ) {
404
+ if ( ! session_id() || session_id() == '' || ! isset( $_SESSION ) ) {
405
+ session_start();
406
+ }
407
+ }
408
+
409
+ global $user;
410
+ global $Mo2fdbQueries;
411
+ $defaultCustomerKey = $this->defaultCustomerKey;
412
+ $defaultApiKey = $this->defaultApiKey;
413
+
414
+ $user = wp_get_current_user();
415
+ $user_id = $user->ID;
416
+
417
+ if ( current_user_can( 'manage_options' ) ) {
418
+
419
+ if(strlen(get_option('mo2f_encryption_key'))>17){
420
+ $get_encryption_key = MO2f_Utility::random_str(16);
421
+ update_option('mo2f_encryption_key',$get_encryption_key);
422
+ }
423
+
424
+ if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_deactivate_account" ) {
425
+ $nonce = $_POST['mo_auth_deactivate_account_nonce'];
426
+ if ( ! wp_verify_nonce( $nonce, 'mo-auth-deactivate-account-nonce' ) ) {
427
+ $error = new WP_Error();
428
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
429
+
430
+ return $error;
431
+ } else {
432
+ $url = admin_url( 'plugins.php' );
433
+ wp_redirect( $url );
434
+ }
435
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_remove_account" ) {
436
+ $nonce = $_POST['mo_auth_remove_account_nonce'];
437
+ if ( ! wp_verify_nonce( $nonce, 'mo-auth-remove-account-nonce' ) ) {
438
+ $error = new WP_Error();
439
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
440
+ return $error;
441
+ } else {
442
+ update_option( 'mo2f_register_with_another_email', 1 );
443
+ $this->mo_auth_deactivate();
444
+ }
445
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo2f_save_proxy_settings" ) {
446
+ $nonce = $_POST['mo2f_save_proxy_settings_nonce'];
447
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-save-proxy-settings-nonce' ) ) {
448
+ $error = new WP_Error();
449
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
450
+ return $error;
451
+ } else {
452
+ $proxyHost = $_POST['proxyHost'];
453
+ $portNumber = $_POST['portNumber'];
454
+ $proxyUsername = $_POST['proxyUsername'];
455
+ $proxyPassword = $_POST['proxyPass'];
456
+
457
+ update_option( 'mo2f_proxy_host', $proxyHost );
458
+ update_option( 'mo2f_port_number', $portNumber );
459
+ update_option( 'mo2f_proxy_username', $proxyUsername );
460
+ update_option( 'mo2f_proxy_password', $proxyPassword );
461
+ update_option( 'mo2f_message', 'Proxy settings saved successfully.' );
462
+ $this->mo_auth_show_success_message();
463
+ }
464
+
465
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_register_customer" ) { //register the admin to miniOrange
466
+ //miniorange_register_customer_nonce
467
+ $nonce = $_POST['miniorange_register_customer_nonce'];
468
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-register-customer-nonce' ) ) {
469
+ $error = new WP_Error();
470
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
471
+
472
+ return $error;
473
+ } else {
474
+ //validate and sanitize
475
+ $email = '';
476
+ $password = '';
477
+ $confirmPassword = '';
478
+ $is_registration = get_user_meta( $user->ID, 'mo2f_email_otp_count', true );
479
+
480
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['email'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['password'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['confirmPassword'] ) ) {
481
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
482
+
483
+ return;
484
+ } else if ( strlen( $_POST['password'] ) < 6 || strlen( $_POST['confirmPassword'] ) < 6 ) {
485
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "MIN_PASS_LENGTH" ) );
486
+
487
+ } else {
488
+ $email = sanitize_email( $_POST['email'] );
489
+ $password = sanitize_text_field( $_POST['password'] );
490
+ $confirmPassword = sanitize_text_field( $_POST['confirmPassword'] );
491
+
492
+ $email = strtolower( $email );
493
+
494
+ $pattern = '/^[(\w)*(\!\@\#\$\%\^\&\*\.\-\_)*]+$/';
495
+
496
+ if(preg_match($pattern,$password)){
497
+ if ( strcmp( $password, $confirmPassword ) == 0 ) {
498
+ update_option( 'mo2f_email', $email );
499
+
500
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
501
+ update_option( 'mo2f_password', stripslashes( $password ) );
502
+ $customer = new Customer_Setup();
503
+ $customerKey = json_decode( $customer->check_customer(), true );
504
+
505
+ if ( strcasecmp( $customerKey['status'], 'CUSTOMER_NOT_FOUND' ) == 0 ) {
506
+ if ( $customerKey['status'] == 'ERROR' ) {
507
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $customerKey['message'] ) );
508
+ } else {
509
+ $this->mo2f_create_customer( $user );
510
+ delete_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account' );
511
+ delete_user_meta( $user->ID, 'register_account_popup' );
512
+ if(get_user_meta( $user->ID, 'mo2f_2FA_method_to_configure'))
513
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
514
+
515
+ }
516
+ } else { //customer already exists, redirect him to login page
517
+
518
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_ALREADY_EXISTS" ) );
519
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
520
+
521
+ }
522
+
523
+ } else {
524
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "PASSWORDS_MISMATCH" ) );
525
+ $this->mo_auth_show_error_message();
526
+ }
527
+ }
528
+ else{
529
+ update_option( 'mo2f_message', "Password length between 6 - 15 characters. Only following symbols (!@#.$%^&*-_) should be present." );
530
+ $this->mo_auth_show_error_message();
531
+ }
532
+ }
533
+ }
534
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo2f_goto_verifycustomer" ) {
535
+ $nonce = $_POST['mo2f_goto_verifycustomer_nonce'];
536
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-goto-verifycustomer-nonce' ) ) {
537
+ $error = new WP_Error();
538
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
539
+ return $error;
540
+ } else {
541
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
542
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_YOUR_EMAIL_PASSWORD" ) );
543
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_VERIFY_CUSTOMER' ) );
544
+ }
545
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_2factor_gobackto_registration_page' ) { //back to registration page for admin
546
+ $nonce = $_POST['mo_2factor_gobackto_registration_page_nonce'];
547
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-gobackto-registration-page-nonce' ) ) {
548
+ $error = new WP_Error();
549
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
550
+ return $error;
551
+ } else {
552
+ delete_option( 'mo2f_email' );
553
+ delete_option( 'mo2f_password' );
554
+ update_option( 'mo2f_message', "" );
555
+
556
+ MO2f_Utility::unset_session_variables( 'mo2f_transactionId' );
557
+ delete_option( 'mo2f_transactionId' );
558
+ delete_user_meta( $user->ID, 'mo2f_sms_otp_count' );
559
+ delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
560
+ delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
561
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'REGISTRATION_STARTED' ) );
562
+ }
563
+
564
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_registration_closed' ) {
565
+ $nonce = $_POST['mo2f_registration_closed_nonce'];
566
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-registration-closed-nonce' ) ) {
567
+ $error = new WP_Error();
568
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
569
+ return $error;
570
+ } else {
571
+ //$Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => '' ) );
572
+ delete_user_meta( $user->ID, 'register_account_popup' );
573
+ }
574
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_verify_customer" ) { //register the admin to miniOrange if already exist
575
+
576
+ $nonce = $_POST['miniorange_verify_customer_nonce'];
577
+
578
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-verify-customer-nonce' ) ) {
579
+ $error = new WP_Error();
580
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
581
+
582
+ return $error;
583
+ } else {
584
+
585
+ //validation and sanitization
586
+ $email = '';
587
+ $password = '';
588
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
589
+
590
+
591
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['email'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['password'] ) ) {
592
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
593
+ $this->mo_auth_show_error_message();
594
+
595
+ return;
596
+ } else {
597
+ $email = sanitize_email( $_POST['email'] );
598
+ $password = sanitize_text_field( $_POST['password'] );
599
+ }
600
+
601
+ update_option( 'mo2f_email', $email );
602
+ update_option( 'mo2f_password', stripslashes( $password ) );
603
+ $customer = new Customer_Setup();
604
+ $content = $customer->get_customer_key();
605
+ $customerKey = json_decode( $content, true );
606
+
607
+ if ( json_last_error() == JSON_ERROR_NONE ) {
608
+ if ( is_array( $customerKey ) && array_key_exists( "status", $customerKey ) && $customerKey['status'] == 'ERROR' ) {
609
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate( $customerKey['message'] ) );
610
+ $this->mo_auth_show_error_message();
611
+ } else if ( is_array( $customerKey ) ) {
612
+ if ( isset( $customerKey['id'] ) && ! empty( $customerKey['id'] ) ) {
613
+ update_option( 'mo2f_customerKey', $customerKey['id'] );
614
+ update_option( 'mo2f_api_key', $customerKey['apiKey'] );
615
+ update_option( 'mo2f_customer_token', $customerKey['token'] );
616
+ update_option( 'mo2f_app_secret', $customerKey['appSecret'] );
617
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_user_phone' => $customerKey['phone'] ) );
618
+ update_option( 'mo2f_miniorange_admin', $user->ID );
619
+
620
+ $mo2f_emailVerification_config_status = get_option( 'mo2f_is_NC' ) == 0 ? true : false;
621
+
622
+ delete_option( 'mo2f_password' );
623
+ update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
624
+
625
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
626
+ 'mo2f_EmailVerification_config_status' => $mo2f_emailVerification_config_status,
627
+ 'mo2f_user_email' => get_option( 'mo2f_email' ),
628
+ 'user_registration_with_miniorange' => 'SUCCESS',
629
+ 'mo2f_2factor_enable_2fa_byusers' => 1,
630
+ ) );
631
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_PLUGIN_SETTINGS';
632
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
633
+ $configured_2FA_method = 'NONE';
634
+ $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
635
+ $enduser = new Two_Factor_Setup();
636
+ $userinfo = json_decode( $enduser->mo2f_get_userinfo( $user_email ), true );
637
+
638
+ $mo2f_second_factor = 'NONE';
639
+ if ( json_last_error() == JSON_ERROR_NONE ) {
640
+ if ( $userinfo['status'] == 'SUCCESS' ) {
641
+ $mo2f_second_factor = mo2f_update_and_sync_user_two_factor( $user->ID, $userinfo );
642
+
643
+ }
644
+ }
645
+ if ( $mo2f_second_factor != 'NONE' ) {
646
+ $configured_2FA_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_second_factor, "servertowpdb" );
647
+
648
+ if ( get_option( 'mo2f_is_NC' ) == 0 ) {
649
+
650
+ $auth_method_abr = str_replace( ' ', '', $configured_2FA_method );
651
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
652
+ 'mo2f_configured_2FA_method' => $configured_2FA_method,
653
+ 'mo2f_' . $auth_method_abr . '_config_status' => true
654
+ ) );
655
+
656
+ } else {
657
+ if ( in_array( $configured_2FA_method, array(
658
+ 'Email Verification',
659
+ 'Authy Authenticator',
660
+ 'OTP over SMS'
661
+ ) ) ) {
662
+ $enduser->mo2f_update_userinfo( $user_email, 'NONE', null, '', true );
663
+ }
664
+ }
665
+
666
+
667
+ }
668
+
669
+ $mo2f_message = Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" );
670
+ if ( $configured_2FA_method != 'NONE' && get_option( 'mo2f_is_NC' ) == 0 ) {
671
+ $mo2f_message .= ' <b>' . $configured_2FA_method . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . '.';
672
+ }
673
+ $mo2f_message .= ' ' . '<a href=\"admin.php?page=miniOrange_2_factor_settings&amp;mo2f_tab=mobile_configure\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" );
674
+
675
+ delete_user_meta( $user->ID, 'register_account_popup' );
676
+
677
+ $mo2f_customer_selected_plan = get_option( 'mo2f_customer_selected_plan' );
678
+ if ( ! empty( $mo2f_customer_selected_plan ) ) {
679
+ delete_option( 'mo2f_customer_selected_plan' );
680
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mo2f_pricing' );
681
+ } else if ( $mo2f_second_factor == 'NONE' ) {
682
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
683
+ }
684
+
685
+ update_option( 'mo2f_message', $mo2f_message );
686
+ $this->mo_auth_show_success_message();
687
+ } else {
688
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_EMAIL_OR_PASSWORD" ) );
689
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_VERIFY_CUSTOMER';
690
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
691
+ $this->mo_auth_show_error_message();
692
+ }
693
+
694
+ }
695
+ } else {
696
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_EMAIL_OR_PASSWORD" ) );
697
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_VERIFY_CUSTOMER';
698
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
699
+ $this->mo_auth_show_error_message();
700
+ }
701
+
702
+ delete_option( 'mo2f_password' );
703
+ }
704
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_2factor_phone_verification' ) { //at registration time
705
+ $phone = sanitize_text_field( $_POST['phone_number'] );
706
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_user_phone' => $phone ) );
707
+
708
+ $phone = str_replace( ' ', '', $phone );
709
+ $auth_type = 'SMS';
710
+ $customer = new Customer_Setup();
711
+
712
+ $send_otp_response = json_decode( $customer->send_otp_token( $phone, $auth_type, $defaultCustomerKey, $defaultApiKey ), true );
713
+
714
+ if ( strcasecmp( $send_otp_response['status'], 'SUCCESS' ) == 0 ) {
715
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_SUCCESS';
716
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
717
+ update_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account', $send_otp_response['txId'] );
718
+
719
+ if ( get_user_meta( $user->ID, 'mo2f_sms_otp_count', true ) ) {
720
+ update_option( 'mo2f_message', 'Another One Time Passcode has been sent <b>( ' . get_user_meta( $user->ID, 'mo2f_sms_otp_count', true ) . ' )</b> for verification to ' . $phone );
721
+ update_user_meta( $user->ID, 'mo2f_sms_otp_count', get_user_meta( $user->ID, 'mo2f_sms_otp_count', true ) + 1 );
722
+ } else {
723
+ update_option( 'mo2f_message', 'One Time Passcode has been sent for verification to ' . $phone );
724
+ update_user_meta( $user->ID, 'mo2f_sms_otp_count', 1 );
725
+ }
726
+
727
+ $this->mo_auth_show_success_message();
728
+ } else {
729
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SENDING_SMS" ) );
730
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
731
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
732
+ $this->mo_auth_show_error_message();
733
+ }
734
+
735
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_2factor_resend_otp" ) { //resend OTP over email for admin
736
+
737
+ $nonce = $_POST['mo_2factor_resend_otp_nonce'];
738
+
739
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-resend-otp-nonce' ) ) {
740
+ $error = new WP_Error();
741
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
742
+
743
+ return $error;
744
+ } else {
745
+ $customer = new Customer_Setup();
746
+ $content = json_decode( $customer->send_otp_token( get_option( 'mo2f_email' ), 'EMAIL', $defaultCustomerKey, $defaultApiKey ), true );
747
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
748
+ if ( get_user_meta( $user->ID, 'mo2f_email_otp_count', true ) ) {
749
+ update_user_meta( $user->ID, 'mo2f_email_otp_count', get_user_meta( $user->ID, 'mo2f_email_otp_count', true ) + 1 );
750
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "RESENT_OTP" ) . ' <b>( ' . get_user_meta( $user->ID, 'mo2f_email_otp_count', true ) . ' )</b> to <b>' . ( get_option( 'mo2f_email' ) ) . '</b> ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
751
+ } else {
752
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . '<b> ' . ( get_option( 'mo2f_email' ) ) . ' </b>' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
753
+ update_user_meta( $user->ID, 'mo2f_email_otp_count', 1 );
754
+ }
755
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_SUCCESS';
756
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
757
+ update_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account', $content['txId'] );
758
+ $this->mo_auth_show_success_message();
759
+ } else {
760
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_EMAIL" ) );
761
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
762
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
763
+ $this->mo_auth_show_error_message();
764
+ }
765
+ }
766
+
767
+
768
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo2f_dismiss_notice_option" ) {
769
+ update_option( 'mo2f_bug_fix_done', 1 );
770
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_2factor_validate_otp" ) { //validate OTP over email for admin
771
+
772
+ $nonce = $_POST['mo_2factor_validate_otp_nonce'];
773
+
774
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-validate-otp-nonce' ) ) {
775
+ $error = new WP_Error();
776
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
777
+
778
+ return $error;
779
+ } else {
780
+ //validation and sanitization
781
+ $otp_token = '';
782
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
783
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
784
+ $this->mo_auth_show_error_message();
785
+
786
+ return;
787
+ } else {
788
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
789
+ }
790
+
791
+ $customer = new Customer_Setup();
792
+
793
+ $transactionId = get_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account', true );
794
+
795
+ $content = json_decode( $customer->validate_otp_token( 'EMAIL', null, $transactionId, $otp_token, $defaultCustomerKey, $defaultApiKey ), true );
796
+
797
+ if ( $content['status'] == 'ERROR' ) {
798
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $content['message'] ) );
799
+
800
+ } else {
801
+
802
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //OTP validated
803
+ $this->mo2f_create_customer( $user );
804
+ delete_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account' );
805
+ delete_user_meta( $user->ID, 'register_account_popup' );
806
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
807
+ } else { // OTP Validation failed.
808
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_OTP" ) );
809
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_OTP_DELIVERED_FAILURE' ) );
810
+
811
+ }
812
+ }
813
+ }
814
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_2factor_validate_user_otp" ) { //validate OTP over email for additional admin
815
+
816
+ //validation and sanitization
817
+ $nonce = $_POST['mo_2factor_validate_user_otp_nonce'];
818
+
819
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-validate-user-otp-nonce' ) ) {
820
+ $error = new WP_Error();
821
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
822
+
823
+ return $error;
824
+ } else {
825
+ $otp_token = '';
826
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
827
+ update_option( 'mo2f_message', 'All the fields are required. Please enter valid entries.' );
828
+ $this->mo_auth_show_error_message();
829
+
830
+ return;
831
+ } else {
832
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
833
+ }
834
+
835
+ $user_email = get_user_meta( $user->ID, 'user_email', true );
836
+
837
+ //if(!MO2f_Utility::check_if_email_is_already_registered($user_email)){
838
+ $customer = new Customer_Setup();
839
+ $mo2f_transactionId = isset( $_SESSION['mo2f_transactionId'] ) && ! empty( $_SESSION['mo2f_transactionId'] ) ? $_SESSION['mo2f_transactionId'] : get_option( 'mo2f_transactionId' );
840
+
841
+ $content = json_decode( $customer->validate_otp_token( 'EMAIL', '', $mo2f_transactionId, $otp_token, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
842
+
843
+ if ( $content['status'] == 'ERROR' ) {
844
+ update_option( 'mo2f_message', $content['message'] );
845
+ $this->mo_auth_show_error_message();
846
+ } else {
847
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //OTP validated and generate QRCode
848
+ $this->mo2f_create_user( $user, $user_email );
849
+ delete_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account' );
850
+ } else {
851
+ update_option( 'mo2f_message', 'Invalid OTP. Please try again.' );
852
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_OTP_DELIVERED_FAILURE' ) );
853
+ $this->mo_auth_show_error_message();
854
+ }
855
+ }
856
+ /*}else{
857
+ update_option('mo2f_message','The email is already used by other user. Please register with other email by clicking on Back button.');
858
+ $this->mo_auth_show_error_message();
859
+ }*/
860
+ }
861
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_2factor_send_query" ) { //Help me or support
862
+ $nonce = $_POST['mo_2factor_send_query_nonce'];
863
+
864
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-send-query-nonce' ) ) {
865
+ $error = new WP_Error();
866
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
867
+
868
+ return $error;
869
+ } else {
870
+
871
+ $query = '';
872
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['EMAIL_MANDATORY'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['query'] ) ) {
873
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "EMAIL_MANDATORY" ) );
874
+ $this->mo_auth_show_error_message();
875
+
876
+ return;
877
+ } else {
878
+ $query = sanitize_text_field( $_POST['query'] );
879
+ $email = sanitize_text_field( $_POST['EMAIL_MANDATORY'] );
880
+ $phone = sanitize_text_field( $_POST['query_phone'] );
881
+ $contact_us = new Customer_Setup();
882
+ $submited = json_decode( $contact_us->submit_contact_us( $email, $phone, $query ), true );
883
+ if ( json_last_error() == JSON_ERROR_NONE ) {
884
+ if ( is_array( $submited ) && array_key_exists( 'status', $submited ) && $submited['status'] == 'ERROR' ) {
885
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $submited['message'] ) );
886
+ $this->mo_auth_show_error_message();
887
+ } else {
888
+ if ( $submited == false ) {
889
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SUBMITTING_QUERY" ) );
890
+ $this->mo_auth_show_error_message();
891
+ } else {
892
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "QUERY_SUBMITTED_SUCCESSFULLY" ) );
893
+ $this->mo_auth_show_success_message();
894
+ }
895
+ }
896
+ }
897
+
898
+ }
899
+ }
900
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_auth_advanced_options_save' ) {
901
+ update_option( 'mo2f_message', 'Your settings are saved successfully.' );
902
+ $this->mo_auth_show_success_message();
903
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_auth_login_settings_save' ) {
904
+ $nonce = $_POST['mo_auth_login_settings_save_nonce'];
905
+ if ( ! wp_verify_nonce( $nonce, 'mo-auth-login-settings-save-nonce' ) ) {
906
+ $error = new WP_Error();
907
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
908
+ return $error;
909
+ } else {
910
+ $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
911
+ if ( $mo_2factor_user_registration_status == 'MO_2_FACTOR_PLUGIN_SETTINGS' ) {
912
+
913
+ update_option( 'mo2f_login_option', isset( $_POST['mo2f_login_option'] ) ? $_POST['mo2f_login_option'] : 0 );
914
+ update_option( 'mo2f_remember_device', isset( $_POST['mo2f_remember_device'] ) ? $_POST['mo2f_remember_device'] : 0 );
915
+ if ( get_option( 'mo2f_login_option' ) == 0 ) {
916
+ update_option( 'mo2f_remember_device', 0 );
917
+ }
918
+ update_option( 'mo2f_enable_forgotphone', isset( $_POST['mo2f_forgotphone'] ) ? $_POST['mo2f_forgotphone'] : 0 );
919
+ update_option( 'mo2f_enable_login_with_2nd_factor', isset( $_POST['mo2f_login_with_username_and_2factor'] ) ? $_POST['mo2f_login_with_username_and_2factor'] : 0 );
920
+ update_option( 'mo2f_enable_xmlrpc', isset( $_POST['mo2f_enable_xmlrpc'] ) ? $_POST['mo2f_enable_xmlrpc'] : 0 );
921
+ if ( get_option( 'mo2f_remember_device' ) && ! get_option( 'mo2f_app_secret' ) ) {
922
+ $get_app_secret = new Miniorange_Rba_Attributes();
923
+ $rba_response = json_decode( $get_app_secret->mo2f_get_app_secret(), true ); //fetch app secret
924
+ if ( json_last_error() == JSON_ERROR_NONE ) {
925
+ if ( $rba_response['status'] == 'SUCCESS' ) {
926
+ update_option( 'mo2f_app_secret', $rba_response['appSecret'] );
927
+ } else {
928
+ update_option( 'mo2f_remember_device', 0 );
929
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SAVING_SETTINGS" ) );
930
+ $this->mo_auth_show_error_message();
931
+ }
932
+ } else {
933
+ update_option( 'mo2f_remember_device', 0 );
934
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SAVING_SETTINGS" ) );
935
+ $this->mo_auth_show_error_message();
936
+ }
937
+ }
938
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "SETTINGS_SAVED" ) );
939
+ $this->mo_auth_show_success_message();
940
+ } else {
941
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQUEST" ) );
942
+ $this->mo_auth_show_error_message();
943
+ }
944
+ }
945
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_sync_sms_transactions" ) {
946
+ $customer = new Customer_Setup();
947
+ $content = json_decode( $customer->get_customer_transactions( get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
948
+ if ( ! array_key_exists( 'smsRemaining', $content ) ) {
949
+ $smsRemaining = 0;
950
+ } else {
951
+ $smsRemaining = $content['smsRemaining'];
952
+ if ( $smsRemaining == null ) {
953
+ $smsRemaining = 0;
954
+ }
955
+ }
956
+ update_option( 'mo2f_number_of_transactions', $smsRemaining );
957
+ }
958
+
959
+
960
+ }
961
+
962
+ if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_fix_database_error' ) {
963
+ $nonce = $_POST['mo2f_fix_database_error_nonce'];
964
+
965
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-fix-database-error-nonce' ) ) {
966
+ $error = new WP_Error();
967
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
968
+
969
+ return $error;
970
+ } else {
971
+ global $Mo2fdbQueries;
972
+
973
+ $Mo2fdbQueries->database_table_issue();
974
+
975
+ }
976
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_skip_feedback' ) {
977
+
978
+ $nonce = $_POST['mo2f_skip_feedback_nonce'];
979
+
980
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-skip-feedback-nonce' ) ) {
981
+ $error = new WP_Error();
982
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
983
+
984
+ return $error;
985
+ } else {
986
+ deactivate_plugins( '/miniorange-2-factor-authentication/miniorange_2_factor_settings.php' );
987
+ }
988
+
989
+ }else if ( isset( $_POST['mo2f_feedback'] ) and $_POST['mo2f_feedback'] == 'mo2f_feedback' ) {
990
+
991
+ $nonce = $_POST['mo2f_feedback_nonce'];
992
+
993
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-feedback-nonce' ) ) {
994
+ $error = new WP_Error();
995
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
996
+
997
+ return $error;
998
+ } else {
999
+ $reasons_not_to_worry_about = array( "Upgrading to Standard / Premium", "Temporary deactivation - Testing" );
1000
+
1001
+ $message = 'Plugin Deactivated:';
1002
+
1003
+ if ( isset( $_POST['deactivate_plugin'] ) ) {
1004
+ if ( $_POST['query_feedback'] == '' and $_POST['deactivate_plugin'] == 'Other Reasons:' ) {
1005
+ // feedback add
1006
+ update_option( 'mo2f_message', 'Please let us know the reason for deactivation so that we improve the user experience.' );
1007
+ } else {
1008
+
1009
+ if ( ! in_array( $_POST['deactivate_plugin'], $reasons_not_to_worry_about ) ) {
1010
+
1011
+ $message .= $_POST['deactivate_plugin'];
1012
+
1013
+ if ( $_POST['query_feedback'] != '' ) {
1014
+ $message .= ':' . $_POST['query_feedback'];
1015
+ }
1016
+
1017
+
1018
+ if($_POST['deactivate_plugin'] == "Conflicts with other plugins"){
1019
+ $plugin_selected = $_POST['plugin_selected'];
1020
+ $plugin = MO2f_Utility::get_plugin_name_by_identifier($plugin_selected);
1021
+
1022
+ $message .= ", Plugin selected - " . $plugin . ".";
1023
+ }
1024
+
1025
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1026
+ if ( $email == '' ) {
1027
+ $email = $user->user_email;
1028
+ }
1029
+
1030
+ $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );;
1031
+
1032
+ $contact_us = new Customer_Setup();
1033
+ $submited = json_decode( $contact_us->send_email_alert( $email, $phone, $message ), true );
1034
+
1035
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1036
+ if ( is_array( $submited ) && array_key_exists( 'status', $submited ) && $submited['status'] == 'ERROR' ) {
1037
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $submited['message'] ) );
1038
+ $this->mo_auth_show_error_message();
1039
+ } else {
1040
+ if ( $submited == false ) {
1041
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SUBMITTING_QUERY" ) );
1042
+ $this->mo_auth_show_error_message();
1043
+ } else {
1044
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "QUERY_SUBMITTED_SUCCESSFULLY" ) );
1045
+ $this->mo_auth_show_success_message();
1046
+ }
1047
+ }
1048
+ }
1049
+ }
1050
+
1051
+ deactivate_plugins( '/miniorange-2-factor-authentication/miniorange_2_factor_settings.php' );
1052
+
1053
+ }
1054
+
1055
+ } else {
1056
+ update_option( 'mo2f_message', 'Please Select one of the reasons if your reason isnot mention please select Other Reasons' );
1057
+
1058
+ }
1059
+ }
1060
+
1061
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_2factor_resend_user_otp" ) { //resend OTP over email for additional admin and non-admin user
1062
+
1063
+ $nonce = $_POST['mo_2factor_resend_user_otp_nonce'];
1064
+
1065
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-resend-user-otp-nonce' ) ) {
1066
+ $error = new WP_Error();
1067
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1068
+
1069
+ return $error;
1070
+ } else {
1071
+ $customer = new Customer_Setup();
1072
+ $content = json_decode( $customer->send_otp_token( get_user_meta( $user->ID, 'user_email', true ), 'EMAIL', get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1073
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1074
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( get_user_meta( $user->ID, 'user_email', true ) ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
1075
+ update_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account', $content['txId'] );
1076
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_SUCCESS';
1077
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
1078
+ $this->mo_auth_show_success_message();
1079
+ } else {
1080
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_EMAIL" ) );
1081
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
1082
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
1083
+ $this->mo_auth_show_error_message();
1084
+
1085
+ }
1086
+ }
1087
+
1088
+ }else if ( isset( $_POST['option'] ) and ( $_POST['option'] == "mo2f_configure_miniorange_authenticator_validate" || $_POST['option'] == 'mo_auth_mobile_reconfiguration_complete' ) ) { //mobile registration successfully complete for all users
1089
+
1090
+ $nonce = $_POST['mo2f_configure_miniorange_authenticator_validate_nonce'];
1091
+
1092
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-miniorange-authenticator-validate-nonce' ) ) {
1093
+ $error = new WP_Error();
1094
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1095
+
1096
+ return $error;
1097
+ } else {
1098
+ delete_option( 'mo2f_transactionId' );
1099
+ $session_variables = array( 'mo2f_qrCode', 'mo2f_transactionId', 'mo2f_show_qr_code' );
1100
+ MO2f_Utility::unset_session_variables( $session_variables );
1101
+
1102
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1103
+ $TwoFA_method_to_configure = get_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', true );
1104
+ $enduser = new Two_Factor_Setup();
1105
+ $current_method = MO2f_Utility::mo2f_decode_2_factor( $TwoFA_method_to_configure, "server" );
1106
+
1107
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, $current_method, null, null, null ), true );
1108
+
1109
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
1110
+ if ( $response['status'] == 'ERROR' ) {
1111
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
1112
+
1113
+ $this->mo_auth_show_error_message();
1114
+
1115
+
1116
+ } else if ( $response['status'] == 'SUCCESS' ) {
1117
+
1118
+ $selectedMethod = $TwoFA_method_to_configure;
1119
+
1120
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
1121
+
1122
+
1123
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1124
+ 'mo2f_configured_2FA_method' => $selectedMethod,
1125
+ 'mobile_registration_status' => true,
1126
+ 'mo2f_miniOrangeQRCodeAuthentication_config_status' => true,
1127
+ 'mo2f_miniOrangeSoftToken_config_status' => true,
1128
+ 'mo2f_miniOrangePushNotification_config_status' => true,
1129
+ 'user_registration_with_miniorange' => 'SUCCESS',
1130
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
1131
+ ) );
1132
+
1133
+ delete_user_meta( $user->ID, 'configure_2FA' );
1134
+ mo2f_display_test_2fa_notification($user);
1135
+
1136
+ } else {
1137
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1138
+ $this->mo_auth_show_error_message();
1139
+ }
1140
+
1141
+ } else {
1142
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1143
+ $this->mo_auth_show_error_message();
1144
+ }
1145
+ }
1146
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_mobile_authenticate_success' ) { // mobile registration for all users(common)
1147
+
1148
+ $nonce = $_POST['mo2f_mobile_authenticate_success_nonce'];
1149
+
1150
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-mobile-authenticate-success-nonce' ) ) {
1151
+ $error = new WP_Error();
1152
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1153
+
1154
+ return $error;
1155
+ } else {
1156
+
1157
+ if ( current_user_can( 'manage_options' ) ) {
1158
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1159
+ } else {
1160
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1161
+ }
1162
+
1163
+ $session_variables = array( 'mo2f_qrCode', 'mo2f_transactionId', 'mo2f_show_qr_code' );
1164
+ MO2f_Utility::unset_session_variables( $session_variables );
1165
+
1166
+ delete_user_meta( $user->ID, 'test_2FA' );
1167
+ $this->mo_auth_show_success_message();
1168
+ }
1169
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_mobile_authenticate_error' ) { //mobile registration failed for all users(common)
1170
+ $nonce = $_POST['mo2f_mobile_authenticate_error_nonce'];
1171
+
1172
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-mobile-authenticate-error-nonce' ) ) {
1173
+ $error = new WP_Error();
1174
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1175
+
1176
+ return $error;
1177
+ } else {
1178
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "AUTHENTICATION_FAILED" ) );
1179
+ MO2f_Utility::unset_session_variables( 'mo2f_show_qr_code' );
1180
+ $this->mo_auth_show_error_message();
1181
+ }
1182
+
1183
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_setting_configuration" ) // redirect to setings page
1184
+ {
1185
+
1186
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS' ) );
1187
+
1188
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == "mo_auth_refresh_mobile_qrcode" ) { // refrsh Qrcode for all users
1189
+
1190
+ $nonce = $_POST['mo_auth_refresh_mobile_qrcode_nonce'];
1191
+
1192
+ if ( ! wp_verify_nonce( $nonce, 'mo-auth-refresh-mobile-qrcode-nonce' ) ) {
1193
+ $error = new WP_Error();
1194
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1195
+
1196
+ return $error;
1197
+ } else {
1198
+ $mo_2factor_user_registration_status = $Mo2fdbQueries->get_user_detail( 'mo_2factor_user_registration_status', $user->ID );
1199
+ if ( in_array( $mo_2factor_user_registration_status, array(
1200
+ 'MO_2_FACTOR_INITIALIZE_TWO_FACTOR',
1201
+ 'MO_2_FACTOR_INITIALIZE_MOBILE_REGISTRATION',
1202
+ 'MO_2_FACTOR_PLUGIN_SETTINGS'
1203
+ ) ) ) {
1204
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1205
+ $this->mo2f_get_qr_code_for_mobile( $email, $user->ID );
1206
+ } else {
1207
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "REGISTER_WITH_MO" ) );
1208
+ $this->mo_auth_show_error_message();
1209
+
1210
+ }
1211
+ }
1212
+ }else if ( isset( $_POST['mo2fa_register_to_upgrade_nonce'] ) ) { //registration with miniOrange for upgrading
1213
+ $nonce = $_POST['mo2fa_register_to_upgrade_nonce'];
1214
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-user-reg-to-upgrade-nonce' ) ) {
1215
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1216
+ } else {
1217
+ $requestOrigin = $_POST['requestOrigin'];
1218
+ update_option( 'mo2f_customer_selected_plan', $requestOrigin );
1219
+ header( 'Location: admin.php?page=wpnsaccount' );
1220
+
1221
+ }
1222
+ }else if ( isset( $_POST['miniorange_get_started'] ) && isset( $_POST['miniorange_user_reg_nonce'] ) ) { //registration with miniOrange for additional admin and non-admin
1223
+ $nonce = $_POST['miniorange_user_reg_nonce'];
1224
+ $Mo2fdbQueries->insert_user( $user_id, array( 'user_id' => $user_id ) );
1225
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-2-factor-user-reg-nonce' ) ) {
1226
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1227
+ } else {
1228
+ $email = '';
1229
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo_useremail'] ) ) {
1230
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_EMAILID" ) );
1231
+
1232
+ return;
1233
+ } else {
1234
+ $email = sanitize_email( $_POST['mo_useremail'] );
1235
+ }
1236
+
1237
+ if ( ! MO2f_Utility::check_if_email_is_already_registered( $email ) ) {
1238
+ update_user_meta( $user->ID, 'user_email', $email );
1239
+
1240
+ $enduser = new Two_Factor_Setup();
1241
+ $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
1242
+
1243
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1244
+ if ( $check_user['status'] == 'ERROR' ) {
1245
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $check_user['message'] ) );
1246
+ $this->mo_auth_show_error_message();
1247
+
1248
+ return;
1249
+ } else if ( strcasecmp( $check_user['status'], 'USER_FOUND_UNDER_DIFFERENT_CUSTOMER' ) == 0 ) {
1250
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "EMAIL_IN_USE" ) );
1251
+ $this->mo_auth_show_error_message();
1252
+
1253
+ return;
1254
+ } else if ( strcasecmp( $check_user['status'], 'USER_FOUND' ) == 0 || strcasecmp( $check_user['status'], 'USER_NOT_FOUND' ) == 0 ) {
1255
+
1256
+
1257
+ $enduser = new Customer_Setup();
1258
+ $content = json_decode( $enduser->send_otp_token( $email, 'EMAIL', get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1259
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
1260
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( $email ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
1261
+ $_SESSION['mo2f_transactionId'] = $content['txId'];
1262
+ update_option( 'mo2f_transactionId', $content['txId'] );
1263
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_SUCCESS';
1264
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
1265
+ update_user_meta( $user->ID, 'mo_2fa_verify_otp_create_account', $content['txId'] );
1266
+ $this->mo_auth_show_success_message();
1267
+ } else {
1268
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
1269
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
1270
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_OTP_OVER_EMAIL" ) );
1271
+ $this->mo_auth_show_error_message();
1272
+ }
1273
+
1274
+
1275
+ }
1276
+ }
1277
+ } else {
1278
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "EMAIL_IN_USE" ) );
1279
+ $this->mo_auth_show_error_message();
1280
+ }
1281
+ }
1282
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo_2factor_backto_user_registration' ) { //back to registration page for additional admin and non-admin
1283
+ $nonce = $_POST['mo_2factor_backto_user_registration_nonce'];
1284
+
1285
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-backto-user-registration-nonce' ) ) {
1286
+ $error = new WP_Error();
1287
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1288
+
1289
+ return $error;
1290
+ } else {
1291
+ delete_user_meta( $user->ID, 'user_email' );
1292
+ $Mo2fdbQueries->delete_user_details( $user->ID );
1293
+ MO2f_Utility::unset_session_variables( 'mo2f_transactionId' );
1294
+ delete_option( 'mo2f_transactionId' );
1295
+ }
1296
+
1297
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_soft_token' ) { // validate Soft Token during test for all users
1298
+
1299
+ $nonce = $_POST['mo2f_validate_soft_token_nonce'];
1300
+
1301
+
1302
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-validate-soft-token-nonce' ) ) {
1303
+ $error = new WP_Error();
1304
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1305
+
1306
+ return $error;
1307
+ } else {
1308
+ $otp_token = '';
1309
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
1310
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_VALUE" ) );
1311
+ $this->mo_auth_show_error_message();
1312
+
1313
+ return;
1314
+ } else {
1315
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
1316
+ }
1317
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1318
+ $customer = new Customer_Setup();
1319
+ $content = json_decode( $customer->validate_otp_token( 'SOFT TOKEN', $email, null, $otp_token, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1320
+ if ( $content['status'] == 'ERROR' ) {
1321
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $content['message'] ) );
1322
+ $this->mo_auth_show_error_message();
1323
+ } else {
1324
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //OTP validated and generate QRCode
1325
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1326
+
1327
+ delete_user_meta( $user->ID, 'test_2FA' );
1328
+ $this->mo_auth_show_success_message();
1329
+
1330
+
1331
+ } else { // OTP Validation failed.
1332
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_OTP" ) );
1333
+ $this->mo_auth_show_error_message();
1334
+
1335
+ }
1336
+ }
1337
+ }
1338
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_otp_over_sms' ) { //validate otp over sms and phone call during test for all users
1339
+
1340
+ $nonce = $_POST['mo2f_validate_otp_over_sms_nonce'];
1341
+
1342
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-validate-otp-over-sms-nonce' ) ) {
1343
+ $error = new WP_Error();
1344
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1345
+
1346
+ return $error;
1347
+ } else {
1348
+ $otp_token = '';
1349
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
1350
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_VALUE" ) );
1351
+ $this->mo_auth_show_error_message();
1352
+
1353
+ return;
1354
+ } else {
1355
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
1356
+ }
1357
+
1358
+ //if the php session folder has insufficient permissions, temporary options to be used
1359
+ $mo2f_transactionId = isset( $_SESSION['mo2f_transactionId'] ) && ! empty( $_SESSION['mo2f_transactionId'] ) ? $_SESSION['mo2f_transactionId'] : get_option( 'mo2f_transactionId' );
1360
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1361
+ $selected_2_2factor_method = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1362
+ $customer = new Customer_Setup();
1363
+ $content = json_decode( $customer->validate_otp_token( get_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', true ), $email, $mo2f_transactionId, $otp_token, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1364
+
1365
+ if ( $content['status'] == 'ERROR' ) {
1366
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $content['message'] ) );
1367
+ $this->mo_auth_show_error_message();
1368
+ } else {
1369
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //OTP validated
1370
+ if ( current_user_can( 'manage_options' ) ) {
1371
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1372
+ } else {
1373
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate( "COMPLETED_TEST" ) );
1374
+ }
1375
+
1376
+ delete_user_meta( $user->ID, 'test_2FA' );
1377
+ $this->mo_auth_show_success_message();
1378
+
1379
+ } else {
1380
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_OTP" ) );
1381
+ $this->mo_auth_show_error_message();
1382
+ }
1383
+
1384
+ }
1385
+ }
1386
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_out_of_band_success' ) {
1387
+ $nonce = $_POST['mo2f_out_of_band_success_nonce'];
1388
+
1389
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-out-of-band-success-nonce' ) ) {
1390
+ $error = new WP_Error();
1391
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1392
+
1393
+ return $error;
1394
+ } else {
1395
+ $mo2f_configured_2FA_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
1396
+ $mo2f_EmailVerification_config_status = $Mo2fdbQueries->get_user_detail( 'mo2f_EmailVerification_config_status', $user->ID );
1397
+ if ( ! current_user_can( 'manage_options' ) && $mo2f_configured_2FA_method == 'OUT OF BAND EMAIL' ) {
1398
+ if ( $mo2f_EmailVerification_config_status ) {
1399
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1400
+ } else {
1401
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1402
+ $enduser = new Two_Factor_Setup();
1403
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, $mo2f_configured_2FA_method, null, null, null ), true );
1404
+ update_option( 'mo2f_message', '<b> ' . Mo2fConstants:: langTranslate( "EMAIL_VERFI" ) . '</b> ' . Mo2fConstants:: langTranslate( "SET_AS_2ND_FACTOR" ) );
1405
+ }
1406
+ } else {
1407
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1408
+ }
1409
+ delete_user_meta( $user->ID, 'test_2FA' );
1410
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1411
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
1412
+ 'mo2f_EmailVerification_config_status' => true
1413
+ ) );
1414
+
1415
+ $this->mo_auth_show_success_message();
1416
+ }
1417
+
1418
+
1419
+ }else if ( isset( $_POST['option'] ) and $_POST['option'] == 'mo2f_out_of_band_error' ) { //push and out of band email denied
1420
+ $nonce = $_POST['mo2f_out_of_band_error_nonce'];
1421
+
1422
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-out-of-band-error-nonce' ) ) {
1423
+ $error = new WP_Error();
1424
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1425
+
1426
+ return $error;
1427
+ } else {
1428
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "DENIED_REQUEST" ) );
1429
+ delete_user_meta( $user->ID, 'test_2FA' );
1430
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1431
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
1432
+ 'mo2f_EmailVerification_config_status' => true
1433
+ ) );
1434
+ $this->mo_auth_show_error_message();
1435
+ }
1436
+
1437
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_google_authy_test' ) {
1438
+
1439
+ $nonce = $_POST['mo2f_validate_google_authy_test_nonce'];
1440
+
1441
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-validate-google-authy-test-nonce' ) ) {
1442
+ $error = new WP_Error();
1443
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1444
+
1445
+ return $error;
1446
+ } else {
1447
+ $otp_token = '';
1448
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
1449
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ENTER_VALUE" ) );
1450
+ $this->mo_auth_show_error_message();
1451
+
1452
+ return;
1453
+ } else {
1454
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
1455
+ }
1456
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1457
+
1458
+ $customer = new Customer_Setup();
1459
+ $content = json_decode( $customer->validate_otp_token( 'GOOGLE AUTHENTICATOR', $email, null, $otp_token, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1460
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1461
+
1462
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //Google OTP validated
1463
+
1464
+ if ( current_user_can( 'manage_options' ) ) {
1465
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1466
+ } else {
1467
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1468
+ }
1469
+
1470
+ delete_user_meta( $user->ID, 'test_2FA' );
1471
+ $this->mo_auth_show_success_message();
1472
+
1473
+
1474
+ } else { // OTP Validation failed.
1475
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_OTP" ) );
1476
+ $this->mo_auth_show_error_message();
1477
+
1478
+ }
1479
+ } else {
1480
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_VALIDATING_OTP" ) );
1481
+ $this->mo_auth_show_error_message();
1482
+
1483
+ }
1484
+
1485
+ }
1486
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_google_appname' ) {
1487
+ $nonce = $_POST['mo2f_google_appname_nonce'];
1488
+
1489
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-google-appname-nonce' ) ) {
1490
+ $error = new WP_Error();
1491
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1492
+
1493
+ return $error;
1494
+ } else {
1495
+
1496
+ update_option('mo2f_google_appname',((isset($_POST['mo2f_google_auth_appname']) && $_POST['mo2f_google_auth_appname']!='') ? $_POST['mo2f_google_auth_appname'] : 'miniOrangeAuth'));
1497
+ }
1498
+
1499
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_google_authenticator_validate' ) {
1500
+ $nonce = $_POST['mo2f_configure_google_authenticator_validate_nonce'];
1501
+
1502
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-google-authenticator-validate-nonce' ) ) {
1503
+ $error = new WP_Error();
1504
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1505
+
1506
+ return $error;
1507
+ } else {
1508
+ $otpToken = $_POST['google_token'];
1509
+ $ga_secret = isset( $_POST['google_auth_secret'] ) ? $_POST['google_auth_secret'] : null;
1510
+ if ( MO2f_Utility::mo2f_check_number_length( $otpToken ) ) {
1511
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1512
+
1513
+ $google_auth = new Miniorange_Rba_Attributes();
1514
+ $google_response = json_decode( $google_auth->mo2f_validate_google_auth( $email, $otpToken, $ga_secret ), true );
1515
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1516
+ if ( $google_response['status'] == 'SUCCESS' ) {
1517
+ $enduser = new Two_Factor_Setup();
1518
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, "GOOGLE AUTHENTICATOR", null, null, null ), true );
1519
+
1520
+
1521
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1522
+
1523
+ if ( $response['status'] == 'SUCCESS' ) {
1524
+
1525
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
1526
+
1527
+ delete_user_meta( $user->ID, 'configure_2FA' );
1528
+
1529
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1530
+ 'mo2f_GoogleAuthenticator_config_status' => true,
1531
+ 'mo2f_AuthyAuthenticator_config_status' => false,
1532
+ 'mo2f_configured_2FA_method' => "Google Authenticator",
1533
+ 'user_registration_with_miniorange' => 'SUCCESS',
1534
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
1535
+ ) );
1536
+
1537
+ update_user_meta( $user->ID, 'mo2f_external_app_type', "Google Authenticator" );
1538
+ mo2f_display_test_2fa_notification($user);
1539
+
1540
+ } else {
1541
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1542
+ $this->mo_auth_show_error_message();
1543
+
1544
+ }
1545
+ } else {
1546
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1547
+ $this->mo_auth_show_error_message();
1548
+
1549
+ }
1550
+ } else {
1551
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_OTP_CAUSES" ) . '<br>1. ' . Mo2fConstants:: langTranslate( "INVALID_OTP" ) . '<br>2. ' . Mo2fConstants:: langTranslate( "APP_TIME_SYNC" ) );
1552
+ $this->mo_auth_show_error_message();
1553
+
1554
+ }
1555
+ } else {
1556
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_VALIDATING_USER" ) );
1557
+ $this->mo_auth_show_error_message();
1558
+
1559
+ }
1560
+
1561
+ } else {
1562
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ONLY_DIGITS_ALLOWED" ) );
1563
+ $this->mo_auth_show_error_message();
1564
+
1565
+ }
1566
+ }
1567
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_authy_authenticator' ) {
1568
+ $nonce = $_POST['mo2f_configure_authy_authenticator_nonce'];
1569
+
1570
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-authy-authenticator-nonce' ) ) {
1571
+ $error = new WP_Error();
1572
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1573
+
1574
+ return $error;
1575
+ } else {
1576
+ $authy = new Miniorange_Rba_Attributes();
1577
+ $user_email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1578
+ $authy_response = json_decode( $authy->mo2f_google_auth_service( $user_email ), true );
1579
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1580
+ if ( $authy_response['status'] == 'SUCCESS' ) {
1581
+ $mo2f_authy_keys = array();
1582
+ $mo2f_authy_keys['authy_qrCode'] = $authy_response['qrCodeData'];
1583
+ $mo2f_authy_keys['mo2f_authy_secret'] = $authy_response['secret'];
1584
+ $_SESSION['mo2f_authy_keys'] = $mo2f_authy_keys;
1585
+ } else {
1586
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
1587
+ $this->mo_auth_show_error_message();
1588
+ }
1589
+ } else {
1590
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
1591
+ $this->mo_auth_show_error_message();
1592
+ }
1593
+ }
1594
+ }else if( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_authy_authenticator_validate' ) {
1595
+ $nonce = $_POST['mo2f_configure_authy_authenticator_validate_nonce'];
1596
+
1597
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-authy-authenticator-validate-nonce' ) ) {
1598
+ $error = new WP_Error();
1599
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1600
+
1601
+ return $error;
1602
+ } else {
1603
+ $otpToken = $_POST['mo2f_authy_token'];
1604
+ $authy_secret = isset( $_POST['mo2f_authy_secret'] ) ? $_POST['mo2f_authy_secret'] : null;
1605
+ if ( MO2f_Utility::mo2f_check_number_length( $otpToken ) ) {
1606
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1607
+ $authy_auth = new Miniorange_Rba_Attributes();
1608
+ $authy_response = json_decode( $authy_auth->mo2f_validate_google_auth( $email, $otpToken, $authy_secret ), true );
1609
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1610
+ if ( $authy_response['status'] == 'SUCCESS' ) {
1611
+ $enduser = new Two_Factor_Setup();
1612
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, 'GOOGLE AUTHENTICATOR', null, null, null ), true );
1613
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1614
+
1615
+ if ( $response['status'] == 'SUCCESS' ) {
1616
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1617
+ 'mo2f_GoogleAuthenticator_config_status' => false,
1618
+ 'mo2f_AuthyAuthenticator_config_status' => true,
1619
+ 'mo2f_configured_2FA_method' => "Authy Authenticator",
1620
+ 'user_registration_with_miniorange' => 'SUCCESS',
1621
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
1622
+ ) );
1623
+ update_user_meta( $user->ID, 'mo2f_external_app_type', "Authy Authenticator" );
1624
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
1625
+ delete_user_meta( $user->ID, 'configure_2FA' );
1626
+
1627
+ mo2f_display_test_2fa_notification($user);
1628
+
1629
+ } else {
1630
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1631
+ $this->mo_auth_show_error_message();
1632
+ }
1633
+ } else {
1634
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1635
+ $this->mo_auth_show_error_message();
1636
+ }
1637
+ } else {
1638
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_OTP_CAUSES" ) . '<br>1. ' . Mo2fConstants:: langTranslate( "INVALID_OTP" ) . '<br>2. ' . Mo2fConstants:: langTranslate( "APP_TIME_SYNC" ) );
1639
+ $this->mo_auth_show_error_message();
1640
+ }
1641
+ } else {
1642
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_VALIDATING_USER" ) );
1643
+ $this->mo_auth_show_error_message();
1644
+ }
1645
+ } else {
1646
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ONLY_DIGITS_ALLOWED" ) );
1647
+ $this->mo_auth_show_error_message();
1648
+ }
1649
+ }
1650
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_save_kba' ) {
1651
+
1652
+ $nonce = $_POST['mo2f_save_kba_nonce'];
1653
+
1654
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-save-kba-nonce' ) ) {
1655
+ $error = new WP_Error();
1656
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1657
+
1658
+ return $error;
1659
+ } else {
1660
+
1661
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kbaquestion_1'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kba_ans1'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kbaquestion_2'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kba_ans2'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kbaquestion_3'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_kba_ans3'] ) ) {
1662
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
1663
+ $this->mo_auth_show_error_message();
1664
+
1665
+
1666
+ return;
1667
+ }
1668
+
1669
+ $kba_q1 = $_POST['mo2f_kbaquestion_1'];
1670
+ $kba_a1 = sanitize_text_field( $_POST['mo2f_kba_ans1'] );
1671
+ $kba_q2 = $_POST['mo2f_kbaquestion_2'];
1672
+ $kba_a2 = sanitize_text_field( $_POST['mo2f_kba_ans2'] );
1673
+ $kba_q3 = sanitize_text_field( $_POST['mo2f_kbaquestion_3'] );
1674
+ $kba_a3 = sanitize_text_field( $_POST['mo2f_kba_ans3'] );
1675
+
1676
+
1677
+ if ( strcasecmp( $kba_q1, $kba_q2 ) == 0 || strcasecmp( $kba_q2, $kba_q3 ) == 0 || strcasecmp( $kba_q3, $kba_q1 ) == 0 ) {
1678
+ update_option( 'mo2f_message', 'The questions you select must be unique.' );
1679
+ $this->mo_auth_show_error_message();
1680
+
1681
+
1682
+ return;
1683
+ }
1684
+ $kba_q1 = addcslashes( stripslashes( $kba_q1 ), '"\\' );
1685
+ $kba_a1 = addcslashes( stripslashes( $kba_a1 ), '"\\' );
1686
+ $kba_q2 = addcslashes( stripslashes( $kba_q2 ), '"\\' );
1687
+ $kba_a2 = addcslashes( stripslashes( $kba_a2 ), '"\\' );
1688
+ $kba_q3 = addcslashes( stripslashes( $kba_q3 ), '"\\' );
1689
+ $kba_a3 = addcslashes( stripslashes( $kba_a3 ), '"\\' );
1690
+
1691
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1692
+ $kba_registration = new Two_Factor_Setup();
1693
+ $kba_reg_reponse = json_decode( $kba_registration->register_kba_details( $email, $kba_q1, $kba_a1, $kba_q2, $kba_a2, $kba_q3, $kba_a3 ), true );
1694
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1695
+ if ( $kba_reg_reponse['status'] == 'SUCCESS' ) {
1696
+ if ( isset( $_POST['mobile_kba_option'] ) && $_POST['mobile_kba_option'] == 'mo2f_request_for_kba_as_emailbackup' ) {
1697
+ MO2f_Utility::unset_session_variables( 'mo2f_mobile_support' );
1698
+
1699
+ delete_user_meta( $user->ID, 'configure_2FA' );
1700
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
1701
+
1702
+ $message = mo2f_lt( 'Your KBA as alternate 2 factor is configured successfully.' );
1703
+ update_option( 'mo2f_message', $message );
1704
+ $this->mo_auth_show_success_message();
1705
+
1706
+ } else {
1707
+ $enduser = new Two_Factor_Setup();
1708
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, 'KBA', null, null, null ), true );
1709
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1710
+ if ( $response['status'] == 'ERROR' ) {
1711
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
1712
+ $this->mo_auth_show_error_message();
1713
+
1714
+ } else if ( $response['status'] == 'SUCCESS' ) {
1715
+ delete_user_meta( $user->ID, 'configure_2FA' );
1716
+
1717
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1718
+ 'mo2f_SecurityQuestions_config_status' => true,
1719
+ 'mo2f_configured_2FA_method' => "Security Questions",
1720
+ 'mo_2factor_user_registration_status' => "MO_2_FACTOR_PLUGIN_SETTINGS"
1721
+ ) );
1722
+ // $this->mo_auth_show_success_message();
1723
+ mo2f_display_test_2fa_notification($user);
1724
+
1725
+ } else {
1726
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1727
+ $this->mo_auth_show_error_message();
1728
+
1729
+ }
1730
+ } else {
1731
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1732
+ $this->mo_auth_show_error_message();
1733
+
1734
+ }
1735
+ }
1736
+ } else {
1737
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SAVING_KBA" ) );
1738
+ $this->mo_auth_show_error_message();
1739
+
1740
+
1741
+ return;
1742
+ }
1743
+ } else {
1744
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_WHILE_SAVING_KBA" ) );
1745
+ $this->mo_auth_show_error_message();
1746
+
1747
+
1748
+ return;
1749
+ }
1750
+ }
1751
+
1752
+
1753
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_validate_kba_details' ) {
1754
+
1755
+ $nonce = $_POST['mo2f_validate_kba_details_nonce'];
1756
+
1757
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-validate-kba-details-nonce' ) ) {
1758
+ $error = new WP_Error();
1759
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1760
+
1761
+ return $error;
1762
+ } else {
1763
+
1764
+ $kba_ans_1 = '';
1765
+ $kba_ans_2 = '';
1766
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_1'] ) || MO2f_Utility::mo2f_check_empty_or_null( $_POST['mo2f_answer_1'] ) ) {
1767
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
1768
+ $this->mo_auth_show_error_message();
1769
+
1770
+ return;
1771
+ } else {
1772
+ $kba_ans_1 = sanitize_text_field( $_POST['mo2f_answer_1'] );
1773
+ $kba_ans_2 = sanitize_text_field( $_POST['mo2f_answer_2'] );
1774
+ }
1775
+
1776
+ //if the php session folder has insufficient permissions, temporary options to be used
1777
+ $kba_questions = isset( $_SESSION['mo_2_factor_kba_questions'] ) && ! empty( $_SESSION['mo_2_factor_kba_questions'] ) ? $_SESSION['mo_2_factor_kba_questions'] : get_option( 'kba_questions' );
1778
+
1779
+ $kbaAns = array();
1780
+ $kbaAns[0] = $kba_questions[0];
1781
+ $kbaAns[1] = $kba_ans_1;
1782
+ $kbaAns[2] = $kba_questions[1];
1783
+ $kbaAns[3] = $kba_ans_2;
1784
+
1785
+ //if the php session folder has insufficient permissions, temporary options to be used
1786
+ $mo2f_transactionId = isset( $_SESSION['mo2f_transactionId'] ) && ! empty( $_SESSION['mo2f_transactionId'] ) ? $_SESSION['mo2f_transactionId'] : get_option( 'mo2f_transactionId' );
1787
+
1788
+ $kba_validate = new Customer_Setup();
1789
+ $kba_validate_response = json_decode( $kba_validate->validate_otp_token( 'KBA', null, $mo2f_transactionId, $kbaAns, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1790
+
1791
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1792
+ if ( strcasecmp( $kba_validate_response['status'], 'SUCCESS' ) == 0 ) {
1793
+ unset( $_SESSION['mo_2_factor_kba_questions'] );
1794
+ unset( $_SESSION['mo2f_transactionId'] );
1795
+ delete_option('mo2f_transactionId');
1796
+ delete_option('kba_questions');
1797
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "COMPLETED_TEST" ) );
1798
+ delete_user_meta( $user->ID, 'test_2FA' );
1799
+ $this->mo_auth_show_success_message();
1800
+ } else { // KBA Validation failed.
1801
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ANSWERS" ) );
1802
+ $this->mo_auth_show_error_message();
1803
+
1804
+ }
1805
+ }
1806
+ }
1807
+
1808
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_sms_send_otp' ) { // sendin otp for configuring OTP over SMS
1809
+
1810
+ $nonce = $_POST['mo2f_configure_otp_over_sms_send_otp_nonce'];
1811
+
1812
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-otp-over-sms-send-otp-nonce' ) ) {
1813
+ $error = new WP_Error();
1814
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1815
+
1816
+ return $error;
1817
+ } else {
1818
+ $phone = sanitize_text_field( $_POST['verify_phone'] );
1819
+
1820
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $phone ) ) {
1821
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
1822
+ $this->mo_auth_show_error_message();
1823
+
1824
+ return;
1825
+ }
1826
+
1827
+ $phone = str_replace( ' ', '', $phone );
1828
+ $_SESSION['user_phone'] = $phone;
1829
+ update_option( 'user_phone_temp', $phone );
1830
+ $customer = new Customer_Setup();
1831
+ $currentMethod = "SMS";
1832
+
1833
+ $content = json_decode( $customer->send_otp_token( $phone, $currentMethod, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1834
+
1835
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate otp token */
1836
+ if ( $content['status'] == 'ERROR' ) {
1837
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
1838
+ $this->mo_auth_show_error_message();
1839
+ } else if ( $content['status'] == 'SUCCESS' ) {
1840
+ $_SESSION['mo2f_transactionId'] = $content['txId'];
1841
+ update_option( 'mo2f_transactionId', $content['txId'] );
1842
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' ' . $phone . ' .' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
1843
+ update_option( 'mo2f_number_of_transactions', get_option( 'mo2f_number_of_transactions' ) - 1 );
1844
+ $this->mo_auth_show_success_message();
1845
+ } else {
1846
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate( $content['message'] ) );
1847
+ $this->mo_auth_show_error_message();
1848
+ }
1849
+
1850
+ } else {
1851
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1852
+ $this->mo_auth_show_error_message();
1853
+ }
1854
+ }
1855
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_configure_otp_over_sms_validate' ) {
1856
+ $nonce = $_POST['mo2f_configure_otp_over_sms_validate_nonce'];
1857
+
1858
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-configure-otp-over-sms-validate-nonce' ) ) {
1859
+ $error = new WP_Error();
1860
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1861
+
1862
+ return $error;
1863
+ } else {
1864
+ $otp_token = '';
1865
+ if ( MO2f_Utility::mo2f_check_empty_or_null( $_POST['otp_token'] ) ) {
1866
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_ENTRY" ) );
1867
+ $this->mo_auth_show_error_message();
1868
+
1869
+ return;
1870
+ } else {
1871
+ $otp_token = sanitize_text_field( $_POST['otp_token'] );
1872
+ }
1873
+
1874
+ //if the php session folder has insufficient permissions, temporary options to be used
1875
+ $mo2f_transactionId = isset( $_SESSION['mo2f_transactionId'] ) && ! empty( $_SESSION['mo2f_transactionId'] ) ? $_SESSION['mo2f_transactionId'] : get_option( 'mo2f_transactionId' );
1876
+ $user_phone = isset( $_SESSION['user_phone'] ) && $_SESSION['user_phone'] != 'false' ? $_SESSION['user_phone'] : get_option( 'user_phone_temp' );
1877
+ $mo2f_configured_2FA_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
1878
+ $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
1879
+ $customer = new Customer_Setup();
1880
+ $content = json_decode( $customer->validate_otp_token( $mo2f_configured_2FA_method, null, $mo2f_transactionId, $otp_token, get_option( 'mo2f_customerKey' ), get_option( 'mo2f_api_key' ) ), true );
1881
+
1882
+ if ( $content['status'] == 'ERROR' ) {
1883
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $content['message'] ) );
1884
+
1885
+ } else if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) { //OTP validated
1886
+ if ( $phone && strlen( $phone ) >= 4 ) {
1887
+ if ( $user_phone != $phone ) {
1888
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mobile_registration_status' => false ) );
1889
+
1890
+ }
1891
+ }
1892
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
1893
+
1894
+ $enduser = new Two_Factor_Setup();
1895
+ $TwoFA_method_to_configure = get_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', true );
1896
+ $current_method = MO2f_Utility::mo2f_decode_2_factor( $TwoFA_method_to_configure, "server" );
1897
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, $current_method, $user_phone, null, null ), true );
1898
+
1899
+ if ( json_last_error() == JSON_ERROR_NONE ) {
1900
+
1901
+ if ( $response['status'] == 'ERROR' ) {
1902
+ MO2f_Utility::unset_session_variables( 'user_phone' );
1903
+ delete_option( 'user_phone_temp' );
1904
+
1905
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
1906
+ $this->mo_auth_show_error_message();
1907
+ } else if ( $response['status'] == 'SUCCESS' ) {
1908
+
1909
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
1910
+ 'mo2f_configured_2FA_method' => 'OTP Over SMS',
1911
+ 'mo2f_OTPOverSMS_config_status' => true,
1912
+ 'user_registration_with_miniorange' => 'SUCCESS',
1913
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS',
1914
+ 'mo2f_user_phone' => $user_phone
1915
+ ) );
1916
+
1917
+ delete_user_meta( $user->ID, 'configure_2FA' );
1918
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
1919
+
1920
+ unset( $_SESSION['user_phone'] );
1921
+ MO2f_Utility::unset_session_variables( 'user_phone' );
1922
+ delete_option( 'user_phone_temp' );
1923
+
1924
+ mo2f_display_test_2fa_notification($user);
1925
+ } else {
1926
+ MO2f_Utility::unset_session_variables( 'user_phone' );
1927
+ delete_option( 'user_phone_temp' );
1928
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
1929
+ $this->mo_auth_show_error_message();
1930
+ }
1931
+ } else {
1932
+ MO2f_Utility::unset_session_variables( 'user_phone' );
1933
+ delete_option( 'user_phone_temp' );
1934
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
1935
+ $this->mo_auth_show_error_message();
1936
+ }
1937
+
1938
+ } else { // OTP Validation failed.
1939
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_OTP" ) );
1940
+ $this->mo_auth_show_error_message();
1941
+ }
1942
+ }
1943
+
1944
+ }else if ( ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_save_free_plan_auth_methods' ) ) {// user clicks on Set 2-Factor method
1945
+
1946
+ $nonce = $_POST['miniorange_save_form_auth_methods_nonce'];
1947
+
1948
+ if ( ! wp_verify_nonce( $nonce, 'miniorange-save-form-auth-methods-nonce' ) ) {
1949
+ $error = new WP_Error();
1950
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
1951
+
1952
+ return $error;
1953
+ } else {
1954
+ $is_customer_registered = $Mo2fdbQueries->get_user_detail( 'user_registration_with_miniorange', $user->ID ) == 'SUCCESS' ? true : false;
1955
+
1956
+ $selected_2FA_method = MO2f_Utility::mo2f_decode_2_factor( isset( $_POST['mo2f_configured_2FA_method_free_plan'] ) ? $_POST['mo2f_configured_2FA_method_free_plan'] : $_POST['mo2f_selected_action_standard_plan'], "wpdb" );
1957
+ update_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
1958
+
1959
+ if ( $is_customer_registered ) {
1960
+ $selected_2FA_method = MO2f_Utility::mo2f_decode_2_factor( isset( $_POST['mo2f_configured_2FA_method_free_plan'] ) ? $_POST['mo2f_configured_2FA_method_free_plan'] : $_POST['mo2f_selected_action_standard_plan'], "wpdb" );
1961
+ $selected_action = isset( $_POST['mo2f_selected_action_free_plan'] ) ? $_POST['mo2f_selected_action_free_plan'] : $_POST['mo2f_selected_action_standard_plan'];
1962
+ $user_phone = '';
1963
+
1964
+ if ( isset( $_SESSION['user_phone'] ) ) {
1965
+ $user_phone = $_SESSION['user_phone'] != 'false' ? $_SESSION['user_phone'] : $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
1966
+ }
1967
+
1968
+ // set it as his 2-factor in the WP database and server
1969
+ if ( $selected_action == "select2factor" ) {
1970
+
1971
+ if ( $selected_2FA_method == 'OTP Over SMS' && $user_phone == 'false' ) {
1972
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "PHONE_NOT_CONFIGURED" ) );
1973
+ $this->mo_auth_show_error_message();
1974
+ } else {
1975
+ // update in the Wordpress DB
1976
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo2f_configured_2FA_method' => $selected_2FA_method ) );
1977
+
1978
+ // update the server
1979
+ $this->mo2f_save_2_factor_method( $user, $selected_2FA_method );
1980
+
1981
+ if ( in_array( $selected_2FA_method, array(
1982
+ "Google Authenticator",
1983
+ "miniOrange Soft Token",
1984
+ "Authy Authenticator"
1985
+ ) ) ) {
1986
+
1987
+ } else {
1988
+ update_option( 'mo2f_enable_2fa_prompt_on_login_page', 0 );
1989
+ }
1990
+
1991
+ }
1992
+
1993
+ } else if ( $selected_action == "configure2factor" ) {
1994
+
1995
+ //show configuration form of respective Two Factor method
1996
+ update_user_meta( $user->ID, 'configure_2FA', 1 );
1997
+ update_user_meta( $user->ID, 'mo2f_2FA_method_to_configure', $selected_2FA_method );
1998
+
1999
+ }
2000
+
2001
+ } else {
2002
+ $Mo2fdbQueries->insert_user( $user->ID );
2003
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => "REGISTRATION_STARTED" ) );
2004
+ update_user_meta( $user->ID, 'register_account_popup', 1 );
2005
+ update_option( 'mo2f_message', "" );
2006
+
2007
+ // display_customer_registration_forms( $user );
2008
+ }
2009
+ }
2010
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_enable_2FA_for_users_option' ) {
2011
+ $nonce = $_POST['mo2f_enable_2FA_for_users_option_nonce'];
2012
+
2013
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-enable-2FA-for-users-option-nonce' ) ) {
2014
+ $error = new WP_Error();
2015
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2016
+
2017
+ return $error;
2018
+ } else {
2019
+ update_option( 'mo2f_enable_2fa_for_users', isset( $_POST['mo2f_enable_2fa_for_users'] ) ? $_POST['mo2f_enable_2fa_for_users'] : 0 );
2020
+ }
2021
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_disable_proxy_setup_option' ) {
2022
+ $nonce = $_POST['mo2f_disable_proxy_setup_option_nonce'];
2023
+
2024
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-disable-proxy-setup-option-nonce' ) ) {
2025
+ $error = new WP_Error();
2026
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2027
+
2028
+ return $error;
2029
+ } else {
2030
+ delete_option( 'mo2f_proxy_host' );
2031
+ delete_option( 'mo2f_port_number' );
2032
+ delete_option( 'mo2f_proxy_username' );
2033
+ delete_option( 'mo2f_proxy_password' );
2034
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "Proxy Configurations Reset." ) );
2035
+ $this->mo_auth_show_success_message();
2036
+ }
2037
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_enable_2FA_option' ) {
2038
+ $nonce = $_POST['mo2f_enable_2FA_option_nonce'];
2039
+
2040
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-enable-2FA-option-nonce' ) ) {
2041
+ $error = new WP_Error();
2042
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2043
+
2044
+ return $error;
2045
+ } else {
2046
+ update_option( 'mo2f_enable_2fa', isset( $_POST['mo2f_enable_2fa'] ) ? $_POST['mo2f_enable_2fa'] : 0 );
2047
+ }
2048
+ }else if( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_enable_2FA_on_login_page_option' ) {
2049
+ $nonce = $_POST['mo2f_enable_2FA_on_login_page_option_nonce'];
2050
+
2051
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-enable-2FA-on-login-page-option-nonce' ) ) {
2052
+ $error = new WP_Error();
2053
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2054
+
2055
+ return $error;
2056
+ } else {
2057
+ update_option( 'mo2f_enable_2fa_prompt_on_login_page', isset( $_POST['mo2f_enable_2fa_prompt_on_login_page'] ) ? $_POST['mo2f_enable_2fa_prompt_on_login_page'] : 0 );
2058
+ }
2059
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo_2factor_test_authentication_method' ) {
2060
+ //network security feature
2061
+ $nonce = $_POST['mo_2factor_test_authentication_method_nonce'];
2062
+
2063
+ if ( ! wp_verify_nonce( $nonce, 'mo-2factor-test-authentication-method-nonce' ) ) {
2064
+ $error = new WP_Error();
2065
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2066
+
2067
+ return $error;
2068
+ } else {
2069
+ update_user_meta( $user->ID, 'test_2FA', 1 );
2070
+
2071
+
2072
+ $selected_2FA_method = $_POST['mo2f_configured_2FA_method_test'];
2073
+ $selected_2FA_method_server = MO2f_Utility::mo2f_decode_2_factor( $selected_2FA_method, "server" );
2074
+ $customer = new Customer_Setup();
2075
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2076
+ $customer_key = get_option( 'mo2f_customerKey' );
2077
+ $api_key = get_option( 'mo2f_api_key' );
2078
+
2079
+ if ( $selected_2FA_method == 'Security Questions' ) {
2080
+ $response = json_decode( $customer->send_otp_token( $email, $selected_2FA_method_server, $customer_key, $api_key ), true );
2081
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate KBA Questions*/
2082
+ if ( $response['status'] == 'SUCCESS' ) {
2083
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2084
+ update_option( 'mo2f_transactionId', $response['txId'] );
2085
+ $questions = array();
2086
+ $questions[0] = $response['questions'][0]['question'];
2087
+ $questions[1] = $response['questions'][1]['question'];
2088
+ $_SESSION['mo_2_factor_kba_questions'] = $questions;
2089
+ update_option( 'kba_questions', $questions );
2090
+
2091
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ANSWER_SECURITY_QUESTIONS" ) );
2092
+ $this->mo_auth_show_success_message();
2093
+
2094
+ } else if ( $response['status'] == 'ERROR' ) {
2095
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_FETCHING_QUESTIONS" ) );
2096
+ $this->mo_auth_show_error_message();
2097
+
2098
+ }
2099
+ } else {
2100
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_FETCHING_QUESTIONS" ) );
2101
+ $this->mo_auth_show_error_message();
2102
+
2103
+ }
2104
+
2105
+
2106
+ } else if ( $selected_2FA_method == 'miniOrange Push Notification' ) {
2107
+ $response = json_decode( $customer->send_otp_token( $email, $selected_2FA_method_server, $customer_key, $api_key ), true );
2108
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
2109
+ if ( $response['status'] == 'ERROR' ) {
2110
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2111
+ $this->mo_auth_show_error_message();
2112
+
2113
+ } else {
2114
+ if ( $response['status'] == 'SUCCESS' ) {
2115
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2116
+ update_option( 'mo2f_transactionId', $response['txId'] );
2117
+ $_SESSION['mo2f_show_qr_code'] = 'MO_2_FACTOR_SHOW_QR_CODE';
2118
+ update_option( 'mo2f_transactionId', $response['txId'] );
2119
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "PUSH_NOTIFICATION_SENT" ) );
2120
+ $this->mo_auth_show_success_message();
2121
+
2122
+ } else {
2123
+ $session_variables = array( 'mo2f_qrCode', 'mo2f_transactionId', 'mo2f_show_qr_code' );
2124
+ MO2f_Utility::unset_session_variables( $session_variables );
2125
+
2126
+ delete_option( 'mo2f_transactionId' );
2127
+ update_option( 'mo2f_message', 'An error occurred while processing your request. Please Try again.' );
2128
+ $this->mo_auth_show_error_message();
2129
+
2130
+ }
2131
+ }
2132
+ } else {
2133
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
2134
+ $this->mo_auth_show_error_message();
2135
+
2136
+ }
2137
+ } else if ( $selected_2FA_method == 'OTP Over SMS' ) {
2138
+ $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
2139
+ $response = json_decode( $customer->send_otp_token( $phone, $selected_2FA_method_server, $customer_key, $api_key ), true );
2140
+ if ( strcasecmp( $response['status'], 'SUCCESS' ) == 0 ) {
2141
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "OTP_SENT" ) . ' <b>' . ( $phone ) . '</b>. ' . Mo2fConstants:: langTranslate( "ENTER_OTP" ) );
2142
+ update_option( 'mo2f_number_of_transactions', get_option( 'mo2f_number_of_transactions' ) - 1 );
2143
+
2144
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2145
+ update_option( 'mo2f_transactionId', $response['txId'] );
2146
+ $this->mo_auth_show_success_message();
2147
+
2148
+ } else {
2149
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_IN_SENDING_OTP" ) );
2150
+ $this->mo_auth_show_error_message();
2151
+
2152
+ }
2153
+ } else if ( $selected_2FA_method == 'miniOrange QR Code Authentication' ) {
2154
+ $response = json_decode( $customer->send_otp_token( $email, $selected_2FA_method_server, $customer_key, $api_key ), true );
2155
+
2156
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate Qr code */
2157
+
2158
+ if ( $response['status'] == 'ERROR' ) {
2159
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2160
+ $this->mo_auth_show_error_message();
2161
+
2162
+ } else {
2163
+ if ( $response['status'] == 'SUCCESS' ) {
2164
+ $_SESSION['mo2f_qrCode'] = $response['qrCode'];
2165
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2166
+ $_SESSION['mo2f_show_qr_code'] = 'MO_2_FACTOR_SHOW_QR_CODE';
2167
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "SCAN_QR_CODE" ) );
2168
+ $this->mo_auth_show_success_message();
2169
+
2170
+ } else {
2171
+ unset( $_SESSION['mo2f_qrCode'] );
2172
+ unset( $_SESSION['mo2f_transactionId'] );
2173
+ unset( $_SESSION['mo2f_show_qr_code'] );
2174
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
2175
+ $this->mo_auth_show_error_message();
2176
+
2177
+ }
2178
+ }
2179
+ } else {
2180
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
2181
+ $this->mo_auth_show_error_message();
2182
+
2183
+ }
2184
+ } else if ( $selected_2FA_method == 'Email Verification' ) {
2185
+ $this->miniorange_email_verification_call( $user );
2186
+ }
2187
+
2188
+
2189
+ update_user_meta( $user->ID, 'mo2f_2FA_method_to_test', $selected_2FA_method );
2190
+ }
2191
+
2192
+ }else if ( isset( $_POST['option'] ) && $_POST['option'] == 'mo2f_go_back' ) {
2193
+ $nonce = $_POST['mo2f_go_back_nonce'];
2194
+
2195
+ if ( ! wp_verify_nonce( $nonce, 'mo2f-go-back-nonce' ) ) {
2196
+ $error = new WP_Error();
2197
+ $error->add( 'empty_username', '<strong>' . mo2f_lt( 'ERROR' ) . '</strong>: ' . mo2f_lt( 'Invalid Request.' ) );
2198
+
2199
+ return $error;
2200
+ } else {
2201
+ $session_variables = array(
2202
+ 'mo2f_qrCode',
2203
+ 'mo2f_transactionId',
2204
+ 'mo2f_show_qr_code',
2205
+ 'user_phone',
2206
+ 'mo2f_google_auth',
2207
+ 'mo2f_mobile_support',
2208
+ 'mo2f_authy_keys'
2209
+ );
2210
+ MO2f_Utility::unset_session_variables( $session_variables );
2211
+ delete_option( 'mo2f_transactionId' );
2212
+ delete_option( 'user_phone_temp' );
2213
+
2214
+ delete_user_meta( $user->ID, 'test_2FA' );
2215
+ delete_user_meta( $user->ID, 'configure_2FA' );
2216
+ }
2217
+ }
2218
+
2219
+ }
2220
+
2221
+ function mo_auth_deactivate() {
2222
+ global $Mo2fdbQueries;
2223
+ $mo2f_register_with_another_email = get_option( 'mo2f_register_with_another_email' );
2224
+ $is_EC = ! get_option( 'mo2f_is_NC' ) ? 1 : 0;
2225
+ $is_NNC = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' ) ? 1 : 0;
2226
+
2227
+ if ( $mo2f_register_with_another_email || $is_EC || $is_NNC ) {
2228
+ update_option( 'mo2f_register_with_another_email', 0 );
2229
+ $users = get_users( array() );
2230
+ $this->mo2f_delete_user_details( $users );
2231
+ $this->mo2f_delete_mo_options();
2232
+ $url = admin_url( 'plugins.php' );
2233
+ wp_redirect( $url );
2234
+ }
2235
+ }
2236
+
2237
+ function mo2f_delete_user_details( $users ) {
2238
+ global $Mo2fdbQueries;
2239
+ foreach ( $users as $user ) {
2240
+ $Mo2fdbQueries->delete_user_details( $user->ID );
2241
+ delete_user_meta( $user->ID, 'phone_verification_status' );
2242
+ delete_user_meta( $user->ID, 'test_2FA' );
2243
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_configure' );
2244
+ delete_user_meta( $user->ID, 'configure_2FA' );
2245
+ delete_user_meta( $user->ID, 'mo2f_2FA_method_to_test' );
2246
+ delete_user_meta( $user->ID, 'mo2f_phone' );
2247
+ delete_user_meta( $user->ID, 'register_account_popup' );
2248
+ }
2249
+
2250
+ }
2251
+
2252
+ function mo2f_delete_mo_options() {
2253
+ delete_option( 'mo2f_email' );
2254
+ delete_option( 'mo2f_dbversion' );
2255
+ delete_option( 'mo2f_host_name' );
2256
+ delete_option( 'user_phone' );
2257
+ delete_option( 'mo2f_miniorange_admin');
2258
+ //delete_option( 'mo2f_customerKey' );
2259
+ delete_option( 'mo2f_api_key' );
2260
+ delete_option( 'mo2f_customer_token' );
2261
+ delete_option( 'mo_2factor_admin_registration_status' );
2262
+ delete_option( 'mo2f_number_of_transactions' );
2263
+ delete_option( 'mo2f_set_transactions' );
2264
+ delete_option( 'mo2f_show_sms_transaction_message' );
2265
+ delete_option( 'mo_app_password' );
2266
+ delete_option( 'mo2f_login_option' );
2267
+ delete_option( 'mo2f_remember_device' );
2268
+ delete_option( 'mo2f_enable_forgotphone' );
2269
+ delete_option( 'mo2f_enable_login_with_2nd_factor' );
2270
+ delete_option( 'mo2f_enable_xmlrpc' );
2271
+ delete_option( 'mo2f_register_with_another_email' );
2272
+ delete_option( 'mo2f_proxy_host' );
2273
+ delete_option( 'mo2f_port_number' );
2274
+ delete_option( 'mo2f_proxy_username' );
2275
+ delete_option( 'mo2f_proxy_password' );
2276
+ delete_option( 'mo2f_customer_selected_plan' );
2277
+ delete_option( 'mo2f_ns_whitelist_ip' );
2278
+ delete_option( 'mo2f_enable_brute_force' );
2279
+ delete_option( 'mo2f_show_remaining_attempts' );
2280
+ delete_option( 'mo2f_ns_blocked_ip' );
2281
+ delete_option( 'mo2f_allwed_login_attempts' );
2282
+ delete_option( 'mo2f_time_of_blocking_type' );
2283
+ delete_option( 'mo2f_network_features' );
2284
+
2285
+ }
2286
+
2287
+ function mo_auth_show_success_message() {
2288
+ do_action('wpns_show_message', get_option( 'mo2f_message' ), 'SUCCESS');
2289
+ // remove_action( 'admin_notices', array( $this, 'mo_auth_success_message' ) );
2290
+ // add_action( 'admin_notices', array( $this, 'mo_auth_error_message' ) );
2291
+ }
2292
+
2293
+ function mo2f_create_customer( $user ) {
2294
+ global $Mo2fdbQueries;
2295
+ delete_user_meta( $user->ID, 'mo2f_sms_otp_count' );
2296
+ delete_user_meta( $user->ID, 'mo2f_email_otp_count' );
2297
+ $customer = new Customer_Setup();
2298
+ $customerKey = json_decode( $customer->create_customer(), true );
2299
+
2300
+ if ( $customerKey['status'] == 'ERROR' ) {
2301
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $customerKey['message'] ) );
2302
+ $this->mo_auth_show_error_message();
2303
+ } else {
2304
+ if ( strcasecmp( $customerKey['status'], 'CUSTOMER_USERNAME_ALREADY_EXISTS' ) == 0 ) { //admin already exists in miniOrange
2305
+ $content = $customer->get_customer_key();
2306
+ $customerKey = json_decode( $content, true );
2307
+
2308
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2309
+ if ( array_key_exists( "status", $customerKey ) && $customerKey['status'] == 'ERROR' ) {
2310
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate( $customerKey['message'] ) );
2311
+ $this->mo_auth_show_error_message();
2312
+ } else {
2313
+ if ( isset( $customerKey['id'] ) && ! empty( $customerKey['id'] ) ) {
2314
+ update_option( 'mo2f_customerKey', $customerKey['id'] );
2315
+ update_option( 'mo2f_api_key', $customerKey['apiKey'] );
2316
+ update_option( 'mo2f_customer_token', $customerKey['token'] );
2317
+ update_option( 'mo2f_app_secret', $customerKey['appSecret'] );
2318
+ update_option( 'mo2f_miniorange_admin', $user->ID );
2319
+ delete_option( 'mo2f_password' );
2320
+ $email = get_option( 'mo2f_email' );
2321
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
2322
+ 'mo2f_EmailVerification_config_status' => true,
2323
+ 'user_registration_with_miniorange' => 'SUCCESS',
2324
+ 'mo2f_user_email' => $email
2325
+ ) );
2326
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_PLUGIN_SETTINGS';
2327
+
2328
+
2329
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
2330
+
2331
+ update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
2332
+ $enduser = new Two_Factor_Setup();
2333
+ $enduser->mo2f_update_userinfo( $email, 'OUT OF BAND EMAIL', null, 'API_2FA', true );
2334
+
2335
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_RETRIEVED_SUCCESSFULLY" ) . ' <b>' . Mo2fConstants:: langTranslate( "EMAIL_VERFI" ) . '</b> ' . Mo2fConstants:: langTranslate( "DEFAULT_2ND_FACTOR" ) . ' <a href=\"admin.php?page=miniOrange_2_factor_settings&amp;mo2f_tab=mobile_configure\" >' . Mo2fConstants:: langTranslate( "CLICK_HERE" ) . '</a> ' . Mo2fConstants:: langTranslate( "CONFIGURE_2FA" ) );
2336
+ $this->mo_auth_show_success_message();
2337
+ } else {
2338
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_CREATE_ACC_OTP" ) );
2339
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
2340
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
2341
+ $this->mo_auth_show_error_message();
2342
+ }
2343
+
2344
+ }
2345
+
2346
+ } else {
2347
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_EMAIL_OR_PASSWORD" ) );
2348
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_VERIFY_CUSTOMER';
2349
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
2350
+
2351
+ $this->mo_auth_show_error_message();
2352
+ }
2353
+
2354
+
2355
+ } else {
2356
+ if ( isset( $customerKey['id'] ) && ! empty( $customerKey['id'] ) ) {
2357
+ update_option( 'mo2f_customerKey', $customerKey['id'] );
2358
+ update_option( 'mo2f_api_key', $customerKey['apiKey'] );
2359
+ update_option( 'mo2f_customer_token', $customerKey['token'] );
2360
+ update_option( 'mo2f_app_secret', $customerKey['appSecret'] );
2361
+ update_option( 'mo2f_miniorange_admin', $user->ID );
2362
+ delete_option( 'mo2f_password' );
2363
+
2364
+ $email = get_option( 'mo2f_email' );
2365
+
2366
+ update_option( 'mo2f_is_NC', 1 );
2367
+ update_option( 'mo2f_is_NNC', 1 );
2368
+
2369
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ACCOUNT_CREATED" ) );
2370
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_PLUGIN_SETTINGS';
2371
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
2372
+ 'mo2f_2factor_enable_2fa_byusers' => 1,
2373
+ 'user_registration_with_miniorange' => 'SUCCESS',
2374
+ 'mo2f_configured_2FA_method' => 'NONE',
2375
+ 'mo2f_user_email' => $email,
2376
+ 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status
2377
+ ) );
2378
+
2379
+ update_option( 'mo_2factor_admin_registration_status', 'MO_2_FACTOR_CUSTOMER_REGISTERED_SUCCESS' );
2380
+
2381
+ $enduser = new Two_Factor_Setup();
2382
+ $enduser->mo2f_update_userinfo( $email, 'NONE', null, 'API_2FA', true );
2383
+
2384
+ $this->mo_auth_show_success_message();
2385
+
2386
+ $mo2f_customer_selected_plan = get_option( 'mo2f_customer_selected_plan' );
2387
+ if ( ! empty( $mo2f_customer_selected_plan ) ) {
2388
+ delete_option( 'mo2f_customer_selected_plan' );
2389
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mo2f_pricing' );
2390
+ } else {
2391
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mobile_configure' );
2392
+ }
2393
+
2394
+ } else {
2395
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_CREATE_ACC_OTP" ) );
2396
+ $mo_2factor_user_registration_status = 'MO_2_FACTOR_OTP_DELIVERED_FAILURE';
2397
+ $Mo2fdbQueries->update_user_details( $user->ID, array( 'mo_2factor_user_registration_status' => $mo_2factor_user_registration_status ) );
2398
+ $this->mo_auth_show_error_message();
2399
+ }
2400
+
2401
+
2402
+ }
2403
+ }
2404
+ }
2405
+
2406
+ public static function mo2f_get_GA_parameters($user){
2407
+ global $Mo2fdbQueries;
2408
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2409
+ $google_auth = new Miniorange_Rba_Attributes();
2410
+ $gauth_name= get_option('mo2f_google_appname');
2411
+ $gauth_name = $gauth_name ? $gauth_name : 'miniOrangeAuth';
2412
+ $google_response = json_decode( $google_auth->mo2f_google_auth_service( $email,$gauth_name ), true );
2413
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2414
+ if ( $google_response['status'] == 'SUCCESS' ) {
2415
+ $mo2f_google_auth = array();
2416
+ $mo2f_google_auth['ga_qrCode'] = $google_response['qrCodeData'];
2417
+ $mo2f_google_auth['ga_secret'] = $google_response['secret'];
2418
+ $_SESSION['mo2f_google_auth'] = $mo2f_google_auth;
2419
+ }else {
2420
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2421
+ do_action('mo_auth_show_error_message');
2422
+ }
2423
+ }else {
2424
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2425
+ do_action('mo_auth_show_error_message');
2426
+
2427
+ }
2428
+ }
2429
+
2430
+ function mo_auth_show_error_message() {
2431
+ do_action('wpns_show_message', get_option( 'mo2f_message' ), 'ERROR');
2432
+ // remove_action( 'admin_notices', array( $this, 'mo_auth_error_message' ) );
2433
+ // add_action( 'admin_notices', array( $this, 'mo_auth_success_message' ) );
2434
+ }
2435
+
2436
+ function mo2f_create_user( $user, $email ) {
2437
+ global $Mo2fdbQueries;
2438
+ $email = strtolower( $email );
2439
+ $enduser = new Two_Factor_Setup();
2440
+ $check_user = json_decode( $enduser->mo_check_user_already_exist( $email ), true );
2441
+
2442
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2443
+ if ( $check_user['status'] == 'ERROR' ) {
2444
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $check_user['message'] ) );
2445
+ $this->mo_auth_show_error_message();
2446
+ } else {
2447
+ if ( strcasecmp( $check_user['status'], 'USER_FOUND' ) == 0 ) {
2448
+
2449
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
2450
+ 'user_registration_with_miniorange' => 'SUCCESS',
2451
+ 'mo2f_user_email' => $email,
2452
+ 'mo2f_configured_2FA_method' => 'NONE',
2453
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
2454
+ ) );
2455
+
2456
+
2457
+ delete_user_meta( $user->ID, 'user_email' );
2458
+ $enduser->mo2f_update_userinfo( $email, 'NONE', null, 'API_2FA', true );
2459
+ $message = Mo2fConstants:: langTranslate( "REGISTRATION_SUCCESS" );
2460
+ update_option( 'mo2f_message', $message );
2461
+ $this->mo_auth_show_success_message();
2462
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mobile_configure' );
2463
+
2464
+ } else if ( strcasecmp( $check_user['status'], 'USER_NOT_FOUND' ) == 0 ) {
2465
+ $content = json_decode( $enduser->mo_create_user( $user, $email ), true );
2466
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2467
+ if ( $content['status'] == 'ERROR' ) {
2468
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $content['message'] ) );
2469
+ $this->mo_auth_show_error_message();
2470
+ } else {
2471
+ if ( strcasecmp( $content['status'], 'SUCCESS' ) == 0 ) {
2472
+ delete_user_meta( $user->ID, 'user_email' );
2473
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
2474
+ 'user_registration_with_miniorange' => 'SUCCESS',
2475
+ 'mo2f_user_email' => $email,
2476
+ 'mo2f_configured_2FA_method' => 'NONE',
2477
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
2478
+ ) );
2479
+ $enduser->mo2f_update_userinfo( $email, 'NONE', null, 'API_2FA', true );
2480
+ $message = Mo2fConstants:: langTranslate( "REGISTRATION_SUCCESS" );
2481
+ update_option( 'mo2f_message', $message );
2482
+ $this->mo_auth_show_success_message();
2483
+ header( 'Location: admin.php?page=miniOrange_2_factor_settings&mo2f_tab=mobile_configure' );
2484
+
2485
+ } else {
2486
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2487
+ $this->mo_auth_show_error_message();
2488
+ }
2489
+ }
2490
+ } else {
2491
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2492
+ $this->mo_auth_show_error_message();
2493
+ }
2494
+ } else {
2495
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2496
+ $this->mo_auth_show_error_message();
2497
+ }
2498
+ }
2499
+ } else {
2500
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_USER_REGISTRATION" ) );
2501
+ $this->mo_auth_show_error_message();
2502
+ }
2503
+ }
2504
+
2505
+ function mo2f_get_qr_code_for_mobile( $email, $id ) {
2506
+
2507
+ $registerMobile = new Two_Factor_Setup();
2508
+ $content = $registerMobile->register_mobile( $email );
2509
+ $response = json_decode( $content, true );
2510
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2511
+ if ( $response['status'] == 'ERROR' ) {
2512
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2513
+ $session_variables = array( 'mo2f_qrCode', 'mo2f_transactionId', 'mo2f_show_qr_code' );
2514
+ MO2f_Utility::unset_session_variables( $session_variables );
2515
+ delete_option( 'mo2f_transactionId' );
2516
+ $this->mo_auth_show_error_message();
2517
+
2518
+ } else {
2519
+ if ( $response['status'] == 'IN_PROGRESS' ) {
2520
+ update_option( 'mo2f_message', Mo2fConstants::langTranslate( "SCAN_QR_CODE" ) );
2521
+ $_SESSION['mo2f_qrCode'] = $response['qrCode'];
2522
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2523
+ update_option( 'mo2f_transactionId', $response['txId'] );
2524
+ $_SESSION['mo2f_show_qr_code'] = 'MO_2_FACTOR_SHOW_QR_CODE';
2525
+ $this->mo_auth_show_success_message();
2526
+ } else {
2527
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
2528
+ $session_variables = array( 'mo2f_qrCode', 'mo2f_transactionId', 'mo2f_show_qr_code' );
2529
+ MO2f_Utility::unset_session_variables( $session_variables );
2530
+ delete_option( 'mo2f_transactionId' );
2531
+ $this->mo_auth_show_error_message();
2532
+ }
2533
+ }
2534
+ }
2535
+ }
2536
+
2537
+ function mo2f_save_2_factor_method( $user, $mo2f_configured_2FA_method ) {
2538
+ global $Mo2fdbQueries;
2539
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $user->ID );
2540
+ $enduser = new Two_Factor_Setup();
2541
+ $phone = $Mo2fdbQueries->get_user_detail( 'mo2f_user_phone', $user->ID );
2542
+ $current_method = MO2f_Utility::mo2f_decode_2_factor( $mo2f_configured_2FA_method, "server" );
2543
+
2544
+ $response = json_decode( $enduser->mo2f_update_userinfo( $email, $current_method, $phone, null, null ), true );
2545
+
2546
+ if ( json_last_error() == JSON_ERROR_NONE ) {
2547
+ if ( $response['status'] == 'ERROR' ) {
2548
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2549
+ $this->mo_auth_show_error_message();
2550
+ } else if ( $response['status'] == 'SUCCESS' ) {
2551
+ $configured_2fa_method = $Mo2fdbQueries->get_user_detail( 'mo2f_configured_2FA_method', $user->ID );
2552
+
2553
+ if ( in_array( $configured_2fa_method, array( "Google Authenticator", "Authy Authenticator" ) ) ) {
2554
+ update_user_meta( $user->ID, 'mo2f_external_app_type', $configured_2fa_method );
2555
+ }
2556
+
2557
+ $Mo2fdbQueries->update_user_details( $user->ID, array(
2558
+ 'mo_2factor_user_registration_status' => 'MO_2_FACTOR_PLUGIN_SETTINGS'
2559
+ ) );
2560
+ delete_user_meta( $user->ID, 'configure_2FA' );
2561
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $configured_2fa_method ) . ' ' . Mo2fConstants:: langTranslate( "SET_2FA" ) );
2562
+
2563
+ $this->mo_auth_show_success_message();
2564
+ } else {
2565
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
2566
+ $this->mo_auth_show_error_message();
2567
+ }
2568
+ } else {
2569
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
2570
+ $this->mo_auth_show_error_message();
2571
+ }
2572
+ }
2573
+
2574
+ function miniorange_email_verification_call( $current_user ) {
2575
+
2576
+ global $Mo2fdbQueries;
2577
+ $challengeMobile = new Customer_Setup();
2578
+ $email = $Mo2fdbQueries->get_user_detail( 'mo2f_user_email', $current_user->ID );
2579
+ $content = $challengeMobile->send_otp_token( $email, 'OUT OF BAND EMAIL', $this->defaultCustomerKey, $this->defaultApiKey );
2580
+ $response = json_decode( $content, true );
2581
+ if ( json_last_error() == JSON_ERROR_NONE ) { /* Generate out of band email */
2582
+ if ( $response['status'] == 'ERROR' ) {
2583
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( $response['message'] ) );
2584
+ $this->mo_auth_show_error_message();
2585
+ } else {
2586
+ if ( $response['status'] == 'SUCCESS' ) {
2587
+ $_SESSION['mo2f_transactionId'] = $response['txId'];
2588
+ update_option( 'mo2f_transactionId', $response['txId'] );
2589
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "VERIFICATION_EMAIL_SENT" ) . '<b> ' . $email . '</b>. ' . Mo2fConstants:: langTranslate( "ACCEPT_LINK_TO_VERIFY_EMAIL" ) );
2590
+ $this->mo_auth_show_success_message();
2591
+ } else {
2592
+ unset( $_SESSION['mo2f_transactionId'] );
2593
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "ERROR_DURING_PROCESS" ) );
2594
+ $this->mo_auth_show_error_message();
2595
+ }
2596
+ }
2597
+ } else {
2598
+ update_option( 'mo2f_message', Mo2fConstants:: langTranslate( "INVALID_REQ" ) );
2599
+ $this->mo_auth_show_error_message();
2600
+ }
2601
+ }
2602
+
2603
+ function mo_auth_activate() {
2604
+ error_log(' miniOrange Two Factor Plugin Activated');
2605
+ $get_encryption_key = MO2f_Utility::random_str(16);
2606
+ update_option('mo2f_encryption_key',$get_encryption_key);
2607
+
2608
+ if ( get_option( 'mo2f_customerKey' ) && ! get_option( 'mo2f_is_NC' ) ) {
2609
+ update_option( 'mo2f_is_NC', 0 );
2610
+ } else {
2611
+ update_option( 'mo2f_is_NC', 1 );
2612
+ update_option( 'mo2f_is_NNC', 1 );
2613
+ }
2614
+
2615
+ do_action('mo2f_network_create_db');
2616
+
2617
+ update_option( 'mo2f_host_name', 'https://login.xecurify.com' );
2618
+ update_option('mo2f_data_storage',null);
2619
+ global $Mo2fdbQueries;
2620
+ $Mo2fdbQueries->mo_plugin_activate();
2621
+ }
2622
+
2623
+ function mo_get_2fa_shorcode( $atts ) {
2624
+ if ( ! is_user_logged_in() && mo2f_is_customer_registered() ) {
2625
+ $mo2f_shorcode = new MO2F_ShortCode();
2626
+ $html = $mo2f_shorcode->mo2FAFormShortCode( $atts );
2627
+
2628
+ return $html;
2629
+ }
2630
+ }
2631
+
2632
+ function mo_get_login_form_shortcode( $atts ) {
2633
+ if ( ! is_user_logged_in() && mo2f_is_customer_registered() ) {
2634
+ $mo2f_shorcode = new MO2F_ShortCode();
2635
+ $html = $mo2f_shorcode->mo2FALoginFormShortCode( $atts );
2636
+
2637
+ return $html;
2638
+ }
2639
+ }
2640
+ }
2641
+
2642
+ function mo2f_is_customer_registered() {
2643
+ $email = get_option( 'mo2f_email' );
2644
+ $customerKey = get_option( 'mo2f_customerKey' );
2645
+ if ( ! $email || ! $customerKey || ! is_numeric( trim( $customerKey ) ) ) {
2646
+ return 0;
2647
+ } else {
2648
+ return 1;
2649
+ }
2650
+ }
2651
+ new Miniorange_Authentication;
2652
+ ?>
class-utility.php → handler/two_fa_utility.php RENAMED
@@ -406,7 +406,6 @@ class MO2f_Utility {
406
  * @return NA
407
  */
408
  public static function unset_session_variables( $variables ) {
409
-
410
  if ( gettype( $variables ) == "array" ) {
411
  foreach ( $variables as $variable ) {
412
  if ( isset( $_SESSION[ $variable ] ) ) {
406
  * @return NA
407
  */
408
  public static function unset_session_variables( $variables ) {
 
409
  if ( gettype( $variables ) == "array" ) {
410
  foreach ( $variables as $variable ) {
411
  if ( isset( $_SESSION[ $variable ] ) ) {
helper/constants.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MoWpnsConstants
4
+ {
5
+ const SUCCESS = "success";
6
+ const FAILED = "failed";
7
+ const PAST_FAILED = "pastfailed";
8
+ const ACCESS_DENIED = "accessDenied";
9
+ const LOGIN_TRANSACTION = "User Login";
10
+ const ERR_404 = "404";
11
+ const ERR_403 = "403";
12
+ const DEFAULT_CUSTOMER_KEY = "16555";
13
+ const DEFAULT_API_KEY = "fFd2XcvTGDemZvbw1bcUesNJWEqKbbUq";
14
+ const DB_VERSION = 142;
15
+ const SUPPORT_EMAIL = 'info@xecurify.com';
16
+ const IP_LOOKUP_TEMPLATE = '<span style="font-size:14px;font-weight:bold">GENERAL INFORMATION</span><table style="margin-left:2%;"><tr><td style="width:100px;">Response</td><td >:</td><td>{{status}}</td></tr><tr><td style="width:100px;">IP Address</td><td>:</td><td>{{ip}}</td></tr><tr><td>HostName</td><td>:</td><td>{{hostname}}</td></tr><tr><td>TimeZone</td><td>:</td><td>{{timezone}}</td></tr><tr><td>Time Difference</td><td>:</td><td>{{offset}}</td></tr></table><hr><span style="font-size:14px;font-weight:bold">LOCATION INFORMATION</span><table style="margin-left:2%;"><tr><td>Latitude</td><td>:</td><td>{{latitude}}</td></tr><tr><td>Longitude</td><td>:</td><td>{{longitude}}</td></tr><tr><td>Region</td><td>:</td><td>{{region}}</td></tr><tr><td>Country</td><td>:</td><td>{{country}}</td></tr><tr><td>City</td><td>:</td><td>{{city}}</td></tr><tr><td>Continent</td><td>:</td><td>{{continent}}</td></tr><tr><td>Curreny Code</td><td>:</td><td>{{curreny_code}}</td></tr><tr><td>Curreny Symbol</td><td>:</td><td>{{curreny_symbol}}</td></tr><tr><td>Per Dollar Value</td><td>:</td><td>{{per_dollar_value}}</td></tr></table>';
17
+ const CURRENT_BROWSER = '<span style="font-size:10px;color:red;">( Current Browser )</span>';
18
+
19
+ //urls
20
+ const RECAPTCHA_URL = 'https://www.google.com/recaptcha/api.js';
21
+ const HOST_NAME = "https://login.xecurify.com";
22
+ const FOOTER_LINK = '<a style="display:none;" href="http://miniorange.com/cyber-security">Secured By miniOrange</a>';
23
+
24
+ //plugins
25
+ const TWO_FACTOR_SETTINGS = 'miniorange-2-factor-authentication/miniorange_2_factor_settings.php';
26
+ const OTP_VERIFICATION_SETTINGS = 'miniorange-otp-verification/miniorange_validation_settings.php';
27
+ const SOCIAL_LOGIN_SETTINGS = 'miniorange-login-openid/miniorange_openid_sso_settings.php';
28
+
29
+ //arrays
30
+ public static $domains = array('0-mail.com','20email.eu','0815.ru','0815.su','0clickemail.com','0sg.net','0wnd.net','0wnd.org','10mail.org','10minutemail.cf','10minutemail.com','10minutemail.de','10minutemail.ga','10minutemail.gq','10minutemail.ml','123-m.com','12hourmail.com','12minutemail.com','1ce.us','1chuan.com','1mail.ml','1pad.de','1zhuan.com','20mail.in','20mail.it','20minutemail.com','21cn.com','24hourmail.com','2prong.com','30minutemail.com','30minutesmail.com','3126.com','33mail.com','3d-painting.com','3mail.ga','4mail.cf','4mail.ga','4warding.com','4warding.net','4warding.org','50e.info','5mail.cf','5mail.ga','60minutemail.com','675hosting.com','675hosting.net','675hosting.org','6ip.us','6mail.cf','6mail.ga','6mail.ml','6paq.com','6url.com','75hosting.com','75hosting.net','75hosting.org','7days-printing.com','7mail.ga','7mail.ml','7tags.com','8mail.cf','8mail.ga','8mail.ml','99experts.com','9mail.cf','9ox.net','BeefMilk.com','DingBone.com','FudgeRub.com','LookUgly.com','MailScrap.com','SmellFear.com','TempEmail.net','a-bc.net','a45.in','abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com','abusemail.de','abwesend.de','abyssmail.com','ac20mail.in','acentri.com','addcom.de','advantimo.com','afrobacon.com','ag.us.to','agedmail.com','agnitumhost.net','ahk.jp','ajaxapp.net','alivance.com','alpenjodel.de','alphafrau.de','amail.com','amilegit.com','amiri.net','amiriindustries.com','amorki.pl','anappthat.com','ano-mail.net','anonbox.net','anonymail.dk','anonymbox.com','antichef.com','antichef.net','antispam.de','antispam24.de','appixie.com','armyspy.com','asdasd.nl','autosfromus.com','aver.com','azmeil.tk','baldmama.de','baldpapa.de','ballyfinance.com','baxomale.ht.cx','beddly.com','beefmilk.com','betriebsdirektor.de','big1.us','bigmir.net','bigprofessor.so','bigstring.com','bin-wieder-da.de','binkmail.com','bio-muesli.info','bio-muesli.net','bladesmail.net','bleib-bei-mir.de','blockfilter.com','blogmyway.org','bluebottle.com','bobmail.info','bodhi.lawlita.com','bofthew.com','bonbon.net','bootybay.de','boun.cr','bouncr.com','boxformail.in','boxtemp.com.br','brefmail.com','brennendesreich.de','briefemail.com','broadbandninja.com','brokenvalve.com','brokenvalve.org','bsnow.net','bspamfree.org','bu.mintemail.com','buerotiger.de','buffemail.com','bugmenot.com','bumpymail.com','bund.us','bundes-li.ga','burnthespam.info','burstmail.info','buy-24h.net.ru','buyusedlibrarybooks.org','c2.hu','cachedot.net','cashette.com','casualdx.com','cbair.com','ce.mintemail.com','cellurl.com','center-mail.de','centermail.at','centermail.ch','centermail.com','centermail.de','centermail.info','centermail.net','cghost.s-a-d.de','chammy.info','cheatmail.de','chogmail.com','choicemail1.com','chong-mail.com','chong-mail.net','chong-mail.org','chongsoft.org','clixser.com','cmail.com','cmail.net','cmail.org','coldemail.info','consumerriot.com','cool.fr.nf','coole-files.de','correo.blogos.net','cosmorph.com','courriel.fr.nf','courrieltemporaire.com','crapmail.org','crazespaces.pw','crazymailing.com','cubiclink.com','curryworld.de','cust.in','cuvox.de','cyber-matrix.com','dacoolest.com','daintly.com','dandikmail.com','dating4best.net','dayrep.com','dbunker.com','dcemail.com','deadaddress.com','deadchildren.org','deadfake.cf','deadfake.ga','deadfake.ml','deadfake.tk','deadspam.com','deagot.com','dealja.com','despam.it','despammed.com','devnullmail.com','dfgh.net','dharmatel.net','die-besten-bilder.de','die-genossen.de','die-optimisten.de','die-optimisten.net','dieMailbox.de','digital-filestore.de','digitalsanctuary.com','dingbone.com','directbox.com','discard.cf','discard.email','discard.ga','discard.gq','discard.ml','discard.tk','discardmail.*','discardmail.com','discardmail.de','discartmail.com','disposable-email.ml','disposable.cf','disposable.ga','disposable.ml','disposableaddress.com','disposableemailaddresses.com','disposableemailaddresses.emailmiser.com','disposableinbox.com','dispose.it','disposeamail.com','disposemail.com','dispostable.com','divermail.com','dm.w3internet.co.uk','example.com','docmail.cz','dodgeit.com','dodgit.com','dodgit.org','dogit.com','doiea.com','domozmail.com','donemail.ru','dontreg.com','dontsendmespam.de','dontsentmespam.de','dotmsg.com','download-privat.de','drdrb.com','drdrb.net','droplar.com','dropmail.me','duam.net','dudmail.com','dump-email.info','dumpandjunk.com','dumpmail.com','dumpmail.de','dumpyemail.com','duskmail.com','dyndns.org','e-mail.com','e-mail.org','e4ward.com','easytrashmail.com','ee2.pl','eelmail.com','einrot.com','einrot.de','eintagsmail.de','email-fake.cf','email-fake.ga','email-fake.gq','email-fake.ml','email-fake.tk','email.org','email4u.info','email60.com','emailage.cf','emailage.ga','emailage.gq','emailage.ml','emailage.tk','emaildienst.de','emailgo.de','emailias.com','emailigo.de','emailinfive.com','emailisvalid.com','emaillime.com','emailmiser.com','emailproxsy.com','emails.ga','emailsensei.com','emailspam.cf','emailspam.ga','emailspam.gq','emailspam.ml','emailspam.tk','emailtaxi.de','emailtemporanea.net','emailtemporar.ro','emailtemporario.com.br','emailthe.net','emailtmp.com','emailto.de','emailwarden.com','emailx.at.hm','emailxfer.com','emailz.cf','emailz.ga','emailz.gq','emailz.ml','emeil.in','emeil.ir','emil.com','emkei.cf','emkei.ga','emkei.gq','emkei.ml','emkei.tk','emz.net','enterto.com','ephemail.net','etranquil.com','etranquil.net','etranquil.org','evopo.com','example.com','explodemail.com','eyepaste.com','facebook-email.cf','facebook-email.ga','facebook-email.ml','facebookmail.gq','facebookmail.ml','fahr-zur-hoelle.org','fake-mail.cf','fake-mail.ga','fake-mail.ml','fakeinbox.cf','fakeinbox.com','fakeinbox.ga','fakeinbox.ml','fakeinbox.tk','fakeinformation.com','fakemail.fr','fakemailgenerator.com','fakemailz.com','falseaddress.com','fammix.com','fansworldwide.de','fantasymail.de','farifluset.mailexpire.com','fastacura.com','fastchevy.com','fastchrysler.com','fastkawasaki.com','fastmazda.com','fastmitsubishi.com','fastnissan.com','fastsubaru.com','fastsuzuki.com','fasttoyota.com','fastyamaha.com','fatflap.com','fdfdsfds.com','feinripptraeger.de','fettabernett.de','fightallspam.com','fiifke.de','filzmail.com','fishfuse.com','fixmail.tk','fizmail.com','fleckens.hu','flurred.com','flyspam.com','footard.com','forgetmail.com','fornow.eu','fr33mail.info','frapmail.com','free-email.cf','free-email.ga','freemail.ms','freemails.cf','freemails.ga','freemails.ml','freemeilaadressforall.net','freudenkinder.de','freundin.ru','friendlymail.co.uk','fromru.com','front14.org','fuckingduh.com','fudgerub.com','fux0ringduh.com','garliclife.com','gawab.com','gelitik.in','gentlemansclub.de','get-mail.cf','get-mail.ga','get-mail.ml','get-mail.tk','get1mail.com','get2mail.fr','getairmail.cf','getairmail.com','getairmail.ga','getairmail.gq','getairmail.ml','getairmail.tk','getmails.eu','getonemail.com','getonemail.net','ghosttexter.de','girlsundertheinfluence.com','gishpuppy.com','goemailgo.com','gold-profits.info','goldtoolbox.com','golfilla.info','gorillaswithdirtyarmpits.com','gotmail.com','gotmail.net','gotmail.org','gotti.otherinbox.com','gowikibooks.com','gowikicampus.com','gowikicars.com','gowikifilms.com','gowikigames.com','gowikimusic.com','gowikinetwork.com','gowikitravel.com','gowikitv.com','grandmamail.com','grandmasmail.com','great-host.in','greensloth.com','grr.la','gsrv.co.uk','guerillamail.biz','guerillamail.com','guerillamail.net','guerillamail.org','guerrillamail.biz','guerrillamail.com','guerrillamail.de','guerrillamail.info','guerrillamail.net','guerrillamail.org','guerrillamailblock.com','gustr.com','h.mintemail.com','h8s.org','hab-verschlafen.de','habmalnefrage.de','hacccc.com','haltospam.com','harakirimail.com','hartbot.de','hatespam.org','hellodream.mobi','herp.in','herr-der-mails.de','hidemail.de','hidzz.com','hmamail.com','hochsitze.com','home.de','hopemail.biz','hot-mail.cf','hot-mail.ga','hot-mail.gq','hot-mail.ml','hot-mail.tk','hotpop.com','hulapla.de','humn.ws.gy','hush.com','hushmail.com','ich-bin-verrueckt-nach-dir.de','ich-will-net.de','ieatspam.eu','ieatspam.info','ieh-mail.de','ihateyoualot.info','iheartspam.org','ikbenspamvrij.nl','imails.info','imgof.com','imstations.com','inbax.tk','inbox.si','inbox2.info','inboxalias.com','inboxclean.com','inboxclean.org','inboxproxy.com','incognitomail.com','incognitomail.net','incognitomail.org','inerted.com','inmail24.com','insorg-mail.info','instant-mail.de','instantemailaddress.com','ipoo.org','irish2me.com','iroid.com','ist-allein.info','ist-einmalig.de','ist-ganz-allein.de','ist-willig.de','iwi.net','izmail.net','jetable.com','jetable.de','jetable.fr.nf','jetable.net','jetable.org','jetfix.ee','jetzt-bin-ich-dran.com','jn-club.de','jnxjn.com','jobbikszimpatizans.hu','jourrapide.com','jsrsolutions.com','junk1e.com','junkmail.com','junkmail.ga','junkmail.gq','kaffeeschluerfer.com','kaffeeschluerfer.de','kasmail.com','kaspop.com','keepmymail.com','killmail.com','killmail.net','kimsdisk.com','kinglibrary.net','kingsq.ga','kir.ch.tc','klassmaster.com','klassmaster.net','klzlk.com','kommespaeter.de','kook.ml','koszmail.pl','krim.ws','kuh.mu','kulturbetrieb.info','kurzepost.de','l33r.eu','labetteraverouge.at','lackmail.net','lags.us','landmail.co','lass-es-geschehen.de','lastmail.co','lastmail.com','lazyinbox.com','letthemeatspam.com','lhsdv.com','liebt-dich.info','lifebyfood.com','link2mail.net','listomail.com','litedrop.com','loadby.us','login-email.cf','login-email.ga','login-email.ml','login-email.tk','lol.ovpn.to','lookugly.com','lopl.co.cc','lortemail.dk','lovemeleaveme.com','loveyouforever.de','lr7.us','lr78.com','lroid.com','luv2.us','m4ilweb.info','maboard.com','maennerversteherin.com','maennerversteherin.de','mail-filter.com','mail-temporaire.fr','mail.by','mail.htl22.at','mail.mezimages.net','mail.misterpinball.de','mail.svenz.eu','mail114.net','mail15.com','mail2rss.org','mail333.com','mail4days.com','mail4trash.com','mail4u.info','mailbidon.com','mailblocks.com','mailbucket.org','mailcat.biz','mailcatch.*','mailcatch.com','maildrop.cc','maildrop.cf','maildrop.ga','maildrop.gq','maildrop.ml','maildx.com','maileater.com','mailexpire.com','mailfa.tk','mailforspam.com','mailfree.ga','mailfree.gq','mailfree.ml','mailfreeonline.com','mailfs.com','mailguard.me','mailimate.com','mailin8r.com','mailinater.com','mailinator.com','mailinator.gq','mailinator.net','mailinator.org','mailinator.us','mailinator2.com','mailinblack.com','mailincubator.com','mailismagic.com','mailjunk.cf','mailjunk.ga','mailjunk.gq','mailjunk.ml','mailjunk.tk','mailmate.com','mailme.gq','mailme.ir','mailme.lv','mailme24.com','mailmetrash.com','mailmoat.com','mailnator.com','mailnesia.com','mailnull.com','mailpick.biz','mailproxsy.com','mailquack.com','mailrock.biz','mailsac.com','mailscrap.com','mailseal.de','mailshell.com','mailsiphon.com','mailslapping.com','mailslite.com','mailtemp.info','mailtothis.com','mailtrash.net','mailueberfall.de','mailzilla.com','mailzilla.org','mailzilla.orgmbx.cc','makemetheking.com','mamber.net','manifestgenerator.com','manybrain.com','mbx.cc','mciek.com','mega.zik.dj','meine-dateien.info','meine-diashow.de','meine-fotos.info','meine-urlaubsfotos.de','meinspamschutz.de','meltmail.com','messagebeamer.de','metaping.com','mezimages.net','mfsa.ru','mierdamail.com','migumail.com','mintemail.com','mjukglass.nu','mns.ru','moakt.com','mobi.web.id','mobileninja.co.uk','moburl.com','mohmal.com','moncourrier.fr.nf','monemail.fr.nf','monmail.fr.nf','monumentmail.com','ms9.mailslite.com','msa.minsmail.com','msh.mailslite.com','mt2009.com','mt2014.com','mufmail.com','muskelshirt.de','mx0.wwwnew.eu','my-mail.ch','my10minutemail.com','myadult.info','mycleaninbox.net','myemailboxy.com','mymail-in.net','mymailoasis.com','mynetstore.de','mypacks.net','mypartyclip.de','myphantomemail.com','myspaceinc.com','myspaceinc.net','myspaceinc.org','myspacepimpedup.com','myspamless.com','mytemp.email','mytempemail.com','mytop-in.net','mytrashmail.com','mytrashmail.compookmail.com','neomailbox.com','nepwk.com','nervmich.net','nervtmich.net','netmails.com','netmails.net','netterchef.de','netzidiot.de','neue-dateien.de','neverbox.com','nice-4u.com','nmail.cf','no-spam.ws','nobulk.com','noclickemail.com','nogmailspam.info','nomail.xl.cx','nomail2me.com','nomorespamemails.com','nonspam.eu','nonspammer.de','noref.in','nospam.wins.com.br','nospam.ze.tc','nospam4.us','nospamfor.us','nospammail.net','nospamthanks.info','notmailinator.com','notsharingmy.info','nowhere.org','nowmymail.com','ntlhelp.net','nullbox.info','nur-fuer-spam.de','nurfuerspam.de','nus.edu.sg','nwldx.com','nybella.com','objectmail.com','obobbo.com','odaymail.com','office-dateien.de','oikrach.com','one-time.email','oneoffemail.com','oneoffmail.com','onewaymail.com','online.ms','oopi.org','opayq.com','orangatango.com','ordinaryamerican.net','otherinbox.com','ourklips.com','outlawspam.com','ovpn.to','owlpic.com','pancakemail.com','paplease.com','partybombe.de','partyheld.de','pcusers.otherinbox.com','pepbot.com','pfui.ru','phreaker.net','pimpedupmyspace.com','pisem.net','pjjkp.com','pleasedontsendmespam.de','plexolan.de','poczta.onet.pl','politikerclub.de','polizisten-duzer.de','poofy.org','pookmail.com','pornobilder-mal-gratis.com','portsaid.cc','postacin.com','postfach.cc','privacy.net','privy-mail.com','privymail.de','proxymail.eu','prtnx.com','prtz.eu','prydirect.info','pryworld.info','public-files.de','punkass.com','put2.net','putthisinyourspamdatabase.com','pwrby.com','qasti.com','qisdo.com','qisoa.com','qq.com','quantentunnel.de','quickinbox.com','quickmail.nl','qv7.info','radiku.ye.vc','ralib.com','raubtierbaendiger.de','rcpt.at','reallymymail.com','receiveee.chickenkiller.com','receiveee.com','recode.me','reconmail.com','record.me','recursor.net','recyclemail.dk','regbypass.com','regbypass.comsafe-mail.net','rejectmail.com','remail.cf','remail.ga','rhyta.com','rk9.chickenkiller.com','rklips.com','rmqkr.net','rootprompt.org','royal.net','rppkn.com','rtrtr.com','ruffrey.com','s0ny.net','saeuferleber.de','safe-mail.net','safersignup.de','safetymail.info','safetypost.de','sags-per-mail.de','sandelf.de','satka.net','saynotospams.com','scatmail.com','schafmail.de','schmusemail.de','schreib-doch-mal-wieder.de','selfdestructingmail.com','selfdestructingmail.org','sendspamhere.com','senseless-entertainment.com','shared-files.de','sharedmailbox.org','sharklasers.com','shieldedmail.com','shiftmail.com','shinedyoureyes.com','shitmail.me','shitmail.org','shitware.nl','shortmail.net','showslow.de','sibmail.com','sinnlos-mail.de','siria.cc','siteposter.net','skeefmail.com','skeefmail.net','slaskpost.se','slave-auctions.net','slopsbox.com','slushmail.com','smashmail.de','smellfear.com','smellrear.com','sms.at','snakemail.com','sneakemail.com','snkmail.com','sofimail.com','sofort-mail.de','sofortmail.de','softpls.asia','sogetthis.com','sohu.com','soisz.com','solvemail.info','sonnenkinder.org','soodomail.com','soodonims.com','spam-be-gone.com','spam.la','spam.su','spam4.me','spamavert.com','spambob.com','spambob.net','spambob.org','spambog.*','spambog.com','spambog.de','spambog.net','spambog.ru','spambooger.com','spambox.info','spambox.irishspringrealty.com','spambox.us','spamcannon.com','spamcannon.net','spamcero.com','spamcon.org','spamcorptastic.com','spamcowboy.com','spamcowboy.net','spamcowboy.org','spamday.com','spamdecoy.net','spameater.com','spameater.org','spamex.com','spamfighter.cf','spamfighter.ga','spamfighter.gq','spamfighter.ml','spamfighter.tk','spamfree.eu','spamfree24.com','spamfree24.de','spamfree24.eu','spamfree24.info','spamfree24.net','spamfree24.org','spamgoes.in','spamgourmet.com','spamgourmet.net','spamgourmet.org','spamgrube.net','spamherelots.com','spamhereplease.com','spamhole.com','spamify.com','spaminator.de','spamkill.info','spaml.com','spaml.de','spammote.com','spammotel.com','spammuffel.de','spamobox.com','spamoff.de','spamreturn.com','spamsalad.in','spamslicer.com','spamspot.com','spamstack.net','spamthis.co.uk','spamthisplease.com','spamtrail.com','spamtroll.net','speed.1s.fr','sperke.net','spikio.com','spoofmail.de','squizzy.de','sriaus.com','ssoia.com','startkeys.com','stinkefinger.net','stop-my-spam.cf','stop-my-spam.com','stop-my-spam.ga','stop-my-spam.ml','stop-my-spam.tk','streber24.de','streetwisemail.com','stuffmail.de','super-auswahl.de','supergreatmail.com','supermailer.jp','superrito.com','superstachel.de','suremail.info','svk.jp','sweetville.net','sweetxxx.de','tafmail.com','tagesmail.eu','tagyourself.com','talkinator.com','tapchicuoihoi.com','teewars.org','teleworm.com','teleworm.us','temp-mail.com','temp-mail.org','temp.emeraldwebmail.com','temp.headstrong.de','tempail.com','tempalias.com','tempe-mail.com','tempemail.biz','tempemail.co.za','tempemail.com','tempemail.net','tempinbox.co.uk','tempinbox.com','tempmail.it','tempmail2.com','tempmaildemo.com','tempmailer.com','tempomail.fr','temporarily.de','temporarioemail.com.br','temporaryemail.net','temporaryemail.us','temporaryforwarding.com','temporaryinbox.com','tempsky.com','tempthe.net','tempymail.com','terminverpennt.de','test.com','test.de','thanksnospam.info','thankyou2010.com','thecloudindex.com','thepryam.info','thisisnotmyrealemail.com','throam.com','throwawayemailaddress.com','throwawaymail.com','tilien.com','tittbit.in','tmail.ws','tmailinator.com','toiea.com','toomail.biz','topmail-files.de','tortenboxer.de','totalmail.de','tradermail.info','trash-amil.com','trash-mail.at','trash-mail.cf','trash-mail.com','trash-mail.de','trash-mail.ga','trash-mail.gq','trash-mail.ml','trash-mail.tk','trash2009.com','trash2010.com','trash2011.com','trashbox.eu','trashdevil.com','trashdevil.de','trashemail.de','trashmail.at','trashmail.com','trashmail.de','trashmail.me','trashmail.net','trashmail.org','trashmail.ws','trashmailer.com','trashymail.com','trashymail.net','trayna.com','trbvm.com','trickmail.net','trillianpro.com','trimix.cn','tryalert.com','turboprinz.de','turboprinzessin.de','turual.com','twinmail.de','twoweirdtricks.com','tyldd.com','ubismail.net','uggsrock.com','uk2.net','ukr.net','umail.net','unmail.ru','unterderbruecke.de','upliftnow.com','uplipht.com','uroid.com','username.e4ward.com','valemail.net','venompen.com','verlass-mich-nicht.de','veryrealemail.com','vidchart.com','viditag.com','viewcastmedia.com','viewcastmedia.net','viewcastmedia.org','vinbazar.com','vollbio.de','volloeko.de','vomoto.com','vorsicht-bissig.de','vorsicht-scharf.de','vubby.com','walala.org','walkmail.net','war-im-urlaub.de','wbb3.de','webemail.me','webm4il.info','webmail4u.eu','webuser.in','wee.my','weg-werf-email.de','wegwerf-email-addressen.de','wegwerf-emails.de','wegwerfadresse.de','wegwerfemail.com','wegwerfemail.de','wegwerfmail.de','wegwerfmail.info','wegwerfmail.net','wegwerfmail.org','wegwerpmailadres.nl','weibsvolk.de','weibsvolk.org','weinenvorglueck.de','wetrainbayarea.com','wetrainbayarea.org','wh4f.org','whatiaas.com','whatpaas.com','whatsaas.com','whopy.com','whtjddn.33mail.com','whyspam.me','wickmail.net','wilemail.com','will-hier-weg.de','willhackforfood.biz','willselfdestruct.com','winemaven.info','wir-haben-nachwuchs.de','wir-sind-cool.org','wirsindcool.de','wmail.cf','wolke7.net','wollan.info','women-at-work.org','wormseo.cn','wronghead.com','wuzup.net','wuzupmail.net','www.e4ward.com','www.gishpuppy.com','www.mailinator.com','wwwnew.eu','xagloo.com','xemaps.com','xents.com','xmail.com','xmaily.com','xoxox.cc','xoxy.net','xsecurity.org','xyzfree.net','yapped.net','yeah.net','yep.it','yert.ye.vc','yesey.net','yogamaven.com','yomail.info','yopmail.com','yopmail.fr','yopmail.gq','yopmail.net','yopweb.com','youmail.ga','youmailr.com','ypmail.webarnak.fr.eu.org','ystea.org','yuurok.com','yzbid.com','za.com','zehnminutenmail.de','zetmail.com','zippymail.info','zoaxe.com','zoemail.com','zoemail.net','zoemail.org','zomg.info','zweb.in','zxcv.com','zxcvbnm.com','zzz.com');
31
+ public static $country = array('A1' =>'ANONYMOUS PROXY','A2' =>'SATELLITE PROVIDER','O1' =>'OTHER COUNTRY','AF' => 'AFGHANISTAN','AL' => 'ALBANIA','DZ' => 'ALGERIA','AS' => 'AMERICAN SAMOA','AD' => 'ANDORRA','AO' => 'ANGOLA','AI' => 'ANGUILLA','AQ' => 'ANTARCTICA','AG' => 'ANTIGUA AND BARBUDA','AR' => 'ARGENTINA','AM' => 'ARMENIA','AW' => 'ARUBA','AU' => 'AUSTRALIA','AT' => 'AUSTRIA','AZ' => 'AZERBAIJAN','BS' => 'BAHAMAS','BH' => 'BAHRAIN','BD' => 'BANGLADESH','BB' => 'BARBADOS','BY' => 'BELARUS','BE' => 'BELGIUM','BZ' => 'BELIZE','BJ' => 'BENIN','BM' => 'BERMUDA','BT' => 'BHUTAN','BO' => 'BOLIVIA','BA' => 'BOSNIA AND HERZEGOVINA','BW' => 'BOTSWANA','BV' => 'BOUVET ISLAND','BR' => 'BRAZIL','IO' => 'BRITISH INDIAN OCEAN TERRITORY','BN' => 'BRUNEI DARUSSALAM','BG' => 'BULGARIA','BF' => 'BURKINA FASO','BI' => 'BURUNDI','KH' => 'CAMBODIA','CM' => 'CAMEROON','CA' => 'CANADA','CV' => 'CAPE VERDE','KY' => 'CAYMAN ISLANDS','CF' => 'CENTRAL AFRICAN REPUBLIC','TD' => 'CHAD','CL' => 'CHILE','CN' => 'CHINA','CX' => 'CHRISTMAS ISLAND','CC' => 'COCOS (KEELING) ISLANDS','CO' => 'COLOMBIA','KM' => 'COMOROS','CG' => 'CONGO','CD' => 'CONGO, THE DEMOCRATIC REPUBLIC OF THE','CK' => 'COOK ISLANDS','CR' => 'COSTA RICA','CI' => 'COTE D IVOIRE','HR' => 'CROATIA','CU' => 'CUBA','CY' => 'CYPRUS','CZ' => 'CZECH REPUBLIC','DK' => 'DENMARK','DJ' => 'DJIBOUTI','DM' => 'DOMINICA','DO' => 'DOMINICAN REPUBLIC','TP' => 'EAST TIMOR','EC' => 'ECUADOR','EG' => 'EGYPT','SV' => 'EL SALVADOR','GQ' => 'EQUATORIAL GUINEA','ER' => 'ERITREA','EE' => 'ESTONIA','ET' => 'ETHIOPIA','FK' => 'FALKLAND ISLANDS (MALVINAS)','FO' => 'FAROE ISLANDS','FJ' => 'FIJI','FI' => 'FINLAND','FR' => 'FRANCE','GF' => 'FRENCH GUIANA','PF' => 'FRENCH POLYNESIA','TF' => 'FRENCH SOUTHERN TERRITORIES','GA' => 'GABON','GM' => 'GAMBIA','GE' => 'GEORGIA','DE' => 'GERMANY','GH' => 'GHANA','GI' => 'GIBRALTAR','GR' => 'GREECE','GL' => 'GREENLAND','GD' => 'GRENADA','GP' => 'GUADELOUPE','GU' => 'GUAM','GT' => 'GUATEMALA','GN' => 'GUINEA','GW' => 'GUINEA-BISSAU','GY' => 'GUYANA','HT' => 'HAITI','HM' => 'HEARD ISLAND AND MCDONALD ISLANDS','VA' => 'HOLY SEE (VATICAN CITY STATE)','HN' => 'HONDURAS','HK' => 'HONG KONG','HU' => 'HUNGARY','IS' => 'ICELAND','IN' => 'INDIA','ID' => 'INDONESIA','IR' => 'IRAN, ISLAMIC REPUBLIC OF','IQ' => 'IRAQ','IE' => 'IRELAND','IL' => 'ISRAEL','IT' => 'ITALY','JM' => 'JAMAICA','JP' => 'JAPAN','JO' => 'JORDAN','KZ' => 'KAZAKSTAN','KE' => 'KENYA','KI' => 'KIRIBATI','KP' => 'KOREA DEMOCRATIC PEOPLES REPUBLIC OF','KR' => 'KOREA REPUBLIC OF','KW' => 'KUWAIT','KG' => 'KYRGYZSTAN','LA' => 'LAO PEOPLES DEMOCRATIC REPUBLIC','LV' => 'LATVIA','LB' => 'LEBANON','LS' => 'LESOTHO','LR' => 'LIBERIA','LY' => 'LIBYAN ARAB JAMAHIRIYA','LI' => 'LIECHTENSTEIN','LT' => 'LITHUANIA','LU' => 'LUXEMBOURG','MO' => 'MACAU','MK' => 'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF','MG' => 'MADAGASCAR','MW' => 'MALAWI','MY' => 'MALAYSIA','MV' => 'MALDIVES','ML' => 'MALI','MT' => 'MALTA','MH' => 'MARSHALL ISLANDS','MQ' => 'MARTINIQUE','MR' => 'MAURITANIA','MU' => 'MAURITIUS','YT' => 'MAYOTTE','MX' => 'MEXICO','FM' => 'MICRONESIA, FEDERATED STATES OF','MD' => 'MOLDOVA, REPUBLIC OF','MC' => 'MONACO','MN' => 'MONGOLIA','MS' => 'MONTSERRAT','MA' => 'MOROCCO','MZ' => 'MOZAMBIQUE','MM' => 'MYANMAR','NA' => 'NAMIBIA','NR' => 'NAURU','NP' => 'NEPAL','NL' => 'NETHERLANDS','AN' => 'NETHERLANDS ANTILLES','NC' => 'NEW CALEDONIA','NZ' => 'NEW ZEALAND','NI' => 'NICARAGUA','NE' => 'NIGER','NG' => 'NIGERIA','NU' => 'NIUE','NF' => 'NORFOLK ISLAND','MP' => 'NORTHERN MARIANA ISLANDS','NO' => 'NORWAY','OM' => 'OMAN','PK' => 'PAKISTAN','PW' => 'PALAU','PS' => 'PALESTINIAN TERRITORY, OCCUPIED','PA' => 'PANAMA','PG' => 'PAPUA NEW GUINEA','PY' => 'PARAGUAY','PE' => 'PERU','PH' => 'PHILIPPINES','PN' => 'PITCAIRN','PL' => 'POLAND','PT' => 'PORTUGAL','PR' => 'PUERTO RICO','QA' => 'QATAR','RE' => 'REUNION','RO' => 'ROMANIA','RU' => 'RUSSIAN FEDERATION','RW' => 'RWANDA','SH' => 'SAINT HELENA','KN' => 'SAINT KITTS AND NEVIS','LC' => 'SAINT LUCIA','PM' => 'SAINT PIERRE AND MIQUELON','VC' => 'SAINT VINCENT AND THE GRENADINES','WS' => 'SAMOA','SM' => 'SAN MARINO','ST' => 'SAO TOME AND PRINCIPE','SA' => 'SAUDI ARABIA','SN' => 'SENEGAL','SC' => 'SEYCHELLES','SL' => 'SIERRA LEONE','SG' => 'SINGAPORE','SK' => 'SLOVAKIA','SI' => 'SLOVENIA','SB' => 'SOLOMON ISLANDS','SO' => 'SOMALIA','ZA' => 'SOUTH AFRICA','GS' => 'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS','ES' => 'SPAIN','LK' => 'SRI LANKA','SD' => 'SUDAN','SR' => 'SURINAME','SJ' => 'SVALBARD AND JAN MAYEN','SZ' => 'SWAZILAND','SE' => 'SWEDEN','CH' => 'SWITZERLAND','SY' => 'SYRIAN ARAB REPUBLIC','TW' => 'TAIWAN, PROVINCE OF CHINA','TJ' => 'TAJIKISTAN','TZ' => 'TANZANIA, UNITED REPUBLIC OF','TH' => 'THAILAND','TG' => 'TOGO','TK' => 'TOKELAU','TO' => 'TONGA','TT' => 'TRINIDAD AND TOBAGO','TN' => 'TUNISIA','TR' => 'TURKEY','TM' => 'TURKMENISTAN','TC' => 'TURKS AND CAICOS ISLANDS','TV' => 'TUVALU','UG' => 'UGANDA','UA' => 'UKRAINE','AE' => 'UNITED ARAB EMIRATES','GB' => 'UNITED KINGDOM','US' => 'UNITED STATES','UM' => 'UNITED STATES MINOR OUTLYING ISLANDS','UY' => 'URUGUAY','UZ' => 'UZBEKISTAN','VU' => 'VANUATU','VE' => 'VENEZUELA','VN' => 'VIET NAM','VG' => 'VIRGIN ISLANDS, BRITISH','VI' => 'VIRGIN ISLANDS, U.S.','WF' => 'WALLIS AND FUTUNA','EH' => 'WESTERN SAHARA','YE' => 'YEMEN','YU' => 'YUGOSLAVIA','ZM' => 'ZAMBIA','ZW' => 'ZIMBABWE');
32
+
33
+ const RECAPTCHA_VERIFY = 'https://www.google.com/recaptcha/api/siteverify';
34
+
35
+ const LOGIN_ATTEMPTS_EXCEEDED = "User exceeded allowed login attempts.";
36
+ const BLOCKED_BY_ADMIN = "Blocked by Admin";
37
+ const IP_RANGE_BLOCKING = "IP Range Blocking";
38
+ const FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP = "Failed login attempts from new IP.";
39
+ const LOGGED_IN_FROM_NEW_IP = "Logged in from new IP.";
40
+
41
+ function __construct()
42
+ {
43
+ $this->define_global();
44
+ }
45
+
46
+ function define_global()
47
+ {
48
+ global $wpnsDbQueries,$moWpnsUtility,$dirName,$Mo2fdbQueries;
49
+ $wpnsDbQueries = new MoWpnsDB();
50
+ $moWpnsUtility = new MoWpnsUtility();
51
+ $dirName = dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR;
52
+ $Mo2fdbQueries = new Mo2fDB();
53
+ }
54
+
55
+ }
56
+ new MoWpnsConstants;
57
+
58
+ ?>
helper/curl.php ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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' => 'miniOrange 2-Factor',
12
+ 'firstname' => $first_name,
13
+ 'lastname' => $last_name,
14
+ 'email' => $email,
15
+ 'phone' => $phone,
16
+ 'password' => $password
17
+ );
18
+ $json = json_encode($fields);
19
+ $response = self::callAPI($url, $json);
20
+ return $response;
21
+ }
22
+
23
+ public static function get_customer_key($email, $password)
24
+ {
25
+ $url = MoWpnsConstants::HOST_NAME. "/moas/rest/customer/key";
26
+ $fields = array (
27
+ 'email' => $email,
28
+ 'password' => $password
29
+ );
30
+ $json = json_encode($fields);
31
+ $response = self::callAPI($url, $json);
32
+ return $response;
33
+ }
34
+
35
+ function submit_contact_us( $q_email, $q_phone, $query )
36
+ {
37
+ $current_user = wp_get_current_user();
38
+ $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/contact-us";
39
+ $query = '[WP Network Security]: ' . $query;
40
+ $fields = array(
41
+ 'firstName' => $current_user->user_firstname,
42
+ 'lastName' => $current_user->user_lastname,
43
+ 'company' => $_SERVER['SERVER_NAME'],
44
+ 'email' => $q_email,
45
+ 'ccEmail' => '2fasupport@xecurify.com',
46
+ 'phone' => $q_phone,
47
+ 'query' => $query
48
+ );
49
+ $field_string = json_encode( $fields );
50
+ $response = self::callAPI($url, $field_string);
51
+
52
+ return true;
53
+ }
54
+
55
+ function lookupIP($ip)
56
+ {
57
+ $url = MoWpnsConstants::HOST_NAME. "/moas/rest/security/iplookup";
58
+ $fields = array (
59
+ 'ip' => $ip
60
+ );
61
+ $json = json_encode($fields);
62
+ $response = self::callAPI($url, $json);
63
+ return $response;
64
+ }
65
+
66
+
67
+
68
+ function validate_recaptcha($ip,$response)
69
+ {
70
+ $url = MoWpnsConstants::RECAPTCHA_VERIFY;
71
+ $json = "";
72
+ $fields = array(
73
+ 'response' => $response,
74
+ 'secret' => get_option('mo_wpns_recaptcha_secret_key'),
75
+ 'remoteip' => $ip
76
+ );
77
+ foreach($fields as $key=>$value) { $json .= $key.'='.$value.'&'; }
78
+ rtrim($json, '&');
79
+ $response = self::callAPI($url, $json, null);
80
+ return $response;
81
+ }
82
+
83
+
84
+
85
+ function check_customer($email)
86
+ {
87
+ $url = MoWpnsConstants::HOST_NAME . "/moas/rest/customer/check-if-exists";
88
+ $fields = array(
89
+ 'email' => $email,
90
+ );
91
+ $json = json_encode($fields);
92
+ $response = self::callAPI($url, $json);
93
+ return $response;
94
+ }
95
+
96
+ function mo_wpns_forgot_password()
97
+ {
98
+
99
+ $url = MoWpnsConstants::HOST_NAME . '/moas/rest/customer/password-reset';
100
+ $email = get_option('mo2f_email');
101
+ $customerKey = get_option('mo2f_customerKey');
102
+ $apiKey = get_option('mo2f_api_key');
103
+
104
+ $fields = array(
105
+ 'email' => $email
106
+ );
107
+
108
+ $json = json_encode($fields);
109
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
110
+ $response = self::callAPI($url, $json, $authHeader);
111
+ return $response;
112
+ }
113
+
114
+ function send_notification($toEmail,$subject,$content,$fromEmail,$fromName,$toName)
115
+ {
116
+ $headers = "MIME-Version: 1.0" . "\r\n";
117
+ $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
118
+
119
+ $headers .= 'From: '.$fromName.'<'.$fromEmail.'>' . "\r\n";
120
+ //$headers .= 'Cc: cc@example.com' . "\r\n";
121
+
122
+ mail($toEmail,$subject,$content,$headers);
123
+
124
+ return json_encode(array("status"=>'SUCCESS','statusMessage'=>'SUCCESS'));
125
+ }
126
+
127
+ //added for feedback
128
+
129
+ function send_email_alert($email,$phone,$message){
130
+
131
+ $url = MoWpnsConstants::HOST_NAME . '/moas/api/notify/send';
132
+ $customerKey = MoWpnsConstants::DEFAULT_CUSTOMER_KEY;
133
+ $apiKey = MoWpnsConstants::DEFAULT_API_KEY;
134
+ $fromEmail = 'no-reply@xecurify.com';
135
+ $subject = "Feedback: WordPress miniOrange 2-Factor Plugin";
136
+
137
+ global $user;
138
+ $user = wp_get_current_user();
139
+
140
+ $is_nc_with_1_user = get_option( 'mo2f_is_NC' ) && get_option( 'mo2f_is_NNC' );
141
+ $is_ec_with_1_user = ! get_option( 'mo2f_is_NC' );
142
+
143
+
144
+ $customer_feature = "";
145
+
146
+ if ( $is_ec_with_1_user ) {
147
+ $customer_feature = "V1";
148
+ }else if ( $is_nc_with_1_user ) {
149
+ $customer_feature = "V3";
150
+ }
151
+
152
+ $query = '[WordPress 2 Factor Authentication Plugin: ' . $customer_feature . ' - V '.MO2F_VERSION.']: ' . $message;
153
+
154
+
155
+ $content='<div >Hello, <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>';
156
+
157
+
158
+ $fields = array(
159
+ 'customerKey' => $customerKey,
160
+ 'sendEmail' => true,
161
+ 'email' => array(
162
+ 'customerKey' => $customerKey,
163
+ 'fromEmail' => $fromEmail,
164
+ 'fromName' => 'Xecurify',
165
+ 'toEmail' => '2fasupport@xecurify.com',
166
+ 'toName' => '2fasupport@xecurify.com',
167
+ 'subject' => $subject,
168
+ 'content' => $content
169
+ ),
170
+ );
171
+ $field_string = json_encode($fields);
172
+ $authHeader = $this->createAuthHeader($customerKey,$apiKey);
173
+ $response = self::callAPI($url, $field_string,$authHeader);
174
+ return $response;
175
+
176
+ }
177
+
178
+
179
+ private static function createAuthHeader($customerKey, $apiKey) {
180
+ $currentTimestampInMillis = round(microtime(true) * 1000);
181
+ $currentTimestampInMillis = number_format($currentTimestampInMillis, 0, '', '');
182
+
183
+ $stringToHash = $customerKey . $currentTimestampInMillis . $apiKey;
184
+ $authHeader = hash("sha512", $stringToHash);
185
+
186
+ $header = array (
187
+ "Content-Type: application/json",
188
+ "Customer-Key: $customerKey",
189
+ "Timestamp: $currentTimestampInMillis",
190
+ "Authorization: $authHeader"
191
+ );
192
+ return $header;
193
+ }
194
+
195
+
196
+ private static function callAPI($url, $json_string, $headers = array("Content-Type: application/json")) {
197
+ //For testing (0, false)
198
+ //For Production (1, true)
199
+
200
+ $sslhost=0;
201
+ $sslpeer=false;
202
+
203
+ $ch = curl_init($url);
204
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
205
+ curl_setopt($ch, CURLOPT_ENCODING, "");
206
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
207
+ curl_setopt($ch, CURLOPT_AUTOREFERER, true);
208
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $sslhost );
209
+
210
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $sslpeer );
211
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
212
+ if(!is_null($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
213
+ curl_setopt($ch, CURLOPT_POST, true);
214
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $json_string);
215
+ $content = curl_exec($ch);
216
+
217
+ if (curl_errno($ch)) {
218
+ echo 'Request Error:' . curl_error($ch);
219
+ exit();
220
+ }
221
+
222
+ curl_close($ch);
223
+ return $content;
224
+ }
225
+ }
helper/messages.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MoWpnsMessages
4
+ {
5
+ // ip-blocking messages
6
+ const INVALID_IP = "Please enter a valid IP address.";
7
+ const IP_ALREADY_BLOCKED = "IP Address is already Blocked";
8
+ const IP_PERMANENTLY_BLOCKED = "IP Address is blocked permanently.";
9
+ const IP_ALREADY_WHITELISTED = "IP Address is already Whitelisted.";
10
+ const IP_IN_WHITELISTED = "IP Address is Whitelisted. Please remove it from the whitelisted list.";
11
+ const IP_UNBLOCKED = "IP has been unblocked successfully";
12
+ const IP_WHITELISTED = "IP has been whitelisted successfully";
13
+ const IP_UNWHITELISTED = "IP has been removed from the whitelisted list successfully";
14
+
15
+ //login-security messages
16
+ const BRUTE_FORCE_ENABLED = "Brute force protection is enabled.";
17
+ const BRUTE_FORCE_DISABLED = "Brute force protection is disabled.";
18
+ const DOS_ENABLED = "DOS protection enabled.";
19
+ const DOS_DISABLED = "DOS protection disabled.";
20
+ const TWOFA_ENABLED = "Two Factor protection has been enabled.";
21
+ const TWOFA_DISABLED = "Two Factor protection has been disabled.";
22
+ const RBA_ENABLED = "Mobile Authentication and Risk based access is Enabled.";
23
+ const RBA_DISABLED = "Risk based access is Disabled.";
24
+ const RECAPTCHA_ENABLED = "Google reCAPTCHA configuration is enabled.";
25
+ const RECAPTCHA_DISABLED = "Google reCAPTCHA configuration is disabled.";
26
+ const STRONG_PASS_ENABLED = "Strong Password has been enabled for your users.";
27
+ const STRONG_PASS_DISABLED = "Strong Password has been disabled for your users.";
28
+
29
+ //notification messages
30
+ const NOTIFY_ON_IP_BLOCKED = "Email notification is enabled for Admin.";
31
+ const DONOT_NOTIFY_ON_IP_BLOCKED = "Email notification is disabled for Admin.";
32
+ const NOTIFY_ON_UNUSUAL_ACTIVITY = "Email notification is enabled for user for unusual activities.";
33
+ const DONOT_NOTIFY_ON_UNUSUAL_ACTIVITY = "Email notification is disabled for user for unusual activities.";
34
+
35
+ //registration security
36
+ const DOMAIN_BLOCKING_ENABLED = "Blocking fake user registrations is Enabled.";
37
+ const DOMAIN_BLOCKING_DISABLED = "Blocking fake user registration is disabled";
38
+ const ENFORCE_STRONG_PASSWORD = "Strong password enforcement is Enabled.";
39
+ const ENFORCE_STRONG_PASS_DISABLED = "Strong password enforcement is Disabled.";
40
+ const ENABLE_ADVANCED_USER_VERIFY = "Advanced user verification is Enabled.";
41
+ const DISABLE_ADVANCED_USER_VERIFY = "Advanced user verification is Disable.";
42
+ const ENABLE_SOCIAL_LOGIN = "Social Login Integration is Enabled.";
43
+ const DISABLE_SOCIAL_LOGIN = "Social Login Integration is Disabled.";
44
+
45
+ //Advanced security
46
+ const HTACCESS_ENABLED = "htaccess security has been enabled";
47
+ const HTACCESS_DISABLED = "htaccess security has been disabled";
48
+ const USER_AGENT_BLOCK_ENABLED = "User Agent has block been enabled";
49
+ const USER_AGENT_BLOCK_DISABLED = "User Agent has block been disabled";
50
+ const INVALID_IP_FORMAT = "Please enter Valid IP Range.";
51
+ //content protection
52
+ const CONTENT_PROTECTION_ENABLED = "Your configuration for Content Protection has been saved.";
53
+ const CONTENT_SPAM_BLOCKING = "Protection for Comment SPAM has been enabled.";
54
+ const CONTENT_RECAPTCHA = "reCAPTCHA has been enabled for Comments.";
55
+ const CONTENT_SPAM_BLOCKING_DISABLED = "Protection for Comment SPAM has been disabled.";
56
+ const CONTENT_RECAPTCHA_DISABLED = "reCAPTCHA has been disabled for Comments.";
57
+
58
+ //support form
59
+ const SUPPORT_FORM_VALUES = "Please submit your query along with email.";
60
+ const SUPPORT_FORM_SENT = "Thanks for getting in touch! We shall get back to you shortly.";
61
+ const SUPPORT_FORM_ERROR = "Your query could not be submitted. Please try again.";
62
+ //feedback Form
63
+ const DEACTIVATE_PLUGIN = "Plugin deactivated successfully";
64
+
65
+ //common messages
66
+ const UNKNOWN_ERROR = "Error processing your request. Please try again.";
67
+ const CONFIG_SAVED = "Configuration saved successfully.";
68
+ const REQUIRED_FIELDS = "Please enter all the required fields";
69
+ const RESET_PASS = "You password has been reset successfully and sent to your registered email. Please check your mailbox.";
70
+ const TEMPLATE_SAVED = "Email template saved.";
71
+ const FEEDBACK = "<div class='custom-notice notice notice-warning feedback-notice'><p><p class='notice-message'>Looking for a feature? Help us make the plugin better. Send us your feedback using the Support Form below.</p><button class='feedback notice-button'><i>Dismiss</i></button></p></div>";
72
+ const WHITELIST_SELF = "<div class='custom-notice notice notice-warning whitelistself-notice'><p><p class='notice-message'>It looks like you have not whitelisted your IP. Whitelist your IP as you can get blocked from your site.</p><button class='whitelist_self notice-button'><i>WhiteList</i></button></p></div>";
73
+
74
+ //registration messages
75
+ const PASS_LENGTH = "Choose a password with minimum length 6.";
76
+ const ERR_OTP_EMAIL = "There was an error in sending email. Please click on Resend OTP to try again.";
77
+ const OTP_SENT = 'A passcode is sent to {{method}}. Please enter the otp below.';
78
+ const REG_SUCCESS = 'Your account has been retrieved successfully.';
79
+ const ACCOUNT_EXISTS = 'You already have an account with miniOrange. Please enter a valid password.';
80
+ const INVALID_CRED = 'Invalid username or password. Please try again.';
81
+ const REQUIRED_OTP = 'Please enter a value in OTP field.';
82
+ const INVALID_OTP = 'Invalid one time passcode. Please enter a valid passcode.';
83
+ const INVALID_PHONE = 'Please enter the phone number in the following format: <b>+##country code## ##phone number##';
84
+ const PASS_MISMATCH = 'Password and Confirm Password do not match.';
85
+ const CRON_DB_BACKUP_ENABLE = 'Scheduled Database Backup enabled';
86
+ const CRON_DB_BACKUP_DISABLE = 'Scheduled Database Backup disabled';
87
+ const CRON_FILE_BACKUP_ENABLE = 'Scheduled File Backup enabled';
88
+ const CRON_FILE_BACKUP_DISABLE = 'Scheduled File Backup disabled';
89
+ const BACKUP_CREATED = 'Backup created successfully';
90
+ const WARNING = 'Please select folder for backup';
91
+ const INVALID_EMAIL = 'Please enter valid Email ID';
92
+ const EMAIL_SAVED = 'Email ID saved successfully';
93
+ const INVALID_HOURS = 'For scheduled backup, please enter number of hours greater than 1.';
94
+
95
+
96
+ public static function showMessage($message , $data=array())
97
+ {
98
+ $message = constant( "self::".$message );
99
+ foreach($data as $key => $value)
100
+ {
101
+ $message = str_replace("{{" . $key . "}}", $value , $message);
102
+ }
103
+ return $message;
104
+ }
105
+
106
+ }
107
+
108
+ ?>
helper/pluginUtility.php ADDED
@@ -0,0 +1,499 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /** Copyright (C) 2015 miniOrange
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>
16
+ * @package miniOrange OAuth
17
+ * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
18
+ *
19
+ **/
20
+
21
+
22
+ // need to have different classes here for each ipblocking, whitelisting, htaccess and transaction related functions
23
+ class MoWpnsHandler
24
+ {
25
+
26
+ function is_ip_blocked($ipAddress)
27
+ {
28
+ global $wpnsDbQueries;
29
+ if(empty($ipAddress))
30
+ return false;
31
+
32
+ $user_count = $wpnsDbQueries->get_ip_blocked_count($ipAddress);
33
+
34
+ if($user_count)
35
+ $user_count = intval($user_count);
36
+ if($user_count>0)
37
+ return true;
38
+
39
+ return false;
40
+ }
41
+ function get_blocked_attacks_count($attackName)
42
+ {
43
+ global $wpnsDbQueries;
44
+ $attackCount = $wpnsDbQueries->get_blocked_attack_count($attackName);
45
+ if($attackCount)
46
+ $attackCount = intval($attackCount);
47
+ return $attackCount;
48
+ }
49
+ function get_blocked_countries()
50
+ {
51
+ $countrycodes = get_option('mo_wpns_countrycodes');
52
+ $countries = explode(';', $countrycodes);
53
+ return sizeof($countries)-1;
54
+ }
55
+ function get_blocked_ip_waf()
56
+ {
57
+ global $wpnsDbQueries;
58
+ $ip_count = $wpnsDbQueries->get_total_blocked_ips_waf();
59
+ if($ip_count)
60
+ $ip_count = intval($ip_count);
61
+
62
+ return $ip_count;
63
+ }
64
+ function get_manual_blocked_ip_count()
65
+ {
66
+ global $wpnsDbQueries;
67
+ $ip_count = $wpnsDbQueries->get_total_manual_blocked_ips();
68
+ if($ip_count)
69
+ $ip_count = intval($ip_count);
70
+
71
+ return $ip_count;
72
+ }
73
+ function get_blocked_ips()
74
+ {
75
+ global $wpnsDbQueries;
76
+ return $wpnsDbQueries->get_blocked_ip_list();
77
+ }
78
+ function get_blocked_sqli()
79
+ {
80
+ global $wpnsDbQueries;
81
+ return $wpnsDbQueries->get_blocked_sqli_list();
82
+ }
83
+ function get_blocked_rfi()
84
+ {
85
+ global $wpnsDbQueries;
86
+ return $wpnsDbQueries->get_blocked_rfi_list();
87
+ }
88
+ function get_blocked_lfi()
89
+ {
90
+ global $wpnsDbQueries;
91
+ return $wpnsDbQueries->get_blocked_lfi_list();
92
+ }
93
+ function get_blocked_rce()
94
+ {
95
+ global $wpnsDbQueries;
96
+ return $wpnsDbQueries->get_blocked_rce_list();
97
+ }
98
+ function get_blocked_xss()
99
+ {
100
+ global $wpnsDbQueries;
101
+ return $wpnsDbQueries->get_blocked_xss_list();
102
+ }
103
+
104
+ function block_ip($ipAddress, $reason, $permenently)
105
+ {
106
+ global $wpnsDbQueries;
107
+ if(empty($ipAddress))
108
+ return;
109
+ if($this->is_ip_blocked($ipAddress))
110
+ return;
111
+ $blocked_for_time = null;
112
+ if(!$permenently && get_option('mo2f_time_of_blocking_type'))
113
+ {
114
+ $blocking_type = get_option('mo2f_time_of_blocking_type');
115
+ $time_of_blocking_val = 3;
116
+ if(get_option('mo2f_time_of_blocking_val'))
117
+ $time_of_blocking_val = get_option('mo2f_time_of_blocking_val');
118
+ if($blocking_type=="months")
119
+ $blocked_for_time = current_time( 'timestamp' )+$time_of_blocking_val * 30 * 24 * 60 * 60;
120
+ else if($blocking_type=="days")
121
+ $blocked_for_time = current_time( 'timestamp' )+$time_of_blocking_val * 24 * 60 * 60;
122
+ else if($blocking_type=="hours")
123
+ $blocked_for_time = current_time( 'timestamp' )+$time_of_blocking_val * 60 * 60;
124
+ }
125
+
126
+ if(get_option('mo_wpns_enable_htaccess_blocking'))
127
+ {
128
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
129
+ $f = fopen($base.DIRECTORY_SEPARATOR.".htaccess", "a");
130
+ fwrite($f, "\ndeny from ".trim($ipAddress));
131
+ fclose($f);
132
+ }
133
+
134
+ $wpnsDbQueries->insert_blocked_ip($ipAddress, $reason,$blocked_for_time);
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
+ }
142
+
143
+ function unblock_ip_entry($entryid)
144
+ {
145
+ global $wpnsDbQueries;
146
+ $myrows = $wpnsDbQueries->get_blocked_ip($entryid);
147
+ if(count($myrows)>0)
148
+ if(get_option('mo_wpns_enable_htaccess_blocking'))
149
+ {
150
+ $ip_address = $myrows[0]->ip_address;
151
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
152
+ $hpath = $base.DIRECTORY_SEPARATOR.".htaccess";
153
+ $contents = file_get_contents($hpath);
154
+ if (strpos($contents, "\ndeny from ".trim($ip_address)) !== false)
155
+ {
156
+ $contents = str_replace("\ndeny from ".trim($ip_address), '', $contents);
157
+ file_put_contents($hpath, $contents);
158
+ }
159
+ }
160
+
161
+ $wpnsDbQueries->delete_blocked_ip($entryid);
162
+ }
163
+
164
+ function remove_htaccess_ips()
165
+ {
166
+ global $wpnsDbQueries;
167
+ $myrows = $wpnsDbQueries->get_blocked_ip_list();
168
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
169
+ $hpath = $base.DIRECTORY_SEPARATOR.".htaccess";
170
+ $contents = file_get_contents($hpath);
171
+ $changed = 0;
172
+ foreach($myrows as $row)
173
+ {
174
+ $ip_address = $row->ip_address;
175
+ if (strpos($contents, "\ndeny from ".trim($ip_address)) !== false)
176
+ {
177
+ $contents = str_replace("\ndeny from ".trim($ip_address), '', $contents);
178
+ $changed = 1;
179
+ }
180
+ }
181
+ if($changed==1)
182
+ file_put_contents($hpath, $contents);
183
+ }
184
+
185
+ function add_htaccess_ips()
186
+ {
187
+ global $wpnsDbQueries;
188
+ $myrows = $wpnsDbQueries->get_blocked_ip_list();
189
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
190
+ $hpath = $base.DIRECTORY_SEPARATOR.".htaccess";
191
+ $contents = file_get_contents($hpath);
192
+ $f = fopen($hpath, "a");
193
+ foreach($myrows as $row)
194
+ {
195
+ $ip_address = $row->ip_address;
196
+ if (strpos($contents, "\ndeny from ".trim($ip_address)) === false)
197
+ fwrite($f, "\ndeny from ".trim($ip_address));
198
+ }
199
+ fclose($f);
200
+ }
201
+
202
+
203
+ function is_whitelisted($ipAddress)
204
+ {
205
+ global $wpnsDbQueries;
206
+ $count = $wpnsDbQueries->get_whitelisted_ip_count($ipAddress);
207
+
208
+ if(empty($ipAddress))
209
+ return false;
210
+ if($count)
211
+ $count = intval($count);
212
+
213
+ if($count>0)
214
+ return true;
215
+ return false;
216
+ }
217
+
218
+ function whitelist_ip($ipAddress)
219
+ {
220
+ global $wpnsDbQueries;
221
+ if(get_option('mo_wpns_enable_htaccess_blocking'))
222
+ {
223
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
224
+ $hpath = $base.DIRECTORY_SEPARATOR.".htaccess";
225
+ $contents = file_get_contents($hpath);
226
+ if (strpos($contents, "\ndeny from ".trim($ipAddress)) !== false)
227
+ {
228
+ $contents = str_replace("\ndeny from ".trim($ipAddress), '', $contents);
229
+ file_put_contents($hpath, $contents);
230
+ }
231
+ }
232
+
233
+ if(empty($ipAddress))
234
+ return;
235
+ if($this->is_whitelisted($ipAddress))
236
+ return;
237
+
238
+ $wpnsDbQueries->insert_whitelisted_ip($ipAddress);
239
+ }
240
+
241
+ function update_htaccess_configuration()
242
+ {
243
+ $base = dirname(dirname(dirname(dirname(dirname(__FILE__)))));
244
+ $htaccesspath = $base.DIRECTORY_SEPARATOR.".htaccess";
245
+ if(!file_exists($htaccesspath)){
246
+ $f = fopen($base.DIRECTORY_SEPARATOR.".htaccess", "a");
247
+ fwrite($f, "# BEGIN WordPress\r\n<IfModule mod_rewrite.c>\r\nRewriteEngine On\r\nRewriteBase /\r\nRewriteRule ^index\.php$ - [L]\r\nRewriteCond %{REQUEST_FILENAME} !-f\r\nRewriteCond %{REQUEST_FILENAME} !-d\r\nRewriteRule . /index.php [L]\r\n</IfModule>\r\n# END WordPress");
248
+ fclose($f);
249
+ }
250
+ $this->change_wp_config_protection($base);
251
+ $this->change_content_protection($base);
252
+ $this->mo2f_change_htaccess_file($htaccesspath);
253
+ }
254
+
255
+ function mo2f_change_htaccess_file($htaccesspath){
256
+ $contents = file_get_contents($htaccesspath);
257
+ if (strpos($contents, "\r\n<files ~ \"^.*\.([Hh][Tt][Aa])\">\r\norder allow,deny\r\ndeny from all\r\nsatisfy all\r\n</files>") !== false) {
258
+ if(!get_option('mo2f_htaccess_file')){
259
+ $contents = str_replace("\r\n<files ~ \"^.*\.([Hh][Tt][Aa])\">\r\norder allow,deny\r\ndeny from all\r\nsatisfy all\r\n</files>", '', $contents);
260
+ file_put_contents($htaccesspath, $contents);
261
+ }
262
+ } else {
263
+ if(get_option('mo2f_htaccess_file')){
264
+ $f = fopen($htaccesspath, "a");
265
+ fwrite($f, "\r\n<files ~ \"^.*\.([Hh][Tt][Aa])\">\r\norder allow,deny\r\ndeny from all\r\nsatisfy all\r\n</files>");
266
+ fclose($f);
267
+ }
268
+ }
269
+ }
270
+
271
+ function change_wp_config_protection($base)
272
+ {
273
+ $htaccesspath = $base.DIRECTORY_SEPARATOR.".htaccess";
274
+ $contents = file_get_contents($htaccesspath);
275
+ if (strpos($contents, "\n<files wp-config.php>\norder allow,deny\ndeny from all\n</files>") !== false)
276
+ {
277
+ if(!get_option('mo2f_protect_wp_config'))
278
+ {
279
+ $contents = str_replace("\n<files wp-config.php>\norder allow,deny\ndeny from all\n</files>", '', $contents);
280
+ file_put_contents($htaccesspath, $contents);
281
+ }
282
+ }
283
+ else
284
+ {
285
+ if(get_option('mo2f_protect_wp_config'))
286
+ {
287
+ $f = fopen($base.DIRECTORY_SEPARATOR.".htaccess", "a");
288
+ fwrite($f, "\n<files wp-config.php>\norder allow,deny\ndeny from all\n</files>");
289
+ fclose($f);
290
+ }
291
+ }
292
+ }
293
+
294
+ function change_content_protection($base)
295
+ {
296
+ $htaccesspath = $base.DIRECTORY_SEPARATOR.".htaccess";
297
+ $contents = file_get_contents($htaccesspath);
298
+ if (strpos($contents, "\nOptions All -Indexes") !== false)
299
+ {
300
+ if(!get_option('mo2f_prevent_directory_browsing'))
301
+ {
302
+ $contents = str_replace("\nOptions All -Indexes", '', $contents);
303
+ file_put_contents($htaccesspath, $contents);
304
+ }
305
+ }
306
+ else
307
+ {
308
+ if(get_option('mo2f_prevent_directory_browsing'))
309
+ {
310
+ $f = fopen($base.DIRECTORY_SEPARATOR.".htaccess", "a");
311
+ fwrite($f, "\nOptions All -Indexes");
312
+ fclose($f);
313
+ }
314
+ }
315
+ }
316
+
317
+ function remove_whitelist_entry($entryid)
318
+ {
319
+ global $wpnsDbQueries;
320
+ $wpnsDbQueries->delete_whitelisted_ip($entryid);
321
+ }
322
+
323
+ function get_whitelisted_ips()
324
+ {
325
+ global $wpnsDbQueries;
326
+ return $wpnsDbQueries->get_whitelisted_ips_list();
327
+ }
328
+
329
+ function is_email_sent_to_user($username, $ipAddress)
330
+ {
331
+ global $wpnsDbQueries;
332
+ if(empty($ipAddress))
333
+ return false;
334
+ $sent_count = $wpnsDbQueries->get_email_audit_count($ipAddress,$username);
335
+ if($sent_count)
336
+ $sent_count = intval($sent_count);
337
+ if($sent_count>0)
338
+ return true;
339
+ return false;
340
+ }
341
+
342
+ function audit_email_notification_sent_to_user($username, $ipAddress, $reason)
343
+ {
344
+ if(empty($ipAddress) || empty($username))
345
+ return;
346
+ global $wpnsDbQueries;
347
+ $wpnsDbQueries->insert_email_audit($ipAddress,$username,$reason);
348
+ }
349
+
350
+ function add_transactions($ipAddress, $username, $type, $status, $url=null)
351
+ {
352
+ global $wpnsDbQueries;
353
+ $wpnsDbQueries->insert_transaction_audit($ipAddress, $username, $type, $status, $url);
354
+ }
355
+
356
+ function get_login_transaction_report()
357
+ {
358
+ global $wpnsDbQueries;
359
+ return $wpnsDbQueries->get_login_transaction_report();
360
+ }
361
+
362
+ function get_error_transaction_report()
363
+ {
364
+ global $wpnsDbQueries;
365
+ return $wpnsDbQueries->get_error_transaction_report();
366
+ }
367
+
368
+
369
+ function get_all_transactions()
370
+ {
371
+ global $wpnsDbQueries;
372
+ return $wpnsDbQueries->get_transasction_list();
373
+ }
374
+
375
+ function move_failed_transactions_to_past_failed($ipAddress)
376
+ {
377
+ global $wpnsDbQueries;
378
+ $wpnsDbQueries->update_transaction_table(array('status'=>MoWpnsConstants::FAILED),
379
+ array('ip_address'=>$ipAddress,'status'=>MoWpnsConstants::PAST_FAILED));
380
+ }
381
+
382
+ function remove_failed_transactions($ipAddress)
383
+ {
384
+ global $wpnsDbQueries;
385
+ $wpnsDbQueries->delete_transaction($ipAddress);
386
+ }
387
+
388
+ function get_failed_attempts_count($ipAddress)
389
+ {
390
+ global $wpnsDbQueries;
391
+ $count = $wpnsDbQueries->get_failed_transaction_count($ipAddress);
392
+ if($count)
393
+ {
394
+ $count = intval($count);
395
+ return $count;
396
+ }
397
+ return 0;
398
+ }
399
+
400
+ function is_ip_blocked_in_anyway($userIp)
401
+ {
402
+ $isBlocked = false;
403
+ if($this->is_ip_blocked($userIp))
404
+ $isBlocked = true;
405
+ else if($this->is_ip_range_blocked($userIp))
406
+ $isBlocked = true;
407
+ else if($this->is_browser_blocked())
408
+ $isBlocked = true;
409
+ else if($this->is_country_blocked($userIp))
410
+ $isBlocked = true;
411
+ else if($this->is_referer_blocked())
412
+ $isBlocked = true;
413
+
414
+ return $isBlocked;
415
+ }
416
+
417
+ function is_ip_range_blocked($userIp)
418
+ {
419
+ if(empty($userIp))
420
+ return false;
421
+ $range_count = 0;
422
+ if(is_numeric(get_option('mo_wpns_iprange_count')))
423
+ $range_count = intval(get_option('mo_wpns_iprange_count'));
424
+ for($i = 1 ; $i <= $range_count ; $i++){
425
+ $blockedrange = get_option('mo_wpns_iprange_range_'.$i);
426
+ $rangearray = explode("-",$blockedrange);
427
+ if(sizeof($rangearray)==2){
428
+ $lowip = ip2long(trim($rangearray[0]));
429
+ $highip = ip2long(trim($rangearray[1]));
430
+ if(ip2long($userIp)>=$lowip && ip2long($userIp)<=$highip){
431
+ $mo_wpns_config = new MoWpnsHandler();
432
+ $mo_wpns_config->block_ip($userIp, MoWpnsConstants::IP_RANGE_BLOCKING, true);
433
+ return true;
434
+ }
435
+ }
436
+ }
437
+ return false;
438
+ }
439
+
440
+
441
+ function is_browser_blocked()
442
+ {
443
+ global $moWpnsUtility;
444
+ if(get_option( 'mo_wpns_enable_user_agent_blocking'))
445
+ {
446
+ $current_browser = $moWpnsUtility->getCurrentBrowser();
447
+ if(get_option('mo_wpns_block_chrome') && $current_browser=='chrome')
448
+ return true;
449
+ else if(get_option('mo_wpns_block_firefox') && $current_browser=='firefox')
450
+ return true;
451
+ else if(get_option('mo_wpns_block_ie') && $current_browser=='ie')
452
+ return true;
453
+ else if(get_option('mo_wpns_block_opera') && $current_browser=='opera')
454
+ return true;
455
+ else if(get_option('mo_wpns_block_safari')&& $current_browser=='safari')
456
+ return true;
457
+ else if(get_option('mo_wpns_block_edge') && $current_browser=='edge')
458
+ return true;
459
+ }
460
+ return false;
461
+ }
462
+
463
+
464
+ function is_country_blocked($userIp)
465
+ {
466
+ $countrycodes = get_option('mo_wpns_countrycodes');
467
+ if($countrycodes && !empty($countrycodes)){
468
+ $ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$userIp));
469
+ if($ip_data && $ip_data->geoplugin_countryName != null){
470
+ $country_code = $ip_data->geoplugin_countryCode;
471
+ if(!empty($country_code)){
472
+ $countrycodes = get_option('mo_wpns_countrycodes');
473
+ $codes = explode(";", $countrycodes);
474
+ foreach($codes as $code){
475
+ if(!empty($code) && strcasecmp($code,$country_code)==0)
476
+ return true;
477
+ }
478
+ }
479
+ }
480
+ }
481
+ return false;
482
+ }
483
+
484
+
485
+ function is_referer_blocked()
486
+ {
487
+ if(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']) && get_option('mo_wpns_referrers')){
488
+ $userreferer = $_SERVER['HTTP_REFERER'];
489
+ $referrers = explode(";",get_option('mo_wpns_referrers'));
490
+ foreach($referrers as $referrer){
491
+ if(!empty($referrer) && strpos(strtolower($userreferer), strtolower($referrer)) !== false){
492
+ return true;
493
+ }
494
+ }
495
+ }
496
+ return false;
497
+ }
498
+
499
+ } ?>
helper/plugins.php ADDED
@@ -0,0 +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 $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 ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** miniOrange enables user to log in through mobile authentication as an additional layer of security over password.
4
+ Copyright (C) 2015 miniOrange
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see <http://www.gnu.org/licenses/>
18
+ * @package miniOrange OAuth
19
+ * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
20
+ */
21
+
22
+ class MoWpnsUtility
23
+ {
24
+
25
+ public static function icr()
26
+ {
27
+ $email = get_option('mo2f_email');
28
+ $customerKey = get_option('mo2f_customerKey');
29
+ if( ! $email || ! $customerKey || ! is_numeric( trim( $customerKey ) ) )
30
+ return 0;
31
+ else
32
+ return 1;
33
+ }
34
+
35
+ public static function check_empty_or_null( $value )
36
+ {
37
+ if( ! isset( $value ) || empty( $value ) )
38
+ return true;
39
+ return false;
40
+ }
41
+
42
+ public static function is_curl_installed()
43
+ {
44
+ if (in_array ('curl', get_loaded_extensions()))
45
+ return 1;
46
+ else
47
+ return 0;
48
+ }
49
+
50
+ public static function is_extension_installed($name)
51
+ {
52
+ if (in_array ($name, get_loaded_extensions()))
53
+ return true;
54
+ else
55
+ return false;
56
+ }
57
+
58
+ public static function get_client_ip()
59
+ {
60
+ if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
61
+ return $_SERVER['HTTP_CLIENT_IP'];
62
+ } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
63
+ return $_SERVER['HTTP_X_FORWARDED_FOR'];
64
+ } else {
65
+ return $_SERVER['REMOTE_ADDR'];
66
+ }
67
+ return '';
68
+ }
69
+
70
+ public static function check_if_valid_email($email)
71
+ {
72
+ $emailarray = explode("@",$email);
73
+ if(sizeof($emailarray)==2)
74
+ return in_array(trim($emailarray[1]), MoWpnsConstants::$domains);
75
+ else
76
+ return false;
77
+ }
78
+
79
+ public static function check_user_password_strength($user,$password)
80
+ {
81
+
82
+ if(!self::check_if_strong_password_enabled_for_user_role($user->roles))
83
+ return "success";
84
+ else if(strlen($password) > 5 && preg_match("#[0-9]+#", $password) && preg_match("#[a-zA-Z]+#", $password) && preg_match('/[^a-zA-Z\d]/', $password))
85
+ return "success";
86
+ else
87
+ return "false";
88
+
89
+ return "success";
90
+ }
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
+ {
98
+ case "all":
99
+ return true;
100
+ break;
101
+ case "admin":
102
+ if(!in_array("administrator", $userroles))
103
+ return false;
104
+ break;
105
+ case "user":
106
+ if(in_array("administrator", $userroles))
107
+ return false;
108
+ break;
109
+ }
110
+ return true;
111
+ }
112
+
113
+ public static function get_current_url()
114
+ {
115
+ $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
116
+ $url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
117
+ return $url;
118
+ }
119
+
120
+ //Function to handle recptcha
121
+ function verify_recaptcha($response)
122
+ {
123
+ $error = new WP_Error();
124
+ if(!empty($response))
125
+ {
126
+ if(!reCaptcha::recaptcha_verify($response))
127
+ $error->add('recaptcha_error', __( '<strong>ERROR</strong> : Invalid Captcha. Please verify captcha again.'));
128
+ else
129
+ return true;
130
+ }
131
+ else
132
+ $error->add('recaptcha_error', __( '<strong>ERROR</strong> : Please verify the captcha.'));
133
+ return $error;
134
+ }
135
+
136
+
137
+ function sendIpBlockedNotification($ipAddress, $reason)
138
+ {
139
+ global $moWpnsUtility;
140
+ $subject = 'User with IP address '.$ipAddress.' is blocked | '.get_bloginfo();
141
+ $toEmail = get_option('admin_email_address');
142
+ $content = "";
143
+ if(get_option('custom_admin_template'))
144
+ {
145
+ $content = get_option('custom_admin_template');
146
+ $content = str_replace("##ipaddress##",$ipAddress,$content);
147
+ }
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){
159
+ $headers = array('Content-Type: text/html; charset=UTF-8');
160
+ wp_mail( $toEmail, $subject, $content, $headers);
161
+
162
+ }
163
+
164
+
165
+ function sendNotificationToUserForUnusualActivities($username, $ipAddress, $reason)
166
+ {
167
+ $content = "";
168
+ //check if email not already sent
169
+ if(get_option($ipAddress.$reason)){
170
+ return json_encode(array("status"=>'SUCCESS','statusMessage'=>'SUCCESS'));
171
+ }
172
+
173
+ global $moWpnsUtility;
174
+
175
+ $user = get_user_by( 'login', $username );
176
+ if($user && !empty($user->user_email))
177
+ $toEmail = $user->user_email;
178
+ else
179
+ return;
180
+
181
+ $mo_wpns_config = new MoWpnsHandler();
182
+ if($mo_wpns_config->is_email_sent_to_user($username,$ipAddress))
183
+ return;
184
+
185
+ $fromEmail = get_option('mo2f_email');
186
+ $subject = 'Sign in from new location for your user account | '.get_bloginfo();
187
+
188
+ if(get_option('custom_user_template'))
189
+ {
190
+ $content = get_option('custom_user_template');
191
+ $content = str_replace("##ipaddress##",$ipAddress,$content);
192
+ $content = str_replace("##username##",$username,$content);
193
+ }
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
+ return $this->wp_mail_send_notification($toEmail,$subject,$content,$fromEmail);
200
+ }
201
+
202
+ //Check if null what will be the message
203
+ function getMessageContent($reason,$ipAddress,$username=null,$fromEmail=null)
204
+ {
205
+ switch($reason)
206
+ {
207
+ case MoWpnsConstants::LOGIN_ATTEMPTS_EXCEEDED:
208
+ $content = "Hello,<br><br>The user with IP Address <b>".$ipAddress."</b> has exceeded allowed failed login attempts on your website <b>".get_bloginfo()."</b> and we have blocked his IP address for further access to website.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange" ;
209
+ return $content;
210
+ case MoWpnsConstants::IP_RANGE_BLOCKING:
211
+ $content = "Hello,<br><br>The user's IP Address <b>".$ipAddress."</b> was found in IP Range specified by you in Advanced IP Blocking and we have blocked his IP address for further access to your website <b>".get_bloginfo()."</b>.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange" ;
212
+ return $content;
213
+ case MoWpnsConstants::LOGGED_IN_FROM_NEW_IP:
214
+ $content = "Hello ".$username.",<br><br>Your account was logged in from new IP Address <b>".$ipAddress."</b> on website <b>".get_bloginfo()."</b>. Please <a href='mailto:".$fromEmail."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo() ;
215
+ return $content;
216
+ case MoWpnsConstants::FAILED_LOGIN_ATTEMPTS_FROM_NEW_IP:
217
+ $subject = 'Someone trying to access you account | '.get_bloginfo();
218
+ $content = "Hello ".$username.",<br><br>Someone tried to login to your account from new IP Address <b>".$ipAddress."</b> on website <b>".get_bloginfo()."</b> with failed login attempts. Please <a href='mailto:".$fromEmail."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo() ;
219
+ return $content;
220
+ default:
221
+ if(is_null($username))
222
+ $content = "Hello,<br><br>The user with IP Address <b>".$ipAddress."</b> has exceeded allowed trasaction limit on your website <b>".get_bloginfo()."</b> and we have blocked his IP address for further access to website.<br><br>You can login to your WordPress dashaboard to check more details.<br><br>Thanks,<br>miniOrange" ;
223
+ else
224
+ $content = "Hello ".$username.",<br><br>Your account was logged in from new IP Address <b>".$ipAddress."</b> on website <b>".get_bloginfo()."</b>. Please <a href='mailto:".$fromEmail."'>contact us</a> if you don't recognise this activity.<br><br>Thanks,<br>".get_bloginfo() ;
225
+ return $content;
226
+ }
227
+ }
228
+
229
+ public static function hasLoginCookie(){
230
+ if(isset($_COOKIE)){
231
+ if(is_array($_COOKIE)){
232
+ foreach($_COOKIE as $key => $val){
233
+ if(strpos($key, 'wordpress_logged_in') === 0){
234
+ return true;
235
+ }
236
+ }
237
+ }
238
+ }
239
+ return false;
240
+ }
241
+ function getCurrentBrowser()
242
+ {
243
+ $useragent = $_SERVER['HTTP_USER_AGENT'];
244
+ if(empty($useragent))
245
+ return false;
246
+
247
+ $useragent = strtolower($useragent);
248
+ if(strpos($useragent, 'edge') !== false)
249
+ return 'edge';
250
+ else if(strpos($useragent, 'opr') !== false)
251
+ return 'opera';
252
+ else if(strpos($useragent, 'chrome') !== false || strpos($useragent, 'CriOS') !== false)
253
+ return 'chrome';
254
+ else if(strpos($useragent, 'firefox') !== false)
255
+ return 'firefox';
256
+ else if(strpos($useragent, 'msie') !== false || strpos($useragent, 'trident') !==false)
257
+ return 'ie';
258
+ else if(strpos($useragent, 'safari') !== false)
259
+ return 'safari';
260
+ }
261
+
262
+ }
includes/css/bootstrap-tour-standalone.css DELETED
@@ -1,764 +0,0 @@
1
- /* ========================================================================
2
- * bootstrap-tour - v0.12.0
3
- * http://bootstraptour.com
4
- * ========================================================================
5
- * Copyright 2012-2017 Ulrich Sossou
6
- *
7
- * ========================================================================
8
- * Licensed under the MIT License (the "License");
9
- * you may not use this file except in compliance with the License.
10
- * You may obtain a copy of the License at
11
- *
12
- * https://opensource.org/licenses/MIT
13
- *
14
- * Unless required by applicable law or agreed to in writing, software
15
- * distributed under the License is distributed on an "AS IS" BASIS,
16
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
- * See the License for the specific language governing permissions and
18
- * limitations under the License.
19
- * ========================================================================
20
- */
21
-
22
- .mo2f_tour_btn {
23
- display: inline-block;
24
- font-weight: normal;
25
- text-align: center;
26
- white-space: nowrap;
27
- vertical-align: middle;
28
- user-select: none;
29
- border: 1px solid transparent;
30
- padding: 0.5rem 0.75rem;
31
- font-size: 1rem;
32
- line-height: 1.25;
33
- border-radius: 0.25rem;
34
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; }
35
- .mo2f_tour_btn:focus, .mo2f_tour_btn:hover {
36
- text-decoration: none; }
37
- .mo2f_tour_btn:focus, .mo2f_tour_btn.focus {
38
- outline: 0;
39
- box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25); }
40
- .mo2f_tour_btn.disabled, .mo2f_tour_btn:disabled {
41
- opacity: .65; }
42
- .mo2f_tour_btn:active, .mo2f_tour_btn.active {
43
- background-image: none; }
44
-
45
- a.mo2f_tour_btn.disabled,
46
- fieldset[disabled] a.mo2f_tour_btn {
47
- pointer-events: none; }
48
-
49
- .mo2f_tour_btn-primary {
50
- color: #fff;
51
- background-color: #007bff;
52
- border-color: #007bff; }
53
- .mo2f_tour_btn-primary:hover {
54
- color: #fff;
55
- background-color: #0069d9;
56
- border-color: #0062cc; }
57
- .mo2f_tour_btn-primary:focus, .mo2f_tour_btn-primary.focus {
58
- box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5); }
59
- .mo2f_tour_btn-primary.disabled, .mo2f_tour_btn-primary:disabled {
60
- background-color: #007bff;
61
- border-color: #007bff; }
62
- .mo2f_tour_btn-primary:active, .mo2f_tour_btn-primary.active,
63
- .show > .mo2f_tour_btn-primary.dropdown-toggle {
64
- background-color: #0069d9;
65
- background-image: none;
66
- border-color: #0062cc; }
67
-
68
- .mo2f_tour_btn-secondary {
69
- color: #fff;
70
- background-color: #007902;
71
- border-color: #868e96;
72
- }
73
- .mo2f_tour_btn_end-secondary {
74
- background: #00A0D2;
75
- border-color: #0073AA;
76
- box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15);
77
- color: #FFF;
78
- text-decoration: none;
79
- cursor: pointer;
80
- border-width: 1px;
81
- border-style: solid;
82
- border-radius: 3px;
83
- white-space: nowrap;
84
- box-sizing: border-box;
85
- line-height: 28px;
86
- padding: 0 12px;
87
- font-size: 13px
88
- }
89
- .mo2f_tour_btn_next-success {
90
- background: #00A0D2;
91
- background-color:#5cb85c;border-color:#4cae4c;
92
- box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15);
93
- color: #FFF;
94
- text-decoration: none;
95
- cursor: pointer;
96
- border-width: 1px;
97
- border-style: solid;
98
- border-radius: 3px;
99
- white-space: nowrap;
100
- box-sizing: border-box;
101
- line-height: 28px;
102
- padding: 0 12px;
103
- font-size: 13px;
104
- }
105
- .mo2f_tour_btn-secondary:hover {
106
- color: #fff;
107
- background-color: #727b84;
108
- border-color: #6c757d; }
109
-
110
- .mo2f_tour_btn-secondary:focus, .mo2f_tour_btn-secondary.focus {
111
- box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5); }
112
- .mo2f_tour_btn-secondary.disabled, .mo2f_tour_btn-secondary:disabled {
113
- background-color: #868e96;
114
- border-color: #868e96; }
115
- .mo2f_tour_btn-secondary:active, .mo2f_tour_btn-secondary.active,
116
- .show > .mo2f_tour_btn-secondary.dropdown-toggle {
117
- background-color: #727b84;
118
- background-image: none;
119
- border-color: #6c757d; }
120
-
121
- .mo2f_tour_btn-success {
122
- color: #fff;
123
- background-color: #28a745;
124
- border-color: #28a745; }
125
- .mo2f_tour_btn-success:hover {
126
- color: #fff;
127
- background-color: #218838;
128
- border-color: #1e7e34; }
129
- .mo2f_tour_btn-success:focus, .mo2f_tour_btn-success.focus {
130
- box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5); }
131
- .mo2f_tour_btn-success.disabled, .mo2f_tour_btn-success:disabled {
132
- background-color: #28a745;
133
- border-color: #28a745; }
134
- .mo2f_tour_btn-success:active, .mo2f_tour_btn-success.active,
135
- .show > .mo2f_tour_btn-success.dropdown-toggle {
136
- background-color: #218838;
137
- background-image: none;
138
- border-color: #1e7e34; }
139
-
140
- .mo2f_tour_btn-info {
141
- color: #fff;
142
- background-color: #17a2b8;
143
- border-color: #17a2b8; }
144
- .mo2f_tour_btn-info:hover {
145
- color: #fff;
146
- background-color: #138496;
147
- border-color: #117a8b; }
148
- .mo2f_tour_btn-info:focus, .mo2f_tour_btn-info.focus {
149
- box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5); }
150
- .mo2f_tour_btn-info.disabled, .mo2f_tour_btn-info:disabled {
151
- background-color: #17a2b8;
152
- border-color: #17a2b8; }
153
- .mo2f_tour_btn-info:active, .mo2f_tour_btn-info.active,
154
- .show > .mo2f_tour_btn-info.dropdown-toggle {
155
- background-color: #138496;
156
- background-image: none;
157
- border-color: #117a8b; }
158
-
159
- .mo2f_tour_btn-warning {
160
- color: #111;
161
- background-color: #ffc107;
162
- border-color: #ffc107; }
163
- .mo2f_tour_btn-warning:hover {
164
- color: #111;
165
- background-color: #e0a800;
166
- border-color: #d39e00; }
167
- .mo2f_tour_btn-warning:focus, .mo2f_tour_btn-warning.focus {
168
- box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5); }
169
- .mo2f_tour_btn-warning.disabled, .mo2f_tour_btn-warning:disabled {
170
- background-color: #ffc107;
171
- border-color: #ffc107; }
172
- .mo2f_tour_btn-warning:active, .mo2f_tour_btn-warning.active,
173
- .show > .mo2f_tour_btn-warning.dropdown-toggle {
174
- background-color: #e0a800;
175
- background-image: none;
176
- border-color: #d39e00; }
177
-
178
- .mo2f_tour_btn-danger {
179
- color: #fff;
180
- background-color: #dc3545;
181
- border-color: #dc3545; }
182
- .mo2f_tour_btn-danger:hover {
183
- color: #fff;
184
- background-color: #c82333;
185
- border-color: #bd2130; }
186
- .mo2f_tour_btn-danger:focus, .mo2f_tour_btn-danger.focus {
187
- box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5); }
188
- .mo2f_tour_btn-danger.disabled, .mo2f_tour_btn-danger:disabled {
189
- background-color: #dc3545;
190
- border-color: #dc3545; }
191
- .mo2f_tour_btn-danger:active, .mo2f_tour_btn-danger.active,
192
- .show > .mo2f_tour_btn-danger.dropdown-toggle {
193
- background-color: #c82333;
194
- background-image: none;
195
- border-color: #bd2130; }
196
-
197
- .mo2f_tour_btn-light {
198
- color: #111;
199
- background-color: #f8f9fa;
200
- border-color: #f8f9fa; }
201
- .mo2f_tour_btn-light:hover {
202
- color: #111;
203
- background-color: #e2e6ea;
204
- border-color: #dae0e5; }
205
- .mo2f_tour_btn-light:focus, .mo2f_tour_btn-light.focus {
206
- box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5); }
207
- .mo2f_tour_btn-light.disabled, .mo2f_tour_btn-light:disabled {
208
- background-color: #f8f9fa;
209
- border-color: #f8f9fa; }
210
- .mo2f_tour_btn-light:active, .mo2f_tour_btn-light.active,
211
- .show > .mo2f_tour_btn-light.dropdown-toggle {
212
- background-color: #e2e6ea;
213
- background-image: none;
214
- border-color: #dae0e5; }
215
-
216
- .mo2f_tour_btn-dark {
217
- color: #fff;
218
- background-color: #343a40;
219
- border-color: #343a40; }
220
- .mo2f_tour_btn-dark:hover {
221
- color: #fff;
222
- background-color: #23272b;
223
- border-color: #1d2124; }
224
- .mo2f_tour_btn-dark:focus, .mo2f_tour_btn-dark.focus {
225
- box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5); }
226
- .mo2f_tour_btn-dark.disabled, .mo2f_tour_btn-dark:disabled {
227
- background-color: #343a40;
228
- border-color: #343a40; }
229
- .mo2f_tour_btn-dark:active, .mo2f_tour_btn-dark.active,
230
- .show > .mo2f_tour_btn-dark.dropdown-toggle {
231
- background-color: #23272b;
232
- background-image: none;
233
- border-color: #1d2124; }
234
-
235
- .mo2f_tour_btn-outline-primary {
236
- color: #007bff;
237
- background-color: transparent;
238
- background-image: none;
239
- border-color: #007bff; }
240
- .mo2f_tour_btn-outline-primary:hover {
241
- color: #fff;
242
- background-color: #007bff;
243
- border-color: #007bff; }
244
- .mo2f_tour_btn-outline-primary:focus, .mo2f_tour_btn-outline-primary.focus {
245
- box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5); }
246
- .mo2f_tour_btn-outline-primary.disabled, .mo2f_tour_btn-outline-primary:disabled {
247
- color: #007bff;
248
- background-color: transparent; }
249
- .mo2f_tour_btn-outline-primary:active, .mo2f_tour_btn-outline-primary.active,
250
- .show > .mo2f_tour_btn-outline-primary.dropdown-toggle {
251
- color: #fff;
252
- background-color: #007bff;
253
- border-color: #007bff; }
254
-
255
- .mo2f_tour_btn-outline-secondary {
256
- color: #868e96;
257
- background-color: transparent;
258
- background-image: none;
259
- border-color: #868e96; }
260
- .mo2f_tour_btn-outline-secondary:hover {
261
- color: #fff;
262
- background-color: #868e96;
263
- border-color: #868e96; }
264
- .mo2f_tour_btn-outline-secondary:focus, .mo2f_tour_btn-outline-secondary.focus {
265
- box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5); }
266
- .mo2f_tour_btn-outline-secondary.disabled, .mo2f_tour_btn-outline-secondary:disabled {
267
- color: #868e96;
268
- background-color: transparent; }
269
- .mo2f_tour_btn-outline-secondary:active, .mo2f_tour_btn-outline-secondary.active,
270
- .show > .mo2f_tour_btn-outline-secondary.dropdown-toggle {
271
- color: #fff;
272
- background-color: #868e96;
273
- border-color: #868e96; }
274
-
275
- .mo2f_tour_btn-outline-success {
276
- color: #28a745;
277
- background-color: transparent;
278
- background-image: none;
279
- border-color: #28a745; }
280
- .mo2f_tour_btn-outline-success:hover {
281
- color: #fff;
282
- background-color: #28a745;
283
- border-color: #28a745; }
284
- .mo2f_tour_btn-outline-success:focus, .mo2f_tour_btn-outline-success.focus {
285
- box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5); }
286
- .mo2f_tour_btn-outline-success.disabled, .mo2f_tour_btn-outline-success:disabled {
287
- color: #28a745;
288
- background-color: transparent; }
289
- .mo2f_tour_btn-outline-success:active, .mo2f_tour_btn-outline-success.active,
290
- .show > .mo2f_tour_btn-outline-success.dropdown-toggle {
291
- color: #fff;
292
- background-color: #28a745;
293
- border-color: #28a745; }
294
-
295
- .mo2f_tour_btn-outline-info {
296
- color: #17a2b8;
297
- background-color: transparent;
298
- background-image: none;
299
- border-color: #17a2b8; }
300
- .mo2f_tour_btn-outline-info:hover {
301
- color: #fff;
302
- background-color: #17a2b8;
303
- border-color: #17a2b8; }
304
- .mo2f_tour_btn-outline-info:focus, .mo2f_tour_btn-outline-info.focus {
305
- box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5); }
306
- .mo2f_tour_btn-outline-info.disabled, .mo2f_tour_btn-outline-info:disabled {
307
- color: #17a2b8;
308
- background-color: transparent; }
309
- .mo2f_tour_btn-outline-info:active, .mo2f_tour_btn-outline-info.active,
310
- .show > .mo2f_tour_btn-outline-info.dropdown-toggle {
311
- color: #fff;
312
- background-color: #17a2b8;
313
- border-color: #17a2b8; }
314
-
315
- .mo2f_tour_btn-outline-warning {
316
- color: #ffc107;
317
- background-color: transparent;
318
- background-image: none;
319
- border-color: #ffc107; }
320
- .mo2f_tour_btn-outline-warning:hover {
321
- color: #fff;
322
- background-color: #ffc107;
323
- border-color: #ffc107; }
324
- .mo2f_tour_btn-outline-warning:focus, .mo2f_tour_btn-outline-warning.focus {
325
- box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5); }
326
- .mo2f_tour_btn-outline-warning.disabled, .mo2f_tour_btn-outline-warning:disabled {
327
- color: #ffc107;
328
- background-color: transparent; }
329
- .mo2f_tour_btn-outline-warning:active, .mo2f_tour_btn-outline-warning.active,
330
- .show > .mo2f_tour_btn-outline-warning.dropdown-toggle {
331
- color: #fff;
332
- background-color: #ffc107;
333
- border-color: #ffc107; }
334
-
335
- .mo2f_tour_btn-outline-danger {
336
- color: #dc3545;
337
- background-color: transparent;
338
- background-image: none;
339
- border-color: #dc3545; }
340
- .mo2f_tour_btn-outline-danger:hover {
341
- color: #fff;
342
- background-color: #dc3545;
343
- border-color: #dc3545; }
344
- .mo2f_tour_btn-outline-danger:focus, .mo2f_tour_btn-outline-danger.focus {
345
- box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5); }
346
- .mo2f_tour_btn-outline-danger.disabled, .mo2f_tour_btn-outline-danger:disabled {
347
- color: #dc3545;
348
- background-color: transparent; }
349
- .mo2f_tour_btn-outline-danger:active, .mo2f_tour_btn-outline-danger.active,
350
- .show > .mo2f_tour_btn-outline-danger.dropdown-toggle {
351
- color: #fff;
352
- background-color: #dc3545;
353
- border-color: #dc3545; }
354
-
355
- .mo2f_tour_btn-outline-light {
356
- color: #f8f9fa;
357
- background-color: transparent;
358
- background-image: none;
359
- border-color: #f8f9fa; }
360
- .mo2f_tour_btn-outline-light:hover {
361
- color: #fff;
362
- background-color: #f8f9fa;
363
- border-color: #f8f9fa; }
364
- .mo2f_tour_btn-outline-light:focus, .mo2f_tour_btn-outline-light.focus {
365
- box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5); }
366
- .mo2f_tour_btn-outline-light.disabled, .mo2f_tour_btn-outline-light:disabled {
367
- color: #f8f9fa;
368
- background-color: transparent; }
369
- .mo2f_tour_btn-outline-light:active, .mo2f_tour_btn-outline-light.active,
370
- .show > .mo2f_tour_btn-outline-light.dropdown-toggle {
371
- color: #fff;
372
- background-color: #f8f9fa;
373
- border-color: #f8f9fa; }
374
-
375
- .mo2f_tour_btn-outline-dark {
376
- color: #343a40;
377
- background-color: transparent;
378
- background-image: none;
379
- border-color: #343a40; }
380
- .mo2f_tour_btn-outline-dark:hover {
381
- color: #fff;
382
- background-color: #343a40;
383
- border-color: #343a40; }
384
- .mo2f_tour_btn-outline-dark:focus, .mo2f_tour_btn-outline-dark.focus {
385
- box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5); }
386
- .mo2f_tour_btn-outline-dark.disabled, .mo2f_tour_btn-outline-dark:disabled {
387
- color: #343a40;
388
- background-color: transparent; }
389
- .mo2f_tour_btn-outline-dark:active, .mo2f_tour_btn-outline-dark.active,
390
- .show > .mo2f_tour_btn-outline-dark.dropdown-toggle {
391
- color: #fff;
392
- background-color: #343a40;
393
- border-color: #343a40; }
394
-
395
- .mo2f_tour_btn-link {
396
- font-weight: normal;
397
- color: #007bff;
398
- border-radius: 0; }
399
- .mo2f_tour_btn-link, .mo2f_tour_btn-link:active, .mo2f_tour_btn-link.active, .mo2f_tour_btn-link:disabled {
400
- background-color: transparent; }
401
- .mo2f_tour_btn-link, .mo2f_tour_btn-link:focus, .mo2f_tour_btn-link:active {
402
- border-color: transparent;
403
- box-shadow: none; }
404
- .mo2f_tour_btn-link:hover {
405
- border-color: transparent; }
406
- .mo2f_tour_btn-link:focus, .mo2f_tour_btn-link:hover {
407
- color: #0056b3;
408
- text-decoration: underline;
409
- background-color: transparent; }
410
- .mo2f_tour_btn-link:disabled {
411
- color: #868e96; }
412
- .mo2f_tour_btn-link:disabled:focus, .mo2f_tour_btn-link:disabled:hover {
413
- text-decoration: none; }
414
-
415
- .mo2f_tour_btn-lg, .mo2f_tour_btn-group-lg > .mo2f_tour_btn {
416
- padding: 0.5rem 1rem;
417
- font-size: 1.25rem;
418
- line-height: 1.5;
419
- border-radius: 0.3rem; }
420
-
421
- .mo2f_tour_btn-sm, .mo2f_tour_btn-group-sm > .mo2f_tour_btn {
422
- padding: 0.25rem 0.5rem;
423
- font-size: 0.875rem;
424
- line-height: 1.5;
425
- border-radius: 0.2rem; }
426
-
427
- .mo2f_tour_btn-block {
428
- display: block;
429
- width: 100%; }
430
-
431
- .mo2f_tour_btn-block + .mo2f_tour_btn-block {
432
- margin-top: 0.5rem; }
433
-
434
- input[type="submit"].mo2f_tour_btn-block,
435
- input[type="reset"].mo2f_tour_btn-block,
436
- input[type="button"].mo2f_tour_btn-block {
437
- width: 100%; }
438
-
439
- .fade {
440
- opacity: 0;
441
- transition: opacity 0.15s linear; }
442
- .fade.show {
443
- opacity: 1; }
444
-
445
- .mo2f_collapse {
446
- display: none; }
447
- .mo2f_collapse.show {
448
- display: block; }
449
-
450
- tr.mo2f_collapse.show {
451
- display: table-row; }
452
-
453
- tbody.mo2f_collapse.show {
454
- display: table-row-group; }
455
-
456
- .collapsing {
457
- position: relative;
458
- height: 0;
459
- overflow: hidden;
460
- transition: height 0.35s ease; }
461
-
462
- .mo2f_tour_btn-group,
463
- .mo2f_tour_btn-group-vertical {
464
- position: relative;
465
- display: inline-flex;
466
- vertical-align: middle; }
467
- .mo2f_tour_btn-group > .mo2f_tour_btn,
468
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn {
469
- position: relative;
470
- flex: 0 1 auto;
471
- margin-bottom: 0; }
472
- .mo2f_tour_btn-group > .mo2f_tour_btn:hover,
473
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:hover {
474
- z-index: 2; }
475
- .mo2f_tour_btn-group > .mo2f_tour_btn:focus, .mo2f_tour_btn-group > .mo2f_tour_btn:active, .mo2f_tour_btn-group > .mo2f_tour_btn.active,
476
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:focus,
477
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:active,
478
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn.active {
479
- z-index: 2; }
480
- .mo2f_tour_btn-group .mo2f_tour_btn + .mo2f_tour_btn,
481
- .mo2f_tour_btn-group .mo2f_tour_btn + .mo2f_tour_btn-group,
482
- .mo2f_tour_btn-group .mo2f_tour_btn-group + .mo2f_tour_btn,
483
- .mo2f_tour_btn-group .mo2f_tour_btn-group + .mo2f_tour_btn-group,
484
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn + .mo2f_tour_btn,
485
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn + .mo2f_tour_btn-group,
486
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn-group + .mo2f_tour_btn,
487
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn-group + .mo2f_tour_btn-group {
488
- margin-left: -1px; }
489
-
490
- .mo2f_tour_btn-toolbar {
491
- display: flex;
492
- flex-wrap: wrap;
493
- justify-content: flex-start; }
494
- .mo2f_tour_btn-toolbar .input-group {
495
- width: auto; }
496
-
497
- .mo2f_tour_btn-group > .mo2f_tour_btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
498
- border-radius: 0; }
499
-
500
- .mo2f_tour_btn-group > .mo2f_tour_btn:first-child {
501
- margin-left: 0; }
502
- .mo2f_tour_btn-group > .mo2f_tour_btn:first-child:not(:last-child):not(.dropdown-toggle) {
503
- border-top-right-radius: 0;
504
- border-bottom-right-radius: 0; }
505
-
506
- .mo2f_tour_btn-group > .mo2f_tour_btn:last-child:not(:first-child),
507
- .mo2f_tour_btn-group > .dropdown-toggle:not(:first-child) {
508
- border-top-left-radius: 0;
509
- border-bottom-left-radius: 0; }
510
-
511
- .mo2f_tour_btn-group > .mo2f_tour_btn-group {
512
- float: left; }
513
-
514
- .mo2f_tour_btn-group > .mo2f_tour_btn-group:not(:first-child):not(:last-child) > .mo2f_tour_btn {
515
- border-radius: 0; }
516
-
517
- .mo2f_tour_btn-group > .mo2f_tour_btn-group:first-child:not(:last-child) > .mo2f_tour_btn:last-child,
518
- .mo2f_tour_btn-group > .mo2f_tour_btn-group:first-child:not(:last-child) > .dropdown-toggle {
519
- border-top-right-radius: 0;
520
- border-bottom-right-radius: 0; }
521
-
522
- .mo2f_tour_btn-group > .mo2f_tour_btn-group:last-child:not(:first-child) > .mo2f_tour_btn:first-child {
523
- border-top-left-radius: 0;
524
- border-bottom-left-radius: 0; }
525
-
526
- .mo2f_tour_btn + .dropdown-toggle-split {
527
- padding-right: 0.5625rem;
528
- padding-left: 0.5625rem; }
529
- .mo2f_tour_btn + .dropdown-toggle-split::after {
530
- margin-left: 0; }
531
-
532
- .mo2f_tour_btn-sm + .dropdown-toggle-split, .mo2f_tour_btn-group-sm > .mo2f_tour_btn + .dropdown-toggle-split {
533
- padding-right: 0.375rem;
534
- padding-left: 0.375rem; }
535
-
536
- .mo2f_tour_btn-lg + .dropdown-toggle-split, .mo2f_tour_btn-group-lg > .mo2f_tour_btn + .dropdown-toggle-split {
537
- padding-right: 0.75rem;
538
- padding-left: 0.75rem; }
539
-
540
- .mo2f_tour_btn-group-vertical {
541
- display: inline-flex;
542
- flex-direction: column;
543
- align-items: flex-start;
544
- justify-content: center; }
545
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn,
546
- .mo2f_tour_btn-group-vertical .mo2f_tour_btn-group {
547
- width: 100%; }
548
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn + .mo2f_tour_btn,
549
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn + .mo2f_tour_btn-group,
550
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group + .mo2f_tour_btn,
551
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group + .mo2f_tour_btn-group {
552
- margin-top: -1px;
553
- margin-left: 0; }
554
-
555
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:not(:first-child):not(:last-child) {
556
- border-radius: 0; }
557
-
558
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:first-child:not(:last-child) {
559
- border-bottom-right-radius: 0;
560
- border-bottom-left-radius: 0; }
561
-
562
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn:last-child:not(:first-child) {
563
- border-top-left-radius: 0;
564
- border-top-right-radius: 0; }
565
-
566
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group:not(:first-child):not(:last-child) > .mo2f_tour_btn {
567
- border-radius: 0; }
568
-
569
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group:first-child:not(:last-child) > .mo2f_tour_btn:last-child,
570
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group:first-child:not(:last-child) > .dropdown-toggle {
571
- border-bottom-right-radius: 0;
572
- border-bottom-left-radius: 0; }
573
-
574
- .mo2f_tour_btn-group-vertical > .mo2f_tour_btn-group:last-child:not(:first-child) > .mo2f_tour_btn:first-child {
575
- border-top-left-radius: 0;
576
- border-top-right-radius: 0; }
577
-
578
- [data-toggle="buttons"] > .mo2f_tour_btn input[type="radio"],
579
- [data-toggle="buttons"] > .mo2f_tour_btn input[type="checkbox"],
580
- [data-toggle="buttons"] > .mo2f_tour_btn-group > .mo2f_tour_btn input[type="radio"],
581
- [data-toggle="buttons"] > .mo2f_tour_btn-group > .btn input[type="checkbox"] {
582
- position: absolute;
583
- clip: rect(0, 0, 0, 0);
584
- pointer-events: none; }
585
-
586
- .mo2f_popover {
587
- position: absolute;
588
- top: 0;
589
- left: 0;
590
- right:0;
591
- z-index: 1060;
592
- display: block;
593
- float:top;
594
- max-width: 276px;
595
- padding: 1px;
596
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
597
- font-style: normal;
598
- font-weight: normal;
599
- line-height: 1.5;
600
- text-align: left;
601
- text-align: start;
602
- text-decoration: none;
603
- text-shadow: none;
604
- text-transform: none;
605
- letter-spacing: normal;
606
- word-break: normal;
607
- word-spacing: normal;
608
- white-space: normal;
609
- line-break: auto;
610
- font-size: 0.875rem;
611
- word-wrap: break-word;
612
- background-color: #fff;
613
- background-clip: padding-box;
614
- border: 1px solid rgba(0, 0, 0, 0.2);
615
- border-radius: 0.3rem; }
616
- .mo2f_popover .mo2f_arrow {
617
- position: absolute;
618
- display: block;
619
- width: 10px;
620
- height: 5px;
621
-
622
- }
623
- .mo2f_popover .mo2f_arrow::before,
624
- .mo2f_popover .mo2f_arrow::after {
625
- position: absolute;
626
- display: block;
627
- border-color:transparent;
628
- border-style: solid; }
629
- .mo2f_popover .mo2f_arrow::before {
630
- content: "";
631
- border-width: 11px;
632
- }
633
- .mo2f_popover .mo2f_arrow::after {
634
- content: "";
635
- border-width: 11px;
636
-
637
- }
638
- .mo2f_popover.bs-mo2f_popover-top, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] {
639
- margin-bottom: 10px; }
640
- .mo2f_popover.bs-mo2f_popover-top .mo2f_arrow, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] .mo2f_arrow {
641
- bottom: 0; }
642
- .mo2f_popover.bs-mo2f_popover-top .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] .mo2f_arrow::before,
643
- .mo2f_popover.bs-mo2f_popover-top .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] .mo2f_arrow::after {
644
-
645
- border-bottom-width: 0; }
646
- .mo2f_popover.bs-mo2f_popover-top .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] .mo2f_arrow::before {
647
- bottom: -11px;
648
- margin-left: -6px;
649
- border-top-color: rgba(0, 0, 0, 0.25); }
650
- .mo2f_popover.bs-mo2f_popover-top .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="top"] .mo2f_arrow::after {
651
- bottom: -10px;
652
- margin-left: -6px;
653
- border-top-color: #fff;
654
- }
655
- .mo2f_popover.bs-mo2f_popover-right, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] {
656
-
657
- margin-left: 10px; }
658
- .mo2f_popover.bs-mo2f_popover-right .mo2f_arrow, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] .mo2f_arrow {
659
- left: 0; }
660
- .mo2f_popover.bs-mo2f_popover-right .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] .mo2f_arrow::before,
661
- .mo2f_popover.bs-mo2f_popover-right .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] .mo2f_arrow::after {
662
- margin-top: -8px;
663
- border-left-width: 0;
664
- }
665
- .mo2f_popover.bs-mo2f_popover-right .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] .mo2f_arrow::before {
666
- left: -11px;
667
- border-right-color: rgba(0, 0, 0, 0.25); }
668
- .mo2f_popover.bs-mo2f_popover-right .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="right"] .mo2f_arrow::after {
669
- left: -10px;
670
- border-right-color: #fff;
671
- }
672
- .mo2f_popover.bs-mo2f_popover-bottom, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] {
673
- margin-top: 10px; }
674
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_arrow, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_arrow {
675
- top: 0; }
676
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_arrow::before,
677
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_arrow::after {
678
- margin-left: -7px;
679
- border-top-width: 0;
680
-
681
- }
682
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_arrow::before {
683
- top: -11px;
684
- border-bottom-color: rgba(0, 0, 0, 0.25); }
685
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_arrow::after {
686
- top: -10px;
687
- border-bottom-color: #fff;
688
-
689
- }
690
- .mo2f_popover.bs-mo2f_popover-bottom .mo2f_popover-header::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="bottom"] .mo2f_popover-header::before {
691
- position: absolute;
692
- top: 0;
693
- left: 50%;
694
- display: block;
695
- width: 20px;
696
- margin-left: -10px;
697
- content: "";
698
- border-bottom: 1px solid #f7f7f7; }
699
- .mo2f_popover.bs-mo2f_popover-left, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] {
700
- margin-right: 10px; }
701
- .mo2f_popover.bs-mo2f_popover-left .mo2f_arrow, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] .mo2f_arrow {
702
- right: 0;
703
-
704
- }
705
- .mo2f_popover.bs-mo2f_popover-left .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] .mo2f_arrow::before,
706
- .mo2f_popover.bs-mo2f_popover-left .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] .mo2f_arrow::after {
707
- margin-top: -8px;
708
- border-right-width: 0;
709
- }
710
- .mo2f_popover.bs-mo2f_popover-left .mo2f_arrow::before, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] .mo2f_arrow::before {
711
- right: -11px;
712
- border-left-color: rgba(0, 0, 0, 0.25); }
713
- .mo2f_popover.bs-mo2f_popover-left .mo2f_arrow::after, .mo2f_popover.bs-mo2f_popover-auto[x-placement^="left"] .mo2f_arrow::after {
714
- right: -10px;
715
- border-left-color: #fff;
716
- }
717
-
718
- .mo2f_popover-header {
719
- padding: 8px 14px;
720
- margin-bottom: 0;
721
- font-size: 1rem;
722
- color: #FFF;
723
- background-color: #000;
724
- border-bottom: 1px solid #ebebeb;
725
- border-top-left-radius: calc(0.3rem - 1px);
726
- border-top-right-radius: calc(0.3rem - 1px);
727
- }
728
- .mo2f_popover-header:empty {
729
- display: none; }
730
-
731
- .mo2f_popover-body {
732
- padding: 9px 14px;
733
- color: #212529; }
734
-
735
- .tour-backdrop {
736
- background-color: #000;
737
- filter: alpha(opacity=80);
738
- opacity: .8;
739
- position: absolute;
740
- z-index: 1100; }
741
-
742
- .mo2f_popover[class*="tour-"] {
743
- z-index: 1102; }
744
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation {
745
- overflow: hidden;
746
- padding: 9px 14px; }
747
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="end"] {
748
- float: right; }
749
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="prev"],
750
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="next"],
751
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="end"] {
752
- cursor: pointer; }
753
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="prev"].disabled,
754
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="next"].disabled,
755
- .mo2f_popover[class*="tour-"] .mo2f_popover-navigation *[data-role="end"].disabled {
756
- cursor: default; }
757
- .mo2f_popover[class*="tour-"].orphan {
758
- left: 50%;
759
- margin-top: 0;
760
- position: fixed;
761
- top: 50%;
762
- transform: translate(-50%, -50%); }
763
- .mo2f_popover[class*="tour-"].orphan .mo2f_arrow {
764
- display: none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/bootstrap.min.css DELETED
@@ -1,1875 +0,0 @@
1
- .mo2f_carousel {
2
- position: relative;
3
- padding-bottom: 18px !important;
4
-
5
- }
6
-
7
- .mo2f_carousel-inner {
8
- position: relative;
9
- width: 100%;
10
- overflow: hidden;
11
-
12
- }
13
-
14
- .mo2f_carousel-inner > .item {
15
- position: relative;
16
- display: none;
17
- -webkit-transition: .6s ease-in-out left;
18
- -o-transition: .6s ease-in-out left;
19
- transition: .6s ease-in-out left;
20
- height: 300px !important;
21
-
22
- }
23
-
24
- .mo2f_carousel-inner > .item > img, .mo2f_carousel-inner > .item > a > img {
25
- line-height: 1;
26
-
27
- max-height: 300px !important;
28
- max-width: 600px !important;
29
- }
30
-
31
- @media all and (transform-3d) , ( -webkit-transform-3d ) {
32
- .mo2f_carousel-inner > .item {
33
- -webkit-transition: -webkit-transform .6s ease-in-out;
34
- -o-transition: -o-transform .6s ease-in-out;
35
- transition: transform .6s ease-in-out;
36
- -webkit-backface-visibility: hidden;
37
- backface-visibility: hidden;
38
- -webkit-perspective: 1000;
39
- perspective: 1000
40
- }
41
-
42
- .mo2f_carousel-inner > .item.next, .mo2f_carousel-inner > .item.active.right {
43
- left: 0;
44
- -webkit-transform: translate3d(100%, 0, 0);
45
- transform: translate3d(100%, 0, 0)
46
- }
47
-
48
- .mo2f_carousel-inner > .item.prev, .mo2f_carousel-inner > .item.active.left {
49
- left: 0;
50
- -webkit-transform: translate3d(-100%, 0, 0);
51
- transform: translate3d(-100%, 0, 0)
52
- }
53
-
54
- .mo2f_carousel-inner > .item.next.left, .mo2f_carousel-inner > .item.prev.right, .mo2f_carousel-inner > .item.active {
55
- left: 0;
56
- -webkit-transform: translate3d(0, 0, 0);
57
- transform: translate3d(0, 0, 0)
58
- }
59
- }
60
-
61
- .mo2f_carousel-inner > .active, .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
62
- display: block
63
- }
64
-
65
- .mo2f_carousel-inner > .active {
66
- left: 0
67
- }
68
-
69
- .mo2f_carousel-inner > .next, .mo2f_carousel-inner > .prev {
70
- position: absolute;
71
- top: 0;
72
- width: 100%
73
- }
74
-
75
- .mo2f_carousel-inner > .next {
76
- left: 100%
77
- }
78
-
79
- .mo2f_carousel-inner > .prev {
80
- left: -100%
81
- }
82
-
83
- .mo2f_carousel-inner > .next.left, .mo2f_carousel-inner > .prev.right {
84
- left: 0
85
- }
86
-
87
- .mo2f_carousel-inner > .active.left {
88
- left: -100%
89
- }
90
-
91
- .mo2f_carousel-inner > .active.right {
92
- left: 100%
93
- }
94
-
95
- .mo2f_carousel-control {
96
- position: absolute;
97
- top: 0;
98
- bottom: 0;
99
- left: 0;
100
- width: 15%;
101
- font-size: 20px;
102
- color: #fff;
103
- text-align: center;
104
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
105
- filter: alpha(opacity=50);
106
- opacity: .5
107
- }
108
-
109
- .mo2f_carousel-control.left {
110
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0,
111
- rgba(0, 0, 0, .0001) 100%);
112
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0,
113
- rgba(0, 0, 0, .0001) 100%);
114
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)),
115
- to(rgba(0, 0, 0, .0001)));
116
- background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0,
117
- rgba(0, 0, 0, .0001) 100%);
118
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',
119
- endColorstr='#00000000', GradientType=1);
120
- background-repeat: repeat-x
121
- }
122
-
123
- .mo2f_carousel-control.right {
124
- right: 0;
125
- left: auto;
126
- background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
127
- rgba(0, 0, 0, .5) 100%);
128
- background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0,
129
- rgba(0, 0, 0, .5) 100%);
130
- background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)),
131
- to(rgba(0, 0, 0, .5)));
132
- background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0,
133
- rgba(0, 0, 0, .5) 100%);
134
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',
135
- endColorstr='#80000000', GradientType=1);
136
- background-repeat: repeat-x
137
- }
138
-
139
- .mo2f_carousel-control:hover, .mo2f_carousel-control:focus {
140
- color: #fff;
141
- text-decoration: none;
142
- filter: alpha(opacity=90);
143
- outline: 0;
144
- opacity: .9
145
- }
146
-
147
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right {
148
- position: absolute;
149
- top: 50%;
150
- z-index: 5;
151
- display: inline-block
152
- }
153
-
154
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .glyphicon-chevron-left {
155
- left: 50%;
156
- margin-left: -10px
157
- }
158
-
159
- .mo2f_carousel-control .icon-next, .mo2f_carousel-control .glyphicon-chevron-right {
160
- right: 50%;
161
- margin-right: -10px
162
- }
163
-
164
- .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
165
- width: 20px;
166
- height: 20px;
167
- margin-top: -10px;
168
- font-family: serif
169
- }
170
-
171
- .mo2f_carousel-control .icon-prev:before {
172
- content: '\2039'
173
- }
174
-
175
- .mo2f_carousel-control .icon-next:before {
176
- content: '\203a'
177
- }
178
-
179
- .mo2f_carousel-indicators {
180
- position: absolute;
181
- bottom: -25px;
182
- left: 50%;
183
- z-index: 15;
184
- width: 60%;
185
- padding-left: 0;
186
- margin-left: -30%;
187
- text-align: center;
188
- list-style: none
189
- }
190
-
191
- .mo2f_carousel-indicators li {
192
- display: inline-block;
193
- width: 10px;
194
- height: 10px;
195
- margin: 1px;
196
- text-indent: -999px;
197
- cursor: pointer;
198
- background-color: #0 \9;
199
- background-color: rgba(0, 0, 0, 0);
200
- border: 1px solid #0073aa;
201
- border-radius: 10px
202
- }
203
-
204
- .mo2f_carousel-indicators .active {
205
- width: 12px;
206
- height: 12px;
207
- margin: 0;
208
- background-color: #0073aa;
209
- }
210
-
211
- .mo2f_carousel-caption {
212
- position: absolute;
213
- right: 15%;
214
- bottom: 20px;
215
- left: 15%;
216
- z-index: 10;
217
- padding-top: 20px;
218
- padding-bottom: 20px;
219
- color: #fff;
220
- text-align: center;
221
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6)
222
- }
223
-
224
- .mo2f_carousel-caption .btn {
225
- text-shadow: none
226
- }
227
-
228
- @media screen and (min-width: 768px) {
229
- .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-prev, .mo2f_carousel-control .icon-next {
230
- width: 30px;
231
- height: 30px;
232
- margin-top: -15px;
233
- font-size: 30px
234
- }
235
-
236
- .mo2f_carousel-control .glyphicon-chevron-left, .mo2f_carousel-control .icon-prev {
237
- margin-left: -15px
238
- }
239
-
240
- .mo2f_carousel-control .glyphicon-chevron-right, .mo2f_carousel-control .icon-next {
241
- margin-right: -15px
242
- }
243
-
244
- .mo2f_carousel-caption {
245
- right: 20%;
246
- left: 20%;
247
- padding-bottom: 30px
248
- }
249
-
250
- .mo2f_carousel-indicators {
251
- bottom: -14px
252
- }
253
- }
254
-
255
- .hidden {
256
- display: none;
257
- }
258
-
259
- .float-right {
260
- text-align: right;
261
- }
262
-
263
- .mo2f_collapse {
264
- display: none;
265
- / / visibility: hidden;
266
- font-size: 14px !important;
267
-
268
- }
269
-
270
- .mo2f_collapse.in {
271
- display: block;
272
- visibility: visible;
273
-
274
- }
275
-
276
- .mo2f_collapsing {
277
- position: relative;
278
- font-size: 14px !important;
279
- height: 0;
280
- overflow: hidden;
281
- -webkit-transition-timing-function: ease;
282
- -o-transition-timing-function: ease;
283
- transition-timing-function: ease;
284
- -webkit-transition-duration: .20s;
285
- -o-transition-duration: .20s;
286
- transition-duration: .20s;
287
- -webkit-transition-property: height, visibility;
288
- -o-transition-property: height, visibility;
289
- transition-property: height, visibility
290
- }
291
-
292
- .mo2f_thumbnail {
293
- width: 295px;
294
- margin-bottom: 10px;
295
- position: relative;
296
- background-color: #fff;
297
- border: 1px solid #ddd;
298
- -webkit-transition: border .2s ease-in-out;
299
- -o-transition: border .2s ease-in-out;
300
- transition: border .2s ease-in-out
301
- }
302
-
303
- .mo2f_thumbnail > img, .mo2f_thumbnail a > img {
304
- margin-right: auto;
305
- margin-left: auto
306
- }
307
-
308
- a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
309
- border-color: #337ab7
310
- }
311
-
312
- .mo2f_thumbnail .caption {
313
- padding: 9px;
314
- color: #333
315
- }
316
-
317
- .mo2f_thumbnail label {
318
- font-weight: bold;
319
-
320
- }
321
-
322
- .mo2f_close {
323
- float: right;
324
- font-size: 21px;
325
- font-weight: 700;
326
- line-height: 1;
327
- color: #000;
328
- text-shadow: 0 1px 0 #fff;
329
- filter: alpha(opacity=20);
330
- opacity: .2
331
- }
332
-
333
- .mo2f_close:hover, .mo2f_close:focus {
334
- color: #000;
335
- text-decoration: none;
336
- cursor: pointer;
337
- filter: alpha(opacity=50);
338
- opacity: .5
339
- }
340
-
341
- button.mo2f_close {
342
- -webkit-appearance: none;
343
- padding: 0;
344
- cursor: pointer;
345
- background: 0 0;
346
- border: 0
347
- }
348
-
349
- .mo2f_modal-open {
350
- overflow: hidden !important;
351
- position: fixed !important;
352
- width: 100% !important;
353
-
354
- }
355
-
356
- .mo2f_modal {
357
- position: fixed !important;
358
- top: 0;
359
- right: 0;
360
- bottom: 0;
361
- left: 0;
362
- z-index: 100000 !important;
363
-
364
- overflow: hidden !important;
365
- -webkit-overflow-scrolling: touch;
366
- outline: 0;
367
-
368
- }
369
-
370
- .mo2f_modal_inner {
371
- display: none;
372
- }
373
-
374
- .mo2f_modal.fade .mo2f_modal-dialog {
375
- -webkit-transition: -webkit-transform .3s ease-out;
376
- -o-transition: -o-transform .3s ease-out;
377
- transition: transform .3s ease-out;
378
- -webkit-transform: translate(0, -25%);
379
- -ms-transform: translate(0, -25%);
380
- -o-transform: translate(0, -25%);
381
- transform: translate(0, -25%)
382
- }
383
-
384
- .mo2f_modal.in .mo2f_modal-dialog {
385
- -webkit-transform: translate(0, 80px) !important;
386
- -ms-transform: translate(0, 80px) !important;
387
- -o-transform: translate(0, 80px) !important;
388
- transform: translate(0, 80px) !important;
389
-
390
- }
391
-
392
- .mo2f_modal-open .mo2f_modal {
393
- overflow-x: hidden;
394
- overflow-y: hidden;
395
- }
396
-
397
- .mo2f_modal-dialog {
398
- position: relative;
399
- width: auto;
400
- margin: 10px;
401
-
402
- }
403
-
404
- .login mo_customer_validation-modal-content {
405
- position: relative !important;
406
- background-color: #fff !important;
407
- -webkit-background-clip: padding-box !important;
408
- background-clip: padding-box !important;
409
- border: 1px solid #999 !important;
410
- border: 1px solid rgba(0, 0, 0, .2) !important;
411
- border-radius: 6px !important;
412
- outline: 0 !important;
413
-
414
- -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
415
- box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
416
- }
417
-
418
- .mo2f-modal-backdrop {
419
- position: absolute;
420
- top: 0;
421
- right: 0;
422
- left: 0;
423
- background-color: #f1f1f1 !important;
424
- filter: alpha(opacity=50) !important;
425
- opacity: 0.8 !important;
426
- height: 100% !important;
427
- }
428
-
429
- #smsAlertModal {
430
- background-color: rgba(0,0,0,0.38);
431
- opacity: 3.8 !important;
432
- font-family: Roboto;
433
- }
434
-
435
- #twoFAtestAlertModal {
436
- background-color: black !important;
437
- opacity: 0.8 !important;
438
- filter: alpha(opacity=50) !important;
439
- }
440
-
441
- .mo2f_modal-header {
442
- min-height: 14px;
443
- padding: 10px;
444
- border-bottom: 1px solid #e5e5e5
445
- }
446
-
447
- .mo2f_modal-title {
448
- margin: 0 !important;
449
- line-height: 1.0 !important;
450
- font-size: 1rem;
451
- }
452
-
453
- .mo2f_modal-body {
454
- / / width: 96 % !important;
455
- position: relative !important;
456
- padding: 15px !important;
457
- overflow-y: auto !important;
458
- max-height: 550px !important;
459
- }
460
-
461
- .mo2f_modal-footer {
462
- padding: 15px;
463
- text-align: right;
464
- border-top: 1px solid #e5e5e5
465
- }
466
-
467
- .mo2f_modal-footer .btn + .btn {
468
- margin-bottom: 0;
469
- margin-left: 5px
470
- }
471
-
472
- .mo2f_modal-footer .btn-group .btn + .btn {
473
- margin-left: -1px
474
- }
475
-
476
- .mo2f_modal-footer .btn-block + .btn-block {
477
- margin-left: 0
478
- }
479
-
480
- .mo2f_modal-scrollbar-measure {
481
- position: absolute;
482
- top: -9999px;
483
- width: 50px;
484
- height: 50px;
485
- overflow: scroll
486
- }
487
-
488
- @media ( min-width: 768px) {
489
- .mo2f_modal-dialog {
490
- width: 373px;
491
- margin: 0px auto
492
- }
493
-
494
- .login mo_customer_validation-modal-content {
495
- -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
496
- box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
497
- }
498
-
499
- .mo2f_modal-sm {
500
- width: 300px
501
- }
502
-
503
- .mo2f_modal-md {
504
- width: 550px
505
- }
506
- }
507
-
508
- @media ( min-width: 992px) {
509
- .mo2f_modal-lg {
510
- width: 900px;
511
- }
512
-
513
- .mo2f_modal-md {
514
- width: 550px
515
- }
516
- }
517
-
518
- .center{
519
-
520
- text-align: center !important;
521
- }
522
-
523
- #otpMessage {
524
- border-radius: 1px;
525
- padding: 1px 5px;
526
- background: #f1f1f1;
527
- }
528
-
529
- .mo2f_carousel-indicators {
530
- position: absolute;
531
- bottom: -20px;
532
- z-index: 15;
533
- width: 60%;
534
- list-style: none;
535
- text-align: center;
536
- }
537
-
538
- .miniorange_kba_validate:hover, .miniorange_validate_otp:hover, .miniorange_login_forgotphone:hover,
539
- .miniorange_login_offline:hover, .miniorange_login_forgotphone:hover, .miniorange_otp_token_submit:hover {
540
- background-color: #0073AA !important
541
- }
542
-
543
- .miniorange_kba_validate, .miniorange_validate_otp, .miniorange_login_forgotphone,
544
- .miniorange_login_offline, .miniorange_login_forgotphone, .miniorange_otp_token_submit {
545
- background: #00A0D2 !important;
546
- border-color: #0073AA !important;
547
- box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15) !important;
548
- color: #FFF !important;
549
- text-decoration: none !important;
550
- cursor: pointer !important;
551
- border-width: 1px !important;
552
- border-style: solid !important;
553
- border-radius: 3px !important;
554
- white-space: nowrap !important;
555
- box-sizing: border-box !important;
556
- line-height: 28px !important;
557
- padding: 0 12px !important;
558
- font-size: 13px !important
559
- }
560
-
561
- .mo_customer_validation-modal.fade .mo_customer_validation-modal-dialog {
562
- -webkit-transition: -webkit-transform .3s ease-out;
563
- -o-transition: -o-transform .3s ease-out;
564
- transition: transform .3s ease-out;
565
- -webkit-transform: translate(0, -25%);
566
- -ms-transform: translate(0, -25%);
567
- -o-transform: translate(0, -25%);
568
- transform: translate(0, -25%)
569
- }
570
-
571
- .mo_customer_validation-modal.in .mo_customer_validation-modal-dialog {
572
- -webkit-transform: translate(0, 80px) !important;
573
- -ms-transform: translate(0, 80px) !important;
574
- -o-transform: translate(0, 80px) !important;
575
- transform: translate(0, 80px) !important
576
- }
577
-
578
- .mo_customer_validation-modal-open .mo_customer_validation-modal {
579
- overflow-x: hidden;
580
- overflow-y: hidden
581
- }
582
-
583
- .mo_customer_validation-modal-dialog {
584
- position: relative;
585
- width: auto;
586
- margin: 10px
587
- }
588
-
589
- .mo_customer_validation-modal-content {
590
- position: relative;
591
- -webkit-background-clip: padding-box;
592
- border: 1px solid #999;
593
- border: 1px solid rgba(0, 0, 0, .2);
594
- outline: 0;
595
- margin-top: 8%;
596
- margin-left: 0;
597
- padding: 15px 20px 0;
598
- font-family: "Open Sans", sans-serif;
599
- color: #777;
600
- font-size: 14px;
601
- line-height: 1.4em;
602
- background: #FFF;
603
- box-shadow: 0 1px 3px rgba(0, 0, 0, .13)
604
- }
605
-
606
- .mo_customer_validation-modal-backdrop {
607
- position: absolute;
608
- top: 0;
609
- right: 0;
610
- left: 0;
611
- background-color: #000 !important;
612
- filter: alpha(opacity=50) !important;
613
- opacity: .9 !important;
614
- height: 100% !important
615
- }
616
-
617
- .mo_customer_validation-modal-header {
618
- min-height: 14px;
619
- padding: 10px 10px 20px;
620
- border-bottom: 1px solid #e5e5e5
621
- }
622
-
623
- .mo_customer_validation-modal-title {
624
- margin: 0 !important;
625
- line-height: 1 !important
626
- }
627
-
628
- .mo_customer_validation-modal-body {
629
- position: relative;
630
- padding: 5%;
631
- overflow: hidden !important;
632
- max-height: 550px !important
633
- }
634
-
635
- .mo_customer_validation-modal-footer {
636
- padding: 15px;
637
- text-align: right;
638
- border-top: 1px solid #e5e5e5
639
- }
640
-
641
- .mo_customer_validation-modal-footer .btn + .btn {
642
- margin-bottom: 0;
643
- margin-left: 5px
644
- }
645
-
646
- .mo_customer_validation-modal-footer .btn-group .btn + .btn {
647
- margin-left: -1px
648
- }
649
-
650
- .mo_customer_validation-modal-footer .btn-block + .btn-block {
651
- margin-left: 0
652
- }
653
-
654
- .mo_customer_validation-modal-scrollbar-measure {
655
- position: absolute;
656
- top: -9999px;
657
- width: 50px;
658
- height: 50px;
659
- overflow: scroll
660
- }
661
-
662
- @media (min-width: 768px) {
663
- .mo_customer_validation-modal-dialog {
664
- width: auto;
665
- margin: 0 auto
666
- }
667
-
668
- .mo_customer_validation-modal-content {
669
- -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
670
- box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
671
- }
672
-
673
- .mo_customer_validation-modal-sm {
674
- width: 300px
675
- }
676
-
677
- .mo_customer_validation-modal-md {
678
- width: 532px
679
- }
680
-
681
- .mo_customer_validation-modal-lg {
682
- width: 50%
683
- }
684
- }
685
-
686
- @media (min-width: 992px) {
687
- .mo_customer_validation-modal-dialog {
688
- width: auto;
689
- margin: 0 auto
690
- }
691
-
692
- .mo_customer_validation-modal-lg {
693
- width: 490px
694
- }
695
-
696
- .mo_customer_validation-modal-md {
697
- width: 532px
698
- }
699
- }
700
-
701
- .mo_customer_validation-textbox {
702
- background: #FBFBFB;
703
- font-family: "Open Sans", sans-serif;
704
- font-size: 24px;
705
- width: 100%;
706
- border: 1px solid #DDD;
707
- padding: 3px;
708
- margin: 2px 6px 16px 0
709
- }
710
-
711
- .mo_customer_validation-textbox:focus {
712
- border-color: #5B9DD9;
713
- box-shadow: 0 0 2px rgba(30, 140, 190, .8)
714
- }
715
-
716
- .button-primary,
717
- .button-secondary {
718
- background: #00A0D2;
719
- border-color: #0073AA;
720
- box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15);
721
- color: #FFF;
722
- text-decoration: none;
723
- cursor: pointer;
724
- border-width: 1px;
725
- border-style: solid;
726
- border-radius: 3px;
727
- white-space: nowrap;
728
- box-sizing: border-box;
729
- line-height: 28px;
730
- padding: 0 12px;
731
- font-size: 13px
732
- }
733
-
734
- .button:hover {
735
- background-color: #0073AA
736
- }
737
-
738
- .close {
739
- float: right;
740
- transition: color .1s ease-in-out, background .1s ease-in-out;
741
- text-decoration: none;
742
- color: #999;
743
- font-size: 13px
744
- }
745
-
746
- .mo_validate_close:focus,
747
- .mo_validate_close:hover {
748
- color: #0085ba
749
- }
750
-
751
- .mo_registration_pricing_text {
752
- font-size: 13px;
753
- color: darkblue;
754
- }
755
-
756
- .mo_otp_token {
757
- font-size: 15px;
758
- color: #212F3C;
759
- border: none;
760
- display: block;
761
- border-bottom-style: solid;
762
- border-width: 2px;
763
- border-color: #D0D3D4;
764
- border-radius: 0px;
765
- outline: none;
766
- width: 140px;
767
- text-align: center;
768
- }
769
-
770
- .container {
771
- max-width: 960px
772
- }
773
-
774
- }
775
- @media (min-width: 1200px) {
776
- .container {
777
- max-width: 1140px
778
- }
779
- }
780
-
781
- .container-fluid {
782
- width: 100%;
783
- padding-right: 15px;
784
- padding-left: 15px;
785
- margin-right: auto;
786
- margin-left: auto
787
- }
788
-
789
- .row {
790
- display: -webkit-box;
791
- display: -ms-flexbox;
792
- display: flex;
793
- -ms-flex-wrap: wrap;
794
- flex-wrap: wrap;
795
- margin-right: -15px;
796
- margin-left: -15px
797
- }
798
-
799
- .no-gutters {
800
- margin-right: 0;
801
- margin-left: 0
802
- }
803
-
804
- .no-gutters > .col, .no-gutters > [class*=col-] {
805
- padding-right: 0;
806
- padding-left: 0
807
- }
808
-
809
- .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 {
810
- position: relative;
811
- width: 100%;
812
- min-height: 1px;
813
- padding-right: 15px;
814
- padding-left: 15px
815
- }
816
-
817
- .col {
818
- -ms-flex-preferred-size: 0;
819
- flex-basis: 0;
820
- -webkit-box-flex: 1;
821
- -ms-flex-positive: 1;
822
- flex-grow: 1;
823
- max-width: 100%
824
- }
825
-
826
- .col-auto {
827
- -webkit-box-flex: 0;
828
- -ms-flex: 0 0 auto;
829
- flex: 0 0 auto;
830
- width: auto;
831
- max-width: none
832
- }
833
-
834
- .col-1 {
835
- -webkit-box-flex: 0;
836
- -ms-flex: 0 0 8.333333%;
837
- flex: 0 0 8.333333%;
838
- max-width: 8.333333%
839
- }
840
-
841
- .col-2 {
842
- -webkit-box-flex: 0;
843
- -ms-flex: 0 0 16.666667%;
844
- flex: 0 0 16.666667%;
845
- max-width: 16.666667%
846
- }
847
-
848
- .col-3 {
849
- -webkit-box-flex: 0;
850
- -ms-flex: 0 0 25%;
851
- flex: 0 0 25%;
852
- max-width: 25%
853
- }
854
-
855
- .col-4 {
856
- -webkit-box-flex: 0;
857
- -ms-flex: 0 0 33.333333%;
858
- flex: 0 0 33.333333%;
859
- max-width: 33.333333%
860
- }
861
-
862
- .col-5 {
863
- -webkit-box-flex: 0;
864
- -ms-flex: 0 0 41.666667%;
865
- flex: 0 0 41.666667%;
866
- max-width: 41.666667%
867
- }
868
-
869
- .col-6 {
870
- -webkit-box-flex: 0;
871
- -ms-flex: 0 0 50%;
872
- flex: 0 0 50%;
873
- max-width: 50%
874
- }
875
-
876
- .col-7 {
877
- -webkit-box-flex: 0;
878
- -ms-flex: 0 0 58.333333%;
879
- flex: 0 0 58.333333%;
880
- max-width: 58.333333%
881
- }
882
-
883
- .col-8 {
884
- -webkit-box-flex: 0;
885
- -ms-flex: 0 0 66.666667%;
886
- flex: 0 0 66.666667%;
887
- max-width: 66.666667%
888
- }
889
-
890
- .col-9 {
891
- -webkit-box-flex: 0;
892
- -ms-flex: 0 0 75%;
893
- flex: 0 0 75%;
894
- max-width: 75%
895
- }
896
-
897
- .col-10 {
898
- -webkit-box-flex: 0;
899
- -ms-flex: 0 0 83.333333%;
900
- flex: 0 0 83.333333%;
901
- max-width: 83.333333%
902
- }
903
-
904
- .col-11 {
905
- -webkit-box-flex: 0;
906
- -ms-flex: 0 0 91.666667%;
907
- flex: 0 0 91.666667%;
908
- max-width: 91.666667%
909
- }
910
-
911
- .col-12 {
912
- -webkit-box-flex: 0;
913
- -ms-flex: 0 0 100%;
914
- flex: 0 0 100%;
915
- max-width: 100%
916
- }
917
-
918
- .order-first {
919
- -webkit-box-ordinal-group: 0;
920
- -ms-flex-order: -1;
921
- order: -1
922
- }
923
-
924
- .order-last {
925
- -webkit-box-ordinal-group: 14;
926
- -ms-flex-order: 13;
927
- order: 13
928
- }
929
-
930
- .order-0 {
931
- -webkit-box-ordinal-group: 1;
932
- -ms-flex-order: 0;
933
- order: 0
934
- }
935
-
936
- .order-1 {
937
- -webkit-box-ordinal-group: 2;
938
- -ms-flex-order: 1;
939
- order: 1
940
- }
941
-
942
- .order-2 {
943
- -webkit-box-ordinal-group: 3;
944
- -ms-flex-order: 2;
945
- order: 2
946
- }
947
-
948
- .order-3 {
949
- -webkit-box-ordinal-group: 4;
950
- -ms-flex-order: 3;
951
- order: 3
952
- }
953
-
954
- .order-4 {
955
- -webkit-box-ordinal-group: 5;
956
- -ms-flex-order: 4;
957
- order: 4
958
- }
959
-
960
- .order-5 {
961
- -webkit-box-ordinal-group: 6;
962
- -ms-flex-order: 5;
963
- order: 5
964
- }
965
-
966
- .order-6 {
967
- -webkit-box-ordinal-group: 7;
968
- -ms-flex-order: 6;
969
- order: 6
970
- }
971
-
972
- .order-7 {
973
- -webkit-box-ordinal-group: 8;
974
- -ms-flex-order: 7;
975
- order: 7
976
- }
977
-
978
- .order-8 {
979
- -webkit-box-ordinal-group: 9;
980
- -ms-flex-order: 8;
981
- order: 8
982
- }
983
-
984
- .order-9 {
985
- -webkit-box-ordinal-group: 10;
986
- -ms-flex-order: 9;
987
- order: 9
988
- }
989
-
990
- .order-10 {
991
- -webkit-box-ordinal-group: 11;
992
- -ms-flex-order: 10;
993
- order: 10
994
- }
995
-
996
- .order-11 {
997
- -webkit-box-ordinal-group: 12;
998
- -ms-flex-order: 11;
999
- order: 11
1000
- }
1001
-
1002
- .order-12 {
1003
- -webkit-box-ordinal-group: 13;
1004
- -ms-flex-order: 12;
1005
- order: 12
1006
- }
1007
-
1008
- .offset-1 {
1009
- margin-left: 8.333333%
1010
- }
1011
-
1012
- .offset-2 {
1013
- margin-left: 16.666667%
1014
- }
1015
-
1016
- .offset-3 {
1017
- margin-left: 25%
1018
- }
1019
-
1020
- .offset-4 {
1021
- margin-left: 33.333333%
1022
- }
1023
-
1024
- .offset-5 {
1025
- margin-left: 41.666667%
1026
- }
1027
-
1028
- .offset-6 {
1029
- margin-left: 50%
1030
- }
1031
-
1032
- .offset-7 {
1033
- margin-left: 58.333333%
1034
- }
1035
-
1036
- .offset-8 {
1037
- margin-left: 66.666667%
1038
- }
1039
-
1040
- .offset-9 {
1041
- margin-left: 75%
1042
- }
1043
-
1044
- .offset-10 {
1045
- margin-left: 83.333333%
1046
- }
1047
-
1048
- .offset-11 {
1049
- margin-left: 91.666667%
1050
- }
1051
-
1052
- @media (min-width: 576px) {
1053
- .col-sm {
1054
- -ms-flex-preferred-size: 0;
1055
- flex-basis: 0;
1056
- -webkit-box-flex: 1;
1057
- -ms-flex-positive: 1;
1058
- flex-grow: 1;
1059
- max-width: 100%
1060
- }
1061
-
1062
- .col-sm-auto {
1063
- -webkit-box-flex: 0;
1064
- -ms-flex: 0 0 auto;
1065
- flex: 0 0 auto;
1066
- width: auto;
1067
- max-width: none
1068
- }
1069
-
1070
- .col-sm-1 {
1071
- -webkit-box-flex: 0;
1072
- -ms-flex: 0 0 8.333333%;
1073
- flex: 0 0 8.333333%;
1074
- max-width: 8.333333%
1075
- }
1076
-
1077
- .col-sm-2 {
1078
- -webkit-box-flex: 0;
1079
- -ms-flex: 0 0 16.666667%;
1080
- flex: 0 0 16.666667%;
1081
- max-width: 16.666667%
1082
- }
1083
-
1084
- .col-sm-3 {
1085
- -webkit-box-flex: 0;
1086
- -ms-flex: 0 0 25%;
1087
- flex: 0 0 25%;
1088
- max-width: 25%
1089
- }
1090
-
1091
- .col-sm-4 {
1092
- -webkit-box-flex: 0;
1093
- -ms-flex: 0 0 33.333333%;
1094
- flex: 0 0 33.333333%;
1095
- max-width: 33.333333%
1096
- }
1097
-
1098
- .col-sm-5 {
1099
- -webkit-box-flex: 0;
1100
- -ms-flex: 0 0 41.666667%;
1101
- flex: 0 0 41.666667%;
1102
- max-width: 41.666667%
1103
- }
1104
-
1105
- .col-sm-6 {
1106
- -webkit-box-flex: 0;
1107
- -ms-flex: 0 0 50%;
1108
- flex: 0 0 50%;
1109
- max-width: 50%
1110
- }
1111
-
1112
- .col-sm-7 {
1113
- -webkit-box-flex: 0;
1114
- -ms-flex: 0 0 58.333333%;
1115
- flex: 0 0 58.333333%;
1116
- max-width: 58.333333%
1117
- }
1118
-
1119
- .col-sm-8 {
1120
- -webkit-box-flex: 0;
1121
- -ms-flex: 0 0 66.666667%;
1122
- flex: 0 0 66.666667%;
1123
- max-width: 66.666667%
1124
- }
1125
-
1126
- .col-sm-9 {
1127
- -webkit-box-flex: 0;
1128
- -ms-flex: 0 0 75%;
1129
- flex: 0 0 75%;
1130
- max-width: 75%
1131
- }
1132
-
1133
- .col-sm-10 {
1134
- -webkit-box-flex: 0;
1135
- -ms-flex: 0 0 83.333333%;
1136
- flex: 0 0 83.333333%;
1137
- max-width: 83.333333%
1138
- }
1139
-
1140
- .col-sm-11 {
1141
- -webkit-box-flex: 0;
1142
- -ms-flex: 0 0 91.666667%;
1143
- flex: 0 0 91.666667%;
1144
- max-width: 91.666667%
1145
- }
1146
-
1147
- .col-sm-12 {
1148
- -webkit-box-flex: 0;
1149
- -ms-flex: 0 0 100%;
1150
- flex: 0 0 100%;
1151
- max-width: 100%
1152
- }
1153
-
1154
- .order-sm-first {
1155
- -webkit-box-ordinal-group: 0;
1156
- -ms-flex-order: -1;
1157
- order: -1
1158
- }
1159
-
1160
- .order-sm-last {
1161
- -webkit-box-ordinal-group: 14;
1162
- -ms-flex-order: 13;
1163
- order: 13
1164
- }
1165
-
1166
- .order-sm-0 {
1167
- -webkit-box-ordinal-group: 1;
1168
- -ms-flex-order: 0;
1169
- order: 0
1170
- }
1171
-
1172
- .order-sm-1 {
1173
- -webkit-box-ordinal-group: 2;
1174
- -ms-flex-order: 1;
1175
- order: 1
1176
- }
1177
-
1178
- .order-sm-2 {
1179
- -webkit-box-ordinal-group: 3;
1180
- -ms-flex-order: 2;
1181
- order: 2
1182
- }
1183
-
1184
- .order-sm-3 {
1185
- -webkit-box-ordinal-group: 4;
1186
- -ms-flex-order: 3;
1187
- order: 3
1188
- }
1189
-
1190
- .order-sm-4 {
1191
- -webkit-box-ordinal-group: 5;
1192
- -ms-flex-order: 4;
1193
- order: 4
1194
- }
1195
-
1196
- .order-sm-5 {
1197
- -webkit-box-ordinal-group: 6;
1198
- -ms-flex-order: 5;
1199
- order: 5
1200
- }
1201
-
1202
- .order-sm-6 {
1203
- -webkit-box-ordinal-group: 7;
1204
- -ms-flex-order: 6;
1205
- order: 6
1206
- }
1207
-
1208
- .order-sm-7 {
1209
- -webkit-box-ordinal-group: 8;
1210
- -ms-flex-order: 7;
1211
- order: 7
1212
- }
1213
-
1214
- .order-sm-8 {
1215
- -webkit-box-ordinal-group: 9;
1216
- -ms-flex-order: 8;
1217
- order: 8
1218
- }
1219
-
1220
- .order-sm-9 {
1221
- -webkit-box-ordinal-group: 10;
1222
- -ms-flex-order: 9;
1223
- order: 9
1224
- }
1225
-
1226
- .order-sm-10 {
1227
- -webkit-box-ordinal-group: 11;
1228
- -ms-flex-order: 10;
1229
- order: 10
1230
- }
1231
-
1232
- .order-sm-11 {
1233
- -webkit-box-ordinal-group: 12;
1234
- -ms-flex-order: 11;
1235
- order: 11
1236
- }
1237
-
1238
- .order-sm-12 {
1239
- -webkit-box-ordinal-group: 13;
1240
- -ms-flex-order: 12;
1241
- order: 12
1242
- }
1243
-
1244
- .offset-sm-0 {
1245
- margin-left: 0
1246
- }
1247
-
1248
- .offset-sm-1 {
1249
- margin-left: 8.333333%
1250
- }
1251
-
1252
- .offset-sm-2 {
1253
- margin-left: 16.666667%
1254
- }
1255
-
1256
- .offset-sm-3 {
1257
- margin-left: 25%
1258
- }
1259
-
1260
- .offset-sm-4 {
1261
- margin-left: 33.333333%
1262
- }
1263
-
1264
- .offset-sm-5 {
1265
- margin-left: 41.666667%
1266
- }
1267
-
1268
- .offset-sm-6 {
1269
- margin-left: 50%
1270
- }
1271
-
1272
- .offset-sm-7 {
1273
- margin-left: 58.333333%
1274
- }
1275
-
1276
- .offset-sm-8 {
1277
- margin-left: 66.666667%
1278
- }
1279
-
1280
- .offset-sm-9 {
1281
- margin-left: 75%
1282
- }
1283
-
1284
- .offset-sm-10 {
1285
- margin-left: 83.333333%
1286
- }
1287
-
1288
- .offset-sm-11 {
1289
- margin-left: 91.666667%
1290
- }
1291
- }
1292
-
1293
- @media (min-width: 768px) {
1294
- .col-md {
1295
- -ms-flex-preferred-size: 0;
1296
- flex-basis: 0;
1297
- -webkit-box-flex: 1;
1298
- -ms-flex-positive: 1;
1299
- flex-grow: 1;
1300
- max-width: 100%
1301
- }
1302
-
1303
- .col-md-auto {
1304
- -webkit-box-flex: 0;
1305
- -ms-flex: 0 0 auto;
1306
- flex: 0 0 auto;
1307
- width: auto;
1308
- max-width: none
1309
- }
1310
-
1311
- .col-md-1 {
1312
- -webkit-box-flex: 0;
1313
- -ms-flex: 0 0 8.333333%;
1314
- flex: 0 0 8.333333%;
1315
- max-width: 8.333333%
1316
- }
1317
-
1318
- .col-md-2 {
1319
- -webkit-box-flex: 0;
1320
- -ms-flex: 0 0 16.666667%;
1321
- flex: 0 0 16.666667%;
1322
- max-width: 16.666667%
1323
- }
1324
-
1325
- .col-md-3 {
1326
- -webkit-box-flex: 0;
1327
- -ms-flex: 0 0 25%;
1328
- flex: 0 0 25%;
1329
- max-width: 25%
1330
- }
1331
-
1332
- .col-md-4 {
1333
- -webkit-box-flex: 0;
1334
- -ms-flex: 0 0 33.333333%;
1335
- flex: 0 0 33.333333%;
1336
- max-width: 33.333333%
1337
- }
1338
-
1339
- .col-md-5 {
1340
- -webkit-box-flex: 0;
1341
- -ms-flex: 0 0 41.666667%;
1342
- flex: 0 0 41.666667%;
1343
- max-width: 41.666667%
1344
- }
1345
-
1346
- .col-md-6 {
1347
- -webkit-box-flex: 0;
1348
- -ms-flex: 0 0 50%;
1349
- flex: 0 0 50%;
1350
- max-width: 50%
1351
- }
1352
-
1353
- .col-md-7 {
1354
- -webkit-box-flex: 0;
1355
- -ms-flex: 0 0 58.333333%;
1356
- flex: 0 0 58.333333%;
1357
- max-width: 58.333333%
1358
- }
1359
-
1360
- .col-md-8 {
1361
- -webkit-box-flex: 0;
1362
- -ms-flex: 0 0 66.666667%;
1363
- flex: 0 0 66.666667%;
1364
- max-width: 66.666667%
1365
- }
1366
-
1367
- .col-md-9 {
1368
- -webkit-box-flex: 0;
1369
- -ms-flex: 0 0 75%;
1370
- flex: 0 0 75%;
1371
- max-width: 75%
1372
- }
1373
-
1374
- .col-md-10 {
1375
- -webkit-box-flex: 0;
1376
- -ms-flex: 0 0 83.333333%;
1377
- flex: 0 0 83.333333%;
1378
- max-width: 83.333333%
1379
- }
1380
-
1381
- .col-md-11 {
1382
- -webkit-box-flex: 0;
1383
- -ms-flex: 0 0 91.666667%;
1384
- flex: 0 0 91.666667%;
1385
- max-width: 91.666667%
1386
- }
1387
-
1388
- .col-md-12 {
1389
- -webkit-box-flex: 0;
1390
- -ms-flex: 0 0 100%;
1391
- flex: 0 0 100%;
1392
- max-width: 100%
1393
- }
1394
-
1395
- .order-md-first {
1396
- -webkit-box-ordinal-group: 0;
1397
- -ms-flex-order: -1;
1398
- order: -1
1399
- }
1400
-
1401
- .order-md-last {
1402
- -webkit-box-ordinal-group: 14;
1403
- -ms-flex-order: 13;
1404
- order: 13
1405
- }
1406
-
1407
- .order-md-0 {
1408
- -webkit-box-ordinal-group: 1;
1409
- -ms-flex-order: 0;
1410
- order: 0
1411
- }
1412
-
1413
- .order-md-1 {
1414
- -webkit-box-ordinal-group: 2;
1415
- -ms-flex-order: 1;
1416
- order: 1
1417
- }
1418
-
1419
- .order-md-2 {
1420
- -webkit-box-ordinal-group: 3;
1421
- -ms-flex-order: 2;
1422
- order: 2
1423
- }
1424
-
1425
- .order-md-3 {
1426
- -webkit-box-ordinal-group: 4;
1427
- -ms-flex-order: 3;
1428
- order: 3
1429
- }
1430
-
1431
- .order-md-4 {
1432
- -webkit-box-ordinal-group: 5;
1433
- -ms-flex-order: 4;
1434
- order: 4
1435
- }
1436
-
1437
- .order-md-5 {
1438
- -webkit-box-ordinal-group: 6;
1439
- -ms-flex-order: 5;
1440
- order: 5
1441
- }
1442
-
1443
- .order-md-6 {
1444
- -webkit-box-ordinal-group: 7;
1445
- -ms-flex-order: 6;
1446
- order: 6
1447
- }
1448
-
1449
- .order-md-7 {
1450
- -webkit-box-ordinal-group: 8;
1451
- -ms-flex-order: 7;
1452
- order: 7
1453
- }
1454
-
1455
- .order-md-8 {
1456
- -webkit-box-ordinal-group: 9;
1457
- -ms-flex-order: 8;
1458
- order: 8
1459
- }
1460
-
1461
- .order-md-9 {
1462
- -webkit-box-ordinal-group: 10;
1463
- -ms-flex-order: 9;
1464
- order: 9
1465
- }
1466
-
1467
- .order-md-10 {
1468
- -webkit-box-ordinal-group: 11;
1469
- -ms-flex-order: 10;
1470
- order: 10
1471
- }
1472
-
1473
- .order-md-11 {
1474
- -webkit-box-ordinal-group: 12;
1475
- -ms-flex-order: 11;
1476
- order: 11
1477
- }
1478
-
1479
- .order-md-12 {
1480
- -webkit-box-ordinal-group: 13;
1481
- -ms-flex-order: 12;
1482
- order: 12
1483
- }
1484
-
1485
- .offset-md-0 {
1486
- margin-left: 0
1487
- }
1488
-
1489
- .offset-md-1 {
1490
- margin-left: 8.333333%
1491
- }
1492
-
1493
- .offset-md-2 {
1494
- margin-left: 16.666667%
1495
- }
1496
-
1497
- .offset-md-3 {
1498
- margin-left: 25%
1499
- }
1500
-
1501
- .offset-md-4 {
1502
- margin-left: 33.333333%
1503
- }
1504
-
1505
- .offset-md-5 {
1506
- margin-left: 41.666667%
1507
- }
1508
-
1509
- .offset-md-6 {
1510
- margin-left: 50%
1511
- }
1512
-
1513
- .offset-md-7 {
1514
- margin-left: 58.333333%
1515
- }
1516
-
1517
- .offset-md-8 {
1518
- margin-left: 66.666667%
1519
- }
1520
-
1521
- .offset-md-9 {
1522
- margin-left: 75%
1523
- }
1524
-
1525
- .offset-md-10 {
1526
- margin-left: 83.333333%
1527
- }
1528
-
1529
- .offset-md-11 {
1530
- margin-left: 91.666667%
1531
- }
1532
- }
1533
-
1534
- @media (min-width: 992px) {
1535
- .col-lg {
1536
- -ms-flex-preferred-size: 0;
1537
- flex-basis: 0;
1538
- -webkit-box-flex: 1;
1539
- -ms-flex-positive: 1;
1540
- flex-grow: 1;
1541
- max-width: 100%
1542
- }
1543
-
1544
- .col-lg-auto {
1545
- -webkit-box-flex: 0;
1546
- -ms-flex: 0 0 auto;
1547
- flex: 0 0 auto;
1548
- width: auto;
1549
- max-width: none
1550
- }
1551
-
1552
- .col-lg-1 {
1553
- -webkit-box-flex: 0;
1554
- -ms-flex: 0 0 8.333333%;
1555
- flex: 0 0 8.333333%;
1556
- max-width: 8.333333%
1557
- }
1558
-
1559
- .col-lg-2 {
1560
- -webkit-box-flex: 0;
1561
- -ms-flex: 0 0 16.666667%;
1562
- flex: 0 0 16.666667%;
1563
- max-width: 16.666667%
1564
- }
1565
-
1566
- .col-lg-3 {
1567
- -webkit-box-flex: 0;
1568
- -ms-flex: 0 0 25%;
1569
- flex: 0 0 25%;
1570
- max-width: 25%
1571
- }
1572
-
1573
- .col-lg-4 {
1574
- -webkit-box-flex: 0;
1575
- -ms-flex: 0 0 33.333333%;
1576
- flex: 0 0 33.333333%;
1577
- max-width: 33.333333%
1578
- }
1579
-
1580
- .col-lg-5 {
1581
- -webkit-box-flex: 0;
1582
- -ms-flex: 0 0 41.666667%;
1583
- flex: 0 0 41.666667%;
1584
- max-width: 41.666667%
1585
- }
1586
-
1587
- .col-lg-6 {
1588
- -webkit-box-flex: 0;
1589
- -ms-flex: 0 0 50%;
1590
- flex: 0 0 50%;
1591
- max-width: 50%
1592
- }
1593
-
1594
- .col-lg-7 {
1595
- -webkit-box-flex: 0;
1596
- -ms-flex: 0 0 58.333333%;
1597
- flex: 0 0 58.333333%;
1598
- max-width: 58.333333%
1599
- }
1600
-
1601
- .col-lg-8 {
1602
- -webkit-box-flex: 0;
1603
- -ms-flex: 0 0 66.666667%;
1604
- flex: 0 0 66.666667%;
1605
- max-width: 66.666667%
1606
- }
1607
-
1608
- .col-lg-9 {
1609
- -webkit-box-flex: 0;
1610
- -ms-flex: 0 0 75%;
1611
- flex: 0 0 75%;
1612
- max-width: 75%
1613
- }
1614
-
1615
- .col-lg-10 {
1616
- -webkit-box-flex: 0;
1617
- -ms-flex: 0 0 83.333333%;
1618
- flex: 0 0 83.333333%;
1619
- max-width: 83.333333%
1620
- }
1621
-
1622
- .col-lg-11 {
1623
- -webkit-box-flex: 0;
1624
- -ms-flex: 0 0 91.666667%;
1625
- flex: 0 0 91.666667%;
1626
- max-width: 91.666667%
1627
- }
1628
-
1629
- .col-lg-12 {
1630
- -webkit-box-flex: 0;
1631
- -ms-flex: 0 0 100%;
1632
- flex: 0 0 100%;
1633
- max-width: 100%
1634
- }
1635
-
1636
- .order-lg-first {
1637
- -webkit-box-ordinal-group: 0;
1638
- -ms-flex-order: -1;
1639
- order: -1
1640
- }
1641
-
1642
- .order-lg-last {
1643
- -webkit-box-ordinal-group: 14;
1644
- -ms-flex-order: 13;
1645
- order: 13
1646
- }
1647
-
1648
- .order-lg-0 {
1649
- -webkit-box-ordinal-group: 1;
1650
- -ms-flex-order: 0;
1651
- order: 0
1652
- }
1653
-
1654
- .order-lg-1 {
1655
- -webkit-box-ordinal-group: 2;
1656
- -ms-flex-order: 1;
1657
- order: 1
1658
- }
1659
-
1660
- .order-lg-2 {
1661
- -webkit-box-ordinal-group: 3;
1662
- -ms-flex-order: 2;
1663
- order: 2
1664
- }
1665
-
1666
- .order-lg-3 {
1667
- -webkit-box-ordinal-group: 4;
1668
- -ms-flex-order: 3;
1669
- order: 3
1670
- }
1671
-
1672
- .order-lg-4 {
1673
- -webkit-box-ordinal-group: 5;
1674
- -ms-flex-order: 4;
1675
- order: 4
1676
- }
1677
-
1678
- .order-lg-5 {
1679
- -webkit-box-ordinal-group: 6;
1680
- -ms-flex-order: 5;
1681
- order: 5
1682
- }
1683
-
1684
- .order-lg-6 {
1685
- -webkit-box-ordinal-group: 7;
1686
- -ms-flex-order: 6;
1687
- order: 6
1688
- }
1689
-
1690
- .order-lg-7 {
1691
- -webkit-box-ordinal-group: 8;
1692
- -ms-flex-order: 7;
1693
- order: 7
1694
- }
1695
-
1696
- .order-lg-8 {
1697
- -webkit-box-ordinal-group: 9;
1698
- -ms-flex-order: 8;
1699
- order: 8
1700
- }
1701
-
1702
- .order-lg-9 {
1703
- -webkit-box-ordinal-group: 10;
1704
- -ms-flex-order: 9;
1705
- order: 9
1706
- }
1707
-
1708
- .order-lg-10 {
1709
- -webkit-box-ordinal-group: 11;
1710
- -ms-flex-order: 10;
1711
- order: 10
1712
- }
1713
-
1714
- .order-lg-11 {
1715
- -webkit-box-ordinal-group: 12;
1716
- -ms-flex-order: 11;
1717
- order: 11
1718
- }
1719
-
1720
- .order-lg-12 {
1721
- -webkit-box-ordinal-group: 13;
1722
- -ms-flex-order: 12;
1723
- order: 12
1724
- }
1725
-
1726
- .offset-lg-0 {
1727
- margin-left: 0
1728
- }
1729
-
1730
- .offset-lg-1 {
1731
- margin-left: 8.333333%
1732
- }
1733
-
1734
- .offset-lg-2 {
1735
- margin-left: 16.666667%
1736
- }
1737
-
1738
- .offset-lg-3 {
1739
- margin-left: 25%
1740
- }
1741
-
1742
- .offset-lg-4 {
1743
- margin-left: 33.333333%
1744
- }
1745
-
1746
- .offset-lg-5 {
1747
- margin-left: 41.666667%
1748
- }
1749
-
1750
- .offset-lg-6 {
1751
- margin-left: 50%
1752
- }
1753
-
1754
- .offset-lg-7 {
1755
- margin-left: 58.333333%
1756
- }
1757
-
1758
- .offset-lg-8 {
1759
- margin-left: 66.666667%
1760
- }
1761
-
1762
- .offset-lg-9 {
1763
- margin-left: 75%
1764
- }
1765
-
1766
- .offset-lg-10 {
1767
- margin-left: 83.333333%
1768
- }
1769
-
1770
- .offset-lg-11 {
1771
- margin-left: 91.666667%
1772
- }
1773
- }
1774
-
1775
- @media (min-width: 1200px) {
1776
- .col-xl {
1777
- -ms-flex-preferred-size: 0;
1778
- flex-basis: 0;
1779
- -webkit-box-flex: 1;
1780
- -ms-flex-positive: 1;
1781
- flex-grow: 1;
1782
- max-width: 100%
1783
- }
1784
-
1785
- .col-xl-auto {
1786
- -webkit-box-flex: 0;
1787
- -ms-flex: 0 0 auto;
1788
- flex: 0 0 auto;
1789
- width: auto;
1790
- max-width: none
1791
- }
1792
-
1793
- .col-xl-1 {
1794
- -webkit-box-flex: 0;
1795
- -ms-flex: 0 0 8.333333%;
1796
- flex: 0 0 8.333333%;
1797
- max-width: 8.333333%
1798
- }
1799
-
1800
- .col-xl-2 {
1801
- -webkit-box-flex: 0;
1802
- -ms-flex: 0 0 16.666667%;
1803
- flex: 0 0 16.666667%;
1804
- max-width: 16.666667%
1805
- }
1806
-
1807
- .col-xl-3 {
1808
- -webkit-box-flex: 0;
1809
- -ms-flex: 0 0 25%;
1810
- flex: 0 0 25%;
1811
- max-width: 25%
1812
- }
1813
-
1814
- .col-xl-4 {
1815
- -webkit-box-flex: 0;
1816
- -ms-flex: 0 0 33.333333%;
1817
- flex: 0 0 33.333333%;
1818
- max-width: 33.333333%
1819
- }
1820
-
1821
- .col-xl-5 {
1822
- -webkit-box-flex: 0;
1823
- -ms-flex: 0 0 41.666667%;
1824
- flex: 0 0 41.666667%;
1825
- max-width: 41.666667%
1826
- }
1827
-
1828
- .col-xl-6 {
1829
- -webkit-box-flex: 0;
1830
- -ms-flex: 0 0 50%;
1831
- flex: 0 0 50%;
1832
- max-width: 50%
1833
- }
1834
-
1835
- .col-xl-7 {
1836
- -webkit-box-flex: 0;
1837
- -ms-flex: 0 0 58.333333%;
1838
- flex: 0 0 58.333333%;
1839
- max-width: 58.333333%
1840
- }
1841
-
1842
- .col-xl-8 {
1843
- -webkit-box-flex: 0;
1844
- -ms-flex: 0 0 66.666667%;
1845
- flex: 0 0 66.666667%;
1846
- max-width: 66.666667%
1847
- }
1848
-
1849
- .col-xl-9 {
1850
- -webkit-box-flex: 0;
1851
- -ms-flex: 0 0 75%;
1852
- flex: 0 0 75%;
1853
- max-width: 75%
1854
- }
1855
-
1856
- .col-xl-10 {
1857
- -webkit-box-flex: 0;
1858
- -ms-flex: 0 0 83.333333%;
1859
- flex: 0 0 83.333333%;
1860
- max-width: 83.333333%
1861
- }
1862
-
1863
- .col-xl-11 {
1864
- -webkit-box-flex: 0;
1865
- -ms-flex: 0 0 91.666667%;
1866
- flex: 0 0 91.666667%;
1867
- max-width: 91.666667%
1868
- }
1869
-
1870
- .col-xl-12 {
1871
- -webkit-box-flex: 0;
1872
- -ms-flex: 0 0 100%;
1873
- flex: 0 0 100%;
1874
- max-width: 100%
1875
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/button_styles.css ADDED
@@ -0,0 +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
+ }
includes/css/font-awesome.min.css DELETED
@@ -1,4 +0,0 @@
1
- /*!
2
- * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3
- * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4
- */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
 
 
 
 
includes/css/front_end_login.css DELETED
@@ -1,215 +0,0 @@
1
-
2
- .mo2f_powered_by_miniorange {
3
- width: 100px;
4
- height: 30px;
5
- -webkit-background-size: 100px 25px;
6
- background-size: 100px 25px;
7
- background-repeat: no-repeat;
8
- display: inline-block;
9
- vertical-align: middle;
10
- }
11
-
12
- .mo2f_powered_by_div {
13
- text-align: right;
14
- font-size: 9px;
15
- padding-right: 5px;
16
- background-color: #FFFFFF;
17
- width: 92%;
18
- border-radius: 6px;
19
- }
20
-
21
- .mo2f-login-container {
22
- display: inline-block !important;
23
- display: -moz-inline-stack !important;
24
- text-align: center !important;
25
- width: 100%;
26
-
27
- }
28
-
29
- .mo2f-textbox {
30
- width: 160px;
31
- margin: 15px 0px !important;
32
- background-color: rgba(123, 110, 110, 0.06) !important;
33
- border-radius: 4px !important;
34
- padding: 3px !important;
35
- }
36
-
37
- .mo2f-button {
38
- width: 100% !important;
39
- color: #fff !important;
40
- line-height: normal;
41
- height: 30px !important;
42
- margin: 0px !important;
43
- font-size: 14px !important;
44
- padding: 7px !important;
45
- background-color: #f0ad4e !important;
46
- border-color: #eea236 !important;
47
- -webkit-appearance: none;
48
- -webkit-border-radius: 3px !important;
49
- border-radius: 3px !important;
50
-
51
- }
52
-
53
- .mo2fa_display_message_login {
54
- text-align: left !important;
55
- font-size: 13px !important;
56
- }
57
-
58
- .mo2f-link {
59
- color: #0191BF !important;
60
- font-size: 14px !important;
61
- font-weight: bold !important;
62
- cursor: pointer !important;
63
- }
64
-
65
- .mo_green {
66
- background: #2ECC71 !important;
67
- border-color: #2ECC71 !important;
68
- width: 26% !important;
69
- border-width: 1px;
70
- vertical-align: middle !important;
71
- border-radius: 3px !important;
72
- color: white;
73
- height: 30px;
74
- cursor: pointer;
75
- }
76
-
77
- .mo_red {
78
- background: #E74C3C !important;
79
- border-color: #E74C3C !important;
80
- width: 26% !important;
81
- border-width: 1px;
82
- vertical-align: middle !important;
83
- border-radius: 3px !important;
84
- color: white;
85
- height: 30px;
86
- cursor: pointer;
87
- }
88
-
89
- .showQRHelp, .showOTPHelp {
90
- text-align: center !important;
91
-
92
- }
93
-
94
- .mo2f_device {
95
- / / padding-left: 200 px !important;
96
- vertical-align: -webkit-baseline-middle !important;
97
- line-height: 3 !important;
98
- }
99
-
100
- .miniorange-button {
101
- height: 30px;
102
- font-size: 14px !important;
103
- line-height: 5px !important;
104
- padding: 16px !important;
105
- border-width: 1px;
106
- vertical-align: middle !important;
107
- background-color: #f0ad4e !important;
108
- border-color: #eea236 !important;
109
- -webkit-appearance: none;
110
- border-style: solid;
111
- -webkit-border-radius: 3px !important;
112
- border-radius: 3px !important;
113
- white-space: nowrap;
114
- -webkit-box-sizing: border-box;
115
- -moz-box-sizing: border-box;
116
- box-sizing: border-box;
117
- color: #fff;
118
- text-decoration: none;
119
- cursor: pointer;
120
- }
121
-
122
- .mo_hr {
123
- border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
124
- margin-top: 5px !important;
125
- margin-right: 10px !important;
126
- }
127
-
128
- .mo_margin_left {
129
- margin-left: 20px !important;
130
- }
131
-
132
- .mo_app_link {
133
- text-decoration: none !important;
134
- color: #000 !important;
135
- }
136
-
137
- .mo2f_td_show {
138
- display: grid !important;
139
- }
140
-
141
- .mo2f_td_hide {
142
- display: none !important;
143
- }
144
-
145
- .mo2f_label {
146
- font-weight: 100 !important;
147
- margin-left: 10px !important;
148
-
149
- }
150
-
151
- .mo2f_kba_ques {
152
- width: 394px !important;
153
- border-radius: 4px !important;
154
- height: 40px !important;
155
- font-size: 14px !important;
156
- }
157
-
158
- .mo2f_kba_table {
159
- padding: 0 10px;
160
- width: 100%;
161
- border: hidden !important;
162
- }
163
-
164
- .mo2f_kba_tb_data {
165
- padding-left: 15px;
166
- }
167
-
168
- .mo2f_table_textbox_1 {
169
- width: 150px;
170
- height: 30px !important;
171
- font-size: 14px !important;
172
- }
173
-
174
- .mo2f_table_textbox {
175
- width: 200px;
176
- height: 40px !important;
177
- font-size: 14px !important;
178
-
179
- }
180
-
181
- .mo2f_kba_header {
182
- font-weight: bold;
183
- border: hidden !important;
184
- }
185
-
186
- .mo2f_kba_body {
187
- border: hidden !important;
188
- }
189
-
190
- .mo2f_separator {
191
- border-left: 1px solid #EBECEC;
192
- padding: 5px;
193
- }
194
-
195
- .mo2f_authn_header {
196
- font-size: 14px !important;
197
- }
198
-
199
- #mo2f_inline_table {
200
- border: hidden !important;
201
- }
202
-
203
- .mo2f_ordered_list {
204
- margin: 0 0 0 1em !important;
205
- }
206
-
207
- .mo2f_list {
208
- font-size: 14px !important;
209
- }
210
-
211
-
212
-
213
-
214
-
215
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/hide-login-form.css DELETED
@@ -1,52 +0,0 @@
1
- body.login div#login {
2
- display: block;
3
- }
4
-
5
- body.login div#login form#loginform input#user_login {
6
- display: none;
7
- }
8
-
9
- body.login div#login form#loginform p.forgetmenot {
10
- display: none;
11
- }
12
-
13
- body.login div#login form#loginform p.submit input#wp-submit {
14
- display: none;
15
- }
16
-
17
- body.login div#login form#loginform p label {
18
- display: none;
19
- }
20
-
21
- body.login div#login p#nav {
22
- display: none;
23
- }
24
-
25
- body.login div#login form#loginform input#user_pass {
26
- display: none;
27
- }
28
-
29
- body.login div#login div#login_error {
30
- display: none;
31
- }
32
-
33
- body.login div#login div#login_error1 {
34
- border-left: 4px solid #dd3d36;
35
- margin-left: 0;
36
- padding: 12px;
37
- background: #fff;
38
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
39
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
40
- }
41
-
42
- input.button-add {
43
- background: #00a0d2 url(../../includes/images/mo_white_logo.png) no-repeat 10px center !important;
44
- background-size: 16px !important;
45
- border-color: #00a0d2;
46
- border-width: 0px;
47
- vertical-align: middle !important;
48
- border-radius: 3px !important;
49
- color: white;
50
- height: 30px;
51
- cursor: pointer;
52
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/hide-login.css DELETED
@@ -1,317 +0,0 @@
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/jquery.dataTables.min.css CHANGED
@@ -1,143 +1 @@
1
- table.dataTable
2
- {
3
- width:100%;margin:0
4
- auto;
5
- clear:both;
6
- border-collapse:separate;
7
- border-spacing:0
8
- }
9
- table.dataTable thead th,table.dataTable tfoot th
10
- {
11
- font-weight:bold
12
- }
13
- table.dataTable thead th,table.dataTable thead td
14
- {
15
- padding:10px 18px;border-bottom:1px solid #111
16
- }
17
- table.dataTable thead th:active,table.dataTable thead td:active
18
- {
19
- outline:none
20
- }
21
- table.dataTable tfoot th,table.dataTable tfoot td
22
- {
23
- padding:10px 18px 6px 18px;border-top:1px solid #111
24
- }
25
- table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc
26
- {
27
- cursor:pointer;*cursor:hand
28
- }
29
- table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled
30
- {
31
- background-repeat:no-repeat;background-position:center right
32
- }
33
- table.dataTable thead .sorting
34
- {
35
- background-image:url("../images/sort_both.png")
36
- }
37
- table.dataTable thead .sorting_asc
38
- {
39
- background-image:url("../images/sort_asc.png")
40
- }
41
- table.dataTable thead .sorting_desc
42
- {
43
- background-image:url("../images/sort_desc.png")
44
- }
45
- table.dataTable thead .sorting_asc_disabled
46
- {
47
- background-image:url("../images/sort_asc_disabled.png")
48
- }
49
- table.dataTable thead .sorting_desc_disabled
50
- {
51
- background-image:url("../images/sort_desc_disabled.png")
52
- }
53
- table.dataTable tbody tr
54
- {
55
- background-color:#ffffff
56
- }
57
- table.dataTable tbody tr.selected
58
- {
59
- background-color:#B0BED9
60
- }
61
- table.dataTable tbody th,table.dataTable tbody td
62
- {
63
- padding:8px 10px
64
- }
65
- table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td
66
- {
67
- border-top:1px solid #ddd
68
- }
69
- table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td
70
- {
71
- border-top:none
72
- }
73
- table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td
74
- {
75
- border-top:1px solid #ddd;border-right:1px solid #ddd
76
- }
77
- table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child
78
- {
79
- border-left:1px solid #ddd
80
- }
81
- table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td
82
- {
83
- border-top:none
84
- }
85
- table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd
86
- {
87
- background-color:#f9f9f9
88
- }
89
- table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected
90
- {
91
- background-color:#acbad4
92
- }
93
- table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover
94
- {
95
- background-color:#f6f6f6
96
- }
97
- table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected
98
- {
99
- background-color:#aab7d1
100
- }
101
- table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3
102
- {
103
- background-color:#fafafa
104
- }
105
- table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3
106
- {
107
- background-color:#acbad5
108
- }
109
- table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1
110
- {
111
- background-color:#f1f1f1
112
- }
113
- table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}
114
- .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}
115
- .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}
116
- .dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}
117
- .dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}
118
- .dataTables_wrapper:after
119
- {
120
- visibility:hidden;display:block;content:"";clear:both;height:0
121
- }
122
- @media screen and (max-width: 767px)
123
- {
124
- .dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate
125
- {
126
- float:none;text-align:center
127
- }
128
- .dataTables_wrapper .dataTables_paginate
129
- {
130
- margin-top:0.5em
131
- }
132
- }
133
- @media screen and (max-width: 640px)
134
- {
135
- .dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter
136
- {
137
- float:none;text-align:center
138
- }
139
- .dataTables_wrapper .dataTables_filter
140
- {
141
- margin-top:0.5em
142
- }
143
- }
1
+ table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead table.dataTable thead table.dataTable thead table.dataTable thead table.dataTable thead table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/mo2f_plugins_page.css DELETED
@@ -1,46 +0,0 @@
1
- .mo2f_modal {
2
- display: none;
3
- position: fixed;
4
- z-index: 9999;
5
- padding-top: 100px;
6
- left: 100px;
7
- top: 0;
8
- margin-left:220px;
9
- width: 50%;
10
- height: 100%;
11
-
12
- }
13
-
14
-
15
- .mo2f_modal-content {
16
- background-color: #fefefe;
17
- margin: auto;
18
- padding: 20px;
19
- border: 1px solid #888;
20
- width: 55%;
21
- }
22
-
23
- .mo2f_close {
24
- color: #aaaaaa;
25
- float: right;
26
- font-size: 28px;
27
- font-weight: bold;
28
- }
29
-
30
- .mo2f_close:hover,
31
- .mo2f_close:focus {
32
- color: #000;
33
- text-decoration: none;
34
- cursor: pointer;
35
- }
36
- .alert{
37
- padding:5px;
38
- margin-bottom:10px;
39
- border:1px solid transparent;
40
- border-radius:4px
41
- }
42
- .alert-info{
43
- color:#31708f;
44
- background-color:#d9edf7;
45
- border-color:#bce8f1
46
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/phone.css CHANGED
@@ -1,1074 +1,275 @@
1
- .intl-number-input {
2
- position: inherit;
3
- }
4
-
5
- .intl-number-input .hide {
6
- display: none;
7
- }
8
-
9
- .intl-number-input .flag-dropdown {
10
- position: absolute;
11
- cursor: pointer;
12
- }
13
-
14
- .intl-number-input .flag-dropdown .selected-flag {
15
- margin: 1px;
16
- padding: 8px 16px 6px 7px;
17
- }
18
-
19
- .intl-number-input .flag-dropdown .selected-flag:hover {
20
- background-color: rgba(0, 0, 0, 0.05);
21
- }
22
-
23
- .intl-number-input .flag-dropdown .selected-flag .down-arrow {
24
- top: 5px;
25
- position: relative;
26
- left: 20px;
27
- width: 0;
28
- height: 0;
29
- border-left: 4px solid transparent;
30
- border-right: 4px solid transparent;
31
- border-top: 4px solid black;
32
- }
33
-
34
- .intl-number-input .flag-dropdown .country-list {
35
- list-style: none;
36
- padding: 0;
37
- margin: 0;
38
- z-index: 9999;
39
- overflow-y: scroll;
40
- box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2);
41
- background-color: white;
42
- border: 1px solid #cccccc;
43
- position: absolute;
44
- top: 33px;
45
- width: 196px;
46
- height: 200px;
47
- font-size: 12px;
48
- }
49
-
50
- .intl-number-input .flag-dropdown .country-list .divider {
51
- padding-bottom: 5px;
52
- margin-bottom: 5px;
53
- border-bottom: 1px solid #cccccc;
54
- }
55
-
56
- .intl-number-input .flag-dropdown .country-list .country {
57
- line-height: 20px;
58
- padding: 4px 10px;
59
- }
60
-
61
- .intl-number-input .flag-dropdown .country-list .country .dial-code {
62
- color: #999999;
63
- }
64
-
65
- .intl-number-input .flag-dropdown .country-list .country.highlight {
66
- background-color: rgba(0, 0, 0, 0.05);
67
- }
68
-
69
- .intl-number-input .flag-dropdown .country-list .flag {
70
- display: inline-block;
71
- vertical-align: bottom;
72
- }
73
-
74
- .intl-number-input .flag-dropdown .country-list .flag, .intl-number-input .flag-dropdown .country-list .country-name {
75
- margin-right: 2px;
76
- }
77
-
78
- .intl-number-input input {
79
- box-sizing: border-box;
80
- -moz-box-sizing: border-box;
81
- height: 30px;
82
- padding-left: 40px;
83
- }
84
 
85
  /* originally from https://github.com/lafeber/world-flags-sprite */
86
- .f16 .flag {
87
- width: 16px;
88
- height: 16px;
89
- background: url("../images/flags16.png") no-repeat;
90
- }
91
-
92
- .f16 ._African_Union {
93
- background-position: 0 -16px;
94
- }
95
-
96
- .f16 ._Arab_League {
97
- background-position: 0 -32px;
98
- }
99
-
100
- .f16 ._ASEAN {
101
- background-position: 0 -48px;
102
- }
103
-
104
- .f16 ._CARICOM {
105
- background-position: 0 -64px;
106
- }
107
-
108
- .f16 ._CIS {
109
- background-position: 0 -80px;
110
- }
111
-
112
- .f16 ._Commonwealth {
113
- background-position: 0 -96px;
114
- }
115
-
116
- .f16 ._England {
117
- background-position: 0 -112px;
118
- }
119
-
120
- .f16 ._European_Union {
121
- background-position: 0 -128px;
122
- }
123
-
124
- .f16 ._Islamic_Conference {
125
- background-position: 0 -144px;
126
- }
127
-
128
- .f16 ._Kosovo {
129
- background-position: 0 -160px;
130
- }
131
-
132
- .f16 ._NATO {
133
- background-position: 0 -176px;
134
- }
135
-
136
- .f16 ._Northern_Cyprus {
137
- background-position: 0 -192px;
138
- }
139
-
140
- .f16 ._Northern_Ireland {
141
- background-position: 0 -208px;
142
- }
143
-
144
- .f16 ._Olimpic_Movement {
145
- background-position: 0 -224px;
146
- }
147
-
148
- .f16 ._OPEC {
149
- background-position: 0 -240px;
150
- }
151
-
152
- .f16 ._Red_Cross {
153
- background-position: 0 -256px;
154
- }
155
-
156
- .f16 ._Scotland {
157
- background-position: 0 -272px;
158
- }
159
-
160
- .f16 ._Somaliland {
161
- background-position: 0 -288px;
162
- }
163
-
164
- .f16 ._Tibet {
165
- background-position: 0 -304px;
166
- }
167
-
168
- .f16 ._United_Nations {
169
- background-position: 0 -320px;
170
- }
171
-
172
- .f16 ._Wales {
173
- background-position: 0 -336px;
174
- }
175
-
176
- .f16 .ad {
177
- background-position: 0 -352px;
178
- }
179
-
180
- .f16 .ae {
181
- background-position: 0 -368px;
182
- }
183
-
184
- .f16 .af {
185
- background-position: 0 -384px;
186
- }
187
-
188
- .f16 .ag {
189
- background-position: 0 -400px;
190
- }
191
-
192
- .f16 .ai {
193
- background-position: 0 -416px;
194
- }
195
-
196
- .f16 .al {
197
- background-position: 0 -432px;
198
- }
199
-
200
- .f16 .am {
201
- background-position: 0 -448px;
202
- }
203
-
204
- .f16 .an {
205
- background-position: 0 -464px;
206
- }
207
-
208
- .f16 .ao {
209
- background-position: 0 -480px;
210
- }
211
-
212
- .f16 .aq {
213
- background-position: 0 -496px;
214
- }
215
-
216
- .f16 .ar {
217
- background-position: 0 -512px;
218
- }
219
-
220
- .f16 .as {
221
- background-position: 0 -528px;
222
- }
223
-
224
- .f16 .at {
225
- background-position: 0 -544px;
226
- }
227
-
228
- .f16 .au {
229
- background-position: 0 -560px;
230
- }
231
-
232
- .f16 .aw {
233
- background-position: 0 -576px;
234
- }
235
-
236
- .f16 .az {
237
- background-position: 0 -592px;
238
- }
239
-
240
- .f16 .ba {
241
- background-position: 0 -608px;
242
- }
243
-
244
- .f16 .bb {
245
- background-position: 0 -624px;
246
- }
247
-
248
- .f16 .bd {
249
- background-position: 0 -640px;
250
- }
251
-
252
- .f16 .be {
253
- background-position: 0 -656px;
254
- }
255
-
256
- .f16 .bf {
257
- background-position: 0 -672px;
258
- }
259
-
260
- .f16 .bg {
261
- background-position: 0 -688px;
262
- }
263
-
264
- .f16 .bh {
265
- background-position: 0 -704px;
266
- }
267
-
268
- .f16 .bi {
269
- background-position: 0 -720px;
270
- }
271
-
272
- .f16 .bj {
273
- background-position: 0 -736px;
274
- }
275
-
276
- .f16 .bm {
277
- background-position: 0 -752px;
278
- }
279
-
280
- .f16 .bn {
281
- background-position: 0 -768px;
282
- }
283
-
284
- .f16 .bo {
285
- background-position: 0 -784px;
286
- }
287
-
288
- .f16 .br {
289
- background-position: 0 -800px;
290
- }
291
-
292
- .f16 .bs {
293
- background-position: 0 -816px;
294
- }
295
-
296
- .f16 .bt {
297
- background-position: 0 -832px;
298
- }
299
-
300
- .f16 .bw {
301
- background-position: 0 -848px;
302
- }
303
-
304
- .f16 .by {
305
- background-position: 0 -864px;
306
- }
307
-
308
- .f16 .bz {
309
- background-position: 0 -880px;
310
- }
311
-
312
- .f16 .ca {
313
- background-position: 0 -896px;
314
- }
315
-
316
- .f16 .cg {
317
- background-position: 0 -912px;
318
- }
319
-
320
- .f16 .cf {
321
- background-position: 0 -928px;
322
- }
323
-
324
- .f16 .cd {
325
- background-position: 0 -944px;
326
- }
327
-
328
- .f16 .ch {
329
- background-position: 0 -960px;
330
- }
331
-
332
- .f16 .ci {
333
- background-position: 0 -976px;
334
- }
335
-
336
- .f16 .ck {
337
- background-position: 0 -992px;
338
- }
339
-
340
- .f16 .cl {
341
- background-position: 0 -1008px;
342
- }
343
-
344
- .f16 .cm {
345
- background-position: 0 -1024px;
346
- }
347
-
348
- .f16 .cn {
349
- background-position: 0 -1040px;
350
- }
351
-
352
- .f16 .co {
353
- background-position: 0 -1056px;
354
- }
355
-
356
- .f16 .cr {
357
- background-position: 0 -1072px;
358
- }
359
-
360
- .f16 .cu {
361
- background-position: 0 -1088px;
362
- }
363
-
364
- .f16 .cv {
365
- background-position: 0 -1104px;
366
- }
367
-
368
- .f16 .cy {
369
- background-position: 0 -1120px;
370
- }
371
-
372
- .f16 .cz {
373
- background-position: 0 -1136px;
374
- }
375
-
376
- .f16 .de {
377
- background-position: 0 -1152px;
378
- }
379
-
380
- .f16 .dj {
381
- background-position: 0 -1168px;
382
- }
383
-
384
- .f16 .dk {
385
- background-position: 0 -1184px;
386
- }
387
-
388
- .f16 .dm {
389
- background-position: 0 -1200px;
390
- }
391
-
392
- .f16 .do {
393
- background-position: 0 -1216px;
394
- }
395
-
396
- .f16 .dz {
397
- background-position: 0 -1232px;
398
- }
399
-
400
- .f16 .ec {
401
- background-position: 0 -1248px;
402
- }
403
-
404
- .f16 .ee {
405
- background-position: 0 -1264px;
406
- }
407
-
408
- .f16 .eg {
409
- background-position: 0 -1280px;
410
- }
411
-
412
- .f16 .eh {
413
- background-position: 0 -1296px;
414
- }
415
-
416
- .f16 .er {
417
- background-position: 0 -1312px;
418
- }
419
-
420
- .f16 .es {
421
- background-position: 0 -1328px;
422
- }
423
-
424
- .f16 .et {
425
- background-position: 0 -1344px;
426
- }
427
-
428
- .f16 .fi {
429
- background-position: 0 -1360px;
430
- }
431
-
432
- .f16 .fj {
433
- background-position: 0 -1376px;
434
- }
435
-
436
- .f16 .fm {
437
- background-position: 0 -1392px;
438
- }
439
-
440
- .f16 .fo {
441
- background-position: 0 -1408px;
442
- }
443
-
444
- .f16 .fr {
445
- background-position: 0 -1424px;
446
- }
447
-
448
- .f16 .ga {
449
- background-position: 0 -1440px;
450
- }
451
-
452
- .f16 .gb {
453
- background-position: 0 -1456px;
454
- }
455
-
456
- .f16 .gd {
457
- background-position: 0 -1472px;
458
- }
459
-
460
- .f16 .ge {
461
- background-position: 0 -1488px;
462
- }
463
-
464
- .f16 .gg {
465
- background-position: 0 -1504px;
466
- }
467
-
468
- .f16 .gh {
469
- background-position: 0 -1520px;
470
- }
471
-
472
- .f16 .gi {
473
- background-position: 0 -1536px;
474
- }
475
-
476
- .f16 .gl {
477
- background-position: 0 -1552px;
478
- }
479
-
480
- .f16 .gm {
481
- background-position: 0 -1568px;
482
- }
483
-
484
- .f16 .gn {
485
- background-position: 0 -1584px;
486
- }
487
-
488
- .f16 .gp {
489
- background-position: 0 -1600px;
490
- }
491
-
492
- .f16 .gq {
493
- background-position: 0 -1616px;
494
- }
495
-
496
- .f16 .gr {
497
- background-position: 0 -1632px;
498
- }
499
-
500
- .f16 .gt {
501
- background-position: 0 -1648px;
502
- }
503
-
504
- .f16 .gu {
505
- background-position: 0 -1664px;
506
- }
507
-
508
- .f16 .gw {
509
- background-position: 0 -1680px;
510
- }
511
-
512
- .f16 .gy {
513
- background-position: 0 -1696px;
514
- }
515
-
516
- .f16 .hk {
517
- background-position: 0 -1712px;
518
- }
519
-
520
- .f16 .hn {
521
- background-position: 0 -1728px;
522
- }
523
-
524
- .f16 .hr {
525
- background-position: 0 -1744px;
526
- }
527
-
528
- .f16 .ht {
529
- background-position: 0 -1760px;
530
- }
531
-
532
- .f16 .hu {
533
- background-position: 0 -1776px;
534
- }
535
-
536
- .f16 .id {
537
- background-position: 0 -1792px;
538
- }
539
-
540
- .f16 .mc {
541
- background-position: 0 -1792px;
542
- }
543
-
544
- .f16 .ie {
545
- background-position: 0 -1808px;
546
- }
547
-
548
- .f16 .il {
549
- background-position: 0 -1824px;
550
- }
551
-
552
- .f16 .im {
553
- background-position: 0 -1840px;
554
- }
555
-
556
- .f16 .in {
557
- background-position: 0 -1856px;
558
- }
559
-
560
- .f16 .iq {
561
- background-position: 0 -1872px;
562
- }
563
-
564
- .f16 .ir {
565
- background-position: 0 -1888px;
566
- }
567
-
568
- .f16 .is {
569
- background-position: 0 -1904px;
570
- }
571
-
572
- .f16 .it {
573
- background-position: 0 -1920px;
574
- }
575
-
576
- .f16 .je {
577
- background-position: 0 -1936px;
578
- }
579
-
580
- .f16 .jm {
581
- background-position: 0 -1952px;
582
- }
583
-
584
- .f16 .jo {
585
- background-position: 0 -1968px;
586
- }
587
-
588
- .f16 .jp {
589
- background-position: 0 -1984px;
590
- }
591
-
592
- .f16 .ke {
593
- background-position: 0 -2000px;
594
- }
595
-
596
- .f16 .kg {
597
- background-position: 0 -2016px;
598
- }
599
-
600
- .f16 .kh {
601
- background-position: 0 -2032px;
602
- }
603
-
604
- .f16 .ki {
605
- background-position: 0 -2048px;
606
- }
607
-
608
- .f16 .km {
609
- background-position: 0 -2064px;
610
- }
611
-
612
- .f16 .kn {
613
- background-position: 0 -2080px;
614
- }
615
-
616
- .f16 .kp {
617
- background-position: 0 -2096px;
618
- }
619
-
620
- .f16 .kr {
621
- background-position: 0 -2112px;
622
- }
623
-
624
- .f16 .kw {
625
- background-position: 0 -2128px;
626
- }
627
-
628
- .f16 .ky {
629
- background-position: 0 -2144px;
630
- }
631
-
632
- .f16 .kz {
633
- background-position: 0 -2160px;
634
- }
635
-
636
- .f16 .la {
637
- background-position: 0 -2176px;
638
- }
639
-
640
- .f16 .lb {
641
- background-position: 0 -2192px;
642
- }
643
-
644
- .f16 .lc {
645
- background-position: 0 -2208px;
646
- }
647
-
648
- .f16 .li {
649
- background-position: 0 -2224px;
650
- }
651
-
652
- .f16 .lk {
653
- background-position: 0 -2240px;
654
- }
655
-
656
- .f16 .lr {
657
- background-position: 0 -2256px;
658
- }
659
-
660
- .f16 .ls {
661
- background-position: 0 -2272px;
662
- }
663
-
664
- .f16 .lt {
665
- background-position: 0 -2288px;
666
- }
667
-
668
- .f16 .lu {
669
- background-position: 0 -2304px;
670
- }
671
-
672
- .f16 .lv {
673
- background-position: 0 -2320px;
674
- }
675
-
676
- .f16 .ly {
677
- background-position: 0 -2336px;
678
- }
679
-
680
- .f16 .ma {
681
- background-position: 0 -2352px;
682
- }
683
-
684
- .f16 .md {
685
- background-position: 0 -2368px;
686
- }
687
-
688
- .f16 .me {
689
- background-position: 0 -2384px;
690
- }
691
-
692
- .f16 .mg {
693
- background-position: 0 -2400px;
694
- }
695
-
696
- .f16 .mh {
697
- background-position: 0 -2416px;
698
- }
699
-
700
- .f16 .mk {
701
- background-position: 0 -2432px;
702
- }
703
-
704
- .f16 .ml {
705
- background-position: 0 -2448px;
706
- }
707
-
708
- .f16 .mm {
709
- background-position: 0 -2464px;
710
- }
711
-
712
- .f16 .mn {
713
- background-position: 0 -2480px;
714
- }
715
-
716
- .f16 .mo {
717
- background-position: 0 -2496px;
718
- }
719
-
720
- .f16 .mq {
721
- background-position: 0 -2512px;
722
- }
723
-
724
- .f16 .mr {
725
- background-position: 0 -2528px;
726
- }
727
-
728
- .f16 .ms {
729
- background-position: 0 -2544px;
730
- }
731
-
732
- .f16 .mt {
733
- background-position: 0 -2560px;
734
- }
735
-
736
- .f16 .mu {
737
- background-position: 0 -2576px;
738
- }
739
-
740
- .f16 .mv {
741
- background-position: 0 -2592px;
742
- }
743
-
744
- .f16 .mw {
745
- background-position: 0 -2608px;
746
- }
747
-
748
- .f16 .mx {
749
- background-position: 0 -2624px;
750
- }
751
-
752
- .f16 .my {
753
- background-position: 0 -2640px;
754
- }
755
-
756
- .f16 .mz {
757
- background-position: 0 -2656px;
758
- }
759
-
760
- .f16 .na {
761
- background-position: 0 -2672px;
762
- }
763
-
764
- .f16 .nc {
765
- background-position: 0 -2688px;
766
- }
767
-
768
- .f16 .ne {
769
- background-position: 0 -2704px;
770
- }
771
-
772
- .f16 .ng {
773
- background-position: 0 -2720px;
774
- }
775
-
776
- .f16 .ni {
777
- background-position: 0 -2736px;
778
- }
779
-
780
- .f16 .nl {
781
- background-position: 0 -2752px;
782
- }
783
-
784
- .f16 .no {
785
- background-position: 0 -2768px;
786
- }
787
-
788
- .f16 .np {
789
- background-position: 0 -2784px;
790
- }
791
-
792
- .f16 .nr {
793
- background-position: 0 -2800px;
794
- }
795
-
796
- .f16 .nz {
797
- background-position: 0 -2816px;
798
- }
799
-
800
- .f16 .om {
801
- background-position: 0 -2832px;
802
- }
803
-
804
- .f16 .pa {
805
- background-position: 0 -2848px;
806
- }
807
-
808
- .f16 .pe {
809
- background-position: 0 -2864px;
810
- }
811
-
812
- .f16 .pf {
813
- background-position: 0 -2880px;
814
- }
815
-
816
- .f16 .pg {
817
- background-position: 0 -2896px;
818
- }
819
-
820
- .f16 .ph {
821
- background-position: 0 -2912px;
822
- }
823
-
824
- .f16 .pk {
825
- background-position: 0 -2928px;
826
- }
827
-
828
- .f16 .pl {
829
- background-position: 0 -2944px;
830
- }
831
-
832
- .f16 .pr {
833
- background-position: 0 -2960px;
834
- }
835
-
836
- .f16 .ps {
837
- background-position: 0 -2976px;
838
- }
839
-
840
- .f16 .pt {
841
- background-position: 0 -2992px;
842
- }
843
-
844
- .f16 .pw {
845
- background-position: 0 -3008px;
846
- }
847
-
848
- .f16 .py {
849
- background-position: 0 -3024px;
850
- }
851
-
852
- .f16 .qa {
853
- background-position: 0 -3040px;
854
- }
855
-
856
- .f16 .re {
857
- background-position: 0 -3056px;
858
- }
859
-
860
- .f16 .ro {
861
- background-position: 0 -3072px;
862
- }
863
-
864
- .f16 .rs {
865
- background-position: 0 -3088px;
866
- }
867
-
868
- .f16 .ru {
869
- background-position: 0 -3104px;
870
- }
871
-
872
- .f16 .rw {
873
- background-position: 0 -3120px;
874
- }
875
-
876
- .f16 .sa {
877
- background-position: 0 -3136px;
878
- }
879
-
880
- .f16 .sb {
881
- background-position: 0 -3152px;
882
- }
883
-
884
- .f16 .sc {
885
- background-position: 0 -3168px;
886
- }
887
-
888
- .f16 .sd {
889
- background-position: 0 -3184px;
890
- }
891
-
892
- .f16 .se {
893
- background-position: 0 -3200px;
894
- }
895
-
896
- .f16 .sg {
897
- background-position: 0 -3216px;
898
- }
899
-
900
- .f16 .si {
901
- background-position: 0 -3232px;
902
- }
903
-
904
- .f16 .sk {
905
- background-position: 0 -3248px;
906
- }
907
-
908
- .f16 .sl {
909
- background-position: 0 -3264px;
910
- }
911
-
912
- .f16 .sm {
913
- background-position: 0 -3280px;
914
- }
915
-
916
- .f16 .sn {
917
- background-position: 0 -3296px;
918
- }
919
-
920
- .f16 .so {
921
- background-position: 0 -3312px;
922
- }
923
-
924
- .f16 .sr {
925
- background-position: 0 -3328px;
926
- }
927
-
928
- .f16 .st {
929
- background-position: 0 -3344px;
930
- }
931
-
932
- .f16 .sv {
933
- background-position: 0 -3360px;
934
- }
935
-
936
- .f16 .sy {
937
- background-position: 0 -3376px;
938
- }
939
-
940
- .f16 .sz {
941
- background-position: 0 -3392px;
942
- }
943
-
944
- .f16 .tc {
945
- background-position: 0 -3408px;
946
- }
947
-
948
- .f16 .td {
949
- background-position: 0 -3424px;
950
- }
951
-
952
- .f16 .tg {
953
- background-position: 0 -3440px;
954
- }
955
-
956
- .f16 .th {
957
- background-position: 0 -3456px;
958
- }
959
-
960
- .f16 .tj {
961
- background-position: 0 -3472px;
962
- }
963
-
964
- .f16 .tl {
965
- background-position: 0 -3488px;
966
- }
967
-
968
- .f16 .tm {
969
- background-position: 0 -3504px;
970
- }
971
-
972
- .f16 .tn {
973
- background-position: 0 -3520px;
974
- }
975
-
976
- .f16 .to {
977
- background-position: 0 -3536px;
978
- }
979
-
980
- .f16 .tr {
981
- background-position: 0 -3552px;
982
- }
983
-
984
- .f16 .tt {
985
- background-position: 0 -3568px;
986
- }
987
-
988
- .f16 .tv {
989
- background-position: 0 -3584px;
990
- }
991
-
992
- .f16 .tw {
993
- background-position: 0 -3600px;
994
- }
995
-
996
- .f16 .tz {
997
- background-position: 0 -3616px;
998
- }
999
-
1000
- .f16 .ua {
1001
- background-position: 0 -3632px;
1002
- }
1003
-
1004
- .f16 .ug {
1005
- background-position: 0 -3648px;
1006
- }
1007
-
1008
- .f16 .us {
1009
- background-position: 0 -3664px;
1010
- }
1011
-
1012
- .f16 .uy {
1013
- background-position: 0 -3680px;
1014
- }
1015
-
1016
- .f16 .uz {
1017
- background-position: 0 -3696px;
1018
- }
1019
-
1020
- .f16 .va {
1021
- background-position: 0 -3712px;
1022
- }
1023
-
1024
- .f16 .vc {
1025
- background-position: 0 -3728px;
1026
- }
1027
-
1028
- .f16 .ve {
1029
- background-position: 0 -3744px;
1030
- }
1031
-
1032
- .f16 .vg {
1033
- background-position: 0 -3760px;
1034
- }
1035
-
1036
- .f16 .vi {
1037
- background-position: 0 -3776px;
1038
- }
1039
-
1040
- .f16 .vn {
1041
- background-position: 0 -3792px;
1042
- }
1043
-
1044
- .f16 .vu {
1045
- background-position: 0 -3808px;
1046
- }
1047
-
1048
- .f16 .ws {
1049
- background-position: 0 -3824px;
1050
- }
1051
-
1052
- .f16 .ye {
1053
- background-position: 0 -3840px;
1054
- }
1055
-
1056
- .f16 .za {
1057
- background-position: 0 -3856px;
1058
- }
1059
-
1060
- .f16 .zm {
1061
- background-position: 0 -3872px;
1062
- }
1063
-
1064
- .f16 .zw {
1065
- background-position: 0 -3888px;
1066
- }
1067
-
1068
- .intl-number-input input {
1069
- width: 250px;
1070
  }
1071
 
1072
  .actions {
1073
- margin-top: 20px;
1074
  }
1
+ .intl-number-input { position: inherit; }
2
+ .intl-number-input .hide { display: none; }
3
+ .intl-number-input .flag-dropdown { position: absolute; cursor: pointer; }
4
+ .intl-number-input .flag-dropdown .selected-flag { margin: 1px; padding: 8px 16px 6px 7px; }
5
+ .intl-number-input .flag-dropdown .selected-flag:hover { background-color: rgba(0, 0, 0, 0.05); }
6
+ .intl-number-input .flag-dropdown .selected-flag .down-arrow { top: 5px; position: relative; left: 20px; width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 4px solid black; }
7
+ .intl-number-input .flag-dropdown .country-list {list-style: none; padding: 0; margin: 0; z-index: 1; overflow-y: scroll; box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2); background-color: white; border: 1px solid #cccccc; position: absolute; top: 33px; width: 196px; height: 200px; font-size:12px; }
8
+ .intl-number-input .flag-dropdown .country-list .divider { padding-bottom: 5px; margin-bottom: 5px; border-bottom: 1px solid #cccccc; }
9
+ .intl-number-input .flag-dropdown .country-list .country { line-height: 20px; padding: 4px 10px; }
10
+ .intl-number-input .flag-dropdown .country-list .country .dial-code { color: #999999; }
11
+ .intl-number-input .flag-dropdown .country-list .country.highlight { background-color: rgba(0, 0, 0, 0.05); }
12
+ .intl-number-input .flag-dropdown .country-list .flag { display: inline-block; vertical-align: bottom; }
13
+ .intl-number-input .flag-dropdown .country-list .flag, .intl-number-input .flag-dropdown .country-list .country-name { margin-right:2px; }
14
+ .intl-number-input input { box-sizing: border-box; -moz-box-sizing: border-box; height: 30px; padding-left: 40px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  /* originally from https://github.com/lafeber/world-flags-sprite */
17
+ .f16 .flag { width: 16px; height: 16px; background: url("../images/flags16.png") no-repeat; }
18
+ .f16 ._African_Union { background-position: 0 -16px; }
19
+ .f16 ._Arab_League { background-position: 0 -32px; }
20
+ .f16 ._ASEAN { background-position: 0 -48px; }
21
+ .f16 ._CARICOM { background-position: 0 -64px; }
22
+ .f16 ._CIS { background-position: 0 -80px; }
23
+ .f16 ._Commonwealth { background-position: 0 -96px; }
24
+ .f16 ._England { background-position: 0 -112px; }
25
+ .f16 ._European_Union { background-position: 0 -128px; }
26
+ .f16 ._Islamic_Conference { background-position: 0 -144px; }
27
+ .f16 ._Kosovo { background-position: 0 -160px; }
28
+ .f16 ._NATO { background-position: 0 -176px; }
29
+ .f16 ._Northern_Cyprus { background-position: 0 -192px; }
30
+ .f16 ._Northern_Ireland { background-position: 0 -208px; }
31
+ .f16 ._Olimpic_Movement { background-position: 0 -224px; }
32
+ .f16 ._OPEC { background-position: 0 -240px; }
33
+ .f16 ._Red_Cross { background-position: 0 -256px; }
34
+ .f16 ._Scotland { background-position: 0 -272px; }
35
+ .f16 ._Somaliland { background-position: 0 -288px; }
36
+ .f16 ._Tibet { background-position: 0 -304px; }
37
+ .f16 ._United_Nations { background-position: 0 -320px; }
38
+ .f16 ._Wales { background-position: 0 -336px; }
39
+ .f16 .ad { background-position: 0 -352px; }
40
+ .f16 .ae { background-position: 0 -368px; }
41
+ .f16 .af { background-position: 0 -384px; }
42
+ .f16 .ag { background-position: 0 -400px; }
43
+ .f16 .ai { background-position: 0 -416px; }
44
+ .f16 .al { background-position: 0 -432px; }
45
+ .f16 .am { background-position: 0 -448px; }
46
+ .f16 .an { background-position: 0 -464px; }
47
+ .f16 .ao { background-position: 0 -480px; }
48
+ .f16 .aq { background-position: 0 -496px; }
49
+ .f16 .ar { background-position: 0 -512px; }
50
+ .f16 .as { background-position: 0 -528px; }
51
+ .f16 .at { background-position: 0 -544px; }
52
+ .f16 .au { background-position: 0 -560px; }
53
+ .f16 .aw { background-position: 0 -576px; }
54
+ .f16 .az { background-position: 0 -592px; }
55
+ .f16 .ba { background-position: 0 -608px; }
56
+ .f16 .bb { background-position: 0 -624px; }
57
+ .f16 .bd { background-position: 0 -640px; }
58
+ .f16 .be { background-position: 0 -656px; }
59
+ .f16 .bf { background-position: 0 -672px; }
60
+ .f16 .bg { background-position: 0 -688px; }
61
+ .f16 .bh { background-position: 0 -704px; }
62
+ .f16 .bi { background-position: 0 -720px; }
63
+ .f16 .bj { background-position: 0 -736px; }
64
+ .f16 .bm { background-position: 0 -752px; }
65
+ .f16 .bn { background-position: 0 -768px; }
66
+ .f16 .bo { background-position: 0 -784px; }
67
+ .f16 .br { background-position: 0 -800px; }
68
+ .f16 .bs { background-position: 0 -816px; }
69
+ .f16 .bt { background-position: 0 -832px; }
70
+ .f16 .bw { background-position: 0 -848px; }
71
+ .f16 .by { background-position: 0 -864px; }
72
+ .f16 .bz { background-position: 0 -880px; }
73
+ .f16 .ca { background-position: 0 -896px; }
74
+ .f16 .cg { background-position: 0 -912px; }
75
+ .f16 .cf { background-position: 0 -928px; }
76
+ .f16 .cd { background-position: 0 -944px; }
77
+ .f16 .ch { background-position: 0 -960px; }
78
+ .f16 .ci { background-position: 0 -976px; }
79
+ .f16 .ck { background-position: 0 -992px; }
80
+ .f16 .cl { background-position: 0 -1008px; }
81
+ .f16 .cm { background-position: 0 -1024px; }
82
+ .f16 .cn { background-position: 0 -1040px; }
83
+ .f16 .co { background-position: 0 -1056px; }
84
+ .f16 .cr { background-position: 0 -1072px; }
85
+ .f16 .cu { background-position: 0 -1088px; }
86
+ .f16 .cv { background-position: 0 -1104px; }
87
+ .f16 .cy { background-position: 0 -1120px; }
88
+ .f16 .cz { background-position: 0 -1136px; }
89
+ .f16 .de { background-position: 0 -1152px; }
90
+ .f16 .dj { background-position: 0 -1168px; }
91
+ .f16 .dk { background-position: 0 -1184px; }
92
+ .f16 .dm { background-position: 0 -1200px; }
93
+ .f16 .do { background-position: 0 -1216px; }
94
+ .f16 .dz { background-position: 0 -1232px; }
95
+ .f16 .ec { background-position: 0 -1248px; }
96
+ .f16 .ee { background-position: 0 -1264px; }
97
+ .f16 .eg { background-position: 0 -1280px; }
98
+ .f16 .eh { background-position: 0 -1296px; }
99
+ .f16 .er { background-position: 0 -1312px; }
100
+ .f16 .es { background-position: 0 -1328px; }
101
+ .f16 .et { background-position: 0 -1344px; }
102
+ .f16 .fi { background-position: 0 -1360px; }
103
+ .f16 .fj { background-position: 0 -1376px; }
104
+ .f16 .fm { background-position: 0 -1392px; }
105
+ .f16 .fo { background-position: 0 -1408px; }
106
+ .f16 .fr { background-position: 0 -1424px; }
107
+ .f16 .ga { background-position: 0 -1440px; }
108
+ .f16 .gb { background-position: 0 -1456px; }
109
+ .f16 .gd { background-position: 0 -1472px; }
110
+ .f16 .ge { background-position: 0 -1488px; }
111
+ .f16 .gg { background-position: 0 -1504px; }
112
+ .f16 .gh { background-position: 0 -1520px; }
113
+ .f16 .gi { background-position: 0 -1536px; }
114
+ .f16 .gl { background-position: 0 -1552px; }
115
+ .f16 .gm { background-position: 0 -1568px; }
116
+ .f16 .gn { background-position: 0 -1584px; }
117
+ .f16 .gp { background-position: 0 -1600px; }
118
+ .f16 .gq { background-position: 0 -1616px; }
119
+ .f16 .gr { background-position: 0 -1632px; }
120
+ .f16 .gt { background-position: 0 -1648px; }
121
+ .f16 .gu { background-position: 0 -1664px; }
122
+ .f16 .gw { background-position: 0 -1680px; }
123
+ .f16 .gy { background-position: 0 -1696px; }
124
+ .f16 .hk { background-position: 0 -1712px; }
125
+ .f16 .hn { background-position: 0 -1728px; }
126
+ .f16 .hr { background-position: 0 -1744px; }
127
+ .f16 .ht { background-position: 0 -1760px; }
128
+ .f16 .hu { background-position: 0 -1776px; }
129
+ .f16 .id { background-position: 0 -1792px; }
130
+ .f16 .mc { background-position: 0 -1792px; }
131
+ .f16 .ie { background-position: 0 -1808px; }
132
+ .f16 .il { background-position: 0 -1824px; }
133
+ .f16 .im { background-position: 0 -1840px; }
134
+ .f16 .in { background-position: 0 -1856px; }
135
+ .f16 .iq { background-position: 0 -1872px; }
136
+ .f16 .ir { background-position: 0 -1888px; }
137
+ .f16 .is { background-position: 0 -1904px; }
138
+ .f16 .it { background-position: 0 -1920px; }
139
+ .f16 .je { background-position: 0 -1936px; }
140
+ .f16 .jm { background-position: 0 -1952px; }
141
+ .f16 .jo { background-position: 0 -1968px; }
142
+ .f16 .jp { background-position: 0 -1984px; }
143
+ .f16 .ke { background-position: 0 -2000px; }
144
+ .f16 .kg { background-position: 0 -2016px; }
145
+ .f16 .kh { background-position: 0 -2032px; }
146
+ .f16 .ki { background-position: 0 -2048px; }
147
+ .f16 .km { background-position: 0 -2064px; }
148
+ .f16 .kn { background-position: 0 -2080px; }
149
+ .f16 .kp { background-position: 0 -2096px; }
150
+ .f16 .kr { background-position: 0 -2112px; }
151
+ .f16 .kw { background-position: 0 -2128px; }
152
+ .f16 .ky { background-position: 0 -2144px; }
153
+ .f16 .kz { background-position: 0 -2160px; }
154
+ .f16 .la { background-position: 0 -2176px; }
155
+ .f16 .lb { background-position: 0 -2192px; }
156
+ .f16 .lc { background-position: 0 -2208px; }
157
+ .f16 .li { background-position: 0 -2224px; }
158
+ .f16 .lk { background-position: 0 -2240px; }
159
+ .f16 .lr { background-position: 0 -2256px; }
160
+ .f16 .ls { background-position: 0 -2272px; }
161
+ .f16 .lt { background-position: 0 -2288px; }
162
+ .f16 .lu { background-position: 0 -2304px; }
163
+ .f16 .lv { background-position: 0 -2320px; }
164
+ .f16 .ly { background-position: 0 -2336px; }
165
+ .f16 .ma { background-position: 0 -2352px; }
166
+ .f16 .md { background-position: 0 -2368px; }
167
+ .f16 .me { background-position: 0 -2384px; }
168
+ .f16 .mg { background-position: 0 -2400px; }
169
+ .f16 .mh { background-position: 0 -2416px; }
170
+ .f16 .mk { background-position: 0 -2432px; }
171
+ .f16 .ml { background-position: 0 -2448px; }
172
+ .f16 .mm { background-position: 0 -2464px; }
173
+ .f16 .mn { background-position: 0 -2480px; }
174
+ .f16 .mo { background-position: 0 -2496px; }
175
+ .f16 .mq { background-position: 0 -2512px; }
176
+ .f16 .mr { background-position: 0 -2528px; }
177
+ .f16 .ms { background-position: 0 -2544px; }
178
+ .f16 .mt { background-position: 0 -2560px; }
179
+ .f16 .mu { background-position: 0 -2576px; }
180
+ .f16 .mv { background-position: 0 -2592px; }
181
+ .f16 .mw { background-position: 0 -2608px; }
182
+ .f16 .mx { background-position: 0 -2624px; }
183
+ .f16 .my { background-position: 0 -2640px; }
184
+ .f16 .mz { background-position: 0 -2656px; }
185
+ .f16 .na { background-position: 0 -2672px; }
186
+ .f16 .nc { background-position: 0 -2688px; }
187
+ .f16 .ne { background-position: 0 -2704px; }
188
+ .f16 .ng { background-position: 0 -2720px; }
189
+ .f16 .ni { background-position: 0 -2736px; }
190
+ .f16 .nl { background-position: 0 -2752px; }
191
+ .f16 .no { background-position: 0 -2768px; }
192
+ .f16 .np { background-position: 0 -2784px; }
193
+ .f16 .nr { background-position: 0 -2800px; }
194
+ .f16 .nz { background-position: 0 -2816px; }
195
+ .f16 .om { background-position: 0 -2832px; }
196
+ .f16 .pa { background-position: 0 -2848px; }
197
+ .f16 .pe { background-position: 0 -2864px; }
198
+ .f16 .pf { background-position: 0 -2880px; }
199
+ .f16 .pg { background-position: 0 -2896px; }
200
+ .f16 .ph { background-position: 0 -2912px; }
201
+ .f16 .pk { background-position: 0 -2928px; }
202
+ .f16 .pl { background-position: 0 -2944px; }
203
+ .f16 .pr { background-position: 0 -2960px; }
204
+ .f16 .ps { background-position: 0 -2976px; }
205
+ .f16 .pt { background-position: 0 -2992px; }
206
+ .f16 .pw { background-position: 0 -3008px; }
207
+ .f16 .py { background-position: 0 -3024px; }
208
+ .f16 .qa { background-position: 0 -3040px; }
209
+ .f16 .re { background-position: 0 -3056px; }
210
+ .f16 .ro { background-position: 0 -3072px; }
211
+ .f16 .rs { background-position: 0 -3088px; }
212
+ .f16 .ru { background-position: 0 -3104px; }
213
+ .f16 .rw { background-position: 0 -3120px; }
214
+ .f16 .sa { background-position: 0 -3136px; }
215
+ .f16 .sb { background-position: 0 -3152px; }
216
+ .f16 .sc { background-position: 0 -3168px; }
217
+ .f16 .sd { background-position: 0 -3184px; }
218
+ .f16 .se { background-position: 0 -3200px; }
219
+ .f16 .sg { background-position: 0 -3216px; }
220
+ .f16 .si { background-position: 0 -3232px; }
221
+ .f16 .sk { background-position: 0 -3248px; }
222
+ .f16 .sl { background-position: 0 -3264px; }
223
+ .f16 .sm { background-position: 0 -3280px; }
224
+ .f16 .sn { background-position: 0 -3296px; }
225
+ .f16 .so { background-position: 0 -3312px; }
226
+ .f16 .sr { background-position: 0 -3328px; }
227
+ .f16 .st { background-position: 0 -3344px; }
228
+ .f16 .sv { background-position: 0 -3360px; }
229
+ .f16 .sy { background-position: 0 -3376px; }
230
+ .f16 .sz { background-position: 0 -3392px; }
231
+ .f16 .tc { background-position: 0 -3408px; }
232
+ .f16 .td { background-position: 0 -3424px; }
233
+ .f16 .tg { background-position: 0 -3440px; }
234
+ .f16 .th { background-position: 0 -3456px; }
235
+ .f16 .tj { background-position: 0 -3472px; }
236
+ .f16 .tl { background-position: 0 -3488px; }
237
+ .f16 .tm { background-position: 0 -3504px; }
238
+ .f16 .tn { background-position: 0 -3520px; }
239
+ .f16 .to { background-position: 0 -3536px; }
240
+ .f16 .tr { background-position: 0 -3552px; }
241
+ .f16 .tt { background-position: 0 -3568px; }
242
+ .f16 .tv { background-position: 0 -3584px; }
243
+ .f16 .tw { background-position: 0 -3600px; }
244
+ .f16 .tz { background-position: 0 -3616px; }
245
+ .f16 .ua { background-position: 0 -3632px; }
246
+ .f16 .ug { background-position: 0 -3648px; }
247
+ .f16 .us { background-position: 0 -3664px; }
248
+ .f16 .uy { background-position: 0 -3680px; }
249
+ .f16 .uz { background-position: 0 -3696px; }
250
+ .f16 .va { background-position: 0 -3712px; }
251
+ .f16 .vc { background-position: 0 -3728px; }
252
+ .f16 .ve { background-position: 0 -3744px; }
253
+ .f16 .vg { background-position: 0 -3760px; }
254
+ .f16 .vi { background-position: 0 -3776px; }
255
+ .f16 .vn { background-position: 0 -3792px; }
256
+ .f16 .vu { background-position: 0 -3808px; }
257
+ .f16 .ws { background-position: 0 -3824px; }
258
+ .f16 .ye { background-position: 0 -3840px; }
259
+ .f16 .za { background-position: 0 -3856px; }
260
+ .f16 .zm { background-position: 0 -3872px; }
261
+ .f16 .zw { background-position: 0 -3888px; }
262
+
263
+ #wrapper {
264
+ padding: 0 20px;
265
+ width: 700px;
266
+ }
267
+
268
+ #wrapper .intl-number-input input {
269
+ border-radius: 0;
270
+ width: 250px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
  }
272
 
273
  .actions {
274
+ margin-top: 20px;
275
  }
includes/css/show-login.css DELETED
@@ -1,89 +0,0 @@
1
- body.login div#login {
2
- display: block;
3
- }
4
-
5
- body.login div#login form#loginform input#user_login {
6
- display: block;
7
- }
8
-
9
- body.login div#login form#loginform p.forgetmenot {
10
- display: block;
11
- }
12
-
13
- body.login div#login form#loginform p.submit input#wp-submit {
14
- display: block;
15
- }
16
-
17
- body.login div#login form#loginform p label {
18
- display: block;
19
- }
20
-
21
- body.login div#login p#nav {
22
- display: block;
23
- }
24
-
25
- body.login div#login form#loginform input#user_pass {
26
- display: block;
27
- }
28
-
29
- body.login div#login div#login_error {
30
- display: block;
31
- }
32
-
33
- body.login div#login div#login_error1 {
34
- border-left: 4px solid #dd3d36;
35
- margin-left: 0;
36
- padding: 12px;
37
- background: #fff;
38
- -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
39
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
40
- }
41
-
42
- input.button-add {
43
- background: #00a0d2 url(../../includes/images/mo_white_logo.png) no-repeat 10px center !important;
44
- background-size: 16px !important;
45
- }
46
-
47
- .miniorange-button {
48
- height: 34px;
49
- display: inline-block;
50
- font-size: 14px;
51
- line-height: 28px;
52
- padding: 0 12px 2px;
53
- border-width: 1px;
54
- vertical-align: baseline;
55
- border-style: solid;
56
- border-color: #0073aa;
57
- -webkit-appearance: none;
58
- -webkit-border-radius: 3px;
59
- border-radius: 3px;
60
- white-space: nowrap;
61
- -webkit-box-sizing: border-box;
62
- -moz-box-sizing: border-box;
63
- box-sizing: border-box;
64
- -webkit-box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
65
- box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
66
- color: #fff;
67
- text-decoration: none;
68
- cursor: pointer;
69
- }
70
-
71
- .login_with_2factor_inner_div {
72
- border-bottom: 1px solid #EEE;
73
- width: 90%;
74
- margin: 0 5%;
75
- z-index: 1;
76
- top: 50%;
77
- position: absolute;
78
- }
79
-
80
- .login_with_2factor_h2 {
81
- color: #666;
82
- margin: 0 auto 20px auto;
83
- padding: 3px 0;
84
- text-align: center;
85
- background: white;
86
- width: 20%;
87
- position: relative;
88
- z-index: 2;
89
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/css/style_settings.css CHANGED
@@ -1,8 +1,2443 @@
1
- .mo2f_table_layout {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  background-color: #FFFFFF;
3
  border: 1px solid #CCCCCC;
4
- padding: 0px 24px 0px 20px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  }
 
 
 
 
 
 
 
6
 
7
  .impt {
8
  color: #FF0000
@@ -45,24 +2480,6 @@
45
  .panel_toggle:hover {
46
  text-decoration: underline;
47
  }
48
-
49
- .mo2f_authy_step1 {
50
- vertical-align: top;
51
- padding-right: 15px;
52
- width: 26%;
53
- }
54
-
55
- .mo2f_authy_step2 {
56
- vertical-align: top;
57
- padding-right: 15px;
58
- width: 46%;
59
- }
60
-
61
- .mo2f_table_textbox {
62
- width: 100%;
63
- height: 30px;
64
- }
65
-
66
  .mo2f_settings_table {
67
  width: 100%;
68
  }
@@ -133,57 +2550,17 @@ a {
133
  margin-right: 20px !important;
134
  }
135
 
136
- .mo2f_faqs > h3 > a:focus {
137
- box-shadow: 0px 0px 0px 0px #fff !important;
138
- }
139
-
140
- .mo2f_msgs {
141
- font-size: 14px !important;
142
- }
143
-
144
- .mo2f_row {
145
-
146
- display: -webkit-inline-box !important;
147
- }
148
-
149
- .configuredBasic {
150
- background: url(../images/feat_smart.png) rgba(99, 143, 223, 0.42) no-repeat right;
151
- padding: 10px;
152
- margin-bottom: 0px;
153
- }
154
-
155
- .configuredSmart {
156
- background: url(../images/Smartphone-24.png) rgba(99, 143, 223, 0.42) no-repeat right;
157
- padding: 10px;
158
- margin-bottom: 0px;
159
- }
160
-
161
- .notConfiguredBasic {
162
- background: url(../images/feat_smart.png) rgba(221, 221, 221, 0.66) no-repeat right;
163
- padding: 10px;
164
- margin-bottom: 0px;
165
- }
166
-
167
- .notConfiguredSmart {
168
- background: url(../images/Smartphone-24.png) rgba(221, 221, 221, 0.66) no-repeat right;
169
- padding: 10px;
170
- margin-bottom: 0px;
171
- }
172
-
173
- .configuredLandline {
174
- background: url(../images/landline_sprite.png) rgba(99, 143, 223, 0.42) no-repeat right;
175
- padding: 10px;
176
- margin-bottom: 0px;
177
  }
178
 
179
- .notConfiguredLandline {
180
- background: url(../images/landline_sprite.png) rgba(221, 221, 221, 0.66) no-repeat right;
181
- padding: 10px;
182
- margin-bottom: 0px;
183
  }
184
 
185
- .selectedMethod {
186
- background-color: rgba(54, 157, 4, 0.42) !important;
 
187
  }
188
 
189
  .color-icon {
@@ -260,94 +2637,7 @@ a {
260
  background-color: #1a71a4 !important;
261
  }
262
 
263
- .mo2f_kba_ques {
264
- width: 412px !important;
265
- border-radius: 4px;
266
- height: 30px;
267
- font-size: 13px !important;
268
- }
269
-
270
- .mo2f_kba_table {
271
- padding-left: 10px;
272
- width: 80%;
273
- }
274
-
275
- .mo2f_kba_tb_data {
276
- padding-left: 80px;
277
- }
278
-
279
- .mo2f_grayed_out {
280
- background-color: rgba(128, 128, 128, 0.05) !important;
281
- opacity: .5;
282
- }
283
-
284
- .mo2f_grayed_out_link {
285
- position: absolute;
286
- float: right;
287
- margin: 0.5% 0 0 24%;
288
- z-index: 99;
289
- }
290
-
291
- .black_overlay {
292
- display: none;
293
- position: absolute;
294
- top: 0%;
295
- left: 0%;
296
- width: 100%;
297
- height: 100%;
298
- background-color: black;
299
- z-index: 1001;
300
- -moz-opacity: 0.8;
301
- opacity: .80;
302
- filter: alpha(opacity=80);
303
- }
304
-
305
- .mo2f_2factor_heading_images {
306
- display: inline-block;
307
- width: 20px;
308
- height: 20px;
309
- float: left
310
- }
311
-
312
- .mo2f_advanced_options_images {
313
- display: inline-block;
314
- padding: 15px;
315
- width: 20px;
316
- height: 20px;
317
- float: left
318
- }
319
-
320
- .mo2f_view_premium_plan_auth_methods, .mo2f_view_standard_plan_auth_methods, .mo2f_view_backup_options, .mo2f_view_backup_options_prem,
321
- .mo2f_view_login_options, .mo2f_view_inline_registration_options, .mo2f_view_customizations, .mo2f_advanced_options_a,
322
- .mo2f_view_customizations_prem {
323
- color: navy;
324
- cursor: pointer;
325
- }
326
-
327
- .mo2f_view_free_plan_auth_methods {
328
- color: black;
329
- cursor: pointer;
330
- }
331
-
332
- .mo2f_view_free_plan_auth_methods:hover {
333
- color: black;
334
- }
335
-
336
- .mo2f_view_premium_plan_auth_methods:hover, .mo2f_view_standard_plan_auth_methods:hover, .mo2f_view_backup_options:hover,
337
- .mo2f_view_backup_options_prem:hover, .mo2f_view_customizations_prem:hover, .mo2f_view_login_options:hover, .mo2f_view_inline_registration_options:hover, .mo2f_view_customizations:hover {
338
- color: limegreen;
339
- }
340
-
341
- .mo2f_heading_style {
342
- font-size: 18px;
343
- font-family: Segoe UI;
344
- padding: 11px;
345
- }
346
 
347
- .mo2f_auth_methods_table {
348
- border-spacing: 15px;
349
- border-collapse: separate;
350
- }
351
 
352
  .mo2f_auth_methods_thumbnail {
353
  width: 50px;
@@ -361,33 +2651,6 @@ a {
361
  font-weight: bold;
362
  }
363
 
364
- .mo2f_configure_2_factor {
365
- padding: 10px;
366
- float: left;
367
- line-height: 20px;
368
- }
369
-
370
- .mo2f_set_2_factor {
371
- padding: 10px;
372
- float: right;
373
- line-height: 20px;
374
- }
375
-
376
- .mo2f_configure_set_2_factor {
377
- background-color: Transparent;
378
- background-repeat: no-repeat;
379
- border: none;
380
- cursor: pointer;
381
- overflow: hidden;
382
- outline: none;
383
- color: white;
384
- }
385
-
386
- .mo2f_configure_set_2_factor:hover {
387
- font-weight: bold;
388
- font-size: 14px;
389
- }
390
-
391
  .mo_table-bordered, .mo_table-bordered > tbody > tr > td {
392
  border: 1px solid #ddd;
393
  }
@@ -459,16 +2722,7 @@ a {
459
 
460
  /* added by gayathri */
461
 
462
- .mo2f_google_authy_step2 {
463
- vertical-align: top;
464
- padding-right: 15px;
465
- width: 70%;
466
- }
467
-
468
- .mo2f_google_authy_step3 {
469
- vertical-align: top;
470
- width: 30%
471
- }
472
 
473
  .mo2f_vertical_line {
474
  border-left: 1px solid #EBECEC;
@@ -625,18 +2879,6 @@ a {
625
 
626
  }
627
 
628
- .mo2f_setup_2_factor_tab {
629
- background-color: white;
630
- border-style: solid;
631
- border-color: lightgrey;
632
- border-radius: 4px;
633
- border-width: 1px;
634
- padding: 20px;
635
- width: 93%;
636
- align-content: center
637
-
638
- }
639
-
640
  #step1_skip, #step2_skip, #step3_skip, #step5_skip_test, #step4_skip_test {
641
  float: left;
642
  }
@@ -653,40 +2895,6 @@ a {
653
  curosr: pointer
654
  }
655
 
656
- .mo2f_vertical-submenu {
657
- margin: 0;
658
- padding: 0;
659
- width: 117%;
660
- border-spacing: auto;
661
-
662
- }
663
-
664
- .mo2f_vertical-submenu a {
665
- display: inline;
666
- background-color: #cce;
667
- color: black;
668
- margin-left: 6px;
669
- width: 28%;
670
- margin-top: 15px;
671
- text-decoration: none;
672
- text-align: center;
673
- padding: 11px;
674
- }
675
-
676
- .mo2f_vertical-submenu a:hover {
677
- background-color: #ccc;
678
- }
679
-
680
- .mo2f_vertical-submenu a.active {
681
- background-color: #4CAF50;
682
- color: white;
683
- }
684
-
685
- .mo2f_box {
686
- border: 1px solid #DCDCDC;
687
- padding: 20px;
688
- }
689
-
690
  .mo2f_pointer {
691
  cursor: pointer;
692
  }
@@ -719,16 +2927,18 @@ a {
719
  }
720
 
721
  /* The alert message box */
 
722
  .alert {
723
  font-style: italic;
724
  padding: 10px;
725
- background-color: yellowgreen; /* Red */
726
  color: white;
727
  margin-bottom: 15px;
728
  border-radius:5px;
729
  }
730
 
731
  /* The close button */
 
732
  .closebtn {
733
  margin-left: 15px;
734
  color: white;
@@ -742,6 +2952,7 @@ a {
742
  }
743
 
744
  /* When moving the mouse over the close button */
 
745
  .closebtn:hover {
746
  color: black;
747
  }
@@ -758,7 +2969,7 @@ a {
758
 
759
  .mo2f_support_layout {
760
  width: 40%;
761
- height: 78%;
762
  background-color: #FFFFFF;
763
  padding: 0px 24px 0px 20px;
764
  display: none;
@@ -950,24 +3161,6 @@ a {
950
 
951
  }
952
 
953
- .inactiveMethod {
954
- background-color: rgba(221, 221, 221, 0.66) !important;
955
- margin-left: 20.5%;
956
-
957
- }
958
-
959
- .configuredLaptop {
960
- background: url(../images/laptop-24.png) rgba(99, 143, 223, 0.42) no-repeat right;
961
- padding: 10px;
962
- margin-bottom: 0px;
963
- }
964
-
965
- .notConfiguredLaptop {
966
- background: url(../images/laptop-24.png) rgba(221, 221, 221, 0.66) no-repeat right;
967
- padding: 20px;
968
- margin-bottom: 0px;
969
- }
970
-
971
  .mo2f_column_padding {
972
  padding-right: 10px;
973
 
@@ -1052,23 +3245,6 @@ a {
1052
  filter: alpha(opacity=80);
1053
  }
1054
 
1055
- .mo2f_setup_2factor_tab {
1056
- align-content: center;
1057
- width: 107%;
1058
- min-height: 394px;
1059
- padding:5px;
1060
- }
1061
-
1062
- .mo2f_2factor_heading_images {
1063
- display: inline-block;
1064
- width: 20px;
1065
- height: 20px;
1066
- float: left;
1067
- margin-right:1%;
1068
- margin-top: 1.5%;
1069
- margin-left: 1.5%;
1070
- }
1071
-
1072
  .mo2f_advanced_options_images {
1073
  display: inline-block;
1074
  padding: 15px;
@@ -1109,13 +3285,6 @@ a {
1109
  border-collapse: separate;
1110
  }
1111
 
1112
- .mo2f_auth_methods_thumbnail {
1113
- width: 50px;
1114
- height: 50px;
1115
- padding: 20px;
1116
- line-height: 80px;
1117
- }
1118
-
1119
  .mo2f_auth_method_title {
1120
  font-size: 15px;
1121
  font-weight: bold;
@@ -1219,7 +3388,7 @@ a {
1219
 
1220
  /* added by gayathri */
1221
 
1222
- .mo2f_google_authy_step2 {
1223
  vertical-align: top;
1224
  padding-right: 15px;
1225
  width: 70%;
@@ -1494,9 +3663,9 @@ a {
1494
  color: #0073aa;
1495
  cursor: pointer;
1496
  outline: 0
1497
- }
1498
 
1499
- .twofa-license {
1500
  background-color: orange !important;
1501
  color: #000 !important
1502
  }
@@ -1506,17 +3675,6 @@ a {
1506
  border-color: #c28f37 !important
1507
  }
1508
 
1509
- /* The alert message box */
1510
- .alert {
1511
- font-style: italic;
1512
- padding: 10px;
1513
- background-color: yellowgreen; /* Red */
1514
- color: white;
1515
- margin-bottom: 15px;
1516
- border-radius:5px;
1517
- }
1518
-
1519
- /* The close button */
1520
  .closebtn {
1521
  margin-left: 15px;
1522
  color: white;
@@ -1529,13 +3687,12 @@ a {
1529
  transition: 0.3s;
1530
  }
1531
 
1532
- /* When moving the mouse over the close button */
1533
  .closebtn:hover {
1534
  color: black;
1535
- }
1536
 
1537
 
1538
- .sidenav {
1539
  height: 100%;
1540
  z-index: 1;
1541
  float:left;
@@ -1557,40 +3714,35 @@ a {
1557
  }
1558
 
1559
  .main {
1560
- margin-left: 200px; /* Same as the width of the sidenav */
1561
-
1562
- }
1563
 
1564
- @media screen and (max-height: 450px) {
1565
  .sidenav {padding-top: 15px;}
1566
  .sidenav a {font-size: 18px;}
1567
  }
1568
  .mo2f_content{
1569
  float:Right;
1570
  width:90%;
1571
- }
1572
-
1573
- * {
1574
- box-sizing: border-box;
1575
- }
1576
 
1577
  /* Create two unequal columns that floats next to each other */
1578
- .column {
1579
  float: left;
1580
  padding: 10px;
1581
  height: 300px; /* Should be removed. Only for demonstration */
1582
- }
1583
 
1584
- .left {
1585
  width: 13%;
1586
  }
1587
 
1588
  .right {
1589
  width: 87%;
1590
- }
1591
 
1592
  /* Clear floats after the columns */
1593
- .row:after {
1594
  content: "";
1595
  display: table;
1596
  clear: both;
@@ -1598,10 +3750,10 @@ a {
1598
 
1599
  ----------------
1600
  * {box-sizing: border-box}
1601
- body {font-family: "Lato", sans-serif;}
1602
 
1603
  /* Style the tab */
1604
- .tab {
1605
  float: left;
1606
  background-color: #23282D;
1607
  width: 15%;
@@ -1610,7 +3762,7 @@ body {font-family: "Lato", sans-serif;}
1610
  }
1611
 
1612
  /* Style the buttons inside the tab */
1613
- .tab button {
1614
  display: block;
1615
  background-color: inherit;
1616
  color: black;
@@ -1648,38 +3800,28 @@ body {font-family: "Lato", sans-serif;}
1648
  color: #000;
1649
  transform: scale(1,1.03);
1650
  border-bottom: 0px;
1651
- }
1652
 
1653
  /* Create an active/current "tab button" class */
1654
- .tab a.active {
1655
  background-color: white;
1656
  color:#F6821F;
1657
 
1658
  box-shadow: 0px 0px 5px #aaaaaa;
1659
  font-weight: bold;
1660
- }
1661
 
1662
  /* Change background color of buttons on hover */
1663
- .tab button:hover {
1664
  background-color: #ddd;
1665
- }
1666
 
1667
  /* Create an active/current "tab button" class */
1668
- .tab button.active {
1669
  background-color: #ccc;
1670
 
1671
  }
1672
 
1673
- /* Style the tab content */
1674
- .tabcontent {
1675
- float: left;
1676
- border: 1px solid #ccc;
1677
- width: 85%;
1678
- border-left: none;
1679
- min-height: 445px;
1680
- background-color: #fff;
1681
- }
1682
-
1683
  .tooltip {
1684
  position: relative;
1685
  display: inline-block;
@@ -1728,9 +3870,10 @@ body {font-family: "Lato", sans-serif;}
1728
  }
1729
  .active .arrow-left{
1730
  visibility: visible;
1731
- }
1732
  ----------------------------------------------
1733
  /* with network security features.*/
 
1734
  .mo2f_backdrop{
1735
  top: 0;
1736
  left: 0;
@@ -1747,10 +3890,10 @@ body {font-family: "Lato", sans-serif;}
1747
  top: 9%;
1748
  left: 81%;
1749
  z-index: 1;
1750
- float:right;
1751
- background-color:#ffba00;
1752
- color:black;
1753
- width:16%;
1754
  font-size: 17px;
1755
  }
1756
 
@@ -1771,9 +3914,9 @@ body {font-family: "Lato", sans-serif;}
1771
  position:fixed;
1772
  left: 83.5%;
1773
  z-index: 9999;
1774
- height:34px;
1775
  }
1776
 
1777
  .mo2f_orange{
1778
  background:orange;
1779
- }
1
+ .mo_wpns_help_title {
2
+ font-size:17px;
3
+ width:100%;
4
+ color:#1B79AE;
5
+ cursor:pointer;
6
+ font-weight: bold;
7
+ }
8
+ .mo_wpns_help_desc {
9
+ font-size:13px;
10
+ border-left:solid 2px rgba(128, 128, 128, 0.65);
11
+ margin-top:10px;
12
+ padding-left:10px;
13
+ margin-bottom:20px
14
+ }
15
+ .mo_wpns_help {
16
+ width: 95%;
17
+ }
18
+ .mo_wpns_help_cell {
19
+ padding: 20px;
20
+ border-bottom: solid 1px grey;
21
+ }
22
+ .mo_input_text_box_size
23
+ {
24
+ width: 600px;
25
+ height: 41px;
26
+ }
27
+ .mo_wpns_table_layout {
28
+ background-color:#FFFFFF;
29
+ border:1px solid #CCCCCC;
30
+ margin-bottom: 10px;
31
+ height:auto;
32
+ width:63%;
33
+ float:left;
34
+ }
35
+
36
+ .mo_wpns_tab {
37
+ /*overflow: hidden;*/
38
+ /*border: 1px solid #ccc;*/
39
+ background-color: #f1f1f1;
40
+ margin:22px;
41
+ height: 31px;
42
+ }
43
+
44
+ /* Style the buttons inside the tab */
45
+ .mo_wpns_tab button {
46
+ background-color: inherit;
47
+ float: left;
48
+ outline: none;
49
+ cursor: pointer;
50
+ padding: 7px 6px;
51
+ transition: 0.3s;
52
+ font-size: 103%;
53
+ margin-top: 20px;
54
+ margin-bottom: 20px;
55
+ border: solid 1px #20b2aa;
56
+ background-color: white;
57
+ color: black;
58
+ width :162px;
59
+ }
60
+
61
+ /* Change background color of buttons on hover */
62
+ .mo_wpns_tab button:hover {
63
+ background-color: #20b2aa;
64
+ color: white;
65
+ }
66
+
67
+ /* Create an active/current tablink class */
68
+ .mo_wpns_tab button.active {
69
+ background-color: #20b2aa;
70
+ color: white;
71
+ width: 20%;
72
+ border: solid 1px #20b2aa;
73
+ /*border-bottom: none;*/
74
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
75
+ font-weight: 600;
76
+ }
77
+
78
+ /* Style the tab content */
79
+ .mo_wpns_tabcontent {
80
+ display: none;
81
+ /*padding: 6px 12px;
82
+ border: 1px solid #ccc;*/
83
+ border-top: none;
84
+ }
85
+ .mo_wpsn_button {
86
+ background-color: #20b2aa; /* Green */
87
+ border: none;
88
+ color: white;
89
+ padding: 11px 32px;
90
+ text-align: center;
91
+ text-decoration: none;
92
+ display: inline-block;
93
+ font-size: 16px;
94
+ margin: 4px 2px;
95
+ cursor: pointer;
96
+ -webkit-transition-duration: 0.4s; /* Safari */
97
+ transition-duration: 0.4s;
98
+ }
99
+ .mo_wpsn_button1:hover {
100
+ box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
101
+ color: white;
102
+ }
103
+ .mo_wpns_table_layout {
104
+ background-color:#FFFFFF;
105
+ border:1px solid #CCCCCC;
106
+ padding:0px 24px 10px 10px;
107
+ min-height:220px;
108
+ }
109
+ .mo_wpns_divided_layout_tab{
110
+ margin-bottom: 10px;
111
+ margin-top: 10px;
112
+ height:auto;
113
+ width:100%;
114
+ float:left;
115
+
116
+
117
+ }
118
+ .mo_wpns_divided_layout{
119
+ margin-bottom: 10px;
120
+ margin-top: 10px;
121
+ height:auto;
122
+ width:74%;
123
+ float:left;
124
+
125
+
126
+ }
127
+ .mo_wpns_divided_layout_2
128
+ {
129
+ float: left;
130
+ margin-top: 10px;
131
+ padding: 5px 2px;
132
+ height: auto;
133
+ width: 25%;
134
+ }
135
+ .mo_wpns_small_layout_waf{
136
+ margin: 10px;
137
+ padding: 5px 20px;
138
+ background-color: #FFFFFF;
139
+ float: left;
140
+ width: 42%;
141
+ margin-left: 1%;
142
+ min-height: 222px;
143
+ overflow: hidden;
144
+ text-align: center;
145
+ border-top: 6px solid lightseagreen;
146
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
147
+ }
148
+ .mo_wpns_small_layout{
149
+ /*background-color:#FFFFFF;
150
+ border:1px solid #CCCCCC;
151
+ padding:30px 40px 30px 20px;
152
+ margin-bottom: 20px;
153
+ width :29%;*/
154
+ margin: 10px;
155
+ padding: 5px 20px;
156
+ background-color: #FFFFFF;
157
+ /*border: 1px solid #CCCCCC;*/
158
+ float: left;
159
+ width: 42%;
160
+ margin-left: 1%;
161
+ min-height: 222px;
162
+ overflow: hidden;
163
+ text-align: center;
164
+ border-top: 6px solid lightseagreen;
165
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
166
+ /*font-style: italic;*/
167
+
168
+ }
169
+ .mo_wpns_method_layout{
170
+ margin: 10px;
171
+ padding: 5px 20px;
172
+ background-color: #FFFFFF;
173
+ /* border: 1px solid #CCCCCC; */
174
+ float: left;
175
+ width: 30%;
176
+ margin-left: 1%;
177
+ min-height: 222px;
178
+ overflow: hidden;
179
+ text-align: center;
180
+ border-top: 6px solid lightseagreen;
181
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
182
+ /*font-style: italic;*/
183
+
184
+ }
185
+ .mo_wpns_small_2_layout
186
+ {
187
+ /*margin: 10px;*/
188
+ /*padding: 5px 20px;*/
189
+ /*background-color: yellow;*/
190
+ /*border: 1px solid #CCCCCC;*/
191
+ float: left;
192
+ width: 47%;
193
+ margin-left: 1%;
194
+ height: 222px;
195
+ text-align: center;
196
+ }
197
+
198
+ .mo_wpns_small_3_layout
199
+ {
200
+ float: left;
201
+ width: 64%;
202
+ height: 222px;
203
+ text-align: center;
204
+ margin-top: 35px;
205
+ }
206
+ .mo_wpns_line
207
+ {
208
+ border: 1.2px solid #20b2aa;
209
+ }
210
+ .mo_wpns_dashboard_layout
211
+ {
212
+ margin: 10px;
213
+ padding: 5px 20px;
214
+ background-color: none;
215
+ /*border: 1px solid #CCCCCC;*/
216
+ float: left;
217
+ width: 94%;
218
+ height: auto;
219
+ margin-left: 1%;
220
+ }
221
+ .mo_wpns_inside_dashboard_layout
222
+ {
223
+ /*margin-top: 10px;*/
224
+ padding: 5px 0px;
225
  background-color: #FFFFFF;
226
  border: 1px solid #CCCCCC;
227
+ float: left;
228
+ width: 17.5%;
229
+ height: 100px;
230
+ margin-left: 1%;
231
+ font-weight: 600;
232
+ border-top: 2px solid lightseagreen;
233
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
234
+ }
235
+ .mo_wpns_sub_dashboards_layout
236
+ {
237
+ margin-top: 10px;
238
+ padding: 5px 0px;
239
+ background-color: #FFFFFF;
240
+ border: 1px solid lightseagreen;
241
+ float: left;
242
+ width: 34%;
243
+ height: 170px;
244
+ margin-left: 1%;
245
+ font-weight: 600;
246
+ border-top: 4px solid lightseagreen;
247
+ /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
248
+ /*font-style: italic;*/
249
+ /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
250
+ }
251
+ .mo_wpns_sub_sub_dashboard_layout
252
+ {
253
+ margin-top: 10px;
254
+ padding: 5px 0px;
255
+ background-color: #FFFFFF;
256
+ border: 1px solid lightseagreen;
257
+ float: left;
258
+ width: 45%;
259
+ min-height: 56px;
260
+ overflow: hidden;
261
+ margin-left: 1%;
262
+ font-weight: 600;
263
+ border-top: 3px solid lightseagreen;
264
+ /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
265
+ /*font-style: italic;*/
266
+ }
267
+
268
+ .mo_wpns_dashboard_text
269
+ {
270
+ font-size: 50px;
271
+ margin-top: -15px;
272
+
273
+ }
274
+ .mo_wpns_dashboard_upgrade_layout
275
+ {
276
+
277
+ margin-top: 10px;
278
+ padding: 5px 20px;
279
+ background-color: white;
280
+ border-top: 5px solid orange;
281
+ width: 250px;
282
+ height: 100px;
283
+ margin-left: 1%;
284
+ text-align: center;
285
+ color: black;
286
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19)
287
+
288
+ /*margin-top: 10px;
289
+ padding: 5px 20px;
290
+ background-color: white;
291
+ border-top: 7px solid orange;
292
+
293
+ width: 250px;
294
+ height: 200px;
295
+ margin-left: 1%;
296
+ text-align: center;
297
+ color: black;
298
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
299
+ }
300
+ .mo_wpns_dashboard_sub_upgrade_layout
301
+ {
302
+ margin-top: 4px;
303
+ padding: 5px 20px;
304
+ background-color: white;
305
+ border-top: 4px solid orange;
306
+ width: 250px;
307
+ height: 186px;
308
+ margin-left: 1%;
309
+ text-align: center;
310
+ color: black;
311
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
312
+ /*margin-top: 20px;
313
+ padding: 5px 20px;
314
+ background-color: #20b2aa;
315
+ border: 1px solid #CCCCCC;
316
+ float: left;
317
+ width: 227px;
318
+ height: 170px;
319
+ margin-left: 1%;
320
+ color: white;
321
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
322
+ }
323
+ /*.mo_wpns_container{
324
+
325
+ width: 1100px;
326
+ background-color: yellow;
327
+ height: auto;
328
+ }*/
329
+
330
+ h2.mo_wpns_nav-tab-wrapper
331
+ {
332
+ border: none;
333
+ }
334
+ .mo_wpns_small_div_layout
335
+ {
336
+ width: 440px;
337
+ height: 470px;
338
+ background-color: yellow;
339
+ float: left;
340
+ }
341
+ .mo_wpns_support_layout{
342
+ padding: 5px 20px;
343
+ background-color: #FFFFFF;
344
+ border: 1px solid #CCCCCC;
345
+ width: 290px;
346
+ margin-left: 1%;
347
+ float: left;
348
+ text-align: center;
349
+ border: 2px solid lightseagreen;
350
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
351
+ }
352
+ .mo_wpns_settings_textarea
353
+ {
354
+ resize: vertical;
355
+ width:100%;
356
+ height: 105px;
357
+ }
358
+
359
+ .mo_wpns_third_layout{
360
+ margin-top: 10px;
361
+ padding: 5px 20px;
362
+ background-color: #FFFFFF;
363
+ border: 1px solid #CCCCCC;
364
+ float: left;
365
+ width: 29%;
366
+ margin-left: 1%;
367
+
368
+ }
369
+ .mo_wpns_dashboard_button
370
+ {
371
+ background-color: #4CAF50;
372
+ border: none;
373
+ color: white;
374
+ padding: 15px 32px;
375
+ text-align: center;
376
+ position: relative;
377
+ bottom: -80px;
378
+ text-decoration: none;
379
+ display: inline-block;
380
+ font-size: 16px;
381
+ margin: 4px 2px;
382
+ cursor: pointer;
383
+ }
384
+ .mo_wpns_report_layout
385
+ {
386
+ margin: 10px;
387
+ padding: 5px 20px;
388
+ background-color: #FFFFFF;
389
+ border: 2px solid #20b2aa;
390
+ float: left;
391
+ width: 593px;
392
+ min-height: 200px;
393
+ overflow: hidden;
394
+ text-align: center;
395
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
396
+ }
397
+ .mo_wpns_report_log_layout
398
+ {
399
+ margin-bottom: 10px;
400
+ margin-top: 10px;
401
+ height: auto;
402
+ width: 100%;
403
+ float: left;
404
+ /*background-color: yellow;*/
405
+ }
406
+ .mo_wpns_setting_layout
407
+ {
408
+ margin: 5px;
409
+ padding: 5px 20px 30px 20px;
410
+ background-color: #FFFFFF;
411
+ border: 2px solid #20b2aa;
412
+ float: left;
413
+ width: 94%;
414
+ margin-left: 1%;
415
+
416
+ overflow: hidden;
417
+ text-align: left;
418
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
419
+ }
420
+ .mo_wpns_sub_nav_tab {
421
+ /*overflow: hidden;*/
422
+ /*border: 1px solid #ccc;*/
423
+ background-color: #f1f1f1;
424
+ margin:22px;
425
+ }
426
+
427
+ /* Style the buttons inside the tab */
428
+ .mo_wpns_sub_nav_tab button {
429
+ background-color: inherit;
430
+ float: left;
431
+ outline: none;
432
+ cursor: pointer;
433
+ padding: 7px 6px;
434
+ transition: 0.3s;
435
+ font-size: 17px;
436
+ margin-top: 20px;
437
+ margin-bottom: 20px;
438
+ border-top: solid 1px;
439
+ border-bottom: solid 1px;
440
+ background-color: white;
441
+ color: black;
442
+ width :16%;
443
+ }
444
+
445
+ /* Change background color of buttons on hover */
446
+ .mo_wpns_sub_nav_tab button:hover {
447
+ background-color: #ddd;
448
+ }
449
+
450
+ /* Create an active/current tablink class */
451
+ .mo_wpns_sub_nav_tab button.mo_wpns_sub_nav_active {
452
+ background-color: #20b2aa;
453
+ color: white;
454
+ }
455
+
456
+ /* Style the tab content */
457
+ .mo_wpns_sub_nav_tabcontent {
458
+ display: none;
459
+ /*padding: 6px 12px;
460
+ border: 1px solid #ccc;*/
461
+ border-top: none;
462
+ }
463
+
464
+ .mo_wpns_sub_layout
465
+ {
466
+ margin: 10px;
467
+ padding: 5px 20px;
468
+ background-color: #FFFFFF;
469
+ border: 1px solid #CCCCCC;
470
+ float: left;
471
+ width: 438px;
472
+ margin-left: 1%;
473
+ height: 200px;
474
+ text-align: center;
475
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
476
+ }
477
+ .mo_wpns_details_layout
478
+ {
479
+ /*margin:10px;*/
480
+ height:auto;
481
+ width:96.7%;
482
+ float:left;
483
+ }
484
+ .mo_wpns_sub_details_layout
485
+ {
486
+ margin: 0px 10px;
487
+ height:200px;
488
+ width:23.3%;
489
+ float:left;
490
+ background-color: white;
491
+ border-top: 4px solid lightseagreen;
492
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
493
+ font-style: italic;
494
+ }
495
+ .mo_wpns_button {
496
+ background-color: #20b2aa; /* Green */
497
+ border: none;
498
+ color: white;
499
+ padding: 11px 28px;
500
+ text-align: center;
501
+ text-decoration: none;
502
+ display: inline-block;
503
+ font-size: 16px;
504
+ margin: 4px 2px;
505
+ cursor: pointer;
506
+ -webkit-transition-duration: 0.4s; /* Safari */
507
+ transition-duration: 0.4s;
508
+ }
509
+
510
+ .mo_wpns_upgrade_button
511
+ {
512
+ text-align: center;
513
+ background-color: orange;
514
+ width: 126px;
515
+ }
516
+
517
+
518
+ .mo_wpns_dashboard_button {
519
+ background-color: #20b2aa; /* Green */
520
+ border: none;
521
+ color: white;
522
+ padding-top: 10px;
523
+ text-align: center;
524
+ text-decoration: none;
525
+ display: inline-block;
526
+ font-size: 14px;
527
+ margin: 4px 2px;
528
+ cursor: pointer;
529
+ -webkit-transition-duration: 0.4s; /* Safari */
530
+ transition-duration: 0.4s;
531
+ }
532
+
533
+ .mo_wpns_dashboard_upgrade_button
534
+ {
535
+ text-align: center;
536
+ background-color: orange;
537
+ width: 113px;
538
+ height: 30px;
539
+ }
540
+
541
+ .mo_wpns_button1:hover {
542
+ box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
543
+ color: white;
544
+ }
545
+
546
+ .mo_wpns_products-dollar-amount {
547
+ color: #797878;
548
+ font-weight: 400;
549
+ font-size: 30px;
550
+ line-height: 25px;
551
+ }
552
+ .mo_wpns_products-dollar-detail {
553
+ margin-left: -2px;
554
+ text-transform: lowercase;
555
+ vertical-align: top;
556
+ font-size: 22px;
557
+ font-weight: 300;
558
+ }
559
+
560
+ .mo_wpns_collapsible {
561
+ /* background-color: white;
562
+ color: black;
563
+ cursor: pointer;
564
+ padding: 18px;*/
565
+ /*width: 100%;*/
566
+ /* border: none;
567
+ text-align: left;
568
+ outline: none;
569
+ font-size: 15px;*/
570
+ }
571
+
572
+ .mo_wpns_collapsible:hover {
573
+ background-color: #555;
574
+ }
575
+
576
+ .mo_wpns_content {
577
+ /*padding: 0 18px;*/
578
+ display: none;
579
+ overflow: hidden;
580
+ background-color: white;
581
+ }
582
+ .mo_wpns_pricing_enlarge_layout{
583
+ margin: 10px;
584
+ padding: 5px 20px;
585
+ background-color: #FFFFFF;
586
+ float: left;
587
+ width: 90%;
588
+ margin-left: 1%;
589
+ min-height: 222px;
590
+ overflow: hidden;
591
+ text-align: center;
592
+ border-top: 6px solid lightseagreen;
593
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
594
+ }
595
+
596
+ .mo_wpns_free_pricing_enlarge_layout{
597
+ margin: 10px;
598
+ /*padding: 5px 20px;*/
599
+ background-color: #FFFFFF;
600
+ float: left;
601
+ width: 100%;
602
+ /*margin-left: 1%;*/
603
+ /*min-height: 222px;*/
604
+ height: 220px;
605
+ overflow: hidden;
606
+ text-align: center;
607
+ /*border-top: 6px solid lightseagreen;*/
608
+ /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
609
+ }
610
+
611
+ .mo_wpns_table_col1_layout
612
+ {
613
+ width: 23%; border: 1px solid #dddddd;
614
+ text-align: left;
615
+ padding: 8px;
616
+ }
617
+ .mo_wpns_table_free_col1_layout
618
+ {
619
+ width: 21.8%;
620
+ border: 1px solid #dddddd;
621
+ text-align: left;
622
+ padding: 8px;
623
+ }
624
+ .mo_wpns_table_col2_layout
625
+ {
626
+ width: 60%;
627
+ font-size: 13px;
628
+ border: 1px solid #dddddd;
629
+ text-align: left;
630
+ padding: 8px;
631
+ }
632
+ .mo_wpns_table_free_col2_layout
633
+ {
634
+ width: 60%;
635
+ font-size: 13px;
636
+ border: 1px solid #dddddd;
637
+ text-align: left;
638
+ padding: 8px;
639
+ }
640
+ .mo_wpns_table_col3_layout
641
+ {
642
+ width: 1%;
643
+ border: 1px solid #dddddd;
644
+ color: red;
645
+ font-size: 15px;
646
+ text-align: left;
647
+ padding: 8px;
648
+ text-align: center;
649
+ }
650
+ .mo_wpns_table_free_col3_layout
651
+ {
652
+ width: 9.5%;
653
+ border: 1px solid #dddddd;
654
+ color: #4CC00E;
655
+ font-size: 15px;
656
+ text-align: left;
657
+ padding: 8px;
658
+ text-align: center;
659
+ }
660
+
661
+ .mo_wpns_table_row_layout
662
+ {
663
+ text-align: left;
664
+ font-size: 16px;
665
+ }
666
+ .mo_wpns_table_row_layout:nth-child(even) {
667
+ background-color: #dddddd;
668
+ }
669
+ .mo_wpns_free_feature_button {
670
+ /*background-color: green; /* Green */*/
671
+ border: none;
672
+ color: black;
673
+ padding: 11px 12px;
674
+ text-align: center;
675
+ text-decoration: none;
676
+ display: inline-block;
677
+ font-size: 22px;
678
+ /*border-radius: 50%;*/
679
+ margin: 4px 2px;
680
+ cursor: pointer;
681
+ -webkit-transition-duration: 0.4s; /* Safari */
682
+ transition-duration: 0.4s;
683
+ }
684
+ .mo_wpns_free_feature_button:hover
685
+ {
686
+ background-color: white;
687
+ color: green;
688
+ box-shadow: none;
689
+ }
690
+ .mo_wpns_premium_feature{
691
+ border: none;
692
+ color: black;
693
+ padding: 11px 12px;
694
+
695
+ text-decoration: none;
696
+ display: inline-block;
697
+ font-size: 22px;
698
+ /*border-radius: 50%;*/
699
+ margin: 4px 2px;
700
+ cursor: pointer;
701
+ -webkit-transition-duration: 0.4s; /* Safari */
702
+ transition-duration: 0.4s;
703
+ }
704
+ .mo_wpns_table_free_text_layout
705
+ {
706
+ /*width: 20%; */
707
+ height: auto;
708
+ text-align: left;
709
+ font-size: 20px;
710
+ }
711
+ .mo_wpns_all_in_one_layout
712
+ {
713
+ float: center;
714
+ }
715
+ .mo_all_in_one_pricing
716
+ {
717
+ margin-left: 25%;
718
+ }
719
+ .mo_all_in_one_pricing{
720
+ margin-left: 25%;
721
+ }
722
+ @media only screen and (max-width: 1024px)
723
+ {
724
+ .mo_wpns_divided_layout
725
+ {
726
+ margin-bottom: 10px;
727
+ margin-top: 10px;
728
+ height:auto;
729
+ width:100%;
730
+ float:left;
731
+ /*background-color: pink;*/
732
+ }
733
+ .mo_wpns_divided_layout_2
734
+ {
735
+ float: left;
736
+ margin-top: 10px;
737
+ padding: 5px 2px;
738
+ width: 100%;
739
+
740
+ }
741
+ .mo_wpns_divided_layout_tab{
742
+ margin-bottom: 10px;
743
+ margin-top: 10px;
744
+ height:auto;
745
+ width:100%;
746
+ float:left;
747
+
748
+
749
+ }
750
+ .mo_wpns_small_layout{
751
+ /*background-color:#FFFFFF;
752
+ border:1px solid #CCCCCC;
753
+ padding:30px 40px 30px 20px;
754
+ margin-bottom: 20px;
755
+ width :29%;*/
756
+ /*margin: 10px;*/
757
+ /*padding: 5px 20px;*/
758
+ background-color: #FFFFFF;
759
+ border: 1px solid #CCCCCC;
760
+ float: left;
761
+ width: 90%;
762
+ /*margin-left: 1%;*/
763
+ min-height: 222px;
764
+ overflow: hidden;
765
+ text-align: center;
766
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
767
+ /*font-style: italic;*/
768
+ border-top: 6px solid lightseagreen;
769
+ }
770
+
771
+ .mo_wpns_small_layout_test{
772
+ /*background-color:#FFFFFF;
773
+ border:1px solid #CCCCCC;
774
+ padding:30px 40px 30px 20px;
775
+ margin-bottom: 20px;
776
+ width :29%;*/
777
+ /*margin: 10px;*/
778
+ /*padding: 5px 20px;*/
779
+ background-color: #FFFFFF;
780
+ border: 1px solid #CCCCCC;
781
+ float: left;
782
+ width: 90%;
783
+ /*margin-left: 1%;*/
784
+ min-height: 222px;
785
+ overflow: hidden;
786
+ text-align: center;
787
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
788
+ /*font-style: italic;*/
789
+
790
+ }
791
+
792
+ .mo_wpns_small_2_layout
793
+ {
794
+ /*margin: 10px;*/
795
+ /*padding: 5px 20px;*/
796
+ /*background-color: yellow;*/
797
+ /*border: 1px solid #CCCCCC;*/
798
+ float: left;
799
+ width: 100%;
800
+ margin-left: 1%;
801
+ height: 120px;
802
+ text-align: center;
803
+ }
804
+ .mo_wpns_small_3_layout
805
+ {
806
+ float: left;
807
+ width: 68%;
808
+ height: 222px;
809
+ text-align: center;
810
+ margin-top: 26px;
811
+ }
812
+ .mo_wpns_dashboard_layout
813
+ {
814
+ /*margin: 10px;*/
815
+ padding: 5px 20px;
816
+ background-color: none;
817
+
818
+ float: left;
819
+ width: 90%;
820
+ height: auto;
821
+ /*margin-left: 1%;*/
822
+
823
+ }
824
+ .mo_wpns_inside_dashboard_layout
825
+ {
826
+ margin-top: 10px;
827
+ padding: 5px 0px;
828
+ background-color: #FFFFFF;
829
+ border: 1px solid #CCCCCC;
830
+ float: left;
831
+ width: 17.5%;
832
+ height: 100px;
833
+ border-top: 2px solid lightseagreen;
834
+ font-weight: 600;
835
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
836
+ }
837
+
838
+ /*.wpns_font_size {
839
+ font-size: 30px;
840
+ margin-top: -10px;
841
+ padding-right: 11px;
842
+ }*/
843
+ .mo_wpns_dashboard_text
844
+ {
845
+ font-size: 30px;
846
+ margin-top: 0px;
847
+
848
+ }
849
+ .mo_wpns_dashboard_upgrade_layout
850
+ {
851
+ margin-top: 10px;
852
+ padding: 5px 20px;
853
+ background-color: white;
854
+ border-top: 5px solid orange;
855
+ /*float: left;*/
856
+ width: 90%;
857
+ height: 100px;
858
+ margin-left: 1%;
859
+ text-align: center;
860
+ color: black;
861
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
862
+ }
863
+
864
+ .mo_wpns_dashboard_button
865
+ {
866
+ background-color: #20b2aa; /* Green */
867
+ border: none;
868
+ color: white;
869
+ padding-top: 10px;
870
+ text-align: center;
871
+ text-decoration: none;
872
+ display: inline-block;
873
+ font-size: 14px;
874
+ margin: 4px 2px;
875
+ cursor: pointer;
876
+ -webkit-transition-duration: 0.4s; /* Safari */
877
+ transition-duration: 0.4s;
878
+ }
879
+
880
+ .mo_wpns_dashboard_upgrade_button
881
+ {
882
+ text-align: center;
883
+ background-color: orange;
884
+ width: 113px;
885
+ height: 30px;
886
+ }
887
+ .mo_wpns_dashboard_sub_upgrade_layout
888
+ {
889
+ margin-top: 10px;
890
+ padding: 5px 20px;
891
+ background-color: white;
892
+ border-top: 4px solid orange;
893
+ width: 90%;
894
+ height: 200px;
895
+ margin-left: 1%;
896
+ text-align: center;
897
+ color: black;
898
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
899
+ /*margin-top: 20px;
900
+ padding: 5px 20px;
901
+ background-color: #20b2aa;
902
+ border: 1px solid #CCCCCC;
903
+ float: left;
904
+ width: 227px;
905
+ height: 170px;
906
+ margin-left: 1%;
907
+ color: white;
908
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
909
+ }
910
+ .mo_wpns_sub_dashboards_layout
911
+ {
912
+ margin-top: 10px;
913
+ padding: 5px 0px;
914
+ background-color: #FFFFFF;
915
+ border: 1px solid lightseagreen;
916
+ float: left;
917
+ width: 30%;
918
+ height: 100px;
919
+ margin-left: 1%;
920
+ font-weight: 600;
921
+ border-top: 4px solid lightseagreen;
922
+
923
+ /*box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);*/
924
+ }
925
+ .mo_wpns_sub_sub_dashboard_layout
926
+ {
927
+ margin-top: 10px;
928
+ padding: 5px 0px;
929
+ background-color: #FFFFFF;
930
+ border: 1px solid lightseagreen;
931
+ float: left;
932
+ width: 22%;
933
+ min-height: 74px;
934
+ overflow: hidden;
935
+ margin-left: 1%;
936
+ font-weight: 600;
937
+ border-top: 3px solid lightseagreen;
938
+ }
939
+ .mo_wpns_container{
940
+ /*padding:10px;*/
941
+ width: 100%;
942
+ /*background-color: yellow;*/
943
+ height: auto;
944
+ }
945
+ .mo_wpns_details_layout
946
+ {
947
+ margin:10px;
948
+ height:auto;
949
+ width:90%;
950
+ float:left;
951
+ }
952
+ .mo_wpns_sub_details_layout
953
+ {
954
+ margin:10px;
955
+ height:200px;
956
+ width:90%;
957
+ float:left;
958
+ border: 1px solid;
959
+ background-color: white;
960
+ border-top: 4px solid lightseagreen;
961
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
962
+ font-style: italic;
963
+ }
964
+ .mo_wpns_tab button {
965
+ background-color: inherit;
966
+ float: left;
967
+ outline: none;
968
+ cursor: pointer;
969
+ padding: 7px 6px;
970
+ transition: 0.3s;
971
+ font-size: 103%;
972
+ margin-top: 20px;
973
+ margin-bottom: 20px;
974
+ border: solid 1px #20b2aa;
975
+ background-color: white;
976
+ color: black;
977
+ width: 129px;
978
+ }
979
+ .mo_wpns_tab button.active {
980
+ background-color: #20b2aa;
981
+ color: white;
982
+ width: 130px;
983
+ border: solid 1px #20b2aa;
984
+ /*border-bottom: none;*/
985
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
986
+ font-weight: 600;
987
+ }
988
+ .mo_wpns_support_layout{
989
+ /*padding: 5px 20px;*/
990
+ background-color: #FFFFFF;
991
+ border: 1px solid #CCCCCC;
992
+ /*float: left;*/
993
+ width: 90%;
994
+ margin-left: 1%;
995
+ float: left;
996
+ height: 480px;
997
+ border: 2px solid lightseagreen;
998
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
999
+
1000
+ /* background-color: #4CAF50;
1001
+ border: none;
1002
+ color: white;
1003
+ padding: 15px 32px;
1004
+ text-align: center;
1005
+ text-decoration: none;
1006
+ display: inline-block;
1007
+ font-size: 16px;
1008
+ margin: 10px 14px;
1009
+ cursor: pointer;
1010
+ width: 20%;*/
1011
+ }
1012
+ .mo_wpns_third_layout{
1013
+ margin-top: 10px;
1014
+ padding: 5px 20px;
1015
+ background-color: #FFFFFF;
1016
+ border: 1px solid #CCCCCC;
1017
+ float: left;
1018
+ width: 29%;
1019
+ margin-left: 1%;
1020
+
1021
+ }
1022
+ .mo_wpns_dashboard_button
1023
+ {
1024
+ background-color: #4CAF50;
1025
+ border: none;
1026
+ color: white;
1027
+ padding: 15px 32px;
1028
+ text-align: center;
1029
+ position: relative;
1030
+ bottom: -80px;
1031
+ text-decoration: none;
1032
+ display: inline-block;
1033
+ font-size: 16px;
1034
+ margin: 4px 2px;
1035
+ cursor: pointer;
1036
+ }
1037
+ .mo_wpns_report_layout
1038
+ {
1039
+ margin: 10px;
1040
+ padding: 5px 20px;
1041
+ background-color: #FFFFFF;
1042
+ border: 2px solid #20b2aa;
1043
+ float: left;
1044
+ width: 90%;
1045
+ min-height: 200px;
1046
+ overflow: hidden;
1047
+ text-align: center;
1048
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1049
+ }
1050
+
1051
+ h1 .nav-tab, h2 .nav-tab{
1052
+ font-size : auto;
1053
+ background-color: none; /* Green
1054
+ /*background-color: #4CAFA4;*/
1055
+ border: 1px;
1056
+ color: black;
1057
+ padding: 10px;
1058
+ text-align: center;
1059
+ text-decoration: none;
1060
+ display: inline-table;
1061
+ font-size: 20px;
1062
+ margin: 5px 0px;
1063
+ cursor: pointer;
1064
+ /*border-radius: 23px;*/
1065
+ width: 07.5%;
1066
+ border: 1px solid gray;
1067
+ /*width: 100px;*/
1068
+ }
1069
+ h1 .nav-tab-active, h2 .nav-tab-active
1070
+ {
1071
+
1072
+ /*background-color: #4CAF50;*/
1073
+ font-size: 150%;
1074
+ box-shadow: 3px 4px 3px #888888;
1075
+ background-color: #20b2aa;
1076
+ color: white;
1077
+
1078
+ }
1079
+ h1 .nav-tab:hover , h2 .nav-tab:hover
1080
+ {
1081
+ background-color: #20b2aa;
1082
+ color: white;
1083
+ /*border-bottom: none;*/
1084
+ }
1085
+ h1 .nav-tab-active:hover , h2 .nav-tab-active:hover
1086
+ {
1087
+ background-color: white;
1088
+ color:#20b2aa;
1089
+ }
1090
+ .mo_wpns_sub_nav_tab button {
1091
+ background-color: inherit;
1092
+ float: left;
1093
+ outline: none;
1094
+ cursor: pointer;
1095
+ padding: 14px 16px;
1096
+ transition: 0.3s;
1097
+ font-size: 17px;
1098
+ margin-top: 20px;
1099
+ margin-bottom: 20px;
1100
+ border-top: solid 1px;
1101
+ border-bottom: solid 1px;
1102
+ border-bottom: none;
1103
+ background-color: white;
1104
+ color: black;
1105
+ width :210px;
1106
+ }
1107
+ .mo_wpns_setting_layout
1108
+ {
1109
+ margin: 5px;
1110
+ padding: 5px 20px 30px 20px;
1111
+ background-color: #FFFFFF;
1112
+ border: 2px solid #20b2aa;
1113
+ float: left;
1114
+ width: 90%;
1115
+ margin-left: 1%;
1116
+
1117
+ overflow: hidden;
1118
+ text-align: left;
1119
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
1120
+ }
1121
+ .mo_wpns_products-dollar-amount {
1122
+ color: #797878;
1123
+ font-weight: 400;
1124
+ font-size: 30px;
1125
+ line-height: 25px;
1126
+ }
1127
+ .mo_wpns_products-dollar-detail {
1128
+ margin-left: -2px;
1129
+ text-transform: lowercase;
1130
+ vertical-align: top;
1131
+ font-size: 22px;
1132
+ font-weight: 300;
1133
+ }
1134
+ .mo2f_thumbnail {
1135
+ margin-bottom: 10px;
1136
+ position: relative;
1137
+ width: 100%;
1138
+ min-height: 103%;
1139
+ overflow: hidden;
1140
+ background-color: #fff;
1141
+ border: 1px solid #ddd;
1142
+ -webkit-transition: border .2s ease-in-out;
1143
+ -o-transition: border .2s ease-in-out;
1144
+ transition: border .2s ease-in-out
1145
+ }
1146
+ }
1147
+
1148
+
1149
+ .mo_wpns_table_layout td strong {
1150
+ margin-left: 10px;
1151
+ }
1152
+ .col1 {
1153
+ width: 20%;
1154
+ }
1155
+ .mo_wpns_left {
1156
+ overflow: hidden !important;
1157
+ text-overflow: ellipsis !important;
1158
+ white-space: nowrap !important;
1159
+ display: inline-block !important;
1160
+ }
1161
+ .mo_wpns_right {
1162
+ float: right !important;
1163
+ }
1164
+
1165
+ .fixed {
1166
+ //width: 75% !important;
1167
+ }
1168
+ .mo_wpns_table_textbox {
1169
+ width:100%;
1170
+ height:30px;
1171
+ }
1172
+ .mo_wpns_settings_table {
1173
+ width: 100%;
1174
+ }
1175
+
1176
+ #mo_wpns_note{
1177
+ background-color: #d9edf7;
1178
+ border-radius: 4px;
1179
+ padding: 5px;
1180
+ color: #31708f;
1181
+ }
1182
+ .mo_wpns_not_bold
1183
+ {
1184
+ font-weight:normal;
1185
+ }
1186
+ .button-green{
1187
+ background: #95D387 !important;
1188
+ color: #ffffff !important;
1189
+ border: 1px solid #95D387 !important;
1190
+ }
1191
+
1192
+ .mo_wpns_input_success{
1193
+ background: url(../images/success.png) no-repeat scroll 7px 7px;
1194
+ padding-left: 35px;
1195
+ background-size: 25px 25px;
1196
+ background-position: 5px 2px;
1197
+ }
1198
+
1199
+ .mo_wpns_input_error{
1200
+ background: url(../images/error.png) no-repeat scroll 7px 7px;
1201
+ padding-left: 33px;
1202
+ background-size: 20px 20px;
1203
+ background-position: 6px 5px;
1204
+ }
1205
+
1206
+ .mo_wpns_local_pricing_table{
1207
+ text-align:center;
1208
+ font-size: 15px !important;
1209
+ background-color:#FFFFFF;
1210
+ }
1211
+
1212
+ .mo_wpns_local_pricing_header{
1213
+ color: #fff !important;
1214
+ margin: 4px !important;
1215
+ }
1216
+
1217
+ .mo_wpns_local_pricing_sub_header{
1218
+ margin: 2px !important;
1219
+ color: #fff !important;
1220
+
1221
+ }
1222
+
1223
+ .mo_wpns_pricing_text{
1224
+ font-size: 15px !important;
1225
+ color: #fff !important;
1226
+ font-weight: bold !important;
1227
+ }
1228
+
1229
+ .mo_wpns_local_pricing_free_tab{
1230
+ background-color: rgba(34, 153, 221, 0.82)!important;
1231
+
1232
+
1233
+ }
1234
+
1235
+ .mo_wpns_local_pricing_paid_tab{
1236
+ background-color: #1a71a4 !important;
1237
+
1238
+
1239
+ }
1240
+
1241
+ .mo_wpns_local_thumbnail{
1242
+ width: 350px;
1243
+ padding: 4px;
1244
+ margin-bottom: 10px;
1245
+ line-height: 1.42857143;
1246
+ background-color: #fff;
1247
+ border: 1px solid #ddd;
1248
+ border-radius: 4px;
1249
+ -webkit-transition: border .2s ease-in-out;
1250
+ -o-transition: border .2s ease-in-out;
1251
+ transition: border .2s ease-in-out;
1252
+ }
1253
+
1254
+ .blockedips_table{
1255
+ width:100%;
1256
+ }
1257
+
1258
+ .blockedips_table th{
1259
+ text-align:left;
1260
+ }
1261
+
1262
+ .blockedips_table{
1263
+ border: 1px solid black;
1264
+ border-collapse: collapse;
1265
+ }
1266
+
1267
+ .blockedips_table th, .blockedips_table td {
1268
+ border: 1px solid black;
1269
+ text-align: left;
1270
+ padding: 4px;
1271
+ }
1272
+
1273
+ .blockedips_table tr:nth-child(even){background-color: #f2f2f2}
1274
+
1275
+ .blockedips_table th {
1276
+ background-color: #D6D6D6;
1277
+ color: #222;
1278
+ }
1279
+
1280
+ .redtext{color:red;}
1281
+
1282
+ .mo_wpns_subheading{
1283
+ margin-bottom:10px;
1284
+ margin-top:-10px;
1285
+ }
1286
+
1287
+ .premium_div{
1288
+ background: #ddd !important;
1289
+ }
1290
+
1291
+ .warning_div{
1292
+ display:block;margin-top:10px;color:red;background-color:rgba(251, 232, 0, 0.15);padding:5px;border:solid 1px rgba(255, 0, 9, 0.36);
1293
+ }
1294
+
1295
+ .one-third{
1296
+ width:33%;
1297
+ float: left;
1298
+ }
1299
+ h1 .nav-tab, h2 .nav-tab
1300
+ {
1301
+ font-size : 14px !important;
1302
+ /*background-color: none; /* Green */
1303
+ /*background-color: #4CAFA4;*/
1304
+ background-color: white;
1305
+ border: 1px ;
1306
+ color: black;
1307
+ padding: 10px;
1308
+ text-align: center;
1309
+ text-decoration: none;
1310
+ display: inline-table;
1311
+ box-shadow: 3px 4px 3px #888888;
1312
+
1313
+ /*font-size: 20px;*/
1314
+ margin: 5px 0px;
1315
+ cursor: pointer;
1316
+ /*border-radius: 23px;*/
1317
+ width: 8.2%;
1318
+ border: 1px solid #20b2aa;
1319
+ /*width: 100px;*/
1320
+ }
1321
+ h1 .nav-tab-active, h2 .nav-tab-active
1322
+ {
1323
+
1324
+ /*background-color: #4CAF50;*/
1325
+ font-size: 150%;
1326
+ box-shadow: 3px 4px 3px #888888;
1327
+ background-color: #20b2aa;
1328
+ color: white;
1329
+
1330
+ }
1331
+ h1 .nav-tab:hover , h2 .nav-tab:hover
1332
+ {
1333
+ background-color: #20b2aa;
1334
+ color: white;
1335
+ /*border-bottom: none;*/
1336
+ }
1337
+ h1 .nav-tab-active:hover , h2 .nav-tab-active:hover
1338
+ {
1339
+ background-color: white;
1340
+ color:#20b2aa;
1341
+ }
1342
+ .ip_lookup_desc,.db_backup_desc{
1343
+ background-color:#E6E6E6;
1344
+ width:100%;
1345
+ margin-top:1%;
1346
+ padding:10px;
1347
+ }
1348
+
1349
+ .ip_lookup_desc img,.db_backup_desc img{
1350
+ margin-left:45%;
1351
+ }
1352
+
1353
+ a{
1354
+ cursor:pointer;
1355
+ }
1356
+
1357
+ .display td{
1358
+ text-align: center;
1359
+ }
1360
+
1361
+
1362
+ .mo_wpns_modal_open {
1363
+ overflow: hidden !important;
1364
+ position:fixed !important;
1365
+ width: 100% !important;
1366
+ }
1367
+
1368
+ .mo_wpns_modal {
1369
+ position: fixed !important;
1370
+ top: 0;
1371
+ right: 0;
1372
+ bottom: 0;
1373
+ left: 0;
1374
+ z-index: 100000 !important;
1375
+ display: none;
1376
+ overflow: hidden !important;
1377
+ -webkit-overflow-scrolling: touch;
1378
+ outline: 0;
1379
+ display:block;
1380
+ }
1381
+
1382
+
1383
+ .mo_wpns_modal_backdrop {
1384
+ position: absolute;
1385
+ top: 0;
1386
+ right: 0;
1387
+ left: 0;
1388
+ background-color: #000 !important;
1389
+ filter: alpha(opacity = 50)!important;
1390
+ opacity: 0.9 !important;
1391
+ height: 100% !important;
1392
+ }
1393
+
1394
+ .mo_wpns_modal.fade .mo_wpns_modal_dialog {
1395
+ -webkit-transition: -webkit-transform .3s ease-out;
1396
+ -o-transition: -o-transform .3s ease-out;
1397
+ transition: transform .3s ease-out;
1398
+ -webkit-transform: translate(0, -25%);
1399
+ -ms-transform: translate(0, -25%);
1400
+ -o-transform: translate(0, -25%);
1401
+ transform: translate(0, -25%)
1402
+ }
1403
+
1404
+ .mo_wpns_modal.in .mo_wpns_modal_dialog {
1405
+ -webkit-transform: translate(0, 80px) !important;
1406
+ -ms-transform: translate(0, 80px) !important;
1407
+ -o-transform: translate(0, 80px) !important;
1408
+ transform: translate(0, 80px) !important;
1409
+ }
1410
+
1411
+ .mo_wpns_modal_open .mo_wpns_modal {
1412
+ overflow-x: hidden;
1413
+ overflow-y: hidden;
1414
+ }
1415
+
1416
+ .mo_wpns_modal_dialog {
1417
+ position: relative;
1418
+ width: auto;
1419
+ margin: 10px;
1420
+
1421
+ }
1422
+
1423
+ .mo_wpns_modal_content {
1424
+ position: relative;
1425
+ background-color: #fff;
1426
+ -webkit-background-clip: padding-box;
1427
+ background-clip: padding-box;
1428
+ border: 1px solid #999;
1429
+ border: 1px solid rgba(0, 0, 0, .2);
1430
+ outline: 0;
1431
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
1432
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
1433
+ margin-top: 12%;
1434
+ margin-left: 0px;
1435
+ padding: 15px 15px 0px;
1436
+ color: #444;
1437
+ font-family: "Open Sans",sans-serif;
1438
+ color: #777;
1439
+ font-size: 14px;
1440
+ line-height: 1.4em;
1441
+ background: #FFF none repeat scroll 0% 0%;
1442
+ box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.13);
1443
+ }
1444
+
1445
+ .mo_wpns_modal_header {
1446
+ min-height: 14px;
1447
+ padding: 10px 10px 10px 10px;
1448
+ border-bottom: 1px solid #e5e5e5;
1449
+ font-weight: normal;
1450
+ font-family: "Open Sans",sans-serif;
1451
+ font-size:17px;
1452
+ }
1453
+
1454
+
1455
+ .mo_wpns_modal_title {
1456
+ margin: 0 !important;
1457
+ line-height: 1.0 !important;
1458
+ }
1459
+
1460
+ .mo_wpns_modal_body {
1461
+ position: relative;
1462
+ padding: 4%;
1463
+ overflow:hidden !important;
1464
+ max-height: 550px !important;
1465
+ font-weight: normal;
1466
+ font-family: "Open Sans",sans-serif;
1467
+ }
1468
+
1469
+ .mo_wpns_modal_footer {
1470
+ padding: 15px;
1471
+ text-align: right;
1472
+ border-top: 1px solid #e5e5e5
1473
+ }
1474
+
1475
+ .mo_wpns_modal_footer .btn+.btn {
1476
+ margin-bottom: 0;
1477
+ margin-left: 5px
1478
+ }
1479
+
1480
+ .mo_wpns_modal_footer .btn_group .btn+.btn {
1481
+ margin-left: -1px
1482
+ }
1483
+
1484
+ .mo_wpns_modal_footer .btn_block+.btn_block {
1485
+ margin-left: 0
1486
+ }
1487
+
1488
+ .mo_wpns_modal_scrollbar_measure {
1489
+ position: absolute;
1490
+ top: -9999px;
1491
+ width: 50px;
1492
+ height: 50px;
1493
+ overflow: scroll
1494
+ }
1495
+
1496
+ @media ( min-width :768px) {
1497
+ .mo_wpns_modal_dialog {
1498
+ width:auto;
1499
+ margin: 0px auto
1500
+ }
1501
+ .mo_wpns_modal_content {
1502
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
1503
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
1504
+ }
1505
+ .mo_wpns_modal_sm {
1506
+ width: 300px
1507
+ }
1508
+ .mo_wpns_modal_md{
1509
+ width: 500px
1510
+ }
1511
+ .mo_wpns_modal_lg {
1512
+ width: 50%;
1513
+ }
1514
+ }
1515
+
1516
+ @media ( min-width :992px) {
1517
+ .mo_wpns_modal_dialog {
1518
+ width:auto;
1519
+ margin: 0px auto
1520
+ }
1521
+ .mo_wpns_modal_lg {
1522
+ width: 490px;
1523
+ }
1524
+ .mo_wpns_modal_md{
1525
+ width: 500px
1526
+ }
1527
+ }
1528
+
1529
+ .close{
1530
+ text-decoration:none;
1531
+ color:grey;
1532
+ font-size:13px;
1533
+ float:right;
1534
+ }
1535
+
1536
+ .close:hover{
1537
+ color:#0073aa;
1538
+ }
1539
+
1540
+ .modal_err_message{
1541
+ color:red;
1542
+ background-color:rgb(254, 220, 220);
1543
+ padding:1%;
1544
+ margin-bottom:3%;
1545
+ }
1546
+
1547
+ .mo_wpns_login_container{
1548
+ padding-top:3%;
1549
+ }
1550
+
1551
+ .mo_wpns_textbox{
1552
+ width:48%;
1553
+ height:30px;
1554
+ background: #fbfbfb;
1555
+ font-size: 14px;
1556
+ padding: 3px;
1557
+ margin: 2px 6px 16px 0;
1558
+ border: 1px solid #ddd;
1559
+ -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.07);
1560
+ box-shadow: inset 0 1px 2px rgba(0,0,0,.07);
1561
+ background-color: #fff;
1562
+ color: #32373c;
1563
+ outline: 0;
1564
+ -webkit-transition: 50ms border-color ease-in-out;
1565
+ transition: 50ms border-color ease-in-out;
1566
+ box-sizing: border-box;
1567
+ }
1568
+
1569
+ .btn{
1570
+ background: #0085ba;
1571
+ border-color: #006799;
1572
+ color: #fff;
1573
+ box-shadow: 0 1px 0 #006799;
1574
+ height: 30px;
1575
+ line-height: 28px;
1576
+ padding: 0 12px 2px;
1577
+ text-shadow: 0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799;
1578
+ border-color: #0073aa #006799 #006799;
1579
+ box-shadow: 0 1px 0 #006799;
1580
+ border-radius: 3px;
1581
+ white-space: nowrap;
1582
+ border-width: 1px;
1583
+ border-style: solid;
1584
+ cursor: pointer;
1585
+ display: inline-block;
1586
+ font-size:12px;
1587
+ }
1588
+
1589
+ .btn:hover{
1590
+ background-color:#1893c0;
1591
+ }
1592
+
1593
+ .license-button:hover{
1594
+ color:white!important;
1595
+ background-color:orange!important;
1596
+ border:1px solid orange!important;
1597
+ }
1598
+
1599
+ .license-button:active{
1600
+ box-shadow: 0px 1px 4px 2px rgba(255, 165, 0, 0.69);
1601
+ }
1602
+
1603
+ .license-button:focus{
1604
+ box-shadow: 0px 1px 4px 2px rgba(255, 165, 0, 0.69);
1605
+ }
1606
+
1607
+ .backupmessage{
1608
+ text-align: center;
1609
+ height: 52px;
1610
+ margin-bottom: 2%;
1611
+ background-color: rgb(255, 25, 25);
1612
+ color: black;
1613
+ font-weight: bold;
1614
+ padding-top: 1px;
1615
+ }
1616
+
1617
+ .wpns_premium_option{
1618
+ background-color: rgba(128, 128, 128, 0.7);
1619
+ padding: 2%;
1620
+ opacity: 0.3;
1621
+ }
1622
+
1623
+ .wpns_premium_option_text{
1624
+ position: absolute;
1625
+ font-weight: bold;
1626
+ margin:4.5% 15.5%;
1627
+ z-index: 1;
1628
+ }
1629
+
1630
+ .notice-button{
1631
+ float: left;
1632
+ height: 22px;
1633
+ margin-top: 6px;
1634
+ padding:0px 5px;
1635
+ margin-left:2%;
1636
+ font-size:13px;
1637
+ background-color:white;
1638
+ text-decoration: none;
1639
+ cursor: pointer;
1640
+ border-width: 1px;
1641
+ border-style: solid;
1642
+ border-radius: 3px;
1643
+ box-shadow: 0 1px 0 #CFCFCF;
1644
+ }
1645
+
1646
+ .custom-notice{
1647
+ display: flex;
1648
+ }
1649
+
1650
+ .notice-message{
1651
+ float:left;
1652
+ }
1653
+
1654
+ /*Added for new pricing*/
1655
+ .mo_align_pricing{
1656
+ text-align:left;padding-left: 27%;
1657
+ }
1658
+
1659
+ .mo_align_pricing_enlarge{
1660
+ text-align:left;padding-left: 42%;
1661
+ }
1662
+
1663
+
1664
+ /*Included for the feedback form*/
1665
+ .mo_modal {
1666
+ display: none;
1667
+ overflow: hidden;
1668
+ position: fixed;
1669
+ top: 0;
1670
+ right: 0;
1671
+ bottom: 0;
1672
+ left: 0;
1673
+ z-index: 1050;
1674
+ -webkit-overflow-scrolling: touch;
1675
+ outline: 0;
1676
+
1677
+ }
1678
+
1679
+ .mo_wpns_modal-content {
1680
+ position: relative;
1681
+ background-color: #ffffff;
1682
+ border: 1px solid #999999;
1683
+ border: 1px solid rgba(0, 0, 0, 0.2);
1684
+ border-radius: 6px;
1685
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
1686
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
1687
+ -webkit-background-clip: padding-box;
1688
+ background-clip: padding-box;
1689
+ outline: 0;
1690
+ margin-left: 20%;
1691
+ margin-right: 24%;
1692
+ margin-top:6%;
1693
+ }
1694
+
1695
+ .mo_wpns_close {
1696
+ color: #aaaaaa;
1697
+ float: right;
1698
+ font-size: 28px;
1699
+ font-weight: bold;
1700
+ }
1701
+
1702
+ /*.wpns_font_size {
1703
+ font-size: 50px;
1704
+ margin-top: -10px;
1705
+ padding-right: 11px;
1706
+ }*/
1707
+ .wpns_font_shown {
1708
+ font-size: 70px;
1709
+ margin-top: -10px;
1710
+ margin-bottom: 5px;
1711
+ padding-right: 11px;
1712
+ }
1713
+
1714
+ /* Added for malware */
1715
+ .malwaresummarydiv{
1716
+ display: inline-flex;
1717
+ width: 100%;
1718
+ }
1719
+ .malwarescandiv{
1720
+ border-radius: 4px;
1721
+ background: lemonchiffon;
1722
+ padding: 5px;
1723
+ width: 50%;
1724
+ }
1725
+ .msdivl{
1726
+ margin-right: 5px;
1727
+ }
1728
+ .msdivr{
1729
+ margin-left: 5px;
1730
+ }
1731
+ .hdiv{
1732
+ font-weight: 600;
1733
+ font-size: 1.2em;
1734
+ }
1735
+ .shdiv{
1736
+ margin-bottom: 10px;
1737
+ }
1738
+ .mo_wpns_scanmodediv{
1739
+ border-radius: 4px;
1740
+ background: lemonchiffon;
1741
+ padding: 5px;
1742
+ width: 23.5%;
1743
+ }
1744
+ .mo_wpns_msdivl{
1745
+ margin-right: 5px;
1746
+ }
1747
+ .mo_wpns_msdivr{
1748
+ margin-left: 5px;
1749
+ }
1750
+ .mo_wpns_scan_desc{
1751
+ height: 52%;
1752
+ }
1753
+ .mo_wpns_progress {
1754
+ width: 100%;
1755
+ background-color: lightgrey;
1756
+ }
1757
+ #mo_wpns_bar {
1758
+ width: 0%;
1759
+ height: 20px;
1760
+ background-color: blue;
1761
+ }
1762
+ .mo_wpns_lightgreen{
1763
+ color:rgb(128, 173, 128);
1764
+ }
1765
+ .mo_wpns_brightred{
1766
+ color:#ffd7d7;
1767
+ }
1768
+ .mo_wpns_red{color:red;}
1769
+ .mo_wpns_gray{color:#ccc}
1770
+ .mo_wpns_scan_close_issue{
1771
+ color: #aaaaaa;
1772
+ float: right;
1773
+ font-size: 28px;
1774
+ font-weight: bold;
1775
+ }
1776
+ .mo_wpns_scan_close_issue:hover,
1777
+ .mo_wpns_scan_close_issue:focus {
1778
+ color: #000;
1779
+ text-decoration: none;
1780
+ cursor: pointer;
1781
+ }
1782
+ .alert-success {
1783
+ color: #3c763d;
1784
+ background-color: #dff0d8;
1785
+ border-color: #d6e9c6;
1786
+ }
1787
+
1788
+ .alert-warning {
1789
+ color: #8a6d3b;
1790
+ background-color: #fcf8e3;
1791
+ border-color: #faebcc;
1792
+ }
1793
+ .alert {
1794
+ padding: 15px;
1795
+ margin-bottom: 20px;
1796
+ border: 1px solid transparent;
1797
+ border-radius: 4px;
1798
+ }
1799
+ .summarydiv{
1800
+ margin: 5px 0;
1801
+ width: 50%;
1802
+ }
1803
+ .mo_wpns_scan_button {
1804
+ background-color: #20b2aa; /* Green */
1805
+ border: none;
1806
+ color: white;
1807
+ padding: 5px 5px;
1808
+ text-align: center;
1809
+ text-decoration: none;
1810
+ display: inline-block;
1811
+ font-size: 16px;
1812
+ margin: 4px 2px;
1813
+ cursor: pointer;
1814
+ -webkit-transition-duration: 0.4s; /* Safari */
1815
+ transition-duration: 0.4s;
1816
+ }
1817
+ .mo_wpns_deep_scan_button {
1818
+ background-color: #20b2aa; /* Green */
1819
+ border: none;
1820
+ color: white;
1821
+ padding: 5px 5px;
1822
+ text-align: center;
1823
+ text-decoration: none;
1824
+ display: inline-block;
1825
+ font-size: 16px;
1826
+ margin: 4px 2px;
1827
+ -webkit-transition-duration: 0.4s; /* Safari */
1828
+ transition-duration: 0.4s;
1829
+ }
1830
+ .mo_green{
1831
+ color: green;
1832
+ }
1833
+ .mo_red{
1834
+ color: red;
1835
+ }
1836
+ .mo_wpns_sub_scanmode
1837
+ {
1838
+ padding: 5px;
1839
+ background-color: #FFFFFF;
1840
+ border: 1px solid lightseagreen;
1841
+ width: 23.5%;
1842
+ border-top: 4px solid lightseagreen;
1843
+ min-height: 180px;
1844
+ }
1845
+ .mo_wpns_malwarescandiv
1846
+ {
1847
+ padding: 5px;
1848
+ background-color: #FFFFFF;
1849
+ border: 1px solid lightseagreen;
1850
+ width: 50%;
1851
+ border-top: 4px solid lightseagreen;
1852
+ }
1853
+
1854
+
1855
+
1856
+
1857
+ /* */
1858
+ /* The Modal (background) */
1859
+ .modal {
1860
+ display: none;
1861
+ position: fixed; /* Stay in place */
1862
+ z-index: 9999; /* Sit on top */
1863
+ padding-top: 100px; /* Location of the box */
1864
+ left: 0;
1865
+ top: 0;
1866
+ width: 100%; /* Full width */
1867
+ height: 100%; /* Full height */
1868
+ overflow: auto; /* Enable scroll if needed */
1869
+ background-color: rgb(0,0,0); /* Fallback color */
1870
+ background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
1871
+ transition: all 1s;
1872
+ }
1873
+
1874
+ /* Modal Content */
1875
+ .modal-content {
1876
+ background-color: #FFFFFF;
1877
+ margin: 0;
1878
+ padding: 0 20px;
1879
+ border: 1px solid #888;
1880
+ width: 70%;
1881
+ border-radius: 5px;
1882
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.25);
1883
+ position: fixed;
1884
+ top: 50%;
1885
+ left: 50%;
1886
+ margin-right: -50%;
1887
+ transform: translate(-50%, -50%);
1888
+
1889
+ }
1890
+
1891
+ .modal-button {
1892
+ width: 15%;
1893
+ height: 50px;
1894
+ font-size: 20px !important;
1895
+ padding: 0;
1896
+ }
1897
+
1898
+
1899
+ .modal-header {
1900
+ padding: 15px;
1901
+ border-bottom: 1px solid #e5e5e5;
1902
+ }
1903
+ .modal-header .close {
1904
+ margin-top: -2px;
1905
+ }
1906
+ .modal-title {
1907
+ margin: 0;
1908
+ line-height: 1.42857143;
1909
+ font-size: large;
1910
+ }
1911
+ .modal-body {
1912
+ position: relative;
1913
+ padding: 0 15px;
1914
+ line-height: normal;
1915
+ height: 450px;
1916
+ overflow-y: scroll;
1917
+ overflow: auto;
1918
+ }
1919
+ .modal-dialog {
1920
+ position: relative;
1921
+ width: auto;
1922
+ margin: 10px;
1923
+ }
1924
+ .modal.fade .modal-dialog {
1925
+ -webkit-transform: translate(0, -25%);
1926
+ -ms-transform: translate(0, -25%);
1927
+ transition: transform 0.3s ease-out;
1928
+ }
1929
+ .modal.in .modal-dialog {
1930
+ -webkit-transform: translate(0, 0);
1931
+ -ms-transform: translate(0, 0);
1932
+ transform: translate(0, 0);
1933
+ }
1934
+ .modal-footer {
1935
+ padding: 15px;
1936
+ text-align: center;
1937
+ border-top: 1px solid #e5e5e5;
1938
+ }
1939
+ .modal-footer .btn + .btn {
1940
+ margin-left: 5px;
1941
+ margin-bottom: 0;
1942
+ }
1943
+ .modal-footer .btn-group .btn + .btn {
1944
+ margin-left: -1px;
1945
+ }
1946
+ .modal-footer .btn-block + .btn-block {
1947
+ margin-left: 0;
1948
+ }
1949
+
1950
+ .modal-body-div{
1951
+ margin: 1em;
1952
+ font-size: large;
1953
+ }
1954
+
1955
+ .modal-body-para{
1956
+ font-size: large;
1957
+ }
1958
+ .modal-body-div-c{
1959
+ font-size: large;
1960
+ margin:.25em;
1961
+ padding:.5em 1em;
1962
+ border: 1px solid #007cba;
1963
+ border-radius:4px;
1964
+ overflow: hidden;
1965
+ transition: 0.3s;
1966
+ }
1967
+
1968
+ .modal-body-div-d{
1969
+ width:93%;
1970
+ display:inline-flex;
1971
+ }
1972
+ .modal-body-div-e{
1973
+
1974
+ }
1975
+ .modal-span{
1976
+ padding: 5px 10px;
1977
+ border: 1px solid #2980b9;
1978
+ border-radius: 5px;
1979
+ cursor: pointer;
1980
+ color: #0073aa;
1981
+ background-color: #ffffff;
1982
+ font-size: large;
1983
+ font-weight: bold;
1984
+ margin: 0 50px;
1985
+ width: 125px;
1986
+ display: inline-block;
1987
+ }
1988
+
1989
+ .modal-span:hover{
1990
+ color: #5b9dd9;
1991
+ }
1992
+
1993
+ .modal-span:click{
1994
+ color: #fff;
1995
+ background-color: #0073aa;
1996
+ }
1997
+
1998
+ .modal ul p{
1999
+ margin: 0;
2000
+ }
2001
+
2002
+ .modal-span-close{
2003
+ display: block;
2004
+ right: 20px;
2005
+ position: absolute;
2006
+ top: 15px;
2007
+ padding: 5px 10px;
2008
+ font-weight: 600;
2009
+ font-size: large;
2010
+ cursor: pointer;
2011
+ }
2012
+
2013
+ .modal-span-close:hover{
2014
+ transform: scale(1.1, 1.1);
2015
+ }
2016
+
2017
+ .modal-span-close:active{
2018
+ border: solid;
2019
+ }
2020
+
2021
+ .modal-waf-dinner{
2022
+ margin: 10px 20px;
2023
+ display: list-item;
2024
+ }
2025
+ .modal-waf-sinner{
2026
+ font-weight: 500;
2027
+ }
2028
+
2029
+ .mo_wpns_support_layout_model{
2030
+ padding: 5px 20px;
2031
+ background-color: #FFFFFF;
2032
+ width: 95%;
2033
+ margin: 10px;
2034
+ float: left;
2035
+ text-align: center;
2036
+ border: 2px solid lightseagreen;
2037
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
2038
+ }
2039
+
2040
+
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+ /*2FA css used*/
2047
+ .mo2f_licensing_plans {
2048
+ background-color: white;
2049
+ border-style: solid;
2050
+ border-color: lightgrey;
2051
+ border-radius: 4px;
2052
+ border-width: 1px;
2053
+ padding: 10px;
2054
+ }
2055
+
2056
+ .mo2f_licensing_plans_tr {
2057
+ background-color: #bbccdd;
2058
+ }
2059
+
2060
+ .mo2f_licensing_plans_plan_desc {
2061
+ color: white;
2062
+ font-size: 16px
2063
+ }
2064
+
2065
+ .mo2f_licensing_plans_ol {
2066
+ margin-left: 3%
2067
+ }
2068
+ .mo2f_setup_2factor_tab {
2069
+ align-content: center;
2070
+ min-height: 394px;
2071
+ padding:5px;
2072
+ }
2073
+
2074
+ .mo2f_auth_methods_table {
2075
+ border-spacing: 10px;
2076
+ border-collapse: separate;
2077
+ width: 100%;
2078
+ }
2079
+
2080
+ .mo2f_view_free_plan_auth_methods {
2081
+ color: black;
2082
+ cursor: pointer;
2083
+ }
2084
+
2085
+ .mo2f_view_free_plan_auth_methods:hover {
2086
+ color: black;
2087
+ }
2088
+
2089
+ .mo2f_2factor_heading_images {
2090
+ display: inline-block;
2091
+ width: 20px;
2092
+ height: 20px;
2093
+ float: left
2094
+ }
2095
+
2096
+ .mo2f_2factor_heading_images {
2097
+ display: inline-block;
2098
+ width: 20px;
2099
+ height: 20px;
2100
+ float: left;
2101
+ margin-right:1%;
2102
+ margin-top: 1.5%;
2103
+ margin-left: 1.5%;
2104
+ }
2105
+
2106
+ .mo2f_thumbnail {
2107
+ margin-bottom: 10px;
2108
+ position: relative;
2109
+ /*width: 280px;*/
2110
+ min-height: 103%;
2111
+ overflow: hidden;
2112
+ background-color: #fff;
2113
+ border: 1px solid #ddd;
2114
+ -webkit-transition: border .2s ease-in-out;
2115
+ -o-transition: border .2s ease-in-out;
2116
+ transition: border .2s ease-in-out
2117
+ }
2118
+
2119
+ .mo2f_thumbnail > img, .mo2f_thumbnail a > img {
2120
+ margin-right: auto;
2121
+ margin-left: auto
2122
+ }
2123
+
2124
+ a.mo2f_thumbnail:hover, a.mo2f_thumbnail:focus, a.mo2f_thumbnail.active {
2125
+ border-color: #337ab7
2126
+ }
2127
+
2128
+ .mo2f_thumbnail .caption {
2129
+ padding: 9px;
2130
+ color: #333
2131
+ }
2132
+
2133
+ .mo2f_thumbnail label {
2134
+ font-weight: bold;
2135
+
2136
+ }
2137
+
2138
+ .mo2f_thumbnail_method_wrap{
2139
+ margin-bottom: 60px;
2140
+ }
2141
+
2142
+ .mo2f_thumbnail_method{
2143
+ display: inline-flex;
2144
+ }
2145
+
2146
+ .mo2f_thumbnail_method_desc{
2147
+ padding:13px;
2148
+ font-size:14px;
2149
+ }
2150
+
2151
+ .mo2f_set_2_factor {
2152
+ padding: 10px;
2153
+ float: right;
2154
+ line-height: 20px;
2155
+ }
2156
+
2157
+ .mo2f_configure_set_2_factor {
2158
+ background-color: Transparent;
2159
+ background-repeat: no-repeat;
2160
+ border: none;
2161
+ cursor: pointer;
2162
+ overflow: hidden;
2163
+ outline: none;
2164
+ color: white;
2165
+ }
2166
+
2167
+ .mo2f_auth_methods_thumbnail {
2168
+ width: 50px;
2169
+ height: 50px;
2170
+ padding: 20px;
2171
+ line-height: 80px;
2172
+ }
2173
+
2174
+ .mo2f_setup_2_factor_tab {
2175
+ background-color: white;
2176
+ border-style: solid;
2177
+ border-color: lightgrey;
2178
+ border-radius: 4px;
2179
+ border-width: 1px;
2180
+ padding: 20px;
2181
+ width: 93%;
2182
+ align-content: center
2183
+
2184
+ }
2185
+
2186
+ .mo_wpns_setting_layout{
2187
+ margin: 5px;
2188
+ padding: 5px 20px 30px 20px;
2189
+ background-color: #FFFFFF;
2190
+ border: 2px solid #20b2aa;
2191
+ float: left;
2192
+ width: 94%;
2193
+ margin-left: 1%;
2194
+ /*overflow: hidden;*/
2195
+ text-align: left;
2196
+ box-shadow: 0 0px 0px 0 rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.19);
2197
+ }
2198
+
2199
+ .mo2f_configure_set_2_factor:hover {
2200
+ font-weight: bold;
2201
+ font-size: 14px;
2202
+ }
2203
+
2204
+ .configuredBasic {
2205
+ background: url(../images/feat_smart.png) rgba(99, 143, 223, 0.42) no-repeat right;
2206
+ padding: 10px;
2207
+ margin-bottom: 0px;
2208
+ }
2209
+
2210
+ .configuredSmart {
2211
+ background: url(../images/Smartphone-24.png) rgba(99, 143, 223, 0.42) no-repeat right;
2212
+ padding: 10px;
2213
+ margin-bottom: 0px;
2214
+ }
2215
+
2216
+ .notConfiguredBasic {
2217
+ background: url(../images/feat_smart.png) rgba(221, 221, 221, 0.66) no-repeat right;
2218
+ padding: 10px;
2219
+ margin-bottom: 0px;
2220
+ }
2221
+
2222
+ .notConfiguredSmart {
2223
+ background: url(../images/Smartphone-24.png) rgba(221, 221, 221, 0.66) no-repeat right;
2224
+ padding: 10px;
2225
+ margin-bottom: 0px;
2226
+ }
2227
+
2228
+ .configuredLandline {
2229
+ background: url(../images/landline_sprite.png) rgba(99, 143, 223, 0.42) no-repeat right;
2230
+ padding: 10px;
2231
+ margin-bottom: 0px;
2232
+ }
2233
+
2234
+ .notConfiguredLandline {
2235
+ background: url(../images/landline_sprite.png) rgba(221, 221, 221, 0.66) no-repeat right;
2236
+ padding: 10px;
2237
+ margin-bottom: 0px;
2238
+ }
2239
+
2240
+ .selectedMethod {
2241
+ background-color: rgba(54, 157, 4, 0.42) !important;
2242
+ }
2243
+
2244
+ .inactiveMethod {
2245
+ background-color: rgba(221, 221, 221, 0.66) !important;
2246
+ margin-left: 20.5%;
2247
+
2248
+ }
2249
+
2250
+ .configuredLaptop {
2251
+ background: url(../images/laptop-24.png) rgba(99, 143, 223, 0.42) no-repeat right;
2252
+ padding: 10px;
2253
+ margin-bottom: 0px;
2254
+ }
2255
+
2256
+ .notConfiguredLaptop {
2257
+ background: url(../images/laptop-24.png) rgba(221, 221, 221, 0.66) no-repeat right;
2258
+ padding: 20px;
2259
+ margin-bottom: 0px;
2260
+ }
2261
+
2262
+ * {
2263
+ /*box-sizing: border-box;*/
2264
+ }
2265
+
2266
+ .mo2f_configure_2_factor {
2267
+ padding: 10px;
2268
+ float: left;
2269
+ line-height: 20px;
2270
+ }
2271
+
2272
+ .mo2f_heading_style {
2273
+ font-size: 18px;
2274
+ font-family: Segoe UI;
2275
+ padding: 11px;
2276
+ }
2277
+
2278
+ .mo2f_authy_step1 {
2279
+ vertical-align: top;
2280
+ padding-right: 15px;
2281
+ width: 26%;
2282
+ }
2283
+
2284
+ .mo2f_authy_step2 {
2285
+ vertical-align: top;
2286
+ padding-right: 15px;
2287
+ width: 46%;
2288
+ }
2289
+
2290
+ .mo2f_table_textbox {
2291
+ width: 100%;
2292
+ height: 30px;
2293
+ }
2294
+
2295
+ .mo2f_google_authy_step2 {
2296
+ vertical-align: top;
2297
+ padding-right: 15px;
2298
+ width: 70%;
2299
+ }
2300
+
2301
+ .mo2f_google_authy_step3 {
2302
+ vertical-align: top;
2303
+ width: 30%
2304
+ }
2305
+
2306
+ .mo2f_kba_ques {
2307
+ width: 400px !important;
2308
+ border-radius: 4px;
2309
+ height: 30px;
2310
+ font-size: 13px !important;
2311
+ }
2312
+
2313
+ .mo2f_kba_table {
2314
+ padding-left: 10px;
2315
+ width: 80%;
2316
+ }
2317
+
2318
+ .mo2f_kba_tb_data {
2319
+ padding-left: 80px;
2320
+ }
2321
+
2322
+ .mo2f_grayed_out {
2323
+ background-color: rgba(128, 128, 128, 0.05) !important;
2324
+ opacity: .5;
2325
+ }
2326
+
2327
+ .mo2f_grayed_out_link {
2328
+ position: absolute;
2329
+ float: right;
2330
+ margin: 0.5% 0 0 24%;
2331
+ z-index: 99;
2332
+ }
2333
+
2334
+ .black_overlay {
2335
+ display: none;
2336
+ position: absolute;
2337
+ top: 0%;
2338
+ left: 0%;
2339
+ width: 100%;
2340
+ height: 100%;
2341
+ background-color: black;
2342
+ z-index: 1001;
2343
+ -moz-opacity: 0.8;
2344
+ opacity: .80;
2345
+ filter: alpha(opacity=80);
2346
+ }
2347
+
2348
+ .mo2f_advanced_options_images {
2349
+ display: inline-block;
2350
+ padding: 15px;
2351
+ width: 20px;
2352
+ height: 20px;
2353
+ float: left
2354
+ }
2355
+
2356
+ .mo2f_view_premium_plan_auth_methods, .mo2f_view_standard_plan_auth_methods, .mo2f_view_backup_options, .mo2f_view_backup_options_prem,
2357
+ .mo2f_view_login_options, .mo2f_view_inline_registration_options, .mo2f_view_customizations, .mo2f_advanced_options_a,
2358
+ .mo2f_view_customizations_prem {
2359
+ color: navy;
2360
+ cursor: pointer;
2361
+ }
2362
+
2363
+ .mo2f_view_premium_plan_auth_methods:hover, .mo2f_view_standard_plan_auth_methods:hover, .mo2f_view_backup_options:hover,
2364
+ .mo2f_view_backup_options_prem:hover, .mo2f_view_customizations_prem:hover, .mo2f_view_login_options:hover, .mo2f_view_inline_registration_options:hover, .mo2f_view_customizations:hover {
2365
+ color: limegreen;
2366
+ }
2367
+
2368
+ .mo2f_vertical-submenu a {
2369
+ display: inline;
2370
+ background-color: #cce;
2371
+ color: black;
2372
+ margin-left: 6px;
2373
+ width: 30%;
2374
+ margin-top: 15px;
2375
+ text-decoration: none;
2376
+ text-align: center;
2377
+ padding: 11px;
2378
+ }
2379
+
2380
+ .mo2f_vertical-submenu a:hover {
2381
+ background-color: #ccc;
2382
+ }
2383
+
2384
+ .mo2f_vertical-submenu a.active {
2385
+ background-color: #4CAF50;
2386
+ color: white;
2387
+ }
2388
+
2389
+ .mo2f_box {
2390
+ border: 1px solid #DCDCDC;
2391
+ padding: 20px;
2392
+ }
2393
+
2394
+ .mo2f_google_authy_secret_outer_div {
2395
+ padding: 10px;
2396
+ background-color: #f9edbe;
2397
+ width: 20em;
2398
+ text-align: center;
2399
+ }
2400
+ .mo2f_google_authy_secret_inner_div {
2401
+ font-size: 14px;
2402
+ font-weight: bold;
2403
+ line-height: 1.5;
2404
+ }
2405
+
2406
+ .mo2f_vertical_line {
2407
+ border-left: 1px solid #EBECEC;
2408
+ padding: 5px
2409
+ }
2410
+ .mo2f_gauth_column {
2411
+ float: left;
2412
+ padding: 10px;
2413
+ height: 210px;
2414
+ }
2415
+
2416
+ .mo2f_gauth_left {
2417
+ width: 100%;
2418
+ }
2419
+ .mo-fa-icon > tr > td > i.fa {
2420
+ color: #5b8a0f;
2421
+
2422
+ }
2423
+ .mo_table-bordered, .mo_table-bordered > tbody > tr > td {
2424
+ border: 1px solid #ddd;
2425
+ }
2426
+ .mo_align-center > tr > td {
2427
+ text-align: center !important;
2428
+ }
2429
+
2430
+ .mo-fa-icon > tr > td > i.fa {
2431
+ color: #5b8a0f;
2432
+
2433
  }
2434
+ .mo2f_display_none_forms {
2435
+ display: none
2436
+ }
2437
+
2438
+ /*2FA css*/
2439
+
2440
+ /*
2441
 
2442
  .impt {
2443
  color: #FF0000
2480
  .panel_toggle:hover {
2481
  text-decoration: underline;
2482
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2483
  .mo2f_settings_table {
2484
  width: 100%;
2485
  }
2550
  margin-right: 20px !important;
2551
  }
2552
 
2553
+ .mo2f_faqs > h3 > a:focus {
2554
+ box-shadow: 0px 0px 0px 0px #fff !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2555
  }
2556
 
2557
+ .mo2f_msgs {
2558
+ font-size: 14px !important;
 
 
2559
  }
2560
 
2561
+ .mo2f_row {
2562
+
2563
+ display: -webkit-inline-box !important;
2564
  }
2565
 
2566
  .color-icon {
2637
  background-color: #1a71a4 !important;
2638
  }
2639
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2640
 
 
 
 
 
2641
 
2642
  .mo2f_auth_methods_thumbnail {
2643
  width: 50px;
2651
  font-weight: bold;
2652
  }
2653
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2654
  .mo_table-bordered, .mo_table-bordered > tbody > tr > td {
2655
  border: 1px solid #ddd;
2656
  }
2722
 
2723
  /* added by gayathri */
2724
 
2725
+ /*
 
 
 
 
 
 
 
 
 
2726
 
2727
  .mo2f_vertical_line {
2728
  border-left: 1px solid #EBECEC;
2879
 
2880
  }
2881
 
 
 
 
 
 
 
 
 
 
 
 
 
2882
  #step1_skip, #step2_skip, #step3_skip, #step5_skip_test, #step4_skip_test {
2883
  float: left;
2884
  }
2895
  curosr: pointer
2896
  }
2897
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2898
  .mo2f_pointer {
2899
  cursor: pointer;
2900
  }
2927
  }
2928
 
2929
  /* The alert message box */
2930
+ /*
2931
  .alert {
2932
  font-style: italic;
2933
  padding: 10px;
2934
+ background-color: yellowgreen;
2935
  color: white;
2936
  margin-bottom: 15px;
2937
  border-radius:5px;
2938
  }
2939
 
2940
  /* The close button */
2941
+ /*
2942
  .closebtn {
2943
  margin-left: 15px;
2944
  color: white;
2952
  }
2953
 
2954
  /* When moving the mouse over the close button */
2955
+ /*
2956
  .closebtn:hover {
2957
  color: black;
2958
  }
2969
 
2970
  .mo2f_support_layout {
2971
  width: 40%;
2972
+ height: 78%;
2973
  background-color: #FFFFFF;
2974
  padding: 0px 24px 0px 20px;
2975
  display: none;
3161
 
3162
  }
3163
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3164
  .mo2f_column_padding {
3165
  padding-right: 10px;
3166
 
3245
  filter: alpha(opacity=80);
3246
  }
3247
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3248
  .mo2f_advanced_options_images {
3249
  display: inline-block;
3250
  padding: 15px;
3285
  border-collapse: separate;
3286
  }
3287
 
 
 
 
 
 
 
 
3288
  .mo2f_auth_method_title {
3289
  font-size: 15px;
3290
  font-weight: bold;
3388
 
3389
  /* added by gayathri */
3390
 
3391
+ /*.mo2f_google_authy_step2 {
3392
  vertical-align: top;
3393
  padding-right: 15px;
3394
  width: 70%;
3663
  color: #0073aa;
3664
  cursor: pointer;
3665
  outline: 0
3666
+ }*/
3667
 
3668
+ /*.twofa-license {
3669
  background-color: orange !important;
3670
  color: #000 !important
3671
  }
3675
  border-color: #c28f37 !important
3676
  }
3677
 
 
 
 
 
 
 
 
 
 
 
 
3678
  .closebtn {
3679
  margin-left: 15px;
3680
  color: white;
3687
  transition: 0.3s;
3688
  }
3689
 
 
3690
  .closebtn:hover {
3691
  color: black;
3692
+ }*/
3693
 
3694
 
3695
+ /*.sidenav {
3696
  height: 100%;
3697
  z-index: 1;
3698
  float:left;
3714
  }
3715
 
3716
  .main {
3717
+ margin-left: 200px;
3718
+ }*/
 
3719
 
3720
+ /*@media screen and (max-height: 450px) {
3721
  .sidenav {padding-top: 15px;}
3722
  .sidenav a {font-size: 18px;}
3723
  }
3724
  .mo2f_content{
3725
  float:Right;
3726
  width:90%;
3727
+ }*/
 
 
 
 
3728
 
3729
  /* Create two unequal columns that floats next to each other */
3730
+ /*.column {
3731
  float: left;
3732
  padding: 10px;
3733
  height: 300px; /* Should be removed. Only for demonstration */
3734
+ /*}*/
3735
 
3736
+ /*.left {
3737
  width: 13%;
3738
  }
3739
 
3740
  .right {
3741
  width: 87%;
3742
+ }*/
3743
 
3744
  /* Clear floats after the columns */
3745
+ /*.row:after {
3746
  content: "";
3747
  display: table;
3748
  clear: both;
3750
 
3751
  ----------------
3752
  * {box-sizing: border-box}
3753
+ body {font-family: "Lato", sans-serif;}*/
3754
 
3755
  /* Style the tab */
3756
+ /*.tab {
3757
  float: left;
3758
  background-color: #23282D;
3759
  width: 15%;
3762
  }
3763
 
3764
  /* Style the buttons inside the tab */
3765
+ /*.tab button {
3766
  display: block;
3767
  background-color: inherit;
3768
  color: black;
3800
  color: #000;
3801
  transform: scale(1,1.03);
3802
  border-bottom: 0px;
3803
+ }*/
3804
 
3805
  /* Create an active/current "tab button" class */
3806
+ /*.tab a.active {
3807
  background-color: white;
3808
  color:#F6821F;
3809
 
3810
  box-shadow: 0px 0px 5px #aaaaaa;
3811
  font-weight: bold;
3812
+ }*/
3813
 
3814
  /* Change background color of buttons on hover */
3815
+ /*.tab button:hover {
3816
  background-color: #ddd;
3817
+ }*/
3818
 
3819
  /* Create an active/current "tab button" class */
3820
+ /*.tab button.active {
3821
  background-color: #ccc;
3822
 
3823
  }
3824
 
 
 
 
 
 
 
 
 
 
 
3825
  .tooltip {
3826
  position: relative;
3827
  display: inline-block;
3870
  }
3871
  .active .arrow-left{
3872
  visibility: visible;
3873
+ }*/
3874
  ----------------------------------------------
3875
  /* with network security features.*/
3876
+ /*
3877
  .mo2f_backdrop{
3878
  top: 0;
3879
  left: 0;
3890
  top: 9%;
3891
  left: 81%;
3892
  z-index: 1;
3893
+ float:right;
3894
+ background-color:#ffba00;
3895
+ color:black;
3896
+ width:16%;
3897
  font-size: 17px;
3898
  }
3899
 
3914
  position:fixed;
3915
  left: 83.5%;
3916
  z-index: 9999;
3917
+ height:34px;
3918
  }
3919
 
3920
  .mo2f_orange{
3921
  background:orange;
3922
+ }*/
includes/css/twofa_style_settings.css ADDED
@@ -0,0 +1,976 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .mo2f_modal-open {
2
+ overflow: hidden !important;
3
+ position: fixed !important;
4
+ width: 100% !important;
5
+
6
+ }
7
+
8
+ .mo2f_modal {
9
+ position: fixed !important;
10
+ top: 0;
11
+ right: 0;
12
+ bottom: 0;
13
+ left: 0;
14
+ z-index: 100000 !important;
15
+
16
+ overflow: hidden !important;
17
+ -webkit-overflow-scrolling: touch;
18
+ outline: 0;
19
+
20
+ }
21
+
22
+ .mo2f_modal_inner {
23
+ display: none;
24
+ }
25
+
26
+ .mo2f_modal.fade .mo2f_modal-dialog {
27
+ -webkit-transition: -webkit-transform .3s ease-out;
28
+ -o-transition: -o-transform .3s ease-out;
29
+ transition: transform .3s ease-out;
30
+ -webkit-transform: translate(0, -25%);
31
+ -ms-transform: translate(0, -25%);
32
+ -o-transform: translate(0, -25%);
33
+ transform: translate(0, -25%)
34
+ }
35
+
36
+ .mo2f_modal.in .mo2f_modal-dialog {
37
+ -webkit-transform: translate(0, 80px) !important;
38
+ -ms-transform: translate(0, 80px) !important;
39
+ -o-transform: translate(0, 80px) !important;
40
+ transform: translate(0, 80px) !important;
41
+
42
+ }
43
+
44
+ .mo2f_modal-open .mo2f_modal {
45
+ overflow-x: hidden;
46
+ overflow-y: hidden;
47
+ }
48
+
49
+ .mo2f_modal-dialog {
50
+ position: relative;
51
+ width: auto;
52
+ margin: 10px;
53
+
54
+ }
55
+
56
+ .login mo_customer_validation-modal-content {
57
+ position: relative !important;
58
+ background-color: #fff !important;
59
+ -webkit-background-clip: padding-box !important;
60
+ background-clip: padding-box !important;
61
+ border: 1px solid #999 !important;
62
+ border: 1px solid rgba(0, 0, 0, .2) !important;
63
+ border-radius: 6px !important;
64
+ outline: 0 !important;
65
+
66
+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
67
+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5) !important;
68
+ }
69
+
70
+ .mo2f-modal-backdrop {
71
+ position: absolute;
72
+ top: 0;
73
+ right: 0;
74
+ left: 0;
75
+ background-color: #f1f1f1 !important;
76
+ filter: alpha(opacity=50) !important;
77
+ opacity: 0.8 !important;
78
+ height: 100% !important;
79
+ }
80
+
81
+ #smsAlertModal {
82
+ background-color: black !important;
83
+ opacity: 0.8 !important;
84
+ font-family: Roboto;
85
+ }
86
+
87
+ #twoFAtestAlertModal {
88
+ background-color: black !important;
89
+ opacity: 0.8 !important;
90
+ filter: alpha(opacity=50) !important;
91
+ }
92
+
93
+ .mo2f_modal-header {
94
+ min-height: 14px;
95
+ padding: 10px;
96
+ border-bottom: 1px solid #e5e5e5
97
+ }
98
+
99
+ .mo2f_modal-title {
100
+ margin: 0 !important;
101
+ line-height: 1.0 !important;
102
+ font-size: 1rem;
103
+ }
104
+
105
+ .mo2f_modal-body {
106
+ / / width: 96 % !important;
107
+ position: relative !important;
108
+ padding: 15px !important;
109
+ overflow-y: auto !important;
110
+ max-height: 550px !important;
111
+ }
112
+
113
+ .mo2f_modal-footer {
114
+ padding: 15px;
115
+ text-align: right;
116
+ border-top: 1px solid #e5e5e5
117
+ }
118
+
119
+ .mo2f_modal-footer .btn + .btn {
120
+ margin-bottom: 0;
121
+ margin-left: 5px
122
+ }
123
+
124
+ .mo2f_modal-footer .btn-group .btn + .btn {
125
+ margin-left: -1px
126
+ }
127
+
128
+ .mo2f_modal-footer .btn-block + .btn-block {
129
+ margin-left: 0
130
+ }
131
+
132
+ .mo2f_modal-scrollbar-measure {
133
+ position: absolute;
134
+ top: -9999px;
135
+ width: 50px;
136
+ height: 50px;
137
+ overflow: scroll
138
+ }
139
+
140
+ .mo2f_close {
141
+ float: right;
142
+ font-size: 21px;
143
+ font-weight: 700;
144
+ line-height: 1;
145
+ color: #000;
146
+ text-shadow: 0 1px 0 #fff;
147
+ filter: alpha(opacity=20);
148
+ opacity: .2
149
+ }
150
+
151
+ .mo2f_close:hover, .mo2f_close:focus {
152
+ color: #000;
153
+ text-decoration: none;
154
+ cursor: pointer;
155
+ filter: alpha(opacity=50);
156
+ opacity: .5
157
+ }
158
+
159
+ button.mo2f_close {
160
+ -webkit-appearance: none;
161
+ padding: 0;
162
+ cursor: pointer;
163
+ background: 0 0;
164
+ border: 0
165
+ }
166
+
167
+ @media ( min-width: 768px) {
168
+ .mo2f_modal-dialog {
169
+ width: 373px;
170
+ margin: 0px auto
171
+ }
172
+
173
+ .login mo_customer_validation-modal-content {
174
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
175
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
176
+ }
177
+
178
+ .mo2f_modal-sm {
179
+ width: 300px
180
+ }
181
+
182
+ .mo2f_modal-md {
183
+ width: 550px
184
+ }
185
+ }
186
+
187
+ @media ( min-width: 992px) {
188
+ .mo2f_modal-lg {
189
+ width: 900px;
190
+ }
191
+
192
+ .mo2f_modal-md {
193
+ width: 550px
194
+ }
195
+ }
196
+
197
+
198
+ @media ( min-width: 768px) {
199
+ .mo2f_modal-dialog {
200
+ width: 373px;
201
+ margin: 0px auto
202
+ }
203
+
204
+ .login mo_customer_validation-modal-content {
205
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
206
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
207
+ }
208
+
209
+ .mo2f_modal-sm {
210
+ width: 300px
211
+ }
212
+
213
+ .mo2f_modal-md {
214
+ width: 550px
215
+ }
216
+ }
217
+
218
+ @media ( min-width: 992px) {
219
+ .mo2f_modal-lg {
220
+ width: 900px;
221
+ }
222
+
223
+ .mo2f_modal-md {
224
+ width: 550px
225
+ }
226
+ }
227
+
228
+ .center{
229
+
230
+ text-align: center !important;
231
+ }
232
+
233
+ #otpMessage {
234
+ border-radius: 1px;
235
+ padding: 1px 5px;
236
+ background: #f1f1f1;
237
+ }
238
+
239
+ .mo2f_carousel-indicators {
240
+ position: absolute;
241
+ bottom: -20px;
242
+ z-index: 15;
243
+ width: 60%;
244
+ list-style: none;
245
+ text-align: center;
246
+ }
247
+
248
+ .miniorange_kba_validate:hover, .miniorange_validate_otp:hover, .miniorange_login_forgotphone:hover,
249
+ .miniorange_login_offline:hover, .miniorange_login_forgotphone:hover, .miniorange_otp_token_submit:hover {
250
+ background-color: #0073AA !important
251
+ }
252
+
253
+ .miniorange_kba_validate, .miniorange_validate_otp, .miniorange_login_forgotphone,
254
+ .miniorange_login_offline, .miniorange_login_forgotphone, .miniorange_otp_token_submit {
255
+ background: #00A0D2 !important;
256
+ border-color: #0073AA !important;
257
+ box-shadow: 0 1px 0 rgba(120, 200, 230, .5) inset, 0 1px 0 rgba(0, 0, 0, .15) !important;
258
+ color: #FFF !important;
259
+ text-decoration: none !important;
260
+ cursor: pointer !important;
261
+ border-width: 1px !important;
262
+ border-style: solid !important;
263
+ border-radius: 3px !important;
264
+ white-space: nowrap !important;
265
+ box-sizing: border-box !important;
266
+ line-height: 28px !important;
267
+ padding: 0 12px !important;
268
+ font-size: 13px !important
269
+ }
270
+
271
+ .mo_customer_validation-modal.fade .mo_customer_validation-modal-dialog {
272
+ -webkit-transition: -webkit-transform .3s ease-out;
273
+ -o-transition: -o-transform .3s ease-out;
274
+ transition: transform .3s ease-out;
275
+ -webkit-transform: translate(0, -25%);
276
+ -ms-transform: translate(0, -25%);
277
+ -o-transform: translate(0, -25%);
278
+ transform: translate(0, -25%)
279
+ }
280
+
281
+ .mo_customer_validation-modal.in .mo_customer_validation-modal-dialog {
282
+ -webkit-transform: translate(0, 80px) !important;
283
+ -ms-transform: translate(0, 80px) !important;
284
+ -o-transform: translate(0, 80px) !important;
285
+ transform: translate(0, 80px) !important
286
+ }
287
+
288
+ .mo_customer_validation-modal-open .mo_customer_validation-modal {
289
+ overflow-x: hidden;
290
+ overflow-y: hidden
291
+ }
292
+
293
+ .mo_customer_validation-modal-dialog {
294
+ position: relative;
295
+ width: auto;
296
+ margin: 10px
297
+ }
298
+
299
+ .mo_customer_validation-modal-content {
300
+ position: relative;
301
+ -webkit-background-clip: padding-box;
302
+ border: 1px solid #999;
303
+ border: 1px solid rgba(0, 0, 0, .2);
304
+ outline: 0;
305
+ margin-top: 8%;
306
+ margin-left: 0;
307
+ padding: 15px 20px 0;
308
+ font-family: "Open Sans", sans-serif;
309
+ color: #777;
310
+ font-size: 14px;
311
+ line-height: 1.4em;
312
+ background: #FFF;
313
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .13)
314
+ }
315
+
316
+ .mo_customer_validation-modal-backdrop {
317
+ position: absolute;
318
+ top: 0;
319
+ right: 0;
320
+ left: 0;
321
+ background-color: #000 !important;
322
+ filter: alpha(opacity=50) !important;
323
+ opacity: .9 !important;
324
+ height: 100% !important
325
+ }
326
+
327
+ .mo_customer_validation-modal-header {
328
+ min-height: 14px;
329
+ padding: 10px 10px 20px;
330
+ border-bottom: 1px solid #e5e5e5
331
+ }
332
+
333
+ .mo_customer_validation-modal-title {
334
+ margin: 0 !important;
335
+ line-height: 1 !important
336
+ }
337
+
338
+ .mo_customer_validation-modal-body {
339
+ position: relative;
340
+ padding: 5%;
341
+ overflow: hidden !important;
342
+ max-height: 550px !important
343
+ }
344
+
345
+ .mo_customer_validation-modal-footer {
346
+ padding: 15px;
347
+ text-align: right;
348
+ border-top: 1px solid #e5e5e5
349
+ }
350
+
351
+ .mo_customer_validation-modal-footer .btn + .btn {
352
+ margin-bottom: 0;
353
+ margin-left: 5px
354
+ }
355
+
356
+ .mo_customer_validation-modal-footer .btn-group .btn + .btn {
357
+ margin-left: -1px
358
+ }
359
+
360
+ .mo_customer_validation-modal-footer .btn-block + .btn-block {
361
+ margin-left: 0
362
+ }
363
+
364
+ .mo_customer_validation-modal-scrollbar-measure {
365
+ position: absolute;
366
+ top: -9999px;
367
+ width: 50px;
368
+ height: 50px;
369
+ overflow: scroll
370
+ }
371
+
372
+ @media (min-width: 768px) {
373
+ .mo_customer_validation-modal-dialog {
374
+ width: auto;
375
+ margin: 0 auto
376
+ }
377
+
378
+ .mo_customer_validation-modal-content {
379
+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
380
+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5)
381
+ }
382
+
383
+ .mo_customer_validation-modal-sm {
384
+ width: 300px
385
+ }
386
+
387
+ .mo_customer_validation-modal-md {
388
+ width: 532px
389
+ }
390
+
391
+ .mo_customer_validation-modal-lg {
392
+ width: 50%
393
+ }
394
+ }
395
+
396
+ @media (min-width: 992px) {
397
+ .mo_customer_validation-modal-dialog {
398
+ width: auto;
399
+ margin: 0 auto
400
+ }
401
+
402
+ .mo_customer_validation-modal-lg {
403
+ width: 490px
404
+ }
405
+
406
+ .mo_customer_validation-modal-md {
407
+ width: 532px
408
+ }
409
+ }
410
+
411
+ .mo_customer_validation-textbox {
412
+ background: #FBFBFB;
413
+ font-family: "Open Sans", sans-serif;
414
+ font-size: 24px;
415
+ width: 100%;
416
+ border: 1px solid #DDD;
417
+ padding: 3px;
418
+ margin: 2px 6px 16px 0
419
+ }
420
+
421
+ .mo_customer_validation-textbox:focus {
422
+ border-color: #5B9DD9;
423
+ box-shadow: 0 0 2px rgba(30, 140, 190, .8)
424
+
425
+ }
426
+
427
+
428
+
429
+ /*Hode login*/
430
+
431
+ body.login-action-login div#login {
432
+ display: none;
433
+ }
434
+
435
+ body.login-action-login div#login form#loginform input#user_login {
436
+ display: none;
437
+ }
438
+
439
+ body.login-action-login div#login form#loginform p.forgetmenot {
440
+ display: none;
441
+ }
442
+
443
+ body.login-action-login div#login form#loginform p.submit input#wp-submit {
444
+ display: none;
445
+ }
446
+
447
+ body.login-action-login div#login form#loginform p label {
448
+ display: none;
449
+ }
450
+
451
+ body.login-action-login div#login p#nav {
452
+ display: none;
453
+ }
454
+
455
+ body.login-action-login div#login form#loginform input#user_pass {
456
+ display: none;
457
+ }
458
+
459
+ body.login-action-login div#login div#login_error {
460
+ display: none;
461
+ }
462
+
463
+ body.login-action-login p.message {
464
+ display: none;
465
+ }
466
+
467
+ body.login-action-login div#login #loginform {
468
+ box-shadow: inherit;
469
+ }
470
+
471
+ body.login-action-login div#login div#login_error1 {
472
+ border-left: 4px solid #dd3d36;
473
+ margin-left: 0;
474
+ padding: 12px;
475
+ background: #fff;
476
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
477
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
478
+ }
479
+
480
+ .mo2f_header {
481
+ font-size: 28px;
482
+ font-family: -webkit-body;
483
+ color: #777;
484
+ }
485
+
486
+ .mo2f_powered_by_miniorange {
487
+ width: 100px;
488
+ height: 25px;
489
+ -webkit-background-size: 100px 25px;
490
+ background-size: 100px 25px;
491
+ background-repeat: no-repeat;
492
+ display: inline-block;
493
+ vertical-align: middle;
494
+ }
495
+
496
+ .mo2f_powered_by_div {
497
+ text-align: right;
498
+ font-size: 9px;
499
+ padding-right: 2%;
500
+ background-color: #FFFFFF;
501
+ }
502
+
503
+ .button-green {
504
+ color: rgb(0, 160, 210);
505
+ background: none !important;
506
+ border: none;
507
+ padding: 0 !important;
508
+ font: inherit;
509
+ border-color: transparent !important;
510
+ /*border is optional*/
511
+ border-bottom: 1px solid #444;
512
+ cursor: pointer;
513
+ }
514
+
515
+ .mo2fa_display_message {
516
+ padding: 12px;
517
+ border-left: 4px solid #00a0d2;
518
+ background-color: #fff;
519
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
520
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, .1);
521
+
522
+ }
523
+
524
+ .mo2fa_messages_container {
525
+ width: 300px;
526
+ }
527
+
528
+ .mo2fa_otp_messages_container {
529
+ width: 400px;
530
+ }
531
+
532
+ .mo2fa_push_messages_container {
533
+ width: 300px;
534
+ }
535
+
536
+ .miniorange_mobile_auth, .miniorange_app_setup_page {
537
+ border: 1px none transparent;
538
+ padding: 10% 24px 10px 20px;
539
+ min-height: 360px;
540
+ background: transparent;
541
+ z-index: 99999;
542
+ }
543
+
544
+ .mo2f-textbox {
545
+ width: 160px;
546
+ margin: 15px 0px !important;
547
+ background-color: rgba(123, 110, 110, 0.06) !important;
548
+ border-radius: 4px !important;
549
+ padding: 3px !important;
550
+ }
551
+
552
+ .miniorange_kba_page {
553
+ border: 1px none transparent;
554
+ padding: 10% 24px 10px 20px;
555
+ min-height: 360px;
556
+ background: transparent;
557
+ z-index: 99999;
558
+
559
+ }
560
+
561
+ .miniorange_push_oobemail_auth, .miniorange_trust_device {
562
+ border: 1px none transparent;
563
+ padding: 10% 24px 10px 20px;
564
+ min-height: 360px;
565
+ background: transparent;
566
+ z-index: 99999;
567
+ }
568
+
569
+ .miniorange_soft_auth {
570
+ border: 1px none transparent;
571
+ padding: 10% 24px 10px 20px;
572
+ min-height: 360px;
573
+ background: transparent;
574
+ z-index: 99999;
575
+ }
576
+
577
+ .miniorange-inner-login-container {
578
+ background-color: #fff;
579
+ margin: 0px auto !important;
580
+ width: 400px;
581
+ border-radius: 5px;
582
+ border: 1px solid rgba(128, 128, 128, 0.06);
583
+ }
584
+
585
+ .miniorange-inner-kba-login-container {
586
+ background-color: #fff;
587
+ margin: 0px auto !important;
588
+ width: 500px;
589
+ border-radius: 5px;
590
+ z-index: 99999;
591
+ border: 1px solid rgba(128, 128, 128, 0.06);
592
+ }
593
+
594
+ .miniorange-inner-push-login-container {
595
+ background-color: #fff;
596
+ margin: 0px auto !important;
597
+ width: 300px;
598
+ border-radius: 5px;
599
+
600
+ z-index: 99999;
601
+ border: 1px solid rgba(128, 128, 128, 0.06);
602
+ }
603
+
604
+ .miniorange-button {
605
+ height: 30px;
606
+ display: inline-block;
607
+ font-size: 14px;
608
+ line-height: 28px;
609
+ padding: 0 12px 2px;
610
+ border-width: 1px;
611
+ vertical-align: baseline;
612
+ background: #00a0d2;
613
+ border-style: solid;
614
+ border-color: #0073aa;
615
+ -webkit-appearance: none;
616
+ -webkit-border-radius: 3px;
617
+ border-radius: 3px;
618
+ white-space: nowrap;
619
+ -webkit-box-sizing: border-box;
620
+ -moz-box-sizing: border-box;
621
+ box-sizing: border-box;
622
+ -webkit-box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
623
+ box-shadow: inset 0 1px 0 rgba(120, 200, 230, .5), 0 1px 0 rgba(0, 0, 0, .15);
624
+ color: #fff;
625
+ text-decoration: none;
626
+ cursor: pointer;
627
+ }
628
+
629
+ .mo_green {
630
+ background: #2ECC71;
631
+ border-color: #2ECC71;
632
+ width: 37%;
633
+ }
634
+
635
+ .mo_red {
636
+ background: #E74C3C;
637
+ border-color: #E74C3C;
638
+ width: 37%;
639
+ }
640
+
641
+ .showQRHelp, .showOTPHelp {
642
+ text-align: center !important;
643
+ }
644
+
645
+ .mo_email_textbox {
646
+ width: 48%;
647
+ text-align: center;
648
+ height: 40px;
649
+ font-size: 18px;
650
+ border-radius: 5px;
651
+ }
652
+
653
+ .mo_header_background {
654
+ padding: 5px !important;
655
+ background-color: beige !important;
656
+ }
657
+
658
+ .mo2f_textbox {
659
+ width: 60% !important;
660
+ border-radius: 4px !important;
661
+ height: 30px !important;
662
+ font-size: 14px !important;
663
+ }
664
+
665
+ .mo2f_kba_textbox {
666
+ width: 100% !important;
667
+ border-radius: 4px !important;
668
+ height: 30px !important;
669
+ font-size: 14px !important;
670
+ }
671
+
672
+ .mo_hr {
673
+ border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
674
+ margin-top: 5px !important;
675
+ margin-right: 10px !important;
676
+ }
677
+
678
+ .mo_margin_left {
679
+ margin-left: 20px !important;
680
+ }
681
+
682
+ .miniorange-app-setup-container {
683
+ background-color: #fff;
684
+ margin: 0px auto !important;
685
+ width: 700px;
686
+ border-radius: 5px;
687
+ margin-top: -100px !important;
688
+ z-index: 99999;
689
+ border: 1px solid rgba(128, 128, 128, 0.06);
690
+
691
+ }
692
+
693
+ .miniorange-ga-setup-container {
694
+ background-color: #fff;
695
+ margin: 0px auto !important;
696
+ width: 900px;
697
+ border-radius: 5px;
698
+ margin-top: -50px !important;
699
+ z-index: 99999;
700
+ border: 1px solid rgba(128, 128, 128, 0.06);
701
+ }
702
+
703
+ .mo_app_link {
704
+ text-decoration: none !important;
705
+ color: #000 !important;
706
+ }
707
+
708
+ .mo2fa_app_setup_messages {
709
+ width: 700px;
710
+ }
711
+
712
+ .mo2f_td_show {
713
+ display: grid !important;
714
+ }
715
+
716
+ .mo2f_td_hide {
717
+ display: none !important;
718
+ }
719
+
720
+ .mo2f_kba_ques {
721
+ width: 370px !important;
722
+ border-radius: 4px !important;
723
+ height: 30px !important;
724
+ font-size: 14px !important;
725
+ }
726
+
727
+ .mo2f_kba_table {
728
+ padding: 0 10px;
729
+ width: 100%;
730
+ }
731
+
732
+ .mo2f_kba_tb_data {
733
+ padding-left: 15px;
734
+ }
735
+
736
+ .mo2f_table_textbox {
737
+ width: 150px;
738
+ height: 30px !important;
739
+ font-size: 14px !important;
740
+
741
+ }
742
+
743
+ .mo2f_kba_header {
744
+ font-weight: bold;
745
+ }
746
+
747
+ .mo2f_separator {
748
+ border-left: 1px solid #EBECEC;
749
+ padding: 5px;
750
+ }
751
+
752
+ .mo2f_inline_padding {
753
+ padding-left: 20px;
754
+ padding-right: 20px;
755
+ }
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+ .mo2f_powered_by_miniorange {
764
+ width: 100px;
765
+ height: 30px;
766
+ -webkit-background-size: 100px 25px;
767
+ background-size: 100px 25px;
768
+ background-repeat: no-repeat;
769
+ display: inline-block;
770
+ vertical-align: middle;
771
+ }
772
+
773
+ .mo2f_powered_by_div {
774
+ text-align: right;
775
+ font-size: 9px;
776
+ padding-right: 5px;
777
+ background-color: #FFFFFF;
778
+ width: 92%;
779
+ border-radius: 6px;
780
+ }
781
+
782
+ .mo2f-login-container {
783
+ display: inline-block !important;
784
+ display: -moz-inline-stack !important;
785
+ text-align: center !important;
786
+ width: 100%;
787
+
788
+ }
789
+
790
+ .mo2f-button {
791
+ width: 100% !important;
792
+ color: #fff !important;
793
+ line-height: normal;
794
+ height: 30px !important;
795
+ margin: 0px !important;
796
+ font-size: 14px !important;
797
+ padding: 7px !important;
798
+ background-color: #f0ad4e !important;
799
+ border-color: #eea236 !important;
800
+ -webkit-appearance: none;
801
+ -webkit-border-radius: 3px !important;
802
+ border-radius: 3px !important;
803
+
804
+ }
805
+
806
+ .mo2fa_display_message_login {
807
+ text-align: left !important;
808
+ font-size: 13px !important;
809
+ }
810
+
811
+ .mo2f-link {
812
+ color: #0191BF !important;
813
+ font-size: 14px !important;
814
+ font-weight: bold !important;
815
+ cursor: pointer !important;
816
+ }
817
+
818
+ .mo_green {
819
+ background: #2ECC71 !important;
820
+ border-color: #2ECC71 !important;
821
+ width: 26% !important;
822
+ border-width: 1px;
823
+ vertical-align: middle !important;
824
+ border-radius: 3px !important;
825
+ color: white;
826
+ height: 30px;
827
+ cursor: pointer;
828
+ }
829
+
830
+ .mo_red {
831
+ background: #E74C3C !important;
832
+ border-color: #E74C3C !important;
833
+ width: 26% !important;
834
+ border-width: 1px;
835
+ vertical-align: middle !important;
836
+ border-radius: 3px !important;
837
+ color: white;
838
+ height: 30px;
839
+ cursor: pointer;
840
+ }
841
+
842
+ .mo_otp_token {
843
+ font-size: 15px;
844
+ color: #212F3C;
845
+ border: none;
846
+ display: block;
847
+ border-bottom-style: solid;
848
+ border-width: 2px;
849
+ border-color: #D0D3D4;
850
+ border-radius: 0px;
851
+ outline: none;
852
+ width: 140px;
853
+ text-align: center;
854
+ }
855
+
856
+ .showQRHelp, .showOTPHelp {
857
+ text-align: center !important;
858
+
859
+ }
860
+
861
+ .mo2f_device {
862
+ padding-left: 200px !important;
863
+ vertical-align: -webkit-baseline-middle !important;
864
+ line-height: 3 !important;
865
+ }
866
+
867
+ .miniorange-button {
868
+ height: 30px;
869
+ font-size: 14px !important;
870
+ line-height: 5px !important;
871
+ padding: 16px !important;
872
+ border-width: 1px;
873
+ vertical-align: middle !important;
874
+ background-color: #f0ad4e !important;
875
+ border-color: #eea236 !important;
876
+ -webkit-appearance: none;
877
+ border-style: solid;
878
+ -webkit-border-radius: 3px !important;
879
+ border-radius: 3px !important;
880
+ white-space: nowrap;
881
+ -webkit-box-sizing: border-box;
882
+ -moz-box-sizing: border-box;
883
+ box-sizing: border-box;
884
+ color: #fff;
885
+ text-decoration: none;
886
+ cursor: pointer;
887
+ }
888
+
889
+ .mo_hr {
890
+ border-top: 1px solid rgba(220, 214, 214, 0.25) !important;
891
+ margin-top: 5px !important;
892
+ margin-right: 10px !important;
893
+ }
894
+
895
+ .mo_margin_left {
896
+ margin-left: 20px !important;
897
+ }
898
+
899
+ .mo_app_link {
900
+ text-decoration: none !important;
901
+ color: #000 !important;
902
+ }
903
+
904
+ .mo2f_td_show {
905
+ display: grid !important;
906
+ }
907
+
908
+ .mo2f_td_hide {
909
+ display: none !important;
910
+ }
911
+
912
+ .mo2f_label {
913
+ font-weight: 100 !important;
914
+ margin-left: 10px !important;
915
+
916
+ }
917
+
918
+ .mo2f_kba_ques {
919
+ width: 394px !important;
920
+ border-radius: 4px !important;
921
+ height: 40px !important;
922
+ font-size: 14px !important;
923
+ }
924
+
925
+ .mo2f_kba_table {
926
+ padding: 0 10px;
927
+ width: 100%;
928
+ border: hidden !important;
929
+ }
930
+
931
+ .mo2f_kba_tb_data {
932
+ padding-left: 15px;
933
+ }
934
+
935
+ .mo2f_table_textbox_1 {
936
+ width: 150px;
937
+ height: 30px !important;
938
+ font-size: 14px !important;
939
+ }
940
+
941
+ .mo2f_table_textbox {
942
+ width: 200px;
943
+ height: 40px !important;
944
+ font-size: 14px !important;
945
+
946
+ }
947
+
948
+ .mo2f_kba_header {
949
+ font-weight: bold;
950
+ border: hidden !important;
951
+ }
952
+
953
+ .mo2f_kba_body {
954
+ border: hidden !important;
955
+ }
956
+
957
+ .mo2f_separator {
958
+ border-left: 1px solid #EBECEC;
959
+ padding: 5px;
960
+ }
961
+
962
+ .mo2f_authn_header {
963
+ font-size: 14px !important;
964
+ }
965
+
966
+ #mo2f_inline_table {
967
+ border: hidden !important;
968
+ }
969
+
970
+ .mo2f_ordered_list {
971
+ margin: 0 0 0 1em !important;
972
+ }
973
+
974
+ .mo2f_list {
975
+ font-size: 14px !important;
976
+ }
includes/fonts/FontAwesome.otf DELETED
Binary file
includes/fonts/fontawesome-webfont.eot DELETED
Binary file
includes/fonts/fontawesome-webfont.svg DELETED
@@ -1,2672 +0,0 @@
1
- <?xml version="1.0" standalone="no"?>
2
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
- <svg>
4
- <metadata>
5
- Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
6
- By ,,,
7
- Copyright Dave Gandy 2016. All rights reserved.
8
- </metadata>
9
- <defs>
10
- <font id="FontAwesome" horiz-adv-x="1536">
11
- <font-face
12
- font-family="FontAwesome"
13
- font-weight="400"
14
- font-stretch="normal"
15
- units-per-em="1792"
16
- panose-1="0 0 0 0 0 0 0 0 0 0"
17
- ascent="1536"
18
- descent="-256"
19
- bbox="-1.02083 -256.962 2304.6 1537.02"
20
- underline-thickness="0"
21
- underline-position="0"
22
- unicode-range="U+0020-F500"
23
- />
24
- <missing-glyph horiz-adv-x="896"
25
- d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z"/>
26
- <glyph glyph-name=".notdef" horiz-adv-x="896"
27
- d="M224 112h448v1312h-448v-1312zM112 0v1536h672v-1536h-672z"/>
28
- <glyph glyph-name=".null" horiz-adv-x="0"
29
- />
30
- <glyph glyph-name="nonmarkingreturn" horiz-adv-x="597"
31
- />
32
- <glyph glyph-name="space" unicode=" " horiz-adv-x="448"
33
- />
34
- <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1792"
35
- />
36
- <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1792"
37
- />
38
- <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1792"
39
- />
40
- <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1792"
41
- />
42
- <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1792"
43
- />
44
- <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1792"
45
- />
46
- <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1792"
47
- />
48
- <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1792"
49
- />
50
- <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1792"
51
- />
52
- <glyph glyph-name="glass" unicode="&#xf000;" horiz-adv-x="1792"
53
- d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z"/>
54
- <glyph glyph-name="music" unicode="&#xf001;"
55
- d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89
56
- t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z"/>
57
- <glyph glyph-name="search" unicode="&#xf002;" horiz-adv-x="1664"
58
- d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5
59
- t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z"/>
60
- <glyph glyph-name="envelope" unicode="&#xf003;" horiz-adv-x="1792"
61
- d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13
62
- t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z
63
- M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z"/>
64
- <glyph glyph-name="heart" unicode="&#xf004;" horiz-adv-x="1792"
65
- d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600
66
- q-18 -18 -44 -18z"/>
67
- <glyph glyph-name="star" unicode="&#xf005;" horiz-adv-x="1664"
68
- d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455
69
- l502 -73q56 -9 56 -46z"/>
70
- <glyph glyph-name="star_empty" unicode="&#xf006;" horiz-adv-x="1664"
71
- d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500
72
- l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z"/>
73
- <glyph glyph-name="user" unicode="&#xf007;" horiz-adv-x="1280"
74
- d="M1280 137q0 -109 -62.5 -187t-150.5 -78h-854q-88 0 -150.5 78t-62.5 187q0 85 8.5 160.5t31.5 152t58.5 131t94 89t134.5 34.5q131 -128 313 -128t313 128q76 0 134.5 -34.5t94 -89t58.5 -131t31.5 -152t8.5 -160.5zM1024 1024q0 -159 -112.5 -271.5t-271.5 -112.5
75
- t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z"/>
76
- <glyph glyph-name="film" unicode="&#xf008;" horiz-adv-x="1920"
77
- d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128
78
- q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45
79
- t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128
80
- q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19
81
- t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z"/>
82
- <glyph glyph-name="th_large" unicode="&#xf009;" horiz-adv-x="1664"
83
- d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38
84
- h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z"/>
85
- <glyph glyph-name="th" unicode="&#xf00a;" horiz-adv-x="1792"
86
- d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320
87
- q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
88
- h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192
89
- q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z"/>
90
- <glyph glyph-name="th_list" unicode="&#xf00b;" horiz-adv-x="1792"
91
- d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960
92
- q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28
93
- h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z"/>
94
- <glyph glyph-name="ok" unicode="&#xf00c;" horiz-adv-x="1792"
95
- d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z"/>
96
- <glyph glyph-name="remove" unicode="&#xf00d;" horiz-adv-x="1408"
97
- d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68
98
- t-28 -68l-294 -294l294 -294q28 -28 28 -68z"/>
99
- <glyph glyph-name="zoom_in" unicode="&#xf00e;" horiz-adv-x="1664"
100
- d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224
101
- q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5
102
- t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z"/>
103
- <glyph glyph-name="zoom_out" unicode="&#xf010;" horiz-adv-x="1664"
104
- d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z
105
- M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z
106
- "/>
107
- <glyph glyph-name="off" unicode="&#xf011;"
108
- d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5
109
- t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z"/>
110
- <glyph glyph-name="signal" unicode="&#xf012;" horiz-adv-x="1792"
111
- d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23
112
- v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z"/>
113
- <glyph glyph-name="cog" unicode="&#xf013;"
114
- d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38
115
- q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13
116
- l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22
117
- q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z"/>
118
- <glyph glyph-name="trash" unicode="&#xf014;" horiz-adv-x="1408"
119
- d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576
120
- q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832
121
- q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z"/>
122
- <glyph glyph-name="home" unicode="&#xf015;" horiz-adv-x="1664"
123
- d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5
124
- l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z"/>
125
- <glyph glyph-name="file_alt" unicode="&#xf016;"
126
- d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
127
- "/>
128
- <glyph glyph-name="time" unicode="&#xf017;"
129
- d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
130
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
131
- <glyph glyph-name="road" unicode="&#xf018;" horiz-adv-x="1920"
132
- d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256
133
- q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z"/>
134
- <glyph glyph-name="download_alt" unicode="&#xf019;" horiz-adv-x="1664"
135
- d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136
136
- q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z"/>
137
- <glyph glyph-name="download" unicode="&#xf01a;"
138
- d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273
139
- t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
140
- <glyph glyph-name="upload" unicode="&#xf01b;"
141
- d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198
142
- t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
143
- <glyph glyph-name="inbox" unicode="&#xf01c;"
144
- d="M1023 576h316q-1 3 -2.5 8.5t-2.5 7.5l-212 496h-708l-212 -496q-1 -3 -2.5 -8.5t-2.5 -7.5h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552
145
- q25 -61 25 -123z"/>
146
- <glyph glyph-name="play_circle" unicode="&#xf01d;"
147
- d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640
148
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
149
- <glyph glyph-name="repeat" unicode="&#xf01e;"
150
- d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q15 0 25 -9
151
- l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z"/>
152
- <glyph glyph-name="refresh" unicode="&#xf021;"
153
- d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117
154
- q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5
155
- q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z"/>
156
- <glyph glyph-name="list_alt" unicode="&#xf022;" horiz-adv-x="1792"
157
- d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
158
- M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z
159
- M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5
160
- t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47
161
- t47 -113z"/>
162
- <glyph glyph-name="lock" unicode="&#xf023;" horiz-adv-x="1152"
163
- d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z"/>
164
- <glyph glyph-name="flag" unicode="&#xf024;" horiz-adv-x="1792"
165
- d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48
166
- t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z"/>
167
- <glyph glyph-name="headphones" unicode="&#xf025;" horiz-adv-x="1664"
168
- d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78
169
- t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5
170
- t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z"/>
171
- <glyph glyph-name="volume_off" unicode="&#xf026;" horiz-adv-x="768"
172
- d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z"/>
173
- <glyph glyph-name="volume_down" unicode="&#xf027;" horiz-adv-x="1152"
174
- d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
175
- t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z"/>
176
- <glyph glyph-name="volume_up" unicode="&#xf028;" horiz-adv-x="1664"
177
- d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 36
178
- t12 56.5t-12 56.5t-29 36t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5
179
- t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289
180
- t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z"/>
181
- <glyph glyph-name="qrcode" unicode="&#xf029;" horiz-adv-x="1408"
182
- d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z
183
- M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z"/>
184
- <glyph glyph-name="barcode" unicode="&#xf02a;" horiz-adv-x="1792"
185
- d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z
186
- M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z"/>
187
- <glyph glyph-name="tag" unicode="&#xf02b;"
188
- d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
189
- l715 -714q37 -39 37 -91z"/>
190
- <glyph glyph-name="tags" unicode="&#xf02c;" horiz-adv-x="1920"
191
- d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5
192
- l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z"/>
193
- <glyph glyph-name="book" unicode="&#xf02d;" horiz-adv-x="1664"
194
- d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23
195
- q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906
196
- q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5
197
- t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z"/>
198
- <glyph glyph-name="bookmark" unicode="&#xf02e;" horiz-adv-x="1280"
199
- d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z"/>
200
- <glyph glyph-name="print" unicode="&#xf02f;" horiz-adv-x="1664"
201
- d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68
202
- v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z"/>
203
- <glyph glyph-name="camera" unicode="&#xf030;" horiz-adv-x="1920"
204
- d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136
205
- q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z"/>
206
- <glyph glyph-name="font" unicode="&#xf031;" horiz-adv-x="1664"
207
- d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57
208
- q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -5 -0.5 -13.5t-0.5 -12.5q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5
209
- q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z"/>
210
- <glyph glyph-name="bold" unicode="&#xf032;" horiz-adv-x="1408"
211
- d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142
212
- q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5
213
- t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68 -0.5t68 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5
214
- t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z"/>
215
- <glyph glyph-name="italic" unicode="&#xf033;" horiz-adv-x="1024"
216
- d="M0 -126l17 85q22 7 61.5 16.5t72 19t59.5 23.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5
217
- q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z"/>
218
- <glyph glyph-name="text_height" unicode="&#xf034;" horiz-adv-x="1792"
219
- d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2
220
- t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5
221
- q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
222
- q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z"/>
223
- <glyph glyph-name="text_width" unicode="&#xf035;"
224
- d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1
225
- t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27
226
- q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5
227
- t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49
228
- t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z"/>
229
- <glyph glyph-name="align_left" unicode="&#xf036;" horiz-adv-x="1792"
230
- d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45
231
- t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z"/>
232
- <glyph glyph-name="align_center" unicode="&#xf037;" horiz-adv-x="1792"
233
- d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19
234
- h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z"/>
235
- <glyph glyph-name="align_right" unicode="&#xf038;" horiz-adv-x="1792"
236
- d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
237
- t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z"/>
238
- <glyph glyph-name="align_justify" unicode="&#xf039;" horiz-adv-x="1792"
239
- d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45
240
- t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z"/>
241
- <glyph glyph-name="list" unicode="&#xf03a;" horiz-adv-x="1792"
242
- d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5
243
- t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344
244
- q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
245
- t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192
246
- q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z"/>
247
- <glyph glyph-name="indent_left" unicode="&#xf03b;" horiz-adv-x="1792"
248
- d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
249
- t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
250
- q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z"/>
251
- <glyph glyph-name="indent_right" unicode="&#xf03c;" horiz-adv-x="1792"
252
- d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5
253
- t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088
254
- q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z"/>
255
- <glyph glyph-name="facetime_video" unicode="&#xf03d;" horiz-adv-x="1792"
256
- d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5
257
- q39 -17 39 -59z"/>
258
- <glyph glyph-name="picture" unicode="&#xf03e;" horiz-adv-x="1920"
259
- d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216
260
- q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z"/>
261
- <glyph glyph-name="pencil" unicode="&#xf040;"
262
- d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38
263
- q53 0 91 -38l235 -234q37 -39 37 -91z"/>
264
- <glyph glyph-name="map_marker" unicode="&#xf041;" horiz-adv-x="1024"
265
- d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z"/>
266
- <glyph glyph-name="adjust" unicode="&#xf042;"
267
- d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
268
- <glyph glyph-name="tint" unicode="&#xf043;" horiz-adv-x="1024"
269
- d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362
270
- q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z"/>
271
- <glyph glyph-name="edit" unicode="&#xf044;" horiz-adv-x="1792"
272
- d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
273
- q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92
274
- l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z"/>
275
- <glyph glyph-name="share" unicode="&#xf045;" horiz-adv-x="1664"
276
- d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832
277
- q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5
278
- t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z"/>
279
- <glyph glyph-name="check" unicode="&#xf046;" horiz-adv-x="1664"
280
- d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832
281
- q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110
282
- q24 -24 24 -57t-24 -57z"/>
283
- <glyph glyph-name="move" unicode="&#xf047;" horiz-adv-x="1792"
284
- d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45
285
- t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z"/>
286
- <glyph glyph-name="step_backward" unicode="&#xf048;" horiz-adv-x="1024"
287
- d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19z"/>
288
- <glyph glyph-name="fast_backward" unicode="&#xf049;" horiz-adv-x="1792"
289
- d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 10 13 19l710 710
290
- q19 19 32 13t13 -32v-710q4 10 13 19z"/>
291
- <glyph glyph-name="backward" unicode="&#xf04a;" horiz-adv-x="1664"
292
- d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q4 10 13 19z"/>
293
- <glyph glyph-name="play" unicode="&#xf04b;" horiz-adv-x="1408"
294
- d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z"/>
295
- <glyph glyph-name="pause" unicode="&#xf04c;"
296
- d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z"/>
297
- <glyph glyph-name="stop" unicode="&#xf04d;"
298
- d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z"/>
299
- <glyph glyph-name="forward" unicode="&#xf04e;" horiz-adv-x="1664"
300
- d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z"/>
301
- <glyph glyph-name="fast_forward" unicode="&#xf050;" horiz-adv-x="1792"
302
- d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v710q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19l-710 -710
303
- q-19 -19 -32 -13t-13 32v710q-4 -10 -13 -19z"/>
304
- <glyph glyph-name="step_forward" unicode="&#xf051;" horiz-adv-x="1024"
305
- d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q9 -9 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-4 -10 -13 -19z"/>
306
- <glyph glyph-name="eject" unicode="&#xf052;" horiz-adv-x="1538"
307
- d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z"/>
308
- <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1280"
309
- d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z"/>
310
- <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1280"
311
- d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z"/>
312
- <glyph glyph-name="plus_sign" unicode="&#xf055;"
313
- d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5
314
- t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
315
- <glyph glyph-name="minus_sign" unicode="&#xf056;"
316
- d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5
317
- t103 -385.5z"/>
318
- <glyph glyph-name="remove_sign" unicode="&#xf057;"
319
- d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19
320
- q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
321
- <glyph glyph-name="ok_sign" unicode="&#xf058;"
322
- d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103
323
- t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
324
- <glyph glyph-name="question_sign" unicode="&#xf059;"
325
- d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59
326
- q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5
327
- t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
328
- <glyph glyph-name="info_sign" unicode="&#xf05a;"
329
- d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23
330
- t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
331
- <glyph glyph-name="screenshot" unicode="&#xf05b;"
332
- d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109
333
- q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143
334
- q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z"/>
335
- <glyph glyph-name="remove_circle" unicode="&#xf05c;"
336
- d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23
337
- l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5
338
- t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
339
- <glyph glyph-name="ok_circle" unicode="&#xf05d;"
340
- d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198
341
- t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
342
- <glyph glyph-name="ban_circle" unicode="&#xf05e;"
343
- d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61
344
- t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z"/>
345
- <glyph glyph-name="arrow_left" unicode="&#xf060;"
346
- d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5
347
- t32.5 -90.5z"/>
348
- <glyph glyph-name="arrow_right" unicode="&#xf061;"
349
- d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z"/>
350
- <glyph glyph-name="arrow_up" unicode="&#xf062;" horiz-adv-x="1664"
351
- d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651
352
- q37 -39 37 -91z"/>
353
- <glyph glyph-name="arrow_down" unicode="&#xf063;" horiz-adv-x="1664"
354
- d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z"/>
355
- <glyph glyph-name="share_alt" unicode="&#xf064;" horiz-adv-x="1792"
356
- d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22
357
- t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z"/>
358
- <glyph glyph-name="resize_full" unicode="&#xf065;"
359
- d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332
360
- q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z"/>
361
- <glyph glyph-name="resize_small" unicode="&#xf066;"
362
- d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45
363
- t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z"/>
364
- <glyph glyph-name="plus" unicode="&#xf067;" horiz-adv-x="1408"
365
- d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z"/>
366
- <glyph glyph-name="minus" unicode="&#xf068;" horiz-adv-x="1408"
367
- d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z"/>
368
- <glyph glyph-name="asterisk" unicode="&#xf069;" horiz-adv-x="1664"
369
- d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154
370
- q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z"/>
371
- <glyph glyph-name="exclamation_sign" unicode="&#xf06a;"
372
- d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192
373
- q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z"/>
374
- <glyph glyph-name="gift" unicode="&#xf06b;"
375
- d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320
376
- q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5
377
- t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z"/>
378
- <glyph glyph-name="leaf" unicode="&#xf06c;" horiz-adv-x="1792"
379
- d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268
380
- q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-43 0 -63.5 17.5t-45.5 59.5q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5
381
- t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z"/>
382
- <glyph glyph-name="fire" unicode="&#xf06d;" horiz-adv-x="1408"
383
- d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1
384
- q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z"/>
385
- <glyph glyph-name="eye_open" unicode="&#xf06e;" horiz-adv-x="1792"
386
- d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5
387
- t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z"/>
388
- <glyph glyph-name="eye_close" unicode="&#xf070;" horiz-adv-x="1792"
389
- d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9
390
- q-106 -189 -316 -567t-315 -566l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5
391
- q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z
392
- "/>
393
- <glyph glyph-name="warning_sign" unicode="&#xf071;" horiz-adv-x="1792"
394
- d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185
395
- q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z"/>
396
- <glyph glyph-name="plane" unicode="&#xf072;" horiz-adv-x="1408"
397
- d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9
398
- q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z"/>
399
- <glyph glyph-name="calendar" unicode="&#xf073;" horiz-adv-x="1664"
400
- d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
401
- M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64
402
- q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47
403
- h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z"/>
404
- <glyph glyph-name="random" unicode="&#xf074;" horiz-adv-x="1792"
405
- d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1
406
- t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5
407
- v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111
408
- t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z"/>
409
- <glyph glyph-name="comment" unicode="&#xf075;" horiz-adv-x="1792"
410
- d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281
411
- q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z"/>
412
- <glyph glyph-name="magnet" unicode="&#xf076;"
413
- d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384
414
- q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z"/>
415
- <glyph glyph-name="chevron_up" unicode="&#xf077;" horiz-adv-x="1792"
416
- d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z"/>
417
- <glyph glyph-name="chevron_down" unicode="&#xf078;" horiz-adv-x="1792"
418
- d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z"/>
419
- <glyph glyph-name="retweet" unicode="&#xf079;" horiz-adv-x="1920"
420
- d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -10 7 -21
421
- zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z
422
- "/>
423
- <glyph glyph-name="shopping_cart" unicode="&#xf07a;" horiz-adv-x="1664"
424
- d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45
425
- t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z"/>
426
- <glyph glyph-name="folder_close" unicode="&#xf07b;" horiz-adv-x="1664"
427
- d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z"/>
428
- <glyph glyph-name="folder_open" unicode="&#xf07c;" horiz-adv-x="1920"
429
- d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5
430
- t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z"/>
431
- <glyph glyph-name="resize_vertical" unicode="&#xf07d;" horiz-adv-x="768"
432
- d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z"/>
433
- <glyph glyph-name="resize_horizontal" unicode="&#xf07e;" horiz-adv-x="1792"
434
- d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z"/>
435
- <glyph glyph-name="bar_chart" unicode="&#xf080;" horiz-adv-x="2048"
436
- d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z"/>
437
- <glyph glyph-name="twitter_sign" unicode="&#xf081;"
438
- d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4
439
- q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5
440
- t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
441
- <glyph glyph-name="facebook_sign" unicode="&#xf082;"
442
- d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960
443
- q0 119 84.5 203.5t203.5 84.5h960z"/>
444
- <glyph glyph-name="camera_retro" unicode="&#xf083;" horiz-adv-x="1792"
445
- d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5
446
- t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280
447
- q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z"/>
448
- <glyph glyph-name="key" unicode="&#xf084;" horiz-adv-x="1792"
449
- d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26
450
- l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5
451
- t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z"/>
452
- <glyph glyph-name="cogs" unicode="&#xf085;" horiz-adv-x="1920"
453
- d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5
454
- t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -11 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5
455
- l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7
456
- l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -8 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31
457
- q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20
458
- t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68
459
- q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70
460
- q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z"/>
461
- <glyph glyph-name="comments" unicode="&#xf086;" horiz-adv-x="1792"
462
- d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224
463
- q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7
464
- q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z"/>
465
- <glyph glyph-name="thumbs_up_alt" unicode="&#xf087;"
466
- d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5
467
- t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769
468
- q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128
469
- q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z"/>
470
- <glyph glyph-name="thumbs_down_alt" unicode="&#xf088;"
471
- d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 31 18 69q0 37 -17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5
472
- t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z
473
- M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5
474
- h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -73 49 -163z"/>
475
- <glyph glyph-name="star_half" unicode="&#xf089;" horiz-adv-x="896"
476
- d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z"/>
477
- <glyph glyph-name="heart_empty" unicode="&#xf08a;" horiz-adv-x="1792"
478
- d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559
479
- q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5
480
- q224 0 351 -124t127 -344z"/>
481
- <glyph glyph-name="signout" unicode="&#xf08b;" horiz-adv-x="1664"
482
- d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704
483
- q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z"/>
484
- <glyph glyph-name="linkedin_sign" unicode="&#xf08c;"
485
- d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5
486
- q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
487
- <glyph glyph-name="pushpin" unicode="&#xf08d;" horiz-adv-x="1152"
488
- d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38
489
- t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z"/>
490
- <glyph glyph-name="external_link" unicode="&#xf08e;" horiz-adv-x="1792"
491
- d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320
492
- q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z"/>
493
- <glyph glyph-name="signin" unicode="&#xf090;"
494
- d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5
495
- q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z"/>
496
- <glyph glyph-name="trophy" unicode="&#xf091;" horiz-adv-x="1664"
497
- d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91
498
- t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96
499
- q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z"/>
500
- <glyph glyph-name="github_sign" unicode="&#xf092;"
501
- d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4
502
- q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4
503
- t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16
504
- q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960
505
- q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
506
- <glyph glyph-name="upload_alt" unicode="&#xf093;" horiz-adv-x="1664"
507
- d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92
508
- t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z"/>
509
- <glyph glyph-name="lemon" unicode="&#xf094;"
510
- d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5
511
- q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44
512
- q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5
513
- q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -13 2 -25t3.5 -16.5t7.5 -20.5t8 -20q16 -40 25 -118.5t9 -136.5z"/>
514
- <glyph glyph-name="phone" unicode="&#xf095;" horiz-adv-x="1408"
515
- d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -53 3.5t-57.5 12.5t-47 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-127 79 -264 216t-216 264q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47t-12.5 57.5t-3.5 53q0 92 51 186
516
- q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174q2 -1 19 -11.5t24 -14
517
- t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z"/>
518
- <glyph glyph-name="check_empty" unicode="&#xf096;" horiz-adv-x="1408"
519
- d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832
520
- q119 0 203.5 -84.5t84.5 -203.5z"/>
521
- <glyph glyph-name="bookmark_empty" unicode="&#xf097;" horiz-adv-x="1280"
522
- d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289
523
- q0 34 19.5 62t52.5 41q21 9 44 9h1048z"/>
524
- <glyph glyph-name="phone_sign" unicode="&#xf098;"
525
- d="M1280 343q0 11 -2 16t-18 16.5t-40.5 25t-47.5 26.5t-45.5 25t-28.5 15q-5 3 -19 13t-25 15t-21 5q-15 0 -36.5 -20.5t-39.5 -45t-38.5 -45t-33.5 -20.5q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170 126.5t-127 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5
526
- t-3.5 16.5q0 13 20.5 33.5t45 38.5t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5
527
- t320.5 -216.5q6 -2 30 -11t33 -12.5t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z
528
- "/>
529
- <glyph glyph-name="twitter" unicode="&#xf099;" horiz-adv-x="1664"
530
- d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41
531
- q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z"/>
532
- <glyph glyph-name="facebook" unicode="&#xf09a;" horiz-adv-x="1024"
533
- d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z"/>
534
- <glyph glyph-name="github" unicode="&#xf09b;"
535
- d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24
536
- q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5
537
- t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12
538
- q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z
539
- M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z"/>
540
- <glyph glyph-name="unlock" unicode="&#xf09c;" horiz-adv-x="1664"
541
- d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5
542
- t316.5 -131.5t131.5 -316.5z"/>
543
- <glyph glyph-name="credit_card" unicode="&#xf09d;" horiz-adv-x="1920"
544
- d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608
545
- q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z"/>
546
- <glyph glyph-name="rss" unicode="&#xf09e;" horiz-adv-x="1408"
547
- d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5
548
- t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294
549
- q187 -186 294 -425.5t120 -501.5z"/>
550
- <glyph glyph-name="hdd" unicode="&#xf0a0;"
551
- d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5
552
- h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75
553
- l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z"/>
554
- <glyph glyph-name="bullhorn" unicode="&#xf0a1;" horiz-adv-x="1792"
555
- d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5
556
- t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z"/>
557
- <glyph glyph-name="bell" unicode="&#xf0a2;" horiz-adv-x="1792"
558
- d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z
559
- M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5
560
- t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z"/>
561
- <glyph glyph-name="certificate" unicode="&#xf0a3;"
562
- d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70
563
- l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70
564
- l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z"/>
565
- <glyph glyph-name="hand_right" unicode="&#xf0a4;" horiz-adv-x="1792"
566
- d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106
567
- q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43
568
- q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5
569
- t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z"/>
570
- <glyph glyph-name="hand_left" unicode="&#xf0a5;" horiz-adv-x="1792"
571
- d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-8 9 -12 14q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576q-50 0 -89 -38.5
572
- t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45z
573
- M1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128q0 122 81.5 189t206.5 67
574
- q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z"/>
575
- <glyph glyph-name="hand_up" unicode="&#xf0a6;"
576
- d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576
577
- q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5
578
- t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76
579
- q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z"/>
580
- <glyph glyph-name="hand_down" unicode="&#xf0a7;"
581
- d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33
582
- t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580
583
- q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100
584
- q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z"/>
585
- <glyph glyph-name="circle_arrow_left" unicode="&#xf0a8;"
586
- d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640
587
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
588
- <glyph glyph-name="circle_arrow_right" unicode="&#xf0a9;"
589
- d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640
590
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
591
- <glyph glyph-name="circle_arrow_up" unicode="&#xf0aa;"
592
- d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640
593
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
594
- <glyph glyph-name="circle_arrow_down" unicode="&#xf0ab;"
595
- d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640
596
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
597
- <glyph glyph-name="globe" unicode="&#xf0ac;"
598
- d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11
599
- q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 11t-9.5 10q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5
600
- q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5
601
- q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5
602
- t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-4 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3
603
- q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25
604
- q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5
605
- t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5
606
- t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10.5t17 -19.5q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21
607
- q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5
608
- q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3
609
- q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5
610
- t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q8 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5
611
- q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7
612
- q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z"/>
613
- <glyph glyph-name="wrench" unicode="&#xf0ad;" horiz-adv-x="1664"
614
- d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5
615
- t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z"/>
616
- <glyph glyph-name="tasks" unicode="&#xf0ae;" horiz-adv-x="1792"
617
- d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19
618
- t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z"/>
619
- <glyph glyph-name="filter" unicode="&#xf0b0;" horiz-adv-x="1408"
620
- d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z"/>
621
- <glyph glyph-name="briefcase" unicode="&#xf0b1;" horiz-adv-x="1792"
622
- d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68
623
- t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z"/>
624
- <glyph glyph-name="fullscreen" unicode="&#xf0b2;"
625
- d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144
626
- l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z
627
- "/>
628
- <glyph glyph-name="group" unicode="&#xf0c0;" horiz-adv-x="1920"
629
- d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5
630
- t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75
631
- t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5
632
- t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z"/>
633
- <glyph glyph-name="link" unicode="&#xf0c1;" horiz-adv-x="1664"
634
- d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26
635
- l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15
636
- t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207
637
- q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z"/>
638
- <glyph glyph-name="cloud" unicode="&#xf0c2;" horiz-adv-x="1920"
639
- d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z
640
- "/>
641
- <glyph glyph-name="beaker" unicode="&#xf0c3;" horiz-adv-x="1664"
642
- d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z"/>
643
- <glyph glyph-name="cut" unicode="&#xf0c4;" horiz-adv-x="1792"
644
- d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84
645
- q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148
646
- q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108
647
- q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6
648
- q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z"/>
649
- <glyph glyph-name="copy" unicode="&#xf0c5;" horiz-adv-x="1792"
650
- d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299
651
- h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z"/>
652
- <glyph glyph-name="paper_clip" unicode="&#xf0c6;" horiz-adv-x="1408"
653
- d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181
654
- l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235
655
- z"/>
656
- <glyph glyph-name="save" unicode="&#xf0c7;"
657
- d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5
658
- h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z"/>
659
- <glyph glyph-name="sign_blank" unicode="&#xf0c8;"
660
- d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
661
- <glyph glyph-name="reorder" unicode="&#xf0c9;"
662
- d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45
663
- t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z"/>
664
- <glyph glyph-name="ul" unicode="&#xf0ca;" horiz-adv-x="1792"
665
- d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5
666
- t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z
667
- M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z"/>
668
- <glyph glyph-name="ol" unicode="&#xf0cb;" horiz-adv-x="1792"
669
- d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362
670
- q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5
671
- t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 121.5t0.5 121.5v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216
672
- q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z"/>
673
- <glyph glyph-name="strikethrough" unicode="&#xf0cc;" horiz-adv-x="1792"
674
- d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 98 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6
675
- l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -56 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23
676
- l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z"/>
677
- <glyph glyph-name="underline" unicode="&#xf0cd;"
678
- d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47
679
- q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41
680
- q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472
681
- q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z"/>
682
- <glyph glyph-name="table" unicode="&#xf0ce;" horiz-adv-x="1664"
683
- d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23
684
- v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192
685
- q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192
686
- q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113
687
- z"/>
688
- <glyph glyph-name="magic" unicode="&#xf0d0;" horiz-adv-x="1664"
689
- d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276
690
- l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z"/>
691
- <glyph glyph-name="truck" unicode="&#xf0d1;" horiz-adv-x="1792"
692
- d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5
693
- t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38
694
- t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z"/>
695
- <glyph glyph-name="pinterest" unicode="&#xf0d2;"
696
- d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134
697
- q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33
698
- q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
699
- <glyph glyph-name="pinterest_sign" unicode="&#xf0d3;"
700
- d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5
701
- t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5
702
- t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z"/>
703
- <glyph glyph-name="google_plus_sign" unicode="&#xf0d4;"
704
- d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585
705
- h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
706
- <glyph glyph-name="google_plus" unicode="&#xf0d5;" horiz-adv-x="2304"
707
- d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62
708
- q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z"/>
709
- <glyph glyph-name="money" unicode="&#xf0d6;" horiz-adv-x="1920"
710
- d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384
711
- v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z"/>
712
- <glyph glyph-name="caret_down" unicode="&#xf0d7;" horiz-adv-x="1024"
713
- d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z"/>
714
- <glyph glyph-name="caret_up" unicode="&#xf0d8;" horiz-adv-x="1024"
715
- d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z"/>
716
- <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640"
717
- d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z"/>
718
- <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640"
719
- d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z"/>
720
- <glyph glyph-name="columns" unicode="&#xf0db;" horiz-adv-x="1664"
721
- d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z"/>
722
- <glyph glyph-name="sort" unicode="&#xf0dc;" horiz-adv-x="1024"
723
- d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z"/>
724
- <glyph glyph-name="sort_down" unicode="&#xf0dd;" horiz-adv-x="1024"
725
- d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z"/>
726
- <glyph glyph-name="sort_up" unicode="&#xf0de;" horiz-adv-x="1024"
727
- d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z"/>
728
- <glyph glyph-name="envelope_alt" unicode="&#xf0e0;" horiz-adv-x="1792"
729
- d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123
730
- q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z"/>
731
- <glyph glyph-name="linkedin" unicode="&#xf0e1;"
732
- d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329
733
- q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z"/>
734
- <glyph glyph-name="undo" unicode="&#xf0e2;"
735
- d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5
736
- t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z"/>
737
- <glyph glyph-name="legal" unicode="&#xf0e3;" horiz-adv-x="1792"
738
- d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5
739
- t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14
740
- q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28
741
- q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z"/>
742
- <glyph glyph-name="dashboard" unicode="&#xf0e4;" horiz-adv-x="1792"
743
- d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5
744
- t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5
745
- t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29
746
- q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z"/>
747
- <glyph glyph-name="comment_alt" unicode="&#xf0e5;" horiz-adv-x="1792"
748
- d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640
749
- q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5
750
- t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z"/>
751
- <glyph glyph-name="comments_alt" unicode="&#xf0e6;" horiz-adv-x="1792"
752
- d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257
753
- t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5
754
- t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129
755
- q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z"/>
756
- <glyph glyph-name="bolt" unicode="&#xf0e7;" horiz-adv-x="896"
757
- d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z"/>
758
- <glyph glyph-name="sitemap" unicode="&#xf0e8;" horiz-adv-x="1792"
759
- d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320
760
- q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68
761
- z"/>
762
- <glyph glyph-name="umbrella" unicode="&#xf0e9;" horiz-adv-x="1664"
763
- d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97
764
- q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69
765
- q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z"/>
766
- <glyph glyph-name="paste" unicode="&#xf0ea;" horiz-adv-x="1792"
767
- d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28
768
- h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z"/>
769
- <glyph glyph-name="light_bulb" unicode="&#xf0eb;" horiz-adv-x="1024"
770
- d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134
771
- q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47
772
- q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5
773
- t186.5 -32.5t164 -89t117 -142t44.5 -184.5z"/>
774
- <glyph glyph-name="exchange" unicode="&#xf0ec;" horiz-adv-x="1792"
775
- d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9
776
- q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z"/>
777
- <glyph glyph-name="cloud_download" unicode="&#xf0ed;" horiz-adv-x="1920"
778
- d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
779
- q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z"/>
780
- <glyph glyph-name="cloud_upload" unicode="&#xf0ee;" horiz-adv-x="1920"
781
- d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088
782
- q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z"/>
783
- <glyph glyph-name="user_md" unicode="&#xf0f0;" horiz-adv-x="1408"
784
- d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56
785
- t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68
786
- t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5
787
- t271.5 -112.5t112.5 -271.5z"/>
788
- <glyph glyph-name="stethoscope" unicode="&#xf0f1;" horiz-adv-x="1408"
789
- d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48
790
- t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252
791
- t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z"/>
792
- <glyph glyph-name="suitcase" unicode="&#xf0f2;" horiz-adv-x="1792"
793
- d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66
794
- t66 -158z"/>
795
- <glyph glyph-name="bell_alt" unicode="&#xf0f3;" horiz-adv-x="1792"
796
- d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5
797
- t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z"/>
798
- <glyph glyph-name="coffee" unicode="&#xf0f4;" horiz-adv-x="1920"
799
- d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45
800
- t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z"/>
801
- <glyph glyph-name="food" unicode="&#xf0f5;" horiz-adv-x="1408"
802
- d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45
803
- t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z"/>
804
- <glyph glyph-name="file_text_alt" unicode="&#xf0f6;"
805
- d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z
806
- M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704
807
- q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z"/>
808
- <glyph glyph-name="building" unicode="&#xf0f7;" horiz-adv-x="1408"
809
- d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
810
- M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
811
- M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
812
- M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
813
- M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
814
- M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
815
- M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
816
- M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
817
- M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
818
- M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z"/>
819
- <glyph glyph-name="hospital" unicode="&#xf0f8;" horiz-adv-x="1408"
820
- d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
821
- M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
822
- M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
823
- M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
824
- M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z
825
- M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5
826
- t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320
827
- v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z"/>
828
- <glyph glyph-name="ambulance" unicode="&#xf0f9;" horiz-adv-x="1920"
829
- d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5
830
- t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152
831
- q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z"/>
832
- <glyph glyph-name="medkit" unicode="&#xf0fa;" horiz-adv-x="1792"
833
- d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32
834
- q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z"/>
835
- <glyph glyph-name="fighter_jet" unicode="&#xf0fb;" horiz-adv-x="1920"
836
- d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96
837
- q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q128 -28 200 -52t80 -34z"/>
838
- <glyph glyph-name="beer" unicode="&#xf0fc;" horiz-adv-x="1664"
839
- d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z"/>
840
- <glyph glyph-name="h_sign" unicode="&#xf0fd;"
841
- d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960
842
- q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
843
- <glyph glyph-name="f0fe" unicode="&#xf0fe;"
844
- d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960
845
- q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z"/>
846
- <glyph glyph-name="double_angle_left" unicode="&#xf100;" horiz-adv-x="1024"
847
- d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
848
- t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z"/>
849
- <glyph glyph-name="double_angle_right" unicode="&#xf101;" horiz-adv-x="1024"
850
- d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23
851
- l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z"/>
852
- <glyph glyph-name="double_angle_up" unicode="&#xf102;" horiz-adv-x="1152"
853
- d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393
854
- q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z"/>
855
- <glyph glyph-name="double_angle_down" unicode="&#xf103;" horiz-adv-x="1152"
856
- d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23
857
- t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z"/>
858
- <glyph glyph-name="angle_left" unicode="&#xf104;" horiz-adv-x="640"
859
- d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z"/>
860
- <glyph glyph-name="angle_right" unicode="&#xf105;" horiz-adv-x="640"
861
- d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z"/>
862
- <glyph glyph-name="angle_up" unicode="&#xf106;" horiz-adv-x="1152"
863
- d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z"/>
864
- <glyph glyph-name="angle_down" unicode="&#xf107;" horiz-adv-x="1152"
865
- d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z"/>
866
- <glyph glyph-name="desktop" unicode="&#xf108;" horiz-adv-x="1920"
867
- d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19
868
- t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z"/>
869
- <glyph glyph-name="laptop" unicode="&#xf109;" horiz-adv-x="1920"
870
- d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z
871
- M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z"/>
872
- <glyph glyph-name="tablet" unicode="&#xf10a;" horiz-adv-x="1152"
873
- d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832
874
- q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z"/>
875
- <glyph glyph-name="mobile_phone" unicode="&#xf10b;" horiz-adv-x="768"
876
- d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136
877
- q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z"/>
878
- <glyph glyph-name="circle_blank" unicode="&#xf10c;"
879
- d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103
880
- t279.5 -279.5t103 -385.5z"/>
881
- <glyph glyph-name="quote_left" unicode="&#xf10d;" horiz-adv-x="1664"
882
- d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z
883
- M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z"/>
884
- <glyph glyph-name="quote_right" unicode="&#xf10e;" horiz-adv-x="1664"
885
- d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216
886
- v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z"/>
887
- <glyph glyph-name="spinner" unicode="&#xf110;" horiz-adv-x="1792"
888
- d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5
889
- t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z
890
- M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5
891
- q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z"/>
892
- <glyph glyph-name="circle" unicode="&#xf111;"
893
- d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
894
- <glyph glyph-name="reply" unicode="&#xf112;" horiz-adv-x="1792"
895
- d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19
896
- l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z"/>
897
- <glyph glyph-name="github_alt" unicode="&#xf113;" horiz-adv-x="1664"
898
- d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320
899
- q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86
900
- t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218
901
- q0 -87 -27 -168q136 -160 136 -398z"/>
902
- <glyph glyph-name="folder_close_alt" unicode="&#xf114;" horiz-adv-x="1664"
903
- d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320
904
- q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z"/>
905
- <glyph glyph-name="folder_open_alt" unicode="&#xf115;" horiz-adv-x="1920"
906
- d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68
907
- v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z
908
- "/>
909
- <glyph glyph-name="expand_alt" unicode="&#xf116;" horiz-adv-x="1792"
910
- />
911
- <glyph glyph-name="collapse_alt" unicode="&#xf117;" horiz-adv-x="1792"
912
- />
913
- <glyph glyph-name="smile" unicode="&#xf118;"
914
- d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5
915
- t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5
916
- t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
917
- <glyph glyph-name="frown" unicode="&#xf119;"
918
- d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
919
- t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204
920
- t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
921
- <glyph glyph-name="meh" unicode="&#xf11a;"
922
- d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5
923
- t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640
924
- q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z"/>
925
- <glyph glyph-name="gamepad" unicode="&#xf11b;" horiz-adv-x="1920"
926
- d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5
927
- t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150
928
- t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z"/>
929
- <glyph glyph-name="keyboard" unicode="&#xf11c;" horiz-adv-x="1920"
930
- d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16
931
- h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16
932
- h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96
933
- q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896
934
- h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z"/>
935
- <glyph gly