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:
parent
e7a54a5aff
commit
bf02c70f74
2 changed files with 27 additions and 9 deletions
|
@ -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,
|
||||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue