feat(handlers): Use cookie session backend to store author info
This commit is contained in:
parent
e761b2d295
commit
9eb8501fae
3 changed files with 35 additions and 13 deletions
|
@ -9,6 +9,7 @@ use actix_web::http::StatusCode;
|
||||||
|
|
||||||
// Modules with foreign errors:
|
// Modules with foreign errors:
|
||||||
use actix;
|
use actix;
|
||||||
|
use actix_web;
|
||||||
use diesel;
|
use diesel;
|
||||||
use r2d2;
|
use r2d2;
|
||||||
use reqwest;
|
use reqwest;
|
||||||
|
@ -30,11 +31,14 @@ pub enum ConverseError {
|
||||||
#[fail(display = "a template rendering error occured: {}", reason)]
|
#[fail(display = "a template rendering error occured: {}", reason)]
|
||||||
Template { reason: String },
|
Template { reason: String },
|
||||||
|
|
||||||
|
#[fail(display = "error occured during request handling: {}", error)]
|
||||||
|
ActixWeb { error: actix_web::Error },
|
||||||
|
|
||||||
// This variant is used as a catch-all for wrapping
|
// This variant is used as a catch-all for wrapping
|
||||||
// actix-web-compatible response errors, such as the errors it
|
// actix-web-compatible response errors, such as the errors it
|
||||||
// throws itself.
|
// throws itself.
|
||||||
#[fail(display = "Actix response error: {}", error)]
|
#[fail(display = "Actix response error: {}", error)]
|
||||||
ActixWeb { error: Box<ResponseError> },
|
Actix { error: Box<ResponseError> },
|
||||||
}
|
}
|
||||||
|
|
||||||
// Establish conversion links to foreign errors:
|
// Establish conversion links to foreign errors:
|
||||||
|
@ -61,7 +65,13 @@ impl From<tera::Error> for ConverseError {
|
||||||
|
|
||||||
impl From<actix::MailboxError> for ConverseError {
|
impl From<actix::MailboxError> for ConverseError {
|
||||||
fn from(error: actix::MailboxError) -> ConverseError {
|
fn from(error: actix::MailboxError) -> ConverseError {
|
||||||
ConverseError::ActixWeb { error: Box::new(error) }
|
ConverseError::Actix { error: Box::new(error) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<actix_web::Error> for ConverseError {
|
||||||
|
fn from(error: actix_web::Error) -> ConverseError {
|
||||||
|
ConverseError::ActixWeb { error }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,14 +5,15 @@
|
||||||
//! the tera templates stored in the `/templates` directory in the
|
//! the tera templates stored in the `/templates` directory in the
|
||||||
//! project root.
|
//! project root.
|
||||||
|
|
||||||
use tera;
|
|
||||||
use actix_web::*;
|
|
||||||
use models::*;
|
|
||||||
use db::*;
|
|
||||||
use actix::prelude::{Addr, Syn};
|
use actix::prelude::{Addr, Syn};
|
||||||
use futures::Future;
|
use actix_web::*;
|
||||||
|
use actix_web::middleware::RequestSession;
|
||||||
|
use db::*;
|
||||||
use errors::{Result, ConverseError};
|
use errors::{Result, ConverseError};
|
||||||
|
use futures::Future;
|
||||||
|
use models::*;
|
||||||
use oidc::*;
|
use oidc::*;
|
||||||
|
use tera;
|
||||||
|
|
||||||
type ConverseResponse = Box<Future<Item=HttpResponse, Error=ConverseError>>;
|
type ConverseResponse = Box<Future<Item=HttpResponse, Error=ConverseError>>;
|
||||||
|
|
||||||
|
@ -119,11 +120,18 @@ pub fn login(state: State<AppState>) -> ConverseResponse {
|
||||||
.responder()
|
.responder()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn callback(state: State<AppState>, data: Form<CodeResponse>) -> ConverseResponse {
|
pub fn callback(state: State<AppState>,
|
||||||
|
data: Form<CodeResponse>,
|
||||||
|
mut req: HttpRequest<AppState>) -> ConverseResponse {
|
||||||
state.oidc.send(RetrieveToken(data.0))
|
state.oidc.send(RetrieveToken(data.0))
|
||||||
.from_err()
|
.from_err()
|
||||||
.and_then(|author| {
|
.and_then(move |result| {
|
||||||
Ok(HttpResponse::from(format!("{:?}", author)))
|
let author = result?;
|
||||||
})
|
info!("Setting cookie for {} after callback", author.name);
|
||||||
|
req.session().set("author_name", author.name)?;
|
||||||
|
req.session().set("author_email", author.email)?;
|
||||||
|
Ok(HttpResponse::SeeOther()
|
||||||
|
.header("Location", "/")
|
||||||
|
.finish())})
|
||||||
.responder()
|
.responder()
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ pub mod schema;
|
||||||
|
|
||||||
use actix::prelude::*;
|
use actix::prelude::*;
|
||||||
use actix_web::*;
|
use actix_web::*;
|
||||||
|
use actix_web::middleware::{Logger, SessionStorage, CookieSessionBackend};
|
||||||
use actix_web::http::Method;
|
use actix_web::http::Method;
|
||||||
use db::*;
|
use db::*;
|
||||||
use diesel::pg::PgConnection;
|
use diesel::pg::PgConnection;
|
||||||
|
@ -80,6 +81,7 @@ fn main() {
|
||||||
|
|
||||||
info!("Initialising HTTP server ...");
|
info!("Initialising HTTP server ...");
|
||||||
let bind_host = config_default("CONVERSE_BIND_HOST", "127.0.0.1:4567");
|
let bind_host = config_default("CONVERSE_BIND_HOST", "127.0.0.1:4567");
|
||||||
|
let key: &[u8] = &[0; 32]; // TODO: generate!
|
||||||
|
|
||||||
server::new(move || {
|
server::new(move || {
|
||||||
let template_path = concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*");
|
let template_path = concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*");
|
||||||
|
@ -91,13 +93,15 @@ fn main() {
|
||||||
};
|
};
|
||||||
|
|
||||||
App::with_state(state)
|
App::with_state(state)
|
||||||
.middleware(middleware::Logger::default())
|
.middleware(Logger::default())
|
||||||
|
// TODO: Configure session backend with more secure settings.
|
||||||
|
.middleware(SessionStorage::new(CookieSessionBackend::new(key)))
|
||||||
.resource("/", |r| r.method(Method::GET).with(forum_index))
|
.resource("/", |r| r.method(Method::GET).with(forum_index))
|
||||||
.resource("/thread/submit", |r| r.method(Method::POST).with2(submit_thread))
|
.resource("/thread/submit", |r| r.method(Method::POST).with2(submit_thread))
|
||||||
.resource("/thread/reply", |r| r.method(Method::POST).with2(reply_thread))
|
.resource("/thread/reply", |r| r.method(Method::POST).with2(reply_thread))
|
||||||
.resource("/thread/{id}", |r| r.method(Method::GET).with2(forum_thread))
|
.resource("/thread/{id}", |r| r.method(Method::GET).with2(forum_thread))
|
||||||
.resource("/oidc/login", |r| r.method(Method::GET).with(login))
|
.resource("/oidc/login", |r| r.method(Method::GET).with(login))
|
||||||
.resource("/oidc/callback", |r| r.method(Method::POST).with2(callback))})
|
.resource("/oidc/callback", |r| r.method(Method::POST).with3(callback))})
|
||||||
.bind(&bind_host).expect(&format!("Could not bind on '{}'", bind_host))
|
.bind(&bind_host).expect(&format!("Could not bind on '{}'", bind_host))
|
||||||
.start();
|
.start();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue