PluginProbe
Stream – Activity Log & Audit Trail / 3.9.2
Stream – Activity Log & Audit Trail v3.9.2
4.4.0 4.3.0 4.2.2 4.2.1 trunk 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.1 3.1.1 3.10.0 3.2.0 3.2.1 3.2.2 3.2.3 All 50 releases
← All changes | classes/class-install.php +81 -138 3.0.03.9.2 View file →
@@ -1,10 +1,20 @@
1 1 <?php
2 +/**
3 + * Handles database migrations
4 + *
5 + * @package WP_Stream
6 + */
7 +
2 8 namespace WP_Stream;
3 9
10 +/**
11 + * Class - Install
12 + */
4 13 class Install {
5 14 /**
6 - * Hold Plugin class
15 + * Holds Instance of plugin object
16 + *
7 17 * @var Plugin
8 18 */
9 19 public $plugin;
10 20
@@ -15,19 +25,12 @@
15 25 */
16 26 public $option_key = 'wp_stream_db';
17 27
18 28 /**
19 - * Holds the database table prefix
29 + * Holds version of database at last update
20 30 *
21 31 * @var string
22 32 */
23 - public $table_prefix;
24 -
25 - /**
26 - * Holds version of database at last update
27 -] *
28 - * @var string
29 - */
30 33 public $db_version;
31 34
32 35 /**
33 36 * URL to the Stream Admin settings page.
@@ -58,8 +61,10 @@
58 61 public $success_db;
59 62
60 63 /**
61 64 * Class constructor
65 + *
66 + * @param Plugin $plugin Instance of plugin object.
62 67 */
63 68 public function __construct( $plugin ) {
64 69 $this->plugin = $plugin;
65 70
@@ -65,14 +70,14 @@
65 70
66 71 $this->db_version = $this->get_db_version();
67 72 $this->stream_url = self_admin_url( $this->plugin->admin->admin_parent_page . '&page=' . $this->plugin->admin->settings_page_slug );
68 73
69 - // Check DB and display an admin notice if there are tables missing
70 - add_action( 'init', array( $this, 'verify_db' ) );
74 + // Ensure the tables are created even when the plugin activation hook does not run,
75 + // and run the check in WP Admin or on WP CLI to avoid extra frontend load.
76 + if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
77 + $this->check();
78 + }
71 79
72 - // Install the plugin
73 - add_action( 'wp_stream_before_db_notices', array( $this, 'check' ) );
74 -
75 80 register_activation_hook( $this->plugin->locations['plugin'], array( $this, 'check' ) );
76 81 }
77 82
78 83 /**
@@ -82,26 +87,14 @@
82 87 *
83 88 * @return void
84 89 */
85 90 public function check() {
86 - global $wpdb;
87 -
88 91 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
89 92 return;
90 93 }
91 94
92 - /**
93 - * Allows devs to alter the tables prefix, default to base_prefix
94 - *
95 - * @param string $prefix
96 - *
97 - * @return string
98 - */
99 - $this->table_prefix = apply_filters( 'wp_stream_db_tables_prefix', $wpdb->base_prefix );
100 -
101 95 if ( empty( $this->db_version ) ) {
102 96 $this->install( $this->plugin->get_version() );
103 -
104 97 return;
105 98 }
106 99
107 100 if ( $this->plugin->get_version() === $this->db_version ) {
@@ -107,26 +100,38 @@
107 100 if ( $this->plugin->get_version() === $this->db_version ) {
108 101 return;
109 102 }
110 103
111 - $update = isset( $_REQUEST['wp_stream_update'] ) ? $_REQUEST['wp_stream_update'] : null;
104 + $update = null;
105 + if ( isset( $_REQUEST['wp_stream_update'] ) && wp_verify_nonce( 'wp_stream_update_db' ) ) {
106 + $update = esc_attr( $_REQUEST['wp_stream_update'] );
107 + }
112 108
113 109 if ( ! $update ) {
114 110 $this->update_required = true;
115 - $this->success_db = $this->update( $this->db_version, $this->plugin->get_version(), array( 'type' => 'auto' ) );
116 -
117 - return;
111 + $this->success_db = $this->update(
112 + $this->db_version,
113 + $this->plugin->get_version(),
114 + array(
115 + 'type' => 'auto',
116 + )
117 + );
118 118 }
119 119
120 120 if ( 'update_and_continue' === $update ) {
121 - $this->$success_db = $this->update( $this->db_version, $this->plugin->get_version(), array( 'type' => 'user' ) );
121 + $this->success_db = $this->update(
122 + $this->db_version,
123 + $this->plugin->get_version(),
124 + array(
125 + 'type' => 'user',
126 + )
127 + );
122 128 }
123 129
124 130 $versions = $this->db_update_versions();
125 131
126 - if ( version_compare( end( $versions ), $this->db_version, '>' ) ) {
132 + if ( ! $this->success_db && version_compare( end( $versions ), $this->db_version, '>' ) ) {
127 133 add_action( 'all_admin_notices', array( $this, 'update_notice_hook' ) );
128 -
129 134 return;
130 135 }
131 136
132 137 $this->update_db_option();
@@ -132,80 +137,12 @@
132 137 $this->update_db_option();
133 138 }
134 139
135 140 /**
136 - * Verify that the required DB tables exists
137 - *
138 - * @return void
139 - */
140 - public function verify_db() {
141 - /**
142 - * Filter will halt install() if set to true
143 - *
144 - * @param bool
145 - *
146 - * @return bool
147 - */
148 - if ( apply_filters( 'wp_stream_no_tables', false ) ) {
149 - return;
150 - }
151 -
152 - if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
153 - require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
154 - }
155 -
156 - /**
157 - * Fires before admin notices are triggered for missing database tables.
158 - */
159 - do_action( 'wp_stream_before_db_notices' );
160 -
161 - global $wpdb;
162 -
163 - $database_message = '';
164 - $uninstall_message = '';
165 -
166 - // Check if all needed DB is present
167 - $missing_tables = array();
168 -
169 - foreach ( $this->plugin->db->get_table_names() as $table_name ) {
170 - if ( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) !== $table_name ) {
171 - $missing_tables[] = $table_name;
172 - }
173 - }
174 -
175 - if ( $missing_tables ) {
176 - $database_message .= sprintf(
177 - '%s <strong>%s</strong>',
178 - _n(
179 - 'The following table is not present in the WordPress database:',
180 - 'The following tables are not present in the WordPress database:',
181 - count( $missing_tables ),
182 - 'stream'
183 - ),
184 - esc_html( implode( ', ', $missing_tables ) )
185 - );
186 - }
187 -
188 - if ( is_plugin_active_for_network( $this->plugin->locations['plugin'] ) && current_user_can( 'manage_network_plugins' ) ) {
189 - $uninstall_message = sprintf( __( 'Please <a href="%s">uninstall</a> the Stream plugin and activate it again.', 'stream' ), network_admin_url( 'plugins.php#stream' ) );
190 - } elseif ( current_user_can( 'activate_plugins' ) ) {
191 - $uninstall_message = sprintf( __( 'Please <a href="%s">uninstall</a> the Stream plugin and activate it again.', 'stream' ), admin_url( 'plugins.php#stream' ) );
192 - }
193 -
194 - if ( ! empty( $database_message ) ) {
195 - $this->plugin->admin->notice( $database_message );
196 -
197 - if ( ! empty( $uninstall_message ) ) {
198 - $this->plugin->admin->notice( $uninstall_message );
199 - }
200 - }
201 - }
202 -
203 - /**
204 141 * Register a routine to be called when stream or a stream connector has been updated
205 142 * It works by comparing the current version with the version previously stored in the database.
206 143 *
207 - * @param string $file A reference to the main plugin file
144 + * @param string $file A reference to the main plugin file.
208 145 * @param string $callback The function to run when the hook is called.
209 146 * @param string $version The version to which the plugin is updating.
210 147 *
211 148 * @return void
@@ -216,9 +153,9 @@
216 153 }
217 154
218 155 $plugin = plugin_basename( $file );
219 156
220 - if ( is_plugin_active_for_network( $plugin ) ) {
157 + if ( $this->plugin->is_network_activated() ) {
221 158 $current_versions = get_site_option( $this->option_key . '_connectors', array() );
222 159 $network = true;
223 160 } elseif ( is_plugin_active( $plugin ) ) {
224 161 $current_versions = get_option( $this->option_key . '_connectors', array() );
@@ -237,13 +174,13 @@
237 174 update_site_option( $this->option_key . '_registered_connectors', $current_versions );
238 175 } else {
239 176 update_option( $this->option_key . '_registered_connectors', $current_versions );
240 177 }
241 -
242 - return;
243 178 }
244 179
245 180 /**
181 + * Returns the database version.
182 + *
246 183 * @return string
247 184 */
248 185 public function get_db_version() {
249 186 return get_site_option( $this->option_key );
@@ -249,9 +186,9 @@
249 186 return get_site_option( $this->option_key );
250 187 }
251 188
252 189 /**
253 - * @return void
190 + * Checks if migration was successful.
254 191 */
255 192 public function update_db_option() {
256 193 if ( $this->success_db ) {
257 194 $success_op = update_site_option( $this->option_key, $this->plugin->get_version() );
@@ -256,9 +193,9 @@
256 193 if ( $this->success_db ) {
257 194 $success_op = update_site_option( $this->option_key, $this->plugin->get_version() );
258 195 }
259 196
260 - if ( ! empty( $this->success_db ) && ! empty( $success_op ) ) {
197 + if ( ! empty( $this->success_db ) ) {
261 198 return;
262 199 }
263 200
264 201 wp_die(
@@ -282,9 +219,12 @@
282 219 if ( ! current_user_can( $this->plugin->admin->view_cap ) ) {
283 220 return;
284 221 }
285 222
286 - $update = isset( $_REQUEST['wp_stream_update'] ) ? $_REQUEST['wp_stream_update'] : null;
223 + $update = null;
224 + if ( isset( $_REQUEST['wp_stream_update'] ) && wp_verify_nonce( 'wp_stream_update_db' ) ) {
225 + $update = esc_attr( $_REQUEST['wp_stream_update'] );
226 + }
287 227
288 228 if ( ! $update ) {
289 229 $this->prompt_update();
290 230
@@ -306,15 +246,15 @@
306 246 */
307 247 public function prompt_update() {
308 248 ?>
309 249 <div class="error">
310 - <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>">
311 - <?php wp_nonce_field( 'wp_stream_update_db' ) ?>
250 + <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ); ?>">
251 + <?php wp_nonce_field( 'wp_stream_update_db' ); ?>
312 252 <input type="hidden" name="wp_stream_update" value="update_and_continue"/>
313 - <p><strong><?php esc_html_e( 'Stream Database Update Required', 'stream' ) ?></strong></p>
314 - <p><?php esc_html_e( 'Stream has updated! Before we send you on your way, we need to update your database to the newest version.', 'stream' ) ?></p>
315 - <p><?php esc_html_e( 'This process could take a little while, so please be patient.', 'stream' ) ?></p>
316 - <?php submit_button( esc_html__( 'Update Database', 'stream' ), 'primary', 'stream-update-db-submit' ) ?>
253 + <p><strong><?php esc_html_e( 'Stream Database Update Required', 'stream' ); ?></strong></p>
254 + <p><?php esc_html_e( 'Stream has updated! Before we send you on your way, we need to update your database to the newest version.', 'stream' ); ?></p>
255 + <p><?php esc_html_e( 'This process could take a little while, so please be patient.', 'stream' ); ?></p>
256 + <?php submit_button( esc_html__( 'Update Database', 'stream' ), 'primary', 'stream-update-db-submit' ); ?>
317 257 </form>
318 258 </div>
319 259 <?php
320 260 }
@@ -330,12 +270,21 @@
330 270
331 271 $this->update_db_option();
332 272 ?>
333 273 <div class="updated">
334 - <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>" style="display:inline;">
335 - <p><strong><?php esc_html_e( 'Update Complete', 'stream' ) ?></strong></p>
336 - <p><?php esc_html_e( sprintf( 'Your Stream database has been successfully updated from %1$s to %2$s!', esc_html( $this->db_version ), esc_html( WP_Stream::VERSION ) ), 'stream' ) ?></p>
337 - <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ) ?>
274 + <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ); ?>" style="display:inline;">
275 + <p><strong><?php esc_html_e( 'Update Complete', 'stream' ); ?></strong></p>
276 + <p>
277 + <?php
278 + printf(
279 + /* translators: %1$s: old version, %2$s: new version (e.g. "4.2") */
280 + esc_html__( 'Your Stream database has been successfully updated from %1$s to %2$s!', 'stream' ),
281 + esc_html( $this->db_version ),
282 + esc_html( $this->plugin->get_version() )
283 + );
284 + ?>
285 + </p>
286 + <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ); ?>
338 287 </form>
339 288 </div>
340 289 <?php
341 290 }
@@ -351,16 +300,11 @@
351 300 * @return array
352 301 */
353 302 public function db_update_versions() {
354 303 $db_update_versions = array(
355 - '1.1.4' /* @version 1.1.4 Fix mysql character set issues */,
356 - '1.1.7' /* @version 1.1.7 Modified the ip column to varchar(39) */,
357 - '1.2.8' /* @version 1.2.8 Change the context for Media connectors to the attachment type */,
358 - '1.3.0' /* @version 1.3.0 Backward settings compatibility for old version plugins */,
359 - '1.3.1' /* @version 1.3.1 Update records of Installer to Theme Editor connector */,
360 - '1.4.0' /* @version 1.4.0 Add the author_role column and prepare tables for multisite support */,
361 - '1.4.2' /* @version 1.4.2 Patch to fix rare multisite upgrade not triggering */,
362 - '1.4.5' /* @version 1.4.5 Patch to fix author_meta broken values */,
304 + '3.0.0', /* @version 3.0.0 Drop the stream_context table, changes to stream table */
305 + '3.0.2', /* @version 3.0.2 Fix uppercase values in stream table, connector column */
306 + '3.0.8', /* @version 3.0.8 Increase size of user role IDs, user_roll column */
363 307 );
364 308
365 309 /**
366 310 * Filter to alter the DB update versions array
@@ -374,16 +318,17 @@
374 318
375 319 /**
376 320 * Database user controlled update routine
377 321 *
378 - * @param int $db_version
379 - * @param int $current_version
380 - * @param array $update_args
322 + * @param int $db_version Next database version.
323 + * @param int $current_version Current database version.
324 + * @param array $update_args Update options.
381 325 *
382 326 * @return mixed Version number on success, true on no update needed, mysql error message on error
383 327 */
384 328 public function update( $db_version, $current_version, $update_args ) {
385 329 $versions = $this->db_update_versions();
330 + include_once $this->plugin->locations['inc_dir'] . 'db-updates.php';
386 331
387 332 foreach ( $versions as $version ) {
388 333 if ( ! isset( $update_args['type'] ) ) {
389 334 $update_args['type'] = 'user';
@@ -405,26 +350,24 @@
405 350
406 351 /**
407 352 * Initial database install routine
408 353 *
409 - * @param string $current_version
354 + * @param string $current_version Current database version.
410 355 *
411 356 * @return string
412 357 */
413 - private function install( $current_version ) {
358 + public function install( $current_version ) {
414 359 global $wpdb;
415 360
416 361 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
417 362
418 - $prefix = $this->table_prefix;
419 -
420 - $sql = "CREATE TABLE {$prefix}stream (
363 + $sql = "CREATE TABLE {$wpdb->base_prefix}stream (
421 364 ID bigint(20) unsigned NOT NULL AUTO_INCREMENT,
422 365 site_id bigint(20) unsigned NOT NULL DEFAULT '1',
423 366 blog_id bigint(20) unsigned NOT NULL DEFAULT '1',
424 367 object_id bigint(20) unsigned NULL,
425 368 user_id bigint(20) unsigned NOT NULL DEFAULT '0',
426 - user_role varchar(20) NOT NULL DEFAULT '',
369 + user_role varchar(50) NOT NULL DEFAULT '',
427 370 summary longtext NOT NULL,
428 371 created datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
429 372 connector varchar(100) NOT NULL,
430 373 context varchar(100) NOT NULL,
@@ -464,9 +407,9 @@
464 407 $sql .= ';';
465 408
466 409 \dbDelta( $sql );
467 410
468 - $sql = "CREATE TABLE {$prefix}stream_meta (
411 + $sql = "CREATE TABLE {$wpdb->base_prefix}stream_meta (
469 412 meta_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
470 413 record_id bigint(20) unsigned NOT NULL,
471 414 meta_key varchar(200) NOT NULL,
472 415 meta_value varchar(200) NOT NULL,
@@ -471,10 +414,10 @@
471 414 meta_key varchar(200) NOT NULL,
472 415 meta_value varchar(200) NOT NULL,
473 416 PRIMARY KEY (meta_id),
474 417 KEY record_id (record_id),
475 - KEY meta_key (meta_key),
476 - KEY meta_value (meta_value)
418 + KEY meta_key (meta_key(191)),
419 + KEY meta_value (meta_value(191))
477 420 )";
478 421
479 422 if ( ! empty( $wpdb->charset ) ) {
480 423 $sql .= " CHARACTER SET $wpdb->charset";