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
53 changes: 33 additions & 20 deletions near-plugins-derive/src/access_controllable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
account: account_id.clone(),
by: ::near_sdk::env::predecessor_account_id(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

is_new_super_admin
Expand Down Expand Up @@ -178,7 +178,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
account: account_id.clone(),
by: ::near_sdk::env::predecessor_account_id(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

was_super_admin
Expand Down Expand Up @@ -211,7 +211,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
account: account_id.clone(),
by: ::near_sdk::env::predecessor_account_id(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

is_new_admin
Expand Down Expand Up @@ -260,7 +260,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
account: account_id.clone(),
by: ::near_sdk::env::predecessor_account_id(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

was_admin
Expand Down Expand Up @@ -291,7 +291,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
by: ::near_sdk::env::predecessor_account_id(),
to: account_id.clone(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

is_new_grantee
Expand Down Expand Up @@ -324,7 +324,7 @@ pub fn access_controllable(attrs: TokenStream, item: TokenStream) -> TokenStream
from: account_id.clone(),
by: ::near_sdk::env::predecessor_account_id(),
};
event.emit();
::#cratename::events::AsEvent::emit(&event);
}

was_grantee
Expand Down Expand Up @@ -394,9 +394,10 @@ 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::try_from(skip).expect("skip should be in the range of usize");
let limit = usize::try_from(limit).expect("limit should be in the range of usize");

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 set = match self.bearers.get(&permission) {
Some(set) => set,
None => return vec![],
Expand Down Expand Up @@ -434,63 +435,75 @@ 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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
self.#acl_field.revoke_admin(role, &account_id)
}

fn acl_renounce_admin(&mut self, role: String) -> bool {
let role = <#role_type>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
self.#acl_field.revoke_role(role, &account_id)
}

fn acl_renounce_role(&mut self, role: String) -> bool {
let role = <#role_type>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#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| <#role_type>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE))
.map(|role| {
::std::convert::TryFrom::try_from(role.as_str()).expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let permission = <#bitflags_type>::from_bits(role.acl_admin_permission())
.expect(#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>::try_from(role.as_str()).expect(#ERR_PARSE_ROLE);
let role: #role_type = ::std::convert::TryFrom::try_from(role.as_str())
.expect(#ERR_PARSE_ROLE);
let permission = <#bitflags_type>::from_bits(role.acl_permission())
.expect(#ERR_PARSE_BITFLAG);
self.#acl_field.get_bearers(permission, skip, limit)
Expand Down
2 changes: 0 additions & 2 deletions near-plugins/tests/contracts/access_controllable/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use near_plugins::events::AsEvent;
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll no longer need to ask contract developers to do this (same for TryFrom below).

use near_plugins::{access_control, access_control_any, AccessControlRole, AccessControllable};
use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::serde::{Deserialize, Serialize};
use near_sdk::{env, log, near_bindgen, AccountId};
use std::collections::HashMap;
use std::convert::TryFrom;

#[derive(AccessControlRole, Deserialize, Serialize, Copy, Clone)]
#[serde(crate = "near_sdk::serde")]
Expand Down