diff --git a/mod/noscrape.php b/mod/noscrape.php deleted file mode 100644 index 0b3d490a3..000000000 --- a/mod/noscrape.php +++ /dev/null @@ -1,111 +0,0 @@ -argc > 1) { - $which = $a->argv[1]; - } else { - exit(); - } - - $profile = 0; - if ((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) { - $which = $a->user['nickname']; - $profile = $a->argv[1]; - } - - Profile::load($a, $which, $profile); - - $json_info = [ - 'addr' => $a->profile['addr'], - 'nick' => $which, - 'guid' => $a->profile['guid'], - 'key' => $a->profile['pubkey'], - 'homepage' => DI::baseUrl()."/profile/{$which}", - 'comm' => ($a->profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY), - 'account-type' => $a->profile['account-type'], - ]; - - $dfrn_pages = ['request', 'confirm', 'notify', 'poll']; - foreach ($dfrn_pages as $dfrn) { - $json_info["dfrn-{$dfrn}"] = DI::baseUrl()."/dfrn_{$dfrn}/{$which}"; - } - - if (!$a->profile['net-publish'] || $a->profile['hidewall']) { - header('Content-type: application/json; charset=utf-8'); - $json_info["hide"] = true; - echo json_encode($json_info); - exit; - } - - $keywords = $a->profile['pub_keywords'] ?? ''; - $keywords = str_replace(['#',',',' ',',,'], ['',' ',',',','], $keywords); - $keywords = explode(',', $keywords); - - $contactPhoto = DBA::selectFirst('contact', ['photo'], ['self' => true, 'uid' => $a->profile['uid']]); - - $json_info['fn'] = $a->profile['name']; - $json_info['photo'] = $contactPhoto["photo"]; - $json_info['tags'] = $keywords; - $json_info['language'] = $a->profile['language']; - - if (is_array($a->profile) && !$a->profile['hide-friends']) { - /// @todo What should this value tell us? - $r = q("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1", - intval($a->profile['uid'])); - if (DBA::isResult($r)) { - $json_info["updated"] = date("c", strtotime($r[0]['updated'])); - } - - $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 AND `hidden` = 0 AND `archive` = 0 - AND `network` IN ('%s', '%s', '%s', '')", - intval($a->profile['uid']), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::DIASPORA), - DBA::escape(Protocol::OSTATUS) - ); - if (DBA::isResult($r)) { - $json_info["contacts"] = intval($r[0]['total']); - } - } - - // We display the last activity (post or login), reduced to year and week number - $last_active = 0; - $condition = ['uid' => $a->profile['uid'], 'self' => true]; - $contact = DBA::selectFirst('contact', ['last-item'], $condition); - if (DBA::isResult($contact)) { - $last_active = strtotime($contact['last-item']); - } - - $condition = ['uid' => $a->profile['uid']]; - $user = DBA::selectFirst('user', ['login_date'], $condition); - if (DBA::isResult($user)) { - if ($last_active < strtotime($user['login_date'])) { - $last_active = strtotime($user['login_date']); - } - } - $json_info["last-activity"] = date("o-W", $last_active); - - //These are optional fields. - $profile_fields = ['pdesc', 'locality', 'region', 'postal-code', 'country-name', 'gender', 'marital', 'about']; - foreach ($profile_fields as $field) { - if (!empty($a->profile[$field])) { - $json_info["$field"] = $a->profile[$field]; - } - } - - //Output all the JSON! - header('Content-type: application/json; charset=utf-8'); - echo json_encode($json_info); - exit; -} diff --git a/src/Module/NoScrape.php b/src/Module/NoScrape.php new file mode 100644 index 000000000..0d765f640 --- /dev/null +++ b/src/Module/NoScrape.php @@ -0,0 +1,117 @@ +get(2) == 'view') { + // view infos about a known profile (needs a login) + $which = $a->user['nickname']; + $profile = $parameters['profile']; + } else { + System::jsonError(403, 'Authentication required'); + exit(); + } + + Profile::load($a, $which, $profile); + + $json_info = [ + 'addr' => $a->profile['addr'], + 'nick' => $which, + 'guid' => $a->profile['guid'], + 'key' => $a->profile['pubkey'], + 'homepage' => DI::baseUrl() . "/profile/{$which}", + 'comm' => ($a->profile['account-type'] == User::ACCOUNT_TYPE_COMMUNITY), + 'account-type' => $a->profile['account-type'], + ]; + + $dfrn_pages = ['request', 'confirm', 'notify', 'poll']; + foreach ($dfrn_pages as $dfrn) { + $json_info["dfrn-{$dfrn}"] = DI::baseUrl() . "/dfrn_{$dfrn}/{$which}"; + } + + if (!$a->profile['net-publish'] || $a->profile['hidewall']) { + $json_info['hide'] = true; + System::jsonExit($json_info); + } + + $keywords = $a->profile['pub_keywords'] ?? ''; + $keywords = str_replace(['#', ',', ' ', ',,'], ['', ' ', ',', ','], $keywords); + $keywords = explode(',', $keywords); + + $contactPhoto = DBA::selectFirst('contact', ['photo'], ['self' => true, 'uid' => $a->profile['uid']]); + + $json_info['fn'] = $a->profile['name']; + $json_info['photo'] = $contactPhoto["photo"]; + $json_info['tags'] = $keywords; + $json_info['language'] = $a->profile['language']; + + if (!($a->profile['hide-friends'] ?? false)) { + /// @todo What should this value tell us? + $result = DBA::p("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1", $a->profile['uid']); + if (DBA::isResult($result)) { + $json_info["updated"] = date("c", strtotime($result[0]['updated'])); + } + + $json_info['contacts'] = DBA::count('contact', + [ + 'uid' => $a->profile['uid'], + 'self' => 0, + 'blocked' => 0, + 'pending' => 0, + 'hidden' => 0, + 'archive' => 0, + 'network' => [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS] + ]); + } + + // We display the last activity (post or login), reduced to year and week number + $last_active = 0; + $condition = ['uid' => $a->profile['uid'], 'self' => true]; + $contact = DBA::selectFirst('contact', ['last-item'], $condition); + if (DBA::isResult($contact)) { + $last_active = strtotime($contact['last-item']); + } + + $condition = ['uid' => $a->profile['uid']]; + $user = DBA::selectFirst('user', ['login_date'], $condition); + if (DBA::isResult($user)) { + if ($last_active < strtotime($user['login_date'])) { + $last_active = strtotime($user['login_date']); + } + } + $json_info['last-activity'] = date('o-W', $last_active); + + //These are optional fields. + $profile_fields = ['pdesc', 'locality', 'region', 'postal-code', 'country-name', 'gender', 'marital', 'about']; + foreach ($profile_fields as $field) { + if (!empty($a->profile[$field])) { + $json_info["$field"] = $a->profile[$field]; + } + } + + System::jsonExit($json_info); + } +} diff --git a/static/routes.config.php b/static/routes.config.php index a4fc82394..17a2b5bf5 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -167,6 +167,11 @@ return [ '/nodeinfo/{version}' => [Module\NodeInfo::class, [R::GET]], '/nogroup' => [Module\Group::class, [R::GET]], + '/noscrape' => [ + '/{nick}' => [Module\NoScrape::class, [R::GET]], + '/{profile}/view' => [Module\NoScrape::class, [R::GET]], + ], + '/notifications' => [ '/network[/json]' => [Module\Notifications\Notifications::class, [R::GET, R::POST]], '/system[/json]' => [Module\Notifications\Notifications::class, [R::GET, R::POST]],