1<?php
2
3/**
4 * Receive component of the DokuWiki Linkback action plugin.
5 *
6 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7 * @author     Gina Haeussge <osd@foosel.net>
8 * @link       http://wiki.foosel.net/snippets/dokuwiki/linkback
9 */
10
11class action_plugin_linkback_receive extends DokuWiki_Action_Plugin {
12
13    /**
14     * Register the eventhandlers.
15     */
16    function register(Doku_Event_Handler $controller) {
17        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'addTrackbackLink', array ());
18        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'addPingbackLinkToMetaheader', array ());
19        $controller->register_hook('ACTION_HEADERS_SEND', 'BEFORE', $this, 'addPingbackLinkToHTTPHeader', array ());
20    }
21
22    /**
23     * Handler for the TPL_ACT_RENDER event
24     */
25    function addTrackbackLink(Doku_Event $event, $params) {
26        global $ID;
27
28        // Action not 'show'? Quit
29        if ($event->data != 'show')
30            return;
31
32        // Trackbacks disabled? Quit
33        if (!$this->getConf('enable_trackback'))
34            return;
35
36        // Get linkback metadata
37        $file = metaFN($ID, '.linkbacks');
38        $data = array (
39            'send' => false,
40            'receive' => false,
41            'display' => false,
42            'sentpings' => array (),
43            'receivedpings' => array (),
44            'number' => 0,
45
46        );
47        if (@ file_exists($file))
48            $data = unserialize(io_readFile($file, false));
49
50        // Does not accept linkbacks? Quit
51        if (!$data['receive'])
52            return;
53
54        // if trackbacks are enabled, insert RDF definition of trackback into output
55        if ($this->getConf('enable_trackback')) {
56            echo '<!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"' . NL .
57            'xmlns:dc="https://purl.org/dc/elements/1.1/"' . NL .
58            'xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">' . NL .
59            '<rdf:Description' . NL .
60            'rdf:about="' . wl($ID, '', true) . '"' . NL .
61            'dc:identifier="' . wl($ID, '', true) . '"' . NL .
62            'dc:title="' . tpl_pagetitle($ID, true) . '"' . NL .
63            'trackback:ping="' . DOKU_URL . 'lib/plugins/linkback/exe/trackback.php/' . $ID . '" />' . NL .
64            '</rdf:RDF>-->';
65        }
66    }
67
68    /**
69     * Handler for the TPL_METAHEADER_OUTPUT event
70     * @param Doku_Event $event
71     * @param $params
72     * @return bool|void
73     */
74    function addPingbackLinkToMetaheader(Doku_Event $event, $params) {
75        global $ID;
76
77        // Pingbacks disabled? Quit
78        if (!$this->getConf('enable_pingback'))
79            return;
80
81        // Get linkback metadata
82        $file = metaFN($ID, '.linkbacks');
83        $data = array (
84            'send' => false,
85            'receive' => false,
86            'display' => false,
87            'sentpings' => array (),
88            'receivedpings' => array (),
89            'number' => 0,
90
91        );
92        if (@ file_exists($file))
93            $data = unserialize(io_readFile($file, false));
94
95        // Does not accept linkbacks? Quit
96        if (!$data['receive'])
97            return;
98
99        // Add pingback metaheader
100        $event->data['link'][] = array (
101            'rel' => 'pingback',
102            'href' => DOKU_URL . 'lib/plugins/linkback/exe/pingback.php/' . $ID
103        );
104        return true;
105    }
106
107    /**
108     * Handler for the ACTION_HEADERS_SEND event
109     *
110     * @param Doku_Event $event
111     * @param $params
112     * @return bool|void
113     */
114    function addPingbackLinkToHTTPHeader(Doku_Event $event, $params) {
115        global $ID;
116
117        // Pingbacks disabled? Quit
118        if (!$this->getConf('enable_pingback'))
119            return;
120
121        // Get linkback metadata
122        $file = metaFN($ID, '.linkbacks');
123        $data = array (
124            'send' => false,
125            'receive' => false,
126            'display' => false,
127            'sentpings' => array (),
128            'receivedpings' => array (),
129            'number' => 0,
130
131        );
132        if (@ file_exists($file))
133            $data = unserialize(io_readFile($file, false));
134
135        // Does not accept linkbacks? Quit
136        if (!$data['receive'])
137            return;
138
139        // Add pingback header
140        $event->data[] = 'X-Pingback: ' . DOKU_URL . 'lib/plugins/linkback/exe/pingback.php/' . $ID;
141        return true;
142    }
143}
144