mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-26 07:19:22 +00:00
Close user web sockets when signing him out of clients
This commit is contained in:
parent
959a9d8a5e
commit
737ed75b3b
@ -16,13 +16,14 @@ use crate::constants::WS_ACCESS_TOKEN_LENGTH;
|
|||||||
use crate::controllers::user_ws_controller::ws_connections_list::{add_connection, find_connection, get_ws_connections_list, remove_connection};
|
use crate::controllers::user_ws_controller::ws_connections_list::{add_connection, find_connection, get_ws_connections_list, remove_connection};
|
||||||
pub use crate::controllers::user_ws_controller::ws_connections_list::WsConnection;
|
pub use crate::controllers::user_ws_controller::ws_connections_list::WsConnection;
|
||||||
use crate::controllers::user_ws_routes::find_user_ws_route;
|
use crate::controllers::user_ws_routes::find_user_ws_route;
|
||||||
|
use crate::data::api_client::APIClient;
|
||||||
use crate::data::base_request_handler::BaseRequestHandler;
|
use crate::data::base_request_handler::BaseRequestHandler;
|
||||||
use crate::data::config::conf;
|
use crate::data::config::conf;
|
||||||
use crate::data::error::{ExecError, Res, ResultBoxError};
|
use crate::data::error::{ExecError, Res, ResultBoxError};
|
||||||
use crate::data::http_request_handler::HttpRequestHandler;
|
use crate::data::http_request_handler::HttpRequestHandler;
|
||||||
use crate::data::user::UserID;
|
use crate::data::user::UserID;
|
||||||
use crate::data::user_ws_request_handler::{WsRequestHandler, WsResponseType};
|
|
||||||
use crate::data::user_ws_message::UserWsMessage;
|
use crate::data::user_ws_message::UserWsMessage;
|
||||||
|
use crate::data::user_ws_request_handler::{WsRequestHandler, WsResponseType};
|
||||||
use crate::utils::crypt_utils::rand_str;
|
use crate::utils::crypt_utils::rand_str;
|
||||||
use crate::utils::date_utils::time;
|
use crate::utils::date_utils::time;
|
||||||
|
|
||||||
@ -108,6 +109,7 @@ mod ws_connections_list {
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct WsConnection {
|
pub struct WsConnection {
|
||||||
pub user_id: UserID,
|
pub user_id: UserID,
|
||||||
|
pub client_id: u32,
|
||||||
pub remote_ip: String,
|
pub remote_ip: String,
|
||||||
pub session: actix::Addr<WsSession>,
|
pub session: actix::Addr<WsSession>,
|
||||||
}
|
}
|
||||||
@ -276,6 +278,7 @@ impl Actor for WsSession {
|
|||||||
|
|
||||||
add_connection(WsConnection {
|
add_connection(WsConnection {
|
||||||
user_id: self.user_id.clone(),
|
user_id: self.user_id.clone(),
|
||||||
|
client_id: self.client_id,
|
||||||
remote_ip: self.remote_ip.clone(),
|
remote_ip: self.remote_ip.clone(),
|
||||||
session: ctx.address(),
|
session: ctx.address(),
|
||||||
})
|
})
|
||||||
@ -434,7 +437,24 @@ pub fn is_user_connected(user_id: &UserID) -> bool {
|
|||||||
get_ws_connections_list().lock().unwrap().iter().any(|c| &c.user_id == user_id)
|
get_ws_connections_list().lock().unwrap().iter().any(|c| &c.user_id == user_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Disconnect a user from WebSocket
|
/// Disconnect a user from all the WebSockets of a given client
|
||||||
|
pub fn disconnect_user_from_client(user_id: &UserID, client: &APIClient) -> Res {
|
||||||
|
let connections = get_ws_connections_list()
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.filter(|f| &f.user_id == user_id && f.client_id == client.id)
|
||||||
|
.map(|f| f.session.clone())
|
||||||
|
.collect::<Vec<Addr<WsSession>>>();
|
||||||
|
|
||||||
|
for c in connections {
|
||||||
|
c.do_send(WsCloseConnection {});
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Disconnect a user from all its WebSocket
|
||||||
pub fn disconnect_user_from_all_sockets(user_id: &UserID) -> Res {
|
pub fn disconnect_user_from_all_sockets(user_id: &UserID) -> Res {
|
||||||
let connections = get_ws_connections_list()
|
let connections = get_ws_connections_list()
|
||||||
.lock()
|
.lock()
|
||||||
|
@ -107,6 +107,8 @@ pub fn exists_mail(mail: &str) -> ResultBoxError<bool> {
|
|||||||
|
|
||||||
/// Destroy a given user login tokens
|
/// Destroy a given user login tokens
|
||||||
pub fn destroy_login_tokens(id: &UserID, client: &APIClient) -> ResultBoxError<()> {
|
pub fn destroy_login_tokens(id: &UserID, client: &APIClient) -> ResultBoxError<()> {
|
||||||
|
user_ws_controller::disconnect_user_from_client(id, client)?;
|
||||||
|
|
||||||
database::delete(DeleteQuery::new(USER_ACCESS_TOKENS_TABLE)
|
database::delete(DeleteQuery::new(USER_ACCESS_TOKENS_TABLE)
|
||||||
.cond_u32("service_id", client.id)
|
.cond_u32("service_id", client.id)
|
||||||
.cond_user_id("user_id", id)
|
.cond_user_id("user_id", id)
|
||||||
|
Loading…
Reference in New Issue
Block a user