removed persistent dependecies from library
This commit is contained in:
parent
490b6211f0
commit
8b1c3f090b
@ -5,6 +5,7 @@ module Main (main) where
|
|||||||
import UniWorX
|
import UniWorX
|
||||||
import Server
|
import Server
|
||||||
import Control.Applicative ((<|>))
|
import Control.Applicative ((<|>))
|
||||||
|
import Database.Persist (Entity(..))
|
||||||
import System.Environment (lookupEnv)
|
import System.Environment (lookupEnv)
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
@ -14,7 +15,7 @@ main = do
|
|||||||
port <- determinePort
|
port <- determinePort
|
||||||
putStrLn $ "Try: http://localhost:" ++ show port ++ "/auth?scope=ID%20Profile&client_id=42&response_type=code&redirect_uri=http:%2F%2Flocalhost:0000%2F"
|
putStrLn $ "Try: http://localhost:" ++ show port ++ "/auth?scope=ID%20Profile&client_id=42&response_type=code&redirect_uri=http:%2F%2Flocalhost:0000%2F"
|
||||||
initDB
|
initDB
|
||||||
runMockServer @User @(M.Map T.Text T.Text) port
|
runMockServer @(Entity User) @(M.Map T.Text T.Text) port
|
||||||
where
|
where
|
||||||
determinePort :: IO Int
|
determinePort :: IO Int
|
||||||
determinePort = do
|
determinePort = do
|
||||||
|
|||||||
@ -49,7 +49,7 @@ testUsers :: [User] -- TODO move to db
|
|||||||
testUsers =
|
testUsers =
|
||||||
[ User "Fallback User" "foo@bar.com"
|
[ User "Fallback User" "foo@bar.com"
|
||||||
, User "Tina Tester" "t@t.tt"
|
, User "Tina Tester" "t@t.tt"
|
||||||
, User "Max Muster" "m@m.mm"]
|
, User "Max Muster" "m@m.mm" ]
|
||||||
|
|
||||||
runDB :: ReaderT SqlBackend (NoLoggingT (ResourceT IO)) a -> IO a
|
runDB :: ReaderT SqlBackend (NoLoggingT (ResourceT IO)) a -> IO a
|
||||||
runDB action = do
|
runDB action = do
|
||||||
@ -63,8 +63,8 @@ initDB = runDB $ do
|
|||||||
runMigration migrateAll
|
runMigration migrateAll
|
||||||
forM_ testUsers $ void . insert
|
forM_ testUsers $ void . insert
|
||||||
|
|
||||||
instance UserData User (Map Text Text) where
|
instance UserData (Entity User) (Map Text Text) where
|
||||||
data Scope User = ID | Profile deriving (Show, Read, Eq)
|
data Scope (Entity User) = ID | Profile deriving (Show, Read, Eq)
|
||||||
readScope = read
|
readScope = read
|
||||||
showScope = show
|
showScope = show
|
||||||
userScope (Entity uID _) ID = M.singleton "id" . T.pack $ show uID
|
userScope (Entity uID _) ID = M.singleton "id" . T.pack $ show uID
|
||||||
|
|||||||
@ -37,17 +37,11 @@ library
|
|||||||
, base64
|
, base64
|
||||||
, blaze-html
|
, blaze-html
|
||||||
, bytestring
|
, bytestring
|
||||||
, conduit
|
|
||||||
, containers
|
, containers
|
||||||
, http-api-data
|
, http-api-data
|
||||||
, http-client
|
, http-client
|
||||||
, http-media
|
, http-media
|
||||||
, jose-jwt
|
, jose-jwt
|
||||||
, monad-logger
|
|
||||||
, mtl
|
|
||||||
, persistent
|
|
||||||
, persistent-postgresql
|
|
||||||
, persistent-template
|
|
||||||
, servant
|
, servant
|
||||||
, servant-client
|
, servant-client
|
||||||
, servant-server
|
, servant-server
|
||||||
@ -116,18 +110,12 @@ test-suite oauth2-mock-server-test
|
|||||||
, base64
|
, base64
|
||||||
, blaze-html
|
, blaze-html
|
||||||
, bytestring
|
, bytestring
|
||||||
, conduit
|
|
||||||
, containers
|
, containers
|
||||||
, http-api-data
|
, http-api-data
|
||||||
, http-client
|
, http-client
|
||||||
, http-media
|
, http-media
|
||||||
, jose-jwt
|
, jose-jwt
|
||||||
, monad-logger
|
|
||||||
, mtl
|
|
||||||
, oauth2-mock-server
|
, oauth2-mock-server
|
||||||
, persistent
|
|
||||||
, persistent-postgresql
|
|
||||||
, persistent-template
|
|
||||||
, servant
|
, servant
|
||||||
, servant-client
|
, servant-client
|
||||||
, servant-server
|
, servant-server
|
||||||
|
|||||||
12
package.yaml
12
package.yaml
@ -40,12 +40,6 @@ dependencies:
|
|||||||
- blaze-html
|
- blaze-html
|
||||||
- http-media
|
- http-media
|
||||||
- string-interpolate
|
- string-interpolate
|
||||||
- persistent
|
|
||||||
- persistent-postgresql
|
|
||||||
- persistent-template
|
|
||||||
- monad-logger
|
|
||||||
- conduit
|
|
||||||
- mtl
|
|
||||||
|
|
||||||
ghc-options:
|
ghc-options:
|
||||||
- -Wall
|
- -Wall
|
||||||
@ -71,6 +65,12 @@ executables:
|
|||||||
- -with-rtsopts=-N
|
- -with-rtsopts=-N
|
||||||
dependencies:
|
dependencies:
|
||||||
- oauth2-mock-server
|
- oauth2-mock-server
|
||||||
|
- persistent
|
||||||
|
- persistent-postgresql
|
||||||
|
- persistent-template
|
||||||
|
- monad-logger
|
||||||
|
- conduit
|
||||||
|
- mtl
|
||||||
|
|
||||||
tests:
|
tests:
|
||||||
oauth2-mock-server-test:
|
oauth2-mock-server-test:
|
||||||
|
|||||||
@ -21,8 +21,6 @@ import Data.UUID
|
|||||||
|
|
||||||
import qualified Data.Map.Strict as M
|
import qualified Data.Map.Strict as M
|
||||||
|
|
||||||
import Database.Persist (Entity(..))
|
|
||||||
|
|
||||||
import Control.Concurrent (forkIO, threadDelay)
|
import Control.Concurrent (forkIO, threadDelay)
|
||||||
import Control.Concurrent.STM.TVar
|
import Control.Concurrent.STM.TVar
|
||||||
import Control.Monad (void, (>=>))
|
import Control.Monad (void, (>=>))
|
||||||
@ -47,7 +45,7 @@ instance FromJSON JWT where
|
|||||||
data AuthRequest user = AuthRequest
|
data AuthRequest user = AuthRequest
|
||||||
{ client :: String
|
{ client :: String
|
||||||
, codeExpiration :: NominalDiffTime
|
, codeExpiration :: NominalDiffTime
|
||||||
, user :: Entity user
|
, user :: user
|
||||||
, scopes :: [Scope user]
|
, scopes :: [Scope user]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +53,7 @@ data AuthRequest user = AuthRequest
|
|||||||
|
|
||||||
data State user = State
|
data State user = State
|
||||||
{ activeCodes :: Map Text (AuthRequest user)
|
{ activeCodes :: Map Text (AuthRequest user)
|
||||||
, activeTokens :: Map UUID (Entity user, [Scope user])
|
, activeTokens :: Map UUID (user, [Scope user])
|
||||||
, publicKey :: Jwk
|
, publicKey :: Jwk
|
||||||
, privateKey :: Jwk
|
, privateKey :: Jwk
|
||||||
}
|
}
|
||||||
@ -86,7 +84,7 @@ expire code time state = void . forkIO $ do
|
|||||||
atomically . modifyTVar state $ \s -> s{ activeCodes = M.delete code s.activeCodes }
|
atomically . modifyTVar state $ \s -> s{ activeCodes = M.delete code s.activeCodes }
|
||||||
|
|
||||||
|
|
||||||
verify :: Text -> Maybe String -> AuthState user -> IO (Maybe (Entity user, [Scope user]))
|
verify :: Text -> Maybe String -> AuthState user -> IO (Maybe (user, [Scope user]))
|
||||||
verify code mClientID state = do
|
verify code mClientID state = do
|
||||||
now <- getCurrentTime
|
now <- getCurrentTime
|
||||||
mData <- atomically $ do
|
mData <- atomically $ do
|
||||||
|
|||||||
@ -34,8 +34,6 @@ import Data.UUID.V4
|
|||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import qualified Data.Map.Strict as Map
|
import qualified Data.Map.Strict as Map
|
||||||
|
|
||||||
import Database.Persist (Entity(..))
|
|
||||||
|
|
||||||
import GHC.Read (readPrec, lexP)
|
import GHC.Read (readPrec, lexP)
|
||||||
|
|
||||||
import Jose.Jwa
|
import Jose.Jwa
|
||||||
@ -247,7 +245,7 @@ tokenEndpoint = provideToken
|
|||||||
|
|
||||||
|
|
||||||
mkToken :: forall user userData . UserData user userData
|
mkToken :: forall user userData . UserData user userData
|
||||||
=> Entity user -> [Scope user] -> AuthState user -> IO JWTWrapper
|
=> user -> [Scope user] -> AuthState user -> IO JWTWrapper
|
||||||
mkToken u scopes state = do
|
mkToken u scopes state = do
|
||||||
pubKey <- atomically $ readTVar state >>= return . publicKey
|
pubKey <- atomically $ readTVar state >>= return . publicKey
|
||||||
now <- getCurrentTime
|
now <- getCurrentTime
|
||||||
|
|||||||
42
src/User.hs
42
src/User.hs
@ -1,50 +1,18 @@
|
|||||||
{-# LANGUAGE OverloadedStrings, RecordWildCards, TypeFamilies, MultiParamTypeClasses, FlexibleInstances, AllowAmbiguousTypes #-}
|
{-# LANGUAGE OverloadedStrings, RecordWildCards, TypeFamilies, MultiParamTypeClasses, FlexibleInstances, AllowAmbiguousTypes #-}
|
||||||
|
|
||||||
module User
|
module User ( UserData(..) ) where
|
||||||
( UserData(..)
|
|
||||||
-- , User (..)
|
|
||||||
-- , testUsers
|
|
||||||
) where
|
|
||||||
|
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.List (find)
|
|
||||||
import Data.Map.Strict
|
import Data.Map.Strict
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Text hiding (singleton, find)
|
import Data.Text
|
||||||
|
|
||||||
import Database.Persist (PersistEntity(..), Entity(..))
|
|
||||||
|
|
||||||
import GHC.Generics
|
|
||||||
|
|
||||||
type UserName = Text
|
type UserName = Text
|
||||||
type Password = Text
|
type Password = Text
|
||||||
|
|
||||||
class (PersistEntity u, Show u, ToJSON a, Monoid a) => UserData u a where -- TODO Show maybe not necessary
|
class (Eq u, Show u, ToJSON a, Monoid a) => UserData u a where -- TODO Show maybe not necessary
|
||||||
data Scope u
|
data Scope u
|
||||||
readScope :: String -> Scope u
|
readScope :: String -> Scope u
|
||||||
showScope :: Scope u -> String
|
showScope :: Scope u -> String
|
||||||
userScope :: Entity u -> Scope u -> a
|
userScope :: u -> Scope u -> a
|
||||||
lookupUser :: UserName -> Password -> IO (Maybe (Entity u))
|
lookupUser :: UserName -> Password -> IO (Maybe u)
|
||||||
|
|
||||||
|
|
||||||
-- data User = User
|
|
||||||
-- { name :: Text
|
|
||||||
-- , email :: Text
|
|
||||||
-- , password :: Text
|
|
||||||
-- , uID :: Text
|
|
||||||
-- } deriving (Eq, Show)
|
|
||||||
|
|
||||||
-- testUsers :: [User] -- TODO move to db
|
|
||||||
-- testUsers =
|
|
||||||
-- [ User {name = "Fallback User", email = "foo@bar.com", password = "0000", uID = "0"}
|
|
||||||
-- , User {name = "Tina Tester", email = "t@t.tt", password = "1111", uID = "1"}
|
|
||||||
-- , User {name = "Max Muster", email = "m@m.mm", password = "2222", uID = "2"}]
|
|
||||||
|
|
||||||
|
|
||||||
-- instance UserData User (Map Text Text) where
|
|
||||||
-- data Scope User = ID | Profile deriving (Show, Read, Eq)
|
|
||||||
-- readScope = read
|
|
||||||
-- showScope = show
|
|
||||||
-- userScope User{..} ID = singleton "id" uID
|
|
||||||
-- userScope User{..} Profile = fromList [("name", name), ("email", email)]
|
|
||||||
-- lookupUser e _ = return $ find (\User{..} -> email == e) testUsers
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user