]> git.mxchange.org Git - friendica.git/blob - src/Module/Xrd.php
parameters now are having a default value and are optional
[friendica.git] / src / Module / Xrd.php
1 <?php
2
3 namespace Friendica\Module;
4
5 use Friendica\BaseModule;
6 use Friendica\Core\Hook;
7 use Friendica\Core\Renderer;
8 use Friendica\Database\DBA;
9 use Friendica\Model\Photo;
10 use Friendica\Model\User;
11 use Friendica\Protocol\ActivityNamespace;
12 use Friendica\Protocol\Salmon;
13 use Friendica\Util\Strings;
14
15 /**
16  * Prints responses to /.well-known/webfinger  or /xrd requests
17  */
18 class Xrd extends BaseModule
19 {
20         public static function rawContent(array $parameters = [])
21         {
22                 $app = self::getApp();
23
24                 // @TODO: Replace with parameter from router
25                 if ($app->argv[0] == 'xrd') {
26                         if (empty($_GET['uri'])) {
27                                 return;
28                         }
29
30                         $uri = urldecode(Strings::escapeTags(trim($_GET['uri'])));
31                         if (($_SERVER['HTTP_ACCEPT'] ?? '') == 'application/jrd+json') {
32                                 $mode = 'json';
33                         } else {
34                                 $mode = 'xml';
35                         }
36                 } else {
37                         if (empty($_GET['resource'])) {
38                                 return;
39                         }
40
41                         $uri = urldecode(Strings::escapeTags(trim($_GET['resource'])));
42                         if (($_SERVER['HTTP_ACCEPT'] ?? '') == 'application/xrd+xml') {
43                                 $mode = 'xml';
44                         } else {
45                                 $mode = 'json';
46                         }
47                 }
48
49                 if (substr($uri, 0, 4) === 'http') {
50                         $name = ltrim(basename($uri), '~');
51                 } else {
52                         $local = str_replace('acct:', '', $uri);
53                         if (substr($local, 0, 2) == '//') {
54                                 $local = substr($local, 2);
55                         }
56
57                         $name = substr($local, 0, strpos($local, '@'));
58                 }
59
60                 $user = User::getByNickname($name);
61
62                 if (empty($user)) {
63                         throw new \Friendica\Network\HTTPException\NotFoundException();
64                 }
65
66                 $owner = User::getOwnerDataById($user['uid']);
67
68                 $alias = str_replace('/profile/', '/~', $owner['url']);
69
70                 $avatar = Photo::selectFirst(['type'], ['uid' => $owner['uid'], 'profile' => true]);
71
72                 if (!DBA::isResult($avatar)) {
73                         $avatar = ['type' => 'image/jpeg'];
74                 }
75
76                 if ($mode == 'xml') {
77                         self::printXML($alias, $app->getBaseURL(), $user, $owner, $avatar);
78                 } else {
79                         self::printJSON($alias, $app->getBaseURL(), $owner, $avatar);
80                 }
81         }
82
83         private static function printJSON($alias, $baseURL, $owner, $avatar)
84         {
85                 $salmon_key = Salmon::salmonKey($owner['spubkey']);
86
87                 header('Access-Control-Allow-Origin: *');
88                 header('Content-type: application/json; charset=utf-8');
89
90                 $json = [
91                         'subject' => 'acct:' . $owner['addr'],
92                         'aliases' => [
93                                 $alias,
94                                 $owner['url'],
95                         ],
96                         'links'   => [
97                                 [
98                                         'rel'  => ActivityNamespace::DFRN ,
99                                         'href' => $owner['url'],
100                                 ],
101                                 [
102                                         'rel'  => ActivityNamespace::FEED,
103                                         'type' => 'application/atom+xml',
104                                         'href' => $owner['poll'],
105                                 ],
106                                 [
107                                         'rel'  => 'http://webfinger.net/rel/profile-page',
108                                         'type' => 'text/html',
109                                         'href' => $owner['url'],
110                                 ],
111                                 [
112                                         'rel'  => 'self',
113                                         'type' => 'application/activity+json',
114                                         'href' => $owner['url'],
115                                 ],
116                                 [
117                                         'rel'  => 'http://microformats.org/profile/hcard',
118                                         'type' => 'text/html',
119                                         'href' => $baseURL . '/hcard/' . $owner['nickname'],
120                                 ],
121                                 [
122                                         'rel'  => ActivityNamespace::POCO,
123                                         'href' => $owner['poco'],
124                                 ],
125                                 [
126                                         'rel'  => 'http://webfinger.net/rel/avatar',
127                                         'type' => $avatar['type'],
128                                         'href' => $owner['photo'],
129                                 ],
130                                 [
131                                         'rel'  => 'http://joindiaspora.com/seed_location',
132                                         'type' => 'text/html',
133                                         'href' => $baseURL,
134                                 ],
135                                 [
136                                         'rel'  => 'salmon',
137                                         'href' => $baseURL . '/salmon/' . $owner['nickname'],
138                                 ],
139                                 [
140                                         'rel'  => 'http://salmon-protocol.org/ns/salmon-replies',
141                                         'href' => $baseURL . '/salmon/' . $owner['nickname'],
142                                 ],
143                                 [
144                                         'rel'  => 'http://salmon-protocol.org/ns/salmon-mention',
145                                         'href' => $baseURL . '/salmon/' . $owner['nickname'] . '/mention',
146                                 ],
147                                 [
148                                         'rel'      => 'http://ostatus.org/schema/1.0/subscribe',
149                                         'template' => $baseURL . '/follow?url={uri}',
150                                 ],
151                                 [
152                                         'rel'  => 'magic-public-key',
153                                         'href' => 'data:application/magic-public-key,' . $salmon_key,
154                                 ],
155                                 [
156                                         'rel'  => 'http://purl.org/openwebauth/v1',
157                                         'type' => 'application/x-zot+json',
158                                         'href' => $baseURL . '/owa',
159                                 ],
160                         ],
161                 ];
162
163                 echo json_encode($json);
164                 exit();
165         }
166
167         private static function printXML($alias, $baseURL, $user, $owner, $avatar)
168         {
169                 $salmon_key = Salmon::salmonKey($owner['spubkey']);
170
171                 header('Access-Control-Allow-Origin: *');
172                 header('Content-type: text/xml');
173
174                 $tpl = Renderer::getMarkupTemplate('xrd_person.tpl');
175
176                 $o = Renderer::replaceMacros($tpl, [
177                         '$nick'        => $owner['nickname'],
178                         '$accturi'     => 'acct:' . $owner['addr'],
179                         '$alias'       => $alias,
180                         '$profile_url' => $owner['url'],
181                         '$hcard_url'   => $baseURL . '/hcard/' . $owner['nickname'],
182                         '$atom'        => $owner['poll'],
183                         '$poco_url'    => $owner['poco'],
184                         '$photo'       => $owner['photo'],
185                         '$type'        => $avatar['type'],
186                         '$salmon'      => $baseURL . '/salmon/' . $owner['nickname'],
187                         '$salmen'      => $baseURL . '/salmon/' . $owner['nickname'] . '/mention',
188                         '$subscribe'   => $baseURL . '/follow?url={uri}',
189                         '$openwebauth' => $baseURL . '/owa',
190                         '$modexp'      => 'data:application/magic-public-key,' . $salmon_key
191                 ]);
192
193                 $arr = ['user' => $user, 'xml' => $o];
194                 Hook::callAll('personal_xrd', $arr);
195
196                 echo $arr['xml'];
197                 exit();
198         }
199 }