packages feed

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 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