From fe8ec1b6f9a918c3b24b562c5dae752bcfc134ad Mon Sep 17 00:00:00 2001
From: Pleroma
Date: Mon, 1 Jan 2018 16:36:40 +0000
Subject: [PATCH 001/132] shigusegubu customs
---
config/config.exs | 8 ++++----
config/emoji.txt | 9 ++++++++-
installation/pleroma.service | 2 ++
lib/pleroma/web/endpoint.ex | 2 +-
lib/pleroma/web/ostatus/ostatus_controller.ex | 2 +-
lib/pleroma/web/router.ex | 2 +-
6 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index cf6cbaa9d..fa616bcce 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -47,9 +47,9 @@ version =
config :pleroma, :http, proxy_url: nil
config :pleroma, :instance,
- version: version,
- name: "Pleroma",
- email: "example@example.com",
+ version: "2.1",
+ name: "Shigusegubu",
+ email: "pleroma@hjkos.com",
limit: 5000,
upload_limit: 16_000_000,
registrations_open: true,
@@ -82,7 +82,7 @@ config :pleroma, :media_proxy,
# base_url: "https://cache.pleroma.social"
-config :pleroma, :chat, enabled: true
+config :pleroma, :chat, enabled: false
config :ecto, json_library: Jason
diff --git a/config/emoji.txt b/config/emoji.txt
index 7afacb09f..3ea245a5b 100644
--- a/config/emoji.txt
+++ b/config/emoji.txt
@@ -28,4 +28,11 @@ f_33b00b, /emoji/f_33b00b.png
f_33b22b, /emoji/f_33b22b.png
f_33h, /emoji/f_33h.png
f_33t, /emoji/f_33t.png
-
+shinitai-shi, /emoji/shinitai-shi.png
+shinitai-ni, /emoji/shinitai-ni.png
+shinitai-ta, /emoji/shinitai-ta.png
+shinitai-i, /emoji/shinitai-i.png
+shinitai_shi, /emoji/shinitai_shi.png
+shinitai_ni, /emoji/shinitai_ni.png
+shinitai_ta, /emoji/shinitai_ta.png
+shinitai_i, /emoji/shinitai_i.png
diff --git a/installation/pleroma.service b/installation/pleroma.service
index fd4180985..08c8eab32 100644
--- a/installation/pleroma.service
+++ b/installation/pleroma.service
@@ -6,10 +6,12 @@ After=network.target postgresql.service
User=pleroma
WorkingDirectory=/home/pleroma/pleroma
Environment="HOME=/home/pleroma"
+Environment="MIX_ENV=prod"
ExecStart=/usr/local/bin/mix phx.server
ExecReload=/bin/kill $MAINPID
KillMode=process
Restart=on-failure
+StandardOutput=journal
[Install]
WantedBy=multi-user.target
diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex
index 1a012c1b4..f0748542b 100644
--- a/lib/pleroma/web/endpoint.ex
+++ b/lib/pleroma/web/endpoint.ex
@@ -16,7 +16,7 @@ defmodule Pleroma.Web.Endpoint do
plug(
Plug.Static,
at: "/",
- from: :pleroma,
+ from: "priv_sid/static",
only: ~w(index.html static finmoji emoji packs sounds images instance sw.js favicon.png)
)
diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex
index 2f72fdb16..ce18c320a 100644
--- a/lib/pleroma/web/ostatus/ostatus_controller.ex
+++ b/lib/pleroma/web/ostatus/ostatus_controller.ex
@@ -134,7 +134,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do
"html" ->
conn
|> put_resp_content_type("text/html")
- |> send_file(200, "priv/static/index.html")
+ |> send_file(200, "priv_sid/static/index.html")
_ ->
represent_activity(conn, activity, user)
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 34652cdde..a0e958e93 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -366,7 +366,7 @@ defmodule Fallback.RedirectController do
if Mix.env() != :test do
conn
|> put_resp_content_type("text/html")
- |> send_file(200, "priv/static/index.html")
+ |> send_file(200, "priv_sid/static/index.html")
end
end
end
From d5f36acd13d9b6b958aa71cc9abf729ec165b1a5 Mon Sep 17 00:00:00 2001
From: SGSGB
Date: Fri, 6 Jul 2018 18:59:07 +0200
Subject: [PATCH 002/132] emoji movement
---
config/custom_emoji.txt | 84 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 84 insertions(+)
create mode 100644 config/custom_emoji.txt
diff --git a/config/custom_emoji.txt b/config/custom_emoji.txt
new file mode 100644
index 000000000..49369749d
--- /dev/null
+++ b/config/custom_emoji.txt
@@ -0,0 +1,84 @@
+shinitai-shi, /emoji/sgsgb/shinitai-shi.png
+shinitai-ni, /emoji/sgsgb/shinitai-ni.png
+shinitai-ta, /emoji/sgsgb/shinitai-ta.png
+shinitai-i, /emoji/sgsgb/shinitai-i.png
+shinitai_shi, /emoji/sgsgb/shinitai_shi.png
+shinitai_ni, /emoji/sgsgb/shinitai_ni.png
+shinitai_ta, /emoji/sgsgb/shinitai_ta.png
+shinitai_i, /emoji/sgsgb/shinitai_i.png
+poptepipic23, /emoji/sgsgb/poptepipic23.png
+poptepipic22, /emoji/sgsgb/poptepipic22.png
+poptepipic21, /emoji/sgsgb/poptepipic21.png
+poptepipic20, /emoji/sgsgb/poptepipic20.png
+poptepipic19, /emoji/sgsgb/poptepipic19.png
+poptepipic18, /emoji/sgsgb/poptepipic18.png
+poptepipic17, /emoji/sgsgb/poptepipic17.png
+poptepipic16, /emoji/sgsgb/poptepipic16.png
+poptepipic15, /emoji/sgsgb/poptepipic15.png
+poptepipic14, /emoji/sgsgb/poptepipic14.png
+poptepipic13, /emoji/sgsgb/poptepipic13.png
+poptepipic12, /emoji/sgsgb/poptepipic12.png
+poptepipic11, /emoji/sgsgb/poptepipic11.png
+poptepipic10, /emoji/sgsgb/poptepipic10.png
+poptepipic9, /emoji/sgsgb/poptepipic9.png
+poptepipic8, /emoji/sgsgb/poptepipic8.png
+poptepipic7, /emoji/sgsgb/poptepipic7.png
+poptepipic6, /emoji/sgsgb/poptepipic6.png
+poptepipic5, /emoji/sgsgb/poptepipic5.png
+poptepipic4, /emoji/sgsgb/poptepipic4.png
+poptepipic3, /emoji/sgsgb/poptepipic3.png
+poptepipic2, /emoji/sgsgb/poptepipic2.png
+poptepipic1, /emoji/sgsgb/poptepipic1.png
+payyap, /emoji/sgsgb/payyap.png
+orangeman, /emoji/sgsgb/orangeman.png
+ohyes, /emoji/sgsgb/ohyes.png
+ohgno, /emoji/sgsgb/ohgno.png
+nyoron, /emoji/sgsgb/nyoron.png
+nice, /emoji/sgsgb/nice.png
+necromancy3, /emoji/sgsgb/necromancy3.png
+necromancy2, /emoji/sgsgb/necromancy2.png
+necromancy1, /emoji/sgsgb/necromancy1.png
+moraleup, /emoji/sgsgb/moraleup.png
+moraledn, /emoji/sgsgb/moraledn.png
+megaman, /emoji/sgsgb/megaman.png
+luck, /emoji/sgsgb/luck.png
+lucknorm, /emoji/sgsgb/lucknorm.png
+jyushimatsu_think, /emoji/sgsgb/jyushimatsu_think.png
+jake, /emoji/sgsgb/jake.png
+itisamystery, /emoji/sgsgb/itisamystery.png
+italian2, /emoji/sgsgb/italian2.png
+italian1, /emoji/sgsgb/italian1.png
+herrington, /emoji/sgsgb/herrington.png
+heavy_winninggreat, /emoji/sgsgb/heavy_winninggreat.png
+heavy_losingeh, /emoji/sgsgb/heavy_losingeh.png
+granddad, /emoji/sgsgb/granddad.png
+furrythink, /emoji/sgsgb/furrythink.png
+FACE_QUAD, /emoji/sgsgb/FACE_QUAD.png
+dogcited, /emoji/sgsgb/dogcited.png
+denton, /emoji/sgsgb/denton.png
+denton_laugh, /emoji/sgsgb/denton_laugh.png
+debian, /emoji/sgsgb/debian.png
+catboythink, /emoji/sgsgb/catboythink.png
+cacolaugh, /emoji/sgsgb/cacolaugh.png
+bandits, /emoji/sgsgb/bandits.png
+bananya, /emoji/sgsgb/bananya.png
+a_to, /emoji/sgsgb/a_to.png
+angrypirds, /emoji/sgsgb/angrypirds.png
+Advanced_Sorcery, /emoji/sgsgb/Advanced_Sorcery.png
+Yukkuri_Reimu, /emoji/sgsgb/Yukkuri_Reimu.png
+vanpeek, /emoji/sgsgb/vanpeek.png
+tux, /emoji/sgsgb/tux.png
+tuturu, /emoji/sgsgb/tuturu.png
+tobdog, /emoji/sgsgb/tobdog.png
+thnk, /emoji/sgsgb/thnk.png
+stalkers, /emoji/sgsgb/stalkers.png
+spurdo, /emoji/sgsgb/spurdo.png
+smug_marisa, /emoji/sgsgb/smug_marisa.png
+shotging, /emoji/sgsgb/shotging.png
+shag, /emoji/sgsgb/shag.png
+serious, /emoji/sgsgb/serious.png
+scut, /emoji/sgsgb/scut.png
+sandro, /emoji/sgsgb/sandro.png
+puke, /emoji/sgsgb/puke.png
+kokoko, /emoji/sgsgb/kokoko.png
+the_e, /emoji/sgsgb/e.png
From 21e6c1dfcb05ceedc510a762f3cb471801d381fb Mon Sep 17 00:00:00 2001
From: SGSGB
Date: Sat, 4 Aug 2018 18:23:11 +0200
Subject: [PATCH 003/132] customs
---
config/config.exs | 6 +++---
config/custom_emoji.txt | 3 +++
config/emoji.txt | 8 --------
3 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index fa616bcce..5c3c1b0c6 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -47,16 +47,16 @@ version =
config :pleroma, :http, proxy_url: nil
config :pleroma, :instance,
- version: "2.1",
+ version: version,
name: "Shigusegubu",
email: "pleroma@hjkos.com",
limit: 5000,
- upload_limit: 16_000_000,
+ upload_limit: 20_000_000,
registrations_open: true,
federating: true,
rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,
public: true,
- quarantined_instances: []
+ quarantined_instances: ["pleroma.rareome.ga"]
config :pleroma, :activitypub,
accept_blocks: true,
diff --git a/config/custom_emoji.txt b/config/custom_emoji.txt
index 49369749d..ed9e6b467 100644
--- a/config/custom_emoji.txt
+++ b/config/custom_emoji.txt
@@ -82,3 +82,6 @@ sandro, /emoji/sgsgb/sandro.png
puke, /emoji/sgsgb/puke.png
kokoko, /emoji/sgsgb/kokoko.png
the_e, /emoji/sgsgb/e.png
+avard_bios, /emoji/sgsgb/avard_bios.png
+energy_star, /emoji/sgsgb/energy_star.png
+loss, /emoji/sgsgb/loss.png
diff --git a/config/emoji.txt b/config/emoji.txt
index 3ea245a5b..7e43eed9b 100644
--- a/config/emoji.txt
+++ b/config/emoji.txt
@@ -28,11 +28,3 @@ f_33b00b, /emoji/f_33b00b.png
f_33b22b, /emoji/f_33b22b.png
f_33h, /emoji/f_33h.png
f_33t, /emoji/f_33t.png
-shinitai-shi, /emoji/shinitai-shi.png
-shinitai-ni, /emoji/shinitai-ni.png
-shinitai-ta, /emoji/shinitai-ta.png
-shinitai-i, /emoji/shinitai-i.png
-shinitai_shi, /emoji/shinitai_shi.png
-shinitai_ni, /emoji/shinitai_ni.png
-shinitai_ta, /emoji/shinitai_ta.png
-shinitai_i, /emoji/shinitai_i.png
From 5720cf286c3946531cf540296214f83f7b312e23 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 25 Sep 2018 15:56:43 +0300
Subject: [PATCH 004/132] changes
---
config/config.exs | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index ad2218980..b95d74a6c 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -69,13 +69,13 @@ config :pleroma, :instance,
quarantined_instances: ["pleroma.rareome.ga"]
config :pleroma, :fe,
- theme: "pleroma-dark",
- logo: "/static/logo.png",
- background: "/static/aurora_borealis.jpg",
+ theme: "sigsegv2",
+ logo: "/static/logo.svg",
+ background: "/static/sigsegv_s.png",
redirect_root_no_login: "/main/all",
redirect_root_login: "/main/friends",
show_instance_panel: true,
- scope_options_enabled: false,
+ scope_options_enabled: true,
collapse_message_with_subject: false
config :pleroma, :activitypub,
From 08ab82cf0b9c465603b7381cf9f1d9e7daf2037d Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 12 Nov 2018 16:26:43 +0300
Subject: [PATCH 005/132] fix
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 05b2f0372..ae95ac101 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -93,7 +93,7 @@ config :pleroma, :instance,
allow_relay: true,
rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,
public: true,
- quarantined_instances: ["pleroma.rareome.ga"]
+ quarantined_instances: ["pleroma.rareome.ga"],
managed_config: true,
allowed_post_formats: [
"text/plain",
From 37aa9a63b07fc53cb7d035c5be8445f08c47bd1a Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 21 Jan 2019 15:52:44 +0300
Subject: [PATCH 006/132] allow only plaintext
---
config/config.exs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 94f546efc..077220752 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -132,9 +132,7 @@ config :pleroma, :instance,
managed_config: true,
static_dir: "instance/static/",
allowed_post_formats: [
- "text/plain",
- "text/html",
- "text/markdown"
+ "text/plain"
],
finmoji_enabled: true,
mrf_transparency: true,
From af8a7d8fd833ab015f87479480d646a2e4d16dc7 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sat, 2 Mar 2019 20:25:21 +0200
Subject: [PATCH 007/132] limit
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 2238d8040..38a71fcb8 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -141,7 +141,7 @@ config :pleroma, :instance,
description: "SigSegV, a pleroma instance",
limit: 5_000,
remote_limit: 100_000,
- upload_limit: 20_000_000,
+ upload_limit: 50_000_000,
avatar_upload_limit: 2_000_000,
background_upload_limit: 4_000_000,
banner_upload_limit: 4_000_000,
From f95b354c3d8016c74c6b1cddb829a3f3046bf24c Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 3 Mar 2019 21:33:48 +0200
Subject: [PATCH 008/132] configs update
---
config/config.exs | 38 ++++++++++++--------------------------
1 file changed, 12 insertions(+), 26 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 38a71fcb8..de93d9921 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -149,7 +149,10 @@ config :pleroma, :instance,
federating: true,
federation_reachability_timeout_days: 7,
allow_relay: true,
- rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,
+ rewrite_policy: [
+ Pleroma.Web.ActivityPub.MRF.HellthreadPolicy,
+ Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy
+ ],
public: true,
quarantined_instances: ["pleroma.rareome.ga"],
managed_config: true,
@@ -178,41 +181,24 @@ config :pleroma, :markup,
Pleroma.HTML.Scrubber.Default
]
-# Deprecated, will be gone in 1.0
-config :pleroma, :fe,
- theme: "sigsegv2",
- logo: "/static/logo.svg",
- background: "/static/sigsegv_s.png",
- redirect_root_no_login: "/main/all",
- redirect_root_login: "/main/friends",
- logo_mask: true,
- logo_margin: "0.1em",
- show_instance_panel: true,
- scope_options_enabled: false,
- formatting_options_enabled: false,
- collapse_message_with_subject: false,
- hide_post_stats: false,
- hide_user_stats: false,
- scope_copy: false,
- subject_line_behavior: "noop",
- always_show_subject_input: false
-
config :pleroma, :frontend_configurations,
pleroma_fe: %{
- theme: "pleroma-dark",
- logo: "/static/logo.png",
- background: "/images/city.jpg",
+ theme: "sigsegv2",
+ logo: "/static/logo.svg",
+ background: "/static/sigsegv_s.png",
redirectRootNoLogin: "/main/all",
redirectRootLogin: "/main/friends",
+ logoMask: true,
+ logoMargin: "0.1em",
showInstanceSpecificPanel: true,
scopeOptionsEnabled: false,
formattingOptionsEnabled: false,
collapseMessageWithSubject: false,
hidePostStats: false,
hideUserStats: false,
- scopeCopy: true,
- subjectLineBehavior: "email",
- alwaysShowSubjectInput: true
+ scopeCopy: false,
+ subjectLineBehavior: "noop",
+ alwaysShowSubjectInput: false
}
config :pleroma, :activitypub,
From 580787d3608d57fca02d6f254c29818d4f857262 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 21 Mar 2019 20:35:52 +0200
Subject: [PATCH 009/132] piece of shit
---
installation/pleroma.service | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/installation/pleroma.service b/installation/pleroma.service
index c7e1dd534..dcbd25ec1 100644
--- a/installation/pleroma.service
+++ b/installation/pleroma.service
@@ -15,9 +15,9 @@ Environment="MIX_ENV=prod"
; Make sure that all paths fit your installation.
; Path to the home directory of the user running the Pleroma service.
-Environment="HOME=/var/lib/pleroma"
+Environment="HOME=/home/pleroma"
; Path to the folder containing the Pleroma installation.
-WorkingDirectory=/opt/pleroma
+WorkingDirectory=/home/pleroma/pleroma
; Path to the Mix binary.
ExecStart=/usr/bin/mix phx.server
From c7ccd43500be645f6bad208e7728558631fc26c1 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 21 Mar 2019 20:39:46 +0200
Subject: [PATCH 010/132] shitfuck
---
installation/pleroma.service | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/installation/pleroma.service b/installation/pleroma.service
index dcbd25ec1..4ff4b7811 100644
--- a/installation/pleroma.service
+++ b/installation/pleroma.service
@@ -25,7 +25,7 @@ ExecStart=/usr/bin/mix phx.server
; Use private /tmp and /var/tmp folders inside a new file system namespace, which are discarded after the process stops.
PrivateTmp=true
; The /home, /root, and /run/user folders can not be accessed by this service anymore. If your Pleroma user has its home folder in one of the restricted places, or use one of these folders as its working directory, you have to set this to false.
-ProtectHome=true
+ProtectHome=false
; Mount /usr, /boot, and /etc as read-only for processes invoked by this service.
ProtectSystem=full
; Sets up a new /dev mount for the process and only adds API pseudo devices like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled by default because it may not work on devices like the Raspberry Pi.
From 4069f6430dac018a731c00916ba0f6fccbe22c1c Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 7 Apr 2019 12:13:49 +0300
Subject: [PATCH 011/132] update mrf
---
config/config.exs | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 0e3ab043f..62d85d7ce 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -166,6 +166,7 @@ config :pleroma, :instance,
federation_reachability_timeout_days: 7,
allow_relay: true,
rewrite_policy: [
+ Pleroma.Web.ActivityPub.MRF.SimplePolicy,
Pleroma.Web.ActivityPub.MRF.HellthreadPolicy,
Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy
],
@@ -241,8 +242,16 @@ config :pleroma, :mrf_hellthread,
config :pleroma, :mrf_simple,
media_removal: [],
- media_nsfw: [],
- federated_timeline_removal: [],
+ media_nsfw: [
+ "preteengirls.biz",
+ "melalandia.tk",
+ "pl.smuglo.li",
+ "baraag.net"
+ ],
+ federated_timeline_removal: [
+ "preteengirls.biz",
+ "melalandia.tk"
+ ],
reject: [],
accept: []
From 232dd793419e16ab27b1d314909bbfed240d387f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 28 Apr 2019 18:31:37 +0300
Subject: [PATCH 012/132] updates
---
config/config.exs | 4 +-
config/custom_emoji.txt | 192 +++++++++++++++++++++++-----------------
2 files changed, 112 insertions(+), 84 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 450db428a..de642a748 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -205,7 +205,7 @@ config :pleroma, :instance,
description: "SigSegV, a pleroma instance",
limit: 5_000,
remote_limit: 100_000,
- upload_limit: 50_000_000,
+ upload_limit: 200_000_000,
avatar_upload_limit: 2_000_000,
background_upload_limit: 4_000_000,
banner_upload_limit: 4_000_000,
@@ -223,7 +223,7 @@ config :pleroma, :instance,
managed_config: true,
static_dir: "instance/static/",
allowed_post_formats: [
- "text/plain"
+ "text/plain",
"text/bbcode"
],
mrf_transparency: true,
diff --git a/config/custom_emoji.txt b/config/custom_emoji.txt
index ed9e6b467..c7a706630 100644
--- a/config/custom_emoji.txt
+++ b/config/custom_emoji.txt
@@ -1,87 +1,115 @@
-shinitai-shi, /emoji/sgsgb/shinitai-shi.png
-shinitai-ni, /emoji/sgsgb/shinitai-ni.png
-shinitai-ta, /emoji/sgsgb/shinitai-ta.png
-shinitai-i, /emoji/sgsgb/shinitai-i.png
-shinitai_shi, /emoji/sgsgb/shinitai_shi.png
-shinitai_ni, /emoji/sgsgb/shinitai_ni.png
-shinitai_ta, /emoji/sgsgb/shinitai_ta.png
-shinitai_i, /emoji/sgsgb/shinitai_i.png
-poptepipic23, /emoji/sgsgb/poptepipic23.png
-poptepipic22, /emoji/sgsgb/poptepipic22.png
-poptepipic21, /emoji/sgsgb/poptepipic21.png
-poptepipic20, /emoji/sgsgb/poptepipic20.png
-poptepipic19, /emoji/sgsgb/poptepipic19.png
-poptepipic18, /emoji/sgsgb/poptepipic18.png
-poptepipic17, /emoji/sgsgb/poptepipic17.png
-poptepipic16, /emoji/sgsgb/poptepipic16.png
-poptepipic15, /emoji/sgsgb/poptepipic15.png
-poptepipic14, /emoji/sgsgb/poptepipic14.png
-poptepipic13, /emoji/sgsgb/poptepipic13.png
-poptepipic12, /emoji/sgsgb/poptepipic12.png
-poptepipic11, /emoji/sgsgb/poptepipic11.png
-poptepipic10, /emoji/sgsgb/poptepipic10.png
-poptepipic9, /emoji/sgsgb/poptepipic9.png
-poptepipic8, /emoji/sgsgb/poptepipic8.png
-poptepipic7, /emoji/sgsgb/poptepipic7.png
-poptepipic6, /emoji/sgsgb/poptepipic6.png
-poptepipic5, /emoji/sgsgb/poptepipic5.png
-poptepipic4, /emoji/sgsgb/poptepipic4.png
-poptepipic3, /emoji/sgsgb/poptepipic3.png
-poptepipic2, /emoji/sgsgb/poptepipic2.png
-poptepipic1, /emoji/sgsgb/poptepipic1.png
-payyap, /emoji/sgsgb/payyap.png
-orangeman, /emoji/sgsgb/orangeman.png
-ohyes, /emoji/sgsgb/ohyes.png
-ohgno, /emoji/sgsgb/ohgno.png
-nyoron, /emoji/sgsgb/nyoron.png
-nice, /emoji/sgsgb/nice.png
-necromancy3, /emoji/sgsgb/necromancy3.png
-necromancy2, /emoji/sgsgb/necromancy2.png
-necromancy1, /emoji/sgsgb/necromancy1.png
-moraleup, /emoji/sgsgb/moraleup.png
-moraledn, /emoji/sgsgb/moraledn.png
-megaman, /emoji/sgsgb/megaman.png
-luck, /emoji/sgsgb/luck.png
-lucknorm, /emoji/sgsgb/lucknorm.png
-jyushimatsu_think, /emoji/sgsgb/jyushimatsu_think.png
-jake, /emoji/sgsgb/jake.png
-itisamystery, /emoji/sgsgb/itisamystery.png
-italian2, /emoji/sgsgb/italian2.png
-italian1, /emoji/sgsgb/italian1.png
-herrington, /emoji/sgsgb/herrington.png
-heavy_winninggreat, /emoji/sgsgb/heavy_winninggreat.png
-heavy_losingeh, /emoji/sgsgb/heavy_losingeh.png
-granddad, /emoji/sgsgb/granddad.png
-furrythink, /emoji/sgsgb/furrythink.png
+Advanced_Sorcery, /emoji/sgsgb/Advanced_Sorcery.png
FACE_QUAD, /emoji/sgsgb/FACE_QUAD.png
-dogcited, /emoji/sgsgb/dogcited.png
-denton, /emoji/sgsgb/denton.png
-denton_laugh, /emoji/sgsgb/denton_laugh.png
-debian, /emoji/sgsgb/debian.png
-catboythink, /emoji/sgsgb/catboythink.png
-cacolaugh, /emoji/sgsgb/cacolaugh.png
-bandits, /emoji/sgsgb/bandits.png
-bananya, /emoji/sgsgb/bananya.png
+Yukkuri_Reimu, /emoji/sgsgb/Yukkuri_Reimu.png
a_to, /emoji/sgsgb/a_to.png
angrypirds, /emoji/sgsgb/angrypirds.png
-Advanced_Sorcery, /emoji/sgsgb/Advanced_Sorcery.png
-Yukkuri_Reimu, /emoji/sgsgb/Yukkuri_Reimu.png
-vanpeek, /emoji/sgsgb/vanpeek.png
-tux, /emoji/sgsgb/tux.png
-tuturu, /emoji/sgsgb/tuturu.png
-tobdog, /emoji/sgsgb/tobdog.png
-thnk, /emoji/sgsgb/thnk.png
-stalkers, /emoji/sgsgb/stalkers.png
-spurdo, /emoji/sgsgb/spurdo.png
-smug_marisa, /emoji/sgsgb/smug_marisa.png
-shotging, /emoji/sgsgb/shotging.png
-shag, /emoji/sgsgb/shag.png
-serious, /emoji/sgsgb/serious.png
-scut, /emoji/sgsgb/scut.png
-sandro, /emoji/sgsgb/sandro.png
-puke, /emoji/sgsgb/puke.png
-kokoko, /emoji/sgsgb/kokoko.png
-the_e, /emoji/sgsgb/e.png
-avard_bios, /emoji/sgsgb/avard_bios.png
+annoying_dog_hole, /emoji/sgsgb/annoying_dog_hole.png
+award_bios, /emoji/sgsgb/award_bios.png
+bananya, /emoji/sgsgb/bananya.png
+bandits, /emoji/sgsgb/bandits.png
+blobcatknife, /emoji/sgsgb/blobcatknife.png
+cacolaugh, /emoji/sgsgb/cacolaugh.png
+catboythink, /emoji/sgsgb/catboythink.png
+cirno_run, /emoji/sgsgb/cirno_run.png
+debian, /emoji/sgsgb/debian.png
+denton, /emoji/sgsgb/denton.png
+denton_laugh, /emoji/sgsgb/denton_laugh.png
+dio, /emoji/sgsgb/dio.png
+dogcited, /emoji/sgsgb/dogcited.png
+dong, /emoji/sgsgb/dong.png
+duane, /emoji/sgsgb/duane.png
+e, /emoji/sgsgb/e.png
energy_star, /emoji/sgsgb/energy_star.png
+flynn_smirk, /emoji/sgsgb/flynn_smirk.png
+furrythink, /emoji/sgsgb/furrythink.png
+granddad, /emoji/sgsgb/granddad.png
+heavy_losingeh, /emoji/sgsgb/heavy_losingeh.png
+heavy_winninggreat, /emoji/sgsgb/heavy_winninggreat.png
+herrington, /emoji/sgsgb/herrington.png
+hogan, /emoji/sgsgb/hogan.png
+hyperjoy, /emoji/sgsgb/hyperjoy.png
+itisamystery, /emoji/sgsgb/itisamystery.png
+jacobson, /emoji/sgsgb/jacobson.png
+jake, /emoji/sgsgb/jake.png
+jyushimatsu_think, /emoji/sgsgb/jyushimatsu_think.png
+kinzo, /emoji/sgsgb/kinzo.png
+kms, /emoji/sgsgb/kms.png
+kokoko, /emoji/sgsgb/kokoko.png
loss, /emoji/sgsgb/loss.png
+luck, /emoji/sgsgb/luck.png
+lucknorm, /emoji/sgsgb/lucknorm.png
+marko, /emoji/sgsgb/marko.png
+megaman, /emoji/sgsgb/megaman.png
+miyanozoom, /emoji/sgsgb/miyanozoom.png
+monster_energy_ultra, /emoji/sgsgb/monster_energy_ultra.png
+moraledn, /emoji/sgsgb/moraledn.png
+moraleup, /emoji/sgsgb/moraleup.png
+multiply, /emoji/sgsgb/multiply.png
+mycomputer, /emoji/sgsgb/mycomputer.png
+necromancy1, /emoji/sgsgb/necromancy1.png
+necromancy2, /emoji/sgsgb/necromancy2.png
+necromancy3, /emoji/sgsgb/necromancy3.png
+nice, /emoji/sgsgb/nice.png
+nyoron, /emoji/sgsgb/nyoron.png
+ohgno, /emoji/sgsgb/ohgno.png
+ohyes, /emoji/sgsgb/ohyes.png
+orangeman, /emoji/sgsgb/orangeman.png
+payyap, /emoji/sgsgb/payyap.png
+pooh, /emoji/sgsgb/pooh.png
+poohington, /emoji/sgsgb/poohington.png
+poptepipic1, /emoji/sgsgb/poptepipic1.png
+poptepipic10, /emoji/sgsgb/poptepipic10.png
+poptepipic11, /emoji/sgsgb/poptepipic11.png
+poptepipic12, /emoji/sgsgb/poptepipic12.png
+poptepipic13, /emoji/sgsgb/poptepipic13.png
+poptepipic14, /emoji/sgsgb/poptepipic14.png
+poptepipic15, /emoji/sgsgb/poptepipic15.png
+poptepipic16, /emoji/sgsgb/poptepipic16.png
+poptepipic17, /emoji/sgsgb/poptepipic17.png
+poptepipic18, /emoji/sgsgb/poptepipic18.png
+poptepipic19, /emoji/sgsgb/poptepipic19.png
+poptepipic2, /emoji/sgsgb/poptepipic2.png
+poptepipic20, /emoji/sgsgb/poptepipic20.png
+poptepipic21, /emoji/sgsgb/poptepipic21.png
+poptepipic22, /emoji/sgsgb/poptepipic22.png
+poptepipic23, /emoji/sgsgb/poptepipic23.png
+poptepipic3, /emoji/sgsgb/poptepipic3.png
+poptepipic4, /emoji/sgsgb/poptepipic4.png
+poptepipic5, /emoji/sgsgb/poptepipic5.png
+poptepipic6, /emoji/sgsgb/poptepipic6.png
+poptepipic7, /emoji/sgsgb/poptepipic7.png
+poptepipic8, /emoji/sgsgb/poptepipic8.png
+poptepipic9, /emoji/sgsgb/poptepipic9.png
+puke, /emoji/sgsgb/puke.png
+quake_net, /emoji/sgsgb/quake_net.png
+quake_ram, /emoji/sgsgb/quake_ram.png
+ranger, /emoji/sgsgb/ranger.png
+ranger_none, /emoji/sgsgb/ranger_none.png
+risitas1, /emoji/sgsgb/risitas1.png
+risitas2, /emoji/sgsgb/risitas2.png
+rokalife, /emoji/sgsgb/rokalife.png
+sandro, /emoji/sgsgb/sandro.png
+scut, /emoji/sgsgb/scut.png
+serious, /emoji/sgsgb/serious.png
+shag, /emoji/sgsgb/shag.png
+shinitai_i, /emoji/sgsgb/shinitai_i.png
+shinitai_ni, /emoji/sgsgb/shinitai_ni.png
+shinitai_shi, /emoji/sgsgb/shinitai_shi.png
+shinitai_ta, /emoji/sgsgb/shinitai_ta.png
+shotging, /emoji/sgsgb/shotging.png
+skelethor, /emoji/sgsgb/skelethor.png
+smug_marisa, /emoji/sgsgb/smug_marisa.png
+spurdo, /emoji/sgsgb/spurdo.png
+stalkers, /emoji/sgsgb/stalkers.png
+tenshi_eating_corndog, /emoji/sgsgb/tenshi_eating_corndog.png
+thinkingwat, /emoji/sgsgb/thinkingwat.png
+thnk, /emoji/sgsgb/thnk.png
+tobdog, /emoji/sgsgb/tobdog.png
+todd, /emoji/sgsgb/todd.png
+trash, /emoji/sgsgb/trash.png
+tuturu, /emoji/sgsgb/tuturu.png
+tux, /emoji/sgsgb/tux.png
+uwot, /emoji/sgsgb/uwot.png
+uwot2, /emoji/sgsgb/uwot2.png
+uwot3, /emoji/sgsgb/uwot3.png
+vanpeek, /emoji/sgsgb/vanpeek.png
From a506b7e1d7731e0e4011aa10278c6d0b7f8faeef Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sat, 4 May 2019 15:28:27 +0300
Subject: [PATCH 013/132] undo priv_sid hacks
---
lib/pleroma/plugs/instance_static.ex | 2 +-
lib/pleroma/web/endpoint.ex | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/plugs/instance_static.ex b/lib/pleroma/plugs/instance_static.ex
index c63a9c95e..a64f1ea80 100644
--- a/lib/pleroma/plugs/instance_static.ex
+++ b/lib/pleroma/plugs/instance_static.ex
@@ -17,7 +17,7 @@ defmodule Pleroma.Plugs.InstanceStatic do
if File.exists?(instance_path) do
instance_path
else
- Path.join(Application.app_dir(:pleroma, "priv_sid/static/"), path)
+ Path.join(Application.app_dir(:pleroma, "priv/static/"), path)
end
end
diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex
index 7d1453a49..7f939991d 100644
--- a/lib/pleroma/web/endpoint.ex
+++ b/lib/pleroma/web/endpoint.ex
@@ -23,7 +23,7 @@ defmodule Pleroma.Web.Endpoint do
plug(
Plug.Static,
at: "/",
- from: "priv_sid/static",
+ from: :pleroma,
only:
~w(index.html robots.txt static finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc)
# credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength
From 733b53748c4813a9ceb60c321c68a7fb0d8b8e98 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 5 May 2019 23:57:11 +0300
Subject: [PATCH 014/132] more mrf
---
config/config.exs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index de642a748..92de2dbd1 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -295,7 +295,8 @@ config :pleroma, :mrf_simple,
"preteengirls.biz",
"melalandia.tk",
"pl.smuglo.li",
- "baraag.net"
+ "baraag.net",
+ "humblr.social"
],
federated_timeline_removal: [
"preteengirls.biz",
From 239f4d56bd308ebf9dd3150252144ae6489086bf Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 9 Feb 2020 21:30:43 +0200
Subject: [PATCH 015/132] update MRF
---
config/config.exs | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 87f48c17f..6e102333d 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -369,11 +369,18 @@ config :pleroma, :mrf_simple,
"melalandia.tk",
"pl.smuglo.li",
"baraag.net",
- "humblr.social"
+ "humblr.social",
+ "stereophonic.space",
+ "pawoo.net",
+ "sinblr.com"
],
federated_timeline_removal: [
"preteengirls.biz",
- "melalandia.tk"
+ "melalandia.tk",
+ "pawoo.net",
+ "baraag.net",
+ "humblr.social",
+ "sinblr.com"
],
report_removal: [],
reject: [],
From dfad261302dcb4b73af8e93e8d85eb5084635c67 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sat, 29 Feb 2020 15:22:32 +0200
Subject: [PATCH 016/132] fix bullshit new default
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index d9262d039..b3ee7ce09 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -245,7 +245,7 @@ config :pleroma, :instance,
mrf_transparency_exclusions: [],
autofollowed_nicknames: [],
max_pinned_statuses: 1,
- attachment_links: false,
+ attachment_links: true,
welcome_user_nickname: nil,
welcome_message: nil,
max_report_comment_size: 1000,
From 2a06b66daf6d00b741711471ff41fc6b08d67216 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 22 May 2020 00:33:59 +0300
Subject: [PATCH 017/132] fix
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 2cf1f7f43..ab8ac740f 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -274,7 +274,7 @@ config :pleroma, :markup,
config :pleroma, :frontend_configurations,
pleroma_fe: %{
- alwaysShowSubjectInput: false
+ alwaysShowSubjectInput: false,
background: "/static/sigsegv_s.png",
collapseMessageWithSubject: false,
disableChat: false,
From f20479ded8c60d58ee8b11deb5e6194dbf92b836 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 22 May 2020 00:37:24 +0300
Subject: [PATCH 018/132] fix
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index ab8ac740f..cb49583e9 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -288,7 +288,7 @@ config :pleroma, :frontend_configurations,
logo: "/static/logo.svg",
logoMargin: ".1em",
logoMask: true,
- minimalScopesMode: false,
+ minimalScopesMode: true,
noAttachmentLinks: false,
nsfwCensorImage: "",
postContentType: "text/plain",
From 080416f175b4a1562b8a1709938f64e89c82b206 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 27 Jul 2020 22:09:52 +0300
Subject: [PATCH 019/132] demilitarize
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index ad943de69..07182c7f1 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -172,7 +172,7 @@ config :mime, :types, %{
"application/ld+json" => ["activity+json"]
}
-config :tesla, adapter: Tesla.Adapter.Gun
+config :tesla, adapter: Tesla.Adapter.Hackney
# Configures http settings, upstream proxy etc.
config :pleroma, :http,
From 34272773b04f022839f9e557f36e41d5030d77e6 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 28 Jul 2020 21:51:59 +0300
Subject: [PATCH 020/132] important shit
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 07182c7f1..d738ca34c 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -222,7 +222,7 @@ config :pleroma, :instance,
],
autofollowed_nicknames: [],
max_pinned_statuses: 1,
- attachment_links: false,
+ attachment_links: true,
max_report_comment_size: 1000,
safe_dm_mentions: false,
healthcheck: false,
From 6d93391deecb595540af326a0a057b7da7a82cb2 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 31 Jul 2020 11:29:52 +0300
Subject: [PATCH 021/132] power time
---
config/config.exs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index d738ca34c..949983fb3 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -723,7 +723,8 @@ config :pleroma, :mrf,
policies: [
Pleroma.Web.ActivityPub.MRF.SimplePolicy,
Pleroma.Web.ActivityPub.MRF.HellthreadPolicy,
- Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy
+ Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy,
+ Pleroma.Web.ActivityPub.MRF.TagPolicy
],
transparency: true,
transparency_exclusions: []
From 461c465fe78d6a6e121a184cafa0730f81a42df8 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 18 Sep 2020 13:39:01 +0300
Subject: [PATCH 022/132] fix filenameposting
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 3533ff6ab..19055e465 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -73,7 +73,7 @@ config :pleroma, Pleroma.Upload,
]
],
filename_display_max_length: 30,
- default_description: nil
+ default_description: :filename
config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads"
From a756ec71a78a1540a1c3cb3491a2e5c5b00584e0 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 12 Apr 2021 00:38:25 +0300
Subject: [PATCH 023/132] try to fix ruffle on chrome
---
lib/pleroma/web/plugs/http_security_plug.ex | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/plugs/http_security_plug.ex b/lib/pleroma/web/plugs/http_security_plug.ex
index 0025b042a..1dcf02e1a 100644
--- a/lib/pleroma/web/plugs/http_security_plug.ex
+++ b/lib/pleroma/web/plugs/http_security_plug.ex
@@ -116,7 +116,9 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlug do
if Config.get(:env) == :dev do
"script-src 'self' 'unsafe-eval'"
else
- "script-src 'self'"
+ # TODO right now unsafe-eval is needed for WASM to load in chrome
+ # see: https://github.com/WebAssembly/content-security-policy/issues/7
+ "script-src 'self' 'unsafe-eval'"
end
report = if report_uri, do: ["report-uri ", report_uri, ";report-to csp-endpoint"]
From d860aa32f70e26668bc0f07611db27c1875b32d8 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Wed, 6 Apr 2022 11:16:53 +0300
Subject: [PATCH 024/132] revert to default CSP for testing
---
lib/pleroma/web/plugs/http_security_plug.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/plugs/http_security_plug.ex b/lib/pleroma/web/plugs/http_security_plug.ex
index 27ba83ec2..ab7c55f6e 100644
--- a/lib/pleroma/web/plugs/http_security_plug.ex
+++ b/lib/pleroma/web/plugs/http_security_plug.ex
@@ -119,7 +119,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlug do
else
# TODO right now unsafe-eval is needed for WASM to load in chrome
# see: https://github.com/WebAssembly/content-security-policy/issues/7
- "script-src 'self' 'unsafe-eval'"
+ "script-src 'self'"
end
report = if report_uri, do: ["report-uri ", report_uri, ";report-to csp-endpoint"]
From 0613478bdb56b4a8592deb004a4a1b6000edca87 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 19 Apr 2022 17:56:26 +0300
Subject: [PATCH 025/132] engage db congfiguration
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index eb9aa35df..0ca995ebb 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -783,7 +783,7 @@ config :pleroma, :web_cache_ttl,
config :pleroma, :modules, runtime_dir: "instance/modules"
-config :pleroma, configurable_from_database: false
+config :pleroma, configurable_from_database: true
config :pleroma, Pleroma.Repo,
parameters: [gin_fuzzy_search_limit: "500"],
From aa38f1da418a1bb423e06963aad0fed53ab9524b Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 19 Apr 2022 18:16:30 +0300
Subject: [PATCH 026/132] resolve deprecation warnings in conf
---
config/config.exs | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 0ca995ebb..500a9834b 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -214,7 +214,7 @@ config :pleroma, :instance,
],
allow_relay: true,
public: true,
- quarantined_instances: ["pleroma.rareome.ga"],
+ quarantined_instances: [{ "pleroma.rareome.ga", "leaks private posts or sumshit i dont rember" }],
static_dir: "instance/static/",
allowed_post_formats: [
"text/plain",
@@ -379,22 +379,21 @@ config :pleroma, :mrf_hellthread,
config :pleroma, :mrf_simple,
media_removal: [],
media_nsfw: [
- "preteengirls.biz",
- "melalandia.tk",
- "pl.smuglo.li",
- "baraag.net",
- "humblr.social",
- "stereophonic.space",
- "pawoo.net",
- "sinblr.com"
+ { "preteengirls.biz", "pron or even cp" },
+ { "melalandia.tk", "i don't rember" },
+ { "pl.smuglo.li", "instance is dead but i still remember, rip smuglo" },
+ { "baraag.net", "pron" },
+ { "humblr.social", "3dpd pron" }
+ { "pawoo.net", "tasteful pron, mostly." },
+ { "sinblr.com", "3dpd pron" }
],
federated_timeline_removal: [
- "preteengirls.biz",
- "melalandia.tk",
- "pawoo.net",
- "baraag.net",
- "humblr.social",
- "sinblr.com"
+ { "preteengirls.biz", "pron or even cp" },
+ { "melalandia.tk", "i don't rember" },
+ { "baraag.net", "pron" },
+ { "humblr.social", "3dpd pron" }
+ { "pawoo.net", "tasteful pron, mostly." },
+ { "sinblr.com", "3dpd pron" }
],
report_removal: [],
reject: [],
From d08362cb30725e506651995344ae327771cc3cb5 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 19 Apr 2022 18:17:25 +0300
Subject: [PATCH 027/132] hups
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 500a9834b..94efa40a8 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -383,7 +383,7 @@ config :pleroma, :mrf_simple,
{ "melalandia.tk", "i don't rember" },
{ "pl.smuglo.li", "instance is dead but i still remember, rip smuglo" },
{ "baraag.net", "pron" },
- { "humblr.social", "3dpd pron" }
+ { "humblr.social", "3dpd pron" },
{ "pawoo.net", "tasteful pron, mostly." },
{ "sinblr.com", "3dpd pron" }
],
From 46c4d3b80f1e95c85f1ff631d56d2aa577a780d2 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 19 Apr 2022 18:17:41 +0300
Subject: [PATCH 028/132] huuups
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 94efa40a8..a81b70382 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -391,7 +391,7 @@ config :pleroma, :mrf_simple,
{ "preteengirls.biz", "pron or even cp" },
{ "melalandia.tk", "i don't rember" },
{ "baraag.net", "pron" },
- { "humblr.social", "3dpd pron" }
+ { "humblr.social", "3dpd pron" },
{ "pawoo.net", "tasteful pron, mostly." },
{ "sinblr.com", "3dpd pron" }
],
From f72beb6c2625331877872515d69d13f63a944b8e Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Fri, 10 Mar 2023 00:08:08 +0200
Subject: [PATCH 029/132] testing newer pot
---
mix.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mix.exs b/mix.exs
index 8aa18d5ee..d225c9f7c 100644
--- a/mix.exs
+++ b/mix.exs
@@ -179,7 +179,7 @@ defmodule Pleroma.Mixfile do
{:recon, "~> 2.5"},
{:joken, "~> 2.0"},
{:benchee, "~> 1.0"},
- {:pot, "~> 1.0"},
+ {:pot, "~> 1.0.2"},
{:esshd, "~> 0.1.0", runtime: Application.get_env(:esshd, :enabled, false)},
{:ex_const, "~> 0.2"},
{:plug_static_index_html, "~> 1.0.0"},
From ece1f7bca65e8c97ff57b6594a88a3e16cd0611d Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 20 Mar 2023 21:29:24 +0200
Subject: [PATCH 030/132] Revert "testing newer pot"
This reverts commit f72beb6c2625331877872515d69d13f63a944b8e.
---
mix.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mix.exs b/mix.exs
index d225c9f7c..8aa18d5ee 100644
--- a/mix.exs
+++ b/mix.exs
@@ -179,7 +179,7 @@ defmodule Pleroma.Mixfile do
{:recon, "~> 2.5"},
{:joken, "~> 2.0"},
{:benchee, "~> 1.0"},
- {:pot, "~> 1.0.2"},
+ {:pot, "~> 1.0"},
{:esshd, "~> 0.1.0", runtime: Application.get_env(:esshd, :enabled, false)},
{:ex_const, "~> 0.2"},
{:plug_static_index_html, "~> 1.0.0"},
From f39a86344cfc5504b210da70cba46c194f03e535 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 16:41:30 -0600
Subject: [PATCH 031/132] ObjectValidators: accept "quoteUrl" field
---
.../web/activity_pub/object_validators/common_fields.ex | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
index d580208df..835ed97b7 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
@@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
end
end
- # All objects except Answer and CHatMessage
+ # All objects except Answer and ChatMessage
defmacro object_fields do
quote bind_quoted: binding() do
field(:content, :string)
@@ -58,6 +58,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
field(:like_count, :integer, default: 0)
field(:announcement_count, :integer, default: 0)
field(:inReplyTo, ObjectValidators.ObjectID)
+ field(:quoteUrl, ObjectValidators.ObjectID)
field(:url, ObjectValidators.BareUri)
field(:likes, {:array, ObjectValidators.ObjectID}, default: [])
From 4c90f39e144841d8020fc063cee07d8f7acf158d Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 17:30:49 -0600
Subject: [PATCH 032/132] Quote post: add fixtures
---
.../quote_post/fedibird_quote_post.json | 52 +++++++++++++++++++
.../quote_post/misskey_quote_post.json | 46 ++++++++++++++++
2 files changed, 98 insertions(+)
create mode 100644 test/fixtures/quote_post/fedibird_quote_post.json
create mode 100644 test/fixtures/quote_post/misskey_quote_post.json
diff --git a/test/fixtures/quote_post/fedibird_quote_post.json b/test/fixtures/quote_post/fedibird_quote_post.json
new file mode 100644
index 000000000..ebf383356
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_post.json
@@ -0,0 +1,52 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "expiry": "toot:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-22T02:07:16Z",
+ "url": "https://fedibird.com/@noellabo/107663670404015196",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-22:objectId=107663670404038002:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107663670404038002",
+ "quoteURL": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_quote": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_content": "いつの生まれだシトリン",
+ "content": "いつの生まれだシトリン
QT: https://misskey.io/notes/8vsn2izjwh
",
+ "contentMap": {
+ "ja": "いつの生まれだシトリン
QT: https://misskey.io/notes/8vsn2izjwh
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/fixtures/quote_post/misskey_quote_post.json b/test/fixtures/quote_post/misskey_quote_post.json
new file mode 100644
index 000000000..59f677ca9
--- /dev/null
+++ b/test/fixtures/quote_post/misskey_quote_post.json
@@ -0,0 +1,46 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/8vs6ylpfez",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/7rkrarq81i",
+ "summary": null,
+ "content": "投稿者の設定によるね
Fanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある
RE: https://misskey.io/notes/8vs6wxufd0
",
+ "_misskey_content": "投稿者の設定によるね\nFanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある",
+ "_misskey_quote": "https://misskey.io/notes/8vs6wxufd0",
+ "quoteUrl": "https://misskey.io/notes/8vs6wxufd0",
+ "published": "2022-01-21T16:38:30.243Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/7rkrarq81i/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
From 2c17d29c4b4070fe3db81c61ae33bbdea89a25d2 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 18:03:22 -0600
Subject: [PATCH 033/132] ObjectValidators: improve quoteUrl compatibility
---
.../article_note_page_validator.ex | 16 +++++++++++++++
.../article_note_page_validator_test.exs | 20 +++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 2670e3f17..40bb67934 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -76,6 +76,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
def fix_attachments(data), do: data
+ defp fix_quote_url(%{"quoteUrl" => _quote_url} = data), do: data
+
+ # Fix for Fedibird
+ # https://github.com/fedibird/mastodon/issues/9
+ defp fix_quote_url(%{"quoteURL" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ # Misskey fallback
+ defp fix_quote_url(%{"_misskey_quote" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ defp fix_quote_url(data), do: data
+
defp fix(data) do
data
|> CommonFixes.fix_actor()
@@ -84,6 +99,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
|> fix_tag()
|> fix_replies()
|> fix_attachments()
+ |> fix_quote_url()
|> Transmogrifier.fix_emoji()
|> Transmogrifier.fix_content_map()
end
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index c7a62be18..c3cde00b5 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -116,4 +116,24 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
%{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
end
+
+ test "Fedibird quote post" do
+ insert(:user, ap_id: "https://fedibird.com/users/noellabo")
+
+ data = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
+ chg = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert chg.valid?
+ assert chg.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
+ end
+
+ test "Misskey quote post" do
+ insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
+
+ data = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+ chg = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert chg.valid?
+ assert chg.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
+ end
end
From f01e2d090208e1db9c537fad0be8f452b29b54ce Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 18:46:58 -0600
Subject: [PATCH 034/132] Transmogrifier: fetch quoted post
---
.../web/activity_pub/transmogrifier.ex | 17 +++++
test/fixtures/tesla_mock/aimu@misskey.io.json | 64 +++++++++++++++++++
.../tesla_mock/misskey.io_8vs6wxufd0.json | 44 +++++++++++++
.../web/activity_pub/transmogrifier_test.exs | 22 +++++++
test/support/http_request_mock.ex | 18 ++++++
5 files changed, 165 insertions(+)
create mode 100644 test/fixtures/tesla_mock/aimu@misskey.io.json
create mode 100644 test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 0e6c429f9..c466271ca 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -166,6 +166,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(object, _options), do: object
+ def fix_quote(object, options \\ [])
+
+ def fix_quote(%{"quoteUrl" => quote_url} = object, options)
+ when not is_nil(quote_url) do
+ with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
+ %Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
+ Map.put(object, "quoteUrl", quoted_object.data["id"])
+ else
+ e ->
+ Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}")
+ object
+ end
+ end
+
+ def fix_quote(object, _options), do: object
+
defp prepare_in_reply_to(in_reply_to) do
cond do
is_bitstring(in_reply_to) ->
@@ -454,6 +470,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
+ |> fix_quote(fetch_options)
data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
diff --git a/test/fixtures/tesla_mock/aimu@misskey.io.json b/test/fixtures/tesla_mock/aimu@misskey.io.json
new file mode 100644
index 000000000..9ff4cb6d0
--- /dev/null
+++ b/test/fixtures/tesla_mock/aimu@misskey.io.json
@@ -0,0 +1,64 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "type": "Person",
+ "id": "https://misskey.io/users/83ssedkv53",
+ "inbox": "https://misskey.io/users/83ssedkv53/inbox",
+ "outbox": "https://misskey.io/users/83ssedkv53/outbox",
+ "followers": "https://misskey.io/users/83ssedkv53/followers",
+ "following": "https://misskey.io/users/83ssedkv53/following",
+ "sharedInbox": "https://misskey.io/inbox",
+ "endpoints": {
+ "sharedInbox": "https://misskey.io/inbox"
+ },
+ "url": "https://misskey.io/@aimu",
+ "preferredUsername": "aimu",
+ "name": "あいむ",
+ "summary": "わずかな作曲要素 巣穴で独り言
Twitter https://twitter.com/aimu_53
Soundcloud https://soundcloud.com/aimu-53
",
+ "icon": {
+ "type": "Image",
+ "url": "https://s3.arkjp.net/misskey/webpublic-3f7e93c0-34f5-443c-acc0-f415cb2342b4.jpg",
+ "sensitive": false,
+ "name": null
+ },
+ "image": {
+ "type": "Image",
+ "url": "https://s3.arkjp.net/misskey/webpublic-2db63d1d-490b-488b-ab62-c93c285f26b6.png",
+ "sensitive": false,
+ "name": null
+ },
+ "tag": [],
+ "manuallyApprovesFollowers": false,
+ "discoverable": true,
+ "publicKey": {
+ "id": "https://misskey.io/users/83ssedkv53#main-key",
+ "type": "Key",
+ "owner": "https://misskey.io/users/83ssedkv53",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1ylhePJ6qGHmwHSBP17b\nIosxGaiFKvgDBgZdm8vzvKeRSqJV9uLHfZL3pO/Zt02EwaZd2GohZAtBZEF8DbMA\n3s93WAesvyGF9mjGrYYKlhp/glwyrrrbf+RdD0DLtyDwRRlrxp3pS2lLmv5Tp1Zl\npH+UKpOnNrpQqjHI5P+lEc9bnflzbRrX+UiyLNsVAP80v4wt7SZfT/telrU6mDru\n998UdfhUo7bDKeDsHG1PfLpyhhtfdoZub4kBpkyacHiwAd+CdCjR54Eu7FDwVK3p\nY3JcrT2q5stgMqN1m4QgSL4XAADIotWwDYttTJejM1n9dr+6VWv5bs0F2Q/6gxOp\nu5DQZLk4Q+64U4LWNox6jCMOq3fYe0g7QalJIHnanYQQo+XjoH6S1Aw64gQ3Ip2Y\nZBmZREAOR7GMFVDPFnVnsbCHnIAv16TdgtLgQBAihkWEUuPqITLi8PMu6kMr3uyq\nYkObEfH0TNTcqaiVpoXv791GZLEUV5ROl0FSUANLNkHZZv29xZ5JDOBOR1rNBLyH\ngVtW8rpszYqOXwzX23hh4WsVXfB7YgNvIijwjiaWbzsecleaENGEnLNMiVKVumTj\nmtyTeFJpH0+OaSrUYpemRRJizmqIjklKsNwUEwUb2WcUUg92o56T2obrBkooabZe\nwgSXSKTOcjsR/ju7+AuIyvkCAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ },
+ "isCat": true,
+ "vcard:bday": "5353-05-03"
+}
diff --git a/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
new file mode 100644
index 000000000..323ca10ed
--- /dev/null
+++ b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
@@ -0,0 +1,44 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/8vs6wxufd0",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/83ssedkv53",
+ "summary": null,
+ "content": "Fantiaこれできないように過去のやつは従量課金だった気がする
",
+ "_misskey_content": "Fantiaこれできないように過去のやつは従量課金だった気がする",
+ "published": "2022-01-21T16:37:12.663Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/83ssedkv53/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 3e0c8dc65..2c8e5ba21 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -136,6 +136,28 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
tag = object.data["tag"] |> List.first()
assert tag["type"] == "Mention"
end
+
+ test "it accepts quote posts" do
+ insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
+
+ object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+
+ message = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "type" => "Create",
+ "actor" => "https://misskey.io/users/7rkrarq81i",
+ "object" => object
+ }
+
+ assert {:ok, activity} = Transmogrifier.handle_incoming(message)
+
+ # Object was created in the database
+ object = Object.normalize(activity)
+ assert object.data["quoteUrl"] == "https://misskey.io/notes/8vs6wxufd0"
+
+ # It fetched the quoted post
+ assert Object.normalize("https://misskey.io/notes/8vs6wxufd0")
+ end
end
describe "prepare outgoing" do
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index b0cf613ac..78a367024 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -1380,6 +1380,15 @@ defmodule HttpRequestMock do
}}
end
+ def get("https://misskey.io/users/83ssedkv53", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/aimu@misskey.io.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
def get("https://gleasonator.com/users/macgirvin", _, _, _) do
{:ok,
%Tesla.Env{
@@ -1446,6 +1455,15 @@ defmodule HttpRequestMock do
}}
end
+ def get("https://misskey.io/notes/8vs6wxufd0", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
def get(url, query, body, headers) do
{:error,
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}
From 5fdf4d1b1cef53033b672d971782283196891ca7 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 19:14:39 -0600
Subject: [PATCH 035/132] Transmogrifier: fix quoteUrl here too
---
.../web/activity_pub/transmogrifier.ex | 23 +++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index c466271ca..f5771e75e 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -166,9 +166,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(object, _options), do: object
- def fix_quote(object, options \\ [])
+ def fix_quote_url(object, options \\ [])
- def fix_quote(%{"quoteUrl" => quote_url} = object, options)
+ def fix_quote_url(%{"quoteUrl" => quote_url} = object, options)
when not is_nil(quote_url) do
with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
%Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
@@ -180,7 +180,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
end
- def fix_quote(object, _options), do: object
+ # Fix for Fedibird
+ # https://github.com/fedibird/mastodon/issues/9
+ def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUrl", quote_url)
+ |> fix_quote_url(options)
+ end
+
+ # Misskey fallback
+ def fix_quote_url(%{"_misskey_quote" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUrl", quote_url)
+ |> fix_quote_url(options)
+ end
+
+ def fix_quote_url(object, _options), do: object
defp prepare_in_reply_to(in_reply_to) do
cond do
@@ -470,7 +485,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
- |> fix_quote(fetch_options)
+ |> fix_quote_url(fetch_options)
data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
From d10408558e4cf487a177aad9c8694770a0600f49 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 19:47:08 -0600
Subject: [PATCH 036/132] StatusView: show quoted posts through the API,
probably
---
.../web/mastodon_api/views/status_view.ex | 42 ++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index dea22f9c2..b966a84d0 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -57,6 +57,27 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end)
end
+ defp get_quoted_activities([]), do: %{}
+
+ defp get_quoted_activities(activities) do
+ activities
+ |> Enum.map(fn
+ %{data: %{"type" => "Create"}} = activity ->
+ object = Object.normalize(activity, fetch: false)
+ object && object.data["quoteUrl"] != "" && object.data["quoteUrl"]
+
+ _ ->
+ nil
+ end)
+ |> Enum.filter(& &1)
+ |> Activity.create_by_object_ap_id_with_object()
+ |> Repo.all()
+ |> Enum.reduce(%{}, fn activity, acc ->
+ object = Object.normalize(activity, fetch: false)
+ if object, do: Map.put(acc, object.data["id"], activity), else: acc
+ end)
+ end
+
# DEPRECATED This field seems to be a left-over from the StatusNet era.
# If your application uses `pleroma.conversation_id`: this field is deprecated.
# It is currently stubbed instead by doing a CRC32 of the context, and
@@ -97,6 +118,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# length(activities_with_links) * timeout
fetch_rich_media_for_activities(activities)
replied_to_activities = get_replied_to_activities(activities)
+ quoted_activities = get_quoted_activities(activities)
parent_activities =
activities
@@ -129,6 +151,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
opts =
opts
|> Map.put(:replied_to_activities, replied_to_activities)
+ |> Map.put(:quoted_activities, quoted_activities)
|> Map.put(:parent_activities, parent_activities)
|> Map.put(:relationships, relationships_opt)
@@ -277,7 +300,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
reply_to = get_reply_to(activity, opts)
-
reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"])
history_len =
@@ -290,6 +312,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# Here the implicit index of the current content is 0
chrono_order = history_len - 1
+ quote_activity = get_quote(activity, opts)
+
content =
object
|> render_content()
@@ -398,6 +422,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
conversation_id: get_context_id(activity),
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
+ quote_id: quote_activity && to_string(quote_activity.id),
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
@@ -633,6 +658,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
+ def get_quote(activity, %{quoted_activities: quoted_activities}) do
+ object = Object.normalize(activity, fetch: false)
+ quoted_activities[object.data["quoteUrl"]]
+ end
+
+ def get_quote(%{data: %{"object" => _object}} = activity, _) do
+ object = Object.normalize(activity, fetch: false)
+
+ if object.data["quoteUrl"] && object.data["quoteUrl"] != "" do
+ Activity.get_create_by_object_ap_id(object.data["quoteUrl"])
+ else
+ nil
+ end
+ end
+
def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do
url = object.data["url"] || object.data["id"]
From f95cad4603365e49fa002ccc32a54b1b91d1e81c Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 20:05:58 -0600
Subject: [PATCH 037/132] StatusView: render the whole quoted status
---
lib/pleroma/web/api_spec/schemas/status.ex | 5 +++++
lib/pleroma/web/mastodon_api/views/status_view.ex | 10 +++++++++-
.../web/mastodon_api/views/status_view_test.exs | 1 +
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index bc29cf4a6..39241aa39 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -193,6 +193,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "The `acct` property of User entity for replied user (if any)"
},
+ quote: %Schema{
+ allOf: [%OpenApiSpex.Reference{"$ref": "#/components/schemas/Status"}],
+ nullable: true,
+ description: "Quoted status (if any)"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index b966a84d0..5bde1ce04 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -314,6 +314,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_activity = get_quote(activity, opts)
+ quote_post =
+ if quote_activity do
+ quote_rendering_opts = Map.put(opts, :activity, quote_activity)
+ render("show.json", quote_rendering_opts)
+ else
+ nil
+ end
+
content =
object
|> render_content()
@@ -422,7 +430,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
conversation_id: get_context_id(activity),
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
- quote_id: quote_activity && to_string(quote_activity.id),
+ quote: quote_post,
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index b93335190..b10b0f0b9 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -326,6 +326,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
conversation_id: convo_id,
context: object_data["context"],
in_reply_to_account_acct: nil,
+ quote: nil,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
From fe5b8cbe05df3cb6b112295f3d32228bc39eb0a4 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 21:27:05 -0600
Subject: [PATCH 038/132] ActivityDraft: create quote posts
---
lib/pleroma/web/common_api/activity_draft.ex | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 9af635da8..2fb63d13a 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -22,6 +22,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
attachments: [],
in_reply_to: nil,
in_reply_to_conversation: nil,
+ quote_post: nil,
visibility: nil,
expires_at: nil,
extra: nil,
@@ -53,6 +54,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|> poll()
|> with_valid(&in_reply_to/1)
|> with_valid(&in_reply_to_conversation/1)
+ |> with_valid("e_post/1)
|> with_valid(&visibility/1)
|> content()
|> with_valid(&to_and_cc/1)
@@ -132,6 +134,18 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
+ defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
+
+ defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
+ %__MODULE__{draft | quote_post: Activity.get_by_id(id)}
+ end
+
+ defp quote_post(%{params: %{quote_id: %Activity{} = quote_post}} = draft) do
+ %__MODULE__{draft | quote_post: quote_post}
+ end
+
+ defp quote_post(draft), do: draft
+
defp in_reply_to_conversation(draft) do
in_reply_to_conversation = Participation.get(draft.params[:in_reply_to_conversation_id])
%__MODULE__{draft | in_reply_to_conversation: in_reply_to_conversation}
From a938a96ae80e25b386638ab1adbea0d2b9520180 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:15:54 -0600
Subject: [PATCH 039/132] ActivityDraft: allow quoting
---
lib/pleroma/web/activity_pub/builder.ex | 11 +++++++++++
.../web/api_spec/operations/status_operation.ex | 7 ++++++-
test/pleroma/web/common_api_test.exs | 12 ++++++++++++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex
index 8eab3a241..eb0bb0e33 100644
--- a/lib/pleroma/web/activity_pub/builder.ex
+++ b/lib/pleroma/web/activity_pub/builder.ex
@@ -217,6 +217,7 @@ defmodule Pleroma.Web.ActivityPub.Builder do
"tag" => Keyword.values(draft.tags) |> Enum.uniq()
}
|> add_in_reply_to(draft.in_reply_to)
+ |> add_quote(draft.quote_post)
|> Map.merge(draft.extra)
{:ok, data, []}
@@ -232,6 +233,16 @@ defmodule Pleroma.Web.ActivityPub.Builder do
end
end
+ defp add_quote(object, nil), do: object
+
+ defp add_quote(object, quote_post) do
+ with %Object{} = quote_object <- Object.normalize(quote_post, fetch: false) do
+ Map.put(object, "quoteUrl", quote_object.data["id"])
+ else
+ _ -> object
+ end
+ end
+
def chat_message(actor, recipient, content, opts \\ []) do
basic = %{
"id" => Utils.generate_object_id(),
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 5d6e82f3c..8fa3b0890 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -581,7 +581,12 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
type: :string,
description:
"Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`."
- }
+ },
+ quote_id: %Schema{
+ nullable: true,
+ allOf: [FlakeID],
+ description: "ID of the status being quoted, if any"
+ },
},
example: %{
"status" => "What time is it?",
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 968e11a14..d26dfd6b8 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -778,6 +778,18 @@ defmodule Pleroma.Web.CommonAPITest do
scheduled_at: expires_at
)
end
+
+ test "it allows allows quote posting" do
+ user = insert(:user)
+
+ {:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id})
+
+ quoted = Object.normalize(quoted)
+ quote_post = Object.normalize(quote_post)
+
+ assert quote_post.data["quoteUrl"] == quoted.data["id"]
+ end
end
describe "reactions" do
From bc2ffd0c1697f27e29331bf2b7b5e7b8b0dffc9e Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:29:13 -0600
Subject: [PATCH 040/132] BuilderTest: build quote post
---
.../pleroma/web/activity_pub/builder_test.exs | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/test/pleroma/web/activity_pub/builder_test.exs b/test/pleroma/web/activity_pub/builder_test.exs
index eb175a1be..52058a0a3 100644
--- a/test/pleroma/web/activity_pub/builder_test.exs
+++ b/test/pleroma/web/activity_pub/builder_test.exs
@@ -44,5 +44,34 @@ defmodule Pleroma.Web.ActivityPub.BuilderTest do
assert {:ok, ^expected, []} = Builder.note(draft)
end
+
+ test "quote post" do
+ user = insert(:user)
+ note = insert(:note)
+
+ draft = %ActivityDraft{
+ user: user,
+ context: "2hu",
+ content_html: "This is :moominmamma: note
",
+ quote_post: note,
+ extra: %{}
+ }
+
+ expected = %{
+ "actor" => user.ap_id,
+ "attachment" => [],
+ "content" => "This is :moominmamma: note
",
+ "context" => "2hu",
+ "sensitive" => false,
+ "type" => "Note",
+ "quoteUrl" => note.data["id"],
+ "cc" => [],
+ "summary" => nil,
+ "tag" => [],
+ "to" => []
+ }
+
+ assert {:ok, ^expected, []} = Builder.note(draft)
+ end
end
end
From b9c10c61b715daa6eb37328e84aed3bdd4c56328 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:35:08 -0600
Subject: [PATCH 041/132] StatusControllerTest: test creating a quote post
---
.../controllers/status_controller_test.exs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
index 4f434cb69..f38557c15 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -125,6 +125,25 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
)
end
+ test "posting a quote post", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, %{id: activity_id}} = CommonAPI.post(user, %{status: "yolo"})
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "indeed",
+ "quote_id" => activity_id
+ })
+
+ assert %{"id" => id, "pleroma" => %{"quote" => %{"id" => ^activity_id}}} =
+ json_response_and_validate_schema(conn, 200)
+
+ assert Activity.get_by_id(id)
+ end
+
test "it fails to create a status if `expires_in` is less or equal than an hour", %{
conn: conn
} do
From efd6d40a40611a049b95afe94e8276f54f0b852a Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:41:57 -0600
Subject: [PATCH 042/132] TransmogrifierTest: prepare an outgoing quote post
---
.../pleroma/web/activity_pub/transmogrifier_test.exs | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 2c8e5ba21..824398e38 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -372,6 +372,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
}
} = prepared["object"]
end
+
+ test "it prepares a quote post" do
+ user = insert(:user)
+
+ {:ok, quoted_post} = CommonAPI.post(user, %{status: "hey"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "hey", quote_id: quoted_post.id})
+
+ {:ok, modified} = Transmogrifier.prepare_outgoing(quote_post.data)
+
+ quoted_post = Object.normalize(quoted_post)
+ assert modified["object"]["quoteUrl"] == quoted_post.data["id"]
+ end
end
describe "actor rewriting" do
From 57e4e4304246def26098ad5fe473fbe8a7b42fcf Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:57:42 -0600
Subject: [PATCH 043/132] mix format
---
lib/pleroma/web/api_spec/operations/status_operation.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 8fa3b0890..c133a3aac 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -586,7 +586,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
nullable: true,
allOf: [FlakeID],
description: "ID of the status being quoted, if any"
- },
+ }
},
example: %{
"status" => "What time is it?",
From 72a0236c9acd80a54536ecac509d0b92fdb9aa70 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:02:44 -0600
Subject: [PATCH 044/132] Fix typos
---
.../article_note_page_validator_test.exs | 12 ++++++------
test/pleroma/web/common_api_test.exs | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index c3cde00b5..dec2e28c9 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -121,19 +121,19 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
insert(:user, ap_id: "https://fedibird.com/users/noellabo")
data = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
- chg = ArticleNotePageValidator.cast_and_validate(data)
+ cng = ArticleNotePageValidator.cast_and_validate(data)
- assert chg.valid?
- assert chg.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
end
test "Misskey quote post" do
insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
data = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
- chg = ArticleNotePageValidator.cast_and_validate(data)
+ cng = ArticleNotePageValidator.cast_and_validate(data)
- assert chg.valid?
- assert chg.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index d26dfd6b8..99c1a317f 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -779,7 +779,7 @@ defmodule Pleroma.Web.CommonAPITest do
)
end
- test "it allows allows quote posting" do
+ test "it allows quote posting" do
user = insert(:user)
{:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
From e47c6a24453ee23a5764247849a8ace292913b68 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:09:33 -0600
Subject: [PATCH 045/132] InstanceView: add "quote_posting" feature
---
lib/pleroma/web/mastodon_api/views/instance_view.ex | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex
index efd2a0af6..1b01d7371 100644
--- a/lib/pleroma/web/mastodon_api/views/instance_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex
@@ -69,6 +69,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
"editing",
+ "quote_posting",
if Config.get([:activitypub, :blockers_visible]) do
"blockers_visible"
end,
From 2f9a098dd597edb16f4fab7809d936a04ae6cabb Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:29:55 -0600
Subject: [PATCH 046/132] @context: add quoteUrl
---
priv/static/schemas/litepub-0.1.jsonld | 1 +
1 file changed, 1 insertion(+)
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 650118475..5d8244a11 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -26,6 +26,7 @@
"@id": "litepub:listMessage",
"@type": "@id"
},
+ "quoteUrl": "as:quoteUrl",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
"@type": "@id"
From 4bcdf0cf4fe6c9084ffb107e5fdf9ca8d02b39c7 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 13:55:25 -0600
Subject: [PATCH 047/132] Return quote_url through the API, don't render quotes
more than 1 level deep
---
lib/pleroma/web/api_spec/schemas/status.ex | 6 +++++
.../web/mastodon_api/views/status_view.ex | 7 +++++-
.../controllers/status_controller_test.exs | 9 +++++---
.../mastodon_api/views/status_view_test.exs | 23 +++++++++++++++++++
4 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index 39241aa39..f4ee9b38c 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -198,6 +198,12 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "Quoted status (if any)"
},
+ quote_url: %Schema{
+ type: :string,
+ format: :uri,
+ nullable: true,
+ description: "URL of the quoted status"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 5bde1ce04..06adfb221 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -316,7 +316,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_post =
if quote_activity do
- quote_rendering_opts = Map.put(opts, :activity, quote_activity)
+ quote_rendering_opts = Map.merge(opts, %{activity: quote_activity, show_quote: false})
render("show.json", quote_rendering_opts)
else
nil
@@ -431,6 +431,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote: quote_post,
+ quote_url: object.data["quoteUrl"],
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
@@ -666,6 +667,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
+ def get_quote(_activity, %{show_quote: false}) do
+ nil
+ end
+
def get_quote(activity, %{quoted_activities: quoted_activities}) do
object = Object.normalize(activity, fetch: false)
quoted_activities[object.data["quoteUrl"]]
diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
index f38557c15..7c9ac3147 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -128,7 +128,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
test "posting a quote post", %{conn: conn} do
user = insert(:user)
- {:ok, %{id: activity_id}} = CommonAPI.post(user, %{status: "yolo"})
+ {:ok, %{id: activity_id} = activity} = CommonAPI.post(user, %{status: "yolo"})
+ %{data: %{"id" => quote_url}} = Object.normalize(activity)
conn =
conn
@@ -138,8 +139,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
"quote_id" => activity_id
})
- assert %{"id" => id, "pleroma" => %{"quote" => %{"id" => ^activity_id}}} =
- json_response_and_validate_schema(conn, 200)
+ assert %{
+ "id" => id,
+ "pleroma" => %{"quote" => %{"id" => ^activity_id}, "quote_url" => ^quote_url}
+ } = json_response_and_validate_schema(conn, 200)
assert Activity.get_by_id(id)
end
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index b10b0f0b9..f50b02799 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -327,6 +327,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
context: object_data["context"],
in_reply_to_account_acct: nil,
quote: nil,
+ quote_url: nil,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
@@ -423,6 +424,28 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert status.in_reply_to_id == to_string(note.id)
end
+ test "a quote post" do
+ post = insert(:note_activity)
+ user = insert(:user)
+
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "he", quote_id: post.id})
+ {:ok, quoted_quote_post} = CommonAPI.post(user, %{status: "yo", quote_id: quote_post.id})
+
+ status = StatusView.render("show.json", %{activity: quoted_quote_post})
+
+ assert status.pleroma.quote.id == to_string(quote_post.id)
+ assert status.pleroma.quote_url == Object.normalize(quote_post).data["id"]
+
+ # Quotes don't go more than one level deep
+ refute status.pleroma.quote.pleroma.quote
+ assert status.pleroma.quote.pleroma.quote_url == Object.normalize(post).data["id"]
+
+ # In an index
+ [status] = StatusView.render("index.json", %{activities: [quoted_quote_post], as: :activity})
+
+ assert status.pleroma.quote.id == to_string(quote_post.id)
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
From cca63d707db58ce5eaea96ac2962418bf3df5740 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 15:46:44 -0600
Subject: [PATCH 048/132] ActivityDraft: mention the OP of a quoted post
---
lib/pleroma/web/common_api/activity_draft.ex | 19 +++++++++++--------
test/pleroma/web/common_api_test.exs | 12 ++++++++++++
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 2fb63d13a..750750b7a 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -137,11 +137,11 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
- %__MODULE__{draft | quote_post: Activity.get_by_id(id)}
- end
-
- defp quote_post(%{params: %{quote_id: %Activity{} = quote_post}} = draft) do
- %__MODULE__{draft | quote_post: quote_post}
+ with %Activity{actor: actor_ap_id} = activity <- Activity.get_by_id(id) do
+ %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
+ else
+ _ -> draft
+ end
end
defp quote_post(draft), do: draft
@@ -178,12 +178,15 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
end
- defp content(draft) do
+ defp content(%{mentions: mentions} = draft) do
{content_html, mentioned_users, tags} = Utils.make_content_html(draft)
+ mentioned_ap_ids =
+ Enum.map(mentioned_users, fn {_, mentioned_user} -> mentioned_user.ap_id end)
+
mentions =
- mentioned_users
- |> Enum.map(fn {_, mentioned_user} -> mentioned_user.ap_id end)
+ mentions
+ |> Kernel.++(mentioned_ap_ids)
|> Utils.get_addressed_users(draft.params[:to])
%__MODULE__{draft | content_html: content_html, mentions: mentions, tags: tags}
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 99c1a317f..ea5aa8c7f 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -789,6 +789,18 @@ defmodule Pleroma.Web.CommonAPITest do
quote_post = Object.normalize(quote_post)
assert quote_post.data["quoteUrl"] == quoted.data["id"]
+
+ # The OP is mentioned
+ assert quoted.data["actor"] in quote_post.data["to"]
+ end
+
+ test "quote posting with explicit addressing doesn't mention the OP" do
+ user = insert(:user)
+
+ {:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
+
+ assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
end
From a3b7c1da4f800ef0d46bb8a48a382c3d344ef9dc Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 16:03:46 -0600
Subject: [PATCH 049/132] ActivityDraft: mix format, defensive actor ID
---
lib/pleroma/web/common_api/activity_draft.ex | 16 ++++++++++------
test/pleroma/web/common_api_test.exs | 4 +++-
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 750750b7a..b7ea75747 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -11,6 +11,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
alias Pleroma.Web.CommonAPI.Utils
import Pleroma.Web.Gettext
+ import Pleroma.Web.Utils.Guards, only: [not_empty_string: 1]
defstruct valid?: true,
errors: [],
@@ -134,13 +135,16 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
- defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
+ defp quote_post(%{params: %{quote_id: id}} = draft) when not_empty_string(id) do
+ case Activity.get_by_id(id) do
+ %Activity{actor: actor_ap_id} = activity when not_empty_string(actor_ap_id) ->
+ %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
- defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
- with %Activity{actor: actor_ap_id} = activity <- Activity.get_by_id(id) do
- %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
- else
- _ -> draft
+ %Activity{} = activity ->
+ %__MODULE__{draft | quote_post: activity}
+
+ _ ->
+ draft
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index ea5aa8c7f..2770ac51b 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -798,7 +798,9 @@ defmodule Pleroma.Web.CommonAPITest do
user = insert(:user)
{:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
- {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
+
+ {:ok, quote_post} =
+ CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
From 06cc4ad7fd555356bf364ade5d0c211f84fb30ce Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Mon, 24 Jan 2022 15:34:23 -0600
Subject: [PATCH 050/132] Scrubber.Default: allow span.quote-inline for quote
post compatibility
---
priv/scrubbers/default.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/priv/scrubbers/default.ex b/priv/scrubbers/default.ex
index d1215d2e0..56324a9fa 100644
--- a/priv/scrubbers/default.ex
+++ b/priv/scrubbers/default.ex
@@ -60,7 +60,7 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:u, ["lang"])
Meta.allow_tag_with_these_attributes(:ul, ["lang"])
- Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "recipients-inline"])
+ Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "recipients-inline", "quote-inline"])
Meta.allow_tag_with_these_attributes(:span, ["lang"])
Meta.allow_tag_with_this_attribute_values(:code, "class", ["inline"])
From 1a6ab18ebcb7c2b8372661b83e9d630aa016955d Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Mon, 24 Jan 2022 16:44:35 -0600
Subject: [PATCH 051/132] Add InlineQuotePolicy to force quote URLs inline
---
config/config.exs | 2 +
docs/configuration/cheatsheet.md | 4 ++
.../activity_pub/mrf/inline_quote_policy.ex | 53 ++++++++++++++++++
.../mrf/inline_quote_policy_test.exs | 56 +++++++++++++++++++
4 files changed, 115 insertions(+)
create mode 100644 lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
create mode 100644 test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
diff --git a/config/config.exs b/config/config.exs
index ebcbf8b49..56cc34db5 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -434,6 +434,8 @@ config :pleroma, :mrf_object_age,
config :pleroma, :mrf_follow_bot, follower_nickname: nil
+config :pleroma, :mrf_inline_quote, prefix: "RT"
+
config :pleroma, :rich_media,
enabled: true,
ignore_hosts: [],
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index f43cde114..32cc5811a 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -160,6 +160,7 @@ To add configuration to your config file, you can copy it from the base config.
* `Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy`: Drops follow requests from followbots. Users can still allow bots to follow them by first following the bot.
* `Pleroma.Web.ActivityPub.MRF.KeywordPolicy`: Rejects or removes from the federated timeline or replaces keywords. (See [`:mrf_keyword`](#mrf_keyword)).
* `Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent`: Forces every mentioned user to be reflected in the post content.
+ * `Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy`: Forces quote post URLs to be reflected in the message content inline.
* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo).
* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.
@@ -267,6 +268,9 @@ Notes:
* `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+#### :mrf_inline_quote
+* `prefix`: Prefix before the link (default: `RT`)
+
### :activitypub
* `unfollow_blocked`: Whether blocks result in people getting unfollowed
* `outgoing_blocks`: Whether to federate blocks to other instances
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
new file mode 100644
index 000000000..0f1dc9f42
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -0,0 +1,53 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
+ @moduledoc "Force a quote line into the message content."
+ @behaviour Pleroma.Web.ActivityPub.MRF.Policy
+
+ defp build_inline_quote(prefix, url) do
+ "
#{prefix}: #{url}"
+ end
+
+ defp filter_object(%{"quoteUrl" => quote_url} = object) do
+ content = object["content"] || ""
+
+ if content =~ quote_url do
+ object
+ else
+ prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
+ content = content <> build_inline_quote(prefix, quote_url)
+ Map.put(object, "content", content)
+ end
+ end
+
+ @impl true
+ def filter(%{"object" => %{"quoteUrl" => _} = object} = activity) do
+ {:ok, Map.put(activity, "object", filter_object(object))}
+ end
+
+ @impl true
+ def filter(object), do: {:ok, object}
+
+ @impl true
+ def describe, do: {:ok, %{}}
+
+ @impl true
+ def config_description do
+ %{
+ key: :mrf_inline_quote,
+ related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
+ label: "MRF Inline Quote",
+ description: "Force quote post URLs inline",
+ children: [
+ %{
+ key: :prefix,
+ type: :string,
+ description: "Prefix before the link",
+ suggestions: ["RT", "QT", "RE", "RN"]
+ }
+ ]
+ }
+ end
+end
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
new file mode 100644
index 000000000..81dc06dda
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -0,0 +1,56 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
+ alias Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ use Pleroma.DataCase
+
+ test "adds quote URL to post content" do
+ quote_url = "https://gleasonator.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post
",
+ "quoteUrl" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
+
+ assert filtered ==
+ "Nice post
RT: https://gleasonator.com/objects/1234"
+ end
+
+ test "ignores Misskey quote posts" do
+ object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://misskey.io/users/7rkrarq81i",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+
+ test "ignores Fedibird quote posts" do
+ object = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
+
+ # Normally the ObjectValidator will fix this before it reaches MRF
+ object = Map.put(object, "quoteUrl", object["quoteURL"])
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://fedibird.com/users/noellabo",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+end
From 6d26ce54c4c5c9e8b4832fa1e7521990cce86b98 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:21:49 -0600
Subject: [PATCH 052/132] CommonAPI: disallow quoting private posts through the
API
---
lib/pleroma/web/common_api/activity_draft.ex | 15 ++++++++++-
.../web/common_api/activity_draft_test.exs | 26 +++++++++++++++++++
test/pleroma/web/common_api_test.exs | 14 ++++++++++
3 files changed, 54 insertions(+), 1 deletion(-)
create mode 100644 test/pleroma/web/common_api/activity_draft_test.exs
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index b7ea75747..82f561e92 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
alias Pleroma.Conversation.Participation
alias Pleroma.Object
alias Pleroma.Web.ActivityPub.Builder
+ alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.CommonAPI.Utils
@@ -57,6 +58,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|> with_valid(&in_reply_to_conversation/1)
|> with_valid("e_post/1)
|> with_valid(&visibility/1)
+ |> with_valid("ing_visibility/1)
|> content()
|> with_valid(&to_and_cc/1)
|> with_valid(&context/1)
@@ -136,7 +138,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
defp quote_post(%{params: %{quote_id: id}} = draft) when not_empty_string(id) do
- case Activity.get_by_id(id) do
+ case Activity.get_by_id_with_object(id) do
%Activity{actor: actor_ap_id} = activity when not_empty_string(actor_ap_id) ->
%__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
@@ -165,6 +167,17 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
end
+ defp quoting_visibility(%{quote_post: %Activity{}} = draft) do
+ with %Object{} = object <- Object.normalize(draft.quote_post, fetch: false),
+ visibility when visibility in ~w(public unlisted) <- Visibility.get_visibility(object) do
+ draft
+ else
+ _ -> add_error(draft, dgettext("errors", "Cannot quote private message"))
+ end
+ end
+
+ defp quoting_visibility(draft), do: draft
+
defp expires_at(draft) do
case CommonAPI.check_expiry_date(draft.params[:expires_in]) do
{:ok, expires_at} -> %__MODULE__{draft | expires_at: expires_at}
diff --git a/test/pleroma/web/common_api/activity_draft_test.exs b/test/pleroma/web/common_api/activity_draft_test.exs
new file mode 100644
index 000000000..8a09fc710
--- /dev/null
+++ b/test/pleroma/web/common_api/activity_draft_test.exs
@@ -0,0 +1,26 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.CommonAPI.ActivityDraftTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.CommonAPI.ActivityDraft
+
+ import Pleroma.Factory
+
+ test "create/2 with a quote post" do
+ user = insert(:user)
+
+ {:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
+ {:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
+ {:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
+
+ {:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: direct.id})
+ {:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: public.id})
+ end
+end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 2770ac51b..afd9e980a 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -804,6 +804,20 @@ defmodule Pleroma.Web.CommonAPITest do
assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
+
+ test "quote posting visibility" do
+ user = insert(:user)
+
+ {:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
+ {:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
+ {:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
+
+ {:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: direct.id})
+ {:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: public.id})
+ end
end
describe "reactions" do
From 14a26e4433738eebef7c576d1537c46344d231e0 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:49:31 -0600
Subject: [PATCH 053/132] StatusView: fix quote visibility
---
.../web/mastodon_api/views/status_view.ex | 2 +-
.../mastodon_api/views/status_view_test.exs | 41 +++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 06adfb221..7360d1093 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -315,7 +315,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_activity = get_quote(activity, opts)
quote_post =
- if quote_activity do
+ if visible_for_user?(quote_activity, opts[:for]) do
quote_rendering_opts = Map.merge(opts, %{activity: quote_activity, show_quote: false})
render("show.json", quote_rendering_opts)
else
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index f50b02799..f41ef580d 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -446,6 +446,47 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert status.pleroma.quote.id == to_string(quote_post.id)
end
+ test "quoted private post" do
+ user = insert(:user)
+
+ # Insert a private post
+ private = insert(:followers_only_note_activity, user: user)
+ private_object = Object.normalize(private)
+
+ # Create a public post quoting the private post
+ quote_private =
+ insert(:note_activity, note: insert(:note, data: %{"quoteUrl" => private_object.data["id"]}))
+
+ status = StatusView.render("show.json", %{activity: quote_private})
+
+ # The quote isn't rendered
+ refute status.pleroma.quote
+ assert status.pleroma.quote_url == private_object.data["id"]
+
+ # After following the user, the quote is rendered
+ follower = insert(:user)
+ CommonAPI.follow(follower, user)
+
+ status = StatusView.render("show.json", %{activity: quote_private, for: follower})
+ assert status.pleroma.quote.id == to_string(private.id)
+ end
+
+ test "quoted direct message" do
+ # Insert a direct message
+ direct = insert(:direct_note_activity)
+ direct_object = Object.normalize(direct)
+
+ # Create a public post quoting the direct message
+ quote_direct =
+ insert(:note_activity, note: insert(:note, data: %{"quoteUrl" => direct_object.data["id"]}))
+
+ status = StatusView.render("show.json", %{activity: quote_direct})
+
+ # The quote isn't rendered
+ refute status.pleroma.quote
+ assert status.pleroma.quote_url == direct_object.data["id"]
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
From 029a1045d4fd2cde9bd12d42b003a9e5401c1461 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:52:50 -0600
Subject: [PATCH 054/132] StatusView: add `quote_visible` param
---
lib/pleroma/web/api_spec/schemas/status.ex | 4 ++++
lib/pleroma/web/mastodon_api/views/status_view.ex | 1 +
test/pleroma/web/mastodon_api/views/status_view_test.exs | 4 ++++
3 files changed, 9 insertions(+)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index f4ee9b38c..5d0eedb08 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -204,6 +204,10 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "URL of the quoted status"
},
+ quote_visible: %Schema{
+ type: :boolean,
+ description: "`true` if the quoted post is visible to the user"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 7360d1093..2aa44b0f6 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -432,6 +432,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote: quote_post,
quote_url: object.data["quoteUrl"],
+ quote_visible: visible_for_user?(quote_activity, opts[:for]),
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index f41ef580d..ed0a87558 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -328,6 +328,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
in_reply_to_account_acct: nil,
quote: nil,
quote_url: nil,
+ quote_visible: false,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
@@ -462,6 +463,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
# The quote isn't rendered
refute status.pleroma.quote
assert status.pleroma.quote_url == private_object.data["id"]
+ refute status.pleroma.quote_visible
# After following the user, the quote is rendered
follower = insert(:user)
@@ -469,6 +471,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
status = StatusView.render("show.json", %{activity: quote_private, for: follower})
assert status.pleroma.quote.id == to_string(private.id)
+ assert status.pleroma.quote_visible
end
test "quoted direct message" do
@@ -485,6 +488,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
# The quote isn't rendered
refute status.pleroma.quote
assert status.pleroma.quote_url == direct_object.data["id"]
+ refute status.pleroma.quote_visible
end
test "contains mentions" do
From 63f8c3335358271fe62ed0d8f0facd6b37171115 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Thu, 27 Jan 2022 14:28:06 -0600
Subject: [PATCH 055/132] InlineQuotePolicy: don't add line breaks to markdown
posts
---
.../activity_pub/mrf/inline_quote_policy.ex | 12 ++++++++---
.../mrf/inline_quote_policy_test.exs | 21 ++++++++++++++++++-
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index 0f1dc9f42..46013fc5e 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -6,8 +6,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
@moduledoc "Force a quote line into the message content."
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
- defp build_inline_quote(prefix, url) do
- "
#{prefix}: #{url}"
+ defp build_inline_quote(prefix, url, br) do
+ "#{String.duplicate("
", br)}#{prefix}: #{url}"
end
defp filter_object(%{"quoteUrl" => quote_url} = object) do
@@ -17,7 +17,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
object
else
prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
- content = content <> build_inline_quote(prefix, quote_url)
+
+ inline_quote =
+ if String.ends_with?(content, "
"),
+ do: build_inline_quote(prefix, quote_url, 0),
+ else: build_inline_quote(prefix, quote_url, 2)
+
+ content = content <> inline_quote
Map.put(object, "content", content)
end
end
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
index 81dc06dda..8e75aaaab 100644
--- a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -9,6 +9,25 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
test "adds quote URL to post content" do
quote_url = "https://gleasonator.com/objects/1234"
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post",
+ "quoteUrl" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
+
+ assert filtered ==
+ "Nice post
RT: https://gleasonator.com/objects/1234"
+ end
+
+ test "doesn't add line breaks to markdown posts" do
+ quote_url = "https://gleasonator.com/objects/1234"
+
activity = %{
"type" => "Create",
"actor" => "https://gleasonator.com/users/alex",
@@ -22,7 +41,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
assert filtered ==
- "Nice post
RT: https://gleasonator.com/objects/1234"
+ "Nice post
RT: https://gleasonator.com/objects/1234"
end
test "ignores Misskey quote posts" do
From 1cb39bfb90b952eea605b713a1adddec8119eb4b Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Thu, 27 Jan 2022 15:01:20 -0600
Subject: [PATCH 056/132] Add InlineQuotePolicy as a default MRF
---
config/config.exs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 56cc34db5..9149e925a 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -860,7 +860,11 @@ config :pleroma, :restrict_unauthenticated,
config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false
config :pleroma, :mrf,
- policies: [Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy, Pleroma.Web.ActivityPub.MRF.TagPolicy],
+ policies: [
+ Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy,
+ Pleroma.Web.ActivityPub.MRF.TagPolicy,
+ Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ ],
transparency: true,
transparency_exclusions: []
From f8b420932ec7231cad03f3519bc46a465b8c02d1 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Fri, 28 Jan 2022 12:33:07 -0600
Subject: [PATCH 057/132] StatusView: return quote post inside a reblog
---
lib/pleroma/web/mastodon_api/views/status_view.ex | 10 ++++++----
.../web/mastodon_api/views/status_view_test.exs | 12 ++++++++++++
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 2aa44b0f6..ba4a8f3eb 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -668,13 +668,15 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
- def get_quote(_activity, %{show_quote: false}) do
- nil
- end
+ def get_quote(_activity, %{show_quote: false}), do: nil
def get_quote(activity, %{quoted_activities: quoted_activities}) do
object = Object.normalize(activity, fetch: false)
- quoted_activities[object.data["quoteUrl"]]
+
+ with nil <- quoted_activities[object.data["quoteUrl"]] do
+ # For when a quote post is inside an Announce
+ Activity.get_create_by_object_ap_id_with_object(object.data["quoteUrl"])
+ end
end
def get_quote(%{data: %{"object" => _object}} = activity, _) do
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index ed0a87558..6d3a72970 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -491,6 +491,18 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
refute status.pleroma.quote_visible
end
+ test "repost of quote post" do
+ post = insert(:note_activity)
+ user = insert(:user)
+
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "he", quote_id: post.id})
+ {:ok, repost} = CommonAPI.repeat(quote_post.id, user)
+
+ [status] = StatusView.render("index.json", %{activities: [repost], as: :activity})
+
+ assert status.reblog.pleroma.quote.id == to_string(post.id)
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
From f89874596e4bb4108c0574540f574d5aad26288b Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Fri, 28 Jan 2022 14:06:32 -0600
Subject: [PATCH 058/132] Transmogrifier: federate quotes with _misskey_quote
field
---
lib/pleroma/web/activity_pub/transmogrifier.ex | 9 +++++++++
priv/static/schemas/litepub-0.1.jsonld | 2 ++
test/pleroma/web/activity_pub/transmogrifier_test.exs | 4 ++++
3 files changed, 15 insertions(+)
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index f5771e75e..163ae54fa 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -660,6 +660,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def set_reply_to_uri(obj), do: obj
+ # Misskey quotes
+ # Despite being underscored, it's potentially more reliable for interop.
+ def set_quote_url(%{"quoteUrl" => quote_url} = object) when is_binary(quote_url) do
+ Map.put(object, "_misskey_quote", quote_url)
+ end
+
+ def set_quote_url(obj), do: obj
+
@doc """
Serialized Mastodon-compatible `replies` collection containing _self-replies_.
Based on Mastodon's ActivityPub::NoteSerializer#replies.
@@ -714,6 +722,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> prepare_attachments
|> set_conversation
|> set_reply_to_uri
+ |> set_quote_url
|> set_replies
|> strip_internal_fields
|> strip_internal_tags
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 5d8244a11..8559e744d 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -17,6 +17,7 @@
"ostatus": "http://ostatus.org#",
"schema": "http://schema.org#",
"toot": "http://joinmastodon.org/ns#",
+ "misskey": "https://misskey-hub.net/ns#",
"value": "schema:value",
"sensitive": "as:sensitive",
"litepub": "http://litepub.social/ns#",
@@ -27,6 +28,7 @@
"@type": "@id"
},
"quoteUrl": "as:quoteUrl",
+ "_misskey_quote": "misskey:_misskey_quote",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
"@type": "@id"
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 824398e38..8c7e0a4c9 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -382,7 +382,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
{:ok, modified} = Transmogrifier.prepare_outgoing(quote_post.data)
quoted_post = Object.normalize(quoted_post)
+
assert modified["object"]["quoteUrl"] == quoted_post.data["id"]
+
+ # Add Misskey's quote as a fallback
+ assert modified["object"]["_misskey_quote"] == quoted_post.data["id"]
end
end
From 32e284ed2c5379b0dcedd4fa4d512a5ad63435b7 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Fri, 28 Jan 2022 15:55:52 -0600
Subject: [PATCH 059/132] Handle Fedibird's new quoteUri field
---
.../article_note_page_validator.ex | 8 ++-
.../web/activity_pub/transmogrifier.ex | 19 +++++--
priv/static/schemas/litepub-0.1.jsonld | 2 +
.../quote_post/fedibird_quote_uri.json | 54 +++++++++++++++++++
.../article_note_page_validator_test.exs | 10 ++++
.../web/activity_pub/transmogrifier_test.exs | 9 ++--
6 files changed, 92 insertions(+), 10 deletions(-)
create mode 100644 test/fixtures/quote_post/fedibird_quote_uri.json
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 40bb67934..0b435b251 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -78,7 +78,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
defp fix_quote_url(%{"quoteUrl" => _quote_url} = data), do: data
- # Fix for Fedibird
+ # Fedibird
+ # https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
+ defp fix_quote_url(%{"quoteUri" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ # Old Fedibird (bug)
# https://github.com/fedibird/mastodon/issues/9
defp fix_quote_url(%{"quoteURL" => quote_url} = data) do
Map.put(data, "quoteUrl", quote_url)
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 163ae54fa..01e135fc1 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -180,7 +180,15 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
end
- # Fix for Fedibird
+ # Fedibird
+ # https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
+ def fix_quote_url(%{"quoteUri" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUrl", quote_url)
+ |> fix_quote_url(options)
+ end
+
+ # Old Fedibird (bug)
# https://github.com/fedibird/mastodon/issues/9
def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do
object
@@ -660,10 +668,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def set_reply_to_uri(obj), do: obj
- # Misskey quotes
- # Despite being underscored, it's potentially more reliable for interop.
def set_quote_url(%{"quoteUrl" => quote_url} = object) when is_binary(quote_url) do
- Map.put(object, "_misskey_quote", quote_url)
+ Map.merge(object, %{
+ # Fedibird quote
+ "quoteUri" => quote_url,
+ # Misskey quote
+ "_misskey_quote" => quote_url
+ })
end
def set_quote_url(obj), do: obj
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 8559e744d..3d68e0714 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -18,6 +18,7 @@
"schema": "http://schema.org#",
"toot": "http://joinmastodon.org/ns#",
"misskey": "https://misskey-hub.net/ns#",
+ "fedibird": "http://fedibird.com/ns#",
"value": "schema:value",
"sensitive": "as:sensitive",
"litepub": "http://litepub.social/ns#",
@@ -28,6 +29,7 @@
"@type": "@id"
},
"quoteUrl": "as:quoteUrl",
+ "quoteUri": "fedibird:quoteUri",
"_misskey_quote": "misskey:_misskey_quote",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
diff --git a/test/fixtures/quote_post/fedibird_quote_uri.json b/test/fixtures/quote_post/fedibird_quote_uri.json
new file mode 100644
index 000000000..7c328fdb9
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_uri.json
@@ -0,0 +1,54 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "fedibird": "http://fedibird.com/ns#",
+ "quoteUri": "fedibird:quoteUri",
+ "expiry": "fedibird:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107699335988346142",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-28T09:17:30Z",
+ "url": "https://fedibird.com/@noellabo/107699335988346142",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107699335988346142",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-28:objectId=107699335988345290:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107699335988345290",
+ "quoteUri": "https://fedibird.com/users/yamako/statuses/107699333438289729",
+ "_misskey_quote": "https://fedibird.com/users/yamako/statuses/107699333438289729",
+ "_misskey_content": "美味しそう",
+ "content": "美味しそう
QT: https://fedibird.com/@yamako/107699333438289729
",
+ "contentMap": {
+ "ja": "美味しそう
QT: https://fedibird.com/@yamako/107699333438289729
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107699335988346142/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index dec2e28c9..a4ba38e6a 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -127,6 +127,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
assert cng.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
end
+ test "Fedibird quote post with quoteUri field" do
+ insert(:user, ap_id: "https://fedibird.com/users/noellabo")
+
+ data = File.read!("test/fixtures/quote_post/fedibird_quote_uri.json") |> Jason.decode!()
+ cng = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://fedibird.com/users/yamako/statuses/107699333438289729"
+ end
+
test "Misskey quote post" do
insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 8c7e0a4c9..1838f96bb 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -381,12 +381,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
{:ok, modified} = Transmogrifier.prepare_outgoing(quote_post.data)
- quoted_post = Object.normalize(quoted_post)
+ %{data: %{"id" => quote_id}} = Object.normalize(quoted_post)
- assert modified["object"]["quoteUrl"] == quoted_post.data["id"]
-
- # Add Misskey's quote as a fallback
- assert modified["object"]["_misskey_quote"] == quoted_post.data["id"]
+ assert modified["object"]["quoteUrl"] == quote_id
+ assert modified["object"]["quoteUri"] == quote_id
+ assert modified["object"]["_misskey_quote"] == quote_id
end
end
From 5df951f670b5fa33d3cf44049d4443501fe9c0a8 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Fri, 28 Jan 2022 16:07:17 -0600
Subject: [PATCH 060/132] InlineQuotePolicy: improve the way Markdown quotes
are displayed by other software
---
.../web/activity_pub/mrf/inline_quote_policy.ex | 13 +++++++------
.../activity_pub/mrf/inline_quote_policy_test.exs | 4 ++--
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index 46013fc5e..7de4935f2 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -6,8 +6,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
@moduledoc "Force a quote line into the message content."
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
- defp build_inline_quote(prefix, url, br) do
- "#{String.duplicate("
", br)}#{prefix}: #{url}"
+ defp build_inline_quote(prefix, url) do
+ "
#{prefix}: #{url}"
end
defp filter_object(%{"quoteUrl" => quote_url} = object) do
@@ -18,12 +18,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
else
prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
- inline_quote =
+ content =
if String.ends_with?(content, ""),
- do: build_inline_quote(prefix, quote_url, 0),
- else: build_inline_quote(prefix, quote_url, 2)
+ do:
+ String.trim_trailing(content, "") <>
+ build_inline_quote(prefix, quote_url) <> "",
+ else: content <> build_inline_quote(prefix, quote_url)
- content = content <> inline_quote
Map.put(object, "content", content)
end
end
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
index 8e75aaaab..2291c1dac 100644
--- a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -22,7 +22,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
assert filtered ==
- "Nice post
RT: https://gleasonator.com/objects/1234"
+ "Nice post
RT: https://gleasonator.com/objects/1234"
end
test "doesn't add line breaks to markdown posts" do
@@ -41,7 +41,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
assert filtered ==
- "Nice post
RT: https://gleasonator.com/objects/1234"
+ "Nice post
RT: https://gleasonator.com/objects/1234
"
end
test "ignores Misskey quote posts" do
From 34cf4222c1d8acf291e114f10c508bbd31f495e0 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Fri, 28 Jan 2022 17:53:19 -0600
Subject: [PATCH 061/132] Actually, don't send _misskey_quote anymore
---
lib/pleroma/web/activity_pub/transmogrifier.ex | 11 +++++------
priv/static/schemas/litepub-0.1.jsonld | 2 --
test/pleroma/web/activity_pub/transmogrifier_test.exs | 1 -
3 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 01e135fc1..6c6cd712b 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -668,13 +668,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def set_reply_to_uri(obj), do: obj
+ @doc """
+ Fedibird compatibility
+ https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
+ """
def set_quote_url(%{"quoteUrl" => quote_url} = object) when is_binary(quote_url) do
- Map.merge(object, %{
- # Fedibird quote
- "quoteUri" => quote_url,
- # Misskey quote
- "_misskey_quote" => quote_url
- })
+ Map.put(object, "quoteUri", quote_url)
end
def set_quote_url(obj), do: obj
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 3d68e0714..b499a96f5 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -17,7 +17,6 @@
"ostatus": "http://ostatus.org#",
"schema": "http://schema.org#",
"toot": "http://joinmastodon.org/ns#",
- "misskey": "https://misskey-hub.net/ns#",
"fedibird": "http://fedibird.com/ns#",
"value": "schema:value",
"sensitive": "as:sensitive",
@@ -30,7 +29,6 @@
},
"quoteUrl": "as:quoteUrl",
"quoteUri": "fedibird:quoteUri",
- "_misskey_quote": "misskey:_misskey_quote",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
"@type": "@id"
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 1838f96bb..4a192cdc0 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -385,7 +385,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert modified["object"]["quoteUrl"] == quote_id
assert modified["object"]["quoteUri"] == quote_id
- assert modified["object"]["_misskey_quote"] == quote_id
end
end
From 52c81cdf6829bd6b5de73fa5856cf059ef57f73c Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 30 Jan 2022 10:57:29 -0600
Subject: [PATCH 062/132] InlineQuotePolicy: skip objects which already have an
.inline-quote span
---
.../activity_pub/mrf/inline_quote_policy.ex | 13 ++++-
.../quote_post/fedibird_quote_mismatched.json | 54 +++++++++++++++++++
.../mrf/inline_quote_policy_test.exs | 17 ++++++
3 files changed, 83 insertions(+), 1 deletion(-)
create mode 100644 test/fixtures/quote_post/fedibird_quote_mismatched.json
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index 7de4935f2..c78675caf 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -10,10 +10,21 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
"
#{prefix}: #{url}"
end
+ defp has_inline_quote?(content, quote_url) do
+ cond do
+ # Does the quote URL exist in the content?
+ content =~ quote_url -> true
+ # Does the content already have a .quote-inline span?
+ content =~ "" -> true
+ # No inline quote found
+ true -> false
+ end
+ end
+
defp filter_object(%{"quoteUrl" => quote_url} = object) do
content = object["content"] || ""
- if content =~ quote_url do
+ if has_inline_quote?(content, quote_url) do
object
else
prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
diff --git a/test/fixtures/quote_post/fedibird_quote_mismatched.json b/test/fixtures/quote_post/fedibird_quote_mismatched.json
new file mode 100644
index 000000000..8dee5daff
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_mismatched.json
@@ -0,0 +1,54 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "fedibird": "http://fedibird.com/ns#",
+ "quoteUri": "fedibird:quoteUri",
+ "expiry": "fedibird:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107712183700212249",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-30T15:44:50Z",
+ "url": "https://fedibird.com/@noellabo/107712183700212249",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107712183700212249",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-30:objectId=107712183700170473:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107712183700170473",
+ "quoteUri": "https://unnerv.jp/users/UN_NERV/statuses/107712176849067434",
+ "_misskey_quote": "https://unnerv.jp/users/UN_NERV/statuses/107712176849067434",
+ "_misskey_content": "揺れていたようだ",
+ "content": "揺れていたようだ
QT: https://unnerv.jp/@UN_NERV/107712176849067434
",
+ "contentMap": {
+ "ja": "揺れていたようだ
QT: https://unnerv.jp/@UN_NERV/107712176849067434
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107712183700212249/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107712183700212249/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107712183700212249/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
index 2291c1dac..44ee91d4b 100644
--- a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -72,4 +72,21 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, filtered} = InlineQuotePolicy.filter(activity)
assert filtered == activity
end
+
+ test "skips objects which already have an .inline-quote span" do
+ object =
+ File.read!("test/fixtures/quote_post/fedibird_quote_mismatched.json") |> Jason.decode!()
+
+ # Normally the ObjectValidator will fix this before it reaches MRF
+ object = Map.put(object, "quoteUrl", object["quoteUri"])
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://fedibird.com/users/noellabo",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
end
From 44cea92fbc5f61718f47102da818c7d0394926c9 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Mon, 10 Jul 2023 17:57:09 -0400
Subject: [PATCH 063/132] Unify logic for normalizing quoteUri
---
.../article_note_page_validator.ex | 23 +---------
.../object_validators/common_fixes.ex | 21 ++++++++++
.../web/activity_pub/transmogrifier.ex | 42 ++++++-------------
priv/scrubbers/default.ex | 7 +++-
4 files changed, 40 insertions(+), 53 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 0b435b251..1b5b2e8fb 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -76,27 +76,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
def fix_attachments(data), do: data
- defp fix_quote_url(%{"quoteUrl" => _quote_url} = data), do: data
-
- # Fedibird
- # https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
- defp fix_quote_url(%{"quoteUri" => quote_url} = data) do
- Map.put(data, "quoteUrl", quote_url)
- end
-
- # Old Fedibird (bug)
- # https://github.com/fedibird/mastodon/issues/9
- defp fix_quote_url(%{"quoteURL" => quote_url} = data) do
- Map.put(data, "quoteUrl", quote_url)
- end
-
- # Misskey fallback
- defp fix_quote_url(%{"_misskey_quote" => quote_url} = data) do
- Map.put(data, "quoteUrl", quote_url)
- end
-
- defp fix_quote_url(data), do: data
-
defp fix(data) do
data
|> CommonFixes.fix_actor()
@@ -105,7 +84,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
|> fix_tag()
|> fix_replies()
|> fix_attachments()
- |> fix_quote_url()
+ |> CommonFixes.fix_quote_url()
|> Transmogrifier.fix_emoji()
|> Transmogrifier.fix_content_map()
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
index add46d561..cc2ad9116 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
@@ -76,4 +76,25 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
Map.put(data, "to", to)
end
+
+ def fix_quote_url(%{"quoteUrl" => _quote_url} = data), do: data
+
+ # Fedibird
+ # https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
+ def fix_quote_url(%{"quoteUri" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ # Old Fedibird (bug)
+ # https://github.com/fedibird/mastodon/issues/9
+ def fix_quote_url(%{"quoteURL" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ # Misskey fallback
+ def fix_quote_url(%{"_misskey_quote" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ def fix_quote_url(data), do: data
end
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 6c6cd712b..86d3ac60f 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -166,45 +166,27 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(object, _options), do: object
- def fix_quote_url(object, options \\ [])
+ def fix_quote_url_and_maybe_fetch(object, options \\ []) do
+ quote_url =
+ case Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes.fix_quote_url(object) do
+ %{"quoteUrl" => quote_url} -> quote_url
+ _ -> nil
+ end
- def fix_quote_url(%{"quoteUrl" => quote_url} = object, options)
- when not is_nil(quote_url) do
- with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
+ with {:quoting?, true} <- {:quoting?, not is_nil(quote_url)},
+ {:ok, quoted_object} <- get_obj_helper(quote_url, options),
%Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
Map.put(object, "quoteUrl", quoted_object.data["id"])
else
+ {:quoting?, _} ->
+ object
+
e ->
Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}")
object
end
end
- # Fedibird
- # https://github.com/fedibird/mastodon/commit/dbd7ae6cf58a92ec67c512296b4daaea0d01e6ac
- def fix_quote_url(%{"quoteUri" => quote_url} = object, options) do
- object
- |> Map.put("quoteUrl", quote_url)
- |> fix_quote_url(options)
- end
-
- # Old Fedibird (bug)
- # https://github.com/fedibird/mastodon/issues/9
- def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do
- object
- |> Map.put("quoteUrl", quote_url)
- |> fix_quote_url(options)
- end
-
- # Misskey fallback
- def fix_quote_url(%{"_misskey_quote" => quote_url} = object, options) do
- object
- |> Map.put("quoteUrl", quote_url)
- |> fix_quote_url(options)
- end
-
- def fix_quote_url(object, _options), do: object
-
defp prepare_in_reply_to(in_reply_to) do
cond do
is_bitstring(in_reply_to) ->
@@ -493,7 +475,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
- |> fix_quote_url(fetch_options)
+ |> fix_quote_url_and_maybe_fetch(fetch_options)
data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
diff --git a/priv/scrubbers/default.ex b/priv/scrubbers/default.ex
index 56324a9fa..4e7950547 100644
--- a/priv/scrubbers/default.ex
+++ b/priv/scrubbers/default.ex
@@ -60,7 +60,12 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:u, ["lang"])
Meta.allow_tag_with_these_attributes(:ul, ["lang"])
- Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "recipients-inline", "quote-inline"])
+ Meta.allow_tag_with_this_attribute_values(:span, "class", [
+ "h-card",
+ "recipients-inline",
+ "quote-inline"
+ ])
+
Meta.allow_tag_with_these_attributes(:span, ["lang"])
Meta.allow_tag_with_this_attribute_values(:code, "class", ["inline"])
From 3bb384d37826b09f5bde8e07ec45f22ba9544ad6 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Mon, 10 Jul 2023 18:27:23 -0400
Subject: [PATCH 064/132] Allow local quote and private self-quote
---
lib/pleroma/web/common_api/activity_draft.ex | 14 +++++++++++++-
.../pleroma/web/common_api/activity_draft_test.exs | 9 ++++++++-
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 82f561e92..c80c4940e 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -167,9 +167,21 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
end
+ defp can_quote?(_draft, _object, visibility) when visibility in ~w(public unlisted local) do
+ true
+ end
+
+ defp can_quote?(draft, object, "private") do
+ draft.user.ap_id == object.data["actor"]
+ end
+
+ defp can_quote?(_, _, _) do
+ false
+ end
+
defp quoting_visibility(%{quote_post: %Activity{}} = draft) do
with %Object{} = object <- Object.normalize(draft.quote_post, fetch: false),
- visibility when visibility in ~w(public unlisted) <- Visibility.get_visibility(object) do
+ true <- can_quote?(draft, object, Visibility.get_visibility(object)) do
draft
else
_ -> add_error(draft, dgettext("errors", "Cannot quote private message"))
diff --git a/test/pleroma/web/common_api/activity_draft_test.exs b/test/pleroma/web/common_api/activity_draft_test.exs
index 8a09fc710..02bc6cf3b 100644
--- a/test/pleroma/web/common_api/activity_draft_test.exs
+++ b/test/pleroma/web/common_api/activity_draft_test.exs
@@ -12,15 +12,22 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraftTest do
test "create/2 with a quote post" do
user = insert(:user)
+ another_user = insert(:user)
{:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
{:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
{:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, local} = CommonAPI.post(user, %{status: ".", visibility: "local"})
{:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
{:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: direct.id})
- {:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: private.id})
+ {:error, _} = ActivityDraft.create(another_user, %{status: "nice", quote_id: private.id})
{:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = ActivityDraft.create(another_user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: local.id})
+ {:ok, _} = ActivityDraft.create(another_user, %{status: "nice", quote_id: local.id})
{:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: public.id})
+ {:ok, _} = ActivityDraft.create(another_user, %{status: "nice", quote_id: public.id})
end
end
From ebcac09f5c55d5a4379b46db871384818eabea7f Mon Sep 17 00:00:00 2001
From: tusooa
Date: Mon, 10 Jul 2023 18:28:13 -0400
Subject: [PATCH 065/132] Add changelog
---
changelog.d/quote.add | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/quote.add
diff --git a/changelog.d/quote.add b/changelog.d/quote.add
new file mode 100644
index 000000000..1c368ae75
--- /dev/null
+++ b/changelog.d/quote.add
@@ -0,0 +1 @@
+Implement quotes
From 26b499eca00e5a505e57d68abb1ddcc56e9ee8f8 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Mon, 10 Jul 2023 19:43:18 -0400
Subject: [PATCH 066/132] Fix CommonAPITest
---
test/pleroma/web/common_api_test.exs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index afd9e980a..04ac01c79 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -807,16 +807,23 @@ defmodule Pleroma.Web.CommonAPITest do
test "quote posting visibility" do
user = insert(:user)
+ another_user = insert(:user)
{:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
{:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
{:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, local} = CommonAPI.post(user, %{status: ".", visibility: "local"})
{:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
{:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: direct.id})
- {:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: private.id})
+ {:error, _} = CommonAPI.post(another_user, %{status: "nice", quote_id: private.id})
{:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = CommonAPI.post(another_user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: local.id})
+ {:ok, _} = CommonAPI.post(another_user, %{status: "nice", quote_id: local.id})
{:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: public.id})
+ {:ok, _} = CommonAPI.post(another_user, %{status: "nice", quote_id: public.id})
end
end
From 2c70857f9fc3246b5d754237bca31446dfd5e8cc Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 09:30:43 -0400
Subject: [PATCH 067/132] Allow more flexibility in InlineQuotePolicy
---
config/config.exs | 2 +-
config/description.exs | 18 ++++++++++++++
docs/configuration/cheatsheet.md | 2 +-
.../activity_pub/mrf/inline_quote_policy.ex | 12 ++++++----
priv/scrubbers/default.ex | 1 +
.../mrf/inline_quote_policy_test.exs | 24 +++++++++++++++++--
6 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 9149e925a..e8ae31542 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -434,7 +434,7 @@ config :pleroma, :mrf_object_age,
config :pleroma, :mrf_follow_bot, follower_nickname: nil
-config :pleroma, :mrf_inline_quote, prefix: "RT"
+config :pleroma, :mrf_inline_quote, template: "RT: {url}"
config :pleroma, :rich_media,
enabled: true,
diff --git a/config/description.exs b/config/description.exs
index d18649ae8..079d187d5 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -2994,6 +2994,24 @@ config :pleroma, :config_description, [
}
]
},
+ %{
+ group: :pleroma,
+ key: :mrf_inline_quote,
+ tab: :mrf,
+ related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
+ label: "MRF Inline Quote Policy",
+ type: :group,
+ description: "Force quote url to appear in post content.",
+ children: [
+ %{
+ key: :template,
+ type: :string,
+ description:
+ "The template to append to the post. `{url}` will be replaced with the actual link to the quoted post.",
+ suggestions: ["RT: {url}"]
+ }
+ ]
+ },
%{
group: :pleroma,
key: :modules,
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index 32cc5811a..a17f8735a 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -269,7 +269,7 @@ Notes:
* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
#### :mrf_inline_quote
-* `prefix`: Prefix before the link (default: `RT`)
+* `template`: The template to append to the post. `{url}` will be replaced with the actual link to the quoted post. Default: `RT: {url}`
### :activitypub
* `unfollow_blocked`: Whether blocks result in people getting unfollowed
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index c78675caf..a0eefefc0 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -6,8 +6,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
@moduledoc "Force a quote line into the message content."
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
- defp build_inline_quote(prefix, url) do
- "
#{prefix}: #{url}"
+ defp build_inline_quote(template, url) do
+ quote_line = String.replace(template, "{url}", "#{url}")
+
+ "
#{quote_line}"
end
defp has_inline_quote?(content, quote_url) do
@@ -27,14 +29,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
if has_inline_quote?(content, quote_url) do
object
else
- prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
+ template = Pleroma.Config.get([:mrf_inline_quote, :template])
content =
if String.ends_with?(content, ""),
do:
String.trim_trailing(content, "") <>
- build_inline_quote(prefix, quote_url) <> "",
- else: content <> build_inline_quote(prefix, quote_url)
+ build_inline_quote(template, quote_url) <> "",
+ else: content <> build_inline_quote(template, quote_url)
Map.put(object, "content", content)
end
diff --git a/priv/scrubbers/default.ex b/priv/scrubbers/default.ex
index 4e7950547..24a76263b 100644
--- a/priv/scrubbers/default.ex
+++ b/priv/scrubbers/default.ex
@@ -38,6 +38,7 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:abbr, ["title", "lang"])
Meta.allow_tag_with_these_attributes(:b, ["lang"])
+ Meta.allow_tag_with_these_attributes(:bdi, [])
Meta.allow_tag_with_these_attributes(:blockquote, ["lang"])
Meta.allow_tag_with_these_attributes(:br, ["lang"])
Meta.allow_tag_with_these_attributes(:code, ["lang"])
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
index 44ee91d4b..d5762766f 100644
--- a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -22,7 +22,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
assert filtered ==
- "Nice post
RT: https://gleasonator.com/objects/1234"
+ "Nice post
RT: https://gleasonator.com/objects/1234"
+ end
+
+ test "adds quote URL to post content, custom template" do
+ clear_config([:mrf_inline_quote, :template], "{url}'s quoting")
+ quote_url = "https://gleasonator.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post",
+ "quoteUrl" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
+
+ assert filtered ==
+ "Nice post
https://gleasonator.com/objects/1234's quoting"
end
test "doesn't add line breaks to markdown posts" do
@@ -41,7 +61,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
{:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
assert filtered ==
- "Nice post
RT: https://gleasonator.com/objects/1234
"
+ "Nice post
RT: https://gleasonator.com/objects/1234
"
end
test "ignores Misskey quote posts" do
From 8f252fd99b2d974162c636fd4936dd9b186339e5 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 11:09:10 -0400
Subject: [PATCH 068/132] Parse object link as quoteUrl
---
lib/pleroma/constants.ex | 7 +++++
.../audio_image_video_validator.ex | 1 +
.../object_validators/common_fixes.ex | 27 +++++++++++++++++++
.../object_validators/question_validator.ex | 1 +
.../quote_post/fep-e232-tag-example.json | 17 ++++++++++++
.../article_note_page_validator_test.exs | 12 +++++++++
6 files changed, 65 insertions(+)
create mode 100644 test/fixtures/quote_post/fep-e232-tag-example.json
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index 7b4fd03b6..2a65bd50e 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -81,4 +81,11 @@ defmodule Pleroma.Constants do
const(mime_regex,
do: ~r/^[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+\/[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+(; .*)?$/
)
+
+ const(activity_json_mime_types,
+ do: [
+ "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
+ "application/activity+json"
+ ]
+ )
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_image_video_validator.ex b/lib/pleroma/web/activity_pub/object_validators/audio_image_video_validator.ex
index 79ff76104..65ac6bb93 100644
--- a/lib/pleroma/web/activity_pub/object_validators/audio_image_video_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/audio_image_video_validator.ex
@@ -99,6 +99,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioImageVideoValidator do
data
|> CommonFixes.fix_actor()
|> CommonFixes.fix_object_defaults()
+ |> CommonFixes.fix_quote_url()
|> Transmogrifier.fix_emoji()
|> fix_url()
|> fix_content()
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
index cc2ad9116..65b8d9a2c 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
@@ -10,6 +10,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
alias Pleroma.Web.ActivityPub.Transmogrifier
alias Pleroma.Web.ActivityPub.Utils
+ require Pleroma.Constants
+
def cast_and_filter_recipients(message, field, follower_collection, field_fallback \\ []) do
{:ok, data} = ObjectValidators.Recipients.cast(message[field] || field_fallback)
@@ -96,5 +98,30 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
Map.put(data, "quoteUrl", quote_url)
end
+ def fix_quote_url(%{"tag" => [_ | _] = tags} = data) do
+ tag = Enum.find(tags, &is_object_link_tag/1)
+
+ if not is_nil(tag) do
+ data
+ |> Map.put("quoteUrl", tag["href"])
+ else
+ data
+ end
+ end
+
def fix_quote_url(data), do: data
+
+ # https://codeberg.org/fediverse/fep/src/branch/main/fep/e232/fep-e232.md
+ defp is_object_link_tag(
+ %{
+ "type" => "Link",
+ "mediaType" => media_type,
+ "href" => href
+ } = tag
+ )
+ when media_type in Pleroma.Constants.activity_json_mime_types() and is_binary(href) do
+ true
+ end
+
+ defp is_object_link_tag(_), do: false
end
diff --git a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
index ce3305142..621085e6c 100644
--- a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex
@@ -62,6 +62,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
data
|> CommonFixes.fix_actor()
|> CommonFixes.fix_object_defaults()
+ |> CommonFixes.fix_quote_url()
|> Transmogrifier.fix_emoji()
|> fix_closed()
end
diff --git a/test/fixtures/quote_post/fep-e232-tag-example.json b/test/fixtures/quote_post/fep-e232-tag-example.json
new file mode 100644
index 000000000..23c7fb5ac
--- /dev/null
+++ b/test/fixtures/quote_post/fep-e232-tag-example.json
@@ -0,0 +1,17 @@
+{
+ "@context": "https://www.w3.org/ns/activitystreams",
+ "type": "Note",
+ "content": "This is a quote:
RE: https://server.example/objects/123",
+ "tag": [
+ {
+ "type": "Link",
+ "mediaType": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
+ "href": "https://server.example/objects/123",
+ "name": "RE: https://server.example/objects/123"
+ }
+ ],
+ "id": "https://server.example/objects/1",
+ "to": "https://server.example/users/1",
+ "attributedTo": "https://server.example/users/1",
+ "actor": "https://server.example/users/1"
+}
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index a4ba38e6a..73141cac1 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -146,4 +146,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
assert cng.valid?
assert cng.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
end
+
+ test "Parse tag as quote" do
+ # https://codeberg.org/fediverse/fep/src/branch/main/fep/e232/fep-e232.md
+
+ insert(:user, ap_id: "https://server.example/users/1")
+
+ data = File.read!("test/fixtures/quote_post/fep-e232-tag-example.json") |> Jason.decode!()
+ cng = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://server.example/objects/123"
+ end
end
From f8b01788ebe88a4e10634af74ca761edac7886a4 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 14:08:24 -0400
Subject: [PATCH 069/132] Keep incoming Link tag
---
.../object_validators/tag_validator.ex | 14 +++++++++++++-
.../article_note_page_validator_test.exs | 7 +++++++
2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex b/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
index cfd510c19..47cf7b415 100644
--- a/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/tag_validator.ex
@@ -9,15 +9,20 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.TagValidator do
import Ecto.Changeset
+ require Pleroma.Constants
+
@primary_key false
embedded_schema do
# Common
field(:type, :string)
field(:name, :string)
- # Mention, Hashtag
+ # Mention, Hashtag, Link
field(:href, ObjectValidators.Uri)
+ # Link
+ field(:mediaType, :string)
+
# Emoji
embeds_one :icon, IconObjectValidator, primary_key: false do
field(:type, :string)
@@ -68,6 +73,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.TagValidator do
|> validate_required([:type, :name, :icon])
end
+ def changeset(struct, %{"type" => "Link"} = data) do
+ struct
+ |> cast(data, [:type, :name, :mediaType, :href])
+ |> validate_inclusion(:mediaType, Pleroma.Constants.activity_json_mime_types())
+ |> validate_required([:type, :href, :mediaType])
+ end
+
def changeset(struct, %{"type" => _} = data) do
struct
|> cast(data, [])
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index 73141cac1..4703c3801 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -157,5 +157,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
assert cng.valid?
assert cng.changes.quoteUrl == "https://server.example/objects/123"
+
+ assert Enum.at(cng.changes.tag, 0).changes == %{
+ type: "Link",
+ mediaType: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
+ href: "https://server.example/objects/123",
+ name: "RE: https://server.example/objects/123"
+ }
end
end
From 05beada21b6b4c33e413dc6936303a8f761eb7ff Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 14:27:29 -0400
Subject: [PATCH 070/132] Add mrf to force link tag of quoting posts
---
docs/configuration/cheatsheet.md | 1 +
lib/pleroma/constants.ex | 4 +
.../mrf/quote_to_link_tag_policy.ex | 49 +++++++++++++
.../object_validators/common_fixes.ex | 16 ++--
.../mrf/quote_to_link_tag_policy_test.exs | 73 +++++++++++++++++++
5 files changed, 134 insertions(+), 9 deletions(-)
create mode 100644 lib/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy.ex
create mode 100644 test/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy_test.exs
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index a17f8735a..a4cae4dbb 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -161,6 +161,7 @@ To add configuration to your config file, you can copy it from the base config.
* `Pleroma.Web.ActivityPub.MRF.KeywordPolicy`: Rejects or removes from the federated timeline or replaces keywords. (See [`:mrf_keyword`](#mrf_keyword)).
* `Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent`: Forces every mentioned user to be reflected in the post content.
* `Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy`: Forces quote post URLs to be reflected in the message content inline.
+ * `Pleroma.Web.ActivityPub.MRF.QuoteToLinkTagPolicy`: Force a Link tag for posts quoting another post. (may break outgoing federation of quote posts with older Pleroma versions)
* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo).
* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index 2a65bd50e..3193cf8f0 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -82,6 +82,10 @@ defmodule Pleroma.Constants do
do: ~r/^[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+\/[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+(; .*)?$/
)
+ const(activity_json_canonical_mime_type,
+ do: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""
+ )
+
const(activity_json_mime_types,
do: [
"application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
diff --git a/lib/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy.ex b/lib/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy.ex
new file mode 100644
index 000000000..f1c573d1b
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy.ex
@@ -0,0 +1,49 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.QuoteToLinkTagPolicy do
+ @moduledoc "Force a Link tag for posts quoting another post. (may break outgoing federation of quote posts with older Pleroma versions)"
+ @behaviour Pleroma.Web.ActivityPub.MRF.Policy
+
+ alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes
+
+ require Pleroma.Constants
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(%{"object" => %{"quoteUrl" => _} = object} = activity) do
+ {:ok, Map.put(activity, "object", filter_object(object))}
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(object), do: {:ok, object}
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def describe, do: {:ok, %{}}
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def history_awareness, do: :auto
+
+ defp filter_object(%{"quoteUrl" => quote_url} = object) do
+ tags = object["tag"] || []
+
+ if Enum.any?(tags, fn tag ->
+ CommonFixes.is_object_link_tag(tag) and tag["href"] == quote_url
+ end) do
+ object
+ else
+ object
+ |> Map.put(
+ "tag",
+ tags ++
+ [
+ %{
+ "type" => "Link",
+ "mediaType" => Pleroma.Constants.activity_json_canonical_mime_type(),
+ "href" => quote_url
+ }
+ ]
+ )
+ end
+ end
+end
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
index 65b8d9a2c..4d9be0bdd 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex
@@ -112,16 +112,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
def fix_quote_url(data), do: data
# https://codeberg.org/fediverse/fep/src/branch/main/fep/e232/fep-e232.md
- defp is_object_link_tag(
- %{
- "type" => "Link",
- "mediaType" => media_type,
- "href" => href
- } = tag
- )
- when media_type in Pleroma.Constants.activity_json_mime_types() and is_binary(href) do
+ def is_object_link_tag(%{
+ "type" => "Link",
+ "mediaType" => media_type,
+ "href" => href
+ })
+ when media_type in Pleroma.Constants.activity_json_mime_types() and is_binary(href) do
true
end
- defp is_object_link_tag(_), do: false
+ def is_object_link_tag(_), do: false
end
diff --git a/test/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy_test.exs b/test/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy_test.exs
new file mode 100644
index 000000000..96b49b6a0
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/quote_to_link_tag_policy_test.exs
@@ -0,0 +1,73 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.QuoteToLinkTagPolicyTest do
+ alias Pleroma.Web.ActivityPub.MRF.QuoteToLinkTagPolicy
+
+ use Pleroma.DataCase
+
+ require Pleroma.Constants
+
+ test "Add quote url to Link tag" do
+ quote_url = "https://gleasonator.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post",
+ "quoteUrl" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => object}} = QuoteToLinkTagPolicy.filter(activity)
+
+ assert object["tag"] == [
+ %{
+ "type" => "Link",
+ "href" => quote_url,
+ "mediaType" => Pleroma.Constants.activity_json_canonical_mime_type()
+ }
+ ]
+ end
+
+ test "Add quote url to Link tag, append to the end" do
+ quote_url = "https://gleasonator.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post",
+ "quoteUrl" => quote_url,
+ "tag" => [%{"type" => "Hashtag", "name" => "#foo"}]
+ }
+ }
+
+ {:ok, %{"object" => object}} = QuoteToLinkTagPolicy.filter(activity)
+
+ assert [_, tag] = object["tag"]
+
+ assert tag == %{
+ "type" => "Link",
+ "href" => quote_url,
+ "mediaType" => Pleroma.Constants.activity_json_canonical_mime_type()
+ }
+ end
+
+ test "Bypass posts without quoteUrl" do
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post"
+ }
+ }
+
+ assert {:ok, ^activity} = QuoteToLinkTagPolicy.filter(activity)
+ end
+end
From 01eafc037243d1ceabdf4b707a24bdf28cbc8615 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 14:37:12 -0400
Subject: [PATCH 071/132] Make InlineQuotePolicy history aware
---
lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index a0eefefc0..aaa209aa1 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -53,6 +53,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
@impl true
def describe, do: {:ok, %{}}
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def history_awareness, do: :auto
+
@impl true
def config_description do
%{
From fca6a7933e963655661f1bdd9c542a4748df6de2 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 14:58:20 -0400
Subject: [PATCH 072/132] Fix TransmogrifierTest
---
test/pleroma/web/activity_pub/transmogrifier_test.exs | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 4a192cdc0..5e58d75db 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -123,7 +123,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert activity.data["context"] == object.data["context"]
end
- test "it drops link tags" do
+ test "it keeps link tags" do
insert(:user, ap_id: "https://example.org/users/alice")
message = File.read!("test/fixtures/fep-e232.json") |> Jason.decode!()
@@ -131,10 +131,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
assert {:ok, activity} = Transmogrifier.handle_incoming(message)
object = Object.normalize(activity)
- assert length(object.data["tag"]) == 1
-
- tag = object.data["tag"] |> List.first()
- assert tag["type"] == "Mention"
+ assert [%{"type" => "Mention"}, %{"type" => "Link"}] = object.data["tag"]
end
test "it accepts quote posts" do
From 44eb64817926021b45c77455a22db7691d570639 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 22:07:16 -0400
Subject: [PATCH 073/132] Fix config descriptions for mrf inline quote
---
config/description.exs | 18 ------------------
.../activity_pub/mrf/inline_quote_policy.ex | 12 +++++++-----
2 files changed, 7 insertions(+), 23 deletions(-)
diff --git a/config/description.exs b/config/description.exs
index 079d187d5..d18649ae8 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -2994,24 +2994,6 @@ config :pleroma, :config_description, [
}
]
},
- %{
- group: :pleroma,
- key: :mrf_inline_quote,
- tab: :mrf,
- related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
- label: "MRF Inline Quote Policy",
- type: :group,
- description: "Force quote url to appear in post content.",
- children: [
- %{
- key: :template,
- type: :string,
- description:
- "The template to append to the post. `{url}` will be replaced with the actual link to the quoted post.",
- suggestions: ["RT: {url}"]
- }
- ]
- },
%{
group: :pleroma,
key: :modules,
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index aaa209aa1..171b22c5e 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -61,14 +61,16 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
%{
key: :mrf_inline_quote,
related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
- label: "MRF Inline Quote",
- description: "Force quote post URLs inline",
+ label: "MRF Inline Quote Policy",
+ type: :group,
+ description: "Force quote url to appear in post content.",
children: [
%{
- key: :prefix,
+ key: :template,
type: :string,
- description: "Prefix before the link",
- suggestions: ["RT", "QT", "RE", "RN"]
+ description:
+ "The template to append to the post. `{url}` will be replaced with the actual link to the quoted post.",
+ suggestions: ["RT: {url}"]
}
]
}
From 5ebabcd582d711fe395c3dfe1ba54861f8f46371 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 23:29:23 -0400
Subject: [PATCH 074/132] Do not mention original poster when quoting
---
lib/pleroma/web/common_api/activity_draft.ex | 3 ---
test/pleroma/web/common_api_test.exs | 4 ++--
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index c80c4940e..0ae3dfe76 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -139,9 +139,6 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp quote_post(%{params: %{quote_id: id}} = draft) when not_empty_string(id) do
case Activity.get_by_id_with_object(id) do
- %Activity{actor: actor_ap_id} = activity when not_empty_string(actor_ap_id) ->
- %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
-
%Activity{} = activity ->
%__MODULE__{draft | quote_post: activity}
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 04ac01c79..e49ef1c10 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -790,8 +790,8 @@ defmodule Pleroma.Web.CommonAPITest do
assert quote_post.data["quoteUrl"] == quoted.data["id"]
- # The OP is mentioned
- assert quoted.data["actor"] in quote_post.data["to"]
+ # The OP is not mentioned
+ refute quoted.data["actor"] in quote_post.data["to"]
end
test "quote posting with explicit addressing doesn't mention the OP" do
From 2436c9d61de88927d7402e26865ed0fceec70732 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 23:47:31 -0400
Subject: [PATCH 075/132] Expose quote_id parameter on the api
---
lib/pleroma/web/api_spec/schemas/status.ex | 5 +++++
lib/pleroma/web/mastodon_api/views/status_view.ex | 10 ++++++++++
.../web/mastodon_api/views/status_view_test.exs | 3 +++
3 files changed, 18 insertions(+)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index 5d0eedb08..07f03134a 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -198,6 +198,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "Quoted status (if any)"
},
+ quote_id: %Schema{
+ nullable: true,
+ allOf: [FlakeID],
+ description: "ID of the status being quoted, if any"
+ },
quote_url: %Schema{
type: :string,
format: :uri,
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index ba4a8f3eb..3d3039751 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -312,6 +312,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# Here the implicit index of the current content is 0
chrono_order = history_len - 1
+ quote_id = get_quote_id(activity)
+
quote_activity = get_quote(activity, opts)
quote_post =
@@ -431,6 +433,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote: quote_post,
+ quote_id: quote_id,
quote_url: object.data["quoteUrl"],
quote_visible: visible_for_user?(quote_activity, opts[:for]),
content: %{"text/plain" => content_plaintext},
@@ -689,6 +692,13 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
+ defp get_quote_id(activity) do
+ case get_quote(activity, %{}) do
+ %Activity{id: id} -> id
+ _ -> nil
+ end
+ end
+
def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do
url = object.data["url"] || object.data["id"]
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index 6d3a72970..221244d4e 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -327,6 +327,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
context: object_data["context"],
in_reply_to_account_acct: nil,
quote: nil,
+ quote_id: nil,
quote_url: nil,
quote_visible: false,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
@@ -435,10 +436,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
status = StatusView.render("show.json", %{activity: quoted_quote_post})
assert status.pleroma.quote.id == to_string(quote_post.id)
+ assert status.pleroma.quote_id == to_string(quote_post.id)
assert status.pleroma.quote_url == Object.normalize(quote_post).data["id"]
# Quotes don't go more than one level deep
refute status.pleroma.quote.pleroma.quote
+ assert status.pleroma.quote.pleroma.quote_id == to_string(post.id)
assert status.pleroma.quote.pleroma.quote_url == Object.normalize(post).data["id"]
# In an index
From bffa258a23f1f963e0706a4615511351b22ad771 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 12 Jul 2023 23:56:54 -0400
Subject: [PATCH 076/132] Fix quote_visible attribute
---
.../web/mastodon_api/views/status_view.ex | 19 +++++++------------
.../mastodon_api/views/status_view_test.exs | 2 ++
2 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 3d3039751..d070262cc 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -312,12 +312,16 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# Here the implicit index of the current content is 0
chrono_order = history_len - 1
- quote_id = get_quote_id(activity)
-
quote_activity = get_quote(activity, opts)
+ quote_id =
+ case quote_activity do
+ %Activity{id: id} -> id
+ _ -> nil
+ end
+
quote_post =
- if visible_for_user?(quote_activity, opts[:for]) do
+ if visible_for_user?(quote_activity, opts[:for]) and opts[:show_quote] != false do
quote_rendering_opts = Map.merge(opts, %{activity: quote_activity, show_quote: false})
render("show.json", quote_rendering_opts)
else
@@ -671,8 +675,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
- def get_quote(_activity, %{show_quote: false}), do: nil
-
def get_quote(activity, %{quoted_activities: quoted_activities}) do
object = Object.normalize(activity, fetch: false)
@@ -692,13 +694,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
- defp get_quote_id(activity) do
- case get_quote(activity, %{}) do
- %Activity{id: id} -> id
- _ -> nil
- end
- end
-
def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do
url = object.data["url"] || object.data["id"]
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index 221244d4e..baa9b32f5 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -438,11 +438,13 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert status.pleroma.quote.id == to_string(quote_post.id)
assert status.pleroma.quote_id == to_string(quote_post.id)
assert status.pleroma.quote_url == Object.normalize(quote_post).data["id"]
+ assert status.pleroma.quote_visible
# Quotes don't go more than one level deep
refute status.pleroma.quote.pleroma.quote
assert status.pleroma.quote.pleroma.quote_id == to_string(post.id)
assert status.pleroma.quote.pleroma.quote_url == Object.normalize(post).data["id"]
+ assert status.pleroma.quote.pleroma.quote_visible
# In an index
[status] = StatusView.render("index.json", %{activities: [quoted_quote_post], as: :activity})
From a5048c270ed36c5d9d31c83b8f00a135c0a2483f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 4 Sep 2023 19:39:51 +0300
Subject: [PATCH 077/132] oops
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 4d4c0b13e..55cd4a008 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -877,7 +877,7 @@ config :pleroma, :mrf,
Pleroma.Web.ActivityPub.MRF.SimplePolicy,
Pleroma.Web.ActivityPub.MRF.HellthreadPolicy,
Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy,
- Pleroma.Web.ActivityPub.MRF.TagPolicy
+ Pleroma.Web.ActivityPub.MRF.TagPolicy,
Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy,
Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
],
From 337d047c4dedaa753e381b80524beb43924dc5cd Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 29 Oct 2023 18:58:57 +0200
Subject: [PATCH 078/132] embed favicon on backend and make it configurable
---
config/config.exs | 1 +
config/description.exs | 7 +++++++
lib/pleroma/web/fallback/redirect_controller.ex | 6 ++++--
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index e8ae31542..2b2583671 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -185,6 +185,7 @@ config :pleroma, :instance,
short_description: "",
background_image: "/images/city.jpg",
instance_thumbnail: "/instance/thumbnail.jpeg",
+ favicon: "/favicon.png",
limit: 5_000,
description_limit: 5_000,
remote_limit: 100_000,
diff --git a/config/description.exs b/config/description.exs
index d18649ae8..86756586f 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -987,6 +987,13 @@ config :pleroma, :config_description, [
"The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.",
suggestions: ["/instance/thumbnail.jpeg"]
},
+ %{
+ key: :favicon,
+ type: {:string, :image},
+ description:
+ "Favicon of the instance",
+ suggestions: ["/favicon.png"]
+ },
%{
key: :show_reactions,
type: :boolean,
diff --git a/lib/pleroma/web/fallback/redirect_controller.ex b/lib/pleroma/web/fallback/redirect_controller.ex
index 1a86f7a53..9e1bbfb49 100644
--- a/lib/pleroma/web/fallback/redirect_controller.ex
+++ b/lib/pleroma/web/fallback/redirect_controller.ex
@@ -38,10 +38,11 @@ defmodule Pleroma.Web.Fallback.RedirectController do
tags = build_tags(conn, params)
preloads = preload_data(conn, params)
title = "#{Pleroma.Config.get([:instance, :name])}"
+ favicon = ""
response =
index_content
- |> String.replace("", tags <> preloads <> title)
+ |> String.replace("", tags <> preloads <> title <> favicon)
conn
|> put_resp_content_type("text/html")
@@ -56,10 +57,11 @@ defmodule Pleroma.Web.Fallback.RedirectController do
{:ok, index_content} = File.read(index_file_path())
preloads = preload_data(conn, params)
title = "#{Pleroma.Config.get([:instance, :name])}"
+ favicon = ""
response =
index_content
- |> String.replace("", preloads <> title)
+ |> String.replace("", preloads <> title <> favicon)
conn
|> put_resp_content_type("text/html")
From 82e4c5d0775a22ddade3d8b6b71564a3f11604b4 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 29 Oct 2023 19:13:02 +0200
Subject: [PATCH 079/132] include the PWA manifest
---
lib/pleroma/web/fallback/redirect_controller.ex | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/web/fallback/redirect_controller.ex b/lib/pleroma/web/fallback/redirect_controller.ex
index 9e1bbfb49..2999ded26 100644
--- a/lib/pleroma/web/fallback/redirect_controller.ex
+++ b/lib/pleroma/web/fallback/redirect_controller.ex
@@ -39,10 +39,11 @@ defmodule Pleroma.Web.Fallback.RedirectController do
preloads = preload_data(conn, params)
title = "#{Pleroma.Config.get([:instance, :name])}"
favicon = ""
+ manifest = ""
response =
index_content
- |> String.replace("", tags <> preloads <> title <> favicon)
+ |> String.replace("", tags <> preloads <> title <> favicon <> manifest)
conn
|> put_resp_content_type("text/html")
@@ -58,10 +59,11 @@ defmodule Pleroma.Web.Fallback.RedirectController do
preloads = preload_data(conn, params)
title = "#{Pleroma.Config.get([:instance, :name])}"
favicon = ""
+ manifest = ""
response =
index_content
- |> String.replace("", preloads <> title <> favicon)
+ |> String.replace("", preloads <> title <> favicon <> manifest)
conn
|> put_resp_content_type("text/html")
From 5848ef137f40cf64e1b54f7eeaf4a73a35f7a34e Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 29 Oct 2023 19:25:14 +0200
Subject: [PATCH 080/132] add fields needed for chrome to make website
installable
---
config/config.exs | 2 ++
1 file changed, 2 insertions(+)
diff --git a/config/config.exs b/config/config.exs
index 2b2583671..b29f6de3a 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -361,6 +361,8 @@ config :pleroma, :manifest,
icons: [
%{
src: "/static/logo.svg",
+ size: "144x144",
+ purpose: "any",
type: "image/svg+xml"
}
],
From 3d2067d4331feb32c3c0a82131e2b6af6a154b58 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 29 Oct 2023 19:28:57 +0200
Subject: [PATCH 081/132] typo
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index b29f6de3a..a5328fc9b 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -361,7 +361,7 @@ config :pleroma, :manifest,
icons: [
%{
src: "/static/logo.svg",
- size: "144x144",
+ sizes: "144x144",
purpose: "any",
type: "image/svg+xml"
}
From d8eb741b6d85d966c608628cf2ecfb669eafeb11 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Sun, 29 Oct 2023 19:32:07 +0200
Subject: [PATCH 082/132] changelog
---
changelog.d/favicon.add | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/favicon.add
diff --git a/changelog.d/favicon.add b/changelog.d/favicon.add
new file mode 100644
index 000000000..cf12395e7
--- /dev/null
+++ b/changelog.d/favicon.add
@@ -0,0 +1 @@
+Add support for configuring favicon, embed favicon and PWA manifest in server-generated meta
From 6f38915198c3a820f6c265044684a082b756cb91 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Mon, 30 Oct 2023 11:29:57 +0200
Subject: [PATCH 083/132] lint?
---
config/description.exs | 3 +--
lib/pleroma/web/fallback/redirect_controller.ex | 5 ++++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/config/description.exs b/config/description.exs
index 86756586f..20c8cc05d 100644
--- a/config/description.exs
+++ b/config/description.exs
@@ -990,8 +990,7 @@ config :pleroma, :config_description, [
%{
key: :favicon,
type: {:string, :image},
- description:
- "Favicon of the instance",
+ description: "Favicon of the instance",
suggestions: ["/favicon.png"]
},
%{
diff --git a/lib/pleroma/web/fallback/redirect_controller.ex b/lib/pleroma/web/fallback/redirect_controller.ex
index 2999ded26..44726c6df 100644
--- a/lib/pleroma/web/fallback/redirect_controller.ex
+++ b/lib/pleroma/web/fallback/redirect_controller.ex
@@ -43,7 +43,10 @@ defmodule Pleroma.Web.Fallback.RedirectController do
response =
index_content
- |> String.replace("", tags <> preloads <> title <> favicon <> manifest)
+ |> String.replace(
+ "",
+ tags <> preloads <> title <> favicon <> manifest
+ )
conn
|> put_resp_content_type("text/html")
From 5a807299864d9aab28431c113f9aa4585e9ca464 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Wed, 1 Nov 2023 18:57:20 +0200
Subject: [PATCH 084/132] always include title, manifest and favicon
---
lib/pleroma/web/fallback/redirect_controller.ex | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/fallback/redirect_controller.ex b/lib/pleroma/web/fallback/redirect_controller.ex
index 44726c6df..593e4c282 100644
--- a/lib/pleroma/web/fallback/redirect_controller.ex
+++ b/lib/pleroma/web/fallback/redirect_controller.ex
@@ -18,9 +18,22 @@ defmodule Pleroma.Web.Fallback.RedirectController do
end
def redirector(conn, _params, code \\ 200) do
+ {:ok, index_content} = File.read(index_file_path())
+
+ title = "#{Pleroma.Config.get([:instance, :name])}"
+ favicon = ""
+ manifest = ""
+
+ response =
+ index_content
+ |> String.replace(
+ "",
+ title <> favicon <> manifest
+ )
+
conn
|> put_resp_content_type("text/html")
- |> send_file(code, index_file_path())
+ |> send_resp(200, response)
end
def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do
From 2561febffdf341552c3553ee8300d0305e2b45a5 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 26 Mar 2024 12:48:52 +0200
Subject: [PATCH 085/132] thanks emacs/arch
---
.../web/fallback/redirect_controller.ex | 40 -------------------
1 file changed, 40 deletions(-)
diff --git a/lib/pleroma/web/fallback/redirect_controller.ex b/lib/pleroma/web/fallback/redirect_controller.ex
index d556ae88e..4a0885fab 100644
--- a/lib/pleroma/web/fallback/redirect_controller.ex
+++ b/lib/pleroma/web/fallback/redirect_controller.ex
@@ -32,22 +32,6 @@ defmodule Pleroma.Web.Fallback.RedirectController do
def redirector(conn, _params, code \\ 200) do
{:ok, index_content} = File.read(index_file_path())
-<<<<<<< HEAD
- title = "#{Pleroma.Config.get([:instance, :name])}"
- favicon = ""
- manifest = ""
-
- response =
- index_content
- |> String.replace(
- "",
- title <> favicon <> manifest
- )
-
- conn
- |> put_resp_content_type("text/html")
- |> send_resp(200, response)
-=======
response =
index_content
|> add_generated_metadata()
@@ -55,7 +39,6 @@ defmodule Pleroma.Web.Fallback.RedirectController do
conn
|> put_resp_content_type("text/html")
|> send_resp(code, response)
->>>>>>> origin/develop
end
def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} = params) do
@@ -71,23 +54,10 @@ defmodule Pleroma.Web.Fallback.RedirectController do
{:ok, index_content} = File.read(index_file_path())
tags = build_tags(conn, params)
preloads = preload_data(conn, params)
-<<<<<<< HEAD
- title = "#{Pleroma.Config.get([:instance, :name])}"
- favicon = ""
- manifest = ""
-
- response =
- index_content
- |> String.replace(
- "",
- tags <> preloads <> title <> favicon <> manifest
- )
-=======
response =
index_content
|> add_generated_metadata(tags <> preloads)
->>>>>>> origin/develop
conn
|> put_resp_content_type("text/html")
@@ -101,20 +71,10 @@ defmodule Pleroma.Web.Fallback.RedirectController do
def redirector_with_preload(conn, params) do
{:ok, index_content} = File.read(index_file_path())
preloads = preload_data(conn, params)
-<<<<<<< HEAD
- title = "#{Pleroma.Config.get([:instance, :name])}"
- favicon = ""
- manifest = ""
-
- response =
- index_content
- |> String.replace("", preloads <> title <> favicon <> manifest)
-=======
response =
index_content
|> add_generated_metadata(preloads)
->>>>>>> origin/develop
conn
|> put_resp_content_type("text/html")
From fcfe16340a6ee8583257e80cd69eb71e7ae99c2b Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 8 Oct 2024 18:38:43 +0300
Subject: [PATCH 086/132] alsp
---
config/config.exs | 1 +
1 file changed, 1 insertion(+)
diff --git a/config/config.exs b/config/config.exs
index 1d354a682..44b3be572 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -903,6 +903,7 @@ config :pleroma, :mrf,
Pleroma.Web.ActivityPub.MRF.TagPolicy,
Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy,
Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy
],
transparency: true,
transparency_exclusions: []
From 77119d936829d7d87370b1d9f2bba457af1dc707 Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 8 Oct 2024 18:39:17 +0300
Subject: [PATCH 087/132] c
---
config/config.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
index 44b3be572..de9547b10 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -902,7 +902,7 @@ config :pleroma, :mrf,
Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy,
Pleroma.Web.ActivityPub.MRF.TagPolicy,
Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy,
- Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy,
Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy
],
transparency: true,
From 7f121afabaac162ead0307f32005e4bc3473944f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 11 Mar 2025 22:05:16 +0200
Subject: [PATCH 088/132] fix
---
config/config.exs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/config/config.exs b/config/config.exs
index 3e50b4207..d90d56d9b 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -65,8 +65,8 @@ config :pleroma, Pleroma.Upload,
proxy_remote: false,
filename_display_max_length: 30,
default_description: :filename,
- base_url: nil
- allowed_mime_types: ["image", "audio", "video"]
+ base_url: nil,
+ allowed_mime_types: ["image", "audio", "video", "application"]
config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads"
From 82a65328c232d50b693fb9f5ef7ddcddca8e27cb Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Thu, 10 Jul 2025 21:42:06 +0300
Subject: [PATCH 089/132] delete custom emoji file
---
config/custom_emoji.txt | 115 ----------------------------------------
1 file changed, 115 deletions(-)
delete mode 100644 config/custom_emoji.txt
diff --git a/config/custom_emoji.txt b/config/custom_emoji.txt
deleted file mode 100644
index c7a706630..000000000
--- a/config/custom_emoji.txt
+++ /dev/null
@@ -1,115 +0,0 @@
-Advanced_Sorcery, /emoji/sgsgb/Advanced_Sorcery.png
-FACE_QUAD, /emoji/sgsgb/FACE_QUAD.png
-Yukkuri_Reimu, /emoji/sgsgb/Yukkuri_Reimu.png
-a_to, /emoji/sgsgb/a_to.png
-angrypirds, /emoji/sgsgb/angrypirds.png
-annoying_dog_hole, /emoji/sgsgb/annoying_dog_hole.png
-award_bios, /emoji/sgsgb/award_bios.png
-bananya, /emoji/sgsgb/bananya.png
-bandits, /emoji/sgsgb/bandits.png
-blobcatknife, /emoji/sgsgb/blobcatknife.png
-cacolaugh, /emoji/sgsgb/cacolaugh.png
-catboythink, /emoji/sgsgb/catboythink.png
-cirno_run, /emoji/sgsgb/cirno_run.png
-debian, /emoji/sgsgb/debian.png
-denton, /emoji/sgsgb/denton.png
-denton_laugh, /emoji/sgsgb/denton_laugh.png
-dio, /emoji/sgsgb/dio.png
-dogcited, /emoji/sgsgb/dogcited.png
-dong, /emoji/sgsgb/dong.png
-duane, /emoji/sgsgb/duane.png
-e, /emoji/sgsgb/e.png
-energy_star, /emoji/sgsgb/energy_star.png
-flynn_smirk, /emoji/sgsgb/flynn_smirk.png
-furrythink, /emoji/sgsgb/furrythink.png
-granddad, /emoji/sgsgb/granddad.png
-heavy_losingeh, /emoji/sgsgb/heavy_losingeh.png
-heavy_winninggreat, /emoji/sgsgb/heavy_winninggreat.png
-herrington, /emoji/sgsgb/herrington.png
-hogan, /emoji/sgsgb/hogan.png
-hyperjoy, /emoji/sgsgb/hyperjoy.png
-itisamystery, /emoji/sgsgb/itisamystery.png
-jacobson, /emoji/sgsgb/jacobson.png
-jake, /emoji/sgsgb/jake.png
-jyushimatsu_think, /emoji/sgsgb/jyushimatsu_think.png
-kinzo, /emoji/sgsgb/kinzo.png
-kms, /emoji/sgsgb/kms.png
-kokoko, /emoji/sgsgb/kokoko.png
-loss, /emoji/sgsgb/loss.png
-luck, /emoji/sgsgb/luck.png
-lucknorm, /emoji/sgsgb/lucknorm.png
-marko, /emoji/sgsgb/marko.png
-megaman, /emoji/sgsgb/megaman.png
-miyanozoom, /emoji/sgsgb/miyanozoom.png
-monster_energy_ultra, /emoji/sgsgb/monster_energy_ultra.png
-moraledn, /emoji/sgsgb/moraledn.png
-moraleup, /emoji/sgsgb/moraleup.png
-multiply, /emoji/sgsgb/multiply.png
-mycomputer, /emoji/sgsgb/mycomputer.png
-necromancy1, /emoji/sgsgb/necromancy1.png
-necromancy2, /emoji/sgsgb/necromancy2.png
-necromancy3, /emoji/sgsgb/necromancy3.png
-nice, /emoji/sgsgb/nice.png
-nyoron, /emoji/sgsgb/nyoron.png
-ohgno, /emoji/sgsgb/ohgno.png
-ohyes, /emoji/sgsgb/ohyes.png
-orangeman, /emoji/sgsgb/orangeman.png
-payyap, /emoji/sgsgb/payyap.png
-pooh, /emoji/sgsgb/pooh.png
-poohington, /emoji/sgsgb/poohington.png
-poptepipic1, /emoji/sgsgb/poptepipic1.png
-poptepipic10, /emoji/sgsgb/poptepipic10.png
-poptepipic11, /emoji/sgsgb/poptepipic11.png
-poptepipic12, /emoji/sgsgb/poptepipic12.png
-poptepipic13, /emoji/sgsgb/poptepipic13.png
-poptepipic14, /emoji/sgsgb/poptepipic14.png
-poptepipic15, /emoji/sgsgb/poptepipic15.png
-poptepipic16, /emoji/sgsgb/poptepipic16.png
-poptepipic17, /emoji/sgsgb/poptepipic17.png
-poptepipic18, /emoji/sgsgb/poptepipic18.png
-poptepipic19, /emoji/sgsgb/poptepipic19.png
-poptepipic2, /emoji/sgsgb/poptepipic2.png
-poptepipic20, /emoji/sgsgb/poptepipic20.png
-poptepipic21, /emoji/sgsgb/poptepipic21.png
-poptepipic22, /emoji/sgsgb/poptepipic22.png
-poptepipic23, /emoji/sgsgb/poptepipic23.png
-poptepipic3, /emoji/sgsgb/poptepipic3.png
-poptepipic4, /emoji/sgsgb/poptepipic4.png
-poptepipic5, /emoji/sgsgb/poptepipic5.png
-poptepipic6, /emoji/sgsgb/poptepipic6.png
-poptepipic7, /emoji/sgsgb/poptepipic7.png
-poptepipic8, /emoji/sgsgb/poptepipic8.png
-poptepipic9, /emoji/sgsgb/poptepipic9.png
-puke, /emoji/sgsgb/puke.png
-quake_net, /emoji/sgsgb/quake_net.png
-quake_ram, /emoji/sgsgb/quake_ram.png
-ranger, /emoji/sgsgb/ranger.png
-ranger_none, /emoji/sgsgb/ranger_none.png
-risitas1, /emoji/sgsgb/risitas1.png
-risitas2, /emoji/sgsgb/risitas2.png
-rokalife, /emoji/sgsgb/rokalife.png
-sandro, /emoji/sgsgb/sandro.png
-scut, /emoji/sgsgb/scut.png
-serious, /emoji/sgsgb/serious.png
-shag, /emoji/sgsgb/shag.png
-shinitai_i, /emoji/sgsgb/shinitai_i.png
-shinitai_ni, /emoji/sgsgb/shinitai_ni.png
-shinitai_shi, /emoji/sgsgb/shinitai_shi.png
-shinitai_ta, /emoji/sgsgb/shinitai_ta.png
-shotging, /emoji/sgsgb/shotging.png
-skelethor, /emoji/sgsgb/skelethor.png
-smug_marisa, /emoji/sgsgb/smug_marisa.png
-spurdo, /emoji/sgsgb/spurdo.png
-stalkers, /emoji/sgsgb/stalkers.png
-tenshi_eating_corndog, /emoji/sgsgb/tenshi_eating_corndog.png
-thinkingwat, /emoji/sgsgb/thinkingwat.png
-thnk, /emoji/sgsgb/thnk.png
-tobdog, /emoji/sgsgb/tobdog.png
-todd, /emoji/sgsgb/todd.png
-trash, /emoji/sgsgb/trash.png
-tuturu, /emoji/sgsgb/tuturu.png
-tux, /emoji/sgsgb/tux.png
-uwot, /emoji/sgsgb/uwot.png
-uwot2, /emoji/sgsgb/uwot2.png
-uwot3, /emoji/sgsgb/uwot3.png
-vanpeek, /emoji/sgsgb/vanpeek.png
From baa8004a2a46f080d9fbeb4afd324639f277c19f Mon Sep 17 00:00:00 2001
From: Henry Jameson
Date: Tue, 12 Aug 2025 02:31:47 +0300
Subject: [PATCH 090/132] new styles for static pages
---
lib/pleroma/web/templates/layout/app.html.eex | 6 +-
.../templates/o_auth/o_auth/_scopes.html.eex | 15 +-
.../web/templates/o_auth/o_auth/show.html.eex | 25 +-
priv/static/instance/static.css | 485 +++++++++---------
4 files changed, 287 insertions(+), 244 deletions(-)
diff --git a/lib/pleroma/web/templates/layout/app.html.eex b/lib/pleroma/web/templates/layout/app.html.eex
index e33bada85..99ab0ddad 100644
--- a/lib/pleroma/web/templates/layout/app.html.eex
+++ b/lib/pleroma/web/templates/layout/app.html.eex
@@ -13,8 +13,10 @@
-
- <%= @inner_content %>
+
+
+ <%= @inner_content %>
+