@@ -33,6 +33,11 @@ contract Tasks is DSMath {
33
33
/// @param taskId The newly added task id
34
34
event TaskAdded (uint256 taskId );
35
35
36
+ /// @notice Event logged when a task's security status changes (secure vs. managed)
37
+ /// @param taskId Id of the task
38
+ /// @param secure Boolean of security status (true: secure, false: managed)
39
+ event TaskSecuritySet (uint256 indexed taskId , bool secure );
40
+
36
41
/// @notice Event logged when a task's specification hash changes
37
42
/// @param taskId Id of the task
38
43
/// @param specificationHash New specification hash of the task
@@ -69,6 +74,7 @@ contract Tasks is DSMath {
69
74
uint256 dueDate;
70
75
uint256 completionTimestamp;
71
76
uint256 changeNonce;
77
+ bool secure;
72
78
}
73
79
74
80
struct Role {
@@ -103,6 +109,7 @@ contract Tasks is DSMath {
103
109
roleAssignmentSigs[bytes4 (keccak256 ("setTaskWorkerRole(uint256,address) " ))] = true ;
104
110
105
111
// Initialise the task update reviewers
112
+ reviewers[bytes4 (keccak256 ("setTaskSecurity(uint256,bool) " ))] = [TaskRole.Manager, TaskRole.Worker];
106
113
reviewers[bytes4 (keccak256 ("setTaskBrief(uint256,bytes32) " ))] = [TaskRole.Manager, TaskRole.Worker];
107
114
reviewers[bytes4 (keccak256 ("setTaskDueDate(uint256,uint256) " ))] = [TaskRole.Manager, TaskRole.Worker];
108
115
reviewers[bytes4 (keccak256 ("setTaskSkill(uint256,uint256) " ))] = [TaskRole.Manager, TaskRole.Worker];
@@ -115,8 +122,8 @@ contract Tasks is DSMath {
115
122
reviewers[bytes4 (keccak256 ("cancelTask(uint256) " ))] = [TaskRole.Manager, TaskRole.Worker];
116
123
}
117
124
118
- modifier self () {
119
- require (address (this ) == msg .sender , "task-not-self " );
125
+ modifier self (uint256 _id ) {
126
+ require (managerCanCall (_id) || address (this ) == msg .sender , "task-not-self " );
120
127
_;
121
128
}
122
129
@@ -274,7 +281,8 @@ contract Tasks is DSMath {
274
281
bytes32 _specificationHash ,
275
282
uint256 _domainId ,
276
283
uint256 _skillId ,
277
- uint256 _dueDate
284
+ uint256 _dueDate ,
285
+ bool _secure
278
286
)
279
287
public
280
288
isAdmin (msg .sender , _callerPermissionDomainId, _callerChildSkillIndex, _domainId)
@@ -285,9 +293,13 @@ contract Tasks is DSMath {
285
293
tasks[taskCount].expenditureId = expenditureId;
286
294
tasks[taskCount].specificationHash = _specificationHash;
287
295
tasks[taskCount].dueDate = (_dueDate > 0 ) ? _dueDate : now + 90 days ; // Note: can set dueDate in past?
296
+ tasks[taskCount].secure = _secure;
288
297
289
298
setTaskRoleUser (taskCount, TaskRole.Manager, msg .sender );
290
- setTaskRoleUser (taskCount, TaskRole.Evaluator, msg .sender );
299
+
300
+ if (_secure) {
301
+ setTaskRoleUser (taskCount, TaskRole.Evaluator, msg .sender );
302
+ }
291
303
292
304
if (_skillId > 0 ) {
293
305
this .setTaskSkill (taskCount, _skillId);
@@ -355,46 +367,56 @@ contract Tasks is DSMath {
355
367
return ratingSecrets[_id].secret[_role];
356
368
}
357
369
370
+ function setTaskSecurity (uint256 _id , bool _secure ) public self (_id) {
371
+ tasks[_id].secure = _secure;
372
+
373
+ if (! _secure) {
374
+ removeTaskEvaluatorRole (_id);
375
+ }
376
+
377
+ emit TaskSecuritySet (_id, _secure);
378
+ }
379
+
358
380
// Note: the domain permissions arguments are placed at the end for consistency with the other role change functions
359
381
function setTaskManagerRole (uint256 _id , address payable _user , uint256 _permissionDomainId , uint256 _childSkillIndex )
360
382
public
361
- self
383
+ self (_id)
362
384
isAdmin (_user, _permissionDomainId, _childSkillIndex, colony.getExpenditure (tasks[_id].expenditureId).domainId)
363
385
{
364
386
setTaskRoleUser (_id, TaskRole.Manager, _user);
365
387
}
366
388
367
- function setTaskEvaluatorRole (uint256 _id , address payable _user ) public self {
389
+ function setTaskEvaluatorRole (uint256 _id , address payable _user ) public self (_id) {
368
390
// Can only assign role if no one is currently assigned to it
369
391
require (getTaskRoleUser (_id, TaskRole.Evaluator) == address (0x0 ), "task-evaluator-role-assigned " );
370
392
setTaskRoleUser (_id, TaskRole.Evaluator, _user);
371
393
}
372
394
373
- function setTaskWorkerRole (uint256 _id , address payable _user ) public self {
395
+ function setTaskWorkerRole (uint256 _id , address payable _user ) public self (_id) {
374
396
// Can only assign role if no one is currently assigned to it
375
397
require (getTaskRoleUser (_id, TaskRole.Worker) == address (0x0 ), "task-worker-role-assigned " );
376
398
uint256 [] memory skills = colony.getExpenditureSlot (tasks[_id].expenditureId, uint256 (TaskRole.Worker)).skills;
377
399
require (skills.length > 0 && skills[0 ] > 0 , "task-skill-not-set " ); // ignore-swc-110
378
400
setTaskRoleUser (_id, TaskRole.Worker, _user);
379
401
}
380
402
381
- function removeTaskEvaluatorRole (uint256 _id ) public self {
403
+ function removeTaskEvaluatorRole (uint256 _id ) public self (_id) {
382
404
setTaskRoleUser (_id, TaskRole.Evaluator, address (0x0 ));
383
405
}
384
406
385
- function removeTaskWorkerRole (uint256 _id ) public self {
407
+ function removeTaskWorkerRole (uint256 _id ) public self (_id) {
386
408
setTaskRoleUser (_id, TaskRole.Worker, address (0x0 ));
387
409
}
388
410
389
- function setTaskManagerPayout (uint256 _id , address _token , uint256 _amount ) public self {
411
+ function setTaskManagerPayout (uint256 _id , address _token , uint256 _amount ) public self (_id) {
390
412
colony.setExpenditurePayout (_id, uint256 (TaskRole.Manager), _token, _amount);
391
413
}
392
414
393
- function setTaskEvaluatorPayout (uint256 _id , address _token , uint256 _amount ) public self {
415
+ function setTaskEvaluatorPayout (uint256 _id , address _token , uint256 _amount ) public self (_id) {
394
416
colony.setExpenditurePayout (_id, uint256 (TaskRole.Evaluator), _token, _amount);
395
417
}
396
418
397
- function setTaskWorkerPayout (uint256 _id , address _token , uint256 _amount ) public self {
419
+ function setTaskWorkerPayout (uint256 _id , address _token , uint256 _amount ) public self (_id) {
398
420
colony.setExpenditurePayout (_id, uint256 (TaskRole.Worker), _token, _amount);
399
421
}
400
422
@@ -421,13 +443,13 @@ contract Tasks is DSMath {
421
443
this .setTaskWorkerPayout (_id, _token, _workerAmount);
422
444
}
423
445
424
- function setTaskSkill (uint256 _id , uint256 _skillId ) public self {
446
+ function setTaskSkill (uint256 _id , uint256 _skillId ) public self (_id) {
425
447
colony.setExpenditureSkill (tasks[_id].expenditureId, uint256 (TaskRole.Worker), _skillId);
426
448
}
427
449
428
450
function setTaskBrief (uint256 _id , bytes32 _specificationHash )
429
451
public
430
- self
452
+ self (_id)
431
453
taskExists (_id)
432
454
taskNotComplete (_id)
433
455
{
@@ -438,7 +460,7 @@ contract Tasks is DSMath {
438
460
439
461
function setTaskDueDate (uint256 _id , uint256 _dueDate )
440
462
public
441
- self
463
+ self (_id)
442
464
taskExists (_id)
443
465
taskNotComplete (_id)
444
466
{
@@ -479,19 +501,21 @@ contract Tasks is DSMath {
479
501
480
502
function cancelTask (uint256 _id )
481
503
public
482
- self
504
+ self (_id)
483
505
taskExists (_id)
484
506
taskNotComplete (_id)
485
507
{
486
508
colony.cancelExpenditure (tasks[_id].expenditureId);
487
509
}
488
510
489
511
// Permissions pertain to the Arbitration role here
490
- function finalizeTask (uint256 _permissionDomainId , uint256 _childSkillIndex , uint256 _id )
512
+ function finalizeSecureTask (uint256 _permissionDomainId , uint256 _childSkillIndex , uint256 _id )
491
513
public
492
514
taskExists (_id)
493
515
taskComplete (_id)
494
516
{
517
+ require (tasks[_id].secure, "task-not-secure " );
518
+
495
519
colony.finalizeExpenditure (tasks[_id].expenditureId);
496
520
497
521
assignWorkRatings (_id);
@@ -510,6 +534,16 @@ contract Tasks is DSMath {
510
534
}
511
535
}
512
536
537
+ function finalizeManagedTask (uint256 _id )
538
+ public
539
+ taskExists (_id)
540
+ confirmTaskRoleIdentity (_id, msg .sender , TaskRole.Manager)
541
+ {
542
+ require (! tasks[_id].secure, "task-not-managed " );
543
+
544
+ colony.finalizeExpenditure (tasks[_id].expenditureId);
545
+ }
546
+
513
547
function getTaskCount () public view returns (uint256 ) {
514
548
return taskCount;
515
549
}
@@ -687,4 +721,8 @@ contract Tasks is DSMath {
687
721
function isTaskComplete (uint256 _id ) internal view returns (bool ) {
688
722
return tasks[_id].completionTimestamp > 0 ;
689
723
}
724
+
725
+ function managerCanCall (uint256 _id ) internal view returns (bool ) {
726
+ return ! tasks[_id].secure && getTaskRoleUser (_id, TaskRole.Manager) == msg .sender ;
727
+ }
690
728
}
0 commit comments