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