getConfig(); $server = $config->get('system', 'directory', self::DEFAULT_DIRECTORY); $searchUrl = $server . '/search'; switch ($type) { case self::TYPE_FORUM: $searchUrl .= '/forum'; break; case self::TYPE_PEOPLE: $searchUrl .= '/people'; break; } $searchUrl .= '?q=' . urlencode($search); if ($page > 1) { $searchUrl .= '&page=' . $page; } $resultJson = Network::fetchUrl($searchUrl, false, 0, 'application/json'); $results = json_decode($resultJson, true); $resultList = new ResultList( defaults($results, 'page', 1), defaults($results, 'count', 0), defaults($results, 'itemsperpage', 30) ); $profiles = defaults($results, 'profiles', []); foreach ($profiles as $profile) { $contactDetails = Contact::getDetailsByURL(defaults($profile, 'profile_url', ''), local_user()); $itemUrl = defaults($contactDetails, 'addr', defaults($profile, 'profile_url', '')); $result = new ContactResult( defaults($profile, 'name', ''), defaults($profile, 'addr', ''), $itemUrl, defaults($profile, 'profile_url', ''), defaults($profile, 'photo', ''), Protocol::DFRN, defaults($contactDetails, 'cid', 0), 0, defaults($profile, 'tags', '')); $resultList->addResult($result); } return $resultList; } /** * Search in the local database for occurrences of the search string * * @param string $search * @param int $type * @param int $start * @param int $itemPage * * @return ResultList * @throws HTTPException\InternalServerErrorException */ public static function getContactsFromLocalDirectory($search, $type = self::TYPE_ALL, $start = 0, $itemPage = 80) { $config = self::getApp()->getConfig(); $diaspora = $config->get('system', 'diaspora_enabled') ? Protocol::DIASPORA : Protocol::DFRN; $ostatus = !$config->get('system', 'ostatus_disabled') ? Protocol::OSTATUS : Protocol::DFRN; $wildcard = Strings::escapeHtml('%' . $search . '%'); $count = DBA::count('gcontact', [ 'NOT `hide` AND `network` IN (?, ?, ?, ?) AND ((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND (`url` LIKE ? OR `name` LIKE ? OR `location` LIKE ? OR `addr` LIKE ? OR `about` LIKE ? OR `keywords` LIKE ?) AND `community` = ?', Protocol::ACTIVITYPUB, Protocol::DFRN, $ostatus, $diaspora, $wildcard, $wildcard, $wildcard, $wildcard, $wildcard, $wildcard, ($type === self::TYPE_FORUM), ]); $resultList = new ResultList($start, $itemPage, $count); if (empty($count)) { return $resultList; } $data = DBA::select('gcontact', ['nurl'], [ 'NOT `hide` AND `network` IN (?, ?, ?, ?) AND ((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND (`url` LIKE ? OR `name` LIKE ? OR `location` LIKE ? OR `addr` LIKE ? OR `about` LIKE ? OR `keywords` LIKE ?) AND `community` = ?', Protocol::ACTIVITYPUB, Protocol::DFRN, $ostatus, $diaspora, $wildcard, $wildcard, $wildcard, $wildcard, $wildcard, $wildcard, ($type === self::TYPE_FORUM), ], [ 'group_by' => ['nurl', 'updated'], 'limit' => [$start, $itemPage], 'order' => ['updated' => 'DESC'] ]); if (!DBA::isResult($data)) { return $resultList; } while ($row = DBA::fetch($data)) { if (PortableContact::alternateOStatusUrl($row["nurl"])) { continue; } $urlParts = parse_url($row["nurl"]); // Ignore results that look strange. // For historic reasons the gcontact table does contain some garbage. if (!empty($urlParts['query']) || !empty($urlParts['fragment'])) { continue; } $contact = Contact::getDetailsByURL($row["nurl"], local_user()); if ($contact["name"] == "") { $contact["name"] = end(explode("/", $urlParts["path"])); } $result = new ContactResult( $contact["name"], $contact["addr"], $contact["addr"], $contact["url"], $contact["photo"], $contact["network"], $contact["cid"], $contact["zid"], $contact["keywords"] ); $resultList->addResult($result); } DBA::close($data); // Add found profiles from the global directory to the local directory Worker::add(PRIORITY_LOW, 'DiscoverPoCo', "dirsearch", urlencode($search)); return $resultList; } }