1// Copyright (c) 2019 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
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 std::convert::TryFrom;
8use std::io::{self, Read};
9use std::env;
10use xmpp_parsers::{
11 Element,
12 disco::DiscoInfoResult,
13 caps::{Caps, compute_disco as compute_disco_caps, hash_caps},
14 ecaps2::{ECaps2, compute_disco as compute_disco_ecaps2, hash_ecaps2},
15 hashes::Algo,
16};
17
18fn get_caps(disco: &DiscoInfoResult, node: String) -> Result<Caps, String> {
19 let caps_data = compute_disco_caps(&disco);
20 let caps_hash = hash_caps(&caps_data, Algo::Sha_1)?;
21 Ok(Caps::new(node, caps_hash))
22}
23
24fn get_ecaps2(disco: &DiscoInfoResult) -> Result<ECaps2, String> {
25 let ecaps2_data = compute_disco_ecaps2(&disco).unwrap();
26 let ecaps2_sha256 = hash_ecaps2(&ecaps2_data, Algo::Sha_256)?;
27 let ecaps2_sha3_256 = hash_ecaps2(&ecaps2_data, Algo::Sha3_256)?;
28 Ok(ECaps2::new(vec![ecaps2_sha256, ecaps2_sha3_256]))
29}
30
31fn main() -> Result<(), ()> {
32 let args: Vec<_> = env::args().collect();
33 if args.len() != 2 {
34 println!("Usage: {} <node>", args[0]);
35 return Err(());
36 }
37 let node = args[1].clone();
38
39 eprintln!("Reading a disco#info payload from stdin...");
40
41 // Read from stdin.
42 let stdin = io::stdin();
43 let mut data = String::new();
44 let mut handle = stdin.lock();
45 handle.read_to_string(&mut data).unwrap();
46
47 // Parse the payload into a DiscoInfoResult.
48 let elem: Element = data.parse().unwrap();
49 let disco = DiscoInfoResult::try_from(elem).unwrap();
50
51 // Compute both kinds of caps.
52 let caps = get_caps(&disco, node).unwrap();
53 let ecaps2 = get_ecaps2(&disco).unwrap();
54
55 // Print them.
56 let caps_elem = Element::from(caps);
57 let ecaps2_elem = Element::from(ecaps2);
58 println!("{}", String::from(&caps_elem));
59 println!("{}", String::from(&ecaps2_elem));
60
61 Ok(())
62}