PluginProbe
Patchstack – WordPress & Plugins Security / 2.1.1
Patchstack – WordPress & Plugins Security v2.1.1
2.3.7 trunk 2.1.0 2.1.1 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.2 2.1.20 2.1.21 2.1.22 2.1.23 2.1.24 2.1.25 2.1.3 2.1.4 2.1.5 2.1.6 All 49 releases
patchstack / includes / admin / general.php

general.php in Patchstack – WordPress & Plugins Security 2.1.1, at includes/admin/general.php

183 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // Do not allow the file to be called directly.
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit;
6 }
7
8 /**
9 * This class is used for any general admin functionality.
10 * For example to display general errors on all pages or event listeners.
11 */
12 class P_Admin_General extends P_Core {
13
14 /**
15 * Add any general actions for the backend.
16 *
17 * @param Patchstack $core
18 * @return void
19 */
20 public function __construct( $core ) {
21 parent::__construct( $core );
22
23 // Add admin and network notices.
24 add_action( 'admin_notices', array( $this, 'file_error_notice' ) );
25 add_action( 'network_admin_notices', array( $this, 'file_error_notice' ) );
26
27 add_action( 'wp_loaded', array( $this, 'update_rules' ) );
28 add_action( 'update_option_siteurl', array( $this, 'update_option_url' ), 10, 2 );
29 add_action( 'admin_init', array( $this, 'alter_ips' ) );
30 add_action( 'admin_init', array( $this, 'enable_settings' ) );
31
32 // If the firewall or whitelist rules do not exist, attempt to pull fresh.
33 $token = get_option( 'patchstack_api_token', false );
34 if ( ! empty( $token ) && ( get_option( 'patchstack_firewall_rules', '' ) == '' || get_option( 'patchstack_whitelist_keys_rules' ) == '' ) && get_option( 'patchstack_license_free', 0 ) != 1 ) {
35 do_action( 'patchstack_post_dynamic_firewall_rules' );
36 }
37 }
38
39 /**
40 * Display error message if file/folder permissions are not set properly.
41 *
42 * @return void
43 */
44 public function file_error_notice() {
45 // No need to display this error if the .htaccess functionality has been disabled.
46 if ( get_site_option( 'patchstack_disable_htaccess', 0 ) ) {
47 return;
48 }
49
50 // Check root .htaccess file and data folder writability.
51 $files = array();
52 if ( file_exists( ABSPATH . '.htaccess' ) && ! wp_is_writable( ABSPATH . '.htaccess' ) ) {
53 array_push( $files, ABSPATH . '.htaccess' );
54 }
55
56 // Are there any errors to display?
57 if ( count( $files ) > 0 ) {
58 ?>
59 <div class="error notice">
60 <h2>Patchstack File Permission Error</h2>
61 <p><?php esc_html_e( 'The following file/folder could not be written to:<br />' . implode( '<br />', $files ), 'patchstack' ); ?></p>
62 <?php
63 foreach ( $files as $file ) {
64 echo wp_kses( '<p><b>Debug info: </b>' . $file . ' chmod permissions: <b>' . substr( decoct( fileperms( $file ) ), -3 ) . '</b>, owned by <b>' . posix_getpwuid( fileowner( $file ) )['name'] . '</b></p>', $this->allowed_html );
65 }
66 ?>
67 <p><?php esc_html_e( '<strong>How to fix?</strong><br />CHMOD the file/folder to <strong>755</strong> through a <a href="http://www.dummies.com/web-design-development/wordpress/navigation-customization/how-to-change-file-permissions-using-filezilla-on-your-ftp-site/" target="_blank">FTP client</a>, <a href="http://support.hostgator.com/articles/cpanel/how-to-change-permissions-chmod-of-a-file" target="_blank">CPanel</a>, <a href="https://www.inmotionhosting.com/support/website/managing-files/change-file-permissions" target="_blank">WHM</a> or ask your hosting provider. Make sure file or folder ownership is set to <b>' . posix_getpwuid( fileowner( ABSPATH . 'index.php' ) )['name'] . '</b> user .', 'patchstack_file_error_notice' ); ?></p>
68 <p><?php esc_html_e( '<strong>CHMOD properly set but still not working?</strong><br />Make sure the group/owner (chown) settings of the /wp-content/plugins/patchstack/ folder is properly setup, you may have to ask your host to fix this.', 'patchstack_file_error_notice' ); ?></p>
69 </div>
70 <?php
71 }
72 }
73
74 /**
75 * When the user changes Patchstack plugin settings, update the firewall rules.
76 *
77 * @return void
78 */
79 public function update_rules() {
80 if ( isset( $_GET['settings-updated'], $_GET['page'] ) && strpos( $_GET['page'], 'patchstack' ) !== false && current_user_can( 'administrator' ) ) {
81 $this->plugin->rules->post_firewall_rules();
82 $this->plugin->rules->dynamic_firewall_rules();
83
84 // Update firewall status after settings saved
85 $token = $this->plugin->api->get_access_token();
86
87 // Update the firewall status.
88 if ( ! empty( $token ) ) {
89 $this->plugin->api->update_firewall_status( array( 'status' => $this->get_option( 'patchstack_basic_firewall' ) == 1 ) );
90 }
91
92 // Update the custom whitelist.
93 update_option( 'patchstack_custom_whitelist_rules', $this->get_option( 'patchstack_whitelist' ) );
94 }
95 }
96
97 /**
98 * When the user updates the site URL, update it on the API side as well.
99 * This needs to be done so we can communicate with the site properly.
100 *
101 * @param mixed $old_value
102 * @param mixed $new_value
103 * @return void
104 */
105 public function update_option_url( $old_value, $new_value ) {
106 if ( $old_value != $new_value ) {
107 $this->plugin->api->update_url( array( 'plugin_url' => $new_value ) );
108 }
109 }
110
111 /**
112 * Executed when the user modifies the blocked or whitelisted IP addresses on the
113 * login protection settings page.
114 *
115 * @return void
116 */
117 public function alter_ips() {
118 if ( ! isset( $_GET['action'], $_GET['PatchstackNonce'] ) || ! wp_verify_nonce( $_GET['PatchstackNonce'], 'patchstack-nonce-alter-ips' ) || ! current_user_can( 'administrator' ) || ! in_array( $_GET['action'], array( 'patchstack_unblock', 'patchstack_unblock_whitelist', 'patchstack_whitelist' ) ) ) {
119 return;
120 }
121
122 global $wpdb;
123
124 // Unblock the IP; delete the logs of the IP.
125 if ( $_GET['action'] == 'patchstack_unblock' && isset( $_GET['id'] ) && ctype_digit( $_GET['id'] ) ) {
126 // First get the IP address to unblock.
127 $result = $wpdb->get_results(
128 $wpdb->prepare( 'SELECT ip FROM ' . $wpdb->prefix . 'patchstack_event_log WHERE id = %d', array( (int) $_GET['id'] ) )
129 );
130
131 // Unblock the IP address.
132 if ( isset( $result[0], $result[0]->ip ) ) {
133 $wpdb->query(
134 $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'patchstack_event_log WHERE ip = %s', array( $result[0]->ip ) )
135 );
136 }
137 }
138
139 // Unblock and whitelist the IP.
140 if ( $_GET['action'] == 'patchstack_unblock_whitelist' && isset( $_GET['id'] ) && ctype_digit( $_GET['id'] ) ) {
141 // First get the IP address to whitelist.
142 $result = $wpdb->get_results(
143 $wpdb->prepare( 'SELECT ip FROM ' . $wpdb->prefix . 'patchstack_event_log WHERE id = %d', array( (int) $_GET['id'] ) )
144 );
145
146 // Whitelist and unblock the IP address.
147 if ( isset( $result[0], $result[0]->ip ) && filter_var( $result[0]->ip, FILTER_VALIDATE_IP ) ) {
148 update_option( 'patchstack_login_whitelist', $this->get_option( 'patchstack_login_whitelist', '' ) . "\n" . $result[0]->ip );
149 $wpdb->query(
150 $wpdb->prepare( 'DELETE FROM ' . $wpdb->prefix . 'patchstack_event_log WHERE ip = %s', array( $result[0]->ip ) )
151 );
152 }
153 }
154
155 // Whitelist an IP address.
156 if ( $_GET['action'] == 'patchstack_whitelist' && isset( $_GET['ip'] ) && filter_var( $_GET['ip'], FILTER_VALIDATE_IP ) ) {
157 update_option( 'patchstack_login_whitelist', $this->get_option( 'patchstack_login_whitelist', '' ) . "\n" . $_GET['ip'] );
158 }
159
160 // Redirect the user back to the login tab.
161 wp_safe_redirect( admin_url( 'admin.php?page=' . $this->plugin->name . '&tab=login' ) );
162 exit;
163 }
164
165 /**
166 * Turn on the Patchstack settings feature on WordPress.
167 *
168 * @return void
169 */
170 public function enable_settings() {
171 if ( ! isset( $_GET['action'], $_GET['patchstack_settings_nonce'] ) || ! wp_verify_nonce( $_GET['patchstack_settings_nonce'], 'patchstack_settings_nonce' ) || ! current_user_can( 'administrator' ) || $_GET['action'] != 'enable_settings' ) {
172 return;
173 }
174
175 // Turn it on.
176 update_option( 'patchstack_show_settings', 1 );
177
178 // Redirect the user back to the license page.
179 wp_safe_redirect( admin_url( 'admin.php?page=' . $this->plugin->name . '&tab=license' ) );
180 exit;
181 }
182 }
183