Parcourir la source

Additional constants for EDU types. (#12884)

Instead of hard-coding strings in many places.
Patrick Cloke il y a 2 ans
Parent
commit
c52abc1cfd
35 fichiers modifiés avec 146 ajouts et 96 suppressions
  1. 1 0
      changelog.d/12884.misc
  2. 7 1
      synapse/api/constants.py
  3. 2 2
      synapse/api/filtering.py
  4. 1 1
      synapse/federation/federation_server.py
  5. 4 3
      synapse/federation/sender/per_destination_queue.py
  6. 5 1
      synapse/federation/sender/transaction_manager.py
  7. 5 1
      synapse/federation/transport/server/federation.py
  8. 2 2
      synapse/handlers/appservice.py
  9. 3 2
      synapse/handlers/device.py
  10. 3 3
      synapse/handlers/devicemessage.py
  11. 3 2
      synapse/handlers/e2e_keys.py
  12. 1 1
      synapse/handlers/events.py
  13. 2 2
      synapse/handlers/initial_sync.py
  14. 5 3
      synapse/handlers/presence.py
  15. 3 3
      synapse/handlers/receipts.py
  16. 7 4
      synapse/handlers/typing.py
  17. 2 2
      synapse/notifier.py
  18. 2 2
      synapse/rest/client/sync.py
  19. 3 2
      synapse/storage/databases/main/devices.py
  20. 4 4
      synapse/storage/databases/main/receipts.py
  21. 3 3
      tests/api/test_filtering.py
  22. 1 1
      tests/events/test_presence_router.py
  23. 14 12
      tests/federation/test_federation_sender.py
  24. 3 1
      tests/federation/transport/test_server.py
  25. 2 1
      tests/handlers/test_appservice.py
  26. 16 16
      tests/handlers/test_receipts.py
  27. 23 10
      tests/handlers/test_typing.py
  28. 1 1
      tests/module_api/test_api.py
  29. 2 1
      tests/rest/client/test_events.py
  30. 2 1
      tests/rest/client/test_rooms.py
  31. 3 2
      tests/rest/client/test_sendtodevice.py
  32. 2 2
      tests/rest/client/test_shadow_banned.py
  33. 2 1
      tests/rest/client/test_sync.py
  34. 2 1
      tests/rest/client/test_typing.py
  35. 5 2
      tests/storage/test_devices.py

+ 1 - 0
changelog.d/12884.misc

@@ -0,0 +1 @@
+Use constants for EDU types.

+ 7 - 1
synapse/api/constants.py

@@ -137,7 +137,13 @@ class DeviceKeyAlgorithms:
 
 
 
 
 class EduTypes:
 class EduTypes:
-    Presence: Final = "m.presence"
+    PRESENCE: Final = "m.presence"
+    TYPING: Final = "m.typing"
+    RECEIPT: Final = "m.receipt"
+    DEVICE_LIST_UPDATE: Final = "m.device_list_update"
+    SIGNING_KEY_UPDATE: Final = "m.signing_key_update"
+    UNSTABLE_SIGNING_KEY_UPDATE: Final = "org.matrix.signing_key_update"
+    DIRECT_TO_DEVICE: Final = "m.direct_to_device"
 
 
 
 
 class RejectedReason:
 class RejectedReason:

+ 2 - 2
synapse/api/filtering.py

@@ -33,7 +33,7 @@ from typing import (
 import jsonschema
 import jsonschema
 from jsonschema import FormatChecker
 from jsonschema import FormatChecker
 
 
-from synapse.api.constants import EventContentFields
+from synapse.api.constants import EduTypes, EventContentFields
 from synapse.api.errors import SynapseError
 from synapse.api.errors import SynapseError
 from synapse.api.presence import UserPresenceState
 from synapse.api.presence import UserPresenceState
 from synapse.events import EventBase
 from synapse.events import EventBase
@@ -347,7 +347,7 @@ class Filter:
             user_id = event.user_id
             user_id = event.user_id
             field_matchers = {
             field_matchers = {
                 "senders": lambda v: user_id == v,
                 "senders": lambda v: user_id == v,
-                "types": lambda v: "m.presence" == v,
+                "types": lambda v: EduTypes.PRESENCE == v,
             }
             }
             return self._check_fields(field_matchers)
             return self._check_fields(field_matchers)
         else:
         else:

+ 1 - 1
synapse/federation/federation_server.py

@@ -1353,7 +1353,7 @@ class FederationHandlerRegistry:
         self._edu_type_to_instance[edu_type] = instance_names
         self._edu_type_to_instance[edu_type] = instance_names
 
 
     async def on_edu(self, edu_type: str, origin: str, content: dict) -> None:
     async def on_edu(self, edu_type: str, origin: str, content: dict) -> None:
-        if not self.config.server.use_presence and edu_type == EduTypes.Presence:
+        if not self.config.server.use_presence and edu_type == EduTypes.PRESENCE:
             return
             return
 
 
         # Check if we have a handler on this instance
         # Check if we have a handler on this instance

+ 4 - 3
synapse/federation/sender/per_destination_queue.py

@@ -21,6 +21,7 @@ from typing import TYPE_CHECKING, Dict, Hashable, Iterable, List, Optional, Tupl
 import attr
 import attr
 from prometheus_client import Counter
 from prometheus_client import Counter
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import (
 from synapse.api.errors import (
     FederationDeniedError,
     FederationDeniedError,
     HttpResponseException,
     HttpResponseException,
@@ -542,7 +543,7 @@ class PerDestinationQueue:
         edu = Edu(
         edu = Edu(
             origin=self._server_name,
             origin=self._server_name,
             destination=self._destination,
             destination=self._destination,
-            edu_type="m.receipt",
+            edu_type=EduTypes.RECEIPT,
             content=self._pending_rrs,
             content=self._pending_rrs,
         )
         )
         self._pending_rrs = {}
         self._pending_rrs = {}
@@ -592,7 +593,7 @@ class PerDestinationQueue:
             Edu(
             Edu(
                 origin=self._server_name,
                 origin=self._server_name,
                 destination=self._destination,
                 destination=self._destination,
-                edu_type="m.direct_to_device",
+                edu_type=EduTypes.DIRECT_TO_DEVICE,
                 content=content,
                 content=content,
             )
             )
             for content in contents
             for content in contents
@@ -670,7 +671,7 @@ class _TransactionQueueManager:
                 Edu(
                 Edu(
                     origin=self.queue._server_name,
                     origin=self.queue._server_name,
                     destination=self.queue._destination,
                     destination=self.queue._destination,
-                    edu_type="m.presence",
+                    edu_type=EduTypes.PRESENCE,
                     content={
                     content={
                         "push": [
                         "push": [
                             format_user_presence_state(
                             format_user_presence_state(

+ 5 - 1
synapse/federation/sender/transaction_manager.py

@@ -16,6 +16,7 @@ from typing import TYPE_CHECKING, List
 
 
 from prometheus_client import Gauge
 from prometheus_client import Gauge
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import HttpResponseException
 from synapse.api.errors import HttpResponseException
 from synapse.events import EventBase
 from synapse.events import EventBase
 from synapse.federation.persistence import TransactionActions
 from synapse.federation.persistence import TransactionActions
@@ -126,7 +127,10 @@ class TransactionManager:
                 len(edus),
                 len(edus),
             )
             )
             if issue_8631_logger.isEnabledFor(logging.DEBUG):
             if issue_8631_logger.isEnabledFor(logging.DEBUG):
-                DEVICE_UPDATE_EDUS = {"m.device_list_update", "m.signing_key_update"}
+                DEVICE_UPDATE_EDUS = {
+                    EduTypes.DEVICE_LIST_UPDATE,
+                    EduTypes.SIGNING_KEY_UPDATE,
+                }
                 device_list_updates = [
                 device_list_updates = [
                     edu.content for edu in edus if edu.edu_type in DEVICE_UPDATE_EDUS
                     edu.content for edu in edus if edu.edu_type in DEVICE_UPDATE_EDUS
                 ]
                 ]

+ 5 - 1
synapse/federation/transport/server/federation.py

@@ -27,6 +27,7 @@ from typing import (
 from matrix_common.versionstring import get_distribution_version_string
 from matrix_common.versionstring import get_distribution_version_string
 from typing_extensions import Literal
 from typing_extensions import Literal
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.errors import Codes, SynapseError
 from synapse.api.room_versions import RoomVersions
 from synapse.api.room_versions import RoomVersions
 from synapse.api.urls import FEDERATION_UNSTABLE_PREFIX, FEDERATION_V2_PREFIX
 from synapse.api.urls import FEDERATION_UNSTABLE_PREFIX, FEDERATION_V2_PREFIX
@@ -108,7 +109,10 @@ class FederationSendServlet(BaseFederationServerServlet):
             )
             )
 
 
             if issue_8631_logger.isEnabledFor(logging.DEBUG):
             if issue_8631_logger.isEnabledFor(logging.DEBUG):
-                DEVICE_UPDATE_EDUS = ["m.device_list_update", "m.signing_key_update"]
+                DEVICE_UPDATE_EDUS = [
+                    EduTypes.DEVICE_LIST_UPDATE,
+                    EduTypes.SIGNING_KEY_UPDATE,
+                ]
                 device_list_updates = [
                 device_list_updates = [
                     edu.get("content", {})
                     edu.get("content", {})
                     for edu in transaction_data.get("edus", [])
                     for edu in transaction_data.get("edus", [])

+ 2 - 2
synapse/handlers/appservice.py

@@ -19,7 +19,7 @@ from prometheus_client import Counter
 from twisted.internet import defer
 from twisted.internet import defer
 
 
 import synapse
 import synapse
-from synapse.api.constants import EventTypes
+from synapse.api.constants import EduTypes, EventTypes
 from synapse.appservice import ApplicationService
 from synapse.appservice import ApplicationService
 from synapse.events import EventBase
 from synapse.events import EventBase
 from synapse.handlers.presence import format_user_presence_state
 from synapse.handlers.presence import format_user_presence_state
@@ -503,7 +503,7 @@ class ApplicationServicesHandler:
             time_now = self.clock.time_msec()
             time_now = self.clock.time_msec()
             events.extend(
             events.extend(
                 {
                 {
-                    "type": "m.presence",
+                    "type": EduTypes.PRESENCE,
                     "sender": event.user_id,
                     "sender": event.user_id,
                     "content": format_user_presence_state(
                     "content": format_user_presence_state(
                         event, time_now, include_user_id=False
                         event, time_now, include_user_id=False

+ 3 - 2
synapse/handlers/device.py

@@ -28,7 +28,7 @@ from typing import (
 )
 )
 
 
 from synapse.api import errors
 from synapse.api import errors
-from synapse.api.constants import EventTypes
+from synapse.api.constants import EduTypes, EventTypes
 from synapse.api.errors import (
 from synapse.api.errors import (
     Codes,
     Codes,
     FederationDeniedError,
     FederationDeniedError,
@@ -279,7 +279,8 @@ class DeviceHandler(DeviceWorkerHandler):
         federation_registry = hs.get_federation_registry()
         federation_registry = hs.get_federation_registry()
 
 
         federation_registry.register_edu_handler(
         federation_registry.register_edu_handler(
-            "m.device_list_update", self.device_list_updater.incoming_device_list_update
+            EduTypes.DEVICE_LIST_UPDATE,
+            self.device_list_updater.incoming_device_list_update,
         )
         )
 
 
         hs.get_distributor().observe("user_left_room", self.user_left_room)
         hs.get_distributor().observe("user_left_room", self.user_left_room)

+ 3 - 3
synapse/handlers/devicemessage.py

@@ -15,7 +15,7 @@
 import logging
 import logging
 from typing import TYPE_CHECKING, Any, Dict
 from typing import TYPE_CHECKING, Any, Dict
 
 
-from synapse.api.constants import ToDeviceEventTypes
+from synapse.api.constants import EduTypes, ToDeviceEventTypes
 from synapse.api.errors import SynapseError
 from synapse.api.errors import SynapseError
 from synapse.api.ratelimiting import Ratelimiter
 from synapse.api.ratelimiting import Ratelimiter
 from synapse.logging.context import run_in_background
 from synapse.logging.context import run_in_background
@@ -59,11 +59,11 @@ class DeviceMessageHandler:
         # to the appropriate worker.
         # to the appropriate worker.
         if hs.get_instance_name() in hs.config.worker.writers.to_device:
         if hs.get_instance_name() in hs.config.worker.writers.to_device:
             hs.get_federation_registry().register_edu_handler(
             hs.get_federation_registry().register_edu_handler(
-                "m.direct_to_device", self.on_direct_to_device_edu
+                EduTypes.DIRECT_TO_DEVICE, self.on_direct_to_device_edu
             )
             )
         else:
         else:
             hs.get_federation_registry().register_instances_for_edu(
             hs.get_federation_registry().register_instances_for_edu(
-                "m.direct_to_device",
+                EduTypes.DIRECT_TO_DEVICE,
                 hs.config.worker.writers.to_device,
                 hs.config.worker.writers.to_device,
             )
             )
 
 

+ 3 - 2
synapse/handlers/e2e_keys.py

@@ -25,6 +25,7 @@ from unpaddedbase64 import decode_base64
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import CodeMessageException, Codes, NotFoundError, SynapseError
 from synapse.api.errors import CodeMessageException, Codes, NotFoundError, SynapseError
 from synapse.logging.context import make_deferred_yieldable, run_in_background
 from synapse.logging.context import make_deferred_yieldable, run_in_background
 from synapse.logging.opentracing import log_kv, set_tag, tag_args, trace
 from synapse.logging.opentracing import log_kv, set_tag, tag_args, trace
@@ -66,13 +67,13 @@ class E2eKeysHandler:
             # Only register this edu handler on master as it requires writing
             # Only register this edu handler on master as it requires writing
             # device updates to the db
             # device updates to the db
             federation_registry.register_edu_handler(
             federation_registry.register_edu_handler(
-                "m.signing_key_update",
+                EduTypes.SIGNING_KEY_UPDATE,
                 self._edu_updater.incoming_signing_key_update,
                 self._edu_updater.incoming_signing_key_update,
             )
             )
             # also handle the unstable version
             # also handle the unstable version
             # FIXME: remove this when enough servers have upgraded
             # FIXME: remove this when enough servers have upgraded
             federation_registry.register_edu_handler(
             federation_registry.register_edu_handler(
-                "org.matrix.signing_key_update",
+                EduTypes.UNSTABLE_SIGNING_KEY_UPDATE,
                 self._edu_updater.incoming_signing_key_update,
                 self._edu_updater.incoming_signing_key_update,
             )
             )
 
 

+ 1 - 1
synapse/handlers/events.py

@@ -113,7 +113,7 @@ class EventStreamHandler:
                     states = await presence_handler.get_states(users)
                     states = await presence_handler.get_states(users)
                     to_add.extend(
                     to_add.extend(
                         {
                         {
-                            "type": EduTypes.Presence,
+                            "type": EduTypes.PRESENCE,
                             "content": format_user_presence_state(state, time_now),
                             "content": format_user_presence_state(state, time_now),
                         }
                         }
                         for state in states
                         for state in states

+ 2 - 2
synapse/handlers/initial_sync.py

@@ -274,7 +274,7 @@ class InitialSyncHandler:
             "rooms": rooms_ret,
             "rooms": rooms_ret,
             "presence": [
             "presence": [
                 {
                 {
-                    "type": "m.presence",
+                    "type": EduTypes.PRESENCE,
                     "content": format_user_presence_state(event, now),
                     "content": format_user_presence_state(event, now),
                 }
                 }
                 for event in presence
                 for event in presence
@@ -439,7 +439,7 @@ class InitialSyncHandler:
 
 
             return [
             return [
                 {
                 {
-                    "type": EduTypes.Presence,
+                    "type": EduTypes.PRESENCE,
                     "content": format_user_presence_state(s, time_now),
                     "content": format_user_presence_state(s, time_now),
                 }
                 }
                 for s in states
                 for s in states

+ 5 - 3
synapse/handlers/presence.py

@@ -49,7 +49,7 @@ from prometheus_client import Counter
 from typing_extensions import ContextManager
 from typing_extensions import ContextManager
 
 
 import synapse.metrics
 import synapse.metrics
-from synapse.api.constants import EventTypes, Membership, PresenceState
+from synapse.api.constants import EduTypes, EventTypes, Membership, PresenceState
 from synapse.api.errors import SynapseError
 from synapse.api.errors import SynapseError
 from synapse.api.presence import UserPresenceState
 from synapse.api.presence import UserPresenceState
 from synapse.appservice import ApplicationService
 from synapse.appservice import ApplicationService
@@ -394,7 +394,7 @@ class WorkerPresenceHandler(BasePresenceHandler):
 
 
         # Route presence EDUs to the right worker
         # Route presence EDUs to the right worker
         hs.get_federation_registry().register_instances_for_edu(
         hs.get_federation_registry().register_instances_for_edu(
-            "m.presence",
+            EduTypes.PRESENCE,
             hs.config.worker.writers.presence,
             hs.config.worker.writers.presence,
         )
         )
 
 
@@ -649,7 +649,9 @@ class PresenceHandler(BasePresenceHandler):
 
 
         federation_registry = hs.get_federation_registry()
         federation_registry = hs.get_federation_registry()
 
 
-        federation_registry.register_edu_handler("m.presence", self.incoming_presence)
+        federation_registry.register_edu_handler(
+            EduTypes.PRESENCE, self.incoming_presence
+        )
 
 
         LaterGauge(
         LaterGauge(
             "synapse_handlers_presence_user_to_current_state_size",
             "synapse_handlers_presence_user_to_current_state_size",

+ 3 - 3
synapse/handlers/receipts.py

@@ -14,7 +14,7 @@
 import logging
 import logging
 from typing import TYPE_CHECKING, Iterable, List, Optional, Tuple
 from typing import TYPE_CHECKING, Iterable, List, Optional, Tuple
 
 
-from synapse.api.constants import ReceiptTypes
+from synapse.api.constants import EduTypes, ReceiptTypes
 from synapse.appservice import ApplicationService
 from synapse.appservice import ApplicationService
 from synapse.streams import EventSource
 from synapse.streams import EventSource
 from synapse.types import (
 from synapse.types import (
@@ -52,11 +52,11 @@ class ReceiptsHandler:
         # to the appropriate worker.
         # to the appropriate worker.
         if hs.get_instance_name() in hs.config.worker.writers.receipts:
         if hs.get_instance_name() in hs.config.worker.writers.receipts:
             hs.get_federation_registry().register_edu_handler(
             hs.get_federation_registry().register_edu_handler(
-                "m.receipt", self._received_remote_receipt
+                EduTypes.RECEIPT, self._received_remote_receipt
             )
             )
         else:
         else:
             hs.get_federation_registry().register_instances_for_edu(
             hs.get_federation_registry().register_instances_for_edu(
-                "m.receipt",
+                EduTypes.RECEIPT,
                 hs.config.worker.writers.receipts,
                 hs.config.worker.writers.receipts,
             )
             )
 
 

+ 7 - 4
synapse/handlers/typing.py

@@ -17,6 +17,7 @@ from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Set, Tuple
 
 
 import attr
 import attr
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import AuthError, ShadowBanError, SynapseError
 from synapse.api.errors import AuthError, ShadowBanError, SynapseError
 from synapse.appservice import ApplicationService
 from synapse.appservice import ApplicationService
 from synapse.metrics.background_process_metrics import (
 from synapse.metrics.background_process_metrics import (
@@ -68,7 +69,7 @@ class FollowerTypingHandler:
 
 
         if hs.get_instance_name() not in hs.config.worker.writers.typing:
         if hs.get_instance_name() not in hs.config.worker.writers.typing:
             hs.get_federation_registry().register_instances_for_edu(
             hs.get_federation_registry().register_instances_for_edu(
-                "m.typing",
+                EduTypes.TYPING,
                 hs.config.worker.writers.typing,
                 hs.config.worker.writers.typing,
             )
             )
 
 
@@ -143,7 +144,7 @@ class FollowerTypingHandler:
                     logger.debug("sending typing update to %s", domain)
                     logger.debug("sending typing update to %s", domain)
                     self.federation.build_and_send_edu(
                     self.federation.build_and_send_edu(
                         destination=domain,
                         destination=domain,
-                        edu_type="m.typing",
+                        edu_type=EduTypes.TYPING,
                         content={
                         content={
                             "room_id": member.room_id,
                             "room_id": member.room_id,
                             "user_id": member.user_id,
                             "user_id": member.user_id,
@@ -218,7 +219,9 @@ class TypingWriterHandler(FollowerTypingHandler):
 
 
         self.hs = hs
         self.hs = hs
 
 
-        hs.get_federation_registry().register_edu_handler("m.typing", self._recv_edu)
+        hs.get_federation_registry().register_edu_handler(
+            EduTypes.TYPING, self._recv_edu
+        )
 
 
         hs.get_distributor().observe("user_left_room", self.user_left_room)
         hs.get_distributor().observe("user_left_room", self.user_left_room)
 
 
@@ -458,7 +461,7 @@ class TypingNotificationEventSource(EventSource[int, JsonDict]):
     def _make_event_for(self, room_id: str) -> JsonDict:
     def _make_event_for(self, room_id: str) -> JsonDict:
         typing = self.get_typing_handler()._room_typing[room_id]
         typing = self.get_typing_handler()._room_typing[room_id]
         return {
         return {
-            "type": "m.typing",
+            "type": EduTypes.TYPING,
             "room_id": room_id,
             "room_id": room_id,
             "content": {"user_ids": list(typing)},
             "content": {"user_ids": list(typing)},
         }
         }

+ 2 - 2
synapse/notifier.py

@@ -33,7 +33,7 @@ from prometheus_client import Counter
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 
 
-from synapse.api.constants import EventTypes, HistoryVisibility, Membership
+from synapse.api.constants import EduTypes, EventTypes, HistoryVisibility, Membership
 from synapse.api.errors import AuthError
 from synapse.api.errors import AuthError
 from synapse.events import EventBase
 from synapse.events import EventBase
 from synapse.handlers.presence import format_user_presence_state
 from synapse.handlers.presence import format_user_presence_state
@@ -632,7 +632,7 @@ class Notifier:
                     now = self.clock.time_msec()
                     now = self.clock.time_msec()
                     new_events[:] = [
                     new_events[:] = [
                         {
                         {
-                            "type": "m.presence",
+                            "type": EduTypes.PRESENCE,
                             "content": format_user_presence_state(event, now),
                             "content": format_user_presence_state(event, now),
                         }
                         }
                         for event in new_events
                         for event in new_events

+ 2 - 2
synapse/rest/client/sync.py

@@ -16,7 +16,7 @@ import logging
 from collections import defaultdict
 from collections import defaultdict
 from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
 from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
 
 
-from synapse.api.constants import Membership, PresenceState
+from synapse.api.constants import EduTypes, Membership, PresenceState
 from synapse.api.errors import Codes, StoreError, SynapseError
 from synapse.api.errors import Codes, StoreError, SynapseError
 from synapse.api.filtering import FilterCollection
 from synapse.api.filtering import FilterCollection
 from synapse.api.presence import UserPresenceState
 from synapse.api.presence import UserPresenceState
@@ -305,7 +305,7 @@ class SyncRestServlet(RestServlet):
         return {
         return {
             "events": [
             "events": [
                 {
                 {
-                    "type": "m.presence",
+                    "type": EduTypes.PRESENCE,
                     "sender": event.user_id,
                     "sender": event.user_id,
                     "content": format_user_presence_state(
                     "content": format_user_presence_state(
                         event, time_now, include_user_id=False
                         event, time_now, include_user_id=False

+ 3 - 2
synapse/storage/databases/main/devices.py

@@ -28,6 +28,7 @@ from typing import (
     cast,
     cast,
 )
 )
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import Codes, StoreError
 from synapse.api.errors import Codes, StoreError
 from synapse.logging.opentracing import (
 from synapse.logging.opentracing import (
     get_active_span_text_map,
     get_active_span_text_map,
@@ -419,7 +420,7 @@ class DeviceWorkerStore(SQLBaseStore):
         # Add the updated cross-signing keys to the results list
         # Add the updated cross-signing keys to the results list
         for user_id, result in cross_signing_keys_by_user.items():
         for user_id, result in cross_signing_keys_by_user.items():
             result["user_id"] = user_id
             result["user_id"] = user_id
-            results.append(("m.signing_key_update", result))
+            results.append((EduTypes.SIGNING_KEY_UPDATE, result))
             # also send the unstable version
             # also send the unstable version
             # FIXME: remove this when enough servers have upgraded
             # FIXME: remove this when enough servers have upgraded
             #        and remove the length budgeting above.
             #        and remove the length budgeting above.
@@ -545,7 +546,7 @@ class DeviceWorkerStore(SQLBaseStore):
                 else:
                 else:
                     result["deleted"] = True
                     result["deleted"] = True
 
 
-                results.append(("m.device_list_update", result))
+                results.append((EduTypes.DEVICE_LIST_UPDATE, result))
 
 
         return results
         return results
 
 

+ 4 - 4
synapse/storage/databases/main/receipts.py

@@ -26,7 +26,7 @@ from typing import (
     cast,
     cast,
 )
 )
 
 
-from synapse.api.constants import ReceiptTypes
+from synapse.api.constants import EduTypes, ReceiptTypes
 from synapse.replication.slave.storage._slaved_id_tracker import SlavedIdTracker
 from synapse.replication.slave.storage._slaved_id_tracker import SlavedIdTracker
 from synapse.replication.tcp.streams import ReceiptsStream
 from synapse.replication.tcp.streams import ReceiptsStream
 from synapse.storage._base import SQLBaseStore, db_to_json, make_in_list_sql_clause
 from synapse.storage._base import SQLBaseStore, db_to_json, make_in_list_sql_clause
@@ -363,7 +363,7 @@ class ReceiptsWorkerStore(SQLBaseStore):
                 row["user_id"]
                 row["user_id"]
             ] = db_to_json(row["data"])
             ] = db_to_json(row["data"])
 
 
-        return [{"type": "m.receipt", "room_id": room_id, "content": content}]
+        return [{"type": EduTypes.RECEIPT, "room_id": room_id, "content": content}]
 
 
     @cachedList(
     @cachedList(
         cached_method_name="_get_linearized_receipts_for_room",
         cached_method_name="_get_linearized_receipts_for_room",
@@ -411,7 +411,7 @@ class ReceiptsWorkerStore(SQLBaseStore):
             # receipts by room, event and type.
             # receipts by room, event and type.
             room_event = results.setdefault(
             room_event = results.setdefault(
                 row["room_id"],
                 row["room_id"],
-                {"type": "m.receipt", "room_id": row["room_id"], "content": {}},
+                {"type": EduTypes.RECEIPT, "room_id": row["room_id"], "content": {}},
             )
             )
 
 
             # The content is of the form:
             # The content is of the form:
@@ -476,7 +476,7 @@ class ReceiptsWorkerStore(SQLBaseStore):
             # receipts by room, event and type.
             # receipts by room, event and type.
             room_event = results.setdefault(
             room_event = results.setdefault(
                 row["room_id"],
                 row["room_id"],
-                {"type": "m.receipt", "room_id": row["room_id"], "content": {}},
+                {"type": EduTypes.RECEIPT, "room_id": row["room_id"], "content": {}},
             )
             )
 
 
             # The content is of the form:
             # The content is of the form:

+ 3 - 3
tests/api/test_filtering.py

@@ -20,7 +20,7 @@ from unittest.mock import patch
 import jsonschema
 import jsonschema
 from frozendict import frozendict
 from frozendict import frozendict
 
 
-from synapse.api.constants import EventContentFields
+from synapse.api.constants import EduTypes, EventContentFields
 from synapse.api.errors import SynapseError
 from synapse.api.errors import SynapseError
 from synapse.api.filtering import Filter
 from synapse.api.filtering import Filter
 from synapse.events import make_event_from_dict
 from synapse.events import make_event_from_dict
@@ -85,13 +85,13 @@ class FilteringTestCase(unittest.HomeserverTestCase):
                         "org.matrix.not_labels": ["#work"],
                         "org.matrix.not_labels": ["#work"],
                     },
                     },
                     "ephemeral": {
                     "ephemeral": {
-                        "types": ["m.receipt", "m.typing"],
+                        "types": [EduTypes.RECEIPT, EduTypes.TYPING],
                         "not_rooms": ["!726s6s6q:example.com"],
                         "not_rooms": ["!726s6s6q:example.com"],
                         "not_senders": ["@spam:example.com"],
                         "not_senders": ["@spam:example.com"],
                     },
                     },
                 },
                 },
                 "presence": {
                 "presence": {
-                    "types": ["m.presence"],
+                    "types": [EduTypes.PRESENCE],
                     "not_senders": ["@alice:example.com"],
                     "not_senders": ["@alice:example.com"],
                 },
                 },
                 "event_format": "client",
                 "event_format": "client",

+ 1 - 1
tests/events/test_presence_router.py

@@ -439,7 +439,7 @@ class PresenceRouterTestCase(FederatingHomeserverTestCase):
 
 
             for edu in edus:
             for edu in edus:
                 # Make sure we're only checking presence-type EDUs
                 # Make sure we're only checking presence-type EDUs
-                if edu["edu_type"] != EduTypes.Presence:
+                if edu["edu_type"] != EduTypes.PRESENCE:
                     continue
                     continue
 
 
                 # EDUs can contain multiple presence updates
                 # EDUs can contain multiple presence updates

+ 14 - 12
tests/federation/test_federation_sender.py

@@ -19,7 +19,7 @@ from signedjson.types import BaseKey, SigningKey
 
 
 from twisted.internet import defer
 from twisted.internet import defer
 
 
-from synapse.api.constants import RoomEncryptionAlgorithms
+from synapse.api.constants import EduTypes, RoomEncryptionAlgorithms
 from synapse.rest import admin
 from synapse.rest import admin
 from synapse.rest.client import login
 from synapse.rest.client import login
 from synapse.types import JsonDict, ReadReceipt
 from synapse.types import JsonDict, ReadReceipt
@@ -63,7 +63,7 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
             data["edus"],
             data["edus"],
             [
             [
                 {
                 {
-                    "edu_type": "m.receipt",
+                    "edu_type": EduTypes.RECEIPT,
                     "content": {
                     "content": {
                         "room_id": {
                         "room_id": {
                             "m.read": {
                             "m.read": {
@@ -103,7 +103,7 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
             data["edus"],
             data["edus"],
             [
             [
                 {
                 {
-                    "edu_type": "m.receipt",
+                    "edu_type": EduTypes.RECEIPT,
                     "content": {
                     "content": {
                         "room_id": {
                         "room_id": {
                             "m.read": {
                             "m.read": {
@@ -138,7 +138,7 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
             data["edus"],
             data["edus"],
             [
             [
                 {
                 {
-                    "edu_type": "m.receipt",
+                    "edu_type": EduTypes.RECEIPT,
                     "content": {
                     "content": {
                         "room_id": {
                         "room_id": {
                             "m.read": {
                             "m.read": {
@@ -322,8 +322,10 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
 
 
         # expect signing key update edu
         # expect signing key update edu
         self.assertEqual(len(self.edus), 2)
         self.assertEqual(len(self.edus), 2)
-        self.assertEqual(self.edus.pop(0)["edu_type"], "m.signing_key_update")
-        self.assertEqual(self.edus.pop(0)["edu_type"], "org.matrix.signing_key_update")
+        self.assertEqual(self.edus.pop(0)["edu_type"], EduTypes.SIGNING_KEY_UPDATE)
+        self.assertEqual(
+            self.edus.pop(0)["edu_type"], EduTypes.UNSTABLE_SIGNING_KEY_UPDATE
+        )
 
 
         # sign the devices
         # sign the devices
         d1_json = build_device_dict(u1, "D1", device1_signing_key)
         d1_json = build_device_dict(u1, "D1", device1_signing_key)
@@ -348,7 +350,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         self.assertEqual(len(self.edus), 2)
         self.assertEqual(len(self.edus), 2)
         stream_id = None  # FIXME: there is a discontinuity in the stream IDs: see #7142
         stream_id = None  # FIXME: there is a discontinuity in the stream IDs: see #7142
         for edu in self.edus:
         for edu in self.edus:
-            self.assertEqual(edu["edu_type"], "m.device_list_update")
+            self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
             c = edu["content"]
             c = edu["content"]
             if stream_id is not None:
             if stream_id is not None:
                 self.assertEqual(c["prev_id"], [stream_id])
                 self.assertEqual(c["prev_id"], [stream_id])
@@ -388,7 +390,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         # expect three edus, in an unknown order
         # expect three edus, in an unknown order
         self.assertEqual(len(self.edus), 3)
         self.assertEqual(len(self.edus), 3)
         for edu in self.edus:
         for edu in self.edus:
-            self.assertEqual(edu["edu_type"], "m.device_list_update")
+            self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
             c = edu["content"]
             c = edu["content"]
             self.assertGreaterEqual(
             self.assertGreaterEqual(
                 c.items(),
                 c.items(),
@@ -435,7 +437,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         self.assertEqual(len(self.edus), 3)
         self.assertEqual(len(self.edus), 3)
         stream_id = None
         stream_id = None
         for edu in self.edus:
         for edu in self.edus:
-            self.assertEqual(edu["edu_type"], "m.device_list_update")
+            self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
             c = edu["content"]
             c = edu["content"]
             self.assertEqual(c["prev_id"], [stream_id] if stream_id is not None else [])
             self.assertEqual(c["prev_id"], [stream_id] if stream_id is not None else [])
             if stream_id is not None:
             if stream_id is not None:
@@ -487,7 +489,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         # there should be a single update for this user.
         # there should be a single update for this user.
         self.assertEqual(len(self.edus), 1)
         self.assertEqual(len(self.edus), 1)
         edu = self.edus.pop(0)
         edu = self.edus.pop(0)
-        self.assertEqual(edu["edu_type"], "m.device_list_update")
+        self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
         c = edu["content"]
         c = edu["content"]
 
 
         # synapse uses an empty prev_id list to indicate "needs a full resync".
         # synapse uses an empty prev_id list to indicate "needs a full resync".
@@ -544,7 +546,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         # ... and we should get a single update for this user.
         # ... and we should get a single update for this user.
         self.assertEqual(len(self.edus), 1)
         self.assertEqual(len(self.edus), 1)
         edu = self.edus.pop(0)
         edu = self.edus.pop(0)
-        self.assertEqual(edu["edu_type"], "m.device_list_update")
+        self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
         c = edu["content"]
         c = edu["content"]
 
 
         # synapse uses an empty prev_id list to indicate "needs a full resync".
         # synapse uses an empty prev_id list to indicate "needs a full resync".
@@ -560,7 +562,7 @@ class FederationSenderDevicesTestCases(HomeserverTestCase):
         """Check that the given EDU is an update for the given device
         """Check that the given EDU is an update for the given device
         Returns the stream_id.
         Returns the stream_id.
         """
         """
-        self.assertEqual(edu["edu_type"], "m.device_list_update")
+        self.assertEqual(edu["edu_type"], EduTypes.DEVICE_LIST_UPDATE)
         content = edu["content"]
         content = edu["content"]
 
 
         expected = {
         expected = {

+ 3 - 1
tests/federation/transport/test_server.py

@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
+from synapse.api.constants import EduTypes
+
 from tests import unittest
 from tests import unittest
 from tests.unittest import DEBUG, override_config
 from tests.unittest import DEBUG, override_config
 
 
@@ -50,7 +52,7 @@ class RoomDirectoryFederationTests(unittest.FederatingHomeserverTestCase):
             "/_matrix/federation/v1/send/txn_id_1234/",
             "/_matrix/federation/v1/send/txn_id_1234/",
             content={
             content={
                 "edus": [
                 "edus": [
-                    {"edu_type": "m.device_list_update", "content": {"foo": "bar"}}
+                    {"edu_type": EduTypes.DEVICE_LIST_UPDATE, "content": {"foo": "bar"}}
                 ],
                 ],
                 "pdus": [],
                 "pdus": [],
             },
             },

+ 2 - 1
tests/handlers/test_appservice.py

@@ -22,6 +22,7 @@ from twisted.test.proto_helpers import MemoryReactor
 
 
 import synapse.rest.admin
 import synapse.rest.admin
 import synapse.storage
 import synapse.storage
+from synapse.api.constants import EduTypes
 from synapse.appservice import (
 from synapse.appservice import (
     ApplicationService,
     ApplicationService,
     TransactionOneTimeKeyCounts,
     TransactionOneTimeKeyCounts,
@@ -476,7 +477,7 @@ class ApplicationServicesHandlerSendEventsTestCase(unittest.HomeserverTestCase):
 
 
         # Check that the ephemeral event is a read receipt with the expected structure
         # Check that the ephemeral event is a read receipt with the expected structure
         latest_read_receipt = all_ephemeral_events[-1]
         latest_read_receipt = all_ephemeral_events[-1]
-        self.assertEqual(latest_read_receipt["type"], "m.receipt")
+        self.assertEqual(latest_read_receipt["type"], EduTypes.RECEIPT)
 
 
         event_id = list(latest_read_receipt["content"].keys())[0]
         event_id = list(latest_read_receipt["content"].keys())[0]
         self.assertEqual(
         self.assertEqual(

+ 16 - 16
tests/handlers/test_receipts.py

@@ -15,7 +15,7 @@
 from copy import deepcopy
 from copy import deepcopy
 from typing import List
 from typing import List
 
 
-from synapse.api.constants import ReceiptTypes
+from synapse.api.constants import EduTypes, ReceiptTypes
 from synapse.types import JsonDict
 from synapse.types import JsonDict
 
 
 from tests import unittest
 from tests import unittest
@@ -39,7 +39,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         }
                         }
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
             [],
             [],
@@ -64,7 +64,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
             [
             [
@@ -79,7 +79,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         }
                         }
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
         )
         )
@@ -105,7 +105,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
             [
             [
@@ -120,7 +120,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         }
                         }
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
         )
         )
@@ -140,7 +140,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
             [
             [
@@ -155,7 +155,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
         )
         )
@@ -174,7 +174,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 },
                 },
                 {
                 {
                     "content": {
                     "content": {
@@ -187,7 +187,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 },
                 },
             ],
             ],
             [
             [
@@ -202,7 +202,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         }
                         }
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
         )
         )
@@ -224,7 +224,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 },
                 },
             ],
             ],
             [
             [
@@ -237,7 +237,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 },
                 },
             ],
             ],
         )
         )
@@ -266,7 +266,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         },
                         },
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
             [
             [
@@ -291,7 +291,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                         }
                         }
                     },
                     },
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                     "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                    "type": "m.receipt",
+                    "type": EduTypes.RECEIPT,
                 }
                 }
             ],
             ],
         )
         )
@@ -310,7 +310,7 @@ class ReceiptsTestCase(unittest.HomeserverTestCase):
                     }
                     }
                 },
                 },
                 "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
                 "room_id": "!jEsUZKDJdhlrceRyVU:example.org",
-                "type": "m.receipt",
+                "type": EduTypes.RECEIPT,
             }
             }
         ]
         ]
         original_events = deepcopy(events)
         original_events = deepcopy(events)

+ 23 - 10
tests/handlers/test_typing.py

@@ -21,6 +21,7 @@ from twisted.internet import defer
 from twisted.test.proto_helpers import MemoryReactor
 from twisted.test.proto_helpers import MemoryReactor
 from twisted.web.resource import Resource
 from twisted.web.resource import Resource
 
 
+from synapse.api.constants import EduTypes
 from synapse.api.errors import AuthError
 from synapse.api.errors import AuthError
 from synapse.federation.transport.server import TransportLayerServer
 from synapse.federation.transport.server import TransportLayerServer
 from synapse.server import HomeServer
 from synapse.server import HomeServer
@@ -184,7 +185,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "content": {"user_ids": [U_APPLE.to_string()]},
                     "content": {"user_ids": [U_APPLE.to_string()]},
                 }
                 }
@@ -209,7 +210,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             "farm",
             "farm",
             path="/_matrix/federation/v1/send/1000000",
             path="/_matrix/federation/v1/send/1000000",
             data=_expect_edu_transaction(
             data=_expect_edu_transaction(
-                "m.typing",
+                EduTypes.TYPING,
                 content={
                 content={
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "user_id": U_APPLE.to_string(),
                     "user_id": U_APPLE.to_string(),
@@ -231,7 +232,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             "PUT",
             "PUT",
             "/_matrix/federation/v1/send/1000000",
             "/_matrix/federation/v1/send/1000000",
             _make_edu_transaction_json(
             _make_edu_transaction_json(
-                "m.typing",
+                EduTypes.TYPING,
                 content={
                 content={
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "user_id": U_ONION.to_string(),
                     "user_id": U_ONION.to_string(),
@@ -254,7 +255,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "content": {"user_ids": [U_ONION.to_string()]},
                     "content": {"user_ids": [U_ONION.to_string()]},
                 }
                 }
@@ -270,7 +271,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             "PUT",
             "PUT",
             "/_matrix/federation/v1/send/1000000",
             "/_matrix/federation/v1/send/1000000",
             _make_edu_transaction_json(
             _make_edu_transaction_json(
-                "m.typing",
+                EduTypes.TYPING,
                 content={
                 content={
                     "room_id": OTHER_ROOM_ID,
                     "room_id": OTHER_ROOM_ID,
                     "user_id": U_ONION.to_string(),
                     "user_id": U_ONION.to_string(),
@@ -324,7 +325,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             "farm",
             "farm",
             path="/_matrix/federation/v1/send/1000000",
             path="/_matrix/federation/v1/send/1000000",
             data=_expect_edu_transaction(
             data=_expect_edu_transaction(
-                "m.typing",
+                EduTypes.TYPING,
                 content={
                 content={
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "user_id": U_APPLE.to_string(),
                     "user_id": U_APPLE.to_string(),
@@ -345,7 +346,13 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
         )
         )
         self.assertEqual(
         self.assertEqual(
             events[0],
             events[0],
-            [{"type": "m.typing", "room_id": ROOM_ID, "content": {"user_ids": []}}],
+            [
+                {
+                    "type": EduTypes.TYPING,
+                    "room_id": ROOM_ID,
+                    "content": {"user_ids": []},
+                }
+            ],
         )
         )
 
 
     def test_typing_timeout(self) -> None:
     def test_typing_timeout(self) -> None:
@@ -379,7 +386,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "content": {"user_ids": [U_APPLE.to_string()]},
                     "content": {"user_ids": [U_APPLE.to_string()]},
                 }
                 }
@@ -402,7 +409,13 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
         )
         )
         self.assertEqual(
         self.assertEqual(
             events[0],
             events[0],
-            [{"type": "m.typing", "room_id": ROOM_ID, "content": {"user_ids": []}}],
+            [
+                {
+                    "type": EduTypes.TYPING,
+                    "room_id": ROOM_ID,
+                    "content": {"user_ids": []},
+                }
+            ],
         )
         )
 
 
         # SYN-230 - see if we can still set after timeout
         # SYN-230 - see if we can still set after timeout
@@ -433,7 +446,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": ROOM_ID,
                     "room_id": ROOM_ID,
                     "content": {"user_ids": [U_APPLE.to_string()]},
                     "content": {"user_ids": [U_APPLE.to_string()]},
                 }
                 }

+ 1 - 1
tests/module_api/test_api.py

@@ -399,7 +399,7 @@ class ModuleApiTestCase(HomeserverTestCase):
 
 
             for edu in edus:
             for edu in edus:
                 # Make sure we're only checking presence-type EDUs
                 # Make sure we're only checking presence-type EDUs
-                if edu["edu_type"] != EduTypes.Presence:
+                if edu["edu_type"] != EduTypes.PRESENCE:
                     continue
                     continue
 
 
                 # EDUs can contain multiple presence updates
                 # EDUs can contain multiple presence updates

+ 2 - 1
tests/rest/client/test_events.py

@@ -19,6 +19,7 @@ from unittest.mock import Mock
 from twisted.test.proto_helpers import MemoryReactor
 from twisted.test.proto_helpers import MemoryReactor
 
 
 import synapse.rest.admin
 import synapse.rest.admin
+from synapse.api.constants import EduTypes
 from synapse.rest.client import events, login, room
 from synapse.rest.client import events, login, room
 from synapse.server import HomeServer
 from synapse.server import HomeServer
 from synapse.util import Clock
 from synapse.util import Clock
@@ -103,7 +104,7 @@ class EventStreamPermissionsTestCase(unittest.HomeserverTestCase):
                     c
                     c
                     for c in channel.json_body["chunk"]
                     for c in channel.json_body["chunk"]
                     if not (
                     if not (
-                        c.get("type") == "m.presence"
+                        c.get("type") == EduTypes.PRESENCE
                         and c["content"].get("user_id") == self.user_id
                         and c["content"].get("user_id") == self.user_id
                     )
                     )
                 ]
                 ]

+ 2 - 1
tests/rest/client/test_rooms.py

@@ -26,6 +26,7 @@ from twisted.test.proto_helpers import MemoryReactor
 
 
 import synapse.rest.admin
 import synapse.rest.admin
 from synapse.api.constants import (
 from synapse.api.constants import (
+    EduTypes,
     EventContentFields,
     EventContentFields,
     EventTypes,
     EventTypes,
     Membership,
     Membership,
@@ -1412,7 +1413,7 @@ class RoomInitialSyncTestCase(RoomBase):
             e["content"]["user_id"]: e for e in channel.json_body["presence"]
             e["content"]["user_id"]: e for e in channel.json_body["presence"]
         }
         }
         self.assertTrue(self.user_id in presence_by_user)
         self.assertTrue(self.user_id in presence_by_user)
-        self.assertEqual("m.presence", presence_by_user[self.user_id]["type"])
+        self.assertEqual(EduTypes.PRESENCE, presence_by_user[self.user_id]["type"])
 
 
 
 
 class RoomMessageListTestCase(RoomBase):
 class RoomMessageListTestCase(RoomBase):

+ 3 - 2
tests/rest/client/test_sendtodevice.py

@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
+from synapse.api.constants import EduTypes
 from synapse.rest import admin
 from synapse.rest import admin
 from synapse.rest.client import login, sendtodevice, sync
 from synapse.rest.client import login, sendtodevice, sync
 
 
@@ -139,7 +140,7 @@ class SendToDeviceTestCase(HomeserverTestCase):
         for i in range(3):
         for i in range(3):
             self.get_success(
             self.get_success(
                 federation_registry.on_edu(
                 federation_registry.on_edu(
-                    "m.direct_to_device",
+                    EduTypes.DIRECT_TO_DEVICE,
                     "remote_server",
                     "remote_server",
                     {
                     {
                         "sender": "@user:remote_server",
                         "sender": "@user:remote_server",
@@ -172,7 +173,7 @@ class SendToDeviceTestCase(HomeserverTestCase):
         # and we can send more messages
         # and we can send more messages
         self.get_success(
         self.get_success(
             federation_registry.on_edu(
             federation_registry.on_edu(
-                "m.direct_to_device",
+                EduTypes.DIRECT_TO_DEVICE,
                 "remote_server",
                 "remote_server",
                 {
                 {
                     "sender": "@user:remote_server",
                     "sender": "@user:remote_server",

+ 2 - 2
tests/rest/client/test_shadow_banned.py

@@ -17,7 +17,7 @@ from unittest.mock import Mock, patch
 from twisted.test.proto_helpers import MemoryReactor
 from twisted.test.proto_helpers import MemoryReactor
 
 
 import synapse.rest.admin
 import synapse.rest.admin
-from synapse.api.constants import EventTypes
+from synapse.api.constants import EduTypes, EventTypes
 from synapse.rest.client import (
 from synapse.rest.client import (
     directory,
     directory,
     login,
     login,
@@ -226,7 +226,7 @@ class RoomTestCase(_ShadowBannedBase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": room_id,
                     "room_id": room_id,
                     "content": {"user_ids": [self.other_user_id]},
                     "content": {"user_ids": [self.other_user_id]},
                 }
                 }

+ 2 - 1
tests/rest/client/test_sync.py

@@ -22,6 +22,7 @@ from twisted.test.proto_helpers import MemoryReactor
 
 
 import synapse.rest.admin
 import synapse.rest.admin
 from synapse.api.constants import (
 from synapse.api.constants import (
+    EduTypes,
     EventContentFields,
     EventContentFields,
     EventTypes,
     EventTypes,
     ReceiptTypes,
     ReceiptTypes,
@@ -504,7 +505,7 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
 
 
         # Checks if event is a read receipt
         # Checks if event is a read receipt
         def is_read_receipt(event: JsonDict) -> bool:
         def is_read_receipt(event: JsonDict) -> bool:
-            return event["type"] == "m.receipt"
+            return event["type"] == EduTypes.RECEIPT
 
 
         # Sync
         # Sync
         channel = self.make_request(
         channel = self.make_request(

+ 2 - 1
tests/rest/client/test_typing.py

@@ -17,6 +17,7 @@
 
 
 from twisted.test.proto_helpers import MemoryReactor
 from twisted.test.proto_helpers import MemoryReactor
 
 
+from synapse.api.constants import EduTypes
 from synapse.rest.client import room
 from synapse.rest.client import room
 from synapse.server import HomeServer
 from synapse.server import HomeServer
 from synapse.types import UserID
 from synapse.types import UserID
@@ -67,7 +68,7 @@ class RoomTypingTestCase(unittest.HomeserverTestCase):
             events[0],
             events[0],
             [
             [
                 {
                 {
-                    "type": "m.typing",
+                    "type": EduTypes.TYPING,
                     "room_id": self.room_id,
                     "room_id": self.room_id,
                     "content": {"user_ids": [self.user_id]},
                     "content": {"user_ids": [self.user_id]},
                 }
                 }

+ 5 - 2
tests/storage/test_devices.py

@@ -13,6 +13,7 @@
 # limitations under the License.
 # limitations under the License.
 
 
 import synapse.api.errors
 import synapse.api.errors
+from synapse.api.constants import EduTypes
 
 
 from tests.unittest import HomeserverTestCase
 from tests.unittest import HomeserverTestCase
 
 
@@ -266,10 +267,12 @@ class DeviceStoreTestCase(HomeserverTestCase):
         # (This is a temporary arrangement for backwards compatibility!)
         # (This is a temporary arrangement for backwards compatibility!)
         self.assertEqual(len(device_updates), 2, device_updates)
         self.assertEqual(len(device_updates), 2, device_updates)
         self.assertEqual(
         self.assertEqual(
-            device_updates[0][0], "m.signing_key_update", device_updates[0]
+            device_updates[0][0], EduTypes.SIGNING_KEY_UPDATE, device_updates[0]
         )
         )
         self.assertEqual(
         self.assertEqual(
-            device_updates[1][0], "org.matrix.signing_key_update", device_updates[1]
+            device_updates[1][0],
+            EduTypes.UNSTABLE_SIGNING_KEY_UPDATE,
+            device_updates[1],
         )
         )
 
 
         # Check there are no more device updates left.
         # Check there are no more device updates left.