PluginProbe
ActivityPub / 3.2.0
ActivityPub v3.2.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.2.0, at activitypub.php

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