From 691d567d315be12b988697430785226477a302ac Mon Sep 17 00:00:00 2001 From: Aiden McClelland Date: Thu, 27 Jan 2022 20:14:18 -0700 Subject: [PATCH] attach api and better pubkey serialization --- backend/src/db/model.rs | 1 + backend/src/lib.rs | 1 + backend/src/util/serde.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/backend/src/db/model.rs b/backend/src/db/model.rs index d8bd4709b..dc0f041d2 100644 --- a/backend/src/db/model.rs +++ b/backend/src/db/model.rs @@ -255,6 +255,7 @@ pub struct InstalledPackageDataEntry { pub status: Status, pub marketplace_url: Option, #[serde(default)] + #[serde(with = "crate::util::serde::ed25519_pubkey")] pub developer_key: ed25519_dalek::PublicKey, #[model] pub manifest: Manifest, diff --git a/backend/src/lib.rs b/backend/src/lib.rs index 15d850956..87f695c5d 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -69,6 +69,7 @@ pub fn echo(#[arg] message: String) -> Result { disk::disk, notifications::notification, backup::backup, + marketplace::marketplace, ))] pub fn main_api() -> Result<(), RpcError> { Ok(()) diff --git a/backend/src/util/serde.rs b/backend/src/util/serde.rs index a8999656b..59b78be91 100644 --- a/backend/src/util/serde.rs +++ b/backend/src/util/serde.rs @@ -96,6 +96,40 @@ pub fn serialize_display_opt( Option::::serialize(&t.as_ref().map(|t| t.to_string()), serializer) } +pub mod ed25519_pubkey { + use ed25519_dalek::PublicKey; + use serde::de::{Error, Unexpected, Visitor}; + use serde::{Deserializer, Serializer}; + + pub fn serialize(pubkey: &PublicKey, serializer: S) -> Result { + serializer.serialize_str(&base32::encode( + base32::Alphabet::RFC4648 { padding: true }, + pubkey.as_bytes(), + )) + } + pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + struct PubkeyVisitor; + impl<'de> Visitor<'de> for PubkeyVisitor { + type Value = ed25519_dalek::PublicKey; + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "an RFC4648 encoded string") + } + fn visit_str(self, v: &str) -> Result + where + E: Error, + { + PublicKey::from_bytes( + &base32::decode(base32::Alphabet::RFC4648 { padding: true }, v).ok_or( + Error::invalid_value(Unexpected::Str(v), &"an RFC4648 encoded string"), + )?, + ) + .map_err(Error::custom) + } + } + deserializer.deserialize_str(PubkeyVisitor) + } +} + #[derive(Debug, Serialize)] #[serde(untagged)] pub enum ValuePrimative {