+ /**
+ * @brief Poll the Friendica specific noscrape page.
+ *
+ * "noscrape" is a faster alternative to fetch the data from the hcard.
+ * This functionality was originally created for the directory.
+ *
+ * @param string $noscrape Link to the noscrape page
+ * @param array $data The already fetched data
+ *
+ * @return array noscrape data
+ */
+ private function poll_noscrape($noscrape, $data) {
+ $content = fetch_url($noscrape);
+ if (!$content)
+ return false;
+
+ $json = json_decode($content, true);
+ if (!is_array($json))
+ return false;
+
+ if (isset($json["fn"]))
+ $data["name"] = $json["fn"];
+
+ if (isset($json["addr"]))
+ $data["addr"] = $json["addr"];
+
+ if (isset($json["nick"]))
+ $data["nick"] = $json["nick"];
+
+ if (isset($json["comm"]))
+ $data["community"] = $json["comm"];
+
+ if (isset($json["tags"])) {
+ $keywords = implode(" ", $json["tags"]);
+ if ($keywords != "")
+ $data["keywords"] = $keywords;
+ }
+
+ $location = formatted_location($json);
+ if ($location)
+ $data["location"] = $location;
+
+ if (isset($json["about"]))
+ $data["about"] = $json["about"];
+
+ if (isset($json["key"]))
+ $data["pubkey"] = $json["key"];
+
+ if (isset($json["photo"]))
+ $data["photo"] = $json["photo"];
+
+ if (isset($json["dfrn-request"]))
+ $data["request"] = $json["dfrn-request"];
+
+ if (isset($json["dfrn-confirm"]))
+ $data["confirm"] = $json["dfrn-confirm"];
+
+ if (isset($json["dfrn-notify"]))
+ $data["notify"] = $json["dfrn-notify"];
+
+ if (isset($json["dfrn-poll"]))
+ $data["poll"] = $json["dfrn-poll"];
+
+ return $data;
+ }
+
+ /**
+ * @brief Check for valid DFRN data
+ *
+ * @param array $data DFRN data
+ *
+ * @return int Number of errors
+ */
+ public static function valid_dfrn($data) {
+ $errors = 0;
+ if(!isset($data['key']))
+ $errors ++;
+ if(!isset($data['dfrn-request']))
+ $errors ++;
+ if(!isset($data['dfrn-confirm']))
+ $errors ++;
+ if(!isset($data['dfrn-notify']))
+ $errors ++;
+ if(!isset($data['dfrn-poll']))
+ $errors ++;
+ return $errors;
+ }
+
+ /**
+ * @brief Fetch data from a DFRN profile page and via "noscrape"
+ *
+ * @param string $profile Link to the profile page
+ *
+ * @return array profile data
+ */
+ public static function profile($profile) {
+
+ $data = array();
+
+ // Fetch data via noscrape - this is faster
+ $noscrape = str_replace(array("/hcard/", "/profile/"), "/noscrape/", $profile);
+ $data = self::poll_noscrape($noscrape, $data);
+
+ if (!isset($data["notify"]) OR !isset($data["confirm"]) OR
+ !isset($data["request"]) OR !isset($data["poll"]) OR
+ !isset($data["poco"]) OR !isset($data["name"]) OR
+ !isset($data["photo"]))
+ $data = self::poll_hcard($profile, $data, true);
+
+ $prof_data = array();
+ $prof_data["addr"] = $data["addr"];
+ $prof_data["nick"] = $data["nick"];
+ $prof_data["dfrn-request"] = $data["request"];
+ $prof_data["dfrn-confirm"] = $data["confirm"];
+ $prof_data["dfrn-notify"] = $data["notify"];
+ $prof_data["dfrn-poll"] = $data["poll"];
+ $prof_data["dfrn-poco"] = $data["poco"];
+ $prof_data["photo"] = $data["photo"];
+ $prof_data["fn"] = $data["name"];
+ $prof_data["key"] = $data["pubkey"];
+
+ return $prof_data;
+ }
+
+ /**
+ * @brief Check for DFRN contact
+ *
+ * @param array $webfinger Webfinger data
+ *
+ * @return array DFRN data
+ */