Introduce a query type.
This commit is contained in:
parent
7cd3280bf6
commit
51dda2ebaa
|
@ -2,6 +2,7 @@ use parking_lot::MutexGuard;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
use std::result;
|
use std::result;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use sequoia_openpgp::{
|
use sequoia_openpgp::{
|
||||||
constants::SignatureType, packet::Signature, packet::UserID, parse::Parse,
|
constants::SignatureType, packet::Signature, packet::UserID, parse::Parse,
|
||||||
|
@ -92,6 +93,32 @@ impl Delete {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents a search query.
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub enum Query {
|
||||||
|
ByFingerprint(Fingerprint),
|
||||||
|
ByKeyID(KeyID),
|
||||||
|
ByEmail(Email),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Query {
|
||||||
|
type Err = failure::Error;
|
||||||
|
|
||||||
|
fn from_str(term: &str) -> Result<Self> {
|
||||||
|
use self::Query::*;
|
||||||
|
|
||||||
|
if let Ok(fp) = Fingerprint::from_str(term) {
|
||||||
|
Ok(ByFingerprint(fp))
|
||||||
|
} else if let Ok(keyid) = KeyID::from_str(term) {
|
||||||
|
Ok(ByKeyID(keyid))
|
||||||
|
} else if let Ok(email) = Email::from_str(term) {
|
||||||
|
Ok(ByEmail(email))
|
||||||
|
} else {
|
||||||
|
Err(failure::err_msg("Malformed query"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait Database: Sync + Send {
|
pub trait Database: Sync + Send {
|
||||||
// Lock the DB for a complex update.
|
// Lock the DB for a complex update.
|
||||||
//
|
//
|
||||||
|
@ -118,23 +145,17 @@ pub trait Database: Sync + Send {
|
||||||
|
|
||||||
/// Queries the database using Fingerprint, KeyID, or
|
/// Queries the database using Fingerprint, KeyID, or
|
||||||
/// email-address.
|
/// email-address.
|
||||||
fn lookup(&self, term: &str) -> Result<Option<TPK>> {
|
fn lookup(&self, term: &Query) -> Result<Option<TPK>> {
|
||||||
use std::str::FromStr;
|
use self::Query::*;
|
||||||
|
let armored = match term {
|
||||||
let r = if let Ok(fp) = Fingerprint::from_str(term) {
|
ByFingerprint(ref fp) => self.by_fpr(fp),
|
||||||
Ok(self.by_fpr(&fp))
|
ByKeyID(ref keyid) => self.by_kid(keyid),
|
||||||
} else if let Ok(keyid) = KeyID::from_str(term) {
|
ByEmail(ref email) => self.by_email(&email),
|
||||||
Ok(self.by_kid(&keyid))
|
|
||||||
} else if let Ok(email) = Email::from_str(term) {
|
|
||||||
Ok(self.by_email(&email))
|
|
||||||
} else {
|
|
||||||
Err(failure::err_msg("Malformed query"))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match r {
|
match armored {
|
||||||
Ok(Some(armored)) => Ok(Some(TPK::from_bytes(armored.as_bytes())?)),
|
Some(armored) => Ok(Some(TPK::from_bytes(armored.as_bytes())?)),
|
||||||
Ok(None) => Ok(None),
|
None => Ok(None),
|
||||||
Err(e) => Err(e),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ mod import_tests {
|
||||||
do_import(root.path().to_path_buf(), vec![import_me]).unwrap();
|
do_import(root.path().to_path_buf(), vec![import_me]).unwrap();
|
||||||
|
|
||||||
let check = |query: &str| {
|
let check = |query: &str| {
|
||||||
let tpk_ = db.lookup(query).unwrap().unwrap();
|
let tpk_ = db.lookup(&query.parse().unwrap()).unwrap().unwrap();
|
||||||
assert_eq!(tpk.fingerprint(), tpk_.fingerprint());
|
assert_eq!(tpk.fingerprint(), tpk_.fingerprint());
|
||||||
assert_eq!(tpk.subkeys().map(|skb| skb.subkey().fingerprint())
|
assert_eq!(tpk.subkeys().map(|skb| skb.subkey().fingerprint())
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
|
|
|
@ -451,7 +451,11 @@ fn manage_post(
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use mail::send_confirmation_mail;
|
use mail::send_confirmation_mail;
|
||||||
|
|
||||||
let tpk = match db.lookup(&request.search_term) {
|
let query = match request.search_term.parse() {
|
||||||
|
Ok(query) => query,
|
||||||
|
Err(e) => return MyResponse::ise(e),
|
||||||
|
};
|
||||||
|
let tpk = match db.lookup(&query) {
|
||||||
Ok(Some(tpk)) => tpk,
|
Ok(Some(tpk)) => tpk,
|
||||||
Ok(None) => return MyResponse::not_found(
|
Ok(None) => return MyResponse::not_found(
|
||||||
Some("/vks/manage"),
|
Some("/vks/manage"),
|
||||||
|
|
Loading…
Reference in New Issue