wip: add former_type to tombstone

This commit is contained in:
Felix 2020-04-29 21:10:50 +02:00
parent c43f06124a
commit 770dcbdc49
5 changed files with 21 additions and 9 deletions

View file

@ -39,7 +39,7 @@ impl ToApub for Comment {
impl ToTombstone for Comment { impl ToTombstone for Comment {
fn to_tombstone(&self) -> Result<Tombstone, Error> { fn to_tombstone(&self) -> Result<Tombstone, Error> {
create_tombstone(self.deleted, &self.ap_id, self.published, self.updated) create_tombstone(self.deleted, &self.ap_id, self.published, self.updated, NoteType.to_string())
} }
} }

View file

@ -1,4 +1,5 @@
use super::*; use super::*;
use activitystreams::actor::kind::GroupType;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct CommunityQuery { pub struct CommunityQuery {
@ -49,7 +50,7 @@ impl ToApub for Community {
impl ToTombstone for Community { impl ToTombstone for Community {
fn to_tombstone(&self) -> Result<Tombstone, Error> { fn to_tombstone(&self) -> Result<Tombstone, Error> {
create_tombstone(self.deleted, &self.actor_id, self.published, self.updated) create_tombstone(self.deleted, &self.actor_id, self.published, self.updated, GroupType.to_string())
} }
} }

View file

@ -19,6 +19,9 @@ use activitystreams::{
object::{properties::ObjectProperties, Note, Page, Tombstone}, object::{properties::ObjectProperties, Note, Page, Tombstone},
public, BaseBox, public, BaseBox,
}; };
use activitystreams::object::kind::{NoteType, PageType};
use crate::api::community::CommunityResponse;
use crate::websocket::server::SendCommunityRoomMessage;
use actix_web::body::Body; use actix_web::body::Body;
use actix_web::web::Path; use actix_web::web::Path;
use actix_web::{web, HttpRequest, HttpResponse, Result}; use actix_web::{web, HttpRequest, HttpResponse, Result};
@ -64,6 +67,7 @@ use chrono::NaiveDateTime;
use fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user}; use fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user};
use signatures::verify; use signatures::verify;
use signatures::{sign, PublicKey, PublicKeyExtension}; use signatures::{sign, PublicKey, PublicKeyExtension};
use activitystreams::primitives::XsdString;
type GroupExt = Ext<Ext<Group, ApActorProperties>, PublicKeyExtension>; type GroupExt = Ext<Ext<Group, ApActorProperties>, PublicKeyExtension>;
type PersonExt = Ext<Ext<Person, ApActorProperties>, PublicKeyExtension>; type PersonExt = Ext<Ext<Person, ApActorProperties>, PublicKeyExtension>;
@ -87,6 +91,7 @@ where
.content_type(APUB_JSON_CONTENT_TYPE) .content_type(APUB_JSON_CONTENT_TYPE)
.json(data) .json(data)
} }
fn create_apub_tombstone_response<T>(data: &T) -> HttpResponse<Body> fn create_apub_tombstone_response<T>(data: &T) -> HttpResponse<Body>
where where
T: Serialize, T: Serialize,
@ -158,6 +163,7 @@ fn create_tombstone(
object_id: &str, object_id: &str,
published: NaiveDateTime, published: NaiveDateTime,
updated: Option<NaiveDateTime>, updated: Option<NaiveDateTime>,
former_type: String,
) -> Result<Tombstone, Error> { ) -> Result<Tombstone, Error> {
if deleted { if deleted {
let mut tombstone = Tombstone::default(); let mut tombstone = Tombstone::default();
@ -165,12 +171,13 @@ fn create_tombstone(
tombstone tombstone
.object_props .object_props
.set_id(object_id)? .set_id(object_id)?
.set_published(convert_datetime(published))?; .set_published(convert_datetime(published));
if let Some(updated) = updated { if let Some(updated) = updated {
tombstone tombstone
.object_props .object_props
.set_updated(convert_datetime(updated))?; .set_updated(convert_datetime(updated))?;
} }
tombstone.tombstone_props.set_former_type_object_box(XsdString::from_string(former_type))?;
Ok(tombstone) Ok(tombstone)
} else { } else {
Err(format_err!( Err(format_err!(

View file

@ -61,7 +61,7 @@ impl ToApub for Post {
impl ToTombstone for Post { impl ToTombstone for Post {
fn to_tombstone(&self) -> Result<Tombstone, Error> { fn to_tombstone(&self) -> Result<Tombstone, Error> {
create_tombstone(self.deleted, &self.ap_id, self.published, self.updated) create_tombstone(self.deleted, &self.ap_id, self.published, self.updated, PageType.to_string())
} }
} }

View file

@ -1,6 +1,4 @@
use super::*; use super::*;
use crate::api::community::CommunityResponse;
use crate::websocket::server::SendCommunityRoomMessage;
#[serde(untagged)] #[serde(untagged)]
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
@ -66,8 +64,7 @@ pub async fn shared_inbox(
receive_dislike_comment(&d, &request, &conn, chat_server) receive_dislike_comment(&d, &request, &conn, chat_server)
} }
(SharedAcceptedObjects::Delete(d), Some("Tombstone")) => { (SharedAcceptedObjects::Delete(d), Some("Tombstone")) => {
// TODO: is this deleting a community, post, comment or what? receive_delete(&d, &request, &conn, chat_server)
receive_delete_community(&d, &request, &conn, chat_server)
} }
_ => Err(format_err!("Unknown incoming activity type.")), _ => Err(format_err!("Unknown incoming activity type.")),
} }
@ -511,7 +508,7 @@ fn receive_dislike_comment(
Ok(HttpResponse::Ok().finish()) Ok(HttpResponse::Ok().finish())
} }
fn receive_delete_community( fn receive_delete(
delete: &Delete, delete: &Delete,
request: &HttpRequest, request: &HttpRequest,
conn: &PgConnection, conn: &PgConnection,
@ -524,6 +521,13 @@ fn receive_delete_community(
.unwrap() .unwrap()
.to_owned() .to_owned()
.to_concrete::<Tombstone>()?; .to_concrete::<Tombstone>()?;
// TODO: not sure how to handle formerType (should be a string)
// https://www.w3.org/TR/activitystreams-vocabulary/#dfn-formertype
let former_type: &str = tombstone.tombstone_props.get_former_type_object_box().unwrap().to_concrete::<String>();
match former_type {
"Group" => {},
d => return Err(format_err!("Delete type {} not supported", d)),
}
let community_apub_id = tombstone.object_props.get_id().unwrap().to_string(); let community_apub_id = tombstone.object_props.get_id().unwrap().to_string();
let community = Community::read_from_actor_id(conn, &community_apub_id)?; let community = Community::read_from_actor_id(conn, &community_apub_id)?;