main.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. use actix_web::{cookie::{Key, SameSite}, web, App, HttpServer};
  2. use actix_session::{storage::RedisSessionStore, SessionMiddleware};
  3. use config::Config;
  4. use ldap::{pool::LdapConfig, LdapWrapper};
  5. use std::env;
  6. mod handler;
  7. #[actix_web::main]
  8. async fn main() -> std::io::Result<()> {
  9. let settings_path = env::var("BIMNG_SETTINGS_PATH")
  10. .expect("BIMNG_SETTINGS_PATH env var must be set");
  11. let settings = Config::builder()
  12. .add_source(config::File::with_name(settings_path.as_str()))
  13. .build()
  14. .unwrap();
  15. let bind_addr: String = settings.get("bimng.bindaddr").unwrap();
  16. let bind_port: u16 = settings.get("bimng.bindport").unwrap();
  17. let redis_addr: String = settings.get("bimng.redisaddr").unwrap();
  18. let redis_store = match RedisSessionStore::new(redis_addr).await {
  19. Ok(redis_store) => {
  20. redis_store
  21. }
  22. Err(_) => {
  23. println!("Failed to connect to redis session store");
  24. std::process::exit(1);
  25. }
  26. };
  27. let signing_key = Key::generate();
  28. let ldap_config = LdapConfig {
  29. hostname: settings.get("ldap.hostname").unwrap(),
  30. port: settings.get("ldap.port").unwrap(),
  31. basedn: settings.get("ldap.basedn").unwrap(),
  32. groupsdn: settings.get("ldap.groupsdn").unwrap(),
  33. binddn: settings.get("ldap.binddn").unwrap(),
  34. bindpw: settings.get("ldap.bindpw").unwrap(),
  35. starttls: settings.get("ldap.starttls").unwrap(),
  36. };
  37. let ldap_wrapper = LdapWrapper::new(ldap_config);
  38. HttpServer::new(move || {
  39. App::new()
  40. .wrap(
  41. SessionMiddleware::builder(redis_store.clone(), signing_key.clone())
  42. .cookie_same_site(SameSite::Strict)
  43. .build()
  44. )
  45. .app_data(web::Data::new(ldap_wrapper.clone()))
  46. .route("/", web::get().to(handler::index))
  47. .route("/auth", web::post().to(handler::auth))
  48. .route("/home", web::get().to(handler::home))
  49. .route("/signout", web::get().to(handler::signout))
  50. .route("/changepassword", web::get().to(handler::form_password))
  51. .route("/changepassword", web::post().to(handler::change_password))
  52. .route("/ssh", web::get().to(handler::form_ssh))
  53. .route("/addsshkey", web::post().to(handler::add_ssh_key))
  54. .route("/delsshkey", web::post().to(handler::del_ssh_key))
  55. })
  56. .bind((bind_addr, bind_port))?
  57. .run()
  58. .await
  59. }