mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-10-30 23:24:42 +00:00 
			
		
		
		
	Can get WebSocket access token
This commit is contained in:
		| @@ -7,14 +7,14 @@ | ||||
|  | ||||
| # Server listening information | ||||
| server-address: 0.0.0.0 | ||||
| server-port: 3001 | ||||
| server-port: 3000 | ||||
|  | ||||
| # Server proxy (none = no proxy) | ||||
| # This value is used to trust upstream proxy | ||||
| proxy: "127.0.0.1" | ||||
|  | ||||
| # If set to true Access-Control-Allow-Origin will be set for https | ||||
| force-https: false | ||||
| force-https: true | ||||
|  | ||||
| # User data storage | ||||
| storage-url: http://devweb.local/comunic/current/user_data/ | ||||
|   | ||||
| @@ -55,4 +55,5 @@ pub mod general_settings_api; | ||||
| pub mod language_settings_api; | ||||
| pub mod security_settings_api; | ||||
| pub mod account_image_settings_api; | ||||
| pub mod res_create_custom_emoji; | ||||
| pub mod res_create_custom_emoji; | ||||
| pub mod res_get_ws_token; | ||||
							
								
								
									
										15
									
								
								src/api_data/res_get_ws_token.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/api_data/res_get_ws_token.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| //! # Get WebSocket token result | ||||
| //! | ||||
| //! @author Pierre Hubert | ||||
| use serde::Serialize; | ||||
|  | ||||
| #[derive(Serialize)] | ||||
| pub struct ResGetWsToken { | ||||
|     token: String, | ||||
| } | ||||
|  | ||||
| impl ResGetWsToken { | ||||
|     pub fn new(token: String) -> Self { | ||||
|         ResGetWsToken { token } | ||||
|     } | ||||
| } | ||||
| @@ -57,6 +57,12 @@ pub mod database_tables_names { | ||||
|     pub const NOTIFICATIONS_TABLE: &str = "comunic_notifications"; | ||||
| } | ||||
|  | ||||
| /// WebSocket access token lifetime, in seconds | ||||
| pub const WS_ACCESS_TOKEN_LIFETIME: u64 = 10; | ||||
|  | ||||
| /// WebSocket access token length | ||||
| pub const WS_ACCESS_TOKEN_LENGTH: usize = 10; | ||||
|  | ||||
| /// Lifetime of limit counter (1 hour) | ||||
| pub const LIMIT_COUNTER_LIFETIME: u64 = 60 * 60; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ pub mod routes; | ||||
| pub mod server; | ||||
|  | ||||
| pub mod server_controller; | ||||
| pub mod user_web_socket_controller; | ||||
| pub mod account_controller; | ||||
| pub mod user_controller; | ||||
| pub mod settings_controller; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| use std::error::Error; | ||||
|  | ||||
| use crate::controllers::{account_controller, calls_controller, comments_controller, conversations_controller, friends_controller, groups_controller, likes_controller, movies_controller, notifications_controller, posts_controller, search_controller, server_controller, settings_controller, surveys_controller, user_controller, virtual_directory_controller, web_app_controller}; | ||||
| use crate::controllers::{account_controller, calls_controller, comments_controller, conversations_controller, friends_controller, groups_controller, likes_controller, movies_controller, notifications_controller, posts_controller, search_controller, server_controller, settings_controller, surveys_controller, user_controller, user_web_socket_controller, virtual_directory_controller, web_app_controller}; | ||||
| use crate::controllers::routes::Method::{GET, POST}; | ||||
| use crate::data::http_request_handler::HttpRequestHandler; | ||||
|  | ||||
| @@ -128,6 +128,9 @@ pub fn get_routes() -> Vec<Route> { | ||||
|         // Server meta routes | ||||
|         Route::get_without_login("/", Box::new(server_controller::main_index)), | ||||
|  | ||||
|         // Main user WebSocket | ||||
|         Route::post("/ws/token", Box::new(user_web_socket_controller::get_token)), | ||||
|  | ||||
|         // Account controller | ||||
|         Route::limited_post_without_login("/account/create", Box::new(account_controller::create), LimitPolicy::SUCCESS(10)), | ||||
|         Route::limited_post_without_login("/account/login", Box::new(account_controller::login_user), LimitPolicy::FAILURE(10)), | ||||
|   | ||||
							
								
								
									
										92
									
								
								src/controllers/user_web_socket_controller.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/controllers/user_web_socket_controller.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| //! # User Web Socket controller | ||||
| //! | ||||
| //! Handles the WebSocket offered to the users | ||||
|  | ||||
| use crate::api_data::res_get_ws_token::ResGetWsToken; | ||||
| use crate::constants::WS_ACCESS_TOKEN_LENGTH; | ||||
| use crate::data::base_request_handler::BaseRequestHandler; | ||||
| use crate::data::error::ResultBoxError; | ||||
| use crate::data::http_request_handler::HttpRequestHandler; | ||||
| use crate::utils::crypt_utils::rand_str; | ||||
| use crate::utils::date_utils::time; | ||||
|  | ||||
| /// WebSocket access tokens list | ||||
| mod ws_tokens_list { | ||||
|     use std::sync::Arc; | ||||
|     use std::sync::Mutex; | ||||
|  | ||||
|     use crate::constants::WS_ACCESS_TOKEN_LIFETIME; | ||||
|     use crate::data::user::UserID; | ||||
|     use crate::utils::date_utils::time; | ||||
|  | ||||
|     #[derive(Debug)] | ||||
|     pub struct WsToken { | ||||
|         pub time: u64, | ||||
|         pub client_id: u32, | ||||
|         pub user_id: UserID, | ||||
|         pub token: String, | ||||
|         pub incognito: bool, | ||||
|     } | ||||
|  | ||||
|     lazy_static! { | ||||
|         static ref WS_TOKENS: Arc<Mutex<Vec<WsToken>>> = { | ||||
|             Arc::new(Mutex::new(Vec::new())) | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /// Get the list of WebSocket tokens | ||||
|     fn get_list() -> Arc<Mutex<Vec<WsToken>>> { | ||||
|         (*WS_TOKENS).clone() | ||||
|     } | ||||
|  | ||||
|     /// Remove old entries from the list | ||||
|     pub fn clean_list() { | ||||
|         let list = get_list(); | ||||
|         let mut list = list.lock().unwrap(); | ||||
|  | ||||
|         while let Some(first) = list.first() { | ||||
|             if first.time < time() - WS_ACCESS_TOKEN_LIFETIME { | ||||
|                 list.remove(0); | ||||
|             } else { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /// Add a new token to the list | ||||
|     pub fn add_token(t: WsToken) { | ||||
|         get_list().lock().unwrap().push(t) | ||||
|     } | ||||
|  | ||||
|     /// Remove a specific access token from the list & return it | ||||
|     pub fn take_access_token(t: String) -> Option<WsToken> { | ||||
|         let list = get_list(); | ||||
|         let mut list = list.lock().unwrap(); | ||||
|         for i in 0..list.len() { | ||||
|             if list[i].token == t { | ||||
|                 return Some(list.remove(i)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         None | ||||
|     } | ||||
| } | ||||
|  | ||||
| /// Get a WebSocket access token | ||||
| pub fn get_token(r: &mut HttpRequestHandler) -> ResultBoxError { | ||||
|     ws_tokens_list::clean_list(); | ||||
|  | ||||
|     let access_token = rand_str(WS_ACCESS_TOKEN_LENGTH); | ||||
|  | ||||
|     let token = ws_tokens_list::WsToken { | ||||
|         user_id: r.user_id()?, | ||||
|         client_id: r.api_client().id, | ||||
|         time: time(), | ||||
|         token: access_token.to_string(), | ||||
|         incognito: r.post_bool_opt("incognito", false), | ||||
|     }; | ||||
|  | ||||
|     ws_tokens_list::add_token(token); | ||||
|  | ||||
|     r.set_response(ResGetWsToken::new(access_token)) | ||||
| } | ||||
| @@ -1,3 +1,10 @@ | ||||
| //! # Comunic Server Library | ||||
| //! | ||||
| //! This library contains all the logic of the Comunic Server. | ||||
|  | ||||
| #[macro_use] | ||||
| extern crate lazy_static; | ||||
|  | ||||
| pub mod data; | ||||
| pub mod helpers; | ||||
| pub mod controllers; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user