- $http_request = "POST $path HTTP/1.0\r\n";
- $http_request .= "Host: $host\r\n";
- $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=" . get_option('blog_charset') . "\r\n";
- $http_request .= "Content-Length: " . strlen($request) . "\r\n";
- $http_request .= "User-Agent: WordPress/$wp_version | Akismet/2.0\r\n";
- $http_request .= "\r\n";
- $http_request .= $request;
-
- $response = '';
- if( false != ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
- fwrite($fs, $http_request);
-
- while ( !feof($fs) )
- $response .= fgets($fs, 1160); // One TCP-IP packet
- fclose($fs);
- $response = explode("\r\n\r\n", $response, 2);
+ $event = array(
+ 'time' => akismet_microtime(),
+ 'message' => $message,
+ 'event' => $event,
+ 'user' => $user,
+ );
+
+ // $unique = false so as to allow multiple values per comment
+ $r = add_comment_meta( $comment_id, 'akismet_history', $event, false );
+}
+
+// get the full comment history for a given comment, as an array in reverse chronological order
+function akismet_get_comment_history( $comment_id ) {
+
+ // failsafe for old WP versions
+ if ( !function_exists('add_comment_meta') )
+ return false;
+
+ $history = get_comment_meta( $comment_id, 'akismet_history', false );
+ usort( $history, 'akismet_cmp_time' );
+ return $history;
+}
+
+function akismet_cmp_time( $a, $b ) {
+ return $a['time'] > $b['time'] ? -1 : 1;
+}
+
+// this fires on wp_insert_comment. we can't update comment_meta when akismet_auto_check_comment() runs
+// because we don't know the comment ID at that point.
+function akismet_auto_check_update_meta( $id, $comment ) {
+ global $akismet_last_comment;
+
+ // failsafe for old WP versions
+ if ( !function_exists('add_comment_meta') )
+ return false;
+
+ if ( !isset( $akismet_last_comment['comment_author_email'] ) )
+ $akismet_last_comment['comment_author_email'] = '';
+
+ // wp_insert_comment() might be called in other contexts, so make sure this is the same comment
+ // as was checked by akismet_auto_check_comment
+ if ( is_object($comment) && !empty($akismet_last_comment) && is_array($akismet_last_comment) ) {
+ if ( isset($akismet_last_comment['comment_post_ID']) && intval($akismet_last_comment['comment_post_ID']) == intval($comment->comment_post_ID)
+ && $akismet_last_comment['comment_author'] == $comment->comment_author
+ && $akismet_last_comment['comment_author_email'] == $comment->comment_author_email ) {
+ // normal result: true or false
+ if ( $akismet_last_comment['akismet_result'] == 'true' ) {
+ update_comment_meta( $comment->comment_ID, 'akismet_result', 'true' );
+ akismet_update_comment_history( $comment->comment_ID, __('Akismet caught this comment as spam'), 'check-spam' );
+ if ( $comment->comment_approved != 'spam' )
+ akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed'.$comment->comment_approved );
+ } elseif ( $akismet_last_comment['akismet_result'] == 'false' ) {
+ update_comment_meta( $comment->comment_ID, 'akismet_result', 'false' );
+ akismet_update_comment_history( $comment->comment_ID, __('Akismet cleared this comment'), 'check-ham' );
+ if ( $comment->comment_approved == 'spam' ) {
+ if ( wp_blacklist_check($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent) )
+ akismet_update_comment_history( $comment->comment_ID, __('Comment was caught by wp_blacklist_check'), 'wp-blacklisted' );
+ else
+ akismet_update_comment_history( $comment->comment_ID, sprintf( __('Comment status was changed to %s'), $comment->comment_approved), 'status-changed-'.$comment->comment_approved );
+ }
+ // abnormal result: error
+ } else {
+ update_comment_meta( $comment->comment_ID, 'akismet_error', time() );
+ akismet_update_comment_history( $comment->comment_ID, sprintf( __('Akismet was unable to check this comment (response: %s), will automatically retry again later.'), substr($akismet_last_comment['akismet_result'], 0, 50)), 'check-error' );
+ }
+
+ // record the complete original data as submitted for checking
+ if ( isset($akismet_last_comment['comment_as_submitted']) )
+ update_comment_meta( $comment->comment_ID, 'akismet_as_submitted', $akismet_last_comment['comment_as_submitted'] );
+ }