Wordpress 2.3.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(); ?></code> in your template. See also: <a href="http://wordpress.org/extend/plugins/stats/">WP Stats plugin</a>.
6 Version: 2.1.3
7 Author: Matt Mullenweg
8 Author URI: http://photomatt.net/
9 */
10
11 // If you hardcode a WP.com API key here, all key config screens will be hidden
12 $wpcom_api_key = '';
13
14 function akismet_init() {
15         global $wpcom_api_key, $akismet_api_host, $akismet_api_port;
16
17         if ( $wpcom_api_key )
18                 $akismet_api_host = $wpcom_api_key . '.rest.akismet.com';
19         else
20                 $akismet_api_host = get_option('wordpress_api_key') . '.rest.akismet.com';
21
22         $akismet_api_port = 80;
23         add_action('admin_menu', 'akismet_config_page');
24 }
25 add_action('init', 'akismet_init');
26
27 if ( !function_exists('wp_nonce_field') ) {
28         function akismet_nonce_field($action = -1) { return; }
29         $akismet_nonce = -1;
30 } else {
31         function akismet_nonce_field($action = -1) { return wp_nonce_field($action); }
32         $akismet_nonce = 'akismet-update-key';
33 }
34
35 function akismet_config_page() {
36         if ( function_exists('add_submenu_page') )
37                 add_submenu_page('plugins.php', __('Akismet Configuration'), __('Akismet Configuration'), 'manage_options', 'akismet-key-config', 'akismet_conf');
38         
39 }
40
41 function akismet_conf() {
42         global $akismet_nonce, $wpcom_api_key;
43
44         if ( isset($_POST['submit']) ) {
45                 if ( function_exists('current_user_can') && !current_user_can('manage_options') )
46                         die(__('Cheatin&#8217; uh?'));
47
48                 check_admin_referer( $akismet_nonce );
49                 $key = preg_replace( '/[^a-h0-9]/i', '', $_POST['key'] );
50
51                 if ( empty($key) ) {
52                         $key_status = 'empty';
53                         $ms[] = 'new_key_empty';
54                         delete_option('wordpress_api_key');
55                 } else {
56                         $key_status = akismet_verify_key( $key );
57                 }
58
59                 if ( $key_status == 'valid' ) {
60                         update_option('wordpress_api_key', $key);
61                         $ms[] = 'new_key_valid';
62                 } else if ( $key_status == 'invalid' ) {
63                         $ms[] = 'new_key_invalid';
64                 } else if ( $key_status == 'failed' ) {
65                         $ms[] = 'new_key_failed';
66                 }
67
68                 if ( isset( $_POST['akismet_discard_month'] ) )
69                         update_option( 'akismet_discard_month', 'true' );
70                 else
71                         update_option( 'akismet_discard_month', 'false' );
72         }
73
74         if ( $key_status != 'valid' ) {
75                 $key = get_option('wordpress_api_key');
76                 if ( empty( $key ) ) {
77                         if ( $key_status != 'failed' ) {
78                                 if ( akismet_verify_key( '1234567890ab' ) == 'failed' )
79                                         $ms[] = 'no_connection';
80                                 else
81                                         $ms[] = 'key_empty';
82                         }
83                         $key_status = 'empty';
84                 } else {
85                         $key_status = akismet_verify_key( $key );
86                 }
87                 if ( $key_status == 'valid' ) {
88                         $ms[] = 'key_valid';
89                 } else if ( $key_status == 'invalid' ) {
90                         delete_option('wordpress_api_key');
91                         $ms[] = 'key_empty';
92                 } else if ( !empty($key) && $key_status == 'failed' ) {
93                         $ms[] = 'key_failed';
94                 }
95         }
96
97         $messages = array(
98                 'new_key_empty' => array('color' => 'aa0', 'text' => __('Your key has been cleared.')),
99                 'new_key_valid' => array('color' => '2d2', 'text' => __('Your key has been verified. Happy blogging!')),
100                 'new_key_invalid' => array('color' => 'd22', 'text' => __('The key you entered is invalid. Please double-check it.')),
101                 '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.')),
102                 'no_connection' => array('color' => 'd22', 'text' => __('There was a problem connecting to the Akismet server. Please check your server configuration.')),
103                 '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/')),
104                 'key_valid' => array('color' => '2d2', 'text' => __('This key is valid.')),
105                 '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.')));
106 ?>
107 <?php if ( !empty($_POST ) ) : ?>
108 <div id="message" class="updated fade"><p><strong><?php _e('Options saved.') ?></strong></p></div>
109 <?php endif; ?>
110 <div class="wrap">
111 <h2><?php _e('Akismet Configuration'); ?></h2>
112 <div class="narrow">
113 <form action="" method="post" id="akismet-conf" style="margin: auto; width: 400px; ">
114 <?php if ( !$wpcom_api_key ) { ?>
115         <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>
116
117 <?php akismet_nonce_field($akismet_nonce) ?>
118 <h3><label for="key"><?php _e('WordPress.com API Key'); ?></label></h3>
119 <?php foreach ( $ms as $m ) : ?>
120         <p style="padding: .5em; background-color: #<?php echo $messages[$m]['color']; ?>; color: #fff; font-weight: bold;"><?php echo $messages[$m]['text']; ?></p>
121 <?php endforeach; ?>
122 <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>
123 <?php if ( $invalid_key ) { ?>
124 <h3><?php _e('Why might my key be invalid?'); ?></h3>
125 <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>
126 <?php } ?>
127 <?php } ?>
128 <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>
129         <p class="submit"><input type="submit" name="submit" value="<?php _e('Update options &raquo;'); ?>" /></p>
130 </form>
131 </div>
132 </div>
133 <?php
134 }
135
136 function akismet_verify_key( $key ) {
137         global $akismet_api_host, $akismet_api_port, $wpcom_api_key;
138         $blog = urlencode( get_option('home') );
139         if ( $wpcom_api_key )
140                 $key = $wpcom_api_key;
141         $response = akismet_http_post("key=$key&blog=$blog", 'rest.akismet.com', '/1.1/verify-key', $akismet_api_port);
142         if ( !is_array($response) || !isset($response[1]) || $response[1] != 'valid' && $response[1] != 'invalid' )
143                 return 'failed';
144         return $response[1];
145 }
146
147 if ( !get_option('wordpress_api_key') && !$wpcom_api_key && !isset($_POST['submit']) ) {
148         function akismet_warning() {
149                 echo "
150                 <div id='akismet-warning' class='updated fade-ff0000'><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>
151                 ";
152         }
153         add_action('admin_notices', 'akismet_warning');
154         return;
155 }
156
157 // Returns array with headers in $response[0] and body in $response[1]
158 function akismet_http_post($request, $host, $path, $port = 80) {
159         global $wp_version;
160
161         $http_request  = "POST $path HTTP/1.0\r\n";
162         $http_request .= "Host: $host\r\n";
163         $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n";
164         $http_request .= "Content-Length: " . strlen($request) . "\r\n";
165         $http_request .= "User-Agent: WordPress/$wp_version | Akismet/2.0\r\n";
166         $http_request .= "\r\n";
167         $http_request .= $request;
168
169         $response = '';
170         if( false != ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
171                 fwrite($fs, $http_request);
172
173                 while ( !feof($fs) )
174                         $response .= fgets($fs, 1160); // One TCP-IP packet
175                 fclose($fs);
176                 $response = explode("\r\n\r\n", $response, 2);
177         }
178         return $response;
179 }
180
181 function akismet_auto_check_comment( $comment ) {
182         global $akismet_api_host, $akismet_api_port;
183
184         $comment['user_ip']    = preg_replace( '/[^0-9., ]/', '', $_SERVER['REMOTE_ADDR'] );
185         $comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
186         $comment['referrer']   = $_SERVER['HTTP_REFERER'];
187         $comment['blog']       = get_option('home');
188
189         $ignore = array( 'HTTP_COOKIE' );
190
191         foreach ( $_SERVER as $key => $value )
192                 if ( !in_array( $key, $ignore ) )
193                         $comment["$key"] = $value;
194
195         $query_string = '';
196         foreach ( $comment as $key => $data )
197                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
198
199         $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
200         if ( 'true' == $response[1] ) {
201                 add_filter('pre_comment_approved', create_function('$a', 'return \'spam\';'));
202                 update_option( 'akismet_spam_count', get_option('akismet_spam_count') + 1 );
203
204                 do_action( 'akismet_spam_caught' );
205
206                 $post = get_post( $comment['comment_post_ID'] );
207                 $last_updated = strtotime( $post->post_modified_gmt );
208                 $diff = time() - $last_updated;
209                 $diff = $diff / 86400;
210
211                 if ( $post->post_type == 'post' && $diff > 30 && get_option( 'akismet_discard_month' ) == 'true' )
212                         die;
213         }
214         akismet_delete_old();
215         return $comment;
216 }
217
218 function akismet_delete_old() {
219         global $wpdb;
220         $now_gmt = current_time('mysql', 1);
221         $wpdb->query("DELETE FROM $wpdb->comments WHERE DATE_SUB('$now_gmt', INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam'");
222         $n = mt_rand(1, 5000);
223         if ( $n == 11 ) // lucky number
224                 $wpdb->query("OPTIMIZE TABLE $wpdb->comments");
225 }
226
227 function akismet_submit_nonspam_comment ( $comment_id ) {
228         global $wpdb, $akismet_api_host, $akismet_api_port;
229
230         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
231         if ( !$comment ) // it was deleted
232                 return;
233         $comment->blog = get_option('home');
234         $query_string = '';
235         foreach ( $comment as $key => $data )
236                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
237         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-ham", $akismet_api_port);
238 }
239
240 function akismet_submit_spam_comment ( $comment_id ) {
241         global $wpdb, $akismet_api_host, $akismet_api_port;
242
243         $comment = $wpdb->get_row("SELECT * FROM $wpdb->comments WHERE comment_ID = '$comment_id'");
244         if ( !$comment ) // it was deleted
245                 return;
246         if ( 'spam' != $comment->comment_approved )
247                 return;
248         $comment->blog = get_option('home');
249         $query_string = '';
250         foreach ( $comment as $key => $data )
251                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
252
253         $response = akismet_http_post($query_string, $akismet_api_host, "/1.1/submit-spam", $akismet_api_port);
254 }
255
256 add_action('wp_set_comment_status', 'akismet_submit_spam_comment');
257 add_action('edit_comment', 'akismet_submit_spam_comment');
258 add_action('preprocess_comment', 'akismet_auto_check_comment', 1);
259
260 function akismet_spam_count() {
261         global $wpdb, $comments;
262         $count = wp_cache_get( 'akismet_spam_count', 'widget' );
263         if ( false === $count ) {
264                 $count = $wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = 'spam'");
265                 wp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );
266         }
267         return $count;
268 }
269
270 function akismet_manage_page() {
271         global $wpdb, $submenu;
272         $count = sprintf(__('Akismet Spam (%s)'), akismet_spam_count());
273         if ( isset( $submenu['edit-comments.php'] ) )
274                 add_submenu_page('edit-comments.php', __('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught' );
275         elseif ( function_exists('add_management_page') )
276                 add_management_page(__('Akismet Spam'), $count, 'moderate_comments', 'akismet-admin', 'akismet_caught');
277 }
278
279 function akismet_caught() {
280         global $wpdb, $comment, $akismet_caught, $akismet_nonce;
281         akismet_recheck_queue();
282         if (isset($_POST['submit']) && 'recover' == $_POST['action'] && ! empty($_POST['not_spam'])) {
283                 check_admin_referer( $akismet_nonce );
284                 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
285                         die(__('You do not have sufficient permission to moderate comments.'));
286                 
287                 $i = 0;
288                 foreach ($_POST['not_spam'] as $comment):
289                         $comment = (int) $comment;
290                         if ( function_exists('wp_set_comment_status') )
291                                 wp_set_comment_status($comment, 'approve');
292                         else
293                                 $wpdb->query("UPDATE $wpdb->comments SET comment_approved = '1' WHERE comment_ID = '$comment'");
294                         akismet_submit_nonspam_comment($comment);
295                         ++$i;
296                 endforeach;
297                 $to = add_query_arg( 'recovered', $i, $_SERVER['HTTP_REFERER'] );
298                 wp_redirect( $to );
299                 exit;
300         }
301         if ('delete' == $_POST['action']) {
302                 check_admin_referer( $akismet_nonce );
303                 if ( function_exists('current_user_can') && !current_user_can('moderate_comments') )
304                         die(__('You do not have sufficient permission to moderate comments.'));
305
306                 $delete_time = addslashes( $_POST['display_time'] );
307                 $nuked = $wpdb->query( "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam' AND '$delete_time' > comment_date_gmt" );
308                 wp_cache_delete( 'akismet_spam_count', 'widget' );
309                 $to = add_query_arg( 'deleted', 'all', $_SERVER['HTTP_REFERER'] );
310                 wp_redirect( $to );
311                 exit;
312         }
313
314 if ( isset( $_GET['recovered'] ) ) {
315         $i = (int) $_GET['recovered'];
316         echo '<div class="updated"><p>' . sprintf(__('%1$s comments recovered.'), $i) . "</p></div>";
317 }
318
319 if (isset( $_GET['deleted'] ) )
320         echo '<div class="updated"><p>' . __('All spam deleted.') . '</p></div>';
321
322 if ( isset( $GLOBALS['submenu']['edit-comments.php'] ) )
323         $link = 'edit-comments.php';
324 else
325         $link = 'edit.php';
326 ?>
327 <style type="text/css">
328 .akismet-tabs {
329         list-style: none;
330         margin: 0;
331         padding: 0;
332         clear: both;
333         border-bottom: 1px solid #ccc;
334         height: 31px;
335         margin-bottom: 20px;
336         background: #ddd;
337         border-top: 1px solid #bdbdbd;
338 }
339 .akismet-tabs li {
340         float: left;
341         margin: 5px 0 0 20px;
342 }
343 .akismet-tabs a {
344         display: block;
345         padding: 4px .5em 3px;
346         border-bottom: none;
347         color: #036;
348 }
349 .akismet-tabs .active a {
350         background: #fff;
351         border: 1px solid #ccc;
352         border-bottom: none;
353         color: #000;
354         font-weight: bold;
355         padding-bottom: 4px;
356 }
357 #akismetsearch {
358         float: right;
359         margin-top: -.5em;
360 }
361
362 #akismetsearch p {
363         margin: 0;
364         padding: 0;
365 }
366 </style>
367 <div class="wrap">
368 <h2><?php _e('Caught Spam') ?></h2>
369 <?php
370 $count = get_option( 'akismet_spam_count' );
371 if ( $count ) {
372 ?>
373 <p><?php printf(__('Akismet has caught <strong>%1$s spam</strong> for you since you first installed it.'), number_format($count) ); ?></p>
374 <?php
375 }
376
377 $gotspam = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'" );
378
379
380 if ( 0 == $gotspam ) {
381         echo '<p>'.__('You have no spam currently in the queue. Must be your lucky day. :)').'</p>';
382         echo '</div>';
383 } else {
384         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>';
385 ?>
386 <?php if ( !isset( $_POST['s'] ) ) { ?>
387 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
388 <?php akismet_nonce_field($akismet_nonce) ?>
389 <input type="hidden" name="action" value="delete" />
390 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" class="button" name="Submit" value="<?php _e('Delete all'); ?>" />
391 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" />
392 </form>
393 <?php } ?>
394 </div>
395 <div class="wrap">
396 <?php if ( isset( $_POST['s'] ) ) { ?>
397 <h2><?php _e('Search'); ?></h2>
398 <?php } else { ?>
399 <?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>'; ?>
400 <?php } ?>
401 <?php
402 if ( isset( $_POST['s'] ) ) {
403         $s = $wpdb->escape($_POST['s']);
404         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments  WHERE
405                 (comment_author LIKE '%$s%' OR
406                 comment_author_email LIKE '%$s%' OR
407                 comment_author_url LIKE ('%$s%') OR
408                 comment_author_IP LIKE ('%$s%') OR
409                 comment_content LIKE ('%$s%') ) AND
410                 comment_approved = 'spam'
411                 ORDER BY comment_date DESC");
412 } else {
413         if ( isset( $_GET['apage'] ) )
414                 $page = (int) $_GET['apage'];
415         else
416                 $page = 1;
417
418         if ( $page < 2 )
419                 $page = 1;
420
421         $start = ( $page - 1 ) * 50;
422         $end = $start + 50;
423
424         $where = '';
425         if ( isset( $_GET['ctype'] ) ) {
426                 $type = preg_replace( '|[^a-z]|', '', $_GET['ctype'] );
427                 if ( 'comments' == $type )
428                         $type = '';
429                 $where = " AND comment_type = '$type' "; 
430         }
431
432         $comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' $where ORDER BY comment_date DESC LIMIT $start, $end");
433         $total = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam' $where" );
434
435         $totals = $wpdb->get_results( "SELECT comment_type, COUNT(*) AS cc FROM $wpdb->comments WHERE comment_approved = 'spam' GROUP BY comment_type" );
436 ?>
437 <ul class="akismet-tabs">
438 <li <?php if ( !isset( $_GET['ctype'] ) ) echo ' class="active"'; ?>><a href="edit-comments.php?page=akismet-admin"><?php _e('All'); ?></a></li>
439 <?php
440 foreach ( $totals as $type ) {
441         if ( '' == $type->comment_type ) $type->comment_type = 'comments';
442         $show = ucwords( $type->comment_type );
443         $type->cc = number_format( $type->cc );
444         $extra = ( $_GET['ctype'] == $type->comment_type ) ? ' class="active"' : '';
445         echo "<li $extra><a href='edit-comments.php?page=akismet-admin&amp;ctype=$type->comment_type'>$show ($type->cc)</a></li>";
446 }
447 do_action( 'akismet_tabs' ); // so plugins can add more tabs easily
448 ?>      
449 </ul>
450 <?php
451 }
452
453 if ($comments) {
454 ?>
455 <form method="post" action="<?php echo attribute_escape("$link?page=akismet-admin"); ?>" id="akismetsearch">
456 <p>  <input type="text" name="s" value="<?php if (isset($_POST['s'])) echo attribute_escape($_POST['s']); ?>" size="17" /> 
457   <input type="submit" class="button" name="submit" value="<?php echo attribute_escape(__('Search Spam &raquo;')) ?>"  />  </p>
458 </form>
459 <?php if ( $total > 50 ) {
460 $total_pages = ceil( $total / 50 );
461 $r = '';
462 if ( 1 < $page ) {
463         $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
464         $r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
465 }
466 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
467         for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
468                 if ( $page == $page_num ) :
469                         $r .=  "<strong>$page_num</strong>\n";
470                 else :
471                         $p = false;
472                         if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :
473                                 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;
474                                 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";
475                                 $in = true;
476                         elseif ( $in == true ) :
477                                 $r .= "...\n";
478                                 $in = false;
479                         endif;
480                 endif;
481         endfor;
482 }
483 if ( ( $page ) * 50 < $total || -1 == $total ) {
484         $args['apage'] = $page + 1;
485         $r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
486 }
487 echo "<p>$r</p>";
488 ?>
489
490 <?php } ?>
491 <form style="clear: both;" method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
492 <?php akismet_nonce_field($akismet_nonce) ?>
493 <input type="hidden" name="action" value="recover" />
494 <ul id="spam-list" class="commentlist" style="list-style: none; margin: 0; padding: 0;">
495 <?php
496 $i = 0;
497 foreach($comments as $comment) {
498         $i++;
499         $comment_date = mysql2date(get_option("date_format") . " @ " . get_option("time_format"), $comment->comment_date);
500         $post = get_post($comment->comment_post_ID);
501         $post_title = $post->post_title;
502         if ($i % 2) $class = 'class="alternate"';
503         else $class = '';
504         echo "\n\t<li id='comment-$comment->comment_ID' $class>"; 
505         ?>
506
507 <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>
508
509 <?php comment_text() ?>
510
511 <p><label for="spam-<?php echo $comment->comment_ID; ?>">
512 <input type="checkbox" id="spam-<?php echo $comment->comment_ID; ?>" name="not_spam[]" value="<?php echo $comment->comment_ID; ?>" />
513 <?php _e('Not Spam') ?></label> &#8212; <?php comment_date('M j, g:i A');  ?> &#8212; [ 
514 <?php
515 $post = get_post($comment->comment_post_ID);
516 $post_title = wp_specialchars( $post->post_title, 'double' );
517 $post_title = ('' == $post_title) ? "# $comment->comment_post_ID" : $post_title;
518 ?>
519  <a href="<?php echo get_permalink($comment->comment_post_ID); ?>" title="<?php echo $post_title; ?>"><?php _e('View Post') ?></a> ] </p>
520
521
522 <?php
523 }
524 ?>
525 </ul>
526 <?php if ( $total > 50 ) {
527 $total_pages = ceil( $total / 50 );
528 $r = '';
529 if ( 1 < $page ) {
530         $args['apage'] = ( 1 == $page - 1 ) ? '' : $page - 1;
531         $r .=  '<a class="prev" href="' . clean_url(add_query_arg( $args )) . '">'. __('&laquo; Previous Page') .'</a>' . "\n";
532 }
533 if ( ( $total_pages = ceil( $total / 50 ) ) > 1 ) {
534         for ( $page_num = 1; $page_num <= $total_pages; $page_num++ ) :
535                 if ( $page == $page_num ) :
536                         $r .=  "<strong>$page_num</strong>\n";
537                 else :
538                         $p = false;
539                         if ( $page_num < 3 || ( $page_num >= $page - 3 && $page_num <= $page + 3 ) || $page_num > $total_pages - 3 ) :
540                                 $args['apage'] = ( 1 == $page_num ) ? '' : $page_num;
541                                 $r .= '<a class="page-numbers" href="' . clean_url(add_query_arg($args)) . '">' . ( $page_num ) . "</a>\n";
542                                 $in = true;
543                         elseif ( $in == true ) :
544                                 $r .= "...\n";
545                                 $in = false;
546                         endif;
547                 endif;
548         endfor;
549 }
550 if ( ( $page ) * 50 < $total || -1 == $total ) {
551         $args['apage'] = $page + 1;
552         $r .=  '<a class="next" href="' . clean_url(add_query_arg($args)) . '">'. __('Next Page &raquo;') .'</a>' . "\n";
553 }
554 echo "<p>$r</p>";
555 }
556 ?>
557 <p class="submit"> 
558 <input type="submit" name="submit" value="<?php echo attribute_escape(__('De-spam marked comments &raquo;')); ?>" />
559 </p>
560 <p><?php _e('Comments you de-spam will be submitted to Akismet as mistakes so it can learn and get better.'); ?></p>
561 </form>
562 <?php
563 } else {
564 ?>
565 <p><?php _e('No results found.'); ?></p>
566 <?php } ?>
567
568 <?php if ( !isset( $_POST['s'] ) ) { ?>
569 <form method="post" action="<?php echo attribute_escape( add_query_arg( 'noheader', 'true' ) ); ?>">
570 <?php akismet_nonce_field($akismet_nonce) ?>
571 <p><input type="hidden" name="action" value="delete" />
572 <?php printf(__('There are currently %1$s comments identified as spam.'), $spam_count); ?>&nbsp; &nbsp; <input type="submit" name="Submit" value="<?php echo attribute_escape(__('Delete all')); ?>" />
573 <input type="hidden" name="display_time" value="<?php echo current_time('mysql', 1); ?>" /></p>
574 </form>
575 <?php } ?>
576 </div>
577 <?php
578         }
579 }
580
581 add_action('admin_menu', 'akismet_manage_page');
582
583 function akismet_stats() {
584         $count = get_option('akismet_spam_count');
585         if ( !$count )
586                 return;
587         $path = plugin_basename(__FILE__);
588         echo '<h3>'.__('Spam').'</h3>';
589         global $submenu;
590         if ( isset( $submenu['edit-comments.php'] ) )
591                 $link = 'edit-comments.php';
592         else
593                 $link = 'edit.php';
594         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($count) ).'</p>';
595 }
596
597 add_action('activity_box_end', 'akismet_stats');
598
599
600 if ( 'moderation.php' == $pagenow ) {
601         function akismet_recheck_button( $page ) {
602                 global $submenu;
603                 if ( isset( $submenu['edit-comments.php'] ) )
604                         $link = 'edit-comments.php';
605                 else
606                         $link = 'edit.php';
607                 $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>";
608                 $page = str_replace( '<div class="wrap">', '<div class="wrap">' . $button, $page );
609                 return $page;
610         }
611
612         if ( $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = '0'" ) )
613                 ob_start( 'akismet_recheck_button' );
614 }
615
616 function akismet_recheck_queue() {
617         global $wpdb, $akismet_api_host, $akismet_api_port;
618
619         if ( !isset( $_GET['recheckqueue'] ) )
620                 return;
621
622         $moderation = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '0'", ARRAY_A );
623         foreach ( $moderation as $c ) {
624                 $c['user_ip']    = $c['comment_author_IP'];
625                 $c['user_agent'] = $c['comment_agent'];
626                 $c['referrer']   = '';
627                 $c['blog']       = get_option('home');
628                 $id = $c['comment_ID'];
629                 
630                 $query_string = '';
631                 foreach ( $c as $key => $data )
632                 $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
633                 
634                 $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
635                 if ( 'true' == $response[1] ) {
636                         $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = 'spam' WHERE comment_ID = $id" );
637                 }
638         }
639         wp_redirect( $_SERVER['HTTP_REFERER'] );
640         exit;
641 }
642
643 function akismet_check_db_comment( $id ) {
644         global $wpdb, $akismet_api_host, $akismet_api_port;
645
646         $id = (int) $id;
647         $c = $wpdb->get_row( "SELECT * FROM $wpdb->comments WHERE comment_ID = '$id'", ARRAY_A );
648         if ( !$c )
649                 return;
650
651         $c['user_ip']    = $c['comment_author_IP'];
652         $c['user_agent'] = $c['comment_agent'];
653         $c['referrer']   = '';
654         $c['blog']       = get_option('home');
655         $id = $c['comment_ID'];
656         
657         $query_string = '';
658         foreach ( $c as $key => $data )
659         $query_string .= $key . '=' . urlencode( stripslashes($data) ) . '&';
660         
661         $response = akismet_http_post($query_string, $akismet_api_host, '/1.1/comment-check', $akismet_api_port);
662         return $response[1];
663 }
664
665 // This option causes tons of FPs, was removed in 2.1
666 function akismet_kill_proxy_check( $option ) { return 0; }
667 add_filter('option_open_proxy_check', 'akismet_kill_proxy_check');
668
669 // Widget stuff
670 function widget_akismet_register() {
671         if ( function_exists('register_sidebar_widget') ) :
672         function widget_akismet($args) {
673                 extract($args);
674                 $options = get_option('widget_akismet');
675                 $count = number_format(get_option('akismet_spam_count'));
676                 $text = __('%d spam comments have been blocked by <a href="http://akismet.com">Akismet</a>.');
677                 ?>
678                         <?php echo $before_widget; ?>
679                                 <?php echo $before_title . $options['title'] . $after_title; ?>
680                                 <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>
681                         <?php echo $after_widget; ?>
682         <?php
683         }
684         
685         function widget_akismet_style() {
686                 ?>
687 <style type="text/css">
688 #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}
689 #aka:hover{border:none;text-decoration:none}
690 #aka:hover #akismet1{display:none}
691 #aka:hover #akismet2,#akismet1{display:block}
692 #akismet2{display:none;padding-top:2px}
693 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}
694 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}
695 #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}
696 </style>
697                 <?php
698         }
699
700         function widget_akismet_control() {
701                 $options = $newoptions = get_option('widget_akismet');
702                 if ( $_POST["akismet-submit"] ) {
703                         $newoptions['title'] = strip_tags(stripslashes($_POST["akismet-title"]));
704                         if ( empty($newoptions['title']) ) $newoptions['title'] = 'Spam Blocked';
705                 }
706                 if ( $options != $newoptions ) {
707                         $options = $newoptions;
708                         update_option('widget_akismet', $options);
709                 }
710                 $title = htmlspecialchars($options['title'], ENT_QUOTES);
711         ?>
712                                 <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>
713                                 <input type="hidden" id="akismet-submit" name="akismet-submit" value="1" />
714         <?php
715         }
716
717         register_sidebar_widget('Akismet', 'widget_akismet', null, 'akismet');
718         register_widget_control('Akismet', 'widget_akismet_control', 300, 75, 'akismet');
719         if ( is_active_widget('widget_akismet') )
720                 add_action('wp_head', 'widget_akismet_style');
721         endif;
722 }
723
724 add_action('init', 'widget_akismet_register');
725
726 // Counter for non-widget users
727 function akismet_counter() {
728 ?>
729 <style type="text/css">
730 #akismetwrap #aka,#aka:link,#aka:hover,#aka:visited,#aka:active{color:#fff;text-decoration:none}
731 #aka:hover{border:none;text-decoration:none}
732 #aka:hover #akismet1{display:none}
733 #aka:hover #akismet2,#akismet1{display:block}
734 #akismet2{display:none;padding-top:2px}
735 #akismeta{font-size:16px;font-weight:bold;line-height:18px;text-decoration:none}
736 #akismetcount{display:block;font:15px Verdana,Arial,Sans-Serif;font-weight:bold;text-decoration:none}
737 #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}
738 </style>
739 <?php
740 $count = number_format(get_option('akismet_spam_count'));
741 ?>
742 <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>
743 <?php
744 }
745
746 ?>