Changeset 34
- Timestamp:
- 09/30/07 22:26:19 (6 years ago)
- Location:
- trackback
- Files:
-
- 3 added
- 1 removed
- 11 modified
-
de.xml (modified) (2 diffs)
-
en.xml (modified) (1 diff)
-
files/lib/action/PingbackAction.class.php (added)
-
files/lib/action/TrackbackAction.class.php (modified) (5 diffs)
-
files/lib/system/cronjob/TrackbackCheckCronjob.class.php (modified) (1 diff)
-
files/lib/system/event/listener/ThreadAddFormTrackbackListener.class.php (modified) (7 diffs)
-
files/lib/system/event/listener/ThreadPageTrackbackListener.class.php (modified) (1 diff)
-
files/lib/util/IXR.class.php (added)
-
files/lib/util/Trackback.class.php (deleted)
-
files/lib/util/TrackbackUtil.class.php (modified) (3 diffs)
-
files/lib/util/XMLRPCServer.class.php (added)
-
install.sql (modified) (2 diffs)
-
package.xml (modified) (1 diff)
-
templates/postTrackback.tpl (modified) (1 diff)
-
templates/postTrackbackSetting.tpl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trackback/de.xml
r32 r34 3 3 <language languagecode="de"> 4 4 <category name="wcf.acp.group"> 5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Kann Track backs senden]]></item>5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Kann Track- & Pingbacks senden]]></item> 6 6 <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> 7 12 </category> 8 13 … … 16 21 17 22 <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> 22 25 </category> 23 26 </language> -
trackback/en.xml
r32 r34 3 3 <language languagecode="en"> 4 4 <category name="wcf.acp.group"> 5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Can send track backs]]></item>5 <item name="wcf.acp.group.option.user.board.canTrackback"><![CDATA[Can send track- and pingbacks]]></item> 6 6 <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> 7 12 </category> 8 13 9 14 <category name="wbb.thread"> 10 15 <item name="wbb.thread.post.trackbacks"><![CDATA[Trackbacks]]></item> 16 <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item> 11 17 <item name="wbb.thread.post.trackback.title"><![CDATA[Title]]></item> 12 18 <item name="wbb.thread.post.trackback.excerpt"><![CDATA[Excerpt]]></item> 13 19 <item name="wbb.thread.post.trackback.url"><![CDATA[URL]]></item> 14 <item name="wbb.thread.post.trackback.blog_name"><![CDATA[Blog]]></item>15 20 </category> 16 21 17 22 <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> 22 25 </category> 23 26 </language> -
trackback/files/lib/action/TrackbackAction.class.php
r29 r34 4 4 5 5 // WBB includes 6 require_once(WBB_DIR.'lib/data/ thread/Thread.class.php');6 require_once(WBB_DIR.'lib/data/post/Post.class.php'); 7 7 8 8 // Trackback Util … … 14 14 * @author Torben Brodt 15 15 * @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> 17 17 */ 18 18 class TrackbackAction extends AbstractAction { 19 19 // post data 20 pr ivate$postID = 0;21 pr ivate$post;20 protected $postID = 0; 21 protected $post; 22 22 23 23 // foreign data 24 pr ivate$title, $excerpt, $url, $blog_name;24 protected $title, $excerpt, $url, $blog_name; 25 25 26 26 /** … … 33 33 if (isset($_GET['postID'])) $this->postID = intval($_GET['postID']); 34 34 35 // convert everything to our charset 36 $charset = isset($_REQUEST['charset']) ? $_REQUEST['charset'] : CHARSET; 37 35 38 // 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 } 40 45 41 46 // post details … … 43 48 44 49 } 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 } 45 72 46 73 /** 47 74 * akismet check 48 *49 75 * @param title 50 76 * @param excerpt … … 79 105 // Set page header to XML 80 106 header('Content-Type: text/xml'); 81 82 // check if post exists and trackback is enabled83 if (!$this->post->postID || !$this->post->hasTrackback) {84 require_once(WCF_DIR.'lib/system/exception/IllegalLinkException.class.php');85 throw new IllegalLinkException();86 }87 107 88 // fetch urldata108 // fetch data 89 109 $row = TrackbackUtil::getPost($this->postID); 90 110 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 } 93 119 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 } 113 130 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 115 135 $this->executed(); 136 $this->response(0); 116 137 } 117 138 } -
trackback/files/lib/system/cronjob/TrackbackCheckCronjob.class.php
r29 r34 8 8 * @author Torben Brodt 9 9 * @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> 11 11 */ 12 12 class TrackbackCheckCronjob implements Cronjob { -
trackback/files/lib/system/event/listener/ThreadAddFormTrackbackListener.class.php
r32 r34 11 11 * @author Torben Brodt 12 12 * @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> 14 14 */ 15 15 class ThreadAddFormTrackbackListener implements EventListener { … … 18 18 19 19 protected $hasTrackback = 0; 20 protected $trackbackUrls = ""; 21 protected $trackbackUrlsOld = ""; 22 23 protected $url, $title, $excerpt, $author; 20 protected $trackbackUrls = array(); 21 protected $trackbackUrlsOld = array(); 24 22 25 23 /** … … 51 49 protected function readData () { 52 50 $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 55 54 } 56 55 … … 60 59 protected function readFormParameters () { 61 60 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'];64 61 } 65 62 … … 68 65 */ 69 66 protected function assignVariables () { 70 WBBCore::getTPL()->assign(array( 71 'hasTrackback' => $this->hasTrackback, 72 'trackbackUrls'=> $this->trackbackUrls 73 )); 67 WBBCore::getTPL()->assign('hasTrackback', $this->hasTrackback); 74 68 WBBCore::getTPL()->append('additionalSettings', WBBCore::getTPL()->fetch('postTrackbackSetting')); 75 69 } … … 91 85 } 92 86 93 // fetch data from database94 $this->readTrackbackData($postID);95 96 87 // send new trackbacks to given urls 97 $this-> discoverNewTrackbacks();88 $this->sendTrackbackData($postID, $text); 98 89 99 90 // UPDATE 100 91 $sql = "UPDATE wbb".WBB_N."_post 101 SET hasTrackback = {$this->hasTrackback}, 102 trackbackUrls = '".escapeString($this->trackbackUrls)."' 92 SET hasTrackback = {$this->hasTrackback} 103 93 WHERE postID = {$postID};"; 104 94 … … 109 99 * fetch trackback data from database (maybe an event would be faster) 110 100 * @param postID 101 * @param text 111 102 */ 112 pr ivate function readTrackbackData($postID) {103 protected function sendTrackbackData($postID, $text) { 113 104 // fetch data 114 105 $row = TrackbackUtil::getPost($postID); 115 116 // assign basic data117 $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 trackbacks125 */126 private function discoverNewTrackbacks() {127 $newlist = explode(' ', $this->trackbackUrls);128 $oldlist = explode(' ', $this->trackbackUrlsOld);129 106 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']); 138 110 } 139 111 } -
trackback/files/lib/system/event/listener/ThreadPageTrackbackListener.class.php
r33 r34 11 11 * @author Torben Brodt 12 12 * @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> 14 14 */ 15 15 class ThreadPageTrackbackListener implements EventListener { -
trackback/files/lib/util/TrackbackUtil.class.php
r32 r34 1 1 <?php 2 // Utils3 require_once(WBB_DIR.'lib/util/Trackback.class.php');4 2 5 3 /** … … 8 6 * @author Torben Brodt 9 7 * @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> 11 9 */ 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 /** 10 class TrackbackUtil { 11 protected $agent = 'Woltlab Burning Board Trackback Mod'; 12 13 /** 14 * fetchs necessery postdata 45 15 * @param postIDs 46 16 * @return array … … 76 46 return $row; 77 47 } 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 } 78 301 } 79 80 302 ?> -
trackback/install.sql
r32 r34 1 1 ALTER TABLE wbb1_1_post ADD hasTrackback TINYINT(1) UNSIGNED NOT NULL; 2 ALTER TABLE wbb1_1_post ADD trackbackUrls TEXT NOT NULL DEFAULT '';3 2 4 3 CREATE TABLE wbb1_1_trackback ( … … 15 14 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 16 15 16 CREATE 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 5 5 <packagename>Trackback</packagename> 6 6 <packagedescription>Allow trackback for posts</packagedescription> 7 <version>0.0. 3</version>7 <version>0.0.4</version> 8 8 <date>DATE</date> 9 9 <plugin>com.woltlab.wbb</plugin> -
trackback/templates/postTrackback.tpl
r33 r34 1 1 {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 2 21 {@$autodiscover} 3 22 {if $postTrackbacks[$messageID]|isset} -
trackback/templates/postTrackbackSetting.tpl
r32 r34 7 7 {lang}wbb.threadAdd.settings.hasTrackback.description{/lang} 8 8 </div> 9 10 <div id="trackbackSetting" {if !$hasTrackback}style="display:none"{/if}>11 <div class="formField">12 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>20 9 {/if}
