From: Stephen Paul Weber <singpolyma@singpolyma.net>
Date: Thu, 22 Oct 2015 20:15:44 +0000 (+0000)
Subject: Add pingback frontend
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=fa1e4620cf970db14572d113f07d04285e214fb5;p=quix0rs-gnu-social.git

Add pingback frontend
---

diff --git a/plugins/Linkback/LinkbackPlugin.php b/plugins/Linkback/LinkbackPlugin.php
index 2aeb8ea016..ac95b4ab25 100644
--- a/plugins/Linkback/LinkbackPlugin.php
+++ b/plugins/Linkback/LinkbackPlugin.php
@@ -311,6 +311,12 @@ class LinkbackPlugin extends Plugin
     public function onRouterInitialized(URLMapper $m)
     {
         $m->connect('main/linkback/webmention', array('action' => 'webmention'));
+        $m->connect('main/linkback/pingback', array('action' => 'pingback'));
+    }
+
+    public function onStartShowHTML($action)
+    {
+        header('X-Pingback: ' . common_local_url('pingback'));
     }
 
     public function version()
diff --git a/plugins/Linkback/actions/pingback.php b/plugins/Linkback/actions/pingback.php
new file mode 100644
index 0000000000..8d2c87fb02
--- /dev/null
+++ b/plugins/Linkback/actions/pingback.php
@@ -0,0 +1,87 @@
+<?php
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+class PingbackAction extends Action
+{
+    protected function handle()
+    {
+        GNUsocial::setApi(true); // Minimize error messages to aid in debugging
+        parent::handle();
+        if ($this->isPost()) {
+            return $this->handlePost();
+        }
+
+        return false;
+    }
+
+    function handlePost()
+    {
+
+        $server = xmlrpc_server_create();
+        xmlrpc_server_register_method($server, 'pingback.ping', array($this, 'ping'));
+        echo xmlrpc_server_call_method($server, file_get_contents('php://input'), null, array('encoding' => 'utf-8'));
+        xmlrpc_server_destroy($server);
+        return true;
+    }
+
+    function ping($method, $parameters) {
+        list($source, $target) = $parameters;
+
+        if(!$source) {
+            return array(
+                'faultCode' => 0x0010,
+                'faultString' => '"source" is missing'
+            );
+        }
+
+        if(!$target) {
+            return array(
+                'faultCode' => 0x0020,
+                'faultString' => '"target" is missing'
+            );
+        }
+
+        $response = linkback_get_source($source, $target);
+        if(!$response) {
+            return array(
+                'faultCode' => 0x0011,
+                'faultString' => 'Source does not link to target'
+            );
+        }
+
+        $notice = linkback_get_target($target);
+        if(!$notice) {
+            return array(
+                'faultCode' => 0x0021,
+                'faultString' => 'Target not found'
+            );
+        }
+
+        $url = linkback_save($source, $target, $response, $notice);
+        if(!$url) {
+            return array(
+                'faultCode' => 0,
+                'faultString' => 'An error occured while saving.'
+            );
+        }
+
+        return array('Success');
+    }
+}