Support for processing Undo / Delete
rodzic
6498267448
commit
c2f14fc910
|
@ -63,6 +63,7 @@ Please take note of [CRAPL v0](https://matt.might.net/articles/crapl/):
|
|||
* ✅ User can follow, unfollow, block, and unblock external accounts
|
||||
* ✅ Server validates the HTTP Message Signatures of all incoming messages
|
||||
* ✅ Incoming messages are saved
|
||||
* ✅ Process Undo / Delete messages (Unfollow, delete post, remove Like, remove Announce)
|
||||
* ✅ User can read incoming messages (Create, Update, Announce, Like)
|
||||
* ✅ User can read the results of polls
|
||||
* ✅ User can see attached images, videos, audio
|
||||
|
@ -79,7 +80,6 @@ Please take note of [CRAPL v0](https://matt.might.net/articles/crapl/):
|
|||
* ❌ Thread replies in context
|
||||
* ❌ Delete own post
|
||||
* ❌ Update own post
|
||||
* ❌ Receive Undo messages (Unfollow, delete post, remove Like, remove Announce)
|
||||
* ❌ Create Polls
|
||||
* ❌ Attach multiple images
|
||||
* ❌ Set focus point for images
|
||||
|
|
59
index.php
59
index.php
|
@ -248,6 +248,13 @@
|
|||
$inbox_message = $body;
|
||||
$inbox_type = $inbox_message["type"];
|
||||
|
||||
// If this is an Undo or Delete message, try to process it
|
||||
if ( "Undo" == $inbox_type || "Delete" == $inbox_type ) {
|
||||
undo( $inbox_message );
|
||||
die();
|
||||
}
|
||||
|
||||
|
||||
// Messages to ignore.
|
||||
// Some servers are very chatty. They send lots of irrelevant messages.
|
||||
// Before even bothering to validate them, we can delete them.
|
||||
|
@ -1545,7 +1552,6 @@ HTML;
|
|||
// This is usually in the form `https://example.com/user/username#main-key`
|
||||
// This is to differentiate if the user has multiple keys
|
||||
// TODO: Check the actual key
|
||||
|
||||
$userData = getDataFromURl( $publicKeyURL );
|
||||
$publicKey = $userData["publicKey"]["publicKeyPem"];
|
||||
|
||||
|
@ -1656,6 +1662,57 @@ HTML;
|
|||
die();
|
||||
}
|
||||
|
||||
// Perform the Undo action requested
|
||||
function undo( $message) {
|
||||
global $server, $directories;
|
||||
|
||||
// Validate HTTP Message Signature
|
||||
if ( !verifyHTTPSignature() ) { die(); }
|
||||
|
||||
// Get some basic data
|
||||
$type = $message["type"];
|
||||
// The thing being undone
|
||||
$object = $message["object"];
|
||||
$object_id = $object["id"];
|
||||
$object_type = $object["type"];
|
||||
|
||||
// Find all the inbox messages which have that ID
|
||||
$inbox_files = glob( $directories["inbox"] . "/*.json" );
|
||||
foreach ( $inbox_files as $inbox_file ) {
|
||||
// Load the contents
|
||||
$inbox_item = json_decode( file_get_contents( $inbox_file ), true );
|
||||
// Find the ID
|
||||
if ( isset( $inbox_item["object"]["id"] ) ) {
|
||||
$inbox_id = $inbox_item["object"]["id"];
|
||||
} else if ( isset ($inbox_item["id"] )) {
|
||||
$inbox_id = $inbox_item["id"];
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this has the same ID as the item being undone
|
||||
if ( $inbox_id == $object_id ) {
|
||||
// Delete the file
|
||||
unlink( $inbox_file );
|
||||
|
||||
// If this was the undoing of a follow request, remove the external user from followers 😢
|
||||
if ( "Follow" == $object_type ) {
|
||||
$actor = $object["actor"];
|
||||
$follower_filename = urlencode( $actor );
|
||||
unlink( $directories["followers"] . "/{$follower_filename}.json" );
|
||||
}
|
||||
// Stop looping
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If the message is valid, save the message in `/data/inbox/`
|
||||
$uuid = uuid();
|
||||
$filename = $uuid . "." . urlencode( $type ) . ".json";
|
||||
file_put_contents( $directories["inbox"] . "/{$filename}", json_encode( $message ) );
|
||||
}
|
||||
|
||||
|
||||
// "One to stun, two to kill, three to make sure"
|
||||
die();
|
||||
|
|
Ładowanie…
Reference in New Issue