PluginProbe
ActivityPub / 2.4.0
ActivityPub v2.4.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 2.4.0, at activitypub.php

237 lines 7.6 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: 2.4.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: 5.6
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', '2.4.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 ( \defined( 'JETPACK__VERSION' ) && ! \defined( 'IS_WPCOM' ) ) {
105 require_once __DIR__ . '/integration/class-jetpack.php';
106 Integration\Jetpack::init();
107 }
108 }
109 \add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' );
110
111
112 /**
113 * Class Autoloader
114 */
115 \spl_autoload_register(
116 function ( $full_class ) {
117 $base_dir = __DIR__ . '/includes/';
118 $base = 'Activitypub\\';
119
120 if ( strncmp( $full_class, $base, strlen( $base ) ) === 0 ) {
121 $maybe_uppercase = str_replace( $base, '', $full_class );
122 $class = strtolower( $maybe_uppercase );
123 // All classes should be capitalized. If this is instead looking for a lowercase method, we ignore that.
124 if ( $maybe_uppercase === $class ) {
125 return;
126 }
127
128 if ( false !== strpos( $class, '\\' ) ) {
129 $parts = explode( '\\', $class );
130 $class = array_pop( $parts );
131 $sub_dir = strtr( implode( '/', $parts ), '_', '-' );
132 $base_dir = $base_dir . $sub_dir . '/';
133 }
134
135 $filename = 'class-' . strtr( $class, '_', '-' );
136 $file = $base_dir . $filename . '.php';
137
138 if ( file_exists( $file ) && is_readable( $file ) ) {
139 require_once $file;
140 } else {
141 // translators: %s is the class name
142 \wp_die( sprintf( esc_html__( 'Required class not found or not readable: %s', 'activitypub' ), esc_html( $full_class ) ) );
143 }
144 }
145 }
146 );
147
148 /**
149 * Add plugin settings link
150 */
151 function plugin_settings_link( $actions ) {
152 $settings_link = array();
153 $settings_link[] = \sprintf(
154 '<a href="%1s">%2s</a>',
155 \menu_page_url( 'activitypub', false ),
156 \__( 'Settings', 'activitypub' )
157 );
158
159 return \array_merge( $settings_link, $actions );
160 }
161 \add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), __NAMESPACE__ . '\plugin_settings_link' );
162
163 \register_activation_hook(
164 __FILE__,
165 array(
166 __NAMESPACE__ . '\Activitypub',
167 'activate',
168 )
169 );
170
171 \register_deactivation_hook(
172 __FILE__,
173 array(
174 __NAMESPACE__ . '\Activitypub',
175 'deactivate',
176 )
177 );
178
179 \register_uninstall_hook(
180 __FILE__,
181 array(
182 __NAMESPACE__ . '\Activitypub',
183 'uninstall',
184 )
185 );
186
187 /**
188 * Only load code that needs BuddyPress to run once BP is loaded and initialized.
189 */
190 add_action(
191 'bp_include',
192 function () {
193 require_once __DIR__ . '/integration/class-buddypress.php';
194 Integration\Buddypress::init();
195 },
196 0
197 );
198
199 /**
200 * `get_plugin_data` wrapper
201 *
202 * @return array The plugin metadata array
203 */
204 function get_plugin_meta( $default_headers = array() ) {
205 if ( ! $default_headers ) {
206 $default_headers = array(
207 'Name' => 'Plugin Name',
208 'PluginURI' => 'Plugin URI',
209 'Version' => 'Version',
210 'Description' => 'Description',
211 'Author' => 'Author',
212 'AuthorURI' => 'Author URI',
213 'TextDomain' => 'Text Domain',
214 'DomainPath' => 'Domain Path',
215 'Network' => 'Network',
216 'RequiresWP' => 'Requires at least',
217 'RequiresPHP' => 'Requires PHP',
218 'UpdateURI' => 'Update URI',
219 );
220 }
221
222 return \get_file_data( __FILE__, $default_headers, 'plugin' );
223 }
224
225 /**
226 * Plugin Version Number used for caching.
227 */
228 function get_plugin_version() {
229 if ( \defined( 'ACTIVITYPUB_PLUGIN_VERSION' ) ) {
230 return ACTIVITYPUB_PLUGIN_VERSION;
231 }
232
233 $meta = get_plugin_meta( array( 'Version' => 'Version' ) );
234
235 return $meta['Version'];
236 }
237