diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2020-12-09 12:35:42 +0100 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2020-12-09 12:58:57 +0100 |
commit | f8b6d65101e964803c5261903481b43c07591e6c (patch) | |
tree | 9dd2c3ebe1df121afa8b2d9a12db0174940f2d30 /net | |
parent | 63ba6252eb546e07b8f35274a9f69d1f9bc99c0e (diff) |
net: Allow hkp queries by KeyHandle.
Diffstat (limited to 'net')
-rw-r--r-- | net/src/lib.rs | 27 | ||||
-rw-r--r-- | net/tests/hkp.rs | 5 |
2 files changed, 18 insertions, 14 deletions
diff --git a/net/src/lib.rs b/net/src/lib.rs index d39c62cc..b1cfe70f 100644 --- a/net/src/lib.rs +++ b/net/src/lib.rs @@ -20,8 +20,8 @@ //! # async fn f() -> Result<()> { //! let ctx = Context::new()?; //! let mut ks = KeyServer::keys_openpgp_org(&ctx)?; -//! let keyid = "31855247603831FD".parse()?; -//! println!("{:?}", ks.get(&keyid).await?); +//! let keyid: KeyID = "31855247603831FD".parse()?; +//! println!("{:?}", ks.get(keyid).await?); //! # Ok(()) //! # } //! ``` @@ -41,7 +41,7 @@ use url::Url; use sequoia_openpgp::Cert; use sequoia_openpgp::parse::Parse; -use sequoia_openpgp::{KeyID, armor, serialize::Serialize}; +use sequoia_openpgp::{KeyHandle, armor, serialize::Serialize}; use sequoia_core::{Context, NetworkPolicy}; pub mod wkd; @@ -130,11 +130,14 @@ impl KeyServer { Ok(KeyServer{client, uri}) } - /// Retrieves the key with the given `keyid`. - pub async fn get(&mut self, keyid: &KeyID) -> Result<Cert> { - let keyid_want = keyid.clone(); + /// Retrieves the certificate with the given handle. + pub async fn get<H: Into<KeyHandle>>(&mut self, handle: H) + -> Result<Cert> + { + let handle = handle.into(); + let want_handle = handle.clone(); let uri = self.uri.join( - &format!("pks/lookup?op=get&options=mr&search=0x{:X}", keyid))?; + &format!("pks/lookup?op=get&options=mr&search=0x{:X}", handle))?; let res = self.client.do_get(uri).await?; match res.status() { @@ -145,10 +148,10 @@ impl KeyServer { armor::ReaderMode::Tolerant(Some(armor::Kind::PublicKey)), ); let cert = Cert::from_reader(r)?; - if cert.keys().any(|ka| KeyID::from(ka.fingerprint()) == keyid_want) { + if cert.keys().any(|ka| ka.key_handle().aliases(&want_handle)) { Ok(cert) } else { - Err(Error::MismatchedKeyID(keyid_want, cert).into()) + Err(Error::MismatchedKeyHandle(want_handle, cert).into()) } } StatusCode::NOT_FOUND => Err(Error::NotFound.into()), @@ -226,9 +229,9 @@ pub enum Error { /// A requested key was not found. #[error("Key not found")] NotFound, - /// Mismatched key ID - #[error("Mismatched key ID, expected {0}")] - MismatchedKeyID(KeyID, Cert), + /// Mismatched key handle + #[error("Mismatched key handle, expected {0}")] + MismatchedKeyHandle(KeyHandle, Cert), /// A given keyserver URI was malformed. #[error("Malformed URI; expected hkp: or hkps:")] MalformedUri, diff --git a/net/tests/hkp.rs b/net/tests/hkp.rs index 544c4533..8dafe9a6 100644 --- a/net/tests/hkp.rs +++ b/net/tests/hkp.rs @@ -7,6 +7,7 @@ use rand::rngs::OsRng; use std::io::Cursor; use std::net::{SocketAddr, IpAddr, Ipv4Addr}; +use sequoia_openpgp::KeyID; use sequoia_openpgp::armor::Reader; use sequoia_openpgp::Cert; use sequoia_openpgp::parse::Parse; @@ -128,8 +129,8 @@ async fn get() -> anyhow::Result<()> { let addr = start_server(); let mut keyserver = KeyServer::new(&ctx, &format!("hkp://{}", addr))?; - let keyid = ID.parse()?; - let key = keyserver.get(&keyid).await?; + let keyid: KeyID = ID.parse()?; + let key = keyserver.get(keyid).await?; assert_eq!(key.fingerprint(), FP.parse().unwrap()); |