diff --git a/cms/src/auth.rs b/cms/src/auth.rs index 170b85c..f4057ed 100644 --- a/cms/src/auth.rs +++ b/cms/src/auth.rs @@ -61,7 +61,7 @@ impl<'a, 'r> FromRequest<'a, 'r> for Host { } impl<'a, 'r> FromRequest<'a, 'r> for Token { - type Error = (); + type Error = Redirect; fn from_request(request: &'a Request<'r>) -> request::Outcome { match request.cookies().get("token") { @@ -75,10 +75,10 @@ impl<'a, 'r> FromRequest<'a, 'r> for Token { .unwrap(); if resp["error"] != Value::Null { - return Outcome::Failure((Status::Forbidden, ())); + return Outcome::Forward(()); } else { let email = resp["email"].clone(); - let pg = request.guard::>>()?; + let pg = request.guard::>>().unwrap(); let diesel_op = get_auth(&*(pg.lock().unwrap())); let auths: Vec = match diesel_op { Ok(n) => n.into_iter().map(|x| x.email).collect::>(), @@ -88,11 +88,11 @@ impl<'a, 'r> FromRequest<'a, 'r> for Token { if auths.into_iter().any(|x| x == email.as_str().unwrap_or("")) { return Outcome::Success(Token(String::from(email.as_str().unwrap_or("")))); } else { - return Outcome::Failure((Status::Forbidden, ())); + return Outcome::Forward(()); } } } - None => Outcome::Failure((Status::Unauthorized, ())), + None => Outcome::Forward(()) } } } diff --git a/cms/src/data/mod.rs b/cms/src/data/mod.rs index 9daefb1..1000929 100644 --- a/cms/src/data/mod.rs +++ b/cms/src/data/mod.rs @@ -1,10 +1,11 @@ -use cms_macro::api_route; use rocket::{ http::{RawStr, Status}, request::FromParam, }; use std::borrow::Cow; +use cms_macro::api_route; + pub struct Lang<'a>(Cow<'a, str>); fn valid_lang(lang: &str) -> bool { @@ -52,6 +53,7 @@ pub mod defs { } } } + } api_route! { @@ -63,3 +65,14 @@ api_route! { } } +/* +api_route! { + teachers { + name: (Text, String, String), + emails: (Array, Vec, Vec), + } +} +*/ +//TODO: fix value parsing to read a TokenStream until the `,` to allow for containerized types in +//the macro + diff --git a/cms/src/main.rs b/cms/src/main.rs index 54ff0ae..1bc81d0 100644 --- a/cms/src/main.rs +++ b/cms/src/main.rs @@ -29,14 +29,30 @@ use std::{ sync::Mutex, }; use utils::{db_conn, exit_with_error}; +use rocket::response::Redirect; +use auth::Token; + #[get("/")] -fn index() -> Template { - let context: HashMap<&str, &str> = [("oauth", "/oauth")].iter().cloned().collect(); - Template::render("index", &context) +fn home(_token: Token) -> Template { + let context: HashMap<&str, &str> = HashMap::new(); + Template::render("home", &context) } +#[get("/", rank=2)] +fn home_not_logged_in() -> Redirect { + Redirect::to(uri!(login)) +} + +#[get("/login")] +fn login() -> Template { + let context: HashMap<&str, &str> = [("oauth", "/oauth")].iter().cloned().collect(); + Template::render("login", &context) +} + + + #[get("/static/")] fn static_files(path: PathBuf) -> Option { rocket::response::NamedFile::open(Path::new("cms/static/").join(path)).ok() @@ -57,7 +73,7 @@ fn rocket(port: u16, address: String, env: Environment, pg: PgConnection, sa: Se .manage(sa) .mount( "/", - routes![index, auth::callback, auth::oauth, static_files], + routes![home, home_not_logged_in, login, auth::callback, auth::oauth, static_files], ) .mount("/api", routes![data::events::api]) .mount( diff --git a/cms/templates/home.html.hbs b/cms/templates/home.html.hbs new file mode 100644 index 0000000..28559a7 --- /dev/null +++ b/cms/templates/home.html.hbs @@ -0,0 +1,9 @@ +{{! vim: set ft=html: }} + + + + + + Events + + diff --git a/cms/templates/index.html.hbs b/cms/templates/login.html.hbs similarity index 100% rename from cms/templates/index.html.hbs rename to cms/templates/login.html.hbs