]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-content/plugins/akismet/akismet.php
Wordpress 2.8.3-scripts
[autoinstalls/wordpress.git] / wp-content / plugins / akismet / akismet.php
1 <?php
2 /*
3 Plugin Name: Akismet
4 Plugin URI: http://akismet.com/
5 Description: Akismet checks your comments against the Akismet web service to see if they look like spam or not. You need a <a href="http://wordpress.com/api-keys/">WordPress.com API key</a> to use it. You can review the spam it catches under "Comments." To show off your Akismet stats just put <code>&lt;?php akismet_counter(); ?&gt;</code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>.
6 Version: 2.2.6
7 Author: Matt Mullenweg
8 Author URI: http://ma.tt/
9 */
10
11 define('AKISMET_VERSION', '2.2.6');
12
13 // If you hardcode a WP.com API key here, all key config screens will be hidden
14 if ( defined('WPCOM_API_KEY') )
15         $wpcom_api_key = constant('WPCOM_API_KEY');
16 else
17         $wpcom_api_key = '';
18
19 function akismet_init() {
20         global $wpcom_api_key, $akismet_api_host, $akismet_api_port;
21
22         if ( $wpcom_api_key )
23                 $akismet_api_host = $wpcom_api_key . '.rest.akismet.com';
24         else
25                 $akismet_api_host = get_option('wordpress_api_key') . '.rest.akismet.com';
26
27         $akismet_api_port = 80;
28         add_action('admin_menu', 'akismet_config_page');
29         add_action('admin_menu', 'akismet_stats_page');
30         akismet_admin_warnings();
31 }
32 add_action('init', 'akismet_init');
33
34 function akismet_admin_init() {
35         if ( function_exists( 'get_plugin_page_hook' ) )
36                 $hook = get_plugin_page_hook( 'akismet-stats-display', 'index.php' );
37         else
38                 $hook = 'dashboard_page_akismet-stats-display';
39         add_action('admin_head-'.$hook, 'akismet_stats_script');
40 }
41 add_action('admin_init', 'akismet_admin_init');
42
43 if ( !function_exists('wp_nonce_field') ) {
44         function akismet_nonce_field($action = -1) { return; }
45         $akismet_nonce = -1;
46 } else {
47         function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }
48         $akismet_nonce = 'akismet-update-key';
49 }
50
51 if ( !function_exists('number_format_i18n') ) {
52         function number_format_i18n( $number, $decimals = null ) { return number_format( $number, $decimals ); }
53 }
54
55 function akismet_config_page() {
56         if ( function_exists('add_submenu_page') )
57                 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
58
59 }
60
61 function akismet_conf() {
62         global $akismet_nonce, $wpcom_api_key;
63
64         if ( isset($_POST['submit']) ) {
65                 if ( function_exists('current_user_can') && !current_user_can('manage_options') )
66                         die(__('Cheatin&#8217; uh?'));
67
68                 check_admin_referer( $akismet_nonce );
69                 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] );
70
71                 if ( empty($key) ) {
72                         $key_status = 'empty';
73                         $ms[] = 'new_key_empty';
74                         delete_option('wordpress_api_key');
75                 } else {
76                         $key_status = akismet_verify_key( $key );
77                 }
78
79                 if ( $key_status == 'valid' ) {
80                         update_option('wordpress_api_key', $key);
81                         $ms[] = 'new_key_valid';
82                 } else if ( $key_status == 'invalid' ) {
83                         $ms[] = 'new_key_invalid';
84                 } else if ( $key_status == 'failed' ) {
85                         $ms[] = 'new_key_failed';
86                 }
87
88                 if ( isset( $_POST['akismet_discard_month'] ) )
89                         update_option( 'akismet_discard_month', 'true' );
90                 else
91                         update_option( 'akismet_discard_month', 'false' );
92         } elseif ( isset($_POST['check']) ) {
93                 akismet_get_server_connectivity(0);
94         }
95
96         if ( $key_status != 'valid' ) {
97                 $key = get_option('wordpress_api_key');
98                 if ( empty( $key ) ) {
99                         if ( $key_status != 'failed' ) {
100                                 if ( akismet_verify_key( '1234567890ab' ) == 'failed' )
101                                         $ms[] = 'no_connection';
102                                 else
103                                         $ms[] = 'key_empty';
104                         }
105                         $key_status = 'empty';
106                 } else {
107                         $key_status = akismet_verify_key( $key );
108                 }
109                 if ( $key_status == 'valid' ) {
110                         $ms[] = 'key_valid';
111                 } else if ( $key_status == 'invalid' ) {
112                         delete_option('wordpress_api_key');
113                         $ms[] = 'key_empty';
114                 } else if ( !empty($key) && $key_status == 'failed' ) {
115                         $ms[] = 'key_failed';
116                 }
117         }
118
119         $messages = array(
120                 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')),
121                 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')),
122                 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')),
123                 '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.')),
124                 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),
125                 'key_empty' => array('color' => 'aa0', 'text' => sprintf(__('Please enter an API key. (<a href="%s" style="color:#fff">Get your key.</a>)'), 'http://wordpress.com/profile/')),
126                 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')),
127                 '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 ?>
129 <?php if ( !empty($_POST['submit'] ) ) : ?>
130 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>
131 <?php endif; ?>
132 <div class="wrap">
133 <h2><?php _e('Akismet Configuration'); ?></h2>
134 <div class="narrow">
135 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">
136 <?php if ( !$wpcom_api_key ) { ?>
137         <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 a WordPress.com account yet, you can get one at <a href="%2$s">WordPress.com</a>.'), 'http://akismet.com/', 'http://wordpress.com/api-keys/'); ?></p>
138
139 <?php akismet_nonce_field($akismet_nonce) ?>
140 <h3><label for="key"><?php _e('WordPress.com API Key'); ?></label></h3>
141 <?php foreach ( $ms as $m ) : ?>
142         <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>
143 <?php endforeach; ?>
144 <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://faq.wordpress.com/2005/10/19/api-key/">What is this?</a>'); ?>)</p>
145 <?php if ( $invalid_key ) { ?>
146 <h3><?php _e('Why might my key be invalid?'); ?></h3>
147 <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>
148 <?php } ?>
149 <?php } ?>
150 <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>
151         <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options &raquo;'); ?>" /></p>
152 </form>
153
154 <form action="" method="post" id="akismet-connectivity" style="margin: auto; width: 400px; ">
155
156 <h3><?php _e('Server Connectivity'); ?></h3>
157 <?php
158         $servers = akismet_get_server_connectivity();
159         $fail_count = count($servers) - count( array_filter($servers) );
160         if ( is_array($servers) && count($servers) > 0 ) {
161                 // some connections work, some fail
162                 if ( $fail_count > 0 && $fail_count < count($servers) ) { ?>
163                         <p style="padding: .5em; background-color: #aa0; color: #fff; font-weight:bold;"><?php _e('Unable to reach some Akismet servers.'); ?></p>
164                         <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>
165                 <?php
166                 // all connections fail
167                 } elseif ( $fail_count > 0 ) { ?>
168                         <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to reach any Akismet servers.'); ?></p>
169                         <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>
170                 <?php
171                 // all connections work
172                 } else { ?>
173                         <p style="padding: .5em; background-color: #2d2; color: #fff; font-weight:bold;"><?php  _e('All Akismet servers are available.'); ?></p>
174                         <p><?php _e('Akismet is working correctly.  All servers are accessible.'); ?></p>
175                 <?php
176                 }
177         } elseif ( !is_callable('fsockopen') ) {
178                 ?>
179                         <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Network functions are disabled.'); ?></p>
180                         <p><?php echo sprintf( __('Your web host or server administrator has disabled PHP\'s <code>fsockopen</code> function.  <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>
181                 <?php
182         } else {
183                 ?>
184                         <p style="padding: .5em; background-color: #d22; color: #fff; font-weight:bold;"><?php _e('Unable to find Akismet servers.'); ?></p>
185                         <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>
186                 <?php
187         }
188         
189         if ( !empty($servers) ) {
190 ?>
191 <table style="width: 100%;">
192 <thead><th><?php _e('Akismet server'); ?></th><th><?php _e('Network Status'); ?></th></thead>
193 <tbody>
194 <?php
195                 asort($servers);
196                 foreach ( $servers as $ip => $status ) {
197                         $color = ( $status ? '#2d2' : '#d22');
198         ?>
199                 <tr>
200                 <td><?php echo htmlspecialchars($ip); ?></td>
201                 <td style="padding: 0 .5em; font-weight:bold; color: #fff; background-color: <?php echo $color; ?>"><?php echo ($status ? __('No problems') : __('Obstructed') ); ?></td>
202                 
203         <?php
204                 }
205         }
206 ?>
207 </tbody>
208 </table>
209         <p><?php if ( get_option('akismet_connectivity_time') ) echo sprintf( __('Last checked %s ago.'), human_time_diff( get_option('akismet_connectivity_time') ) ); ?></p>
210         <p class="submit"><input type="submit" name="check" value="<?php _e('Check network status &raquo;'); ?>" /></p>
211 </form>
212
213 </div>
214 </div>
215 <?php
216 }
217
218 function akismet_stats_page() {
219         if ( function_exists('add_submenu_page') )
220                 add_submenu_page('index.php', __('Akismet Stats'), __('Akismet Stats'), 'manage_options', 'akismet-stats-display', 'akismet_stats_display');
221
222 }
223
224 function akismet_stats_script() {
225         ?>
226 <script type="text/javascript">
227 function resizeIframe() {
228     var height = document.documentElement.clientHeight;
229     height -= document.getElementById('akismet-stats-frame').offsetTop;
230     height += 100; // magic padding
231     
232     document.getElementById('akismet-stats-frame').style.height = height +"px";
233     
234 };
235 function resizeIframeInit() {
236         document.getElementById('akismet-stats-frame').onload = resizeIframe;
237         window.onresize = resizeIframe;
238 }
239 addLoadEvent(resizeIframeInit);
240 </script><?php
241 }
242
243
244 function akismet_stats_display() {
245         global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
246         $blog = urlencode( get_option('home') );
247         $url = "http://".akismet_get_key().".web.akismet.com/1.0/user-stats.php?blog={$blog}";
248         ?>
249         <div class="wrap">
250         <iframe src="<?php echo $url; ?>" width="100%" height="100%" frameborder="0" id="akismet-stats-frame"></iframe>
251         </div>
252         <?php
253 }
254
255 function akismet_get_key() {
256         global $wpcom_api_key;
257         if ( !empty($wpcom_api_key) )
258                 return $wpcom_api_key;
259         return get_option('wordpress_api_key');
260 }
261
262 function akismet_verify_key( $key, $ip = null ) {
263         global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
264         $blog = urlencode( get_option('home') );
265         if ( $wpcom_api_key )
266                 $key = $wpcom_api_key;
267         $response = akismet_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $akismet_api_port, $ip);
268         if ( !is_array($response) || !isset($response[1]) || $response[1] != 'valid' && $response[1] != 'invalid' )
269                 return 'failed';
270         return $response[1];
271 }
272
273 // Check connectivity between the WordPress blog and Akismet's servers.
274 // 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).
275 function akismet_check_server_connectivity() {
276         global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
277         
278         $test_host = 'rest.akismet.com';
279         
280         // Some web hosts may disable one or both functions
281         if ( !is_callable('fsockopen') || !is_callable('gethostbynamel') )
282                 return array();
283         
284         $ips = gethostbynamel($test_host);
285         if ( !$ips || !is_array($ips) || !count($ips) )
286                 return array();
287                 
288         $servers = array();
289         foreach ( $ips as $ip ) {
290                 $response = akismet_verify_key( akismet_get_key(), $ip );
291                 // even if the key is invalid, at least we know we have connectivity
292                 if ( $response == 'valid' || $response == 'invalid' )
293                         $servers[$ip] = true;
294                 else
295                         $servers[$ip] = false;
296         }
297
298         return $servers;
299 }
300
301 // Check the server connectivity and store the results in an option.
302 // Cached results will be used if not older than the specified timeout in seconds; use $cache_timeout = 0 to force an update.
303 // Returns the same associative array as akismet_check_server_connectivity()
304 function akismet_get_server_connectivity( $cache_timeout = 86400 ) {
305         $servers = get_option('akismet_available_servers');
306         if ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false )
307                 return $servers;
308         
309         // There's a race condition here but the effect is harmless.
310         $servers = akismet_check_server_connectivity();
311         update_option('akismet_available_servers', $servers);
312         update_option('akismet_connectivity_time', time());
313         return $servers;
314 }
315
316 // Returns true if server connectivity was OK at the last check, false if there was a problem that needs to be fixed.
317 function akismet_server_connectivity_ok() {
318         $servers = akismet_get_server_connectivity();
319         return !( empty($servers) || !count($servers) || count( array_filter($servers) ) < count($servers) );
320 }
321
322 function akismet_admin_warnings() {
323         global $wpcom_api_key;
324         if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
325                 function akismet_warning() {
326                         echo "
327                         <div id='akismet-warning' class='updated fade'><p><strong>".__('Akismet is almost ready.')."</strong> ".sprintf(__('You must <a href="%1$s">enter your WordPress.com API key</a> for it to work.'), "plugins.php?page=akismet-key-config")."</p></div>
328                         ";
329                 }
330                 add_action('admin_notices', 'akismet_warning');
331                 return;
332         } elseif ( get_option('akismet_connectivity_time') && empty($_POST) && is_admin() && !akismet_server_connectivity_ok() ) {
333                 function akismet_warning() {
334                         echo "
335                         <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>
336                         ";
337                 }
338                 add_action('admin_notices', 'akismet_warning');
339                 return;
340         }
341 }
342
343 function akismet_get_host($host) {
344         // if all servers are accessible, just return the host name.
345         // if not, return an IP that was known to be accessible at the last check.
346         if ( akismet_server_connectivity_ok() ) {
347                 return $host;
348         } else {
349                 $ips = akismet_get_server_connectivity();
350                 // a firewall may be blocking access to some Akismet IPs
351                 if ( count($ips) > 0 && count(array_filter($ips)) < count($ips) ) {
352                         // use DNS to get current IPs, but exclude any known to be unreachable
353                         $dns = (array)gethostbynamel( rtrim($host, '.') . '.' );
354                         $dns = array_filter($dns);
355                         foreach ( $dns as $ip ) {
356                                 if ( array_key_exists( $ip, $ips ) && empty( $ips[$ip] ) )
357                                         unset($dns[$ip]);
358                         }
359                         // return a random IP from those available
360                         if ( count($dns) )
361                                 return $dns[ array_rand($dns) ];
362                         
363                 }
364         }
365         // if all else fails try the host name
366         return $host;
367 }
368
369 // Returns array with headers in $response[0] and body in $response[1]
370 function akismet_http_post($request, $host, $path, $port = 80, $ip=null) {
371         global $wp_version;
372         
373         $akismet_version = constant('AKISMET_VERSION');
374
375         $http_request  = "POST $path HTTP/1.0\r\n";
376         $http_request .= "Host: $host\r\n";
377         $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n";
378         $http_request .= "Content-Length: " . strlen($request) . "\r\n";
379         $http_request .= "User-Agent: WordPress/$wp_version | Akismet/$akismet_version\r\n";
380         $http_request .= "\r\n";
381         $http_request .= $request;
382         
383         $http_host = $host;
384         // use a specific IP if provided - needed by akismet_check_server_connectivity()
385         if ( $ip && long2ip(ip2long($ip)) ) {
386                 $http_host = $ip;
387         } else {
388                 $http_host = akismet_get_host($host);
389         }
390
391         $response = '';
392         if( false != ( $fs = @fsockopen($http_host, $port, $errno, $errstr, 10) ) ) {
393                 fwrite($fs, $http_request);
394
395                 while ( !feof($fs) )
396                         $response .= fgets($fs, 1160); // One TCP-IP packet
397                 fclose($fs);
398                 $response = explode("\r\n\r\n", $response, 2);
399         }
400         return $response;
401 }
402
403 function akismet_auto_check_comment( $comment ) {
404         global $akismet_api_host, $akismet_api_port;
405
406         $comment['user_ip']    = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] );
407         $comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
408         $comment['referrer']   = $_SERVER['HTTP_REFERER'];
409         $comment['blog']       = get_option('home');
410         $comment['blog_lang']  = get_locale();
411         $comment['blog_charset'] = get_option('blog_charset');
412         $comment['permalink']  = get_permalink($comment['comment_post_ID']);
413
414         $ignore = array( 'HTTP_COOKIE' );
415
416         foreach ( $_SERVER as $key => $value )
417                 if ( !in_array( $key, $ignore ) && is_string($value) )
418                         $comment["$key"] = $value;
419
420         $query_string = '';
421         foreach ( $comment as $key => $data )
422                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
423
424         $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
425         if ( 'true' == $response[1] ) {
426                 add_filter('pre_comment_approved', create_function('$a', 'return \'spam\';'));
427                 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + 1 );
428
429                 do_action( 'akismet_spam_caught' );
430
431                 $post = get_post( $comment['comment_post_ID'] );
432                 $last_updated = strtotime( $post->post_modified_gmt );
433                 $diff = time() - $last_updated;
434                 $diff = $diff / 86400;
435
436                 if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' )
437                         die;
438         }
439         akismet_delete_old();
440         return $comment;
441 }
442
443 function akismet_delete_old() {
444         global $wpdb;
445         $now_gmt = current_time('mysql', 1);
446         $wpdb->query("DELETE FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'");
447         $n = mt_rand(1, 5000);
448         if ( $n == 11 ) // lucky number
449                 $wpdb->query("OPTIMIZE TABLE $wpdb->comments");
450 }
451
452 function akismet_submit_nonspam_comment ( $comment_id ) {
453         global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
454         $comment_id = (int) $comment_id;
455         
456         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
457         if ( !$comment ) // it was deleted
458                 return;
459         $comment->blog = get_option('home');
460         $comment->blog_lang = get_locale();
461         $comment->blog_charset = get_option('blog_charset');
462         $comment->permalink = get_permalink($comment->comment_post_ID);
463         if ( is_object($current_user) ) {
464             $comment->reporter = $current_user->user_login;
465         }
466         if ( is_object($current_site) ) {
467                 $comment->site_domain = $current_site->domain;
468         }
469         $query_string = '';
470         foreach ( $comment as $key => $data )
471                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
472
473         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port);
474 }
475
476 function akismet_submit_spam_comment ( $comment_id ) {
477         global $wpdb, $akismet_api_host, $akismet_api_port, $current_user, $current_site;
478         $comment_id = (int) $comment_id;
479
480         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
481         if ( !$comment ) // it was deleted
482                 return;
483         if ( 'spam' != $comment->comment_approved )
484                 return;
485         $comment->blog = get_option('home');
486         $comment->blog_lang = get_locale();
487         $comment->blog_charset = get_option('blog_charset');
488         $comment->permalink = get_permalink($comment->comment_post_ID);
489         if ( is_object($current_user) ) {
490             $comment->reporter = $current_user->user_login;
491         }
492         if ( is_object($current_site) ) {
493                 $comment->site_domain = $current_site->domain;
494         }
495         $query_string = '';
496         foreach ( $comment as $key => $data )
497                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
498
499         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port);
500 }
501
502 add_action('wp_set_comment_status', 'akismet_submit_spam_comment');
503 add_action('edit_comment', 'akismet_submit_spam_comment');
504 add_action('preprocess_comment', 'akismet_auto_check_comment', 1);
505
506 function akismet_spamtoham( $comment ) { akismet_submit_nonspam_comment( $comment->comment_ID ); }
507 add_filter( 'comment_spam_to_approved', 'akismet_spamtoham' );
508
509 // Total spam in queue
510 // get_option( 'akismet_spam_count' ) is the total caught ever
511 function akismet_spam_count( $type = false ) {
512         global $wpdb;
513
514         if ( !$type ) { // total
515                 $count = wp_cache_get( 'akismet_spam_count', 'widget' );
516                 if ( false === $count ) {
517                         if ( function_exists('wp_count_comments') ) {
518                                 $count = wp_count_comments();
519                                 $count = $count->spam;
520                         } else {
521                                 $count = (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
522                         }
523                         wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );
524                 }
525                 return $count;
526         } elseif ( 'comments' == $type || 'comment' == $type ) { // comments
527                 $type = '';
528         } else { // pingback, trackback, ...
529                 $type  = $wpdb->escape( $type );
530         }
531
532         return (int) $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type'");
533 }
534
535 function akismet_spam_comments( $type = false, $page = 1, $per_page = 50 ) {
536         global $wpdb;
537
538         $page = (int) $page;
539         if ( $page < 2 )
540                 $page = 1;
541
542         $per_page = (int) $per_page;
543         if ( $per_page < 1 )
544                 $per_page = 50;
545
546         $start = ( $page - 1 ) * $per_page;
547         $end = $start + $per_page;
548
549         if ( $type ) {
550                 if ( 'comments' == $type || 'comment' == $type )
551                         $type = '';
552                 else
553                         $type = $wpdb->escape( $type );
554                 return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_type='$type' ORDER BY comment_date DESC LIMIT $start, $end");
555         }
556
557         // All
558         return $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_date DESC LIMIT $start, $end");
559 }
560
561 // Totals for each comment type
562 // returns array( type => count, ... )
563 function akismet_spam_totals() {
564         global $wpdb;
565         $totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" );
566         $return = array();
567         foreach ( $totals as $total )
568                 $return[$total->comment_type ? $total->comment_type : 'comment'] = $total->cc;
569         return $return;
570 }
571
572 function akismet_manage_page() {
573         global $wpdb, $submenu, $wp_db_version;
574
575         // WP 2.7 has its own spam management page
576         if ( 8645 <= $wp_db_version )
577                 return;
578
579         $count = sprintf(__('Akismet Spam (%s)'), akismet_spam_count());
580         if ( isset( $submenu['edit-comments.php'] ) )
581                 add_submenu_page('edit-comments.php', __('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught' );
582         elseif ( function_exists('add_management_page') )
583                 add_management_page(__('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught');
584 }
585
586 function akismet_caught() {
587         global $wpdb, $comment, $akismet_caught, $akismet_nonce;
588
589         akismet_recheck_queue();
590         if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) {
591                 check_admin_referer( $akismet_nonce );
592                 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
593                         die(__('You do not have sufficient permission to moderate comments.'));
594
595                 $i = 0;
596                 foreach ($_POST['not_spam'] as $comment):
597                         $comment = (int) $comment;
598                         if ( function_exists('wp_set_comment_status') )
599                                 wp_set_comment_status($comment, 'approve');
600                         else
601                                 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'");
602                         akismet_submit_nonspam_comment($comment);
603                         ++$i;
604                 endforeach;
605                 $to = add_query_arg( 'recovered', $i, $_SERVER['HTTP_REFERER'] );
606                 wp_redirect( $to );
607                 exit;
608         }
609         if ('delete' == $_POST['action']) {
610                 check_admin_referer( $akismet_nonce );
611                 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
612                         die(__('You do not have sufficient permission to moderate comments.'));
613
614                 $delete_time = $wpdb->escape( $_POST['display_time'] );
615                 $nuked = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" );
616                 wp_cache_delete( 'akismet_spam_count', 'widget' );
617                 $to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] );
618                 wp_redirect( $to );
619                 exit;
620         }
621
622 if ( isset( $_GET['recovered'] ) ) {
623         $i = (int) $_GET['recovered'];
624         echo '<div class="updated"><p>' . sprintf(__('%1$s comments recovered.'), $i) . "</p></div>";
625 }
626
627 if (isset( $_GET['deleted'] ) )
628         echo '<div class="updated"><p>' . __('All spam deleted.') . '</p></div>';
629
630 if ( isset( $GLOBALS['submenu']['edit-comments.php'] ) )
631         $link = 'edit-comments.php';
632 else
633         $link = 'edit.php';
634 ?>
635 <style type="text/css">
636 .akismet-tabs {
637         list-style: none;
638         margin: 0;
639         padding: 0;
640         clear: both;
641         border-bottom: 1px solid #ccc;
642         height: 31px;
643         margin-bottom: 20px;
644         background: #ddd;
645         border-top: 1px solid #bdbdbd;
646 }
647 .akismet-tabs li {
648         float: left;
649         margin: 5px 0 0 20px;
650 }
651 .akismet-tabs a {
652         display: block;
653         padding: 4px .5em 3px;
654         border-bottom: none;
655         color: #036;
656 }
657 .akismet-tabs .active a {
658         background: #fff;
659         border: 1px solid #ccc;
660         border-bottom: none;
661         color: #000;
662         font-weight: bold;
663         padding-bottom: 4px;
664 }
665 #akismetsearch {
666         float: right;
667         margin-top: -.5em;
668 }
669
670 #akismetsearch p {
671         margin: 0;
672         padding: 0;
673 }
674 </style>
675 <div class="wrap">
676 <h2><?php _e('Caught Spam') ?></h2>
677 <?php
678 $count = get_option( 'akismet_spam_count' );
679 if ( $count ) {
680 ?>
681 <p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format_i18n($count) ); ?></p>
682 <?php
683 }
684
685 $spam_count = akismet_spam_count();
686
687 if ( 0 == $spam_count ) {
688         echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>';
689         echo '</div>';
690 } else {
691         echo '<p>'.__('You can delete all of the spam from your database with a single click. This operation cannot be undone, so you may wish to check to ensure that no legitimate comments got through first. Spam is automatically deleted after 15 days, so don&#8217;t sweat it.').'</p>';
692 ?>
693 <?php if ( !isset( $_POST['s'] ) ) { ?>
694 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
695 <?php akismet_nonce_field($akismet_nonce) ?>
696 <input type="hidden" name="action" value="delete" />
697 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" class="button delete" name="Submit" value="<?php _e('Delete all'); ?>" />
698 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" />
699 </form>
700 <?php } ?>
701 </div>
702 <div class="wrap">
703 <?php if ( isset( $_POST['s'] ) ) { ?>
704 <h2><?php _e('Search'); ?></h2>
705 <?php } else { ?>
706 <?php echo '<p>'.__('These are the latest comments identified as spam by Akismet. If you see any mistakes, simply mark the comment as "not spam" and Akismet will learn from the submission. If you wish to recover a comment from spam, simply select the comment, and click Not Spam. After 15 days we clean out the junk for you.').'</p>'; ?>
707 <?php } ?>
708 <?php
709 if ( isset( $_POST['s'] ) ) {
710         $s = $wpdb->escape($_POST['s']);
711         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments  WHERE
712                 (comment_author LIKE '%$s%' OR
713                 comment_author_email LIKE '%$s%' OR
714                 comment_author_url LIKE ('%$s%') OR
715                 comment_author_IP LIKE ('%$s%') OR
716                 comment_content LIKE ('%$s%') ) AND
717                 comment_approved = 'spam'
718                 ORDER BY comment_date DESC");
719 } else {
720         if ( isset( $_GET['apage'] ) )
721                 $page = (int) $_GET['apage'];
722         else
723                 $page = 1;
724
725         if ( $page < 2 )
726                 $page = 1;
727
728         $current_type = false;
729         if ( isset( $_GET['ctype'] ) )
730                 $current_type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] );
731
732         $comments = akismet_spam_comments( $current_type, $page );
733         $total = akismet_spam_count( $current_type );
734         $totals = akismet_spam_totals();
735 ?>
736 <ul class="akismet-tabs">
737 <li <?php if ( !isset( $_GET['ctype'] ) ) echo ' class="active"'; ?>><a href="edit-comments.php?page=akismet-admin"><?php _e('All'); ?></a></li>
738 <?php
739 foreach ( $totals as $type => $type_count ) {
740         if ( 'comment' == $type ) {
741                 $type = 'comments';
742                 $show = __('Comments');
743         } else {
744                 $show = ucwords( $type );
745         }
746         $type_count = number_format_i18n( $type_count );
747         $extra = $current_type === $type ? ' class="active"' : '';
748         echo "<li $extra><a href='edit-comments.php?page=akismet-admin&amp;ctype=$type'>$show ($type_count)</a></li>";
749 }
750 do_action( 'akismet_tabs' ); // so plugins can add more tabs easily
751 ?>
752 </ul>
753 <?php
754 }
755
756 if ($comments) {
757 ?>
758 <form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch">
759 <p>  <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" />
760   <input type="submit" class="button" name="submit" value="<?php echo attribute_escape(__('Search Spam &raquo;')) ?>"  />  </p>
761 </form>
762 <?php if ( $total > 50 ) {
763 $total_pages = ceil( $total / 50 );
764 $r = '';
765 if ( 1 < $page ) {
766         $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
767         $r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
768 }
769 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
770         for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
771                 if ( $page == $page_num ) :
772                         $r .=  "<strong>$page_num</strong>\n";
773                 else :
774                         $p = false;
775                         if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :
776                                 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;
777                                 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";
778                                 $in = true;
779                         elseif ( $in == true ) :
780                                 $r .= "...\n";
781                                 $in = false;
782                         endif;
783                 endif;
784         endfor;
785 }
786 if ( ( $page ) * 50 < $total || -1 == $total ) {
787         $args['apage'] = $page + 1;
788         $r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
789 }
790 echo "<p>$r</p>";
791 ?>
792
793 <?php } ?>
794 <form style="clear: both;" method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
795 <?php akismet_nonce_field($akismet_nonce) ?>
796 <input type="hidden" name="action" value="recover" />
797 <ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;">
798 <?php
799 $i = 0;
800 foreach($comments as $comment) {
801         $i++;
802         $comment_date = mysql2date(get_option("date_format") . " @ " . get_option("time_format"), $comment->comment_date);
803         $post = get_post($comment->comment_post_ID);
804         $post_title = $post->post_title;
805         if ($i % 2) $class = 'class="alternate"';
806         else $class = '';
807         echo "\n\t<li id='comment-$comment->comment_ID' $class>";
808         ?>
809
810 <p><strong><?php comment_author() ?></strong> <?php if ($comment->comment_author_email) { ?>| <?php comment_author_email_link() ?> <?php } if ($comment->comment_author_url && 'http://' != $comment->comment_author_url) { ?> | <?php comment_author_url_link() ?> <?php } ?>| <?php _e('IP:') ?> <a href="http://ws.arin.net/cgi-bin/whois.pl?queryinput=<?php comment_author_IP() ?>"><?php comment_author_IP() ?></a></p>
811
812 <?php comment_text() ?>
813
814 <p><label for="spam-<?php echo $comment->comment_ID; ?>">
815 <input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" />
816 <?php _e('Not Spam') ?></label> &#8212; <?php comment_date('M j, g:i A');  ?> &#8212; [
817 <?php
818 $post = get_post($comment->comment_post_ID);
819 $post_title = wp_specialchars( $post->post_title, 'double' );
820 $post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
821 ?>
822  <a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] </p>
823
824
825 <?php
826 }
827 ?>
828 </ul>
829 <?php if ( $total > 50 ) {
830 $total_pages = ceil( $total / 50 );
831 $r = '';
832 if ( 1 < $page ) {
833         $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
834         $r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
835 }
836 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
837         for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
838                 if ( $page == $page_num ) :
839                         $r .=  "<strong>$page_num</strong>\n";
840                 else :
841                         $p = false;
842                         if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :
843                                 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;
844                                 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";
845                                 $in = true;
846                         elseif ( $in == true ) :
847                                 $r .= "...\n";
848                                 $in = false;
849                         endif;
850                 endif;
851         endfor;
852 }
853 if ( ( $page ) * 50 < $total || -1 == $total ) {
854         $args['apage'] = $page + 1;
855         $r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
856 }
857 echo "<p>$r</p>";
858 }
859 ?>
860 <p class="submit">
861 <input type="submit" name="submit" value="<?php echo attribute_escape(__('De-spam marked comments &raquo;')); ?>" />
862 </p>
863 <p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p>
864 </form>
865 <?php
866 } else {
867 ?>
868 <p><?php _e('No results found.'); ?></p>
869 <?php } ?>
870
871 <?php if ( !isset( $_POST['s'] ) ) { ?>
872 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
873 <?php akismet_nonce_field($akismet_nonce) ?>
874 <p><input type="hidden" name="action" value="delete" />
875 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" class="button" value="<?php echo attribute_escape(__('Delete all')); ?>" />
876 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p>
877 </form>
878 <?php } ?>
879 </div>
880 <?php
881         }
882 }
883
884 add_action('admin_menu', 'akismet_manage_page');
885
886 // WP < 2.5
887 function akismet_stats() {
888         if ( !function_exists('did_action') || did_action( 'rightnow_end' ) ) // We already displayed this info in the "Right Now" section
889                 return;
890         if ( !$count = get_option('akismet_spam_count') )
891                 return;
892         $path = plugin_basename(__FILE__);
893         echo '<h3>'.__('Spam').'</h3>';
894         global $submenu;
895         if ( isset( $submenu['edit-comments.php'] ) )
896                 $link = 'edit-comments.php';
897         else
898                 $link = 'edit.php';
899         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>';
900 }
901
902 add_action('activity_box_end', 'akismet_stats');
903
904 // WP 2.5+
905 function akismet_rightnow() {
906         global $submenu, $wp_db_version;
907
908         if ( 8645 < $wp_db_version  ) // 2.7
909                 $link = 'edit-comments.php?comment_status=spam';
910         elseif ( isset( $submenu['edit-comments.php'] ) )
911                 $link = 'edit-comments.php?page=akismet-admin';
912         else
913                 $link = 'edit.php?page=akismet-admin';
914
915         if ( $count = get_option('akismet_spam_count') ) {
916                 $intro = sprintf( __ngettext(
917                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comment already,',
918                         '<a href="%1$s">Akismet</a> has protected your site from %2$s spam comments already,',
919                         $count
920                 ), 'http://akismet.com/', number_format_i18n( $count ) );
921         } else {
922                 $intro = sprintf( __('<a href="%1$s">Akismet</a> blocks spam from getting to your blog,'), 'http://akismet.com/' );
923         }
924
925         if ( $queue_count = akismet_spam_count() ) {
926                 $queue_text = sprintf( __ngettext(
927                         'and there\'s <a href="%2$s">%1$s comment</a> in your spam queue right now.',
928                         'and there are <a href="%2$s">%1$s comments</a> in your spam queue right now.',
929                         $queue_count
930                 ), number_format_i18n( $queue_count ), clean_url($link) );
931         } else {
932                 $queue_text = sprintf( __( "but there's nothing in your <a href='%1\$s'>spam queue</a> at the moment." ), clean_url($link) );
933         }
934
935         $text = sprintf( _c( '%1$s %2$s|akismet_rightnow' ), $intro, $queue_text );
936
937         echo "<p class='akismet-right-now'>$text</p>\n";
938 }
939         
940 add_action('rightnow_end', 'akismet_rightnow');
941
942 // For WP <= 2.3.x
943 if ( 'moderation.php' == $pagenow ) {
944         function akismet_recheck_button( $page ) {
945                 global $submenu;
946                 if ( isset( $submenu['edit-comments.php'] ) )
947                         $link = 'edit-comments.php';
948                 else
949                         $link = 'edit.php';
950                 $button = "<a href='$link?page=akismet-admin&amp;recheckqueue=true&amp;noheader=true' style='display: block; width: 100px; position: absolute; right: 7%; padding: 5px; font-size: 14px; text-decoration: underline; background: #fff; border: 1px solid #ccc;'>" . __('Recheck Queue for Spam') . "</a>";
951                 $page = str_replace( '<div class="wrap">', '<div class="wrap">' . $button, $page );
952                 return $page;
953         }
954
955         if ( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" ) )
956                 ob_start( 'akismet_recheck_button' );
957 }
958
959 // For WP >= 2.5
960 function akismet_check_for_spam_button($comment_status) {
961         if ( 'approved' == $comment_status )
962                 return;
963         if ( function_exists('plugins_url') )
964                 $link = 'admin.php?action=akismet_recheck_queue';
965         else
966                 $link = 'edit-comments.php?page=akismet-admin&amp;recheckqueue=true&amp;noheader=true';
967         echo "</div><div class='alignleft'><a class='button-secondary checkforspam' href='$link'>" . __('Check for Spam') . "</a>";
968 }
969 add_action('manage_comments_nav', 'akismet_check_for_spam_button');
970
971 function akismet_recheck_queue() {
972         global $wpdb, $akismet_api_host, $akismet_api_port;
973
974         if ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )
975                 return;
976
977         $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A );
978         foreach ( (array) $moderation as $c ) {
979                 $c['user_ip']    = $c['comment_author_IP'];
980                 $c['user_agent'] = $c['comment_agent'];
981                 $c['referrer']   = '';
982                 $c['blog']       = get_option('home');
983                 $c['blog_lang']  = get_locale();
984                 $c['blog_charset'] = get_option('blog_charset');
985                 $c['permalink']  = get_permalink($c['comment_post_ID']);
986                 $id = (int) $c['comment_ID'];
987
988                 $query_string = '';
989                 foreach ( $c as $key => $data )
990                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
991
992                 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
993                 if ( 'true' == $response[1] ) {
994                         $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id" );
995                 }
996         }
997         wp_redirect( $_SERVER['HTTP_REFERER'] );
998         exit;
999 }
1000
1001 add_action('admin_action_akismet_recheck_queue', 'akismet_recheck_queue');
1002
1003 function akismet_check_db_comment( $id ) {
1004         global $wpdb, $akismet_api_host, $akismet_api_port;
1005
1006         $id = (int) $id;
1007         $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A );
1008         if ( !$c )
1009                 return;
1010
1011         $c['user_ip']    = $c['comment_author_IP'];
1012         $c['user_agent'] = $c['comment_agent'];
1013         $c['referrer']   = '';
1014         $c['blog']       = get_option('home');
1015         $c['blog_lang']  = get_locale();
1016         $c['blog_charset'] = get_option('blog_charset');
1017         $c['permalink']  = get_permalink($c['comment_post_ID']);
1018         $id = $c['comment_ID'];
1019
1020         $query_string = '';
1021         foreach ( $c as $key => $data )
1022         $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
1023
1024         $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
1025         return $response[1];
1026 }
1027
1028 // This option causes tons of FPs, was removed in 2.1
1029 function akismet_kill_proxy_check( $option ) { return 0; }
1030 add_filter('option_open_proxy_check', 'akismet_kill_proxy_check');
1031
1032 // Widget stuff
1033 function widget_akismet_register() {
1034         if ( function_exists('register_sidebar_widget') ) :
1035         function widget_akismet($args) {
1036                 extract($args);
1037                 $options = get_option('widget_akismet');
1038                 $count = number_format_i18n(get_option('akismet_spam_count'));
1039                 ?>
1040                         <?php echo $before_widget; ?>
1041                                 <?php echo $before_title . $options['title'] . $after_title; ?>
1042                                 <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' ), '<div id="akismet1"><span id="akismetcount">' . $count . '</span>', '<span id="akismetsc">', '</span></div>', '<div id="akismet2"><span id="akismetbb">', '</span>', '<span id="akismeta">', '</span></div>' ); ?></a></div></div>
1043                         <?php echo $after_widget; ?>
1044         <?php
1045         }
1046
1047         function widget_akismet_style() {
1048                 ?>
1049 <style type="text/css">
1050 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}
1051 #aka:hover{border:none;text-decoration:none}
1052 #aka:hover #akismet1{display:none}
1053 #aka:hover #akismet2,#akismet1{display:block}
1054 #akismet2{display:none;padding-top:2px}
1055 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}
1056 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}
1057 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'); ?>/wp-content/plugins/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}
1058 </style>
1059                 <?php
1060         }
1061
1062         function widget_akismet_control() {
1063                 $options = $newoptions = get_option('widget_akismet');
1064                 if ( $_POST["akismet-submit"] ) {
1065                         $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"]));
1066                         if ( empty($newoptions['title']) ) $newoptions['title'] = 'Spam Blocked';
1067                 }
1068                 if ( $options != $newoptions ) {
1069                         $options = $newoptions;
1070                         update_option('widget_akismet', $options);
1071                 }
1072                 $title = htmlspecialchars($options['title'], ENT_QUOTES);
1073         ?>
1074                                 <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>
1075                                 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" />
1076         <?php
1077         }
1078
1079         register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet');
1080         register_widget_control('Akismet', 'widget_akismet_control', null, 75, 'akismet');
1081         if ( is_active_widget('widget_akismet') )
1082                 add_action('wp_head', 'widget_akismet_style');
1083         endif;
1084 }
1085
1086 add_action('init', 'widget_akismet_register');
1087
1088 // Counter for non-widget users
1089 function akismet_counter() {
1090 ?>
1091 <style type="text/css">
1092 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}
1093 #aka:hover{border:none;text-decoration:none}
1094 #aka:hover #akismet1{display:none}
1095 #aka:hover #akismet2,#akismet1{display:block}
1096 #akismet2{display:none;padding-top:2px}
1097 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}
1098 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}
1099 #akismetwrap #akismetstats{background:url(<?php echo get_option('siteurl'); ?>/wp-content/plugins/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}
1100 </style>
1101 <?php
1102 $count = number_format_i18n(get_option('akismet_spam_count'));
1103 ?>
1104 <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>
1105 <?php
1106 }
1107
1108 ?>