Skip to content
Snippets Groups Projects
Commit 415088fc authored by Éloïs's avatar Éloïs
Browse files

[ref] whole: split crate documents: create new crate dubp-common-doc

parent 57c4a485
Branches
Tags
1 merge request!194Elois/indexs
Showing
with 100 additions and 352 deletions
......@@ -27,30 +27,12 @@
)]
pub mod constants;
pub mod currencies_codes;
pub mod db;
pub mod genesis_block_params;
use crate::constants::*;
pub use dubp_common_doc::CurrencyName;
use genesis_block_params::v10::BlockV10Parameters;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Error, Formatter};
/// Currency name
#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize, Hash)]
pub struct CurrencyName(pub String);
impl Display for CurrencyName {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "{}", self.0)
}
}
impl From<&str> for CurrencyName {
fn from(s: &str) -> Self {
CurrencyName(s.to_owned())
}
}
#[derive(Debug, Copy, Clone)]
/// Currency parameters
......
......@@ -13,9 +13,10 @@ edition = "2018"
path = "src/lib.rs"
[dependencies]
durs-common-tools = { path = "../../tools/common-tools", version = "0.2.0" }
dup-crypto = { path = "../../crypto", version = "0.7.0" }
dubp-common-doc = { path = "../common-doc"} #, version = "0.1.0" }
dubp-currency-params = { path = "../currency-params", version = "0.2.0" }
dup-crypto = { path = "../../crypto", version = "0.7.0" }
durs-common-tools = { path = "../../tools/common-tools", version = "0.2.0" }
failure = "0.1.5"
json-pest-parser = { path = "../../tools/json-pest-parser", version = "0.2.0" }
pest = "2.1.0"
......
......@@ -17,13 +17,14 @@
pub mod v10;
pub use v10::{BlockDocumentV10, BlockDocumentV10Stringified};
use crate::blockstamp::Blockstamp;
use crate::{BlockHash, BlockNumber, Document, ToStringObject};
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::traits::{Document, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::Hash;
use dup_crypto::keys::{PrivKey, PubKey, PublicKey};
pub use v10::{BlockDocumentV10, BlockDocumentV10Stringified};
/// Wrap a Block document.
///
/// Must be created by parsing a text document or using a builder.
......
......@@ -15,16 +15,7 @@
//! Wrappers around Block document V10.
use dubp_currency_params::genesis_block_params::v10::BlockV10Parameters;
use dubp_currency_params::CurrencyName;
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use std::ops::Deref;
use unwrap::unwrap;
use super::{BlockDocumentTrait, VerifyBlockHashError};
use crate::blockstamp::Blockstamp;
use crate::documents::certification::v10::CompactCertificationDocumentV10Stringified;
use crate::documents::identity::IdentityDocumentV10;
use crate::documents::membership::v10::{MembershipDocumentV10, MembershipDocumentV10Stringified};
......@@ -32,7 +23,17 @@ use crate::documents::revocation::v10::CompactRevocationDocumentV10Stringified;
use crate::documents::revocation::RevocationDocumentV10;
use crate::documents::transaction::TransactionDocument;
use crate::documents::*;
use crate::text_document_traits::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dubp_currency_params::genesis_block_params::v10::BlockV10Parameters;
use dubp_currency_params::CurrencyName;
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use std::ops::Deref;
use unwrap::unwrap;
/// Store a transaction document or just its hash.
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
......@@ -622,7 +623,7 @@ mod tests {
use super::certification::CertificationDocumentParser;
use super::transaction::TransactionDocumentParser;
use super::*;
use crate::Document;
use dubp_common_doc::traits::Document;
#[test]
fn generate_and_verify_empty_block() {
......
......@@ -17,17 +17,18 @@
pub mod v10;
pub use v10::{
CertificationDocumentV10, CertificationDocumentV10Stringified, CompactCertificationDocumentV10,
};
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::{Document, ToStringObject};
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use pest::Parser;
pub use v10::{
CertificationDocumentV10, CertificationDocumentV10Stringified, CompactCertificationDocumentV10,
};
/// Wrap an Certification document.
///
/// Must be created by parsing a text document or using a builder.
......
......@@ -15,13 +15,16 @@
//! Wrappers around Certification documents V10.
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::TextDocumentParseError;
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use crate::text_document_traits::*;
#[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
/// Wrap an Compact Revocation document (in block content)
pub struct CompactCertificationDocumentV10 {
......
......@@ -17,9 +17,13 @@
pub mod v10;
pub use v10::{IdentityDocumentV10, IdentityDocumentV10Stringified};
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::{Document, ToStringObject};
use dup_crypto::keys::*;
pub use v10::{IdentityDocumentV10, IdentityDocumentV10Stringified};
/// Identity document
#[derive(Clone, Debug, Deserialize, Hash, Serialize, PartialEq, Eq)]
......
......@@ -18,8 +18,13 @@
use durs_common_tools::fatal_error;
use crate::documents::*;
use crate::text_document_traits::*;
use crate::Blockstamp;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::TextDocumentParseError;
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
/// Wrap an Identity document.
///
......@@ -262,7 +267,7 @@ Timestamp: {blockstamp}
#[cfg(test)]
mod tests {
use super::*;
use crate::Document;
use dubp_common_doc::traits::Document;
use dup_crypto::keys::{PrivateKey, PublicKey, Signature};
#[test]
......
......@@ -17,10 +17,14 @@
pub mod v10;
pub use v10::{MembershipDocumentV10, MembershipDocumentV10Stringified};
use crate::documents::*;
use crate::text_document_traits::{CompactTextDocument, TextDocument};
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, ToStringObject};
use dup_crypto::keys::*;
pub use v10::{MembershipDocumentV10, MembershipDocumentV10Stringified};
/// Wrap an Membership document.
///
......
......@@ -15,13 +15,16 @@
//! Wrappers around Membership documents v10.
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::TextDocumentParseError;
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use crate::text_document_traits::*;
/// Type of a Membership.
#[derive(Debug, Deserialize, Clone, Copy, Hash, Serialize, PartialEq, Eq)]
pub enum MembershipType {
......
......@@ -21,9 +21,8 @@ use crate::documents::identity::*;
use crate::documents::membership::*;
use crate::documents::revocation::*;
use crate::documents::transaction::*;
use crate::Rule;
use crate::*;
use dubp_common_doc::parser::{DocumentsParser, Rule, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::ToStringObject;
use durs_common_tools::fatal_error;
use pest::iterators::Pair;
use pest::Parser;
......@@ -194,8 +193,9 @@ impl UserDocumentDUBP {
#[cfg(test)]
mod tests {
use crate::blockstamp::Blockstamp;
use crate::*;
use dubp_common_doc::parser::TextDocumentParser;
use dubp_common_doc::traits::Document;
use dubp_common_doc::Blockstamp;
use super::certification::CertificationDocumentParser;
use super::identity::IdentityDocumentParser;
......
......@@ -17,17 +17,18 @@
pub mod v10;
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::{Document, ToStringObject};
use dup_crypto::keys::*;
use pest::Parser;
pub use v10::{
CompactRevocationDocumentV10, CompactRevocationDocumentV10Stringified, RevocationDocumentV10,
RevocationDocumentV10Stringified,
};
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use dup_crypto::keys::*;
use pest::Parser;
/// Wrap an Revocation document.
///
/// Must be created by parsing a text document or using a builder.
......
......@@ -32,9 +32,13 @@
use dup_crypto::keys::*;
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use crate::text_document_traits::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::TextDocumentParseError;
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::Hash;
#[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq, Eq)]
/// Wrap an Compact Revocation document (in block content)
......
......@@ -15,7 +15,14 @@
//! Wrappers around Transaction documents.
use crate::documents::*;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser};
use dubp_common_doc::traits::text::*;
use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject};
use dubp_common_doc::{BlockHash, BlockNumber};
use dup_crypto::hashs::*;
use dup_crypto::keys::*;
use durs_common_tools::fatal_error;
use pest::iterators::Pair;
use pest::iterators::Pairs;
......@@ -24,10 +31,6 @@ use std::ops::{Add, Deref, Sub};
use std::str::FromStr;
use unwrap::unwrap;
use crate::blockstamp::Blockstamp;
use crate::documents::*;
use crate::text_document_traits::*;
/// Wrap a transaction amount
#[derive(Debug, Copy, Clone, Eq, Ord, PartialEq, PartialOrd, Deserialize, Hash, Serialize)]
pub struct TxAmount(pub isize);
......@@ -944,7 +947,7 @@ impl TextDocumentParser<Rule> for TransactionDocumentParser {
#[cfg(test)]
mod tests {
use super::*;
use crate::Document;
use dubp_common_doc::traits::Document;
#[test]
fn generate_real_document() {
......
......@@ -29,286 +29,19 @@
extern crate log;
#[macro_use]
extern crate failure;
#[macro_use]
extern crate pest_derive;
#[cfg(test)]
#[macro_use]
extern crate pretty_assertions;
#[macro_use]
extern crate serde_derive;
pub mod blockstamp;
pub mod documents;
pub mod parsers;
pub mod text_document_traits;
use dup_crypto::hashs::Hash;
use dup_crypto::keys::*;
use pest::iterators::Pair;
use pest::RuleType;
use serde::Serialize;
use std::cmp::Ordering;
use std::fmt::{Debug, Display, Error, Formatter};
use std::net::AddrParseError;
pub use crate::blockstamp::{Blockstamp, PreviousBlockstamp};
#[derive(Parser)]
#[grammar = "documents_grammar.pest"]
/// Parser for Documents
struct DocumentsParser;
pub trait TextDocumentParser<R: RuleType> {
/// Type of document generated by the parser
type DocumentType;
/// Parse text document from raw format
fn parse(doc: &str) -> Result<Self::DocumentType, TextDocumentParseError>;
/// Parse text document from pest pairs
fn from_pest_pair(pairs: Pair<R>) -> Result<Self::DocumentType, TextDocumentParseError>;
/// Parse text document from versioned pest pairs
fn from_versioned_pest_pair(
version: u16,
pairs: Pair<R>,
) -> Result<Self::DocumentType, TextDocumentParseError>;
}
/// Error with pest parser (grammar)
#[derive(Debug, Clone, Eq, Fail, PartialEq)]
#[fail(display = "Grammar error: {}", _0)]
pub struct PestError(pub String);
impl<T: pest::RuleType> From<pest::error::Error<T>> for PestError {
fn from(e: pest::error::Error<T>) -> Self {
PestError(format!("{}", e))
}
}
/// List of possible errors while parsing a text document.
#[derive(Debug, Clone, Eq, Fail, PartialEq)]
pub enum TextDocumentParseError {
/// The given source don't have a valid specific document format (document type).
#[fail(display = "TextDocumentParseError: Invalid inner format: {}", _0)]
InvalidInnerFormat(String),
/// Ip address parse error
#[fail(display = "TextDocumentParseError: invalid ip: {}", _0)]
IpAddrError(AddrParseError),
/// Error with pest parser
#[fail(display = "TextDocumentParseError: {}", _0)]
PestError(PestError),
/// Unexpected rule
#[fail(display = "TextDocumentParseError: Unexpected rule: '{}'", _0)]
UnexpectedRule(String),
/// Unexpected version
#[fail(display = "TextDocumentParseError: Unexpected version: '{}'", _0)]
UnexpectedVersion(String),
/// Unknown type
#[fail(display = "TextDocumentParseError: UnknownType.")]
UnknownType,
}
impl From<AddrParseError> for TextDocumentParseError {
fn from(e: AddrParseError) -> Self {
TextDocumentParseError::IpAddrError(e)
}
}
impl From<PestError> for TextDocumentParseError {
fn from(e: PestError) -> Self {
TextDocumentParseError::PestError(e)
}
}
impl<T: pest::RuleType> From<pest::error::Error<T>> for TextDocumentParseError {
fn from(e: pest::error::Error<T>) -> Self {
TextDocumentParseError::PestError(e.into())
}
}
/// A block Id.
#[derive(Copy, Clone, Debug, Deserialize, Ord, PartialEq, PartialOrd, Eq, Hash, Serialize)]
pub struct BlockNumber(pub u32);
impl Display for BlockNumber {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "{}", self.0)
}
}
/// Wrapper of a block hash.
#[derive(Copy, Clone, Default, Deserialize, Eq, Ord, PartialEq, PartialOrd, Hash, Serialize)]
pub struct BlockHash(pub Hash);
impl Display for BlockHash {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "{}", self.0.to_hex())
}
}
impl Debug for BlockHash {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "BlockHash({})", self)
}
}
/// trait providing commun methods for any documents of any protocol version.
///
/// # Design choice
///
/// Allow only ed25519 for protocol 10 and many differents
/// schemes for protocol 11 through a proxy type.
pub trait Document: Debug + Clone + PartialEq + Eq {
/// Type of the `PublicKey` used by the document.
type PublicKey: PublicKey;
/// Get document as bytes for signature verification.
fn as_bytes(&self) -> &[u8];
/// Get document blockstamp
fn blockstamp(&self) -> Blockstamp;
/// Get document currency name.
fn currency(&self) -> &str;
/// Iterate over document issuers.
fn issuers(&self) -> &Vec<Self::PublicKey>;
/// Some documents do not directly store the sequence of bytes that will be signed but generate
// it on request, so these types of documents cannot provide a reference to the signed bytes.
fn no_as_bytes(&self) -> bool {
false
}
/// Get document to bytes for signature verification.
fn to_bytes(&self) -> Vec<u8> {
self.as_bytes().to_vec()
}
/// Iterate over document signatures.
fn signatures(&self) -> &Vec<<Self::PublicKey as PublicKey>::Signature>;
/// Verify one signature
#[inline]
fn verify_one_signature(
&self,
public_key: &Self::PublicKey,
signature: &<Self::PublicKey as PublicKey>::Signature,
) -> Result<(), SigError> {
if self.no_as_bytes() {
public_key.verify(&self.to_bytes(), signature)
} else {
public_key.verify(self.as_bytes(), signature)
}
}
/// Verify signatures of document content (as text format)
fn verify_signatures(&self) -> Result<(), DocumentSigsErr> {
let issuers_count = self.issuers().len();
let signatures_count = self.signatures().len();
if issuers_count != signatures_count {
Err(DocumentSigsErr::IncompletePairs(
issuers_count,
signatures_count,
))
} else {
let issuers = self.issuers();
let signatures = self.signatures();
let mismatches: HashMap<usize, SigError> = issuers
.iter()
.zip(signatures)
.enumerate()
.filter_map(|(i, (key, signature))| {
if let Err(e) = self.verify_one_signature(key, signature) {
Some((i, e))
} else {
None
}
})
.collect();
if mismatches.is_empty() {
Ok(())
} else {
Err(DocumentSigsErr::Invalid(mismatches))
}
}
}
/// Get document version.
fn version(&self) -> u16;
}
use std::collections::HashMap;
// todo: à mon avis faudrait pas que y ait de Valid() dans cette enum
// et du coup faudrait que les fonctions qui renvoient un DocumentSigsErr renvoie Result<(), DocumentSigsErr>
// du coup SignatureError dans la local verif sert plus à rien.
/// List of possible errors for document signatures verification.
#[derive(Debug, Eq, PartialEq)]
pub enum DocumentSigsErr {
/// Not same amount of issuers and signatures.
/// (issuers count, signatures count)
IncompletePairs(usize, usize),
/// Signatures don't match.
/// List of mismatching pairs indexes.
Invalid(HashMap<usize, SigError>),
}
/// Trait helper for building new documents.
pub trait DocumentBuilder {
/// Type of the builded document.
type Document: Document;
/// Type of the private keys signing the documents.
type PrivateKey: PrivateKey<
Signature = <<Self::Document as Document>::PublicKey as PublicKey>::Signature,
>;
/// Build a document with provided signatures.
fn build_with_signature(
&self,
signatures: Vec<<<Self::Document as Document>::PublicKey as PublicKey>::Signature>,
) -> Self::Document;
/// Build a document and sign it with the private key.
fn build_and_sign(&self, private_keys: Vec<Self::PrivateKey>) -> Self::Document;
}
/// Trait for a document parser from a `S` source
/// format to a `D` document. Will return the
/// parsed document or an `E` error.
pub trait DocumentParser<S, D, E> {
/// Parse a source and return a document or an error.
fn parse(source: S) -> Result<D, E>;
}
/// Stringify a document
pub trait ToStringObject {
type StringObject: Serialize;
/// Transforms object fields into string
fn to_string_object(&self) -> Self::StringObject;
}
/// Jsonify a document
pub trait ToJsonObject: ToStringObject {
/// Convert to JSON String
fn to_json_string(&self) -> Result<String, serde_json::Error> {
Ok(serde_json::to_string(&self.to_string_object())?)
}
/// Convert to JSON String pretty
fn to_json_string_pretty(&self) -> Result<String, serde_json::Error> {
Ok(serde_json::to_string_pretty(&self.to_string_object())?)
}
}
impl<T: ToStringObject> ToJsonObject for T {}
#[cfg(test)]
mod tests {
use super::*;
use crate::documents::UserDocumentDUBP;
use dubp_common_doc::parser::TextDocumentParser;
#[test]
fn parse_dubp_document() {
......
......@@ -17,6 +17,7 @@ use crate::documents::block::{v10::TxDocOrTxHash, BlockDocument, BlockDocumentV1
use crate::documents::membership::v10::MembershipType;
use crate::parsers::{serde_json_value_to_pest_json_value, DefaultHasher};
use crate::*;
use dubp_common_doc::{BlockHash, BlockNumber};
use dubp_currency_params::genesis_block_params::v10::BlockV10Parameters;
use dubp_currency_params::CurrencyName;
use dup_crypto::bases::BaseConvertionError;
......
......@@ -14,8 +14,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::documents::certification::{CertificationDocumentV10, CompactCertificationDocumentV10};
use crate::text_document_traits::TextDocumentFormat;
use crate::BlockNumber;
use dubp_common_doc::traits::text::TextDocumentFormat;
use dubp_common_doc::BlockNumber;
use dup_crypto::keys::*;
/// Parse array of certification json documents into vector of `CompactCertificationDocument`
......
......@@ -14,8 +14,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::documents::identity::v10::*;
use crate::Blockstamp;
use crate::DocumentBuilder;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::traits::DocumentBuilder;
use dup_crypto::keys::*;
#[derive(Debug, Fail)]
......
......@@ -14,8 +14,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::documents::membership::v10::*;
use crate::Blockstamp;
use crate::DocumentBuilder;
use dubp_common_doc::blockstamp::Blockstamp;
use dubp_common_doc::traits::DocumentBuilder;
use dup_crypto::keys::*;
use failure::Error;
......
......@@ -80,9 +80,10 @@ fn serde_json_value_to_pest_json_value(
#[cfg(test)]
mod tests {
use crate::blockstamp::Blockstamp;
use crate::documents::transaction::*;
use crate::*;
use dubp_common_doc::traits::DocumentBuilder;
use dubp_common_doc::Blockstamp;
use dup_crypto::keys::*;
use std::str::FromStr;
pub fn first_g1_tx_doc() -> TransactionDocument {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment