From fcc3fe746e636c9d133e4388f79a2e70a88ba34a Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 17:25:52 +0200 Subject: [PATCH 1/8] Fix number of group followers per page Signed-off-by: Thomas Citharel --- js/src/views/Group/GroupFollowers.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/Group/GroupFollowers.vue b/js/src/views/Group/GroupFollowers.vue index 069e98da2..0b1451202 100644 --- a/js/src/views/Group/GroupFollowers.vue +++ b/js/src/views/Group/GroupFollowers.vue @@ -171,7 +171,7 @@ export default class GroupFollowers extends mixins(GroupMixin) { pending: boolean | null = (this.$route.query.pending as string) == "1" || null; - FOLLOWERS_PER_PAGE = 1; + FOLLOWERS_PER_PAGE = 10; usernameWithDomain = usernameWithDomain; From 0a482d238eca36c49908cf11afcbaded13f08bbf Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 17:26:18 +0200 Subject: [PATCH 2/8] Fix apollo cache not being properly set after picking close city Signed-off-by: Thomas Citharel --- js/src/views/Settings/Preferences.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/views/Settings/Preferences.vue b/js/src/views/Settings/Preferences.vue index 822554d51..29ae92299 100644 --- a/js/src/views/Settings/Preferences.vue +++ b/js/src/views/Settings/Preferences.vue @@ -257,6 +257,7 @@ export default class Preferences extends Vue { await this.$apollo.mutate<{ setUserSetting: string }>({ mutation: SET_USER_SETTINGS, variables: userSettings, + refetchQueries: [{ query: USER_SETTINGS }], }); } } From da1fee2cc78a127a08a89ae7faaefcafafdb5859 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 18:08:02 +0200 Subject: [PATCH 3/8] Show group feeds for members as well Closes #646 Signed-off-by: Thomas Citharel --- js/src/views/Group/Group.vue | 67 +++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/js/src/views/Group/Group.vue b/js/src/views/Group/Group.vue index a1f64a3c1..0d3d52801 100644 --- a/js/src/views/Group/Group.vue +++ b/js/src/views/Group/Group.vue @@ -79,6 +79,49 @@ }" >{{ $t("Group settings") }} + + + + + + {{ $t("Report") }} + + + + + + + {{ $t("RSS/Atom Feed") }} + + + + + + {{ $t("ICS/WebCal Feed") }} + + + + @@ -456,19 +499,19 @@ /> - - - + + + From 4d4ee80b8c360253efb03d73015e18ba5b00ad08 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 18:22:14 +0200 Subject: [PATCH 4/8] Handle feeds with unknown formats properly Closes #660 Signed-off-by: Thomas Citharel --- lib/web/controllers/feed_controller.ex | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/web/controllers/feed_controller.ex b/lib/web/controllers/feed_controller.ex index 4de8e61b4..4db698fea 100644 --- a/lib/web/controllers/feed_controller.ex +++ b/lib/web/controllers/feed_controller.ex @@ -7,9 +7,7 @@ defmodule Mobilizon.Web.FeedController do action_fallback(Mobilizon.Web.FallbackController) alias Mobilizon.Config - @formats ["ics", "atom"] - - def instance(conn, %{"format" => format}) when format in @formats do + def instance(conn, %{"format" => format}) do if Config.get([:instance, :enable_instance_feeds], false) do return_data(conn, format, "instance", Config.instance_name()) else @@ -17,7 +15,7 @@ defmodule Mobilizon.Web.FeedController do end end - def actor(conn, %{"format" => format, "name" => name}) when format in @formats do + def actor(conn, %{"format" => format, "name" => name}) do return_data(conn, format, "actor_" <> name, name) end @@ -33,7 +31,7 @@ defmodule Mobilizon.Web.FeedController do {:error, :not_found} end - def going(conn, %{"token" => token, "format" => format}) when format in @formats do + def going(conn, %{"token" => token, "format" => format}) do return_data(conn, format, "token_" <> token, "events") end @@ -72,4 +70,8 @@ defmodule Mobilizon.Web.FeedController do {:error, :not_found} end end + + defp return_data(_conn, _, _, _) do + {:error, :not_found} + end end From acf51a313070521913a534807c0ccd04f7dab652 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 18:23:03 +0200 Subject: [PATCH 5/8] Fix issues when group isn't local Signed-off-by: Thomas Citharel --- js/src/mixins/group.ts | 10 ++++++++-- lib/service/export/common.ex | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/js/src/mixins/group.ts b/js/src/mixins/group.ts index 1ff873f9c..26be0c3e2 100644 --- a/js/src/mixins/group.ts +++ b/js/src/mixins/group.ts @@ -5,7 +5,13 @@ import { } from "@/graphql/actor"; import { FETCH_GROUP } from "@/graphql/group"; import RouteName from "@/router/name"; -import { Group, IActor, IGroup, IPerson } from "@/types/actor"; +import { + Group, + IActor, + IGroup, + IPerson, + usernameWithDomain, +} from "@/types/actor"; import { MemberRole } from "@/types/enums"; import { Component, Vue } from "vue-property-decorator"; @@ -34,7 +40,7 @@ import { Component, Vue } from "vue-property-decorator"; variables() { return { id: this.currentActor.id, - group: this.group.preferredUsername, + group: usernameWithDomain(this.group), }; }, subscribeToMore: { diff --git a/lib/service/export/common.ex b/lib/service/export/common.ex index 2b9a35692..dd3e53903 100644 --- a/lib/service/export/common.ex +++ b/lib/service/export/common.ex @@ -11,7 +11,7 @@ defmodule Mobilizon.Service.Export.Common do @spec fetch_actor_event_feed(String.t()) :: String.t() def fetch_actor_event_feed(name) do - with %Actor{} = actor <- Actors.get_local_actor_by_name(name), + with %Actor{} = actor <- Actors.get_actor_by_name(name), {:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)}, %Page{elements: events} <- Events.list_public_events_for_actor(actor), %Page{elements: posts} <- Posts.get_public_posts_for_group(actor) do From 69339700cd59933329abbcd26bf5c9b4b8cab81a Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 19:26:33 +0200 Subject: [PATCH 6/8] Fix event creation Signed-off-by: Thomas Citharel --- js/src/views/Event/Edit.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/js/src/views/Event/Edit.vue b/js/src/views/Event/Edit.vue index f67ba5dc2..3d098bfb3 100644 --- a/js/src/views/Event/Edit.vue +++ b/js/src/views/Event/Edit.vue @@ -859,9 +859,12 @@ export default class EditEvent extends Vue { */ private async buildVariables() { let res = this.event.toEditJSON(); - if (this.event.organizerActor) { + const organizerActor = this.event.organizerActor?.id + ? this.event.organizerActor + : this.organizerActor; + if (organizerActor) { res = Object.assign(res, { - organizerActorId: this.event.organizerActor.id, + organizerActorId: organizerActor.id, }); } const attributedToId = this.event.attributedTo?.id From 8e6aa8c85c22d1026749030496729c83cd92feb7 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 29 Mar 2021 19:26:49 +0200 Subject: [PATCH 7/8] Decode HTML entities when sanitized Signed-off-by: Thomas Citharel --- lib/service/formatter/html.ex | 2 +- mix.exs | 1 + test/service/metadata/utils_test.exs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/service/formatter/html.ex b/lib/service/formatter/html.ex index ef4cdd6a4..2e8bd5ee5 100644 --- a/lib/service/formatter/html.ex +++ b/lib/service/formatter/html.ex @@ -17,7 +17,7 @@ defmodule Mobilizon.Service.Formatter.HTML do def strip_tags(html) do case FastSanitize.strip_tags(html) do {:ok, html} -> - html + HtmlEntities.decode(html) _ -> raise "Failed to filter tags" diff --git a/mix.exs b/mix.exs index fec5fc81b..beb5d9901 100644 --- a/mix.exs +++ b/mix.exs @@ -142,6 +142,7 @@ defmodule Mobilizon.Mixfile do {:ex_cldr_languages, "~> 0.2.1"}, {:slugger, "~> 0.3"}, {:sentry, "~> 8.0"}, + {:html_entities, "~> 0.5"}, # Dev and test dependencies {:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]}, {:ex_machina, "~> 2.3", only: [:dev, :test]}, diff --git a/test/service/metadata/utils_test.exs b/test/service/metadata/utils_test.exs index 9ba6742ae..9aa1dcc8b 100644 --- a/test/service/metadata/utils_test.exs +++ b/test/service/metadata/utils_test.exs @@ -17,7 +17,7 @@ defmodule Mobilizon.Service.Metadata.UtilsTest do "

Biography

It all started when someone wanted a very long string to be cut. However it's difficult to invent things to write when you've got nothing to say. Anyway, what's the deal here. We just need to reach 200 characters.", "fr" ) == - "Biography It all started when someone wanted a very long string to be cut. However it's difficult to invent things to write when you've got nothing to say. Anyway, what's the deal here. We…" + "Biography It all started when someone wanted a very long string to be cut. However it's difficult to invent things to write when you've got nothing to say. Anyway, what's the deal here. We just need to…" end test "process_description/3 returns default if no description is provided" do From 076c14b54ef4a0a8c458091ade1239e738fd3905 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 30 Mar 2021 08:48:51 +0200 Subject: [PATCH 8/8] Don't auto-approve instance follows Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/types/actors.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/federation/activity_pub/types/actors.ex b/lib/federation/activity_pub/types/actors.ex index e02ddffab..e0ac6d594 100644 --- a/lib/federation/activity_pub/types/actors.ex +++ b/lib/federation/activity_pub/types/actors.ex @@ -3,7 +3,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do alias Mobilizon.Actors alias Mobilizon.Actors.{Actor, Follower, Member} alias Mobilizon.Federation.ActivityPub - alias Mobilizon.Federation.ActivityPub.Audience + alias Mobilizon.Federation.ActivityPub.{Audience, Relay} alias Mobilizon.Federation.ActivityPub.Types.Entity alias Mobilizon.Federation.ActivityStream.Convertible alias Mobilizon.GraphQL.API.Utils, as: APIUtils @@ -223,7 +223,10 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do %Follower{} = follower, follow_as_data ) do - unless follower.target_actor.manually_approves_followers do + %Actor{id: relay_id} = Relay.get_actor() + + unless follower.target_actor.manually_approves_followers or + follower.target_actor.id == relay_id do {:accept, ActivityPub.accept( :follow,