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

223 lines 7.1 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.1.1
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 /**
25 * Initialize the plugin constants.
26 */
27 \defined( 'ACTIVITYPUB_REST_NAMESPACE' ) || \define( 'ACTIVITYPUB_REST_NAMESPACE', 'activitypub/1.0' );
28 \defined( 'ACTIVITYPUB_EXCERPT_LENGTH' ) || \define( 'ACTIVITYPUB_EXCERPT_LENGTH', 400 );
29 \defined( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS' ) || \define( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS', true );
30 \defined( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS' ) || \define( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS', 3 );
31 \defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' );
32 \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]" );
34 \defined( 'ACTIVITYPUB_AUTHORIZED_FETCH' ) || \define( 'ACTIVITYPUB_AUTHORIZED_FETCH', false );
35 \defined( 'ACTIVITYPUB_DISABLE_REWRITES' ) || \define( 'ACTIVITYPUB_DISABLE_REWRITES', false );
36 \defined( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS', false );
37 \defined( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS', false );
38 \defined( 'ACTIVITYPUB_SHARED_INBOX_FEATURE' ) || \define( 'ACTIVITYPUB_SHARED_INBOX_FEATURE', false );
39 \defined( 'ACTIVITYPUB_SEND_VARY_HEADER' ) || \define( 'ACTIVITYPUB_SEND_VARY_HEADER', false );
40
41 \define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
42 \define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
43 \define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) );
44 \define( 'ACTIVITYPUB_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
45
46 /**
47 * Initialize REST routes.
48 */
49 function rest_init() {
50 Rest\Users::init();
51 Rest\Outbox::init();
52 Rest\Inbox::init();
53 Rest\Followers::init();
54 Rest\Following::init();
55 Rest\Webfinger::init();
56 Rest\Server::init();
57 Rest\Collection::init();
58
59 // load NodeInfo endpoints only if blog is public
60 if ( is_blog_public() ) {
61 Rest\NodeInfo::init();
62 }
63 }
64 \add_action( 'rest_api_init', __NAMESPACE__ . '\rest_init' );
65
66 /**
67 * Initialize plugin.
68 */
69 function plugin_init() {
70 \add_action( 'init', array( __NAMESPACE__ . '\Migration', 'init' ) );
71 \add_action( 'init', array( __NAMESPACE__ . '\Activitypub', 'init' ) );
72 \add_action( 'init', array( __NAMESPACE__ . '\Activity_Dispatcher', 'init' ) );
73 \add_action( 'init', array( __NAMESPACE__ . '\Handler', 'init' ) );
74 \add_action( 'init', array( __NAMESPACE__ . '\Admin', 'init' ) );
75 \add_action( 'init', array( __NAMESPACE__ . '\Hashtag', 'init' ) );
76 \add_action( 'init', array( __NAMESPACE__ . '\Mention', 'init' ) );
77 \add_action( 'init', array( __NAMESPACE__ . '\Health_Check', 'init' ) );
78 \add_action( 'init', array( __NAMESPACE__ . '\Scheduler', 'init' ) );
79 \add_action( 'init', array( __NAMESPACE__ . '\Comment', 'init' ) );
80
81 if ( site_supports_blocks() ) {
82 \add_action( 'init', array( __NAMESPACE__ . '\Blocks', 'init' ) );
83 }
84
85 $debug_file = __DIR__ . '/includes/debug.php';
86 if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) {
87 require_once $debug_file;
88 Debug::init();
89 }
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 }
100 \add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' );
101
102 /**
103 * Class Autoloader
104 */
105 \spl_autoload_register(
106 function ( $full_class ) {
107 $base_dir = __DIR__ . '/includes/';
108 $base = 'Activitypub\\';
109
110 if ( strncmp( $full_class, $base, strlen( $base ) ) === 0 ) {
111 $maybe_uppercase = str_replace( $base, '', $full_class );
112 $class = strtolower( $maybe_uppercase );
113 // All classes should be capitalized. If this is instead looking for a lowercase method, we ignore that.
114 if ( $maybe_uppercase === $class ) {
115 return;
116 }
117
118 if ( false !== strpos( $class, '\\' ) ) {
119 $parts = explode( '\\', $class );
120 $class = array_pop( $parts );
121 $sub_dir = strtr( implode( '/', $parts ), '_', '-' );
122 $base_dir = $base_dir . $sub_dir . '/';
123 }
124
125 $filename = 'class-' . strtr( $class, '_', '-' );
126 $file = $base_dir . $filename . '.php';
127
128 if ( file_exists( $file ) && is_readable( $file ) ) {
129 require_once $file;
130 } else {
131 // 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 }
134 }
135 }
136 );
137
138 /**
139 * Add plugin settings link
140 */
141 function plugin_settings_link( $actions ) {
142 $settings_link = array();
143 $settings_link[] = \sprintf(
144 '<a href="%1s">%2s</a>',
145 \menu_page_url( 'activitypub', false ),
146 \__( 'Settings', 'activitypub' )
147 );
148
149 return \array_merge( $settings_link, $actions );
150 }
151 \add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), __NAMESPACE__ . '\plugin_settings_link' );
152
153 \register_activation_hook(
154 __FILE__,
155 array(
156 __NAMESPACE__ . '\Activitypub',
157 'activate',
158 )
159 );
160
161 \register_deactivation_hook(
162 __FILE__,
163 array(
164 __NAMESPACE__ . '\Activitypub',
165 'deactivate',
166 )
167 );
168
169 \register_uninstall_hook(
170 __FILE__,
171 array(
172 __NAMESPACE__ . '\Activitypub',
173 'uninstall',
174 )
175 );
176
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 );
188
189 /**
190 * `get_plugin_data` wrapper
191 *
192 * @return array The plugin metadata array
193 */
194 function get_plugin_meta( $default_headers = array() ) {
195 if ( ! $default_headers ) {
196 $default_headers = array(
197 'Name' => 'Plugin Name',
198 'PluginURI' => 'Plugin URI',
199 'Version' => 'Version',
200 'Description' => 'Description',
201 'Author' => 'Author',
202 'AuthorURI' => 'Author URI',
203 'TextDomain' => 'Text Domain',
204 'DomainPath' => 'Domain Path',
205 'Network' => 'Network',
206 'RequiresWP' => 'Requires at least',
207 'RequiresPHP' => 'Requires PHP',
208 'UpdateURI' => 'Update URI',
209 );
210 }
211
212 return \get_file_data( __FILE__, $default_headers, 'plugin' );
213 }
214
215 /**
216 * Plugin Version Number used for caching.
217 */
218 function get_plugin_version() {
219 $meta = get_plugin_meta( array( 'Version' => 'Version' ) );
220
221 return $meta['Version'];
222 }
223