diff --git a/src/models/blogs.rs b/src/models/blogs.rs index 6fd78b5..fd5ec9b 100644 --- a/src/models/blogs.rs +++ b/src/models/blogs.rs @@ -16,8 +16,9 @@ use openssl::{ }; use webfinger::*; +use BASE_URL; use activity_pub::{ - ApSignature, ActivityStream, Id, IntoId, + ApSignature, ActivityStream, Id, IntoId, PublicKey, inbox::WithInbox, sign }; @@ -60,6 +61,8 @@ const BLOG_PREFIX: &'static str = "~"; impl Blog { insert!(blogs, NewBlog); get!(blogs); + find_by!(blogs, find_by_ap_url, ap_url as String); + find_by!(blogs, find_by_name, actor_id as String, instance_id as i32); pub fn get_instance(&self, conn: &PgConnection) -> Instance { Instance::get(conn, self.instance_id).expect("Couldn't find instance") @@ -73,8 +76,6 @@ impl Blog { .expect("Couldn't load blogs ") } - find_by!(blogs, find_by_name, actor_id as String, instance_id as i32); - pub fn find_local(conn: &PgConnection, name: String) -> Option { Blog::find_by_name(conn, name, Instance::local_id(conn)) } @@ -144,8 +145,23 @@ impl Blog { }) } - pub fn into_activity(&self, _conn: &PgConnection) -> Group { - Group::default() // TODO + pub fn into_activity(&self, _conn: &PgConnection) -> CustomGroup { + let mut blog = Group::default(); + blog.ap_actor_props.set_preferred_username_string(self.actor_id.clone()).expect("Blog::into_activity: preferredUsername error"); + blog.object_props.set_name_string(self.title.clone()).expect("Blog::into_activity: name error"); + blog.ap_actor_props.set_outbox_string(self.outbox_url.clone()).expect("Blog::into_activity: outbox error"); + blog.ap_actor_props.set_inbox_string(self.inbox_url.clone()).expect("Blog::into_activity: inbox error"); + blog.object_props.set_summary_string(self.summary.clone()).expect("Blog::into_activity: summary error"); + blog.object_props.set_id_string(self.ap_url.clone()).expect("Blog::into_activity: id error"); + + let mut public_key = PublicKey::default(); + public_key.set_id_string(format!("{}#main-key", self.ap_url)).expect("Blog::into_activity: publicKey.id error"); + public_key.set_owner_string(self.ap_url.clone()).expect("Blog::into_activity: publicKey.owner error"); + public_key.set_public_key_pem_string(self.public_key.clone()).expect("Blog::into_activity: publicKey.publicKeyPem error"); + let mut ap_signature = ApSignature::default(); + ap_signature.set_public_key_publickey(public_key).expect("Blog::into_activity: publicKey error"); + + CustomGroup::new(blog, ap_signature) } pub fn update_boxes(&self, conn: &PgConnection) { @@ -208,13 +224,16 @@ impl Blog { } } - // FIXME: see User::from_url for correct behavior pub fn from_url(conn: &PgConnection, url: String) -> Option { - blogs::table.filter(blogs::ap_url.eq(url)) - .limit(1) - .load::(conn) - .expect("Error loading blog from url") - .into_iter().nth(0) + Blog::find_by_ap_url(conn, url.clone()).or_else(|| { + // The requested user was not in the DB + // We try to fetch it if it is remote + if Url::parse(url.as_ref()).unwrap().host_str().unwrap() != BASE_URL.as_str() { + Some(Blog::fetch_from_url(conn, url).unwrap()) + } else { + None + } + }) } } diff --git a/src/routes/blogs.rs b/src/routes/blogs.rs index 6b09194..c843968 100644 --- a/src/routes/blogs.rs +++ b/src/routes/blogs.rs @@ -1,4 +1,4 @@ -use activitypub::{actor::Group, collection::OrderedCollection}; +use activitypub::collection::OrderedCollection; use rocket::{ request::Form, response::{Redirect, Flash} @@ -32,7 +32,7 @@ fn details(name: String, conn: DbConn, user: Option) -> Template { } #[get("/~/", format = "application/activity+json", rank = 1)] -fn activity_details(name: String, conn: DbConn) -> ActivityStream { +fn activity_details(name: String, conn: DbConn) -> ActivityStream { let blog = Blog::find_local(&*conn, name).unwrap(); ActivityStream::new(blog.into_activity(&*conn)) }