+ if (empty($server['network'])) {
+ $server['network'] = Protocol::PHANTOM;
+ }
+
+ return $server;
+ }
+
+ /**
+ * Parses NodeInfo2 protocol 1.0
+ *
+ * @see https://github.com/jaywink/nodeinfo2/blob/master/PROTOCOL.md
+ *
+ * @param string $nodeinfo_url address of the nodeinfo path
+ *
+ * @return array Server data
+ *
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ */
+ private static function parseNodeinfo210(ICanHandleHttpResponses $httpResult): array
+ {
+ if (!$httpResult->isSuccess()) {
+ return [];
+ }
+
+ $nodeinfo = json_decode($httpResult->getBody(), true);
+
+ if (!is_array($nodeinfo)) {
+ return [];
+ }
+
+ $server = ['detection-method' => self::DETECT_NODEINFO_210,
+ 'register_policy' => Register::CLOSED];
+
+ if (!empty($nodeinfo['openRegistrations'])) {
+ $server['register_policy'] = Register::OPEN;
+ }
+
+ if (!empty($nodeinfo['server'])) {
+ if (!empty($nodeinfo['server']['software'])) {
+ $server['platform'] = strtolower($nodeinfo['server']['software']);
+ }
+
+ if (!empty($nodeinfo['server']['version'])) {
+ $server['version'] = $nodeinfo['server']['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 (!empty($nodeinfo['server']['name'])) {
+ $server['site_name'] = $nodeinfo['server']['name'];
+ }
+ }
+
+ if (!empty($nodeinfo['usage']['users']['total'])) {
+ $server['registered-users'] = max($nodeinfo['usage']['users']['total'], 1);
+ }
+
+ if (!empty($nodeinfo['usage']['users']['activeMonth'])) {
+ $server['active-month-users'] = max($nodeinfo['usage']['users']['activeMonth'], 0);
+ }
+
+ if (!empty($nodeinfo['usage']['users']['activeHalfyear'])) {
+ $server['active-halfyear-users'] = max($nodeinfo['usage']['users']['activeHalfyear'], 0);
+ }
+
+ if (!empty($nodeinfo['usage']['localPosts'])) {
+ $server['local-posts'] = max($nodeinfo['usage']['localPosts'], 0);
+ }
+
+ if (!empty($nodeinfo['usage']['localComments'])) {
+ $server['local-comments'] = max($nodeinfo['usage']['localComments'], 0);
+ }
+
+ if (!empty($nodeinfo['protocols'])) {
+ $protocols = [];
+ foreach ($nodeinfo['protocols'] as $protocol) {
+ if (is_string($protocol)) {
+ $protocols[$protocol] = true;
+ }
+ }
+
+ if (!empty($protocols['dfrn'])) {
+ $server['network'] = Protocol::DFRN;
+ } elseif (!empty($protocols['activitypub'])) {
+ $server['network'] = Protocol::ACTIVITYPUB;
+ } elseif (!empty($protocols['diaspora'])) {
+ $server['network'] = Protocol::DIASPORA;
+ } elseif (!empty($protocols['ostatus'])) {
+ $server['network'] = Protocol::OSTATUS;
+ } elseif (!empty($protocols['gnusocial'])) {
+ $server['network'] = Protocol::OSTATUS;
+ } elseif (!empty($protocols['zot'])) {
+ $server['network'] = Protocol::ZOT;
+ }
+ }
+
+ if (empty($server) || empty($server['platform'])) {
+ return [];
+ }
+
+ if (empty($server['network'])) {
+ $server['network'] = Protocol::PHANTOM;
+ }
+