Changeset 34

Show
Ignore:
Timestamp:
09/30/07 22:26:19 (6 years ago)
Author:
d0nut
Message:

updated trackback to 0.0.4 - from now on we also support pingbacks.
for that reason i took some gpl licensed code from the wordpress project.
this version does not work. there are some TODOs.

Location:
trackback
Files:
3 added
1 removed
11 modified

Legend:

Unmodified
Added
Removed
  • trackback/de.xml

    r32 r34  
    33<language languagecode="de"> 
    44        <category name="wcf.acp.group"> 
    5                 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Kann Trackbacks senden]]></item> 
     5                <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Kann Track- & Pingbacks senden]]></item> 
    66                <item name="wcf.acp.group.option.user.board.canTrackback.description"><![CDATA[Mitglieder dieser Benutzergruppe könnnen Trackbacks zum automatischen Austausch von Nachrichten und Backlinks erstellen.]]></item> 
     7        </category> 
     8         
     9        <category name="wcf.acp.option"> 
     10                <item name="wcf.acp.option.message_pingback"><![CDATA[Pingback-Server]]></item> 
     11                <item name="wcf.acp.option.message_pingback.description"><![CDATA[Bitte zeilenweise trennen.]]></item> 
    712        </category> 
    813         
     
    1621         
    1722        <category name="wbb.threadAdd"> 
    18                 <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[Trackback aktivieren]]></item> 
    19                 <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[Trackbacks erlauben ihnen automatisch Nachrichten und Backlinks auszutauschen. Optional können Sie Trackbacks direkt versenden.]]></item> 
    20                 <item name="wbb.threadAdd.settings.trackbackUrls"><![CDATA[Trackbacks senden an]]></item> 
    21                 <item name="wbb.threadAdd.settings.trackbackUrls.description"><![CDATA[Mehrere URLs trennen Sie bitte mit einem Zeilenumbruch.]]></item> 
     23                <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[Track- & Pingback aktivieren]]></item> 
     24                <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[Trackbacks erlauben ihnen automatisch Nachrichten und Backlinks auszutauschen.]]></item> 
    2225        </category> 
    2326</language> 
  • trackback/en.xml

    r32 r34  
    33<language languagecode="en"> 
    44        <category name="wcf.acp.group"> 
    5                 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Can send trackbacks]]></item> 
     5                <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Can send track- and pingbacks]]></item> 
    66                <item name="wcf.acp.group.option.user.board.canTrackback.description"><![CDATA[Members of this group can send trackbacks for an automated exhcange of messages and backlinks.]]></item> 
     7        </category> 
     8         
     9        <category name="wcf.acp.option"> 
     10                <item name="wcf.acp.option.message_pingback"><![CDATA[Pingback-Server]]></item> 
     11                <item name="wcf.acp.option.message_pingback.description"><![CDATA[Please separate by linebreak.]]></item> 
    712        </category> 
    813         
    914        <category name="wbb.thread"> 
    1015                <item name="wbb.thread.post.trackbacks"><![CDATA[Trackbacks]]></item> 
     16                <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item> 
    1117                <item name="wbb.thread.post.trackback.title"><![CDATA[Title]]></item> 
    1218                <item name="wbb.thread.post.trackback.excerpt"><![CDATA[Excerpt]]></item> 
    1319                <item name="wbb.thread.post.trackback.url"><![CDATA[URL]]></item> 
    14                 <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item> 
    1520        </category> 
    1621         
    1722        <category name="wbb.threadAdd"> 
    18                 <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[activete trackbacks]]></item> 
    19                 <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[Trackbacks allow you to automatically receive messages and backlinks. Optionally you can send trackbacks directly.]]></item> 
    20                 <item name="wbb.threadAdd.settings.trackbackUrls"><![CDATA[send trackbacks to]]></item> 
    21                 <item name="wbb.threadAdd.settings.trackbackUrls.description"><![CDATA[Please divide multiple urls with a linebreak.]]></item> 
     23                <item name="wbb.threadAdd.settings.hasTrackback"><![CDATA[activate track- and pingbacks]]></item> 
     24                <item name="wbb.threadAdd.settings.hasTrackback.description"><![CDATA[Trackbacks allow you to automatically receive messages and backlinks.]]></item> 
    2225        </category> 
    2326</language> 
  • trackback/files/lib/action/TrackbackAction.class.php

    r29 r34  
    44 
    55// WBB includes 
    6 require_once(WBB_DIR.'lib/data/thread/Thread.class.php'); 
     6require_once(WBB_DIR.'lib/data/post/Post.class.php'); 
    77 
    88// Trackback Util 
     
    1414 * @author      Torben Brodt 
    1515 * @package     de.easy-coding.wbb.trackback 
    16  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 
     16 * @license     GNU General Public License <http://opensource.org/licenses/gpl-license.php> 
    1717 */ 
    1818class TrackbackAction extends AbstractAction { 
    1919        // post data 
    20         private $postID = 0; 
    21         private $post; 
     20        protected $postID = 0; 
     21        protected $post; 
    2222         
    2323        // foreign data 
    24         private $title, $excerpt, $url, $blog_name; 
     24        protected $title, $excerpt, $url, $blog_name; 
    2525 
    2626        /** 
     
    3333                if (isset($_GET['postID'])) $this->postID = intval($_GET['postID']); 
    3434                 
     35                // convert everything to our charset 
     36                $charset = isset($_REQUEST['charset']) ? $_REQUEST['charset'] : CHARSET; 
     37                 
    3538                // foreign data 
    36                 if (isset($_REQUEST['title'])) $this->title = $_REQUEST['title']; 
    37                 if (isset($_REQUEST['excerpt'])) $this->excerpt = $_REQUEST['excerpt']; 
    38                 if (isset($_REQUEST['url'])) $this->url = $_REQUEST['url']; 
    39                 if (isset($_REQUEST['blog_name'])) $this->blog_name = $_REQUEST['blog_name']; 
     39                foreach(array('title','excerpt','url','blog_name') as $key) { 
     40                        if (isset($_REQUEST[$key])) { 
     41                                $this->$key = StringUtil::convertEncoding($_REQUEST['charset'], CHARSET, $_REQUEST[$key]); 
     42                                $this->$key = strip_tags($this->$key); 
     43                        } 
     44                } 
    4045                 
    4146                // post details 
     
    4348                 
    4449        } 
     50         
     51        /** 
     52         * return to sender 
     53         * @param error 
     54         * @param error_message 
     55         */ 
     56        protected function response($error = 0, $error_message = '') { 
     57                header('Content-Type: text/xml; charset='.CHARSET); 
     58                if ($error) { 
     59                        echo '<?xml version="1.0" encoding="utf-8"?'.">\n"; 
     60                        echo "<response>\n"; 
     61                        echo "<error>1</error>\n"; 
     62                        echo "<message>$error_message</message>\n"; 
     63                        echo "</response>"; 
     64                        exit; 
     65                } else { 
     66                        echo '<?xml version="1.0" encoding="utf-8"?'.">\n"; 
     67                        echo "<response>\n"; 
     68                        echo "<error>0</error>\n"; 
     69                        echo "</response>"; 
     70                } 
     71        } 
    4572 
    4673        /** 
    4774         * akismet check 
    48          * 
    4975         * @param title 
    5076         * @param excerpt 
     
    79105                // Set page header to XML 
    80106                header('Content-Type: text/xml'); 
    81  
    82                 // check if post exists and trackback is enabled 
    83                 if (!$this->post->postID || !$this->post->hasTrackback) { 
    84                         require_once(WCF_DIR.'lib/system/exception/IllegalLinkException.class.php'); 
    85                         throw new IllegalLinkException(); 
    86                 } 
    87107                 
    88                 // fetch url data 
     108                // fetch data 
    89109                $row = TrackbackUtil::getPost($this->postID); 
    90110 
    91                 // check for spam                
    92                 $isSpam = $this->isSpam($this->title, $this->excerpt, $this->url, $this->blog_name); 
     111                // check if post exists 
     112                if (!$this->post->postID) { 
     113                        $this->response(1, 'Sorry, this item does not exist.'); 
     114                } 
     115                // ... and trackback is enabled 
     116                if(!$this->post->hasTrackback) { 
     117                        $this->response(1, 'Sorry, trackbacks are closed for this item.'); 
     118                } 
    93119 
    94                 // insert trackback data 
    95                 $sql = "INSERT INTO     wbb".WBB_N."_trackback  
    96                         ( 
    97                                         postID,  
    98                                         postURL, 
    99                                         title, 
    100                                         excerpt,  
    101                                         url,  
    102                                         blog_name, 
    103                                         isSpam 
    104                         ) VALUES ( 
    105                                         {$this->postID},  
    106                                         '".escapeString($row['url'])."', 
    107                                         '".escapeString($this->title)."', 
    108                                         '".escapeString($this->excerpt)."', 
    109                                         '".escapeString($this->url)."', 
    110                                         '".escapeString($this->blog_name)."', 
    111                                         $isSpam} 
    112                         );"; 
     120                // check for duplicates 
     121                $sql = "SELECT  COUNT(*) AS c 
     122                        FROM    wbb".WBB_N."_trackback  
     123                        WHERE   postID = {$this->postID} 
     124                        AND     url = '".escapeString($this->url)."'; "; 
     125                         
     126                $row = WBBCore::getDB()->getFirstRow($sql); 
     127                if(intval($row['c']) > 0) { 
     128                        $this->response(1, 'We already have a ping from that URL for this post.'); 
     129                } 
    113130 
    114                 WBBCore::getDB()->sendQuery($sql); 
     131                // save 
     132                TrackbackUtil::save($this->postID, $row['url'], $this->title, $this->excerpt, $this->url, $this->blog_name); 
     133 
     134                // finish 
    115135                $this->executed(); 
     136                $this->response(0); 
    116137        } 
    117138} 
  • trackback/files/lib/system/cronjob/TrackbackCheckCronjob.class.php

    r29 r34  
    88 * @author      Torben Brodt 
    99 * @package     de.easy-coding.wcf.trackback 
    10  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 
     10 * @license     GNU General Public License <http://opensource.org/licenses/gpl-license.php> 
    1111 */ 
    1212class TrackbackCheckCronjob implements Cronjob { 
  • trackback/files/lib/system/event/listener/ThreadAddFormTrackbackListener.class.php

    r32 r34  
    1111 * @author      Torben Brodt 
    1212 * @package     de.easy-coding.wbb.trackback 
    13  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 
     13 * @license     GNU General Public License <http://opensource.org/licenses/gpl-license.php> 
    1414 */ 
    1515class ThreadAddFormTrackbackListener implements EventListener { 
     
    1818 
    1919        protected $hasTrackback = 0; 
    20         protected $trackbackUrls = ""; 
    21         protected $trackbackUrlsOld = ""; 
    22  
    23         protected $url, $title, $excerpt, $author; 
     20        protected $trackbackUrls = array(); 
     21        protected $trackbackUrlsOld = array(); 
    2422 
    2523        /** 
     
    5149        protected function readData () { 
    5250                $this->hasTrackback = $this->eventObj->post->hasTrackback; 
    53                 $this->trackbackUrls = $this->eventObj->post->trackbackUrls; 
    54                 $this->trackbackUrlsOld = $this->eventObj->post->trackbackUrls; 
     51 
     52                $this->trackbackUrls; //TODO: REGEX FROM POSTING 
     53                $this->trackbackUrlsOld; //TODO: SELECT FROM DATABASE ~ wbb1_1_trackbackLog 
    5554        } 
    5655 
     
    6059        protected function readFormParameters () { 
    6160                if (isset($_REQUEST['hasTrackback'])) $this->hasTrackback = intval($_REQUEST['hasTrackback']); 
    62                 if (isset($_REQUEST['trackbackUrls'])) $this->trackbackUrls = $_REQUEST['trackbackUrls']; 
    63                 if (isset($_REQUEST['trackbackUrlsOld'])) $this->trackbackUrlsOld = $_REQUEST['trackbackUrlsOld']; 
    6461        } 
    6562         
     
    6865         */ 
    6966        protected function assignVariables () { 
    70                 WBBCore::getTPL()->assign(array( 
    71                                 'hasTrackback' => $this->hasTrackback, 
    72                                 'trackbackUrls'=> $this->trackbackUrls 
    73                         )); 
     67                WBBCore::getTPL()->assign('hasTrackback', $this->hasTrackback); 
    7468                WBBCore::getTPL()->append('additionalSettings', WBBCore::getTPL()->fetch('postTrackbackSetting')); 
    7569        } 
     
    9185                } 
    9286                 
    93                 // fetch data from database 
    94                 $this->readTrackbackData($postID); 
    95                  
    9687                // send new trackbacks to given urls 
    97                 $this->discoverNewTrackbacks(); 
     88                $this->sendTrackbackData($postID, $text); 
    9889 
    9990                // UPDATE 
    10091                $sql = "UPDATE          wbb".WBB_N."_post 
    101                         SET             hasTrackback    = {$this->hasTrackback}, 
    102                                         trackbackUrls   = '".escapeString($this->trackbackUrls)."' 
     92                        SET             hasTrackback    = {$this->hasTrackback} 
    10393                        WHERE           postID          = {$postID};"; 
    10494 
     
    10999         * fetch trackback data from database (maybe an event would be faster) 
    110100         * @param postID 
     101         * @param text 
    111102         */ 
    112         private function readTrackbackData($postID) { 
     103        protected function sendTrackbackData($postID, $text) { 
    113104                // fetch data 
    114105                $row = TrackbackUtil::getPost($postID); 
    115  
    116                 // assign basic data 
    117                 $this->title = $row['topic']; 
    118                 $this->excerpt = substr($row['firstPostPreview'],0,255); 
    119                 $this->author = $row['username']; 
    120                 $this->url = $row['url']; 
    121         } 
    122          
    123         /** 
    124          * discover and ping new trackbacks 
    125          */ 
    126         private function discoverNewTrackbacks() { 
    127                 $newlist = explode(' ', $this->trackbackUrls); 
    128                 $oldlist = explode(' ', $this->trackbackUrlsOld); 
    129106                 
    130                 // Trackback 
    131                 $trackback = new TrackbackUtil(PAGE_TITLE, $this->author, CHARSET); 
    132                 //$tb_array = $trackback->auto_discovery($this->eventObj->post->message); 
    133                  
    134                 // Found trackbacks in TEXT. Looping... 
    135                 foreach(array_diff($newlist, $oldlist) as $tb_url) { 
    136                         // Attempt to ping each new one... 
    137                         $trackback->ping($tb_url, $this->url, $this->title, $this->excerpt); 
     107                preg_match_all(); //TODO: regex to find urls in bbcodes 
     108                foreach($regex as $url) { 
     109                        TrackbackUtil::trackAndPing(PAGE_TITLE, $this->author, $row['topic'], substr($row['firstPostPreview'],0,255), $row['username'], $row['url']); 
    138110                } 
    139111        } 
  • trackback/files/lib/system/event/listener/ThreadPageTrackbackListener.class.php

    r33 r34  
    1111 * @author      Torben Brodt 
    1212 * @package     de.easy-coding.wbb.trackback 
    13  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 
     13 * @license     GNU General Public License <http://opensource.org/licenses/gpl-license.php> 
    1414 */ 
    1515class ThreadPageTrackbackListener implements EventListener { 
  • trackback/files/lib/util/TrackbackUtil.class.php

    r32 r34  
    11<?php 
    2 // Utils 
    3 require_once(WBB_DIR.'lib/util/Trackback.class.php'); 
    42 
    53/** 
     
    86 * @author      Torben Brodt 
    97 * @package     de.easy-coding.wbb.trackback 
    10  * @license     GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> 
     8 * @license     GNU General Public License <http://opensource.org/licenses/gpl-license.php> 
    119 */ 
    12 class TrackbackUtil extends Trackback { 
    13  
    14         /** 
    15          * Produces XML response for trackbackers with ok/error message. 
    16          *  
    17          * @param boolean $success  
    18          * @param string $err_response  
    19          * @return boolean  
    20          */ 
    21         public function receive($success = false, $err_response = ""){  
    22                 return parent::recieve($cussess, $err_response); 
    23         } 
    24          
    25         /** 
    26          * Sends a trackback ping to a specified trackback URL. 
    27          * allowing clients to auto-discover the TrackBack Ping URL.  
    28          *  
    29          * @param string $tb  
    30          * @param string $url  
    31          * @param string $title  
    32          * @param string $excerpt  
    33          * @return boolean  
    34          */ 
    35         public function ping($tb, $url, $title = "", $excerpt = "") { 
    36                 $target = parse_url($tb); 
    37                 if(!array_key_exists('path', $target)) { 
    38                         $tb .= '/'; 
    39                 } 
    40                  
    41                 @parent::ping($tb, $url, $title, $excerpt); 
    42         } 
    43          
    44         /** 
     10class TrackbackUtil { 
     11        protected $agent = 'Woltlab Burning Board Trackback Mod'; 
     12 
     13        /** 
     14         * fetchs necessery postdata 
    4515         * @param postIDs 
    4616         * @return array 
     
    7646                return $row; 
    7747        } 
     48         
     49        /** 
     50         * 
     51         * @param postID 
     52         * @param postURL 
     53         * @param title 
     54         * @param excerpt 
     55         * @param url 
     56         * @param blog_name 
     57         */ 
     58        public function save($postID, $postURL, $title, $excerpt, $url, $blog_name) { 
     59                // akismet check spam 
     60                $isSpam = $this->isSpam($title, $excerpt, $url, $blog_name); 
     61         
     62                // insert trackback data 
     63                $sql = "INSERT INTO     wbb".WBB_N."_trackback  
     64                        ( 
     65                                        postID,  
     66                                        postURL, 
     67                                        title, 
     68                                        excerpt,  
     69                                        url,  
     70                                        blog_name, 
     71                                        isSpam 
     72                        ) VALUES ( 
     73                                        {$postID},  
     74                                        '".escapeString($postURL)."', 
     75                                        '".escapeString($title)."', 
     76                                        '".escapeString($excerpt)."', 
     77                                        '".escapeString($url)."', 
     78                                        '".escapeString($blog_name)."', 
     79                                        $isSpam} 
     80                        );"; 
     81 
     82                WBBCore::getDB()->sendQuery($sql); 
     83        } 
     84         
     85        /** 
     86         * 
     87         * @param alienurl 
     88         * @param page_title 
     89         * @param author 
     90         * @param url 
     91         * @param title 
     92         * @param excerpt 
     93         */ 
     94        public function trackAndPing($alienurl, $page_title, $author, $url, $title, $excerpt) { 
     95                $content = ""; // hold as reference 
     96 
     97                // auto discovery 
     98                $pingbacks = $this->discover_pingback_uri($alienurl, $content); 
     99                $trackbacks = count($pingbacks) > 0 ? array() : $this->discover_trackback_uri($content); 
     100                 
     101                // merge pingbacks with public pingback services 
     102                $pingbacks = array_merge($pingbacks, explode("\n", StringUtil::unifyNewlines(MESSAGE_PINGBACK))); 
     103 
     104                // send pingbacks 
     105                foreach($pingbacks as $pingbackurl) { 
     106                        $this->send_pingback($alienurl, $pingbackurl, $page_title, $url); 
     107                } 
     108 
     109                // send trackbacks 
     110                foreach($trackbacks as $trackbackurl) { 
     111                        $this->send_trackback($trackbackurl, $page_title, $author, $url, $title, $excerpt); 
     112                } 
     113        } 
     114         
     115        /** 
     116         * akismet check 
     117         * @param title 
     118         * @param excerpt 
     119         * @param url 
     120         * @param blog_name 
     121         */      
     122        protected function isSpam($title, $excerpt, $url, $blog_name) { 
     123                if(!defined('AKISMET_API_KEY')) 
     124                        return true; 
     125                 
     126                // WCF includes 
     127                require_once(WCF_DIR.'lib/util/AkismetUtil.class.php'); 
     128 
     129                $akismet = new AkismetUtil(AKISMET_API_KEY,PAGE_URL); 
     130                $akismet->setCommentType('trackback'); 
     131                $akismet->setPermalink($myurl); //absolute 
     132                 
     133                // assign post data 
     134                $akismet->setCommentAuthor($title); 
     135                $akismet->setCommentAuthorURL($url); 
     136                $akismet->setCommentContent($excerpt); 
     137 
     138                return $akismet->isCommentSpam(); 
     139        } 
     140         
     141        /** 
     142         * @param url 
     143         * @return pingbacks 
     144         */ 
     145        protected function discover_pingback_uri($url, &$text) { 
     146                $pingbacks = array(); // return var 
     147 
     148                $byte_count = 0; 
     149                $contents = ''; 
     150                $headers = ''; 
     151                $pingback_str_dquote = 'rel="pingback"'; 
     152                $pingback_str_squote = 'rel=\'pingback\''; 
     153                $x_pingback_str = 'x-pingback: '; 
     154                $pingback_href_original_pos = 27; 
     155 
     156                // parse url 
     157                $parse = parse_url($url); 
     158                $host =  (isset($parse['host'])) ? $parse['host'] : null; 
     159                $path  = (isset($parse['path'])) ? $parse['path'] : '/'; 
     160                $path .= (isset($parse['query'])) ? "?".$parse['query'] : ''; 
     161                $port  = (isset($parse['port'])) ? $parse['port'] : 80; 
     162 
     163                // Try to connect to the server at $host 
     164                $fp = @fsockopen($host, $port, $errno, $errstr, 2); 
     165                if ( !$fp ) // Couldn't open a connection to $host 
     166                        return false; 
     167 
     168                // Send the GET request 
     169                $request = "GET {$path} HTTP/1.1\r\nHost: $host\r\nUser-Agent: {$this->agent} \r\n\r\n"; 
     170                fputs($fp, $request); 
     171 
     172                // Let's check for an X-Pingback header first 
     173                while ( !feof($fp) ) { 
     174                        $line = fgets($fp, 512); 
     175                        if(trim($line) == '') //empty line = headers complete 
     176                                break; 
     177 
     178                        $headers .= trim($line)."\n"; 
     179                        $x_pingback_header_offset = strpos(strtolower($headers), $x_pingback_str); 
     180 
     181                        if($x_pingback_header_offset) { 
     182                                // We got it! 
     183                                preg_match('#x-pingback: (.+)#is', $headers, $matches); 
     184                                $pingbacks[] = trim($matches[1]); 
     185                        } 
     186 
     187                        if(strpos(strtolower($headers), 'content-type: ')) { 
     188                                preg_match('#content-type: (.+)#is', $headers, $matches); 
     189                                $content_type = trim($matches[1]); 
     190                        } 
     191                } 
     192 
     193                if ( preg_match('#(image|audio|video|model)/#is', $content_type) ) // Not an (x)html, sgml, or xml page, no use going further 
     194                        return false; 
     195 
     196                while ( !feof($fp) ) { 
     197                        $line = fgets($fp, 1024); 
     198                        $contents .= trim($line); 
     199                        $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote); 
     200                        $pingback_link_offset_squote = strpos($contents, $pingback_str_squote); 
     201                        if($pingback_link_offset_dquote || $pingback_link_offset_squote) { 
     202                                $quote = ($pingback_link_offset_dquote) ? '"' : '\''; 
     203                                $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote; 
     204                                $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset); 
     205                                $pingback_href_start = $pingback_href_pos+6; 
     206                                $pingback_href_end = @strpos($contents, $quote, $pingback_href_start); 
     207                                $pingback_server_url_len = $pingback_href_end - $pingback_href_start; 
     208                                $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len); 
     209                                // We may find rel="pingback" but an incomplete pingback URL 
     210                                if ( $pingback_server_url_len > 0 ) { 
     211                                        // We got it! 
     212                                        $pingbacks[] = $pingback_server_url; 
     213                                } 
     214                        } 
     215                        $byte_count += strlen($line); 
     216                        if ( $byte_count > $timeout_bytes ) { 
     217                                // It's no use going further, there probably isn't any pingback 
     218                                // server to find in this file. (Prevents loading large files.) 
     219                                break; 
     220                        } 
     221                } 
     222                 
     223                return $pingbacks; 
     224        } 
     225         
     226        /** 
     227         * discover trackback uri 
     228         * @param contents 
     229         * @return trackbacks 
     230         */ 
     231        protected function discover_trackback_uri($contents) { 
     232                $rdf = array(); // <- holds list of RDF segments 
     233 
     234                if ($contents) { 
     235                        preg_match_all('/(<rdf:RDF.*?<\/rdf:RDF>)/sm', $contents, $link_rdf, PREG_SET_ORDER); 
     236 
     237                        // Loop through all rdf segments  
     238                        for ($i = 0; $i < count($link_rdf); $i++) { 
     239                                if (preg_match('|dc:identifier="' . preg_quote($link) . '"|ms', $link_rdf[$i][1])) { 
     240                                        $rdf[] = trim($link_rdf[$i][1]); 
     241                                }  
     242                        }  
     243                } 
     244 
     245                // Loop through the RDFs array and extract trackback URIs 
     246                $trackbacks = array(); // <- holds list of trackback URIs 
     247                foreach($rdf as $rdf_url) { 
     248                        if (preg_match('/trackback:ping="([^"]+)"/', $rdf_url, $array)) { 
     249                                $trackbacks[] = trim($array[1]); 
     250                        }  
     251                }  
     252 
     253                return $trackbacks; 
     254        } 
     255 
     256 
     257        /** 
     258         * 
     259         */ 
     260        protected function send_pingback($alienurl, $pingbackurl, $url) { 
     261                require_once(WBB_DIR.'lib/util/IXR.class.php'); 
     262 
     263                // using a timeout of 3 seconds should be enough to cover slow servers 
     264                $client = new IXR_Client($pingbackurl); 
     265                $client->timeout = 3; 
     266                $client->useragent = $this->agent; 
     267 
     268                // when set to true, this outputs debug messages by itself 
     269                $client->debug = false; 
     270 
     271                // Already registered 
     272                if ($client->query('pingback.ping', $url, $alienurl) || (isset($client->error->code) && 48 == $client->error->code)) { 
     273                        add_ping($post_ID, $pagelinkedto); 
     274                } 
     275        } 
     276 
     277        /** 
     278         * Send a Trackback 
     279         */ 
     280        protected function send_trackback($trackbackurl, $page_title, $author, $url, $title, $excerpt) { 
     281                $blog_name = urlencode($page_title); 
     282                $author = urlencode($author); 
     283                $title = urlencode($title); 
     284                $excerpt = urlencode($excerpt); 
     285 
     286                $query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt"; 
     287 
     288                $parse = parse_url($trackback_url); 
     289                $http_request = 'POST ' . $parse['path'] . ($parse['query'] ? '?'.$parse['query'] : '') . " HTTP/1.0\r\n"; 
     290                $http_request .= 'Host: '.$parse['host']."\r\n"; 
     291                $http_request .= 'Content-Type: application/x-www-form-urlencoded; charset='.CHARSET."\r\n"; 
     292                $http_request .= 'Content-Length: '.strlen($query_string)."\r\n"; 
     293                $http_request .= "User-Agent: {$this->agent}"; 
     294                $http_request .= "\r\n\r\n"; 
     295                $http_request .= $query_string; 
     296 
     297                $fs = @fsockopen($parse['host'], isset($parse['port'])?$parse['port']:80, $errno, $errstr, 4); 
     298                @fputs($fs, $http_request); 
     299                @fclose($fs); 
     300        } 
    78301}  
    79  
    80302?> 
  • trackback/install.sql

    r32 r34  
    11ALTER TABLE wbb1_1_post ADD hasTrackback TINYINT(1) UNSIGNED NOT NULL; 
    2 ALTER TABLE wbb1_1_post ADD trackbackUrls TEXT NOT NULL DEFAULT ''; 
    32 
    43CREATE TABLE wbb1_1_trackback ( 
     
    1514) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
    1615 
     16CREATE TABLE wbb1_1_trackbackLog ( 
     17  postID int(10) unsigned NOT NULL, 
     18  alienURL varchar(255) NOT NULL DEFAULT '', 
     19  timestamp int(12) NOT NULL DEFAULT 0, 
     20  message varchar(255) NOT NULL DEFAULT '', 
     21  PRIMARY KEY (postID, alienUrl) 
     22) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
  • trackback/package.xml

    r32 r34  
    55                <packagename>Trackback</packagename> 
    66                <packagedescription>Allow trackback for posts</packagedescription> 
    7                 <version>0.0.3</version> 
     7                <version>0.0.4</version> 
    88                <date>DATE</date> 
    99                <plugin>com.woltlab.wbb</plugin> 
  • trackback/templates/postTrackback.tpl

    r33 r34  
    11{if $post->hasTrackback} 
     2        {capture append=specialStyles} 
     3        <link rel="pingback" href="{PAGE_URL}index.php?action=Pingback" /> 
     4        <!-- 
     5        <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" 
     6                xmlns:dc=\"http://purl.org/dc/elements/1.1/\" 
     7                xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\"> 
     8        <rdf:Description 
     9                rdf:about=\"" . $this->xml_safe($permalink) . "\" 
     10                dc:identifier=\"" . $this->xml_safe($permalink) . "\" 
     11                trackback:ping=\"" . $this->xml_safe($trackback) . "\" 
     12                dc:title=\"" . $this->xml_safe($title) . "\" 
     13                dc:subject=\"TrackBack\" 
     14                dc:description=\"" . $this->xml_safe($this->cut_short($expert)) . "\" 
     15                dc:creator=\"" . $this->xml_safe($author) . "\" 
     16                dc:date=\"" . $RFC822_date . "\" /> 
     17        </rdf:RDF> 
     18        --> 
     19        {/capture} 
     20         
    221        {@$autodiscover} 
    322        {if $postTrackbacks[$messageID]|isset} 
  • trackback/templates/postTrackbackSetting.tpl

    r32 r34  
    77                        {lang}wbb.threadAdd.settings.hasTrackback.description{/lang} 
    88                </div> 
    9  
    10                 <div id="trackbackSetting" {if !$hasTrackback}style="display:none"{/if}> 
    11                         <div class="formField"> 
    12                                 &nbsp; 
    13                         </div> 
    14                         <div class="formFieldDesc"> 
    15                                 <input type="hidden" name="trackbackUrls" value="{$trackbackUrls}" /> 
    16                                 <textarea name="trackbackUrls" id="trackbackUrls" rows="3" cols="20">{$trackbackUrls}</textarea><br /> 
    17                                 <p>{lang}wbb.threadAdd.settings.trackbackUrls{/lang} - {lang}wbb.threadAdd.settings.trackbackUrls.description{/lang}</p> 
    18                         </div> 
    19                 </div> 
    209{/if}