access_control.iml

IML example from the CodeLogician agent skill.

(*
   --------------------------------------------------------------------------
   title: Access Control System
   name: access-control
   description: Role-based access control with permission logic
   --------------------------------------------------------------------------
 
   Real-world example: Access Control System
 
   Use case: Verify if a user can access a resource based on their role and permissions.
 
   Practical implications:
   - Region decomposition reveals all possible access scenarios
   - Each region represents a distinct authorization case
   - Models provide test cases for security testing
   - Helps identify edge cases in permission logic
*)
 
type role = Admin | Manager | User | Guest
 
let role_level r =
  match r with
  | Admin -> 4
  | Manager -> 3
  | User -> 2
  | Guest -> 1
 
type resource_sensitivity = Public | Internal | Confidential | Secret
 
let required_level sens =
  match sens with
  | Public -> 1
  | Internal -> 2
  | Confidential -> 3
  | Secret -> 4
 
(* Check if user can access resource *)
let can_access role resource is_owner =
  let user_level = role_level role in
  let req_level = required_level resource in
  if user_level >= req_level then
    "granted"
  else if is_owner && user_level >= 2 then
    (* Users and above can access their own resources one level up *)
    "granted"
  else
    "denied"
[@@decomp top ()]
 
(* Variation: Using basis to keep helper functions symbolic *)
let can_access_abstract role resource is_owner =
  let user_level = role_level role in
  let req_level = required_level resource in
  if user_level >= req_level then
    "granted"
  else if is_owner && user_level >= 2 then
    "granted"
  else
    "denied"
[@@decomp top ~basis:[[%id role_level]; [%id required_level]] ()]