]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/OStatus/actions/xrd.php
Merge branch 'testing' of git@gitorious.org:statusnet/mainline into testing
[quix0rs-gnu-social.git] / plugins / OStatus / actions / xrd.php
1 <?php
2 /*
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2010, StatusNet, Inc.
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /**
21  * @package OStatusPlugin
22  * @maintainer James Walker <james@status.net>
23  */
24
25 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
26
27 class XrdAction extends Action
28 {
29
30     public $uri;
31
32     function prepare($args)
33     {
34         parent::prepare($args);
35
36         $this->uri = $this->trimmed('uri');
37
38         return true;
39     }
40
41     function handle()
42     {
43         $acct = Discovery::normalize($this->uri);
44
45         $xrd = new XRD();
46
47         list($nick, $domain) = explode('@', substr(urldecode($acct), 5));
48         $nick = common_canonical_nickname($nick);
49
50         $this->user = User::staticGet('nickname', $nick);
51         if (!$this->user) {
52             $this->clientError(_('No such user.'), 404);
53             return false;
54         }
55
56         $xrd->subject = $this->uri;
57         $xrd->alias[] = common_profile_url($nick);
58         $xrd->links[] = array('rel' => Discovery::PROFILEPAGE,
59                               'type' => 'text/html',
60                               'href' => common_profile_url($nick));
61
62         $xrd->links[] = array('rel' => Discovery::UPDATESFROM,
63                               'href' => common_local_url('ApiTimelineUser',
64                                                          array('id' => $this->user->id,
65                                                                'format' => 'atom')),
66                               'type' => 'application/atom+xml');
67
68         // hCard
69         $xrd->links[] = array('rel' => Discovery::HCARD,
70                               'type' => 'text/html',
71                               'href' => common_local_url('hcard', array('nickname' => $nick)));
72
73         // XFN
74         $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11',
75                               'type' => 'text/html',
76                               'href' => common_profile_url($nick));
77         // FOAF
78         $xrd->links[] = array('rel' => 'describedby',
79                               'type' => 'application/rdf+xml',
80                               'href' => common_local_url('foaf',
81                                                          array('nickname' => $nick)));
82
83         // Salmon
84         $salmon_url = common_local_url('usersalmon',
85                                        array('id' => $this->user->id));
86
87         $xrd->links[] = array('rel' => Salmon::NS_REPLIES,
88                               'href' => $salmon_url);
89
90         $xrd->links[] = array('rel' => Salmon::NS_MENTIONS,
91                               'href' => $salmon_url);
92
93         // Get this user's keypair
94         $magickey = Magicsig::staticGet('user_id', $this->user->id);
95         if (!$magickey) {
96             // No keypair yet, let's generate one.
97             $magickey = new Magicsig();
98             $magickey->generate($this->user->id);
99         }
100
101         $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL,
102                               'href' => 'data:application/magic-public-key;'. $magickey->toString(false));
103
104         // TODO - finalize where the redirect should go on the publisher
105         $url = common_local_url('ostatussub') . '?profile={uri}';
106         $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe',
107                               'template' => $url );
108
109         header('Content-type: text/xml');
110         print $xrd->toXML();
111     }
112
113 }