diff --git a/Cargo.toml b/Cargo.toml index d707f86a..2eee1fcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "crates/plugins/did-endpoint", "crates/plugins/mediator-coordination", "crates/plugins/oob-messages", + "crates/database", ] @@ -24,6 +25,7 @@ plugin-api = { path = "./crates/plugin-api", version = "0.1.0" } did-endpoint = { path = "./crates/plugins/did-endpoint", version = "0.1.0" } oob-messages = { path = "./crates/plugins/oob-messages", version = "0.1.0" } mediator-coordination = { path = "./crates/plugins/mediator-coordination", version = "0.1.0" } +database = { path = "./crates/database", version = "0.1.0" } # Other common dependencies serde = "1.0" diff --git a/crates/database/Cargo.toml b/crates/database/Cargo.toml new file mode 100644 index 00000000..9203a02a --- /dev/null +++ b/crates/database/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "database" +version = "0.1.0" +edition = "2021" + +[dependencies] +mongodb.workspace = true +async-trait.workspace = true +serde.workspace = true +serde_json.workspace = true +thiserror.workspace = true + diff --git a/crates/plugins/mediator-coordination/src/repository/traits.rs b/crates/database/src/lib.rs similarity index 81% rename from crates/plugins/mediator-coordination/src/repository/traits.rs rename to crates/database/src/lib.rs index a2c71f5d..5baa5e18 100644 --- a/crates/plugins/mediator-coordination/src/repository/traits.rs +++ b/crates/database/src/lib.rs @@ -1,11 +1,12 @@ use async_trait::async_trait; -use mongodb::bson::{oid::ObjectId, Document as BsonDocument}; +use mongodb::{ + bson::{oid::ObjectId, Document as BsonDocument}, + error::Error as MongoError, +}; use serde::{Deserialize, Serialize}; use thiserror::Error; - /// A trait representing an abstract resource. /// Any type implementing this trait should also implement `Serialize`. -pub trait Entity: Sized + Serialize {} /// Definition of custom errors for repository operations #[derive(Debug, Serialize, Deserialize, Error)] @@ -22,7 +23,10 @@ pub enum RepositoryError { /// Definition of a trait for repository operations #[async_trait] -pub trait Repository: Sync + Send { +pub trait Repository: Sync + Send +where + Entity: Sized + Serialize, +{ /// Retrieves all entities. async fn find_all(&self) -> Result, RepositoryError>; @@ -41,3 +45,9 @@ pub trait Repository: Sync + Send { /// Deletes a single entity by its identifier. async fn delete_one(&self, entity_id: ObjectId) -> Result<(), RepositoryError>; } + +impl From for RepositoryError { + fn from(error: MongoError) -> Self { + RepositoryError::Generic(error.to_string()) + } +} diff --git a/crates/did-utils/examples/dsa-verify-with-jwk.rs b/crates/did-utils/examples/dsa-verify-with-jwk.rs index f1ed62b6..69cb6428 100644 --- a/crates/did-utils/examples/dsa-verify-with-jwk.rs +++ b/crates/did-utils/examples/dsa-verify-with-jwk.rs @@ -1,6 +1,6 @@ use did_utils::{ - crypto::{Ed25519KeyPair, CoreSign}, - jwk::Jwk + crypto::{CoreSign, Ed25519KeyPair}, + jwk::Jwk, }; use multibase::Base::Base64Url; diff --git a/crates/did-utils/examples/ed25519-sign.rs b/crates/did-utils/examples/ed25519-sign.rs index 7ae2516b..24e947ef 100644 --- a/crates/did-utils/examples/ed25519-sign.rs +++ b/crates/did-utils/examples/ed25519-sign.rs @@ -1,6 +1,7 @@ extern crate did_utils; -use did_utils::crypto::{Ed25519KeyPair, {Generate, CoreSign}}; - +use did_utils::crypto::{ + Ed25519KeyPair, {CoreSign, Generate}, +}; fn main() { let keypair = Ed25519KeyPair::new().unwrap(); @@ -11,6 +12,6 @@ fn main() { let signature = keypair.sign(json_data.as_bytes()).unwrap(); // Verify the signature - let verified = keypair.verify(json_data.as_bytes(), &signature); + let verified = keypair.verify(json_data.as_bytes(), &signature); assert!(verified.is_ok()); } diff --git a/crates/did-utils/examples/multibase.rs b/crates/did-utils/examples/multibase.rs index 8806de9a..ea52c746 100644 --- a/crates/did-utils/examples/multibase.rs +++ b/crates/did-utils/examples/multibase.rs @@ -3,7 +3,9 @@ extern crate did_utils; use multibase::Base; fn main() { - let public_key = [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]; + let public_key = [ + 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, + ]; let base58_public_key = Base::Base58Btc.encode(public_key); diff --git a/crates/did-utils/src/crypto/alg.rs b/crates/did-utils/src/crypto/alg.rs index a7402d66..3ac78bb0 100644 --- a/crates/did-utils/src/crypto/alg.rs +++ b/crates/did-utils/src/crypto/alg.rs @@ -5,9 +5,9 @@ use crate::{ jwk::{Bytes, Ec, EcCurves, Jwk, Key, Okp, OkpCurves, Parameters}, }; +use multibase::Base::Base58Btc; use serde::{Deserialize, Serialize}; use thiserror::Error; -use multibase::Base::Base58Btc; /// Supported cryptographic algorithms. #[derive(Debug, Copy, Clone, PartialEq)] @@ -249,8 +249,8 @@ pub(crate) fn decode_multikey(multikey: &str) -> Result<(Algorithm, Vec), De #[cfg(test)] mod tests { use super::*; - use serde_json::Value; use multibase::Base::Base64Url; + use serde_json::Value; #[test] fn test_can_build_secp256k1_jwk() { diff --git a/crates/did-utils/src/crypto/errors.rs b/crates/did-utils/src/crypto/errors.rs index af0ecedb..d3575bc8 100644 --- a/crates/did-utils/src/crypto/errors.rs +++ b/crates/did-utils/src/crypto/errors.rs @@ -14,4 +14,4 @@ pub enum Error { InvalidCall(String), Unsupported, Unknown(String), -} \ No newline at end of file +} diff --git a/crates/did-utils/src/crypto/mod.rs b/crates/did-utils/src/crypto/mod.rs index 16b9633e..89c175fa 100644 --- a/crates/did-utils/src/crypto/mod.rs +++ b/crates/did-utils/src/crypto/mod.rs @@ -52,7 +52,7 @@ pub use ed25519::Ed25519KeyPair; pub use errors::Error; pub use format::PublicKeyFormat; pub use sha256_hash::{sha256_hash, sha256_multihash}; -pub use traits::{CoreSign, Generate, KeyMaterial, ToPublic, ToMultikey, BYTES_LENGTH_32, ECDH}; +pub use traits::{CoreSign, Generate, KeyMaterial, ToMultikey, ToPublic, BYTES_LENGTH_32, ECDH}; pub use x25519::X25519KeyPair; /// A wrapper struct for an asymmetric key pair. diff --git a/crates/did-utils/src/crypto/sha256_hash.rs b/crates/did-utils/src/crypto/sha256_hash.rs index bfb98b18..3ccc14a8 100644 --- a/crates/did-utils/src/crypto/sha256_hash.rs +++ b/crates/did-utils/src/crypto/sha256_hash.rs @@ -21,16 +21,16 @@ pub fn sha256_hash(bytes: &[u8]) -> [u8; 32] { hash.as_slice()[..32].try_into().unwrap() } -/// Compute SHA256 hash of a given input and return it as a multibase-encoded string. - /// - /// # Example - /// - /// ```rust - /// use did_utils::crypto::sha256_multihash; - /// - /// let bytes = b"Hello, world!"; - /// let hash = sha256_multihash(bytes); - /// ``` +/// Compute SHA256 hash of a given input and return it as a multibase-encoded string. +/// +/// # Example +/// +/// ```rust +/// use did_utils::crypto::sha256_multihash; +/// +/// let bytes = b"Hello, world!"; +/// let hash = sha256_multihash(bytes); +/// ``` pub fn sha256_multihash(bytes: &[u8]) -> String { const MULTIHASH_CODE: u8 = 0x12; const MULTIHASH_SIZE: u8 = 0x20; @@ -59,7 +59,7 @@ mod tests { 0x31, 0x5f, 0x5b, 0xdb, 0x76, 0xd0, 0x78, 0xc4, 0x3b, 0x8a, 0xc0, 0x06, 0x4e, 0x4a, 0x01, 0x64, // 0x61, 0x2b, 0x1f, 0xce, 0x77, 0xc8, 0x69, 0x34, 0x5b, 0xfc, 0x94, 0xc7, 0x58, 0x94, 0xed, 0xd3, // ]; - + // Compute the hash of the input bytes let hash = sha256_hash(bytes); diff --git a/crates/did-utils/src/crypto/traits.rs b/crates/did-utils/src/crypto/traits.rs index 8741b6e9..a35a9394 100644 --- a/crates/did-utils/src/crypto/traits.rs +++ b/crates/did-utils/src/crypto/traits.rs @@ -82,7 +82,7 @@ pub trait ECDH { /// A trait for converting a key to its public counterpart. pub trait ToPublic { /// Converts the key to its public counterpart. - /// + /// /// This method returns a new instance of the key with any private information removed. /// The returned key contains only the public key components. fn to_public(&self) -> Self; diff --git a/crates/did-utils/src/crypto/utils.rs b/crates/did-utils/src/crypto/utils.rs index 405d5502..427de550 100644 --- a/crates/did-utils/src/crypto/utils.rs +++ b/crates/did-utils/src/crypto/utils.rs @@ -44,9 +44,8 @@ pub(super) fn generate_seed(initial_seed: &[u8]) -> Result<[u8; BYTES_LENGTH_32] /// /// Panics if the length of the slice is not equal to `BYTES_LENGTH_32`. pub(super) fn clone_slice_to_array(slice: &[u8; BYTES_LENGTH_32]) -> [u8; BYTES_LENGTH_32] { - let mut array = [0u8; BYTES_LENGTH_32]; array.clone_from_slice(slice); array -} \ No newline at end of file +} diff --git a/crates/did-utils/src/didcore.rs b/crates/did-utils/src/didcore.rs index 98574c04..2e3a7e1f 100644 --- a/crates/did-utils/src/didcore.rs +++ b/crates/did-utils/src/didcore.rs @@ -1,5 +1,5 @@ //! Implements the DID Core specification -//! +//! //! As specified by [Decentralized Identifiers (DIDs) v1.0 - Core architecture, //! data model, and representations][did-core]. //! @@ -16,7 +16,7 @@ use crate::{jwk::Jwk, ldmodel::Context, proof::Proof}; // === Structure of a did document === /// Represents a DID Document according to the [DID Core specification][did-core]. -/// +/// /// [did-core]: https://www.w3.org/TR/did-core/ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] #[serde(rename_all = "camelCase")] @@ -78,13 +78,13 @@ pub struct Document { pub proof: Option, } -impl Default for Document { - fn default() -> Self { - let id = String::new(); - let context = Context::SingleString(String::from("https://www.w3.org/ns/did/v1")); - - Self::new(context, id) - } +impl Default for Document { + fn default() -> Self { + let id = String::new(); + let context = Context::SingleString(String::from("https://www.w3.org/ns/did/v1")); + + Self::new(context, id) + } } /// Represents a DID Document controller(s). @@ -96,9 +96,9 @@ pub enum Controller { } /// Represents a [service] in a DID Document. -/// +/// /// A service defines how to interact with the DID subject. -/// +/// /// [service]: https://www.w3.org/TR/did-core/#services #[derive(Serialize, Debug, Clone, PartialEq, Deserialize, Default)] #[serde(rename_all = "camelCase")] @@ -118,7 +118,7 @@ pub struct Service { } /// Represents a [verification method] in a DID Document. -/// +/// /// [verification method]: https://www.w3.org/TR/did-core/#verification-methods #[derive(Serialize, Debug, Clone, PartialEq, Default, Deserialize)] pub struct VerificationMethod { @@ -200,7 +200,6 @@ pub enum KeyAgreement { } impl VerificationMethod { - /// Serializes the private key format into a JSON map with the appropriate key format field. fn serialize_private_key_format(value: &Option, serializer: S) -> Result where diff --git a/crates/did-utils/src/didkit.rs b/crates/did-utils/src/didkit.rs index 2ec0fc18..888c1adf 100644 --- a/crates/did-utils/src/didkit.rs +++ b/crates/did-utils/src/didkit.rs @@ -1,8 +1,9 @@ -use crate::{didcore::{Document, VerificationMethod, Authentication, AssertionMethod, KeyAgreement, Service}, ldmodel::Context}; - +use crate::{ + didcore::{AssertionMethod, Authentication, Document, KeyAgreement, Service, VerificationMethod}, + ldmodel::Context, +}; impl VerificationMethod { - /// Creates a new `VerificationMethod` instance. /// /// # Arguments @@ -28,7 +29,6 @@ impl VerificationMethod { } impl Service { - /// Creates a new `Service` instance. /// /// # Arguments @@ -123,9 +123,11 @@ impl Document { #[cfg(test)] pub mod tests { - use crate::crypto::{Ed25519KeyPair, {Generate, KeyMaterial}}; - use crate::didcore::KeyFormat::Multibase; use super::*; + use crate::crypto::{ + Ed25519KeyPair, {Generate, KeyMaterial}, + }; + use crate::didcore::KeyFormat::Multibase; use multibase::Base::Base58Btc; #[test] @@ -134,40 +136,47 @@ pub mod tests { let id = "did:example:123456789abcdefghi".to_string(); let document = Document::new(context, id); let canonicalized = json_canon::to_string(&document).unwrap(); - assert_eq!(canonicalized, r#"{"@context":"https://www.w3.org/ns/did/v1","id":"did:example:123456789abcdefghi"}"#); + assert_eq!( + canonicalized, + r#"{"@context":"https://www.w3.org/ns/did/v1","id":"did:example:123456789abcdefghi"}"# + ); } #[test] fn test_document_new_full() { let context = Context::SingleString("https://www.w3.org/ns/did/v1".to_owned()); let id = "did:example:123456789abcdefghi".to_string(); - + // Generate key for verification method let my_string = String::from("Sample seed bytes of thirtytwo!b"); let seed: &[u8] = my_string.as_bytes(); let eddsa_key_pair = Ed25519KeyPair::new_with_seed(seed).unwrap(); let ecdh_key_pair = eddsa_key_pair.get_x25519().unwrap(); - let mut private_eddsa_vm = VerificationMethod::new("did:example:123456789abcdefghi#keys-1".to_string(), - "Ed25519VerificationKey2018".to_string(), - "did:example:123456789abcdefghi".to_string()); + let mut private_eddsa_vm = VerificationMethod::new( + "did:example:123456789abcdefghi#keys-1".to_string(), + "Ed25519VerificationKey2018".to_string(), + "did:example:123456789abcdefghi".to_string(), + ); let mut public_eddsa_vm = private_eddsa_vm.clone(); - let eddsa_private_key_multibase = multibase::encode(Base58Btc, eddsa_key_pair.private_key_bytes().unwrap()); + let eddsa_private_key_multibase = multibase::encode(Base58Btc, eddsa_key_pair.private_key_bytes().unwrap()); private_eddsa_vm.private_key = Some(Multibase(eddsa_private_key_multibase)); - - let eddsa_public_key_multibase = multibase::encode(Base58Btc, eddsa_key_pair.public_key_bytes().unwrap()); + + let eddsa_public_key_multibase = multibase::encode(Base58Btc, eddsa_key_pair.public_key_bytes().unwrap()); public_eddsa_vm.public_key = Some(Multibase(eddsa_public_key_multibase)); - let mut private_ecdh_vm = VerificationMethod::new("did:example:123456789abcdefghi#keys-2".to_string(), - "X25519KeyAgreementKey2019".to_string(), - "did:example:123456789abcdefghi".to_string()); + let mut private_ecdh_vm = VerificationMethod::new( + "did:example:123456789abcdefghi#keys-2".to_string(), + "X25519KeyAgreementKey2019".to_string(), + "did:example:123456789abcdefghi".to_string(), + ); let mut public_ecdh_vm = private_ecdh_vm.clone(); - let ecdh_private_key_multibase = multibase::encode(Base58Btc, ecdh_key_pair.private_key_bytes().unwrap()); + let ecdh_private_key_multibase = multibase::encode(Base58Btc, ecdh_key_pair.private_key_bytes().unwrap()); private_ecdh_vm.private_key = Some(Multibase(ecdh_private_key_multibase)); - - let ecdh_public_key_multibase = multibase::encode(Base58Btc, ecdh_key_pair.public_key_bytes().unwrap()); + + let ecdh_public_key_multibase = multibase::encode(Base58Btc, ecdh_key_pair.public_key_bytes().unwrap()); public_ecdh_vm.public_key = Some(Multibase(ecdh_public_key_multibase)); let private_verification_method = Some(vec![private_eddsa_vm, private_ecdh_vm]); @@ -177,21 +186,39 @@ pub mod tests { let assertion_method = Some(vec![AssertionMethod::Reference("did:example:123456789abcdefghi#keys-1".to_string())]); let key_agreement = Some(vec![KeyAgreement::Reference("did:example:123456789abcdefghi#keys-2".to_string())]); - let srv = Service::new("did:example:123456789abcdefghi#keys-1".to_string(), - "did-communication".to_string(), - "https://example.com".to_string()); + let srv = Service::new( + "did:example:123456789abcdefghi#keys-1".to_string(), + "did-communication".to_string(), + "https://example.com".to_string(), + ); let service = Some(vec![srv]); - let private_document = Document::new_full(context.clone(), id.clone(), authentication.clone(), assertion_method.clone(), key_agreement.clone(), private_verification_method, service.clone()); - let public_document = Document::new_full(context, id, authentication, assertion_method, key_agreement, public_verification_method, service); + let private_document = Document::new_full( + context.clone(), + id.clone(), + authentication.clone(), + assertion_method.clone(), + key_agreement.clone(), + private_verification_method, + service.clone(), + ); + let public_document = Document::new_full( + context, + id, + authentication, + assertion_method, + key_agreement, + public_verification_method, + service, + ); let canonicalized_private_document = json_canon::to_string(&private_document).unwrap(); let canonicalized_public_document = json_canon::to_string(&public_document).unwrap(); - + let expected_private_document = std::fs::read_to_string("test_resources/didkit_test_document_new_full_private.json").unwrap(); let expected_public_document = std::fs::read_to_string("test_resources/didkit_test_document_new_full_public.json").unwrap(); assert_eq!(expected_private_document, canonicalized_private_document); assert_eq!(expected_public_document, canonicalized_public_document); } -} \ No newline at end of file +} diff --git a/crates/did-utils/src/jwk/mod.rs b/crates/did-utils/src/jwk/mod.rs index c56fbe51..0f8e2481 100644 --- a/crates/did-utils/src/jwk/mod.rs +++ b/crates/did-utils/src/jwk/mod.rs @@ -1,5 +1,5 @@ //! This module provides types and utilities for handling JSON Web Keys (JWKs). -//! +//! //! It includes support for various key types, secure serialization and deserialization, and encoding schemes. //! //! ## Submodules @@ -13,7 +13,7 @@ //! - [`prm`]: Defines parameter-related types for keys and cryptographic operations. //! - [`rsa`]: Provides support for working with RSA keys. //! - [`secret`]: Provides utilities for working with secrets securely. -//! +//! //! //! # Examples //! //! ```no run diff --git a/crates/did-utils/src/lib.rs b/crates/did-utils/src/lib.rs index 31b8d6e9..06a167ae 100644 --- a/crates/did-utils/src/lib.rs +++ b/crates/did-utils/src/lib.rs @@ -1,12 +1,12 @@ //! # did-utils -//! +//! //! This crate provides a set of utilities for working with Decentralized Identifiers (DIDs). -//! It includes support for cryptographic operations, DID core functionality, key management, proof handling, +//! It includes support for cryptographic operations, DID core functionality, key management, proof handling, //! verifiable credentials, linked data models, and various DID methods. //! //! ## Modules //! -//! - [`crypto`]: Contains cryptographic utilities for key generation, encryption, +//! - [`crypto`]: Contains cryptographic utilities for key generation, encryption, //! decryption, signing, and verification. //! - [`didcore`]: Provides core functionality for DIDs, including parsing and manipulation. //! - [`didkit`]: Provides high-level functionality for creating and managing DIDs. @@ -32,9 +32,9 @@ //! ``` pub mod crypto; pub mod didcore; +pub mod didkit; pub mod jwk; -pub mod proof; -pub mod vc; pub mod ldmodel; pub mod methods; -pub mod didkit; +pub mod proof; +pub mod vc; diff --git a/crates/did-utils/src/methods/key/method.rs b/crates/did-utils/src/methods/key/method.rs index b836eb73..890f0278 100644 --- a/crates/did-utils/src/methods/key/method.rs +++ b/crates/did-utils/src/methods/key/method.rs @@ -2,19 +2,12 @@ use multibase::Base::Base58Btc; use crate::{ crypto::{ - Ed25519KeyPair, - {Generate, KeyMaterial}, - Error as CryptoError, - Algorithm, - PublicKeyFormat, alg::decode_multikey, + Algorithm, Ed25519KeyPair, Error as CryptoError, PublicKeyFormat, {Generate, KeyMaterial}, }, didcore::{self, Document as DIDDocument, KeyFormat, VerificationMethod}, ldmodel::Context, - methods::{ - errors::DIDResolutionError, - traits::DIDMethod, - }, + methods::{errors::DIDResolutionError, traits::DIDMethod}, }; #[derive(Default)] @@ -33,7 +26,6 @@ impl DIDMethod for DidKey { } impl DidKey { - /// Creates a new DidKey resolver instance. pub fn new() -> Self { Self::new_full(false, PublicKeyFormat::default()) diff --git a/crates/did-utils/src/methods/key/resolver.rs b/crates/did-utils/src/methods/key/resolver.rs index 64815e4f..f19ba8ab 100644 --- a/crates/did-utils/src/methods/key/resolver.rs +++ b/crates/did-utils/src/methods/key/resolver.rs @@ -2,32 +2,23 @@ use async_trait::async_trait; use crate::{ ldmodel::Context, - methods::{ - errors::DIDResolutionError, - traits::DIDResolver, - }, + methods::{errors::DIDResolutionError, traits::DIDResolver}, }; -use crate::methods::resolution::{ - DIDResolutionMetadata, - DIDResolutionOptions, - MediaType, - ResolutionOutput, -}; +use crate::methods::resolution::{DIDResolutionMetadata, DIDResolutionOptions, MediaType, ResolutionOutput}; use crate::methods::DidKey; #[async_trait] impl DIDResolver for DidKey { - /// Resolves a DID using the did:key method. - /// + /// /// # Arguments - /// + /// /// * `did` - The DID address to resolve. - /// + /// /// # Returns - /// + /// /// A `ResolutionOutput` struct containing the resolved DID document and metadata. async fn resolve(&self, did: &str, _options: &DIDResolutionOptions) -> ResolutionOutput { let context = Context::SingleString(String::from("https://w3id.org/did-resolution/v1")); @@ -66,10 +57,7 @@ impl DIDResolver for DidKey { #[cfg(test)] mod tests { use super::*; - use crate::{ - methods::resolution::DereferencingOptions, - crypto::PublicKeyFormat, - }; + use crate::{crypto::PublicKeyFormat, methods::resolution::DereferencingOptions}; use serde_json::Value; #[async_std::test] diff --git a/crates/did-utils/src/methods/mod.rs b/crates/did-utils/src/methods/mod.rs index 7e7c5763..50f92875 100644 --- a/crates/did-utils/src/methods/mod.rs +++ b/crates/did-utils/src/methods/mod.rs @@ -8,9 +8,9 @@ //! [`did:peer`]: https://identity.foundation/peer-did-method-spec/ //! //! # Examples -//! +//! //! ### Basic did:key resolution example. -//! +//! //! ``` //! use did_utils::methods::{DIDResolver, DidKey}; //! use did_utils::methods::DIDResolutionOptions; diff --git a/crates/did-utils/src/methods/peer/method.rs b/crates/did-utils/src/methods/peer/method.rs index baa11339..641df911 100644 --- a/crates/did-utils/src/methods/peer/method.rs +++ b/crates/did-utils/src/methods/peer/method.rs @@ -9,19 +9,12 @@ use super::{ use crate::{ crypto::{ - sha256_multihash, Ed25519KeyPair, {Generate, KeyMaterial}, - Algorithm, - PublicKeyFormat, alg::decode_multikey, + sha256_multihash, Algorithm, Ed25519KeyPair, PublicKeyFormat, {Generate, KeyMaterial}, }, didcore::{self, Document as DIDDocument, KeyFormat, Service, VerificationMethod}, ldmodel::Context, - methods::{ - peer::util, - errors::DIDResolutionError, - traits::DIDMethod, - DidKey, - }, + methods::{errors::DIDResolutionError, peer::util, traits::DIDMethod, DidKey}, }; lazy_static::lazy_static!( diff --git a/crates/did-utils/src/methods/peer/mod.rs b/crates/did-utils/src/methods/peer/mod.rs index 9363e57c..fd648970 100644 --- a/crates/did-utils/src/methods/peer/mod.rs +++ b/crates/did-utils/src/methods/peer/mod.rs @@ -1,4 +1,4 @@ mod errors; +pub(super) mod method; mod resolver; mod util; -pub(super) mod method; diff --git a/crates/did-utils/src/methods/peer/resolver.rs b/crates/did-utils/src/methods/peer/resolver.rs index a4da5aef..1a525c00 100644 --- a/crates/did-utils/src/methods/peer/resolver.rs +++ b/crates/did-utils/src/methods/peer/resolver.rs @@ -4,9 +4,9 @@ use super::method::DidPeer; use crate::{ ldmodel::Context, methods::{ - traits::DIDResolver, errors::DIDResolutionError, resolution::{DIDResolutionMetadata, DIDResolutionOptions, MediaType, ResolutionOutput}, + traits::DIDResolver, }, }; diff --git a/crates/did-utils/src/methods/resolution.rs b/crates/did-utils/src/methods/resolution.rs index 7043fe34..cace2e91 100644 --- a/crates/did-utils/src/methods/resolution.rs +++ b/crates/did-utils/src/methods/resolution.rs @@ -7,12 +7,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use crate::{ - ldmodel::Context, - didcore::Document as DIDDocument, - methods::errors::DIDResolutionError, -}; - +use crate::{didcore::Document as DIDDocument, ldmodel::Context, methods::errors::DIDResolutionError}; /// DID Resolution Options. /// @@ -180,9 +175,10 @@ impl Display for MediaType { } /// Serves derefencing query given a DID document. -pub(super) fn dereference_did_document(diddoc: &DIDDocument, - query: &HashMap, - fragment: &Option +pub(super) fn dereference_did_document( + diddoc: &DIDDocument, + query: &HashMap, + fragment: &Option, ) -> Result { // Primary resource if let Some(service) = query.get("service") { diff --git a/crates/did-utils/src/methods/traits.rs b/crates/did-utils/src/methods/traits.rs index abae84f2..b8e1c87a 100644 --- a/crates/did-utils/src/methods/traits.rs +++ b/crates/did-utils/src/methods/traits.rs @@ -3,7 +3,6 @@ use async_trait::async_trait; use crate::{ldmodel::Context, methods::errors::DIDResolutionError}; - /// Abstract contract for DID methods. /// /// Initially thought to encompass the signatures of different operations @@ -26,7 +25,6 @@ pub trait DIDMethod: DIDResolver { } } - /// Abstract contract for DID resolution. /// /// [See DID Resolution Specification](https://w3c.github.io/did-resolution) diff --git a/crates/did-utils/src/proof/eddsa_jcs_2022.rs b/crates/did-utils/src/proof/eddsa_jcs_2022.rs index 026749e0..67bd1f07 100644 --- a/crates/did-utils/src/proof/eddsa_jcs_2022.rs +++ b/crates/did-utils/src/proof/eddsa_jcs_2022.rs @@ -1,6 +1,6 @@ use multibase::Base; -use crate::crypto::{ Ed25519KeyPair, sha256_hash, CoreSign, Error }; +use crate::crypto::{sha256_hash, CoreSign, Ed25519KeyPair, Error}; use super::{model::Proof, traits::CryptoProof}; diff --git a/crates/did-utils/src/proof/mod.rs b/crates/did-utils/src/proof/mod.rs index 7200fb9f..d0b08f23 100644 --- a/crates/did-utils/src/proof/mod.rs +++ b/crates/did-utils/src/proof/mod.rs @@ -1,22 +1,22 @@ //! This module provides utilities for creating and verifying proofs. -//! +//! //! See [RFC 7807](https://tools.ietf.org/html/rfc7807) for details. -//! +//! //! # Examples -//! +//! //! ```no run //! # use chrono::TimeZone; //! # use serde_json::json; -//! +//! //! # use crate::crypto::Ed25519KeyPair; -//! +//! //! # use crate::*; -//! +//! //! let my_string = String::from("Sample seed bytes of thirtytwo!b"); //! let seed: &[u8] = my_string.as_bytes(); //! let key_pair = Ed25519KeyPair::new_with_seed(seed)?; //! let public_key = &key_pair.public_key.clone(); -//! +//! //! let proof = Proof { //! id: None, //! proof_type: "DataIntegrityProof".to_string(), @@ -31,44 +31,44 @@ //! previous_proof: None, //! nonce: Some("1234567890".to_string()), //! }; -//! +//! //! let payload = json!({ //! "id": "did:example:123456789abcdefghi", //! "name": "Alice", //! "age": 101, //! "image": "data:image/png;base64,iVBORw0KGgo...kJggg==", //! }); -//! +//! //! let ed_dsa_jcs_2022_prover = EdDsaJcs2022 { //! proof, //! key_pair, //! proof_value_codec: Some(Base::Base58Btc), //! }; -//! +//! //! let secured_proof = ed_dsa_jcs_2022_prover.proof(payload.clone())?; -//! +//! //! let secure_doc = UnsecuredDocument { //! content: payload, //! proof: crate::proof::model::Proofs::SingleProof(Box::new(secured_proof.clone())), //! }; -//! +//! //! // Serialize the struct into a serde_json::Value //! let secure_doc_json_value: Value = serde_json::to_value(&secure_doc)?; -//! +//! //! let ed_dsa_jcs_2022_verifier = EdDsaJcs2022 { //! proof: secured_proof, //! key_pair: Ed25519KeyPair::from_public_key(public_key.as_bytes())?, //! proof_value_codec: None, //! }; -//! +//! //! // Verify the proof //! ed_dsa_jcs_2022_verifier.verify(secure_doc_json_value)?; //!``` +mod eddsa_jcs_2022; mod model; mod traits; -mod eddsa_jcs_2022; // public re-exports pub use eddsa_jcs_2022::{EdDsaJcs2022, CRYPRO_SUITE_EDDSA_JCS_2022, PROOF_TYPE_DATA_INTEGRITY_PROOF}; -pub use model::{Proof, UnsecuredDocument, Domain, PreviousProofs, Proofs}; -pub use traits::CryptoProof; \ No newline at end of file +pub use model::{Domain, PreviousProofs, Proof, Proofs, UnsecuredDocument}; +pub use traits::CryptoProof; diff --git a/crates/did-utils/src/proof/model.rs b/crates/did-utils/src/proof/model.rs index a44e04e5..9029bc2c 100644 --- a/crates/did-utils/src/proof/model.rs +++ b/crates/did-utils/src/proof/model.rs @@ -5,7 +5,6 @@ use serde_json::Value; #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct Proof { - // An optional identifier for the proof. #[serde(skip_serializing_if = "Option::is_none")] pub id: Option, @@ -48,14 +47,14 @@ pub struct Proof { #[serde(skip_serializing_if = "Option::is_none")] pub proof_value: Option, - // Each value identifies another data integrity proof that + // Each value identifies another data integrity proof that // MUST verify before the current proof is processed // See https://www.w3.org/TR/vc-data-integrity/#proof-chains #[serde(skip_serializing_if = "Option::is_none")] pub previous_proof: Option, // A string value supplied by the proof creator that is unique to the proof - // One use of this field is to increase privacy by decreasing linkability + // One use of this field is to increase privacy by decreasing linkability // that is the result of deterministically generated signatures #[serde(skip_serializing_if = "Option::is_none")] pub nonce: Option, @@ -82,7 +81,6 @@ pub enum Proofs { SetOfProofs(Box>), } - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct UnsecuredDocument { @@ -122,12 +120,11 @@ mod tests { let canonicalized_expected = r#"{"created":"2023-03-05T19:23:24Z","cryptosuite":"jcs-eddsa-2022","proofPurpose":"assertionMethod","proofValue":"zQeVbY4oey5q2M3XKaxup3tmzN4DRFTLVqpLMweBrSxMY2xHX5XTYV8nQApmEcqaqA3Q1gVHMrXFkXJeV6doDwLWx","type":"DataIntegrityProof","verificationMethod":"https://di.example/issuer#z6MkjLrk3gKS2nnkeWcmcxiZPGskmesDpuwRBorgHxUXfxnG"}"#; assert_eq!(canonicalized_expected, canonicalized_actual); - } // Add a single proof to a josn object #[test] - fn test_add_proof_to_unsecure_document(){ + fn test_add_proof_to_unsecure_document() { let doc_json = r#"{ "@context": [ {"title": "https://schema.org/title"}, @@ -152,12 +149,11 @@ mod tests { let proofs = Proofs::SingleProof(Box::new(proof)); generic_add_proof_to_document(doc, proofs, canonicalized_expected).unwrap(); - } // Add a list of proof to the unsecure object #[test] - fn test_add_proofs_to_secured_document(){ + fn test_add_proofs_to_secured_document() { let doc_json = r#"{ "@context": [ {"title": "https://schema.org/title"}, @@ -190,16 +186,11 @@ mod tests { let proofs = Proofs::SetOfProofs(Box::new(proof_list)); generic_add_proof_to_document(doc, proofs, canonicalized_expected).unwrap(); - } - fn generic_add_proof_to_document(doc: Value, proofs: Proofs, canonicalized_expected: &str)-> Result<(), Box>{ - + fn generic_add_proof_to_document(doc: Value, proofs: Proofs, canonicalized_expected: &str) -> Result<(), Box> { // create the unsecure document - let unsecure_doc = UnsecuredDocument { - content: doc, - proof: proofs, - }; + let unsecure_doc = UnsecuredDocument { content: doc, proof: proofs }; // serialize the unsecure document let canonicalized_actual = json_canon::to_string(&unsecure_doc).unwrap(); @@ -207,6 +198,5 @@ mod tests { assert_eq!(canonicalized_expected, canonicalized_actual); Ok(()) - } -} \ No newline at end of file +} diff --git a/crates/did-utils/src/proof/traits.rs b/crates/did-utils/src/proof/traits.rs index fa9451a6..cb5cc48b 100644 --- a/crates/did-utils/src/proof/traits.rs +++ b/crates/did-utils/src/proof/traits.rs @@ -7,18 +7,18 @@ use super::model::Proof; /// A trait to be implemented by every crypto suite pub trait CryptoProof { /// Create the proof value and add it to the proof object. - /// + /// /// The payload is the data to be signed without any proof entry. /// Caller must make sure all existing proofs are removed prior to passing /// the payload to this function. - /// + /// /// Returns the proof object with the proof value added. fn proof(&self, payload: Value) -> Result; /// Verifies that this proof is authenticates with the payload. - /// + /// /// The payload is the data to be verified without any proof entry. /// Caller must make sure all existing proofs are removed prior to passing /// the payload to this function. fn verify(&self, payload: Value) -> Result<(), Error>; -} \ No newline at end of file +} diff --git a/crates/did-utils/src/vc/mod.rs b/crates/did-utils/src/vc/mod.rs index 14bb2cd1..8cb19788 100644 --- a/crates/did-utils/src/vc/mod.rs +++ b/crates/did-utils/src/vc/mod.rs @@ -1,7 +1,7 @@ //! This module provides utilities for working with [Verifiable Credentials (VCs)][vc]. -//! +//! //! See [vc]: (https://www.w3.org/TR/vc-data-model-2.0/) for details. mod model; -pub use model::{VerifiableCredential, VerifiablePresentation}; \ No newline at end of file +pub use model::{VerifiableCredential, VerifiablePresentation}; diff --git a/crates/did-utils/src/vc/model.rs b/crates/did-utils/src/vc/model.rs index 96320102..17131492 100644 --- a/crates/did-utils/src/vc/model.rs +++ b/crates/did-utils/src/vc/model.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_json::Value; -use crate::{ldmodel::Context, didcore::Proofs}; +use crate::{didcore::Proofs, ldmodel::Context}; /// Represents a Verifiable Credential. #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] @@ -98,8 +98,6 @@ pub struct IssuerObject { pub description: Option, } - - #[derive(Serialize, Debug, Clone, PartialEq, Deserialize)] #[serde(untagged)] pub enum CredentialSubjects { @@ -178,7 +176,6 @@ pub struct DescriptionObject { #[derive(Serialize, Debug, Clone, PartialEq, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CredentialStatus { - pub id: String, // see https://www.w3.org/TR/vc-data-model-2.0/#types @@ -193,7 +190,6 @@ pub struct CredentialStatus { #[serde(skip_serializing_if = "Option::is_none")] pub status_list_credential: Option, - } // The value of the credentialSchema property MUST be one or more data schemas @@ -234,13 +230,12 @@ pub struct RelatedResource { pub digest_multibase: Option, - pub media_type: Option + pub media_type: Option, } #[derive(Serialize, Debug, Clone, PartialEq, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RefreshService { - pub id: String, // see https://www.w3.org/TR/vc-data-model-2.0/#types @@ -248,8 +243,6 @@ pub struct RefreshService { pub rs_type: String, } - - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct VerifiablePresentation { @@ -288,16 +281,19 @@ mod tests { use chrono::TimeZone; use multibase::Base; - use serde_json::{json, from_str}; + use serde_json::{from_str, json}; - use crate::{crypto::{Ed25519KeyPair, Generate}, proof::{Proof, UnsecuredDocument, EdDsaJcs2022, CryptoProof}}; + use crate::{ + crypto::{Ed25519KeyPair, Generate}, + proof::{CryptoProof, EdDsaJcs2022, Proof, UnsecuredDocument}, + }; use super::*; #[test] fn test_vc() { let vc = make_vc(&pub_key_multibase(subject_key_pair())); - let vc_expected= r#"{"@context":["https://www.w3.org/ns/credentials/v2","https://www.w3.org/ns/credentials/examples/v2"],"credentialSubject":{"alumniOf":{"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q","name":"Example University"},"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q"},"description":"Graduated from Example University","id":"http://university.example/credentials/3732","issuer":"did:key#z7dNyxjs9BUfsbX11VG4BGDMB3Wg1Pq2NqhSwTBT8UuRC","name":"Jayden Doe","type":["VerifiableCredential","AlumniCredential"],"validFrom":"2023-03-05T19:23:24Z","validUntil":"2023-12-31T19:23:24Z"}"#; + let vc_expected = r#"{"@context":["https://www.w3.org/ns/credentials/v2","https://www.w3.org/ns/credentials/examples/v2"],"credentialSubject":{"alumniOf":{"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q","name":"Example University"},"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q"},"description":"Graduated from Example University","id":"http://university.example/credentials/3732","issuer":"did:key#z7dNyxjs9BUfsbX11VG4BGDMB3Wg1Pq2NqhSwTBT8UuRC","name":"Jayden Doe","type":["VerifiableCredential","AlumniCredential"],"validFrom":"2023-03-05T19:23:24Z","validUntil":"2023-12-31T19:23:24Z"}"#; let vc_canon = json_canon::to_string(&vc).unwrap(); assert_eq!(vc_expected, vc_canon); } @@ -312,7 +308,7 @@ mod tests { } #[test] - fn test_vc_with_proof(){ + fn test_vc_with_proof() { let vc = make_vc(&pub_key_multibase(subject_key_pair())); let key_pair = issuer_key_pair(); let public_key = &key_pair.public_key.clone(); @@ -334,8 +330,7 @@ mod tests { } #[test] - fn test_vc_verify_vc_proof(){ - + fn test_vc_verify_vc_proof() { // test parse string into a VerifiableCredential struct let secured_vc: VerifiableCredential = from_str(SECURED_VC).unwrap(); @@ -352,7 +347,7 @@ mod tests { // we just encoded the public key as a multibase string in the verification method. let vm = secured_proof.verification_method.clone(); let last_index = vm.rfind('#').unwrap(); - let public_key_multibase = &vm[last_index+1..]; + let public_key_multibase = &vm[last_index + 1..]; let public_key_bytes_vector = multibase::decode(public_key_multibase).unwrap(); // Initialize with zeros or any default value @@ -376,10 +371,7 @@ mod tests { println!("{}", vp_canon); } - const CONTEXTS: &[&str] = &[ - "https://www.w3.org/ns/credentials/v2", - "https://www.w3.org/ns/credentials/examples/v2", - ]; + const CONTEXTS: &[&str] = &["https://www.w3.org/ns/credentials/v2", "https://www.w3.org/ns/credentials/examples/v2"]; fn make_context() -> Context { let mut contexts: Vec = Vec::new(); @@ -389,8 +381,7 @@ mod tests { Context::SetOfString(contexts) } - fn make_vc(subject_public_key_multibase: &str) -> VerifiableCredential { - + fn make_vc(subject_public_key_multibase: &str) -> VerifiableCredential { let issuer_key_pair = issuer_key_pair(); let issuer_pub_key_multibase = pub_key_multibase(issuer_key_pair); @@ -401,7 +392,7 @@ mod tests { alumni_of_map.insert("id".to_string(), Value::String(did.to_string())); let alumni_of_json_value = json!(alumni_of_map); let mut additional_properties: HashMap = HashMap::new(); - additional_properties.insert("alumniOf".to_string(),alumni_of_json_value); + additional_properties.insert("alumniOf".to_string(), alumni_of_json_value); VerifiableCredential { context: make_context(), id: Some("http://university.example/credentials/3732".to_string()), @@ -437,11 +428,11 @@ mod tests { } } - fn issuer_key_pair()-> Ed25519KeyPair { + fn issuer_key_pair() -> Ed25519KeyPair { make_key_pair("Seed phrase for issuer thirty2!b") } - fn subject_key_pair()-> Ed25519KeyPair { + fn subject_key_pair() -> Ed25519KeyPair { make_key_pair("Seed phrase for subject thrty2!b") } @@ -474,5 +465,4 @@ mod tests { } const SECURED_VC: &str = r#"{"@context":["https://www.w3.org/ns/credentials/v2","https://www.w3.org/ns/credentials/examples/v2"],"credentialSubject":{"alumniOf":{"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q","name":"Example University"},"id":"did:key#z38w6kKWT7hesyxuuVUSH4LsxbcRof4ra1QBDtR1qrc1q"},"description":"Graduated from Example University","id":"http://university.example/credentials/3732","issuer":"did:key#z7dNyxjs9BUfsbX11VG4BGDMB3Wg1Pq2NqhSwTBT8UuRC","name":"Jayden Doe","proof":{"challenge":"523452345234asfdasdfasdfa","created":"2023-03-05T19:23:24Z","cryptosuite":"eddsa-jcs-2022","domain":"vc-demo.adorsys.com","nonce":"1234567890","proofPurpose":"assertionMethod","proofValue":"z4DEMwgRCZnRddGPPevbaafihRwj4ng3dn5EwmnnaeMVMp25niKWZ3cW1rdfWMtfp5dpCmNEjfJtvbnnpUsZcy9c6","type":"DataIntegrityProof","verificationMethod":"did:key#z7dNyxjs9BUfsbX11VG4BGDMB3Wg1Pq2NqhSwTBT8UuRC"},"type":["VerifiableCredential","AlumniCredential"],"validFrom":"2023-03-05T19:23:24Z","validUntil":"2023-12-31T19:23:24Z"}"#; - -} \ No newline at end of file +} diff --git a/crates/keystore/src/filesystem.rs b/crates/keystore/src/filesystem.rs index 9d5e1199..62715a13 100644 --- a/crates/keystore/src/filesystem.rs +++ b/crates/keystore/src/filesystem.rs @@ -100,13 +100,11 @@ mod tests { Ok(()) } - fn write_with_lock(&self, _path: &str, _content: &str) -> IoResult<()>{ + fn write_with_lock(&self, _path: &str, _content: &str) -> IoResult<()> { Ok(()) } } - - #[test] fn can_mock_fs_operations() { let mut mock_fs = MockFileSystem::default(); diff --git a/crates/plugins/did-endpoint/src/lib.rs b/crates/plugins/did-endpoint/src/lib.rs index 6742c2e5..bb36bb66 100644 --- a/crates/plugins/did-endpoint/src/lib.rs +++ b/crates/plugins/did-endpoint/src/lib.rs @@ -1,7 +1,7 @@ mod didgen; +pub mod plugin; mod util; mod web; -pub mod plugin; // Re-exports pub use didgen::{didgen, validate_diddoc, Error}; diff --git a/crates/plugins/mediator-coordination/Cargo.toml b/crates/plugins/mediator-coordination/Cargo.toml index 337cb4ba..e84d64ea 100644 --- a/crates/plugins/mediator-coordination/Cargo.toml +++ b/crates/plugins/mediator-coordination/Cargo.toml @@ -8,6 +8,7 @@ did-utils.workspace = true did-endpoint.workspace = true plugin-api.workspace = true keystore.workspace = true +database.workspace = true chrono.workspace = true mongodb.workspace = true diff --git a/crates/plugins/mediator-coordination/src/didcomm/bridge.rs b/crates/plugins/mediator-coordination/src/didcomm/bridge.rs index d11c885f..55aeba3f 100644 --- a/crates/plugins/mediator-coordination/src/didcomm/bridge.rs +++ b/crates/plugins/mediator-coordination/src/didcomm/bridge.rs @@ -1,10 +1,10 @@ use async_trait::async_trait; +use did_utils::crypto::PublicKeyFormat; use did_utils::{ didcore::Document, jwk::Jwk, methods::{DIDResolutionError, DidKey}, }; -use did_utils::crypto::PublicKeyFormat; use didcomm::{ did::{DIDDoc, DIDResolver}, error::{Error, ErrorKind, Result}, diff --git a/crates/plugins/mediator-coordination/src/lib.rs b/crates/plugins/mediator-coordination/src/lib.rs index 7859380d..6818a91b 100644 --- a/crates/plugins/mediator-coordination/src/lib.rs +++ b/crates/plugins/mediator-coordination/src/lib.rs @@ -1,7 +1,6 @@ pub mod client; pub mod plugin; - mod constant; mod didcomm; mod jose; diff --git a/crates/plugins/mediator-coordination/src/model/mod.rs b/crates/plugins/mediator-coordination/src/model/mod.rs index 737e4e4f..674fb3e8 100644 --- a/crates/plugins/mediator-coordination/src/model/mod.rs +++ b/crates/plugins/mediator-coordination/src/model/mod.rs @@ -1,6 +1,5 @@ +pub mod coord; #[cfg(feature = "stateful")] pub mod stateful; -pub mod coord; #[cfg(feature = "stateless")] pub mod stateless; - diff --git a/crates/plugins/mediator-coordination/src/plugin.rs b/crates/plugins/mediator-coordination/src/plugin.rs index 9317f137..55585c1a 100644 --- a/crates/plugins/mediator-coordination/src/plugin.rs +++ b/crates/plugins/mediator-coordination/src/plugin.rs @@ -1,11 +1,13 @@ use axum::Router; use keystore::filesystem::StdFileSystem; +use mongodb::{options::ClientOptions, Client, Database}; use plugin_api::{Plugin, PluginError}; -use mongodb::{ options::ClientOptions, Client, Database}; use std::sync::Arc; use crate::{ - repository::stateful::coord::{MongoConnectionRepository, MongoMessagesRepository, MongoSecretsRepository}, + repository::stateful::{ + MongoConnectionRepository, MongoMessagesRepository, MongoSecretsRepository, + }, util, web::{self, AppState, AppStateRepository}, }; @@ -15,7 +17,6 @@ pub struct MediatorCoordinationPlugin { db: Option, } - struct MediatorCoordinationPluginEnv { public_domain: String, storage_dirpath: String, @@ -25,7 +26,7 @@ struct MediatorCoordinationPluginEnv { /// Loads environment variables required for this plugin fn load_plugin_env() -> Result { - let public_domain = std::env::var("SERVER_PUBLIC_DOMAIN").map_err(|_| { + let public_domain = std::env::var("SERVER_PUBLIC_DOMAIN").map_err(|_| { tracing::error!("SERVER_PUBLIC_DOMAIN env variable required"); PluginError::InitError })?; @@ -95,22 +96,24 @@ impl Plugin for MediatorCoordinationPlugin { // Load persistence layer let repository = AppStateRepository { - connection_repository: Arc::new(MongoConnectionRepository::from_db(&db)), secret_repository: Arc::new(MongoSecretsRepository::from_db(&db)), - message_repository: Arc::new(MongoMessagesRepository::from_db(&db)) - + message_repository: Arc::new(MongoMessagesRepository::from_db(&db)), }; // Compile state - let state = AppState::from(env.public_domain.clone(), diddoc, keystore, Some(repository)); + let state = AppState::from( + env.public_domain.clone(), + diddoc, + keystore, + Some(repository), + ); // Build router web::routes(Arc::new(state)) } } - fn load_mongo_connector(mongo_uri: &str, mongo_dbn: &str) -> Result { let task = async { // Parse a connection string into an options struct. @@ -130,4 +133,4 @@ fn load_mongo_connector(mongo_uri: &str, mongo_dbn: &str) -> Result for RepositoryError { - fn from(error: MongoError) -> Self { - RepositoryError::Generic(error.to_string()) - } -} +pub(crate) mod stateful; diff --git a/crates/plugins/mediator-coordination/src/repository/stateful/coord.rs b/crates/plugins/mediator-coordination/src/repository/stateful.rs similarity index 97% rename from crates/plugins/mediator-coordination/src/repository/stateful/coord.rs rename to crates/plugins/mediator-coordination/src/repository/stateful.rs index b9bca416..d69956e8 100644 --- a/crates/plugins/mediator-coordination/src/repository/stateful/coord.rs +++ b/crates/plugins/mediator-coordination/src/repository/stateful.rs @@ -1,15 +1,11 @@ use async_trait::async_trait; +use database::{Repository, RepositoryError}; use mongodb::{ bson::{self, doc, oid::ObjectId, Bson, Document as BsonDocument}, Collection, Database, }; -use crate::{ - model::stateful::entity::{Connection, RoutedMessage, Secrets}, - repository::traits::{Entity, Repository, RepositoryError}, -}; - -impl Entity for Connection {} +use crate::model::stateful::entity::{Connection, RoutedMessage, Secrets}; pub struct MongoConnectionRepository { collection: Collection, @@ -104,8 +100,6 @@ impl Repository for MongoConnectionRepository { } } -impl Entity for Secrets {} - pub struct MongoSecretsRepository { collection: Collection, // Use the Secrets entity for the collection } @@ -140,11 +134,17 @@ impl Repository for MongoMessagesRepository { Ok(messages) } - async fn find_one(&self, message_id: ObjectId) -> Result, RepositoryError> { + async fn find_one( + &self, + message_id: ObjectId, + ) -> Result, RepositoryError> { // Query the database for the specified message ID self.find_one_by(doc! {"_id": message_id}).await } - async fn find_one_by(&self, filter: BsonDocument) -> Result, RepositoryError> { + async fn find_one_by( + &self, + filter: BsonDocument, + ) -> Result, RepositoryError> { // Query the database for the specified message ID Ok(self.collection.find_one(filter, None).await?) } diff --git a/crates/plugins/mediator-coordination/src/repository/stateful/mod.rs b/crates/plugins/mediator-coordination/src/repository/stateful/mod.rs deleted file mode 100644 index 960d61b5..00000000 --- a/crates/plugins/mediator-coordination/src/repository/stateful/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod coord; diff --git a/crates/plugins/mediator-coordination/src/util/mod.rs b/crates/plugins/mediator-coordination/src/util/mod.rs index 7d0197b5..fed03ee1 100644 --- a/crates/plugins/mediator-coordination/src/util/mod.rs +++ b/crates/plugins/mediator-coordination/src/util/mod.rs @@ -1,10 +1,10 @@ #![allow(unused)] -use keystore::{KeyStore, KeyStoreError, filesystem::FileSystem}; use did_utils::{ didcore::{AssertionMethod, Document, KeyAgreement, KeyFormat, VerificationMethod}, jwk::Jwk, }; +use keystore::{filesystem::FileSystem, KeyStore, KeyStoreError}; use serde_json::Error as SerdeError; use std::io; diff --git a/crates/plugins/mediator-coordination/src/web/coord/handler/stateful.rs b/crates/plugins/mediator-coordination/src/web/coord/handler/stateful.rs index 0c1c7cff..cd88f033 100644 --- a/crates/plugins/mediator-coordination/src/web/coord/handler/stateful.rs +++ b/crates/plugins/mediator-coordination/src/web/coord/handler/stateful.rs @@ -346,7 +346,7 @@ mod tests { use super::*; use crate::{ - repository::stateful::coord::tests::MockConnectionRepository, web::handler::tests as global, + repository::stateful::tests::MockConnectionRepository, web::handler::tests as global, }; #[allow(clippy::needless_update)] diff --git a/crates/plugins/mediator-coordination/src/web/coord/handler/stateless.rs b/crates/plugins/mediator-coordination/src/web/coord/handler/stateless.rs index 034a9053..f8c5eaf0 100644 --- a/crates/plugins/mediator-coordination/src/web/coord/handler/stateless.rs +++ b/crates/plugins/mediator-coordination/src/web/coord/handler/stateless.rs @@ -541,7 +541,6 @@ mod tests { let packed_msg = _edge_pack_message(&state, &msg, Some(_edge_did()), _mediator_did(&state)) .await .unwrap(); - // Send request let response = app .oneshot( diff --git a/crates/plugins/mediator-coordination/src/web/error.rs b/crates/plugins/mediator-coordination/src/web/error.rs index 38ce90ac..5ba047f9 100644 --- a/crates/plugins/mediator-coordination/src/web/error.rs +++ b/crates/plugins/mediator-coordination/src/web/error.rs @@ -39,7 +39,7 @@ pub enum MediationError { #[error("Could not store Message")] PersisenceError, #[error("Could not deserialize Message")] - DeserializationError + DeserializationError, } impl MediationError { diff --git a/crates/plugins/mediator-coordination/src/web/handler.rs b/crates/plugins/mediator-coordination/src/web/handler.rs index c53fe1a6..c6e4744c 100644 --- a/crates/plugins/mediator-coordination/src/web/handler.rs +++ b/crates/plugins/mediator-coordination/src/web/handler.rs @@ -87,7 +87,7 @@ pub mod tests { use crate::{ didcomm::bridge::LocalSecretsResolver, - repository::stateful::coord::tests::{ + repository::stateful::tests::{ MockConnectionRepository, MockMessagesRepository, MockSecretsRepository, }, util::{self, MockFileSystem}, @@ -198,7 +198,7 @@ mod tests2 { use super::{tests as global, *}; use crate::{ constant::KEYLIST_UPDATE_RESPONSE_2_0, - repository::stateful::coord::tests::MockConnectionRepository, + repository::stateful::tests::MockConnectionRepository, web::{self, AppStateRepository}, }; diff --git a/crates/plugins/mediator-coordination/src/web/mod.rs b/crates/plugins/mediator-coordination/src/web/mod.rs index 1beb1eb4..4d066062 100644 --- a/crates/plugins/mediator-coordination/src/web/mod.rs +++ b/crates/plugins/mediator-coordination/src/web/mod.rs @@ -4,14 +4,14 @@ mod handler; mod midlw; use axum::{middleware, routing::post, Router}; -use keystore::KeyStore; +use database::Repository; use did_utils::{didcore::Document, jwk::Jwk}; +use keystore::KeyStore; use std::sync::Arc; use crate::{ didcomm::bridge::{LocalDIDResolver, LocalSecretsResolver}, model::stateful::entity::{Connection, RoutedMessage, Secrets}, - repository::traits::Repository, util, }; diff --git a/crates/plugins/oob-messages/src/constants.rs b/crates/plugins/oob-messages/src/constants.rs index bb2def50..09934298 100644 --- a/crates/plugins/oob-messages/src/constants.rs +++ b/crates/plugins/oob-messages/src/constants.rs @@ -1 +1 @@ -pub const OOB_INVITATION_2_0: &str = "https://didcomm.org/out-of-band/2.0/invitation"; \ No newline at end of file +pub const OOB_INVITATION_2_0: &str = "https://didcomm.org/out-of-band/2.0/invitation"; diff --git a/crates/plugins/oob-messages/src/plugin.rs b/crates/plugins/oob-messages/src/plugin.rs index 0bb548b6..708e5935 100644 --- a/crates/plugins/oob-messages/src/plugin.rs +++ b/crates/plugins/oob-messages/src/plugin.rs @@ -1,4 +1,7 @@ -use super::{web, models::{retrieve_or_generate_oob_inv, retrieve_or_generate_qr_image}}; +use super::{ + models::{retrieve_or_generate_oob_inv, retrieve_or_generate_qr_image}, + web, +}; use axum::Router; use keystore::filesystem::StdFileSystem; use plugin_api::{Plugin, PluginError}; @@ -42,13 +45,11 @@ impl Plugin for OOBMessages { tracing::debug!("Out Of Band Invitation: {}", oob_inv); - let _ = retrieve_or_generate_qr_image(&mut fs, &storage_dirpath, &oob_inv).map_err(|e| { - println!( - "Error retrieving or generating QR code image: {}", - e - ); - PluginError::InitError - })?; + let _ = + retrieve_or_generate_qr_image(&mut fs, &storage_dirpath, &oob_inv).map_err(|e| { + println!("Error retrieving or generating QR code image: {}", e); + PluginError::InitError + })?; Ok(()) } diff --git a/crates/plugins/oob-messages/src/util/mod.rs b/crates/plugins/oob-messages/src/util/mod.rs index d35ebfd5..d3512c3c 100644 --- a/crates/plugins/oob-messages/src/util/mod.rs +++ b/crates/plugins/oob-messages/src/util/mod.rs @@ -1,7 +1,9 @@ #[cfg(test)] pub(crate) fn dotenv_flow_read(key: &str) -> Option { - dotenv_flow::from_filename_iter(".env.example").unwrap().find_map(|item| { - let (k, v) = item.unwrap(); - (k == key).then_some(v) - }) + dotenv_flow::from_filename_iter(".env.example") + .unwrap() + .find_map(|item| { + let (k, v) = item.unwrap(); + (k == key).then_some(v) + }) }