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…
	
	Add table
		Add a link
		
	
		Reference in a new issue