@ -1,17 +1,52 @@ | |||||
<?php | <?php | ||||
namespace Telegraph; | namespace Telegraph; | ||||
use ORM, Exception; | use ORM, Exception; | ||||
use IndieWeb\MentionClient; | |||||
class Webmention { | class Webmention { | ||||
public static function send($id) { | |||||
$w = ORM::for_table('webmentions')->where('id', $id)->find_one(); | |||||
if(!$w) { | |||||
private static function saveStatus($webmentionID, $code, $raw=null) { | |||||
$status = ORM::for_table('webmention_status')->create(); | |||||
$status->webmention_id = $webmentionID; | |||||
$status->created_at = date('Y-m-d H:i:s'); | |||||
$status->status = $code; | |||||
$status->save(); | |||||
} | |||||
public static function send($id, $client=false) { | |||||
$webmention = ORM::for_table('webmentions')->where('id', $id)->find_one(); | |||||
if(!$webmention) { | |||||
echo 'Webmention '.$id.' was not found'."\n"; | echo 'Webmention '.$id.' was not found'."\n"; | ||||
return; | return; | ||||
} | } | ||||
if(!$client) | |||||
$client = new MentionClient(); | |||||
// Discover the webmention or pingback endpoint | |||||
$endpoint = $client->discoverWebmentionEndpoint($webmention->target); | |||||
if(!$endpoint) { | |||||
// If no webmention endpoint found, try to send a pingback | |||||
$pingbackEndpoint = $client->discoverPingbackEndpoint($webmention->target); | |||||
// If no pingback endpoint was found, we can't do anything else | |||||
if(!$pingbackEndpoint) { | |||||
self::saveStatus($id, 'not_supported'); | |||||
return; | |||||
} | |||||
$webmention->pingback_endpoint = $pingbackEndpoint; | |||||
$webmention->save(); | |||||
$success = $client->sendPingbackToEndpoint($pingbackEndpoint, $webmention->source, $webmention->target); | |||||
self::saveStatus($id, $success ? 'pingback_success' : 'pingback_error'); | |||||
return; | |||||
} | |||||
} | } | ||||
} | } |
@ -0,0 +1,88 @@ | |||||
<?php | |||||
use Symfony\Component\HttpFoundation\Request; | |||||
use Symfony\Component\HttpFoundation\Response; | |||||
class ProcessTest extends PHPUnit_Framework_TestCase { | |||||
private $client; | |||||
public function setUp() { | |||||
$this->client = new API(); | |||||
$this->client->http = new Telegraph\HTTPTest(); | |||||
ORM::for_table('users')->raw_query('TRUNCATE users')->delete_many(); | |||||
ORM::for_table('roles')->raw_query('TRUNCATE roles')->delete_many(); | |||||
ORM::for_table('sites')->raw_query('TRUNCATE sites')->delete_many(); | |||||
ORM::for_table('webmentions')->raw_query('TRUNCATE webmentions')->delete_many(); | |||||
ORM::for_table('webmention_status')->raw_query('TRUNCATE webmention_status')->delete_many(); | |||||
} | |||||
private function _createExampleAccount() { | |||||
$user = ORM::for_table('users')->create(); | |||||
$user->url = 'http://example.com'; | |||||
$user->save(); | |||||
$site = ORM::for_table('sites')->create(); | |||||
$site->name = 'Example'; | |||||
$site->created_by = $user->id(); | |||||
$site->save(); | |||||
$role = ORM::for_table('roles')->create(); | |||||
$role->site_id = $site->id(); | |||||
$role->user_id = $user->id(); | |||||
$role->role = 'owner'; | |||||
$role->token = 'a'; | |||||
$role->save(); | |||||
} | |||||
private function webmention($params) { | |||||
$request = new Request($params); | |||||
$response = new Response(); | |||||
$response = $this->client->webmention($request, $response); | |||||
$webmention = ORM::for_table('webmentions')->where(['source' => $params['source'], 'target' => $params['target']])->find_one(); | |||||
$client = new IndieWeb\MentionClientTest(); | |||||
$client::$dataDir = dirname(__FILE__) . '/data/'; | |||||
if(!is_object($webmention)) { | |||||
throw new Exception("No webmention was queued for this test"); | |||||
} | |||||
Telegraph\Webmention::send($webmention->id, $client); | |||||
return $webmention; | |||||
} | |||||
private static function webmentionStatus($id) { | |||||
return ORM::for_table('webmention_status')->where(['webmention_id'=>$id])->order_by_desc('created_at')->find_one(); | |||||
} | |||||
public function testNoEndpoint() { | |||||
$this->_createExampleAccount(); | |||||
$webmention = $this->webmention([ | |||||
'token' => 'a', | |||||
'source' => 'http://source.example.com/no-endpoint', | |||||
'target' => 'http://target.example.com/no-endpoint' | |||||
]); | |||||
$status = $this->webmentionStatus($webmention->id); | |||||
$this->assertEquals($status->status, 'not_supported'); | |||||
} | |||||
public function testPingbackSuccess() { | |||||
$this->_createExampleAccount(); | |||||
$webmention = $this->webmention([ | |||||
'token' => 'a', | |||||
'source' => 'http://source.example.com/pingback-success', | |||||
'target' => 'http://target.example.com/pingback-success' | |||||
]); | |||||
$status = $this->webmentionStatus($webmention->id); | |||||
$this->assertEquals($status->status, 'pingback_success'); | |||||
} | |||||
public function testPingbackFailed() { | |||||
$this->_createExampleAccount(); | |||||
$webmention = $this->webmention([ | |||||
'token' => 'a', | |||||
'source' => 'http://source.example.com/pingback-failed', | |||||
'target' => 'http://target.example.com/pingback-failed' | |||||
]); | |||||
$status = $this->webmentionStatus($webmention->id); | |||||
$this->assertEquals($status->status, 'pingback_error'); | |||||
} | |||||
} |
@ -0,0 +1,3 @@ | |||||
HTTP/1.1 404 Not Found | |||||
The page was not found. |
@ -0,0 +1,23 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/xml; charset=utf-8 | |||||
Connection: keep-alive | |||||
<?xml version="1.0" ?> | |||||
<methodResponse> | |||||
<fault> | |||||
<value> | |||||
<struct> | |||||
<member> | |||||
<name>faultCode</name> | |||||
<value><i4>17</i4></value> | |||||
</member> | |||||
<member> | |||||
<name>faultString</name> | |||||
<value><string>The source does not link to the target</string></value> | |||||
</member> | |||||
</struct> | |||||
</value> | |||||
</fault> | |||||
</methodResponse> |
@ -0,0 +1,16 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/xml; charset=utf-8 | |||||
Connection: keep-alive | |||||
<?xml version="1.0" ?> | |||||
<methodResponse> | |||||
<params> | |||||
<param> | |||||
<value> | |||||
<string>pingback was successful</string> | |||||
</value> | |||||
</param> | |||||
</params> | |||||
</methodResponse> |
@ -0,0 +1,16 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content"> | |||||
<a href="http://target.example.com/no-endpoint">target</a> | |||||
</p> | |||||
</body> | |||||
</html> |
@ -0,0 +1,16 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content"> | |||||
<a href="http://target.example.com/pingback-failed">target</a> | |||||
</p> | |||||
</body> | |||||
</html> |
@ -0,0 +1,16 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content"> | |||||
<a href="http://target.example.com/pingback-success">target</a> | |||||
</p> | |||||
</body> | |||||
</html> |
@ -0,0 +1,14 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content">This page has no webmention or pingback endpoint configured</p> | |||||
</body> | |||||
</html> |
@ -0,0 +1,15 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
<link rel="pingback" href="http://pingback.example.com/error"> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content">This has a pingback endpoint that will return an error</p> | |||||
</body> | |||||
</html> |
@ -0,0 +1,15 @@ | |||||
HTTP/1.1 200 OK | |||||
Server: Apache | |||||
Date: Wed, 09 Dec 2015 03:29:14 GMT | |||||
Content-Type: text/html; charset=utf-8 | |||||
Connection: keep-alive | |||||
<html> | |||||
<head> | |||||
<title>Test</title> | |||||
<link rel="pingback" href="http://pingback.example.com/success"> | |||||
</head> | |||||
<body class="h-entry"> | |||||
<p class="e-content">This has a pingback endpoint that will return success</p> | |||||
</body> | |||||
</html> |