Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions near-plugins-derive/src/access_control_role.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ pub fn derive_access_control_role(input: TokenStream) -> TokenStream {
fn safe_leftshift(value: u128, n: u8) -> u128 {
value
.checked_shl(n.into())
.expect("Too many enum variants to be represented by bitflags")
.unwrap_or_else(|| ::near_sdk::env::panic_str("Too many enum variants to be represented by bitflags"))
}

impl AccessControlRole for #ident {
Expand All @@ -163,16 +163,15 @@ pub fn derive_access_control_role(input: TokenStream) -> TokenStream {
fn acl_permission(self) -> u128 {
// Shift 1u128 left by an odd number, see module documentation.
let n = (u8::from(self) + 1)
.checked_mul(2)
.expect("Too many enum variants") - 1;
.checked_mul(2).unwrap_or_else(|| ::near_sdk::env::panic_str("Too many enum variants")) - 1;
safe_leftshift(1, n)
}

fn acl_admin_permission(self) -> u128 {
// Shift 1u128 left by an even number, see module documentation.
let n = (u8::from(self) + 1)
.checked_mul(2)
.expect("Too many enum variants");
.unwrap_or_else(|| ::near_sdk::env::panic_str("Too many enum variants"));
safe_leftshift(1, n)
}
}
Expand Down
72 changes: 30 additions & 42 deletions near-plugins-derive/src/access_controllable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
fn __acl_storage_prefix(base: &[u8], specifier: __AclStorageKey) -> Vec<u8> {
let specifier = specifier
.try_to_vec()
.expect("Storage key should be serializable");
.unwrap_or_else(|_| ::near_sdk::env::panic_str("Storage key should be serializable"));
[base, specifier.as_slice()].concat()
}

Expand All @@ -114,7 +114,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream

fn init_super_admin(&mut self, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(<#role_type>::acl_super_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
// TODO use self.get_bearers() once the following PR is merged
// https://github.com/aurora-is-near/near-plugins/pull/12
let number_super_admins = match self.bearers.get(&flag) {
Expand All @@ -125,7 +125,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
return false;
}
let res = self.add_super_admin_unchecked(account_id);
assert!(res, "Failed to init super-admin.");
::near_sdk::require!(res, "Failed to init super-admin.");
res
}

Expand All @@ -135,7 +135,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
/// Note that there may be zero or more super-admins.
fn add_super_admin_unchecked(&mut self, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(<#role_type>::acl_super_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let is_new_super_admin = !permissions.contains(flag);
Expand All @@ -162,15 +162,15 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
}
};
let super_admin = <#bitflags_type>::from_bits(<#role_type>::acl_super_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
permissions.contains(super_admin)
}

/// Revokes super-admin permissions from `account_id` without checking any
/// permissions. It returns whether `account_id` was a super-admin.
fn revoke_super_admin_unchecked(&mut self, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(<#role_type>::acl_super_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let was_super_admin = permissions.contains(flag);
Expand Down Expand Up @@ -202,7 +202,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
/// Note that any role may have multiple (or zero) admins.
fn add_admin_unchecked(&mut self, role: #role_type, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(role.acl_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let is_new_admin = !permissions.contains(flag);
Expand Down Expand Up @@ -230,9 +230,9 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
}
};
let super_admin = <#bitflags_type>::from_bits(<#role_type>::acl_super_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let role_admin = <#bitflags_type>::from_bits(role.acl_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
permissions.contains(super_admin) || permissions.contains(role_admin)
}

Expand All @@ -251,7 +251,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
/// permissions. Returns whether `account_id` was an admin for `role`.
fn revoke_admin_unchecked(&mut self, role: #role_type, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(role.acl_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let was_admin = permissions.contains(flag);
Expand Down Expand Up @@ -282,7 +282,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
/// Returns whether `role` was newly granted to `account_id`.
fn grant_role_unchecked(&mut self, role: #role_type, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let is_new_grantee = !permissions.contains(flag);
Expand Down Expand Up @@ -315,7 +315,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream

fn revoke_role_unchecked(&mut self, role: #role_type, account_id: &::near_sdk::AccountId) -> bool {
let flag = <#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
let mut permissions = self.get_or_init_permissions(account_id);

let was_grantee = permissions.contains(flag);
Expand All @@ -339,7 +339,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
match self.permissions.get(account_id) {
Some(permissions) => {
let flag = <#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
permissions.contains(flag)
}
None => false,
Expand All @@ -355,7 +355,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
.iter()
.map(|role| {
<#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG)
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG))
})
.fold(
<#bitflags_type>::empty(),
Expand All @@ -379,7 +379,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
/// multiple active bits. In that case, the panic prevents polluting
/// state.
fn add_bearer(&mut self, permission: #bitflags_type, account_id: &::near_sdk::AccountId) {
assert!(
::near_sdk::require!(
permission.bits().is_power_of_two(),
"Adding a bearer is allowed only for permissions with exactly one active bit"
);
Expand All @@ -399,10 +399,8 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
///
/// Panics if `skip` or `limit` are outside the range of `usize`.
fn get_bearers(&self, permission: #bitflags_type, skip: u64, limit: u64) -> Vec<::near_sdk::AccountId> {
let skip: usize = ::std::convert::TryFrom::try_from(skip)
.expect("skip should be in the range of usize");
let limit: usize = ::std::convert::TryFrom::try_from(limit)
.expect("limit should be in the range of usize");
let skip: usize = ::std::convert::TryFrom::try_from(skip).unwrap_or_else(|_| ::near_sdk::env::panic_str("skip should be in the range of usize"));
let limit: usize = ::std::convert::TryFrom::try_from(limit).unwrap_or_else(|_| ::near_sdk::env::panic_str("limit should be in the range of usize"));
let set = match self.bearers.get(&permission) {
Some(set) => set,
None => return vec![],
Expand Down Expand Up @@ -445,77 +443,67 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
}

fn acl_add_admin(&mut self, role: String, account_id: ::near_sdk::AccountId) -> Option<bool> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.add_admin(role, &account_id)
}

fn acl_is_admin(&self, role: String, account_id: ::near_sdk::AccountId) -> bool {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.is_admin(role, &account_id)
}

fn acl_revoke_admin(&mut self, role: String, account_id: ::near_sdk::AccountId) -> Option<bool> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.revoke_admin(role, &account_id)
}

fn acl_renounce_admin(&mut self, role: String) -> bool {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.renounce_admin(role)
}

fn acl_revoke_role(&mut self, role: String, account_id: ::near_sdk::AccountId) -> Option<bool> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.revoke_role(role, &account_id)
}

fn acl_renounce_role(&mut self, role: String) -> bool {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.renounce_role(role)
}

fn acl_grant_role(&mut self, role: String, account_id: ::near_sdk::AccountId) -> Option<bool> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.grant_role(role, &account_id)
}


fn acl_has_role(&self, role: String, account_id: ::near_sdk::AccountId) -> bool {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
self.#acl_field.has_role(role, &account_id)
}

fn acl_has_any_role(&self, roles: Vec<String>, account_id: ::near_sdk::AccountId) -> bool {
let roles: Vec<#role_type> = roles
.iter()
.map(|role| {
::std::convert::TryFrom::try_from(role.as_str()).expect(#ERR_PARSE_ROLE)
::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE))
})
.collect();
self.#acl_field.has_any_role(roles, &account_id)
}

fn acl_get_admins(&self, role: String, skip: u64, limit: u64) -> Vec<::near_sdk::AccountId> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
let permission = <#bitflags_type>::from_bits(role.acl_admin_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
self.#acl_field.get_bearers(permission, skip, limit)
}

fn acl_get_grantees(&self, role: String, skip: u64, limit: u64) -> Vec<::near_sdk::AccountId> {
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str()).unwrap_or_else(|_| ::near_sdk::env::panic_str(#ERR_PARSE_ROLE));
let permission = <#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG);
.unwrap_or_else(|| ::near_sdk::env::panic_str(#ERR_PARSE_BITFLAG));
self.#acl_field.get_bearers(permission, skip, limit)
}
}
Expand Down
8 changes: 4 additions & 4 deletions near-plugins-derive/src/ownable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ pub fn derive_ownable(input: TokenStream) -> TokenStream {
fn owner_get(&self) -> Option<::near_sdk::AccountId> {
::near_sdk::env::storage_read(&self.owner_storage_key()).map(|owner_bytes| {
let owner_raw =
String::from_utf8(owner_bytes).expect("Ownable: Invalid string format");
std::convert::TryInto::try_into(owner_raw).expect("Ownable: Invalid account id")
String::from_utf8(owner_bytes).unwrap_or_else(|_| ::near_sdk::env::panic_str("Ownable: Invalid string format"));
std::convert::TryInto::try_into(owner_raw).unwrap_or_else(|_| ::near_sdk::env::panic_str("Ownable: Invalid account id"))
})
}

Expand Down Expand Up @@ -90,7 +90,7 @@ pub fn only(attrs: TokenStream, item: TokenStream) -> TokenStream {
}
let mut contains_self = false;
let mut contains_owner = false;
// TODO: Use darling for this
// TODO: Use darling
for attr in attrs {
match attr.to_string().as_str() {
"self" => contains_self = true,
Expand All @@ -109,7 +109,7 @@ pub fn only(attrs: TokenStream, item: TokenStream) -> TokenStream {
::near_sdk::assert_self();
},
(false, true) => quote! {
assert!(self.owner_is(), "Ownable: Method must be called from owner");
::near_sdk::require!(self.owner_is(), "Ownable: Method must be called from owner");
},
(false, false) => {
panic!("Ownable::only macro target not specified. Select at least one in [self, owner]")
Expand Down
Loading