21
21
22
22
from twisted .web .server import Request
23
23
24
+ from synapse import event_auth
24
25
from synapse .api .constants import EventTypes , Membership
25
26
from synapse .api .errors import (
26
27
AuthError ,
29
30
MissingClientTokenError ,
30
31
ShadowBanError ,
31
32
SynapseError ,
33
+ UnredactedContentDeletedError ,
32
34
)
33
35
from synapse .api .filtering import Filter
34
36
from synapse .events .utils import format_event_for_client_v2
@@ -643,18 +645,55 @@ def __init__(self, hs: "HomeServer"):
643
645
super ().__init__ ()
644
646
self .clock = hs .get_clock ()
645
647
self ._store = hs .get_datastores ().main
648
+ self ._state = hs .get_state_handler ()
646
649
self .event_handler = hs .get_event_handler ()
647
650
self ._event_serializer = hs .get_event_client_serializer ()
648
651
self ._relations_handler = hs .get_relations_handler ()
649
652
self .auth = hs .get_auth ()
653
+ self .content_keep_ms = hs .config .server .redaction_retention_period
654
+ self .msc2815_enabled = hs .config .experimental .msc2815_enabled
650
655
651
656
async def on_GET (
652
657
self , request : SynapseRequest , room_id : str , event_id : str
653
658
) -> Tuple [int , JsonDict ]:
654
659
requester = await self .auth .get_user_by_req (request , allow_guest = True )
660
+
661
+ include_unredacted_content = self .msc2815_enabled and (
662
+ parse_string (
663
+ request ,
664
+ "fi.mau.msc2815.include_unredacted_content" ,
665
+ allowed_values = ("true" , "false" ),
666
+ )
667
+ == "true"
668
+ )
669
+ if include_unredacted_content and not await self .auth .is_server_admin (
670
+ requester .user
671
+ ):
672
+ power_level_event = await self ._state .get_current_state (
673
+ room_id , EventTypes .PowerLevels , ""
674
+ )
675
+
676
+ auth_events = {}
677
+ if power_level_event :
678
+ auth_events [(EventTypes .PowerLevels , "" )] = power_level_event
679
+
680
+ redact_level = event_auth .get_named_level (auth_events , "redact" , 50 )
681
+ user_level = event_auth .get_user_power_level (
682
+ requester .user .to_string (), auth_events
683
+ )
684
+ if user_level < redact_level :
685
+ raise SynapseError (
686
+ 403 ,
687
+ "You don't have permission to view redacted events in this room." ,
688
+ errcode = Codes .FORBIDDEN ,
689
+ )
690
+
655
691
try :
656
692
event = await self .event_handler .get_event (
657
- requester .user , room_id , event_id
693
+ requester .user ,
694
+ room_id ,
695
+ event_id ,
696
+ show_redacted = include_unredacted_content ,
658
697
)
659
698
except AuthError :
660
699
# This endpoint is supposed to return a 404 when the requester does
@@ -663,6 +702,11 @@ async def on_GET(
663
702
raise SynapseError (404 , "Event not found." , errcode = Codes .NOT_FOUND )
664
703
665
704
if event :
705
+ if include_unredacted_content and await self ._store .have_censored_event (
706
+ event_id
707
+ ):
708
+ raise UnredactedContentDeletedError (self .content_keep_ms )
709
+
666
710
# Ensure there are bundled aggregations available.
667
711
aggregations = await self ._relations_handler .get_bundled_aggregations (
668
712
[event ], requester .user .to_string ()
0 commit comments