1module Auth.Handler where
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)
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
35 log $ "Denied request without token"
36 Response.send $ write { error: "Jetzt hör'n Sie mir mal zu! Erstens brauch ich ihren Namen!!" }
38 Just token@(Token raw)
39 | elem token authorizedTokens -> do
40 log $ "Access granted to " <> raw
42 Just (Token invalid) -> do
44 log $ "Access denied to " <> invalid
45 Response.send $ write { error: "Ich seh' ja ein das 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