123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- pragma solidity ^0.4.18;
- import './Roles.sol';
- /**
- * @title RBAC (Role-Based Access Control)
- * @author Matt Condon (@Shrugs)
- * @dev Stores and provides setters and getters for roles and addresses.
- * Supports unlimited numbers of roles and addresses.
- * See //contracts/examples/RBACExample.sol for an example of usage.
- * This RBAC method uses strings to key roles. It may be beneficial
- * for you to write your own implementation of this interface using Enums or similar.
- * It's also recommended that you define constants in the contract, like ROLE_ADMIN below,
- * to avoid typos.
- */
- contract RBAC {
- using Roles for Roles.Role;
- mapping (string => Roles.Role) private roles;
- event RoleAdded(address addr, string roleName);
- event RoleRemoved(address addr, string roleName);
- /**
- * A constant role name for indicating admins.
- */
- string public constant ROLE_ADMIN = "admin";
- /**
- * @dev constructor. Sets msg.sender as admin by default
- */
- function RBAC()
- public
- {
- addRole(msg.sender, ROLE_ADMIN);
- }
- /**
- * @dev add a role to an address
- * @param addr address
- * @param roleName the name of the role
- */
- function addRole(address addr, string roleName)
- internal
- {
- roles[roleName].add(addr);
- RoleAdded(addr, roleName);
- }
- /**
- * @dev remove a role from an address
- * @param addr address
- * @param roleName the name of the role
- */
- function removeRole(address addr, string roleName)
- internal
- {
- roles[roleName].remove(addr);
- RoleRemoved(addr, roleName);
- }
- /**
- * @dev reverts if addr does not have role
- * @param addr address
- * @param roleName the name of the role
- * // reverts
- */
- function checkRole(address addr, string roleName)
- view
- public
- {
- roles[roleName].check(addr);
- }
- /**
- * @dev determine if addr has role
- * @param addr address
- * @param roleName the name of the role
- * @return bool
- */
- function hasRole(address addr, string roleName)
- view
- public
- returns (bool)
- {
- return roles[roleName].has(addr);
- }
- /**
- * @dev add a role to an address
- * @param addr address
- * @param roleName the name of the role
- */
- function adminAddRole(address addr, string roleName)
- onlyAdmin
- public
- {
- addRole(addr, roleName);
- }
- /**
- * @dev remove a role from an address
- * @param addr address
- * @param roleName the name of the role
- */
- function adminRemoveRole(address addr, string roleName)
- onlyAdmin
- public
- {
- removeRole(addr, roleName);
- }
- /**
- * @dev modifier to scope access to a single role (uses msg.sender as addr)
- * @param roleName the name of the role
- * // reverts
- */
- modifier onlyRole(string roleName)
- {
- checkRole(msg.sender, roleName);
- _;
- }
- /**
- * @dev modifier to scope access to admins
- * // reverts
- */
- modifier onlyAdmin()
- {
- checkRole(msg.sender, ROLE_ADMIN);
- _;
- }
- /**
- * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
- * @param roleNames the names of the roles to scope access to
- * // reverts
- *
- * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
- * see: https://github.com/ethereum/solidity/issues/2467
- */
- // modifier onlyRoles(string[] roleNames) {
- // bool hasAnyRole = false;
- // for (uint8 i = 0; i < roleNames.length; i++) {
- // if (hasRole(msg.sender, roleNames[i])) {
- // hasAnyRole = true;
- // break;
- // }
- // }
- // require(hasAnyRole);
- // _;
- // }
- }
|