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