diff --git a/libraries/native_contract/eos_contract.cpp b/libraries/native_contract/eos_contract.cpp index cf8ea4d943a05158612dee2ca25407f6bc9cf0e7..13117b56818fb7c28aa2c73a93451e26fe03e207 100644 --- a/libraries/native_contract/eos_contract.cpp +++ b/libraries/native_contract/eos_contract.cpp @@ -1,12 +1,13 @@ #include -#include #include #include -#include #include +#include +#include #include +#include #include #include #include @@ -360,8 +361,36 @@ void apply_eos_setproxy(apply_context& context) { */ } +void apply_eos_linkauth(apply_context& context) { + auto requirement = context.msg.as(); -///@} + EOS_ASSERT(!requirement.requirement.empty(), message_validate_exception, "Required permission cannot be empty"); + + context.require_authorization(requirement.account); + + auto& db = context.mutable_db; + db.get(requirement.account); + db.get(requirement.code); + db.get(requirement.requirement); + + auto linkKey = boost::make_tuple(requirement.account, requirement.code, requirement.type); + auto link = db.find(linkKey); + + if (link) { + EOS_ASSERT(link->required_permission != requirement.requirement, message_precondition_exception, + "Attempting to update required authority, but new requirement is same as old."); + db.modify(*link, [requirement = requirement.requirement](permission_link_object& link) { + link.required_permission = requirement; + }); + } else { + db.create([&requirement](permission_link_object& link) { + link.account = requirement.account; + link.code = requirement.code; + link.message_type = requirement.type; + link.required_permission = requirement.requirement; + }); + } +} } // namespace eos } // namespace native diff --git a/libraries/types/types.eos b/libraries/types/types.eos index b1ca2d1a611aface552675680508bcc6abb87faf..5aaea9332b6bfdb6a8a035a7828600210cc0a0d3 100644 --- a/libraries/types/types.eos +++ b/libraries/types/types.eos @@ -129,5 +129,5 @@ struct DeletePermission struct linkauth account AccountName # The account to require permissions for code AccountName # The contract to require permissions to invoke - type FuncName # The message type to require permissions to invoke (if empty, all message types for contract) - requirement PermissionName # The permission name to require (if empty, use default permission requirement) + type FuncName + requirement PermissionName # The permission name to require