aboutsummaryrefslogtreecommitdiff
path: root/src/Auth.hs
blob: 68d1b6b7a059fc9206233bd372dbb6e897eb3d89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedStrings #-}

-- | This module provides authentication utilities for the Jamaa server.
module Auth (AuthProtect, authHandler) where

import Data.Text (Text, isPrefixOf, stripPrefix, pack)
import Servant
import Servant.Server.Experimental.Auth (AuthServerData, AuthHandler, mkAuthHandler)
import Network.Wai (Request, requestHeaders)
import Database.Persist
import Database (runDb)
import Control.Monad.IO.Class (liftIO)
import Data.Text.Encoding (decodeUtf8, decodeUtf8With)

import Data.User (User(..), Unique(UniqueName))

----------------------------------------------------------------------------------------------------
type instance AuthServerData (AuthProtect "user-auth") = User

authHandler :: AuthHandler Request User
authHandler =
  mkAuthHandler $ \req -> case lookup "Authorization" (requestHeaders req) of
    Just token ->
      case stripPrefix "Bearer dummy" (decodeUtf8 token) of
        Just username -> do
          maybe_user <- liftIO $ runDb $ getBy $ UniqueName username

          case maybe_user of
            Just (Entity _ db_user) -> return db_user
            _ -> throwError err401
        _ -> throwError err401
    _ -> throwError err401