openpgp.rs

  1// Copyright (c) 2019 Maxime “pep” Buquet <pep@bouah.net>
  2//
  3// This Source Code Form is subject to the terms of the Mozilla Public
  4// License, v. 2.0. If a copy of the MPL was not distributed with this
  5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6
  7use crate::date::DateTime;
  8use crate::pubsub::PubSubPayload;
  9use crate::util::helpers::Base64;
 10
 11// TODO: Merge this container with the PubKey struct
 12generate_element!(
 13    /// Data contained in the PubKey element
 14    PubKeyData, "data", OX,
 15    text: (
 16        /// Base64 data
 17        data: Base64<Vec<u8>>
 18    )
 19);
 20
 21generate_element!(
 22    /// Pubkey element to be used in PubSub publish payloads.
 23    PubKey, "pubkey", OX,
 24    attributes: [
 25        /// Last updated date
 26        date: Option<DateTime> = "date"
 27    ],
 28    children: [
 29        /// Public key as base64 data
 30        data: Required<PubKeyData> = ("data", OX) => PubKeyData
 31    ]
 32);
 33
 34impl PubSubPayload for PubKey {}
 35
 36generate_element!(
 37    /// Public key metadata
 38    PubKeyMeta, "pubkey-metadata", OX,
 39    attributes: [
 40        /// OpenPGP v4 fingerprint
 41        v4fingerprint: Required<String> = "v4-fingerprint",
 42        /// Time the key was published or updated
 43        date: Required<DateTime> = "date",
 44    ]
 45);
 46
 47generate_element!(
 48    /// List of public key metadata
 49    PubKeysMeta, "public-key-list", OX,
 50    children: [
 51        /// Public keys
 52        pubkeys: Vec<PubKeyMeta> = ("pubkey-metadata", OX) => PubKeyMeta
 53    ]
 54);
 55
 56impl PubSubPayload for PubKeysMeta {}
 57
 58#[cfg(test)]
 59mod tests {
 60    use super::*;
 61    use crate::ns;
 62    use crate::pubsub::{
 63        pubsub::{Item as PubSubItem, Publish},
 64        Item, NodeName,
 65    };
 66    use crate::Element;
 67    use std::str::FromStr;
 68
 69    #[test]
 70    fn pubsub_publish_pubkey_data() {
 71        let pubkey = PubKey {
 72            date: None,
 73            data: PubKeyData {
 74                data: (&"Foo").as_bytes().to_vec(),
 75            },
 76        };
 77        println!("Foo1: {:?}", pubkey);
 78
 79        let pubsub = Publish {
 80            node: NodeName(format!("{}:{}", ns::OX_PUBKEYS, "some-fingerprint")),
 81            items: vec![PubSubItem(Item::new(None, None, Some(pubkey)))],
 82        };
 83        println!("Foo2: {:?}", pubsub);
 84    }
 85
 86    #[test]
 87    fn pubsub_publish_pubkey_meta() {
 88        let pubkeymeta = PubKeysMeta {
 89            pubkeys: vec![PubKeyMeta {
 90                v4fingerprint: "some-fingerprint".to_owned(),
 91                date: DateTime::from_str("2019-03-30T18:30:25Z").unwrap(),
 92            }],
 93        };
 94        println!("Foo1: {:?}", pubkeymeta);
 95
 96        let pubsub = Publish {
 97            node: NodeName("foo".to_owned()),
 98            items: vec![PubSubItem(Item::new(None, None, Some(pubkeymeta)))],
 99        };
100        println!("Foo2: {:?}", pubsub);
101    }
102
103    #[test]
104    fn test_serialize_pubkey() {
105        let reference: Element = "<pubkey xmlns='urn:xmpp:openpgp:0'><data>AAAA</data></pubkey>"
106            .parse()
107            .unwrap();
108
109        let pubkey = PubKey {
110            date: None,
111            data: PubKeyData {
112                data: b"\0\0\0".to_vec(),
113            },
114        };
115
116        let serialized: Element = pubkey.into();
117        assert_eq!(serialized, reference);
118    }
119}