hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
field_validator.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_SHARED_MODEL_FIELD_VALIDATOR_HPP
7 #define IROHA_SHARED_MODEL_FIELD_VALIDATOR_HPP
8 
9 #include <regex>
10 
12 #include "datetime/time.hpp"
18 
19 namespace shared_model {
20 
21  namespace interface {
22  class Account;
23  class AccountAsset;
24  class AccountDetailPaginationMeta;
25  class AccountDetailRecordId;
26  class Amount;
27  class Asset;
28  class AssetPaginationMeta;
29  class BatchMeta;
30  class Domain;
31  class Peer;
32  class TxPaginationMeta;
33  } // namespace interface
34 
35  namespace validation {
36 
42  private:
43  using TimeFunction = std::function<iroha::ts64_t()>;
44 
45  public:
46  // todo igor-egorov 05.04.2018 IR-439 Remove ValidatorsConfig from
47  // FieldValidator
48  FieldValidator(std::shared_ptr<ValidatorsConfig> config,
49  time_t future_gap = kDefaultFutureGap,
50  TimeFunction time_provider = [] {
51  return iroha::time::now();
52  });
53 
54  std::optional<ValidationError> validateAccountId(
55  const interface::types::AccountIdType &account_id) const;
56 
57  std::optional<ValidationError> validateAssetId(
58  const interface::types::AssetIdType &asset_id) const;
59 
60  std::optional<ValidationError> validateEvmHexAddress(
61  std::string_view address) const;
62 
63  std::optional<ValidationError> validateBytecode(
64  interface::types::EvmCodeHexStringView input) const;
65 
66  std::optional<ValidationError> validatePeer(
67  const interface::Peer &peer) const;
68 
69  std::optional<ValidationError> validateAmount(
70  const interface::Amount &amount) const;
71 
72  std::optional<ValidationError> validatePubkey(
73  std::string_view pubkey) const;
74 
75  std::optional<ValidationError> validatePeerAddress(
76  const interface::types::AddressType &address) const;
77 
78  std::optional<ValidationError> validateRoleId(
79  const interface::types::RoleIdType &role_id) const;
80 
81  std::optional<ValidationError> validateAccountName(
82  const interface::types::AccountNameType &account_name) const;
83 
84  // clang-format off
105  // clang-format on
106  std::optional<ValidationError> validateDomainId(
107  const interface::types::DomainIdType &domain_id) const;
108 
109  std::optional<ValidationError> validateDomain(
110  const interface::Domain &domain) const;
111 
112  std::optional<ValidationError> validateAssetName(
113  const interface::types::AssetNameType &asset_name) const;
114 
115  std::optional<ValidationError> validateAccountDetailKey(
116  const interface::types::AccountDetailKeyType &key) const;
117 
118  std::optional<ValidationError> validateAccountDetailValue(
119  const interface::types::AccountDetailValueType &value) const;
120 
121  std::optional<ValidationError> validateOldAccountDetailValue(
122  const std::optional<interface::types::AccountDetailValueType>
123  &old_value) const;
124 
125  std::optional<ValidationError> validatePrecision(
126  const interface::types::PrecisionType &precision) const;
127 
128  std::optional<ValidationError> validateRolePermission(
129  const interface::permissions::Role &permission) const;
130 
131  std::optional<ValidationError> validateGrantablePermission(
132  const interface::permissions::Grantable &permission) const;
133 
134  std::optional<ValidationError> validateQuorum(
135  const interface::types::QuorumType &quorum) const;
136 
137  std::optional<ValidationError> validateCreatorAccountId(
138  const interface::types::AccountIdType &account_id) const;
139 
140  std::optional<ValidationError> validateAccount(
141  const interface::Account &account) const;
142 
146  std::optional<ValidationError> validateCreatedTime(
149 
153  std::optional<ValidationError> validateCreatedTime(
154  interface::types::TimestampType timestamp) const;
155 
156  std::optional<ValidationError> validateCounter(
157  const interface::types::CounterType &counter) const;
158 
159  std::optional<ValidationError> validateSignatureForm(
160  const interface::Signature &signature) const;
161 
162  std::optional<ValidationError> validateSignatures(
163  const interface::types::SignatureRangeType &signatures,
164  const crypto::Blob &source) const;
165 
166  std::optional<ValidationError> validateQueryPayloadMeta(
167  const interface::QueryPayloadMeta &meta) const;
168 
169  std::optional<ValidationError> validateDescription(
170  const interface::types::DescriptionType &description) const;
171 
172  std::optional<ValidationError> validateBatchMeta(
173  const interface::BatchMeta &description) const;
174 
175  std::optional<ValidationError> validateHeight(
176  const interface::types::HeightType &height) const;
177 
178  std::optional<ValidationError> validateHash(
179  const crypto::Hash &hash) const;
180 
181  std::optional<ValidationError> validateTxPaginationMeta(
182  const interface::TxPaginationMeta &tx_pagination_meta) const;
183 
184  std::optional<ValidationError> validateAccountAsset(
185  const interface::AccountAsset &account_asset) const;
186 
187  std::optional<ValidationError> validateAsset(
188  const interface::Asset &asset) const;
189 
190  std::optional<ValidationError> validateAssetPaginationMeta(
191  const interface::AssetPaginationMeta &asset_pagination_meta) const;
192 
193  std::optional<ValidationError> validateAccountDetailRecordId(
194  const interface::AccountDetailRecordId &record_id) const;
195 
196  std::optional<ValidationError> validateAccountDetailPaginationMeta(
197  const interface::AccountDetailPaginationMeta &pagination_meta) const;
198 
199  private:
200  // gap for future transactions
201  time_t future_gap_;
202  // time provider callback
203  TimeFunction time_provider_;
204 
205  public:
206  // max-delay between tx creation and validation
207  static constexpr auto kMaxDelay =
208  std::chrono::hours(24) / std::chrono::milliseconds(1);
209  // default value for future_gap field of FieldValidator
210  static constexpr auto kDefaultFutureGap =
211  std::chrono::minutes(5) / std::chrono::milliseconds(1);
212 
213  static constexpr size_t hash_size =
216  static constexpr size_t value_size = 4 * 1024 * 1024;
217  static constexpr size_t kMaxDescriptionSize = 100 * 1024; // 100K
218  };
219 
220  std::optional<ValidationError> validatePubkey(
221  shared_model::interface::types::PublicKeyHexStringView pubkey);
222 
223  std::optional<ValidationError> validatePubkey(std::string_view pubkey);
224 
225  } // namespace validation
226 } // namespace shared_model
227 
228 #endif // IROHA_SHARED_MODEL_FIELD_VALIDATOR_HPP
Definition: account.hpp:20
std::string AddressType
Type of peer address.
Definition: types.hpp:50
uint64_t HeightType
Type of height (for Block, Proposal etc)
Definition: types.hpp:48
Definition: hash.hpp:18
Definition: blob.hpp:27
Definition: signature.hpp:18
Grantable
Definition: permissions.hpp:76
Definition: peer.hpp:20
Provides query metadata for account detail list pagination.
Definition: account_detail_pagination_meta.hpp:18
decltype(iroha::time::now()) time_t
Definition: time.hpp:38
std::string DomainIdType
Iroha domain id type.
Definition: types.hpp:58
Definition: amount.hpp:21
Definition: domain.hpp:19
auto now()
Definition: time.hpp:23
boost::any_range< interface::Signature, boost::forward_traversal_tag, const Signature & > SignatureRangeType
Type of signature range, which returns when signatures are invoked.
Definition: range_types.hpp:24
Provides query metadata for account detail list pagination.
Definition: account_detail_record_id.hpp:17
std::string DescriptionType
Type of the transfer message.
Definition: types.hpp:88
Definition: query_payload_meta.hpp:19
std::string AccountDetailKeyType
Type of account detail key.
Definition: types.hpp:81
std::optional< ValidationError > validatePubkey(shared_model::interface::types::PublicKeyHexStringView pubkey)
Role
Definition: permissions.hpp:18
std::string AccountIdType
Type of account id.
Definition: types.hpp:38
hash256_t hash(const T &pb)
Definition: pb_common.hpp:43
Definition: asset.hpp:19
Provides query metadata for any transaction list pagination.
Definition: tx_pagination_meta.hpp:19
Definition: field_validator.hpp:41
uint8_t PrecisionType
Type of precision.
Definition: types.hpp:46
std::string AccountNameType
Type of account name.
Definition: types.hpp:73
bool validateHeight(const uint64_t &height)
Definition: validators_common.cpp:31
uint64_t CounterType
Type of counter.
Definition: types.hpp:71
Definition: batch_meta.hpp:18
Provides query metadata for asset list pagination.
Definition: asset_pagination_meta.hpp:17
std::string AccountDetailValueType
Type of account detail value.
Definition: types.hpp:83
Definition: command_executor.hpp:13
Definition: account_asset.hpp:20
uint16_t QuorumType
Type of Quorum used in transaction and set quorum.
Definition: types.hpp:67
std::string AssetNameType
Type of asset name.
Definition: types.hpp:75
std::string RoleIdType
Type of role (i.e admin, user)
Definition: types.hpp:56
uint64_t TimestampType
Type of timestamp.
Definition: types.hpp:69
std::string AssetIdType
Type of asset id.
Definition: types.hpp:60