@@ -114,15 +114,19 @@ async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
114114 else :
115115 raise e
116116
117- await self .auth_handler .validate_user_via_ui_auth (
118- requester ,
119- request ,
120- body .dict (exclude_unset = True ),
121- "remove device(s) from your account" ,
122- # Users might call this multiple times in a row while cleaning up
123- # devices, allow a single UI auth session to be re-used.
124- can_skip_ui_auth = True ,
125- )
117+ if requester .app_service and requester .app_service .msc4190_device_management :
118+ # MSC4190 can skip UIA for this endpoint
119+ pass
120+ else :
121+ await self .auth_handler .validate_user_via_ui_auth (
122+ requester ,
123+ request ,
124+ body .dict (exclude_unset = True ),
125+ "remove device(s) from your account" ,
126+ # Users might call this multiple times in a row while cleaning up
127+ # devices, allow a single UI auth session to be re-used.
128+ can_skip_ui_auth = True ,
129+ )
126130
127131 await self .device_handler .delete_devices (
128132 requester .user .to_string (), body .devices
@@ -175,9 +179,6 @@ class DeleteBody(RequestBodyModel):
175179 async def on_DELETE (
176180 self , request : SynapseRequest , device_id : str
177181 ) -> Tuple [int , JsonDict ]:
178- if self ._msc3861_oauth_delegation_enabled :
179- raise UnrecognizedRequestError (code = 404 )
180-
181182 requester = await self .auth .get_user_by_req (request )
182183
183184 try :
@@ -192,15 +193,24 @@ async def on_DELETE(
192193 else :
193194 raise
194195
195- await self .auth_handler .validate_user_via_ui_auth (
196- requester ,
197- request ,
198- body .dict (exclude_unset = True ),
199- "remove a device from your account" ,
200- # Users might call this multiple times in a row while cleaning up
201- # devices, allow a single UI auth session to be re-used.
202- can_skip_ui_auth = True ,
203- )
196+ if requester .app_service and requester .app_service .msc4190_device_management :
197+ # MSC4190 allows appservices to delete devices through this endpoint without UIA
198+ # It's also allowed with MSC3861 enabled
199+ pass
200+
201+ else :
202+ if self ._msc3861_oauth_delegation_enabled :
203+ raise UnrecognizedRequestError (code = 404 )
204+
205+ await self .auth_handler .validate_user_via_ui_auth (
206+ requester ,
207+ request ,
208+ body .dict (exclude_unset = True ),
209+ "remove a device from your account" ,
210+ # Users might call this multiple times in a row while cleaning up
211+ # devices, allow a single UI auth session to be re-used.
212+ can_skip_ui_auth = True ,
213+ )
204214
205215 await self .device_handler .delete_devices (
206216 requester .user .to_string (), [device_id ]
@@ -216,6 +226,16 @@ async def on_PUT(
216226 requester = await self .auth .get_user_by_req (request , allow_guest = True )
217227
218228 body = parse_and_validate_json_object_from_request (request , self .PutBody )
229+
230+ # MSC4190 allows appservices to create devices through this endpoint
231+ if requester .app_service and requester .app_service .msc4190_device_management :
232+ created = await self .device_handler .upsert_device (
233+ user_id = requester .user .to_string (),
234+ device_id = device_id ,
235+ display_name = body .display_name ,
236+ )
237+ return 201 if created else 200 , {}
238+
219239 await self .device_handler .update_device (
220240 requester .user .to_string (), device_id , body .dict ()
221241 )
0 commit comments