diff options
| author | Teddy Wing | 2018-11-07 17:52:28 +0100 | 
|---|---|---|
| committer | Teddy Wing | 2018-11-07 17:52:28 +0100 | 
| commit | ab9345bbfc8683f877766f2ff9d33b7d49045770 (patch) | |
| tree | 8765ff2bbafca24e6324aa3abcad75cf5499e8e9 | |
| parent | 70dcef3a47c11f921d8d742b2e1667e178a90b8f (diff) | |
| download | dome-key-web-ab9345bbfc8683f877766f2ff9d33b7d49045770.tar.bz2 | |
AquaticPrime: Clean up `plist()`
Clean up the code from 70dcef3a47c11f921d8d742b2e1667e178a90b8f.
* Remove commented code
* Remove debug print statements
* Rename variables to make more sense
* Return the plist XML from the function
* Change `sign()` to take a `HashMap<String, String>` instead of
  `HashMap<&str, &str>` so we don't have to convert the deserialized
  `HashMap<String, String>` in `plist()`
| -rw-r--r-- | license-generator/aquatic-prime/src/lib.rs | 95 | 
1 files changed, 27 insertions, 68 deletions
| diff --git a/license-generator/aquatic-prime/src/lib.rs b/license-generator/aquatic-prime/src/lib.rs index 7aea16f..8c734fd 100644 --- a/license-generator/aquatic-prime/src/lib.rs +++ b/license-generator/aquatic-prime/src/lib.rs @@ -38,8 +38,8 @@ struct AquaticPrime<'a> {  }  impl<'a> AquaticPrime<'a> { -    fn sign(&self, input_data: HashMap<&str, &str>) -> Result<String> { -        let mut input_data: Vec<(&str, &str)> = input_data +    fn sign(&self, input_data: HashMap<String, String>) -> Result<String> { +        let mut input_data: Vec<(String, String)> = input_data              .into_iter()              .collect();          input_data.sort_unstable_by_key(|el| el.0.to_lowercase()); @@ -47,7 +47,7 @@ impl<'a> AquaticPrime<'a> {          let data = input_data              .into_iter()              .map(|(_k, v)| v) -            .collect::<Vec<&str>>() +            .collect::<Vec<String>>()              .concat();          let public_key = self.public_key.trim_left_matches("0x"); @@ -87,79 +87,35 @@ impl<'a> AquaticPrime<'a> {          Ok(base64::encode(&signature[..]))      } -    // TODO: Should take a plistable object as input -    // Serialize input_data to a Plist (input_data doesn't include signature field?) -    // Get the BTreeMap out and send it to sign() -    // Insert signature into Plist BTreeMap -    // Output plist string -    // -    // fn plist(&self, input_data: HashMap<&str, &str>) -> Result<String> {      fn plist<T: Serialize>(&self, input_data: T) -> Result<String> { -        // let signature = self.sign(input_data.clone()); -        // let mut data: BTreeMap<&str, &str> = input_data -        //     .into_iter() -        //     .collect(); -        // -        // data.insert(); -        // let mut tmp = String::with_capacity(600); -        let mut tmp = Vec::with_capacity(600); +        // Get input as `Plist` +        let mut xml_for_plist = Vec::with_capacity(600); -        plist::serde::serialize_to_xml(&mut tmp, &input_data).unwrap(); -        // let xml = String::from_utf8(tmp).unwrap(); +        plist::serde::serialize_to_xml(&mut xml_for_plist, &input_data).unwrap(); +        let xml_for_hash_map = xml_for_plist.clone(); -        // println!("Serialized: {}", xml); - -        // let le_plist: Plist = plist::serde::deserialize(Cursor::new(&tmp[..])).unwrap(); -        let tmp2 = tmp.clone(); -        let plist_data = Plist::read(Cursor::new(&tmp)).unwrap(); -        println!("{:?}", plist_data); +        let plist_data = Plist::read(Cursor::new(&xml_for_plist)).unwrap();          let mut plist_dict = plist_data.as_dictionary().unwrap().to_owned(); -        // let hash_data: BTreeMap<String, String> = data -        //     .into_iter() -        //     .map(|(k, v)| (k, String::from(v))) -        //     .collect(); - -        // let hash_data: BTreeMap<&str, &str> = data.into_iter().collect(); -        // self.sign(data); -        // data.insert(); - -        // let data_a = BTreeMap::new(); -        // for (k, v) in data.iter() { -        //     data_a.insert(k, String::from(v)); -        // } - -        let data: HashMap<String, String> = plist::serde::deserialize(Cursor::new(&tmp2)).unwrap(); -        println!("{:?}", data); -        let mut data_a = HashMap::new(); -        for (k, v) in data.iter() { -            data_a.insert(k.as_ref(), v.as_ref()); -        } - -        let signature = self.sign(data_a).unwrap(); -        println!("Signature: {}", signature); - -        // Re-serialise to Plist -        // Add signature as Data type +        // Get input as HashMap to send to `sign()` +        let data: HashMap<String, String> = plist::serde::deserialize(Cursor::new(&xml_for_hash_map)).unwrap(); +        let signature = self.sign(data).unwrap();          plist_dict.insert("Signature".to_owned(), Plist::Data(signature.into_bytes())); -        let mut tmp_return = Cursor::new(Vec::with_capacity(600)); -        // plist::serde::serialize_to_xml(&mut tmp_return, &plist_data).unwrap(); -        // println!("Output: {}", tmp_return); +        // Generate plist XML string +        let mut plist_xml = Cursor::new(Vec::with_capacity(600));          { -        let mut writer = plist::xml::EventWriter::new(&mut tmp_return); -        // let plist_plist = Plist::Dictionary(plist_data); -        for item in Plist::Dictionary(plist_dict).into_events() { -            writer.write(&item).unwrap(); -        } -        } +            let mut writer = plist::xml::EventWriter::new(&mut plist_xml); -        println!("Output: {}", String::from_utf8(tmp_return.into_inner()).unwrap()); +            for item in Plist::Dictionary(plist_dict).into_events() { +                writer.write(&item).unwrap(); +            } +        } -        Ok(String::new()) +        Ok(String::from_utf8(plist_xml.into_inner()).unwrap())      }  } @@ -179,8 +135,8 @@ mod tests {          };          let mut license_data = HashMap::new(); -        license_data.insert("Email", "user@email.com"); -        license_data.insert("Name", "User"); +        license_data.insert("Email".to_owned(), "user@email.com".to_owned()); +        license_data.insert("Name".to_owned(), "User".to_owned());          let signature = aquatic_prime.sign(license_data); @@ -192,9 +148,12 @@ mod tests {          let mut license_data = HashMap::new(); -        license_data.insert("Email", "user@email.com"); -        license_data.insert("Name", "Üsér Diacriticà"); -        license_data.insert("lowercase key", "Keys should be sorted case-insensitive"); +        license_data.insert("Email".to_owned(), "user@email.com".to_owned()); +        license_data.insert("Name".to_owned(), "Üsér Diacriticà".to_owned()); +        license_data.insert( +            "lowercase key".to_owned(), +            "Keys should be sorted case-insensitive".to_owned() +        );          let signature = aquatic_prime.sign(license_data); | 
