README.md

# Refmon

Refmon is an Elixir implementation of a reference monitor.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `refmon` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:refmon, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/refmon](https://hexdocs.pm/refmon).

## Usage

### カーネルへの組み込み

Refmon.validateマクロをアクセスする層に呼び出す。

例:

```elixir
def some_access_function() do
    validate("User1", "Target1", :read, nil)
    |> case do
        :deny -> raise PermissionError
        :allow -> nil
       end
end
```

### Adapterの実装

Refmon.Adapter ビヘイビアを実装する。

例:

```elixir
defmodule MyApp.MyAdapter do
  use Refmon.Adapter

  def permission(subj, obj, acc, param) do
    case {subj, obj, acc, param} do
      {_, _, :use, "exclusive"} -> :deny
      {"I", "my " <> _, _, _} -> :allow
      {"he", "his " <> _, _, _} -> :allow
      {"subj", "obj", _, _, _} -> :allow
      _ -> :deny
    end
  end
end
```

permission は、アクセス主体 subj とターゲット obj, アクセスモード acc、
アクセスモードパラメータ param をパラメータとして呼び出されるので、許
可(:allow) か 禁止 (:deny) を返す。

permission の呼び出し結果は、Refmon 側でキャッシュされる。キャッシュを
クリアするのは、アプリケーションモジュールの責任である。

subject が nil の場合、システム呼び出しとみなされ、permission は呼び出
されない。

Refmon を組み込むアプリケーションの config.exs に otp_app とアダプタモ
ジュールを設定する。

```elixir
config :refmon,
  otp_app: :myapp,
  adapter: MyApp.MyAdapter
```

otp_app を設定することで、そのアプリケーションで定義しているアクセスモー
ドの一覧を Refmon.subject() から取得することができるようになる