PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / jetpack_vendor / automattic / jetpack-connection / src / class-package-version-tracker.php
jetpack / jetpack_vendor / automattic / jetpack-connection / src Last commit date
abilities 3 months ago connectors 2 months ago health 2 months ago identity-crisis 2 months ago sso 2 months ago traits 9 months ago webhooks 9 months ago class-authorize-json-api.php 2 months ago class-client.php 8 months ago class-connection-assets.php 1 year ago class-connection-notice.php 8 months ago class-error-handler.php 3 weeks ago class-external-storage.php 4 months ago class-heartbeat.php 1 month ago class-initial-state.php 4 weeks ago class-manager.php 3 weeks ago class-nonce-handler.php 9 months ago class-package-version-tracker.php 2 months ago class-package-version.php 3 weeks ago class-partner-coupon.php 3 months ago class-partner.php 2 years ago class-plugin-storage.php 8 months ago class-plugin.php 9 months ago class-rest-authentication.php 9 months ago class-rest-connector.php 4 weeks ago class-secrets.php 9 months ago class-server-sandbox.php 3 months ago class-site-health.php 2 months ago class-terms-of-service.php 2 years ago class-tokens-locks.php 9 months ago class-tokens.php 9 months ago class-tracking.php 3 months ago class-urls.php 6 months ago class-user-account-status.php 9 months ago class-users-connection-admin.php 2 months ago class-utils.php 2 years ago class-webhooks.php 2 months ago class-xmlrpc-async-call.php 2 years ago class-xmlrpc-connector.php 9 months ago interface-manager.php 4 years ago interface-storage-provider.php 6 months ago
class-package-version-tracker.php
202 lines
1 <?php
2 /**
3 * The Package_Version_Tracker class.
4 *
5 * @package automattic/jetpack-connection
6 */
7
8 namespace Automattic\Jetpack\Connection;
9
10 use Jetpack_Options;
11
12 /**
13 * The Package_Version_Tracker class.
14 */
15 class Package_Version_Tracker {
16
17 const PACKAGE_VERSION_OPTION = 'jetpack_package_versions';
18
19 /**
20 * The cache key for storing a failed request to update remote package versions.
21 * The caching logic is that when a failed request occurs, we cache it temporarily
22 * with a set expiration time.
23 * Only after the key has expired, we'll be able to repeat a remote request.
24 * This also implies that the cached value is redundant, however we chose the datetime
25 * of the failed request to avoid using booleans.
26 */
27 const CACHED_FAILED_REQUEST_KEY = 'jetpack_failed_update_remote_package_versions';
28
29 /**
30 * The min time difference in seconds for attempting to
31 * update remote tracked package versions after a failed remote request.
32 */
33 const CACHED_FAILED_REQUEST_EXPIRATION = 1 * HOUR_IN_SECONDS;
34
35 /**
36 * Transient key for rate limiting the package version requests;
37 */
38 const RATE_LIMITER_KEY = 'jetpack_update_remote_package_last_query';
39
40 /**
41 * Only allow one versions check (and request) per minute.
42 */
43 const RATE_LIMITER_TIMEOUT = MINUTE_IN_SECONDS;
44
45 /**
46 * Runs the package version check on the `shutdown` hook.
47 *
48 * Static so the callback can be unregistered, and so the tracker is only
49 * constructed when the hook fires rather than during configuration.
50 */
51 public static function update_on_shutdown() {
52 ( new self() )->maybe_update_package_versions();
53 }
54
55 /**
56 * Uses the jetpack_package_versions filter to obtain the package versions from packages that need
57 * version tracking. If the package versions have changed, updates the option and notifies WPCOM.
58 */
59 public function maybe_update_package_versions() {
60 // Do not run too early or all the modules may not be loaded.
61 if ( ! did_action( 'init' ) ) {
62 return;
63 }
64
65 // Only attempt to update the option on POST requests.
66 // This will prevent the option from being updated multiple times due to concurrent requests.
67 if ( ! ( isset( $_SERVER['REQUEST_METHOD'] ) && 'POST' === $_SERVER['REQUEST_METHOD'] ) ) {
68 return;
69 }
70
71 // The version check is being rate limited.
72 if ( $this->is_rate_limiting() ) {
73 return;
74 }
75
76 /**
77 * Obtains the package versions.
78 *
79 * @since 1.30.2
80 *
81 * @param array An associative array of Jetpack package slugs and their corresponding versions as key/value pairs.
82 */
83 $filter_versions = apply_filters( 'jetpack_package_versions', array() );
84
85 if ( ! is_array( $filter_versions ) ) {
86 return;
87 }
88
89 $option_versions = get_option( self::PACKAGE_VERSION_OPTION, array() );
90
91 foreach ( $filter_versions as $package => $version ) {
92 if ( ! is_string( $package ) || ! is_string( $version ) ) {
93 unset( $filter_versions[ $package ] );
94 }
95 }
96
97 if ( ! is_array( $option_versions )
98 || count( array_diff_assoc( $filter_versions, $option_versions ) )
99 || count( array_diff_assoc( $option_versions, $filter_versions ) )
100 ) {
101 $this->update_package_versions_option( $filter_versions );
102 }
103 }
104
105 /**
106 * Updates the package versions option.
107 *
108 * @param array $package_versions The package versions.
109 */
110 protected function update_package_versions_option( $package_versions ) {
111 if ( ! $this->is_sync_enabled() ) {
112 $this->update_package_versions_via_remote_request( $package_versions );
113 // Remove the checksum for package versions, so it gets recalculated when sync gets activated.
114 $jetpack_callables_sync_checksum = Jetpack_Options::get_raw_option( 'jetpack_callables_sync_checksum' );
115 if ( isset( $jetpack_callables_sync_checksum['jetpack_package_versions'] ) ) {
116 unset( $jetpack_callables_sync_checksum['jetpack_package_versions'] );
117 Jetpack_Options::update_raw_option( 'jetpack_callables_sync_checksum', $jetpack_callables_sync_checksum );
118 }
119 return;
120 }
121
122 update_option( self::PACKAGE_VERSION_OPTION, $package_versions );
123 }
124
125 /**
126 * Whether Jetpack Sync is enabled.
127 *
128 * @return boolean true if Sync is present and enabled, false otherwise
129 */
130 protected function is_sync_enabled() {
131 if ( class_exists( 'Automattic\Jetpack\Sync\Settings' ) && \Automattic\Jetpack\Sync\Settings::is_sync_enabled() ) {
132
133 return true;
134 }
135
136 return false;
137 }
138
139 /**
140 * Fallback for updating the package versions via a remote request when Sync is not present.
141 *
142 * Updates the package versions as follows:
143 * - Sends the updated package versions to wpcom.
144 * - Updates the 'jetpack_package_versions' option.
145 *
146 * @param array $package_versions The package versions.
147 */
148 protected function update_package_versions_via_remote_request( $package_versions ) {
149 $connection = new Manager();
150 if ( ! $connection->is_connected() ) {
151 return;
152 }
153
154 $site_id = \Jetpack_Options::get_option( 'id' );
155
156 $last_failed_attempt_within_hour = get_transient( self::CACHED_FAILED_REQUEST_KEY );
157
158 if ( $last_failed_attempt_within_hour ) {
159 return;
160 }
161
162 $body = wp_json_encode(
163 array(
164 'package_versions' => $package_versions,
165 ),
166 JSON_UNESCAPED_SLASHES
167 );
168
169 $response = Client::wpcom_json_api_request_as_blog(
170 sprintf( '/sites/%d/jetpack-package-versions', $site_id ),
171 '2',
172 array(
173 'headers' => array( 'content-type' => 'application/json' ),
174 'method' => 'POST',
175 ),
176 $body,
177 'wpcom'
178 );
179
180 if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
181 update_option( self::PACKAGE_VERSION_OPTION, $package_versions );
182 } else {
183 set_transient( self::CACHED_FAILED_REQUEST_KEY, time(), self::CACHED_FAILED_REQUEST_EXPIRATION );
184 }
185 }
186
187 /**
188 * Check if version check is being rate limited, and update the rate limiting transient if needed.
189 *
190 * @return bool
191 */
192 private function is_rate_limiting() {
193 if ( get_transient( static::RATE_LIMITER_KEY ) ) {
194 return true;
195 }
196
197 set_transient( static::RATE_LIMITER_KEY, time(), static::RATE_LIMITER_TIMEOUT );
198
199 return false;
200 }
201 }
202