-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbase_access_control_group.sol
More file actions
164 lines (129 loc) · 5.34 KB
/
Copy pathbase_access_control_group.sol
File metadata and controls
164 lines (129 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
pragma solidity 0.5.4;
//import "./ownable.sol";
import {BaseTypeFactory} from "./base_content_space.sol";
import {AccessIndexor} from "./access_indexor.sol";
import {Editable} from "./editable.sol";
import {Container} from "./container.sol";
import {IUserSpace, INodeSpace} from "./base_space_interfaces.sol";
import {MetaObject, CounterObject} from "./meta_object.sol";
/* -- Revision history --
BsAccessCtrlGrp20190222140700ML: First versioned released
BsAccessCtrlGrp20190315172900ML: Migrated to 0.4.24
BsAccessCtrlGrp20190506153800ML: Adds access indexing
BsAccessCtrlGrp20190510150700ML: Fixes bug (wrong index was used for group rights)
BsAccessCtrlGrp20190722161600ML: Made editable
BsAccessCtrlGrp20190722214400ML: Provides the list of members and managers
BsAccessCtrlGrp20190723130500ML: Fixes typo in managersNum
BsAccessCtrlGrp20190723165900ML: Fixes deletion/adding to groups
BsAccessCtrlGrp20200204160600ML: Removes commented out sections
BsAccessCtrlGrp20200305113000ML: Overloads checkRights to reflect difference between groups and wallets
BsAccessCtrlGrp20200316121700ML: Leverages inherited hasAccess
BsAccessCtrlGrp20200928110000PO: Replace tx.origin with msg.sender in some cases
BsAccessCtrlGrp20210806150000PO: Change impl of group to use maps instead of lists.
*/
contract BaseAccessControlGroup is MetaObject, CounterObject, AccessIndexor, Editable {
bytes32 public version ="BsAccessCtrlGrp20210809150000PO";
mapping(address => bool) public membersMap;
uint256 public membersNum;
mapping(address => bool) public managersMap;
uint256 public managersNum;
event MemberAdded(address candidate);
event ManagerAccessGranted(address candidate);
event MemberRevoked(address candidate);
event ManagerAccessRevoked(address candidate);
event UnauthorizedOperation(uint operationCode, address candidate);
event OAuthStatusChanged(bool enabled);
bool public oauthEnabled;
constructor(address payable _contentSpace) public {
contentSpace = _contentSpace;
membersNum = 0;
managersMap[creator] = true;
managersNum = 1;
oauthEnabled = false;
indexCategory = CATEGORY_GROUP; // 2
}
function setOAuthEnabled(bool _enabled) public onlyOwner {
oauthEnabled = _enabled;
emit OAuthStatusChanged(_enabled);
}
bool public isConsumerGroup;
function setIsConsumerGroup(bool _enabled) public onlyOwner {
isConsumerGroup = _enabled;
}
function grantManagerAccess(address payable manager) public onlyOwner {
bool already = false;
if (!managersMap[manager]) {
managersMap[manager] = true;
managersNum++;
}
emit ManagerAccessGranted(manager);
setRights(manager, TYPE_EDIT, ACCESS_TENTATIVE);
}
function revokeManagerAccess(address payable manager) public {
require((msg.sender == owner) || (msg.sender == manager));
if (managersMap[manager]) {
delete managersMap[manager];
managersNum--;
}
emit ManagerAccessRevoked(manager);
setRights(manager, TYPE_EDIT, ACCESS_NONE);
}
function isAdmin(address payable _candidate) public view returns (bool) {
if (_candidate == owner) {
return true;
}
return managersMap[_candidate];
}
address public tenant; // (optional?) address of tenant contract
function setTenant(address _tenantAddr) public {
require(isAdmin(msg.sender));
tenant = _tenantAddr;
}
// overload ...
function hasEditorRight(address _candidate) public view returns (bool) {
if (_candidate == tenant) {
return true;
}
return super.hasEditorRight(_candidate);
}
function hasManagerAccess(address _candidate) public view returns (bool) {
return _candidate == tenant || hasEditorRight(_candidate);
}
function hasAccessRight(address payable candidate, bool mgr) public view returns (bool) {
if (mgr == true) {
return hasEditorRight(candidate);
} else {
return hasAccess(candidate);
}
}
function grantAccessMany(address payable[] memory candidates) public {
for (uint i = 0; i < candidates.length; i++) {
grantAccess(candidates[i]);
}
}
function grantAccess(address payable candidate) public {
require(hasManagerAccess(msg.sender) || (isConsumerGroup && (msg.sender == candidate)));
if (!membersMap[candidate]) {
membersMap[candidate] = true;
membersNum++;
}
emit MemberAdded(candidate);
setRights(candidate, TYPE_ACCESS, ACCESS_TENTATIVE);
}
function revokeAccess(address payable candidate) public {
require((hasManagerAccess(msg.sender) == true) || (msg.sender == candidate));
if (membersMap[candidate]) {
delete membersMap[candidate];
membersNum--;
}
emit MemberRevoked(candidate);
setRights(candidate, TYPE_ACCESS, ACCESS_NONE);
}
function canConfirm() public view returns (bool) {
INodeSpace ns = INodeSpace(contentSpace);
return ns.canNodePublish(msg.sender);
}
function checkRights(uint8 index_type, address payable obj, uint8 access_type) public view returns(bool) {
return checkDirectRights(index_type, obj, access_type);
}
}