diff --git a/Cargo.lock b/Cargo.lock index 1a2126d..5758693 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -815,6 +815,7 @@ dependencies = [ "serde", "serde_json", "sha1", + "tokio 0.2.25", "webpage", "webrtc-sdp", "yaml-rust", diff --git a/Cargo.toml b/Cargo.toml index 10669bd..2708e78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,4 +39,5 @@ mp3-metadata = "0.3.3" mp4 = "0.8.1" zip = "0.5.10" webpage = "1.2.0" -gouth = "0.2.0" \ No newline at end of file +gouth = "0.2.0" +tokio = { version = "0.2" } \ No newline at end of file diff --git a/config.yaml b/config.yaml index e39d109..8827746 100644 --- a/config.yaml +++ b/config.yaml @@ -29,6 +29,9 @@ privacy-policy-url: http://devweb.local/comunic/current/about.php?cgu&privacy # Email where the Comunic staff can be contacted contact-email: contact@communiquons.org +# Password reset URL pattern +password-reset-url: https://devweb.local/comunic/v2/reset_password?token=#{TOKEN} + # Android application download URL play-store-url: https://play.google.com/store/apps/details?id=org.communiquons.comunic android-direct-download-url: https://files.communiquons.org/comunic/mobile/latest-android.php diff --git a/src/data/config.rs b/src/data/config.rs index f787743..eeb67f2 100644 --- a/src/data/config.rs +++ b/src/data/config.rs @@ -43,6 +43,7 @@ pub struct Config { pub terms_url: String, pub privacy_policy_url: String, pub contact_email: String, + pub password_reset_url: String, pub play_store_url: String, pub android_direct_download_url: String, pub proxy: Option, @@ -133,6 +134,7 @@ impl Config { privacy_policy_url: Config::yaml_str(parsed, "privacy-policy-url"), contact_email: Config::yaml_str(parsed, "contact-email"), + password_reset_url: Config::yaml_str(parsed, "password-reset-url"), play_store_url: Config::yaml_str(parsed, "play-store-url"), android_direct_download_url: Config::yaml_str(parsed, "android-direct-download-url"), diff --git a/src/main.rs b/src/main.rs index aad276a..858d22d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,23 @@ +use std::future::Future; + use comunic_server::{cleanup_thread, server}; use comunic_server::data::config::{conf, Config}; use comunic_server::helpers::database; +type MainActionFunction = Box>>; + +struct Action { + name: String, + description: String, + arguments: Vec, + function: Box MainActionFunction>, +} + #[actix_rt::main] async fn main() -> std::io::Result<()> { - let conf_file = match std::env::args().skip(1).next() { - Some(el) => el, + let args: Vec = std::env::args().collect(); + let conf_file = match args.get(1) { + Some(el) => el.to_string(), None => "config.yaml".to_string(), }; @@ -15,9 +27,64 @@ async fn main() -> std::io::Result<()> { // Connect to the database database::connect(&conf().database).expect("Could not connect to database!"); - // Start cleanup thread - cleanup_thread::start().expect("Failed to start cleanup thread!"); + // Get selected action + let action = args + .get(2) + .map(|a| a.as_str()) + .unwrap_or("serve") + .to_string(); - // Start the server - server::start_server(conf()).await + /* let actions = vec![ + Action { + name: "serve".to_string(), + description: "Start the Comunic Server (default action)".to_string(), + arguments: vec![], + function: Box::new(serve), + } + ]; + + let selected_action = actions + .iter() + .filter(|p|p.name.eq(&action)) + .next(); + + let selected_action = match selected_action { + None => { + eprintln!("Action {} invalid! For more information try 'help'!", action); + std::process::exit(-1); + } + Some(a) => a + }; + + if selected_action.arguments.len() != args.len() - 2 { + eprintln!("Invalid number of arguments!"); + std::process::exit(-2); + } + + let func = (selected_action.function)(); + func.await*/ + serve() } + +/// Start Comunic Server (main action) +fn serve() -> std::io::Result<()> { + let t = std::thread::spawn(|| { + let sys = actix::System::new("sys"); + + let promise = async { + // Start cleanup thread + cleanup_thread::start().expect("Failed to start cleanup thread!"); + + // Start the server + server::start_server(conf()).await + }; + + tokio::runtime::Runtime::new().unwrap().block_on(promise) + .expect("Failed to start server!"); + + let _ = sys.run(); + }); + + t.join().unwrap(); + Ok(()) +} \ No newline at end of file