servant-auth-token 0.4.2.0 → 0.4.3.0
raw patch · 5 files changed
+59/−7 lines, 5 filesdep ~servant-auth-token-apiPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: servant-auth-token-api
API changes (from Hackage documentation)
+ Servant.Server.Auth.Token: authFindUserByLogin :: AuthHandler m => Maybe Login -> MToken' '["auth-info"] -> m RespUserInfo
+ Servant.Server.Auth.Token: ensureAdminHash :: AuthHandler m => Int -> Login -> Text -> Email -> m ()
+ Servant.Server.Auth.Token: hashPassword :: AuthHandler m => Password -> m Text
+ Servant.Server.Auth.Token: setUserPasswordHash :: AuthHandler m => Text -> UserId -> m ()
+ Servant.Server.Auth.Token.Model: makeUserInfo :: HasStorage m => WithId UserImplId UserImpl -> m RespUserInfo
Files
- CHANGELOG.md +7/−0
- servant-auth-token.cabal +2/−2
- src/Servant/Server/Auth/Token.hs +45/−0
- src/Servant/Server/Auth/Token/Model.hs +2/−2
- stack.yaml +3/−3
CHANGELOG.md view
@@ -1,3 +1,10 @@+0.4.3.0+=======++* Implementation for `AuthFindUserByLogin` endpoint.+* Feature to manipulate with hashes of passwords. For instance, now you can store+hashed admin password in config.+ 0.4.2.0 =======
servant-auth-token.cabal view
@@ -1,5 +1,5 @@ name: servant-auth-token-version: 0.4.2.0+version: 0.4.3.0 synopsis: Servant based API and server for token based authorisation description: Please see README.md homepage: https://github.com/ncrashed/servant-auth-token#readme@@ -55,7 +55,7 @@ , containers >= 0.5 && < 0.6 , mtl >= 2.2 && < 2.3 , pwstore-fast >= 2.4 && < 2.5- , servant-auth-token-api >= 0.4 && < 0.5+ , servant-auth-token-api >= 0.4.2 && < 0.5 , servant-server >= 0.9 && < 0.10 , text >= 1.2 && < 1.3 , time >= 1.5 && < 1.7
src/Servant/Server/Auth/Token.hs view
@@ -59,8 +59,12 @@ , authGroupList , authCheckPermissionsMethod , authGetUserIdMethod+ , authFindUserByLogin -- * Low-level API , getAuthToken+ , hashPassword+ , setUserPasswordHash+ , ensureAdminHash ) where import Control.Monad@@ -70,6 +74,7 @@ import Data.Aeson.WithField import Data.Maybe import Data.Monoid+import Data.Text (Text) import Data.Text.Encoding import Data.Time.Clock import Data.UUID@@ -113,6 +118,7 @@ :<|> authGroupList :<|> authCheckPermissionsMethod :<|> authGetUserIdMethod+ :<|> authFindUserByLogin -- | Implementation of "signin" method authSignin :: AuthHandler m@@ -478,6 +484,15 @@ strength <- getsConfig passwordsStrength setUserPassword' strength pass user +-- | Update password hash of user. Can be used to set direct hash for user password+-- when it is taken from config file.+setUserPasswordHash :: AuthHandler m => Text -> UserId -> m ()+setUserPasswordHash hashedPassword i = do+ let i' = toKey i+ user <- guard404 "user" $ getUserImpl i'+ let user' = user { userImplPassword = hashedPassword }+ replaceUserImpl i' user'+ -- | Getting info about user group, requires 'authInfoPerm' for token authGroupGet :: AuthHandler m => UserGroupId@@ -561,3 +576,33 @@ authGetUserIdMethod token = do guardAuthToken token OnlyField . respUserId <$> authToken (downgradeToken token)++-- | Implementation of 'AuthFindUserByLogin'. Find user by login, throw 404 error+-- if cannot find user by such login.+authFindUserByLogin :: AuthHandler m+ => Maybe Login -- ^ Login, 'Nothing' will cause 400 error.+ -> MToken' '["auth-info"]+ -> m RespUserInfo+authFindUserByLogin mlogin token = do+ login <- require "login" mlogin+ guardAuthToken token+ userWithId <- guard404 "user" $ getUserImplByLogin login+ makeUserInfo userWithId++-- | Generate hash from given password and return it as text. May be useful if+-- you don't like storing unencrypt passwords in config files.+hashPassword :: AuthHandler m => Password -> m Text+hashPassword pass = do+ strength <- getsConfig passwordsStrength+ hashed <- liftIO $ makePassword (passToByteString pass) strength+ return $ byteStringToPass hashed++-- | Ensures that DB has at least one admin, if not, creates a new one+-- with specified info and direct password hash. May be useful if+-- you don't like storing unencrypt passwords in config files.+ensureAdminHash :: AuthHandler m => Int -> Login -> Text -> Email -> m ()+ensureAdminHash strength login passHash email = do+ madmin <- getFirstUserByPerm adminPerm+ whenNothing madmin $ do+ i <- createAdmin strength login "" email+ setUserPasswordHash passHash $ fromKey i
src/Servant/Server/Auth/Token/Model.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE TemplateHaskell #-} {-| Module : Servant.Server.Auth.Token.Model Description : Internal operations with RDBMS@@ -58,6 +56,8 @@ , updateUserGroup , deleteUserGroup , patchUserGroup+ -- * Low-level+ , makeUserInfo ) where import Control.Monad
stack.yaml view
@@ -15,7 +15,7 @@ # resolver: # name: custom-snapshot # location: "./custom-snapshot.yaml"-resolver: lts-8.3+resolver: lts-8.8 # User packages to be built. # Various formats can be used as shown in the example below.@@ -47,7 +47,7 @@ # git: https://github.com/NCrashed/servant-auth-token-api.git # commit: d011f7bfecd18d07ff67ce9f67f8741e110a2719 # extra-dep: true-# - '../servant-auth-token-api'+- '../servant-auth-token-api' # Dependency packages to be pulled from upstream that are not in the resolver # (e.g., acme-missiles-0.3)@@ -58,7 +58,7 @@ - natural-transformation-0.4 - safecopy-store-0.9.2 - servant-0.9-- servant-auth-token-api-0.4.1.0+- servant-auth-token-api-0.4.2.0 - servant-docs-0.9 - servant-server-0.9 - store-0.3.1