summaryrefslogtreecommitdiff
path: root/lib/coki.hoon
blob: 39ea4794bac3b01a2f0ce108c5091f3fa3ffd382 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/-  *coki
/+  server, sr=sortug
|_  [=sessions =bowl:gall]
+$  sess  ^sessions
++  session-timeout
  |%
  ++  host  ~d30
  ++  guest  ~d7
  --
++  session-hash
  (~(raw og (shas %coki eny.bowl)) 128)
++  session-cookie-string  |=  [session=@ proven=@p desk=@tas]
  ^-  @t
  =/  max-age=tape  %-  a-co:co
    =/  its-a-me  .=(src.bowl our.bowl)
    =,  session-timeout
    (div (msec:milly ?:(its-a-me host guest)) 1.000)
  %-  crip
    "urbcoki-{(trip desk)}-{(scow %p proven)}={(scow:parsing:sr %uv session)}; Path=/{(trip desk)}; HttpOnly; SameSite=Lax; Max-Age={max-age}"
    :: "urbneo={(scow:parsing:sr %uv session)}; Path=/; Max-Age={max-age}"
++  validate-coki  |=  coki=@t  ^-  (unit @p)
  =/  cookies  (rush coki cock:de-purl:html)
  ~&  cookies=cookies
  ?~  cookies  ~
  =/  cokis=(list [@t @t])  u.cookies
  |-
    ?~  cokis  ~
    =/  hd  i.cokis
    :: ?:  (contains:string:sr (trip hd) "urbneo")
      =/  hash  (slaw:parsing:sr %uv +.hd)
      ?~  hash  $(cokis t.cokis)
      =/  sess  (~(get by users.sessions) u.hash)
      ?~  sess  $(cokis t.cokis)
      `u.sess
++  send-self-poke  |=  poke=self-poke
  ^-  (list card:agent:gall)
  :~  [%pass /gib %agent [our.bowl dap.bowl] %poke %coki !>(poke)]
  ==
::  handle-self-pokes
++  handle-self-poke  |=  poke=self-poke
?-  -.poke
  %meta    :-  ~  (handle-challenge +.poke)
  %coki    :-  ~  (handle-coki +.poke)
  %logout  (handle-logout +.poke)
==
++  handle-challenge
  |=  new-challenge=@  ^-  ^sessions
  :: =?    users.sessions
  ::     !(~(has by users.sessions) src.bowl)
  ::   (~(put by users.sessions) [src.bowl src.bowl])
  :: =?    challenges.sessions
  ::     =(src.bowl (~(got by users.sessions) src.bowl))
    =.  challenges.sessions
    (~(put in challenges.sessions) new-challenge)

  sessions


++  parse-coki  |=  coki=@t
  =/  cookies  (rush coki cock:de-purl:html)
  ?~  cookies  users.sessions
  =/  cokis=(list [@t @t])  u.cookies
  |-
    ?~  cokis  users.sessions
    =/  hd  i.cokis
    :: ?:  (contains:string:sr (trip hd) "urbneo")
    =/  hash  (slaw:parsing:sr %uv +.hd)
    ?~  hash  $(cokis t.cokis)
    =/  sess  (~(get by users.sessions) u.hash)
    ?~  sess  $(cokis t.cokis)
    (~(del by users.sessions) u.hash)

++  logout  |=  [order-id=@t coki=@t redirect=@t]
  (send-self-poke [%logout order-id coki redirect])

++  handle-logout  |=  [order-id=@t coki=@t redirect=@t]
  ~&  handling-logout=coki
  =/  new-users  (parse-coki coki)
  :_  sessions(users new-users)
  %+  give-simple-payload:app:server
    order-id
  (redirect:gen:server redirect)

  ++  handle-coki
    |=  [who=@p coki=@ =challenge]  ^-  ^sessions
    :: ~&  >  "%ustj: Successful authentication of {<src>} as {<who>}."
    =.  users.sessions        (~(put by users.sessions) coki who)
    =.  challenges.sessions   (~(del in challenges.sessions) challenge)
    sessions

  
--