From c061f0aa7e570366390dfecc1812c5f589f089ca Mon Sep 17 00:00:00 2001 From: Eric Ma <78027+zma@users.noreply.github.com> Date: Fri, 26 Nov 2021 16:39:09 +0800 Subject: [PATCH] EPE-1708 cleos sorts keys/permission_levels/waits for "cleos set account permission" --- .../chain/include/eosio/chain/authority.hpp | 18 ++++++++++++++++++ programs/cleos/main.cpp | 1 + 2 files changed, 19 insertions(+) diff --git a/libraries/chain/include/eosio/chain/authority.hpp b/libraries/chain/include/eosio/chain/authority.hpp index 420c929976..5b5da05744 100644 --- a/libraries/chain/include/eosio/chain/authority.hpp +++ b/libraries/chain/include/eosio/chain/authority.hpp @@ -84,6 +84,10 @@ struct permission_level_weight { friend bool operator == ( const permission_level_weight& lhs, const permission_level_weight& rhs ) { return tie( lhs.permission, lhs.weight ) == tie( rhs.permission, rhs.weight ); } + + friend bool operator < ( const permission_level_weight& lhs, const permission_level_weight& rhs ) { + return tie( lhs.permission, lhs.weight ) < tie( rhs.permission, rhs.weight ); + } }; struct key_weight { @@ -93,6 +97,10 @@ struct key_weight { friend bool operator == ( const key_weight& lhs, const key_weight& rhs ) { return tie( lhs.key, lhs.weight ) == tie( rhs.key, rhs.weight ); } + + friend bool operator < ( const key_weight& lhs, const key_weight& rhs ) { + return tie( lhs.key, lhs.weight ) < tie( rhs.key, rhs.weight ); + } }; @@ -137,6 +145,10 @@ struct wait_weight { friend bool operator == ( const wait_weight& lhs, const wait_weight& rhs ) { return tie( lhs.wait_sec, lhs.weight ) == tie( rhs.wait_sec, rhs.weight ); } + + friend bool operator < ( const wait_weight& lhs, const wait_weight& rhs ) { + return tie( lhs.wait_sec, lhs.weight ) < tie( rhs.wait_sec, rhs.weight ); + } }; namespace config { @@ -191,6 +203,12 @@ struct authority { friend bool operator != ( const authority& lhs, const authority& rhs ) { return tie( lhs.threshold, lhs.keys, lhs.accounts, lhs.waits ) != tie( rhs.threshold, rhs.keys, rhs.accounts, rhs.waits ); } + + void sort_fields () { + std::sort(std::begin(keys), std::end(keys)); + std::sort(std::begin(accounts), std::end(accounts)); + std::sort(std::begin(waits), std::end(waits)); + } }; diff --git a/programs/cleos/main.cpp b/programs/cleos/main.cpp index 44cac9f4d1..9b994ccf55 100644 --- a/programs/cleos/main.cpp +++ b/programs/cleos/main.cpp @@ -833,6 +833,7 @@ authority parse_json_authority_or_key(const std::string& authorityJsonOrFile) { } EOS_RETHROW_EXCEPTIONS(public_key_type_exception, "Invalid public key: ${public_key}", ("public_key", authorityJsonOrFile)) } else { auto result = parse_json_authority(authorityJsonOrFile); + result.sort_fields(); EOS_ASSERT( eosio::chain::validate(result), authority_type_exception, "Authority failed validation! ensure that keys, accounts, and waits are sorted and that the threshold is valid and satisfiable!"); return result; }