1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
use sequoia_openpgp as openpgp;
use openpgp::{
Cert,
Result,
armor,
parse::Parse,
serialize::Serialize,
};
use sequoia_autocrypt as autocrypt;
use crate::{
Config,
open_or_stdin,
};
pub fn dispatch(config: Config, m: &clap::ArgMatches) -> Result<()> {
match m.subcommand() {
Some(("decode", m)) => {
let input = open_or_stdin(m.value_of("input"))?;
let mut output =
config.create_or_stdout_pgp(m.value_of("output"),
m.is_present("binary"),
armor::Kind::PublicKey)?;
let ac = autocrypt::AutocryptHeaders::from_reader(input)?;
for h in &ac.headers {
if let Some(ref cert) = h.key {
cert.serialize(&mut output)?;
}
}
output.finalize()?;
},
Some(("encode-sender", m)) => {
let input = open_or_stdin(m.value_of("input"))?;
let mut output =
config.create_or_stdout_safe(m.value_of("output"))?;
let cert = Cert::from_reader(input)?;
let addr = m.value_of("address").map(|a| a.to_string())
.or_else(|| {
cert.with_policy(&config.policy, None)
.and_then(|vcert| vcert.primary_userid()).ok()
.map(|ca| ca.userid().to_string())
});
let ac = autocrypt::AutocryptHeader::new_sender(
&config.policy,
&cert,
&addr.ok_or_else(|| anyhow::anyhow!(
"No well-formed primary userid found, use \
--address to specify one"))?,
m.value_of("prefer-encrypt").expect("has default"))?;
write!(&mut output, "Autocrypt: ")?;
ac.serialize(&mut output)?;
},
_ => unreachable!(),
}
Ok(())
}
|