summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ataxia_client.erl34
-rw-r--r--src/ataxia_security.erl6
-rw-r--r--src/ataxia_server.erl35
3 files changed, 65 insertions, 10 deletions
diff --git a/src/ataxia_client.erl b/src/ataxia_client.erl
index dec16e6..739320a 100644
--- a/src/ataxia_client.erl
+++ b/src/ataxia_client.erl
@@ -12,7 +12,8 @@
[
add/4,
add_at/5,
- reserve/2,
+ reserve/3,
+ reserve/4,
fetch/3,
update/4,
@@ -102,18 +103,41 @@ add (DB, ReadPerm, WritePerm, Value) ->
-spec reserve
(
atom(),
+ ataxia_security:permission(),
+ ataxia_security:permission()
+ )
+ -> ({'ok', ataxia_id:type()} | {'aborted', any()}).
+reserve (DB, ReadPerm, WritePerm) ->
+ DBNode = get_random_db_node(),
+
+ Reply = rpc:call(DBNode, ataxia_server, reserve, [DB, ReadPerm, WritePerm]),
+
+ io:format
+ (
+ "~nataxia_client:reserve(~p) ! ~p -> ~p.~n",
+ [{DB, ReadPerm, WritePerm}, DBNode, Reply]
+ ),
+
+ Reply.
+
+-spec reserve
+ (
+ atom(),
+ ataxia_security:permission(),
+ ataxia_security:permission(),
ataxia_id:type()
)
- -> ('ok' | 'unavailable').
-reserve (DB, ID) ->
+ -> ('ok' | {'aborted', any()}).
+reserve (DB, ReadPerm, WritePerm, ID) ->
DBNode = get_db_node_for(ID),
- Reply = rpc:call(DBNode, ataxia_server, reserve, [DB, ID]),
+ Reply =
+ rpc:call(DBNode, ataxia_server, reserve, [DB, ReadPerm, WritePerm, ID]),
io:format
(
"~nataxia_client:reserve(~p) ! ~p -> ~p.~n",
- [{DB, ID}, DBNode, Reply]
+ [{DB, ReadPerm, WritePerm, ID}, DBNode, Reply]
),
Reply.
diff --git a/src/ataxia_security.erl b/src/ataxia_security.erl
index 27f0540..e51ab3c 100644
--- a/src/ataxia_security.erl
+++ b/src/ataxia_security.erl
@@ -14,7 +14,7 @@
-export([janitor/0, any/0, admin/0, user_from_id/1]).
--export([add_access/2, remove_access/2, allow_only/1]).
+-export([add_access/2, remove_access/2, allow_only/1, allow_any/0]).
-export([can_access/2]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -36,6 +36,10 @@ remove_access (User, Permission) ->
allow_only (User) ->
ordsets:add_element(User, ordsets:new()).
+-spec allow_any () -> permission().
+allow_any () ->
+ ordsets:add_element(any(), ordsets:new()).
+
-spec user_from_id (any()) -> user().
user_from_id (ID) -> {user, ID}.
diff --git a/src/ataxia_server.erl b/src/ataxia_server.erl
index 8a49616..dfa2f9e 100644
--- a/src/ataxia_server.erl
+++ b/src/ataxia_server.erl
@@ -12,7 +12,8 @@
[
add_at/5,
add/4,
- reserve/2,
+ reserve/3,
+ reserve/4,
fetch/3,
update/4,
@@ -104,12 +105,38 @@ add (DB, ReadPerm, WritePerm, Value) ->
-spec reserve
(
atom(),
+ ataxia_security:permission(),
+ ataxia_security:permission(),
ataxia_id:type()
)
-> ({'aborted', any()} | 'ok').
-reserve (DB, ID) ->
- JanitorPermission = ataxia_security:allow_only(ataxia_security:janitor()),
- add_at(DB, ID, JanitorPermission, JanitorPermission, reserved).
+reserve (DB, ReadPerm, WritePerm, ID) ->
+ % TODO: spawn or inform janitor
+ add_at
+ (
+ DB,
+ ID,
+ ataxia_security:add_access(ataxia_security:janitor(), ReadPerm),
+ ataxia_security:add_access(ataxia_security:janitor(), WritePerm),
+ reserved
+ ).
+
+-spec reserve
+ (
+ atom(),
+ ataxia_security:permission(),
+ ataxia_security:permission()
+ )
+ -> ({'aborted', any()} | {'ok', ataxia_id:type()}).
+reserve (DB, ReadPerm, WritePerm) ->
+ % TODO: spawn or inform janitor
+ add
+ (
+ DB,
+ ataxia_security:add_access(ataxia_security:janitor(), ReadPerm),
+ ataxia_security:add_access(ataxia_security:janitor(), WritePerm),
+ reserved
+ ).
-spec fetch
(