PluginProbe
ActivityPub / 3.0.0
ActivityPub v3.0.0
9.3.1 9.3.0 9.2.2 9.2.1 9.2.0 9.1.0 9.0.2 9.0.1 9.0.0 8.3.0 8.2.1 8.2.0 8.1.1 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.2.0 1.3.0 2.0.0 2.0.1 2.1.0 2.1.1 All 160 releases
activitypub / activitypub.php

activitypub.php in ActivityPub 3.0.0, at activitypub.php

242 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: ActivityPub
4 * Plugin URI: https://github.com/pfefferle/wordpress-activitypub/
5 * Description: The ActivityPub protocol is a decentralized social networking protocol based upon the ActivityStreams 2.0 data format.
6 * Version: 3.0.0
7 * Author: Matthias Pfefferle & Automattic
8 * Author URI: https://automattic.com/
9 * License: MIT
10 * License URI: http://opensource.org/licenses/MIT
11 * Requires PHP: 7.0
12 * Text Domain: activitypub
13 * Domain Path: /languages
14 */
15
16 namespace Activitypub;
17
18 use function Activitypub\is_blog_public;
19 use function Activitypub\site_supports_blocks;
20
21 require_once __DIR__ . '/includes/compat.php';
22 require_once __DIR__ . '/includes/functions.php';
23
24 \define( 'ACTIVITYPUB_PLUGIN_VERSION', '3.0.0' );
25
26 /**
27 * Initialize the plugin constants.
28 */
29 \defined( 'ACTIVITYPUB_REST_NAMESPACE' ) || \define( 'ACTIVITYPUB_REST_NAMESPACE', 'activitypub/1.0' );
30 \defined( 'ACTIVITYPUB_EXCERPT_LENGTH' ) || \define( 'ACTIVITYPUB_EXCERPT_LENGTH', 400 );
31 \defined( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS' ) || \define( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS', true );
32 \defined( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS' ) || \define( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS', 3 );
33 \defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' );
34 \defined( 'ACTIVITYPUB_USERNAME_REGEXP' ) || \define( 'ACTIVITYPUB_USERNAME_REGEXP', '(?:([A-Za-z0-9\._-]+)@((?:[A-Za-z0-9_-]+\.)+[A-Za-z]+))' );
35 \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]" );
36 \defined( 'ACTIVITYPUB_AUTHORIZED_FETCH' ) || \define( 'ACTIVITYPUB_AUTHORIZED_FETCH', false );
37 \defined( 'ACTIVITYPUB_DISABLE_REWRITES' ) || \define( 'ACTIVITYPUB_DISABLE_REWRITES', false );
38 \defined( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS', false );
39 \defined( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS', false );
40 \defined( 'ACTIVITYPUB_SHARED_INBOX_FEATURE' ) || \define( 'ACTIVITYPUB_SHARED_INBOX_FEATURE', false );
41 \defined( 'ACTIVITYPUB_SEND_VARY_HEADER' ) || \define( 'ACTIVITYPUB_SEND_VARY_HEADER', false );
42 \defined( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE' ) || \define( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE', 'note' );
43
44 \define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
45 \define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
46 \define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) );
47 \define( 'ACTIVITYPUB_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
48
49 /**
50 * Initialize REST routes.
51 */
52 function rest_init() {
53 Rest\Actors::init();
54 Rest\Outbox::init();
55 Rest\Inbox::init();
56 Rest\Followers::init();
57 Rest\Following::init();
58 Rest\Webfinger::init();
59 Rest\Comment::init();
60 Rest\Server::init();
61 Rest\Collection::init();
62
63 // load NodeInfo endpoints only if blog is public
64 if ( is_blog_public() ) {
65 Rest\NodeInfo::init();
66 }
67 }
68 \add_action( 'rest_api_init', __NAMESPACE__ . '\rest_init' );
69
70 /**
71 * Initialize plugin.
72 */
73 function plugin_init() {
74 \add_action( 'init', array( __NAMESPACE__ . '\Migration', 'init' ) );
75 \add_action( 'init', array( __NAMESPACE__ . '\Activitypub', 'init' ) );
76 \add_action( 'init', array( __NAMESPACE__ . '\Activity_Dispatcher', 'init' ) );
77 \add_action( 'init', array( __NAMESPACE__ . '\Handler', 'init' ) );
78 \add_action( 'init', array( __NAMESPACE__ . '\Admin', 'init' ) );
79 \add_action( 'init', array( __NAMESPACE__ . '\Hashtag', 'init' ) );
80 \add_action( 'init', array( __NAMESPACE__ . '\Mention', 'init' ) );
81 \add_action( 'init', array( __NAMESPACE__ . '\Health_Check', 'init' ) );
82 \add_action( 'init', array( __NAMESPACE__ . '\Scheduler', 'init' ) );
83 \add_action( 'init', array( __NAMESPACE__ . '\Comment', 'init' ) );
84
85 if ( site_supports_blocks() ) {
86 \add_action( 'init', array( __NAMESPACE__ . '\Blocks', 'init' ) );
87 }
88
89 $debug_file = __DIR__ . '/includes/debug.php';
90 if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) {
91 require_once $debug_file;
92 Debug::init();
93 }
94
95 require_once __DIR__ . '/integration/class-webfinger.php';
96 Integration\Webfinger::init();
97
98 require_once __DIR__ . '/integration/class-nodeinfo.php';
99 Integration\Nodeinfo::init();
100
101 require_once __DIR__ . '/integration/class-enable-mastodon-apps.php';
102 Integration\Enable_Mastodon_Apps::init();
103
104 if ( '1' === \get_option( 'activitypub_use_opengraph', '1' ) ) {
105 require_once __DIR__ . '/integration/class-opengraph.php';
106 Integration\Opengraph::init();
107 }
108
109 if ( \defined( 'JETPACK__VERSION' ) && ! \defined( 'IS_WPCOM' ) ) {
110 require_once __DIR__ . '/integration/class-jetpack.php';
111 Integration\Jetpack::init();
112 }
113 }
114 \add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' );
115
116
117 /**
118 * Class Autoloader
119 */
120 \spl_autoload_register(
121 function ( $full_class ) {
122 $base_dir = __DIR__ . '/includes/';
123 $base = 'Activitypub\\';
124
125 if ( strncmp( $full_class, $base, strlen( $base ) ) === 0 ) {
126 $maybe_uppercase = str_replace( $base, '', $full_class );
127 $class = strtolower( $maybe_uppercase );
128 // All classes should be capitalized. If this is instead looking for a lowercase method, we ignore that.
129 if ( $maybe_uppercase === $class ) {
130 return;
131 }
132
133 if ( false !== strpos( $class, '\\' ) ) {
134 $parts = explode( '\\', $class );
135 $class = array_pop( $parts );
136 $sub_dir = strtr( implode( '/', $parts ), '_', '-' );
137 $base_dir = $base_dir . $sub_dir . '/';
138 }
139
140 $filename = 'class-' . strtr( $class, '_', '-' );
141 $file = $base_dir . $filename . '.php';
142
143 if ( file_exists( $file ) && is_readable( $file ) ) {
144 require_once $file;
145 } else {
146 // translators: %s is the class name
147 \wp_die( sprintf( esc_html__( 'Required class not found or not readable: %s', 'activitypub' ), esc_html( $full_class ) ) );
148 }
149 }
150 }
151 );
152
153 /**
154 * Add plugin settings link
155 */
156 function plugin_settings_link( $actions ) {
157 $settings_link = array();
158 $settings_link[] = \sprintf(
159 '<a href="%1s">%2s</a>',
160 \menu_page_url( 'activitypub', false ),
161 \__( 'Settings', 'activitypub' )
162 );
163
164 return \array_merge( $settings_link, $actions );
165 }
166 \add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), __NAMESPACE__ . '\plugin_settings_link' );
167
168 \register_activation_hook(
169 __FILE__,
170 array(
171 __NAMESPACE__ . '\Activitypub',
172 'activate',
173 )
174 );
175
176 \register_deactivation_hook(
177 __FILE__,
178 array(
179 __NAMESPACE__ . '\Activitypub',
180 'deactivate',
181 )
182 );
183
184 \register_uninstall_hook(
185 __FILE__,
186 array(
187 __NAMESPACE__ . '\Activitypub',
188 'uninstall',
189 )
190 );
191
192 /**
193 * Only load code that needs BuddyPress to run once BP is loaded and initialized.
194 */
195 add_action(
196 'bp_include',
197 function () {
198 require_once __DIR__ . '/integration/class-buddypress.php';
199 Integration\Buddypress::init();
200 },
201 0
202 );
203
204 /**
205 * `get_plugin_data` wrapper
206 *
207 * @return array The plugin metadata array
208 */
209 function get_plugin_meta( $default_headers = array() ) {
210 if ( ! $default_headers ) {
211 $default_headers = array(
212 'Name' => 'Plugin Name',
213 'PluginURI' => 'Plugin URI',
214 'Version' => 'Version',
215 'Description' => 'Description',
216 'Author' => 'Author',
217 'AuthorURI' => 'Author URI',
218 'TextDomain' => 'Text Domain',
219 'DomainPath' => 'Domain Path',
220 'Network' => 'Network',
221 'RequiresWP' => 'Requires at least',
222 'RequiresPHP' => 'Requires PHP',
223 'UpdateURI' => 'Update URI',
224 );
225 }
226
227 return \get_file_data( __FILE__, $default_headers, 'plugin' );
228 }
229
230 /**
231 * Plugin Version Number used for caching.
232 */
233 function get_plugin_version() {
234 if ( \defined( 'ACTIVITYPUB_PLUGIN_VERSION' ) ) {
235 return ACTIVITYPUB_PLUGIN_VERSION;
236 }
237
238 $meta = get_plugin_meta( array( 'Version' => 'Version' ) );
239
240 return $meta['Version'];
241 }
242