From e78bcf248fc50ce5b076488a3db9f551f1a5dbcd Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 20 Jun 2024 15:47:56 +0200 Subject: [PATCH] Port sq autocrypt's examples to the example framework. - Port `sq autocrypt`'s examples to the example framework. - See #196. --- src/cli/autocrypt.rs | 85 +++++++++---- src/cli/mod.rs | 3 +- tests/data/examples/autocrypt.eml | 203 ++++++++++++++++++++++++++++++ 3 files changed, 267 insertions(+), 24 deletions(-) create mode 100644 tests/data/examples/autocrypt.eml diff --git a/src/cli/autocrypt.rs b/src/cli/autocrypt.rs index 730e63b3..78f33754 100644 --- a/src/cli/autocrypt.rs +++ b/src/cli/autocrypt.rs @@ -7,6 +7,11 @@ use super::types::FileOrStdin; use super::types::FileOrStdout; use super::types::SessionKey; +use crate::cli::examples; +use examples::Action; +use examples::Actions; +use examples::Example; + #[derive(Parser, Debug)] #[clap( name = "autocrypt", @@ -36,6 +41,19 @@ pub enum Subcommands { EncodeSender(EncodeSenderCommand), } +const IMPORT_EXAMPLES: Actions = Actions { + actions: &[ + Action::Example(Example { + comment: "\ +Imports all certificates from a mail.", + command: &[ + "sq", "autocrypt", "import", "autocrypt.eml", + ], + }), + ] +}; +test_examples!(sq_autocrypt_import, IMPORT_EXAMPLES); + #[derive(Debug, Args)] #[clap( about = "Import Autocrypt-encoded certificates", @@ -44,11 +62,7 @@ pub enum Subcommands { Given a mail containing autocrypt headers (or an key-gossip headers), this command extracts and imports the certificates encoded within it. ", - after_help = "EXAMPLES: - -# Imports all certificates from a mail -$ sq autocrypt import autocrypt.eml -" + after_help = IMPORT_EXAMPLES, )] pub struct ImportCommand { #[clap( @@ -73,6 +87,19 @@ pub struct ImportCommand { pub input: FileOrStdin, } +const DECODE_EXAMPLES: Actions = Actions { + actions: &[ + Action::Example(Example { + comment: "\ +Extract all certificates from a mail.", + command: &[ + "sq", "autocrypt", "decode", "autocrypt.eml", + ], + }), + ] +}; +test_examples!(sq_autocrypt_decode, DECODE_EXAMPLES); + #[derive(Debug, Args)] #[clap( about = "Read Autocrypt-encoded certificates", @@ -83,11 +110,7 @@ extracts the certificate encoded within it. The converse operation is `sq autocrypt encode-sender`. ", - after_help = "EXAMPLES: - -# Extract all certificates from a mail -$ sq autocrypt decode autocrypt.eml -" + after_help = DECODE_EXAMPLES, )] pub struct DecodeCommand { #[clap( @@ -108,7 +131,35 @@ pub struct DecodeCommand { pub binary: bool, } -//#[derive(Subcommand)] +const ENCODE_SENDER_EXAMPLES: Actions = Actions { + actions: &[ + Action::Example(Example { + comment: "\ +Encodes a certificate.", + command: &[ + "sq", "autocrypt", "encode-sender", "juliet.pgp", + ], + }), + Action::Example(Example { + comment: "\ +Encodes a certificate with an explicit sender address.", + command: &[ + "sq", "autocrypt", "encode-sender", + "--email", "juliet@example.org", "juliet.pgp", + ], + }), + Action::Example(Example { + comment: "\ +Encodes a certificate while indicating the willingness to encrypt.", + command: &[ + "sq", "autocrypt", "encode-sender", + "--prefer-encrypt", "mutual", "juliet.pgp", + ], + }), + ] +}; +test_examples!(sq_autocrypt_encode_sender, ENCODE_SENDER_EXAMPLES); + #[derive(Debug, Args)] #[clap( name = "encode-sender", @@ -123,17 +174,7 @@ information). The converse operation is `sq autocrypt decode`. ", - after_help = "EXAMPLES: - -# Encodes a certificate -$ sq autocrypt encode-sender juliet.pgp - -# Encodes a certificate with an explicit sender address -$ sq autocrypt encode-sender --email juliet@example.org juliet.pgp - -# Encodes a certificate while indicating the willingness to encrypt -$ sq autocrypt encode-sender --prefer-encrypt mutual juliet.pgp -" + after_help = ENCODE_SENDER_EXAMPLES, )] pub struct EncodeSenderCommand { #[clap( diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 1a2d53e3..c351a15d 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -86,14 +86,13 @@ use std::time::Duration; use clap::{Command, CommandFactory, Parser, Subcommand}; use clap::builder::StyledStr; -pub mod autocrypt; - use sequoia_openpgp as openpgp; use openpgp::Fingerprint; #[macro_use] pub mod examples; +pub mod autocrypt; pub mod cert; pub mod decrypt; pub mod encrypt; diff --git a/tests/data/examples/autocrypt.eml b/tests/data/examples/autocrypt.eml new file mode 100644 index 00000000..30e3915b --- /dev/null +++ b/tests/data/examples/autocrypt.eml @@ -0,0 +1,203 @@ +Return-Path: +Delivered-To: teythoon@fump.uberspace.de +Received: (qmail 15250 invoked by uid 1114); 29 Jan 2024 11:21:46 -0000 +Delivered-To: teythoon-sequoia@teythoon.uber.space +Received: (qmail 15246 invoked by uid 989); 29 Jan 2024 11:21:46 -0000 +Received: from paddington.uberspace.de (paddington.uberspace.de [185.26.156.85]) + by fump.uberspace.de (Haraka/3.0.1) with ESMTPS id 55C892D2-DC4B-4400-8769-94317B144188.1 + envelope-from + tls TLS_DHE_RSA_WITH_AES_256_GCM_SHA384; + Mon, 29 Jan 2024 12:21:40 +0100 +Received: (qmail 12189 invoked by uid 1282); 29 Jan 2024 11:21:35 -0000 +Delivered-To: sequoia-justus@sequoia-pgp.org +Received: (qmail 12182 invoked by uid 500); 29 Jan 2024 11:21:35 -0000 +Received: from unknown (HELO unkown) (::1) + by paddington.uberspace.de (Haraka/3.0.1) with ESMTPSA; Mon, 29 Jan 2024 12:21:34 +0100 +Date: Mon, 29 Jan 2024 12:21:32 +0100 +From: Justus +To: Hilal Maria , + Justus Winter +Subject: Re: hioh +User-Agent: K-9 Mail for Android +In-Reply-To: <215356b8-8dfa-40ed-b23e-814e162aa516@probier.email> +References: <215356b8-8dfa-40ed-b23e-814e162aa516@probier.email> +Message-ID: +Autocrypt: addr=pink@probier.email; prefer-encrypt=mutual; keydata= + mQGNBGG1PiIBDAC5ubQK+nkpq2r+ywPzDcn2VCPhuX0h7ge+fsge29Ge//CNaH5jG846CucCnXfW + QoUT47Qsh8ItUXXXmtIjL+7ArOHR51U5aAEkUARvj9Zw8eGz0aZi3aD75AO0J30hfNDQXSy1JpXO + teTL44J6skZGqmrAsqWn2ZHiEbWfinGAxlEB/ZIee7iF7Yl6bFOshMFzKgpd+mSycQ48mYtfnL4r + 0HaJKZJ34JzSTlZH0q31hBj9YVCg6UttUl58h+bV7yLv4lQcoRHzNaLWzK9FjlD6/PM487V3KmlW + cdQTCiQb8Y6s9qvIYA+dt2z5ZSN7pPXv9LVWE2H+QsbfQJg7L8Yb7/ihi3DqaMVTKpsaXSVhZdqX + 0O5p5gdxCB2bwwwRiEFDL4Tp/Ztv81DbrhUsLsRKlZXkaDdznyi7hgRy6qEsiYhVgjLc9W5tTxYp + UTzaGU335wXY+wb08V/Xqo8bUV3EMFMkYtxTrFqvrZnAgGQxOGC44EeDEjU7pQHmPVqxZLcAEQEA + AbQScGlua0Bwcm9iaWVyLmVtYWlsiQGwBBMBCgAaBAsJCAcCFQoCFgECGQAFgmG1PiICngECmwMA + CgkQ3UFH/veK1jBQVgv/ZKDoHaloNBt37iM/yRAm8h1TETYVDGsRkPjEWmu8dIKkFMoemQHyGVbK + f91bjechTL5adLG63Bc7jatry04NwvoOIrX1co0askrPY3kXKiIKFxxuWqgYcIUXwpGhAbDDwLbZ + 9KAaKVcEnebF+fSEDvb8iPM+oF+c2bUYaHa6mXxDUiFh4zs6g/72XVjuf2d/gYi7kDQ6J/NxfJ94 + InQHFWGgOafZs5piuO9Ubd29lZMx61ROWJmqMS0BbaL9uIQqvNKYue117j4H+pAG9+MzZP9qPsB7 + UHfk2hwAsyP5P3iMfgECp9RBkJ78zKlacafT/0VDivQy98GcQsOMw2SJwCossDF3erpnxMxMIuDi + ZICxfFTsq0+ftU6tBTWOKzBeoUlC0WnduP+rvq8G4VxA9424p5BmcCJJBDAVMEncAGzV+iipdOIW + kLw0gkB0GO/0sWHKfmx3wXu4ydlw/YNL4vI2ce38wPzyhylbXbTLwHYMBc2+jwLNLAJbueUgL4Sl + uQGNBGG1PiIBDADGfiCdb6b3vhtzsFsq30ZhjdmcCBhTF2DoQYIQ3oYi0ASBQUDb10Bx4NzHbQTD + u7ywuTaP7Bs4wGSISmNY99Y/xhT37rkK5lBBoejBavNwQmpsk/8YUxqUF03D6260oUhL8LE1AoG6 + kNlvRPVUCiZY/BSkjJd3w9pMo4IEf61k4Chm+PHgDWFtKOX2C272EbwEoefPMNjZcwBJpVA+WYF8 + /wDUe55OVSWjL/+IgLh81L/AR9Fgs5GR95DwXvqCXj8avlMi0PzrbOuTa/VDoH6GqxnNwsRKI6U5 + OpcQIvNncFM0ZEIMb0yytVQ0Nnr6qb1L9kNCINtKaeFdbD/erJE6S/Vl0iyDIwFRU037pBjMCUp+ + oHGqn1tCkzS69X7Jcqx40bu5jqkZ4aq4J3+ZvQleu+YA8K1Bv0WGQREuf8OUb6EF1Ekt06LaOkV3 + tLWCyGhIB+KYcw8XA/TeVpiAziiCmHTc6PqeiHlgeIYemoF6/JOHxqe9lFzuYvV63TN3Q3sAEQEA + AYkBtgQYAQoACQWCYbU+IgKbDAAhCRDdQUf+94rWMBYhBKYUyR0Dktg+5rHEpN1BR/73itYwxPYM + AKmJmHtnoLwb46QY7WnZRoFJ0hKesuyL/on5mvpXxn2E/b/hfwU4CG28koRuEoN67BhEEQqT64Qo + RC3NNZmhd/7nHiAaaNOnusEDiReOgBtyZjK0YOt6BTQ4FR8/fNQHI476UugWhGdQMJRTnjrG0VcI + ZH5W3awmG7kTth7fQvM6bG5V96oocp6YW1X3O2UpVD5cj4OJvLX3zKO77MMMWhJApJaAi4KoanjW + Cr8yXoPUEwy9pC1RDzKGAVjLwTcnEVgic0f5xMbkF/FoLKwJCvgypqGyfLwN6tm+xjPg4nB+dDeq + HOYFZbv8hDMK4Z3dAkljMt6InA97oAy0DMnOBeQS9qCER3BVBJ2B/D/I1yl7G3VvbvYAIdZdMyqn + VPF4P922dmX7aimqrtDA/0iHObUqDFvTBtMCCmb/zu92/MGwSKCjQaH1g3mnzqGe9ML09zi4OXOs + HO/FJvk1WXi+LgKUqzlFTiMidqbrvSPTrlpVI9kUgMUTbf/ph6Xsr6tO2A== +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Type: multipart/encrypted; boundary="----CQ7LFIZB0YIJVS4GLSH9FSOOCUE5GD"; + protocol="application/pgp-encrypted" +Original-Authentication-Results: paddington.uberspace.de; + auth=pass (plain) +X-Rspamd-Bar: / +X-Rspamd-Report: R_DKIM_ALLOW(-0.2) MIME_GOOD(-0.2) FORGED_RECIPIENTS(1) ENCRYPTED_PGP(-0.5) R_SPF_ALLOW(-0.2) +X-Rspamd-Score: -0.099999 + +------CQ7LFIZB0YIJVS4GLSH9FSOOCUE5GD +Content-Type: application/pgp-encrypted +Content-Transfer-Encoding: quoted-printable + +Version: 1 +------CQ7LFIZB0YIJVS4GLSH9FSOOCUE5GD +Content-Type: application/octet-stream; name="encrypted.asc" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; filename="encrypted.asc" + +-----BEGIN PGP MESSAGE----- + +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 +qSem94uRIuWwTPICuYVIddB7pOMoege7RZ8= +=XFTZ +-----END PGP MESSAGE----- + +------CQ7LFIZB0YIJVS4GLSH9FSOOCUE5GD--