Changeset 1879
- Timestamp:
- 02/16/2011 10:27:00 AM (15 months ago)
- Location:
- trunk/blogs/wp-content/plugins/akismet
- Files:
-
- 3 added
- 3 edited
-
admin.php (modified) (34 diffs)
-
akismet.css (added)
-
akismet.js (added)
-
akismet.php (modified) (12 diffs)
-
readme.txt (modified) (3 diffs)
-
widget.php (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/blogs/wp-content/plugins/akismet/admin.php
r1877 r1879 8 8 9 9 // all admin functions are disabled in old versions 10 if ( version_compare( $wp_version, '3.0', '<' ) ) {10 if ( !function_exists('is_multisite') && version_compare( $wp_version, '3.0', '<' ) ) { 11 11 12 12 function akismet_version_warning() { 13 13 echo " 14 <div id='akismet-warning' class='updated fade'><p><strong>".sprintf(__('Akismet %s require dWordPress 3.0 or higher.'), AKISMET_VERSION) ."</strong> ".sprintf(__('Please <a href="%s">upgrade WordPress</a> to a current version, or <a href="%s">downgrade to version 2.4 of the Akismet plugin</a>.'), 'http://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/'). "</p></div>14 <div id='akismet-warning' class='updated fade'><p><strong>".sprintf(__('Akismet %s requires WordPress 3.0 or higher.'), AKISMET_VERSION) ."</strong> ".sprintf(__('Please <a href="%s">upgrade WordPress</a> to a current version, or <a href="%s">downgrade to version 2.4 of the Akismet plugin</a>.'), 'http://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/'). "</p></div> 15 15 "; 16 16 } … … 25 25 $hook = 'dashboard_page_akismet-stats-display'; 26 26 add_action('admin_head-'.$hook, 'akismet_stats_script'); 27 add_meta_box('akismet-status', __('Akismet Status'), 'akismet_comment_status_meta_box', 'comment', 'normal'); 27 add_meta_box('akismet-status', __('Comment History'), 'akismet_comment_status_meta_box', 'comment', 'normal'); 28 wp_register_style('akismet.css', AKISMET_PLUGIN_URL . 'akismet.css'); 29 wp_enqueue_style('akismet.css'); 30 wp_register_script('akismet.js', AKISMET_PLUGIN_URL . 'akismet.js', array('jquery')); 31 wp_enqueue_script('akismet.js'); 28 32 } 29 33 add_action('admin_init', 'akismet_admin_init'); … … 35 39 if ( function_exists('add_submenu_page') ) 36 40 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf'); 37 38 } 41 } 42 43 function akismet_plugin_action_links( $links, $file ) { 44 if ( $file == plugin_basename( dirname(__FILE__).'/akismet.php' ) ) { 45 $links[] = '<a href="plugins.php?page=akismet-key-config">'.__('Settings').'</a>'; 46 } 47 48 return $links; 49 } 50 51 add_filter( 'plugin_action_links', 'akismet_plugin_action_links', 10, 2 ); 39 52 40 53 function akismet_conf() { … … 47 60 check_admin_referer( $akismet_nonce ); 48 61 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] ); 62 $home_url = parse_url( get_bloginfo('url') ); 49 63 50 64 if ( empty($key) ) { … … 52 66 $ms[] = 'new_key_empty'; 53 67 delete_option('wordpress_api_key'); 68 } elseif ( empty($home_url['host']) ) { 69 $key_status = 'empty'; 70 $ms[] = 'bad_home_url'; 54 71 } else { 55 72 $key_status = akismet_verify_key( $key ); … … 69 86 else 70 87 update_option( 'akismet_discard_month', 'false' ); 88 89 if ( isset( $_POST['akismet_show_user_comments_approved'] ) ) 90 update_option( 'akismet_show_user_comments_approved', 'true' ); 91 else 92 update_option( 'akismet_show_user_comments_approved', 'false' ); 93 71 94 } elseif ( isset($_POST['check']) ) { 72 95 akismet_get_server_connectivity(0); … … 98 121 $messages = array( 99 122 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')), 100 'new_key_valid' => array('color' => ' 2d2', 'text' => __('Your key has been verified. Happy blogging!')),101 'new_key_invalid' => array('color' => ' d22', 'text' => __('The key you entered is invalid. Please double-check it.')),102 'new_key_failed' => array('color' => ' d22', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')),103 'no_connection' => array('color' => ' d22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),123 'new_key_valid' => array('color' => '4AB915', 'text' => __('Your key has been verified. Happy blogging!')), 124 'new_key_invalid' => array('color' => '888', 'text' => __('The key you entered is invalid. Please double-check it.')), 125 'new_key_failed' => array('color' => '888', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')), 126 'no_connection' => array('color' => '888', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')), 104 127 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (<a href="%s" style="color:#fff">Get your key.</a>)'), 'http://akismet.com/get/')), 105 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')), 106 '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.'))); 128 'key_valid' => array('color' => '4AB915', 'text' => __('This key is valid.')), 129 '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.')), 130 'bad_home_url' => array('color' => '888', 'text' => sprintf( __('Your WordPress home URL %s is invalid. Please fix the <a href="%s">home option</a>.'), esc_html( get_bloginfo('url') ), admin_url('options.php#home') ) ), 131 ); 107 132 ?> 108 133 <?php if ( !empty($_POST['submit'] ) ) : ?> … … 111 136 <div class="wrap"> 112 137 <h2><?php _e('Akismet Configuration'); ?></h2> 138 <?php if (isset($_GET['message']) && $_GET['message'] == 'success') { ?> 139 <div class="updated below-h2" id="message"><p><?php _e( '<strong>Sign up success!</strong> Please check your email for your Akismet API Key and enter it below.' ); ?></p></div> 140 <?php } ?> 113 141 <div class="narrow"> 114 142 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; "> … … 127 155 <?php } ?> 128 156 <?php akismet_nonce_field($akismet_nonce) ?> 129 <p><label><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php if ( get_option('akismet_discard_month') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Automatically discard spam comments on posts older than a month.'); ?></label></p> 157 <p><label><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php if ( get_option('akismet_discard_month') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Auto-delete spam submitted on posts more than a month old.'); ?></label></p> 158 <p><label><input name="akismet_show_user_comments_approved" id="akismet_show_user_comments_approved" value="true" type="checkbox" <?php if ( get_option('akismet_show_user_comments_approved') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Show the number of comments you\'ve approved beside each comment author.'); ?></label></p> 130 159 <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options »'); ?>" /></p> 131 160 </form> … … 137 166 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) { 138 167 ?> 139 <p style="padding: .5em; background-color: # d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p>168 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p> 140 169 <p><?php echo sprintf( __('Your web host or server administrator has disabled PHP\'s <code>fsockopen</code> or <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet\'s system requirements</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 141 170 <?php … … 151 180 // all connections fail 152 181 } elseif ( $fail_count > 0 ) { ?> 153 <p style="padding: .5em; background-color: # d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p>182 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p> 154 183 <p><?php echo sprintf( __('A network problem or firewall is blocking all connections from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 155 184 <?php 156 185 // all connections work 157 186 } else { ?> 158 <p style="padding: .5em; background-color: # 2d2; color: #fff; font-weight:bold;"><?php _e('All Akismet servers are available.'); ?></p>187 <p style="padding: .5em; background-color: #4AB915; color: #fff; font-weight:bold;"><?php _e('All Akismet servers are available.'); ?></p> 159 188 <p><?php _e('Akismet is working correctly. All servers are accessible.'); ?></p> 160 189 <?php … … 162 191 } else { 163 192 ?> 164 <p style="padding: .5em; background-color: # d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p>193 <p style="padding: .5em; background-color: #888; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p> 165 194 <p><?php echo sprintf( __('A DNS problem or firewall is preventing all access from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p> 166 195 <?php … … 176 205 asort($servers); 177 206 foreach ( $servers as $ip => $status ) { 178 $color = ( $status ? '# 2d2' : '#d22');207 $color = ( $status ? '#4AB915' : '#888'); 179 208 ?> 180 209 <tr> 181 210 <td><?php echo htmlspecialchars($ip); ?></td> 182 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __(' No problems') : __('Obstructed') ); ?></td>211 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('Accessible') : __('Re-trying') ); ?></td> 183 212 184 213 <?php … … 190 219 <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p> 191 220 <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status »'); ?>" /></p> 221 <p><?php printf( __('<a href="%s" target="_blank">Click here</a> to confirm that <a href="%s" target="_blank">Akismet.com is up</a>.'), 'http://status.automattic.com/9931/136079/Akismet-API', 'http://status.automattic.com/9931/136079/Akismet-API' ); ?></p> 192 222 </form> 193 223 … … 207 237 <script type="text/javascript"> 208 238 function resizeIframe() { 209 var height = document.documentElement.clientHeight; 210 height -= document.getElementById('akismet-stats-frame').offsetTop; 211 height += 100; // magic padding 212 213 document.getElementById('akismet-stats-frame').style.height = height +"px"; 239 240 document.getElementById('akismet-stats-frame').style.height = "2500px"; 214 241 215 242 }; … … 225 252 function akismet_stats_display() { 226 253 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 227 $blog = urlencode( get_ option('home') );254 $blog = urlencode( get_bloginfo('url') ); 228 255 229 256 $url = 'http://'; … … 246 273 return; 247 274 $path = plugin_basename(__FILE__); 248 echo '<h3>' .__('Spam').'</h3>';275 echo '<h3>' . _x( 'Spam', 'comments' ) . '</h3>'; 249 276 global $submenu; 250 277 if ( isset( $submenu['edit-comments.php'] ) ) … … 252 279 else 253 280 $link = 'edit.php'; 254 echo '<p>'.sprintf( __('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>';281 echo '<p>'.sprintf( _n( '<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.', '<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.', $count ), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>'; 255 282 } 256 283 add_action('activity_box_end', 'akismet_stats'); … … 266 293 add_action('admin_notices', 'akismet_warning'); 267 294 return; 268 } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) {295 } elseif ( ( empty($_SERVER['SCRIPT_FILENAME']) || basename($_SERVER['SCRIPT_FILENAME']) == 'edit-comments.php' ) && wp_next_scheduled('akismet_schedule_cron_recheck') ) { 269 296 function akismet_warning() { 270 echo " 271 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('A server or network problem is preventing Akismet from working correctly. <a href="%1$s">Click here for more information</a> about how to fix the problem.'), "plugins.php?page=akismet-key-config")."</p></div> 297 global $wpdb; 298 $waiting = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); 299 $next_check = human_time_diff( wp_next_scheduled('akismet_schedule_cron_recheck') ); 300 if ( $waiting > 0 ) 301 echo " 302 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(_n('A server or network problem prevented Akismet from checking %d comment. It has been temporarily held for moderation and will be automatically re-checked in %s.', 'A server or network problem prevented Akismet from checking %d comments. They have been temporarily held for moderation and will be automatically re-checked in %s.', $waiting), number_format_i18n( $waiting ), $next_check)."</p></div> 272 303 "; 273 304 } … … 280 311 281 312 function akismet_comment_row_action( $a, $comment ) { 282 283 313 314 // failsafe for old WP versions 315 if ( !function_exists('add_comment_meta') ) 316 return $a; 317 284 318 $akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true ); 285 319 $user_result = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true); 320 $comment_status = wp_get_comment_status( $comment->comment_ID ); 286 321 $desc = null; 287 322 if ( !$user_result || $user_result == $akismet_result ) { 288 323 // Show the original Akismet result if the user hasn't overridden it, or if their decision was the same 289 if ( $akismet_result == 'true' )290 $desc = 'Flagged as spam by Akismet';291 elseif ( $akismet_result == 'false' )292 $desc = 'Cleared by Akismet';324 if ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' ) 325 $desc = __( 'Flagged as spam by Akismet' ); 326 elseif ( $akismet_result == 'false' && $comment_status == 'spam' ) 327 $desc = __( 'Cleared by Akismet' ); 293 328 } else { 294 329 $who = get_comment_meta( $comment->comment_ID, 'akismet_user', true ); … … 298 333 $desc = sprintf( __('Un-spammed by %s'), $who ); 299 334 } 300 335 336 // add a History item to the hover links, just after Edit 337 if ( $akismet_result ) { 338 $b = array(); 339 foreach ( $a as $k => $item ) { 340 $b[ $k ] = $item; 341 if ( $k == 'edit' ) 342 $b['history'] = '<a href="comment.php?action=editcomment&c='.$comment->comment_ID.'#akismet-status" title="'. esc_attr__( 'View comment history' ) . '"> '. __('History') . '</a>'; 343 } 344 345 $a = $b; 346 } 347 301 348 if ( $desc ) 302 echo '<span style="background: #EEE; border: 1px solid #E4E4E4; margin-top: 3px; color: #999; padding: 1px 8px 2px 8px; -moz-border-radius:6px; border-radius:6px; -webkit-border-radius:6px; float: right; line-height: 1.2em;"><a href="comment.php?action=editcomment&c='.$comment->comment_ID.'#akismet-status" title="' . esc_attr__( 'View comment history' ) . '">'.htmlspecialchars($desc).'</a></span>'; 349 echo '<span class="akismet-status" commentid="'.$comment->comment_ID.'"><a href="comment.php?action=editcomment&c='.$comment->comment_ID.'#akismet-status" title="' . esc_attr__( 'View comment history' ) . '">'.htmlspecialchars($desc).'</a></span>'; 350 351 if ( apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') ) == 'true' ) { 352 $comment_count = akismet_get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url ); 353 $comment_count = intval( $comment_count ); 354 echo '<span class="akismet-user-comment-count" commentid="'.$comment->comment_ID.'" style="display:none;"><br><span class="akismet-user-comment-counts">'.sprintf( _n( '%s approved', '%s approved', $comment_count ), number_format_i18n( $comment_count ) ) . '</span></span>'; 355 } 303 356 304 357 return $a; … … 306 359 307 360 add_filter( 'comment_row_actions', 'akismet_comment_row_action', 10, 2 ); 308 309 361 310 362 function akismet_comment_status_meta_box($comment) { … … 355 407 // END FIXME 356 408 409 // call out URLS in comments 410 function akismet_text_add_link_callback( $m ) { 411 412 // bare link? 413 if ( $m[4] == $m[2] ) 414 return '<a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a>'; 415 else 416 return '<span title="'.$m[2].'" class="comment-link"><a '.$m[1].' href="'.$m[2].'" '.$m[3].' class="comment-link">'.$m[4].'</a></span>'; 417 } 418 419 function akismet_text_add_link_class( $comment_text ) { 420 421 return preg_replace_callback( '#<a ([^>]*)href="([^"]+)"([^>]*)>(.*?)</a>#i', 'akismet_text_add_link_callback', $comment_text ); 422 } 423 424 add_filter('comment_text', 'akismet_text_add_link_class'); 425 426 357 427 // WP 2.5+ 358 428 function akismet_rightnow() { 359 429 global $submenu, $wp_db_version; 360 361 $plural_func = '__ngettext';362 if ( function_exists( '_n' ) )363 $plural_func = '_n';364 430 365 431 // clean_url was deprecated in WP 3.0 … … 376 442 377 443 if ( $count = get_option('akismet_spam_count') ) { 378 $intro = sprintf( $plural_func(379 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already ,',380 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already ,',444 $intro = sprintf( _n( 445 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already. ', 446 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already. ', 381 447 $count 382 448 ), 'http://akismet.com/', number_format_i18n( $count ) ); 383 449 } else { 384 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog ,'), 'http://akismet.com/' );450 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog. '), 'http://akismet.com/' ); 385 451 } 386 452 387 453 if ( $queue_count = akismet_spam_count() ) { 388 $queue_text = sprintf( $plural_func(389 ' and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',390 ' and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.',454 $queue_text = sprintf( _n( 455 'There\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 456 'There are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 391 457 $queue_count 392 458 ), number_format_i18n( $queue_count ), $esc_url($link) ); 393 459 } else { 394 $queue_text = sprintf( __( " but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 395 } 396 397 // _c was deprecated in WP 2.9.0 398 if ( function_exists( '_x' ) ) 399 $text = sprintf( _x( '%1$s%2$s', 'akismet_rightnow' ), $intro, $queue_text ); 400 else 401 $text = sprintf( _c( '%1$s%2$s|akismet_rightnow' ), $intro, $queue_text ); 402 460 $queue_text = sprintf( __( "There's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 461 } 462 463 $text = $intro . '<br />' . $queue_text; 403 464 echo "<p class='akismet-right-now'>$text</p>\n"; 404 465 } … … 426 487 if ( !$comment ) // it was deleted 427 488 return; 428 $comment->blog = get_option('home'); 489 490 // use the original version stored in comment_meta if available 491 $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); 492 if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { 493 $comment = (object) array_merge( (array)$comment, $as_submitted ); 494 } 495 496 $comment->blog = get_bloginfo('url'); 429 497 $comment->blog_lang = get_locale(); 430 498 $comment->blog_charset = get_option('blog_charset'); 431 499 $comment->permalink = get_permalink($comment->comment_post_ID); 500 $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; 432 501 if ( is_object($current_user) ) { 433 502 $comment->reporter = $current_user->user_login; … … 441 510 $comment->user_role = akismet_get_user_roles($comment->user_ID); 442 511 512 if ( akismet_test_mode() ) 513 $comment->is_test = 'true'; 514 443 515 $query_string = ''; 444 516 foreach ( $comment as $key => $data ) … … 447 519 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); 448 520 if ( $comment->reporter ) { 449 akismet_update_comment_history( $comment_id, sprintf( __('%s un-spammed this comment'), $comment->reporter ), 'report-ham' );521 akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as not spam'), $comment->reporter ), 'report-ham' ); 450 522 update_comment_meta( $comment_id, 'akismet_user_result', 'false' ); 451 523 update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); 452 } else {453 akismet_update_comment_history( $comment_id, 'A plugin un-spammed this comment', 'report-ham' );454 524 } 455 525 … … 466 536 if ( 'spam' != $comment->comment_approved ) 467 537 return; 468 $comment->blog = get_option('home'); 538 539 // use the original version stored in comment_meta if available 540 $as_submitted = get_comment_meta( $comment_id, 'akismet_as_submitted', true); 541 if ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) ) { 542 $comment = (object) array_merge( (array)$comment, $as_submitted ); 543 } 544 545 $comment->blog = get_bloginfo('url'); 469 546 $comment->blog_lang = get_locale(); 470 547 $comment->blog_charset = get_option('blog_charset'); 471 548 $comment->permalink = get_permalink($comment->comment_post_ID); 549 $comment->reporter_ip = $_SERVER['REMOTE_ADDR']; 472 550 if ( is_object($current_user) ) { 473 551 $comment->reporter = $current_user->user_login; … … 478 556 479 557 $comment->user_role = ''; 480 if ( !isset( $comment->user_id) )558 if ( isset( $comment->user_ID ) ) 481 559 $comment->user_role = akismet_get_user_roles($comment->user_ID); 560 561 if ( akismet_test_mode() ) 562 $comment->is_test = 'true'; 482 563 483 564 $query_string = ''; … … 487 568 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); 488 569 if ( $comment->reporter ) { 489 akismet_update_comment_history( $comment_id, sprintf( __('%s spammed this comment'), $comment->reporter ), 'report-spam' );570 akismet_update_comment_history( $comment_id, sprintf( __('%s reported this comment as spam'), $comment->reporter ), 'report-spam' ); 490 571 update_comment_meta( $comment_id, 'akismet_user_result', 'true' ); 491 572 update_comment_meta( $comment_id, 'akismet_user', $comment->reporter ); 492 } else 493 akismet_update_comment_history( $comment_id, 'A plugin spammed this comment', 'report-ham' ); 573 } 494 574 do_action('akismet_submit_spam_comment', $comment_id, $response[1]); 495 575 } … … 499 579 if ( $new_status == $old_status ) 500 580 return; 501 502 if ( $new_status == 'spam' ) { 503 akismet_submit_spam_comment( $comment->comment_ID ); 504 } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 505 akismet_submit_nonspam_comment( $comment->comment_ID ); 506 } 581 582 # we don't need to record a history item for deleted comments 583 if ( $new_status == 'delete' ) 584 return; 585 586 if ( !is_admin() ) 587 return; 588 589 if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) ) 590 return; 591 592 if ( defined('WP_IMPORTING') && WP_IMPORTING == true ) 593 return; 594 595 global $current_user; 596 $reporter = ''; 597 if ( is_object( $current_user ) ) 598 $reporter = $current_user->user_login; 599 600 // Assumption alert: 601 // We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status 602 // is changed automatically by another plugin. Unfortunately WordPress doesn't provide an unambiguous way to 603 // determine why the transition_comment_status action was triggered. And there are several different ways by which 604 // to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others. 605 // We'll assume that this is an explicit user action if POST or GET has an 'action' key. 606 if ( isset($_POST['action']) || isset($_GET['action']) ) { 607 if ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) { 608 return akismet_submit_spam_comment( $comment->comment_ID ); 609 } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 610 return akismet_submit_nonspam_comment( $comment->comment_ID ); 611 } 612 } 613 614 if ( !get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) ) 615 akismet_update_comment_history( $comment->comment_ID, sprintf( __('%s changed the comment status to %s'), $reporter, $new_status ), 'status-' . $new_status ); 507 616 } 508 617 … … 547 656 $c['user_agent'] = $c['comment_agent']; 548 657 $c['referrer'] = ''; 549 $c['blog'] = get_ option('home');658 $c['blog'] = get_bloginfo('url'); 550 659 $c['blog_lang'] = get_locale(); 551 660 $c['blog_charset'] = get_option('blog_charset'); … … 555 664 if ( isset( $c['user_ID'] ) ) 556 665 $c['user_role'] = akismet_get_user_roles($c['user_ID']); 666 667 if ( akismet_test_mode() ) 668 $c['is_test'] = 'true'; 557 669 558 670 $id = (int) $c['comment_ID']; … … 583 695 584 696 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); 697 698 // Check connectivity between the WordPress blog and Akismet's servers. 699 // 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). 700 function akismet_check_server_connectivity() { 701 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 702 703 $test_host = 'rest.akismet.com'; 704 705 // Some web hosts may disable one or both functions 706 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) 707 return array(); 708 709 $ips = gethostbynamel($test_host); 710 if ( !$ips || !is_array($ips) || !count($ips) ) 711 return array(); 712 713 $servers = array(); 714 foreach ( $ips as $ip ) { 715 $response = akismet_verify_key( akismet_get_key(), $ip ); 716 // even if the key is invalid, at least we know we have connectivity 717 if ( $response == 'valid' || $response == 'invalid' ) 718 $servers[$ip] = true; 719 else 720 $servers[$ip] = false; 721 } 722 723 return $servers; 724 } 725 726 // Check the server connectivity and store the results in an option. 727 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. 728 // Returns the same associative array as akismet_check_server_connectivity() 729 function akismet_get_server_connectivity( $cache_timeout = 86400 ) { 730 $servers = get_option('akismet_available_servers'); 731 if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) 732 return $servers; 733 734 // There's a race condition here but the effect is harmless. 735 $servers = akismet_check_server_connectivity(); 736 update_option('akismet_available_servers', $servers); 737 update_option('akismet_connectivity_time', time()); 738 return $servers; 739 } 740 741 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. 742 function akismet_server_connectivity_ok() { 743 // skip the check on WPMU because the status page is hidden 744 global $wpcom_api_key; 745 if ( $wpcom_api_key ) 746 return true; 747 $servers = akismet_get_server_connectivity(); 748 return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); 749 } 750 -
trunk/blogs/wp-content/plugins/akismet/akismet.php
r1877 r1879 6 6 Plugin Name: Akismet 7 7 Plugin URI: http://akismet.com/ 8 Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need an <a href="http://akismet.com/get/">API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code><?php akismet_counter(); ?></code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>.9 Version: 2. 4.08 Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/?return=true">Sign up for an Akismet API key</a>, and 3) Go to your <a href="plugins.php?page=akismet-key-config">Akismet configuration</a> page, and save your API key. 9 Version: 2.5.3 10 10 Author: Automattic 11 11 Author URI: http://automattic.com/wordpress-plugins/ 12 License: GPLv2 12 License: GPLv2 or later 13 13 */ 14 14 15 15 /* 16 This program is free software; you can redistribute it and/or modify 17 it under the terms of the GNU General Public License as published by 18 the Free Software Foundation; version 2 of the License. 19 20 This program is distributed in the hope that it will be useful, 21 but WITHOUT ANY WARRANTY; without even the implied warranty of 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 GNU General Public License for more details. 24 25 You should have received a copy of the GNU General Public License 26 along with this program; if not, write to the Free Software 27 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 16 This program is free software; you can redistribute it and/or 17 modify it under the terms of the GNU General Public License 18 as published by the Free Software Foundation; either version 2 19 of the License, or (at your option) any later version. 20 21 This program is distributed in the hope that it will be useful, 22 but WITHOUT ANY WARRANTY; without even the implied warranty of 23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24 GNU General Public License for more details. 25 26 You should have received a copy of the GNU General Public License 27 along with this program; if not, write to the Free Software 28 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 28 29 */ 29 30 30 define('AKISMET_VERSION', '2.4.0'); 31 define('AKISMET_VERSION', '2.5.3'); 32 define('AKISMET_PLUGIN_URL', plugin_dir_url( __FILE__ )); 31 33 32 34 /** If you hardcode a WP.com API key here, all key config screens will be hidden */ … … 42 44 } 43 45 44 if ( $wp_db_version <= 9872 ) 45 include_once( dirname(__FILE__) . '/legacy.php' ); 46 if ( isset($wp_db_version) && $wp_db_version <= 9872 ) 47 include_once dirname( __FILE__ ) . '/legacy.php'; 48 49 include_once dirname( __FILE__ ) . '/widget.php'; 50 51 if ( is_admin() ) 52 require_once dirname( __FILE__ ) . '/admin.php'; 46 53 47 54 function akismet_init() { … … 54 61 55 62 $akismet_api_port = 80; 56 add_action('admin_menu', 'akismet_config_page');57 add_action('admin_menu', 'akismet_stats_page');58 akismet_admin_warnings();59 63 } 60 64 add_action('init', 'akismet_init'); 61 62 function akismet_admin_init() {63 if ( function_exists( 'get_plugin_page_hook' ) )64 $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' );65 else66 $hook = 'dashboard_page_akismet-stats-display';67 add_action('admin_head-'.$hook, 'akismet_stats_script');68 }69 add_action('admin_init', 'akismet_admin_init');70 71 if ( !function_exists('wp_nonce_field') ) {72 function akismet_nonce_field($action = -1) { return; }73 $akismet_nonce = -1;74 } else {75 function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }76 $akismet_nonce = 'akismet-update-key';77 }78 79 if ( !function_exists('number_format_i18n') ) {80 function number_format_i18n( $number, $decimals = null ) { return number_format( $number, $decimals ); }81 }82 83 function akismet_config_page() {84 if ( function_exists('add_submenu_page') )85 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');86 87 }88 89 function akismet_conf() {90 global $akismet_nonce, $wpcom_api_key;91 92 if ( isset($_POST['submit']) ) {93 if ( function_exists('current_user_can') && !current_user_can('manage_options') )94 die(__('Cheatin’ uh?'));95 96 check_admin_referer( $akismet_nonce );97 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] );98 99 if ( empty($key) ) {100 $key_status = 'empty';101 $ms[] = 'new_key_empty';102 delete_option('wordpress_api_key');103 } else {104 $key_status = akismet_verify_key( $key );105 }106 107 if ( $key_status == 'valid' ) {108 update_option('wordpress_api_key', $key);109 $ms[] = 'new_key_valid';110 } else if ( $key_status == 'invalid' ) {111 $ms[] = 'new_key_invalid';112 } else if ( $key_status == 'failed' ) {113 $ms[] = 'new_key_failed';114 }115 116 if ( isset( $_POST['akismet_discard_month'] ) )117 update_option( 'akismet_discard_month', 'true' );118 else119 update_option( 'akismet_discard_month', 'false' );120 } elseif ( isset($_POST['check']) ) {121 akismet_get_server_connectivity(0);122 }123 124 if ( empty( $key_status) || $key_status != 'valid' ) {125 $key = get_option('wordpress_api_key');126 if ( empty( $key ) ) {127 if ( empty( $key_status ) || $key_status != 'failed' ) {128 if ( akismet_verify_key( '1234567890ab' ) == 'failed' )129 $ms[] = 'no_connection';130 else131 $ms[] = 'key_empty';132 }133 $key_status = 'empty';134 } else {135 $key_status = akismet_verify_key( $key );136 }137 if ( $key_status == 'valid' ) {138 $ms[] = 'key_valid';139 } else if ( $key_status == 'invalid' ) {140 delete_option('wordpress_api_key');141 $ms[] = 'key_empty';142 } else if ( !empty($key) && $key_status == 'failed' ) {143 $ms[] = 'key_failed';144 }145 }146 147 $messages = array(148 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')),149 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')),150 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')),151 'new_key_failed' => array('color' => 'd22', 'text' => __('The key you entered could not be verified because a connection to akismet.com could not be established. Please check your server configuration.')),152 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),153 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (<a href="%s" style="color:#fff">Get your key.</a>)'), 'http://akismet.com/get/')),154 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')),155 '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.')));156 ?>157 <?php if ( !empty($_POST['submit'] ) ) : ?>158 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>159 <?php endif; ?>160 <div class="wrap">161 <h2><?php _e('Akismet Configuration'); ?></h2>162 <div class="narrow">163 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">164 <?php if ( !$wpcom_api_key ) { ?>165 <p><?php printf(__('For many people, <a href="%1$s">Akismet</a> will greatly reduce or even completely eliminate the comment and trackback spam you get on your site. If one does happen to get through, simply mark it as "spam" on the moderation screen and Akismet will learn from the mistakes. If you don\'t have an API key yet, you can get one at <a href="%2$s">Akismet.com</a>.'), 'http://akismet.com/', 'http://akismet.com/get/'); ?></p>166 167 <h3><label for="key"><?php _e('Akismet API Key'); ?></label></h3>168 <?php foreach ( $ms as $m ) : ?>169 <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>170 <?php endforeach; ?>171 <p><input id="key" name="key" type="text" size="15" maxlength="12" value="<?php echo get_option('wordpress_api_key'); ?>" style="font-family: 'Courier New', Courier, mono; font-size: 1.5em;" /> (<?php _e('<a href="http://akismet.com/get/">What is this?</a>'); ?>)</p>172 <?php if ( isset( $invalid_key) && $invalid_key ) { ?>173 <h3><?php _e('Why might my key be invalid?'); ?></h3>174 <p><?php _e('This can mean one of two things, either you copied the key wrong or that the plugin is unable to reach the Akismet servers, which is most often caused by an issue with your web host around firewalls or similar.'); ?></p>175 <?php } ?>176 <?php } ?>177 <?php akismet_nonce_field($akismet_nonce) ?>178 <p><label><input name="akismet_discard_month" id="akismet_discard_month" value="true" type="checkbox" <?php if ( get_option('akismet_discard_month') == 'true' ) echo ' checked="checked" '; ?> /> <?php _e('Automatically discard spam comments on posts older than a month.'); ?></label></p>179 <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options »'); ?>" /></p>180 </form>181 182 <form action="" method="post" id="akismet-connectivity" style="margin: auto; width: 400px; ">183 184 <h3><?php _e('Server Connectivity'); ?></h3>185 <?php186 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) {187 ?>188 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p>189 <p><?php echo sprintf( __('Your web host or server administrator has disabled PHP\'s <code>fsockopen</code> or <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet\'s system requirements</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>190 <?php191 } else {192 $servers = akismet_get_server_connectivity();193 $fail_count = count($servers) - count( array_filter($servers) );194 if ( is_array($servers) && count($servers) > 0 ) {195 // some connections work, some fail196 if ( $fail_count > 0 && $fail_count < count($servers) ) { ?>197 <p style="padding: .5em; background-color: #aa0; color: #fff; font-weight:bold;"><?php _e('Unable to reach some Akismet servers.'); ?></p>198 <p><?php echo sprintf( __('A network problem or firewall is blocking some connections from your web server to Akismet.com. Akismet is working but this may cause problems during times of network congestion. Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>199 <?php200 // all connections fail201 } elseif ( $fail_count > 0 ) { ?>202 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p>203 <p><?php echo sprintf( __('A network problem or firewall is blocking all connections from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>204 <?php205 // all connections work206 } else { ?>207 <p style="padding: .5em; background-color: #2d2; color: #fff; font-weight:bold;"><?php _e('All Akismet servers are available.'); ?></p>208 <p><?php _e('Akismet is working correctly. All servers are accessible.'); ?></p>209 <?php210 }211 } else {212 ?>213 <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p>214 <p><?php echo sprintf( __('A DNS problem or firewall is preventing all access from your web server to Akismet.com. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet and firewalls</a>.'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>215 <?php216 }217 }218 219 if ( !empty($servers) ) {220 ?>221 <table style="width: 100%;">222 <thead><th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th></thead>223 <tbody>224 <?php225 asort($servers);226 foreach ( $servers as $ip => $status ) {227 $color = ( $status ? '#2d2' : '#d22');228 ?>229 <tr>230 <td><?php echo htmlspecialchars($ip); ?></td>231 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('No problems') : __('Obstructed') ); ?></td>232 233 <?php234 }235 }236 ?>237 </tbody>238 </table>239 <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p>240 <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status »'); ?>" /></p>241 </form>242 243 </div>244 </div>245 <?php246 }247 248 function akismet_stats_page() {249 if ( function_exists('add_submenu_page') )250 add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');251 252 }253 254 function akismet_stats_script() {255 ?>256 <script type="text/javascript">257 function resizeIframe() {258 var height = document.documentElement.clientHeight;259 height -= document.getElementById('akismet-stats-frame').offsetTop;260 height += 100; // magic padding261 262 document.getElementById('akismet-stats-frame').style.height = height +"px";263 264 };265 function resizeIframeInit() {266 document.getElementById('akismet-stats-frame').onload = resizeIframe;267 window.onresize = resizeIframe;268 }269 addLoadEvent(resizeIframeInit);270 </script><?php271 }272 273 274 function akismet_stats_display() {275 global $akismet_api_host, $akismet_api_port, $wpcom_api_key;276 $blog = urlencode( get_option('home') );277 $url = "http://".akismet_get_key().".web.akismet.com/1.0/user-stats.php?blog={$blog}";278 ?>279 <div class="wrap">280 <iframe src="<?php echo $url; ?>" width="100%" height="100%" frameborder="0" id="akismet-stats-frame"></iframe>281 </div>282 <?php283 }284 285 function akismet_stats() {286 if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section287 return;288 if ( !$count = get_option('akismet_spam_count') )289 return;290 $path = plugin_basename(__FILE__);291 echo '<h3>'.__('Spam').'</h3>';292 global $submenu;293 if ( isset( $submenu['edit-comments.php'] ) )294 $link = 'edit-comments.php';295 else296 $link = 'edit.php';297 echo '<p>'.sprintf(__('<a href="%1$s">Akismet</a> has protected your site from <a href="%2$s">%3$s spam comments</a>.'), 'http://akismet.com/', clean_url("$link?page=akismet-admin"), number_format_i18n($count) ).'</p>';298 }299 add_action('activity_box_end', 'akismet_stats');300 65 301 66 function akismet_get_key() { … … 317 82 } 318 83 319 // Check connectivity between the WordPress blog and Akismet's servers. 320 // 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). 321 function akismet_check_server_connectivity() { 322 global $akismet_api_host, $akismet_api_port, $wpcom_api_key; 323 324 $test_host = 'rest.akismet.com'; 325 326 // Some web hosts may disable one or both functions 327 if ( !function_exists('fsockopen') || !function_exists('gethostbynamel') ) 328 return array(); 329 330 $ips = gethostbynamel($test_host); 331 if ( !$ips || !is_array($ips) || !count($ips) ) 332 return array(); 333 334 $servers = array(); 335 foreach ( $ips as $ip ) { 336 $response = akismet_verify_key( akismet_get_key(), $ip ); 337 // even if the key is invalid, at least we know we have connectivity 338 if ( $response == 'valid' || $response == 'invalid' ) 339 $servers[$ip] = true; 340 else 341 $servers[$ip] = false; 342 } 343 344 return $servers; 345 } 346 347 // Check the server connectivity and store the results in an option. 348 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update. 349 // Returns the same associative array as akismet_check_server_connectivity() 350 function akismet_get_server_connectivity( $cache_timeout = 86400 ) { 351 $servers = get_option('akismet_available_servers'); 352 if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) 353 return $servers; 354 355 // There's a race condition here but the effect is harmless. 356 $servers = akismet_check_server_connectivity(); 357 update_option('akismet_available_servers', $servers); 358 update_option('akismet_connectivity_time', time()); 359 return $servers; 360 } 361 362 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed. 363 function akismet_server_connectivity_ok() { 364 // skip the check on WPMU because the status page is hidden 365 global $wpcom_api_key; 366 if ( $wpcom_api_key ) 84 // if we're in debug or test modes, use a reduced service level so as not to polute training or stats data 85 function akismet_test_mode() { 86 if ( defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE ) 367 87 return true; 368 $servers = akismet_get_server_connectivity(); 369 return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) ); 370 } 371 372 function akismet_admin_warnings() { 373 global $wpcom_api_key; 374 if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) { 375 function akismet_warning() { 376 echo " 377 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet is almost ready.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your Akismet API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div> 378 "; 379 } 380 add_action('admin_notices', 'akismet_warning'); 381 return; 382 } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) { 383 function akismet_warning() { 384 echo " 385 <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet has detected a problem.')."</strong> ".sprintf(__('A server or network problem is preventing Akismet from working correctly. <a href="%1$s">Click here for more information</a> about how to fix the problem.'), "plugins.php?page=akismet-key-config")."</p></div> 386 "; 387 } 388 add_action('admin_notices', 'akismet_warning'); 389 return; 390 } 391 } 392 393 function akismet_get_host($host) { 394 // if all servers are accessible, just return the host name. 395 // if not, return an IP that was known to be accessible at the last check. 396 if ( akismet_server_connectivity_ok() ) { 397 return $host; 398 } else { 399 $ips = akismet_get_server_connectivity(); 400 // a firewall may be blocking access to some Akismet IPs 401 if ( count($ips) > 0 && count(array_filter($ips)) < count($ips) ) { 402 // use DNS to get current IPs, but exclude any known to be unreachable 403 $dns = (array)gethostbynamel( rtrim($host, '.') . '.' ); 404 $dns = array_filter($dns); 405 foreach ( $dns as $ip ) { 406 if ( array_key_exists( $ip, $ips ) && empty( $ips[$ip] ) ) 407 unset($dns[$ip]); 408 } 409 // return a random IP from those available 410 if ( count($dns) ) 411 return $dns[ array_rand($dns) ]; 412 413 } 414 } 415 // if all else fails try the host name 416 return $host; 88 return false; 417 89 } 418 90 … … 429 101 $roles = join(',', $comment_user->roles); 430 102 } 431 103 104 if ( is_multisite() && is_super_admin( $user_id ) ) { 105 if ( empty( $roles ) ) { 106 $roles = 'super_admin'; 107 } else { 108 $comment_user->roles[] = 'super_admin'; 109 $roles = join( ',', $comment_user->roles ); 110 } 111 } 112 432 113 return $roles; 433 114 } … … 436 117 function akismet_http_post($request, $host, $path, $port = 80, $ip=null) { 437 118 global $wp_version; 438 439 $akismet_version = constant('AKISMET_VERSION'); 440 441 $http_request = "POST $path HTTP/1.0\r\n"; 442 $http_request .= "Host: $host\r\n"; 443 $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n"; 444 $http_request .= "Content-Length: " . strlen($request) . "\r\n"; 445 $http_request .= "User-Agent: WordPress/$wp_version | Akismet/$akismet_version\r\n"; 446 $http_request .= "\r\n"; 447 $http_request .= $request; 448 119 120 $akismet_ua = "WordPress/{$wp_version} | "; 121 $akismet_ua .= 'Akismet/' . constant( 'AKISMET_VERSION' ); 122 123 $content_length = strlen( $request ); 124 449 125 $http_host = $host; 450 // use a specific IP if provided - needed by akismet_check_server_connectivity() 451 if ( $ip && long2ip(ip2long($ip)) ) { 126 // use a specific IP if provided 127 // needed by akismet_check_server_connectivity() 128 if ( $ip && long2ip( ip2long( $ip ) ) ) { 452 129 $http_host = $ip; 453 130 } else { 454 $http_host = akismet_get_host($host); 455 } 456 457 $response = ''; 458 if( false != ( $fs = @fsockopen($http_host, $port, $errno, $errstr, 10) ) ) { 459 fwrite($fs, $http_request); 460 461 while ( !feof($fs) ) 462 $response .= fgets($fs, 1160); // One TCP-IP packet 463 fclose($fs); 464 $response = explode("\r\n\r\n", $response, 2); 465 } 466 return $response; 131 $http_host = $host; 132 } 133 134 // use the WP HTTP class if it is available 135 if ( function_exists( 'wp_remote_post' ) ) { 136 $http_args = array( 137 'body' => $request, 138 'headers' => array( 139 'Content-Type' => 'application/x-www-form-urlencoded; ' . 140 'charset=' . get_option( 'blog_charset' ), 141 'Host' => $host, 142 'User-Agent' => $akismet_ua 143 ), 144 'httpversion' => '1.0', 145 'timeout' => 15 146 ); 147 $akismet_url = "http://{$http_host}{$path}"; 148 $response = wp_remote_post( $akismet_url, $http_args ); 149 if ( is_wp_error( $response ) ) 150 return ''; 151 152 return array( $response['headers'], $response['body'] ); 153 } else { 154 $http_request = "POST $path HTTP/1.0\r\n"; 155 $http_request .= "Host: $host\r\n"; 156 $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=' . get_option('blog_charset') . "\r\n"; 157 $http_request .= "Content-Length: {$content_length}\r\n"; 158 $http_request .= "User-Agent: {$akismet_ua}\r\n"; 159 $http_request .= "\r\n"; 160 $http_request .= $request; 161 162 $response = ''; 163 if( false != ( $fs = @fsockopen( $http_host, $port, $errno, $errstr, 10 ) ) ) { 164 fwrite( $fs, $http_request ); 165 166 while ( !feof( $fs ) ) 167 $response .= fgets( $fs, 1160 ); // One TCP-IP packet 168 fclose( $fs ); 169 $response = explode( "\r\n\r\n", $response, 2 ); 170 } 171 return $response; 172 } 467 173 } 468 174 … … 472 178 if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 473 179 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 180 // this is a one-shot deal 181 remove_filter( 'pre_comment_approved', 'akismet_result_spam' ); 474 182 return 'spam'; 475 183 } 476 184 185 function akismet_result_hold( $approved ) { 186 // once only 187 remove_filter( 'pre_comment_approved', 'akismet_result_hold' ); 188 return '0'; 189 } 190 191 // how many approved comments does this author have? 192 function akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) { 193 global $wpdb; 194 195 if ( !empty($user_id) ) 196 return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d AND comment_approved = 1", $user_id ) ); 197 198 if ( !empty($comment_author_email) ) 199 return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1", $comment_author_email, $comment_author, $comment_author_url ) ); 200 201 return 0; 202 } 203 204 function akismet_microtime() { 205 $mtime = explode( ' ', microtime() ); 206 return $mtime[1] + $mtime[0]; 207 } 208 209 // log an event for a given comment, storing it in comment_meta 210 function akismet_update_comment_history( $comment_id, $message, $event=null ) { 211 global $current_user; 212 213 // failsafe for old WP versions 214 if ( !function_exists('add_comment_meta') ) 215 return false; 216 217 $user = ''; 218 if ( is_object($current_user) && isset($current_user->user_login) ) 219 $user = $current_user->user_login; 220 221 $event = array( 222 'time' => akismet_microtime(), 223 'message' => $message, 224 'event' => $event, 225 'user' => $user, 226 ); 227 228 // $unique = false so as to allow multiple values per comment 229 $r = add_comment_meta( $comment_id, 'akismet_history', $event, false ); 230 } 231 232 // get the full comment history for a given comment, as an array in reverse chronological order 233 function akismet_get_comment_history( $comment_id ) { 234 235 // failsafe for old WP versions 236 if ( !function_exists('add_comment_meta') ) 237 return false; 238 239 $history = get_comment_meta( $comment_id, 'akismet_history', false ); 240 usort( $history, 'akismet_cmp_time' ); 241 return $history; 242 } 243 244 function akismet_cmp_time( $a, $b ) { 245 return $a['time'] > $b['time'] ? -1 : 1; 246 } 247 248 // this fires on wp_insert_comment. we can't update comment_meta when akismet_auto_check_comment() runs 249 // because we don't know the comment ID at that point. 250 function akismet_auto_check_update_meta( $id, $comment ) { 251 global $akismet_last_comment; 252 253 // failsafe for old WP versions 254 if ( !function_exists('add_comment_meta') ) 255 return false; 256 257 // wp_insert_comment() might be called in other contexts, so make sure this is the same comment 258 // as was checked by akismet_auto_check_comment 259 if ( is_object($comment) && !empty($akismet_last_comment) && is_array($akismet_last_comment) ) { 260 if ( intval($akismet_last_comment['comment_post_ID']) == intval($comment->comment_post_ID) 261 && $akismet_last_comment['comment_author'] == $comment->comment_author 262 && $akismet_last_comment['comment_author_email'] == $comment->comment_author_email ) { 263 // normal result: true or false 264 if ( $akismet_last_comment['akismet_result'] == 'true' ) { 265 update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' ); 266 akismet_update_comment_history( $comment->comment_ID, __('Akismet caught this comment as spam'), 'check-spam' ); 267 if ( $comment->comment_approved != 'spam' ) 268 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed'.$comment->comment_approved ); 269 } elseif ( $akismet_last_comment['akismet_result'] == 'false' ) { 270 update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' ); 271 akismet_update_comment_history( $comment->comment_ID, __('Akismet cleared this comment'), 'check-ham' ); 272 if ( $comment->comment_approved == 'spam' ) { 273 if ( wp_blacklist_check($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent) ) 274 akismet_update_comment_history( $comment->comment_ID, __('Comment was caught by wp_blacklist_check'), 'wp-blacklisted' ); 275 else 276 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed-'.$comment->comment_approved ); 277 } 278 // abnormal result: error 279 } else { 280 update_comment_meta( $comment->comment_ID, 'akismet_error', time() ); 281 akismet_update_comment_history( $comment->comment_ID, sprintf( __('Akismet was unable to check this comment (response: %s), will automatically retry again later.'), $akismet_last_comment['akismet_result']), 'check-error' ); 282 } 283 284 // record the complete original data as submitted for checking 285 if ( isset($akismet_last_comment['comment_as_submitted']) ) 286 update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', $akismet_last_comment['comment_as_submitted'] ); 287 } 288 } 289 } 290 291 add_action( 'wp_insert_comment', 'akismet_auto_check_update_meta', 10, 2 ); 292 293 477 294 function akismet_auto_check_comment( $commentdata ) { 478 global $akismet_api_host, $akismet_api_port ;295 global $akismet_api_host, $akismet_api_port, $akismet_last_comment; 479 296 480 297 $comment = $commentdata; … … 489 306 $comment['user_role'] = akismet_get_user_roles($comment['user_ID']); 490 307 308 $akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); 309 $comment['akismet_comment_nonce'] = 'inactive'; 310 if ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) { 311 $comment['akismet_comment_nonce'] = 'failed'; 312 if ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) ) 313 $comment['akismet_comment_nonce'] = 'passed'; 314 315 // comment reply in wp-admin 316 if ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) ) 317 $comment['akismet_comment_nonce'] = 'passed'; 318 319 } 320 321 if ( akismet_test_mode() ) 322 $comment['is_test'] = 'true'; 323 324 foreach ($_POST as $key => $value ) { 325 if ( is_string($value) ) 326 $comment["POST_{$key}"] = $value; 327 } 328 491 329 $ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' ); 492 330 493 foreach ( $_SERVER as $key => $value ) 331 foreach ( $_SERVER as $key => $value ) { 494 332 if ( !in_array( $key, $ignore ) && is_string($value) ) 495 333 $comment["$key"] = $value; 496 334 else 497 335 $comment["$key"] = ''; 336 } 498 337 499 338 $query_string = ''; 500 339 foreach ( $comment as $key => $data ) 501 340 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 341 342 $commentdata['comment_as_submitted'] = $comment; 502 343 503 344 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); … … 518 359 if ( $incr = apply_filters('akismet_spam_count_incr', 1) ) 519 360 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr ); 520 die; 521 } 361 wp_redirect( $_SERVER['HTTP_REFERER'] ); 362 die(); 363 } 364 } 365 366 // if the response is neither true nor false, hold the comment for moderation and schedule a recheck 367 if ( 'true' != $response[1] && 'false' != $response[1] ) { 368 add_filter('pre_comment_approved', 'akismet_result_hold'); 369 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 522 370 } 523 371 … … 530 378 akismet_delete_old(); 531 379 } 380 $akismet_last_comment = $commentdata; 532 381 return $commentdata; 533 382 } 383 384 add_action('preprocess_comment', 'akismet_auto_check_comment', 1); 534 385 535 386 function akismet_delete_old() { … … 539 390 if ( empty( $comment_ids ) ) 540 391 return; 392 393 $comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) ); 541 394 542 395 do_action( 'delete_comment', $comment_ids ); 543 $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( " . implode( ', ', $comment_ids ) . " )"); 396 $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_id IN ( $comma_comment_ids )"); 397 $wpdb->query("DELETE FROM $wpdb->commentmeta WHERE comment_id IN ( $comma_comment_ids )"); 398 clean_comment_cache( $comment_ids ); 544 399 $n = mt_rand(1, 5000); 545 400 if ( apply_filters('akismet_optimize_table', ($n == 11)) ) // lucky number … … 550 405 add_action('akismet_scheduled_delete', 'akismet_delete_old'); 551 406 552 function akismet_submit_nonspam_comment ( $comment_id ) { 553 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 554 $comment_id = (int) $comment_id; 555 556 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 557 if ( !$comment ) // it was deleted 558 return; 559 $comment->blog = get_option('home'); 560 $comment->blog_lang = get_locale(); 561 $comment->blog_charset = get_option('blog_charset'); 562 $comment->permalink = get_permalink($comment->comment_post_ID); 563 if ( is_object($current_user) ) { 564 $comment->reporter = $current_user->user_login; 565 } 566 if ( is_object($current_site) ) { 567 $comment->site_domain = $current_site->domain; 568 } 569 570 $comment->user_role = ''; 571 if ( isset( $comment->user_ID ) ) 572 $comment->user_role = akismet_get_user_roles($comment->user_ID); 573 574 $query_string = ''; 575 foreach ( $comment as $key => $data ) 576 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 577 578 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port); 579 do_action('akismet_submit_nonspam_comment', $comment_id, $response[1]); 580 } 581 582 function akismet_submit_spam_comment ( $comment_id ) { 583 global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site; 584 $comment_id = (int) $comment_id; 585 586 $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'"); 587 if ( !$comment ) // it was deleted 588 return; 589 if ( 'spam' != $comment->comment_approved ) 590 return; 591 $comment->blog = get_option('home'); 592 $comment->blog_lang = get_locale(); 593 $comment->blog_charset = get_option('blog_charset'); 594 $comment->permalink = get_permalink($comment->comment_post_ID); 595 if ( is_object($current_user) ) { 596 $comment->reporter = $current_user->user_login; 597 } 598 if ( is_object($current_site) ) { 599 $comment->site_domain = $current_site->domain; 600 } 601 602 $comment->user_role = ''; 603 if ( !isset( $comment->user_id ) ) 604 $comment->user_role = akismet_get_user_roles($comment->user_ID); 605 606 $query_string = ''; 607 foreach ( $comment as $key => $data ) 608 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 609 610 $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port); 611 do_action('akismet_submit_spam_comment', $comment_id, $response[1]); 612 } 613 614 add_action('preprocess_comment', 'akismet_auto_check_comment', 1); 615 616 // For old versions of WP only 617 function akismet_set_comment_status( $comment_id, $status ) { 618 if ( $status == 'spam' ) { 619 akismet_submit_spam_comment( $comment_id ); 620 } elseif ( $status == 'approve' ) { 621 akismet_submit_nonspam_comment( $comment_id ); 622 } 623 } 624 625 // For WP 2.7+ 626 function akismet_transition_comment_status( $new_status, $old_status, $comment ) { 627 if ( $new_status == $old_status ) 628 return; 629 630 if ( $new_status == 'spam' ) { 631 akismet_submit_spam_comment( $comment->comment_ID ); 632 } elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) { 633 akismet_submit_nonspam_comment( $comment->comment_ID ); 634 } 635 } 636 637 function akismet_spamtoham( $comment ) { akismet_submit_nonspam_comment( $comment->comment_ID ); } 638 639 if ( function_exists( 'wp_transition_comment_status' ) ) { 640 add_action( 'transition_comment_status', 'akismet_transition_comment_status', 10, 3 ); 641 } else { 642 add_action('wp_set_comment_status', 'akismet_set_comment_status', 10, 2); 643 add_action('edit_comment', 'akismet_submit_spam_comment'); 644 add_filter( 'comment_spam_to_approved', 'akismet_spamtoham' ); 645 add_filter( 'comment_spam_to_unapproved', 'akismet_spamtoham' ); 646 } 647 // Total spam in queue 648 // get_option( 'akismet_spam_count' ) is the total caught ever 649 function akismet_spam_count( $type = false ) { 407 function akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) { 408 global $wpdb, $akismet_api_host, $akismet_api_port; 409 410 $id = (int) $id; 411 $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); 412 if ( !$c ) 413 return; 414 415 $c['user_ip'] = $c['comment_author_IP']; 416 $c['user_agent'] = $c['comment_agent']; 417 $c['referrer'] = ''; 418 $c['blog'] = get_option('home'); 419 $c['blog_lang'] = get_locale(); 420 $c['blog_charset'] = get_option('blog_charset'); 421 $c['permalink'] = get_permalink($c['comment_post_ID']); 422 $id = $c['comment_ID']; 423 if ( akismet_test_mode() ) 424 $c['is_test'] = 'true'; 425 $c['recheck_reason'] = $recheck_reason; 426 427 $query_string = ''; 428 foreach ( $c as $key => $data ) 429 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 430 431 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 432 return $response[1]; 433 } 434 435 function akismet_cron_recheck() { 650 436 global $wpdb; 651 437 652 if ( !$type ) { // total 653 $count = wp_cache_get( 'akismet_spam_count', 'widget' ); 654 if ( false === $count ) { 655 if ( function_exists('wp_count_comments') ) { 656 $count = wp_count_comments(); 657 $count = $count->spam; 658 } else { 659 $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'"); 438 delete_option('akismet_available_servers'); 439 440 $comment_errors = $wpdb->get_col( " 441 SELECT comment_id 442 FROM {$wpdb->prefix}commentmeta 443 WHERE meta_key = 'akismet_error' 444 LIMIT 100 445 " ); 446 447 foreach ( (array) $comment_errors as $comment_id ) { 448 // if the comment no longer exists, remove the meta entry from the queue to avoid getting stuck 449 if ( !get_comment( $comment_id ) ) { 450 delete_comment_meta( $comment_id, 'akismet_error' ); 451 continue; 452 } 453 454 add_comment_meta( $comment_id, 'akismet_rechecking', true ); 455 $status = akismet_check_db_comment( $comment_id, 'retry' ); 456 457 $msg = ''; 458 if ( $status == 'true' ) { 459 $msg = __( 'Akismet caught this comment as spam during an automatic retry.' ); 460 } elseif ( $status == 'false' ) { 461 $msg = __( 'Akismet cleared this comment during an automatic retry.' ); 462 } 463 464 // If we got back a legit response then update the comment history 465 // other wise just bail now and try again later. No point in 466 // re-trying all the comments once we hit one failure. 467 if ( !empty( $msg ) ) { 468 delete_comment_meta( $comment_id, 'akismet_error' ); 469 akismet_update_comment_history( $comment_id, $msg, 'cron-retry' ); 470 update_comment_meta( $comment_id, 'akismet_result', $status ); 471 // make sure the comment status is still pending. if it isn't, that means the user has already moved it elsewhere. 472 $comment = get_comment( $comment_id ); 473 if ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) { 474 if ( $status == 'true' ) { 475 wp_spam_comment( $comment_id ); 476 } elseif ( $status == 'false' ) { 477 // comment is good, but it's still in the pending queue. depending on the moderation settings 478 // we may need to change it to approved. 479 if ( check_comment($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent, $comment->comment_type) ) 480 wp_set_comment_status( $comment_id, 1 ); 481 } 660 482 } 661 wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 ); 662 } 663 return $count; 664 } elseif ( 'comments' == $type || 'comment' == $type ) { // comments 665 $type = ''; 666 } else { // pingback, trackback, ... 667 $type = $wpdb->escape( $type ); 668 } 669 670 return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'"); 671 } 672 673 674 // WP 2.5+ 675 function akismet_rightnow() { 676 global $submenu, $wp_db_version; 677 678 // clean_url was deprecated in WP 3.0 679 $esc_url = 'clean_url'; 680 if ( function_exists( 'esc_url' ) ) 681 $esc_url = 'esc_url'; 682 683 if ( 8645 < $wp_db_version ) // 2.7 684 $link = 'edit-comments.php?comment_status=spam'; 685 elseif ( isset( $submenu['edit-comments.php'] ) ) 686 $link = 'edit-comments.php?page=akismet-admin'; 687 else 688 $link = 'edit.php?page=akismet-admin'; 689 690 if ( $count = get_option('akismet_spam_count') ) { 691 $intro = sprintf( __ngettext( 692 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,', 693 '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,', 694 $count 695 ), 'http://akismet.com/', number_format_i18n( $count ) ); 696 } else { 697 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' ); 698 } 699 700 if ( $queue_count = akismet_spam_count() ) { 701 $queue_text = sprintf( __ngettext( 702 'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.', 703 'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.', 704 $queue_count 705 ), number_format_i18n( $queue_count ), clean_url($link) ); 706 } else { 707 $queue_text = sprintf( __( "but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), $esc_url($link) ); 708 } 709 710 // _c was deprecated in WP 2.9.0 711 if ( function_exists( '_x' ) ) 712 $text = sprintf( _x( '%1$s %2$s', 'akismet_rightnow' ), $intro, $queue_text ); 713 else 714 $text = sprintf( _c( '%1$s %2$s|akismet_rightnow' ), $intro, $queue_text ); 715 716 echo "<p class='akismet-right-now'>$text</p>\n"; 717 } 718 719 add_action('rightnow_end', 'akismet_rightnow'); 720 721 722 // For WP >= 2.5 723 function akismet_check_for_spam_button($comment_status) { 724 if ( 'approved' == $comment_status ) 725 return; 726 if ( function_exists('plugins_url') ) 727 $link = 'admin.php?action=akismet_recheck_queue'; 728 else 729 $link = 'edit-comments.php?page=akismet-admin&recheckqueue=true&noheader=true'; 730 echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>"; 731 } 732 add_action('manage_comments_nav', 'akismet_check_for_spam_button'); 733 734 function akismet_recheck_queue() { 735 global $wpdb, $akismet_api_host, $akismet_api_port; 736 737 if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) ) 738 return; 739 740 $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A ); 741 foreach ( (array) $moderation as $c ) { 742 $c['user_ip'] = $c['comment_author_IP']; 743 $c['user_agent'] = $c['comment_agent']; 744 $c['referrer'] = ''; 745 $c['blog'] = get_option('home'); 746 $c['blog_lang'] = get_locale(); 747 $c['blog_charset'] = get_option('blog_charset'); 748 $c['permalink'] = get_permalink($c['comment_post_ID']); 749 750 $c['user_role'] = ''; 751 if ( isset( $c['user_ID'] ) ) 752 $c['user_role'] = akismet_get_user_roles($c['user_ID']); 753 754 $id = (int) $c['comment_ID']; 755 756 $query_string = ''; 757 foreach ( $c as $key => $data ) 758 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 759 760 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 761 if ( 'true' == $response[1] ) { 762 if ( function_exists('wp_set_comment_status') ) 763 wp_set_comment_status($id, 'spam'); 764 else 765 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id"); 766 767 } 768 } 769 wp_redirect( $_SERVER['HTTP_REFERER'] ); 770 exit; 771 } 772 773 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue'); 774 775 function akismet_check_db_comment( $id ) { 776 global $wpdb, $akismet_api_host, $akismet_api_port; 777 778 $id = (int) $id; 779 $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A ); 780 if ( !$c ) 781 return; 782 783 $c['user_ip'] = $c['comment_author_IP']; 784 $c['user_agent'] = $c['comment_agent']; 785 $c['referrer'] = ''; 786 $c['blog'] = get_option('home'); 787 $c['blog_lang'] = get_locale(); 788 $c['blog_charset'] = get_option('blog_charset'); 789 $c['permalink'] = get_permalink($c['comment_post_ID']); 790 $id = $c['comment_ID']; 791 792 $query_string = ''; 793 foreach ( $c as $key => $data ) 794 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&'; 795 796 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port); 797 return $response[1]; 798 } 799 800 // Widget stuff 801 function widget_akismet_register() { 802 if ( function_exists('register_sidebar_widget') ) : 803 function widget_akismet($args) { 804 extract($args); 805 $options = get_option('widget_akismet'); 806 $count = number_format_i18n(get_option('akismet_spam_count')); 807 ?> 808 <?php echo $before_widget; ?> 809 <?php echo $before_title . $options['title'] . $after_title; ?> 810 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><?php printf( __( '%1$s %2$sspam comments%3$s %4$sblocked by%5$s<br />%6$sAkismet%7$s' ), '<span id="akismet1"><span id="akismetcount">' . $count . '</span>', '<span id="akismetsc">', '</span></span>', '<span id="akismet2"><span id="akismetbb">', '</span>', '<span id="akismeta">', '</span></span>' ); ?></a></div></div> 811 <?php echo $after_widget; ?> 812 <?php 813 } 814 815 function widget_akismet_style() { 816 $plugin_dir = '/wp-content/plugins'; 817 if ( defined( 'PLUGINDIR' ) ) 818 $plugin_dir = '/' . PLUGINDIR; 819 820 ?> 821 <style type="text/css"> 822 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 823 #aka:hover{border:none;text-decoration:none} 824 #aka:hover #akismet1{display:none} 825 #aka:hover #akismet2,#akismet1{display:block} 826 #akismet2{display:none;padding-top:2px} 827 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 828 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 829 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'), $plugin_dir; ?>/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px} 830 </style> 831 <?php 832 } 833 834 function widget_akismet_control() { 835 $options = $newoptions = get_option('widget_akismet'); 836 if ( isset( $_POST['akismet-submit'] ) && $_POST["akismet-submit"] ) { 837 $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"])); 838 if ( empty($newoptions['title']) ) $newoptions['title'] = __('Spam Blocked'); 839 } 840 if ( $options != $newoptions ) { 841 $options = $newoptions; 842 update_option('widget_akismet', $options); 843 } 844 $title = htmlspecialchars($options['title'], ENT_QUOTES); 845 ?> 846 <p><label for="akismet-title"><?php _e('Title:'); ?> <input style="width: 250px;" id="akismet-title" name="akismet-title" type="text" value="<?php echo $title; ?>" /></label></p> 847 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" /> 848 <?php 849 } 850 851 if ( function_exists( 'wp_register_sidebar_widget' ) ) { 852 wp_register_sidebar_widget( 'akismet', 'Akismet', 'widget_akismet', null, 'akismet'); 853 wp_register_widget_control( 'akismet', 'Akismet', 'widget_akismet_control', null, 75, 'akismet'); 854 } else { 855 register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet'); 856 register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet'); 857 } 858 if ( is_active_widget('widget_akismet') ) 859 add_action('wp_head', 'widget_akismet_style'); 860 endif; 861 } 862 863 add_action('init', 'widget_akismet_register'); 864 865 // Counter for non-widget users 866 function akismet_counter() { 867 $plugin_dir = '/wp-content/plugins'; 868 if ( defined( 'PLUGINDIR' ) ) 869 $plugin_dir = '/' . PLUGINDIR; 870 871 ?> 872 <style type="text/css"> 873 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none} 874 #aka:hover{border:none;text-decoration:none} 875 #aka:hover #akismet1{display:none} 876 #aka:hover #akismet2,#akismet1{display:block} 877 #akismet2{display:none;padding-top:2px} 878 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none} 879 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none} 880 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'), $plugin_dir; ?>/akismet/akismet.gif) no-repeat top left;border:none;color:#fff;font:11px 'Trebuchet MS','Myriad Pro',sans-serif;height:40px;line-height:100%;overflow:hidden;padding:8px 0 0;text-align:center;width:120px} 881 </style> 882 <?php 883 $count = number_format_i18n(get_option('akismet_spam_count')); 884 ?> 885 <div id="akismetwrap"><div id="akismetstats"><a id="aka" href="http://akismet.com" title=""><div id="akismet1"><span id="akismetcount"><?php echo $count; ?></span> <span id="akismetsc"><?php _e('spam comments') ?></span></div> <div id="akismet2"><span id="akismetbb"><?php _e('blocked by') ?></span><br /><span id="akismeta">Akismet</span></div></a></div></div> 886 <?php 887 } 888 889 ?> 483 } else { 484 delete_comment_meta( $comment_id, 'akismet_rechecking' ); 485 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 486 return; 487 } 488 } 489 490 $remaining = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->commentmeta WHERE meta_key = 'akismet_error'" ) ); 491 if ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) { 492 wp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' ); 493 } 494 } 495 add_action( 'akismet_schedule_cron_recheck', 'akismet_cron_recheck' ); 496 497 function akismet_add_comment_nonce( $post_id ) { 498 echo '<p style="display: none;">'; 499 wp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE ); 500 echo '</p>'; 501 } 502 503 $akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) ); 504 505 if ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' ) 506 add_action( 'comment_form', 'akismet_add_comment_nonce' ); 507 508 if ( '3.0.5' == $wp_version ) { 509 remove_filter( 'comment_text', 'wp_kses_data' ); 510 if ( is_admin() ) 511 add_filter( 'comment_text', 'wp_kses_post' ); 512 } -
trunk/blogs/wp-content/plugins/akismet/readme.txt
r1877 r1879 1 1 === Akismet === 2 Contributors: matt, ryan, andy, mdawaffe, tellyworth, automattic2 Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, automattic 3 3 Tags: akismet, comments, spam 4 Requires at least: 2.05 Tested up to: 3. 06 Stable tag: 2. 4.07 License: GPLv2 4 Requires at least: 3.0 5 Tested up to: 3.1 6 Stable tag: 2.5.3 7 License: GPLv2 or later 8 8 9 9 Akismet checks your comments against the Akismet web service to see if they look like spam or not. … … 14 14 review the spam it catches under your blog's "Comments" admin screen. 15 15 16 Want to show off how much spam Akismet has caught for you? Just put `<?php akismet_counter(); ?>` in your template. 16 Major new features in Akismet 2.5 include: 17 17 18 See also: [WP Stats plugin](http://wordpress.org/extend/plugins/stats/). 18 * A comment status history, so you can easily see which comments were caught or cleared by Akismet, and which were spammed or unspammed by a moderator 19 * Links are highlighted in the comment body, to reveal hidden or misleading links 20 * If your web host is unable to reach Akismet's servers, the plugin will automatically retry when your connection is back up 21 * Moderators can see the number of approved comments for each user 22 * Spam and Unspam reports now include more information, to help improve accuracy 19 23 20 PS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it. 24 PS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it. Keys are free for personal blogs, with paid subscriptions available for businesses and commercial sites. 21 25 22 26 == Installation == … … 27 31 28 32 == Changelog == 33 34 = 2.5.3 = 35 * Specify the license is GPL v2 or later 36 * Fix a bug that could result in orphaned commentmeta entries 37 * Include hotfix for WordPress 3.0.5 filter issue 38 39 = 2.5.2 = 40 41 * Properly format the comment count for author counts 42 * Look for super admins on multisite installs when looking up user roles 43 * Increase the HTTP request timeout 44 * Removed padding for author approved count 45 * Fix typo in function name 46 * Set Akismet stats iframe height to fixed 2500px. Better to have one tall scroll bar than two side by side. 47 48 = 2.5.1 = 49 50 * Fix a bug that caused the "Auto delete" option to fail to discard comments correctly 51 * Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce 52 * Fixed padding bug in "author" column of posts screen 53 * Added margin-top to "cleared by ..." badges on dashboard 54 * Fix possible error when calling akismet_cron_recheck() 55 * Fix more PHP warnings 56 * Clean up XHTML warnings for comment nonce 57 * Fix for possible condition where scheduled comment re-checks could get stuck 58 * Clean up the comment meta details after deleting a comment 59 * Only show the status badge if the comment status has been changed by someone/something other than Akismet 60 * Show a 'History' link in the row-actions 61 * Translation fixes 62 * Reduced font-size on author name 63 * Moved "flagged by..." notification to top right corner of comment container and removed heavy styling 64 * Hid "flagged by..." notification while on dashboard 65 66 = 2.5.0 = 67 68 * Track comment actions under 'Akismet Status' on the edit comment screen 69 * Fix a few remaining deprecated function calls ( props Mike Glendinning ) 70 * Use HTTPS for the stats IFRAME when wp-admin is using HTTPS 71 * Use the WordPress HTTP class if available 72 * Move the admin UI code to a separate file, only loaded when needed 73 * Add cron retry feature, to replace the old connectivity check 74 * Display Akismet status badge beside each comment 75 * Record history for each comment, and display it on the edit page 76 * Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham 77 * Highlight links in comment content 78 * New option, "Show the number of comments you've approved beside each comment author." 79 * New option, "Use a nonce on the comment form." 29 80 30 81 = 2.4.0 =
Note: See TracChangeset
for help on using the changeset viewer.
