From 70a246355b538c06d58f315d1826ae452edcbdd7 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 6 Nov 2025 21:33:09 +0100 Subject: [PATCH] Can disconnect user from UI --- .../src/controllers/matrix_link_controller.rs | 17 +++++++++- matrixgw_backend/src/main.rs | 4 +++ matrixgw_frontend/src/api/MatrixLinkApi.ts | 10 ++++++ .../src/routes/MatrixLinkRoute.tsx | 33 ++++++++++++++++++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/matrixgw_backend/src/controllers/matrix_link_controller.rs b/matrixgw_backend/src/controllers/matrix_link_controller.rs index 1d769c1..16fe6cf 100644 --- a/matrixgw_backend/src/controllers/matrix_link_controller.rs +++ b/matrixgw_backend/src/controllers/matrix_link_controller.rs @@ -1,7 +1,10 @@ use crate::controllers::HttpResult; +use crate::extractors::auth_extractor::AuthExtractor; use crate::extractors::matrix_client_extractor::MatrixClientExtractor; use crate::matrix_connection::matrix_client::FinishMatrixAuth; -use actix_web::HttpResponse; +use crate::matrix_connection::matrix_manager::MatrixManagerMsg; +use actix_web::{HttpResponse, web}; +use ractor::ActorRef; #[derive(serde::Serialize)] struct StartAuthResponse { @@ -28,3 +31,15 @@ pub async fn finish_auth(client: MatrixClientExtractor) -> HttpResult { } } } + +/// Logout user from Matrix server +pub async fn logout( + auth: AuthExtractor, + manager: web::Data>, +) -> HttpResult { + manager + .cast(MatrixManagerMsg::DisconnectClient(auth.user.email)) + .expect("Failed to communicate with matrix manager!"); + + Ok(HttpResponse::Ok().finish()) +} diff --git a/matrixgw_backend/src/main.rs b/matrixgw_backend/src/main.rs index 7614ee8..a239e35 100644 --- a/matrixgw_backend/src/main.rs +++ b/matrixgw_backend/src/main.rs @@ -102,6 +102,10 @@ async fn main() -> std::io::Result<()> { "/api/matrix_link/finish_auth", web::post().to(matrix_link_controller::finish_auth), ) + .route( + "/api/matrix_link/logout", + web::post().to(matrix_link_controller::logout), + ) }) .workers(4) .bind(&AppConfig::get().listen_address)? diff --git a/matrixgw_frontend/src/api/MatrixLinkApi.ts b/matrixgw_frontend/src/api/MatrixLinkApi.ts index 3796189..d5b3cb7 100644 --- a/matrixgw_frontend/src/api/MatrixLinkApi.ts +++ b/matrixgw_frontend/src/api/MatrixLinkApi.ts @@ -23,4 +23,14 @@ export class MatrixLinkApi { jsonData: { code, state }, }); } + + /** + * Disconnect from Matrix Account + */ + static async Disconnect(): Promise { + await APIClient.exec({ + uri: "/matrix_link/logout", + method: "POST", + }); + } } diff --git a/matrixgw_frontend/src/routes/MatrixLinkRoute.tsx b/matrixgw_frontend/src/routes/MatrixLinkRoute.tsx index 23a3b27..3e9f394 100644 --- a/matrixgw_frontend/src/routes/MatrixLinkRoute.tsx +++ b/matrixgw_frontend/src/routes/MatrixLinkRoute.tsx @@ -9,7 +9,9 @@ import { } from "@mui/material"; import { MatrixLinkApi } from "../api/MatrixLinkApi"; import { useAlert } from "../hooks/contexts_provider/AlertDialogProvider"; +import { useConfirm } from "../hooks/contexts_provider/ConfirmDialogProvider"; import { useLoadingMessage } from "../hooks/contexts_provider/LoadingMessageProvider"; +import { useSnackbar } from "../hooks/contexts_provider/SnackbarProvider"; import { useUserInfo } from "../widgets/dashboard/BaseAuthenticatedPage"; import { MatrixGWRouteContainer } from "../widgets/MatrixGWRouteContainer"; @@ -68,8 +70,32 @@ function ConnectCard(): React.ReactElement { } function ConnectedCard(): React.ReactElement { + const snackbar = useSnackbar(); + const confirm = useConfirm(); + const alert = useAlert(); + const loadingMessage = useLoadingMessage(); + + const info = useUserInfo(); + const user = useUserInfo(); + const handleDisconnect = async () => { + if (!(await confirm("Do you really want to unlink your Matrix account?"))) + return; + + try { + loadingMessage.show("Unlinking Matrix account..."); + await MatrixLinkApi.Disconnect(); + snackbar("Successfully unlinked Matrix account!"); + } catch (e) { + console.error(`Failed to unlink user account! ${e}`); + alert(`Failed to unlink your account! ${e}`); + } finally { + info.reloadUserInfo(); + loadingMessage.hide(); + } + }; + return ( @@ -97,7 +123,12 @@ function ConnectedCard(): React.ReactElement { -