Federate community category and nsfw

pull/722/head
Felix 2020-05-05 16:30:13 +02:00
parent 21407260a4
commit dfd6629a6f
9 changed files with 84 additions and 24 deletions

View File

@ -23,8 +23,8 @@ use crate::{
}; };
use crate::apub::{ use crate::apub::{
extensions::signatures::generate_actor_keypair,
fetcher::search_by_apub_id, fetcher::search_by_apub_id,
signatures::generate_actor_keypair,
{make_apub_endpoint, ActorType, ApubLikeableType, ApubObjectType, EndpointType}, {make_apub_endpoint, ActorType, ApubLikeableType, ApubObjectType, EndpointType},
}; };
use crate::settings::Settings; use crate::settings::Settings;

View File

@ -51,7 +51,14 @@ impl ToApub for Community {
.set_endpoints(endpoint_props)? .set_endpoints(endpoint_props)?
.set_followers(self.get_followers_url())?; .set_followers(self.get_followers_url())?;
Ok(group.extend(actor_props).extend(self.get_public_key_ext())) let group_extension = GroupExtension::new(conn, self.category_id, self.nsfw)?;
Ok(
group
.extend(group_extension)
.extend(actor_props)
.extend(self.get_public_key_ext()),
)
} }
fn to_tombstone(&self) -> Result<Tombstone, Error> { fn to_tombstone(&self) -> Result<Tombstone, Error> {
@ -304,7 +311,8 @@ impl FromApub for CommunityForm {
/// Parse an ActivityPub group received from another instance into a Lemmy community. /// Parse an ActivityPub group received from another instance into a Lemmy community.
fn from_apub(group: &GroupExt, conn: &PgConnection) -> Result<Self, Error> { fn from_apub(group: &GroupExt, conn: &PgConnection) -> Result<Self, Error> {
let oprops = &group.base.base.object_props; let group_extensions: &GroupExtension = &group.base.base.extension;
let oprops = &group.base.base.base.object_props;
let aprops = &group.base.extension; let aprops = &group.base.extension;
let public_key: &PublicKey = &group.extension.public_key; let public_key: &PublicKey = &group.extension.public_key;
@ -325,7 +333,7 @@ impl FromApub for CommunityForm {
// TODO: should be parsed as html and tags like <script> removed (or use markdown source) // TODO: should be parsed as html and tags like <script> removed (or use markdown source)
// -> same for post.content etc // -> same for post.content etc
description: oprops.get_content_xsd_string().map(|s| s.to_string()), description: oprops.get_content_xsd_string().map(|s| s.to_string()),
category_id: 1, // -> peertube uses `"category": {"identifier": "9","name": "Comedy"},` category_id: group_extensions.category.identifier.parse::<i32>()?,
creator_id: creator.id, creator_id: creator.id,
removed: None, removed: None,
published: oprops published: oprops
@ -335,7 +343,7 @@ impl FromApub for CommunityForm {
.get_updated() .get_updated()
.map(|u| u.as_ref().to_owned().naive_local()), .map(|u| u.as_ref().to_owned().naive_local()),
deleted: None, deleted: None,
nsfw: false, nsfw: group_extensions.sensitive,
actor_id: oprops.get_id().unwrap().to_string(), actor_id: oprops.get_id().unwrap().to_string(),
local: false, local: false,
private_key: None, private_key: None,

View File

@ -0,0 +1,42 @@
use crate::db::category::Category;
use crate::db::Crud;
use activitystreams::ext::Extension;
use activitystreams::Actor;
use diesel::PgConnection;
use failure::Error;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupExtension {
pub category: GroupCategory,
pub sensitive: bool,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupCategory {
// Using a string because that's how Peertube does it.
pub identifier: String,
pub name: String,
}
impl GroupExtension {
pub fn new(
conn: &PgConnection,
category_id: i32,
sensitive: bool,
) -> Result<GroupExtension, Error> {
let category = Category::read(conn, category_id)?;
let group_category = GroupCategory {
identifier: category_id.to_string(),
name: category.name,
};
Ok(GroupExtension {
category: group_category,
sensitive,
})
}
}
impl<T> Extension<T> for GroupExtension where T: Actor {}

View File

@ -0,0 +1,3 @@
pub mod group_extensions;
pub mod page_extension;
pub mod signatures;

View File

@ -1,4 +1,6 @@
use super::*; use activitystreams::ext::Extension;
use activitystreams::Base;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]

View File

@ -1,4 +1,15 @@
use super::*; use activitystreams::ext::Extension;
use activitystreams::Actor;
use actix_web::HttpRequest;
use failure::Error;
use http::request::Builder;
use http_signature_normalization::Config;
use log::debug;
use openssl::hash::MessageDigest;
use openssl::sign::{Signer, Verifier};
use openssl::{pkey::PKey, rsa::Rsa};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
lazy_static! { lazy_static! {
static ref HTTP_SIG_CONFIG: Config = Config::new(); static ref HTTP_SIG_CONFIG: Config = Config::new();

View File

@ -89,7 +89,7 @@ pub fn search_by_apub_id(query: &str, conn: &PgConnection) -> Result<SearchRespo
response.users = vec![UserView::read(conn, user.id)?]; response.users = vec![UserView::read(conn, user.id)?];
} }
SearchAcceptedObjects::Group(g) => { SearchAcceptedObjects::Group(g) => {
let community_uri = g.base.base.object_props.get_id().unwrap().to_string(); let community_uri = g.base.base.base.object_props.get_id().unwrap().to_string();
let community = get_or_fetch_and_upsert_remote_community(&community_uri, &conn)?; let community = get_or_fetch_and_upsert_remote_community(&community_uri, &conn)?;
// TODO Maybe at some point in the future, fetch all the history of a community // TODO Maybe at some point in the future, fetch all the history of a community
// fetch_community_outbox(&c, conn)?; // fetch_community_outbox(&c, conn)?;
@ -165,6 +165,7 @@ pub fn get_or_fetch_and_upsert_remote_community(
// Also add the community moderators too // Also add the community moderators too
let creator_and_moderator_uris = group let creator_and_moderator_uris = group
.base
.base .base
.base .base
.object_props .object_props

View File

@ -2,11 +2,10 @@ pub mod activities;
pub mod comment; pub mod comment;
pub mod community; pub mod community;
pub mod community_inbox; pub mod community_inbox;
pub mod extensions;
pub mod fetcher; pub mod fetcher;
pub mod page_extension;
pub mod post; pub mod post;
pub mod shared_inbox; pub mod shared_inbox;
pub mod signatures;
pub mod user; pub mod user;
pub mod user_inbox; pub mod user_inbox;
@ -15,11 +14,11 @@ use crate::websocket::server::SendCommunityRoomMessage;
use activitystreams::object::kind::{NoteType, PageType}; use activitystreams::object::kind::{NoteType, PageType};
use activitystreams::{ use activitystreams::{
activity::{Accept, Create, Delete, Dislike, Follow, Like, Remove, Undo, Update}, activity::{Accept, Create, Delete, Dislike, Follow, Like, Remove, Undo, Update},
actor::{kind::GroupType, properties::ApActorProperties, Actor, Group, Person}, actor::{kind::GroupType, properties::ApActorProperties, Group, Person},
collection::UnorderedCollection, collection::UnorderedCollection,
context, context,
endpoint::EndpointProperties, endpoint::EndpointProperties,
ext::{Ext, Extensible, Extension}, ext::{Ext, Extensible},
object::{properties::ObjectProperties, Note, Page, Tombstone}, object::{properties::ObjectProperties, Note, Page, Tombstone},
public, BaseBox, public, BaseBox,
}; };
@ -30,16 +29,10 @@ use diesel::result::Error::NotFound;
use diesel::PgConnection; use diesel::PgConnection;
use failure::Error; use failure::Error;
use failure::_core::fmt::Debug; use failure::_core::fmt::Debug;
use http::request::Builder;
use http_signature_normalization::Config;
use isahc::prelude::*; use isahc::prelude::*;
use itertools::Itertools; use itertools::Itertools;
use log::debug; use log::debug;
use openssl::hash::MessageDigest;
use openssl::sign::{Signer, Verifier};
use openssl::{pkey::PKey, rsa::Rsa};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::time::Duration; use std::time::Duration;
use url::Url; use url::Url;
@ -66,15 +59,15 @@ use crate::websocket::{
}; };
use crate::{convert_datetime, naive_now, Settings}; use crate::{convert_datetime, naive_now, Settings};
use crate::apub::page_extension::PageExtension; use crate::apub::extensions::group_extensions::GroupExtension;
use crate::apub::extensions::page_extension::PageExtension;
use activities::{populate_object_props, send_activity}; use activities::{populate_object_props, send_activity};
use activitystreams::Base;
use chrono::NaiveDateTime; use chrono::NaiveDateTime;
use extensions::signatures::verify;
use extensions::signatures::{sign, PublicKey, PublicKeyExtension};
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::{sign, PublicKey, PublicKeyExtension};
type GroupExt = Ext<Ext<Group, ApActorProperties>, PublicKeyExtension>; type GroupExt = Ext<Ext<Ext<Group, GroupExtension>, ApActorProperties>, PublicKeyExtension>;
type PersonExt = Ext<Ext<Person, ApActorProperties>, PublicKeyExtension>; type PersonExt = Ext<Ext<Person, ApActorProperties>, PublicKeyExtension>;
type PageExt = Ext<Page, PageExtension>; type PageExt = Ext<Page, PageExtension>;

View File

@ -4,7 +4,7 @@ use super::community::{Community, CommunityForm};
use super::post::Post; use super::post::Post;
use super::user::{UserForm, User_}; use super::user::{UserForm, User_};
use super::*; use super::*;
use crate::apub::signatures::generate_actor_keypair; use crate::apub::extensions::signatures::generate_actor_keypair;
use crate::apub::{make_apub_endpoint, EndpointType}; use crate::apub::{make_apub_endpoint, EndpointType};
use crate::naive_now; use crate::naive_now;
use failure::Error; use failure::Error;