gizdb:policy
The DAL's Policy (GIZSTACK-PLATFORM §3 item 5). Grants on records live in one table, grants; record ancestry lives in one closure table, ancestry, which the writing transaction keeps with the record. Security.decide judges an actor over the grants on a target and its ancestors, read at one snapshot. A record that has no ancestry row has no access (default deny). Only Policy Operations write grants; they check the granting actor with decide first. A group is a record of type group: a grant on it makes its grantee a member, and a grant to Principal.group reaches every member.
import * as Policy from "gizdb:policy";Types
Write
type Write = { statements: Vec<string>; params: Vec<Value>; rows: Option<i64>; touched: Vec<Touch>; }SQL statements, one text each, and the parameters $1.. they share: a statement gets the first N parameters, N being the highest one it names. When rows is set, the first statement must change exactly that many rows, else the transaction is a conflict. Data.write runs a Write.
statements:Vec<string>params:Vec<M55.Value>rows:_gizlang_sdk_core.Option<i64>touched:Vec<M60.Touch>
Touch
type Touch = { table: string; key: string; }A row a Write changes (key "": any row of the table), for the live views of a store that has no change log of its own.
table:stringkey:string
Condition
type Condition = { sql: string; slots: Vec<Typed.Slot>; params: Vec<Value>; }A SQL condition with the parameters that it numbers from first.
sql:stringslots:Vec<M54.Slot>params:Vec<M55.Value>
Functions
schema
function schema(): Vec<string>The two tables, created once with the database: their Shapes' DDL.
Effects: fail, read, write, console, io.
place
function place(node: Security.ResourceRef, parent: Option<Security.ResourceRef>): Result<Write, DbError>Statements that place a new record under parent (none for a root). Run
them in the transaction that inserts the record. A parent that has no
ancestry row passes nothing on.
Effects: fail.
move
function move(node: Security.ResourceRef, parent: Security.ResourceRef): Result<Write, DbError>Statements that move a placed record, with everything under it, to parent.
A move under the record itself, or of a record that is not placed, rolls
the transaction back (ErrorKind.conflict).
Effects: fail.
remove
function remove(node: Security.ResourceRef): Result<Write, DbError>Statements that remove a record and everything under it from Policy: their grants and their ancestry. Run them with the record's delete.
Effects: fail.
grant
function grant(principal: Security.Principal, target: Security.ResourceRef, role: Security.Role, expires: i64, now: i64, by: Security.Principal): Result<Write, DbError>A grant of role on target until expires (0: no end), replacing an
earlier grant to the same principal.
Effects: fail.
revoke
function revoke(principal: Security.Principal, target: Security.ResourceRef): Result<Write, DbError>The write that removes the grant of PRINCIPAL on TARGET.
Effects: fail.
decide
function decide(source: Source, actor: Security.Principal, target: Security.ResourceRef, needed: Security.Role, now: i64): Result<Security.Decision, DbError>The actor's decision on target for the needed role at now: the target's
ancestry and the grants of the actor, of an agent's person and of their groups
on it, in one snapshot.
Effects: fail, read, write, console, io.
commands
function commands(w: Write): Result<Vec<Statement>, DbError>The statements of w as the GizDB engine runs them (Connection.write, Transaction.write): parsed, the first one guarded when rows is set.
Effects: fail.
reaches
function reaches(source: Source, actor: Security.Principal, needed: Security.Role, now: i64, row: string, first: i64): Result<Condition, DbError>The SQL condition that a grant of at least needed reaches the record that the text expression row (a SPACE/TYPE/KEY
reference) names, on the record or on an ancestor: decide for many rows at once, so a query selects only what the actor may read.
An agent needs its own grant and its person's grant, under its ceiling; a group does not act. Parameters number from first.
Effects: fail, read, write, console, io.
Constants
DEPTH
const DEPTH = 32The most levels a record inherits grants through (its own row is level 0).