85 'methods' => WP_REST_Server::READABLE, |
85 'methods' => WP_REST_Server::READABLE, |
86 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), |
86 'permission_callback' => array( 'Akismet_REST_API', 'privileged_permission_callback' ), |
87 'callback' => array( 'Akismet_REST_API', 'get_stats' ), |
87 'callback' => array( 'Akismet_REST_API', 'get_stats' ), |
88 ) |
88 ) |
89 ) ); |
89 ) ); |
|
90 |
|
91 register_rest_route( 'akismet/v1', '/alert', array( |
|
92 array( |
|
93 'methods' => WP_REST_Server::READABLE, |
|
94 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), |
|
95 'callback' => array( 'Akismet_REST_API', 'get_alert' ), |
|
96 'args' => array( |
|
97 'key' => array( |
|
98 'required' => false, |
|
99 'type' => 'string', |
|
100 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), |
|
101 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), |
|
102 ), |
|
103 ), |
|
104 ), |
|
105 array( |
|
106 'methods' => WP_REST_Server::EDITABLE, |
|
107 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), |
|
108 'callback' => array( 'Akismet_REST_API', 'set_alert' ), |
|
109 'args' => array( |
|
110 'key' => array( |
|
111 'required' => false, |
|
112 'type' => 'string', |
|
113 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), |
|
114 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), |
|
115 ), |
|
116 ), |
|
117 ), |
|
118 array( |
|
119 'methods' => WP_REST_Server::DELETABLE, |
|
120 'permission_callback' => array( 'Akismet_REST_API', 'remote_call_permission_callback' ), |
|
121 'callback' => array( 'Akismet_REST_API', 'delete_alert' ), |
|
122 'args' => array( |
|
123 'key' => array( |
|
124 'required' => false, |
|
125 'type' => 'string', |
|
126 'sanitize_callback' => array( 'Akismet_REST_API', 'sanitize_key' ), |
|
127 'description' => __( 'A 12-character Akismet API key. Available at akismet.com/get/', 'akismet' ), |
|
128 ), |
|
129 ), |
|
130 ) |
|
131 ) ); |
90 } |
132 } |
91 |
133 |
92 /** |
134 /** |
93 * Get the current Akismet API key. |
135 * Get the current Akismet API key. |
94 * |
136 * |
229 } |
271 } |
230 |
272 |
231 return rest_ensure_response( $stat_totals ); |
273 return rest_ensure_response( $stat_totals ); |
232 } |
274 } |
233 |
275 |
|
276 /** |
|
277 * Get the current alert code and message. Alert codes are used to notify the site owner |
|
278 * if there's a problem, like a connection issue between their site and the Akismet API, |
|
279 * invalid requests being sent, etc. |
|
280 * |
|
281 * @param WP_REST_Request $request |
|
282 * @return WP_Error|WP_REST_Response |
|
283 */ |
|
284 public static function get_alert( $request ) { |
|
285 return rest_ensure_response( array( |
|
286 'code' => get_option( 'akismet_alert_code' ), |
|
287 'message' => get_option( 'akismet_alert_msg' ), |
|
288 ) ); |
|
289 } |
|
290 |
|
291 /** |
|
292 * Update the current alert code and message by triggering a call to the Akismet server. |
|
293 * |
|
294 * @param WP_REST_Request $request |
|
295 * @return WP_Error|WP_REST_Response |
|
296 */ |
|
297 public static function set_alert( $request ) { |
|
298 delete_option( 'akismet_alert_code' ); |
|
299 delete_option( 'akismet_alert_msg' ); |
|
300 |
|
301 // Make a request so the most recent alert code and message are retrieved. |
|
302 Akismet::verify_key( Akismet::get_api_key() ); |
|
303 |
|
304 return self::get_alert( $request ); |
|
305 } |
|
306 |
|
307 /** |
|
308 * Clear the current alert code and message. |
|
309 * |
|
310 * @param WP_REST_Request $request |
|
311 * @return WP_Error|WP_REST_Response |
|
312 */ |
|
313 public static function delete_alert( $request ) { |
|
314 delete_option( 'akismet_alert_code' ); |
|
315 delete_option( 'akismet_alert_msg' ); |
|
316 |
|
317 return self::get_alert( $request ); |
|
318 } |
|
319 |
234 private static function key_is_valid( $key ) { |
320 private static function key_is_valid( $key ) { |
235 $response = Akismet::http_post( |
321 $response = Akismet::http_post( |
236 Akismet::build_query( |
322 Akismet::build_query( |
237 array( |
323 array( |
238 'key' => $key, |
324 'key' => $key, |
251 |
337 |
252 public static function privileged_permission_callback() { |
338 public static function privileged_permission_callback() { |
253 return current_user_can( 'manage_options' ); |
339 return current_user_can( 'manage_options' ); |
254 } |
340 } |
255 |
341 |
|
342 /** |
|
343 * For calls that Akismet.com makes to the site to clear outdated alert codes, use the API key for authorization. |
|
344 */ |
|
345 public static function remote_call_permission_callback( $request ) { |
|
346 $local_key = Akismet::get_api_key(); |
|
347 |
|
348 return $local_key && ( strtolower( $request->get_param( 'key' ) ) === strtolower( $local_key ) ); |
|
349 } |
|
350 |
256 public static function sanitize_interval( $interval, $request, $param ) { |
351 public static function sanitize_interval( $interval, $request, $param ) { |
257 $interval = trim( $interval ); |
352 $interval = trim( $interval ); |
258 |
353 |
259 $valid_intervals = array( '60-days', '6-months', 'all', ); |
354 $valid_intervals = array( '60-days', '6-months', 'all', ); |
260 |
355 |