From 33ab75702500848921a1acb929b45adc07335af5 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Tue, 13 Apr 2021 20:41:34 +1200 Subject: [PATCH] Migrate to new age-plugin API --- Cargo.lock | 4 +- Cargo.toml | 4 +- src/main.rs | 1 + src/plugin.rs | 138 +++++++++++++++++--------------------------------- 4 files changed, 51 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1eab04d..6e6651f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,7 @@ dependencies = [ [[package]] name = "age-core" version = "0.5.0" -source = "git+https://github.com/str4d/rage.git?rev=a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb#a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb" +source = "git+https://github.com/str4d/rage.git?rev=4aa52a2dbb5feed86dcafa3afe8d554975ca5518#4aa52a2dbb5feed86dcafa3afe8d554975ca5518" dependencies = [ "base64", "c2-chacha", @@ -35,7 +35,7 @@ dependencies = [ [[package]] name = "age-plugin" version = "0.0.0" -source = "git+https://github.com/str4d/rage.git?rev=a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb#a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb" +source = "git+https://github.com/str4d/rage.git?rev=4aa52a2dbb5feed86dcafa3afe8d554975ca5518#4aa52a2dbb5feed86dcafa3afe8d554975ca5518" dependencies = [ "age-core", "bech32", diff --git a/Cargo.toml b/Cargo.toml index 0849b1c..ab6dc84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,5 +45,5 @@ flate2 = "1" man = "0.3" [patch.crates-io] -age-core = { git = "https://github.com/str4d/rage.git", rev = "a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb" } -age-plugin = { git = "https://github.com/str4d/rage.git", rev = "a9b5e88aa5816b284ebea23fc84d0203a3c4fdbb" } +age-core = { git = "https://github.com/str4d/rage.git", rev = "4aa52a2dbb5feed86dcafa3afe8d554975ca5518" } +age-plugin = { git = "https://github.com/str4d/rage.git", rev = "4aa52a2dbb5feed86dcafa3afe8d554975ca5518" } diff --git a/src/main.rs b/src/main.rs index 9d2069c..7080d18 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,7 @@ mod yubikey; use error::Error; +const PLUGIN_NAME: &str = "yubikey"; const BINARY_NAME: &str = "age-plugin-yubikey"; const RECIPIENT_PREFIX: &str = "age1yubikey"; const IDENTITY_PREFIX: &str = "age-plugin-yubikey-"; diff --git a/src/plugin.rs b/src/plugin.rs index 8e76b22..2dc014f 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -4,11 +4,10 @@ use age_plugin::{ recipient::{self, RecipientPluginV1}, Callbacks, }; -use bech32::{FromBase32, Variant}; use std::collections::HashMap; use std::io; -use crate::{format, p256::Recipient, yubikey, IDENTITY_PREFIX, RECIPIENT_PREFIX}; +use crate::{format, p256::Recipient, yubikey, PLUGIN_NAME}; #[derive(Debug, Default)] pub(crate) struct RecipientPlugin { @@ -17,75 +16,45 @@ pub(crate) struct RecipientPlugin { } impl RecipientPluginV1 for RecipientPlugin { - fn add_recipients<'a, I: Iterator>( + fn add_recipient( &mut self, - recipients: I, - ) -> Result<(), Vec> { - let errors: Vec<_> = recipients - .enumerate() - .filter_map(|(index, recipient)| { - if let Some(pk) = bech32::decode(recipient) - .ok() - .and_then(|(hrp, data, variant)| { - if hrp == RECIPIENT_PREFIX && variant == Variant::Bech32 { - Some(data) - } else { - None - } - }) - .and_then(|data| Vec::from_base32(&data).ok()) - .and_then(|bytes| Recipient::from_bytes(&bytes)) - { - self.recipients.push(pk); - None - } else { - Some(recipient::Error::Recipient { - index, - message: "Invalid recipient".to_owned(), - }) - } - }) - .collect(); - if errors.is_empty() { + index: usize, + plugin_name: &str, + bytes: &[u8], + ) -> Result<(), recipient::Error> { + if let Some(pk) = if plugin_name == PLUGIN_NAME { + Recipient::from_bytes(&bytes) + } else { + None + } { + self.recipients.push(pk); Ok(()) } else { - Err(errors) + Err(recipient::Error::Recipient { + index, + message: "Invalid recipient".to_owned(), + }) } } - fn add_identities<'a, I: Iterator>( + fn add_identity( &mut self, - identities: I, - ) -> Result<(), Vec> { - let errors: Vec<_> = identities - .enumerate() - .filter_map(|(index, identity)| { - if let Some(stub) = bech32::decode(identity) - .ok() - .and_then(|(hrp, data, variant)| { - if hrp == IDENTITY_PREFIX.to_lowercase() && variant == Variant::Bech32 { - Some(data) - } else { - None - } - }) - .and_then(|data| Vec::from_base32(&data).ok()) - .and_then(|bytes| yubikey::Stub::from_bytes(&bytes, index)) - { - self.yubikeys.push(stub); - None - } else { - Some(recipient::Error::Identity { - index, - message: "Invalid Yubikey stub".to_owned(), - }) - } - }) - .collect(); - if errors.is_empty() { + index: usize, + plugin_name: &str, + bytes: &[u8], + ) -> Result<(), recipient::Error> { + if let Some(stub) = if plugin_name == PLUGIN_NAME { + yubikey::Stub::from_bytes(&bytes, index) + } else { + None + } { + self.yubikeys.push(stub); Ok(()) } else { - Err(errors) + Err(recipient::Error::Identity { + index, + message: "Invalid Yubikey stub".to_owned(), + }) } } @@ -135,39 +104,24 @@ pub(crate) struct IdentityPlugin { } impl IdentityPluginV1 for IdentityPlugin { - fn add_identities<'a, I: Iterator>( + fn add_identity( &mut self, - identities: I, - ) -> Result<(), Vec> { - let errors: Vec<_> = identities - .enumerate() - .filter_map(|(index, identity)| { - if let Some(stub) = bech32::decode(identity) - .ok() - .and_then(|(hrp, data, variant)| { - if hrp == IDENTITY_PREFIX.to_lowercase() && variant == Variant::Bech32 { - Some(data) - } else { - None - } - }) - .and_then(|data| Vec::from_base32(&data).ok()) - .and_then(|bytes| yubikey::Stub::from_bytes(&bytes, index)) - { - self.yubikeys.push(stub); - None - } else { - Some(identity::Error::Identity { - index, - message: "Invalid Yubikey stub".to_owned(), - }) - } - }) - .collect(); - if errors.is_empty() { + index: usize, + plugin_name: &str, + bytes: &[u8], + ) -> Result<(), identity::Error> { + if let Some(stub) = if plugin_name == PLUGIN_NAME { + yubikey::Stub::from_bytes(&bytes, index) + } else { + None + } { + self.yubikeys.push(stub); Ok(()) } else { - Err(errors) + Err(identity::Error::Identity { + index, + message: "Invalid Yubikey stub".to_owned(), + }) } }