-
Notifications
You must be signed in to change notification settings - Fork 0
/
SmartDCPABERequests.sol
132 lines (116 loc) · 4.8 KB
/
SmartDCPABERequests.sol
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
pragma solidity ^0.5.1;
import "./SmartDCPABEAuthority.sol";
import "./SmartDCPABEUsers.sol";
import "./Collection.sol";
contract SmartDCPABERequests is Collection {
enum KeyRequestStatus {
PENDING,
OK,
REJECTED
}
struct KeyRequest {
KeyRequestStatus status;
uint64 timestamp;
uint64 responseTimestamp;
bytes32[] attrNames;
}
event pendingRequestIndexChanged (
uint64 oldIndex,
uint64 newIndex
);
event pendingRequesterIndexChanged (
uint64 oldIndex,
uint64 newIndex
);
mapping (address => address[]) pendingRequesters;
mapping (address => mapping (address => uint64[])) pendingRequests;
mapping (address => mapping (address => KeyRequest[])) requests;
SmartDCPABEUsers user;
SmartDCPABEAuthority authority;
constructor(address root) Collection(root) public {}
function setContractDependencies(Collection.ContractType contractType, address addr) public onlyOwner {
if (contractType == ContractType.AUTHORITY) {
authority = SmartDCPABEAuthority(addr);
} else if (contractType == ContractType.USERS) {
user = SmartDCPABEUsers(addr);
}
}
/**
* attrNames are bytes32 instead of string because I don't tested if web3j works well
* with dynamic array of dynamic types string/bytes
*/
function addRequest(address certifier, address requester, uint64 timestamp, bytes32[] memory attrNames) public {
assert(user.isUser(requester));
assert(authority.isCertifier(certifier));
// cria uma lista de espera para aquele endereço
uint64 pendingIndex = uint64(requests[certifier][requester].length);
requests[certifier][requester].push(KeyRequest(KeyRequestStatus.PENDING, timestamp, 0, attrNames));
pendingRequests[certifier][requester].push(pendingIndex);
pendingRequesters[certifier].push(requester);
}
function processRequest(address certifier, uint64 requesterIndex, uint64 pendingIndex, KeyRequestStatus newStatus) public {
address requester = pendingRequesters[certifier][requesterIndex];
uint64 listSize = uint64(pendingRequests[certifier][requester].length);
require(listSize >= 1, "No pending requests for this certifier.");
uint64 index = pendingRequests[certifier][requester][pendingIndex];
requests[certifier][requester][index].status = newStatus;
if (listSize == 1) {
// BUG: pop() function leads to error. Workaround is to decrement length of array
pendingRequests[certifier][requester].length--;
address lastRequester = pendingRequesters[certifier][pendingRequesters[certifier].length - 1];
pendingRequesters[certifier].length--;
if (requesterIndex != pendingRequesters[certifier].length) {
pendingRequesters[certifier][requesterIndex] = lastRequester;
emit pendingRequesterIndexChanged(uint64(pendingRequesters[certifier].length), requesterIndex);
}
} else {
uint64 lastIndex = pendingRequests[certifier][requester][listSize - 1];
pendingRequests[certifier][requester].length--;
if (pendingIndex != listSize - 1) {
pendingRequests[certifier][requester][pendingIndex] = lastIndex;
emit pendingRequestIndexChanged(listSize - 1, pendingIndex);
}
}
}
function getRequestListSize(address certifier, address requester) public view returns (uint256) {
return requests[certifier][requester].length;
}
function getPendingList(address certifier, address requester) public view returns (uint64[] memory) {
return pendingRequests[certifier][requester];
}
function getPendingRequesterListSize(address certifier) public view returns (uint256) {
return pendingRequesters[certifier].length;
}
function getPendingRequesterAddress(address certifier, uint64 requesterIndex) public view returns (address) {
return pendingRequesters[certifier][requesterIndex];
}
function getRequestStatus(address certifier, address requester, uint64 index) public view returns (KeyRequestStatus status) {
return requests[certifier][requester][index].status;
}
function getRequest
(
address certifier,
address requester,
uint64 index
)
public
view
returns
(
KeyRequestStatus status,
uint64,
uint64 timestamp,
uint64 responseTimestamp,
bytes32[] memory attrNames
)
{
KeyRequest memory kr = requests[certifier][requester][index];
return (
kr.status,
index,
kr.timestamp,
kr.responseTimestamp,
kr.attrNames
);
}
}