@@ -16,32 +16,31 @@ impl<T: Config> Pallet<T> {
16
16
// --------------------------------------------------------------------------------------------
17
17
18
18
pub fn do_initial_setup ( ) -> DispatchResult {
19
+ // Create a global scope for the administrator role
19
20
let pallet_id = Self :: pallet_id ( ) ;
20
21
let global_scope = pallet_id. using_encoded ( blake2_256) ;
21
22
<GlobalScope < T > >:: put ( global_scope) ;
23
+ T :: Rbac :: create_scope ( Self :: pallet_id ( ) , global_scope) ?;
22
24
23
25
//Admin rol & permissions
24
26
let administrator_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Administrator . to_vec ( ) ] . to_vec ( ) ) ?;
25
27
T :: Rbac :: create_and_set_permissions ( pallet_id. clone ( ) , administrator_role_id[ 0 ] , ProxyPermission :: administrator_permissions ( ) ) ?;
26
28
27
- //Developer rol & permissions
28
- let _developer_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Developer . to_vec ( ) ] . to_vec ( ) ) ?;
29
- // T::Rbac::create_and_set_permissions(pallet_id.clone(), developer_role_id [0], ProxyPermission::developer_permissions ())?;
29
+ //Builder rol & permissions
30
+ let builder_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Builder . to_vec ( ) ] . to_vec ( ) ) ?;
31
+ T :: Rbac :: create_and_set_permissions ( pallet_id. clone ( ) , builder_role_id [ 0 ] , ProxyPermission :: builder_permissions ( ) ) ?;
30
32
31
33
// Investor rol & permissions
32
- let _investor_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Investor . to_vec ( ) ] . to_vec ( ) ) ?;
33
- // T::Rbac::create_and_set_permissions(pallet_id.clone(), investor_role_id[0], ProxyPermission::investor_permissions())?;
34
+ let investor_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Investor . to_vec ( ) ] . to_vec ( ) ) ?;
35
+ T :: Rbac :: create_and_set_permissions ( pallet_id. clone ( ) , investor_role_id[ 0 ] , ProxyPermission :: investor_permissions ( ) ) ?;
34
36
35
37
// Issuer rol & permissions
36
- let _issuer_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Issuer . to_vec ( ) ] . to_vec ( ) ) ?;
37
- // T::Rbac::create_and_set_permissions(pallet_id.clone(), issuer_role_id[0], ProxyPermission::issuer_permissions())?;
38
+ let issuer_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: Issuer . to_vec ( ) ] . to_vec ( ) ) ?;
39
+ T :: Rbac :: create_and_set_permissions ( pallet_id. clone ( ) , issuer_role_id[ 0 ] , ProxyPermission :: issuer_permissions ( ) ) ?;
38
40
39
41
// Regional center rol & permissions
40
- let _regional_center_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: RegionalCenter . to_vec ( ) ] . to_vec ( ) ) ?;
41
- //T::Rbac::create_and_set_permissions(pallet_id.clone(), regional_center_role_id[0], ProxyPermission::regional_center_permissions())?;
42
-
43
- // Create a global scope for the administrator role
44
- T :: Rbac :: create_scope ( Self :: pallet_id ( ) , global_scope) ?;
42
+ let regional_center_role_id = T :: Rbac :: create_and_set_roles ( pallet_id. clone ( ) , [ ProxyRole :: RegionalCenter . to_vec ( ) ] . to_vec ( ) ) ?;
43
+ T :: Rbac :: create_and_set_permissions ( pallet_id. clone ( ) , regional_center_role_id[ 0 ] , ProxyPermission :: regional_center_permissions ( ) ) ?;
45
44
46
45
Self :: deposit_event ( Event :: ProxySetupCompleted ) ;
47
46
Ok ( ( ) )
@@ -51,16 +50,7 @@ impl<T: Config> Pallet<T> {
51
50
admin : T :: AccountId ,
52
51
name : FieldName ,
53
52
) -> DispatchResult {
54
- let pallet_id = Self :: pallet_id ( ) ;
55
- let global_scope = <GlobalScope < T > >:: try_get ( ) . map_err ( |_| Error :: < T > :: GlobalScopeNotSet ) ?;
56
-
57
- T :: Rbac :: assign_role_to_user (
58
- admin. clone ( ) ,
59
- pallet_id. clone ( ) ,
60
- & global_scope,
61
- ProxyRole :: Administrator . id ( ) ) ?;
62
-
63
- // create a administrator user account
53
+ // create a administrator user account & register it in the rbac pallet
64
54
Self :: sudo_register_admin ( admin. clone ( ) , name) ?;
65
55
66
56
Self :: deposit_event ( Event :: AdministratorAssigned ( admin) ) ;
@@ -70,16 +60,7 @@ impl<T: Config> Pallet<T> {
70
60
pub fn do_sudo_remove_administrator (
71
61
admin : T :: AccountId ,
72
62
) -> DispatchResult {
73
- let pallet_id = Self :: pallet_id ( ) ;
74
- let global_scope = <GlobalScope < T > >:: try_get ( ) . map_err ( |_| Error :: < T > :: GlobalScopeNotSet ) ?;
75
-
76
- T :: Rbac :: remove_role_from_user (
77
- admin. clone ( ) ,
78
- pallet_id. clone ( ) ,
79
- & global_scope,
80
- ProxyRole :: Administrator . id ( ) ) ?;
81
-
82
- // remove administrator user account
63
+ // remove administrator user account & remove it from the rbac pallet
83
64
Self :: sudo_delete_admin ( admin. clone ( ) ) ?;
84
65
85
66
Self :: deposit_event ( Event :: AdministratorRemoved ( admin) ) ;
@@ -118,7 +99,7 @@ impl<T: Config> Pallet<T> {
118
99
) , T :: MaxRegistrationsAtTime > > ,
119
100
) -> DispatchResult {
120
101
// Ensure admin permissions
121
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
102
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: CreateProject ) ?;
122
103
123
104
//Add timestamp
124
105
let timestamp = Self :: get_timestamp_in_milliseconds ( ) . ok_or ( Error :: < T > :: TimestampError ) ?;
@@ -132,7 +113,7 @@ impl<T: Config> Pallet<T> {
132
113
133
114
//Create project data
134
115
let project_data = ProjectData :: < T > {
135
- developer : Some ( BoundedVec :: < T :: AccountId , T :: MaxDevelopersPerProject > :: default ( ) ) ,
116
+ builder : Some ( BoundedVec :: < T :: AccountId , T :: MaxBuildersPerProject > :: default ( ) ) ,
136
117
investor : Some ( BoundedVec :: < T :: AccountId , T :: MaxInvestorsPerProject > :: default ( ) ) ,
137
118
issuer : Some ( BoundedVec :: < T :: AccountId , T :: MaxIssuersPerProject > :: default ( ) ) ,
138
119
regional_center : Some ( BoundedVec :: < T :: AccountId , T :: MaxRegionalCenterPerProject > :: default ( ) ) ,
@@ -183,8 +164,8 @@ impl<T: Config> Pallet<T> {
183
164
creation_date : Option < u64 > ,
184
165
completion_date : Option < u64 > ,
185
166
) -> DispatchResult {
186
- //ensure admin permissions
187
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
167
+ // Ensure admin permissions
168
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: EditProject ) ?;
188
169
189
170
//Ensure project exists
190
171
ensure ! ( ProjectsInfo :: <T >:: contains_key( project_id) , Error :: <T >:: ProjectNotFound ) ;
@@ -241,8 +222,8 @@ impl<T: Config> Pallet<T> {
241
222
admin : T :: AccountId ,
242
223
project_id : [ u8 ; 32 ] ,
243
224
) -> DispatchResult {
244
- //ensure admin permissions
245
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
225
+ // Ensure admin permissions
226
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: DeleteProject ) ?;
246
227
247
228
//Ensure project exists & get project data
248
229
let project_data = ProjectsInfo :: < T > :: get ( project_id) . ok_or ( Error :: < T > :: ProjectNotFound ) ?;
@@ -283,8 +264,8 @@ impl<T: Config> Pallet<T> {
283
264
AssignAction ,
284
265
) , T :: MaxRegistrationsAtTime > ,
285
266
) -> DispatchResult {
286
- //ensure admin permissions
287
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
267
+ // Ensure admin permissions
268
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: AssignUser ) ?;
288
269
289
270
//Ensure project exists
290
271
ensure ! ( ProjectsInfo :: <T >:: contains_key( project_id) , Error :: <T >:: ProjectNotFound ) ;
@@ -395,8 +376,8 @@ impl<T: Config> Pallet<T> {
395
376
CUDAction , // 3:action
396
377
) , T :: MaxRegistrationsAtTime > ,
397
378
) -> DispatchResult {
398
- //ensure admin permissions
399
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
379
+ // Ensure admin permissions
380
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: RegisterUser ) ?;
400
381
401
382
for user in users{
402
383
match user. 3 {
@@ -591,8 +572,8 @@ impl<T: Config> Pallet<T> {
591
572
Option < [ u8 ; 32 ] > , // 6: expenditure_id
592
573
) , T :: MaxRegistrationsAtTime > ,
593
574
) -> DispatchResult {
594
- // Ensure admin permissions
595
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
575
+ // Ensure admin permissions
576
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: Expenditures ) ?;
596
577
597
578
// Ensure project exists
598
579
ensure ! ( <ProjectsInfo <T >>:: contains_key( project_id) , Error :: <T >:: ProjectNotFound ) ;
@@ -769,7 +750,6 @@ impl<T: Config> Pallet<T> {
769
750
// D R A W D O W N S
770
751
// --------------------------------------------------------------------------------------------
771
752
// For now drawdowns functions are private, but in the future they may be public
772
-
773
753
fn do_create_drawdown (
774
754
project_id : [ u8 ; 32 ] ,
775
755
drawdown_type : DrawdownType ,
@@ -820,8 +800,8 @@ impl<T: Config> Pallet<T> {
820
800
admin : T :: AccountId ,
821
801
project_id : [ u8 ; 32 ] ,
822
802
) -> DispatchResult {
823
- // Ensure admin permissions
824
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
803
+ // Ensure admin permissions
804
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: Expenditures ) ?;
825
805
826
806
// Ensure project exists
827
807
ensure ! ( ProjectsInfo :: <T >:: contains_key( project_id) , Error :: <T >:: ProjectNotFound ) ;
@@ -839,12 +819,9 @@ impl<T: Config> Pallet<T> {
839
819
}
840
820
841
821
pub fn do_submit_drawdown (
842
- _user : T :: AccountId , //TODO: remove underscore when user permissions are implemented
843
822
project_id : [ u8 ; 32 ] ,
844
823
drawdown_id : [ u8 ; 32 ] ,
845
824
) -> DispatchResult {
846
- //TODO: Ensure builder & admin permissions
847
-
848
825
// Ensure project exists & is not completed
849
826
Self :: is_project_completed ( project_id) ?;
850
827
@@ -891,9 +868,9 @@ impl<T: Config> Pallet<T> {
891
868
project_id : [ u8 ; 32 ] ,
892
869
drawdown_id : [ u8 ; 32 ] ,
893
870
) -> DispatchResult {
894
- //ensure admin permissions
895
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
896
-
871
+ // Ensure admin permissions
872
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: Expenditures ) ?;
873
+
897
874
// Get drawdown data & ensure drawdown exists
898
875
let drawdown_data = DrawdownsInfo :: < T > :: get ( drawdown_id) . ok_or ( Error :: < T > :: DrawdownNotFound ) ?;
899
876
@@ -949,8 +926,8 @@ impl<T: Config> Pallet<T> {
949
926
transactions_feedback : Option < BoundedVec < ( [ u8 ; 32 ] , FieldDescription ) , T :: MaxRegistrationsAtTime > > ,
950
927
drawdown_feedback : Option < BoundedVec < FieldDescription , T :: MaxBoundedVecs > > ,
951
928
) -> DispatchResult {
952
- //ensure admin permissions
953
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
929
+ // Ensure admin permissions
930
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: Expenditures ) ?;
954
931
955
932
// Get drawdown data & ensure drawdown exists
956
933
let drawdown_data = DrawdownsInfo :: < T > :: get ( drawdown_id) . ok_or ( Error :: < T > :: DrawdownNotFound ) ?;
@@ -1029,7 +1006,6 @@ impl<T: Config> Pallet<T> {
1029
1006
// --------------------------------------------------------------------------------------------
1030
1007
// For now transactions functions are private, but in the future they may be public
1031
1008
pub fn do_execute_transactions (
1032
- _user : T :: AccountId , //TODO: remove underscore when permissions are implemented
1033
1009
project_id : [ u8 ; 32 ] ,
1034
1010
drawdown_id : [ u8 ; 32 ] ,
1035
1011
transactions : BoundedVec < (
@@ -1040,8 +1016,6 @@ impl<T: Config> Pallet<T> {
1040
1016
Option < [ u8 ; 32 ] > , // transaction_id
1041
1017
) , T :: MaxRegistrationsAtTime > ,
1042
1018
) -> DispatchResult {
1043
- // Check permissions here so helper private functions doesn't need to check it
1044
- // TODO: Ensure admin & builder permissions
1045
1019
1046
1020
// Ensure project exists & is not completed so helper private functions doesn't need to check it
1047
1021
Self :: is_project_completed ( project_id) ?;
@@ -1220,14 +1194,15 @@ impl<T: Config> Pallet<T> {
1220
1194
// B U L K U P L O A D T R A N S A C T I O N S
1221
1195
1222
1196
pub fn do_up_bulk_upload (
1223
- _user : T :: AccountId , //TODO: Remove underscore when permissions are implemented
1197
+ user : T :: AccountId , //TODO: Remove underscore when permissions are implemented
1224
1198
project_id : [ u8 ; 32 ] ,
1225
1199
drawdown_id : [ u8 ; 32 ] ,
1226
1200
description : FieldDescription ,
1227
1201
total_amount : u64 ,
1228
1202
documents : Documents < T > ,
1229
1203
) -> DispatchResult {
1230
- // TODO: Ensure builder permissions
1204
+ // Ensure builder permissions
1205
+ Self :: is_authorized ( user, & project_id, ProxyPermission :: UpBulkupload ) ?;
1231
1206
1232
1207
// Ensure project is not completed
1233
1208
Self :: is_project_completed ( project_id) ?;
@@ -1267,8 +1242,8 @@ impl<T: Config> Pallet<T> {
1267
1242
admin : T :: AccountId ,
1268
1243
projects : BoundedVec < ( [ u8 ; 32 ] , Option < u32 > , CUDAction ) , T :: MaxRegistrationsAtTime > ,
1269
1244
) -> DispatchResult {
1270
- // Ensure admin permissions
1271
- Self :: is_superuser ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyRole :: Administrator . id ( ) ) ?;
1245
+ // Ensure admin permissions
1246
+ Self :: is_authorized ( admin. clone ( ) , & Self :: get_global_scope ( ) , ProxyPermission :: Expenditures ) ?;
1272
1247
1273
1248
// Ensure projects is not empty
1274
1249
ensure ! ( !projects. is_empty( ) , Error :: <T >:: ProjectsIsEmpty ) ;
@@ -1374,21 +1349,21 @@ impl<T: Config> Pallet<T> {
1374
1349
ProxyRole :: Administrator => {
1375
1350
return Err ( Error :: < T > :: CannotRegisterAdminRole . into ( ) ) ;
1376
1351
} ,
1377
- ProxyRole :: Developer => {
1352
+ ProxyRole :: Builder => {
1378
1353
//TODO: Fix internal validations
1379
1354
//TODO: move logic to a helper function to avoid boilerplate
1380
1355
1381
1356
//Mutate project data
1382
1357
<ProjectsInfo < T > >:: try_mutate :: < _ , _ , DispatchError , _ > ( project_id, |project| {
1383
1358
let project = project. as_mut ( ) . ok_or ( Error :: < T > :: ProjectNotFound ) ?;
1384
- match project. developer . as_mut ( ) {
1385
- Some ( developer ) => {
1386
- //developer .iter().find(|&u| *u != user).ok_or(Error::<T>::UserAlreadyAssignedToProject)?;
1387
- developer . try_push ( user. clone ( ) ) . map_err ( |_| Error :: < T > :: MaxDevelopersPerProjectReached ) ?;
1359
+ match project. builder . as_mut ( ) {
1360
+ Some ( builder ) => {
1361
+ //builder .iter().find(|&u| *u != user).ok_or(Error::<T>::UserAlreadyAssignedToProject)?;
1362
+ builder . try_push ( user. clone ( ) ) . map_err ( |_| Error :: < T > :: MaxBuildersPerProjectReached ) ?;
1388
1363
} ,
1389
1364
None => {
1390
- let devs = project. developer . get_or_insert ( BoundedVec :: < T :: AccountId , T :: MaxDevelopersPerProject > :: default ( ) ) ;
1391
- devs. try_push ( user. clone ( ) ) . map_err ( |_| Error :: < T > :: MaxDevelopersPerProjectReached ) ?;
1365
+ let devs = project. builder . get_or_insert ( BoundedVec :: < T :: AccountId , T :: MaxBuildersPerProject > :: default ( ) ) ;
1366
+ devs. try_push ( user. clone ( ) ) . map_err ( |_| Error :: < T > :: MaxBuildersPerProjectReached ) ?;
1392
1367
}
1393
1368
}
1394
1369
Ok ( ( ) )
@@ -1460,16 +1435,16 @@ impl<T: Config> Pallet<T> {
1460
1435
ProxyRole :: Administrator => {
1461
1436
return Err ( Error :: < T > :: CannotRemoveAdminRole . into ( ) ) ;
1462
1437
} ,
1463
- ProxyRole :: Developer => {
1438
+ ProxyRole :: Builder => {
1464
1439
//TODO: Fix internal validations
1465
1440
//TODO: move logic to a helper function to avoid boilerplate
1466
1441
//Mutate project data
1467
1442
<ProjectsInfo < T > >:: try_mutate :: < _ , _ , DispatchError , _ > ( project_id, |project| {
1468
1443
let project = project. as_mut ( ) . ok_or ( Error :: < T > :: ProjectNotFound ) ?;
1469
- match project. developer . as_mut ( ) {
1470
- Some ( developer ) => {
1471
- //developer .clone().iter().find(|&u| *u == user).ok_or(Error::<T>::UserNotAssignedToProject)?;
1472
- developer . retain ( |u| * u != user) ;
1444
+ match project. builder . as_mut ( ) {
1445
+ Some ( builder ) => {
1446
+ //builder .clone().iter().find(|&u| *u == user).ok_or(Error::<T>::UserNotAssignedToProject)?;
1447
+ builder . retain ( |u| * u != user) ;
1473
1448
} ,
1474
1449
None => {
1475
1450
return Err ( Error :: < T > :: UserNotAssignedToProject . into ( ) ) ;
@@ -1606,7 +1581,6 @@ impl<T: Config> Pallet<T> {
1606
1581
}
1607
1582
}
1608
1583
1609
- #[ allow( dead_code) ]
1610
1584
fn is_transaction_editable (
1611
1585
transaction_id : [ u8 ; 32 ] ,
1612
1586
) -> DispatchResult {
@@ -1625,9 +1599,8 @@ impl<T: Config> Pallet<T> {
1625
1599
}
1626
1600
}
1627
1601
1628
- //TODO: remove macro when used
1629
- #[ allow( dead_code) ]
1630
- fn is_authorized ( authority : T :: AccountId , project_id : & [ u8 ; 32 ] , permission : ProxyPermission ) -> DispatchResult {
1602
+
1603
+ pub fn is_authorized ( authority : T :: AccountId , project_id : & [ u8 ; 32 ] , permission : ProxyPermission ) -> DispatchResult {
1631
1604
T :: Rbac :: is_authorized (
1632
1605
authority,
1633
1606
Self :: pallet_id ( ) ,
@@ -1636,6 +1609,7 @@ impl<T: Config> Pallet<T> {
1636
1609
)
1637
1610
}
1638
1611
1612
+ #[ allow( dead_code) ]
1639
1613
fn is_superuser ( authority : T :: AccountId , scope_global : & [ u8 ; 32 ] , rol_id : RoleId ) -> DispatchResult {
1640
1614
T :: Rbac :: has_role (
1641
1615
authority,
@@ -1666,6 +1640,15 @@ impl<T: Config> Pallet<T> {
1666
1640
1667
1641
//Insert user data
1668
1642
<UsersInfo < T > >:: insert ( admin. clone ( ) , user_data) ;
1643
+
1644
+ // Add administrator to rbac pallet
1645
+ T :: Rbac :: assign_role_to_user (
1646
+ admin. clone ( ) ,
1647
+ Self :: pallet_id ( ) ,
1648
+ & Self :: get_global_scope ( ) ,
1649
+ ProxyRole :: Administrator . id ( )
1650
+ ) ?;
1651
+
1669
1652
Ok ( ( ) )
1670
1653
}
1671
1654
@@ -1676,6 +1659,14 @@ impl<T: Config> Pallet<T> {
1676
1659
//Remove user from UsersInfo storage map
1677
1660
<UsersInfo < T > >:: remove ( admin. clone ( ) ) ;
1678
1661
1662
+ // Remove administrator to rbac pallet
1663
+ T :: Rbac :: remove_role_from_user (
1664
+ admin. clone ( ) ,
1665
+ Self :: pallet_id ( ) ,
1666
+ & Self :: get_global_scope ( ) ,
1667
+ ProxyRole :: Administrator . id ( )
1668
+ ) ?;
1669
+
1679
1670
Ok ( ( ) )
1680
1671
}
1681
1672
0 commit comments