2018-10-06 04:56:46 +00:00
|
|
|
#![feature(proc_macro_hygiene, decl_macro, never_type)]
|
2017-03-08 11:28:12 +00:00
|
|
|
|
2018-08-07 02:58:07 +00:00
|
|
|
#[macro_use] extern crate rocket;
|
2017-03-08 11:28:12 +00:00
|
|
|
|
2017-07-04 21:51:41 +00:00
|
|
|
#[cfg(test)] mod tests;
|
|
|
|
|
2017-03-08 11:28:12 +00:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
2017-06-24 09:49:16 +00:00
|
|
|
use rocket::outcome::IntoOutcome;
|
2017-03-08 11:28:12 +00:00
|
|
|
use rocket::request::{self, Form, FlashMessage, FromRequest, Request};
|
|
|
|
use rocket::response::{Redirect, Flash};
|
2017-06-06 20:41:04 +00:00
|
|
|
use rocket::http::{Cookie, Cookies};
|
2018-10-07 00:24:11 +00:00
|
|
|
use rocket_contrib::templates::Template;
|
2017-03-08 11:28:12 +00:00
|
|
|
|
|
|
|
#[derive(FromForm)]
|
|
|
|
struct Login {
|
|
|
|
username: String,
|
|
|
|
password: String
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct User(usize);
|
|
|
|
|
|
|
|
impl<'a, 'r> FromRequest<'a, 'r> for User {
|
2018-08-10 11:42:30 +00:00
|
|
|
type Error = !;
|
2017-03-08 11:28:12 +00:00
|
|
|
|
2018-08-10 11:42:30 +00:00
|
|
|
fn from_request(request: &'a Request<'r>) -> request::Outcome<User, !> {
|
2017-06-24 09:49:16 +00:00
|
|
|
request.cookies()
|
2017-06-06 20:41:04 +00:00
|
|
|
.get_private("user_id")
|
2017-03-08 11:28:12 +00:00
|
|
|
.and_then(|cookie| cookie.value().parse().ok())
|
2017-06-24 09:49:16 +00:00
|
|
|
.map(|id| User(id))
|
|
|
|
.or_forward(())
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/login", data = "<login>")]
|
2019-06-13 02:41:29 +00:00
|
|
|
fn login(mut cookies: Cookies<'_>, login: Form<Login>) -> Result<Redirect, Flash<Redirect>> {
|
2018-09-26 08:13:57 +00:00
|
|
|
if login.username == "Sergio" && login.password == "password" {
|
2017-06-06 20:41:04 +00:00
|
|
|
cookies.add_private(Cookie::new("user_id", 1.to_string()));
|
2018-06-24 11:29:19 +00:00
|
|
|
Ok(Redirect::to(uri!(index)))
|
2017-03-08 11:28:12 +00:00
|
|
|
} else {
|
2018-06-24 11:29:19 +00:00
|
|
|
Err(Flash::error(Redirect::to(uri!(login_page)), "Invalid username/password."))
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/logout")]
|
2019-06-13 02:41:29 +00:00
|
|
|
fn logout(mut cookies: Cookies<'_>) -> Flash<Redirect> {
|
2017-06-06 20:41:04 +00:00
|
|
|
cookies.remove_private(Cookie::named("user_id"));
|
2018-04-07 20:51:57 +00:00
|
|
|
Flash::success(Redirect::to(uri!(login_page)), "Successfully logged out.")
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/login")]
|
|
|
|
fn login_user(_user: User) -> Redirect {
|
2018-04-07 20:51:57 +00:00
|
|
|
Redirect::to(uri!(index))
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/login", rank = 2)]
|
2019-06-13 02:41:29 +00:00
|
|
|
fn login_page(flash: Option<FlashMessage<'_, '_>>) -> Template {
|
2017-03-08 11:28:12 +00:00
|
|
|
let mut context = HashMap::new();
|
|
|
|
if let Some(ref msg) = flash {
|
|
|
|
context.insert("flash", msg.msg());
|
|
|
|
}
|
|
|
|
|
|
|
|
Template::render("login", &context)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/")]
|
|
|
|
fn user_index(user: User) -> Template {
|
|
|
|
let mut context = HashMap::new();
|
|
|
|
context.insert("user_id", user.0);
|
|
|
|
Template::render("index", &context)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/", rank = 2)]
|
|
|
|
fn index() -> Redirect {
|
2018-04-07 20:51:57 +00:00
|
|
|
Redirect::to(uri!(login_page))
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|
|
|
|
|
2017-07-04 21:51:41 +00:00
|
|
|
fn rocket() -> rocket::Rocket {
|
2017-03-08 11:28:12 +00:00
|
|
|
rocket::ignite()
|
2017-06-06 20:41:04 +00:00
|
|
|
.attach(Template::fairing())
|
2017-03-08 11:28:12 +00:00
|
|
|
.mount("/", routes![index, user_index, login, logout, login_user, login_page])
|
2017-07-04 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
rocket().launch();
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|