summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix <me@nutomic.com>2020-05-05 16:30:13 +0200
committerFelix <me@nutomic.com>2020-05-05 16:30:13 +0200
commitdfd6629a6fc1fa43abf2815e9b219c3c0e832072 (patch)
tree3fc3a0cd2a11cd6fa4be05b1b022a9ec816788d6
parent21407260a4bfc3c173d4f17b6540805fe60f3519 (diff)
Federate community category and nsfw
-rw-r--r--server/src/api/mod.rs2
-rw-r--r--server/src/apub/community.rs16
-rw-r--r--server/src/apub/extensions/group_extensions.rs42
-rw-r--r--server/src/apub/extensions/mod.rs3
-rw-r--r--server/src/apub/extensions/page_extension.rs (renamed from server/src/apub/page_extension.rs)4
-rw-r--r--server/src/apub/extensions/signatures.rs (renamed from server/src/apub/signatures.rs)13
-rw-r--r--server/src/apub/fetcher.rs3
-rw-r--r--server/src/apub/mod.rs23
-rw-r--r--server/src/db/code_migrations.rs2
9 files changed, 84 insertions, 24 deletions
diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs
index 8bc03fee..9112a3be 100644
--- a/server/src/api/mod.rs
+++ b/server/src/api/mod.rs
@@ -23,8 +23,8 @@ use crate::{
};
use crate::apub::{
+ extensions::signatures::generate_actor_keypair,
fetcher::search_by_apub_id,
- signatures::generate_actor_keypair,
{make_apub_endpoint, ActorType, ApubLikeableType, ApubObjectType, EndpointType},
};
use crate::settings::Settings;
diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs
index feffa70e..f7cd213d 100644
--- a/server/src/apub/community.rs
+++ b/server/src/apub/community.rs
@@ -51,7 +51,14 @@ impl ToApub for Community {
.set_endpoints(endpoint_props)?
.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> {
@@ -304,7 +311,8 @@ impl FromApub for CommunityForm {
/// Parse an ActivityPub group received from another instance into a Lemmy community.
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 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)
// -> same for post.content etc
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,
removed: None,
published: oprops
@@ -335,7 +343,7 @@ impl FromApub for CommunityForm {
.get_updated()
.map(|u| u.as_ref().to_owned().naive_local()),
deleted: None,
- nsfw: false,
+ nsfw: group_extensions.sensitive,
actor_id: oprops.get_id().unwrap().to_string(),
local: false,
private_key: None,
diff --git a/server/src/apub/extensions/group_extensions.rs b/server/src/apub/extensions/group_extensions.rs
new file mode 100644
index 00000000..10cee5c7
--- /dev/null
+++ b/server/src/apub/extensions/group_extensions.rs
@@ -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 {}
diff --git a/server/src/apub/extensions/mod.rs b/server/src/apub/extensions/mod.rs
new file mode 100644
index 00000000..fdd06e5b
--- /dev/null
+++ b/server/src/apub/extensions/mod.rs
@@ -0,0 +1,3 @@
+pub mod group_extensions;
+pub mod page_extension;
+pub mod signatures;
diff --git a/server/src/apub/page_extension.rs b/server/src/apub/extensions/page_extension.rs
index 03b145ec..435a869a 100644
--- a/server/src/apub/page_extension.rs
+++ b/server/src/apub/extensions/page_extension.rs
@@ -1,4 +1,6 @@
-use super::*;
+use activitystreams::ext::Extension;
+use activitystreams::Base;
+use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
diff --git a/server/src/apub/signatures.rs b/server/src/apub/extensions/signatures.rs
index cf064603..d89e0dd3 100644
--- a/server/src/apub/signatures.rs
+++ b/server/src/apub/extensions/signatures.rs
@@ -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! {
static ref HTTP_SIG_CONFIG: Config = Config::new();
diff --git a/server/src/apub/fetcher.rs b/server/src/apub/fetcher.rs
index 9db6755a..115ef6ff 100644
--- a/server/src/apub/fetcher.rs
+++ b/server/src/apub/fetcher.rs
@@ -89,7 +89,7 @@ pub fn search_by_apub_id(query: &str, conn: &PgConnection) -> Result<SearchRespo
response.users = vec![UserView::read(conn, user.id)?];
}
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)?;
// TODO Maybe at some point in the future, fetch all the history of a community
// fetch_community_outbox(&c, conn)?;
@@ -167,6 +167,7 @@ pub fn get_or_fetch_and_upsert_remote_community(
let creator_and_moderator_uris = group
.base
.base
+ .base
.object_props
.get_many_attributed_to_xsd_any_uris()
.unwrap();
diff --git a/server/src/apub/mod.rs b/server/src/apub/mod.rs
index 3c6a0060..8b4ceb79 100644
--- a/server/src/apub/mod.rs
+++ b/server/src/apub/mod.rs
@@ -2,11 +2,10 @@ pub mod activities;
pub mod comment;
pub mod community;
pub mod community_inbox;
+pub mod extensions;
pub mod fetcher;
-pub mod page_extension;
pub mod post;
pub mod shared_inbox;
-pub mod signatures;
pub mod user;
pub mod user_inbox;
@@ -15,11 +14,11 @@ use crate::websocket::server::SendCommunityRoomMessage;
use activitystreams::object::kind::{NoteType, PageType};
use activitystreams::{
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,
context,
endpoint::EndpointProperties,
- ext::{Ext, Extensible, Extension},
+ ext::{Ext, Extensible},
object::{properties::ObjectProperties, Note, Page, Tombstone},
public, BaseBox,
};
@@ -30,16 +29,10 @@ use diesel::result::Error::NotFound;
use diesel::PgConnection;
use failure::Error;
use failure::_core::fmt::Debug;
-use http::request::Builder;
-use http_signature_normalization::Config;
use isahc::prelude::*;
use itertools::Itertools;
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;
use std::time::Duration;
use url::Url;
@@ -66,15 +59,15 @@ use crate::websocket::{
};
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 activitystreams::Base;
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 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 PageExt = Ext<Page, PageExtension>;
diff --git a/server/src/db/code_migrations.rs b/server/src/db/code_migrations.rs
index 60597199..bdfc1a0d 100644
--- a/server/src/db/code_migrations.rs
+++ b/server/src/db/code_migrations.rs
@@ -4,7 +4,7 @@ use super::community::{Community, CommunityForm};
use super::post::Post;
use super::user::{UserForm, User_};
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::naive_now;
use failure::Error;