From a46cc7a78895ced8b9519933c18f0f97f7ed1d3c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 15 Jul 2018 12:38:24 +0300 Subject: [PATCH] Add logout endpoint --- mautrix_telegram/web/provisioning/__init__.py | 20 +++++++++---- mautrix_telegram/web/provisioning/spec.yaml | 30 +++++++++++++++++++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/mautrix_telegram/web/provisioning/__init__.py b/mautrix_telegram/web/provisioning/__init__.py index dc640c93..f853d041 100644 --- a/mautrix_telegram/web/provisioning/__init__.py +++ b/mautrix_telegram/web/provisioning/__init__.py @@ -52,10 +52,11 @@ class ProvisioningAPI(AuthAPI): self.app.router.add_route("GET", f"{user_prefix}", self.get_user_info) self.app.router.add_route("GET", f"{user_prefix}/chats", self.get_chats) - self.app.router.add_route("POST", f"{user_prefix}/send_bot_token", self.send_bot_token) - self.app.router.add_route("POST", f"{user_prefix}/request_code", self.request_code) - self.app.router.add_route("POST", f"{user_prefix}/send_code", self.send_code) - self.app.router.add_route("POST", f"{user_prefix}/send_password", self.send_password) + self.app.router.add_route("POST", f"{user_prefix}/logout", self.logout) + self.app.router.add_route("POST", f"{user_prefix}/login/bot_token", self.send_bot_token) + self.app.router.add_route("POST", f"{user_prefix}/login/request_code", self.request_code) + self.app.router.add_route("POST", f"{user_prefix}/login/send_code", self.send_code) + self.app.router.add_route("POST", f"{user_prefix}/login/send_password", self.send_password) async def get_portal_by_mxid(self, request: web.Request) -> web.Response: mxid = request.match_info["mxid"] @@ -221,6 +222,14 @@ class ProvisioningAPI(AuthAPI): return err return await self.post_login_password(user, data.get("password", "")) + async def logout(self, request: web.Request) -> web.Response: + _, user, err = await self.get_user_request_info(request, expect_logged_in=True, + require_puppeting=False, + want_data=False) + if err is not None: + return err + await user.log_out() + @staticmethod async def error_middleware(_, handler) -> Callable[[web.Request], Awaitable[web.Response]]: async def middleware_handler(request: web.Request) -> web.Response: @@ -297,6 +306,7 @@ class ProvisioningAPI(AuthAPI): async def get_user_request_info(self, request: web.Request, expect_logged_in: Optional[bool] = False, require_puppeting: bool = False, + want_data: bool = True, ) -> (Tuple[Optional[dict], Optional[User], Optional[web.Response]]): @@ -307,7 +317,7 @@ class ProvisioningAPI(AuthAPI): status=401) data = None - if request.method == "POST" or request.method == "PUT": + if want_data and (request.method == "POST" or request.method == "PUT"): data = await self.get_data(request) if not data: return None, None, self.get_login_response(error="Invalid JSON.", diff --git a/mautrix_telegram/web/provisioning/spec.yaml b/mautrix_telegram/web/provisioning/spec.yaml index fdd5a5b9..94457ce4 100644 --- a/mautrix_telegram/web/provisioning/spec.yaml +++ b/mautrix_telegram/web/provisioning/spec.yaml @@ -619,6 +619,36 @@ paths: description: The two-factor auth password format: password example: hunter2 + /user/{user_id}/logout: + post: + operationId: logout + summary: Log out + tags: [Authentication] + responses: + 200: + description: Logout successful + 403: + description: User was not logged in + schema: + type: object + title: Error + properties: + errcode: + type: string + title: Error code + description: A machine-readable error code + enum: + - not_logged_in + error: + $ref: "#/definitions/HumanReadableError" + 500: + $ref: "#/responses/UnknownError" + parameters: + - name: user_id + in: path + description: The Matrix ID of the user who to log out as + required: true + type: string responses: NotWhitelistedError: