PluginProbe
ActivityPub / 8.2.1
ActivityPub v8.2.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
activitypub / includes / activity / class-base-object.php

class-base-object.php in ActivityPub 8.2.1, at includes/activity/class-base-object.php

675 lines 23.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Inspired by the PHP ActivityPub Library by @Landrok
4 *
5 * @link https://github.com/landrok/activitypub
6 *
7 * @package Activitypub
8 */
9
10 namespace Activitypub\Activity;
11
12 use Activitypub\Activity\Extended_Object\Place;
13
14 /**
15 * Base_Object is an implementation of one of the
16 * Activity Streams Core Types.
17 *
18 * The Object is the primary base type for the Activity Streams
19 * vocabulary.
20 *
21 * Note: Object is a reserved keyword in PHP. It has been suffixed with
22 * 'Base_' for this reason.
23 *
24 * @see https://www.w3.org/TR/activitystreams-core/#object
25 *
26 * @method array|string|null get_attachment() Gets the attachment property of the object.
27 * @method array|string|null get_attributed_to() Gets the entity attributed as the original author.
28 * @method string|null get_audience() Gets the total population of entities for which the object can be considered relevant.
29 * @method string[]|string|null get_bcc() Gets the private secondary audience of the object.
30 * @method string[]|string|null get_bto() Gets the private primary audience of the object.
31 * @method string[]|string|null get_cc() Gets the secondary recipients of the object.
32 * @method string|null get_content() Gets the content property of the object.
33 * @method string[]|null get_content_map() Gets the content map property of the object.
34 * @method string|null get_context() Gets the context within which the object exists.
35 * @method array|null get_dcterms() Gets the Dublin Core terms property of the object.
36 * @method string|null get_duration() Gets the duration property of time-bound resources.
37 * @method string|null get_end_time() Gets the date and time describing the ending time of the object.
38 * @method string|null get_generator() Gets the entity that generated the object.
39 * @method string[]|null get_icon() Gets the icon property of the object.
40 * @method string|null get_id() Gets the object's unique global identifier.
41 * @method string[]|null get_image() Gets the image property of the object.
42 * @method string[]|string|null get_in_reply_to() Gets the objects this object is in reply to.
43 * @method array|null get_interaction_policy() Gets the interaction policy property of the object.
44 * @method array|null get_likes() Gets the collection of likes for this object.
45 * @method array|string|null|Place get_location() Gets the physical or logical locations associated with the object.
46 * @method string|null get_media_type() Gets the MIME media type of the content property.
47 * @method string|null get_name() Gets the natural language name of the object.
48 * @method string[]|null get_name_map() Gets the name map property of the object.
49 * @method string|null get_preview() Gets the entity that provides a preview of this object.
50 * @method string|null get_published() Gets the date and time the object was published in ISO 8601 format.
51 * @method string|null get_quote() Gets the quote property of the object (FEP-044f).
52 * @method string|null get_quote_url() Gets the quoteUrl property of the object.
53 * @method string|null get_quote_uri() Gets the quoteUri property of the object.
54 * @method string|null get__misskey_quote() Gets the _misskey_quote property of the object.
55 * @method string|array|null get_replies() Gets the collection of responses to this object.
56 * @method bool|null get_sensitive() Gets the sensitive property of the object.
57 * @method array|null get_shares() Gets the collection of shares for this object.
58 * @method array|null get_source() Gets the source property indicating content markup derivation.
59 * @method string|null get_start_time() Gets the date and time describing the starting time of the object.
60 * @method string|null get_summary() Gets the natural language summary of the object.
61 * @method string[]|null get_summary_map() Gets the summary map property of the object.
62 * @method array[]|null get_tag() Gets the tag property of the object.
63 * @method string[]|string|null get_to() Gets the primary recipients of the object.
64 * @method string get_type() Gets the type of the object.
65 * @method string|null get_updated() Gets the date and time the object was updated in ISO 8601 format.
66 * @method string|null get_url() Gets the URL of the object.
67 * @method string|null get_former_type() Gets the former type of a Tombstone object.
68 * @method string|null get_deleted() Gets the date and time the object was deleted in ISO 8601 format.
69 *
70 * @method string|string[] add_cc( string|array $cc ) Adds one or more entities to the secondary audience of the object.
71 * @method string|string[] add_to( string|array $to ) Adds one or more entities to the primary audience of the object.
72 *
73 * @method Base_Object set_attachment( array $attachment ) Sets the attachment property of the object.
74 * @method Base_Object set_attributed_to( string $attributed_to ) Sets the entity attributed as the original author.
75 * @method Base_Object set_audience( string $audience ) Sets the total population of entities for which the object can be considered relevant.
76 * @method Base_Object set_bcc( array|string $bcc ) Sets the private secondary audience of the object.
77 * @method Base_Object set_bto( array|string $bto ) Sets the private primary audience of the object.
78 * @method Base_Object set_cc( array|string $cc ) Sets the secondary recipients of the object.
79 * @method Base_Object set_content( string $content ) Sets the content property of the object.
80 * @method Base_Object set_content_map( array $content_map ) Sets the content property of the object.
81 * @method Base_Object set_context( string $context ) Sets the context within which the object exists.
82 * @method Base_Object set_dcterms( array $dcterms ) Sets the Dublin Core terms property of the object.
83 * @method Base_Object set_duration( string $duration ) Sets the duration property of time-bound resources.
84 * @method Base_Object set_end_time( string $end_time ) Sets the date and time describing the ending time of the object.
85 * @method Base_Object set_generator( string $generator ) Sets the entity that generated the object.
86 * @method Base_Object set_icon( array $icon ) Sets the icon property of the object.
87 * @method Base_Object set_id( string $id ) Sets the object's unique global identifier.
88 * @method Base_Object set_image( array $image ) Sets the image property of the object.
89 * @method Base_Object set_in_reply_to( string|string[] $in_reply_to ) Sets the is in reply to property of the object.
90 * @method Base_Object set_interaction_policy( array|null $policy ) Sets the interaction policy property of the object.
91 * @method Base_Object set_likes( array $likes ) Sets the collection of likes for this object.
92 * @method Base_Object set_location( array|string|Place $location ) Sets the physical or logical locations associated with the object.
93 * @method Base_Object set_media_type( string $media_type ) Sets the MIME media type of the content property.
94 * @method Base_Object set_name( string $name ) Sets the natural language name of the object.
95 * @method Base_Object set_name_map( array|null $name_map ) Sets the name map property of the object.
96 * @method Base_Object set_preview( string $preview ) Sets the entity that provides a preview of this object.
97 * @method Base_Object set_published( string|null $published ) Sets the date and time the object was published in ISO 8601 format.
98 * @method Base_Object set_quote( string $quote ) Sets the quote property of the object (FEP-044f).
99 * @method Base_Object set_quote_url( string $quote_url ) Sets the quoteUrl property of the object.
100 * @method Base_Object set_quote_uri( string $quote_uri ) Sets the quoteUri property of the object.
101 * @method Base_Object set__misskey_quote( mixed $misskey_quote ) Sets the _misskey_quote property of the object.
102 * @method Base_Object set_replies( string|array $replies ) Sets the collection of responses to this object.
103 * @method Base_Object set_sensitive( bool|null $sensitive ) Sets the sensitive property of the object.
104 * @method Base_Object set_shares( array $shares ) Sets the collection of shares for this object.
105 * @method Base_Object set_source( array $source ) Sets the source property indicating content markup derivation.
106 * @method Base_Object set_start_time( string $start_time ) Sets the date and time describing the starting time of the object.
107 * @method Base_Object set_summary( string $summary ) Sets the natural language summary of the object.
108 * @method Base_Object set_summary_map( array|null $summary_map ) Sets the summary property of the object.
109 * @method Base_Object set_tag( array|null $tag ) Sets the tag property of the object.
110 * @method Base_Object set_to( string|string[] $to ) Sets the primary recipients of the object.
111 * @method Base_Object set_type( string $type ) Sets the type of the object.
112 * @method Base_Object set_updated( string $updated ) Sets the date and time the object was updated in ISO 8601 format.
113 * @method Base_Object set_url( string $url ) Sets the URL of the object.
114 * @method Base_Object set_former_type( string $former_type ) Sets the former type of a Tombstone object.
115 * @method Base_Object set_deleted( string $deleted ) Sets the date and time the object was deleted in ISO 8601 format.
116 */
117 class Base_Object extends Generic_Object {
118 /**
119 * The JSON-LD context for the object.
120 *
121 * @var array
122 */
123 const JSON_LD_CONTEXT = array(
124 'https://www.w3.org/ns/activitystreams',
125 array(
126 'Hashtag' => 'as:Hashtag',
127 'sensitive' => 'as:sensitive',
128 'dcterms' => 'http://purl.org/dc/terms/',
129 'gts' => 'https://gotosocial.org/ns#',
130 'schema' => 'http://schema.org/',
131 'exifData' => 'schema:exifData',
132 'PropertyValue' => 'schema:PropertyValue',
133 'interactionPolicy' => array(
134 '@id' => 'gts:interactionPolicy',
135 '@type' => '@id',
136 ),
137 'canQuote' => array(
138 '@id' => 'gts:canQuote',
139 '@type' => '@id',
140 ),
141 'canReply' => array(
142 '@id' => 'gts:canReply',
143 '@type' => '@id',
144 ),
145 'canLike' => array(
146 '@id' => 'gts:canLike',
147 '@type' => '@id',
148 ),
149 'canAnnounce' => array(
150 '@id' => 'gts:canAnnounce',
151 '@type' => '@id',
152 ),
153 'automaticApproval' => array(
154 '@id' => 'gts:automaticApproval',
155 '@type' => '@id',
156 ),
157 'manualApproval' => array(
158 '@id' => 'gts:manualApproval',
159 '@type' => '@id',
160 ),
161 'always' => array(
162 '@id' => 'gts:always',
163 '@type' => '@id',
164 ),
165 ),
166 );
167
168 /**
169 * The default types for Objects.
170 *
171 * @see https://www.w3.org/TR/activitystreams-vocabulary/#object-types
172 *
173 * @var array
174 */
175 const TYPES = array(
176 'Article',
177 'Audio',
178 'Document',
179 'Event',
180 'Image',
181 'Note',
182 'Page',
183 'Place',
184 'Profile',
185 'Relationship',
186 'Tombstone',
187 'Video',
188 );
189
190 /**
191 * The type of the object.
192 *
193 * @var string
194 */
195 protected $type = 'Object';
196
197 /**
198 * A resource attached or related to an object that potentially
199 * requires special handling.
200 * The intent is to provide a model that is at least semantically
201 * similar to attachments in email.
202 *
203 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-attachment
204 *
205 * @var string|null
206 */
207 protected $attachment;
208
209 /**
210 * One or more entities to which this object is attributed.
211 * The attributed entities might not be Actors. For instance, an
212 * object might be attributed to the completion of another activity.
213 *
214 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-attributedto
215 *
216 * @var string|null
217 */
218 protected $attributed_to;
219
220 /**
221 * One or more entities that represent the total population of
222 * entities for which the object can be considered to be relevant.
223 *
224 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-audience
225 *
226 * @var string|null
227 */
228 protected $audience;
229
230 /**
231 * The content or textual representation of the Object encoded as a
232 * JSON string. By default, the value of content is HTML.
233 * The mediaType property can be used in the object to indicate a
234 * different content type.
235 *
236 * The content MAY be expressed using multiple language-tagged
237 * values.
238 *
239 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-content
240 *
241 * @var string|null
242 */
243 protected $content;
244
245 /**
246 * The context within which the object exists or an activity was
247 * performed.
248 * The notion of "context" used is intentionally vague.
249 * The intended function is to serve as a means of grouping objects
250 * and activities that share a common originating context or
251 * purpose. An example could be all activities relating to a common
252 * project or event.
253 *
254 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-context
255 *
256 * @var string|null
257 */
258 protected $context;
259
260 /**
261 * The content MAY be expressed using multiple language-tagged
262 * values.
263 *
264 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-content
265 *
266 * @var array|null
267 */
268 protected $content_map;
269
270 /**
271 * The date and time at which the object was deleted.
272 *
273 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-deleted
274 *
275 * @var string|null
276 */
277 protected $deleted;
278
279 /**
280 * The former type of the object. Used in Tombstone objects to
281 * indicate the type of the object prior to deletion.
282 *
283 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-formertype
284 *
285 * @var string|null
286 */
287 protected $former_type;
288
289 /**
290 * A simple, human-readable, plain-text name for the object.
291 * HTML markup MUST NOT be included.
292 *
293 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-name
294 *
295 * @var string|null xsd:string
296 */
297 protected $name;
298
299 /**
300 * The name MAY be expressed using multiple language-tagged values.
301 *
302 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-name
303 *
304 * @var array|null rdf:langString
305 */
306 protected $name_map;
307
308 /**
309 * The date and time describing the actual or expected ending time
310 * of the object.
311 * When used with an Activity object, for instance, the endTime
312 * property specifies the moment the activity concluded or
313 * is expected to conclude.
314 *
315 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-endtime
316 *
317 * @var string|null
318 */
319 protected $end_time;
320
321 /**
322 * The entity (e.g. an application) that generated the object.
323 *
324 * @var string|null
325 */
326 protected $generator;
327
328 /**
329 * An entity that describes an icon for this object.
330 * The image should have an aspect ratio of one (horizontal)
331 * to one (vertical) and should be suitable for presentation
332 * at a small size.
333 *
334 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-icon
335 *
336 * @var string|array|null
337 */
338 protected $icon;
339
340 /**
341 * An entity that describes an image for this object.
342 * Unlike the icon property, there are no aspect ratio
343 * or display size limitations assumed.
344 *
345 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-image-term
346 *
347 * @var string|array|null
348 */
349 protected $image;
350
351 /**
352 * One or more entities for which this object is considered a
353 * response.
354 *
355 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-inreplyto
356 *
357 * @var string|null
358 */
359 protected $in_reply_to;
360
361 /**
362 * One or more physical or logical locations associated with the
363 * object.
364 *
365 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-location
366 *
367 * @var string|null|Place
368 */
369 protected $location;
370
371 /**
372 * An entity that provides a preview of this object.
373 *
374 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-preview
375 *
376 * @var string|null
377 */
378 protected $preview;
379
380 /**
381 * The date and time at which the object was published
382 *
383 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-published
384 *
385 * @var string|null xsd:dateTime
386 */
387 protected $published;
388
389 /**
390 * The date and time describing the actual or expected starting time
391 * of the object.
392 * When used with an Activity object, for instance, the startTime
393 * property specifies the moment the activity began
394 * or is scheduled to begin.
395 *
396 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-starttime
397 *
398 * @var string|null xsd:dateTime
399 */
400 protected $start_time;
401
402 /**
403 * A natural language summarization of the object encoded as HTML.
404 * Multiple language tagged summaries MAY be provided.
405 *
406 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-summary
407 *
408 * @var string|null
409 */
410 protected $summary;
411
412 /**
413 * The content MAY be expressed using multiple language-tagged
414 * values.
415 *
416 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-summary
417 *
418 * @var string[]|null
419 */
420 protected $summary_map;
421
422 /**
423 * One or more "tags" that have been associated with an objects.
424 * A tag can be any kind of Object.
425 * The key difference between attachment and tag is that the former
426 * implies association by inclusion, while the latter implies
427 * associated by reference.
428 *
429 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-tag
430 *
431 * @var string|null
432 */
433 protected $tag;
434
435 /**
436 * The date and time at which the object was updated
437 *
438 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-updated
439 *
440 * @var string|null xsd:dateTime
441 */
442 protected $updated;
443
444 /**
445 * One or more links to representations of the object.
446 *
447 * @var string|null
448 */
449 protected $url;
450
451 /**
452 * An entity considered to be part of the public primary audience
453 * of an Object
454 *
455 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-to
456 *
457 * @var string|array|null
458 */
459 protected $to;
460
461 /**
462 * An Object that is part of the private primary audience of this
463 * Object.
464 *
465 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-bto
466 *
467 * @var string|array|null
468 */
469 protected $bto;
470
471 /**
472 * An Object that is part of the public secondary audience of this
473 * Object.
474 *
475 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-cc
476 *
477 * @var string|array|null
478 */
479 protected $cc;
480
481 /**
482 * One or more Objects that are part of the private secondary
483 * audience of this Object.
484 *
485 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-bcc
486 *
487 * @var string|array|null
488 */
489 protected $bcc;
490
491 /**
492 * The MIME media type of the value of the content property.
493 * If not specified, the content property is assumed to contain
494 * text/html content.
495 *
496 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-mediatype
497 *
498 * @var string|null
499 */
500 protected $media_type;
501
502 /**
503 * When the object describes a time-bound resource, such as an audio
504 * or video, a meeting, etc., the duration property indicates the
505 * object's approximate duration.
506 * The value MUST be expressed as a xsd:duration as defined by
507 * xmlschema11-2, section 3.3.6 (e.g. a period of 5 seconds is
508 * represented as "PT5S").
509 *
510 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
511 *
512 * @var string|null
513 */
514 protected $duration;
515
516 /**
517 * Intended to convey some sort of source from which the content
518 * markup was derived, as a form of provenance, or to support
519 * future editing by clients.
520 *
521 * @see https://www.w3.org/TR/activitypub/#source-property
522 *
523 * @var array|null
524 */
525 protected $source;
526
527 /**
528 * A Collection containing objects considered to be responses to
529 * this object.
530 *
531 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-replies
532 *
533 * @var string|array|null
534 */
535 protected $replies;
536
537 /**
538 * A Collection containing objects considered to be likes for
539 * this object.
540 *
541 * @see https://www.w3.org/TR/activitypub/#likes
542 *
543 * @var array|null
544 */
545 protected $likes;
546
547 /**
548 * A Collection containing objects considered to be shares for
549 * this object.
550 *
551 * @see https://www.w3.org/TR/activitypub/#shares
552 *
553 * @var array|null
554 */
555 protected $shares;
556
557 /**
558 * Used to mark an object as containing sensitive content.
559 * Mastodon displays a content warning, requiring users to click
560 * through to view the content.
561 *
562 * @see https://docs.joinmastodon.org/spec/activitypub/#sensitive
563 *
564 * @var boolean|null
565 */
566 protected $sensitive;
567
568 /**
569 * The dcterms namespace.
570 *
571 * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/b2b8/fep-b2b8.md#sensitive
572 * @see https://www.dublincore.org/specifications/dublin-core/dcmi-terms/
573 *
574 * @var array|null
575 */
576 protected $dcterms;
577
578 /**
579 * Interaction policy is an attempt to limit the harmful effects of unwanted replies and
580 * other interactions on a user's posts (e.g., "reply guys").
581 *
582 * It is also used by Mastodon to limit the ability to quote posts.
583 *
584 * @see https://docs.gotosocial.org/en/latest/federation/interaction_policy/
585 * @see https://blog.joinmastodon.org/2025/09/introducing-quote-posts/
586 *
587 * @var array|null
588 */
589 protected $interaction_policy;
590
591 /**
592 * Fediverse Enhancement Proposal 044f: Quote Property
593 *
594 * @see https://codeberg.org/fediverse/fep/src/branch/main/fep/044f/fep-044f.md
595 * @see https://w3id.org/fep/044f#quote
596 *
597 * @var string|null
598 */
599 protected $quote;
600
601 /**
602 * ActivityStreams quoteUrl property.
603 *
604 * @see https://www.w3.org/ns/activitystreams#quoteUrl
605 *
606 * @var string|null
607 */
608 protected $quote_url;
609
610 /**
611 * Fedibird-specific quoteUri property.
612 *
613 * @see https://fedibird.com/ns#quoteUri
614 *
615 * @var string|null
616 */
617 protected $quote_uri;
618
619 /**
620 * Misskey-specific quote property.
621 *
622 * @see https://misskey-hub.net/ns/#_misskey_quote
623 *
624 * @var string|null
625 */
626 protected $_misskey_quote; // phpcs:ignore PSR2.Classes.PropertyDeclaration.Underscore
627
628 /**
629 * Generic getter.
630 *
631 * @param string $key The key to get.
632 *
633 * @return mixed The value.
634 */
635 public function get( $key ) {
636 if ( ! $this->has( $key ) ) {
637 return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) );
638 }
639
640 return parent::get( $key );
641 }
642
643 /**
644 * Generic setter.
645 *
646 * @param string $key The key to set.
647 * @param string $value The value to set.
648 *
649 * @return mixed The value.
650 */
651 public function set( $key, $value ) {
652 if ( ! $this->has( $key ) ) {
653 return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) );
654 }
655
656 return parent::set( $key, $value );
657 }
658
659 /**
660 * Generic adder.
661 *
662 * @param string $key The key to set.
663 * @param mixed $value The value to add.
664 *
665 * @return mixed The value.
666 */
667 public function add( $key, $value ) {
668 if ( ! $this->has( $key ) ) {
669 return new \WP_Error( 'invalid_key', __( 'Invalid key', 'activitypub' ), array( 'status' => 404 ) );
670 }
671
672 return parent::add( $key, $value );
673 }
674 }
675