Update the schema

This commit is contained in:
Gregor Reitzenstein 2020-09-22 10:14:13 +02:00
parent 5b7a31b005
commit 3392b9ac25
2 changed files with 71 additions and 42 deletions

107
api.capnp
View File

@ -25,21 +25,28 @@
using Rust = import "rust.capnp"; using Rust = import "rust.capnp";
$Rust.parentModule("api"); $Rust.parentModule("api");
interface Diflouroborane { struct FabAccess {
# Upon initial connection this is the interface a program is presented with, serving as the permissions @0 :Permissions;
# common point to access specific subsystems. Keep in mind that one can use pipelining to make this
# just as efficient as direct calls — e.g. access the authentication system and call
# `initializeAuthentication` on it in one roundtrip, provided one gets granted access to the
# Authentication subsystem (which in all fairness is a reasonable assumption)
permissions @0 () -> ( perm :Permissions );
# Permission subsystem to manage permissions and systems underlying the authorization process # Permission subsystem to manage permissions and systems underlying the authorization process
machines @1 () -> ( mach :Machines ); machines @1 :Machines;
# Diflouroborane stores machine¹ information in an opaque internal database. This interface is # Diflouroborane stores machine¹ information in an opaque internal database. This interface is
# the only stable process of modifying that information # the only stable process of modifying that information
}
# TODO Capability transfer system, required for machine takeover, session resumption. interface Machines {
# The interface to the machines subsystem
listMachines @0 () -> ( machines :List(Machine) );
# List all machines that BFFH knows about the user has been granted at least read access on
getMachine @1 ( uuid :UUID ) -> ( machine :Machine );
# Access a particular machine by known UUID. This may fail for two reasons: The user
# has not been granted access to know the machine exists or the machine does in fact
# not exist. In both cases the `machine` result will be a NULL-pointer
}
interface Permissions {
} }
struct UUID { struct UUID {
@ -58,13 +65,6 @@ struct UUID {
uuid1 @1 :UInt64; uuid1 @1 :UInt64;
} }
struct Maybe(T) {
union {
none @0 :Void;
some @1 :T;
}
}
enum State { enum State {
free @0; free @0;
inUse @1; inUse @1;
@ -74,48 +74,77 @@ enum State {
reserved @5; reserved @5;
} }
interface Machine { struct Machine {
# A machine struct. This represents a machine as BFFH thinks about it which may mean
# several machines or just part of a machine in the real world.
# By itself this struct is completely useless since it contains only the information
# that the machine exists the user is allowed to know about that fact. For all further
# information the user has to call the contained capabilities which depending on the
# access level may not be set. For example an admin will have every capability here
# set but a simple user may only have `read` and `write` set while some users may not
# even have `read` set and are unable to even see if the machine is currently in use.
struct MInfo { struct MInfo {
state @0 :State; state @0 :State;
name @1 :Text; name @1 :Text;
description @2 :Text; description @2 :Text;
responsible @3 :Text; responsible @3 :User; # This field may be NULL if nobody is using the machine
# TODO: Make that an user
} }
read @0 :Read;
interface Read {
info @0 () -> ( minfo :MInfo ); info @0 () -> ( minfo :MInfo );
# Check the state of a machine. # Check the state of a machine.
interface GiveBack {
ret @0 () -> ();
} }
use @1 () -> ( ret :Maybe(GiveBack) ); write @1 :Write;
# Try to use a machine. Fails if the user doesn't have enough permissions interface Write {
use @0 () -> ( ret :GiveBack );
# Try to use a machine. Returns a NULL-ptr if the user does not have the required
# permissions to use this machine
interface GiveBack {
# If you are using a machine you have the capablity to give it back
interface Check { ret @0 () -> ();
# Calling this function will return the machine and set its state as appropiate
}
}
manage @2 :Manage;
# After a machine has been used by an user with low enough permissions it's
# in the 'toCheck' state. This call then allows more priviledged users to
# "check" the machine and move it to the `free` state.
interface Manage {
ok @0 () -> (); # The machine was clean & ok. -> free ok @0 () -> (); # The machine was clean & ok. -> free
notOk @1 () -> (); notOk @1 () -> ();
# The machine was left in an unacceptable state. # The machine was left in an unacceptable state.
# Most likely marks the machine as `blocked` and somehow informs the previous user. # Most likely marks the machine as `blocked` and somehow informs the previous user.
} }
check @2 () -> ( chk :Maybe(Check) ); admin @3 :Admin;
# After a machine has been used by an user with low enough permissions it's # Administrative overrides. This is only not-NULL if you have the required permissions
# in the 'toCheck' state. This call then allows more priviledged users to # to use it.
# "check" the machine and move it to the `free` state. interface Admin{
forceSetState @0 ( state :State ) -> (); # Forcefully set a machine state
reserve @3 () -> ( rsrv :Maybe(AnyPointer) ); forceSetUser @1 ( user :Text ) -> (); # Set the given user as current responsible
}
} }
interface Machines { struct User {
lookup @0 ( uuid :UUID ) -> ( machine :Maybe(Machine) ); struct UserInformation {
# Get a machine interface. Returns `none` if there is no Machine with the given uuid. id @0 :Text;
name @1 :Text;
list @1 () -> ( machines :List(Machine) ); originatingWorkshop @2 :Text;
# List all machines
} }
interface Permissions { read @0 :Read;
interface Read {
info @0 () -> ( uinfo :UserInformation );
}
write @1 :Write;
interface Write {
setName @0 ( name :Text ) -> ();
}
} }

View File

@ -39,7 +39,7 @@ struct Message {
# Start an authenticaion exchange # Start an authenticaion exchange
# TODO: RPC bootstrapping # TODO: RPC bootstrapping
api @3 :Api.Diflouroborane; api @3 :Api.FabAccess;
} }
} }