+ /**
+ * @brief Parses Nodeinfo 2
+ *
+ * @param string $nodeinfo_url address of the nodeinfo path
+ * @return array Server data
+ */
+ private static function parseNodeinfo2($nodeinfo_url)
+ {
+ $serverret = Network::curl($nodeinfo_url);
+ if (!$serverret["success"]) {
+ return false;
+ }
+
+ $nodeinfo = json_decode($serverret['body']);
+ if (!is_object($nodeinfo)) {
+ return false;
+ }
+
+ $server = [];
+
+ $server['register_policy'] = REGISTER_CLOSED;
+
+ if (is_bool($nodeinfo->openRegistrations) && $nodeinfo->openRegistrations) {
+ $server['register_policy'] = REGISTER_OPEN;
+ }
+
+ if (is_object($nodeinfo->software)) {
+ if (isset($nodeinfo->software->name)) {
+ $server['platform'] = $nodeinfo->software->name;
+ }
+
+ if (isset($nodeinfo->software->version)) {
+ $server['version'] = $nodeinfo->software->version;
+ // Version numbers on Nodeinfo are presented with additional info, e.g.:
+ // 0.6.3.0-p1702cc1c, 0.6.99.0-p1b9ab160 or 3.4.3-2-1191.
+ $server['version'] = preg_replace("=(.+)-(.{4,})=ism", "$1", $server['version']);
+ }
+ }
+
+ if (is_object($nodeinfo->metadata)) {
+ if (isset($nodeinfo->metadata->nodeName)) {
+ $server['site_name'] = $nodeinfo->metadata->nodeName;
+ }
+ }
+
+ if (!empty($nodeinfo->usage->users->total)) {
+ $server['registered-users'] = $nodeinfo->usage->users->total;
+ }
+
+ $diaspora = false;
+ $friendica = false;
+ $gnusocial = false;
+
+ if (is_array($nodeinfo->protocols)) {
+ foreach ($nodeinfo->protocols as $protocol) {
+ if ($protocol == 'diaspora') {
+ $diaspora = true;
+ }
+ if ($protocol == 'friendica') {
+ $friendica = true;
+ }
+ if ($protocol == 'gnusocial') {
+ $gnusocial = true;
+ }
+ }
+ }
+
+ if ($gnusocial) {
+ $server['network'] = NETWORK_OSTATUS;
+ }
+ if ($diaspora) {
+ $server['network'] = NETWORK_DIASPORA;
+ }
+ if ($friendica) {
+ $server['network'] = NETWORK_DFRN;
+ }
+
+ if (!$server) {
+ return false;
+ }
+
+ return $server;
+ }
+