X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/11be8dc178e77d0b46189bbd8e33a216a9b90942..refs/tags/wordpress-2.9:/wp-content/plugins/akismet/akismet.php
diff --git a/wp-content/plugins/akismet/akismet.php b/wp-content/plugins/akismet/akismet.php
index 20034734..2460b707 100644
--- a/wp-content/plugins/akismet/akismet.php
+++ b/wp-content/plugins/akismet/akismet.php
@@ -3,13 +3,18 @@
Plugin Name: Akismet
Plugin URI: http://akismet.com/
Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need a WordPress.com API key to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <?php akismet_counter(); ?>
in your template. See also: WP Stats plugin.
-Version: 2.2.3
+Version: 2.2.7
Author: Matt Mullenweg
Author URI: http://ma.tt/
*/
+define('AKISMET_VERSION', '2.2.7');
+
// If you hardcode a WP.com API key here, all key config screens will be hidden
-$wpcom_api_key = '';
+if ( defined('WPCOM_API_KEY') )
+ $wpcom_api_key = constant('WPCOM_API_KEY');
+else
+ $wpcom_api_key = '';
function akismet_init() {
global $wpcom_api_key, $akismet_api_host, $akismet_api_port;
@@ -22,6 +27,7 @@ function akismet_init() {
$akismet_api_port = 80;
add_action('admin_menu', 'akismet_config_page');
add_action('admin_menu', 'akismet_stats_page');
+ akismet_admin_warnings();
}
add_action('init', 'akismet_init');
@@ -83,6 +89,8 @@ function akismet_conf() {
update_option( 'akismet_discard_month', 'true' );
else
update_option( 'akismet_discard_month', 'false' );
+ } elseif ( isset($_POST['check']) ) {
+ akismet_get_server_connectivity(0);
}
if ( $key_status != 'valid' ) {
@@ -118,7 +126,7 @@ function akismet_conf() {
'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')),
'key_failed' => array('color' => 'aa0', 'text' => __('The key below was previously validated but a connection to akismet.com can not be established at this time. Please check your server configuration.')));
?>
-
+
@@ -184,41 +252,148 @@ function akismet_stats_display() {
".__('Akismet is almost ready.')." ".sprintf(__('You must enter your WordPress.com API key for it to work.'), "plugins.php?page=akismet-key-config")."
- ";
+// Check connectivity between the WordPress blog and Akismet's servers.
+// Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect).
+function akismet_check_server_connectivity() {
+ global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
+
+ $test_host = 'rest.akismet.com';
+
+ // Some web hosts may disable one or both functions
+ if ( !is_callable('fsockopen') || !is_callable('gethostbynamel') )
+ return array();
+
+ $ips = gethostbynamel($test_host);
+ if ( !$ips || !is_array($ips) || !count($ips) )
+ return array();
+
+ $servers = array();
+ foreach ( $ips as $ip ) {
+ $response = akismet_verify_key( akismet_get_key(), $ip );
+ // even if the key is invalid, at least we know we have connectivity
+ if ( $response == 'valid' || $response == 'invalid' )
+ $servers[$ip] = true;
+ else
+ $servers[$ip] = false;
}
- add_action('admin_notices', 'akismet_warning');
- return;
+
+ return $servers;
+}
+
+// Check the server connectivity and store the results in an option.
+// Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update.
+// Returns the same associative array as akismet_check_server_connectivity()
+function akismet_get_server_connectivity( $cache_timeout = 86400 ) {
+ $servers = get_option('akismet_available_servers');
+ if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false )
+ return $servers;
+
+ // There's a race condition here but the effect is harmless.
+ $servers = akismet_check_server_connectivity();
+ update_option('akismet_available_servers', $servers);
+ update_option('akismet_connectivity_time', time());
+ return $servers;
+}
+
+// Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed.
+function akismet_server_connectivity_ok() {
+ // skip the check on WPMU because the status page is hidden
+ global $wpcom_api_key;
+ if ( $wpcom_api_key )
+ return true;
+ $servers = akismet_get_server_connectivity();
+ return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );
+}
+
+function akismet_admin_warnings() {
+ global $wpcom_api_key;
+ if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
+ function akismet_warning() {
+ echo "
+
+ ";
+ }
+ add_action('admin_notices', 'akismet_warning');
+ return;
+ } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) {
+ function akismet_warning() {
+ echo "
+ ".__('Akismet has detected a problem.')." ".sprintf(__('A server or network problem is preventing Akismet from working correctly. Click here for more information about how to fix the problem.'), "plugins.php?page=akismet-key-config")."
+ ";
+ }
+ add_action('admin_notices', 'akismet_warning');
+ return;
+ }
+}
+
+function akismet_get_host($host) {
+ // if all servers are accessible, just return the host name.
+ // if not, return an IP that was known to be accessible at the last check.
+ if ( akismet_server_connectivity_ok() ) {
+ return $host;
+ } else {
+ $ips = akismet_get_server_connectivity();
+ // a firewall may be blocking access to some Akismet IPs
+ if ( count($ips) > 0 && count(array_filter($ips)) < count($ips) ) {
+ // use DNS to get current IPs, but exclude any known to be unreachable
+ $dns = (array)gethostbynamel( rtrim($host, '.') . '.' );
+ $dns = array_filter($dns);
+ foreach ( $dns as $ip ) {
+ if ( array_key_exists( $ip, $ips ) && empty( $ips[$ip] ) )
+ unset($dns[$ip]);
+ }
+ // return a random IP from those available
+ if ( count($dns) )
+ return $dns[ array_rand($dns) ];
+
+ }
+ }
+ // if all else fails try the host name
+ return $host;
}
// Returns array with headers in $response[0] and body in $response[1]
-function akismet_http_post($request, $host, $path, $port = 80) {
+function akismet_http_post($request, $host, $path, $port = 80, $ip=null) {
global $wp_version;
+
+ $akismet_version = constant('AKISMET_VERSION');
$http_request = "POST $path HTTP/1.0\r\n";
$http_request .= "Host: $host\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n";
$http_request .= "Content-Length: " . strlen($request) . "\r\n";
- $http_request .= "User-Agent: WordPress/$wp_version | Akismet/2.0\r\n";
+ $http_request .= "User-Agent: WordPress/$wp_version | Akismet/$akismet_version\r\n";
$http_request .= "\r\n";
$http_request .= $request;
+
+ $http_host = $host;
+ // use a specific IP if provided - needed by akismet_check_server_connectivity()
+ if ( $ip && long2ip(ip2long($ip)) ) {
+ $http_host = $ip;
+ } else {
+ $http_host = akismet_get_host($host);
+ }
$response = '';
- if( false != ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
+ if( false != ( $fs = @fsockopen($http_host, $port, $errno, $errstr, 10) ) ) {
fwrite($fs, $http_request);
while ( !feof($fs) )
@@ -229,6 +404,14 @@ function akismet_http_post($request, $host, $path, $port = 80) {
return $response;
}
+// filter handler used to return a spam result to pre_comment_approved
+function akismet_result_spam( $approved ) {
+ // bump the counter here instead of when the filter is added to reduce the possibility of overcounting
+ if ( $incr = apply_filters('akismet_spam_count_incr', 1) )
+ update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );
+ return 'spam';
+}
+
function akismet_auto_check_comment( $comment ) {
global $akismet_api_host, $akismet_api_port;
@@ -236,11 +419,14 @@ function akismet_auto_check_comment( $comment ) {
$comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
$comment['referrer'] = $_SERVER['HTTP_REFERER'];
$comment['blog'] = get_option('home');
+ $comment['blog_lang'] = get_locale();
+ $comment['blog_charset'] = get_option('blog_charset');
+ $comment['permalink'] = get_permalink($comment['comment_post_ID']);
$ignore = array( 'HTTP_COOKIE' );
foreach ( $_SERVER as $key => $value )
- if ( !in_array( $key, $ignore ) )
+ if ( !in_array( $key, $ignore ) && is_string($value) )
$comment["$key"] = $value;
$query_string = '';
@@ -249,8 +435,8 @@ function akismet_auto_check_comment( $comment ) {
$response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
if ( 'true' == $response[1] ) {
- add_filter('pre_comment_approved', create_function('$a', 'return \'spam\';'));
- update_option( 'akismet_spam_count', get_option('akismet_spam_count') + 1 );
+ // akismet_spam_count will be incremented later by akismet_result_spam()
+ add_filter('pre_comment_approved', 'akismet_result_spam');
do_action( 'akismet_spam_caught' );
@@ -258,9 +444,13 @@ function akismet_auto_check_comment( $comment ) {
$last_updated = strtotime( $post->post_modified_gmt );
$diff = time() - $last_updated;
$diff = $diff / 86400;
-
- if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' )
+
+ if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' ) {
+ // akismet_result_spam() won't be called so bump the counter here
+ if ( $incr = apply_filters('akismet_spam_count_incr', 1) )
+ update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );
die;
+ }
}
akismet_delete_old();
return $comment;
@@ -276,21 +466,31 @@ function akismet_delete_old() {
}
function akismet_submit_nonspam_comment ( $comment_id ) {
- global $wpdb, $akismet_api_host, $akismet_api_port;
+ global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
$comment_id = (int) $comment_id;
-
+
$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
if ( !$comment ) // it was deleted
return;
$comment->blog = get_option('home');
+ $comment->blog_lang = get_locale();
+ $comment->blog_charset = get_option('blog_charset');
+ $comment->permalink = get_permalink($comment->comment_post_ID);
+ if ( is_object($current_user) ) {
+ $comment->reporter = $current_user->user_login;
+ }
+ if ( is_object($current_site) ) {
+ $comment->site_domain = $current_site->domain;
+ }
$query_string = '';
foreach ( $comment as $key => $data )
$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
+
$response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port);
}
function akismet_submit_spam_comment ( $comment_id ) {
- global $wpdb, $akismet_api_host, $akismet_api_port;
+ global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
$comment_id = (int) $comment_id;
$comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
@@ -299,6 +499,15 @@ function akismet_submit_spam_comment ( $comment_id ) {
if ( 'spam' != $comment->comment_approved )
return;
$comment->blog = get_option('home');
+ $comment->blog_lang = get_locale();
+ $comment->blog_charset = get_option('blog_charset');
+ $comment->permalink = get_permalink($comment->comment_post_ID);
+ if ( is_object($current_user) ) {
+ $comment->reporter = $current_user->user_login;
+ }
+ if ( is_object($current_site) ) {
+ $comment->site_domain = $current_site->domain;
+ }
$query_string = '';
foreach ( $comment as $key => $data )
$query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
@@ -787,6 +996,9 @@ function akismet_recheck_queue() {
$c['user_agent'] = $c['comment_agent'];
$c['referrer'] = '';
$c['blog'] = get_option('home');
+ $c['blog_lang'] = get_locale();
+ $c['blog_charset'] = get_option('blog_charset');
+ $c['permalink'] = get_permalink($c['comment_post_ID']);
$id = (int) $c['comment_ID'];
$query_string = '';
@@ -816,6 +1028,9 @@ function akismet_check_db_comment( $id ) {
$c['user_agent'] = $c['comment_agent'];
$c['referrer'] = '';
$c['blog'] = get_option('home');
+ $c['blog_lang'] = get_locale();
+ $c['blog_charset'] = get_option('blog_charset');
+ $c['permalink'] = get_permalink($c['comment_post_ID']);
$id = $c['comment_ID'];
$query_string = '';