63
63
MutableStateMap ,
64
64
Requester ,
65
65
RoomAlias ,
66
+ StateMap ,
66
67
StreamToken ,
67
68
UserID ,
68
69
create_requester ,
@@ -567,7 +568,6 @@ async def create_event(
567
568
outlier : bool = False ,
568
569
historical : bool = False ,
569
570
depth : Optional [int ] = None ,
570
- for_batch : bool = False ,
571
571
) -> Tuple [EventBase , EventContext ]:
572
572
"""
573
573
Given a dict from a client, create a new event.
@@ -619,8 +619,6 @@ async def create_event(
619
619
depth: Override the depth used to order the event in the DAG.
620
620
Should normally be set to None, which will cause the depth to be calculated
621
621
based on the prev_events.
622
- for_batch: Whether this event is being created for batch sending. Notably events
623
- created for batch sending do not have their event context computed
624
622
625
623
Raises:
626
624
ResourceLimitError if server is blocked to some resource being
@@ -630,49 +628,10 @@ async def create_event(
630
628
"""
631
629
await self .auth_blocking .check_auth_blocking (requester = requester )
632
630
633
- if event_dict ["type" ] == EventTypes .Create and event_dict ["state_key" ] == "" :
634
- room_version_id = event_dict ["content" ]["room_version" ]
635
- maybe_room_version_obj = KNOWN_ROOM_VERSIONS .get (room_version_id )
636
- if not maybe_room_version_obj :
637
- # this can happen if support is withdrawn for a room version
638
- raise UnsupportedRoomVersionError (room_version_id )
639
- room_version_obj = maybe_room_version_obj
640
- else :
641
- try :
642
- room_version_obj = await self .store .get_room_version (
643
- event_dict ["room_id" ]
644
- )
645
- except NotFoundError :
646
- raise AuthError (403 , "Unknown room" )
647
-
648
- builder = self .event_builder_factory .for_room_version (
649
- room_version_obj , event_dict
650
- )
651
-
652
- self .validator .validate_builder (builder )
631
+ builder = await self ._get_and_validate_builder (event_dict )
653
632
654
633
if builder .type == EventTypes .Member :
655
- membership = builder .content .get ("membership" , None )
656
- target = UserID .from_string (builder .state_key )
657
-
658
- if membership in self .membership_types_to_include_profile_data_in :
659
- # If event doesn't include a display name, add one.
660
- profile = self .profile_handler
661
- content = builder .content
662
-
663
- try :
664
- if "displayname" not in content :
665
- displayname = await profile .get_displayname (target )
666
- if displayname is not None :
667
- content ["displayname" ] = displayname
668
- if "avatar_url" not in content :
669
- avatar_url = await profile .get_avatar_url (target )
670
- if avatar_url is not None :
671
- content ["avatar_url" ] = avatar_url
672
- except Exception as e :
673
- logger .info (
674
- "Failed to get profile information for %r: %s" , target , e
675
- )
634
+ await self ._build_profile_data (builder )
676
635
677
636
is_exempt = await self ._is_exempt_from_privacy_policy (builder , requester )
678
637
if require_consent and not is_exempt :
@@ -688,27 +647,15 @@ async def create_event(
688
647
689
648
builder .internal_metadata .historical = historical
690
649
691
- if for_batch :
692
- event = await builder .build (
693
- prev_event_ids = prev_event_ids ,
694
- auth_event_ids = auth_event_ids ,
695
- depth = depth ,
696
- )
697
- # Pass on the outlier property from the builder to the event
698
- # after it is created
699
- if builder .internal_metadata .outlier :
700
- event .internal_metadata .outlier = True
701
-
702
- else :
703
- event , context = await self .create_new_client_event (
704
- builder = builder ,
705
- requester = requester ,
706
- allow_no_prev_events = allow_no_prev_events ,
707
- prev_event_ids = prev_event_ids ,
708
- auth_event_ids = auth_event_ids ,
709
- state_event_ids = state_event_ids ,
710
- depth = depth ,
711
- )
650
+ event , context = await self .create_new_client_event (
651
+ builder = builder ,
652
+ requester = requester ,
653
+ allow_no_prev_events = allow_no_prev_events ,
654
+ prev_event_ids = prev_event_ids ,
655
+ auth_event_ids = auth_event_ids ,
656
+ state_event_ids = state_event_ids ,
657
+ depth = depth ,
658
+ )
712
659
713
660
# In an ideal world we wouldn't need the second part of this condition. However,
714
661
# this behaviour isn't spec'd yet, meaning we should be able to deactivate this
@@ -748,10 +695,127 @@ async def create_event(
748
695
749
696
self .validator .validate_new (event , self .config )
750
697
751
- if for_batch :
752
- return event
698
+ return event , context
699
+
700
+ async def create_event_for_batch (
701
+ self ,
702
+ requester : Requester ,
703
+ event_dict : dict ,
704
+ prev_event_ids : List [str ],
705
+ depth : int ,
706
+ state_map : StateMap ,
707
+ txn_id : Optional [str ] = None ,
708
+ require_consent : bool = True ,
709
+ outlier : bool = False ,
710
+ ) -> EventBase :
711
+ """
712
+ Given a dict from a client, create a new event. Notably does not create an event
713
+ context. Adds display names to Join membership events.
714
+
715
+ Args:
716
+ requester
717
+ event_dict: An entire event
718
+ txn_id
719
+ prev_event_ids:
720
+ the forward extremities to use as the prev_events for the
721
+ new event.
722
+ state_map: a state_map of previously created events for batching. Will be used
723
+ to calculate the auth_ids for the event, as the previously created events for
724
+ batching will not yet have been persisted to the db
725
+ require_consent: Whether to check if the requester has
726
+ consented to the privacy policy.
727
+ outlier: Indicates whether the event is an `outlier`, i.e. if
728
+ it's from an arbitrary point and floating in the DAG as
729
+ opposed to being inline with the current DAG.
730
+ depth: Override the depth used to order the event in the DAG.
731
+
732
+ Returns:
733
+ the created event
734
+ """
735
+ await self .auth_blocking .check_auth_blocking (requester = requester )
736
+
737
+ builder = await self ._get_and_validate_builder (event_dict )
738
+
739
+ if builder .type == EventTypes .Member :
740
+ await self ._build_profile_data (builder )
741
+
742
+ is_exempt = await self ._is_exempt_from_privacy_policy (builder , requester )
743
+ if require_consent and not is_exempt :
744
+ await self .assert_accepted_privacy_policy (requester )
745
+
746
+ if requester .access_token_id is not None :
747
+ builder .internal_metadata .token_id = requester .access_token_id
748
+
749
+ if txn_id is not None :
750
+ builder .internal_metadata .txn_id = txn_id
751
+
752
+ builder .internal_metadata .outlier = outlier
753
+
754
+ auth_ids = self ._event_auth_handler .compute_auth_events (builder , state_map )
755
+ event = await builder .build (
756
+ prev_event_ids = prev_event_ids ,
757
+ auth_event_ids = auth_ids ,
758
+ depth = depth ,
759
+ )
760
+ # Pass on the outlier property from the builder to the event
761
+ # after it is created
762
+ if builder .internal_metadata .outlier :
763
+ event .internal_metadata .outlier = True
764
+
765
+ self .validator .validate_new (event , self .config )
766
+
767
+ return event
768
+
769
+ async def _build_profile_data (self , builder : EventBuilder ) -> None :
770
+ """
771
+ Helper method to add profile information to membership event
772
+ """
773
+ membership = builder .content .get ("membership" , None )
774
+ target = UserID .from_string (builder .state_key )
775
+
776
+ if membership in self .membership_types_to_include_profile_data_in :
777
+ # If event doesn't include a display name, add one.
778
+ profile = self .profile_handler
779
+ content = builder .content
780
+
781
+ try :
782
+ if "displayname" not in content :
783
+ displayname = await profile .get_displayname (target )
784
+ if displayname is not None :
785
+ content ["displayname" ] = displayname
786
+ if "avatar_url" not in content :
787
+ avatar_url = await profile .get_avatar_url (target )
788
+ if avatar_url is not None :
789
+ content ["avatar_url" ] = avatar_url
790
+ except Exception as e :
791
+ logger .info ("Failed to get profile information for %r: %s" , target , e )
792
+
793
+ async def _get_and_validate_builder (self , event_dict : dict ) -> EventBuilder :
794
+ """
795
+ Helper method to create and validate a builder object when creating an event
796
+ """
797
+ if event_dict ["type" ] == EventTypes .Create and event_dict ["state_key" ] == "" :
798
+ room_version_id = event_dict ["content" ]["room_version" ]
799
+ maybe_room_version_obj = KNOWN_ROOM_VERSIONS .get (room_version_id )
800
+ if not maybe_room_version_obj :
801
+ # this can happen if support is withdrawn for a room version
802
+ raise UnsupportedRoomVersionError (room_version_id )
803
+ room_version_obj = maybe_room_version_obj
753
804
else :
754
- return event , context
805
+ try :
806
+ room_version_obj = await self .store .get_room_version (
807
+ event_dict ["room_id" ]
808
+ )
809
+ except NotFoundError :
810
+ raise AuthError (403 , "Unknown room" )
811
+
812
+ builder = self .event_builder_factory .for_room_version (
813
+ room_version_obj , event_dict
814
+ )
815
+
816
+ self .validator .validate_builder (builder )
817
+
818
+ return builder
755
819
756
820
async def _is_exempt_from_privacy_policy (
757
821
self , builder : EventBuilder , requester : Requester
0 commit comments