diff --git a/ActivityPubPlugin.php b/ActivityPubPlugin.php index 4d61b2f..c5e8b04 100644 --- a/ActivityPubPlugin.php +++ b/ActivityPubPlugin.php @@ -35,7 +35,7 @@ class ActivityPubPlugin extends Plugin public function onRouterInitialized(URLMapper $m) { - ActivitypubURLMapperOverwrite::overwrite_variable($m, ':nickname', + ActivityPubURLMapperOverwrite::overwrite_variable($m, ':nickname', ['action' => 'showstream'], ['nickname' => Nickname::DISPLAY_FMT], 'apactorprofile'); @@ -70,7 +70,7 @@ class ActivityPubPlugin extends Plugin * Overwrites variables in URL-mapping * */ -class ActivitypubURLMapperOverwrite extends URLMapper +class ActivityPubURLMapperOverwrite extends URLMapper { static function overwrite_variable($m, $path, $args, $paramPatterns, $newaction) { @@ -80,8 +80,8 @@ class ActivitypubURLMapperOverwrite extends URLMapper 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' ]; - if (in_array($_SERVER["HTTP_ACCEPT"], $mimes) == false) { - return; + if (in_array ($_SERVER["HTTP_ACCEPT"], $mimes) == false) { + return true; } $m->connect($path, array('action' => $newaction), $paramPatterns); @@ -93,3 +93,21 @@ class ActivitypubURLMapperOverwrite extends URLMapper } } } + +class ActivityPubReturn +{ + static function answer ($res) + { + header('Content-Type: application/activity+json'); + echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + exit; + } + static function error ($m, $code=500) + { + http_response_code ($code); + header('Content-Type: application/activity+json'); + $res[] = Activitypub_error::errorMessageToObject($m); + echo json_encode($res, JSON_UNESCAPED_SLASHES); + exit; + } +} diff --git a/actions/apactorfollowers.php b/actions/apactorfollowers.php index 42f0c70..5ab74dc 100644 --- a/actions/apactorfollowers.php +++ b/actions/apactorfollowers.php @@ -43,38 +43,38 @@ class apActorFollowersAction extends ManagedAction $profile = $user->getProfile(); $url = $profile->profileurl; } catch (Exception $e) { - throw new \Exception('Invalid username'); + ActivityPubReturn::error ('Invalid username'); } - + $page = intval($this->trimmed('page')); - + if ($page <= 0) - throw new \Exception('Invalid page number'); - + ActivityPubReturn::error ('Invalid page number'); + /* Fetch Followers */ try { $since = ($page-1) * PROFILES_PER_MINILIST; $limit = (($page-1) == 0 ? 1 : $page)*PROFILES_PER_MINILIST; $sub = $profile->getSubscribers($since, $limit); } catch (NoResultException $e) { - throw new \Exception('This user has no followers'); + ActivityPubReturn::error ('This user has no followers'); } /* Calculate total items */ $total_subs = $profile->subscriberCount(); $total_pages = ceil($total_subs/PROFILES_PER_MINILIST); - + if ($total_pages == 0) - throw new \Exception('This user has no followers'); - + ActivityPubReturn::error ('This user has no followers'); + if ($page > $total_pages) - throw new \Exception("There are only {$total_pages} pages"); - + ActivityPubReturn::error ("There are only {$total_pages} pages"); + /* Get followers' URLs */ $subs = []; while ($sub->fetch()) $subs[] = $this->pretty_sub (clone($sub)); - + $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", @@ -88,11 +88,9 @@ class apActorFollowersAction extends ManagedAction 'orderedItems' => $subs ]; - header('Content-Type: application/activity+json'); - - echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + ActivityPubReturn::answer ($res); } - + protected function pretty_sub ($sub_object) { return $sub_object->profileurl; diff --git a/actions/apactorfollowing.php b/actions/apactorfollowing.php index 43196c3..43b9712 100644 --- a/actions/apactorfollowing.php +++ b/actions/apactorfollowing.php @@ -43,38 +43,38 @@ class apActorFollowingAction extends ManagedAction $profile = $user->getProfile(); $url = $profile->profileurl; } catch (Exception $e) { - throw new \Exception('Invalid username'); + ActivityPubReturn::error ('Invalid username'); } - + $page = intval($this->trimmed('page')); - + if ($page <= 0) - throw new \Exception('Invalid page number'); - + ActivityPubReturn::error ('Invalid page number'); + /* Fetch Following */ try { $since = ($page-1) * PROFILES_PER_MINILIST; $limit = (($page-1) == 0 ? 1 : $page)*PROFILES_PER_MINILIST; $sub = $profile->getSubscribed($since, $limit); } catch (NoResultException $e) { - throw new \Exception('This user is not following anyone'); + ActivityPubReturn::error ('This user is not following anyone'); } /* Calculate total items */ $total_subs = $profile->subscriptionCount(); $total_pages = ceil($total_subs/PROFILES_PER_MINILIST); - + if ($total_pages == 0) - throw new \Exception('This user has no followers'); - + ActivityPubReturn::error ('This user has no followers'); + if ($page > $total_pages) - throw new \Exception("There are only {$total_pages} pages"); - + ActivityPubReturn::error ("There are only {$total_pages} pages"); + /* Get followed' URLs */ $subs = []; while ($sub->fetch()) $subs[] = $this->pretty_sub (clone($sub)); - + $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", @@ -88,11 +88,9 @@ class apActorFollowingAction extends ManagedAction 'orderedItems' => $subs ]; - header('Content-Type: application/activity+json'); - - echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + ActivityPubReturn::answer ($res); } - + protected function pretty_sub ($sub_object) { return $sub_object->profileurl; diff --git a/actions/apactorlikedcollection.php b/actions/apactorlikedcollection.php index 3311e76..7d4d1b6 100644 --- a/actions/apactorlikedcollection.php +++ b/actions/apactorlikedcollection.php @@ -43,9 +43,9 @@ class apActorLikedCollectionAction extends ManagedAction $profile = $user->getProfile(); $url = $profile->profileurl; } catch (Exception $e) { - throw new \Exception('Invalid username'); + ActivityPubReturn::error ('Invalid username'); } - + $limit = intval($this->trimmed('limit')); $since_id = intval($this->trimmed('since_id')); $max_id = intval($this->trimmed('max_id')); @@ -53,15 +53,15 @@ class apActorLikedCollectionAction extends ManagedAction $limit = empty ($limit) ? 40 : $limit; // Default is 40 $since_id = empty ($since_id) ? null : $since_id; $max_id = empty ($max_id) ? null : $max_id; - + if ($limit > 80) $limit = 80; // Max is 80 - + $fave = $this->fetch_faves ($user->getID(), $limit, $since_id, $max_id); $faves = []; while ($fave->fetch()) $faves[] = $this->pretty_fave (clone($fave)); - + $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", @@ -75,33 +75,31 @@ class apActorLikedCollectionAction extends ManagedAction 'orderedItems' => $faves ]; - header('Content-Type: application/activity+json'); - - echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + ActivityPubReturn::answer ($res); } - + protected function pretty_fave ($fave_object) { $res = array ("uri" => $fave_object->uri, "created" => $fave_object->created, "object" => Activitypub_notice::noticeToObject(Notice::getByID($fave_object->notice_id))); - + return $res; } - + private static function fetch_faves ($user_id, $limit = 40, $since_id = null, $max_id = null) { $fav = new Fave(); $fav->user_id = $user_id; - + $fav->orderBy('modified DESC'); if ($since_id != null) $fav->whereAdd("notice_id > {$since_id}"); if ($max_id != null) $fav->whereAdd("notice_id < {$max_id}"); - + $fav->limit($limit); $fav->find(); diff --git a/actions/apactorprofile.php b/actions/apactorprofile.php index 68cab8c..64a4f0d 100644 --- a/actions/apactorprofile.php +++ b/actions/apactorprofile.php @@ -31,7 +31,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } class apActorProfileAction extends ManagedAction -{ +{ protected $needLogin = false; protected $canPost = true; @@ -42,13 +42,11 @@ class apActorProfileAction extends ManagedAction $user = User::getByNickname($nickname); $profile = $user->getProfile(); } catch (Exception $e) { - throw new \Exception('Invalid username'); + ActivityPubReturn::error ('Invalid username', 404); } - header('Content-Type: application/activity+json'); - $res = Activitypub_profile::profileToObject($profile); - echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + ActivityPubReturn::answer ($res); } } diff --git a/classes/Activitypub_error.php b/classes/Activitypub_error.php new file mode 100644 index 0000000..aac10a7 --- /dev/null +++ b/classes/Activitypub_error.php @@ -0,0 +1,43 @@ +. + * + * @category Plugin + * @package GNUsocial + * @author Diogo Cordeiro + * @author Daniel Supernault + * @copyright 2015 Free Software Foundaction, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link https://gnu.io/social + */ + +if (!defined('GNUSOCIAL')) { exit(1); } + +class Activitypub_error extends Managed_DataObject +{ + public static function errorMessageToObject($m) + { + $res = [ + 'error'=> $m + ]; + + return $res; + } +}