@@ -21,15 +21,13 @@ module Server.Auth (
2121
2222import Server.App
2323import Data.User
24−import Data.ByteString
24+import qualified Data.ByteString as BS
2525import qualified Data.ByteString.Char8 as C
2626import qualified Data.ByteString.Lazy.Char8 as L
2727import Data.Query
28−import Data.Binary (decode)
2928import Server.Error
30−import Control.Monad.Error
29+import Control.Monad.Except
3130import Text.Read (readMaybe)
32−import Squeal.PostgreSQL.PQ
3331import Data.Connection
3432import Servant.Server.Experimental.Auth
3533import Servant.API
@@ -37,12 +35,18 @@ import Network.Wai (Request, requestHeaders)
3735import Servant.Server
3836import Web.Cookie
3937import Data.Time.Clock
40−import Data.Monoid ((<>))
41−import Data.Text
4238import Data.Proxy
4339import qualified GHC.Generics as GHC
4440import Data.Aeson
4541import Data.Binary.Builder (toLazyByteString)
42+import Servant.Docs (ToSample, samples, toSamples)
43+
44+-- MARK: Documentation
45+
46+instance ToSample AuthenticationCredits where
47+ toSamples _ = samples $ map AuthenticationCredits [56, 103, 8]
48+
49+-- MARK: Implementation
4650
4751type AuthenticationHandler = ReqBody '[JSON] AuthenticationCredits :> PostNoContent '[JSON, PlainText, FormUrlEncoded] (Headers '[Header "Set-Cookie" String] NoContent)
4852
@@ -54,7 +58,6 @@ instance FromJSON AuthenticationCredits
5458
5559authenticate :: ServerT AuthenticationHandler App
5660authenticate (AuthenticationCredits uId) = do
57− conn <- ask
5861 expire <- liftIO $ fmap (addUTCTime (1 * 24 * 60 * 60)) getCurrentTime -- one days
5962 tId <- fmap userId . runQ invalidToken . getUser $ uId
6063 let cookie = defaultSetCookie {
@@ -67,7 +70,7 @@ authenticate (AuthenticationCredits uId) = do
6770 return $ addHeader (L.unpack . toLazyByteString . renderSetCookie $ cookie) NoContent
6871
6972
70−checkToken :: DBConnection -> ByteString -> Handler UserId
73+checkToken :: DBConnection -> BS.ByteString -> Handler UserId
7174checkToken conn token = do
7275 uId <- case ((readMaybe . C.unpack) token :: Maybe UserId) of
7376 Just uId -> return uId
@@ -83,11 +86,9 @@ authHandler conn = mkAuthHandler handler
8386 cookie <- maybeToEither "Missing cookie header" $ lookup "cookie" $ requestHeaders req
8487 maybeToEither "Missing token in cookie" $ lookup cookieTokenKey $ parseCookies cookie
8588
86−cookieTokenKey :: ByteString
89+cookieTokenKey :: BS.ByteString
8790cookieTokenKey = "servant-auth-cookie"
8891
89−cookieTokenKeyString = C.unpack cookieTokenKey
90−
9192type instance AuthServerData (AuthProtect "basicAuth") = UserId
9293
9394genAuthServerContext :: DBConnection -> Context (AuthHandler Request UserId ': '[])