Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
permission.cpp
Go to the documentation of this file.
5
6namespace sysio { namespace chain { namespace webassembly {
7 void unpack_provided_keys( flat_set<public_key_type>& keys, const char* pubkeys_data, uint32_t pubkeys_size ) {
8 keys.clear();
9 if( pubkeys_size == 0 ) return;
10
11 keys = fc::raw::unpack<flat_set<public_key_type>>( pubkeys_data, pubkeys_size );
12 }
13
14 void unpack_provided_permissions( flat_set<permission_level>& permissions, const char* perms_data, uint32_t perms_size ) {
15 permissions.clear();
16 if( perms_size == 0 ) return;
17
18 permissions = fc::raw::unpack<flat_set<permission_level>>( perms_data, perms_size );
19 }
20
22 legacy_span<const char> pubkeys_data,
23 legacy_span<const char> perms_data ) const {
24 transaction trx = fc::raw::unpack<transaction>( trx_data.data(), trx_data.size() );
25
26 flat_set<public_key_type> provided_keys;
27 unpack_provided_keys( provided_keys, pubkeys_data.data(), pubkeys_data.size() );
28
29 flat_set<permission_level> provided_permissions;
30 unpack_provided_permissions( provided_permissions, perms_data.data(), perms_data.size() );
31
32 try {
33 context.control
34 .get_authorization_manager()
35 .check_authorization( trx.actions,
36 provided_keys,
37 provided_permissions,
39 std::bind(&transaction_context::checktime, &context.trx_context),
40 false
41 );
42 return true;
43 } catch( const authorization_exception& e ) {}
44
45 return false;
46 }
47
49 legacy_span<const char> pubkeys_data,
50 legacy_span<const char> perms_data,
51 uint64_t delay_us ) const {
52 SYS_ASSERT( delay_us <= static_cast<uint64_t>(std::numeric_limits<int64_t>::max()),
53 action_validate_exception, "provided delay is too large" );
54
55 flat_set<public_key_type> provided_keys;
56 unpack_provided_keys( provided_keys, pubkeys_data.data(), pubkeys_data.size() );
57
58 flat_set<permission_level> provided_permissions;
59 unpack_provided_permissions( provided_permissions, perms_data.data(), perms_data.size() );
60
61 try {
62 context.control
63 .get_authorization_manager()
64 .check_authorization( account,
65 permission,
66 provided_keys,
67 provided_permissions,
68 fc::microseconds(delay_us),
69 std::bind(&transaction_context::checktime, &context.trx_context),
70 false
71 );
72 return true;
73 } catch( const authorization_exception& e ) {}
74
75 return false;
76 }
77
79 const auto& am = context.control.get_authorization_manager();
80 return am.get_permission_last_used( am.get_permission({account, permission}) ).time_since_epoch().count();
81 };
82
84 const auto* acct = context.db.find<account_object, by_name>(account);
85 SYS_ASSERT( acct != nullptr, action_validate_exception,
86 "account '${account}' does not exist", ("account", account) );
87 return time_point(acct->creation_date).time_since_epoch().count();
88 }
89}}} // ns sysio::chain::webassembly
#define SYS_ASSERT(expr, exc_type, FORMAT,...)
Definition exceptions.hpp:7
constexpr int64_t count() const
Definition time.hpp:26
constexpr const microseconds & time_since_epoch() const
Definition time.hpp:52
bool check_permission_authorization(account_name account, permission_name permission, legacy_span< const char > pubkeys_data, legacy_span< const char > perms_data, uint64_t delay_us) const
int64_t get_account_creation_time(account_name account) const
int64_t get_permission_last_used(account_name account, permission_name permission) const
bool check_transaction_authorization(legacy_span< const char > trx_data, legacy_span< const char > pubkeys_data, legacy_span< const char > perms_data) const
void unpack(Stream &s, std::deque< T > &value)
Definition raw.hpp:540
constexpr microseconds seconds(int64_t s)
Definition time.hpp:32
void unpack_provided_permissions(flat_set< permission_level > &permissions, const char *perms_data, uint32_t perms_size)
void unpack_provided_keys(flat_set< public_key_type > &keys, const char *pubkeys_data, uint32_t pubkeys_size)
Definition permission.cpp:7
key Invalid authority Invalid transaction Invalid block ID Invalid packed transaction Invalid chain ID Invalid symbol Signature type is not a currently activated type Block can not be found Unlinkable block Block does not guarantee concurrent execution without conflicts Block exhausted allowed resources Block is from the future Block is not signed by expected producer Block includes an ill formed protocol feature activation extension Block includes an ill formed additional block signature extension Error decompressing transaction Transaction should have at least one required authority Expired Transaction Invalid Reference Block Duplicate deferred transaction The transaction can not be found Transaction is too big Invalid transaction extension Transaction includes disallowed Transaction exceeded transient resource limit action_validate_exception
signed __int64 int64_t
Definition stdint.h:135
unsigned int uint32_t
Definition stdint.h:126
unsigned __int64 uint64_t
Definition stdint.h:136
Immutable except for fc::from_variant.
Definition name.hpp:43
fc::unsigned_int delay_sec
upper limit on the total CPU time billed for this transaction
vector< action > actions