X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=src%2Fmain.rs;h=c5a7dc1cae7c9e3a6fb3e520fd00855794d1ec42;hb=a2d9b44b27798e2c8a759b2b78d64fc3c6fd9910;hp=a64950dc5e2237e189241c64d2fe0e8901b6bf2a;hpb=c8ff7a48a92d1de8957ef1150296aa4648f3b3af;p=rup.git diff --git a/src/main.rs b/src/main.rs index a64950d..c5a7dc1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,21 @@ extern crate actix_web; +extern crate listenfd; extern crate askama; +use listenfd::ListenFd; use actix_files as fs; use actix_web::{web, middleware, App, HttpServer, HttpResponse, Responder, Result, web::Query}; use askama::Template; -use serde::{Deserialize}; + +use std::io::prelude::*; +use ron::de::from_reader; +use serde::Deserialize; +use std::{fs::File, env::args}; + +use itertools::Itertools; + +mod consts; +mod crypto; #[derive(Template)] #[template(path = "main.html")] @@ -17,30 +28,108 @@ pub struct Request { m: Option } +static DEFAULT_MESSAGE: &str = "Marc, roule un pet'!"; +static KEY: &str = "secret"; + fn main_page(query: Query) -> Result { let m = match &query.m { - Some(b) => &b, - None => "Marc, roule un pet'!" + Some(b) => + match crypto::decrypt(KEY, b) { + Some(m) => m, + None => String::from(DEFAULT_MESSAGE) + }, + None => String::from(DEFAULT_MESSAGE) }; - let hello = MainTemplate { sentence: m }; + let hello = MainTemplate { sentence: &m }; let s = hello.render().unwrap(); Ok(HttpResponse::Ok().content_type("text/html").body(s)) } +#[derive(Debug, Deserialize)] +struct Config { + port: u16 +} + +fn get_exe_name() -> String { + let first_arg = std::env::args().nth(0).unwrap(); + //dbg!(&first_arg); + let sep: &[_] = &['\\', '/']; + first_arg[first_arg.rfind(sep).unwrap()+1..].to_string() +} + +fn print_usage() { + println!("Usage:"); + println!(" {} [--help] [--encrypt ]", get_exe_name()); +} + +fn read_key() -> String { + use url::percent_encoding::percent_decode; + let mut key = String::new(); + File::open(consts::FILE_KEY) + .expect(&format!("Failed to open key file: {}", consts::FILE_KEY)) + .read_to_string(&mut key) + .expect(&format!("Failed to read key file: {}", consts::FILE_KEY)); + + String::from( + percent_decode(key.as_bytes()) + .decode_utf8() + .expect(&format!("Failed to decode key file: {}", consts::FILE_KEY)) + ) +} + fn main() -> std::io::Result<()> { - HttpServer::new( - || { - App::new() - .wrap(middleware::Compress::default()) - .wrap(middleware::Logger::default()) - .service(web::resource("/").to(main_page)) - .service(fs::Files::new("/static", "static").show_files_listing()) + let args: Vec = args().collect(); + + let key = read_key(); + + if args.iter().any(|arg| arg == "--help") { + print_usage(); + return Ok(()); + } else if let Some((position_arg_encrypt, _)) = args.iter().find_position(|arg| arg == &"--encrypt") { + match args.iter().nth(position_arg_encrypt + 1) { + Some(mess_to_encrypt) => { + let encrypted_mess = crypto::encrypt(&key, mess_to_encrypt); + println!("Encrypted message: {}", encrypted_mess); + } + None => print_usage() } - ) - .bind("0.0.0.0:8082") - .expect("Can not bind to port 8082") - .run() + + return Ok(()); + } + + println!("Starting RUP as web server..."); + + let config: Config = { + let f = File::open(consts::FILE_CONF).expect(&format!("Failed to open configuration file {}", consts::FILE_CONF)); + match from_reader(f) { + Ok(c) => c, + Err(e) => panic!("Failed to load config: {}", e) + } + }; + + println!("Configuration: {:?}", config); + + let mut listenfd = ListenFd::from_env(); + let mut server = + HttpServer::new( + || { + App::new() + .wrap(middleware::Compress::default()) + .wrap(middleware::Logger::default()) + .service(web::resource("/").to(main_page)) + .service(fs::Files::new("/static", "static").show_files_listing()) + } + ); + + server = + if let Some(l) = listenfd.take_tcp_listener(0).unwrap() { + server.listen(l).unwrap() + } else { + server.bind(&format!("0.0.0.0:{}", config.port)).unwrap() + }; + + server.run() }