PacketFlow.Capability.Dynamic (packetflow v0.1.0)

Dynamic capability management and validation for PacketFlow.

This module provides runtime capability creation, dynamic capability validation, capability composition patterns, capability delegation, and capability revocation.

Summary

Functions

Composes multiple capabilities into a single capability set.

Creates multiple capabilities at runtime.

Creates a new capability at runtime with the given name and parameters.

Creates a capability inheritance hierarchy.

Creates a capability with temporal constraints.

Delegates multiple capabilities from one entity to another.

Delegates a capability from one entity to another.

Filters capabilities based on a predicate function.

Gets all capabilities that are implied by a given capability.

Checks if one capability implies another capability.

Checks if a capability inherits from another capability.

Merges multiple capability sets into a single set.

Revokes multiple capabilities from an entity.

Revokes a capability from an entity.

Validates multiple capabilities against a set of available capabilities.

Validates a capability against a set of available capabilities.

Validates a capability in a specific context.

Validates a capability delegation.

Validates a temporal capability at a specific time.

Types

capability()

@type capability() :: any()

capability_context()

@type capability_context() :: map()

capability_rule()

@type capability_rule() :: {capability(), [capability()]}

capability_set()

@type capability_set() :: MapSet.t(capability())

Functions

compose_capabilities(capabilities)

@spec compose_capabilities([capability()]) :: capability_set()

Composes multiple capabilities into a single capability set.

Examples

iex> compose_capabilities([{:read, "/file"}, {:write, "/file"}])
#MapSet<[{:read, "/file"}, {:write, "/file"}]>

create_capabilities(names, params \\ nil)

@spec create_capabilities([atom()], any()) :: [capability()]

Creates multiple capabilities at runtime.

Examples

iex> create_capabilities([:read, :write], "/path/to/file")
[{:read, "/path/to/file"}, {:write, "/path/to/file"}]

create_capability(name, params \\ nil)

@spec create_capability(atom(), any()) :: capability()

Creates a new capability at runtime with the given name and parameters.

Examples

iex> create_capability(:read, "/path/to/file")
{:read, "/path/to/file"}

iex> create_capability(:admin, "user123")
{:admin, "user123"}

create_inheritance_hierarchy(capabilities)

@spec create_inheritance_hierarchy([capability()]) :: map()

Creates a capability inheritance hierarchy.

Examples

iex> create_inheritance_hierarchy([{:admin, "/file"}, {:read, "/file"}, {:write, "/file"}])
%{
  {:admin, "/file"} => [{:read, "/file"}, {:write, "/file"}],
  {:write, "/file"} => [{:read, "/file"}]
}

create_temporal_capability(capability, valid_from, valid_until)

@spec create_temporal_capability(capability(), DateTime.t(), DateTime.t()) ::
  {:temporal, capability(), DateTime.t(), DateTime.t()}

Creates a capability with temporal constraints.

Examples

iex> create_temporal_capability({:read, "/file"}, ~U[2023-01-01 12:00:00Z], ~U[2023-01-02 12:00:00Z])
{:temporal, {:read, "/file"}, ~U[2023-01-01 12:00:00Z], ~U[2023-01-02 12:00:00Z]}

delegate_capabilities(capabilities, from_entity, to_entity)

@spec delegate_capabilities([capability()], any(), any()) :: [
  {:delegated, capability(), any(), any()}
]

Delegates multiple capabilities from one entity to another.

Examples

iex> delegate_capabilities([{:read, "/file"}, {:write, "/file"}], "user1", "user2")
[{:delegated, {:read, "/file"}, "user1", "user2"}, {:delegated, {:write, "/file"}, "user1", "user2"}]

delegate_capability(capability, from_entity, to_entity)

@spec delegate_capability(capability(), any(), any()) ::
  {:delegated, capability(), any(), any()}

Delegates a capability from one entity to another.

Examples

iex> delegate_capability({:read, "/file"}, "user1", "user2")
{:delegated, {:read, "/file"}, "user1", "user2"}

filter_capabilities(capabilities, predicate)

@spec filter_capabilities([capability()], (capability() -> boolean())) :: [
  capability()
]

Filters capabilities based on a predicate function.

Examples

iex> filter_capabilities([{:read, "/file"}, {:write, "/file"}], fn {op, _} -> op == :read end)
[{:read, "/file"}]

get_implied_capabilities(capability)

@spec get_implied_capabilities(capability()) :: [capability()]

Gets all capabilities that are implied by a given capability.

Examples

iex> get_implied_capabilities({:admin, "/file"})
[{:read, "/file"}, {:write, "/file"}, {:delete, "/file"}]

implies?(capability1, capability2)

@spec implies?(capability(), capability()) :: boolean()

Checks if one capability implies another capability.

Examples

iex> implies?({:admin, "/file"}, {:read, "/file"})
true

iex> implies?({:read, "/file"}, {:admin, "/file"})
false

inherits_from?(capability, parent_capability, hierarchy)

@spec inherits_from?(capability(), capability(), map()) :: boolean()

Checks if a capability inherits from another capability.

Examples

iex> inherits_from?({:admin, "/file"}, {:read, "/file"}, %{{:admin, "/file"} => [{:read, "/file"}]})
true

merge_capability_sets(capability_sets)

@spec merge_capability_sets([capability_set()]) :: capability_set()

Merges multiple capability sets into a single set.

Examples

iex> merge_capability_sets([MapSet.new([{:read, "/file"}]), MapSet.new([{:write, "/file"}])])
#MapSet<[{:read, "/file"}, {:write, "/file"}]>

revoke_capabilities(capabilities, entity)

@spec revoke_capabilities([capability()], any()) :: [{:revoked, capability(), any()}]

Revokes multiple capabilities from an entity.

Examples

iex> revoke_capabilities([{:read, "/file"}, {:write, "/file"}], "user1")
[{:revoked, {:read, "/file"}, "user1"}, {:revoked, {:write, "/file"}, "user1"}]

revoke_capability(capability, entity)

@spec revoke_capability(capability(), any()) :: {:revoked, capability(), any()}

Revokes a capability from an entity.

Examples

iex> revoke_capability({:read, "/file"}, "user1")
{:revoked, {:read, "/file"}, "user1"}

validate_capabilities(required_capabilities, available_capabilities)

@spec validate_capabilities([capability()], [capability()]) :: boolean()

Validates multiple capabilities against a set of available capabilities.

Examples

iex> validate_capabilities([{:read, "/file"}, {:write, "/file"}], [{:admin, "/file"}])
true

validate_capability(capability, available_capabilities)

@spec validate_capability(capability(), [capability()]) :: boolean()

Validates a capability against a set of available capabilities.

Examples

iex> validate_capability({:read, "/file"}, [{:read, "/file"}])
true

iex> validate_capability({:admin, "user"}, [{:read, "/file"}])
false

validate_capability_in_context(capability, context)

@spec validate_capability_in_context(capability(), capability_context()) :: boolean()

Validates a capability in a specific context.

Examples

iex> validate_capability_in_context({:read, "/file"}, %{user: "user1", time: ~U[2023-01-01 12:00:00Z]})
true

validate_delegation(arg, available_capabilities)

@spec validate_delegation({:delegated, capability(), any(), any()}, [capability()]) ::
  boolean()

Validates a capability delegation.

Examples

iex> validate_delegation({:delegated, {:read, "/file"}, "user1", "user2"}, [{:admin, "/file"}])
true

validate_temporal_capability(arg, current_time)

@spec validate_temporal_capability(
  {:temporal, capability(), DateTime.t(), DateTime.t()},
  DateTime.t()
) ::
  boolean()

Validates a temporal capability at a specific time.

Examples

iex> validate_temporal_capability({:temporal, {:read, "/file"}, ~U[2023-01-01 12:00:00Z], ~U[2023-01-02 12:00:00Z]}, ~U[2023-01-01 15:00:00Z])
true