X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FProbe.php;h=539803b6e4d93acfc56ea918f5c2bc59f3ff75f4;hb=a86ffd878dc3ca8638345781bda0f18071d439e5;hp=30b197f5b6fb2308f37b4d1a56ac47040aaa4269;hpb=0b7e8b7fb45330c64df3cb00f70600f725c38c93;p=friendica.git diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 30b197f5b6..539803b6e4 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -1,35 +1,38 @@ get_hostname(); $parts = parse_url($host); @@ -89,8 +94,8 @@ class Probe { * * @return array with template and type of the webfinger template for JSON or XML */ - private static function hostMeta($host) { - + private static function hostMeta($host) + { // Reset the static variable self::$baseurl = ''; @@ -124,7 +129,7 @@ class Probe { return array(); } - $links = xml::element_to_array($xrd); + $links = XML::elementToArray($xrd); if (!isset($links["xrd"]["link"])) { logger("No xrd data found for ".$host, LOGGER_DEBUG); return array(); @@ -174,13 +179,13 @@ class Probe { * amended 7/9/2011 to return an hcard which could save potentially loading * a lengthy content page to scrape dfrn attributes * - * @param string $webbie Address that should be probed + * @param string $webbie Address that should be probed * @param string $hcard_url Link to the hcard - is returned by reference * * @return string profile link */ - public static function webfingerDfrn($webbie, &$hcard_url) { - + public static function webfingerDfrn($webbie, &$hcard_url) + { $profile_link = ''; $links = self::lrdd($webbie); @@ -212,8 +217,8 @@ class Probe { * * @return array uri data */ - public static function lrdd($uri) { - + public static function lrdd($uri) + { $lrdd = self::hostMeta($uri); $webfinger = null; @@ -247,7 +252,7 @@ class Probe { return array(); } - foreach ($lrdd AS $type => $template) { + foreach ($lrdd as $type => $template) { if ($webfinger) { continue; } @@ -299,17 +304,17 @@ class Probe { /** * @brief Fetch information (protocol endpoints and user information) about a given uri * - * @param string $uri Address that should be probed - * @param string $network Test for this specific network - * @param integer $uid User ID for the probe (only used for mails) - * @param boolean $cache Use cached values? + * @param string $uri Address that should be probed + * @param string $network Test for this specific network + * @param integer $uid User ID for the probe (only used for mails) + * @param boolean $cache Use cached values? * * @return array uri data */ - public static function uri($uri, $network = "", $uid = -1, $cache = true) { - + public static function uri($uri, $network = "", $uid = -1, $cache = true) + { if ($cache) { - $result = Cache::get("probe_url:".$network.":".$uri); + $result = Cache::get("Probe::uri:".$network.":".$uri); if (!is_null($result)) { return $result; } @@ -361,7 +366,7 @@ class Probe { // Only store into the cache if the value seems to be valid if (!in_array($data['network'], array(NETWORK_PHANTOM, NETWORK_MAIL))) { - Cache::set("probe_url:".$network.":".$uri, $data, CACHE_DAY); + Cache::set("Probe::uri:".$network.":".$uri, $data, CACHE_DAY); /// @todo temporary fix - we need a real contact update function that updates only changing fields /// The biggest problem is the avatar picture that could have a reduced image size. @@ -389,7 +394,7 @@ class Probe { $fieldnames = array(); - foreach ($fields AS $key => $val) { + foreach ($fields as $key => $val) { if (empty($val)) { unset($fields[$key]); } else { @@ -397,7 +402,7 @@ class Probe { } } - $fields['updated'] = dbm::date(); + $fields['updated'] = DBM::date(); $condition = array('nurl' => normalise_link($data["url"])); @@ -420,11 +425,11 @@ class Probe { 'confirm' => $data['confirm'], 'poco' => $data['poco'], 'network' => $data['network'], - 'success_update' => dbm::date()); + 'success_update' => DBM::date()); $fieldnames = array(); - foreach ($fields AS $key => $val) { + foreach ($fields as $key => $val) { if (empty($val)) { unset($fields[$key]); } else { @@ -450,7 +455,8 @@ class Probe { * * @return string switched URL */ - private static function switchScheme($url) { + private static function switchScheme($url) + { $parts = parse_url($url); if (!isset($parts['scheme'])) { @@ -469,12 +475,14 @@ class Probe { /** * @brief Checks if a profile url should be OStatus but only provides partial information * - * @param array $webfinger Webfinger data - * @param string $lrdd Path template for webfinger request + * @param array $webfinger Webfinger data + * @param string $lrdd Path template for webfinger request + * @param string $type type * * @return array fixed webfinger data */ - private static function fixOstatus($webfinger, $lrdd, $type) { + private static function fixOStatus($webfinger, $lrdd, $type) + { if (empty($webfinger['links']) || empty($webfinger['subject'])) { return $webfinger; } @@ -512,13 +520,14 @@ class Probe { * * This function is only called by the "uri" function that adds caching and rearranging of data. * - * @param string $uri Address that should be probed - * @param string $network Test for this specific network - * @param integer $uid User ID for the probe (only used for mails) + * @param string $uri Address that should be probed + * @param string $network Test for this specific network + * @param integer $uid User ID for the probe (only used for mails) * * @return array uri data */ - private static function detect($uri, $network, $uid) { + private static function detect($uri, $network, $uid) + { $parts = parse_url($uri); if (!empty($parts["scheme"]) && !empty($parts["host"]) && !empty($parts["path"])) { @@ -552,7 +561,6 @@ class Probe { $nick = ltrim($nick, '@'); $addr = $nick."@".$host; - } elseif (strstr($uri, '@')) { // If the URI starts with "mailto:" then jump directly to the mail detection if (strpos($uri, 'mailto:') !== false) { @@ -583,7 +591,6 @@ class Probe { return self::mail($uri, $uid); } $addr = $uri; - } else { logger("Uri ".$uri." was not detectable", LOGGER_DEBUG); return false; @@ -593,7 +600,7 @@ class Probe { /// @todo Do we need the prefix "acct:" or "acct://"? - foreach ($lrdd AS $type => $template) { + foreach ($lrdd as $type => $template) { if ($webfinger) { continue; } @@ -603,7 +610,7 @@ class Probe { $webfinger = self::webfinger($path, $type); // Fix possible problems with GNU Social probing to wrong scheme - $webfinger = self::fixOstatus($webfinger, $template, $type); + $webfinger = self::fixOStatus($webfinger, $template, $type); // We cannot be sure that the detected address was correct, so we don't use the values if ($webfinger && ($uri != $addr)) { @@ -675,17 +682,18 @@ class Probe { * * For details see RFC 7033: * - * @param string $url Address that should be probed + * @param string $url Address that should be probed + * @param string $type type * * @return array webfinger data */ - private static function webfinger($url, $type) { - + private static function webfinger($url, $type) + { $xrd_timeout = Config::get('system', 'xrd_timeout', 20); $redirects = 0; $ret = z_fetch_url($url, false, $redirects, array('timeout' => $xrd_timeout, 'accept_content' => $type)); - if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { + if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { return false; } $data = $ret['body']; @@ -706,7 +714,7 @@ class Probe { return false; } - $xrd_arr = xml::element_to_array($xrd); + $xrd_arr = XML::elementToArray($xrd); if (!isset($xrd_arr["xrd"]["link"])) { logger("No XML webfinger links for ".$url, LOGGER_DEBUG); return false; @@ -745,11 +753,12 @@ class Probe { * This functionality was originally created for the directory. * * @param string $noscrape_url Link to the noscrape page - * @param array $data The already fetched data + * @param array $data The already fetched data * * @return array noscrape data */ - private static function pollNoscrape($noscrape_url, $data) { + private static function pollNoscrape($noscrape_url, $data) + { $ret = z_fetch_url($noscrape_url); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { return false; @@ -778,6 +787,10 @@ class Probe { $data["nick"] = $json["nick"]; } + if (!empty($json["guid"])) { + $data["guid"] = $json["guid"]; + } + if (!empty($json["comm"])) { $data["community"] = $json["comm"]; } @@ -789,7 +802,7 @@ class Probe { } } - $location = formatted_location($json); + $location = Profile::formatLocation($json); if ($location) { $data["location"] = $location; } @@ -832,7 +845,8 @@ class Probe { * * @return int Number of errors */ - public static function validDfrn($data) { + public static function validDfrn($data) + { $errors = 0; if (!isset($data['key'])) { $errors ++; @@ -859,8 +873,8 @@ class Probe { * * @return array profile data */ - public static function profile($profile_link) { - + public static function profile($profile_link) + { $data = array(); logger("Check profile ".$profile_link, LOGGER_DEBUG); @@ -904,8 +918,8 @@ class Probe { * * @return array DFRN data */ - private static function dfrn($webfinger) { - + private static function dfrn($webfinger) + { $hcard_url = ""; $data = array(); foreach ($webfinger["links"] as $link) { @@ -930,14 +944,16 @@ class Probe { //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } if (is_array($webfinger["aliases"])) { foreach ($webfinger["aliases"] as $alias) { - if (substr($alias, 0, 5) == 'acct:') { + if (normalise_link($alias) != normalise_link($data["url"]) && ! strstr($alias, "@")) { + $data["alias"] = $alias; + } elseif (substr($alias, 0, 5) == 'acct:') { $data["addr"] = substr($alias, 5); } } @@ -969,13 +985,14 @@ class Probe { /** * @brief Poll the hcard page (Diaspora and Friendica specific) * - * @param string $hcard_url Link to the hcard page - * @param array $data The already fetched data - * @param boolean $dfrn Poll DFRN specific data + * @param string $hcard_url Link to the hcard page + * @param array $data The already fetched data + * @param boolean $dfrn Poll DFRN specific data * * @return array hcard data */ - private static function pollHcard($hcard_url, $data, $dfrn = false) { + private static function pollHcard($hcard_url, $data, $dfrn = false) + { $ret = z_fetch_url($hcard_url); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { return false; @@ -1026,7 +1043,7 @@ class Probe { if ($search->length > 0) { $data["pubkey"] = $search->item(0)->nodeValue; if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } @@ -1092,7 +1109,8 @@ class Probe { * * @return array Diaspora data */ - private static function diaspora($webfinger) { + private static function diaspora($webfinger) + { $hcard_url = ""; $data = array(); foreach ($webfinger["links"] as $link) { @@ -1115,7 +1133,7 @@ class Probe { //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } @@ -1134,6 +1152,10 @@ class Probe { } } + if (!empty($webfinger["subject"]) && (substr($webfinger["subject"], 0, 5) == 'acct:')) { + $data["addr"] = substr($webfinger["subject"], 5); + } + // Fetch further information from the hcard $data = self::pollHcard($hcard_url, $data); @@ -1166,23 +1188,28 @@ class Probe { * @brief Check for OStatus contact * * @param array $webfinger Webfinger data - * @param bool $short Short detection mode + * @param bool $short Short detection mode * * @return array|bool OStatus data or "false" on error or "true" on short mode */ - private static function ostatus($webfinger, $short = false) { + private static function ostatus($webfinger, $short = false) + { $data = array(); + if (is_array($webfinger["aliases"])) { foreach ($webfinger["aliases"] as $alias) { - if (strstr($alias, "@")) { + if (strstr($alias, "@") && !strstr(normalise_link($alias), "http://")) { $data["addr"] = str_replace('acct:', '', $alias); } } } - if (is_string($webfinger["subject"]) && strstr($webfinger["subject"], "@")) { + if (is_string($webfinger["subject"]) && strstr($webfinger["subject"], "@") + && !strstr(normalise_link($webfinger["subject"]), "http://") + ) { $data["addr"] = str_replace('acct:', '', $webfinger["subject"]); } + $pubkey = ""; if (is_array($webfinger["links"])) { foreach ($webfinger["links"] as $link) { @@ -1217,7 +1244,7 @@ class Probe { if (sizeof($key) >= 3) { $m = base64url_decode($key[1]); $e = base64url_decode($key[2]); - $data["pubkey"] = metopem($m, $e); + $data["pubkey"] = Crypto::meToPem($m, $e); } } } @@ -1242,7 +1269,7 @@ class Probe { return false; } $feed = $ret['body']; - $feed_data = feed_import($feed, $dummy1, $dummy2, $dummy3, true); + $feed_data = Feed::import($feed, $dummy1, $dummy2, $dummy3, true); if (!$feed_data) { return false; } @@ -1287,8 +1314,8 @@ class Probe { * * @return array profile data */ - private static function pumpioProfileData($profile_link) { - + private static function pumpioProfileData($profile_link) + { $doc = new DOMDocument(); if (!@$doc->loadHTMLFile($profile_link)) { return false; @@ -1327,8 +1354,8 @@ class Probe { * * @return array pump.io data */ - private static function pumpio($webfinger) { - + private static function pumpio($webfinger) + { $data = array(); foreach ($webfinger["links"] as $link) { if (($link["rel"] == "http://webfinger.net/rel/profile-page") @@ -1375,7 +1402,8 @@ class Probe { * * @return string feed link */ - private static function getFeedLink($url) { + private static function getFeedLink($url) + { $doc = new DOMDocument(); if (!@$doc->loadHTMLFile($url)) { @@ -1413,18 +1441,19 @@ class Probe { /** * @brief Check for feed contact * - * @param string $url Profile link + * @param string $url Profile link * @param boolean $probe Do a probe if the page contains a feed link * * @return array feed data */ - private static function feed($url, $probe = true) { + private static function feed($url, $probe = true) + { $ret = z_fetch_url($url); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { return false; } $feed = $ret['body']; - $feed_data = feed_import($feed, $dummy1, $dummy2, $dummy3, true); + $feed_data = Feed::import($feed, $dummy1, $dummy2, $dummy3, true); if (!$feed_data) { if (!$probe) { @@ -1473,13 +1502,13 @@ class Probe { /** * @brief Check for mail contact * - * @param string $uri Profile link + * @param string $uri Profile link * @param integer $uid User ID * * @return array mail data */ - private static function mail($uri, $uid) { - + private static function mail($uri, $uid) + { if (!validate_email($uri)) { return false; } @@ -1489,17 +1518,17 @@ class Probe { $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1", intval($uid)); - if (dbm::is_result($x) && dbm::is_result($r)) { - $mailbox = construct_mailbox_name($r[0]); + if (DBM::is_result($x) && DBM::is_result($r)) { + $mailbox = Email::constructMailboxName($r[0]); $password = ''; openssl_private_decrypt(hex2bin($r[0]['pass']), $password, $x[0]['prvkey']); - $mbox = email_connect($mailbox, $r[0]['user'], $password); + $mbox = Email::connect($mailbox, $r[0]['user'], $password); if (!mbox) { return false; } } - $msgs = email_poll($mbox, $uri); + $msgs = Email::poll($mbox, $uri); logger('searching '.$uri.', '.count($msgs).' messages found.', LOGGER_DEBUG); if (!count($msgs)) { @@ -1519,7 +1548,7 @@ class Probe { $data["notify"] = 'smtp '.random_string(); $data["poll"] = 'email '.random_string(); - $x = email_msg_meta($mbox, $msgs[0]); + $x = Email::messageMeta($mbox, $msgs[0]); if (stristr($x[0]->from, $uri)) { $adr = imap_rfc822_parse_adrlist($x[0]->from, ''); } elseif (stristr($x[0]->to, $uri)) { @@ -1556,11 +1585,12 @@ class Probe { * @brief Mix two paths together to possibly fix missing parts * * @param string $avatar Path to the avatar - * @param string $base Another path that is hopefully complete + * @param string $base Another path that is hopefully complete * * @return string fixed avatar path */ - public static function fixAvatar($avatar, $base) { + public static function fixAvatar($avatar, $base) + { $base_parts = parse_url($base); // Remove all parts that could create a problem