PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 4.6.3
Jetpack – WP Security, Backup, Speed, & Growth v4.6.3
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / class.jetpack-autoupdate.php
jetpack Last commit date
3rd-party 9 years ago _inc 1 year ago bin 9 years ago css 9 years ago images 1 year ago json-endpoints 9 years ago languages 9 years ago modules 1 year ago sal 9 years ago scss 9 years ago sync 9 years ago views 9 years ago .svnignore 12 years ago changelog.txt 9 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 9 years ago class.jetpack-autoupdate.php 9 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 9 years ago class.jetpack-client-server.php 9 years ago class.jetpack-client.php 9 years ago class.jetpack-connection-banner.php 9 years ago class.jetpack-constants.php 9 years ago class.jetpack-data.php 9 years ago class.jetpack-debugger.php 9 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 9 years ago class.jetpack-idc.php 9 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 9 years ago class.jetpack-modules-list-table.php 9 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 9 years ago class.jetpack-options.php 9 years ago class.jetpack-post-images.php 9 years ago class.jetpack-signature.php 9 years ago class.jetpack-tracks.php 9 years ago class.jetpack-twitter-cards.php 9 years ago class.jetpack-user-agent.php 9 years ago class.jetpack-xmlrpc-server.php 9 years ago class.jetpack.php 9 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 10 years ago class.photon.php 9 years ago composer.json 10 years ago functions.compat.php 9 years ago functions.gallery.php 10 years ago functions.global.php 9 years ago functions.opengraph.php 9 years ago functions.photon.php 9 years ago jetpack.php 1 year ago json-api-config.php 10 years ago json-endpoints.php 9 years ago locales.php 9 years ago readme.txt 1 year ago require-lib.php 10 years ago rest-api.md 9 years ago uninstall.php 9 years ago webpack.config.js 9 years ago wpml-config.xml 10 years ago
class.jetpack-autoupdate.php
327 lines
1 <?php
2
3 /**
4 * Handles items that have been selected for automatic updates.
5 * Hooks into WP_Automatic_Updater
6 */
7 class Jetpack_Autoupdate {
8
9 private $results = array();
10
11 private $expected = array();
12
13 private $success = array(
14 'plugin' => array(),
15 'theme' => array(),
16 );
17
18 private $failed = array(
19 'plugin' => array(),
20 'theme' => array(),
21 );
22
23 private static $instance = null;
24
25 static function init() {
26 if ( is_null( self::$instance ) ) {
27 self::$instance = new Jetpack_Autoupdate;
28 }
29
30 return self::$instance;
31 }
32
33 private function __construct() {
34 if ( Jetpack::is_module_active( 'manage' ) ) {
35 add_filter( 'auto_update_plugin', array( $this, 'autoupdate_plugin' ), 10, 2 );
36 add_filter( 'auto_update_theme', array( $this, 'autoupdate_theme' ), 10, 2 );
37 add_filter( 'auto_update_core', array( $this, 'autoupdate_core' ), 10, 2 );
38 add_filter( 'auto_update_translation', array( $this, 'autoupdate_translation' ), 10, 2 );
39 add_action( 'automatic_updates_complete', array( $this, 'automatic_updates_complete' ), 999, 1 );
40 }
41 }
42
43 public function autoupdate_plugin( $update, $item ) {
44 $autoupdate_plugin_list = Jetpack_Options::get_option( 'autoupdate_plugins', array() );
45 if ( in_array( $item->plugin, $autoupdate_plugin_list ) ) {
46 $this->expect( $item->plugin, 'plugin' );
47
48 return true;
49 }
50
51 return $update;
52 }
53
54 public function autoupdate_translation( $update, $item ) {
55 // Autoupdate all translations
56 if ( Jetpack_Options::get_option( 'autoupdate_translations', false ) ) {
57 return true;
58 }
59
60 // Themes
61 $autoupdate_themes_translations = Jetpack_Options::get_option( 'autoupdate_themes_translations', array() );
62 $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
63
64 /*
65 $item = {
66 "type":"theme",
67 "slug":"twentyfourteen",
68 "language":"en_CA",
69 "version":"1.8",
70 "updated":"2015-07-18 11:27:20",
71 "package":"https:\/\/downloads.wordpress.org\/translation\/theme\/twentyfourteen\/1.8\/en_CA.zip",
72 "autoupdate":true
73 }
74 */
75 if ( ( in_array( $item->slug, $autoupdate_themes_translations )
76 || in_array( $item->slug, $autoupdate_theme_list ) )
77 && 'theme' === $item->type
78 ) {
79 $this->expect( $item->type + ':' + $item->slug, 'translation' );
80
81 return true;
82 }
83
84 // Plugins
85 $autoupdate_plugin_translations = Jetpack_Options::get_option( 'autoupdate_plugins_translations', array() );
86 $autoupdate_plugin_list = Jetpack_Options::get_option( 'autoupdate_plugins', array() );
87 $plugin_files = array_unique( array_merge( $autoupdate_plugin_list, $autoupdate_plugin_translations ) );
88 $plugin_slugs = array_map( array( __CLASS__, 'get_plugin_slug' ), $plugin_files );
89
90 if ( in_array( $item->slug, $plugin_slugs )
91 && 'plugin' === $item->type
92 ) {
93 $this->expect( $item->type + ':' + $item->slug, 'translation' );
94 return true;
95 }
96
97 return $update;
98 }
99
100 public function autoupdate_theme( $update, $item ) {
101 $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
102 if ( in_array( $item->theme, $autoupdate_theme_list ) ) {
103 $this->expect( $item->theme, 'theme' );
104 return true;
105 }
106
107 return $update;
108 }
109
110 public function autoupdate_core( $update, $item ) {
111 $autoupdate_core = Jetpack_Options::get_option( 'autoupdate_core', false );
112 if ( $autoupdate_core ) {
113 return $autoupdate_core;
114 }
115
116 return $update;
117 }
118
119 /**
120 * Stores the an item identifier to the expected array.
121 *
122 * @param string $item Example: 'jetpack/jetpack.php' for type 'plugin' or 'twentyfifteen' for type 'theme'
123 * @param string $type 'plugin' or 'theme'
124 */
125 private function expect( $item, $type ) {
126 if ( ! isset( $this->expected[ $type ] ) ) {
127 $this->expected[ $type ] = array();
128 }
129 $this->expected[ $type ][] = $item;
130 }
131
132 /**
133 * On completion of an automatic update, let's store the results.
134 *
135 * @param $results - Sent by WP_Automatic_Updater after it completes an autoupdate action. Results may be empty.
136 */
137 public function automatic_updates_complete( $results ) {
138 if ( empty( $this->expected ) ) {
139 return;
140 }
141 $this->results = empty( $results ) ? self::get_possible_failures() : $results;
142
143 add_action( 'shutdown', array( $this, 'bump_stats' ) );
144
145 Jetpack::init();
146
147 $items_to_log = array( 'plugin', 'theme', 'translation' );
148 foreach ( $items_to_log as $items ) {
149 $this->log_items( $items );
150 }
151
152 Jetpack::log( 'autoupdates', $this->get_log() );
153 }
154
155 public function get_log() {
156 return array(
157 'results' => $this->results,
158 'failed' => $this->failed,
159 'success' => $this->success
160 );
161 }
162
163 /**
164 * Iterates through expected items ( plugins or themes ) and compares them to actual results.
165 *
166 * @param $items 'plugin' or 'theme'
167 */
168 private function log_items( $items ) {
169 if ( ! isset( $this->expected[ $items ] ) ) {
170 return;
171 }
172
173 $item_results = $this->get_successful_updates( $items );
174
175 if ( is_array( $this->expected[ $items ] ) ) {
176 foreach ( $this->expected[ $items ] as $item ) {
177 if ( in_array( $item, $item_results ) ) {
178 $this->success[ $items ][] = $item;
179 } else {
180 $this->failed[ $items ][] = $item;
181 }
182 }
183 }
184 }
185
186 public function bump_stats() {
187 $instance = Jetpack::init();
188 $log = array();
189 // Bump numbers
190 if ( ! empty( $this->success['plugin'] ) ) {
191 $instance->stat( 'autoupdates/plugin-success', count( $this->success['plugin'] ) );
192 $log['plugins_success'] = $this->success['plugin'];
193 }
194
195 if ( ! empty( $this->failed['plugin'] ) ) {
196 $instance->stat( 'autoupdates/plugin-fail', count( $this->failed['plugin'] ) );
197 $log['plugins_failed'] = $this->failed['plugin'];
198 }
199
200 if ( ! empty( $this->success['theme'] ) ) {
201 $instance->stat( 'autoupdates/theme-success', count( $this->success['theme'] ) );
202 $log['themes_success'] = $this->success['theme'];
203 }
204
205 if ( ! empty( $this->failed['theme'] ) ) {
206 $instance->stat( 'autoupdates/theme-fail', count( $this->failed['theme'] ) );
207 $log['themes_failed'] = $this->failed['theme'];
208 }
209
210 $instance->do_stats( 'server_side' );
211
212 // Send a more detailed log to logstash
213 if ( ! empty( $log ) ) {
214 Jetpack::load_xml_rpc_client();
215 $xml = new Jetpack_IXR_Client( array(
216 'user_id' => get_current_user_id()
217 ) );
218 $log['blog_id'] = Jetpack_Options::get_option( 'id' );
219 $xml->query( 'jetpack.debug_autoupdate', $log );
220 }
221 }
222
223 /**
224 * Parses the autoupdate results generated by WP_Automatic_Updater and returns a simple array of successful items
225 *
226 * @param string $type 'plugin' or 'theme'
227 *
228 * @return array
229 */
230 private function get_successful_updates( $type ) {
231 $successful_updates = array();
232
233 if ( ! isset( $this->results[ $type ] ) ) {
234 return $successful_updates;
235 }
236
237 foreach ( $this->results[ $type ] as $result ) {
238 if ( $result->result ) {
239 switch ( $type ) {
240 case 'theme':
241 $successful_updates[] = $result->item->theme;
242 break;
243 case 'plugin':
244 $successful_updates[] = $result->item->plugin;
245 break;
246 case 'translation':
247 $successful_updates[] = $result->item->type + ':' + $result->item->slug;
248 break;
249 }
250 }
251 }
252
253 return $successful_updates;
254 }
255
256 static function get_possible_failures() {
257 $result = array();
258 // Lets check some reasons why it might not be working as expected
259 include_once( ABSPATH . '/wp-admin/includes/admin.php' );
260 include_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' );
261 $upgrader = new WP_Automatic_Updater;
262
263 if ( $upgrader->is_disabled() ) {
264 $result[] = 'autoupdates-disabled';
265 }
266 if ( ! is_main_site() ) {
267 $result[] = 'is-not-main-site';
268 }
269 if ( ! is_main_network() ) {
270 $result[] = 'is-not-main-network';
271 }
272 if ( $upgrader->is_vcs_checkout( ABSPATH ) ) {
273 $result[] = 'site-on-vcs';
274 }
275 if ( $upgrader->is_vcs_checkout( WP_PLUGIN_DIR ) ) {
276 $result[] = 'plugin-directory-on-vcs';
277 }
278 if ( $upgrader->is_vcs_checkout( WP_CONTENT_DIR ) ) {
279 $result[] = 'content-directory-on-vcs';
280 }
281 $lock = get_option( 'auto_updater.lock' );
282 if ( $lock > ( time() - HOUR_IN_SECONDS ) ) {
283 $result[] = 'lock-is-set';
284 }
285 $skin = new Automatic_Upgrader_Skin;
286 include_once( ABSPATH . 'wp-admin/includes/file.php' );
287 include_once( ABSPATH . 'wp-admin/includes/template.php' );
288 if ( ! $skin->request_filesystem_credentials( false, ABSPATH, false ) ) {
289 $result[] = 'no-system-write-access';
290 }
291 if ( ! $skin->request_filesystem_credentials( false, WP_PLUGIN_DIR, false ) ) {
292 $result[] = 'no-plugin-directory-write-access';
293 }
294 if ( ! $skin->request_filesystem_credentials( false, WP_CONTENT_DIR, false ) ) {
295 $result[] = 'no-wp-content-directory-write-access';
296 }
297
298 return $result;
299 }
300
301 static function get_plugin_slug( $plugin_file ) {
302 $update_plugins = get_site_transient( 'update_plugins' );
303 if ( isset( $update_plugins->no_update ) ) {
304 if ( isset( $update_plugins->no_update[ $plugin_file ] ) ) {
305 $slug = $update_plugins->no_update[ $plugin_file ]->slug;
306 }
307 }
308 if ( empty( $slug ) && isset( $update_plugins->response ) ) {
309 if ( isset( $update_plugins->response[ $plugin_file ] ) ) {
310 $slug = $update_plugins->response[ $plugin_file ]->slug;
311 }
312 }
313
314 // Try to infer from the plugin file if not cached
315 if ( empty( $slug) ) {
316 $slug = dirname( $plugin_file );
317 if ( '.' === $slug ) {
318 $slug = preg_replace("/(.+)\.php$/", "$1", $plugin_file );
319 }
320 }
321 return $slug;
322 }
323
324 }
325
326 Jetpack_Autoupdate::init();
327