use actix_web::{cookie::{Key, SameSite}, web, App, HttpServer}; use actix_session::{storage::RedisSessionStore, SessionMiddleware}; use config::Config; use ldap::{pool::LdapConfig, LdapWrapper}; use std::env; mod handler; #[actix_web::main] async fn main() -> std::io::Result<()> { let settings_path = env::var("BIMNG_SETTINGS_PATH") .expect("BIMNG_SETTINGS_PATH env var must be set"); let settings = Config::builder() .add_source(config::File::with_name(settings_path.as_str())) .build() .unwrap(); let bind_addr: String = settings.get("bimng.bindaddr").unwrap(); let bind_port: u16 = settings.get("bimng.bindport").unwrap(); let redis_addr: String = settings.get("bimng.redisaddr").unwrap(); let redis_store = match RedisSessionStore::new(redis_addr).await { Ok(redis_store) => { redis_store } Err(_) => { println!("Failed to connect to redis session store"); std::process::exit(1); } }; let signing_key = Key::generate(); let ldap_config = LdapConfig { hostname: settings.get("ldap.hostname").unwrap(), port: settings.get("ldap.port").unwrap(), basedn: settings.get("ldap.basedn").unwrap(), groupsdn: settings.get("ldap.groupsdn").unwrap(), binddn: settings.get("ldap.binddn").unwrap(), bindpw: settings.get("ldap.bindpw").unwrap(), starttls: settings.get("ldap.starttls").unwrap(), }; let ldap_wrapper = LdapWrapper::new(ldap_config); HttpServer::new(move || { App::new() .wrap( SessionMiddleware::builder(redis_store.clone(), signing_key.clone()) .cookie_same_site(SameSite::Strict) .build() ) .app_data(web::Data::new(ldap_wrapper.clone())) .route("/", web::get().to(handler::index)) .route("/auth", web::post().to(handler::auth)) .route("/home", web::get().to(handler::home)) .route("/signout", web::get().to(handler::signout)) .route("/changepassword", web::get().to(handler::form_password)) .route("/changepassword", web::post().to(handler::change_password)) .route("/ssh", web::get().to(handler::form_ssh)) .route("/addsshkey", web::post().to(handler::add_ssh_key)) .route("/delsshkey", web::post().to(handler::del_ssh_key)) }) .bind((bind_addr, bind_port))? .run() .await }