feat(handlers/main): Add 'anonymous' mode for forum

Adds a `REQUIRE_LOGIN` environment variable which, if set to anything
other than true, will let users post anonymously on the forums.
This commit is contained in:
Vincent Ambo 2018-04-12 01:28:37 +02:00
parent e7a54a5aff
commit bf02c70f74
2 changed files with 27 additions and 9 deletions

View file

@ -64,6 +64,15 @@ pub fn new_thread(state: State<AppState>) -> ConverseResponse {
.responder() .responder()
} }
/// This function provides an anonymous "default" author if logins are
/// not required.
fn anonymous() -> Author {
Author {
name: "Anonymous".into(),
email: "anonymous@nothing.org".into(),
}
}
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct NewThreadForm { pub struct NewThreadForm {
pub title: String, pub title: String,
@ -90,9 +99,10 @@ pub fn submit_thread(state: State<AppState>,
.responder(); .responder();
} }
// Author is "unwrapped" because the RequireLogin middleware let author: Author = req.session().get(AUTHOR)
// guarantees it to be present. .unwrap_or_else(|_| Some(anonymous()))
let author: Author = req.session().get(AUTHOR).unwrap().unwrap(); .unwrap_or_else(anonymous);
let new_thread = NewThread { let new_thread = NewThread {
title: input.0.title, title: input.0.title,
body: input.0.body, body: input.0.body,
@ -123,9 +133,10 @@ pub struct NewPostForm {
pub fn reply_thread(state: State<AppState>, pub fn reply_thread(state: State<AppState>,
input: Form<NewPostForm>, input: Form<NewPostForm>,
mut req: HttpRequest<AppState>) -> ConverseResponse { mut req: HttpRequest<AppState>) -> ConverseResponse {
// Author is "unwrapped" because the RequireLogin middleware let author: Author = req.session().get(AUTHOR)
// guarantees it to be present. .unwrap_or_else(|_| Some(anonymous()))
let author: Author = req.session().get(AUTHOR).unwrap().unwrap(); .unwrap_or_else(anonymous);
let new_post = NewPost { let new_post = NewPost {
thread_id: input.thread_id, thread_id: input.thread_id,
body: input.0.body, body: input.0.body,

View file

@ -112,6 +112,8 @@ fn main() {
key_bytes key_bytes
}; };
let require_login = config_default("REQUIRE_LOGIN", "true".into()) == "true";
server::new(move || { server::new(move || {
let state = AppState { let state = AppState {
db: db_addr.clone(), db: db_addr.clone(),
@ -123,17 +125,22 @@ fn main() {
CookieSessionBackend::signed(&key) CookieSessionBackend::signed(&key)
.secure(base_url.starts_with("https"))); .secure(base_url.starts_with("https")));
App::with_state(state) let app = App::with_state(state)
.middleware(Logger::default()) .middleware(Logger::default())
.middleware(sessions) .middleware(sessions)
.middleware(RequireLogin)
.resource("/", |r| r.method(Method::GET).with(forum_index)) .resource("/", |r| r.method(Method::GET).with(forum_index))
.resource("/thread/new", |r| r.method(Method::GET).with(new_thread)) .resource("/thread/new", |r| r.method(Method::GET).with(new_thread))
.resource("/thread/submit", |r| r.method(Method::POST).with3(submit_thread)) .resource("/thread/submit", |r| r.method(Method::POST).with3(submit_thread))
.resource("/thread/reply", |r| r.method(Method::POST).with3(reply_thread)) .resource("/thread/reply", |r| r.method(Method::POST).with3(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).with3(callback))}) .resource("/oidc/callback", |r| r.method(Method::POST).with3(callback));
if require_login {
app.middleware(RequireLogin)
} else {
app
}})
.bind(&bind_host).expect(&format!("Could not bind on '{}'", bind_host)) .bind(&bind_host).expect(&format!("Could not bind on '{}'", bind_host))
.start(); .start();