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