+ if (($val == "true") || ($val == 1)) {
+ return true;
+ } elseif (($val == "false") || ($val == 0)) {
+ return false;
+ }
+
+ return $val;
+}
+
+/**
+ * @brief Detect server type (Hubzilla or Friendica) via the poco data
+ *
+ * @param object $data POCO data
+ * @return array Server data
+ */
+function poco_detect_poco_data($data) {
+ $server = false;
+
+ if (!isset($data->entry)) {
+ return false;
+ }
+
+ if (count($data->entry) == 0) {
+ return false;
+ }
+
+ if (!isset($data->entry[0]->urls)) {
+ return false;
+ }
+
+ if (count($data->entry[0]->urls) == 0) {
+ return false;
+ }
+
+ foreach ($data->entry[0]->urls as $url) {
+ if ($url->type == 'zot') {
+ $server = array();
+ $server["platform"] = 'Hubzilla';
+ $server["network"] = NETWORK_DIASPORA;
+ return $server;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Detect server type by using the nodeinfo data
+ *
+ * @param string $server_url address of the server
+ * @return array Server data
+ */
+function poco_fetch_nodeinfo($server_url) {
+ $serverret = z_fetch_url($server_url."/.well-known/nodeinfo");
+ if (!$serverret["success"]) {
+ return false;
+ }
+
+ $nodeinfo = json_decode($serverret['body']);
+
+ if (!is_object($nodeinfo)) {
+ return false;
+ }
+
+ if (!is_array($nodeinfo->links)) {
+ return false;
+ }
+
+ $nodeinfo_url = '';
+
+ foreach ($nodeinfo->links as $link) {
+ if ($link->rel == 'http://nodeinfo.diaspora.software/ns/schema/1.0') {
+ $nodeinfo_url = $link->href;
+ }
+ }
+
+ if ($nodeinfo_url == '') {
+ return false;
+ }
+
+ $serverret = z_fetch_url($nodeinfo_url);
+ if (!$serverret["success"]) {
+ return false;
+ }
+
+ $nodeinfo = json_decode($serverret['body']);
+
+ if (!is_object($nodeinfo)) {
+ return false;
+ }
+
+ $server = array();
+
+ $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;
+ }
+ }
+
+ $diaspora = false;
+ $friendica = false;
+ $gnusocial = false;
+
+ if (is_array($nodeinfo->protocols->inbound)) {
+ foreach ($nodeinfo->protocols->inbound as $inbound) {
+ if ($inbound == 'diaspora') {
+ $diaspora = true;
+ }
+ if ($inbound == 'friendica') {
+ $friendica = true;
+ }
+ if ($inbound == 'gnusocial') {
+ $gnusocial = true;
+ }
+ }
+ }