//! Editor bearer token authentication use swagger::auth::{AuthData, Authorization, Scopes}; //use macaroon::{Macaroon, Verifier}; use std::collections::BTreeSet; use database_models::*; use database_schema::*; use api_helpers::*; use chrono; use diesel; use iron; use diesel::prelude::*; use errors::*; use serde_json; use std::str::FromStr; use uuid::Uuid; #[derive(Debug)] pub struct OpenAuthMiddleware; impl OpenAuthMiddleware { /// Create a middleware that authorizes with the configured subject. pub fn new() -> OpenAuthMiddleware { OpenAuthMiddleware } } impl iron::middleware::BeforeMiddleware for OpenAuthMiddleware { fn before(&self, req: &mut iron::Request) -> iron::IronResult<()> { req.extensions.insert::(Authorization { subject: "undefined".to_string(), scopes: Scopes::All, issuer: None, }); Ok(()) } } #[derive(Debug)] pub struct MacaroonAuthMiddleware; impl MacaroonAuthMiddleware { pub fn new() -> MacaroonAuthMiddleware { MacaroonAuthMiddleware } } impl iron::middleware::BeforeMiddleware for MacaroonAuthMiddleware { fn before(&self, req: &mut iron::Request) -> iron::IronResult<()> { let res: Option<(String, Vec)> = match req.extensions.get::() { Some(AuthData::ApiKey(header)) => { let header: Vec = header.split_whitespace().map(|s| s.to_string()).collect(); // TODO: error types assert!(header.len() == 2); assert!(header[0] == "Bearer"); parse_macaroon_token(&header[1]).expect("valid macaroon") }, None => None, _ => panic!("valid auth header, or none") }; if let Some((editor_id, scopes)) = res { let mut scope_set = BTreeSet::new(); for s in scopes { scope_set.insert(s); } req.extensions.insert::(Authorization { subject: editor_id, scopes: Scopes::Some(scope_set), issuer: None, }); }; Ok(()) } } // DUMMY: parse macaroon /// On success, returns Some((editor_id, scopes)), where `scopes` is a vector of strings. pub fn parse_macaroon_token(s: &str) -> Result)>> { Ok(Some(("some_editor_id".to_string(), vec![]))) } pub fn print_editors(conn: &DbConn) -> Result<()>{ // iterate over all editors. format id, print flags, auth_epoch let all_editors: Vec = editor::table .load(conn)?; println!("editor_id\t\t\tis_admin/is_bot\tauth_epoch\t\t\tusername\twrangler_id"); for e in all_editors { println!("{}\t{}\t{}\t{}\t{}\t{:?}", FatCatId::from_uuid(&e.id).to_string(), e.is_admin, e.is_bot, e.auth_epoch, e.username, e.wrangler_id, ); } Ok(()) } pub fn create_editor(conn: &DbConn, username: String, is_admin: bool, is_bot: bool) -> Result { let ed: EditorRow = diesel::insert_into(editor::table) .values(( editor::username.eq(username), editor::is_admin.eq(is_admin), editor::is_bot.eq(is_bot), )) .get_result(conn)?; Ok(ed) } pub fn create_token(conn: &DbConn, editor_id: FatCatId, expires: Option) -> Result { unimplemented!(); } pub fn inspect_token(token: &str) -> Result<()> { unimplemented!(); } pub fn revoke_tokens(conn: &DbConn, editor_id: FatCatId) -> Result<()>{ unimplemented!(); } pub fn revoke_tokens_everyone(conn: &DbConn) -> Result { unimplemented!(); }