shrub/base/arvo/eyre.hoon

1395 lines
47 KiB
Plaintext
Raw Normal View History

!: :: %eyre, http servant
2014-03-12 23:50:39 +04:00
!? 164
::::
2013-12-15 09:42:27 +04:00
|= pit=vase
2013-09-29 00:21:18 +04:00
=> =~
2014-06-07 22:36:31 +04:00
|% :: interfaces
++ gift gift-eyre :: out result <-$
++ kiss kiss-eyre :: in request ->$
2014-06-22 09:49:10 +04:00
++ move ,[p=duct q=(mold note gift)] :: local move
2014-06-03 09:07:32 +04:00
++ note :: out request $->
2014-06-22 06:51:12 +04:00
$% $: %a :: to %ames
2015-03-09 23:06:00 +03:00
$% [%want p=sock q=[path *]] ::
2014-06-22 06:51:12 +04:00
== == ::
$: %d :: to %dill
$% [%flog p=[%crud p=@tas q=(list tank)]] ::
== == ::
2015-03-23 22:35:25 +03:00
$: %e :: to self
$% [%this p=? q=clip r=httq] :: proxied request
2014-06-22 06:51:12 +04:00
== == ::
$: %f :: to %ford
2015-03-12 03:37:37 +03:00
$% [%exec p=@p q=beak r=(unit silk)] ::
2015-02-19 00:35:22 +03:00
[%wasp p=@p q=@uvH] ::
2014-06-22 06:51:12 +04:00
== == ::
$: %g :: to %gall
2015-05-10 01:55:05 +03:00
$% [%deal p=sock q=cush] :: full transmission
2014-10-16 02:05:48 +04:00
== == ::
$: %t :: to %temp
$% [%wait p=@da] ::
[%rest p=@da] ::
2014-06-22 06:51:12 +04:00
== == == ::
2014-06-22 09:49:10 +04:00
++ sign :: in result $<-
2014-06-22 06:51:12 +04:00
$? $: %a :: by %ames
2015-03-23 23:33:15 +03:00
$% [%went p=ship q=cape] ::
2015-05-08 23:27:40 +03:00
== == ::
2015-05-10 01:55:05 +03:00
$: %g :: by %gall
2015-05-08 23:27:40 +03:00
$% [%unto p=cuft] :: within agent
2014-06-22 06:51:12 +04:00
== == ::
2015-03-23 23:33:15 +03:00
$: %e :: by self
2015-03-23 22:35:25 +03:00
$% [%thou p=httr] :: response for proxy
2014-06-22 06:51:12 +04:00
== == ::
$: %f :: by %ford
$% [%made p=@uvH q=(each gage tang)] ::
2015-02-19 00:35:22 +03:00
[%news ~] ::
2014-06-22 06:51:12 +04:00
== == ::
2014-10-16 02:05:48 +04:00
$: %t :: by %time
$% [%wake ~] :: timer activate
2014-06-22 06:51:12 +04:00
== == ::
$: @tas :: by any
$% [%crud p=@tas q=(list tank)] ::
== == == ::
2015-03-17 03:32:44 +03:00
++ ixor ,@t :: oryx hash
2015-03-12 02:51:04 +03:00
++ whir $| ~ :: wire subset
2015-03-17 03:32:44 +03:00
$% [%at p=hole q=whir] :: authenticated
2015-03-23 22:35:25 +03:00
[%ay p=span:ship q=span:,@uvH ~] :: remote duct
2015-05-06 00:24:48 +03:00
[%he p=whir] :: HEAD request
2015-04-07 02:36:07 +03:00
[%of p=ixor q=$|(~ whir-of)] :: associated view
2015-03-17 23:55:40 +03:00
[%on p=span:,@uvH ~] :: dependency
2015-04-07 02:36:07 +03:00
[%to p=ixor q=span:ship r=term s=wire] :: associated app
2015-03-12 02:51:04 +03:00
== ::
++ whir-of ,[p=span:ship q=term r=wire] :: path in dock
2014-06-22 06:51:12 +04:00
-- ::
2014-06-07 22:36:31 +04:00
|% :: models
2013-09-29 00:21:18 +04:00
++ bolo :: eyre state
2015-04-15 00:16:46 +03:00
$: %1 :: version
2014-05-31 02:10:39 +04:00
gub=@t :: random identity
2014-06-10 00:09:14 +04:00
hov=(unit ship) :: master for remote
2014-03-12 23:50:39 +04:00
ged=duct :: client interface
2015-04-15 00:16:46 +03:00
ded=(set duct) :: killed requests
2015-03-23 22:35:25 +03:00
pox=(map ,@uvH duct) :: proxied sessions
2014-03-12 23:50:39 +04:00
ask=[p=@ud q=(map ,@ud ,[p=duct q=hiss])] :: outgoing by number
kes=(map duct ,@ud) :: outgoing by duct
ney=@uvI :: rolling entropy
dop=(map host ship) :: host aliasing
2015-03-17 23:55:40 +03:00
liz=(jug ,@uvH (each duct ixor)) :: ford depsets
2015-02-26 04:20:45 +03:00
wup=(map hole cyst) :: secure sessions
2015-05-08 22:43:11 +03:00
sop=(map hole ,[ship ?]) :: foreign sess names
2015-03-17 03:32:44 +03:00
wix=(map ixor stem) :: open views
2014-04-16 05:35:25 +04:00
== ::
2015-03-03 04:52:55 +03:00
::
2014-03-12 23:50:39 +04:00
++ cyst :: client session
$: ced=cred :: credential
2015-03-04 05:22:02 +03:00
[him=ship aut=(set ship)] :: authenticated
2014-03-12 23:50:39 +04:00
cug=(list ,@t) :: unacked cookies
lax=@da :: last used
2015-03-09 23:06:00 +03:00
way=(map ship ,[purl duct]) :: waiting auth
2015-03-04 05:22:02 +03:00
vew=(set oryx) :: open views XX expire
2014-06-10 00:09:14 +04:00
== ::
2015-03-03 04:52:55 +03:00
::
2015-03-17 03:32:44 +03:00
++ stem :: client view
2015-03-27 01:32:32 +03:00
$: him=ship :: static identity
2015-03-17 03:32:44 +03:00
ude=(unit ,[p=duct q=?]) :: stream, long-poll?
era=@da :: next wake
2015-03-27 04:01:28 +03:00
eve=[p=@u q=(map ,@u even)] :: queued events
2015-04-07 02:36:07 +03:00
med=(qeu duct) :: waiting /~/to/
2015-03-17 03:32:44 +03:00
==
2015-05-10 01:55:05 +03:00
++ honk $%([%nice ~] [%mean p=ares]) :: old gall result
2015-03-17 03:32:44 +03:00
++ even :: client event
$% [%mean p=[dock path] q=ares]
2015-03-28 04:06:38 +03:00
[%news p=@uv]
[%rush p=[dock path] q=json]
2015-03-17 03:32:44 +03:00
==
::
2015-03-03 04:52:55 +03:00
++ perk :: parsed request
2015-03-28 04:06:38 +03:00
$% [%auth p=perk-auth]
2015-03-09 23:55:54 +03:00
[%away ~]
2015-03-13 03:37:52 +03:00
[%bugs p=?(%as %to) ~]
2015-03-28 04:06:38 +03:00
[%beam p=beam]
[%deps p=?(%put %delt) q=@uvH]
[%mess p=dock q=mark r=wire s=json]
2015-05-02 00:43:41 +03:00
[%poll p=[i=@uvH t=(list ,@uvH)]]
2015-03-28 04:06:38 +03:00
[%spur p=spur]
[%subs p=?(%put %delt) q=[dock %json wire path]]
2015-03-17 03:32:44 +03:00
[%view p=ixor q=[~ u=@ud]]
2015-03-03 04:52:55 +03:00
==
::
++ perk-auth :: parsed auth
2015-05-10 01:55:05 +03:00
$% [%at p=pork] :: inject auth
2015-03-28 04:06:38 +03:00
[%del p=(unit ship)]
2015-05-19 00:19:13 +03:00
[%get him=(unit ship) rem=pork]
2015-03-03 04:52:55 +03:00
[%js ~]
2015-03-04 05:22:02 +03:00
[%json ~]
[%try him=ship paz=(unit cord)]
2015-03-28 04:06:38 +03:00
[%xen ses=hole rem=pork]
2015-03-03 04:52:55 +03:00
==
2015-03-04 05:22:02 +03:00
::
++ pest :: result
2015-03-14 02:45:03 +03:00
$| ~
2015-04-02 08:41:39 +03:00
$% [%| p=whir q=note] :: further request
[%$ p=httr] :: direct response
[%red ~] :: parent redirect
::
[%js p=@t] :: script
[%json p=json] :: data
[%html p=manx] :: successful page
2015-05-10 01:55:05 +03:00
[%htme p=manx] :: authentication fail
2015-03-04 05:22:02 +03:00
==
2014-03-12 23:50:39 +04:00
-- ::
|%
2015-03-28 04:06:38 +03:00
++ eat-headers
|= hed=(list ,[p=@t q=@t]) ^- math
%+ roll hed
|= [a=[p=cord cord] b=math]
=. p.a (cass (trip p.a))
(~(add ja b) a)
::
++ fcgi :: credential caboose
|= [quy=quay ced=cred] ^- coin
:* %many
[%$ %ta ~]
[%blob ced]
|- ^- (list coin)
?~ quy ~
[[%$ %t p.i.quy] [%$ %t q.i.quy] $(quy t.quy)]
==
::
++ gsig |=([a=dock b=path] [(scot %p p.a) q.a b])
2015-03-09 23:55:54 +03:00
++ session-from-cookies
2015-03-03 04:52:55 +03:00
|= [nam=@t maf=math]
2014-03-20 05:05:42 +04:00
^- (unit hole)
2015-05-19 00:19:13 +03:00
(from-cookies maf |=([k=@t v=@] &(=(nam k) !=('~' v))))
::
++ ship-from-cookies
|= maf=math ^- (unit ship)
(biff (from-cookies maf |=([k=@ @] =(%ship k))) (slat %p))
::
++ from-cookies
|= [maf=math fil=$+([@t @t] ?)]
=+ `cot=(list ,@t)`(~(get ju maf) 'cookie')
=+ `cok=quay`(zing `(list quay)`(murn cot (curr rush cock:epur)))
|- ^- (unit cord)
2014-03-12 23:50:39 +04:00
?~ cok ~
2015-05-19 00:19:13 +03:00
?:((fil i.cok) [~ q.i.cok] $(cok t.cok))
2013-09-29 00:21:18 +04:00
::
2015-03-12 02:51:04 +03:00
++ wush
|= [wid=@u tan=tang]
^- tape
=+ rolt=|=(a=wall `tape`?~(a ~ :(weld i.a "\0a" $(a t.a))))
(rolt (turn tan |=(a=tank (rolt (wash 0^wid a)))))
2014-07-17 06:10:13 +04:00
::
2014-06-10 00:09:14 +04:00
::
2015-03-28 04:06:38 +03:00
++ add-cookies
|= [cug=(list ,@t) hit=httr] ^- httr
?~ cug hit
=+ cuh=(turn `(list ,@t)`cug |=(a=@t set-cookie/a))
hit(q (weld cuh q.hit))
2014-06-25 02:00:07 +04:00
::
2015-03-28 04:06:38 +03:00
++ add-poll :: inject dependency
2015-05-15 21:27:44 +03:00
|= [dep=@uvH max=[[%html ~] [[%head ~] hed=marl] [[%body ~] tal=marl] ~]]
2015-03-28 04:06:38 +03:00
^- manx
2015-05-15 21:27:44 +03:00
=: hed.max :_(hed.max ;meta(charset "utf-8", urb_injected "");)
tal.max (welp tal.max ;script(urb_injected ""):"{(trip etag:js)}" ~)
==
2015-03-28 04:06:38 +03:00
?~ dep max
max(hed :_(hed.max ;script@"/~/on/{<dep>}.js"(urb_injected "");))
2013-09-29 00:21:18 +04:00
::
2015-03-28 04:06:38 +03:00
++ add-json :: inject window.urb
|= [urb=json jaz=cord] ^- cord
=- (cat 3 (crip -) jaz)
"""
var _urb = {(pojo urb)}
window.urb = window.urb || \{}; for(k in _urb) window.urb[k] = _urb[k]
"""
2014-07-17 06:10:13 +04:00
::
2015-03-28 04:06:38 +03:00
++ ares-to-json
|= err=ares ^- json
=- (jobe fail/s/typ mess/(jape mez) ~)
^- [typ=term mez=tape]
?~ err [%fail "Unknown Error"]
[p.u.err (wush 160 q.u.err)]
2014-05-10 11:10:46 +04:00
::
2015-03-28 04:06:38 +03:00
++ resp :: mimed response
|= [sas=@uG mit=mite rez=@] ^- httr
:: (weld (turn cug |=(a=@t ['set-cookie' a]))
[sas ~[content-type/(moon mit)] [~ (taco rez)]]
::
++ render-tang :: tanks to manx
2015-03-12 02:51:04 +03:00
|= tan=tang
2014-04-25 23:27:48 +04:00
;html
;head
2015-02-17 02:19:58 +03:00
;meta(charset "utf-8");
2015-04-30 01:48:45 +03:00
;link(rel "stylesheet", href "/home/lib/base.css");
2015-02-17 02:19:58 +03:00
;title: server error
2014-04-25 23:27:48 +04:00
==
2015-04-09 20:05:03 +03:00
;body:div#c.err:pre:code:"{(wush 80 tan)}"
2014-04-25 23:27:48 +04:00
==
::
2015-02-11 22:26:42 +03:00
++ js :: static javascript
|%
2015-02-27 03:04:12 +03:00
++ poll :: dependency long-poll
2015-02-11 22:26:42 +03:00
'''
2015-02-14 06:43:17 +03:00
urb.tries = 0
2015-02-11 22:26:42 +03:00
urb.call = function() {
2015-05-02 00:43:41 +03:00
urb.wreq = new XMLHttpRequest()
urb.wreq.open('GET', urb.wurl, true)
2015-05-02 00:43:41 +03:00
urb.wreq.addEventListener('load', function() {
2015-02-17 02:19:58 +03:00
// if(~~(this.status / 100) == 4)
2015-05-02 00:43:41 +03:00
// return document.write(this.responseText)
2015-02-17 02:19:58 +03:00
if(this.status !== 205) {
2015-02-14 06:43:17 +03:00
return urb.keep()
2015-02-11 22:26:42 +03:00
}
2015-02-14 06:43:17 +03:00
document.location.reload()
})
2015-05-02 00:43:41 +03:00
urb.wreq.addEventListener('error', urb.keep)
urb.wreq.addEventListener('abort', urb.keep)
urb.wreq.send()
2015-02-11 22:26:42 +03:00
}
urb.keep = function() {
2015-02-14 06:43:17 +03:00
setTimeout(urb.call,1000*urb.tries)
urb.tries++
2015-02-11 22:26:42 +03:00
}
2015-02-14 06:43:17 +03:00
urb.call()
2015-05-02 00:43:41 +03:00
urb.wasp = function(deh){
var old = /[^/]*$/.exec(urb.wurl)[0]
2015-05-02 00:43:41 +03:00
var deps = old.replace(/^on.json\?|.json$/,'').split('&')
if (deps.indexOf(deh) !== -1) return;
deps.push(deh)
urb.wurl = "/~/on.json?"+deps.join('&')
urb.wreq.abort() // trigger keep
2015-05-02 00:43:41 +03:00
}
2015-02-11 22:26:42 +03:00
'''
2015-03-03 04:52:55 +03:00
::
2015-03-27 04:19:08 +03:00
++ auth-redir
'document.location.pathname = "/~~"+document.location.pathname'
::
2015-03-03 04:52:55 +03:00
++ auth
'''
2015-03-09 23:55:54 +03:00
var req = function(url,dat,cb){
var xhr = new XMLHttpRequest()
xhr.open('POST', url, true)
dat.oryx = urb.oryx
xhr.send(JSON.stringify(dat))
xhr.addEventListener('load', function(ev){
if(this.status !== 200)
2015-03-12 02:51:04 +03:00
return err.innerHTML = ":( " + Date.now() + "\n" + xhr.responseText
2015-03-09 23:55:54 +03:00
else if(cb) return cb(xhr.responseText,ev)
})
}
2015-03-09 23:06:00 +03:00
urb.foreign = /^\/~\/am/.test(window.location.pathname)
urb.redir = function(){
document.location =
document.location.hash.match(/#[^?]+/)[0].slice(1) +
document.location.pathname.replace(
/^\/~\/am\/[^/]+/,
'/~/as/~' + urb.ship) +
document.location.search
}
if(urb.foreign && urb.auth.indexOf(urb.ship) !== -1){
req("/~/auth.json?PUT",
{ship:urb.ship,code:null},
urb.redir)
}
2015-03-09 23:06:00 +03:00
urb.submit = function(){
2015-03-09 23:55:54 +03:00
req(
"/~/auth.json?PUT",
{ship:ship.innerText.toLowerCase(), code:pass.value},
2015-03-09 23:55:54 +03:00
function(){
if(!urb.foreign) urb.redir()
2015-03-09 23:06:00 +03:00
else document.location.reload()
2015-03-09 23:55:54 +03:00
})
2015-03-03 04:52:55 +03:00
}
2015-03-09 23:55:54 +03:00
urb.away = function(){req("/~/auth.json?DELETE", {},
2015-04-08 05:02:54 +03:00
function(){document.getElementById("c").innerHTML = "<p>Goodbye.</p>" }
2015-03-13 03:37:52 +03:00
)}
2015-03-03 04:52:55 +03:00
'''
2015-05-15 21:27:44 +03:00
++ etag
'''
if(!window.urb) window.urb = {}
urb.fetchTag = function(){
var tag = JSON.parse(this.getResponseHeader("etag"))
if(tag) urb.wasp(tag)
}
urb.headReq = function(url){
var xhr = new XMLHttpRequest()
xhr.open("HEAD", url)
xhr.onload = urb.fetchTag
xhr.send()
}
Array.prototype.map.call(document.querySelectorAll('script'), function(ele){
if((new URL(ele.src)).host == document.location.host)
urb.headReq(ele.src)
})
Array.prototype.map.call(document.querySelectorAll('link'), function(ele){
if((new URL(ele.href)).host == document.location.host)
urb.headReq(ele.href)
})
'''
2015-03-03 04:52:55 +03:00
--
++ xml
|%
++ login-page
%+ titl 'Log in :urbit'
;= ;h1: Please log in
;p.ship
;div.sig: ~
;span#ship;
==
;input#pass(type "password");
;script:'''
$(function() {
$ship = $('#ship')
$pass = $('#pass')
$ship.on('keydown', function(e) {
if(e.keyCode === 13 || e.keyCode === 9) {
$pass.show()
$pass.focus()
e.preventDefault()
}
})
$ship.on('focus', function(e) {
$pass.hide()
})
$pass.on('keydown', function(e) {
if(e.keyCode === 13) {
urb.submit()
}
})
if(window.ship) {
$ship.text(urb.ship)
$pass.focus()
} else {
$pass.hide()
}
})
'''
2015-05-15 22:36:56 +03:00
;pre:code#err;
;script@"/~/at/~/auth.js";
2015-03-03 04:52:55 +03:00
==
2015-03-09 23:55:54 +03:00
::
++ logout-page
2015-03-13 03:37:52 +03:00
%+ titl 'Log out'
;= ;h1: Goodbye ~;{span#ship}.
2015-05-15 22:36:56 +03:00
;button#act(onclick "urb.away()"): Log out
;pre:code#err;
;script@"/~/at/~/auth.js";
2015-03-09 23:55:54 +03:00
==
2015-03-13 03:37:52 +03:00
::
++ poke-test
%+ titl 'Poke'
;= ;button(onclick "urb.testPoke('/~/to/hi/txt.json')"): Hi anonymous
;button(onclick "urb.testPoke('/~/as/own/~/to/hi/txt.json')"): Hi
;pre:code#err;
;script@"/~/at/~/auth.js";
;script:'''
2015-03-18 00:38:13 +03:00
show = function(t){err.innerText = ":) " + Date.now() + "\n" + t}
2015-03-13 03:37:52 +03:00
urb.testPoke = function(url){
2015-03-18 00:38:13 +03:00
req(url,{xyro:{test:true}}, show)
2015-03-13 03:37:52 +03:00
}
'''
==
2015-05-15 22:36:56 +03:00
++ titl
|= [a=cord b=marl]
;html
;head
;meta(charset "utf-8");
2015-05-15 22:36:56 +03:00
;title:"{(trip a)}"
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/".
"libs/jquery/2.1.1/jquery.min.js");
2015-05-15 22:36:56 +03:00
;link(rel "stylesheet", href "/home/lib/base.css");
==
;body:div#c:"*{b}"
==
2015-02-11 22:26:42 +03:00
--
2013-09-29 00:21:18 +04:00
--
2014-03-12 23:50:39 +04:00
|% :: functions
++ ye :: per event
2014-06-04 14:40:09 +04:00
=| $: $: hen=duct :: event floor
2014-03-12 23:50:39 +04:00
$: now=@da :: event date
eny=@ :: unique entropy
2015-02-11 22:26:42 +03:00
our=ship :: current ship
2014-03-12 23:50:39 +04:00
sky=$+(* (unit)) :: system namespace
== ::
2014-03-12 23:50:39 +04:00
mow=(list move) :: pending actions
== ::
bolo :: all vane state
== ::
=* bol ->
|%
2015-02-27 03:04:12 +03:00
++ abet :: resolve moves
2014-03-12 23:50:39 +04:00
^- [(list move) bolo]
[(flop mow) bol]
2013-09-29 00:21:18 +04:00
::
2015-02-27 03:04:12 +03:00
++ adit .(ney (mix eny ney)) :: flip entropy
2014-06-04 14:40:09 +04:00
::
2015-03-03 04:52:55 +03:00
++ anon `@p`(add our ^~((bex 64))) :: pseudo-sub
2015-02-27 03:04:12 +03:00
++ apex :: accept request
2014-06-04 14:40:09 +04:00
|= kyz=kiss
^+ +>
2015-03-09 23:06:00 +03:00
=. our ?~(hov our u.hov) :: XX
2014-06-04 14:40:09 +04:00
?- -.kyz
%born +>.$(ged hen) :: register external
%crud
+>.$(mow [[hen %slip %d %flog kyz] mow])
2015-03-28 04:06:38 +03:00
::
2014-03-23 23:42:18 +04:00
%init :: register ownership
2015-03-28 04:06:38 +03:00
+>.$(hov ?~(hov [~ p.kyz] [~ (min u.hov p.kyz)]))
2015-02-18 00:05:28 +03:00
::
2014-03-12 23:50:39 +04:00
%this :: inbound request
2015-03-28 04:06:38 +03:00
%- emule |. ^+ ..apex
2014-06-04 14:40:09 +04:00
=* sec p.kyz :: ? :: https bit
=* heq r.kyz :: httq :: request content
2014-03-12 23:50:39 +04:00
=+ ryp=`quri`(rash q.heq zest:epur)
2015-03-28 04:06:38 +03:00
=+ maf=(eat-headers r.heq)
2014-03-12 23:50:39 +04:00
=+ ^= pul ^- purl
?- -.ryp
& ?>(=(sec p.p.p.ryp) p.ryp)
2015-03-03 04:52:55 +03:00
| =+ hot=(~(get ja maf) %host)
2015-02-11 22:26:42 +03:00
?> ?=([@ ~] hot)
[[sec (rash i.hot thor:epur)] p.ryp q.ryp]
2014-03-12 23:50:39 +04:00
==
2015-01-15 04:47:51 +03:00
=. p.p.pul |(p.p.pul ?=(hoke r.p.pul))
2015-03-23 22:35:25 +03:00
=+ her=(host-to-ship r.p.pul)
?: |(?=(~ her) =(our u.her))
(handle pul [q.+.kyz |] [p.heq maf s.heq])
2015-03-23 22:35:25 +03:00
=+ han=(sham hen)
=. pox (~(put by pox) han hen)
(ames-gram u.her [%get ~] han +.kyz)
2014-03-12 23:50:39 +04:00
::
%them :: outbound request
2014-06-04 14:40:09 +04:00
?~ p.kyz
2014-03-12 23:50:39 +04:00
=+ sud=(need (~(get by kes) hen))
2014-06-04 14:40:09 +04:00
%= +>.$
2014-05-24 00:46:43 +04:00
mow :_(mow [ged [%give %thus sud ~]])
2014-03-12 23:50:39 +04:00
q.ask (~(del by q.ask) sud)
kes (~(del by kes) hen)
==
2015-01-24 08:16:12 +03:00
:: ~& eyre-them/(earn p.u.p.kyz)
2014-06-04 14:40:09 +04:00
%= +>.$
mow :_(mow [ged [%give %thus p.ask p.kyz]])
2014-03-12 23:50:39 +04:00
p.ask +(p.ask)
2014-06-04 14:40:09 +04:00
q.ask (~(put by q.ask) p.ask hen u.p.kyz)
2014-03-12 23:50:39 +04:00
kes (~(put by kes) hen p.ask)
==
::
%they :: inbound response
2014-06-04 14:40:09 +04:00
=+ kas=(need (~(get by q.ask) p.kyz))
:: ~& > eyre-they/[p.q.kyz (earn p.q.kas)]
2014-06-04 14:40:09 +04:00
%= +>.$
mow :_(mow [p.kas [%give %thou q.kyz]])
2014-03-12 23:50:39 +04:00
q.ask (~(del by q.ask) p.kas)
==
::
%thud :: cancel request
2015-03-28 04:06:38 +03:00
:: ford-kill :: XX discriminate
2015-04-15 00:16:46 +03:00
+>.$(ded (~(put in ded) hen))
2014-03-23 01:42:25 +04:00
::
%wart :: remote request
2015-02-20 02:33:39 +03:00
=+ mez=((soft gram) r.kyz)
?~ mez
2014-06-04 14:40:09 +04:00
~& [%strange-wart p.kyz q.kyz]
+>.$
2015-03-09 23:06:00 +03:00
?- -<.u.mez
%aut abet:(logon:(ses-ya p.u.mez) q.p.kyz)
%hat (foreign-hat:(ses-ya p.u.mez) q.p.kyz q.u.mez)
%get (pass-note ay/(dray p/uv/~ q.p.kyz p.u.mez) [%e %this q.u.mez])
%got
=: hen (~(got by pox) p.u.mez)
pox (~(del by pox) p.u.mez)
==
(give-thou q.u.mez)
2014-03-23 01:42:25 +04:00
::
2015-03-09 23:06:00 +03:00
%lon
~& ses-ask/[p.u.mez sop (~(run by wup) ,~)]
?: (ses-authed p.u.mez)
(ames-gram q.p.kyz aut/~ p.u.mez)
=. sop (~(put by sop) p.u.mez q.p.kyz |)
(ames-gram q.p.kyz hat/~ p.u.mez our-host)
2014-03-23 01:42:25 +04:00
==
2015-05-07 05:25:41 +03:00
::
%wegh !!
2014-03-12 23:50:39 +04:00
==
2013-09-29 00:21:18 +04:00
::
2015-05-10 01:55:05 +03:00
++ axom :: old response
|= [tee=whir hon=honk]
^+ +>
?+ tee !!
~ ?-(-.hon %nice (nice-json), %mean (mean-json 500 p.hon))
[%of @ ^] (get-ack:(ire-ix p.tee) q.tee hon)
==
2015-03-28 04:06:38 +03:00
++ axon :: accept response
|= [tee=whir typ=type sih=sign]
2014-04-09 02:26:01 +04:00
^+ +>
2015-03-28 04:06:38 +03:00
=. our ?~(hov our u.hov) :: XX
?- &2.sih
%crud +>.$(mow [[hen %slip %d %flog +.sih] mow])
2015-05-10 01:55:05 +03:00
:: %dumb
:: =. +> ?+(tee +> [%of ^] pop-duct:(ire-ix p.tee))
:: (emule |.(~|(gall-dumb/tee !!)))
2015-04-07 23:31:09 +03:00
::
2015-03-28 04:06:38 +03:00
%went +>.$
%thou
?> ?=([%ay ^] tee)
(ames-gram (slav %p p.tee) got/~ (slav %uv q.tee) |2.sih)
2015-05-08 23:27:40 +03:00
::
%unto :: XX horrible
=+ cuf=`cuft`+>.sih
?- -.cuf
2015-05-10 01:55:05 +03:00
?(%coup %reap)
(axom tee ?~(p.cuf [%nice ~] [%mean `[-.cuf u.p.cuf]]))
2015-05-08 23:27:40 +03:00
::
%diff
2015-05-10 01:55:05 +03:00
?> ?=([%of @ ^] tee)
?. ?=(%json p.p.cuf)
2015-05-12 22:57:58 +03:00
::~> %slog.`rose/[" " "[" "]"]^~[>%backing< >p.p.cuf< (sell q.p.cuf)]
2015-05-10 01:55:05 +03:00
(back tee 0v0 %json p.cuf)
(get-rush:(ire-ix p.tee) q.tee ((hard json) q.q.p.cuf))
2015-05-08 23:27:40 +03:00
::
2015-05-10 01:55:05 +03:00
%quit (axom tee [%mean ~])
2015-03-28 04:06:38 +03:00
==
::
%wake
2015-04-07 02:36:07 +03:00
?> ?=([%of @ ~] tee)
2015-03-28 04:06:38 +03:00
=> wake:(ire-ix p.tee)
(give-json 200 ~ (joba %beat %b &))
::
%news :: dependency updated
?. ?=([%on ^] tee)
~&(e/lost/[tee hen] +>.$)
=+ dep=(slav %uv p.tee)
%+ roll (~(tap in (~(get ju liz) dep)))
=< .(con ..axon(liz (~(del by liz) dep)))
|= [sus=(each duct ixor) con=_..axon]
=. ..axon con
?- -.sus
%& (give-json(hen p.sus) 205 ~ %b &)
%| (get-even:(ire-ix p.sus) [%news dep])
==
::
%made
?> ?=(?([%| *] [%& @ *]) q.sih)
2015-03-28 04:06:38 +03:00
=. our (need hov) :: XX
|- ^+ ..axon
?- tee
[?(%on %ay) *] ~|(e/ford/lost/-.tee !!)
2015-05-06 00:24:48 +03:00
[%he *] :: XX hack
=. ..axon $(tee p.tee)
%_ ..axon
mow %+ turn mow
|= a=move
?+ q.a a
[%give %thou *] a(r.p.p.q ~)
[%pass ^] ?.(=(p.tee p.q.a) a a(p.q tee))
== ==
::
2015-03-28 04:06:38 +03:00
[%of ^]
2015-04-07 02:36:07 +03:00
?~ q.tee ~|(e/ford/lost/tee !!)
2015-04-09 04:35:17 +03:00
?: ?=(%| -.q.sih)
(print-tang p.q.sih)
2015-04-07 02:36:07 +03:00
%+ get-rush:(ire-ix p.tee) q.tee
2015-04-09 04:35:17 +03:00
=* cay p.q.sih
?> ?=(%json p.cay) :: XX others
((hard json) q.q.cay)
2015-03-28 04:06:38 +03:00
::
[%to ^]
?: ?=(%| -.q.sih)
(mean-json 500 ~ %cast-fail p.q.sih)
~| tee
2015-04-07 02:36:07 +03:00
(new-mess:(ire-ix p.tee) [(slav %p q.tee) r.tee] s.tee p.q.sih)
2015-03-28 04:06:38 +03:00
::
[%at ^]
?. ?=([%& %js ^] q.sih)
~& e/at-lost/p.tee
$(tee q.tee)
=* cay p.q.sih
?> ?=(@ q.q.cay)
=+ cyz=(~(got by wup) p.tee)
=^ jon ..ya ~(stat-json ya p.tee cyz)
$(tee q.tee, q.q.p.q.sih (add-json jon q.q.cay))
::
~
:: ~& e/ford/hen
?. ?=(%& -.q.sih)
(fail 404 p.sih p.q.sih)
=* cay p.q.sih
?. ?=(%mime p.cay)
=- (back tee p.sih %mime cay(q.q -))
?+ p.cay q.q.cay :: inject dependency long-poll
%urb =| urb=[[%html ~] [[%head ~] marl] [[%body ~] manx marl] ~]
.*(.(urb q.q.cay) !=((add-poll p.sih urb)))
==
2015-03-28 04:06:38 +03:00
~| q.q.cay
=+ ((hard ,[mit=mite rez=octs]) q.q.cay)
2015-05-02 00:43:41 +03:00
=+ dep=(crip (pojo %s (scot %uv p.sih)))
(give-thou 200 ~[etag/dep content-type/(moon mit)] ~ rez)
2015-03-28 04:06:38 +03:00
==
==
2014-03-23 01:42:25 +04:00
::
2015-04-30 01:48:45 +03:00
++ root-beak `beak`[our %home da/now] :: XX
2015-03-28 04:06:38 +03:00
++ emule
|= a=_|?(..emule) ^+ ..emule
=+ mul=(mule a)
?~ -.mul p.mul
(fail 500 0v0 >%exit< p.mul)
::
2015-03-28 04:06:38 +03:00
++ ire-ix |=(ire=ixor ~(. ix ire (~(got by wix) ire)))
2015-04-09 04:35:17 +03:00
++ print-tang
|= a=tang ^+ +>
?~ a +>
~> %slog.`i.a
$(a t.a)
2013-09-29 00:21:18 +04:00
::
2015-03-09 23:06:00 +03:00
++ ses-authed
|= ses=hole
=+ sap=(~(get by sop) ses)
?: ?=([~ @ %&] sap) &
=+ cyz=(~(get by wup) ses)
?~ cyz |
(~(has in aut.u.cyz) our)
::
2015-03-09 23:06:00 +03:00
++ ses-ya |=(ses=hole ~(. ya ses (~(got by wup) ses)))
2015-05-15 21:27:44 +03:00
++ our-host `hart`[& ~ `/org/urbit/(rsh 3 1 (scot %p our))]
:: [| [~ 8.445] `/localhost] :: XX testing
2014-04-09 02:26:01 +04:00
::
2015-03-28 04:06:38 +03:00
++ ames-gram
|=([him=ship gam=gram] (pass-note ~ %a %want [our him] [%e -.gam] +.gam))
2014-05-16 04:46:48 +04:00
::
2015-03-28 04:06:38 +03:00
++ back :: %ford bounce
2015-05-12 22:57:58 +03:00
|= [tea=whir dep=@uvH mar=mark cay=cage]
2015-05-15 21:27:44 +03:00
=+ sil=`silk`[%cast mar %flag dep %done ~ cay]
(pass-note tea (ford-req root-beak sil))
2014-10-23 07:13:10 +04:00
::
++ ford-kill (pass-note ~ %f [%exec our *beak ~]) :: XX unused
++ ford-req |=([bek=beak kas=silk] [%f [%exec our bek `kas]])
::
2015-03-28 04:06:38 +03:00
++ fail
2015-03-03 04:52:55 +03:00
|= [sas=@ud dep=@uvH mez=tang]
^+ +>
2015-03-28 04:06:38 +03:00
:: (back ~ dep %tang !>(mez)) :: tang->urb chain may be source of failure
(give-html sas ~ (add-poll dep (render-tang mez)))
::
2015-03-28 04:06:38 +03:00
++ give-html
2015-03-09 23:06:00 +03:00
|= [sas=@ud cug=(list ,@t) max=manx]
2015-03-28 04:06:38 +03:00
%- give-thou
2015-03-09 23:06:00 +03:00
%+ add-cookies cug
2015-03-27 01:32:32 +03:00
(resp sas text//html (crip (poxo max)))
2014-03-12 23:50:39 +04:00
::
2015-03-28 04:06:38 +03:00
++ give-json
2015-03-03 04:52:55 +03:00
|= [sas=@uG cug=(list ,@t) jon=json]
2015-03-28 04:06:38 +03:00
%- give-thou
2015-03-09 23:06:00 +03:00
%+ add-cookies cug
2015-03-27 01:32:32 +03:00
(resp sas application//json (crip (pojo jon)))
2013-09-29 00:21:18 +04:00
::
2015-03-28 04:06:38 +03:00
++ give-thou :: done request
|= hit=httr
2015-04-15 00:16:46 +03:00
?: (~(has in ded) hen) :: request closed
+>(ded (~(del in ded) hen))
2015-03-28 04:06:38 +03:00
+>(mow :_(mow [hen %give %thou hit]))
::
2015-03-28 04:06:38 +03:00
++ mean-json |=([sas=@uG err=ares] (give-json sas ~ (ares-to-json err)))
++ nice-json |=(* (give-json 200 ~ (joba %ok %b &)))
::
2015-03-09 23:06:00 +03:00
++ pass-note |=(noe=[whir note] +>(mow :_(mow [hen %pass noe])))
2015-03-03 04:52:55 +03:00
++ host-to-ship :: host to ship
2014-03-12 23:50:39 +04:00
|= hot=host
^- (unit ship)
2015-05-16 02:21:09 +03:00
:: =+ gow=(~(get by dop) hot) :: XX trust
:: ?^ gow gow
2015-02-27 03:04:12 +03:00
?. ?=(& -.hot) ~
=+ dom=(flop p.hot) :: domain name
?~ dom ~
(rush i.dom fed:ag)
2014-10-23 07:13:10 +04:00
::
2015-03-28 04:06:38 +03:00
++ load-secret
^- @ta
=+ pax=/(scot %p our)/code/(scot %da now)/(scot %p our)
%^ rsh 3 1
(scot %p (,@ (need (sky %a pax))))
2014-10-23 07:13:10 +04:00
::
::
2015-03-28 04:06:38 +03:00
++ handle
|= $: [hat=hart pok=pork quy=quay] :: purl, parsed url
[cip=clip aut=?] :: client ip, nonymous?
2015-03-03 04:52:55 +03:00
[mef=meth maf=math bod=(unit octs)] :: method/headers/body
2015-02-27 03:04:12 +03:00
==
2015-03-28 04:06:38 +03:00
=< apex
2014-03-12 23:50:39 +04:00
|%
2015-03-28 04:06:38 +03:00
++ abet ..handle
2015-03-03 04:52:55 +03:00
++ done .
2015-03-28 04:06:38 +03:00
++ teba |*(a=$+(* ..handle) |*(b=* %_(done ..handle (a b))))
2015-03-03 04:52:55 +03:00
++ give-html (teba ^give-html)
2015-03-28 04:06:38 +03:00
++ give-thou (teba ^give-thou)
2015-03-03 04:52:55 +03:00
++ give-json (teba ^give-json)
2015-03-12 02:51:04 +03:00
++ nice-json (teba ^nice-json)
2015-03-03 04:52:55 +03:00
++ pass-note (teba ^pass-note)
::
2015-03-28 04:06:38 +03:00
++ ford-get-beam
|= [bem=beam ext=term]
=+ yac=for-client
=. him.yac ?.(aut anon him.yac)
=: s.bem [%web ~(rent co (fcgi quy fcgi-cred.yac)) s.bem]
2015-03-03 04:52:55 +03:00
r.bem ?+(r.bem r.bem [%ud %0] da/now)
2014-04-16 05:35:25 +04:00
==
(ford-req -.bem [%boil ext bem ~])
2014-06-08 06:45:00 +04:00
::
2014-06-10 00:09:14 +04:00
::
2015-03-28 04:06:38 +03:00
++ apex
=< abet
2015-03-03 04:52:55 +03:00
^+ done
2015-03-09 23:06:00 +03:00
=+ oar=(host-to-ship r.hat)
=. our ?~(oar our u.oar) :: XX
2015-03-04 05:22:02 +03:00
=+ pez=process
2015-03-28 04:06:38 +03:00
?: ?=(%| -.pez) p.pez
2015-04-02 08:41:39 +03:00
(resolve ~ p.pez)
2014-07-11 06:40:58 +04:00
::
2015-03-28 04:06:38 +03:00
++ resolve
2015-04-02 08:41:39 +03:00
|= [cug=(list ,@t) pez=pest] ^+ done
?~ pez done
2015-03-19 03:22:20 +03:00
?- -.pez
2015-04-02 08:41:39 +03:00
~ (give-thou (add-cookies cug p.pez))
| (pass-note +.pez)
%js $(pez [~ (resp 200 text//javascript p.pez)])
%json (give-json 200 cug p.pez)
%html (give-html 200 cug p.pez)
%htme (give-html 401 cug p.pez)
2015-03-13 03:17:00 +03:00
%red
=+ url=(earn hat pok(p [~ %html]) quy)
2015-03-28 04:06:38 +03:00
?+ p.pok ~|(bad-redirect/[p.pok url] !!)
2015-03-13 03:17:00 +03:00
[~ %js]
2015-04-02 08:41:39 +03:00
$(pez [%js auth-redir:js])
2015-03-13 03:17:00 +03:00
[~ %json]
2015-04-02 08:41:39 +03:00
$(pez [%json (jobe ok/b/| red/(jape url) ~)])
2015-03-13 03:17:00 +03:00
==
2014-06-10 00:09:14 +04:00
==
::
::
++ is-anon =([~ ''] (~(get by (mo quy)) 'anon'))
2015-03-03 04:52:55 +03:00
++ check-oryx :: | if json with bad oryx
^- ?
?. &(?=([~ %json] p.pok) ?=(%post mef) ?=(^ bod) !is-anon) &
=+ oxe=grab-oryx
2015-03-03 04:52:55 +03:00
?~ oxe |
2015-03-27 01:32:32 +03:00
?: (~(has in vew.cyz:for-client) u.oxe)
&
~&(bad-oryx/[u.oxe vew.cyz:for-client] &) :: XX security
2014-06-10 00:09:14 +04:00
::
++ grab-json
?. ?=(?(%post %put %delt) mef)
2015-03-28 04:06:38 +03:00
~
?~(bod ~ (poja q.u.bod))
2014-04-16 23:47:41 +04:00
::
++ need-body |*(a=fist:jo (need (biff grab-json a)))
++ grab-oryx
^- (unit oryx)
=+ oxe=(biff grab-json (ot oryx/so ~):jo)
?^ oxe oxe
(~(get by (mo quy)) %oryx)
2014-04-21 21:02:09 +04:00
::
::
2015-03-28 04:06:38 +03:00
++ new-dependency
2015-03-17 23:55:40 +03:00
|= [a=@uvH b=(each duct ixor)] ^+ done
?~ a done
=+ had=(~(has by liz) a)
=. liz (~(put ju liz) a b)
?: had done
(pass-note on//(scot %uv a) %f [%wasp our a])
2014-04-21 21:02:09 +04:00
::
2015-03-28 04:06:38 +03:00
++ parse
^- (each perk httr)
|^ =+ hit=as-magic-filename
?^ hit [%| u.hit]
=+ bem=as-beam
?^ bem [%& %beam u.bem]
?. check-oryx
~|(%bad-oryx ~|([grab-oryx vew.cyz:for-client] !!))
2015-03-28 04:06:38 +03:00
=+ hem=as-aux-request
?^ hem [%& u.hem]
~|(strange-path/q.pok !!)
::
++ as-magic-filename
^- (unit httr)
?+ [(fall p.pok %$) q.pok] ~
[?(%ico %png) %favicon ~]
:- ~
%^ resp 200 image//png
0w89wg.GV4jA.l9000.00dPb.YzBT6.giO00.o100d.wZcqc.a9tg-.VTG0b.
AUIvE.HBM3g.cK4SE.0aagi.l090p.I1P5g.Y-80r.y1YS9.1xE~Y.qgpFY.
vKN1V.905y0.2UwvL.43TUw.uL406.0-31h.xwoJF.Ul454.ilk00.00Yps.
BNumh.xpl9B.pS5Ji.i1BoC.ZAgg1.BsC5T.t6pLk.Thohn.gp000.0ov~P.
7M000.0o840.00010.0001i.h4x93.g0000.Eq2wR.7jB29
::
[%txt %robots ~]
:- ~
%^ resp 200 text//plain
%- role
:~ 'User-agent: *'
'Disallow: /'
==
==
::
++ as-beam
^- (unit beam)
|-
?~ q.pok
$(q.pok /index)
?. ((sane %tas) i.q.pok)
(tome q.pok)
`[[our i.q.pok da/now] (flop t.q.pok)]
::
++ as-aux-request :: /~/... req parser
^- (unit perk)
=. mef
?. ?=(%post mef) mef
?+ (skim quy |=([a=@t b=@t] &(=('' b) =(a (cuss (trip a))))))
~|(bad-quy/[req='"?PUT" or "?DELETE"' quy] !!)
2015-03-28 04:06:38 +03:00
~ mef
[[%'DELETE' ~] ~] %delt
[[%'PUT' ~] ~] %put
==
|-
2015-05-19 00:19:13 +03:00
?: ?=([%'~~' *] q.pok) :: auth shortcuts
2015-03-28 04:06:38 +03:00
$(q.pok ['~' %as %own t.q.pok])
2015-05-19 00:19:13 +03:00
?: ?=([%'_' *] q.pok)
$(q.pok ['~' %as %any t.q.pok])
2015-03-28 04:06:38 +03:00
?. ?=([%'~' @ *] q.pok) ~
:- ~ ^- perk
=* pef i.t.q.pok
=+ but=t.t.q.pok :: XX =*
?+ pef ~|(pfix-lost/`path`/~/[pef] !!)
%debug ;;(perk [%bugs but])
%away [%away ~]
%at [%auth %at pok(q but)]
%am ?~(but !! [%auth %xen i.but pok(q t.but)])
%as
:+ %auth %get
~| bad-ship/?~(but ~ i.but)
?~ but !!
:_ pok(q t.but)
2015-05-19 00:19:13 +03:00
?+ i.but `(slav %p i.but)
%anon `anon
%own `our
%any ~
2015-03-28 04:06:38 +03:00
==
::
2015-05-02 00:43:41 +03:00
%on
:- %poll
?^ but [(raid but %uv ~)]~
=+ dep=((hard (list ,[@ ~])) quy)
=< ?~(. !! .)
(turn dep |=([a=@tas ~] (slav %uv a)))
::
2015-03-28 04:06:38 +03:00
%of
:+ %view ?>(?=([@ ~] but) i.but)
?> ?=([[%poll @] ~] quy) :: XX eventsource
[~ (rash q.i.quy dem)]
::
%to
=+ ^- dir=[p=ship q=term r=mark]
~| bad-mess/but
?+ but !!
[@ @ ~] [our (raid but %tas %tas ~)]
[@ @ @ ~] (raid but %p %tas %tas ~)
==
:^ %mess [p q]:dir r.dir
=+ wir=(~(get by (mo quy)) 'wire')
?^ wir [(stab u.wir) (need grab-json)] :: XX distinguish
(need-body (ot wire/(cu stab so) xyro/some ~):jo)
2015-03-28 04:06:38 +03:00
::
%in
~| expect/[%post 'application/json' /'@uv' '?PUT/DELETE']
?> &(?=(?(%delt %put) mef) ?=($|(~ [~ %json]) p.pok))
[%deps mef (raid but %uv ~)]
::
%is
?~ but
~|(no-app/but=but !!)
|- ^- perk
?~ p.pok $(p.pok [~ %json])
?. ?=(%json u.p.pok)
~|(is/stub/u.p.pok !!) :: XX marks
?: ((sane %tas) i.but)
$(but [(scot %p our) but])
?> ?=(?(%delt %put) mef)
2015-04-07 22:06:05 +03:00
=+ :- hap=[(slav %p i.but) (slav %tas -.t.but)]
wir=(need-body (ot wire/(cu stab so) ~):jo)
[%subs mef hap u.p.pok wir +.t.but]
2015-03-28 04:06:38 +03:00
::
%auth
:- %auth
|- ^- perk-auth
?+ p.pok !!
~ $(p.pok [~ %json])
[~ %js] [%js ~]
[~ %json]
?+ mef ~|(bad-meth/mef !!)
%get [%json ~]
2015-04-01 00:58:44 +03:00
%put
~| parsing/bod
[%try (need-body (ot ship/(su fed:ag) code/(mu so) ~):jo)]
2015-04-01 00:58:44 +03:00
::
%delt
~| parsing/bod
=+ jon=(need (poja q:(need bod)))
?> ?=(%o -.jon)
=+ sip=(~(get by p.jon) %ship)
[%del ?~(sip ~ [~ (need ((su:jo fed:ag) u.sip))])]
2015-03-28 04:06:38 +03:00
== ==
2015-04-01 00:58:44 +03:00
==
2015-03-28 04:06:38 +03:00
--
2014-04-21 21:02:09 +04:00
::
2015-03-28 04:06:38 +03:00
++ process
2015-03-04 05:22:02 +03:00
^- (each pest ,_done)
2015-03-28 04:06:38 +03:00
=+ pet=parse
?: ?=(%| -.pet)
2015-04-02 08:41:39 +03:00
[%& ~ p.pet]
2015-03-28 04:06:38 +03:00
(process-parsed p.pet)
2014-04-16 23:47:41 +04:00
::
2015-03-28 04:06:38 +03:00
++ process-parsed
|= hem=perk ^- (each pest ,_done)
2015-03-03 04:52:55 +03:00
?- -.hem
2015-03-28 04:06:38 +03:00
%auth (process-auth p.hem)
2015-04-02 08:41:39 +03:00
%away [%& %html logout-page:xml]
2015-03-28 04:06:38 +03:00
?(%beam %spur)
2015-03-04 05:22:02 +03:00
=+ ext=(fall p.pok %urb)
=+ bem=?-(-.hem %beam p.hem, %spur [root-beak p.hem])
2015-05-06 00:24:48 +03:00
=+ wir=?+(mef !! %get ~, %head [%he ~])
=- ?.(aut [%& %| -] [%| (pass-note -)]) :: XX properly
[wir (ford-get-beam bem ext)]
2015-03-13 03:37:52 +03:00
::
2015-03-28 04:06:38 +03:00
%bugs
2015-03-27 04:01:28 +03:00
?- p.hem
2015-03-28 04:06:38 +03:00
%as (show-login-page)
2015-04-02 08:41:39 +03:00
%to [%& %html poke-test:xml]
2015-03-17 23:55:40 +03:00
==
2015-03-18 00:38:13 +03:00
::
2015-03-28 04:06:38 +03:00
%deps
=+ ire=need-ixor
2015-03-28 04:06:38 +03:00
?> (~(has by wix) ire) :: XX made redundant by oryx checking
=< [%| (nice-json)]
2015-03-17 23:55:40 +03:00
?- p.hem
2015-03-28 04:06:38 +03:00
%put (new-dependency q.hem %| ire)
%delt done(liz (~(del ju liz) q.hem %| ire))
2015-03-17 23:55:40 +03:00
==
2015-03-13 03:37:52 +03:00
::
2015-03-17 23:55:40 +03:00
%mess
:- %|
=^ orx ..ya ?:(is-anon new-view:for-client [(need grab-oryx) ..ya])
=+ [vew=(ire-ix (oryx-to-ixor orx)) cay=[%json !>(`json`s.hem)]]
?: ?=(%json q.hem) ((teba new-mess.vew) p.hem r.hem cay)
%+ pass-note [%to (oryx-to-ixor orx) (scot %p p.p.hem) q.p.hem r.hem]
(ford-req root-beak [%cast q.hem %done ~ cay])
2015-03-28 04:06:38 +03:00
::
%poll
2015-05-02 00:43:41 +03:00
?: ?=([~ %js] p.pok) :: XX treat non-json cases?
=+ polling-url=['/' (apex:earn %| pok(u.p %json) quy)]
[%& %js (add-json (joba %wurl (jape polling-url)) poll:js)]
2015-05-02 00:43:41 +03:00
|-
=. done (new-dependency i.p.hem %& hen)
?~ t.p.hem [%| done]
$(p.hem t.p.hem)
2015-03-17 03:32:44 +03:00
::
%subs
2015-03-27 04:01:28 +03:00
?- p.hem
2015-03-28 04:06:38 +03:00
%put [%| ((teba add-subs:for-view) q.hem)]
%delt [%| ((teba del-subs:for-view) q.hem)]
2015-03-27 04:01:28 +03:00
==
2015-03-17 03:32:44 +03:00
::
%view
~| lost-ixor/p.hem
2015-03-28 04:06:38 +03:00
[%| ((teba poll:(ire-ix p.hem)) u.q.hem)]
==
2014-03-20 05:05:42 +04:00
::
2015-03-28 04:06:38 +03:00
++ process-auth
|= ham=perk-auth ^- (each pest ,_done)
=+ yac=for-client
?- -.ham
2015-04-02 08:41:39 +03:00
%js [%& %js auth:js]
2015-03-28 04:06:38 +03:00
%json =^ jon ..ya stat-json.yac
[%| (give-json 200 ~ jon)]
%xen (show-login-page ~ ses.ham)
2015-03-13 03:37:52 +03:00
::
2015-03-28 04:06:38 +03:00
%at
=. ..ya abet.yac
2015-05-19 00:34:46 +03:00
=+ pez=process(pok p.ham, aut |)
2015-03-28 04:06:38 +03:00
?. ?=(%& -.pez) ~|(no-inject/p.ham !!)
2015-04-02 08:41:39 +03:00
?~ p.pez pez
2015-03-28 04:06:38 +03:00
?+ -.p.pez ~&(bad-inject/p.pez !!)
%red pez
2015-04-02 08:41:39 +03:00
%|
2015-03-28 04:06:38 +03:00
=. ya abet.yac
2015-04-02 08:41:39 +03:00
[%| (resolve ~ p.pez(p [%at ses.yac p.p.pez]))]
2014-04-09 02:26:01 +04:00
::
2015-04-02 08:41:39 +03:00
%js
2015-03-28 04:06:38 +03:00
=^ jon ..ya stat-json.yac
2015-04-02 08:41:39 +03:00
[%| (resolve cug.yac p.pez(p (add-json jon p.p.pez)))]
2014-03-20 05:05:42 +04:00
==
2015-03-28 04:06:38 +03:00
::
%del
=. ..ya (logoff:yac p.ham)
2015-05-19 00:19:13 +03:00
=+ cug=[(set-cookie cookie-prefix '~')]~
2015-03-28 04:06:38 +03:00
[%| (give-json 200 cug (joba %ok %b &))]
::
%get
2015-05-19 00:19:13 +03:00
|-
2015-03-28 04:06:38 +03:00
~| aute/ham
2015-05-19 00:19:13 +03:00
?~ him.ham
=+ him=(ship-from-cookies maf)
?^ him $(him.ham him)
(show-ship-selection)
=* him u.him.ham
?: |(=(anon him) (~(has in aut.yac) him))
=. ..ya abet.yac(him him)
2015-05-16 02:21:09 +03:00
=+ pez=process(pok rem.ham, aut &)
?: ?=(%| -.pez) pez
[%| (resolve ~ p.pez)]
2015-05-19 00:19:13 +03:00
?. =(our him)
[%| ((teba foreign-auth.yac) him hat rem.ham quy)]
2015-03-28 04:06:38 +03:00
(show-login-page ~)
::
%try
:- %|
?. =(our him.ham)
~|(stub-foreign/him.ham !!)
?. ?| (~(has in aut.yac) him.ham)
?~(paz.ham | =(u.paz.ham load-secret))
==
~|(try/`@t`load-secret !!) :: XX security
2015-03-28 04:06:38 +03:00
=^ jon ..ya stat-json:(logon:yac him.ham)
2015-05-19 00:19:13 +03:00
=. cug.yac :_(cug.yac (set-cookie %ship (scot %p him.ham)))
2015-03-28 04:06:38 +03:00
(give-json 200 cug.yac jon)
2014-04-10 03:51:19 +04:00
==
2014-03-12 23:50:39 +04:00
::
2015-03-28 04:06:38 +03:00
++ show-login-page
2015-03-09 23:06:00 +03:00
|= ses=(unit hole) ^- (each pest ,_done)
2015-03-13 03:17:00 +03:00
?. ?=($|(~ [~ %html]) p.pok)
2015-04-02 08:41:39 +03:00
[%& %red ~]
2015-03-09 23:06:00 +03:00
?~ ses
2015-04-02 08:41:39 +03:00
[%& %htme login-page:xml]
2015-03-28 04:06:38 +03:00
?: (~(has by wup) u.ses)
2015-04-02 08:41:39 +03:00
[%& %htme login-page:xml]
2015-03-28 04:06:38 +03:00
=+ yac=(new-ya u.ses)
=+ =- lon=(~(has in aut:(fall - *cyst)) our)
(biff (session-from-cookies cookie-prefix maf) ~(get by wup))
=. yac ?.(lon yac (logon.yac our))
[%| (give-html(..ya abet.yac) 401 cug.yac login-page:xml)]
2014-04-21 21:02:09 +04:00
::
2015-05-19 00:19:13 +03:00
++ show-ship-selection
|= ~
~| %ship-selection-unimplemented
!!
::
2015-03-09 23:06:00 +03:00
++ cookie-prefix (rsh 3 1 (scot %p our))
2015-05-19 00:19:13 +03:00
++ cookie-domain
^- cord
?- r.hat
[%| @] (cat 3 '; Domain=' (rsh 3 1 (scot %if p.r.hat)))
[%& %org %urbit *] '; Domain=.urbit.org'
[%& @ @ *] =+ dom=p.r.hat
=- (rap 3 i.dom '.' i.t.dom -)
|-(?~(t.t.dom ~ ['.' i.t.t.dom $(dom t.dom)]))
[%& *] '' :: XX security?
==
::
++ set-cookie
|= [key=@t val=@t]
%+ rap 3 :~
key '=' val
:: '; HttpOnly' ?.(sec '' '; Secure') :: XX security
cookie-domain
'; Path=/; HttpOnly'
==
++ need-ixor (oryx-to-ixor (need grab-oryx))
2015-04-07 02:36:07 +03:00
++ for-view ^+(ix (ire-ix need-ixor))
2015-03-28 04:06:38 +03:00
::
2015-03-04 05:22:02 +03:00
++ for-client :: stateful per-session engine
^+ ya
2015-03-09 23:06:00 +03:00
=+ pef=cookie-prefix
2015-03-09 23:55:54 +03:00
=+ lig=(session-from-cookies pef maf)
2015-04-01 00:58:44 +03:00
?~ lig
(new-ya (rsh 3 1 (scot %p (end 6 1 ney))))
2015-05-09 03:34:06 +03:00
=+ cyz=(~(get by wup) u.lig)
?~ cyz
~& bad-cookie/u.lig
(new-ya (rsh 3 1 (scot %p (end 6 1 ney))))
~(. ya u.lig u.cyz(cug ~))
2015-03-09 23:06:00 +03:00
::
2015-03-28 04:06:38 +03:00
++ new-ya |=(ses=hole ~(. ya ses (new-cyst ses)))
++ new-cyst
2015-03-09 23:06:00 +03:00
|= ses=hole
=* sec p.hat
2015-03-03 04:52:55 +03:00
^- cyst
:* ^- cred
:* hat(p sec)
~
'not-yet-implemented'
::(rsh 3 1 (scot %p (end 6 1 (shaf %oryx ses))))
2014-04-21 21:02:09 +04:00
::
2015-03-03 04:52:55 +03:00
=+ lag=(~(get by maf) %accept-language)
?~(lag ~ ?~(u.lag ~ [~ i.u.lag]))
2014-04-21 21:02:09 +04:00
::
2015-03-03 04:52:55 +03:00
cip
~
2014-06-10 00:09:14 +04:00
==
2015-03-03 04:52:55 +03:00
[anon ~]
2014-04-21 21:02:09 +04:00
::
2015-05-19 00:19:13 +03:00
[(set-cookie cookie-prefix ses)]~
2014-04-21 21:02:09 +04:00
::
2015-03-03 04:52:55 +03:00
now
~
2015-03-09 23:06:00 +03:00
~
2015-03-03 04:52:55 +03:00
:: [1 ~]
2014-03-12 23:50:39 +04:00
==
2015-03-03 04:52:55 +03:00
--
2015-03-17 03:32:44 +03:00
::
2015-03-18 00:38:13 +03:00
++ oryx-to-ixor |=(a=oryx (rsh 3 1 (scot %p (end 6 1 (shas %ire a)))))
2014-03-12 23:50:39 +04:00
++ ya :: session engine
2015-03-04 05:22:02 +03:00
=| [ses=hole cyst]
=* cyz ->
2014-03-12 23:50:39 +04:00
|%
2015-03-04 05:22:02 +03:00
++ abet ..ya(wup (~(put by wup) ses cyz))
++ abut ..ya(wup (~(del by wup) ses))
2015-03-28 04:06:38 +03:00
++ foreign-auth
|= [him=ship pul=purl] ^+ ..ya
=. way (~(put by way) him pul hen)
(ames-gram:abet him [lon/~ ses])
2014-03-12 23:50:39 +04:00
::
2015-03-28 04:06:38 +03:00
++ foreign-hat
|= [him=ship hat=hart] ^+ ..ya
~| way
=^ pul hen (~(got by way) him)
=: way (~(del by way) him)
dop (~(put by dop) r.hat him)
q.q.pul ['~' %am ses q.q.pul]
2014-06-17 05:33:31 +04:00
==
2015-03-28 04:06:38 +03:00
=+ url=(welp (earn pul(p hat)) '#' (head:earn p.pul))
%- give-thou:abet
(add-cookies cug [307 [location/(crip url)]~ ~])
2014-06-10 00:09:14 +04:00
::
++ logon
2015-03-09 23:06:00 +03:00
|= her=ship
%_ +>
him her
aut (~(put in aut) her)
..ya
~& logon/[our her ses]
?. =(our her)
..ya
=+ sap=(~(get by sop) ses)
~& sap
?. ?=([~ @ %|] sap)
..ya
(ames-gram -.u.sap aut/~ ses)
2014-06-10 00:09:14 +04:00
==
2015-03-04 05:22:02 +03:00
++ logoff
|= her=(unit ship) ^+ ..ya
?~ her abut
=. aut (~(del in aut) u.her)
?~ aut abut
abet(him ?.(=(her him) him n.aut))
2014-06-10 00:09:14 +04:00
::
++ new-view
^+ [*oryx ..ya]
2015-03-27 01:32:32 +03:00
=+ orx=`@t`(rsh 3 1 (scot %p (shaf %orx eny)))
2015-03-04 05:22:02 +03:00
=. vew (~(put in vew) orx)
=+ [ire=(oryx-to-ixor orx) sem=%*(. *stem him him, era now, p.eve 1)]
=. wix (~(put by wix) ire sem)
2015-04-07 03:48:42 +03:00
:: ~& stat-ire/`@t`ire
[orx abet]
::
++ fcgi-cred %_(ced aut (~(put ju aut.ced) %$ (scot %p him)))
++ stat-json
^+ [*json ..ya]
=^ orx ..ya new-view
:_ ..ya
2015-03-04 05:22:02 +03:00
%- jobe :~
oryx/s/orx
ixor/s/(oryx-to-ixor orx)
2015-03-04 05:22:02 +03:00
ship/(jape +:<our>)
user/(jape +:<him>)
auth/a/(turn (~(tap in aut)) |=(a=@p (jape +:<a>)))
2014-04-09 02:26:01 +04:00
==
2014-03-12 23:50:39 +04:00
--
2015-03-17 03:32:44 +03:00
::
++ ix
=| [ire=ixor stem]
=* sem ->
|%
2015-03-28 04:06:38 +03:00
++ done .
2015-04-07 02:36:07 +03:00
++ abet ..ix(wix (~(put by wix) ire sem))
2015-03-28 04:06:38 +03:00
++ teba |*(a=$+(* ..ix) |*(b=* %_(done ..ix (a b))))
2015-04-07 02:36:07 +03:00
++ give-json (teba ^give-json)
++ hurl-note
|= [a=[dock path] b=note] ^+ ..ix
2015-04-07 03:32:30 +03:00
=: med (~(put to med) hen)
hen `~
==
2015-04-07 03:48:42 +03:00
:: ~& > hurl/[&2.b ire a]
2015-04-07 03:32:30 +03:00
(pass-note:abet [%of ire (gsig a)] b)
2014-04-09 02:26:01 +04:00
::
2015-03-28 04:06:38 +03:00
++ add-even
|= a=even ^+ eve
[+(p.eve) (~(put by q.eve) p.eve a)]
2014-04-09 02:26:01 +04:00
::
2015-04-07 02:36:07 +03:00
++ new-mess
|= [a=dock b=wire c=cage] ^+ ..ix
2015-05-10 01:55:05 +03:00
(hurl-note [a b] [%g %deal [him -.a] +.a %poke c])
2014-04-23 23:26:22 +04:00
::
2015-03-27 04:01:28 +03:00
++ add-subs
|= [a=dock %json b=wire c=path] ^+ ..ix
2015-05-10 01:55:05 +03:00
(hurl-note [a b] [%g %deal [him -.a] +.a %peer c])
2014-04-23 23:26:22 +04:00
::
2015-04-07 22:06:05 +03:00
++ del-subs :: XX per path?
|= [a=dock %json b=wire c=path] ^+ ..ix
2015-05-15 00:59:45 +03:00
=. ..ix (hurl-note [a b] [%g %deal [him -.a] +.a %pull ~])
(nice-json:pop-duct:(ire-ix ire)) :: XX gall ack
::
2015-03-17 03:32:44 +03:00
++ get-rush
2015-04-07 02:36:07 +03:00
|= [a=whir-of b=json] ^+ ..ix
(get-even [%rush [[(slav %p p.a) q.a] r.a] (joba %json b)])
2014-03-12 23:50:39 +04:00
::
2015-04-07 02:36:07 +03:00
++ get-ack
2015-05-10 01:55:05 +03:00
|= [a=whir-of b=honk] ^+ ..ix
2015-04-07 03:32:30 +03:00
?- -.b
2015-04-07 02:36:07 +03:00
%mean
2015-04-07 03:32:30 +03:00
?~ p.b :: XX actually a yawn-told-full
(get-even %mean [[(slav %p p.a) q.a] r.a] p.b)
2015-04-07 23:31:09 +03:00
(mean-json:pop-duct 500 p.b)
::
2015-04-07 02:36:07 +03:00
%nice
2015-04-07 03:32:30 +03:00
?: =(~ med) ~& resp-lost/ire ..ix
2015-04-07 23:31:09 +03:00
(nice-json:pop-duct)
2014-03-12 23:50:39 +04:00
==
::
2015-03-17 23:55:40 +03:00
++ get-even
|= ven=even ^+ ..ix
2015-03-19 03:22:20 +03:00
=+ num=p.eve
2015-03-17 23:55:40 +03:00
=. eve (add-even ven)
2015-03-17 03:32:44 +03:00
=< abet
?~ ude done
2015-04-21 02:45:31 +03:00
=. hen p.u.ude
=. ..ix (pass-note of//[ire] [%t %rest era])
(give-even(ude ~) q.u.ude num ven)
2014-06-10 00:09:14 +04:00
::
2015-03-19 03:22:20 +03:00
++ give-even
|= [pol=? num=@u ven=even] ^+ done
2015-03-27 02:29:17 +03:00
=: q.eve (~(del by q.eve) (dec num)) :: TODO ponder a-2
2015-03-27 04:01:28 +03:00
mow ?.(?=(%rush -.ven) mow mow:(pass-took p.ven))
2015-03-27 02:29:17 +03:00
==
2015-04-07 02:36:07 +03:00
?> pol :: XX eventstream
2015-03-19 03:22:20 +03:00
%^ give-json 200 ~
%^ jobe id/(jone num) type/[%s -.ven]
?- -.ven
%news ~[from/[%s (scot %uv p.ven)]]
2015-03-20 02:35:10 +03:00
%rush ~[from/(subs-to-json p.ven) data/q.ven]
%mean ~[from/(subs-to-json p.ven) data/(ares-to-json q.ven)]
2015-03-19 03:22:20 +03:00
==
::
2015-03-28 04:06:38 +03:00
++ pass-took
|= a=[p=dock wire]
2015-05-09 02:02:50 +03:00
%+ pass-note(hen `~)
[%of ire (gsig a)]
2015-05-10 01:55:05 +03:00
[%g %deal [him -.p.a] +.p.a %pump ~]
2014-06-10 00:09:14 +04:00
::
2015-04-07 23:31:09 +03:00
++ pop-duct =^(ned med ~(get to med) abet(hen ned))
2015-03-28 04:06:38 +03:00
++ poll
|= a=@u ^+ ..ix
?: =(a p.eve)
2015-04-21 02:45:31 +03:00
?^ ude ~&(e/ix/wait/replaced=p.u.ude abet(u.ude [hen &]))
2015-04-07 02:36:07 +03:00
=. era (add ~s30 now)
2015-04-07 03:32:30 +03:00
(pass-note:abet(ude [~ hen &]) of//[ire] [%t %wait era])
2015-03-28 04:06:38 +03:00
?: (gth a p.eve) ~|(seq-high/cur=p.eve !!)
=+ ven=~|(seq-low/cur=p.eve (~(got by q.eve) a))
abet:(give-even & a ven)
2014-06-10 00:09:14 +04:00
::
2015-03-20 02:35:10 +03:00
++ subs-to-json
|= [a=dock b=path]
2015-03-20 02:35:10 +03:00
%- jobe :~
ship/[%s (rsh 3 1 (scot %p p.a))]
appl/[%s q.a]
path/(jape (spud b))
==
2015-03-17 03:32:44 +03:00
++ wake ^+(..ix abet(ude ~)) :: XX other effects?
2015-03-28 04:06:38 +03:00
:: XX unused
++ print-subs |=([a=dock b=path] "{<p.a>}/{(trip q.a)}{(spud b)}")
2015-03-17 03:32:44 +03:00
-- --
2014-03-12 23:50:39 +04:00
--
2015-03-17 03:32:44 +03:00
. ==
2014-03-12 23:50:39 +04:00
=| bolo
=* bol -
2014-05-31 23:40:02 +04:00
|= [now=@da eny=@ ski=sled] :: activate
2014-03-12 23:50:39 +04:00
^? :: opaque core
|% ::
2014-06-04 14:40:09 +04:00
++ call :: handle request
|= $: hen=duct
2014-06-04 21:56:30 +04:00
hic=(hypo (hobo kiss))
2014-06-04 14:40:09 +04:00
==
2014-06-06 03:00:19 +04:00
=> %= . :: XX temporary
q.hic
^- kiss
?: ?=(%soft -.q.hic)
((hard kiss) p.q.hic)
?: (~(nest ut -:!>(*kiss)) | p.hic) q.hic
~& [%eyre-call-flub (,@tas `*`-.q.hic)]
((hard kiss) q.hic)
==
2014-05-31 23:40:02 +04:00
^- [p=(list move) q=_..^$]
2015-05-07 05:25:41 +03:00
?: ?=(%wegh -.q.hic)
:_ ..^$ :_ ~
:^ hen %give %mass
:- %|
:~ bol/`bol
:: cor/`..^$
==
2015-02-27 00:23:46 +03:00
=+ our=`@p`0x100 :: XX sentinel
2014-05-31 23:40:02 +04:00
=+ ska=(slod ski)
2014-05-02 03:33:15 +04:00
=+ sky=|=(* `(unit)`=+(a=(ska +<) ?~(a ~ ?~(u.a ~ [~ u.u.a]))))
=. ney (shax :(mix (shax now) +(eny) ney)) :: XX!! shd not need
2014-05-31 23:40:02 +04:00
^- [p=(list move) q=_..^$]
2014-03-20 05:05:42 +04:00
=. gub ?.(=(0 gub) gub (cat 3 (rsh 3 1 (scot %p (end 6 1 eny))) '-'))
=^ mos bol
2015-02-11 22:26:42 +03:00
abet:(apex:~(adit ye [hen [now eny our sky] ~] bol) q.hic)
2014-03-12 23:50:39 +04:00
[mos ..^$]
2013-09-29 00:21:18 +04:00
::
2015-02-27 03:04:12 +03:00
++ doze :: require no timer
2013-12-15 09:42:27 +04:00
|= [now=@da hen=duct]
2013-09-29 00:21:18 +04:00
^- (unit ,@da)
~
::
2015-04-15 00:16:46 +03:00
++ load :: take previous state
|= old=bolo
2014-05-31 23:40:02 +04:00
^+ ..^$
=+ mej=|=(a=* (met 3 (jam a)))
2015-05-10 01:55:05 +03:00
~& :* gub=(mej gub.old) hov=(mej hov.old) ged=(mej ged.old)
ded=(mej ded.old) pox=(mej pox.old) ask=(mej ask.old)
kes=(mej kes.old) ney=(mej ney.old) dop=(mej dop.old)
liz=(mej liz.old) wup=(mej wup.old) sop=(mej sop.old)
2015-05-06 00:24:48 +03:00
wix=(mej wix.old)
==
..^$(+>- old)
2013-09-29 00:21:18 +04:00
::
++ scry
2014-05-27 00:43:40 +04:00
|= [our=(unit (set monk)) ren=@tas who=ship syd=desk lot=coin tyl=path]
^- (unit (unit (pair mark ,*)))
2013-09-29 00:21:18 +04:00
~
::
2014-05-31 23:40:02 +04:00
++ stay `bolo`+>-.$
2014-06-04 14:40:09 +04:00
++ take :: accept response
2015-05-10 01:55:05 +03:00
|= [tea=wire hen=duct hin=(hypo sign)]
2014-06-04 14:40:09 +04:00
^- [p=(list move) q=_..^$]
2015-02-27 00:23:46 +03:00
=+ our=`@p`0x100 :: XX sentinel
2014-06-04 14:40:09 +04:00
=+ ska=(slod ski)
=+ sky=|=(* `(unit)`=+(a=(ska +<) ?~(a ~ ?~(u.a ~ [~ u.u.a]))))
=. ney (shax :(mix (shax now) +(eny) ney)) :: XX!! shd not need
^- [p=(list move) q=_..^$]
=. gub ?.(=(0 gub) gub (cat 3 (rsh 3 1 (scot %p (end 6 1 eny))) '-'))
2015-03-17 23:55:40 +03:00
=+ tee=((soft whir) tea)
?~ tee ~& [%e %lost -.q.hin hen] [~ ..^$]
2014-06-04 14:40:09 +04:00
=^ mos bol
=< abet
2015-03-17 23:55:40 +03:00
%^ axon:~(adit ye [hen [now eny our sky] ~] bol) u.tee
2014-06-24 21:32:59 +04:00
(~(peek ut p.hin) %free 3)
2014-06-22 06:51:12 +04:00
q.hin
2014-06-04 14:40:09 +04:00
[mos ..^$]
2013-09-29 00:21:18 +04:00
--