-
Notifications
You must be signed in to change notification settings - Fork 84
Implement a proper Tombstone handling #2066
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 9 commits
Commits
Show all changes
23 commits
Select commit
Hold shift + click to select a range
3c068c9
Refactor tombstone handling into Tombstone class
pfefferle 7193a64
Refactor Tombstone type check logic
pfefferle 48f196f
Add tests for new Tombstone check methods
pfefferle f2417fa
Merge branch 'trunk' into add/tombstone
pfefferle 37ae91c
Add changelog
matticbot 7ea9925
Apply suggestion from @Copilot
pfefferle f6722aa
Apply suggestion from @Copilot
pfefferle 3831be1
Apply suggestion from @Copilot
pfefferle c8b85ee
Apply suggestion from @Copilot
pfefferle b550579
Update WP_Error type hint in docblock
obenland 2ed8bc5
Merge branch 'trunk' into add/tombstone
pfefferle 56c8d14
Update templates/tombstone-json.php
pfefferle 823c8ca
Update templates/tombstone-json.php
pfefferle 05315c1
change to `is_gone`
pfefferle 57718e4
Check for `get_error_data`
pfefferle 097e649
Merge branch 'trunk' into add/tombstone
pfefferle 546cfab
Send `Delete` Activity on User-Delete (#2035)
pfefferle e328903
Merge branch 'trunk' into add/tombstone
pfefferle 28804b2
Remove redundant error code check in Tombstone class
pfefferle 1d00beb
Refactor Tombstone API to use 'exists' naming
pfefferle 576cf22
Update deprecated function reference in is_tombstone
pfefferle 04273e4
Improve and expand docblocks in Tombstone class
pfefferle 82e70ca
Merge branch 'trunk' into add/tombstone
pfefferle File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
Significance: minor | ||
Type: added | ||
|
||
Improved handling of deleted content with a new unified system for better tracking and compatibility. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
<?php | ||
/** | ||
* Tombstone class file. | ||
* | ||
* @package Activitypub | ||
*/ | ||
|
||
namespace Activitypub; | ||
|
||
use Activitypub\Activity\Base_Object; | ||
|
||
/** | ||
* ActivityPub Tombstone Class. | ||
*/ | ||
class Tombstone { | ||
/** | ||
* HTTP codes that indicate a tombstone. | ||
* | ||
* @var array | ||
*/ | ||
private static $codes = array( 404, 410 ); | ||
|
||
/** | ||
* Check for Tombstone. | ||
* | ||
* @param string|\WP_Error|array|object $various The various data to check. | ||
* | ||
* @return bool True if the various data is a tombstone. | ||
*/ | ||
public static function check( $various ) { | ||
pfefferle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
if ( \is_wp_error( $various ) ) { | ||
return self::check_wp_error( $various ); | ||
} | ||
|
||
if ( \is_string( $various ) ) { | ||
if ( is_same_domain( $various ) ) { | ||
pfefferle marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return self::check_local_url( $various ); | ||
} | ||
return self::check_remote_url( $various ); | ||
} | ||
|
||
if ( \is_array( $various ) ) { | ||
return self::check_array( $various ); | ||
} | ||
|
||
if ( \is_object( $various ) ) { | ||
return self::check_object( $various ); | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* Check for remote URL for Tombstone. | ||
* | ||
* @param string $url The URL to check. | ||
* | ||
* @return bool True if the URL is a tombstone. | ||
*/ | ||
public static function check_remote_url( $url ) { | ||
/** | ||
* Fires before checking if the URL is a tombstone. | ||
* | ||
* @param string $url The URL to check. | ||
*/ | ||
\do_action( 'activitypub_pre_http_is_tombstone', $url ); | ||
|
||
$response = \wp_safe_remote_get( $url, array( 'headers' => array( 'Accept' => 'application/activity+json' ) ) ); | ||
$code = \wp_remote_retrieve_response_code( $response ); | ||
|
||
if ( in_array( (int) $code, self::$codes, true ) ) { | ||
return true; | ||
} | ||
|
||
$data = \wp_remote_retrieve_body( $response ); | ||
$data = \json_decode( $data, true ); | ||
|
||
return self::check_array( $data ); | ||
} | ||
|
||
/** | ||
* Check for local URL for Tombstone. | ||
* | ||
* @param string $url The URL to check. | ||
* | ||
* @return bool True if the URL is a tombstone. | ||
*/ | ||
public static function check_local_url( $url ) { | ||
$urls = get_option( 'activitypub_tombstone_urls', array() ); | ||
|
||
return in_array( normalize_url( $url ), $urls, true ); | ||
pfefferle marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
/** | ||
* Check if the response is a WP_Error. | ||
* | ||
* @param WP_Error $wp_error The response to check. | ||
* | ||
* @return bool True if the response is a WP_Error, false otherwise. | ||
*/ | ||
public static function check_wp_error( $wp_error ) { | ||
if ( ! \is_wp_error( $wp_error ) ) { | ||
return false; | ||
} | ||
|
||
if ( in_array( (int) $wp_error->get_error_code(), self::$codes, true ) ) { | ||
pfefferle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* Check if the given array represents a tombstone. | ||
* | ||
* @param array $data The array to check. | ||
* | ||
* @return bool True if the array represents a tombstone, false otherwise. | ||
*/ | ||
public static function check_array( $data ) { | ||
pfefferle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
if ( ! \is_array( $data ) ) { | ||
return false; | ||
} | ||
|
||
if ( isset( $data['type'] ) && 'Tombstone' === $data['type'] ) { | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* Check if the given object represents a tombstone. | ||
* | ||
* @param object $data The object to check. | ||
* | ||
* @return bool True if the object represents a tombstone, false otherwise. | ||
*/ | ||
public static function check_object( $data ) { | ||
if ( ! \is_object( $data ) ) { | ||
return false; | ||
} | ||
|
||
if ( isset( $data->type ) && 'Tombstone' === $data->type ) { | ||
return true; | ||
} | ||
|
||
if ( $data instanceof Base_Object && 'Tombstone' === $data->get_type() ) { | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* Bury a URL. | ||
* | ||
* @param string $url The URL to bury. | ||
*/ | ||
public static function bury( $url ) { | ||
pfefferle marked this conversation as resolved.
Show resolved
Hide resolved
|
||
$urls = \get_option( 'activitypub_tombstone_urls', array() ); | ||
$urls[] = normalize_url( $url ); | ||
pfefferle marked this conversation as resolved.
Show resolved
Hide resolved
|
||
$urls = \array_unique( $urls ); | ||
|
||
\update_option( 'activitypub_tombstone_urls', $urls ); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
<?php | ||
/** | ||
* Tombstone JSON template. | ||
* | ||
* @package Activitypub | ||
*/ | ||
|
||
$object = new \Activitypub\Activity\Base_Object(); | ||
$object->set_id( \Activitypub\Query::get_instance()->get_request_url() ); | ||
$object->set_type( 'Tombstone' ); | ||
|
||
/** | ||
* Fires before an ActivityPub object is generated and sent to the client. | ||
* | ||
* @param object $object The ActivityPub object. | ||
pfefferle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
*/ | ||
\do_action( 'activitypub_json_pre', $object ); | ||
|
||
\header( 'Content-Type: application/activity+json' ); | ||
echo $object->to_json(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped | ||
|
||
/** | ||
* Fires after an ActivityPub object is generated and sent to the client. | ||
* | ||
* @param object $object The ActivityPub object. | ||
pfefferle marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
*/ | ||
\do_action( 'activitypub_json_post', $object ); |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.