From d351d33621f79fe7e3be5e7033823216007d2c9d Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 11 Apr 2013 01:01:09 +0200 Subject: [PATCH] API Remove Trackback support It was disabled since migrating the module to SS3, and the whole concept has become less relevant since spammers discovered trackbacks (ref http://en.wikipedia.org/wiki/Trackback#Spam). Since we don't have the resources to make a spam-proof trackback system, its prudent to remove it instead. --- code/BlogEntry.php | 20 ---- code/BlogHolder.php | 19 ++-- code/TrackBackDecorator.php | 161 ------------------------------- code/TrackBackPing.php | 24 ----- code/TrackBackURL.php | 55 ----------- templates/Includes/TrackBacks.ss | 20 ---- templates/Layout/BlogEntry.ss | 3 - templates/TrackBackPingReturn.ss | 5 - templates/TrackBackRdf.ss | 3 - tests/BlogTrackbackTest.php | 127 ------------------------ tests/BlogTrackbackTest.yml | 38 -------- 11 files changed, 9 insertions(+), 466 deletions(-) delete mode 100644 code/TrackBackDecorator.php delete mode 100644 code/TrackBackPing.php delete mode 100644 code/TrackBackURL.php delete mode 100644 templates/Includes/TrackBacks.ss delete mode 100644 templates/TrackBackPingReturn.ss delete mode 100644 templates/TrackBackRdf.ss delete mode 100644 tests/BlogTrackbackTest.php delete mode 100644 tests/BlogTrackbackTest.yml diff --git a/code/BlogEntry.php b/code/BlogEntry.php index 5528f78..db1c1b6 100644 --- a/code/BlogEntry.php +++ b/code/BlogEntry.php @@ -37,10 +37,6 @@ class BlogEntry extends Page { 'ShowInMenus' => false ); - private static $extensions = array( - 'TrackBackDecorator' - ); - /** * Is WYSIWYG editing allowed? * @var boolean @@ -174,21 +170,6 @@ class BlogEntry extends Page { return ($this->getParent()) ? $this->getParent()->Link('post') . '/' . $this->ID . '/' : false; } - /** - * Check to see if trackbacks are enabled. - */ - function TrackBacksEnabled() { - return ($this->getParent()) ? $this->getParent()->TrackBacksEnabled : false; - } - - function trackbackping() { - if($this->TrackBacksEnabled() && $this->hasExtension('TrackBackDecorator')) { - return $this->decoratedTrackbackping(); - } else { - Controller::curr()->redirect($this->Link()); - } - } - function IsOwner() { if(method_exists($this->Parent(), 'IsOwner')) { return $this->Parent()->IsOwner(); @@ -251,7 +232,6 @@ class BlogEntry_Controller extends Page_Controller { private static $allowed_actions = array( 'index', - 'trackbackping', 'unpublishPost', 'PageComments', 'SearchForm' diff --git a/code/BlogHolder.php b/code/BlogHolder.php index 64e74a3..b7ecbb4 100644 --- a/code/BlogHolder.php +++ b/code/BlogHolder.php @@ -14,15 +14,14 @@ class BlogHolder extends BlogTree implements PermissionProvider { private static $icon = "blog/images/blogholder-file.png"; - + private static $description = "Displays listings of blog entries"; private static $singular_name = 'Blog Holder Page'; - + private static $plural_name = 'Blog Holder Pages'; private static $db = array( - 'TrackBacksEnabled' => 'Boolean', 'AllowCustomAuthors' => 'Boolean', 'ShowFullEntry' => 'Boolean', ); @@ -42,13 +41,13 @@ class BlogHolder extends BlogTree implements PermissionProvider { $fields = parent::getCMSFields(); SiteTree::enableCMSFieldsExtensions(); - //sets the ID and Name Map for Blog Ownership - $owners = new DropdownField('OwnerID', 'Blog owner', $blogOwners->map('ID', 'Name')->toArray()); - $owners->setEmptyString('(None)'); - $owners->setHasEmptyDefault(true); - - $fields->addFieldToTab('Root.Main', new CheckboxField('TrackBacksEnabled', 'Enable TrackBacks'), "Content"); - $fields->addFieldToTab('Root.Main', $owners, "Content"); + $fields->addFieldToTab( + 'Root.Main', + DropdownField::create('OwnerID', 'Blog owner', $blogOwners->map('ID', 'Name')->toArray()) + ->setEmptyString('(None)') + ->setHasEmptyDefault(true), + "Content" + ); $fields->addFieldToTab('Root.Main', new CheckboxField('AllowCustomAuthors', 'Allow non-admins to have a custom author field'), "Content"); $fields->addFieldToTab("Root.Main", new CheckboxField("ShowFullEntry", "Show Full Entry"), "Content"); diff --git a/code/TrackBackDecorator.php b/code/TrackBackDecorator.php deleted file mode 100644 index 32936e3..0000000 --- a/code/TrackBackDecorator.php +++ /dev/null @@ -1,161 +0,0 @@ - array( - // 'TrackBackURLs' => 'TrackBackURL', - // 'TrackBacks' => 'TrackBackPing' - // ) - // ); - // } - - private static $has_many = array( - 'TrackBackURLs' => 'TrackBackURL', - 'TrackBacks' => 'TrackBackPing' - ); - - // function updateCMSFields($fields) { - // // Trackback URL field - // if($this->owner->TrackBacksEnabled()) { - // $trackbackURLTable = new ComplexTableField( - // $this, - // 'TrackBackURLs', - // 'TrackBackURL', - // array( - // 'URL' => 'URL', - // 'IsPung' => 'Pung?' - // ), - // 'getCMSFields_forPopup', - // '', - // 'ID' - // ); - // $fields->addFieldToTab("Root.Content.Main", $trackbackURLTable); - // } - // else { - // $fields->addFieldToTab("Root.Content.Main", new ReadonlyField("TrackBackURLsReadOnly", _t("BlogEntry.TrackbackURLs", "Trackback URLs"), _t("BlogEntry.TrackbackURLs_DISABLED", "To use this feature, please check 'Enable TrackBacks' check box on the blog holder."))); - // } - // } - - - function onBeforePublish() { - if(!$this->owner->TrackBacksEnabled() && !$this->owner->TrackBackURLs()) return; - - foreach($this->owner->TrackBackURLs() as $trackBackURL) { - if(!$trackBackURL->Pung && $this->trackbackNotify($trackBackURL->URL)) { - $trackBackURL->Pung = true; - $trackBackURL->write(); - } - } - } - - /** - * Trackback notify the specified trackback url - * @param boolean | true on success, otherwise false - */ - function trackbackNotify($url) { - $content = new HTMLText('Content'); - $content->setValue($this->owner->Content); - $excerpt = $content->FirstParagraph(); - - if($this->owner->Parent() && $this->owner->ParentID > 0) { - $blogName = $this->owner->Parent()->Title; - } - else { - $blogName = ""; - } - - $postData = array( - 'url' => $this->owner->AbsoluteLink(), - 'title' => $this->owner->Title, - 'excerpt' => $excerpt, - 'blog_name' => $blogName - ); - - $controller = Object::create(self::$trackback_server_class); - $response = $controller->request($url, $postData); - - if($response->getStatusCode() == '200' && stripos($response->getBody(), "0") !== false) { - return true; - } - - return false; - } - - function updateMetaTags(&$tags) { - $tags .= $this->owner->renderWith('TrackBackRdf'); - } - - function TrackBackPingLink() { - return $this->owner->AbsoluteLink() . 'trackbackping'; - } - - function decoratedTrackbackping() { - $error = 0; - $message = ''; - - if(!(isset($_POST['url']) && $_POST['url'])) { - $error = 1; - $message = 'Missing required POST parameter \'url\'.'; - } else { - $trackbackping = new TrackBackPing(); - $trackbackping->Url = $_POST['url']; - if(isset($_POST['title']) && $_POST['title']) { - $trackbackping->Title = $_POST['title']; - } - if(isset($_POST['excerpt']) && $_POST['excerpt']) { - $trackbackping->Excerpt = $_POST['excerpt']; - } - if(isset($_POST['blog_name']) && $_POST['blog_name']) { - $trackbackping->BlogName = $_POST['blog_name']; - } - $trackbackping->PageID = $this->owner->ID; - $trackbackping->write(); - } - - $returnData = new ArrayData(array( - 'Error' => $error, - 'Message' => $message - )); - - return $returnData->renderWith('TrackBackPingReturn'); - } -} - -/** - * Example: - * $controller = Object::create('TrackbackHTTPClient'); - * $response = $controller->request(new SS_HTTPRequest('POST', $url, null, $postData)); - */ -class TrackbackHTTPServer { - - function __construct() {} - - /** - * @param string - * @param array - * @return SS_HTTPResponse - */ - function request($url, $data) { - $ch = curl_init($url); - - curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); - $response = curl_exec($ch); - $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - - curl_close($ch); - - return new SS_HTTPResponse($response, $statusCode); - } -} - -?> diff --git a/code/TrackBackPing.php b/code/TrackBackPing.php deleted file mode 100644 index 8a102b0..0000000 --- a/code/TrackBackPing.php +++ /dev/null @@ -1,24 +0,0 @@ - 'Varchar', - 'Excerpt' => 'Text', - // 2083 is URL-length limit for IE, AFAIK. - // see: http://www.boutell.com/newfaq/misc/urllength.html - 'Url' => 'Varchar(2048)', - 'BlogName' => 'Varchar' - ); - - private static $has_one = array( - 'Page' => 'Page' - ); - - private static $has_many = array(); - - private static $many_many = array(); - - private static $belongs_many_many = array(); -} - -?> diff --git a/code/TrackBackURL.php b/code/TrackBackURL.php deleted file mode 100644 index a14e059..0000000 --- a/code/TrackBackURL.php +++ /dev/null @@ -1,55 +0,0 @@ - 'Varchar(2048)', - 'Pung' => 'Boolean(0)' - ); - - private static $has_one = array( - 'BlogEntry' => 'BlogEntry' - ); - - function getCMSFields_forPopup() { - - return new FieldList( - new TextField('URL'), - new ReadonlyField('Pung', 'Pung?') - ); - } - - /** - * Return a human-reable string indicate whether the url has been pung or not - * Also update the url if it's duplicate - * @return string - 'Yes' or 'No' - */ - function IsPung() { - if($this->Pung) return _t('TrackBackULR.YES', 'Yes'); - - if($this->isDuplicate(true)) { - $this->Pung = true; - $this->write(); - - return _t('TrackBackULR.YES', 'Yes'); - } - - return _t('TrackBackULR.NO', 'No'); - } - - /** - * Check if there is a duplication, based on the associcated blog entry and the url. - * If onPung is set, it returns true only when the duplicated record that has Pung = true - * @param boolean - * @return boolean - */ - function isDuplicate($onPung = false) { - $where = "\"BlogEntryID\" = {$this->BlogEntryID} AND \"URL\" = '{$this->URL}' AND \"TrackBackURL\".\"ID\" <> {$this->ID}"; - if($onPung) $where .= " AND \"Pung\" = 1"; - - if(DataObject::get_one($this->ClassName, $where)) { - return true; - } - - return false; - } -} diff --git a/templates/Includes/TrackBacks.ss b/templates/Includes/TrackBacks.ss deleted file mode 100644 index 41c04df..0000000 --- a/templates/Includes/TrackBacks.ss +++ /dev/null @@ -1,20 +0,0 @@ -
-

TrackBacks

- - <% if TrackBacks %> - - <% else %> -

No TrackBacks have been submitted for this page.

- <% end_if %> - - Trackback URL for this page. - -
- diff --git a/templates/Layout/BlogEntry.ss b/templates/Layout/BlogEntry.ss index 938a577..1447360 100644 --- a/templates/Layout/BlogEntry.ss +++ b/templates/Layout/BlogEntry.ss @@ -18,8 +18,5 @@ <% if IsOwner %>

<% _t('EDITTHIS', 'Edit this post') %> | <% _t('UNPUBLISHTHIS', 'Unpublish this post') %>

<% end_if %> - <% if TrackBacksEnabled %> - <% include TrackBacks %> - <% end_if %> $PageComments diff --git a/templates/TrackBackPingReturn.ss b/templates/TrackBackPingReturn.ss deleted file mode 100644 index b31f395..0000000 --- a/templates/TrackBackPingReturn.ss +++ /dev/null @@ -1,5 +0,0 @@ - - - $Error - <% if Message %>$Message<% end_if %> - diff --git a/templates/TrackBackRdf.ss b/templates/TrackBackRdf.ss deleted file mode 100644 index 62c73b6..0000000 --- a/templates/TrackBackRdf.ss +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tests/BlogTrackbackTest.php b/tests/BlogTrackbackTest.php deleted file mode 100644 index 274707c..0000000 --- a/tests/BlogTrackbackTest.php +++ /dev/null @@ -1,127 +0,0 @@ -objFromFixture('BlogHolder', 'mainblog'); - $blog->TrackBacksEnabled = true; - $blog->write(); - - $entry = $this->objFromFixture('BlogEntry', 'testpost'); - $response = $entry->trackbackping(); - - $this->assertContains("1", $response); - - $_POST['url'] = 'test trackback post url'; - $_POST['title'] = 'test trackback post title'; - $_POST['excerpt'] = 'test trackback post excerpt'; - $_POST['blog_name'] = 'test trackback blog name'; - - $response = $entry->trackbackping(); - $this->assertContains("0", $response); - - $trackback = DataObject::get_one('TrackBackPing'); - $this->assertEquals('test trackback post url', $trackback->Url); - $this->assertEquals('test trackback post title', $trackback->Title); - $this->assertEquals('test trackback post excerpt', $trackback->Excerpt); - $this->assertEquals('test trackback blog name', $trackback->BlogName); - - unset($_POST); - } - - function testTrackbackNotify() { - $tmpServerClass = TrackBackDecorator::$trackback_server_class; - TrackBackDecorator::$trackback_server_class = "TestTrackbackHTTPServer"; - - $blog = $this->objFromFixture('BlogHolder', 'mainblog'); - $blog->TrackBacksEnabled = true; - $blog->write(); - - $entry = $this->objFromFixture('BlogEntry', 'testpost'); - $this->assertTrue($entry->trackbackNotify('testGoodTrackbackURL')); - $this->assertFalse($entry->trackbackNotify('testBadTrackbackURL')); - $this->assertFalse($entry->trackbackNotify('testNonExistingTrackbackURL')); - - TrackBackDecorator::$trackback_server_class = $tmpServerClass; - } - - function testOnBeforePublish() { - $tmpServerClass = TrackBackDecorator::$trackback_server_class; - TrackBackDecorator::$trackback_server_class = "TestTrackbackHTTPServer"; - - $blog = $this->objFromFixture('BlogHolder', 'mainblog'); - $blog->TrackBacksEnabled = true; - $blog->write(); - - $entry1 = $this->objFromFixture('BlogEntry', 'testpost'); - $entry1->doPublish(); - $this->assertEquals(2, $entry1->TrackBackURLs()->Count()); - - $this->assertEquals(array('testGoodTrackbackURL' => 1), $entry1->TrackBackURLs()->map('URL', 'Pung')->toArray()); - - $entry2 = $this->objFromFixture('BlogEntry', 'testpost2'); - $entry2->doPublish(); - $this->assertEquals(4, $entry2->TrackBackURLs()->Count()); - $this->assertEquals(array('testBadTrackbackURL' => 0, 'testGoodTrackbackURL2' => 1, 'noneExistingURL' => 0, 'testGoodTrackbackURL3' => 1), $entry2->TrackBackURLs()->map('URL', 'Pung')->toArray()); - - TrackBackDecorator::$trackback_server_class = $tmpServerClass; - } - - function testDuplicateIsTrackBackURL() { - $url1 = $this->objFromFixture('TrackBackURL', 'goodTrackBackURL1'); - $urlDup = $this->objFromFixture('TrackBackURL', 'dupTrackBackURL'); - - $url2 = $this->objFromFixture('TrackBackURL', 'goodTrackBackURL2'); - $this->assertFalse($url2->isDuplicate()); - $this->assertFalse($url2->isDuplicate(true)); - - $this->assertTrue($urlDup->isDuplicate()); - $this->assertFalse($urlDup->isDuplicate(true)); - - $url1->Pung = true; - $url1->write(); - $this->assertTrue($urlDup->isDuplicate(true)); - - - } -} - -class TestTrackbackHTTPServer extends TrackbackHTTPServer implements TestOnly { - - function request($url, $data) { - if(in_array($url, array('testGoodTrackbackURL', 'testGoodTrackbackURL2', 'testGoodTrackbackURL3'))) { - $response = $this->goodTrackback(); - $statusCode = '200'; - } - else if($url == 'testBadTrackbackURL') { - $response = $this->badTrackback(); - $statusCode = '200'; - } - else { - $response = $this->badTrackback(); - $statusCode = '404'; - } - - return new SS_HTTPResponse($response, $statusCode); - } - - private function goodTrackback() { - return " - - 0 - - "; - } - - private function badTrackback() { - return " - - 1 - Some error text - "; - } -} \ No newline at end of file diff --git a/tests/BlogTrackbackTest.yml b/tests/BlogTrackbackTest.yml deleted file mode 100644 index 586b7b1..0000000 --- a/tests/BlogTrackbackTest.yml +++ /dev/null @@ -1,38 +0,0 @@ -TrackBackURL: - goodTrackBackURL1: - URL: testGoodTrackbackURL - goodTrackBackURL2: - URL: testGoodTrackbackURL2 - goodTrackBackURL3: - URL: testGoodTrackbackURL3 - badTrackBackURL: - URL: testBadTrackbackURL - noneTrackBackURL: - URL: noneExistingURL - dupTrackBackURL: - URL: testGoodTrackbackURL - -BlogHolder: - mainblog: - Title: Main Blog - -BlogEntry: - testpost: - Title: Test Post - URLSegment: test-post - Date: 2007-02-17 18:45:00 - Parent: =>BlogHolder.mainblog - Tags: tag1,tag2 - TrackBackURLs: =>TrackBackURL.goodTrackBackURL1, =>TrackBackURL.dupTrackBackURL - testpost2: - Title: Test Post 2 - URLSegment: test-post-2 - Parent: =>BlogHolder.mainblog - TrackBackURLs: =>TrackBackURL.badTrackBackURL,=>TrackBackURL.goodTrackBackURL2,=>TrackBackURL.noneTrackBackURL,=>TrackBackURL.goodTrackBackURL3 - - - - - - -