Remove AsObject
This commit is contained in:
@@ -519,146 +519,6 @@ pub trait AsActor<C> {
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
pub trait AsObject<A, V, C>
|
||||
where
|
||||
V: activitypub::Activity,
|
||||
{
|
||||
/// What kind of error is returned when something fails
|
||||
type Error;
|
||||
|
||||
/// What is returned by `AsObject::activity`, if anything is returned
|
||||
type Output = ();
|
||||
|
||||
/// Handle a specific type of activity dealing with this type of objects.
|
||||
///
|
||||
/// The implementations should check that the actor is actually authorized
|
||||
/// to perform this action.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// - `self`: the object on which the activity acts
|
||||
/// - `ctx`: the context passed to `Inbox::handle`
|
||||
/// - `actor`: the actor who did this activity
|
||||
/// - `id`: the ID of this activity
|
||||
fn activity(self, ctx: C, actor: A, id: &str) -> Result<Self::Output, Self::Error>;
|
||||
}
|
||||
|
||||
/// Should be implemented by anything representing an ActivityPub object.
|
||||
///
|
||||
/// # Type parameters
|
||||
///
|
||||
/// - `A`: the actor type
|
||||
/// - `V`: the ActivityPub verb/activity
|
||||
/// - `O`: the ActivityPub type of the Object for this activity (usually the type corresponding to `Self`)
|
||||
/// - `C`: the context needed to handle the activity (usually a database connection)
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// An implementation of AsObject that handles Note creation by an Account model,
|
||||
/// representing the Note by a Message type, without any specific context.
|
||||
///
|
||||
/// ```rust
|
||||
/// # extern crate activitypub;
|
||||
/// # use activitypub::{activity::Create, actor::Person, object::Note};
|
||||
/// # use plume_common::activity_pub::inbox::{AsActor, AsObject, FromId};
|
||||
/// # use plume_common::activity_pub::sign::{gen_keypair, Error as SignError, Result as SignResult, Signer};
|
||||
/// # use openssl::{hash::MessageDigest, pkey::PKey, rsa::Rsa};
|
||||
/// # use once_cell::sync::Lazy;
|
||||
/// #
|
||||
/// # static MY_SIGNER: Lazy<MySigner> = Lazy::new(|| MySigner::new());
|
||||
/// #
|
||||
/// # struct MySigner {
|
||||
/// # public_key: String,
|
||||
/// # private_key: String,
|
||||
/// # }
|
||||
/// #
|
||||
/// # impl MySigner {
|
||||
/// # fn new() -> Self {
|
||||
/// # let (pub_key, priv_key) = gen_keypair();
|
||||
/// # Self {
|
||||
/// # public_key: String::from_utf8(pub_key).unwrap(),
|
||||
/// # private_key: String::from_utf8(priv_key).unwrap(),
|
||||
/// # }
|
||||
/// # }
|
||||
/// # }
|
||||
/// #
|
||||
/// # impl Signer for MySigner {
|
||||
/// # fn get_key_id(&self) -> String {
|
||||
/// # "mysigner".into()
|
||||
/// # }
|
||||
/// #
|
||||
/// # fn sign(&self, to_sign: &str) -> SignResult<Vec<u8>> {
|
||||
/// # let key = PKey::from_rsa(Rsa::private_key_from_pem(self.private_key.as_ref()).unwrap())
|
||||
/// # .unwrap();
|
||||
/// # let mut signer = openssl::sign::Signer::new(MessageDigest::sha256(), &key).unwrap();
|
||||
/// # signer.update(to_sign.as_bytes()).unwrap();
|
||||
/// # signer.sign_to_vec().map_err(|_| SignError())
|
||||
/// # }
|
||||
/// #
|
||||
/// # fn verify(&self, data: &str, signature: &[u8]) -> SignResult<bool> {
|
||||
/// # let key = PKey::from_rsa(Rsa::public_key_from_pem(self.public_key.as_ref()).unwrap())
|
||||
/// # .unwrap();
|
||||
/// # let mut verifier = openssl::sign::Verifier::new(MessageDigest::sha256(), &key).unwrap();
|
||||
/// # verifier.update(data.as_bytes()).unwrap();
|
||||
/// # verifier.verify(&signature).map_err(|_| SignError())
|
||||
/// # }
|
||||
/// # }
|
||||
/// #
|
||||
/// # struct Account;
|
||||
/// # impl FromId<()> for Account {
|
||||
/// # type Error = ();
|
||||
/// # type Object = Person;
|
||||
/// #
|
||||
/// # fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
|
||||
/// # Ok(Account)
|
||||
/// # }
|
||||
/// #
|
||||
/// # fn from_activity(_: &(), obj: Person) -> Result<Self, Self::Error> {
|
||||
/// # Ok(Account)
|
||||
/// # }
|
||||
/// #
|
||||
/// # fn get_sender() -> &'static dyn Signer {
|
||||
/// # &*MY_SIGNER
|
||||
/// # }
|
||||
/// # }
|
||||
/// # impl AsActor<()> for Account {
|
||||
/// # fn get_inbox_url(&self) -> String {
|
||||
/// # String::new()
|
||||
/// # }
|
||||
/// # fn is_local(&self) -> bool { false }
|
||||
/// # }
|
||||
/// #[derive(Debug)]
|
||||
/// struct Message {
|
||||
/// text: String,
|
||||
/// }
|
||||
///
|
||||
/// impl FromId<()> for Message {
|
||||
/// type Error = ();
|
||||
/// type Object = Note;
|
||||
///
|
||||
/// fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
|
||||
/// Ok(Message { text: "From DB".into() })
|
||||
/// }
|
||||
///
|
||||
/// fn from_activity(_: &(), obj: Note) -> Result<Self, Self::Error> {
|
||||
/// Ok(Message { text: obj.object_props.content_string().map_err(|_| ())? })
|
||||
/// }
|
||||
///
|
||||
/// fn get_sender() -> &'static dyn Signer {
|
||||
/// &*MY_SIGNER
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// impl AsObject<Account, Create, ()> for Message {
|
||||
/// type Error = ();
|
||||
/// type Output = ();
|
||||
///
|
||||
/// fn activity(self, _: (), _actor: Account, _id: &str) -> Result<(), ()> {
|
||||
/// println!("New Note: {:?}", self);
|
||||
/// Ok(())
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
pub trait AsObject07<A, V, C>
|
||||
where
|
||||
V: activitystreams::markers::Activity,
|
||||
@@ -769,47 +629,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
struct MyObject;
|
||||
impl AsObject<MyActor, Create, &()> for MyObject {
|
||||
type Error = ();
|
||||
type Output = ();
|
||||
|
||||
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
|
||||
println!("MyActor is creating a Note");
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl AsObject<MyActor, Like, &()> for MyObject {
|
||||
type Error = ();
|
||||
type Output = ();
|
||||
|
||||
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
|
||||
println!("MyActor is liking a Note");
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl AsObject<MyActor, Delete, &()> for MyObject {
|
||||
type Error = ();
|
||||
type Output = ();
|
||||
|
||||
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
|
||||
println!("MyActor is deleting a Note");
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl AsObject<MyActor, Announce, &()> for MyObject {
|
||||
type Error = ();
|
||||
type Output = ();
|
||||
|
||||
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
|
||||
println!("MyActor is announcing a Note");
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
struct MyObject07;
|
||||
impl FromId<()> for MyObject07 {
|
||||
type Error = ();
|
||||
@@ -962,21 +781,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
impl AsObject<FailingActor, Create, &()> for MyObject {
|
||||
type Error = ();
|
||||
type Output = ();
|
||||
|
||||
fn activity(
|
||||
self,
|
||||
_: &(),
|
||||
_actor: FailingActor,
|
||||
_id: &str,
|
||||
) -> Result<Self::Output, Self::Error> {
|
||||
println!("FailingActor is creating a Note");
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl FromId<()> for FailingActor {
|
||||
type Error = ();
|
||||
type Object = Person07;
|
||||
|
||||
Reference in New Issue
Block a user