server.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. use crate::{config, UIDCError};
  2. mod oidc;
  3. mod session;
  4. pub struct ServerState {
  5. config: config::Config,
  6. pool: microrm::DBPool<'static>,
  7. templates: handlebars::Handlebars<'static>,
  8. }
  9. #[derive(Clone)]
  10. struct ServerStateWrapper {
  11. core: &'static ServerState,
  12. }
  13. async fn index(req: tide::Request<ServerStateWrapper>) -> tide::Result<tide::Response> {
  14. let shelper = session::SessionHelper::new(&req);
  15. let realm = shelper.get_realm()?;
  16. let sid = shelper.get_session(&req);
  17. let auth = sid.and_then(|sid| shelper.get_auth_for_session(realm, sid));
  18. let response = tide::Response::builder(200)
  19. .content_type(tide::http::mime::PLAIN)
  20. .body(format!(
  21. r#"
  22. realm: {realm:?}
  23. session: {sid:?}
  24. auth: {auth:?}
  25. "#
  26. ))
  27. .build();
  28. Ok(response)
  29. }
  30. pub async fn run_server(
  31. db: microrm::DB,
  32. config: config::Config,
  33. port: u16,
  34. ) -> Result<(), UIDCError> {
  35. let db_box = Box::new(db);
  36. let db: &'static mut microrm::DB = Box::leak(db_box);
  37. let pool = microrm::DBPool::new(db);
  38. let core_state = Box::leak(Box::new(ServerState {
  39. config,
  40. pool,
  41. templates: handlebars::Handlebars::new(),
  42. }));
  43. core_state.templates.set_dev_mode(true);
  44. core_state
  45. .templates
  46. .register_templates_directory(".tmpl", "tmpl/")
  47. .expect("Couldn't open templates directory?");
  48. let state = ServerStateWrapper { core: core_state };
  49. let mut app = tide::with_state(state);
  50. app.with(tide::log::LogMiddleware::new());
  51. app.at("/:realm/").get(index);
  52. app.at("/static")
  53. .serve_dir("static/")
  54. .expect("Can't serve static files");
  55. session::session_v1_server(app.at("/:realm/v1/session/"));
  56. oidc::oidc_server(app.at("/:realm/"));
  57. app.listen(("127.0.0.1", port))
  58. .await
  59. .map_err(|_| UIDCError::Abort("couldn't listen on port"))
  60. }