Merge pull request #610 from Fang-/clay-permissions

Clay permissions
This commit is contained in:
Ted Blackman 2018-02-14 10:11:21 -08:00 committed by GitHub
commit e094ca44de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 493 additions and 177 deletions

View File

@ -133,6 +133,7 @@
++ coup-kiln-spam (wrap take-coup-spam):from-kiln
++ diff-sole-effect-drum-phat (wrap diff-sole-effect-phat):from-drum
++ init-helm |=({way/wire *} [~ +>])
++ mack-kiln (wrap mack):from-kiln
++ made-write (wrap made):from-write
++ made-kiln (wrap take-made):from-kiln
++ mere-kiln (wrap take-mere):from-kiln
@ -186,6 +187,7 @@
++ poke-kiln-overload (wrap poke-overload):from-kiln
++ poke-kiln-unmount (wrap poke-unmount):from-kiln
++ poke-kiln-unsync (wrap poke-unsync):from-kiln
++ poke-kiln-permission (wrap poke-permission):from-kiln
++ poke-womb-invite (wrap poke-invite):from-womb
++ poke-womb-save (wrap poke-save):from-womb
++ poke-womb-obey (wrap poke-obey):from-womb

10
gen/hood/private.hoon Normal file
View File

@ -0,0 +1,10 @@
:: Kiln: make (subtree in) desk privately readable.
::
:::: /gen/hood/private/hoon
::
:- %say
|= $: {now/@da eny/@uvJ bec/beak}
{arg/{des/desk may/?($~ {pax/path $~})} $~}
==
:- %kiln-permission
[des ?~(may / pax.may) |]:arg

10
gen/hood/public.hoon Normal file
View File

@ -0,0 +1,10 @@
:: Kiln: make (subtree in) desk publicly readable.
::
:::: /gen/hood/public/hoon
::
:- %say
|= $: {now/@da eny/@uvJ bec/beak}
{arg/{des/desk may/?($~ {pax/path $~})} $~}
==
:- %kiln-permission
[des ?~(may / pax.may) &]:arg

View File

@ -67,6 +67,7 @@
{$dirk wire @tas} ::
{$ogre wire $@(@tas beam)} ::
{$merg wire @p @tas @p @tas case germ} ::
{$perm wire ship desk path rite:clay} ::
{$poke wire dock pear} ::
{$wipe wire @p $~} ::
{$wait wire @da} ::
@ -79,6 +80,12 @@
{$helm-reset $~} ::
== ::
++ move (pair bone card) :: user-level move
++ riot ::tmp up-to-date riot
%- unit
$: p/{p/?($d $p $u $v $w $x $y $z) q/case r/desk}
q/path
r/cage
==
--
|_ moz/(list move)
++ abet :: resolve
@ -185,6 +192,12 @@
=+ old=;;((map @da cord) (fall (file where) ~))
`(foal where %sched !>((~(put by old) tym eve)))
::
++ poke-permission
|= {syd/desk pax/path pub/?}
=< abet
%^ emit %perm /kiln/permission
[our syd pax %r ~ ?:(pub %black %white) ~]
::
++ poke-autoload |=(lod/(unit ?) abet:(poke:autoload lod))
++ poke-start-autoload |=($~ abet:start:autoload)
::
@ -267,6 +280,11 @@
::
++ poke-wipe-ford |=($~ abet:(emit %wipe /kiln our ~))
::
++ mack
|= {way/wire saw/(unit tang)}
~? ?=(^ saw) [%kiln-nack u.saw]
abet
::
++ take |=(way/wire ?>(?=({@ $~} way) (work i.way))) :: general handler
++ take-mere ::
|= {way/wire are/(each (set path) (pair term tang))}

View File

@ -43,31 +43,33 @@
::
:: Type of request.
::
:: %d produces a set of desks, %u checks for existence, %v produces a ++dome of
:: all desk data, %w with a time or label case gets the aeon at that case, %w
:: with a number case is not recommended, %x gets file contents, %y gets a
:: directory listing, and %z gets a recursive hash of the file contents and
:: children.
:: %d produces a set of desks, %p gets file permissions, %u checks for
:: existence, %v produces a ++dome of all desk data, %w with a time or label
:: case gets the aeon at that case, %w with a number case is not recommended,
:: %x gets file contents, %y gets a directory listing, and %z gets a recursive
:: hash of the file contents and children.
::
:: ++ care ?($d $u $v $w $x $y $z)
:: ++ care ?($d $p $u $v $w $x $y $z)
::
:: Keeps track of subscribers.
::
:: A map of requests to a set of all the subscribers who should be notified
:: when the request is filled/updated.
::
++ cult (jug rove duct)
++ cult (jug wove duct)
::
:: Domestic desk state.
::
:: Includes subscriber list, dome (desk content), possible commit state (for
:: local changes), and possible merge state (for incoming merges).
:: local changes), possible merge state (for incoming merges), and permissions.
::
++ dojo
$: qyx/cult :: subscribers
dom/dome :: desk state
dok/(unit dork) :: commit state
mer/(unit mery) :: merge state
per/regs :: read perms per path
pew/regs :: write perms per path
==
::
:: Desk state.
@ -183,6 +185,7 @@
:: -- `mon` is a collection of mount points (mount point name to urbit
:: location).
:: -- `hez` is the unix duct that %ergo's should be sent to.
:: -- `cez` is a collection of named permission groups.
::
++ raft :: filesystem
$: fat/(map ship room) :: domestic
@ -190,6 +193,7 @@
ran/rang :: hashes
mon/(map term beam) :: mount points
hez/(unit duct) :: sync duct
cez/(map @ta crew) :: permission groups
== ::
::
:: Object store.
@ -238,6 +242,8 @@
dom/dome :: revision state
dok/(unit dork) :: outstanding diffs
mer/(unit mery) :: outstanding merges
per/regs :: read perms per path
pew/regs :: write perms per path
== ::
::
:: Foreign request manager.
@ -271,6 +277,7 @@
:: Generally used when we store a request in our state somewhere.
::
++ cach (unit (unit (each cage lobe))) :: cached result
++ wove {p/(unit ship) q/rove} :: stored source + req
++ rove :: stored request
$% {$sing p/mood} :: single request
{$next p/mood q/cach} :: next version
@ -323,6 +330,7 @@
$% {$info p/@p q/@tas r/nori} :: internal edit
{$merg p/@p q/@tas r/@p s/@tas t/case u/germ} :: merge desks
{$warp p/sock q/riff} ::
{$werp p/ship q/sock r/riff} ::
== == ::
$: $d ::
$% {$flog p/{$crud p/@tas q/(list tank)}} :: to %dill
@ -346,7 +354,7 @@
{$writ p/riot} ::
== == ::
$: $f ::
$% {$made p/@uvH q/gage:ford} ::
$% {$made p/@uvH q/gage:ford} ::
== == ::
$: $t ::
$% {$wake $~} :: timer activate
@ -421,6 +429,8 @@
dom=*dome
dok=~
mer=~
per=~
pew=~
==
:- `hun.u.rom
=+ jod=(fall (~(get by dos.u.rom) syd) *dojo)
@ -430,6 +440,8 @@
dom=dom.jod
dok=dok.jod
mer=mer.jod
per=per.jod
pew=pew.jod
==
=* red ->
=| mow/(list move)
@ -440,21 +452,21 @@
?~ rom
=+ rug=(~(put by rus:(fall (~(get by hoy.ruf) her) *rung)) syd red)
ruf(hoy (~(put by hoy.ruf) her rug))
=+ dos=(~(put by dos.u.rom) syd [qyx dom dok mer])
=+ dos=(~(put by dos.u.rom) syd [qyx dom dok mer per pew])
ruf(fat (~(put by fat.ruf) her [(need hun) dos]))
(flop mow)
::
:: Handle `%sing` requests
::
++ aver
|= mun/mood
|= {for/(unit ship) mun/mood}
^- (unit (unit (each cage lobe)))
=+ ezy=?~(ref ~ (~(get by haw.u.ref) mun))
?^ ezy
`(bind u.ezy |=(a/cage [%& a]))
=+ nao=(case-to-aeon:ze q.mun)
:: ~& [%aver-mun nao [%from syd lim q.mun]]
?~(nao ~ (read-at-aeon:ze u.nao mun))
?~(nao ~ (read-at-aeon:ze for u.nao mun))
::
++ ford-fail |=(tan/tang ~|(%ford-fail (mean tan)))
::
@ -651,14 +663,14 @@
:: foreign ship.
::
++ duce :: produce request
|= rov/rove
|= wov/wove
^+ +>
=. rov (dedupe rov)
=. qyx (~(put ju qyx) rov hen)
=. wov (dedupe wov)
=. qyx (~(put ju qyx) wov hen)
?~ ref
(mabe rov |=(@da (bait hen +<)))
(mabe q.wov |=(@da (bait hen +<)))
|- ^+ +>+.$
=+ rav=(reve rov)
=+ rav=(reve q.wov)
=+ ^= vaw ^- rave
?. ?=({$sing $v *} rav) rav
[%many %| [%ud let.dom] `case`q.p.rav r.p.rav]
@ -680,17 +692,21 @@
:: all get filled at once.
::
++ dedupe :: find existing alias
|= rov/rove ^- rove
=; ron/(unit rove) (fall ron rov)
|= wov/wove
^- wove
=; won/(unit wove) (fall won wov)
=* rov q.wov
?- -.rov
$sing ~
$next
=+ aey=(case-to-aeon:ze q.p.rov)
?~ aey ~
%+ roll ~(tap in ~(key by qyx))
|= {hav/rove res/(unit rove)}
%- ~(rep in ~(key by qyx))
|= {haw/wove res/(unit wove)}
?^ res res
=- ?:(- `hav ~)
?. =(p.wov p.haw) ~
=* hav q.haw
=- ?:(- `haw ~)
?& ?=($next -.hav)
=(p.hav p.rov(q q.p.hav))
::
@ -703,10 +719,12 @@
$mult
=+ aey=(case-to-aeon:ze p.p.rov)
?~ aey ~
%+ roll ~(tap in ~(key by qyx))
|= {hav/rove res/(unit rove)}
%- ~(rep in ~(key by qyx))
|= {haw/wove res/(unit wove)}
?^ res res
=- ?:(- `hav ~)
?. =(p.wov p.haw) ~
=* hav q.haw
=- ?:(- `haw ~)
?& ?=($mult -.hav)
=(p.hav p.rov(p p.p.hav))
::
@ -724,10 +742,12 @@
$many
=+ aey=(case-to-aeon:ze p.q.rov)
?~ aey ~
%+ roll ~(tap in ~(key by qyx))
|= {hav/rove res/(unit rove)}
%- ~(rep in ~(key by qyx))
|= {haw/wove res/(unit wove)}
?^ res res
=- ?:(- `hav ~)
?. =(p.wov p.haw) ~
=* hav q.haw
=- ?:(- `haw ~)
?& ?=($many -.hav)
=(hav rov(p.q p.q.hav))
::
@ -781,6 +801,55 @@
(lobe-to-silk:ze a p.-)
==
::
:: Set permissions for a node.
::
++ perm
|= {pax/path rit/rite}
^+ +>
=/ mis/(set @ta)
%+ roll
=- ~(tap in -)
?- -.rit
$r who:(fall red.rit *rule)
$w who:(fall wit.rit *rule)
$rw (~(uni in who:(fall red.rit *rule)) who:(fall wit.rit *rule))
==
|= {w/whom s/(set @ta)}
?: |(?=($& -.w) (~(has by cez) p.w)) s
(~(put in s) p.w)
?^ mis
=- (emit hen %give %mack `[%leaf "No such group(s): {-}"]~)
%+ roll ~(tap in `(set @ta)`mis)
|= {g/@ta t/tape}
?~ t (trip g)
:(weld t ", " (trip g))
=< (emit hen %give %mack ~)
?- -.rit
$r wake(per (put-perm per pax red.rit))
$w wake(pew (put-perm pew pax wit.rit))
$rw wake(per (put-perm per pax red.rit), pew (put-perm pew pax wit.rit))
==
::
++ put-perm
|= {pes/regs pax/path new/(unit rule)}
?~ new (~(del by pes) pax)
(~(put by pes) pax u.new)
::
:: Remove a group from all rules.
::
++ forget-crew
|= nom/@ta
%= +>
per (forget-crew-in nom per)
pew (forget-crew-in nom pew)
==
::
++ forget-crew-in
|= {nom/@ta pes/regs}
%- ~(run by pes)
|= r/rule
r(who (~(del in who.r) |+nom))
::
:: Cancel a request.
::
:: For local requests, we just remove it from `qyx`. For foreign requests,
@ -788,17 +857,17 @@
::
++ cancel-request :: release request
^+ .
=^ ros/(list rove) qyx
=^ wos/(list wove) qyx
:_ (~(run by qyx) |=(a/(set duct) (~(del in a) hen)))
%- ~(rep by qyx)
|= {{a/rove b/(set duct)} c/(list rove)}
|= {{a/wove b/(set duct)} c/(list wove)}
?.((~(has in b) hen) c [a c])
?~ ref
=> .(ref `(unit rind)`ref) :: XX TMI
?: =(~ ros) + :: XX handle?
?: =(~ wos) + :: XX handle?
|- ^+ +>
?~ ros +>
$(ros t.ros, +> (mabe i.ros |=(@da (best hen +<))))
?~ wos +>
$(wos t.wos, +> (mabe q.i.wos |=(@da (best hen +<))))
^+ ..cancel-request
=+ nux=(~(get by fod.u.ref) hen)
?~ nux ..cancel-request
@ -816,13 +885,13 @@
:: and then waiting if the subscription range extends into the future.
::
++ start-request
|= rav/rave
|= {for/(unit ship) rav/rave}
^+ +>
?- -.rav
$sing
=+ ver=(aver p.rav)
=+ ver=(aver for p.rav)
?~ ver
(duce rav)
(duce for rav)
?~ u.ver
(blub hen)
(blab hen p.rav u.u.ver)
@ -875,9 +944,11 @@
new/(map (pair care path) cach)
==
^+ ..start-request
%+ duce for
^- rove
?: ?=($mult -.rav)
(duce -.rav p.rav nex old new)
%^ duce -.rav p.rav
[-.rav p.rav nex old new]
:+ -.rav p.rav
=+ ole=~(tap by old)
?> (lte (lent ole) 1)
?~ ole ~
@ -901,26 +972,26 @@
%+ turn ~(tap by req)
|= {c/care p/path}
^- (pair (pair care path) cach)
[[c p] (aver c cas p)]
[[c p] (aver for c cas p)]
--
::
$many
=+ nab=(case-to-aeon:ze p.q.rav)
?~ nab
?> =(~ (case-to-aeon:ze q.q.rav))
(duce [- p q ~]:rav)
(duce for [- p q ~]:rav)
=+ huy=(case-to-aeon:ze q.q.rav)
?: &(?=(^ huy) |((lth u.huy u.nab) &(=(0 u.huy) =(0 u.nab))))
(blub hen)
=+ top=?~(huy let.dom u.huy)
=+ ear=(lobes-at-path:ze top r.q.rav)
=+ ear=(lobes-at-path:ze for top r.q.rav)
=. +>.$
(bleb hen u.nab ?:(p.rav ~ `[u.nab top]))
?^ huy
(blub hen)
=+ ^= ptr ^- case
[%ud +(let.dom)]
(duce `rove`[%many p.rav [ptr q.q.rav r.q.rav] ear])
(duce for `rove`[%many p.rav [ptr q.q.rav r.q.rav] ear])
==
::
:: Print a summary of changes to dill.
@ -1489,6 +1560,9 @@
?- p.p.u.rut
$d
~| %totally-temporary-error-please-replace-me
!!
$p
~| %requesting-foreign-permissions-is-invalid
!!
$u
~| %im-thinkin-its-prolly-a-bad-idea-to-request-rang-over-the-network
@ -1746,32 +1820,34 @@
++ wake :: update subscribers
^+ .
=+ xiq=~(tap by qyx)
=| xaq/(list {p/rove q/(set duct)})
=| xaq/(list {p/wove q/(set duct)})
|- ^+ ..wake
?~ xiq
..wake(qyx (~(gas by *cult) xaq))
?: =(~ q.i.xiq) $(xiq t.xiq, xaq xaq) :: drop forgotten
?- -.p.i.xiq
=* for p.p.i.xiq
=* rov q.p.i.xiq
?- -.rov
$sing
=+ cas=?~(ref ~ (~(get by haw.u.ref) `mood`p.p.i.xiq))
=+ cas=?~(ref ~ (~(get by haw.u.ref) `mood`p.rov))
?^ cas
%= $
xiq t.xiq
..wake ?~ u.cas (blub-all q.i.xiq ~)
(blab-all q.i.xiq p.p.i.xiq %& u.u.cas)
(blab-all q.i.xiq p.rov %& u.u.cas)
==
=+ nao=(case-to-aeon:ze q.p.p.i.xiq)
=+ nao=(case-to-aeon:ze q.p.rov)
?~ nao $(xiq t.xiq, xaq [i.xiq xaq])
:: ~& %reading-at-aeon
=+ vid=(read-at-aeon:ze u.nao p.p.i.xiq)
=+ vid=(read-at-aeon:ze for u.nao p.rov)
:: ~& %red-at-aeon
?~ vid
:: ?: =(0 u.nao)
:: ~& [%oh-poor `path`[syd '0' r.p.p.i.xiq]]
:: ~& [%oh-poor `path`[syd '0' r.p.rov]]
:: $(xiq t.xiq)
:: ~& [%oh-well desk=syd mood=p.p.i.xiq aeon=u.nao]
:: ~& [%oh-well desk=syd mood=p.rov aeon=u.nao]
$(xiq t.xiq, xaq [i.xiq xaq])
$(xiq t.xiq, ..wake (balk-all q.i.xiq u.vid p.p.i.xiq))
$(xiq t.xiq, ..wake (balk-all q.i.xiq u.vid p.rov))
::
:: %next is just %mult with one path, so we pretend %next = %mult here.
?($next $mult)
@ -1780,7 +1856,7 @@
:: {old} is the revision at {(dec yon)}, {new} is the revision at {yon}.
:: if we have no {yon} yet, that means it was still unknown last time
:: we checked.
=* vor p.i.xiq
=* vor rov
|^
=/ rov/rove
?: ?=($mult -.vor) vor
@ -1846,7 +1922,7 @@
++ store :: check again later
|= rov/rove
^+ ..wake
=- ^^$(xiq t.xiq, xaq [i.xiq(p -) xaq])
=- ^^$(xiq t.xiq, xaq [i.xiq(p [for -]) xaq])
?> ?=($mult -.rov)
?: ?=($mult -.vor) rov
?> ?=({* $~ $~} r.rov)
@ -1873,7 +1949,7 @@
++ read-unknown :: fill in the blanks
|= {mol/mool hav/(map (pair care path) cach)}
%. |= {{c/care p/path} o/cach}
?^(o o (aver c p.mol p))
?^(o o (aver for c p.mol p))
=- ~(urn by -)
?^ hav hav
%- ~(gas by *(map (pair care path) cach))
@ -1881,8 +1957,8 @@
--
::
$many
=+ mot=`moat`q.p.i.xiq
=* sav r.p.i.xiq
=+ mot=`moat`q.rov
=* sav r.rov
=+ nab=(case-to-aeon:ze p.mot)
?~ nab
$(xiq t.xiq, xaq [i.xiq xaq])
@ -1891,19 +1967,19 @@
=. p.mot [%ud +(let.dom)]
%= $
xiq t.xiq
xaq [i.xiq(q.p mot) xaq]
xaq [i.xiq(q.q.p mot) xaq]
..wake =+ ^= ear
(lobes-at-path:ze let.dom r.mot)
(lobes-at-path:ze for let.dom r.mot)
?: =(sav ear) ..wake
(bleb-all q.i.xiq let.dom ?:(p.p.i.xiq ~ `[u.nab let.dom]))
(bleb-all q.i.xiq let.dom ?:(p.rov ~ `[u.nab let.dom]))
==
%= $
xiq t.xiq
..wake =- (blub-all:- q.i.xiq ~)
=+ ^= ear
(lobes-at-path:ze u.huy r.mot)
(lobes-at-path:ze for u.huy r.mot)
?: =(sav ear) (blub-all q.i.xiq ~)
(bleb-all q.i.xiq +(u.nab) ?:(p.p.i.xiq ~ `[u.nab u.huy]))
(bleb-all q.i.xiq +(u.nab) ?:(p.rov ~ `[u.nab u.huy]))
==
==
++ drop-me
@ -1927,7 +2003,7 @@
:: and content
:: -- creating commits and content and adding them to the tree
:: -- finding which data needs to be sent over the network to keep the
:: -- other urbit up-to-date
:: other urbit up-to-date
:: -- reading from the file tree through different `++care` options
:: -- the `++me` core for merging.
::
@ -2193,9 +2269,11 @@
:: Gets a map of the data at the given path and all children of it.
::
++ lobes-at-path
|= {yon/aeon pax/path}
|= {for/(unit ship) yon/aeon pax/path}
^- (map path lobe)
?: =(0 yon) ~
:: we use %z for the check because it looks at all child paths.
?: |(?=($~ for) (may-read u.for %z yon pax)) ~
%- malt
%+ skim
%~ tap by
@ -2286,9 +2364,10 @@
:: eliminate ++read and ++query
::
++ query :: query:ze
|= ren/$?($u $v $x $y $z) :: endpoint query
|= ren/$?($p $u $v $x $y $z) :: endpoint query
^- (unit cage)
?- ren
$p !!
$u !! :: [~ %null [%atom %n] ~]
$v [~ %dome !>(dom)]
$x !! :: ?~(q.ank.dom ~ [~ q.u.q.ank.dom])
@ -2314,6 +2393,65 @@
?^(r.mun ~ !!) :: [~ %w !>([t.yak (forge-nori yak)])])-all
(query(ank.dom ank:(descend-path:(zu ank.dom) r.mun)) p.mun) :: dead code
::
:: Gets the permissions that apply to a particular node.
::
:: If the node has no permissions of its own, we use its parent's.
:: If no permissions have been set for the entire tree above the node,
:: we default to fully private (empty whitelist).
::
++ read-p
|= pax/path
^- (unit (unit (each cage lobe)))
=- [~ ~ %& %noun !>(-)]
:- (read-p-in pax per.red)
(read-p-in pax pew.red)
::
++ read-p-in
|= {pax/path pes/regs}
^- dict
=+ rul=(~(get by pes) pax)
?^ rul [pax u.rul]
?~ pax [/ %white ~]
$(pax (scag (dec (lent pax)) `path`pax))
::
++ may-read
|= {who/ship car/care yon/aeon pax/path}
^- ?
?+ car
(allowed-by who pax per.red)
::
$p
=(who our)
::
?($y $z)
=+ tak=(~(get by hit.dom) yon)
?~ tak |
=+ yak=(tako-to-yaki u.tak)
=+ len=(lent pax)
=- (levy ~(tap in -) |=(p/path (allowed-by who p per.red)))
%+ roll ~(tap in (~(del in ~(key by q.yak)) pax))
|= {p/path s/(set path)}
?. =(pax (scag len p)) s
%- ~(put in s)
?: ?=($z car) p
(scag +(len) p)
==
::
++ may-write
|= {w/ship p/path}
(allowed-by w p pew.red)
::
++ allowed-by
|= {who/ship pax/path pes/regs}
^- ?
=+ rul=rul:(read-p-in pax pes)
=- ?:(?=($black mod.rul) !- -)
%- ~(rep in who.rul)
|= {w/whom h/_|}
?: h &
?: ?=($& -.w) =(p.w who)
(~(has in (fall (~(get by cez) p.w) ~)) who)
::
:: Checks for existence of a node at an aeon.
::
:: This checks for existence of content at the node, and does *not* look
@ -2460,8 +2598,10 @@
:: Should change last few lines to an explicit ++read-w.
::
++ read-at-aeon :: read-at-aeon:ze
|= {yon/aeon mun/mood} :: seek and read
|= {for/(unit ship) yon/aeon mun/mood} :: seek and read
^- (unit (unit (each cage lobe)))
?. |(?=($~ for) (may-read u.for p.mun yon r.mun))
~
?: &(?=($w p.mun) !?=($ud -.q.mun)) :: NB only her speed
?^(r.mun [~ ~] [~ ~ %& %aeon !>(yon)])
?: ?=($d p.mun)
@ -2471,6 +2611,8 @@
?^ r.mun
~&(%no-cd-path [~ ~])
[~ ~ %& %noun !>(~(key by dos.u.rom))]
?: ?=($p p.mun)
(read-p r.mun)
?: ?=($u p.mun)
(read-u yon r.mun)
?: ?=($v p.mun)
@ -3429,7 +3571,7 @@
::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
=| :: instrument state
$: $3 :: vane version
$: $4 :: vane version
ruf/raft :: revision tree
== ::
|= {now/@da eny/@ ski/sley} :: activate
@ -3439,49 +3581,91 @@
|= $: hen/duct
hic/(hypo (hobo task:able))
==
=* req q.hic
=> %= . :: XX temporary
q.hic
req
^- task:able
?: ?=($soft -.q.hic)
?: ?=($soft -.req)
=+
~|([%bad-soft (@t -.p.q.hic)] ((soft task:able) p.q.hic))
~|([%bad-soft (@t -.p.req)] ((soft task:able) p.req))
?~ -
~& [%bad-softing (@t -.p.q.hic)] !!
~& [%bad-softing (@t -.p.req)] !!
u.-
?: (~(nest ut -:!>(*task:able)) | p.hic) q.hic
~& [%clay-call-flub (@tas `*`-.q.hic)]
((hard task:able) q.hic)
?: (~(nest ut -:!>(*task:able)) | p.hic) req
~& [%clay-call-flub (@tas `*`-.req)]
((hard task:able) req)
==
^+ [p=*(list move) q=..^$]
?- -.q.hic
?- -.req
$boat
:_ ..^$
[hen %give %hill (turn ~(tap by mon.ruf) head)]~
::.
$cred
=. cez.ruf
?~ cew.req (~(del by cez.ruf) nom.req)
(~(put by cez.ruf) nom.req cew.req)
:: wake all desks, a request may have been affected.
=| mos/(list move)
=+ rom=(fall (~(get by fat.ruf) our.req) *room)
=+ des=~(tap in ~(key by dos.rom))
|-
?~ des [[[hen %give %mack ~] mos] ..^^$]
=+ den=((de now hen ruf) [. .]:our.req i.des)
=^ mor ruf
=< abet:wake
?: ?=(^ cew.req) den
(forget-crew:den nom.req)
$(des t.des, mos (weld mos mor))
::
$crew
[[hen %give %cruz cez.ruf]~ ..^$]
::
$crow
=+ rom=(fall (~(get by fat.ruf) our.req) *room)
=+ des=~(tap by dos.rom)
=| rus/(map desk {r/regs w/regs})
|^
?~ des [[hen %give %croz rus]~ ..^^$]
=+ per=(filter-rules per.q.i.des)
=+ pew=(filter-rules pew.q.i.des)
=? rus |(?=(^ per) ?=(^ pew))
(~(put by rus) p.i.des per pew)
$(des t.des)
::
++ filter-rules
|= pes/regs
^+ pes
=- (~(gas in *regs) -)
%+ skim ~(tap by pes)
|= {p/path r/rule}
(~(has in who.r) |+nom.req)
--
::
$drop
=^ mos ruf
=+ den=((de now hen ruf) [. .]:p.q.hic q.q.hic)
=+ den=((de now hen ruf) [. .]:our.req des.req)
abet:drop-me:den
[mos ..^$]
::
$info
?: =(%$ q.q.hic)
?: =(%$ des.req)
[~ ..^$]
=^ mos ruf
=+ den=((de now hen ruf) [. .]:p.q.hic q.q.hic)
abet:(edit:den now r.q.hic)
=+ den=((de now hen ruf) [. .]:our.req des.req)
abet:(edit:den now dit.req)
[mos ..^$]
::
$init
:_ %_ ..^$
fat.ruf
?< (~(has by fat.ruf) p.q.hic)
(~(put by fat.ruf) p.q.hic [-(hun hen)]:[*room .])
?< (~(has by fat.ruf) our.req)
(~(put by fat.ruf) our.req [-(hun hen)]:[*room .])
==
=+ [bos=(sein:title p.q.hic) can=(clan:title p.q.hic)]
=+ [bos=(sein:title our.req) can=(clan:title our.req)]
%- zing ^- (list (list move))
:~ ?: =(bos p.q.hic) ~
[hen %pass /init-merge %c %merg p.q.hic %base bos %kids da+now %init]~
:~ ?: =(bos our.req) ~
[hen %pass /init-merge %c %merg our.req %base bos %kids da+now %init]~
::
~
==
@ -3489,9 +3673,9 @@
$into
=. hez.ruf `hen
:_ ..^$
=+ bem=(~(get by mon.ruf) p.q.hic)
?: &(?=($~ bem) !=(%$ p.q.hic))
~|([%bad-mount-point-from-unix p.q.hic] !!)
=+ bem=(~(get by mon.ruf) des.req)
?: &(?=($~ bem) !=(%$ des.req))
~|([%bad-mount-point-from-unix des.req] !!)
=+ ^- bem/beam
?^ bem
u.bem
@ -3503,7 +3687,7 @@
?~ dos
~
?: =(0 let.dom.u.dos)
=+ cos=(mode-to-soba ~ s.bem q.q.hic r.q.hic)
=+ cos=(mode-to-soba ~ s.bem all.req fis.req)
=+ ^- {one/(list {path miso}) two/(list {path miso})}
%+ skid cos
|= {a/path b/miso}
@ -3515,80 +3699,91 @@
[hen %pass /two %c %info p.bem q.bem %& two]
==
=+ yak=(~(got by hut.ran.ruf) (~(got by hit.dom.u.dos) let.dom.u.dos))
=+ cos=(mode-to-soba q.yak (flop s.bem) q.q.hic r.q.hic)
=+ cos=(mode-to-soba q.yak (flop s.bem) all.req fis.req)
[hen %pass /both %c %info p.bem q.bem %& cos]~
::
$merg :: direct state up
?: =(%$ q.q.hic)
?: =(%$ des.req)
[~ ..^$]
=^ mos ruf
=+ den=((de now hen ruf) [. .]:p.q.hic q.q.hic)
abet:abet:(start:(me:ze:den [r.q.hic s.q.hic] ~ &) t.q.hic u.q.hic)
=+ den=((de now hen ruf) [. .]:our.req des.req)
abet:abet:(start:(me:ze:den [her.req dem.req] ~ &) cas.req how.req)
[mos ..^$]
::
$mont
=. hez.ruf ?^(hez.ruf hez.ruf `[[%$ %sync ~] ~])
=+ pot=(~(get by mon.ruf) p.q.hic)
=+ pot=(~(get by mon.ruf) des.req)
?^ pot
~& [%already-mounted pot]
[~ ..^$]
=* bem bem.req
=. mon.ruf
(~(put by mon.ruf) p.q.hic [p.q.q.hic q.q.q.hic r.q.q.hic] s.q.q.hic)
=+ yar=(~(get by fat.ruf) p.q.q.hic)
(~(put by mon.ruf) des.req [p.bem q.bem r.bem] s.bem)
=+ yar=(~(get by fat.ruf) p.bem)
?~ yar
[~ ..^$]
=+ dos=(~(get by dos.u.yar) q.q.q.hic)
=+ dos=(~(get by dos.u.yar) q.bem)
?~ dos
[~ ..^$]
=^ mos ruf
=+ den=((de now hen ruf) [. .]:p.q.q.hic q.q.q.hic)
abet:(mont:den p.q.hic q.q.hic)
=+ den=((de now hen ruf) [. .]:p.bem q.bem)
abet:(mont:den des.req bem)
[mos ..^$]
::
$dirk
?~ hez.ruf
~& %no-sync-duct
[~ ..^$]
?. (~(has by mon.ruf) p.q.hic)
~& [%not-mounted p.q.hic]
?. (~(has by mon.ruf) des.req)
~& [%not-mounted des.req]
[~ ..^$]
:- ~[[u.hez.ruf %give %dirk p.q.hic]]
:- ~[[u.hez.ruf %give %dirk des.req]]
..^$
::
$ogre
?~ hez.ruf
~& %no-sync-duct
[~ ..^$]
?@ p.q.hic
?. (~(has by mon.ruf) p.q.hic)
~& [%not-mounted p.q.hic]
=* pot pot.req
?@ pot
?. (~(has by mon.ruf) pot)
~& [%not-mounted pot]
[~ ..^$]
:_ ..^$(mon.ruf (~(del by mon.ruf) p.q.hic))
[u.hez.ruf %give %ogre p.q.hic]~
:_ ..^$(mon.ruf (~(del by mon.ruf) pot))
[u.hez.ruf %give %ogre pot]~
:_ %_ ..^$
mon.ruf
%- molt
%+ skip ~(tap by mon.ruf)
(corl (cury test p.q.hic) tail)
(corl (cury test pot) tail)
==
%+ turn
(skim ~(tap by mon.ruf) (corl (cury test p.q.hic) tail))
|= {pot/term bem/beam}
[u.hez.ruf %give %ogre pot]
(skim ~(tap by mon.ruf) (corl (cury test pot) tail))
|= {pon/term bem/beam}
[u.hez.ruf %give %ogre pon]
::
$warp
$perm
=^ mos ruf
=+ den=((de now hen ruf) p.q.hic p.q.q.hic)
:: =- ~? ?=([~ %sing %w *] q.q.q.hic)
:: :* %someones-warping
:: rav=u.q.q.q.hic
:: mos=-<
:: ==
:: -
::TODO after new boot system, just use our from global.
=+ den=((de now hen ruf) [. .]:our.req des.req)
abet:(perm:den pax.req rit.req)
[mos ..^$]
::
?($warp $werp)
=^ for req
?: ?=($warp -.req)
[~ req]
:_ [%warp wer.req rif.req]
?: =(who.req p.wer.req) ~
`who.req
?> ?=($warp -.req)
=* rif rif.req
=^ mos ruf
=+ den=((de now hen ruf) wer.req p.rif)
=< abet
?~ q.q.q.hic
?~ q.rif
cancel-request:den
(start-request:den u.q.q.q.hic)
(start-request:den for u.q.rif)
[mos ..^$]
::
$went
@ -3596,21 +3791,23 @@
!!
::
$west
?: ?=({$question *} q.q.hic)
=+ ryf=((hard riff) r.q.hic)
=* wer wer.req
=* pax pax.req
?: ?=({$question *} pax)
=+ ryf=((hard riff) res.req)
:_ ..^$
:~ [hen %give %mack ~]
:- hen
:^ %pass [(scot %p p.p.q.hic) (scot %p q.p.q.hic) t.q.q.hic]
:^ %pass [(scot %p p.wer) (scot %p q.wer) t.pax]
%c
[%warp [p.p.q.hic p.p.q.hic] ryf]
[%werp q.wer [p.wer p.wer] ryf]
==
?> ?=({$answer @ @ $~} q.q.hic)
=+ syd=(slav %tas i.t.q.q.hic)
=+ inx=(slav %ud i.t.t.q.q.hic)
?> ?=({$answer @ @ $~} pax)
=+ syd=(slav %tas i.t.pax)
=+ inx=(slav %ud i.t.t.pax)
=^ mos ruf
=+ den=((de now hen ruf) p.q.hic syd)
abet:(take-foreign-update:den inx ((hard (unit rand)) r.q.hic))
=+ den=((de now hen ruf) wer syd)
abet:(take-foreign-update:den inx ((hard (unit rand)) res.req))
[[[hen %give %mack ~] mos] ..^$]
::
$wegh
@ -3635,44 +3832,72 @@
::
++ load
=> |%
+= rove-2
$% {$sing p/mood}
{$next p/mood q/(unit (each cage lobe))}
{$many p/? q/moat r/(map path lobe)}
+= wove-3 rove
++ cult-3 (jug wove-3 duct)
++ dojo-3
$: qyx/cult-3
dom/dome
dok/(unit dork)
mer/(unit mery)
==
++ cult-2 (jug rove-2 duct)
++ dojo-2 (cork dojo |=(a/dojo a(qyx *cult-2)))
++ rede-2 (cork rede |=(a/rede a(qyx *cult-2)))
++ room-2 (cork room |=(a/room a(dos (~(run by dos.a) dojo-2))))
++ rung-2 (cork rung |=(a/rung a(rus (~(run by rus.a) rede-2))))
++ raft-2
%+ cork raft
|=(a/raft a(fat (~(run by fat.a) room-2), hoy (~(run by hoy.a) rung-2)))
++ axle $%({$2 ruf/raft-2} {$3 ruf/raft})
++ rede-3
$: lim/@da
ref/(unit rind)
qyx/cult-3
dom/dome
dok/(unit dork)
mer/(unit mery)
==
++ room-3 (cork room |=(a/room a(dos (~(run by dos.a) dojo-3))))
++ rung-3 (cork rung |=(a/rung a(rus (~(run by rus.a) rede-3))))
++ raft-3
$: fat/(map ship room-3)
hoy/(map ship rung-3)
ran/rang
mon/(map term beam)
hez/(unit duct)
==
++ axle $%({$3 ruf/raft-3} {$4 ruf/raft})
--
|= old/axle
^+ ..^$
?- -.old
$3 ..^$(ruf ruf.old)
$2 =/ rov
|= a/rove-2 ^- rove
?+ -.a a
$next
?~ q.a a
a(q `q.a)
$4 ..^$(ruf ruf.old)
$3 |^
=- ^$(old [%4 -])
=+ ruf.old
:* (~(run by fat) rom)
(~(run by hoy) run)
ran mon hez ~
==
=/ cul
|= a/cult-2 ^- cult
::
++ wov
|= a/wove-3 ^- wove
[~ a]
::
++ cul
|= a/cult-3 ^- cult
%- ~(gas by *cult)
(turn ~(tap by a) |=({p/rove-2 q/(set duct)} [(rov p) q]))
=/ rom
=+ doj=|=(a/dojo-2 a(qyx (cul qyx.a)))
|=(a/room-2 a(dos (~(run by dos.a) doj)))
=/ run
=+ red=|=(a/rede-2 a(qyx (cul qyx.a)))
|=(a/rung-2 a(rus (~(run by rus.a) red)))
=+ r=ruf.old
$(old [%3 r(fat (~(run by fat.r) rom), hoy (~(run by hoy.r) run))])
%+ turn ~(tap by a)
|= {p/wove-3 q/(set duct)}
[(wov p) q]
::
++ rom
|= room-3
:- hun
%- ~(urn by dos)
|= {d/desk dojo-3}
=/ n/dojo [(cul qyx) dom dok mer ~ ~]
?. =(%kids d) n
n(per [[/ %black ~] ~ ~])
::
++ run
=/ red
|= rede-3
=+ [[/ %black ~] ~ ~]
[lim ref (cul qyx) dom dok mer - -]
|=(a/rung-3 a(rus (~(run by rus.a) red)))
--
==
::
++ scry :: inspect
@ -3689,14 +3914,22 @@
[~ ~]
=+ run=((soft care) ren)
?~ run [~ ~]
::TODO if it ever gets filled properly, pass in the full fur.
=/ for/(unit ship)
%- ~(rep in (fall fur ~))
|= {m/monk s/(unit ship)}
?^ s s
?: ?=($| -.m) ~
?: =(p.m his) ~
`p.m
=+ den=((de now [/scryduct ~] ruf) [. .]:his syd)
=+ (aver:den u.run u.luk tyl)
=+ (aver:den for u.run u.luk tyl)
?~ - -
?~ u.- -
?: ?=($& -.u.u.-) ``p.u.u.-
~
::
++ stay [%3 ruf]
++ stay [%4 ruf]
++ take :: accept response
|= {tea/wire hen/duct hin/(hypo sign)}
^+ [p=*(list move) q=..^$]

View File

@ -47,7 +47,8 @@
== ::
++ note-clay ::
$% {$merg p/@p q/@tas r/@p s/@tas t/case u/germ:clay}:: merge desks
{$warp p/sock q/riff:clay} :: wait for clay hack
{$warp p/sock q/riff:clay} :: wait for clay hack
{$perm p/ship q/desk r/path s/rite:clay} :: change permissions
== ::
++ note-dill :: note to self, odd
$% {$crud p/@tas q/(list tank)} ::
@ -79,6 +80,7 @@
$% {$mere p/(each (set path) (pair term tang))} ::
{$note p/@tD q/tank} ::
{$writ p/riot:clay} ::
{$mack p/(unit tang)} ::
== ::
++ sign-dill ::
$% {$blit p/(list blit)} ::
@ -280,7 +282,8 @@
(sync %home our %base)
(init-sync %home our %base)
=. +> ?. ?=(?($duke $king $czar) can) +>
(sync %kids our %base)
:: make kids desk publicly readable, so syncs work.
(show %kids):(sync %kids our %base)
=. +> autoload
=. +> peer
|- ^+ +>+
@ -316,6 +319,16 @@
:_(moz [hen %pass ~ %g %deal [our our] ram %peer /drum])
==
::
++ show :: permit reads on desk
|= des/desk
%_ +>.$
moz
:_ moz
:* hen %pass /show %c %perm our
des / r+`[%black ~]
==
==
::
++ sync
|= syn/{desk ship desk}
%_ +>.$
@ -396,6 +409,10 @@
::
{$c $writ *}
init
::
{$c $mack *}
?~ p.sih +>.$
(mean >%dill-clay-nack< u.p.sih)
::
{$d $blit *}
(done +.sih)

View File

@ -12,7 +12,7 @@
++ move {p/duct q/(wind note gift:able)} :: local move
++ note :: out request $->
$% $: $c :: to %clay
$% {$warp p/sock q/riff:clay} ::
$% {$warp p/sock q/riff:clay} ::
== == ::
$: $f :: to %ford
$% {$exec p/@p q/(unit bilk:ford)} ::

View File

@ -1225,6 +1225,9 @@
~
$cash `%a
$conf `%g
$cred `%c
$crew `%c
$crow `%c
$deal `%g
$exec `%f
$flog `%d
@ -1234,6 +1237,7 @@
$mont `%c
$nuke `%a
$ogre `%c
$perm `%c
$serv `%e
$them `%e
$wait `%b

View File

@ -381,7 +381,9 @@
++ able ^?
|%
++ gift :: out result <-$
$% {$dirk p/@tas} :: mark mount dirty
$% {$croz rus/(map desk {r/regs w/regs})} :: rules for group
{$cruz cez/(map @ta crew)} :: permission groups
{$dirk p/@tas} :: mark mount dirty
{$ergo p/@tas q/mode} :: version update
{$hill p/(list @tas)} :: mount points
{$mack p/(unit tang)} :: ack
@ -389,24 +391,34 @@
{$mere p/(each (set path) (pair term tang))} :: merge result
{$note p/@tD q/tank} :: debug message
{$ogre p/@tas} :: delete mount point
{$rule red/dict wit/dict} :: node r+w permissions
{$send p/lane:ames q/@} :: transmit packet
{$writ p/riot} :: response
{$wris p/case p/(set (pair care path))} :: many changes
== ::
++ task :: in request ->$
$% {$boat $~} :: pier rebooted
{$drop p/@p q/desk} :: cancel pending merge
{$info p/@p q/desk r/nori} :: internal edit
{$init p/@p} :: report install
{$into p/desk q/? r/mode} :: external edit
{$merg p/@p q/desk r/@p s/desk t/case u/germ} :: merge desks
{$mont p/desk q/beam} :: mount to unix
{$dirk p/desk} :: mark mount dirty
{$ogre p/$@(desk beam)} :: delete mount point
{$warp p/sock q/riff} :: file request
{$cred our/ship nom/@ta cew/crew} :: set permission group
{$crew our/ship} :: permission groups
{$crow our/ship nom/@ta} :: group usage
{$drop our/@p des/desk} :: cancel pending merge
{$info our/@p des/desk dit/nori} :: internal edit
{$init our/@p} :: report install
{$into des/desk all/? fis/mode} :: external edit
$: $merg :: merge desks
our/@p des/desk :: target
her/@p dem/desk cas/case :: source
how/germ :: method
== ::
{$mont des/desk bem/beam} :: mount to unix
{$dirk des/desk} :: mark mount dirty
{$ogre pot/$@(desk beam)} :: delete mount point
{$perm our/ship des/desk pax/path rit/rite} :: change permissions
{$warp wer/sock rif/riff} :: internal file req
{$werp who/ship wer/sock rif/riff} :: external file req
{$wegh $~} :: report memory
{$went p/sack q/path r/@ud s/coop} :: response confirm
{$west p/sack q/path r/*} :: network request
{$went wer/sack pax/path num/@ud ack/coop} :: response confirm
{$west wer/sack pax/path res/*} :: network request
== ::
-- ::able
::
@ -423,13 +435,15 @@
$% {$delta p/lobe q/{p/mark q/lobe} r/page} :: delta on q
{$direct p/lobe q/page} :: immediate
== ::
++ care ?($d $u $v $w $x $y $z) :: clay submode
++ care ?($d $p $u $v $w $x $y $z) :: clay submode
++ case :: ship desk case spur
$% {$da p/@da} :: date
{$tas p/@tas} :: label
{$ud p/@ud} :: number
== ::
++ coop (unit ares) :: e2e ack
++ crew (set ship) :: permissions group
++ dict {src/path rul/rule} :: effective permission
++ dome :: project state
$: ank/ankh :: state
let/@ud :: top id
@ -493,8 +507,15 @@
{$mult p/mool} :: next version of any
{$many p/? q/moat} :: track range
== ::
++ regs (map path rule) :: rules for paths
++ riff {p/desk q/(unit rave)} :: request+desist
++ rite :: new permissions
$% {$r red/(unit rule)} :: for read
{$w wit/(unit rule)} :: for write
{$rw red/(unit rule) wit/(unit rule)} :: for read and write
== ::
++ riot (unit rant) :: response+complete
++ rule {mod/?($black $white) who/(set whom)} :: node permission
++ rump {p/care q/case r/@tas s/path} :: relative path
++ saba {p/ship q/@tas r/moar s/dome} :: patch+merge
++ soba (list {p/path q/miso}) :: delta
@ -507,6 +528,7 @@
{$| p/(list a) q/(list a)} :: p -> q[chunk]
== ::
++ urge |*(a/mold (list (unce a))) :: list change
++ whom (each ship @ta) :: ship or named crew
++ yaki :: commit
$: p/(list tako) :: parents
q/(map path lobe) :: namespace