diff --git a/index.php b/index.php index 7fde51e..96169f0 100644 --- a/index.php +++ b/index.php @@ -112,6 +112,7 @@ case ".well-known/webfinger": webfinger(); // Mandatory. Static. case rawurldecode( $username ): + case "@" . rawurldecode( $username ): // Some software assumes usernames start with an `@` username(); // Mandatory. Static case "following": following(); // Mandatory. Can be static or dynamic. @@ -119,18 +120,22 @@ followers(); // Mandatory. Can be static or dynamic. case "inbox": inbox(); // Mandatory. + case "outbox": + outbox(); // Optional. Dynamic. case "write": write(); // User interface for writing posts case "send": send(); // API for posting content to the Fediverse - case "outbox": - outbox(); // Optional. Dynamic. case "follow": follow(); // User interface for following an external user case "follow_user": follow_user(); // API for following a user case "read": read(); // User interface for reading posts + case ".well-known/nodeinfo": + wk_nodeinfo(); // Optional. Static. + case "nodeinfo/2.1": + nodeinfo(); // Optional. Static. case "/": home(); // Optional. Can be dynamic default: @@ -1258,6 +1263,68 @@ HTML; die(); } + // The NodeInfo Protocol is used to identify servers. + // It is looked up with `example.com/.well-known/nodeinfo` + // See https://nodeinfo.diaspora.software/ + function wk_nodeinfo() { + global $server; + + $nodeinfo = array( + "links" => array( + array( + "rel" => "self", + "type" => "http://nodeinfo.diaspora.software/ns/schema/2.1", + "href" => "https://{$server}/nodeinfo/2.1" + ) + ) + ); + header( "Content-Type: application/json" ); + echo json_encode( $nodeinfo ); + die(); + } + + // The NodeInfo Protocol is used to identify servers. + // It is looked up with `example.com/.well-known/nodeinfo` which points to this resource + // See http://nodeinfo.diaspora.software/docson/index.html#/ns/schema/2.0#$$expand + function nodeinfo() { + global $server, $directories; + + // Get all posts + $posts = glob( $directories["posts"] . "/*.json") ; + // Number of posts + $totalItems = count( $posts ); + + $nodeinfo = array( + "version" => "2.1", // Version of the schema, not the software + "software" => array( + "name" => "Single File ActivityPub Server in PHP", + "version" => "0.000000001", + "repository" => "https://gitlab.com/edent/activitypub-single-php-file/" + ), + "protocols" => array( "activitypub"), + "services" => array( + "inbound" => array(), + "outbound" => array() + ), + "openRegistrations" => false, + "usage" => array( + "users" => array( + "total" => 1 + ), + "localPosts" => $totalItems + ), + "metadata"=> array( + "nodeName" => "activitypub-single-php-file", + "nodeDescription" => "This is a single PHP file which acts as an extremely basic ActivityPub server.", + "spdx" => "AGPL-3.0-or-later" + ) + ); + header( "Content-Type: application/json" ); + echo json_encode( $nodeinfo ); + die(); + } + + // "One to stun, two to kill, three to make sure" die(); die();