From e06d9f20cfd97daad441131c0e241239c70be7de Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 29 Jul 2020 05:12:16 +0000 Subject: [PATCH 1/3] AP: Always sign requests --- src/Model/Item.php | 4 ++++ src/Model/User.php | 23 +++++++++++++++++++++++ src/Module/Friendica.php | 22 +++++++--------------- src/Protocol/ActivityPub.php | 28 ++++++++++++++-------------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/src/Model/Item.php b/src/Model/Item.php index 6567e5e260..b6f8ffa3d1 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -3705,8 +3705,10 @@ class Item */ public static function fetchByLink(string $uri, int $uid = 0) { + Logger::info('Trying to fetch link', ['uid' => $uid, 'uri' => $uri]); $item_id = self::searchByLink($uri, $uid); if (!empty($item_id)) { + Logger::info('Link found', ['uid' => $uid, 'uri' => $uri, 'id' => $item_id]); return $item_id; } @@ -3717,9 +3719,11 @@ class Item } if (!empty($item_id)) { + Logger::info('Link fetched', ['uid' => $uid, 'uri' => $uri, 'id' => $item_id]); return $item_id; } + Logger::info('Link not found', ['uid' => $uid, 'uri' => $uri]); return 0; } diff --git a/src/Model/User.php b/src/Model/User.php index 78ae958041..0317edf9bf 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -185,6 +185,29 @@ class User return DBA::selectFirst('user', $fields, ['email' => $email]); } + /** + * Fetch the user array of the administrator. The first one if there are several. + * + * @param array $fields + * @return array user + */ + public static function getFirstAdmin(array $fields = []) + { + $condition = []; + if (!empty(DI::config()->get('config', 'admin_nickname'))) { + $condition['nickname'] = DI::config()->get('config', 'admin_nickname'); + } + if (!empty(DI::config()->get('config', 'admin_email'))) { + $adminList = explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))); + $condition['email'] = $adminList[0]; + $administrator = self::getByEmail($adminList[0], $fields); + if (!empty($administrator)) { + return $administrator; + } + } + return []; + } + /** * Get owner data by user id * diff --git a/src/Module/Friendica.php b/src/Module/Friendica.php index 3325b1ae82..ea693ce275 100644 --- a/src/Module/Friendica.php +++ b/src/Module/Friendica.php @@ -130,21 +130,13 @@ class Friendica extends BaseModule $register_policy = $register_policies[$register_policy_int]; } - $condition = []; - $admin = false; - if (!empty($config->get('config', 'admin_nickname'))) { - $condition['nickname'] = $config->get('config', 'admin_nickname'); - } - if (!empty($config->get('config', 'admin_email'))) { - $adminList = explode(',', str_replace(' ', '', $config->get('config', 'admin_email'))); - $condition['email'] = $adminList[0]; - $administrator = User::getByEmail($adminList[0], ['username', 'nickname']); - if (!empty($administrator)) { - $admin = [ - 'name' => $administrator['username'], - 'profile' => DI::baseUrl()->get() . '/profile/' . $administrator['nickname'], - ]; - } + $admin = []; + $administrator = User::getFirstAdmin(['username', 'nickname']); + if (!empty($administrator)) { + $admin = [ + 'name' => $administrator['username'], + 'profile' => DI::baseUrl()->get() . '/profile/' . $administrator['nickname'], + ]; } $visible_addons = Addon::getVisibleList(); diff --git a/src/Protocol/ActivityPub.php b/src/Protocol/ActivityPub.php index 3c4f4f2e67..c04b9e592d 100644 --- a/src/Protocol/ActivityPub.php +++ b/src/Protocol/ActivityPub.php @@ -22,6 +22,7 @@ namespace Friendica\Protocol; use Friendica\Core\Protocol; +use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\User; @@ -89,22 +90,21 @@ class ActivityPub */ public static function fetchContent(string $url, int $uid = 0) { - if (!empty($uid)) { - return HTTPSignature::fetch($url, $uid); + if (empty($uid)) { + $user = User::getFirstAdmin(['uid']); + + if (empty($user['uid'])) { + // When the system setup is missing an admin we just take the first user + $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]; + $user = DBA::selectFirst('user', ['uid'], $condition); + } + + if (!empty($user['uid'])) { + $uid = $user['uid']; + } } - $curlResult = DI::httpRequest()->get($url, false, ['accept_content' => 'application/activity+json, application/ld+json']); - if (!$curlResult->isSuccess() || empty($curlResult->getBody())) { - return false; - } - - $content = json_decode($curlResult->getBody(), true); - - if (empty($content) || !is_array($content)) { - return false; - } - - return $content; + return HTTPSignature::fetch($url, $uid); } private static function getAccountType($apcontact) From 2a243b747d1bd34b880e1761b397738ce0b4de21 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 29 Jul 2020 14:55:55 +0000 Subject: [PATCH 2/3] Improved functionality to fetch the admin user --- src/Model/User.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Model/User.php b/src/Model/User.php index 0317edf9bf..7b88aac189 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -193,17 +193,14 @@ class User */ public static function getFirstAdmin(array $fields = []) { - $condition = []; if (!empty(DI::config()->get('config', 'admin_nickname'))) { - $condition['nickname'] = DI::config()->get('config', 'admin_nickname'); - } - if (!empty(DI::config()->get('config', 'admin_email'))) { + $administrator = self::getByNickname(DI::config()->get('config', 'admin_nickname'), $fields); + } elseif (!empty(DI::config()->get('config', 'admin_email'))) { $adminList = explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))); - $condition['email'] = $adminList[0]; $administrator = self::getByEmail($adminList[0], $fields); - if (!empty($administrator)) { - return $administrator; - } + } + if (!empty($administrator)) { + return $administrator; } return []; } From a3ba0ccc9367da640cd0e438c89fd62e4cef7916 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 29 Jul 2020 14:59:55 +0000 Subject: [PATCH 3/3] Simplified code --- src/Model/User.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Model/User.php b/src/Model/User.php index 7b88aac189..46f0776b4e 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -194,15 +194,13 @@ class User public static function getFirstAdmin(array $fields = []) { if (!empty(DI::config()->get('config', 'admin_nickname'))) { - $administrator = self::getByNickname(DI::config()->get('config', 'admin_nickname'), $fields); + return self::getByNickname(DI::config()->get('config', 'admin_nickname'), $fields); } elseif (!empty(DI::config()->get('config', 'admin_email'))) { $adminList = explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))); - $administrator = self::getByEmail($adminList[0], $fields); + return self::getByEmail($adminList[0], $fields); + } else { + return []; } - if (!empty($administrator)) { - return $administrator; - } - return []; } /**