PluginProbe
Stream – Activity Log & Audit Trail / 3.8.0
Stream – Activity Log & Audit Trail v3.8.0
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 +75 -114 3.0.33.8.0 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
@@ -51,8 +61,10 @@
51 61 public $success_db;
52 62
53 63 /**
54 64 * Class constructor
65 + *
66 + * @param Plugin $plugin Instance of plugin object.
55 67 */
56 68 public function __construct( $plugin ) {
57 69 $this->plugin = $plugin;
58 70
@@ -58,14 +70,8 @@
58 70
59 71 $this->db_version = $this->get_db_version();
60 72 $this->stream_url = self_admin_url( $this->plugin->admin->admin_parent_page . '&page=' . $this->plugin->admin->settings_page_slug );
61 73
62 - // Check DB and display an admin notice if there are tables missing
63 - add_action( 'init', array( $this, 'verify_db' ) );
64 -
65 - // Install the plugin
66 - add_action( 'wp_stream_before_db_notices', array( $this, 'check' ) );
67 -
68 74 register_activation_hook( $this->plugin->locations['plugin'], array( $this, 'check' ) );
69 75 }
70 76
71 77 /**
@@ -75,10 +81,8 @@
75 81 *
76 82 * @return void
77 83 */
78 84 public function check() {
79 - global $wpdb;
80 -
81 85 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
82 86 return;
83 87 }
84 88
@@ -83,9 +87,8 @@
83 87 }
84 88
85 89 if ( empty( $this->db_version ) ) {
86 90 $this->install( $this->plugin->get_version() );
87 -
88 91 return;
89 92 }
90 93
91 94 if ( $this->plugin->get_version() === $this->db_version ) {
@@ -91,22 +94,38 @@
91 94 if ( $this->plugin->get_version() === $this->db_version ) {
92 95 return;
93 96 }
94 97
95 - $update = isset( $_REQUEST['wp_stream_update'] ) ? $_REQUEST['wp_stream_update'] : null;
98 + $update = null;
99 + if ( isset( $_REQUEST['wp_stream_update'] ) && wp_verify_nonce( 'wp_stream_update_db' ) ) {
100 + $update = esc_attr( $_REQUEST['wp_stream_update'] );
101 + }
96 102
97 103 if ( ! $update ) {
98 104 $this->update_required = true;
99 - $this->success_db = $this->update( $this->db_version, $this->plugin->get_version(), array( 'type' => 'auto' ) );
100 - } elseif ( 'update_and_continue' === $update ) {
101 - $this->success_db = $this->update( $this->db_version, $this->plugin->get_version(), array( 'type' => 'user' ) );
105 + $this->success_db = $this->update(
106 + $this->db_version,
107 + $this->plugin->get_version(),
108 + array(
109 + 'type' => 'auto',
110 + )
111 + );
102 112 }
103 113
114 + if ( 'update_and_continue' === $update ) {
115 + $this->success_db = $this->update(
116 + $this->db_version,
117 + $this->plugin->get_version(),
118 + array(
119 + 'type' => 'user',
120 + )
121 + );
122 + }
123 +
104 124 $versions = $this->db_update_versions();
105 125
106 - if ( version_compare( end( $versions ), $this->db_version, '>' ) ) {
126 + if ( ! $this->success_db && version_compare( end( $versions ), $this->db_version, '>' ) ) {
107 127 add_action( 'all_admin_notices', array( $this, 'update_notice_hook' ) );
108 -
109 128 return;
110 129 }
111 130
112 131 $this->update_db_option();
@@ -112,83 +131,12 @@
112 131 $this->update_db_option();
113 132 }
114 133
115 134 /**
116 - * Verify that the required DB tables exists
117 - *
118 - * @return void
119 - */
120 - public function verify_db() {
121 - /**
122 - * Filter will halt install() if set to true
123 - *
124 - * @param bool
125 - *
126 - * @return bool
127 - */
128 - if ( apply_filters( 'wp_stream_no_tables', false ) ) {
129 - return;
130 - }
131 -
132 - if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
133 - require_once( ABSPATH . '/wp-admin/includes/plugin.php' );
134 - }
135 -
136 - /**
137 - * Fires before admin notices are triggered for missing database tables.
138 - */
139 - do_action( 'wp_stream_before_db_notices' );
140 -
141 - global $wpdb;
142 -
143 - $database_message = '';
144 - $uninstall_message = '';
145 -
146 - // Check if all needed DB is present
147 - $missing_tables = array();
148 -
149 - foreach ( $this->plugin->db->get_table_names() as $table_name ) {
150 - $table_search = $wpdb->get_var(
151 - $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name )
152 - );
153 - if ( $table_search !== $table_name ) {
154 - $missing_tables[] = $table_name;
155 - }
156 - }
157 -
158 - if ( $missing_tables ) {
159 - $database_message .= sprintf(
160 - '%s <strong>%s</strong>',
161 - _n(
162 - 'The following table is not present in the WordPress database:',
163 - 'The following tables are not present in the WordPress database:',
164 - count( $missing_tables ),
165 - 'stream'
166 - ),
167 - esc_html( implode( ', ', $missing_tables ) )
168 - );
169 - }
170 -
171 - if ( is_plugin_active_for_network( $this->plugin->locations['plugin'] ) && current_user_can( 'manage_network_plugins' ) ) {
172 - $uninstall_message = sprintf( __( 'Please <a href="%s">uninstall</a> the Stream plugin and activate it again.', 'stream' ), network_admin_url( 'plugins.php#stream' ) );
173 - } elseif ( current_user_can( 'activate_plugins' ) ) {
174 - $uninstall_message = sprintf( __( 'Please <a href="%s">uninstall</a> the Stream plugin and activate it again.', 'stream' ), admin_url( 'plugins.php#stream' ) );
175 - }
176 -
177 - if ( ! empty( $database_message ) ) {
178 - $this->plugin->admin->notice( $database_message );
179 -
180 - if ( ! empty( $uninstall_message ) ) {
181 - $this->plugin->admin->notice( $uninstall_message );
182 - }
183 - }
184 - }
185 -
186 - /**
187 135 * Register a routine to be called when stream or a stream connector has been updated
188 136 * It works by comparing the current version with the version previously stored in the database.
189 137 *
190 - * @param string $file A reference to the main plugin file
138 + * @param string $file A reference to the main plugin file.
191 139 * @param string $callback The function to run when the hook is called.
192 140 * @param string $version The version to which the plugin is updating.
193 141 *
194 142 * @return void
@@ -199,9 +147,9 @@
199 147 }
200 148
201 149 $plugin = plugin_basename( $file );
202 150
203 - if ( is_plugin_active_for_network( $plugin ) ) {
151 + if ( $this->plugin->is_network_activated() ) {
204 152 $current_versions = get_site_option( $this->option_key . '_connectors', array() );
205 153 $network = true;
206 154 } elseif ( is_plugin_active( $plugin ) ) {
207 155 $current_versions = get_option( $this->option_key . '_connectors', array() );
@@ -220,13 +168,13 @@
220 168 update_site_option( $this->option_key . '_registered_connectors', $current_versions );
221 169 } else {
222 170 update_option( $this->option_key . '_registered_connectors', $current_versions );
223 171 }
224 -
225 - return;
226 172 }
227 173
228 174 /**
175 + * Returns the database version.
176 + *
229 177 * @return string
230 178 */
231 179 public function get_db_version() {
232 180 return get_site_option( $this->option_key );
@@ -232,9 +180,9 @@
232 180 return get_site_option( $this->option_key );
233 181 }
234 182
235 183 /**
236 - * @return void
184 + * Checks if migration was successful.
237 185 */
238 186 public function update_db_option() {
239 187 if ( $this->success_db ) {
240 188 $success_op = update_site_option( $this->option_key, $this->plugin->get_version() );
@@ -239,9 +187,9 @@
239 187 if ( $this->success_db ) {
240 188 $success_op = update_site_option( $this->option_key, $this->plugin->get_version() );
241 189 }
242 190
243 - if ( ! empty( $this->success_db ) && ! empty( $success_op ) ) {
191 + if ( ! empty( $this->success_db ) ) {
244 192 return;
245 193 }
246 194
247 195 wp_die(
@@ -265,9 +213,12 @@
265 213 if ( ! current_user_can( $this->plugin->admin->view_cap ) ) {
266 214 return;
267 215 }
268 216
269 - $update = isset( $_REQUEST['wp_stream_update'] ) ? $_REQUEST['wp_stream_update'] : null;
217 + $update = null;
218 + if ( isset( $_REQUEST['wp_stream_update'] ) && wp_verify_nonce( 'wp_stream_update_db' ) ) {
219 + $update = esc_attr( $_REQUEST['wp_stream_update'] );
220 + }
270 221
271 222 if ( ! $update ) {
272 223 $this->prompt_update();
273 224
@@ -289,15 +240,15 @@
289 240 */
290 241 public function prompt_update() {
291 242 ?>
292 243 <div class="error">
293 - <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>">
294 - <?php wp_nonce_field( 'wp_stream_update_db' ) ?>
244 + <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ); ?>">
245 + <?php wp_nonce_field( 'wp_stream_update_db' ); ?>
295 246 <input type="hidden" name="wp_stream_update" value="update_and_continue"/>
296 - <p><strong><?php esc_html_e( 'Stream Database Update Required', 'stream' ) ?></strong></p>
297 - <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>
298 - <p><?php esc_html_e( 'This process could take a little while, so please be patient.', 'stream' ) ?></p>
299 - <?php submit_button( esc_html__( 'Update Database', 'stream' ), 'primary', 'stream-update-db-submit' ) ?>
247 + <p><strong><?php esc_html_e( 'Stream Database Update Required', 'stream' ); ?></strong></p>
248 + <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>
249 + <p><?php esc_html_e( 'This process could take a little while, so please be patient.', 'stream' ); ?></p>
250 + <?php submit_button( esc_html__( 'Update Database', 'stream' ), 'primary', 'stream-update-db-submit' ); ?>
300 251 </form>
301 252 </div>
302 253 <?php
303 254 }
@@ -313,12 +264,21 @@
313 264
314 265 $this->update_db_option();
315 266 ?>
316 267 <div class="updated">
317 - <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>" style="display:inline;">
318 - <p><strong><?php esc_html_e( 'Update Complete', 'stream' ) ?></strong></p>
319 - <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( $this->plugin->get_version() ) ), 'stream' ) ?></p>
320 - <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ) ?>
268 + <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ); ?>" style="display:inline;">
269 + <p><strong><?php esc_html_e( 'Update Complete', 'stream' ); ?></strong></p>
270 + <p>
271 + <?php
272 + printf(
273 + /* translators: %1$s: old version, %2$s: new version (e.g. "4.2") */
274 + esc_html__( 'Your Stream database has been successfully updated from %1$s to %2$s!', 'stream' ),
275 + esc_html( $this->db_version ),
276 + esc_html( $this->plugin->get_version() )
277 + );
278 + ?>
279 + </p>
280 + <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ); ?>
321 281 </form>
322 282 </div>
323 283 <?php
324 284 }
@@ -334,10 +294,11 @@
334 294 * @return array
335 295 */
336 296 public function db_update_versions() {
337 297 $db_update_versions = array(
338 - '3.0.0' /* @version 3.0.0 Drop the stream_context table, changes to stream table */,
339 - '3.0.2' /* @version 3.0.2 Fix uppercase values in stream table, connector column */,
298 + '3.0.0', /* @version 3.0.0 Drop the stream_context table, changes to stream table */
299 + '3.0.2', /* @version 3.0.2 Fix uppercase values in stream table, connector column */
300 + '3.0.8', /* @version 3.0.8 Increase size of user role IDs, user_roll column */
340 301 );
341 302
342 303 /**
343 304 * Filter to alter the DB update versions array
@@ -351,17 +312,17 @@
351 312
352 313 /**
353 314 * Database user controlled update routine
354 315 *
355 - * @param int $db_version
356 - * @param int $current_version
357 - * @param array $update_args
316 + * @param int $db_version Next database version.
317 + * @param int $current_version Current database version.
318 + * @param array $update_args Update options.
358 319 *
359 320 * @return mixed Version number on success, true on no update needed, mysql error message on error
360 321 */
361 322 public function update( $db_version, $current_version, $update_args ) {
362 323 $versions = $this->db_update_versions();
363 - include_once( $this->plugin->locations['inc_dir'] . 'db-updates.php' );
324 + include_once $this->plugin->locations['inc_dir'] . 'db-updates.php';
364 325
365 326 foreach ( $versions as $version ) {
366 327 if ( ! isset( $update_args['type'] ) ) {
367 328 $update_args['type'] = 'user';
@@ -383,9 +344,9 @@
383 344
384 345 /**
385 346 * Initial database install routine
386 347 *
387 - * @param string $current_version
348 + * @param string $current_version Current database version.
388 349 *
389 350 * @return string
390 351 */
391 352 public function install( $current_version ) {
@@ -398,9 +359,9 @@
398 359 site_id bigint(20) unsigned NOT NULL DEFAULT '1',
399 360 blog_id bigint(20) unsigned NOT NULL DEFAULT '1',
400 361 object_id bigint(20) unsigned NULL,
401 362 user_id bigint(20) unsigned NOT NULL DEFAULT '0',
402 - user_role varchar(20) NOT NULL DEFAULT '',
363 + user_role varchar(50) NOT NULL DEFAULT '',
403 364 summary longtext NOT NULL,
404 365 created datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
405 366 connector varchar(100) NOT NULL,
406 367 context varchar(100) NOT NULL,
@@ -447,10 +408,10 @@
447 408 meta_key varchar(200) NOT NULL,
448 409 meta_value varchar(200) NOT NULL,
449 410 PRIMARY KEY (meta_id),
450 411 KEY record_id (record_id),
451 - KEY meta_key (meta_key),
452 - KEY meta_value (meta_value)
412 + KEY meta_key (meta_key(191)),
413 + KEY meta_value (meta_value(191))
453 414 )";
454 415
455 416 if ( ! empty( $wpdb->charset ) ) {
456 417 $sql .= " CHARACTER SET $wpdb->charset";