PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.4.1
Jetpack – WP Security, Backup, Speed, & Growth v7.4.1
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 7 years ago _inc 6 years ago bin 6 years ago css 7 years ago extensions 6 years ago images 7 years ago json-endpoints 7 years ago languages 6 years ago logs 9 years ago modules 6 years ago sal 7 years ago scss 7 years ago sync 7 years ago vendor 6 years ago views 7 years ago wp-cli-templates 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 7 years ago class.jetpack-affiliate.php 7 years ago class.jetpack-autoupdate.php 7 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 7 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 7 years ago class.jetpack-connection-banner.php 7 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 7 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 7 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 7 years ago class.jetpack-modules-list-table.php 7 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 7 years ago class.jetpack-options.php 7 years ago class.jetpack-plan.php 7 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 7 years ago class.jetpack-tracks.php 7 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 7 years ago class.jetpack-xmlrpc-server.php 7 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 7 years ago class.json-api.php 7 years ago class.photon.php 7 years ago composer.json 6 years ago functions.compat.php 7 years ago functions.gallery.php 8 years ago functions.global.php 7 years ago functions.opengraph.php 7 years ago functions.photon.php 7 years ago jest.config.js 7 years ago jetpack.php 6 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago locales.php 7 years ago readme.txt 6 years ago require-lib.php 7 years ago uninstall.php 7 years ago wpml-config.xml 10 years ago
class.jetpack-autoupdate.php
306 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 (
35 /** This filter is documented in class.jetpack-json-api-endpoint.php */
36 apply_filters( 'jetpack_json_manage_api_enabled', true )
37 ) {
38 add_filter( 'auto_update_theme', array( $this, 'autoupdate_theme' ), 10, 2 );
39 add_filter( 'auto_update_core', array( $this, 'autoupdate_core' ), 10, 2 );
40 add_filter( 'auto_update_translation', array( $this, 'autoupdate_translation' ), 10, 2 );
41 add_action( 'automatic_updates_complete', array( $this, 'automatic_updates_complete' ), 999, 1 );
42 }
43 }
44
45 public function autoupdate_translation( $update, $item ) {
46 // Autoupdate all translations
47 if ( Jetpack_Options::get_option( 'autoupdate_translations', false ) ) {
48 return true;
49 }
50
51 // Themes
52 $autoupdate_themes_translations = Jetpack_Options::get_option( 'autoupdate_themes_translations', array() );
53 $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
54
55 /*
56 $item = {
57 "type":"theme",
58 "slug":"twentyfourteen",
59 "language":"en_CA",
60 "version":"1.8",
61 "updated":"2015-07-18 11:27:20",
62 "package":"https:\/\/downloads.wordpress.org\/translation\/theme\/twentyfourteen\/1.8\/en_CA.zip",
63 "autoupdate":true
64 }
65 */
66 if ( ( in_array( $item->slug, $autoupdate_themes_translations )
67 || in_array( $item->slug, $autoupdate_theme_list ) )
68 && 'theme' === $item->type
69 ) {
70 $this->expect( $item->type . ':' . $item->slug, 'translation' );
71
72 return true;
73 }
74
75 // Plugins
76 $autoupdate_plugin_translations = Jetpack_Options::get_option( 'autoupdate_plugins_translations', array() );
77 $autoupdate_plugin_list = Jetpack_Options::get_option( 'autoupdate_plugins', array() );
78 $plugin_files = array_unique( array_merge( $autoupdate_plugin_list, $autoupdate_plugin_translations ) );
79 $plugin_slugs = array_map( array( __CLASS__, 'get_plugin_slug' ), $plugin_files );
80
81 if ( in_array( $item->slug, $plugin_slugs )
82 && 'plugin' === $item->type
83 ) {
84 $this->expect( $item->type . ':' . $item->slug, 'translation' );
85 return true;
86 }
87
88 return $update;
89 }
90
91 public function autoupdate_theme( $update, $item ) {
92 $autoupdate_theme_list = Jetpack_Options::get_option( 'autoupdate_themes', array() );
93 if ( in_array( $item->theme, $autoupdate_theme_list ) ) {
94 $this->expect( $item->theme, 'theme' );
95 return true;
96 }
97
98 return $update;
99 }
100
101 public function autoupdate_core( $update, $item ) {
102 $autoupdate_core = Jetpack_Options::get_option( 'autoupdate_core', false );
103 if ( $autoupdate_core ) {
104 return $autoupdate_core;
105 }
106
107 return $update;
108 }
109
110 /**
111 * Stores the an item identifier to the expected array.
112 *
113 * @param string $item Example: 'jetpack/jetpack.php' for type 'plugin' or 'twentyfifteen' for type 'theme'
114 * @param string $type 'plugin' or 'theme'
115 */
116 private function expect( $item, $type ) {
117 if ( ! isset( $this->expected[ $type ] ) ) {
118 $this->expected[ $type ] = array();
119 }
120 $this->expected[ $type ][] = $item;
121 }
122
123 /**
124 * On completion of an automatic update, let's store the results.
125 *
126 * @param $results - Sent by WP_Automatic_Updater after it completes an autoupdate action. Results may be empty.
127 */
128 public function automatic_updates_complete( $results ) {
129 if ( empty( $this->expected ) ) {
130 return;
131 }
132 $this->results = empty( $results ) ? self::get_possible_failures() : $results;
133
134 add_action( 'shutdown', array( $this, 'bump_stats' ) );
135
136 Jetpack::init();
137
138 $items_to_log = array( 'plugin', 'theme', 'translation' );
139 foreach ( $items_to_log as $items ) {
140 $this->log_items( $items );
141 }
142
143 Jetpack::log( 'autoupdates', $this->get_log() );
144 }
145
146 public function get_log() {
147 return array(
148 'results' => $this->results,
149 'failed' => $this->failed,
150 'success' => $this->success
151 );
152 }
153
154 /**
155 * Iterates through expected items ( plugins or themes ) and compares them to actual results.
156 *
157 * @param $items 'plugin' or 'theme'
158 */
159 private function log_items( $items ) {
160 if ( ! isset( $this->expected[ $items ] ) ) {
161 return;
162 }
163
164 $item_results = $this->get_successful_updates( $items );
165
166 if ( is_array( $this->expected[ $items ] ) ) {
167 foreach ( $this->expected[ $items ] as $item ) {
168 if ( in_array( $item, $item_results ) ) {
169 $this->success[ $items ][] = $item;
170 } else {
171 $this->failed[ $items ][] = $item;
172 }
173 }
174 }
175 }
176
177 public function bump_stats() {
178 $instance = Jetpack::init();
179 $log = array();
180 // Bump numbers
181
182 if ( ! empty( $this->success['theme'] ) ) {
183 $instance->stat( 'autoupdates/theme-success', count( $this->success['theme'] ) );
184 $log['themes_success'] = $this->success['theme'];
185 }
186
187 if ( ! empty( $this->failed['theme'] ) ) {
188 $instance->stat( 'autoupdates/theme-fail', count( $this->failed['theme'] ) );
189 $log['themes_failed'] = $this->failed['theme'];
190 }
191
192 $instance->do_stats( 'server_side' );
193
194 // Send a more detailed log to logstash
195 if ( ! empty( $log ) ) {
196 Jetpack::load_xml_rpc_client();
197 $xml = new Jetpack_IXR_Client( array(
198 'user_id' => get_current_user_id()
199 ) );
200 $log['blog_id'] = Jetpack_Options::get_option( 'id' );
201 $xml->query( 'jetpack.debug_autoupdate', $log );
202 }
203 }
204
205 /**
206 * Parses the autoupdate results generated by WP_Automatic_Updater and returns a simple array of successful items
207 *
208 * @param string $type 'plugin' or 'theme'
209 *
210 * @return array
211 */
212 private function get_successful_updates( $type ) {
213 $successful_updates = array();
214
215 if ( ! isset( $this->results[ $type ] ) ) {
216 return $successful_updates;
217 }
218
219 foreach ( $this->results[ $type ] as $result ) {
220 if ( $result->result ) {
221 switch ( $type ) {
222 case 'theme':
223 $successful_updates[] = $result->item->theme;
224 break;
225 case 'translation':
226 $successful_updates[] = $result->item->type . ':' . $result->item->slug;
227 break;
228 }
229 }
230 }
231
232 return $successful_updates;
233 }
234
235 static function get_possible_failures() {
236 $result = array();
237 // Lets check some reasons why it might not be working as expected
238 include_once( ABSPATH . '/wp-admin/includes/admin.php' );
239 include_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' );
240 $upgrader = new WP_Automatic_Updater;
241
242 if ( $upgrader->is_disabled() ) {
243 $result[] = 'autoupdates-disabled';
244 }
245 if ( ! is_main_site() ) {
246 $result[] = 'is-not-main-site';
247 }
248 if ( ! is_main_network() ) {
249 $result[] = 'is-not-main-network';
250 }
251 if ( $upgrader->is_vcs_checkout( ABSPATH ) ) {
252 $result[] = 'site-on-vcs';
253 }
254 if ( $upgrader->is_vcs_checkout( WP_PLUGIN_DIR ) ) {
255 $result[] = 'plugin-directory-on-vcs';
256 }
257 if ( $upgrader->is_vcs_checkout( WP_CONTENT_DIR ) ) {
258 $result[] = 'content-directory-on-vcs';
259 }
260 $lock = get_option( 'auto_updater.lock' );
261 if ( $lock > ( time() - HOUR_IN_SECONDS ) ) {
262 $result[] = 'lock-is-set';
263 }
264 $skin = new Automatic_Upgrader_Skin;
265 include_once( ABSPATH . 'wp-admin/includes/file.php' );
266 include_once( ABSPATH . 'wp-admin/includes/template.php' );
267 if ( ! $skin->request_filesystem_credentials( false, ABSPATH, false ) ) {
268 $result[] = 'no-system-write-access';
269 }
270 if ( ! $skin->request_filesystem_credentials( false, WP_PLUGIN_DIR, false ) ) {
271 $result[] = 'no-plugin-directory-write-access';
272 }
273 if ( ! $skin->request_filesystem_credentials( false, WP_CONTENT_DIR, false ) ) {
274 $result[] = 'no-wp-content-directory-write-access';
275 }
276
277 return $result;
278 }
279
280 static function get_plugin_slug( $plugin_file ) {
281 $update_plugins = get_site_transient( 'update_plugins' );
282 if ( isset( $update_plugins->no_update ) ) {
283 if ( isset( $update_plugins->no_update[ $plugin_file ] ) ) {
284 $slug = $update_plugins->no_update[ $plugin_file ]->slug;
285 }
286 }
287 if ( empty( $slug ) && isset( $update_plugins->response ) ) {
288 if ( isset( $update_plugins->response[ $plugin_file ] ) ) {
289 $slug = $update_plugins->response[ $plugin_file ]->slug;
290 }
291 }
292
293 // Try to infer from the plugin file if not cached
294 if ( empty( $slug) ) {
295 $slug = dirname( $plugin_file );
296 if ( '.' === $slug ) {
297 $slug = preg_replace("/(.+)\.php$/", "$1", $plugin_file );
298 }
299 }
300 return $slug;
301 }
302
303 }
304
305 Jetpack_Autoupdate::init();
306