[['uid' => local_channel(), 'xchan' => $_GET['ignore']]]]); if ($_REQUEST['return']) { goaway(z_root() . '/' . base64_decode($_REQUEST['return'])); } goaway(z_root() . '/directory?f=&suggest=1'); } $observer = get_observer_hash(); $global_changed = false; $covers_changed = false; $safe_changed = false; $type_changed = false; $active_changed = false; if (array_key_exists('global', $_REQUEST)) { $globaldir = intval($_REQUEST['global']); if (get_config('system', 'localdir_hide')) { $globaldir = 1; } $global_changed = true; } if ($global_changed) { $_SESSION['globaldir'] = $globaldir; if ($observer) { set_xconfig($observer, 'directory', 'globaldir', $globaldir); } } if (array_key_exists('covers', $_REQUEST)) { $covers = intval($_REQUEST['covers']); $covers_changed = true; } if ($covers_changed) { $_SESSION['covers'] = $covers; if ($observer) { set_xconfig($observer, 'directory', 'covers', $covers); } } if (array_key_exists('safe', $_REQUEST)) { $safemode = intval($_REQUEST['safe']); $safe_changed = true; } if ($safe_changed) { $_SESSION['safemode'] = $safemode; if ($observer) { set_xconfig($observer, 'directory', 'safemode', $safemode); } } if (array_key_exists('type', $_REQUEST)) { $type = intval($_REQUEST['type']); $type_changed = true; } if ($type_changed) { $_SESSION['chantype'] = $type; if ($observer) { set_xconfig($observer, 'directory', 'chantype', $type); } } if (array_key_exists('active', $_REQUEST)) { $active = intval($_REQUEST['active']); $active_changed = true; } if ($active_changed) { $_SESSION['activedir'] = $active; if ($observer) { set_xconfig($observer, 'directory', 'activedir', $active); } } } public function get() { $observer = get_observer_hash(); $token = ''; if (get_config('system', 'block_public_directory', true) && (!$observer)) { notice(t('Public access denied.') . EOL); return login(false); } $globaldir = Libzotdir::get_directory_setting($observer, 'globaldir'); // override your personal global search pref if we're doing a navbar search of the directory if (intval($_REQUEST['navsearch'])) { $globaldir = 1; } $safe_mode = Libzotdir::get_directory_setting($observer, 'safemode'); // replace with system.remote_cover_photos once work on this feature is complete if (Config::Get('system','remote_cover_photos_directory')) { $covers = Libzotdir::get_directory_setting($observer, 'covers'); } else { $covers = false; } $type = Libzotdir::get_directory_setting($observer, 'chantype'); $active = Libzotdir::get_directory_setting($observer, 'activedir'); $o = ''; Navbar::set_selected('Directory'); if (x($_POST, 'search')) { $search = notags(trim($_POST['search'])); } else { $search = ((x($_GET, 'search')) ? notags(trim(rawurldecode($_GET['search']))) : ''); } if (strpos($search, '=')) { $advanced = $search; } $keywords = (($_GET['keywords']) ? $_GET['keywords'] : ''); // Suggest channels if no search terms or keywords are given $suggest = (local_channel() && x($_REQUEST, 'suggest')) ? $_REQUEST['suggest'] : ''; if ($suggest) { // the directory options have no effect in suggestion mode $globaldir = 1; $safe_mode = 1; $active = 1; $type = 0; // only return DIRECTORY_PAGESIZE suggestions as the suggestion sorting // only works if the suggestion query and the directory query have the // same number of results App::set_pager_itemspage(60); $r = Socgraph::suggestion_query(local_channel(), get_observer_hash(), App::$pager['start'], DIRECTORY_PAGESIZE); if (!$r) { if ($_REQUEST['aj']) { echo '
'; killme(); } notice(t('No default suggestions were found.') . EOL); return ''; } // Remember in which order the suggestions were $addresses = []; $common = []; $index = 0; foreach ($r as $rr) { $common[$rr['xchan_hash']] = ((intval($rr['total']) > 0) ? intval($rr['total']) - 1 : 0); $addresses[$rr['xchan_hash']] = $index++; } // Build query to get info about suggested people $advanced = ''; foreach (array_keys($addresses) as $address) { $advanced .= "xhash=\"$address\" "; } // Remove last space in the advanced query $advanced = rtrim($advanced); } $tpl = Theme::get_template('directory_header.tpl'); $dirmode = intval(get_config('system', 'directory_mode')); $directory_admin = false; $url = z_root() . '/dirsearch'; if (Channel::is_system(local_channel())) { $directory_admin = true; } $sys = Channel::get_system(); $sys_channel = $sys['channel_id']; $contacts = []; if (local_channel()) { $x = q( "select abook_xchan from abook where abook_channel = %d", intval(local_channel()) ); if ($x) { foreach ($x as $xx) { $contacts[] = $xx['abook_xchan']; } } } if ($url) { $numtags = get_config('system', 'directorytags'); $kw = ((intval($numtags) > 0) ? intval($numtags) : 50); if (get_config('system', 'disable_directory_keywords')) { $kw = 0; } $query = $url . '?f=&kw=' . $kw . (($safe_mode != 1) ? '&safe=' . $safe_mode : ''); if ($token) { $query .= '&t=' . $token; } if (!$globaldir) { $query .= '&hub=' . App::get_hostname(); } if ($search) { $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search); } if (strpos($search, '@')) { $query .= '&address=' . urlencode($search); } if (str_starts_with($search, 'http')) { $query .= '&url=' . urlencode($search); } if ($keywords) { $query .= '&keywords=' . urlencode($keywords); } // if ($advanced) { // $query .= '&query=' . urlencode($advanced); // } if (!is_null($type)) { $query .= '&type=' . intval($type); } $directory_sort_order = get_config('system', 'directory_sort_order'); if (!$directory_sort_order) { $directory_sort_order = 'date'; } $sort_order = ((x($_REQUEST, 'order')) ? $_REQUEST['order'] : $directory_sort_order); if ($sort_order) { $query .= '&order=' . urlencode($sort_order); } if (App::$pager['page'] != 1) { $query .= '&p=' . App::$pager['page']; } if (isset($active)) { $query .= '&active=' . intval($active); } // logger('mod_directory: query: ' . $query); $x = Url::post($query, [ 'query' => $advanced]); // logger('directory: return from upstream: ' . print_r($x,true), LOGGER_DATA); if ($x['success']) { /** Experimental if ($format === 'json') { $chan = Channel::get_system(); //$i = Activity::encode_actor_collection($items, 'search?' . $saved_id , 'OrderedCollection', true, count($items)); $x = array_merge(Activity::ap_context(), $i); $headers = []; $headers['Content-Type'] = 'application/x-nomad+json'; $x['proof'] = (new JcsEddsa2022)->sign($x, $chan); $ret = json_encode($x, JSON_UNESCAPED_SLASHES); $headers['Digest'] = HTTPSig::generate_digest_header($ret); $headers['(request-target)'] = strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI']; $h = HTTPSig::create_sig($headers, $chan['channel_prvkey'], Channel::url($chan)); HTTPSig::set_headers($h); echo $ret; killme(); } **/ $t = 0; $j = json_decode($x['body'], true); if ($j) { if ($j['results']) { $results = $j['results']; if ($suggest) { // change order to "number of common friends descending" $results = self::reorder_results($results, $addresses); } $entries = []; $photo = 'thumb'; foreach ($results as $rr) { $profile_link = chanlink_url($rr['url']); $pdesc = (($rr['description']) ? $rr['description'] . '