| @@ -2,14 +2,14 @@ | ||
| 2 | 2 | /** |
| 3 | 3 | * Plugin Name: ActivityPub |
| 4 | 4 | * Plugin URI: https://github.com/pfefferle/wordpress-activitypub/ |
| 5 | 5 | * Description: The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format. |
| 6 | - * Version: 2.1.1 | |
| 6 | + * Version: 3.2.2 | |
| 7 | 7 | * Author: Matthias Pfefferle & Automattic |
| 8 | 8 | * Author URI: https://automattic.com/ |
| 9 | 9 | * License: MIT |
| 10 | 10 | * License URI: http://opensource.org/licenses/MIT |
| 11 | - * Requires PHP: 5.6 | |
| 11 | + * Requires PHP: 7.0 | |
| 12 | 12 | * Text Domain: activitypub |
| 13 | 13 | * Domain Path: /languages |
| 14 | 14 | */ |
| 15 | 15 | |
| @@ -20,8 +20,10 @@ | ||
| 20 | 20 | |
| 21 | 21 | require_once __DIR__ . '/includes/compat.php'; |
| 22 | 22 | require_once __DIR__ . '/includes/functions.php'; |
| 23 | 23 | |
| 24 | +\define( 'ACTIVITYPUB_PLUGIN_VERSION', '3.2.2' ); | |
| 25 | + | |
| 24 | 26 | /** |
| 25 | 27 | * Initialize the plugin constants. |
| 26 | 28 | */ |
| 27 | 29 | \defined( 'ACTIVITYPUB_REST_NAMESPACE' ) || \define( 'ACTIVITYPUB_REST_NAMESPACE', 'activitypub/1.0' ); |
| @@ -29,15 +31,19 @@ | ||
| 29 | 31 | \defined( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS' ) || \define( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS', true ); |
| 30 | 32 | \defined( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS' ) || \define( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS', 3 ); |
| 31 | 33 | \defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' ); |
| 32 | 34 | \defined( 'ACTIVITYPUB_USERNAME_REGEXP' ) || \define( 'ACTIVITYPUB_USERNAME_REGEXP', '(?:([A-Za-z0-9\._-]+)@((?:[A-Za-z0-9_-]+\.)+[A-Za-z]+))' ); |
| 33 | -\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]" ); | |
| 35 | +\defined( 'ACTIVITYPUB_URL_REGEXP' ) || \define( 'ACTIVITYPUB_URL_REGEXP', '(www.|http:|https:)+[^\s]+[\w\/]' ); | |
| 36 | +\defined( 'ACTIVITYPUB_CUSTOM_POST_CONTENT' ) || \define( 'ACTIVITYPUB_CUSTOM_POST_CONTENT', "<h2>[ap_title]</h2>\n\n[ap_content]\n\n[ap_hashtags]\n\n[ap_shortlink]" ); | |
| 34 | 37 | \defined( 'ACTIVITYPUB_AUTHORIZED_FETCH' ) || \define( 'ACTIVITYPUB_AUTHORIZED_FETCH', false ); |
| 35 | 38 | \defined( 'ACTIVITYPUB_DISABLE_REWRITES' ) || \define( 'ACTIVITYPUB_DISABLE_REWRITES', false ); |
| 36 | 39 | \defined( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS', false ); |
| 40 | +// Disable reactions like `Like` and `Accounce` by default | |
| 41 | +\defined( 'ACTIVITYPUB_DISABLE_REACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_REACTIONS', true ); | |
| 37 | 42 | \defined( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS', false ); |
| 38 | 43 | \defined( 'ACTIVITYPUB_SHARED_INBOX_FEATURE' ) || \define( 'ACTIVITYPUB_SHARED_INBOX_FEATURE', false ); |
| 39 | 44 | \defined( 'ACTIVITYPUB_SEND_VARY_HEADER' ) || \define( 'ACTIVITYPUB_SEND_VARY_HEADER', false ); |
| 45 | +\defined( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE' ) || \define( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE', 'note' ); | |
| 40 | 46 | |
| 41 | 47 | \define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); |
| 42 | 48 | \define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ); |
| 43 | 49 | \define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) ); |
| @@ -46,16 +52,18 @@ | ||
| 46 | 52 | /** |
| 47 | 53 | * Initialize REST routes. |
| 48 | 54 | */ |
| 49 | 55 | function rest_init() { |
| 50 | - Rest\Users::init(); | |
| 56 | + Rest\Actors::init(); | |
| 51 | 57 | Rest\Outbox::init(); |
| 52 | 58 | Rest\Inbox::init(); |
| 53 | 59 | Rest\Followers::init(); |
| 54 | 60 | Rest\Following::init(); |
| 55 | 61 | Rest\Webfinger::init(); |
| 62 | + Rest\Comment::init(); | |
| 56 | 63 | Rest\Server::init(); |
| 57 | 64 | Rest\Collection::init(); |
| 65 | + Rest\Interaction::init(); | |
| 58 | 66 | |
| 59 | 67 | // load NodeInfo endpoints only if blog is public |
| 60 | 68 | if ( is_blog_public() ) { |
| 61 | 69 | Rest\NodeInfo::init(); |
| @@ -76,8 +84,9 @@ | ||
| 76 | 84 | \add_action( 'init', array( __NAMESPACE__ . '\Mention', 'init' ) ); |
| 77 | 85 | \add_action( 'init', array( __NAMESPACE__ . '\Health_Check', 'init' ) ); |
| 78 | 86 | \add_action( 'init', array( __NAMESPACE__ . '\Scheduler', 'init' ) ); |
| 79 | 87 | \add_action( 'init', array( __NAMESPACE__ . '\Comment', 'init' ) ); |
| 88 | + \add_action( 'init', array( __NAMESPACE__ . '\Link', 'init' ) ); | |
| 80 | 89 | |
| 81 | 90 | if ( site_supports_blocks() ) { |
| 82 | 91 | \add_action( 'init', array( __NAMESPACE__ . '\Blocks', 'init' ) ); |
| 83 | 92 | } |
| @@ -86,20 +95,12 @@ | ||
| 86 | 95 | if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) { |
| 87 | 96 | require_once $debug_file; |
| 88 | 97 | Debug::init(); |
| 89 | 98 | } |
| 90 | - | |
| 91 | - require_once __DIR__ . '/integration/class-webfinger.php'; | |
| 92 | - Integration\Webfinger::init(); | |
| 93 | - | |
| 94 | - require_once __DIR__ . '/integration/class-nodeinfo.php'; | |
| 95 | - Integration\Nodeinfo::init(); | |
| 96 | - | |
| 97 | - require_once __DIR__ . '/integration/class-enable-mastodon-apps.php'; | |
| 98 | - Integration\Enable_Mastodon_Apps::init(); | |
| 99 | 99 | } |
| 100 | 100 | \add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' ); |
| 101 | 101 | |
| 102 | + | |
| 102 | 103 | /** |
| 103 | 104 | * Class Autoloader |
| 104 | 105 | */ |
| 105 | 106 | \spl_autoload_register( |
| @@ -128,9 +129,11 @@ | ||
| 128 | 129 | if ( file_exists( $file ) && is_readable( $file ) ) { |
| 129 | 130 | require_once $file; |
| 130 | 131 | } else { |
| 131 | 132 | // translators: %s is the class name |
| 132 | - \wp_die( sprintf( esc_html__( 'Required class not found or not readable: %s', 'activitypub' ), esc_html( $full_class ) ) ); | |
| 133 | + $message = sprintf( esc_html__( 'Required class not found or not readable: %s', 'activitypub' ), esc_html( $full_class ) ); | |
| 134 | + Debug::write_log( $message ); | |
| 135 | + \wp_die( $message ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped | |
| 133 | 136 | } |
| 134 | 137 | } |
| 135 | 138 | } |
| 136 | 139 | ); |
| @@ -173,19 +176,10 @@ | ||
| 173 | 176 | 'uninstall', |
| 174 | 177 | ) |
| 175 | 178 | ); |
| 176 | 179 | |
| 177 | -/** | |
| 178 | - * Only load code that needs BuddyPress to run once BP is loaded and initialized. | |
| 179 | - */ | |
| 180 | -add_action( | |
| 181 | - 'bp_include', | |
| 182 | - function () { | |
| 183 | - require_once __DIR__ . '/integration/class-buddypress.php'; | |
| 184 | - Integration\Buddypress::init(); | |
| 185 | - }, | |
| 186 | - 0 | |
| 187 | -); | |
| 180 | +// Load integrations | |
| 181 | +require_once __DIR__ . '/integration/load.php'; | |
| 188 | 182 | |
| 189 | 183 | /** |
| 190 | 184 | * `get_plugin_data` wrapper |
| 191 | 185 | * |
| @@ -215,8 +209,12 @@ | ||
| 215 | 209 | /** |
| 216 | 210 | * Plugin Version Number used for caching. |
| 217 | 211 | */ |
| 218 | 212 | function get_plugin_version() { |
| 213 | + if ( \defined( 'ACTIVITYPUB_PLUGIN_VERSION' ) ) { | |
| 214 | + return ACTIVITYPUB_PLUGIN_VERSION; | |
| 215 | + } | |
| 216 | + | |
| 219 | 217 | $meta = get_plugin_meta( array( 'Version' => 'Version' ) ); |
| 220 | 218 | |
| 221 | 219 | return $meta['Version']; |
| 222 | 220 | } |