git.iko.soy/rowtype-yoga/psfp
on 2003541 help sign in
47 lines 1.6 kB history raw
1module Auth.Handler where
3import Prelude
5import Auth.Types (Token(..))
6import Data.Argonaut (encodeJson)
7import Data.Array (elem)
8import Data.JSDate (now, toISOString)
9import Data.Maybe (Maybe(..))
10import Data.String (Pattern(..), stripPrefix)
11import Data.String.Utils (lines)
12import Effect.Aff (Aff)
13import Effect.Aff.Class (liftAff)
14import Effect.Class (liftEffect)
15import Node.Encoding (Encoding(..))
16import Node.Express.Handler (HandlerM, next)
17import Node.Express.Request (getRequestHeader)
18import Node.Express.Response (end, setStatus)
19import Node.Express.Response as Response
20import Node.FS.Aff (appendTextFile, readTextFile)
22readAllowedTokens ∷ Aff (Array Token)
23readAllowedTokens = do
24 text <- readTextFile UTF8 ".authorized-keys"
25 pure $ Token <$> lines text
27authHandler ∷ Array Token -> HandlerM Unit
28authHandler authorizedTokens = do
29 authHeader <- getRequestHeader "Authorization"
30 let maybeToken = authHeader >>= stripPrefix (Pattern "Bearer ") <#> Token
31 ts <- now >>= toISOString # liftEffect
32 let log s = liftAff $ appendTextFile UTF8 "access.log" $ ts <> ": " <> s
33 case maybeToken of
34 Nothing -> do
35 setStatus 401
36 log $ "Denied request without token"
37 Response.send $ encodeJson { error: "Jetz her'n Sie mir moi zua! Erstens brach i earna Nomen!!" }
38 end
39 Just token@(Token raw)
40 | elem token authorizedTokens -> do
41 log $ "Access granted to " <> raw
42 next
43 Just (Token invalid) -> do
44 setStatus 403
45 log $ "Access denied to " <> invalid
46 Response.send $ encodeJson { error: "Ich seh' ja ein, dass man hier der gläserne Mensch ist." }
47 end