From 7d98970ebae679e86058c2ed1158df749d9f66d5 Mon Sep 17 00:00:00 2001 From: Leon Tan Date: Fri, 22 Feb 2019 22:37:01 +0100 Subject: [PATCH] Change Input of dp trait to use String --- src/database/fs.rs | 12 +++--------- src/database/memory.rs | 4 ++-- src/database/mod.rs | 29 ++++++++++++++++++++++++++--- src/database/poly.rs | 2 +- src/web/mod.rs | 2 ++ 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/database/fs.rs b/src/database/fs.rs index 3b21bf5..d306c3c 100644 --- a/src/database/fs.rs +++ b/src/database/fs.rs @@ -9,7 +9,7 @@ use tempfile; use url; use pathdiff::diff_paths; -use sequoia_openpgp::armor::{Writer, Kind}; +//use sequoia_openpgp::armor::{Writer, Kind}; use database::{Database, Delete, Verify}; use types::{Email, Fingerprint, KeyID}; @@ -178,7 +178,7 @@ impl Database for Filesystem { } fn update( - &self, fpr: &Fingerprint, new: Option<&[u8]>, + &self, fpr: &Fingerprint, new: Option, ) -> Result<()> { let target = self.path_to_fingerprint(fpr); let dir = self.base.join("scratch_pad"); @@ -190,13 +190,7 @@ impl Database for Filesystem { .rand_bytes(16) .tempfile_in(dir)?; - { - let mut armor_writer = Writer::new(&mut tmp, Kind::PublicKey, - &[][..])?; - - armor_writer.write_all(new)?; - } - + tmp.write_all(new.as_bytes()).unwrap(); let _ = tmp.persist(ensure_parent(&target)?)?; // fix permissions to 640 diff --git a/src/database/memory.rs b/src/database/memory.rs index cbaaf24..e412033 100644 --- a/src/database/memory.rs +++ b/src/database/memory.rs @@ -52,12 +52,12 @@ impl Database for Memory { } fn update( - &self, fpr: &Fingerprint, new: Option<&[u8]>, + &self, fpr: &Fingerprint, new: Option, ) -> Result<()> { let mut fprs = self.fpr.lock(); if let Some(new) = new { - fprs.insert(fpr.clone(), String::from_utf8_lossy(new).to_string()); + fprs.insert(fpr.clone(), new); } else { fprs.remove(fpr); } diff --git a/src/database/mod.rs b/src/database/mod.rs index 172e75d..179a2b2 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -9,6 +9,9 @@ use sequoia_openpgp::{ }; use sequoia_openpgp::PacketPile; +use std::io::Write; +use sequoia_openpgp::armor::{Writer, Kind}; + use serde::{Deserialize, Deserializer, Serializer}; use time; use types::{Email, Fingerprint, KeyID}; @@ -108,7 +111,7 @@ pub trait Database: Sync + Send { // // Note: it is up to the caller to serialize writes. fn update( - &self, fpr: &Fingerprint, new: Option<&[u8]>, + &self, fpr: &Fingerprint, new: Option, ) -> Result<()>; fn link_email(&self, email: &Email, fpr: &Fingerprint) -> Result<()>; @@ -271,7 +274,17 @@ pub trait Database: Sync + Send { } }; - self.update(&fpr, Some(&data))?; + let mut buf = std::io::Cursor::new(vec![]); + { + let mut armor_writer = Writer::new(&mut buf, Kind::PublicKey, + &[][..])?; + + armor_writer.write_all(&data)?; + }; + let armored = String::from_utf8_lossy(buf.get_ref()); + + + self.update(&fpr, Some(armored.into_owned()))?; self.link_subkeys(&fpr, subkeys)?; for email in verified_uids { @@ -308,7 +321,17 @@ pub trait Database: Sync + Send { .unwrap().into_children().collect::>(); let new = tpk.merge_packets(packet_pile).unwrap(); - self.update(&fpr, Some(&Self::tpk_into_bytes(&new).unwrap()))?; + + let mut buf = std::io::Cursor::new(vec![]); + { + let mut armor_writer = Writer::new(&mut buf, Kind::PublicKey, + &[][..])?; + + armor_writer.write_all(&Self::tpk_into_bytes(&new).unwrap())?; + }; + let armored = String::from_utf8_lossy(buf.get_ref()); + + self.update(&fpr, Some(armored.into_owned()))?; self.link_email(&email, &fpr)?; return Ok(Some((email.clone(), fpr.clone()))); } diff --git a/src/database/poly.rs b/src/database/poly.rs index a033706..83ccf00 100644 --- a/src/database/poly.rs +++ b/src/database/poly.rs @@ -31,7 +31,7 @@ impl Database for Polymorphic { } fn update( - &self, fpr: &Fingerprint, new: Option<&[u8]>, + &self, fpr: &Fingerprint, new: Option, ) -> Result<()> { match self { &Polymorphic::Memory(ref db) => { diff --git a/src/web/mod.rs b/src/web/mod.rs index b2e227c..1272a0a 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -313,6 +313,7 @@ fn key_to_hkp_index<'a>(armored: String) -> MyResponse { } MyResponse::plain(out) + } #[get("/by-fingerprint/")] @@ -463,6 +464,7 @@ fn files(file: PathBuf, static_dir: State) -> Option { fn lookup( db: rocket::State, domain: rocket::State, key: Option, ) -> MyResponse { + let (maybe_key, index) = match key { Some(queries::Hkp::Fingerprint { ref fpr, index }) => { (db.by_fpr(fpr), index)