macaroons 0.3.0

Cookie-like bearer credentials with caveats for distributed authorization
Documentation
use caveat::{Caveat, Predicate};
use error::{Result, Error};
use token::Token;
use v1::V1Token;

pub type CaveatVerifier = Fn(&Predicate) -> bool;

pub struct Verifier {
    pub matchers: Vec<Box<CaveatVerifier>>,
}

impl Verifier {
    pub fn new(matchers: Vec<Box<CaveatVerifier>>) -> Verifier {
        Verifier { matchers: matchers }
    }

    pub fn verify(&self, key: &[u8], token: &V1Token) -> Result<()> {
        try!(token.verify(&key));

        for c in &token.caveats {
            if c.verification_id == None {
                try!(self.verify_first_party(c));
            } else {
                try!(self.verify_third_party());
            }
        }

        Ok(())
    }

    fn verify_first_party(&self, c: &Caveat) -> Result<()> {
        let matchers = &self.matchers;
        for m in matchers {
            if m(&Predicate(c.caveat_id.clone())) {
                return Ok(());
            }
        }
        
        Err(Error::FirstPartyCaveatFailed)
    }

    fn verify_third_party(&self) -> Result<()> {
        unimplemented!();
    }
}