Merge pull request #329 from Automattic/add/rest-namespace-constant

Allow setting the REST namespace with `ACTIVITYPUB_REST_NAMESPACE`
This commit is contained in:
Matthias Pfefferle 2023-05-17 09:05:20 +02:00 committed by GitHub
commit 313a4da607
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 63 additions and 32 deletions

View file

@ -25,14 +25,15 @@ function init() {
\defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' ); \defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' );
\defined( 'ACTIVITYPUB_USERNAME_REGEXP' ) || \define( 'ACTIVITYPUB_USERNAME_REGEXP', '(?:([A-Za-z0-9_-]+)@((?:[A-Za-z0-9_-]+\.)+[A-Za-z]+))' ); \defined( 'ACTIVITYPUB_USERNAME_REGEXP' ) || \define( 'ACTIVITYPUB_USERNAME_REGEXP', '(?:([A-Za-z0-9_-]+)@((?:[A-Za-z0-9_-]+\.)+[A-Za-z]+))' );
\defined( 'ACTIVITYPUB_CUSTOM_POST_CONTENT' ) || \define( 'ACTIVITYPUB_CUSTOM_POST_CONTENT', "<strong>[ap_title]</strong>\n\n[ap_content]\n\n[ap_hashtags]\n\n[ap_shortlink]" ); \defined( 'ACTIVITYPUB_CUSTOM_POST_CONTENT' ) || \define( 'ACTIVITYPUB_CUSTOM_POST_CONTENT', "<strong>[ap_title]</strong>\n\n[ap_content]\n\n[ap_hashtags]\n\n[ap_shortlink]" );
\defined( 'ACTIVITYPUB_REST_NAMESPACE' ) || \define( 'ACTIVITYPUB_REST_NAMESPACE', 'activitypub/1.0' );
\define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); \define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
\define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); \define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
\define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) ); \define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) );
Migration::init(); Migration::init();
Activity_Dispatcher::init();
Activitypub::init(); Activitypub::init();
Activity_Dispatcher::init();
Collection\Followers::init(); Collection\Followers::init();
// Configure the REST API route // Configure the REST API route
@ -40,13 +41,13 @@ function init() {
Rest\Inbox::init(); Rest\Inbox::init();
Rest\Followers::init(); Rest\Followers::init();
Rest\Following::init(); Rest\Following::init();
Rest\Nodeinfo::init();
Rest\Webfinger::init(); Rest\Webfinger::init();
Admin::init(); Admin::init();
Hashtag::init(); Hashtag::init();
Shortcodes::init(); Shortcodes::init();
Mention::init(); Mention::init();
Debug::init();
Health_Check::init(); Health_Check::init();
Scheduler::init(); Scheduler::init();
} }
@ -95,6 +96,7 @@ if ( \get_option( 'blog_public', 1 ) ) {
$debug_file = \dirname( __FILE__ ) . '/includes/debug.php'; $debug_file = \dirname( __FILE__ ) . '/includes/debug.php';
if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) { if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) {
require_once $debug_file; require_once $debug_file;
Debug::init();
} }
/** /**
@ -135,7 +137,6 @@ register_uninstall_hook(
) )
); );
/** /**
* Only load code that needs BuddyPress to run once BP is loaded and initialized. * Only load code that needs BuddyPress to run once BP is loaded and initialized.
*/ */

View file

@ -225,7 +225,7 @@ class Activitypub {
if ( ! \class_exists( 'Webfinger' ) ) { if ( ! \class_exists( 'Webfinger' ) ) {
\add_rewrite_rule( \add_rewrite_rule(
'^.well-known/webfinger', '^.well-known/webfinger',
'index.php?rest_route=/activitypub/1.0/webfinger', 'index.php?rest_route=/' . ACTIVITYPUB_REST_NAMESPACE . '/webfinger',
'top' 'top'
); );
} }
@ -233,12 +233,12 @@ class Activitypub {
if ( ! \class_exists( 'Nodeinfo' ) && true === (bool) \get_option( 'blog_public', 1 ) ) { if ( ! \class_exists( 'Nodeinfo' ) && true === (bool) \get_option( 'blog_public', 1 ) ) {
\add_rewrite_rule( \add_rewrite_rule(
'^.well-known/nodeinfo', '^.well-known/nodeinfo',
'index.php?rest_route=/activitypub/1.0/nodeinfo/discovery', 'index.php?rest_route=/' . ACTIVITYPUB_REST_NAMESPACE . '/nodeinfo/discovery',
'top' 'top'
); );
\add_rewrite_rule( \add_rewrite_rule(
'^.well-known/x-nodeinfo2', '^.well-known/x-nodeinfo2',
'index.php?rest_route=/activitypub/1.0/nodeinfo2', 'index.php?rest_route=/' . ACTIVITYPUB_REST_NAMESPACE . '/nodeinfo2',
'top' 'top'
); );
} }

View file

@ -229,6 +229,20 @@ function is_tombstone( $wp_error ) {
return false; return false;
} }
/**
* Get the REST URL relative to this plugin's namespace.
*
* @param string $path Optional. REST route path. Otherwise this plugin's namespaced root.
*
* @return string REST URL relative to this plugin's namespace.
*/
function get_rest_url_by_path( $path = '' ) {
// we'll handle the leading slash.
$path = ltrim( $path, '/' );
$namespaced_path = sprintf( '/%s/%s', ACTIVITYPUB_REST_NAMESPACE, $path );
return \get_rest_url( null, $namespaced_path );
}
/** /**
* Check if a request is for an ActivityPub request. * Check if a request is for an ActivityPub request.
* *

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Activitypub\Model; namespace Activitypub\Model;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Post Class * ActivityPub Post Class
* *
@ -148,7 +150,8 @@ class Activity {
$this->published = $object['published']; $this->published = $object['published'];
} }
$this->add_to( \get_rest_url( null, '/activitypub/1.0/users/' . intval( $post->get_post_author() ) . '/followers' ) ); $path = sprintf( 'users/%d/followers', intval( $post->get_post_author() ) );
$this->add_to( get_rest_url_by_path( $path ) );
if ( isset( $this->object['attributedTo'] ) ) { if ( isset( $this->object['attributedTo'] ) ) {
$this->actor = $this->object['attributedTo']; $this->actor = $this->object['attributedTo'];

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Activitypub\Model; namespace Activitypub\Model;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Post Class * ActivityPub Post Class
* *
@ -142,7 +144,8 @@ class Post {
*/ */
public function __construct( $post ) { public function __construct( $post ) {
$this->post = \get_post( $post ); $this->post = \get_post( $post );
$this->add_to( \get_rest_url( null, '/activitypub/1.0/users/' . intval( $this->get_post_author() ) . '/followers' ) ); $path = sprintf( 'users/%d/followers', intval( $this->get_post_author() ) );
$this->add_to( get_rest_url_by_path( $path ) );
} }
/** /**

View file

@ -7,6 +7,8 @@ use WP_REST_Server;
use WP_REST_Response; use WP_REST_Response;
use Activitypub\Collection\Followers as FollowerCollection; use Activitypub\Collection\Followers as FollowerCollection;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Followers REST-Class * ActivityPub Followers REST-Class
* *
@ -27,7 +29,7 @@ class Followers {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/users/(?P<user_id>\d+)/followers', '/users/(?P<user_id>\d+)/followers',
array( array(
array( array(
@ -78,7 +80,7 @@ class Followers {
$json->actor = \get_author_posts_url( $user_id ); $json->actor = \get_author_posts_url( $user_id );
$json->type = 'OrderedCollectionPage'; $json->type = 'OrderedCollectionPage';
$json->partOf = \get_rest_url( null, "/activitypub/1.0/users/$user_id/followers" ); // phpcs:ignore $json->partOf = get_rest_url_by_path( sprintf( 'users/%d/followers', $user_id ) ); // phpcs:ignore
$json->first = $json->partOf; // phpcs:ignore $json->first = $json->partOf; // phpcs:ignore
$json->totalItems = FollowerCollection::count_followers( $user_id ); // phpcs:ignore $json->totalItems = FollowerCollection::count_followers( $user_id ); // phpcs:ignore
// phpcs:ignore // phpcs:ignore

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Activitypub\Rest; namespace Activitypub\Rest;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Following REST-Class * ActivityPub Following REST-Class
* *
@ -21,7 +23,7 @@ class Following {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/users/(?P<user_id>\d+)/following', '/users/(?P<user_id>\d+)/following',
array( array(
array( array(
@ -72,7 +74,7 @@ class Following {
$json->actor = \get_author_posts_url( $user_id ); $json->actor = \get_author_posts_url( $user_id );
$json->type = 'OrderedCollectionPage'; $json->type = 'OrderedCollectionPage';
$json->partOf = \get_rest_url( null, "/activitypub/1.0/users/$user_id/following" ); // phpcs:ignore $json->partOf = get_rest_url_by_path( sprintf( 'users/%d/following', $user_id ) ); // phpcs:ignore
$json->totalItems = 0; // phpcs:ignore $json->totalItems = 0; // phpcs:ignore
$json->orderedItems = apply_filters( 'activitypub_following', array(), $user ); // phpcs:ignore $json->orderedItems = apply_filters( 'activitypub_following', array(), $user ); // phpcs:ignore

View file

@ -3,6 +3,8 @@ namespace Activitypub\Rest;
use Activitypub\Model\Activity; use Activitypub\Model\Activity;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Inbox REST-Class * ActivityPub Inbox REST-Class
* *
@ -26,7 +28,7 @@ class Inbox {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/inbox', '/inbox',
array( array(
array( array(
@ -39,7 +41,7 @@ class Inbox {
); );
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/users/(?P<user_id>\d+)/inbox', '/users/(?P<user_id>\d+)/inbox',
array( array(
array( array(
@ -108,7 +110,7 @@ class Inbox {
$json->id = \home_url( \add_query_arg( null, null ) ); $json->id = \home_url( \add_query_arg( null, null ) );
$json->generator = 'http://wordpress.org/?v=' . \get_bloginfo_rss( 'version' ); $json->generator = 'http://wordpress.org/?v=' . \get_bloginfo_rss( 'version' );
$json->type = 'OrderedCollectionPage'; $json->type = 'OrderedCollectionPage';
$json->partOf = \get_rest_url( null, "/activitypub/1.0/users/$user_id/inbox" ); // phpcs:ignore $json->partOf = get_rest_url_by_path( sprintf( 'users/%d/inbox', $user_id ) ); // phpcs:ignore
$json->totalItems = 0; // phpcs:ignore $json->totalItems = 0; // phpcs:ignore

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Activitypub\Rest; namespace Activitypub\Rest;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub NodeInfo REST-Class * ActivityPub NodeInfo REST-Class
* *
@ -23,7 +25,7 @@ class Nodeinfo {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/nodeinfo/discovery', '/nodeinfo/discovery',
array( array(
array( array(
@ -35,7 +37,7 @@ class Nodeinfo {
); );
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/nodeinfo', '/nodeinfo',
array( array(
array( array(
@ -47,7 +49,7 @@ class Nodeinfo {
); );
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/nodeinfo2', '/nodeinfo2',
array( array(
array( array(
@ -173,7 +175,7 @@ class Nodeinfo {
$discovery['links'] = array( $discovery['links'] = array(
array( array(
'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0', 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0',
'href' => \get_rest_url( null, 'activitypub/1.0/nodeinfo' ), 'href' => get_rest_url_by_path( 'nodeinfo' ),
), ),
); );

View file

@ -14,7 +14,7 @@ class Ostatus {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/ostatus/remote-follow', '/ostatus/remote-follow',
array( array(
array( array(

View file

@ -1,6 +1,8 @@
<?php <?php
namespace Activitypub\Rest; namespace Activitypub\Rest;
use function Activitypub\get_rest_url_by_path;
/** /**
* ActivityPub Outbox REST-Class * ActivityPub Outbox REST-Class
* *
@ -21,7 +23,7 @@ class Outbox {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/users/(?P<user_id>\d+)/outbox', '/users/(?P<user_id>\d+)/outbox',
array( array(
array( array(
@ -72,7 +74,7 @@ class Outbox {
$json->generator = 'http://wordpress.org/?v=' . \get_bloginfo_rss( 'version' ); $json->generator = 'http://wordpress.org/?v=' . \get_bloginfo_rss( 'version' );
$json->actor = \get_author_posts_url( $user_id ); $json->actor = \get_author_posts_url( $user_id );
$json->type = 'OrderedCollectionPage'; $json->type = 'OrderedCollectionPage';
$json->partOf = \get_rest_url( null, "/activitypub/1.0/users/$user_id/outbox" ); // phpcs:ignore $json->partOf = get_rest_url_by_path( sprintf( 'users/%d/outbox', $user_id ) ); // phpcs:ignore
$json->totalItems = 0; // phpcs:ignore $json->totalItems = 0; // phpcs:ignore
// phpcs:ignore // phpcs:ignore

View file

@ -25,7 +25,7 @@ class Webfinger {
*/ */
public static function register_routes() { public static function register_routes() {
\register_rest_route( \register_rest_route(
'activitypub/1.0', ACTIVITYPUB_REST_NAMESPACE,
'/webfinger', '/webfinger',
array( array(
array( array(

View file

@ -28,10 +28,10 @@ if ( \has_header_image() ) {
); );
} }
$json->inbox = \get_rest_url( null, "/activitypub/1.0/users/$author_id/inbox" ); $json->inbox = \Activitypub\get_rest_url_by_path( sprintf( 'users/%d/inbox', $author_id ) );
$json->outbox = \get_rest_url( null, "/activitypub/1.0/users/$author_id/outbox" ); $json->outbox = \Activitypub\get_rest_url_by_path( sprintf( 'users/%d/outbox', $author_id ) );
$json->followers = \get_rest_url( null, "/activitypub/1.0/users/$author_id/followers" ); $json->followers = \Activitypub\get_rest_url_by_path( sprintf( 'users/%d/followers', $author_id ) );
$json->following = \get_rest_url( null, "/activitypub/1.0/users/$author_id/following" ); $json->following = \Activitypub\get_rest_url_by_path( sprintf( 'users/%d/following', $author_id ) );
$json->manuallyApprovesFollowers = \apply_filters( 'activitypub_json_manually_approves_followers', \__return_false() ); // phpcs:ignore $json->manuallyApprovesFollowers = \apply_filters( 'activitypub_json_manually_approves_followers', \__return_false() ); // phpcs:ignore

View file

@ -27,10 +27,10 @@ if ( \has_header_image() ) {
); );
} }
$json->inbox = \get_rest_url( null, '/activitypub/1.0/blog/inbox' ); $json->inbox = \Activitypub\get_rest_url_by_path( 'blog/inbox' );
$json->outbox = \get_rest_url( null, '/activitypub/1.0/blog/outbox' ); $json->outbox = \Activitypub\get_rest_url_by_path( 'blog/outbox' );
$json->followers = \get_rest_url( null, '/activitypub/1.0/blog/followers' ); $json->followers = \Activitypub\get_rest_url_by_path( 'blog/followers' );
$json->following = \get_rest_url( null, '/activitypub/1.0/blog/following' ); $json->following = \Activitypub\get_rest_url_by_path( 'blog/following' );
$json->manuallyApprovesFollowers = \apply_filters( 'activitypub_json_manually_approves_followers', \__return_false() ); // phpcs:ignore $json->manuallyApprovesFollowers = \apply_filters( 'activitypub_json_manually_approves_followers', \__return_false() ); // phpcs:ignore

View file

@ -22,7 +22,7 @@ class Test_Activitypub_Activity extends WP_UnitTestCase {
$activitypub_activity = new \Activitypub\Model\Activity( 'Create' ); $activitypub_activity = new \Activitypub\Model\Activity( 'Create' );
$activitypub_activity->from_post( $activitypub_post ); $activitypub_activity->from_post( $activitypub_post );
$this->assertContains( \get_rest_url( null, '/activitypub/1.0/users/1/followers' ), $activitypub_activity->get_to() ); $this->assertContains( \Activitypub\get_rest_url_by_path( 'users/1/followers' ), $activitypub_activity->get_to() );
$this->assertContains( 'https://example.com/alex', $activitypub_activity->get_cc() ); $this->assertContains( 'https://example.com/alex', $activitypub_activity->get_cc() );
remove_all_filters( 'activitypub_extract_mentions' ); remove_all_filters( 'activitypub_extract_mentions' );