PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.6.2
Jetpack – WP Security, Backup, Speed, & Growth v8.6.2
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 6 years ago _inc 6 years ago bin 6 years ago css 6 years ago extensions 6 years ago images 6 years ago json-endpoints 6 years ago languages 6 years ago modules 5 years ago sal 6 years ago src 6 years ago vendor 6 years ago views 6 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class-jetpack-wizard-banner.php 6 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 6 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 6 years ago class.jetpack-bbpress-json-api.compat.php 6 years ago class.jetpack-cli.php 6 years ago class.jetpack-client-server.php 6 years ago class.jetpack-connection-banner.php 6 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 6 years ago class.jetpack-heartbeat.php 6 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-modules-list-table.php 6 years ago class.jetpack-network-sites-list-table.php 6 years ago class.jetpack-network.php 6 years ago class.jetpack-plan.php 6 years ago class.jetpack-post-images.php 6 years ago class.jetpack-twitter-cards.php 6 years ago class.jetpack-user-agent.php 6 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 6 years ago class.json-api.php 6 years ago class.photon.php 6 years ago composer.json 6 years ago functions.compat.php 6 years ago functions.cookies.php 6 years ago functions.gallery.php 6 years ago functions.global.php 6 years ago functions.opengraph.php 6 years ago functions.photon.php 6 years ago jest.config.js 6 years ago jetpack.php 5 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 6 years ago locales.php 7 years ago readme.txt 5 years ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
class.jetpack-autoupdate.php
307 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 $xml = new Jetpack_IXR_Client(
197 array(
198 'user_id' => get_current_user_id(),
199 )
200 );
201 $log['blog_id'] = Jetpack_Options::get_option( 'id' );
202 $xml->query( 'jetpack.debug_autoupdate', $log );
203 }
204 }
205
206 /**
207 * Parses the autoupdate results generated by WP_Automatic_Updater and returns a simple array of successful items
208 *
209 * @param string $type 'plugin' or 'theme'
210 *
211 * @return array
212 */
213 private function get_successful_updates( $type ) {
214 $successful_updates = array();
215
216 if ( ! isset( $this->results[ $type ] ) ) {
217 return $successful_updates;
218 }
219
220 foreach ( $this->results[ $type ] as $result ) {
221 if ( $result->result ) {
222 switch ( $type ) {
223 case 'theme':
224 $successful_updates[] = $result->item->theme;
225 break;
226 case 'translation':
227 $successful_updates[] = $result->item->type . ':' . $result->item->slug;
228 break;
229 }
230 }
231 }
232
233 return $successful_updates;
234 }
235
236 static function get_possible_failures() {
237 $result = array();
238 // Lets check some reasons why it might not be working as expected
239 include_once ABSPATH . '/wp-admin/includes/admin.php';
240 include_once ABSPATH . '/wp-admin/includes/class-wp-upgrader.php';
241 $upgrader = new WP_Automatic_Updater();
242
243 if ( $upgrader->is_disabled() ) {
244 $result[] = 'autoupdates-disabled';
245 }
246 if ( ! is_main_site() ) {
247 $result[] = 'is-not-main-site';
248 }
249 if ( ! is_main_network() ) {
250 $result[] = 'is-not-main-network';
251 }
252 if ( $upgrader->is_vcs_checkout( ABSPATH ) ) {
253 $result[] = 'site-on-vcs';
254 }
255 if ( $upgrader->is_vcs_checkout( WP_PLUGIN_DIR ) ) {
256 $result[] = 'plugin-directory-on-vcs';
257 }
258 if ( $upgrader->is_vcs_checkout( WP_CONTENT_DIR ) ) {
259 $result[] = 'content-directory-on-vcs';
260 }
261 $lock = get_option( 'auto_updater.lock' );
262 if ( $lock > ( time() - HOUR_IN_SECONDS ) ) {
263 $result[] = 'lock-is-set';
264 }
265 $skin = new Automatic_Upgrader_Skin();
266 include_once ABSPATH . 'wp-admin/includes/file.php';
267 include_once ABSPATH . 'wp-admin/includes/template.php';
268 if ( ! $skin->request_filesystem_credentials( false, ABSPATH, false ) ) {
269 $result[] = 'no-system-write-access';
270 }
271 if ( ! $skin->request_filesystem_credentials( false, WP_PLUGIN_DIR, false ) ) {
272 $result[] = 'no-plugin-directory-write-access';
273 }
274 if ( ! $skin->request_filesystem_credentials( false, WP_CONTENT_DIR, false ) ) {
275 $result[] = 'no-wp-content-directory-write-access';
276 }
277
278 return $result;
279 }
280
281 static function get_plugin_slug( $plugin_file ) {
282 $update_plugins = get_site_transient( 'update_plugins' );
283 if ( isset( $update_plugins->no_update ) ) {
284 if ( isset( $update_plugins->no_update[ $plugin_file ] ) ) {
285 $slug = $update_plugins->no_update[ $plugin_file ]->slug;
286 }
287 }
288 if ( empty( $slug ) && isset( $update_plugins->response ) ) {
289 if ( isset( $update_plugins->response[ $plugin_file ] ) ) {
290 $slug = $update_plugins->response[ $plugin_file ]->slug;
291 }
292 }
293
294 // Try to infer from the plugin file if not cached
295 if ( empty( $slug ) ) {
296 $slug = dirname( $plugin_file );
297 if ( '.' === $slug ) {
298 $slug = preg_replace( '/(.+)\.php$/', '$1', $plugin_file );
299 }
300 }
301 return $slug;
302 }
303
304 }
305
306 Jetpack_Autoupdate::init();
307