PluginProbe
ActivityPub / 3.2.3
ActivityPub v3.2.3
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.3, at activitypub.php

234 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.2.2
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 WP_CLI;
19
20 use function Activitypub\is_blog_public;
21 use function Activitypub\site_supports_blocks;
22
23 require_once __DIR__ . '/includes/compat.php';
24 require_once __DIR__ . '/includes/functions.php';
25
26 \define( 'ACTIVITYPUB_PLUGIN_VERSION', '3.2.2' );
27
28 /**
29 * Initialize the plugin constants.
30 */
31 \defined( 'ACTIVITYPUB_REST_NAMESPACE' ) || \define( 'ACTIVITYPUB_REST_NAMESPACE', 'activitypub/1.0' );
32 \defined( 'ACTIVITYPUB_EXCERPT_LENGTH' ) || \define( 'ACTIVITYPUB_EXCERPT_LENGTH', 400 );
33 \defined( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS' ) || \define( 'ACTIVITYPUB_SHOW_PLUGIN_RECOMMENDATIONS', true );
34 \defined( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS' ) || \define( 'ACTIVITYPUB_MAX_IMAGE_ATTACHMENTS', 3 );
35 \defined( 'ACTIVITYPUB_HASHTAGS_REGEXP' ) || \define( 'ACTIVITYPUB_HASHTAGS_REGEXP', '(?:(?<=\s)|(?<=<p>)|(?<=<br>)|^)#([A-Za-z0-9_]+)(?:(?=\s|[[:punct:]]|$))' );
36 \defined( 'ACTIVITYPUB_USERNAME_REGEXP' ) || \define( 'ACTIVITYPUB_USERNAME_REGEXP', '(?:([A-Za-z0-9\._-]+)@((?:[A-Za-z0-9_-]+\.)+[A-Za-z]+))' );
37 \defined( 'ACTIVITYPUB_URL_REGEXP' ) || \define( 'ACTIVITYPUB_URL_REGEXP', '(www.|http:|https:)+[^\s]+[\w\/]' );
38 \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]" );
39 \defined( 'ACTIVITYPUB_AUTHORIZED_FETCH' ) || \define( 'ACTIVITYPUB_AUTHORIZED_FETCH', false );
40 \defined( 'ACTIVITYPUB_DISABLE_REWRITES' ) || \define( 'ACTIVITYPUB_DISABLE_REWRITES', false );
41 \defined( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_INCOMING_INTERACTIONS', false );
42 // Disable reactions like `Like` and `Accounce` by default
43 \defined( 'ACTIVITYPUB_DISABLE_REACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_REACTIONS', true );
44 \defined( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS' ) || \define( 'ACTIVITYPUB_DISABLE_OUTGOING_INTERACTIONS', false );
45 \defined( 'ACTIVITYPUB_SHARED_INBOX_FEATURE' ) || \define( 'ACTIVITYPUB_SHARED_INBOX_FEATURE', false );
46 \defined( 'ACTIVITYPUB_SEND_VARY_HEADER' ) || \define( 'ACTIVITYPUB_SEND_VARY_HEADER', false );
47 \defined( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE' ) || \define( 'ACTIVITYPUB_DEFAULT_OBJECT_TYPE', 'note' );
48
49 \define( 'ACTIVITYPUB_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
50 \define( 'ACTIVITYPUB_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
51 \define( 'ACTIVITYPUB_PLUGIN_FILE', plugin_dir_path( __FILE__ ) . '/' . basename( __FILE__ ) );
52 \define( 'ACTIVITYPUB_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
53
54 /**
55 * Initialize REST routes.
56 */
57 function rest_init() {
58 Rest\Actors::init();
59 Rest\Outbox::init();
60 Rest\Inbox::init();
61 Rest\Followers::init();
62 Rest\Following::init();
63 Rest\Webfinger::init();
64 Rest\Comment::init();
65 Rest\Server::init();
66 Rest\Collection::init();
67 Rest\Interaction::init();
68
69 // load NodeInfo endpoints only if blog is public
70 if ( is_blog_public() ) {
71 Rest\NodeInfo::init();
72 }
73 }
74 \add_action( 'rest_api_init', __NAMESPACE__ . '\rest_init' );
75
76 /**
77 * Initialize plugin.
78 */
79 function plugin_init() {
80 \add_action( 'init', array( __NAMESPACE__ . '\Migration', 'init' ) );
81 \add_action( 'init', array( __NAMESPACE__ . '\Activitypub', 'init' ) );
82 \add_action( 'init', array( __NAMESPACE__ . '\Activity_Dispatcher', 'init' ) );
83 \add_action( 'init', array( __NAMESPACE__ . '\Handler', 'init' ) );
84 \add_action( 'init', array( __NAMESPACE__ . '\Admin', 'init' ) );
85 \add_action( 'init', array( __NAMESPACE__ . '\Hashtag', 'init' ) );
86 \add_action( 'init', array( __NAMESPACE__ . '\Mention', 'init' ) );
87 \add_action( 'init', array( __NAMESPACE__ . '\Health_Check', 'init' ) );
88 \add_action( 'init', array( __NAMESPACE__ . '\Scheduler', 'init' ) );
89 \add_action( 'init', array( __NAMESPACE__ . '\Comment', 'init' ) );
90 \add_action( 'init', array( __NAMESPACE__ . '\Link', 'init' ) );
91
92 if ( site_supports_blocks() ) {
93 \add_action( 'init', array( __NAMESPACE__ . '\Blocks', 'init' ) );
94 }
95
96 $debug_file = __DIR__ . '/includes/debug.php';
97 if ( \WP_DEBUG && file_exists( $debug_file ) && is_readable( $debug_file ) ) {
98 require_once $debug_file;
99 Debug::init();
100 }
101 }
102 \add_action( 'plugins_loaded', __NAMESPACE__ . '\plugin_init' );
103
104
105 /**
106 * Class Autoloader
107 */
108 \spl_autoload_register(
109 function ( $full_class ) {
110 $base_dir = __DIR__ . '/includes/';
111 $base = 'Activitypub\\';
112
113 if ( strncmp( $full_class, $base, strlen( $base ) ) === 0 ) {
114 $maybe_uppercase = str_replace( $base, '', $full_class );
115 $class = strtolower( $maybe_uppercase );
116 // All classes should be capitalized. If this is instead looking for a lowercase method, we ignore that.
117 if ( $maybe_uppercase === $class ) {
118 return;
119 }
120
121 if ( false !== strpos( $class, '\\' ) ) {
122 $parts = explode( '\\', $class );
123 $class = array_pop( $parts );
124 $sub_dir = strtr( implode( '/', $parts ), '_', '-' );
125 $base_dir = $base_dir . $sub_dir . '/';
126 }
127
128 $filename = 'class-' . strtr( $class, '_', '-' );
129 $file = $base_dir . $filename . '.php';
130
131 if ( file_exists( $file ) && is_readable( $file ) ) {
132 require_once $file;
133 } else {
134 // translators: %s is the class name
135 $message = sprintf( esc_html__( 'Required class not found or not readable: %s', 'activitypub' ), esc_html( $full_class ) );
136 Debug::write_log( $message );
137 \wp_die( $message ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
138 }
139 }
140 }
141 );
142
143 /**
144 * Add plugin settings link
145 */
146 function plugin_settings_link( $actions ) {
147 $settings_link = array();
148 $settings_link[] = \sprintf(
149 '<a href="%1s">%2s</a>',
150 \menu_page_url( 'activitypub', false ),
151 \__( 'Settings', 'activitypub' )
152 );
153
154 return \array_merge( $settings_link, $actions );
155 }
156 \add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), __NAMESPACE__ . '\plugin_settings_link' );
157
158 \register_activation_hook(
159 __FILE__,
160 array(
161 __NAMESPACE__ . '\Activitypub',
162 'activate',
163 )
164 );
165
166 \register_deactivation_hook(
167 __FILE__,
168 array(
169 __NAMESPACE__ . '\Activitypub',
170 'deactivate',
171 )
172 );
173
174 \register_uninstall_hook(
175 __FILE__,
176 array(
177 __NAMESPACE__ . '\Activitypub',
178 'uninstall',
179 )
180 );
181
182 // Load integrations
183 require_once __DIR__ . '/integration/load.php';
184
185 /**
186 * `get_plugin_data` wrapper
187 *
188 * @return array The plugin metadata array
189 */
190 function get_plugin_meta( $default_headers = array() ) {
191 if ( ! $default_headers ) {
192 $default_headers = array(
193 'Name' => 'Plugin Name',
194 'PluginURI' => 'Plugin URI',
195 'Version' => 'Version',
196 'Description' => 'Description',
197 'Author' => 'Author',
198 'AuthorURI' => 'Author URI',
199 'TextDomain' => 'Text Domain',
200 'DomainPath' => 'Domain Path',
201 'Network' => 'Network',
202 'RequiresWP' => 'Requires at least',
203 'RequiresPHP' => 'Requires PHP',
204 'UpdateURI' => 'Update URI',
205 );
206 }
207
208 return \get_file_data( __FILE__, $default_headers, 'plugin' );
209 }
210
211 /**
212 * Plugin Version Number used for caching.
213 */
214 function get_plugin_version() {
215 if ( \defined( 'ACTIVITYPUB_PLUGIN_VERSION' ) ) {
216 return ACTIVITYPUB_PLUGIN_VERSION;
217 }
218
219 $meta = get_plugin_meta( array( 'Version' => 'Version' ) );
220
221 return $meta['Version'];
222 }
223
224 // Check for CLI env, to add the CLI commands
225 if ( defined( 'WP_CLI' ) && WP_CLI ) {
226 WP_CLI::add_command(
227 'activitypub',
228 '\Activitypub\Cli',
229 array(
230 'shortdesc' => __( 'ActivityPub related commands: Meta-Infos, Delete and soon Self-Destruct.', 'activitypub' ),
231 )
232 );
233 }
234