PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
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-protect-status / src / class-status.php
jetpack / jetpack_vendor / automattic / jetpack-protect-status / src Last commit date
class-plan.php 8 months ago class-protect-status.php 2 months ago class-rest-controller.php 8 months ago class-scan-status.php 2 months ago class-status.php 3 days ago
class-status.php
301 lines
1 <?php
2 /**
3 * Class to handle the Status of Jetpack Protect
4 *
5 * @package automattic/jetpack-protect-status
6 */
7
8 namespace Automattic\Jetpack\Protect_Status;
9
10 use Automattic\Jetpack\Protect_Models\Status_Model;
11
12 /**
13 * Class that handles fetching and caching the Status of vulnerabilities check from the WPCOM servers
14 */
15 class Status {
16
17 const PACKAGE_VERSION = '0.7.14';
18 /**
19 * Name of the option where status is stored
20 *
21 * @var string
22 */
23 const OPTION_NAME = '';
24
25 /**
26 * Name of the option where the timestamp of the status is stored
27 *
28 * @var string
29 */
30 const OPTION_TIMESTAMP_NAME = '';
31
32 /**
33 * Time in seconds that the cache should last
34 *
35 * @var int
36 */
37 const OPTION_EXPIRES_AFTER = 3600; // 1 hour.
38
39 /**
40 * Time in seconds that the cache for the initial empty response should last
41 *
42 * @var int
43 */
44 const INITIAL_OPTION_EXPIRES_AFTER = 1 * MINUTE_IN_SECONDS;
45
46 /**
47 * Memoization for the current status
48 *
49 * @var null|Status_Model
50 */
51 public static $status = null;
52
53 /**
54 * Gets the current status of the Jetpack Protect checks
55 *
56 * @param bool $refresh_from_wpcom Refresh the local plan and status cache from wpcom.
57 * @return Status_Model
58 */
59 public static function get_status( $refresh_from_wpcom = false ) {
60 $use_scan_status = Plan::has_required_plan( $refresh_from_wpcom );
61
62 if ( defined( 'JETPACK_PROTECT_DEV__DATA_SOURCE' ) ) {
63 if ( 'scan_api' === JETPACK_PROTECT_DEV__DATA_SOURCE ) {
64 $use_scan_status = true;
65 }
66
67 if ( 'protect_report' === JETPACK_PROTECT_DEV__DATA_SOURCE ) {
68 $use_scan_status = false;
69 }
70 }
71
72 self::$status = $use_scan_status ? Scan_Status::get_status( $refresh_from_wpcom ) : Protect_Status::get_status( $refresh_from_wpcom );
73 return self::$status;
74 }
75
76 /**
77 * Checks if the current cached status is expired and should be renewed
78 *
79 * @return boolean
80 */
81 public static function is_cache_expired() {
82 $option_timestamp = get_option( static::OPTION_TIMESTAMP_NAME );
83
84 if ( ! $option_timestamp ) {
85 return true;
86 }
87
88 return time() > (int) $option_timestamp;
89 }
90
91 /**
92 * Checks if we should consider the stored cache or bypass it
93 *
94 * @return boolean
95 */
96 public static function should_use_cache() {
97 return ! ( defined( 'JETPACK_PROTECT_DEV__BYPASS_CACHE' ) && JETPACK_PROTECT_DEV__BYPASS_CACHE );
98 }
99
100 /**
101 * Gets the current cached status
102 *
103 * @return bool|array False if value is not found. Array with values if cache is found.
104 */
105 public static function get_from_options() {
106 return maybe_unserialize( get_option( static::OPTION_NAME ) );
107 }
108
109 /**
110 * Updated the cached status and its timestamp
111 *
112 * @param array $status The new status to be cached.
113 * @return void
114 */
115 public static function update_status_option( $status ) {
116 // TODO: Sanitize $status.
117 update_option( static::OPTION_NAME, maybe_serialize( $status ) );
118 $end_date = self::get_cache_end_date_by_status( $status );
119 update_option( static::OPTION_TIMESTAMP_NAME, $end_date );
120 }
121
122 /**
123 * Returns the timestamp the cache should expire depending on the current status
124 *
125 * Initial empty status, which are returned before the first check was performed, should be cache for less time
126 *
127 * @param object $status The response from the server being cached.
128 * @return int The timestamp when the cache should expire.
129 */
130 public static function get_cache_end_date_by_status( $status ) {
131 if ( ! is_object( $status ) || empty( $status->last_checked ) ) {
132 return time() + static::INITIAL_OPTION_EXPIRES_AFTER;
133 }
134 return time() + static::OPTION_EXPIRES_AFTER;
135 }
136
137 /**
138 * Delete the cached status and its timestamp
139 *
140 * @return bool Whether all related status options were successfully deleted.
141 */
142 public static function delete_option() {
143 $option_deleted = delete_option( static::OPTION_NAME );
144 $option_timestamp_deleted = delete_option( static::OPTION_TIMESTAMP_NAME );
145
146 return $option_deleted && $option_timestamp_deleted;
147 }
148
149 /**
150 * Checks the current status to see if there are any threats found
151 *
152 * @return boolean
153 */
154 public static function has_threats() {
155 return 0 < self::get_total_threats();
156 }
157
158 /**
159 * Gets the total number of threats found
160 *
161 * @return integer
162 */
163 public static function get_total_threats() {
164 $status = static::get_status();
165 return count( $status->threats );
166 }
167
168 /**
169 * Get all threats combined
170 *
171 * @return array
172 */
173 public static function get_all_threats() {
174 $status = static::get_status();
175 return $status->threats;
176 }
177
178 /**
179 * Get threats found for WordPress core
180 *
181 * @deprecated 0.3.0
182 *
183 * @return array
184 */
185 public static function get_wordpress_threats() {
186 return self::get_threats( 'core' );
187 }
188
189 /**
190 * Get threats found for themes
191 *
192 * @deprecated 0.3.0
193 *
194 * @return array
195 */
196 public static function get_themes_threats() {
197 return self::get_threats( 'themes' );
198 }
199
200 /**
201 * Get threats found for plugins
202 *
203 * @deprecated 0.3.0
204 *
205 * @return array
206 */
207 public static function get_plugins_threats() {
208 return self::get_threats( 'plugins' );
209 }
210
211 /**
212 * Get threats found for files
213 *
214 * @deprecated 0.3.0
215 *
216 * @return array
217 */
218 public static function get_files_threats() {
219 return self::get_threats( 'files' );
220 }
221
222 /**
223 * Get threats found for plugins
224 *
225 * @deprecated 0.3.0
226 *
227 * @return array
228 */
229 public static function get_database_threats() {
230 return self::get_threats( 'database' );
231 }
232
233 /**
234 * Get the threats for one type of extension or core
235 *
236 * @param string $type What threats you want to get. Possible values are 'core', 'themes' and 'plugins'.
237 *
238 * @return array
239 */
240 public static function get_threats( $type ) {
241 $status = static::get_status();
242
243 if ( in_array( $type, array( 'plugin', 'theme', 'core' ), true ) ) {
244 return array_filter(
245 $status->threats,
246 function ( $threat ) use ( $type ) {
247 return isset( $threat->extension ) && $type === $threat->extension->type;
248 }
249 );
250 }
251
252 if ( 'files' === $type ) {
253 return array_filter(
254 $status->threats,
255 function ( $threat ) {
256 return ! empty( $threat->filename );
257 }
258 );
259 }
260
261 if ( 'database' === $type ) {
262 return array_filter(
263 $status->threats,
264 function ( $threat ) {
265 return ! empty( $threat->table );
266 }
267 );
268 }
269
270 return $status->threats;
271 }
272
273 /**
274 * Sort By Threats
275 *
276 * @deprecated 0.3.0
277 *
278 * @param array<object> $threats Array of threats to sort.
279 *
280 * @return array<object> The sorted $threats array.
281 */
282 protected static function sort_threats( $threats ) {
283 usort(
284 $threats,
285 function ( $a, $b ) {
286 // sort primarily based on the presence of threats
287 $ret = empty( $a->threats ) <=> empty( $b->threats );
288
289 // sort secondarily on whether the item has been checked
290 if ( ! $ret ) {
291 $ret = $a->checked <=> $b->checked;
292 }
293
294 return $ret;
295 }
296 );
297
298 return $threats;
299 }
300 }
301