PluginProbe
ActivityPub / 5.3.1
ActivityPub v5.3.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
← All changes | includes/handler/class-create.php +63 -106 8.2.15.3.1 View file →
@@ -7,15 +7,12 @@
7 7
8 8 namespace Activitypub\Handler;
9 9
10 10 use Activitypub\Collection\Interactions;
11 -use Activitypub\Collection\Remote_Posts;
12 -use Activitypub\Tombstone;
13 11
14 -use function Activitypub\get_activity_visibility;
12 +use function Activitypub\is_self_ping;
15 13 use function Activitypub\is_activity_reply;
16 -use function Activitypub\is_quote_activity;
17 -use function Activitypub\is_self_ping;
14 +use function Activitypub\is_activity_public;
18 15 use function Activitypub\object_id_to_comment;
19 16
20 17 /**
21 18 * Handle Create requests.
@@ -24,11 +21,21 @@
24 21 /**
25 22 * Initialize the class, registering WordPress hooks.
26 23 */
27 24 public static function init() {
28 - \add_action( 'activitypub_handled_inbox_create', array( self::class, 'handle_create' ), 10, 3 );
29 - \add_filter( 'activitypub_validate_object', array( self::class, 'validate_object' ), 10, 3 );
30 - \add_action( 'post_activitypub_add_to_outbox', array( self::class, 'maybe_unbury' ), 10, 2 );
25 + \add_action(
26 + 'activitypub_inbox_create',
27 + array( self::class, 'handle_create' ),
28 + 10,
29 + 3
30 + );
31 +
32 + \add_filter(
33 + 'activitypub_validate_object',
34 + array( self::class, 'validate_object' ),
35 + 10,
36 + 3
37 + );
31 38 }
32 39
33 40 /**
34 41 * Handles "Create" requests.
@@ -33,97 +40,59 @@
33 40 /**
34 41 * Handles "Create" requests.
35 42 *
36 43 * @param array $activity The activity-object.
37 - * @param int|int[] $user_ids The id(s) of the local blog-user(s).
44 + * @param int $user_id The id of the local blog-user.
38 45 * @param \Activitypub\Activity\Activity $activity_object Optional. The activity object. Default null.
39 46 */
40 - public static function handle_create( $activity, $user_ids, $activity_object = null ) {
41 - // Check for private and/or direct messages.
42 - if ( ACTIVITYPUB_CONTENT_VISIBILITY_PRIVATE === get_activity_visibility( $activity ) ) {
43 - $result = false;
44 - } elseif ( is_activity_reply( $activity ) || is_quote_activity( $activity ) ) { // Check for replies and quotes.
45 - $result = self::create_interaction( $activity, $user_ids, $activity_object );
46 - } else { // Handle non-interaction objects.
47 - $result = self::create_post( $activity, $user_ids, $activity_object );
48 - }
49 -
50 - if ( false === $result ) {
47 + public static function handle_create( $activity, $user_id, $activity_object = null ) {
48 + // Check if Activity is public or not.
49 + if (
50 + ! is_activity_public( $activity ) ||
51 + ! is_activity_reply( $activity )
52 + ) {
51 53 return;
52 54 }
53 55
54 - $success = ! \is_wp_error( $result );
56 + $check_dupe = object_id_to_comment( $activity['object']['id'] );
55 57
56 - /**
57 - * Fires after an ActivityPub Create activity has been handled.
58 - *
59 - * @param array $activity The ActivityPub activity data.
60 - * @param int[] $user_ids The local user IDs.
61 - * @param bool $success True on success, false otherwise.
62 - * @param \WP_Comment|\WP_Post|\WP_Error $result The WP_Comment object of the created comment, or null if creation failed.
63 - */
64 - \do_action( 'activitypub_handled_create', $activity, (array) $user_ids, $success, $result );
65 - }
66 -
67 - /**
68 - * Handle interactions like replies.
69 - *
70 - * @param array $activity The activity-object.
71 - * @param int[] $user_ids The ids of the local blog-users.
72 - * @param \Activitypub\Activity\Activity $activity_object Optional. The activity object. Default null.
73 - *
74 - * @return \WP_Comment|\WP_Error|false The created comment, WP_Error on failure, false if already exists or not processed.
75 - */
76 - public static function create_interaction( $activity, $user_ids, $activity_object = null ) {
77 - $existing_comment = object_id_to_comment( $activity['object']['id'] );
78 -
79 58 // If comment exists, call update action.
80 - if ( $existing_comment ) {
81 - Update::handle_update( $activity, (array) $user_ids, $activity_object );
82 -
83 - return false;
59 + if ( $check_dupe ) {
60 + /**
61 + * Fires when a Create activity is received for an existing comment.
62 + *
63 + * @param array $activity The activity-object.
64 + * @param int $user_id The id of the local blog-user.
65 + * @param \WP_Comment|\WP_Error $check_dupe The comment object or WP_Error.
66 + * @param \Activitypub\Activity\Activity $activity_object The activity object.
67 + */
68 + \do_action( 'activitypub_inbox_update', $activity, $user_id, $activity_object );
69 + return;
84 70 }
85 71
86 72 if ( is_self_ping( $activity['object']['id'] ) ) {
87 - return false;
73 + return;
88 74 }
89 75
90 - $result = Interactions::add_comment( $activity );
76 + $state = Interactions::add_comment( $activity );
77 + $reaction = null;
91 78
92 - if ( ! $result || \is_wp_error( $result ) ) {
93 - return $result;
79 + if ( $state && ! \is_wp_error( $state ) ) {
80 + $reaction = \get_comment( $state );
94 81 }
95 82
96 - return \get_comment( $result );
83 + /**
84 + * Fires after a Create activity has been handled.
85 + *
86 + * @param array $activity The activity-object.
87 + * @param int $user_id The id of the local blog-user.
88 + * @param \WP_Comment|\WP_Error $state The comment object or WP_Error.
89 + * @param \WP_Comment|\WP_Error|null $reaction The reaction object or WP_Error.
90 + */
91 + \do_action( 'activitypub_handled_create', $activity, $user_id, $state, $reaction );
97 92 }
98 93
99 94 /**
100 - * Handle non-interaction posts like posts.
101 - *
102 - * @param array $activity The activity-object.
103 - * @param int[] $user_ids The ids of the local blog-users.
104 - * @param \Activitypub\Activity\Activity $activity_object Optional. The activity object. Default null.
105 - *
106 - * @return \WP_Post|\WP_Error|false The post on success, WP_Error on failure, false if already exists.
107 - */
108 - public static function create_post( $activity, $user_ids, $activity_object = null ) {
109 - if ( ! \get_option( 'activitypub_create_posts', false ) ) {
110 - return false;
111 - }
112 -
113 - $existing_post = Remote_Posts::get_by_guid( $activity['object']['id'] );
114 -
115 - // If post exists, call update action.
116 - if ( $existing_post instanceof \WP_Post ) {
117 - Update::handle_update( $activity, (array) $user_ids, $activity_object );
118 -
119 - return false;
120 - }
121 -
122 - return Remote_Posts::add( $activity, $user_ids );
123 - }
124 -
125 - /**
126 95 * Validate the object.
127 96 *
128 97 * @param bool $valid The validation state.
129 98 * @param string $param The object parameter.
@@ -131,47 +100,35 @@
131 100 *
132 101 * @return bool The validation state: true if valid, false if not.
133 102 */
134 103 public static function validate_object( $valid, $param, $request ) {
135 - $activity = $request->get_json_params();
104 + $json_params = $request->get_json_params();
136 105
137 - if ( empty( $activity['type'] ) ) {
106 + if ( empty( $json_params['type'] ) ) {
138 107 return false;
139 108 }
140 109
141 - if ( 'Create' !== $activity['type'] ) {
110 + if (
111 + 'Create' !== $json_params['type'] ||
112 + is_wp_error( $request )
113 + ) {
142 114 return $valid;
143 115 }
144 116
145 - if ( ! isset( $activity['object'] ) || ! \is_array( $activity['object'] ) ) {
117 + $object = $json_params['object'];
118 +
119 + if ( ! is_array( $object ) ) {
146 120 return false;
147 121 }
148 122
149 - if ( ! isset( $activity['object']['id'], $activity['object']['content'] ) ) {
123 + $required = array(
124 + 'id',
125 + 'content',
126 + );
127 +
128 + if ( array_intersect( $required, array_keys( $object ) ) !== $required ) {
150 129 return false;
151 130 }
152 131
153 132 return $valid;
154 - }
155 -
156 - /**
157 - * Remove a URL from the tombstone registry when a Create or Update activity is sent.
158 - *
159 - * This handles the case where a post was soft-deleted (visibility changed to local/private)
160 - * and then later changed back to public. The Create/Update activity indicates the post is being
161 - * re-federated, so we remove it from the tombstone registry.
162 - *
163 - * @param int $outbox_id The ID of the outbox activity.
164 - * @param \Activitypub\Activity\Activity $activity The Activity object.
165 - */
166 - public static function maybe_unbury( $outbox_id, $activity ) {
167 - if ( ! in_array( $activity->get_type(), array( 'Create', 'Update' ), true ) ) {
168 - return;
169 - }
170 -
171 - $object = $activity->get_object();
172 -
173 - if ( $object ) {
174 - Tombstone::remove( $object->get_id(), $object->get_url() );
175 - }
176 133 }
177 134 }