class ClientGetSchemaOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_SCHEMA)), (TARGET_NYM, IdentifierField()), (DATA, GetSchemaField()), )
class GetSchemaField(MessageValidator): schema = ((SCHEMA_NAME, LimitedLengthStringField(max_length=NAME_FIELD_LIMIT)), (SCHEMA_VERSION, VersionField(version_cls=SchemaVersion)), (ORIGIN, IdentifierField(optional=True)))
class ClientGetNymOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_NYM)), (TARGET_NYM, IdentifierField()), )
class ClientGetContextOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_CONTEXT)), (CONTEXT_FROM, IdentifierField()), (META, GetContextField()), )
class ClientGetAttribOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_ATTR)), (TARGET_NYM, IdentifierField(optional=True)), (RAW, LimitedLengthStringField(max_length=RAW_FIELD_LIMIT)), )
class ClientGetRsSchemaOperation(MessageValidator): schema = ( (TXN_TYPE, ConstantField(GET_RS_SCHEMA)), (RS_SCHEMA_FROM, IdentifierField()), (META, RsSchemaMetaField()), )
class GetSchemaField(MessageValidator): schema = ( (SCHEMA_NAME, LimitedLengthStringField(max_length=NAME_FIELD_LIMIT)), (SCHEMA_VERSION, VersionField(components_number=(2, 3,), max_length=VERSION_FIELD_LIMIT)), (ORIGIN, IdentifierField(optional=True)) )
class ClientMessageValidator(MessageValidator): schema = ( (f.IDENTIFIER.nm, IdentifierField(optional=True, nullable=True)), (f.REQ_ID.nm, NonNegativeNumberField()), (OPERATION, ClientOperationField()), (f.SIG.nm, SignatureField(max_length=SIGNATURE_FIELD_LIMIT, optional=True)), (f.DIGEST.nm, LimitedLengthStringField(max_length=DIGEST_FIELD_LIMIT, optional=True)), (f.PROTOCOL_VERSION.nm, ProtocolVersionField()), (f.TAA_ACCEPTANCE.nm, ClientTAAAcceptance(optional=True)), (f.SIGS.nm, MapField(IdentifierField(), SignatureField(max_length=SIGNATURE_FIELD_LIMIT), optional=True, nullable=True)), (f.ENDORSER.nm, IdentifierField(optional=True)), ) def __init__(self, operation_schema_is_strict, *args, **kwargs): super().__init__(*args, **kwargs) # Following code is for support of non-strict schema # TODO: refactor this # TODO: this (and all related functionality) can be removed when # when fixed problem with transaction serialization (INDY-338) # Adding fields from enabled plugins to schema. self.schema = self.schema + tuple(PLUGIN_CLIENT_REQUEST_FIELDS.items()) if operation_schema_is_strict: operation_field_index = 2 op = ClientOperationField( schema_is_strict=operation_schema_is_strict) schema = list(self.schema) schema[operation_field_index] = (OPERATION, op) self.schema = tuple(schema) def validate(self, dct): super().validate(dct) identifier = dct.get(f.IDENTIFIER.nm, None) signatures = dct.get(f.SIGS.nm, None) signature = dct.get(f.SIG.nm, None) endorser = dct.get(f.ENDORSER.nm, None) if signatures and signature: self._raise_invalid_message( 'Request can not contain both fields "signatures" and "signature"' ) if endorser is not None: if not signatures or endorser not in signatures: self._raise_invalid_message("Endorser must sign the request") if identifier is None: self._raise_invalid_message( "Author's Identifier must be present when sending via Endorser" ) if not signatures or identifier not in signatures: self._raise_invalid_message( "Author must sign the request when sending via Endorser") if identifier and signatures and identifier not in signatures: self._raise_invalid_message( 'The identifier is not contained in signatures') if not (identifier or signatures): self._raise_invalid_message( 'Missing both signatures and identifier')
import pytest import base58 from plenum.common.messages.fields import IdentifierField from plenum.test.input_validation.utils import b58_by_len validator = IdentifierField() def test_identifiers(): for byte_len in range(1, 33): val = b58_by_len(byte_len) if byte_len in (16, 32): assert not validator.validate(val) else: assert validator.validate(val) def test_invalid_char(): res = validator.validate(b58_by_len(16)[:-1] + '+') assert res assert (res == "should not contain the following chars {}".format( sorted(set('+'))))
class GetContextField(MessageValidator): context = ( (CONTEXT_NAME, LimitedLengthStringField(max_length=NAME_FIELD_LIMIT)), (CONTEXT_VERSION, VersionField(version_cls=ContextVersion)), (ORIGIN, IdentifierField(optional=True)) )