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