PluginProbe
ActivityPub / trunk
ActivityPub vtrunk
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 / includes / class-activitypub.php

class-activitypub.php in ActivityPub trunk, at includes/class-activitypub.php

413 lines 10.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * ActivityPub Class.
4 *
5 * @package Activitypub
6 */
7
8 namespace Activitypub;
9
10 use Activitypub\Collection\Followers;
11 use Activitypub\Collection\Following;
12 use Activitypub\Collection\Remote_Posts;
13 use Activitypub\OAuth\Client;
14
15 /**
16 * ActivityPub Class.
17 *
18 * @author Matthias Pfefferle
19 */
20 class Activitypub {
21 /**
22 * Initialize the class, registering WordPress hooks.
23 */
24 public static function init() {
25 \add_action( 'init', array( self::class, 'theme_compat' ), 11 );
26 \add_action( 'init', array( self::class, 'register_user_meta' ), 11 );
27
28 \add_action( 'wp_trash_post', array( self::class, 'trash_post' ), 1 );
29 \add_action( 'untrash_post', array( self::class, 'untrash_post' ), 1 );
30
31 \add_action( 'user_register', array( self::class, 'user_register' ) );
32
33 \add_action( 'activitypub_add_user_block', array( Followers::class, 'remove_blocked_actors' ), 10, 3 );
34 \add_action( 'activitypub_add_user_block', array( Following::class, 'remove_blocked_actors' ), 10, 3 );
35 }
36
37 /**
38 * Activation Hook.
39 *
40 * @param bool $network_wide Whether to activate the plugin for all sites in the network or just the current site.
41 */
42 public static function activate( $network_wide ) {
43 self::flush_rewrite_rules();
44 Scheduler::register_schedules();
45
46 \add_filter( 'pre_wp_update_comment_count_now', array( Comment::class, 'pre_wp_update_comment_count_now' ), 5, 3 );
47 Migration::update_comment_counts();
48
49 if ( \is_multisite() && $network_wide && ! \wp_is_large_network() ) {
50 $sites = \get_sites( array( 'fields' => 'ids' ) );
51 foreach ( $sites as $site ) {
52 \switch_to_blog( $site );
53 self::flush_rewrite_rules();
54 \restore_current_blog();
55 }
56 }
57 }
58
59 /**
60 * Deactivation Hook.
61 *
62 * @param bool $network_wide Whether to deactivate the plugin for all sites in the network or just the current site.
63 */
64 public static function deactivate( $network_wide ) {
65 self::flush_rewrite_rules();
66 Scheduler::deregister_schedules();
67
68 \remove_filter( 'pre_wp_update_comment_count_now', array( Comment::class, 'pre_wp_update_comment_count_now' ), 5 );
69 Migration::update_comment_counts( 2000 );
70
71 if ( \is_multisite() && $network_wide && ! \wp_is_large_network() ) {
72 $sites = \get_sites( array( 'fields' => 'ids' ) );
73 foreach ( $sites as $site ) {
74 \switch_to_blog( $site );
75 self::flush_rewrite_rules();
76 \restore_current_blog();
77 }
78 }
79 }
80
81 /**
82 * Uninstall Hook.
83 */
84 public static function uninstall() {
85 Scheduler::deregister_schedules();
86
87 \remove_filter( 'pre_wp_update_comment_count_now', array( Comment::class, 'pre_wp_update_comment_count_now' ), 5 );
88 Migration::update_comment_counts( 2000 );
89
90 Remote_Posts::delete_all();
91 Tombstone::delete_all();
92 Client::delete_all();
93
94 Options::delete();
95 }
96
97 /**
98 * Store permalink in meta, to send delete Activity.
99 *
100 * @param string $post_id The Post ID.
101 */
102 public static function trash_post( $post_id ) {
103 \add_post_meta(
104 $post_id,
105 '_activitypub_canonical_url',
106 \get_permalink( $post_id ),
107 true
108 );
109 }
110
111 /**
112 * Delete permalink from meta.
113 *
114 * @param string $post_id The Post ID.
115 */
116 public static function untrash_post( $post_id ) {
117 \delete_post_meta( $post_id, '_activitypub_canonical_url' );
118 }
119
120 /**
121 * Flush rewrite rules.
122 */
123 public static function flush_rewrite_rules() {
124 Router::add_rewrite_rules();
125 \flush_rewrite_rules();
126 }
127
128 /**
129 * Add rewrite rules.
130 *
131 * @deprecated 7.5.0 Use {@see Router::add_rewrite_rules()}.
132 */
133 public static function add_rewrite_rules() {
134 \_deprecated_function( __FUNCTION__, '7.5.0', '\Activitypub\Router::add_rewrite_rules()' );
135
136 Router::add_rewrite_rules();
137 }
138
139 /**
140 * Theme compatibility stuff.
141 */
142 public static function theme_compat() {
143 // We assume that you want to use Post-Formats when enabling the setting.
144 if ( 'wordpress-post-format' === \get_option( 'activitypub_object_type', ACTIVITYPUB_DEFAULT_OBJECT_TYPE ) ) {
145 if ( ! \get_theme_support( 'post-formats' ) ) {
146 // Add support for the Aside, Gallery Post Formats...
147 \add_theme_support(
148 'post-formats',
149 array(
150 'gallery',
151 'status',
152 'image',
153 'video',
154 'audio',
155 )
156 );
157 }
158 }
159 }
160
161 /**
162 * Add the 'activitypub' capability to users who can publish posts.
163 *
164 * @param int $user_id User ID.
165 */
166 public static function user_register( $user_id ) {
167 if ( \user_can( $user_id, 'publish_posts' ) ) {
168 $user = \get_user_by( 'id', $user_id );
169 $user->add_cap( 'activitypub' );
170 }
171 }
172
173 /**
174 * Register user meta.
175 */
176 public static function register_user_meta() {
177 $blog_prefix = $GLOBALS['wpdb']->get_blog_prefix();
178
179 \register_meta(
180 'user',
181 $blog_prefix . 'activitypub_also_known_as',
182 array(
183 'type' => 'array',
184 'description' => 'An array of URLs that the user is known by.',
185 'single' => true,
186 'default' => array(),
187 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ),
188 )
189 );
190
191 \register_meta(
192 'user',
193 $blog_prefix . 'activitypub_hide_social_graph',
194 array(
195 'type' => 'integer',
196 'description' => 'Hide Followers and Followings on Profile.',
197 'single' => true,
198 'default' => 0,
199 'sanitize_callback' => 'absint',
200 'show_in_rest' => true,
201 )
202 );
203
204 \register_meta(
205 'user',
206 $blog_prefix . 'activitypub_old_host_data',
207 array(
208 'description' => 'Actor object for the user on the old host.',
209 'single' => true,
210 )
211 );
212
213 \register_meta(
214 'user',
215 $blog_prefix . 'activitypub_moved_to',
216 array(
217 'type' => 'string',
218 'description' => 'The new URL of the user.',
219 'single' => true,
220 'sanitize_callback' => 'sanitize_url',
221 )
222 );
223
224 \register_meta(
225 'user',
226 $blog_prefix . 'activitypub_description',
227 array(
228 'type' => 'string',
229 'description' => 'The user description.',
230 'single' => true,
231 'default' => '',
232 'sanitize_callback' => static function ( $value ) {
233 return \wp_kses( $value, 'user_description' );
234 },
235 )
236 );
237
238 \register_meta(
239 'user',
240 $blog_prefix . 'activitypub_icon',
241 array(
242 'type' => 'integer',
243 'description' => 'The attachment ID for user profile image.',
244 'single' => true,
245 'default' => 0,
246 'sanitize_callback' => 'absint',
247 )
248 );
249
250 \register_meta(
251 'user',
252 $blog_prefix . 'activitypub_header_image',
253 array(
254 'type' => 'integer',
255 'description' => 'The attachment ID for the user header image.',
256 'single' => true,
257 'default' => 0,
258 'sanitize_callback' => 'absint',
259 )
260 );
261
262 \register_meta(
263 'user',
264 $blog_prefix . 'activitypub_mailer_new_dm',
265 array(
266 'type' => 'integer',
267 'description' => 'Send a notification when someone sends this user a direct message.',
268 'single' => true,
269 'sanitize_callback' => 'absint',
270 )
271 );
272 \add_filter( 'get_user_option_activitypub_mailer_new_dm', array( self::class, 'user_options_default' ) );
273
274 \register_meta(
275 'user',
276 $blog_prefix . 'activitypub_mailer_new_follower',
277 array(
278 'type' => 'integer',
279 'description' => 'Send a notification when someone starts to follow this user.',
280 'single' => true,
281 'sanitize_callback' => 'absint',
282 )
283 );
284 \add_filter( 'get_user_option_activitypub_mailer_new_follower', array( self::class, 'user_options_default' ) );
285
286 \register_meta(
287 'user',
288 $blog_prefix . 'activitypub_mailer_new_mention',
289 array(
290 'type' => 'integer',
291 'description' => 'Send a notification when someone mentions this user.',
292 'single' => true,
293 'sanitize_callback' => 'absint',
294 )
295 );
296 \add_filter( 'get_user_option_activitypub_mailer_new_mention', array( self::class, 'user_options_default' ) );
297
298 \register_meta(
299 'user',
300 $blog_prefix . 'activitypub_mailer_new_reaction',
301 array(
302 'type' => 'integer',
303 'description' => 'Send a notification when someone likes, reposts, or quotes this user\'s post.',
304 'single' => true,
305 'sanitize_callback' => 'absint',
306 )
307 );
308 \add_filter( 'get_user_option_activitypub_mailer_new_reaction', array( self::class, 'user_options_default' ) );
309
310 \register_meta(
311 'user',
312 $blog_prefix . 'activitypub_mailer_annual_report',
313 array(
314 'type' => 'integer',
315 'description' => 'Send the annual Fediverse Year in Review email.',
316 'single' => true,
317 'sanitize_callback' => 'absint',
318 )
319 );
320 \add_filter( 'get_user_option_activitypub_mailer_annual_report', array( self::class, 'user_options_default' ) );
321
322 \register_meta(
323 'user',
324 $blog_prefix . 'activitypub_mailer_monthly_report',
325 array(
326 'type' => 'integer',
327 'description' => 'Send a monthly Fediverse stats report email.',
328 'single' => true,
329 'sanitize_callback' => 'absint',
330 )
331 );
332
333 \register_meta(
334 'user',
335 'activitypub_show_welcome_tab',
336 array(
337 'type' => 'integer',
338 'description' => 'Whether to show the welcome tab.',
339 'single' => true,
340 'default' => 1,
341 'sanitize_callback' => 'absint',
342 )
343 );
344
345 \register_meta(
346 'user',
347 'activitypub_show_advanced_tab',
348 array(
349 'type' => 'integer',
350 'description' => 'Whether to show the advanced tab.',
351 'single' => true,
352 'default' => 0,
353 'sanitize_callback' => 'absint',
354 )
355 );
356
357 // Moderation user meta.
358 \register_meta(
359 'user',
360 'activitypub_blocked_actors',
361 array(
362 'type' => 'array',
363 'description' => 'User-specific blocked ActivityPub actors.',
364 'single' => true,
365 'default' => array(),
366 'sanitize_callback' => array( Sanitize::class, 'identifier_list' ),
367 )
368 );
369
370 \register_meta(
371 'user',
372 'activitypub_blocked_domains',
373 array(
374 'type' => 'array',
375 'description' => 'User-specific blocked ActivityPub domains.',
376 'single' => true,
377 'default' => array(),
378 'sanitize_callback' => static function ( $value ) {
379 return \array_unique( \array_map( array( Sanitize::class, 'host_list' ), $value ) );
380 },
381 )
382 );
383
384 \register_meta(
385 'user',
386 'activitypub_blocked_keywords',
387 array(
388 'type' => 'array',
389 'description' => 'User-specific blocked ActivityPub keywords.',
390 'single' => true,
391 'default' => array(),
392 'sanitize_callback' => static function ( $value ) {
393 return \array_map( 'sanitize_text_field', $value );
394 },
395 )
396 );
397 }
398
399 /**
400 * Set default values for user options.
401 *
402 * @param bool|string $value Option value.
403 * @return bool|string
404 */
405 public static function user_options_default( $value ) {
406 if ( false === $value ) {
407 return '1';
408 }
409
410 return $value;
411 }
412 }
413