mirror of
https://gitlab.com/comunic/comunicapiv3
synced 2024-11-22 21:39:21 +00:00
Automatically clean old access tokens
This commit is contained in:
parent
17db8a7198
commit
adefbed4f7
42
src/cleanup_thread.rs
Normal file
42
src/cleanup_thread.rs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//! # Cleanup thread
|
||||||
|
//!
|
||||||
|
//! This module manage a thread that automatically delete old data
|
||||||
|
//!
|
||||||
|
//! @author Pierre Hubert
|
||||||
|
|
||||||
|
use crate::constants::CLEAN_UP_INTERVAL;
|
||||||
|
use crate::data::error::Res;
|
||||||
|
use crate::helpers::account_helper;
|
||||||
|
|
||||||
|
/// Start the maintenance thread
|
||||||
|
pub fn start() -> Res {
|
||||||
|
std::thread::spawn(clean_up_thread_handler);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Clean up thread handler
|
||||||
|
fn clean_up_thread_handler() {
|
||||||
|
loop {
|
||||||
|
println!("Start clean up operation");
|
||||||
|
match do_clean() {
|
||||||
|
Ok(_) => {
|
||||||
|
println!("Clean thread executed successfully!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("Failed to clean data! {:#?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::thread::sleep(CLEAN_UP_INTERVAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Do the cleanup
|
||||||
|
fn do_clean() -> Res {
|
||||||
|
|
||||||
|
// Clean old login tokens
|
||||||
|
account_helper::clean_up_old_access_tokens()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -111,4 +111,7 @@ pub const SUPPORTED_LANGUAGES: &'static [&'static str] = &["en", "fr"];
|
|||||||
pub const USER_LAST_ACTIVITY_REFRESH: Duration = Duration::from_secs(60);
|
pub const USER_LAST_ACTIVITY_REFRESH: Duration = Duration::from_secs(60);
|
||||||
|
|
||||||
/// Interval at which last activity of an access token should be recorded
|
/// Interval at which last activity of an access token should be recorded
|
||||||
pub const USER_ACCESS_TOKEN_ACTIVITY_REFRESH: Duration = Duration::from_secs(60*60);
|
pub const USER_ACCESS_TOKEN_ACTIVITY_REFRESH: Duration = Duration::from_secs(60 * 60);
|
||||||
|
|
||||||
|
/// Interval between each cleanup operation (every hour)
|
||||||
|
pub const CLEAN_UP_INTERVAL: Duration = Duration::from_secs(60 * 60);
|
@ -13,7 +13,7 @@ use crate::data::security_settings::SecuritySettings;
|
|||||||
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageStatus};
|
use crate::data::user::{AccountImageVisibility, User, UserID, UserPageStatus};
|
||||||
use crate::data::user_token::UserAccessToken;
|
use crate::data::user_token::UserAccessToken;
|
||||||
use crate::helpers::{comments_helper, conversations_helper, custom_emojies_helper, database, events_helper, friends_helper, groups_helper, likes_helper, notifications_helper, posts_helper, survey_helper, user_helper};
|
use crate::helpers::{comments_helper, conversations_helper, custom_emojies_helper, database, events_helper, friends_helper, groups_helper, likes_helper, notifications_helper, posts_helper, survey_helper, user_helper};
|
||||||
use crate::helpers::database::{DeleteQuery, InsertQuery, QueryInfo, UpdateInfo};
|
use crate::helpers::database::{DeleteQuery, InsertQuery, QueryInfo, RowResult, UpdateInfo};
|
||||||
use crate::helpers::events_helper::Event;
|
use crate::helpers::events_helper::Event;
|
||||||
use crate::helpers::likes_helper::LikeType;
|
use crate::helpers::likes_helper::LikeType;
|
||||||
use crate::utils::crypt_utils::{legacy_crypt_pass, rand_str};
|
use crate::utils::crypt_utils::{legacy_crypt_pass, rand_str};
|
||||||
@ -76,16 +76,7 @@ pub fn find_user_by_login_token(token: &str, client: &APIClient) -> ResultBoxErr
|
|||||||
.cond("token", token)
|
.cond("token", token)
|
||||||
.set_custom_where("last_refresh + timeout > ?")
|
.set_custom_where("last_refresh + timeout > ?")
|
||||||
.add_custom_where_argument_u64(time())
|
.add_custom_where_argument_u64(time())
|
||||||
.query_row(|res| {
|
.query_row(db_to_user_access_token)
|
||||||
Ok(UserAccessToken {
|
|
||||||
id: res.get_u64("id")?,
|
|
||||||
client_id: res.get_u64("client_id")?,
|
|
||||||
user_id: res.get_user_id("user_id")?,
|
|
||||||
token: res.get_str("token")?,
|
|
||||||
last_refresh: res.get_u64("last_refresh")?,
|
|
||||||
timeout: res.get_u64("timeout")?,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check out whether an email address exists or not
|
/// Check out whether an email address exists or not
|
||||||
@ -116,6 +107,20 @@ pub fn destroy_login_tokens(access_tokens: &UserAccessToken) -> Res {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clean up old access tokens
|
||||||
|
pub fn clean_up_old_access_tokens() -> Res {
|
||||||
|
let to_delete = QueryInfo::new(USER_ACCESS_TOKENS_TABLE)
|
||||||
|
.set_custom_where("last_refresh + timeout < ?")
|
||||||
|
.add_custom_where_argument_u64(time())
|
||||||
|
.exec(db_to_user_access_token)?;
|
||||||
|
|
||||||
|
for token in to_delete {
|
||||||
|
destroy_login_tokens(&token)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Destroy all login tokens of a user
|
/// Destroy all login tokens of a user
|
||||||
pub fn destroy_all_user_tokens(id: &UserID) -> ResultBoxError {
|
pub fn destroy_all_user_tokens(id: &UserID) -> ResultBoxError {
|
||||||
user_ws_controller::disconnect_user_from_all_sockets(id)?;
|
user_ws_controller::disconnect_user_from_all_sockets(id)?;
|
||||||
@ -379,4 +384,15 @@ fn validate_password(user: &User, password: &str) -> Res<bool> {
|
|||||||
change_password(&user.id, password)?;
|
change_password(&user.id, password)?;
|
||||||
|
|
||||||
Ok(true)
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn db_to_user_access_token(res: &RowResult) -> Res<UserAccessToken> {
|
||||||
|
Ok(UserAccessToken {
|
||||||
|
id: res.get_u64("id")?,
|
||||||
|
client_id: res.get_u64("client_id")?,
|
||||||
|
user_id: res.get_user_id("user_id")?,
|
||||||
|
token: res.get_str("token")?,
|
||||||
|
last_refresh: res.get_u64("last_refresh")?,
|
||||||
|
timeout: res.get_u64("timeout")?,
|
||||||
|
})
|
||||||
}
|
}
|
@ -14,4 +14,5 @@ pub mod utils;
|
|||||||
pub mod constants;
|
pub mod constants;
|
||||||
pub mod server;
|
pub mod server;
|
||||||
pub mod user_ws_routes;
|
pub mod user_ws_routes;
|
||||||
pub mod routes;
|
pub mod routes;
|
||||||
|
pub mod cleanup_thread;
|
@ -1,6 +1,6 @@
|
|||||||
|
use comunic_server::{cleanup_thread, server};
|
||||||
use comunic_server::data::config::{conf, Config};
|
use comunic_server::data::config::{conf, Config};
|
||||||
use comunic_server::helpers::database;
|
use comunic_server::helpers::database;
|
||||||
use comunic_server::server;
|
|
||||||
|
|
||||||
#[actix_rt::main]
|
#[actix_rt::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
@ -15,6 +15,9 @@ async fn main() -> std::io::Result<()> {
|
|||||||
// Connect to the database
|
// Connect to the database
|
||||||
database::connect(&conf().database).expect("Could not connect to database!");
|
database::connect(&conf().database).expect("Could not connect to database!");
|
||||||
|
|
||||||
|
// Start cleanup thread
|
||||||
|
cleanup_thread::start().expect("Failed to start cleanup thread!");
|
||||||
|
|
||||||
// Start the server
|
// Start the server
|
||||||
server::start_server(conf()).await
|
server::start_server(conf()).await
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user