PluginProbe
Patchstack – WordPress & Plugins Security / 2.3.0
Patchstack – WordPress & Plugins Security v2.3.0
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
← All changes | includes/multisite.php +32 -57 2.1.102.3.0 View file →
@@ -10,9 +10,9 @@
10 10 */
11 11 class P_Multisite extends P_Core {
12 12
13 13 /**
14 - * Stores any license activation errors.
14 + * Stores any errors.
15 15 *
16 16 * @var string
17 17 */
18 18 public $error = '';
@@ -28,17 +28,17 @@
28 28 if ( ! is_super_admin() ) {
29 29 return;
30 30 }
31 31
32 - // When settings are saved.
33 - if ( isset( $_POST['option_page'], $_POST['PatchstackNonce'] ) && wp_verify_nonce( $_POST['PatchstackNonce'], 'patchstack-option-page' ) ) {
34 - $this->save_settings();
35 - }
36 -
37 32 // When sites are activated.
38 33 if ( isset( $_POST['patchstack_do'], $_POST['PatchstackNonce'], $_POST['sites'] ) && $_POST['patchstack_do'] == 'do_licenses' && wp_verify_nonce( $_POST['PatchstackNonce'], 'patchstack-multisite-activation' ) ) {
39 34 $this->activate_licenses();
40 35 }
36 +
37 + // When we need to re-run the migration of a specific site.
38 + if ( isset( $_GET['site'], $_GET['PatchstackNonce'] ) && wp_verify_nonce( $_GET['PatchstackNonce'], 'patchstack-migration' ) ) {
39 + $this->run_migration();
40 + }
41 41 }
42 42
43 43 /**
44 44 * When a user selects sites that need to be activated.
@@ -51,9 +51,9 @@
51 51 return;
52 52 }
53 53
54 54 // Determine which sites are already activated and skip those.
55 - $activate = array();
55 + $activate = [];
56 56 $sites = get_sites();
57 57 foreach ( $sites as $site ) {
58 58 if ( in_array( $site->siteurl, $_POST['sites'] ) && get_blog_option( $site->id, 'patchstack_clientid' ) == '' ) {
59 59 array_push( $activate, $site->siteurl );
@@ -66,9 +66,9 @@
66 66 return;
67 67 }
68 68
69 69 // Add the site to the app and retrieve the license for each site.
70 - $licenses = $this->plugin->api->get_site_licenses( array( 'sites' => $activate ) );
70 + $licenses = $this->plugin->api->get_site_licenses( [ 'sites' => $activate ] );
71 71
72 72 // Did an error happen during the multisite license activation?
73 73 if ( isset( $licenses['error'] ) ) {
74 74 $this->error = '<span style="color: #ff6262;">' . $licenses['error'] . '</span><br /><br />';
@@ -84,41 +84,8 @@
84 84 }
85 85 }
86 86
87 87 /**
88 - * When the individual or global settings are saved.
89 - *
90 - * @return void
91 - */
92 - private function save_settings() {
93 - switch ( $_POST['option_page'] ) {
94 - // Save hardening options
95 - case 'patchstack_hardening_settings_group':
96 - $options = array( 'patchstack_auto_update', 'patchstack_json_is_disabled', 'patchstack_register_email_blacklist', 'patchstack_move_logs', 'patchstack_basicscanblock', 'patchstack_userenum', 'patchstack_hidewpversion', 'patchstack_activity_log_is_enabled', 'patchstack_activity_log_failed_logins', 'patchstack_xmlrpc_is_disabled', 'patchstack_captcha_on_comments', 'patchstack_captcha_login_form', 'patchstack_captcha_registration_form', 'patchstack_captcha_reset_pwd_form', 'patchstack_captcha_type', 'patchstack_captcha_public_key', 'patchstack_captcha_public_key_v3', 'patchstack_captcha_public_key_v3_new', 'patchstack_captcha_private_key', 'patchstack_captcha_private_key_v3', 'patchstack_captcha_private_key_v3_new', 'patchstack_application_passwords_disabled' );
97 - $this->save_options( $options );
98 - break;
99 -
100 - // Save firewall settings
101 - case 'patchstack_firewall_settings_group':
102 - $options = array( 'patchstack_geo_block_countries', 'patchstack_geo_block_enabled', 'patchstack_geo_block_inverse', 'patchstack_ip_block_list', 'patchstack_basic_firewall', 'patchstack_autoblock_blocktime', 'patchstack_autoblock_attempts', 'patchstack_autoblock_minutes', 'patchstack_basic_firewall_roles', 'patchstack_disable_htaccess', 'patchstack_add_security_headers', 'patchstack_prevent_default_file_access', 'patchstack_block_debug_log_access', 'patchstack_index_views', 'patchstack_proxy_comment_posting', 'patchstack_image_hotlinking', 'patchstack_firewall_custom_rules', 'patchstack_firewall_custom_rules_loc', 'patchstack_blackhole_log', 'patchstack_whitelist' );
103 - $this->save_options( $options );
104 - break;
105 -
106 - // Save login settings
107 - case 'patchstack_login_settings_group':
108 - $options = array( 'patchstack_block_bruteforce_ips', 'patchstack_anti_bruteforce_blocktime', 'patchstack_anti_bruteforce_attempts', 'patchstack_anti_bruteforce_minutes', 'patchstack_login_time_block', 'patchstack_login_time_start', 'patchstack_login_time_end', 'patchstack_login_2fa', 'patchstack_login_whitelist' );
109 - $this->save_options( $options );
110 - break;
111 -
112 - // Save cookie notice settings
113 - case 'patchstack_cookienotice_settings_group':
114 - $options = array( 'patchstack_enable_cookie_notice_message', 'patchstack_cookie_notice_message', 'patchstack_cookie_notice_accept_text', 'patchstack_cookie_notice_backgroundcolor', 'patchstack_cookie_notice_textcolor', 'patchstack_cookie_notice_privacypolicy_enable', 'patchstack_cookie_notice_privacypolicy_text', 'patchstack_cookie_notice_privacypolicy_link', 'patchstack_cookie_notice_cookie_expiration', 'patchstack_cookie_notice_opacity', 'patchstack_cookie_notice_credits' );
115 - $this->save_options( $options );
116 - break;
117 - }
118 - }
119 -
120 - /**
121 88 * This will be called when the network admin clicks on the "Sites" button.
122 89 * It will show all sites.
123 90 *
124 91 * @return void
@@ -127,25 +94,33 @@
127 94 require_once dirname( __FILE__ ) . '/views/pages/multisite-table.php';
128 95 }
129 96
130 97 /**
131 - * Save an array of options on a specific site.
132 - *
133 - * @param array $options
98 + * Re-run the migration for a specific multisite site.
99 + *
134 100 * @return void
135 101 */
136 - private function save_options( $options ) {
137 - if ( isset( $_GET['page'] ) && $_GET['page'] == 'patchstack-multisite-settings' ) {
138 - foreach ( $options as $option ) {
139 - $value = isset( $_POST[ $option ] ) ? $_POST[ $option ] : 0;
140 - $value = map_deep($value, 'wp_filter_nohtml_kses');
141 - update_site_option( $option, $value );
142 - }
143 - } else {
144 - foreach ( $options as $option ) {
145 - $value = isset( $_POST[ $option ] ) ? $_POST[ $option ] : 0;
146 - $value = map_deep($value, 'wp_filter_nohtml_kses');
147 - update_option( $option, $value );
148 - }
102 + private function run_migration( ) {
103 + // Must be a number.
104 + if ( !ctype_digit( $_GET['site'] ) ) {
105 + exit;
149 106 }
107 +
108 + // Site must be valid and exists.
109 + $site = get_site( $_GET['site'] );
110 + if ( is_null( $site ) ) {
111 + exit;
112 + }
113 +
114 + // Perform base migration.
115 + $this->plugin->activation->migrate( null, $site->id );
116 +
117 + // Perform specific version migrations.
118 + $versions = array('3.0.1', '3.0.2');
119 + foreach ( $versions as $version ) {
120 + $this->plugin->activation->migrate( $version, $site->id );
121 + }
122 +
123 + wp_safe_redirect( add_query_arg( [ 'success' => '1', 'site' => $site->id ], remove_query_arg( [ 'PatchstackNonce', 'site' ] ) ) );
124 + exit;
150 125 }
151 126 }