Version Description
Release Date - 6 November 2017
- Fixed a bug that could prevent some users from connecting Akismet via their Jetpack connection.
- Ensured that any pending Akismet-related events are unscheduled if the plugin is deactivated.
- Allow some JavaScript to be run asynchronously to avoid affecting page render speeds.
Download this release
Release Info
Developer | cfinke |
Plugin | Akismet Anti-Spam |
Version | 4.0.1 |
Comparing to | |
See all releases |
Code changes from version 4.0 to 4.0.1
- akismet.php +2 -2
- class.akismet-admin.php +19 -5
- class.akismet.php +53 -13
- readme.txt +11 -4
akismet.php
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
Plugin Name: Akismet Anti-Spam
|
7 |
Plugin URI: https://akismet.com/
|
8 |
Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. It keeps your site protected even while you sleep. To get started: activate the Akismet plugin and then go to your Akismet Settings page to set up your API key.
|
9 |
-
Version: 4.0
|
10 |
Author: Automattic
|
11 |
Author URI: https://automattic.com/wordpress-plugins/
|
12 |
License: GPLv2 or later
|
@@ -37,7 +37,7 @@ if ( !function_exists( 'add_action' ) ) {
|
|
37 |
exit;
|
38 |
}
|
39 |
|
40 |
-
define( 'AKISMET_VERSION', '4.0' );
|
41 |
define( 'AKISMET__MINIMUM_WP_VERSION', '4.0' );
|
42 |
define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
43 |
define( 'AKISMET_DELETE_LIMIT', 100000 );
|
6 |
Plugin Name: Akismet Anti-Spam
|
7 |
Plugin URI: https://akismet.com/
|
8 |
Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. It keeps your site protected even while you sleep. To get started: activate the Akismet plugin and then go to your Akismet Settings page to set up your API key.
|
9 |
+
Version: 4.0.1
|
10 |
Author: Automattic
|
11 |
Author URI: https://automattic.com/wordpress-plugins/
|
12 |
License: GPLv2 or later
|
37 |
exit;
|
38 |
}
|
39 |
|
40 |
+
define( 'AKISMET_VERSION', '4.0.1' );
|
41 |
define( 'AKISMET__MINIMUM_WP_VERSION', '4.0' );
|
42 |
define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
43 |
define( 'AKISMET_DELETE_LIMIT', 100000 );
|
class.akismet-admin.php
CHANGED
@@ -92,10 +92,10 @@ class Akismet_Admin {
|
|
92 |
|
93 |
public static function load_menu() {
|
94 |
if ( class_exists( 'Jetpack' ) ) {
|
95 |
-
$hook = add_submenu_page( 'jetpack', __( 'Akismet' , 'akismet'), __( 'Akismet' , 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );
|
96 |
}
|
97 |
else {
|
98 |
-
$hook = add_options_page( __('Akismet', 'akismet'), __('Akismet', 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );
|
99 |
}
|
100 |
|
101 |
if ( $hook ) {
|
@@ -1061,8 +1061,22 @@ class Akismet_Admin {
|
|
1061 |
if ( !$xml->isError() ) {
|
1062 |
$responses = $xml->getResponse();
|
1063 |
if ( count( $responses ) > 1 ) {
|
1064 |
-
|
1065 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1066 |
return compact( 'api_key', 'user_id' );
|
1067 |
}
|
1068 |
}
|
@@ -1100,4 +1114,4 @@ class Akismet_Admin {
|
|
1100 |
|
1101 |
return $all_plugins;
|
1102 |
}
|
1103 |
-
}
|
92 |
|
93 |
public static function load_menu() {
|
94 |
if ( class_exists( 'Jetpack' ) ) {
|
95 |
+
$hook = add_submenu_page( 'jetpack', __( 'Akismet Anti-Spam' , 'akismet'), __( 'Akismet Anti-Spam' , 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );
|
96 |
}
|
97 |
else {
|
98 |
+
$hook = add_options_page( __('Akismet Anti-Spam', 'akismet'), __('Akismet Anti-Spam', 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );
|
99 |
}
|
100 |
|
101 |
if ( $hook ) {
|
1061 |
if ( !$xml->isError() ) {
|
1062 |
$responses = $xml->getResponse();
|
1063 |
if ( count( $responses ) > 1 ) {
|
1064 |
+
// Due to a quirk in how Jetpack does multi-calls, the response order
|
1065 |
+
// can't be trusted to match the call order. It's a good thing our
|
1066 |
+
// return values can be mostly differentiated from each other.
|
1067 |
+
$first_response_value = array_shift( $responses[0] );
|
1068 |
+
$second_response_value = array_shift( $responses[1] );
|
1069 |
+
|
1070 |
+
// If WPCOM ever reaches 100 billion users, this will fail. :-)
|
1071 |
+
if ( preg_match( '/^[a-f0-9]{12}$/i', $first_response_value ) ) {
|
1072 |
+
$api_key = $first_response_value;
|
1073 |
+
$user_id = (int) $second_response_value;
|
1074 |
+
}
|
1075 |
+
else {
|
1076 |
+
$api_key = $second_response_value;
|
1077 |
+
$user_id = (int) $first_response_value;
|
1078 |
+
}
|
1079 |
+
|
1080 |
return compact( 'api_key', 'user_id' );
|
1081 |
}
|
1082 |
}
|
1114 |
|
1115 |
return $all_plugins;
|
1116 |
}
|
1117 |
+
}
|
class.akismet.php
CHANGED
@@ -37,6 +37,7 @@ class Akismet {
|
|
37 |
add_action( 'admin_head-edit-comments.php', array( 'Akismet', 'load_form_js' ) );
|
38 |
add_action( 'comment_form', array( 'Akismet', 'load_form_js' ) );
|
39 |
add_action( 'comment_form', array( 'Akismet', 'inject_ak_js' ) );
|
|
|
40 |
|
41 |
add_filter( 'comment_moderation_recipients', array( 'Akismet', 'disable_moderation_emails_if_unreachable' ), 1000, 2 );
|
42 |
add_filter( 'pre_comment_approved', array( 'Akismet', 'last_comment_status' ), 10, 2 );
|
@@ -533,24 +534,36 @@ class Akismet {
|
|
533 |
if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
|
534 |
return;
|
535 |
|
536 |
-
global $current_user;
|
537 |
-
$reporter = '';
|
538 |
-
if ( is_object( $current_user ) )
|
539 |
-
$reporter = $current_user->user_login;
|
540 |
-
|
541 |
// Assumption alert:
|
542 |
// We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status
|
543 |
// is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to
|
544 |
// determine why the transition_comment_status action was triggered. And there are several different ways by which
|
545 |
// to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.
|
546 |
// We'll assume that this is an explicit user action if certain POST/GET variables exist.
|
547 |
-
if (
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
( isset( $
|
552 |
-
|
553 |
-
( isset( $
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
554 |
) {
|
555 |
if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {
|
556 |
return self::submit_spam_comment( $comment->comment_ID );
|
@@ -1104,6 +1117,19 @@ class Akismet {
|
|
1104 |
wp_enqueue_script( 'akismet-form' );
|
1105 |
}
|
1106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1107 |
public static function inject_ak_js( $fields ) {
|
1108 |
echo '<p style="display: none;">';
|
1109 |
echo '<input type="hidden" id="ak_js" name="ak_js" value="' . mt_rand( 0, 250 ) . '"/>';
|
@@ -1184,7 +1210,21 @@ p {
|
|
1184 |
* @static
|
1185 |
*/
|
1186 |
public static function plugin_deactivation( ) {
|
1187 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1188 |
}
|
1189 |
|
1190 |
/**
|
37 |
add_action( 'admin_head-edit-comments.php', array( 'Akismet', 'load_form_js' ) );
|
38 |
add_action( 'comment_form', array( 'Akismet', 'load_form_js' ) );
|
39 |
add_action( 'comment_form', array( 'Akismet', 'inject_ak_js' ) );
|
40 |
+
add_filter( 'script_loader_tag', array( 'Akismet', 'set_form_js_async' ), 10, 3 );
|
41 |
|
42 |
add_filter( 'comment_moderation_recipients', array( 'Akismet', 'disable_moderation_emails_if_unreachable' ), 1000, 2 );
|
43 |
add_filter( 'pre_comment_approved', array( 'Akismet', 'last_comment_status' ), 10, 2 );
|
534 |
if ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )
|
535 |
return;
|
536 |
|
|
|
|
|
|
|
|
|
|
|
537 |
// Assumption alert:
|
538 |
// We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status
|
539 |
// is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to
|
540 |
// determine why the transition_comment_status action was triggered. And there are several different ways by which
|
541 |
// to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.
|
542 |
// We'll assume that this is an explicit user action if certain POST/GET variables exist.
|
543 |
+
if (
|
544 |
+
// status=spam: Marking as spam via the REST API or...
|
545 |
+
// status=unspam: I'm not sure. Maybe this used to be used instead of status=approved? Or the UI for removing from spam but not approving has been since removed?...
|
546 |
+
// status=approved: Unspamming via the REST API (Calypso) or...
|
547 |
+
( isset( $_POST['status'] ) && in_array( $_POST['status'], array( 'spam', 'unspam', 'approved', ) ) )
|
548 |
+
// spam=1: Clicking "Spam" underneath a comment in wp-admin and allowing the AJAX request to happen.
|
549 |
+
|| ( isset( $_POST['spam'] ) && (int) $_POST['spam'] == 1 )
|
550 |
+
// unspam=1: Clicking "Not Spam" underneath a comment in wp-admin and allowing the AJAX request to happen. Or, clicking "Undo" after marking something as spam.
|
551 |
+
|| ( isset( $_POST['unspam'] ) && (int) $_POST['unspam'] == 1 )
|
552 |
+
// comment_status=spam/unspam: It's unclear where this is happening.
|
553 |
+
|| ( isset( $_POST['comment_status'] ) && in_array( $_POST['comment_status'], array( 'spam', 'unspam' ) ) )
|
554 |
+
// action=spam: Choosing "Mark as Spam" from the Bulk Actions dropdown in wp-admin (or the "Spam it" link in notification emails).
|
555 |
+
// action=unspam: Choosing "Not Spam" from the Bulk Actions dropdown in wp-admin.
|
556 |
+
// action=spamcomment: Following the "Spam" link below a comment in wp-admin (not allowing AJAX request to happen).
|
557 |
+
// action=unspamcomment: Following the "Not Spam" link below a comment in wp-admin (not allowing AJAX request to happen).
|
558 |
+
|| ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'spam', 'unspam', 'spamcomment', 'unspamcomment', ) ) )
|
559 |
+
// action=editedcomment: Editing a comment via wp-admin (and possibly changing its status).
|
560 |
+
|| ( isset( $_POST['action'] ) && in_array( $_POST['action'], array( 'editedcomment' ) ) )
|
561 |
+
// for=jetpack: Moderation via the WordPress app, Calypso, anything powered by the Jetpack connection.
|
562 |
+
|| ( isset( $_GET['for'] ) && ( 'jetpack' == $_GET['for'] ) && ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) )
|
563 |
+
// Certain WordPress.com API requests
|
564 |
+
|| ( defined( 'REST_API_REQUEST' ) && REST_API_REQUEST )
|
565 |
+
// WordPress.org REST API requests
|
566 |
+
|| ( defined( 'REST_REQUEST' ) && REST_REQUEST )
|
567 |
) {
|
568 |
if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {
|
569 |
return self::submit_spam_comment( $comment->comment_ID );
|
1117 |
wp_enqueue_script( 'akismet-form' );
|
1118 |
}
|
1119 |
|
1120 |
+
/**
|
1121 |
+
* Mark form.js as async. Because nothing depends on it, it can run at any time
|
1122 |
+
* after it's loaded, and the browser won't have to wait for it to load to continue
|
1123 |
+
* parsing the rest of the page.
|
1124 |
+
*/
|
1125 |
+
public static function set_form_js_async( $tag, $handle, $src ) {
|
1126 |
+
if ( 'akismet-form' !== $handle ) {
|
1127 |
+
return $tag;
|
1128 |
+
}
|
1129 |
+
|
1130 |
+
return preg_replace( '/^<script /i', '<script async="async" ', $tag );
|
1131 |
+
}
|
1132 |
+
|
1133 |
public static function inject_ak_js( $fields ) {
|
1134 |
echo '<p style="display: none;">';
|
1135 |
echo '<input type="hidden" id="ak_js" name="ak_js" value="' . mt_rand( 0, 250 ) . '"/>';
|
1210 |
* @static
|
1211 |
*/
|
1212 |
public static function plugin_deactivation( ) {
|
1213 |
+
self::deactivate_key( self::get_api_key() );
|
1214 |
+
|
1215 |
+
// Remove any scheduled cron jobs.
|
1216 |
+
$akismet_cron_events = array(
|
1217 |
+
'akismet_schedule_cron_recheck',
|
1218 |
+
'akismet_scheduled_delete',
|
1219 |
+
);
|
1220 |
+
|
1221 |
+
foreach ( $akismet_cron_events as $akismet_cron_event ) {
|
1222 |
+
$timestamp = wp_next_scheduled( $akismet_cron_event );
|
1223 |
+
|
1224 |
+
if ( $timestamp ) {
|
1225 |
+
wp_unschedule_event( $timestamp, $akismet_cron_event );
|
1226 |
+
}
|
1227 |
+
}
|
1228 |
}
|
1229 |
|
1230 |
/**
|
readme.txt
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
-
=== Akismet ===
|
2 |
-
Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic, jgs
|
3 |
Tags: akismet, comments, spam, antispam, anti-spam, anti spam, comment moderation, comment spam, contact form spam, spam comments
|
4 |
Requires at least: 4.0
|
5 |
-
Tested up to: 4.
|
6 |
-
Stable tag: 4.0
|
7 |
License: GPLv2 or later
|
8 |
|
9 |
Akismet checks your comments and contact form submissions against our global database of spam to protect you and your site from malicious content.
|
@@ -30,6 +30,13 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
|
|
30 |
|
31 |
== Changelog ==
|
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
= 4.0 =
|
34 |
*Release Date - 19 September 2017*
|
35 |
|
1 |
+
=== Akismet Anti-Spam ===
|
2 |
+
Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic, jgs, procifer
|
3 |
Tags: akismet, comments, spam, antispam, anti-spam, anti spam, comment moderation, comment spam, contact form spam, spam comments
|
4 |
Requires at least: 4.0
|
5 |
+
Tested up to: 4.9
|
6 |
+
Stable tag: 4.0.1
|
7 |
License: GPLv2 or later
|
8 |
|
9 |
Akismet checks your comments and contact form submissions against our global database of spam to protect you and your site from malicious content.
|
30 |
|
31 |
== Changelog ==
|
32 |
|
33 |
+
= 4.0.1 =
|
34 |
+
*Release Date - 6 November 2017*
|
35 |
+
|
36 |
+
* Fixed a bug that could prevent some users from connecting Akismet via their Jetpack connection.
|
37 |
+
* Ensured that any pending Akismet-related events are unscheduled if the plugin is deactivated.
|
38 |
+
* Allow some JavaScript to be run asynchronously to avoid affecting page render speeds.
|
39 |
+
|
40 |
= 4.0 =
|
41 |
*Release Date - 19 September 2017*
|
42 |
|