--- /dev/null
+#Simple way to Webfinger enable your domain -- needs PHP
+
+##Step 1
+
+Put the 'dot-well-known' on your website, so it loads at:
+
+ https://another_cool.org/.well-known/
+
+(Remember the . at the beginning of this one, which is common practice
+for "hidden" files and why we have renamed it "dot-")
+
+## Step 2
+
+Edit the .well-known/webfinger/index.php file and replace "https://www.example.org/gnusocial/index.php" with the domain name
+you're hosting the .well-known handler on.
+++ /dev/null
-Initial simple way to Webfinger enable your domain -- needs PHP.
-================================================================
-
-This guide needs some updating, since it will only guide you to present
-XML data (while the curl command likely gives you JSON). The workaround
-is to simply make curl get 'webfinger.xml' instead, and/or have another
-file that contains JSON, but that requires editing the PHP file as well.
-
-Step 1
-======
-
-Put the 'dot-well-known' on your website, so it loads at:
-
- https://example.com/.well-known/
-
-(Remember the . at the beginning of this one, which is common practice
-for "hidden" files and why we have renamed it "dot-")
-
-Step 2
-======
-
-Edit the .well-known/host-meta file and replace "example.com" with the
-domain name you're hosting the .well-known directory on.
-
-Using vim you can do this as a quick method:
- $ vim .well-known/host-meta [ENTER]
- :%s/example.com/domain.com/ [ENTER]
- :wq [ENTER]
-
-Step 3
-======
-
-For each user on your site, and this might only be you...
-
-In the webfinger directory, make a copy of the example@example.com.xml file
-so that it's called (replace username and example.com with appropriate
-values, the domain name should be the same as you're "socialifying"):
-
- username@example.com.xml
-
-Then edit the file contents, replacing "social.example.com" with your
-GNU social instance's base path, and change the user ID number (and
-nickname for the FOAF link) to that of your account on your social
-site. If you don't know your user ID number, you can see this on your
-GNU social profile page by looking at the destination URLs in the
-Feeds links.
-
-PROTIP: You can get the bulk of the contents (note the <Subject> element though)
- from curling down your real webfinger data:
-$ curl https://social.example.com/.well-known/webfinger?resource=acct:username@social.example.com
-
-Finally
-=======
-
-Using this method, though fiddly, you can now be @user@domain without
-the need for any prefixes for subdomains, etc.
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0" xmlns:hm="http://host-meta.net/xrd/1.0">
- <Link rel="lrdd" type="application/xrd+xml"
- template="https://example.com/.well-known/webfinger?resource={uri}"/>
-</XRD>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>acct:username@example.com</Subject>
- <Alias>acct:username@social.example.com</Alias>
- <Alias>https://social.example.com/user/1</Alias>
- <Link rel="http://webfinger.net/rel/profile-page"
- type="text/html"
- href="https://social.example.com/user/1"/>
-
- <Link rel="http://schemas.google.com/g/2010#updates-from"
- type="application/atom+xml"
- href="https://social.example.com/api/statuses/user_timeline/1.atom"/>
-
- <!-- Is this/was this ever supported?
- <Link rel="http://microformats.org/profile/hcard"
- type="text/html"
- href="https://social.example.com/hcard"/> -->
-
- <Link rel="http://gmpg.org/xfn/11"
- type="text/html"
- href="https://social.example.com/user/1"/>
-
- <Link rel="describedby"
- type="application/rdf+xml"
- href="https://social.example.com/username/foaf"/>
-
- <Link rel="http://salmon-protocol.org/ns/salmon-replies"
- href="https://social.example.com/main/salmon/user/1"/>
-
- <Link rel="http://salmon-protocol.org/ns/salmon-mention"
- href="https://social.example.com/main/salmon/user/1"/>
-
- <Link rel="http://ostatus.org/schema/1.0/subscribe"
- template="https://social.example.com/main/ostatussub?profile={uri}"/>
-</XRD>
<?php
-/*
- * GNU social
- * Copyright (C) 2010, Free Software Foundation, Inc
- *
- * 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/>.
- */
-
+// FIXME: REPLACE \/ here
+define('MY_GNUSOCIAL', 'https://www.example.org/gnusocial/index.php');
-// basename should make sure we can't escape this directory
-$u = basename($_GET['resource']);
+/**
+ * This is a general solution for when you can't have your GNU social instance in the domain root and for when you want to
+ * socialfy from another domain.
+ */
-if (!strpos($u, '@')) {
- throw new Exception('Bad resource');
- exit(1);
+// From https://www.php.net/manual/en/function.getallheaders.php#84262 (joyview at gmail dot com)
+if (!function_exists('getallheaders')) {
+ function getallheaders()
+ {
+ $headers = [];
+ foreach ($_SERVER as $name => $value) {
+ if (substr($name, 0, 5) == 'HTTP_') {
+ $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
+ }
+ }
+ return $headers;
+ }
}
-
-if (mb_strpos($u, 'acct:')===0) {
- $u = substr($u, 5);
+$ch = curl_init();
+curl_setopt($ch, CURLOPT_HTTPHEADER, getallheaders());
+curl_setopt($ch, CURLOPT_URL, MY_GNUSOCIAL . str_replace('webfinger/', 'webfinger', $_SERVER['REQUEST_URI']));
+curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+curl_setopt($ch, CURLOPT_HEADER, true);
+$response = curl_exec($ch);
+$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
+$body = substr($response, $header_size);
+// From https://stackoverflow.com/a/10590242 (c.hill)
+function get_headers_from_curl_response($response)
+{
+ $headers = array();
+
+ $header_text = substr($response, 0, strpos($response, "\r\n\r\n"));
+
+ foreach (explode("\r\n", $header_text) as $i => $line) {
+ if ($i === 0) {
+ $headers['http_code'] = $line;
+ } else {
+ list($key, $value) = explode(': ', $line);
+
+ $headers[$key] = $value;
+ }
+ }
+
+ return $headers;
}
-
-// Just to be a little bit safer, you know, with all the unicode stuff going on
-$u = filter_var($u, FILTER_SANITIZE_EMAIL);
-
-$f = $u . ".xml";
-
-if (file_exists($f)) {
- header('Content-Disposition: attachment; filename="'.urlencode($f).'"');
- header('Content-type: application/xrd+xml');
- echo file_get_contents($f);
+$headers = get_headers_from_curl_response($response);
+foreach ($headers as $name => $value) {
+ header("{$name}: $value");
}
+echo $body;
+curl_close($ch);