summaryrefslogtreecommitdiff
path: root/lib/coki.hoon
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-06-22 23:11:11 +0700
committerpolwex <polwex@sortug.com>2025-06-22 23:11:11 +0700
commit6fb80b2d94a5282c8350278e299bfcb2d0b60d40 (patch)
treebe85636f67322948181bf59519dfe998f7d7b6b1 /lib/coki.hoon
parent4e2a84761b95a29c02c77c575810ab49f2af7335 (diff)
Diffstat (limited to 'lib/coki.hoon')
-rw-r--r--lib/coki.hoon92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/coki.hoon b/lib/coki.hoon
new file mode 100644
index 0000000..39ea479
--- /dev/null
+++ b/lib/coki.hoon
@@ -0,0 +1,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
+
+
+--