Commit graph

10,297 commits

Author SHA1 Message Date
Phantasm
b3887a6fa7
AP C2S: Validate visibility for C2S requests to /users/:nickname/outbox
A local user could previously send Announce/EmojiReact/Like activities
to their outbox referencing objects that aren't visible to them and they
would get processed as if can see them. Only requirement is knowing
the URI of the object and the users instance having C2S enabled (currently
disabled by default).
2025-12-11 23:30:03 +01:00
Oneric
18d762c01b
Add voters key to internal object fields
It is inlined and used to keep track of who already voted for a poll.
This is expected to be confidential information and must no be exposed
2025-12-11 23:30:03 +01:00
Oneric
a1662f05e0
fed/fetch: use same sanitisation logic as when delivering to inboxes
Port of commit 85171750f17725b71dcda098a5085b7f402cb061 from
Akkoma PR 1018.

Modifications from Akkoma patch:
- Pleroma.Web.ActivityPub.Utils.make_json_ld_header() calls had
  activity.data as argument.
- render() had Listen activities in activity_type, Akkoma only has
  Create activities there. Needs testing whether transmogrifier can
  handle this.

Original commit author: Oneric <oneric@oneric.stub>
Original commit message:
Duped code just means double the chance to mess up. This would have
prevented the leak of confidential info more minimally fixed in
6a8b8a14999f3ed82fdaedf6a53f9a391280df2f and  now furthermore
fixes the representation of Update activites which _need_ to have their
object inlined, as well as better interop for follow Accept and Reject
activities and all other special cases already handled in Transmogrifier.
It also means we get more thorough tests for free.

This also already adds JSON-LD context and does not add bogus Note-only
fields as happened before due to this views misuse of prepare_object
for activities. The doc of prepare_object clearly states it is only
intended for creatable objects, i.e. (for us) Notes and Questions.
2025-12-11 23:30:03 +01:00
Oneric
409698ca63
fed/out: ensure we never serve Updates for objects we deem static 2025-12-11 23:30:02 +01:00
Oneric
f8db412af4
fed/fetch: don't serve unsanitised object data for some activities
When the object associated with the activity was preloaded
(which happens automatically with Activity.normalize used in the
 controller) Object.normalize’s "id_only" option did not actually work.
This option and it’s usage were introduced to fix display of Undo
activities in e88f36f72b5317debafcc4209b91eb35ad8f0691.
For "Undo"s (and "Delete"s) there is no object preloaded
(since it is already gone from the database) thus this appeared
to work and for the particular case considered there in fact did.
Create activities use different rendering logic and thus remained
unaffected too.

However, for all other types of Activities (yes, including Update
which really _should_ include a properly sanitised, full object)
this new attempt at including "just the id", lead to it instead
including the full, unsanitised data of the referenced object.

This is obviously bad and can get worse due to access restrictions
on the activity being solely performed based on the addressing
of the activity itself, not of the (unintentionally) embedded
object.

Starting with the obvious, this leaks all "internal" fields
but as already mentioned in 8243fc0ef482a28daf2bcae2c64a9510bdb76489
all current "internal" fields from Constants.object_internal_fields
are already publicised via MastoAPI etc anyway. Assuming matching
addressing of the referenced object and activity this isn't problematic
with regard to confidentiality.
Except, the internal "voters" field recording who voted for a poll
is currently just omitted from Constants.object_internal_fields
and indeed confidential information (fix in subsequent commit).
Fortunately this list is for the poll as a whole and there are no
inlined lists for individual choices. While this thus leaks _who_
voted for a poll, it at least doesn't directly expose _what_ each voter
chose if there are multiple voters.

As alluded to before, the access restriction not being aware
of the misplaced object data into account makes the issue worse.
If the activity addressing is not a subset of the referenced object’s
addressing, this will leak private objects to unauthorised users.
This begs the question whether such mismatched addressing can occur.
For remote activities the answer is ofc a resounding YES,
but we only serve local ActivityPub objects and for the latter
it currently(!) seems like a "no".
For all intended interactions, the user interacting must already have
access to the object of interest and our ActivityPub Builder
already uses a subset of the original posts addressing for
posts not publicly accessible. This addressing creation logic
was last touched six years ago predating the introduction of this
exposure blunder.
The rather big caveat her being, until it was fixed just yesterday in
dff532ac723310903e58c5d28f897cc2d116594f it was indeed possible to
interact with posts one is not allowed to actually see. Combined, this
allowed unauthorised access to private posts. (The API ID of such
private posts can be obtained e.g. from replies one _is_ allowed to see)

During the time when ActivityPub C2S was supported there might have been
more ways to create activities with mismatched addressing and sneak a
peek on private posts. (The AP id can be obtained in an analogous way)

Replaces and fixes e88f36f72b5317debafcc4209b91eb35ad8f0691.
Since there never were any users of the
bugged "id_only" option it is removed.

This was reported by silverpill <silverpill@firemail.cc> as an
ActivityPub interop issue, since this blunder of course also
leads to invalid AP documents by adding an additional layer
in form of the "data" key and directly exposing the internal
Pleroma representation which is not always identical to valid AP.

Fixes: https://akkoma.dev/AkkomaGang/akkoma/issues/1017
2025-12-11 23:30:02 +01:00
Oneric
59fcb5c96e
api: ensure only visible posts are interactable
Port of Akkoma PR 1014 with a few changes:
- comments regarding akkomafe changed to Pleroma-FE when applicable
- different error message for replying to/interacting with invisible post
  in Pleroma.Web.CommonAPI.ActivityDraft.in_reply_to/1
- split "doesn't do funny things to other users favs" test into three:
  - can't unfavourite post that isn't favourited
  - can't unfavourite other user's favs
  - can't unfavourite other user's favs using their activity
- switched order of args for some CommonAPI function since Akkoma hasn't
  backported our old change for that

Pleroma.Web.CommonAPI.ActivityDraft.in_reply_to/1 now refactored to use
`with` statement as in Akkoma. Some defp in_reply_to/1 were therefore removed

Original PR author: Oneric
Original commit message:
It doesn't make sense to like, react, reply, etc to something you cannot
see and is unexpected for the author of the interacted with post and
might make them believe the reacting user actually _can_ see the post.

Wrt to fav, reblog, reaction indexes the missing visibility check was
also leaking some (presumably/hopefully) low-severity data.

Add full-API test for all modes of interactions with private posts.
2025-12-11 23:30:02 +01:00
Phantasm
7d8a188967
Disable Hackney URL encoding function
Hackney interferes with out URI encoding and implements older RFC 2396
instead of RFC 3986 which we and Elixir implement. As an example "'"
and "!" will get encoded by it and cause problems with our MediaProxy
making unexpected 302 redirects.

If an admin supplies a different function via *.secret.exs, we
don't override it.

https://github.com/benoitc/hackney/issues/399
2025-12-10 14:56:07 +01:00
Phantasm
73b337245b
Make URI encoding query quirks host-aware 2025-12-10 14:56:06 +01:00
Phantasm
0f7ad318d3
Add encode_url @spec and docs, and a check whether opts are booleans 2025-12-10 14:56:06 +01:00
Phantasm
07ba3bb829
Remove "support" for path encoding quirks
Currently there isn't any known quirk that would be needed
and this is just dead code that does nothing.
2025-12-10 14:56:06 +01:00
Phantasm
f290b15987
Move custom URI encoding functions to Pleroma.Utils.URIEncoding 2025-12-10 14:56:05 +01:00
Phantasm
6487c93c47
credo lint 2 2025-12-10 14:56:05 +01:00
Phantasm
f36851acbd
credo lint 2025-12-10 14:56:05 +01:00
Phantasm
cfd2c08ef6
lint 2025-12-10 14:56:05 +01:00
Phantasm
a0f73d0e2f
Reimplement URI.encode_query/2 to support quirks, add Guardian quirk
This solves the issue with Guardian rich media cards not loading, thanks
to them using "," and ":" in queries which get improperly encoded.
Guardian also needs specific ordering of the query keys, this also fixes
that.
2025-12-10 14:56:05 +01:00
Phantasm
004ea90b29
MediaProxy: Fix 424 caused by inconsistent %-encoding from remote instances
Notably this would fail to redirect to original proxied file when
preview generation criteria haven't been met.
2025-12-10 14:56:04 +01:00
Phantasm
9445ab9096
ReverseProxy: Log request after potentional %-encoding 2025-12-10 14:56:04 +01:00
Phantasm
99a1c0890a
URI.encode_query needs an enum, add test for this case 2025-12-10 14:56:04 +01:00
Phantasm
80db6f1328
Fix character escaping test for Pleroma.Upload 2025-12-10 14:56:04 +01:00
Phantasm
0a8423fdf7
Add ability to bypass url decode/parse in Pleroma.HTTP, fix encode in Pleroma.Upload 2025-12-10 14:56:03 +01:00
Phantasm
0f3b1808fd
Check what chars to encode in the path segment of URIs, add list to Constants
https://datatracker.ietf.org/doc/html/rfc3986
2025-12-10 14:56:03 +01:00
nicole mikołajczyk
d7b0115124 Merge branch 'mastodon-quotes-updates' into 'develop'
Use Mastodon-compatible route for quotes list and param for quotes count

See merge request pleroma/pleroma!4367
2025-12-02 14:34:16 +01:00
nicole mikołajczyk
ca03d94f52 Merge branch 'pin-chats' into 'develop'
Chats: pin/unpin chats

See merge request pleroma/pleroma!3637
2025-11-29 18:45:42 +01:00
nicole mikołajczyk
6b8bc3bb4c Merge branch 'blocked-muted-swagger' into 'develop'
Use separate schemas for muted/blocked accounts lists

See merge request pleroma/pleroma!4359
2025-11-29 18:45:33 +01:00
nicole mikołajczyk
f443b6d1d7 Merge branch 'lookup-restrict-unauthenticated' into 'develop'
Respect restrict_unauthenticated in /api/v1/accounts/lookup

See merge request pleroma/pleroma!4355
2025-11-29 18:13:53 +01:00
nicole mikołajczyk
2330c50666 Merge branch 'inlinequotes-mastodon' into 'develop'
MRF InlineQuotePolicy: Don't inline quoted post URL in Mastodon quotes

See merge request pleroma/pleroma!4371
2025-11-29 18:12:33 +01:00
Phantasm
5cb141a54e MRF InlineQuotePolicy: Don't inline quoted post URL in Mastodon quotes 2025-11-29 18:12:32 +01:00
nicole mikołajczyk
26a058935a Merge branch 'filter-user-capabilities' into 'develop'
Allow filtering users with `accepts_chat_messages` capability

See merge request pleroma/pleroma!4372
2025-11-29 17:26:01 +01:00
nicole mikołajczyk
6e98c7a1ca Merge branch 'rich-media-user-agent' into 'develop'
Allow setting custom user-agent for fetching rich media content

See merge request pleroma/pleroma!4390
2025-11-29 17:25:18 +01:00
nicole mikołajczyk
428e038c58 Merge branch 'notification-view-deduplicate' into 'develop'
remove duplicated code from notificationview

See merge request pleroma/pleroma!4356
2025-11-29 17:21:44 +01:00
Atsuko Karagi
ef41378fa2 Respect restrict_unauthenticated in /api/v1/accounts/lookup
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-29 17:18:38 +01:00
nicole mikołajczyk
be0146afb3 Improve example
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-29 17:10:24 +01:00
nicole mikołajczyk
d2f6cc1445 Use separate schemas for muted/blocked accounts lists
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-29 17:10:24 +01:00
nicole mikołajczyk
f61fad0663 Pin/unpin chats
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-29 16:53:56 +01:00
nicole mikołajczyk
0dfcc24d30 Merge branch 'translation-provider-translatelocally' into 'develop'
Support translateLocally translation provider

See merge request pleroma/pleroma!4377
2025-11-29 16:50:42 +01:00
nicole mikołajczyk
ba8b5682cc Merge branch 'stream-marker-updates' into 'develop'
Stream marker updates

See merge request pleroma/pleroma!4354
2025-11-29 16:49:29 +01:00
nicole mikołajczyk
367d5c65f6 Merge branch 'outgoing_follow_requests' into 'develop'
Add /api/v1/pleroma/outgoing_follow_requests

See merge request pleroma/pleroma!4310
2025-11-28 16:36:40 +01:00
nicole mikołajczyk
13bc4ba639 Merge remote-tracking branch 'origin/develop' into translation-provider-translatelocally
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-28 15:07:43 +01:00
mkljczk
e458bd953a Add /api/v1/pleroma/outgoing_follow_requests
Signed-off-by: mkljczk <git@mkljczk.pl>
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-28 14:59:55 +01:00
nicole mikołajczyk
0476cf4283 Merge branch 'rss-redirect' into 'develop'
Redirect /users/:nickname.rss to /users/:nickname/feed.rss instead of .atom

See merge request pleroma/pleroma!4375
2025-11-28 14:51:11 +01:00
nicole mikołajczyk
e81e0d64c1 Merge branch 'endorsements-api' into 'develop'
Support new Mastodon API for endorsed accounts

See merge request pleroma/pleroma!4361
2025-11-28 14:51:06 +01:00
nicole mikołajczyk
ec51aadc78 Merge branch 'instance-view-timeline-access' into 'develop'
Add `timelines_access` to InstanceView

See merge request pleroma/pleroma!4393
2025-11-28 14:50:46 +01:00
nicole mikołajczyk
9548c31ef9 Merge branch 'translation-provider-mozhi' into 'develop'
Support Mozhi as translation provider

See merge request pleroma/pleroma!4376
2025-11-28 14:48:21 +01:00
nicole mikołajczyk
4fc1a62264 Merge branch 'notification-cleanup' into 'develop'
Minor cleanup and comment fixes

See merge request pleroma/pleroma!4397
2025-11-28 14:40:30 +01:00
nicole mikołajczyk
dc85b27990 Minor cleanup and comment fixes
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-25 13:52:50 +01:00
nicole mikołajczyk
9da1875c36 Send push notifications for statuses from subscribed accounts
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-22 16:51:21 +01:00
nicole mikołajczyk
b975dce9ba Add timelines_access to InstanceView
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-11-02 00:01:31 +01:00
nicole mikołajczyk
a893c69d20 Merge branch 'remote-url-fix' into 'develop'
Make `remote_url` link to unproxied URL

See merge request pleroma/pleroma!4365
2025-11-01 23:51:27 +01:00
nicole mikołajczyk
68b4de7558 Merge branch 'authorized-fetch-fix' into 'develop'
Fix fetching public keys with authorized fetch enabled

See merge request pleroma/pleroma!4383
2025-11-01 11:25:17 +01:00
nicole mikołajczyk
b6e16877e6 Merge branch 'local-nickname-regex-fix' into 'develop'
Use end-of-string in regex for local `get_by_nickname`

See merge request pleroma/pleroma!4358
2025-11-01 11:24:41 +01:00