summaryrefslogtreecommitdiff
path: root/src/auth_handler/mod.rs
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2018-11-26 12:33:37 +0100
committerYves Fischer <yvesf-git@xapek.org>2018-11-26 12:36:07 +0100
commit63636d00ca56ee37f9cb9db3fece81d615e21a1a (patch)
tree970f86c8ed2abd32d6af964b0f7cfb34f9bd8d45 /src/auth_handler/mod.rs
parent20242a8d3cc2e9a70812f34fcc50c170a654f6c6 (diff)
downloadnginx-auth-totp-63636d00ca56ee37f9cb9db3fece81d615e21a1a.tar.gz
nginx-auth-totp-63636d00ca56ee37f9cb9db3fece81d615e21a1a.zip
Refactor html views
Diffstat (limited to 'src/auth_handler/mod.rs')
-rw-r--r--src/auth_handler/mod.rs170
1 files changed, 0 insertions, 170 deletions
diff --git a/src/auth_handler/mod.rs b/src/auth_handler/mod.rs
deleted file mode 100644
index b4e02d1..0000000
--- a/src/auth_handler/mod.rs
+++ /dev/null
@@ -1,170 +0,0 @@
-#![allow(warnings)]
-
-use std::cell::Cell;
-use std::collections::HashMap;
-use std::io;
-use std::marker::Sync;
-use std::str;
-use std::str::FromStr;
-use std::sync::{Arc, RwLock, Mutex, MutexGuard};
-use std::cell::RefCell;
-
-use time::{Tm, Duration};
-use http::{Request, Response, StatusCode, Method};
-use tokio::prelude::*;
-use horrorshow;
-use cookie::{Cookie,CookieBuilder};
-use bytes::Bytes;
-
-use router;
-use cookie_store::CookieStore;
-use cookie_store::to_cookie;
-use http_server::HttpHandler;
-
-mod urls;
-mod handler_login;
-mod handler_info;
-
-pub(in auth_handler) struct HeaderExtract<'a> {
- totp_secrets: Vec<&'a str>,
- cookies: Vec<Cookie<'a>>,
-}
-
-pub struct HeaderMissing {
- name: &'static str,
-}
-
-static HTTP_HEADER_AUTHORIZATION: &'static str = r"Authorization";
-static HTTP_HEADER_X_ORIGINAL_URL: &'static str = r"X-Original-Url";
-static HTTP_HEADER_WWW_AUTHENTICATE: &'static str = r"WWW-Authenticate";
-static HTTP_HEADER_X_TOTP_SECRET: &'static str = r"X-Totp-Secret";
-static COOKIE_NAME: &'static str = r"totp_cookie";
-
-#[derive(Clone)]
-pub struct AuthHandler {
- routing_table: router::RoutingTable<urls::Route>,
-}
-
-pub(in auth_handler) fn make_response(code: StatusCode, body: String) -> Response<String> {
- Response::builder().status(code).body(body).unwrap()
-}
-
-pub(in auth_handler) fn error_handler_internal(body: String) -> Response<String> {
- Response::builder().status(StatusCode::INTERNAL_SERVER_ERROR).body(body).unwrap()
-}
-
-impl HttpHandler<super::ApplicationState> for AuthHandler {
- fn respond(&self, state: &super::ApplicationState, req: Request<Bytes>) -> Response<String> {
- match self.routing_table.match_path(req.uri().path()) {
- Ok((urls::Route::Info, rest)) => handler_info::respond(self, state, &req, rest),
- Ok((urls::Route::Login, rest)) => self.login(state, &req, rest),
- Ok((urls::Route::Logout, rest)) => self.logout(state, &req, rest),
- Ok((urls::Route::Check, rest)) => self.check(state, &req, rest),
- Err(error) => match error {
- router::NoMatchingRoute =>
- make_response(StatusCode::NOT_FOUND, "Resource not found".to_string()),
- }
- }
- }
-}
-
-pub fn is_logged_in(cookies: &Vec<Cookie>, cookie_store: &CookieStore) -> bool {
- for cookie in cookies {
- if cookie.name() == COOKIE_NAME {
- let cookie_value = to_cookie(cookie.value());
- if cookie_value.is_some() && cookie_store.is_cookie_authenticated(&cookie_value.unwrap()) {
- return true;
- }
- }
- }
- false
-}
-
-
-impl AuthHandler {
- pub fn make() -> AuthHandler {
- AuthHandler { routing_table: urls::create_routing_table() }
- }
-
- fn login<'a>(&self, state: &super::ApplicationState, req: &Request<Bytes>, path_rest: &'a str,
- ) -> Response<String> {
- let header_infos = match Self::parse_header_infos(req) {
- Ok(infos) => infos,
- Err(message) => return error_handler_internal(message),
- };
- match *req.method() {
- Method::GET => handler_login::GET(&header_infos, state, path_rest),
- Method::POST => handler_login::POST(&header_infos, state, req),
- _ => error_handler_internal("Wrong method".to_string()),
- }
- }
-
- fn logout<'a>(&self, state: &super::ApplicationState, req: &Request<Bytes>, path_rest: &'a str,
- ) -> Response<String> {
- let header_infos = match Self::parse_header_infos(req) {
- Ok(infos) => infos,
- Err(message) => return error_handler_internal(message),
- };
-
- let body = format!("Rest: {}", path_rest);
- Response::builder().body(body.to_string()).unwrap()
- }
-
-
- fn check<'a>(&self, state: &super::ApplicationState, req: &Request<Bytes>, path_rest: &'a str) -> Response<String> {
- let header_infos = match Self::parse_header_infos(req) {
- Ok(infos) => infos,
- Err(message) => return error_handler_internal(message),
- };
- if is_logged_in(&header_infos.cookies, &state.cookie_store) {
- make_response(StatusCode::OK, "".to_string())
- } else {
- make_response(StatusCode::UNAUTHORIZED, "Cookie expired".to_string())
- }
- }
-
-
- fn parse_header_infos(req: &Request<Bytes>) -> Result<HeaderExtract, String> {
- let mut totp_secrets = Vec::new();
- for header_value in req.headers().get_all(HTTP_HEADER_X_TOTP_SECRET) {
- let value = header_value.to_str().or(Err("Failed to read totp-secret header value"))?;
- totp_secrets.push(value);
- }
-
- let mut cookies = Vec::new();
- for header_value in req.headers().get_all(::http::header::COOKIE) {
- let value = header_value.to_str().or(Err("Failed to read cookie value"))?;
- let cookie = Cookie::parse(value).or(Err("Failed to parse cookie value"))?;
- cookies.push(cookie);
- }
-
- Ok(HeaderExtract { totp_secrets, cookies })
- }
-}
-
-#[cfg(test)]
-mod test1 {
- // use super::*;
- use test::Bencher;
- // use horrorshow::prelude::*;
- use horrorshow::helper::doctype;
-
- #[bench]
- fn bench_1(_: &mut Bencher) {
- let _ = format!("{}", html! {
-: doctype::HTML;
-html {
-head {
-title: "Hello world!";
-}
-body {
-// attributes
-h1(id = "heading") {
-// Insert escaped text
-: "Hello! This is <html />"
-}
-}
-}
-});
- }
-}