PluginProbe
ActivityPub / 8.0.2
ActivityPub v8.0.2
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/class-webfinger.php +19 -59 9.2.08.0.2 View file →
@@ -19,32 +19,8 @@
19 19 * @see https://webfinger.net/
20 20 */
21 21 class Webfinger {
22 22 /**
23 - * Check whether a value looks like an `acct` identifier.
24 - *
25 - * Accepts any of:
26 - *
27 - * - `user@host` — bare WebFinger handle.
28 - * - `@user@host` — Mastodon display form with a leading `@`.
29 - * - `acct:user@host` — full RFC 7565 URI form.
30 - *
31 - * The host/local-part pattern follows `ACTIVITYPUB_USERNAME_REGEXP`.
32 - *
33 - * @since 8.3.0
34 - *
35 - * @param mixed $value The candidate value.
36 - * @return bool True if the value matches the acct identifier pattern.
37 - */
38 - public static function is_acct( $value ) {
39 - if ( ! \is_string( $value ) || '' === $value ) {
40 - return false;
41 - }
42 -
43 - return (bool) \preg_match( '/^(?:acct:)?@?' . ACTIVITYPUB_USERNAME_REGEXP . '$/i', $value );
44 - }
45 -
46 - /**
47 23 * Returns a users WebFinger "resource".
48 24 *
49 25 * @param int $user_id The WordPress user id.
50 26 *
@@ -51,9 +27,9 @@
51 27 * @return string The user-resource.
52 28 */
53 29 public static function get_user_resource( $user_id ) {
54 30 $user = Actors::get_by_id( $user_id );
55 - if ( ! $user || \is_wp_error( $user ) ) {
31 + if ( ! $user || is_wp_error( $user ) ) {
56 32 return '';
57 33 }
58 34
59 35 return $user->get_webfinger();
@@ -72,12 +48,12 @@
72 48 if ( \is_wp_error( $data ) ) {
73 49 return $data;
74 50 }
75 51
76 - if ( ! \is_array( $data ) || empty( $data['links'] ) ) {
52 + if ( ! is_array( $data ) || empty( $data['links'] ) ) {
77 53 return new \WP_Error(
78 54 'webfinger_missing_links',
79 - \__( 'No valid Link elements found.', 'activitypub' ),
55 + __( 'No valid Link elements found.', 'activitypub' ),
80 56 array(
81 57 'status' => 400,
82 58 'data' => $data,
83 59 )
@@ -98,9 +74,9 @@
98 74 }
99 75
100 76 return new \WP_Error(
101 77 'webfinger_url_no_activitypub',
102 - \__( 'The Site supports WebFinger but not ActivityPub', 'activitypub' ),
78 + __( 'The Site supports WebFinger but not ActivityPub', 'activitypub' ),
103 79 array(
104 80 'status' => 400,
105 81 'data' => $data,
106 82 )
@@ -118,9 +94,9 @@
118 94 */
119 95 public static function uri_to_acct( $uri ) {
120 96 $data = self::get_data( $uri );
121 97
122 - if ( \is_wp_error( $data ) ) {
98 + if ( is_wp_error( $data ) ) {
123 99 return $data;
124 100 }
125 101
126 102 // Check if subject is an acct URI.
@@ -141,9 +117,9 @@
141 117 }
142 118
143 119 return new \WP_Error(
144 120 'webfinger_url_no_acct',
145 - \__( 'No acct URI found.', 'activitypub' ),
121 + __( 'No acct URI found.', 'activitypub' ),
146 122 array(
147 123 'status' => 400,
148 124 'data' => $data,
149 125 )
@@ -161,9 +137,9 @@
161 137 public static function get_identifier_and_host( $url ) {
162 138 if ( ! $url ) {
163 139 return new \WP_Error(
164 140 'webfinger_invalid_identifier',
165 - \__( 'Invalid Identifier', 'activitypub' ),
141 + __( 'Invalid Identifier', 'activitypub' ),
166 142 array(
167 143 'status' => 400,
168 144 'data' => $url,
169 145 )
@@ -170,11 +146,11 @@
170 146 );
171 147 }
172 148
173 149 // Remove leading @.
174 - $url = \ltrim( $url, '@' );
150 + $url = ltrim( $url, '@' );
175 151
176 - if ( ! \preg_match( '/^([a-zA-Z+]+):/', $url, $match ) ) {
152 + if ( ! preg_match( '/^([a-zA-Z+]+):/', $url, $match ) ) {
177 153 $identifier = 'acct:' . $url;
178 154 $scheme = 'acct';
179 155 } else {
180 156 $identifier = $url;
@@ -186,14 +162,14 @@
186 162 switch ( $scheme ) {
187 163 case 'acct':
188 164 case 'mailto':
189 165 case 'xmpp':
190 - if ( \strpos( $identifier, '@' ) !== false ) {
191 - $host = \substr( $identifier, \strpos( $identifier, '@' ) + 1 );
166 + if ( strpos( $identifier, '@' ) !== false ) {
167 + $host = substr( $identifier, strpos( $identifier, '@' ) + 1 );
192 168 }
193 169 break;
194 170 default:
195 - $host = \wp_parse_url( $identifier, PHP_URL_HOST );
171 + $host = wp_parse_url( $identifier, PHP_URL_HOST );
196 172 break;
197 173 }
198 174
199 175 if ( empty( $host ) ) {
@@ -198,9 +174,9 @@
198 174
199 175 if ( empty( $host ) ) {
200 176 return new \WP_Error(
201 177 'webfinger_invalid_identifier',
202 - \__( 'Invalid Identifier', 'activitypub' ),
178 + __( 'Invalid Identifier', 'activitypub' ),
203 179 array(
204 180 'status' => 400,
205 181 'data' => $url,
206 182 )
@@ -219,15 +195,15 @@
219 195 */
220 196 public static function get_data( $uri ) {
221 197 $identifier_and_host = self::get_identifier_and_host( $uri );
222 198
223 - if ( \is_wp_error( $identifier_and_host ) ) {
199 + if ( is_wp_error( $identifier_and_host ) ) {
224 200 return $identifier_and_host;
225 201 }
226 202
227 203 list( $identifier, $host ) = $identifier_and_host;
228 204
229 - $webfinger_url = \sprintf(
205 + $webfinger_url = sprintf(
230 206 'https://%s/.well-known/webfinger?resource=%s',
231 207 $host,
232 208 \rawurlencode( $identifier )
233 209 );
@@ -255,9 +231,9 @@
255 231 *
256 232 * @return string|\WP_Error Error or the Remote-Follow endpoint URI.
257 233 */
258 234 public static function get_remote_follow_endpoint( $uri ) {
259 - return self::get_intent_endpoint( $uri, 'follow', true );
235 + return self::get_intent_endpoint( $uri, 'http://ostatus.org/schema/1.0/subscribe' );
260 236 }
261 237
262 238 /**
263 239 * Generate a cache key for a given URI.
@@ -266,15 +242,15 @@
266 242 *
267 243 * @return string The cache key.
268 244 */
269 245 public static function generate_cache_key( $uri ) {
270 - $uri = \ltrim( $uri, '@' );
246 + $uri = ltrim( $uri, '@' );
271 247
272 - if ( \filter_var( $uri, FILTER_VALIDATE_EMAIL ) ) {
248 + if ( filter_var( $uri, FILTER_VALIDATE_EMAIL ) ) {
273 249 $uri = 'acct:' . $uri;
274 250 }
275 251
276 - return 'webfinger_' . \md5( $uri );
252 + return 'webfinger_' . md5( $uri );
277 253 }
278 254
279 255 /**
280 256 * Infer a shortname from the Actor ID or URL. Used only for fallbacks,
@@ -362,26 +338,10 @@
362 338 )
363 339 );
364 340 }
365 341
366 - /*
367 - * OStatus subscribe URL (deprecated but still widely supported)
368 - *
369 - * @see https://ostatus.github.io/spec/OStatus%201.0%20Draft%202.html#anchor10
370 - */
371 342 if ( isset( $links['http://ostatus.org/schema/1.0/subscribe'] ) ) {
372 343 return $links['http://ostatus.org/schema/1.0/subscribe'];
373 - }
374 -
375 - /*
376 - * FEP-3b86 Object Intent — the generic "open this object on my home
377 - * server" link, equivalent to pasting the URL into the home server's
378 - * search box. Useful when no verb-specific intent is advertised.
379 - *
380 - * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/3b86/fep-3b86.md#5-1-object-intent
381 - */
382 - if ( isset( $links['https://w3id.org/fep/3b86/object'] ) ) {
383 - return $links['https://w3id.org/fep/3b86/object'];
384 344 }
385 345
386 346 // Last-resort: construct a Mastodon-compatible authorize_interaction URL.
387 347 $identifier_and_host = self::get_identifier_and_host( $uri );