2017-04-04 02:06:30 +00:00
|
|
|
#![feature(plugin, custom_derive)]
|
2017-03-08 11:28:12 +00:00
|
|
|
#![plugin(rocket_codegen)]
|
|
|
|
|
|
|
|
extern crate rocket_contrib;
|
|
|
|
extern crate rocket;
|
|
|
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
|
|
use rocket::Outcome;
|
|
|
|
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};
|
2017-03-08 11:28:12 +00:00
|
|
|
use rocket_contrib::Template;
|
|
|
|
|
|
|
|
#[derive(FromForm)]
|
|
|
|
struct Login {
|
|
|
|
username: String,
|
|
|
|
password: String
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct User(usize);
|
|
|
|
|
|
|
|
impl<'a, 'r> FromRequest<'a, 'r> for User {
|
|
|
|
type Error = ();
|
|
|
|
|
|
|
|
fn from_request(request: &'a Request<'r>) -> request::Outcome<User, ()> {
|
2017-06-06 20:41:04 +00:00
|
|
|
let user = request.cookies()
|
|
|
|
.get_private("user_id")
|
2017-03-08 11:28:12 +00:00
|
|
|
.and_then(|cookie| cookie.value().parse().ok())
|
|
|
|
.map(|id| User(id));
|
|
|
|
|
|
|
|
match user {
|
|
|
|
Some(user) => Outcome::Success(user),
|
|
|
|
None => Outcome::Forward(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/login", data = "<login>")]
|
2017-06-06 20:41:04 +00:00
|
|
|
fn login(mut cookies: Cookies, login: Form<Login>) -> Flash<Redirect> {
|
2017-03-08 11:28:12 +00:00
|
|
|
if login.get().username == "Sergio" && login.get().password == "password" {
|
2017-06-06 20:41:04 +00:00
|
|
|
cookies.add_private(Cookie::new("user_id", 1.to_string()));
|
2017-03-08 11:28:12 +00:00
|
|
|
Flash::success(Redirect::to("/"), "Successfully logged in.")
|
|
|
|
} else {
|
|
|
|
Flash::error(Redirect::to("/login"), "Invalid username/password.")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[post("/logout")]
|
2017-06-06 20:41:04 +00:00
|
|
|
fn logout(mut cookies: Cookies) -> Flash<Redirect> {
|
|
|
|
cookies.remove_private(Cookie::named("user_id"));
|
2017-03-08 11:28:12 +00:00
|
|
|
Flash::success(Redirect::to("/login"), "Successfully logged out.")
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/login")]
|
|
|
|
fn login_user(_user: User) -> Redirect {
|
|
|
|
Redirect::to("/")
|
|
|
|
}
|
|
|
|
|
|
|
|
#[get("/login", rank = 2)]
|
|
|
|
fn login_page(flash: Option<FlashMessage>) -> Template {
|
|
|
|
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 {
|
|
|
|
Redirect::to("/login")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
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-03-16 05:10:09 +00:00
|
|
|
.launch();
|
2017-03-08 11:28:12 +00:00
|
|
|
}
|