PluginProbe
ActivityPub / 2.5.0
ActivityPub v2.5.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.5.0, at activitypub.php

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