LCOV - code coverage report
Current view: top level - shared_model/validators/protobuf - proto_transaction_validator.cpp (source / functions) Hit Total Coverage
Test: cleared_cor.info Lines: 51 51 100.0 %
Date: 2019-03-07 14:46:43 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /**
       2             :  * Copyright Soramitsu Co., Ltd. All Rights Reserved.
       3             :  * SPDX-License-Identifier: Apache-2.0
       4             :  */
       5             : 
       6             : #include "validators/protobuf/proto_transaction_validator.hpp"
       7             : 
       8             : #include "validators/validators_common.hpp"
       9             : 
      10             : namespace shared_model {
      11             :   namespace validation {
      12             : 
      13             :     void validatePublicKey(const std::string &public_key,
      14             :                            ReasonsGroupType &reason) {
      15        5571 :       if (not validateHexString(public_key)) {
      16           5 :         reason.second.emplace_back("Public key is not in hex format");
      17           5 :       }
      18        5567 :     }
      19             : 
      20             :     Answer validateProtoTx(const iroha::protocol::Transaction &transaction) {
      21        8593 :       Answer answer;
      22        8593 :       std::string tx_reason_name = "Protobuf Transaction";
      23        8651 :       ReasonsGroupType reason(tx_reason_name, GroupedReasons());
      24       29751 :       for (const auto &command :
      25        8683 :            transaction.payload().reduced_payload().commands()) {
      26       20803 :         switch (command.command_case()) {
      27             :           case iroha::protocol::Command::COMMAND_NOT_SET: {
      28           1 :             reason.second.emplace_back("Undefined command is found");
      29           1 :             answer.addReason(std::move(reason));
      30           1 :             return answer;
      31             :           }
      32             :           case iroha::protocol::Command::kAddSignatory: {
      33        1261 :             const auto &as = command.add_signatory();
      34        1261 :             validatePublicKey(as.public_key(), reason);
      35        1266 :             break;
      36             :           }
      37             :           case iroha::protocol::Command::kCreateAccount: {
      38        4119 :             const auto &ca = command.create_account();
      39        4119 :             validatePublicKey(ca.public_key(), reason);
      40        4170 :             break;
      41             :           }
      42             :           case iroha::protocol::Command::kRemoveSignatory: {
      43         128 :             const auto &rs = command.remove_signatory();
      44         128 :             validatePublicKey(rs.public_key(), reason);
      45         125 :             break;
      46             :           }
      47             :           case iroha::protocol::Command::kAddPeer: {
      48           2 :             const auto &ap = command.add_peer();
      49           2 :             validatePublicKey(ap.peer().peer_key(), reason);
      50           2 :             break;
      51             :           }
      52             :           case iroha::protocol::Command::kCreateRole: {
      53        3458 :             const auto &cr = command.create_role();
      54        3478 :             bool all_permissions_valid = std::all_of(
      55        3458 :                 cr.permissions().begin(),
      56        3473 :                 cr.permissions().end(),
      57             :                 [](const auto &perm) {
      58        6598 :                   return iroha::protocol::RolePermission_IsValid(perm);
      59             :                 });
      60        3478 :             if (not all_permissions_valid) {
      61           1 :               reason.second.emplace_back("Invalid role permission");
      62           1 :             }
      63        3471 :             break;
      64             :           }
      65             :           case iroha::protocol::Command::kGrantPermission: {
      66         371 :             if (not iroha::protocol::GrantablePermission_IsValid(
      67         369 :                     command.grant_permission().permission())) {
      68           1 :               reason.second.emplace_back("Invalid grantable permission");
      69           1 :             }
      70         370 :             break;
      71             :           }
      72             :           case iroha::protocol::Command::kRevokePermission: {
      73         143 :             if (not iroha::protocol::GrantablePermission_IsValid(
      74         144 :                     command.revoke_permission().permission())) {
      75           1 :               reason.second.emplace_back("Invalid grantable permission");
      76           1 :             }
      77         142 :             break;
      78             :           }
      79             :           default:
      80       11310 :             break;
      81             :         }
      82             :       }
      83        8810 :       if (not reason.second.empty()) {
      84           8 :         answer.addReason(std::move(reason));
      85           8 :       }
      86        8809 :       return answer;
      87        8794 :     }
      88             : 
      89             :     Answer ProtoTransactionValidator::validate(
      90             :         const iroha::protocol::Transaction &tx) const {
      91        8723 :       return validateProtoTx(tx);
      92             :     }
      93             :   }  // namespace validation
      94             : }  // namespace shared_model

Generated by: LCOV version 1.13