Struct sequoia_openpgp::message::Message
source · pub struct Message { /* private fields */ }
Expand description
A message.
An OpenPGP message is a structured sequence of OpenPGP packets. Basically, it’s an optionally encrypted, optionally signed literal data packet. The exact structure is defined in Section 11.3 of RFC 4880.
ASCII Armored Messages are wrapped in -----BEGIN PGP MESSAGE-----
header
and -----END PGP MESSAGE-----
tail lines:
-----BEGIN PGP MESSAGE-----
xA0DAAoW5saJekzviSQByxBiAAAAAADYtdiv2KfZgtipwnUEABYKACcFglwJHYoW
IQRnpIdTo4Cms7fffcXmxol6TO+JJAkQ5saJekzviSQAAIJ6APwK6FxtHXn8txDl
tBFsIXlOSLOs4BvArlZzZSMomIyFLAEAwCLJUChMICDxWXRlHxORqU5x6hlO3DdW
sl/1DAbnRgI=
=AqoO
-----END PGP MESSAGE-----
§Examples
Creating a Message encrypted with a password.
use std::io::Write;
use openpgp::serialize::stream::{Message, Encryptor, LiteralWriter};
let mut sink = vec![];
let message = Encryptor::with_passwords(
Message::new(&mut sink), Some("ściśle tajne")).build()?;
let mut w = LiteralWriter::new(message).build()?;
w.write_all(b"Hello world.")?;
w.finalize()?;
Implementations§
source§impl Message
impl Message
sourcepub fn body(&self) -> Option<&Literal>
pub fn body(&self) -> Option<&Literal>
Returns the body of the message.
Returns None
if no literal data packet is found. This
happens if a SEIP container has not been decrypted.
§Examples
use std::io;
use std::io::Read;
use openpgp::Message;
use openpgp::armor::{Reader, ReaderMode};
use openpgp::parse::Parse;
let data = "yxJiAAAAAABIZWxsbyB3b3JsZCE="; // base64 over literal data packet
let mut cursor = io::Cursor::new(&data);
let mut reader = Reader::from_reader(&mut cursor, ReaderMode::VeryTolerant);
let mut buf = Vec::new();
reader.read_to_end(&mut buf)?;
let message = Message::from_bytes(&buf)?;
assert_eq!(message.body().unwrap().body(), b"Hello world!");
Methods from Deref<Target = PacketPile>§
sourcepub fn pretty_print(&self)
pub fn pretty_print(&self)
Pretty prints the message to stderr.
This function is primarily intended for debugging purposes.
sourcepub fn path_ref(&self, pathspec: &[usize]) -> Option<&Packet>
pub fn path_ref(&self, pathspec: &[usize]) -> Option<&Packet>
Returns a reference to the packet at the location described by
pathspec
.
pathspec
is a slice of the form [0, 1, 2]
. Each element
is the index of packet in a container. Thus, the previous
path specification means: return the third child of the second
child of the first top-level packet. In other words, the
starred packet in the following tree:
PacketPile
/ | \
0 1 2 ...
/ \
/ \
0 1 ...
/ | \ ...
0 1 2
*
And, [10]
means return the 11th top-level packet.
Note: there is no packet at the root. Thus, the path []
returns None.
§Examples
let pile = PacketPile::from(packets);
if let Some(packet) = pile.path_ref(&[0]) {
// There is a packet at this path.
}
if let None = pile.path_ref(&[0, 1, 2]) {
// But none here.
}
sourcepub fn descendants(&self) -> Iter<'_> ⓘ
pub fn descendants(&self) -> Iter<'_> ⓘ
Returns an iterator over all of the packet’s descendants, in depth-first order.
let mut lit = Literal::new(DataFormat::Text);
lit.set_body(b"test".to_vec());
let pile = PacketPile::from(vec![lit.into()]);
for packet in pile.descendants() {
assert_eq!(packet.tag(), Tag::Literal);
}
sourcepub fn children(
&self,
) -> impl Iterator<Item = &Packet> + ExactSizeIterator + Send + Sync
pub fn children( &self, ) -> impl Iterator<Item = &Packet> + ExactSizeIterator + Send + Sync
Returns an iterator over the top-level packets.
let mut lit = Literal::new(DataFormat::Text);
lit.set_body(b"test".to_vec());
let pile = PacketPile::from(vec![lit.into()]);
assert_eq!(pile.children().len(), 1);
Trait Implementations§
source§impl From<Message> for PacketPile
impl From<Message> for PacketPile
source§impl MarshalInto for Message
impl MarshalInto for Message
source§fn serialized_len(&self) -> usize
fn serialized_len(&self) -> usize
source§fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
source§impl<'a> Parse<'a, Message> for Message
impl<'a> Parse<'a, Message> for Message
source§fn from_buffered_reader<R>(reader: R) -> Result<Message>where
R: BufferedReader<Cookie> + 'a,
fn from_buffered_reader<R>(reader: R) -> Result<Message>where
R: BufferedReader<Cookie> + 'a,
Reads a Message
from the specified reader.
See Message::try_from
for more details.
source§fn from_reader<R: 'a + Read + Send + Sync>(reader: R) -> Result<Self>
fn from_reader<R: 'a + Read + Send + Sync>(reader: R) -> Result<Self>
Reads a Message
from the specified reader.
See Message::try_from
for more details.
source§impl PartialEq for Message
impl PartialEq for Message
source§impl SerializeInto for Message
impl SerializeInto for Message
source§fn serialized_len(&self) -> usize
fn serialized_len(&self) -> usize
source§fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
source§impl TryFrom<PacketPile> for Message
impl TryFrom<PacketPile> for Message
source§fn try_from(pile: PacketPile) -> Result<Self>
fn try_from(pile: PacketPile) -> Result<Self>
Converts the PacketPile
to a Message
.
Converting a PacketPile
to a Message
doesn’t change the
packets; it asserts that the packet sequence is an optionally
encrypted, optionally signed, optionally compressed literal
data packet. The exact grammar is defined in Section 11.3 of
RFC 4880.
Caveats: this function assumes that any still encrypted parts or still compressed parts are valid messages.