Changeset 22656 in spip-zone


Ignore:
Timestamp:
Sep 19, 2008, 10:31:46 AM (12 years ago)
Author:
fil@…
Message:

passage a Akismet.class.php v 0.4 http://www.achingbrain.net/stuff/php/akismet

Location:
_plugins_/_dev_/akismet
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/_dev_/akismet/Akismet.class.php

    r18920 r22656  
    11<?php
     2
    23/**
    34 * Akismet anti-comment spam service
     
    78 * This service performs a number of checks on submitted data and returns whether or not the data is likely to be spam.
    89 *
    9  * Please note that in order to use this class, you must have a vaild {@link http://wordpress.com/api-keys/ WordPress API key}.  They are free for non/small-profit types and getting one will only take a couple of minutes.
     10 * Please note that in order to use this class, you must have a vaild {@link http://wordpress.com/api-keys/ WordPress API key}.  They are free for non/small-profit types and getting one will only take a couple of minutes. 
    1011 *
    1112 * For commercial use, please {@link http://akismet.com/commercial/ visit the Akismet commercial licensing page}.
     
    1516 * See the Akismet class documentation page linked to below for usage information.
    1617 *
    17  * @package Akismet
    18  * @author Alex Potsides, {@link http://www.achingbrain.net http://www.achingbrain.net}, Bret Kuhns {@link http://www.miphp.net}
    19  * @version 0.1
    20  * @copyright Alex Potsides, {@link http://www.achingbrain.net http://www.achingbrain.net}
    21  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License
     18 * @package             akismet
     19 * @author              Alex Potsides, {@link http://www.achingbrain.net http://www.achingbrain.net}
     20 * @version             0.4
     21 * @copyright   Alex Potsides, {@link http://www.achingbrain.net http://www.achingbrain.net}
     22 * @license             http://www.opensource.org/licenses/bsd-license.php BSD License
    2223 */
    2324
    2425/**
    25  *      The Akismet PHP4 Class
     26 *      The Akismet PHP5 Class
    2627 *
    2728 *  This class takes the functionality from the Akismet WordPress plugin written by {@link http://photomatt.net/ Matt Mullenweg} and allows it to be integrated into any PHP5 application or website.
     
    4344 *  </code>
    4445 *
     46 *  Optionally you may wish to check if your WordPress API key is valid as in the example below.
     47 *
     48 * <code>
     49 *   $akismet = new Akismet('http://www.example.com/blog/', 'aoeu1aoue');
     50 *   
     51 *   if($akismet->isKeyValid()) {
     52 *     // api key is okay
     53 *   } else {
     54 *     // api key is invalid
     55 *   }
     56 * </code>
     57 *
    4558 *      @package        akismet
    4659 *      @name           Akismet
    47  *      @version        0.2
    48  *  @author             Alex Potsides (converted to PHP4 by Bret Kuhns)
     60 *      @version        0.4
     61 *  @author             Alex Potsides
    4962 *  @link               http://www.achingbrain.net/
    5063 */
    51 class Akismet {
    52         var $version = '0.2';
    53         var $wordPressAPIKey;
    54         var $blogURL;
    55         var $comment;
    56         var $apiPort;
    57         var $akismetServer;
    58         var $akismetVersion;
    59 
     64class Akismet
     65        {
     66        private $version = '0.4';
     67        private $wordPressAPIKey;
     68        private $blogURL;
     69        private $comment;
     70        private $apiPort;
     71        private $akismetServer;
     72        private $akismetVersion;
     73       
    6074        // This prevents some potentially sensitive information from being sent accross the wire.
    61         var $ignore = array(
    62                         'HTTP_COOKIE',
    63                         'HTTP_X_FORWARDED_FOR',
    64                         'HTTP_X_FORWARDED_HOST',
    65                         'HTTP_MAX_FORWARDS',
    66                         'HTTP_X_FORWARDED_SERVER',
    67                         'REDIRECT_STATUS',
    68                         'SERVER_PORT',
    69                         'PATH',
    70                         'DOCUMENT_ROOT',
    71                         'SERVER_ADMIN',
    72                         'QUERY_STRING',
    73                         'PHP_SELF'
    74                 );
    75 
    76 
    77         /**
    78          *      @throws Exception       An exception is thrown if your API key is invalid.
    79          *      @param  string  Your WordPress API key.
     75        private $ignore = array('HTTP_COOKIE',
     76                                                        'HTTP_X_FORWARDED_FOR',
     77                                                        'HTTP_X_FORWARDED_HOST',
     78                                                        'HTTP_MAX_FORWARDS',
     79                                                        'HTTP_X_FORWARDED_SERVER',
     80                                                        'REDIRECT_STATUS',
     81                                                        'SERVER_PORT',
     82                                                        'PATH',
     83                                                        'DOCUMENT_ROOT',
     84                                                        'SERVER_ADMIN',
     85                                                        'QUERY_STRING',
     86                                                        'PHP_SELF' );
     87       
     88        /**
    8089         *      @param  string  $blogURL                        The URL of your blog.
    81          */
    82         function Akismet($blogURL, $wordPressAPIKey) {
     90         *      @param  string  $wordPressAPIKey        WordPress API key.
     91         */
     92        public function __construct($blogURL, $wordPressAPIKey) {
    8393                $this->blogURL = $blogURL;
    8494                $this->wordPressAPIKey = $wordPressAPIKey;
    85 
     95               
    8696                // Set some default values
    8797                $this->apiPort = 80;
    8898                $this->akismetServer = 'rest.akismet.com';
    8999                $this->akismetVersion = '1.1';
    90 
     100               
    91101                // Start to populate the comment data
    92102                $this->comment['blog'] = $blogURL;
    93103                $this->comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
    94                 $this->comment['referrer'] = $_SERVER['HTTP_REFERER'];
    95 
    96                 // This is necessary if the server PHP5 is running on has been set up to run PHP4 and
    97                 // PHP5 concurently and is actually running through a separate proxy al a these instructions:
    98                 // http://www.schlitt.info/applications/blog/archives/83_How_to_run_PHP4_and_PHP_5_parallel.html
    99                 // and http://wiki.coggeshall.org/37.html
    100                 // Otherwise the user_ip appears as the IP address of the PHP4 server passing the requests to the
    101                 // PHP5 one...
     104               
     105                if(isset($_SERVER['HTTP_REFERER'])) {
     106                        $this->comment['referrer'] = $_SERVER['HTTP_REFERER'];
     107                }
     108               
     109                /*
     110                 * This is necessary if the server PHP5 is running on has been set up to run PHP4 and
     111                 * PHP5 concurently and is actually running through a separate proxy al a these instructions:
     112                 * http://www.schlitt.info/applications/blog/archives/83_How_to_run_PHP4_and_PHP_5_parallel.html
     113                 * and http://wiki.coggeshall.org/37.html
     114                 * Otherwise the user_ip appears as the IP address of the PHP4 server passing the requests to the
     115                 * PHP5 one...
     116                 */
    102117                $this->comment['user_ip'] = $_SERVER['REMOTE_ADDR'] != getenv('SERVER_ADDR') ? $_SERVER['REMOTE_ADDR'] : getenv('HTTP_X_FORWARDED_FOR');
    103 
     118        }
     119       
     120        /**
     121         * Makes a request to the Akismet service to see if the API key passed to the constructor is valid.
     122         *
     123         * Use this method if you suspect your API key is invalid.
     124         *
     125         * @return bool True is if the key is valid, false if not.
     126         */
     127        public function isKeyValid() {
    104128                // Check to see if the key is valid
    105                 $response = $this->http_post('key=' . $this->wordPressAPIKey . '&blog=' . $this->blogURL, $this->akismetServer, '/' . $this->akismetVersion . '/verify-key');
    106 
    107                 if($response[1] != 'valid') {
    108                         // Whoops, no it's not.  Throw an exception as we can't proceed without a valid API key.
    109                         trigger_error('Invalid API key.  Please obtain one from http://wordpress.com/api-keys/', E_USER_ERROR);
    110                 }
    111         }
    112 
    113         function http_post($request, $host, $path) {
    114                 $http_request  =
    115                                 "POST " . $path . " HTTP/1.1\r\n" .
    116                                 "Host: " . $host . "\r\n" .
    117                                 "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n" .
    118                                 "Content-Length: " . strlen($request) . "\r\n" .
    119                                 "User-Agent: Akismet PHP5 Class " . $this->version . " | Akismet/1.11\r\n" .
    120                                 "Connection: close\r\n" . // cf. http://blog.akismet.com/2008/02/25/using-http-11/
    121                                 "\r\n" .
    122                                 $request
    123                         ;
    124 
     129                $response = $this->sendRequest('key=' . $this->wordPressAPIKey . '&blog=' . $this->blogURL, $this->akismetServer, '/' . $this->akismetVersion . '/verify-key');
     130                return $response[1] == 'valid';
     131        }
     132       
     133        // makes a request to the Akismet service
     134        private function sendRequest($request, $host, $path) {
     135                $http_request  = "POST " . $path . " HTTP/1.0\r\n";
     136                $http_request .= "Host: " . $host . "\r\n";
     137                $http_request .= "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n";
     138                $http_request .= "Content-Length: " . strlen($request) . "\r\n";
     139                $http_request .= "User-Agent: Akismet PHP5 Class " . $this->version . " | Akismet/1.11\r\n";
     140                $http_request .= "\r\n";
     141                $http_request .= $request;
     142               
    125143                $socketWriteRead = new SocketWriteRead($host, $this->apiPort, $http_request);
    126144                $socketWriteRead->send();
    127 
     145               
    128146                return explode("\r\n\r\n", $socketWriteRead->getResponse(), 2);
    129147        }
    130 
    131         // Formats the data for transmission    echo $sql;
    132         function getQueryString() {
     148       
     149        // Formats the data for transmission
     150        private function getQueryString() {
    133151                foreach($_SERVER as $key => $value) {
    134152                        if(!in_array($key, $this->ignore)) {
     
    142160
    143161                $query_string = '';
    144 
     162               
    145163                foreach($this->comment as $key => $data) {
    146                         $query_string .= $key . '=' . urlencode(stripslashes($data)) . '&';
    147                 }
    148 
     164                        if(!is_array($data)) {
     165                                $query_string .= $key . '=' . urlencode(stripslashes($data)) . '&';
     166                        }
     167                }
     168               
    149169                return $query_string;
    150170        }
    151 
     171       
    152172        /**
    153173         *      Tests for spam.
     
    156176         *
    157177         *      @return         bool    True if the comment is spam, false if not
    158          */
    159         function isSpam() {
    160                 $response = $this->http_post($this->getQueryString(), $this->wordPressAPIKey . '.rest.akismet.com', '/' . $this->akismetVersion . '/comment-check');
    161 
     178         *  @throws             Will throw an exception if the API key passed to the constructor is invalid.
     179         */
     180        public function isCommentSpam() {
     181                $response = $this->sendRequest($this->getQueryString(), $this->wordPressAPIKey . '.rest.akismet.com', '/' . $this->akismetVersion . '/comment-check');
     182               
     183                if($response[1] == 'invalid' && !$this->isKeyValid()) {
     184                        throw new exception('The Wordpress API key passed to the Akismet constructor is invalid.  Please obtain a valid one from http://wordpress.com/api-keys/');
     185                }
     186               
    162187                return ($response[1] == 'true');
    163188        }
     
    168193         *      Using this function will make you a good citizen as it helps Akismet to learn from its mistakes.  This will improve the service for everybody.
    169194         */
    170         function submitSpam() {
    171                 $this->http_post($this->getQueryString(), $this->wordPressAPIKey . '.' . $this->akismetServer, '/' . $this->akismetVersion . '/submit-spam');
    172         }
    173 
     195        public function submitSpam() {
     196                $this->sendRequest($this->getQueryString(), $this->wordPressAPIKey . '.' . $this->akismetServer, '/' . $this->akismetVersion . '/submit-spam');
     197        }
     198       
    174199        /**
    175200         *      Submit ham that is incorrectly tagged as spam.
     
    177202         *      Using this function will make you a good citizen as it helps Akismet to learn from its mistakes.  This will improve the service for everybody.
    178203         */
    179         function submitHam() {
    180                 $this->http_post($this->getQueryString(), $this->wordPressAPIKey . '.' . $this->akismetServer, '/' . $this->akismetVersion . '/submit-ham');
    181         }
    182 
     204        public function submitHam() {
     205                $this->sendRequest($this->getQueryString(), $this->wordPressAPIKey . '.' . $this->akismetServer, '/' . $this->akismetVersion . '/submit-ham');
     206        }
     207       
    183208        /**
    184209         *      To override the user IP address when submitting spam/ham later on
     
    186211         *      @param string $userip   An IP address.  Optional.
    187212         */
    188         function setUserIP($userip) {
     213        public function setUserIP($userip) {
    189214                $this->comment['user_ip'] = $userip;
    190215        }
    191 
     216       
    192217        /**
    193218         *      To override the referring page when submitting spam/ham later on
     
    195220         *      @param string $referrer The referring page.  Optional.
    196221         */
    197         function setReferrer($referrer) {
     222        public function setReferrer($referrer) {
    198223                $this->comment['referrer'] = $referrer;
    199224        }
    200 
     225       
    201226        /**
    202227         *      A permanent URL referencing the blog post the comment was submitted to.
     
    204229         *      @param string $permalink        The URL.  Optional.
    205230         */
    206         function setPermalink($permalink) {
     231        public function setPermalink($permalink) {
    207232                $this->comment['permalink'] = $permalink;
    208233        }
    209 
    210         /**
    211          *      The type of comment being submitted.
     234       
     235        /**
     236         *      The type of comment being submitted. 
    212237         *
    213238         *      May be blank, comment, trackback, pingback, or a made up value like "registration" or "wiki".
    214239         */
    215         function setType($commentType) {
     240        public function setCommentType($commentType) {
    216241                $this->comment['comment_type'] = $commentType;
    217242        }
    218 
     243       
    219244        /**
    220245         *      The name that the author submitted with the comment.
    221246         */
    222         function setAuthor($commentAuthor) {
     247        public function setCommentAuthor($commentAuthor) {
    223248                $this->comment['comment_author'] = $commentAuthor;
    224249        }
    225 
     250       
    226251        /**
    227252         *      The email address that the author submitted with the comment.
     
    229254         *      The address is assumed to be valid.
    230255         */
    231         function setAuthorEmail($authorEmail) {
     256        public function setCommentAuthorEmail($authorEmail) {
    232257                $this->comment['comment_author_email'] = $authorEmail;
    233258        }
    234 
     259       
    235260        /**
    236261         *      The URL that the author submitted with the comment.
    237          */
    238         function setAuthorURL($authorURL) {
     262         */     
     263        public function setCommentAuthorURL($authorURL) {
    239264                $this->comment['comment_author_url'] = $authorURL;
    240265        }
    241 
     266       
    242267        /**
    243268         *      The comment's body text.
    244269         */
    245         function setContent($commentBody) {
     270        public function setCommentContent($commentBody) {
    246271                $this->comment['comment_content'] = $commentBody;
    247272        }
    248 
     273       
    249274        /**
    250275         *      Defaults to 80
    251276         */
    252         function setAPIPort($apiPort) {
     277        public function setAPIPort($apiPort) {
    253278                $this->apiPort = $apiPort;
    254279        }
    255 
     280       
    256281        /**
    257282         *      Defaults to rest.akismet.com
    258283         */
    259         function setAkismetServer($akismetServer) {
     284        public function setAkismetServer($akismetServer) {
    260285                $this->akismetServer = $akismetServer;
    261286        }
    262 
     287       
    263288        /**
    264289         *      Defaults to '1.1'
    265290         */
    266         function setAkismetVersion($akismetVersion) {
     291        public function setAkismetVersion($akismetVersion) {
    267292                $this->akismetVersion = $akismetVersion;
    268293        }
    269294}
    270 
    271295
    272296/**
     
    286310 */
    287311class SocketWriteRead {
    288         var $host;
    289         var $port;
    290         var $request;
    291         var $response;
    292         var $responseLength;
    293         var $errorNumber;
    294         var $errorString;
    295 
     312        private $host;
     313        private $port;
     314        private $request;
     315        private $response;
     316        private $responseLength;
     317        private $errorNumber;
     318        private $errorString;
     319       
    296320        /**
    297321         *      @param  string  $host                   The host to send/receive data.
     
    300324         *      @param  int             $responseLength The amount of data to read.  Defaults to 1160 bytes.
    301325         */
    302         function SocketWriteRead($host, $port, $request, $responseLength = 1160) {
     326        public function __construct($host, $port, $request, $responseLength = 1160) {
    303327                $this->host = $host;
    304328                $this->port = $port;
     
    308332                $this->errorString = '';
    309333        }
    310 
     334       
    311335        /**
    312336         *  Sends the data to the remote host.
     
    314338         * @throws      An exception is thrown if a connection cannot be made to the remote host.
    315339         */
    316         function send() {
     340        public function send() {
    317341                $this->response = '';
    318 
     342               
    319343                $fs = fsockopen($this->host, $this->port, $this->errorNumber, $this->errorString, 3);
    320 
     344               
    321345                if($this->errorNumber != 0) {
    322                         trigger_error('Error connecting to host: ' . $this->host . ' Error number: ' . $this->errorNumber . ' Error message: ' . $this->errorString, E_USER_ERROR);
    323                 }
    324 
     346                        throw new Exception('Error connecting to host: ' . $this->host . ' Error number: ' . $this->errorNumber . ' Error message: ' . $this->errorString);
     347                }
     348               
    325349                if($fs !== false) {
    326350                        @fwrite($fs, $this->request);
    327 
     351                       
    328352                        while(!feof($fs)) {
    329353                                $this->response .= fgets($fs, $this->responseLength);
    330354                        }
    331 
     355                       
    332356                        fclose($fs);
    333357                }
    334358        }
    335 
     359       
    336360        /**
    337361         *  Returns the server response text
     
    339363         *  @return     string
    340364         */
    341         function getResponse() {
     365        public function getResponse() {
    342366                return $this->response;
    343367        }
    344 
     368       
    345369        /**
    346370         *      Returns the error number
     
    350374         *      @return int
    351375         */
    352         function getErrorNumner() {
     376        public function getErrorNumner() {
    353377                return $this->errorNumber;
    354378        }
    355 
     379       
    356380        /**
    357381         *      Returns the error string
     
    361385         *      @return string
    362386         */
    363         function getErrorString() {
     387        public function getErrorString() {
    364388                return $this->errorString;
    365389        }
    366390}
     391
    367392?>
  • _plugins_/_dev_/akismet/inc/forum_insert.php

    r16375 r22656  
    2424                // disponible sur http://akismet.com/personal/ pour un usage personnel / non commercial
    2525                // ou http://akismet.com/commercial/ sinon
    26                 $akismet->setAuthor($_POST['auteur']);
    27                 $akismet->setAuthorEmail($_POST['email_auteur']);
    28                 $akismet->setAuthorURL($_POST['url_site']);
    29                 $akismet->setContent($_POST['texte']);
    30                 $akismet->setType('comment');
    31                 $akismet->setPermalink('http://' . $GLOBALS['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
    32                 if ($akismet->isSpam()) {
     26                $akismet->setCommentAuthor($_POST['auteur']);
     27                $akismet->setCommentAuthorEmail($_POST['email_auteur']);
     28                $akismet->setCommentAuthorURL($_POST['url_site']);
     29                $akismet->setCommentContent($_POST['texte']);
     30                $akismet->setCommentType('comment');
     31                $akismet->setCommentPermalink('http://' . $GLOBALS['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
     32                if ($akismet->isCommentSpam()) {
    3333                        // sauvegarde le commentaire mais le garde comme spam
    3434                        // (en cas de faux positif)
Note: See TracChangeset for help on using the changeset viewer.