diff --git a/src/Core/Search.php b/src/Core/Search.php index 9700c6472..e43e621d2 100644 --- a/src/Core/Search.php +++ b/src/Core/Search.php @@ -242,7 +242,7 @@ class Search extends BaseObject DBA::close($data); // Add found profiles from the global directory to the local directory - Worker::add(PRIORITY_LOW, 'DiscoverPoCo', "dirsearch", urlencode($search)); + Worker::add(PRIORITY_LOW, 'SearchDirectory', $search); return $resultList; } diff --git a/src/Worker/DiscoverPoCo.php b/src/Worker/DiscoverPoCo.php index d495b4c2a..2c3536bf8 100644 --- a/src/Worker/DiscoverPoCo.php +++ b/src/Worker/DiscoverPoCo.php @@ -26,58 +26,21 @@ class DiscoverPoCo { /* This function can be called in these ways: - - dirsearch : Searches for "search pattern" in the directory. "search pattern" is url encoded. - checkcontact: Updates gcontact entries - suggestions: Discover other servers for their contacts. - server : Searches for the poco server list. "poco url" is base64 encoded. - update_server: Frequently check the first 250 servers for vitality. - update_server_directory: Discover the given server id for their contacts - PortableContact::load: Load POCO data from a given POCO address - - check_profile: Update remote profile data */ $search = ""; $mode = 0; - if ($command == "dirsearch") { - $search = urldecode($param1); - $mode = 1; - } elseif ($command == "checkcontact") { - $mode = 2; + if (($command == "checkcontact") && Config::get('system', 'poco_completion')) { + self::discoverUsers(); } elseif ($command == "suggestions") { - $mode = 3; + GContact::updateSuggestions(); } elseif ($command == "server") { - $mode = 4; - } elseif ($command == "update_server") { - $mode = 5; - } elseif ($command == "update_server_directory") { - $mode = 6; - } elseif ($command == "load") { - $mode = 7; - } elseif ($command == "check_profile") { - $mode = 8; - } elseif ($command !== "") { - Logger::log("Unknown or missing parameter ".$command."\n"); - return; - } - - Logger::log('start '.$search); - - if ($mode == 8) { - if ($param1 != "") { - GContact::updateFromProbe($param1, true); - } - } elseif ($mode == 7) { - if (!empty($param4)) { - $url = $param4; - } else { - $url = ''; - } - PortableContact::load(intval($param1), intval($param2), intval($param3), $url); - } elseif ($mode == 6) { - PortableContact::discoverSingleServer(intval($param1)); - } elseif ($mode == 5) { - self::updateServer(); - } elseif ($mode == 4) { $server_url = $param1; if ($server_url == "") { return; @@ -94,14 +57,25 @@ class DiscoverPoCo $result .= "failed"; } Logger::log($result, Logger::DEBUG); - } elseif ($mode == 3) { - GContact::updateSuggestions(); - } elseif (($mode == 2) && Config::get('system', 'poco_completion')) { - self::discoverUsers(); - } elseif (($mode == 1) && ($search != "") && Config::get('system', 'poco_local_search')) { - self::discoverDirectory($search); - self::gsSearchUser($search); - } elseif (($mode == 0) && ($search == "") && (Config::get('system', 'poco_discovery') != PortableContact::DISABLED)) { + } elseif ($command == "update_server") { + self::updateServer(); + } elseif ($command == "update_server_directory") { + PortableContact::discoverSingleServer(intval($param1)); + } elseif ($command == "load") { + if (!empty($param4)) { + $url = $param4; + } else { + $url = ''; + } + PortableContact::load(intval($param1), intval($param2), intval($param3), $url); + } elseif ($command !== "") { + Logger::log("Unknown or missing parameter ".$command."\n"); + return; + } + + Logger::log('start '.$search); + + if (($mode == 0) && ($search == "") && (Config::get('system', 'poco_discovery') != PortableContact::DISABLED)) { // Query Friendica and Hubzilla servers for their users PortableContact::discover(); @@ -189,7 +163,7 @@ class DiscoverPoCo if ((($server_url == "") && ($user["network"] == Protocol::FEED)) || $force_update || GServer::check($server_url, $user["network"])) { Logger::log('Check profile '.$user["url"]); - Worker::add(PRIORITY_LOW, "DiscoverPoCo", "check_profile", $user["url"]); + Worker::add(PRIORITY_LOW, 'UpdateGContact', $user['url'], 'force'); if (++$checked > 100) { return; @@ -205,101 +179,4 @@ class DiscoverPoCo } } } - - private static function discoverDirectory($search) { - - $data = Cache::get("dirsearch:".$search); - if (!is_null($data)) { - // Only search for the same item every 24 hours - if (time() < $data + (60 * 60 * 24)) { - Logger::log("Already searched for ".$search." in the last 24 hours", Logger::DEBUG); - return; - } - } - - $x = Network::fetchUrl(get_server()."/lsearch?p=1&n=500&search=".urlencode($search)); - $j = json_decode($x); - - if (!empty($j->results)) { - foreach ($j->results as $jj) { - // Check if the contact already exists - $exists = q("SELECT `id`, `last_contact`, `last_failure`, `updated` FROM `gcontact` WHERE `nurl` = '%s'", Strings::normaliseLink($jj->url)); - if (DBA::isResult($exists)) { - Logger::log("Profile ".$jj->url." already exists (".$search.")", Logger::DEBUG); - - if (($exists[0]["last_contact"] < $exists[0]["last_failure"]) && - ($exists[0]["updated"] < $exists[0]["last_failure"])) { - continue; - } - // Update the contact - GContact::updateFromProbe($jj->url); - continue; - } - - $server_url = Contact::getBasepath($jj->url); - if ($server_url != '') { - if (!GServer::check($server_url)) { - Logger::log("Friendica server ".$server_url." doesn't answer.", Logger::DEBUG); - continue; - } - Logger::log("Friendica server ".$server_url." seems to be okay.", Logger::DEBUG); - } - - $data = Probe::uri($jj->url); - if ($data["network"] == Protocol::DFRN) { - Logger::log("Profile ".$jj->url." is reachable (".$search.")", Logger::DEBUG); - Logger::log("Add profile ".$jj->url." to local directory (".$search.")", Logger::DEBUG); - - if ($jj->tags != "") { - $data["keywords"] = $jj->tags; - } - - $data["server_url"] = $data["baseurl"]; - - GContact::update($data); - } else { - Logger::log("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], Logger::DEBUG); - } - } - } - Cache::set("dirsearch:".$search, time(), Cache::DAY); - } - - /** - * @brief Search for GNU Social user with gstools.org - * - * @param string $search User name - * @return bool - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - * @throws \ImagickException - */ - private static function gsSearchUser($search) { - - // Currently disabled, since the service isn't available anymore. - // It is not removed since I hope that there will be a successor. - return false; - - $url = "http://gstools.org/api/users_search/".urlencode($search); - - $curlResult = Network::curl($url); - if (!$curlResult->isSuccess()) { - return false; - } - - $contacts = json_decode($curlResult->getBody()); - - if ($contacts->status == 'ERROR') { - return false; - } - - /// @TODO AS is considered as a notation for constants (as they usually being written all upper-case) - /// @TODO find all those and convert to all lower-case which is a keyword then - foreach ($contacts->data AS $user) { - $contact = Probe::uri($user->site_address."/".$user->name); - if ($contact["network"] != Protocol::PHANTOM) { - $contact["about"] = $user->description; - GContact::update($contact); - } - } - } } diff --git a/src/Worker/SearchDirectory.php b/src/Worker/SearchDirectory.php new file mode 100644 index 000000000..0f5782db5 --- /dev/null +++ b/src/Worker/SearchDirectory.php @@ -0,0 +1,91 @@ +: Searches for "search pattern" in the directory. + public static function execute($search) + { + if (!Config::get('system', 'poco_local_search')) { + Logger::info('Local search is not enabled'); + return; + } + + self::discoverDirectory($search); + return; + } + + private static function discoverDirectory($search) + { + $data = Cache::get('discoverDirectory' . $search); + if (!is_null($data)) { + // Only search for the same item every 24 hours + if (time() < $data + (60 * 60 * 24)) { + Logger::info('Already searched this in the last 24 hours', ['search' => $search]); + return; + } + } + + $x = Network::fetchUrl(get_server() . '/lsearch?p=1&n=500&search=' . urlencode($search)); + $j = json_decode($x); + + if (!empty($j->results)) { + foreach ($j->results as $jj) { + // Check if the contact already exists + $gcontact = DBA::selectFirst('gcontact', ['id', 'last_contact', 'last_failure', 'updated'], ['nurl' => Strings::normaliseLink($jj->url)]); + if (DBA::isResult($gcontact)) { + Logger::info('Profile already exists', ['profile' => $jj->url, 'search' => $search]); + + if (($gcontact['last_contact'] < $gcontact['last_failure']) && + ($gcontact['updated'] < $gcontact['last_failure'])) { + continue; + } + + // Update the contact + GContact::updateFromProbe($jj->url); + continue; + } + + $server_url = Contact::getBasepath($jj->url); + if ($server_url != '') { + if (!GServer::check($server_url)) { + Logger::log("Friendica server doesn't answer.", ['server' => $server_url]); + continue; + } + Logger::log('Friendica server seems to be okay.', ['server' => $server_url]); + } + + $data = Probe::uri($jj->url); + if ($data['network'] == Protocol::DFRN) { + Logger::log('Add profile to local directory', ['profile' => $jj->url]); + + if ($jj->tags != '') { + $data['keywords'] = $jj->tags; + } + + $data['server_url'] = $data['baseurl']; + + GContact::update($data); + } else { + Logger::log('Profile is not responding or no Friendica contact', ['profile' => $jj->url, 'network' => $data['network']]); + } + } + } + Cache::set('discoverDirectory' . $search, time(), Cache::DAY); + } +}