From 7ff80825a16b91ef2c0374776f0d140068153d0b Mon Sep 17 00:00:00 2001 From: nsensfel Date: Wed, 12 Dec 2018 16:57:44 +0100 Subject: Moving TO's DB system to its own repository. --- src/ataxia_client.erl | 158 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ataxia_entry.erl | 96 +++++++++++++++++++++++++++++ src/ataxia_security.erl | 36 +++++++++++ 3 files changed, 290 insertions(+) create mode 100644 src/ataxia_client.erl create mode 100644 src/ataxia_entry.erl create mode 100644 src/ataxia_security.erl (limited to 'src') diff --git a/src/ataxia_client.erl b/src/ataxia_client.erl new file mode 100644 index 0000000..f1b96e1 --- /dev/null +++ b/src/ataxia_client.erl @@ -0,0 +1,158 @@ +-module(ataxia_client). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export +( + [ + insert_at/5, + insert/4, + remove/3, + fetch/3, + reserve/3, + commit/1 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_debug_db_node () -> node(). +get_debug_db_node () -> list_to_atom("db_node@" ++ net_adm:localhost()). + +-spec get_random_db_node () -> node(). +get_random_db_node () -> + get_debug_db_node(). + +-spec get_db_node_for (binary()) -> node(). +get_db_node_for (_ObjectID) -> + get_debug_db_node(). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec insert_at + ( + atom(), + binary(), + ataxia_security:permission(), + ataxia_security:permission(), + any() + ) + -> 'ok'. +insert_at (DB, ObjectID, ReadPerm, WritePerm, Value) -> + DBNode = get_db_node_for(ObjectID), + + {atomic, _} = + rpc:call + ( + DBNode, + db_access, + insert_at, + [DB, ObjectID, ReadPerm, WritePerm, Value] + ), + + io:format + ( + "~nshr_database:insert_at(~p) ! ~p -> ok.~n", + [{DB, ObjectID, ReadPerm, WritePerm, Value}, DBNode] + ), + + ok. + +-spec insert + ( + atom(), + ataxia_security:permission(), + ataxia_security:permission(), + any() + ) + -> {'ok', binary()}. +insert (DB, ReadPerm, WritePerm, Value) -> + DBNode = get_random_db_node(), + + {atomic, {ok, ID}} = + rpc:call(DBNode, db_access, insert, [DB, ReadPerm, WritePerm, Value]), + + io:format + ( + "~nshr_database:insert(~p) ! ~p -> ok.~n", + [{DB, ReadPerm, WritePerm, Value}, DBNode] + ), + + {ok, ID}. + +-spec fetch + ( + atom(), + binary(), + ataxia_security:user() + ) + -> ({'ok', any()} | 'not_found'). +fetch (DB, ObjectID, Cred) -> + DBNode = get_db_node_for(ObjectID), + + {atomic, Reply} = rpc:call(DBNode, db_access, read, [DB, ObjectID, Cred]), + + io:format + ( + "~nshr_database:fetch(~p) ! ~p -> ~p.~n", + [{DB, ObjectID, Cred}, DBNode, Reply] + ), + + Reply. + +-spec commit (shr_db_query:type()) -> 'ok'. +commit (Query) -> + DBNode = get_db_node_for(shr_db_query:get_entry_id(Query)), + + {atomic, ok} = rpc:call(DBNode, db_access, query, [Query]), + + io:format("~nshr_database:commit(~p) ! ~p -> ok.~n", [Query, DBNode]), + + ok. + +-spec remove + ( + atom(), + binary(), + ataxia_security:user() + ) + -> ('ok' | 'not_found'). +remove (DB, ObjectID, Cred) -> + DBNode = get_db_node_for(ObjectID), + + {atomic, _} = rpc:call(DBNode, db_access, remove, [DB, ObjectID, Cred]), + + io:format + ( + "~nshr_database:remove(~p) ! ~p -> ok.~n", + [{DB, ObjectID, Cred}, DBNode] + ), + + ok. + +-spec reserve + ( + atom(), + binary(), + ataxia_security:user() + ) + -> ('ok' | 'not_found'). +reserve (DB, ObjectID, Cred) -> + DBNode = get_db_node_for(ObjectID), + + {atomic, _} = rpc:call(DBNode, db_access, reserve, [DB, ObjectID, Cred]), + + io:format + ( + "~nshr_database:reserve(~p) ! ~p -> ok.~n", + [{DB, ObjectID, Cred}, DBNode] + ), + + ok. diff --git a/src/ataxia_entry.erl b/src/ataxia_entry.erl new file mode 100644 index 0000000..a0a48e2 --- /dev/null +++ b/src/ataxia_entry.erl @@ -0,0 +1,96 @@ +-module(ataxia_entry). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + entry, + { + id :: any(), + read_perm :: ataxia_security:permission(), + write_perm :: ataxia_security:permission(), + lock :: ataxia_security:lock(), + val :: any() + } +). + +-type type() :: #entry{}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export_type([type/0]). + +-export +( + [ + new/4, + + get_id/1, + get_read_permission/1, + get_write_permission/1, + get_value/1, + + set_read_permission/2, + set_write_permission/2, + set_value/2, + + get_id_field/0, + get_record_info/0, + get_record_name/0 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec new + ( + any(), + ataxia_security:permission(), + ataxia_security:permission(), + any() + ) -> type(). +new (ID, ReadPermission, WritePermission, Value) -> + #entry + { + id = ID, + read_perm = ReadPermission, + write_perm = WritePermission, + lock = ataxia_security:unlocked(), + val = Value + }. + +-spec get_id (type()) -> any(). +get_id (#entry { id = Result }) -> Result. + +-spec get_read_permission (type()) -> ataxia_security:permission(). +get_read_permission (#entry { read_perm = Result }) -> Result. + +-spec get_write_permission (type()) -> ataxia_security:permission(). +get_write_permission (#entry { write_perm = Result }) -> Result. + +-spec get_value (type()) -> any(). +get_value (#entry { val = Result }) -> Result. + +-spec set_read_permission (ataxia_security:permission(), type()) -> type(). +set_read_permission (Perm, Item) -> Item#entry{ read_perm = Perm }. + +-spec set_write_permission (ataxia_security:permission(), type()) -> type(). +set_write_permission (Perm, Item) -> Item#entry{ write_perm = Perm }. + +-spec set_value (any(), type()) -> type(). +set_value (Value, Item) -> Item#entry{ val = Value }. + +-spec get_id_field () -> non_neg_integer(). +get_id_field () -> #entry.id. + +get_record_info () -> record_info(fields, entry). + +get_record_name () -> entry. + diff --git a/src/ataxia_security.erl b/src/ataxia_security.erl new file mode 100644 index 0000000..6fbc7d1 --- /dev/null +++ b/src/ataxia_security.erl @@ -0,0 +1,36 @@ +-module(ataxia_security). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-type named_user() :: {'user', any()}. +-type user() :: (named_user() | 'admin' | 'any' | 'janitor'). +-type permission() :: (list(named_user()) | 'any' | 'janitor'). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export_type([user/0, permission/0]). + +-export([can_access/2, user_from_id/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec user_from_id (any()) -> user(). +user_from_id (ID) -> {user, ID}. + +-spec can_access (permission(), user()) -> boolean(). +can_access (_, admin) -> true; +can_access (any, _) -> true; +can_access (janitor, janitor) -> true; +can_access (List, {user, User}) -> + lists:member({user, User}, List); +can_access (List, janitor) -> + lists:member(janitor, List); +can_access (List, User) -> + can_access(List, {user, User}). -- cgit v1.2.3-70-g09d2