Skip to content

Commit ed79a98

Browse files
committed
New test for the role-based access control delegation workflow
1 parent 6cb397b commit ed79a98

File tree

5 files changed

+363
-153
lines changed

5 files changed

+363
-153
lines changed

audit-trail-move/sources/audit_trail.move

Lines changed: 66 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ public fun initial_admin_role_name(): String {
214214
/// Records are added sequentially with auto-assigned sequence numbers.
215215
///
216216
/// TODO: Add capability parameter and permission check once implemented
217-
public fun add_record<D: store + copy>(
217+
public fun trail_add_record<D: store + copy>(
218218
trail: &mut AuditTrail<D>,
219219
cap: &Capability,
220220
stored_data: D,
221221
record_metadata: Option<String>,
222222
clock: &Clock,
223223
ctx: &mut TxContext,
224224
) {
225-
// TODO: check_permission(trail, cap, &permissions::record_add(), ctx);
225+
assert!(trail.has_capability_permission(cap, &permission::record_add()), EPermissionDenied);
226226

227227
let caller = ctx.sender();
228228
let timestamp = clock::timestamp_ms(clock);
@@ -368,7 +368,12 @@ public fun trail_has_record<D: store + copy>(trail: &AuditTrail<D>, sequence_num
368368
linked_table::contains(&trail.records, sequence_number)
369369
}
370370

371-
// ===== Role and Capability related Functions =====
371+
/// Returns all records of the audit trail
372+
public fun trail_records<D: store + copy>(trail: &AuditTrail<D>): &LinkedTable<u64, Record<D>> {
373+
&trail.records
374+
}
375+
376+
// ===== Role related Functions =====
372377

373378
/// Get the permissions associated with a specific role.
374379
/// Aborts with ERoleDoesNotExist if the role does not exist.
@@ -380,6 +385,58 @@ public fun trail_get_role_permissions<D: store + copy>(
380385
vec_map::get(&trail.roles, role)
381386
}
382387

388+
/// Create a new role consisting of a role name and associated permissions
389+
public fun trail_create_role<D: store + copy>(
390+
trail: &mut AuditTrail<D>,
391+
cap: &Capability,
392+
role: String,
393+
permissions: VecSet<Permission>,
394+
_ctx: &mut TxContext,
395+
) {
396+
assert!(trail.has_capability_permission(cap, &permission::roles_add()), EPermissionDenied);
397+
vec_map::insert(&mut trail.roles, role, permissions);
398+
}
399+
400+
/// Delete an existing role
401+
public fun trail_delete_role<D: store + copy>(
402+
trail: &mut AuditTrail<D>,
403+
cap: &Capability,
404+
role: &String,
405+
_ctx: &mut TxContext,
406+
) {
407+
assert!(trail.has_capability_permission(cap, &permission::roles_delete()), EPermissionDenied);
408+
vec_map::remove(&mut trail.roles, role);
409+
}
410+
411+
/// Update permissions associated with an existing role
412+
public fun trail_update_role_permissions<D: store + copy>(
413+
trail: &mut AuditTrail<D>,
414+
cap: &Capability,
415+
role: &String,
416+
new_permissions: VecSet<Permission>,
417+
_ctx: &mut TxContext,
418+
) {
419+
assert!(trail.has_capability_permission(cap, &permission::roles_update()), EPermissionDenied);
420+
assert!(vec_map::contains(&trail.roles, role), ERoleDoesNotExist);
421+
vec_map::insert(&mut trail.roles, *role, new_permissions);
422+
}
423+
424+
/// Returns the roles defined in the audit trail
425+
public fun trail_roles<D: store + copy>(trail: &AuditTrail<D>): &VecMap<String, VecSet<Permission>> {
426+
&trail.roles
427+
}
428+
429+
/// Indicates if the specified role exists in the audit trail
430+
public fun trail_has_role<D: store + copy>(
431+
trail: &AuditTrail<D>,
432+
role: &String,
433+
): bool {
434+
vec_map::contains(&trail.roles, role)
435+
}
436+
437+
438+
// ===== Capability related Functions =====
439+
383440
/// Indicates if a provided capability has a specific permission.
384441
public fun trail_has_capability_permission<D: store + copy>(
385442
trail: &AuditTrail<D>,
@@ -389,7 +446,7 @@ public fun trail_has_capability_permission<D: store + copy>(
389446
assert!(trail.id() == cap.trail_id(), ETrailIdNotCorrect);
390447
let permissions = trail.get_role_permissions(cap.role());
391448
vec_set::contains(permissions, permission)
392-
}
449+
}
393450

394451
/// Create a new capability with a specific role
395452
public fun trail_new_capability<D: store + copy>(
@@ -429,48 +486,14 @@ public fun trail_revoke_capability<D: store + copy>(
429486
// TODO: Implement revocation logic (e.g., remove from issued_capability set)
430487
}
431488

432-
/// Create a new role consisting of a role name and associated permissions
433-
public fun trail_create_role<D: store + copy>(
434-
trail: &mut AuditTrail<D>,
435-
cap: &Capability,
436-
role: String,
437-
permissions: VecSet<Permission>,
438-
_ctx: &mut TxContext,
439-
) {
440-
assert!(trail.has_capability_permission(cap, &permission::roles_add()), EPermissionDenied);
441-
vec_map::insert(&mut trail.roles, role, permissions);
442-
}
443-
444-
/// Delete an existing role
445-
public fun trail_delete_role<D: store + copy>(
446-
trail: &mut AuditTrail<D>,
447-
cap: &Capability,
448-
role: &String,
449-
_ctx: &mut TxContext,
450-
) {
451-
assert!(trail.has_capability_permission(cap, &permission::roles_delete()), EPermissionDenied);
452-
vec_map::remove(&mut trail.roles, role);
453-
}
454-
455-
/// Update permissions associated with an existing role
456-
public fun trail_update_role_permissions<D: store + copy>(
457-
trail: &mut AuditTrail<D>,
458-
cap: &Capability,
459-
role: &String,
460-
new_permissions: VecSet<Permission>,
461-
_ctx: &mut TxContext,
462-
) {
463-
assert!(trail.has_capability_permission(cap, &permission::roles_update()), EPermissionDenied);
464-
assert!(vec_map::contains(&trail.roles, role), ERoleDoesNotExist);
465-
vec_map::insert(&mut trail.roles, *role, new_permissions);
466-
}
467-
468489
// ===== public use statements =====
469490

470491
public use fun trail_id as AuditTrail.id;
471492
public use fun trail_creator as AuditTrail.creator;
472493
public use fun trail_created_at as AuditTrail.created_at;
494+
public use fun trail_add_record as AuditTrail.add_record;
473495
public use fun trail_record_count as AuditTrail.record_count;
496+
public use fun trail_records as AuditTrail.records;
474497
public use fun trail_name as AuditTrail.name;
475498
public use fun trail_description as AuditTrail.description;
476499
public use fun trail_metadata as AuditTrail.metadata;
@@ -480,11 +503,13 @@ public use fun trail_first_sequence as AuditTrail.first_sequence;
480503
public use fun trail_last_sequence as AuditTrail.last_sequence;
481504
public use fun trail_get_record as AuditTrail.get_record;
482505
public use fun trail_has_record as AuditTrail.has_record;
483-
public use fun trail_get_role_permissions as AuditTrail.get_role_permissions;
484506
public use fun trail_has_capability_permission as AuditTrail.has_capability_permission;
485507
public use fun trail_new_capability as AuditTrail.new_capability;
486508
public use fun trail_destroy_capability as AuditTrail.destroy_capability;
487509
public use fun trail_revoke_capability as AuditTrail.revoke_capability;
510+
public use fun trail_get_role_permissions as AuditTrail.get_role_permissions;
488511
public use fun trail_create_role as AuditTrail.create_role;
489512
public use fun trail_delete_role as AuditTrail.delete_role;
490513
public use fun trail_update_role_permissions as AuditTrail.update_role_permissions;
514+
public use fun trail_roles as AuditTrail.roles;
515+
public use fun trail_has_role as AuditTrail.has_role;

audit-trail-move/sources/capability.move

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public(package) fun new_capability(
2828
}
2929
}
3030

31-
3231
// TODO: Is this needed? What is a setup capability?
3332
//
3433
// /// Create a setup capability for trail initialization

0 commit comments

Comments
 (0)