@@ -69,6 +69,7 @@ def __init__(self, hs: "HomeServer"):
6969 self .store = hs .get_datastores ().main
7070 self .auth = hs .get_auth ()
7171 self .admin_handler = hs .get_admin_handler ()
72+ self ._msc3866_enabled = hs .config .experimental .msc3866 .enabled
7273
7374 async def on_GET (self , request : SynapseRequest ) -> Tuple [int , JsonDict ]:
7475 await assert_requester_is_admin (self .auth , request )
@@ -95,6 +96,13 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
9596 guests = parse_boolean (request , "guests" , default = True )
9697 deactivated = parse_boolean (request , "deactivated" , default = False )
9798
99+ # If support for MSC3866 is not enabled, apply no filtering based on the
100+ # `approved` column.
101+ if self ._msc3866_enabled :
102+ approved = parse_boolean (request , "approved" , default = True )
103+ else :
104+ approved = True
105+
98106 order_by = parse_string (
99107 request ,
100108 "order_by" ,
@@ -115,8 +123,22 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
115123 direction = parse_string (request , "dir" , default = "f" , allowed_values = ("f" , "b" ))
116124
117125 users , total = await self .store .get_users_paginate (
118- start , limit , user_id , name , guests , deactivated , order_by , direction
126+ start ,
127+ limit ,
128+ user_id ,
129+ name ,
130+ guests ,
131+ deactivated ,
132+ order_by ,
133+ direction ,
134+ approved ,
119135 )
136+
137+ # If support for MSC3866 is not enabled, don't show the approval flag.
138+ if not self ._msc3866_enabled :
139+ for user in users :
140+ del user ["approved" ]
141+
120142 ret = {"users" : users , "total" : total }
121143 if (start + limit ) < total :
122144 ret ["next_token" ] = str (start + len (users ))
@@ -163,6 +185,7 @@ def __init__(self, hs: "HomeServer"):
163185 self .deactivate_account_handler = hs .get_deactivate_account_handler ()
164186 self .registration_handler = hs .get_registration_handler ()
165187 self .pusher_pool = hs .get_pusherpool ()
188+ self ._msc3866_enabled = hs .config .experimental .msc3866 .enabled
166189
167190 async def on_GET (
168191 self , request : SynapseRequest , user_id : str
@@ -239,6 +262,15 @@ async def on_PUT(
239262 HTTPStatus .BAD_REQUEST , "'deactivated' parameter is not of type boolean"
240263 )
241264
265+ approved : Optional [bool ] = None
266+ if "approved" in body and self ._msc3866_enabled :
267+ approved = body ["approved" ]
268+ if not isinstance (approved , bool ):
269+ raise SynapseError (
270+ HTTPStatus .BAD_REQUEST ,
271+ "'approved' parameter is not of type boolean" ,
272+ )
273+
242274 # convert List[Dict[str, str]] into List[Tuple[str, str]]
243275 if external_ids is not None :
244276 new_external_ids = [
@@ -343,6 +375,9 @@ async def on_PUT(
343375 if "user_type" in body :
344376 await self .store .set_user_type (target_user , user_type )
345377
378+ if approved is not None :
379+ await self .store .update_user_approval_status (target_user , approved )
380+
346381 user = await self .admin_handler .get_user (target_user )
347382 assert user is not None
348383
@@ -355,13 +390,18 @@ async def on_PUT(
355390 if password is not None :
356391 password_hash = await self .auth_handler .hash (password )
357392
393+ new_user_approved = True
394+ if self ._msc3866_enabled and approved is not None :
395+ new_user_approved = approved
396+
358397 user_id = await self .registration_handler .register_user (
359398 localpart = target_user .localpart ,
360399 password_hash = password_hash ,
361400 admin = set_admin_to ,
362401 default_display_name = displayname ,
363402 user_type = user_type ,
364403 by_admin = True ,
404+ approved = new_user_approved ,
365405 )
366406
367407 if threepids is not None :
@@ -550,6 +590,7 @@ async def on_POST(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
550590 user_type = user_type ,
551591 default_display_name = displayname ,
552592 by_admin = True ,
593+ approved = True ,
553594 )
554595
555596 result = await register ._create_registration_details (user_id , body )
0 commit comments