From: Christian Weiske Date: Sat, 15 Jun 2013 14:20:38 +0000 (+0200) Subject: check if pingback has been registered already X-Git-Url: https://git.cweiske.de/stapibas.git/commitdiff_plain/89d92d397268eb638352629310b09d4f20df592a check if pingback has been registered already --- diff --git a/src/stapibas/Feed/PingUrls.php b/src/stapibas/Feed/PingUrls.php index 1e98f0a..69045b5 100644 --- a/src/stapibas/Feed/PingUrls.php +++ b/src/stapibas/Feed/PingUrls.php @@ -61,7 +61,8 @@ class Feed_PingUrls $this->log->info('Pinging %d URLs..', count($options)); $res = $this->db->query( - 'SELECT fe_url, feu_id, feu_url FROM feedentries, feedentryurls' + 'SELECT fe_url, feu_id, feu_url, feu_tries' + . ' FROM feedentries, feedentryurls' . ' WHERE fe_id = feu_fe_id' . $this->sqlNeedsUpdate() . ' AND (' . implode(' OR ', $options) . ')' @@ -116,14 +117,17 @@ class Feed_PingUrls ); } else { //error - $this->log->err('Error: ' . $res->getCode() . ': ' . $res->getMessage()); + $code = $res->getCode(); + $this->log->err('Error: ' . $code . ': ' . $res->getMessage()); $httpRes = $res->getResponse(); if ($httpRes) { $this->log->info( 'Pingback response: Status code ' . $httpRes->getStatus() . ', headers: ' . print_r($httpRes->getHeader(), true) ); - //. ', body: ' .$httpRes->getBody() + if ($code == 100 || $code == 101 || $code == -32600) { + $this->log->info('HTTP body: ' . $httpRes->getBody()); + } } $this->db->exec( 'UPDATE feedentryurls SET' diff --git a/src/stapibas/Pingback/DbStorage.php b/src/stapibas/Pingback/DbStorage.php new file mode 100644 index 0000000..61c374e --- /dev/null +++ b/src/stapibas/Pingback/DbStorage.php @@ -0,0 +1,78 @@ +db = $db; + } + + public function storePingback( + $target, $source, $sourceBody, \HTTP_Request2_Response $res + ) { + if ($this->alreadyExists($target, $source)) { + throw new \Exception( + 'Pingback from ' . $source . ' to ' . $target + . ' has already been registered.', + 48 + ); + } + $stmt = $this->db->prepare( + 'INSERT INTO pingbacks SET' + . ' p_source = :source' + . ', p_target = :target' + . ', p_time = NOW()' + . ', p_client_ip = :ip' + . ', p_client_agent = :agent' + . ', p_client_referer = :referer' + . ', p_needs_review = 1' + . ', p_use = 1' + . ', p_needs_update = 1' + ); + $stmt->execute( + array( + ':source' => $source, + ':target' => $target, + ':ip' => isset($_SERVER['REMOTE_ADDR']) + ? $_SERVER['REMOTE_ADDR'] : '', + ':agent' => isset($_SERVER['HTTP_USER_AGENT']) + ? $_SERVER['HTTP_USER_AGENT'] : '', + ':referer' => isset($_SERVER['HTTP_REFERER']) + ? $_SERVER['HTTP_REFERER'] : '', + ) + ); + } + + protected function alreadyExists($target, $source) + { + $res = $this->db->query( + 'SELECT COUNT(*) as count FROM pingbacks' + . ' WHERE p_source = ' . $this->db->quote($source) + . ' AND p_target = ' . $this->db->quote($target) + ); + $answer = $res->fetch(\PDO::FETCH_OBJ); + return $answer->count > 0; + } + + /** + * Verifies that a link from $source to $target exists. + * + * @param string $target Target URI that should be linked in $source + * @param string $source Pingback source URI that should link to target + * @param string $sourceBody Content of $source URI + * @param object $res HTTP response from fetching $source + * + * @return boolean True if $source links to $target + * + * @throws Exception When something fatally fails + */ + public function verifyLinkExists( + $target, $source, $sourceBody, \HTTP_Request2_Response $res + ) { + return false; + } +} +?> diff --git a/src/stapibas/Pingback/Mailer.php b/src/stapibas/Pingback/Mailer.php new file mode 100644 index 0000000..3b9e3ff --- /dev/null +++ b/src/stapibas/Pingback/Mailer.php @@ -0,0 +1,22 @@ + ' . $target . "\n" + . "from\n" + . '> ' . $source . "\n" + . "\n\nLove, stapibas", + "From: stapibas " + ); + } +} +?> diff --git a/www/xmlrpc.php b/www/xmlrpc.php index 9221e2b..2a2c674 100644 --- a/www/xmlrpc.php +++ b/www/xmlrpc.php @@ -1,83 +1,19 @@ db = $db; - } - - public function storePingback( - $target, $source, $sourceBody, \HTTP_Request2_Response $res - ) { - $stmt = $this->db->prepare( - 'INSERT INTO pingbacks' - . ' (p_source, p_target, p_time, p_client_ip, p_client_agent, p_client_referer)' - . ' VALUES(:source, :target, NOW(), :ip, :agent, :referer)' - ); - $stmt->execute( - array( - ':source' => $source, - ':target' => $target, - ':ip' => isset($_SERVER['REMOTE_ADDR']) - ? $_SERVER['REMOTE_ADDR'] : '', - ':agent' => isset($_SERVER['HTTP_USER_AGENT']) - ? $_SERVER['HTTP_USER_AGENT'] : '', - ':referer' => isset($_SERVER['HTTP_REFERER']) - ? $_SERVER['HTTP_REFERER'] : '', - ) - ); - } - - /** - * Verifies that a link from $source to $target exists. - * - * @param string $target Target URI that should be linked in $source - * @param string $source Pingback source URI that should link to target - * @param string $sourceBody Content of $source URI - * @param object $res HTTP response from fetching $source - * - * @return boolean True if $source links to $target - * - * @throws Exception When something fatally fails - */ - public function verifyLinkExists( - $target, $source, $sourceBody, \HTTP_Request2_Response $res - ) { - return false; - } -} - -class PingbackMailer - implements \PEAR2\Services\Pingback\Server\Callback\IStorage -{ - public function storePingback( - $target, $source, $sourceBody, \HTTP_Request2_Response $res - ) { - mail( - 'cweiske@cweiske.de', - 'New pingback', - "A pingback just came in, for\n" - . '> ' . $target . "\n" - . "from\n" - . '> ' . $source . "\n" - . "\n\nLove, stapibas", - "From: stapibas " - ); - } -} +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $s = new \PEAR2\Services\Pingback\Server(); -$s->addCallback(new PingbackStorage($db)); -$s->addCallback(new PingbackMailer()); +$s->addCallback(new Pingback_DbStorage($db)); +$s->addCallback(new Pingback_Mailer()); $s->run(); ?>