1module Auth.Handler where
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)
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
36 log $ "Denied request without token"
37 Response.send $ encodeJson { error: "Jetz her'n Sie mir moi zua! Erstens brach i earna Nomen!!" }
39 Just token@(Token raw)
40 | elem token authorizedTokens -> do
41 log $ "Access granted to " <> raw
43 Just (Token invalid) -> do
45 log $ "Access denied to " <> invalid
46 Response.send $ encodeJson { error: "Ich seh' ja ein, dass man hier der gläserne Mensch ist." }
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list