2121
2222from  twisted .web .server  import  Request 
2323
24+ from  synapse  import  event_auth 
2425from  synapse .api .constants  import  EventTypes , Membership 
2526from  synapse .api .errors  import  (
2627    AuthError ,
2930    MissingClientTokenError ,
3031    ShadowBanError ,
3132    SynapseError ,
33+     UnredactedContentDeletedError ,
3234)
3335from  synapse .api .filtering  import  Filter 
3436from  synapse .events .utils  import  format_event_for_client_v2 
@@ -643,18 +645,55 @@ def __init__(self, hs: "HomeServer"):
643645        super ().__init__ ()
644646        self .clock  =  hs .get_clock ()
645647        self ._store  =  hs .get_datastores ().main 
648+         self ._state  =  hs .get_state_handler ()
646649        self .event_handler  =  hs .get_event_handler ()
647650        self ._event_serializer  =  hs .get_event_client_serializer ()
648651        self ._relations_handler  =  hs .get_relations_handler ()
649652        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 
650655
651656    async  def  on_GET (
652657        self , request : SynapseRequest , room_id : str , event_id : str 
653658    ) ->  Tuple [int , JsonDict ]:
654659        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+ 
655691        try :
656692            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 ,
658697            )
659698        except  AuthError :
660699            # This endpoint is supposed to return a 404 when the requester does 
@@ -663,6 +702,11 @@ async def on_GET(
663702            raise  SynapseError (404 , "Event not found." , errcode = Codes .NOT_FOUND )
664703
665704        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+ 
666710            # Ensure there are bundled aggregations available. 
667711            aggregations  =  await  self ._relations_handler .get_bundled_aggregations (
668712                [event ], requester .user .to_string ()
0 commit comments