apiary-authenticate 0.7.0.0 → 0.8.0.0
raw patch · 3 files changed
+25/−27 lines, 3 filesdep +reflectiondep −monad-controldep ~apiarydep ~apiary-clientsessionPVP ok
version bump matches the API change (PVP)
Dependencies added: reflection
Dependencies removed: monad-control
Dependency ranges changed: apiary, apiary-clientsession
API changes (from Hackage documentation)
+ Web.Apiary.Authenticate: authHandler :: (Functor n, MonadIO n, HasAuth) => ApiaryT c n m ()
- Web.Apiary.Authenticate: authConfig :: HasAuth => Action AuthConfig
+ Web.Apiary.Authenticate: authConfig :: (Monad m, HasAuth) => ActionT m AuthConfig
- Web.Apiary.Authenticate: authLogout :: HasAuth => Action ()
+ Web.Apiary.Authenticate: authLogout :: (Monad m, HasAuth) => ActionT m ()
- Web.Apiary.Authenticate: authProviders :: HasAuth => Action [(Text, Provider)]
+ Web.Apiary.Authenticate: authProviders :: (Monad m, HasAuth) => ActionT m [(Text, Provider)]
- Web.Apiary.Authenticate: authRoutes :: HasAuth => Action [(Text, ByteString)]
+ Web.Apiary.Authenticate: authRoutes :: (Monad m, HasAuth) => ActionT m [(Text, ByteString)]
- Web.Apiary.Authenticate: type HasAuth = (?webApiaryAuthenticateAuth :: Auth, HasSession)
+ Web.Apiary.Authenticate: type HasAuth = (Given Auth, HasSession)
- Web.Apiary.Authenticate: withAuth :: HasSession => AuthConfig -> (HasAuth => Apiary c ()) -> Apiary c ()
+ Web.Apiary.Authenticate: withAuth :: HasSession => AuthConfig -> (HasAuth => IO a) -> IO a
- Web.Apiary.Authenticate: withAuthWith :: HasSession => ManagerSettings -> AuthConfig -> (HasAuth => Apiary c ()) -> Apiary c ()
+ Web.Apiary.Authenticate: withAuthWith :: HasSession => ManagerSettings -> AuthConfig -> (HasAuth => IO a) -> IO a
Files
- apiary-authenticate.cabal +4/−4
- src/Web/Apiary/Authenticate.hs +1/−0
- src/Web/Apiary/Authenticate/Internal.hs +20/−23
apiary-authenticate.cabal view
@@ -1,5 +1,5 @@ name: apiary-authenticate-version: 0.7.0.0+version: 0.8.0.0 synopsis: authenticate support for apiary web framework. description: example: <https://github.com/philopon/apiary/blob/master/examples/auth.hs>@@ -20,8 +20,8 @@ exposed-modules: Web.Apiary.Authenticate other-modules: Web.Apiary.Authenticate.Internal build-depends: base >=4.6 && <4.8- , apiary >=0.7 && <0.8- , apiary-clientsession >=0.7 && <0.8+ , apiary >=0.8 && <0.9+ , apiary-clientsession >=0.8 && <0.9 , authenticate >=1.3 && <1.4 , http-client >=0.3 && <0.4 , http-client-tls >=0.2 && <0.3@@ -32,7 +32,7 @@ , resourcet >=1.1 && <1.2 , http-types >=0.8 && <0.9 , blaze-builder >=0.3 && <0.4- , monad-control >=0.3 && <0.4+ , reflection >=1.4 && <1.5 hs-source-dirs: src ghc-options: -O2 -Wall
src/Web/Apiary/Authenticate.hs view
@@ -2,6 +2,7 @@ AuthConfig(..), Provider(..) , HasAuth , withAuth, withAuthWith+ , authHandler -- * filter , authorized -- * action
src/Web/Apiary/Authenticate/Internal.hs view
@@ -8,13 +8,13 @@ module Web.Apiary.Authenticate.Internal where -import Control.Monad.Trans.Control import Control.Monad.Trans.Resource import Control.Applicative import Data.Maybe import Data.List import Data.Default.Class+import Data.Reflection import qualified Data.ByteString.Char8 as S import qualified Data.Text as T import qualified Data.Text.Encoding as T@@ -60,24 +60,21 @@ , config :: AuthConfig } -type HasAuth = (?webApiaryAuthenticateAuth :: Auth, HasSession)+type HasAuth = (Given Auth, HasSession) -withAuth :: HasSession => AuthConfig -> (HasAuth => Apiary c ()) -> Apiary c ()+withAuth :: HasSession => AuthConfig -> (HasAuth => IO a) -> IO a withAuth = withAuthWith tlsManagerSettings -withAuthWith :: HasSession => Client.ManagerSettings -> AuthConfig- -> (HasAuth => Apiary c ()) -> Apiary c ()-withAuthWith s conf m = withManager s $ \mgr -> do- let ?webApiaryAuthenticateAuth = Auth mgr conf- addAuthHandler (Auth mgr conf) m---withManager :: MonadBaseControl IO m => Client.ManagerSettings -> (Client.Manager -> m a) -> m a-withManager conf f = control $ \run -> Client.withManager conf (\mgr -> run $ f mgr)+withAuthWith :: HasSession => Client.ManagerSettings+ -> AuthConfig -> (HasAuth => IO a) -> IO a+withAuthWith s conf m = Client.withManager s $ \mgr -> + give (Auth mgr conf) m -addAuthHandler :: HasSession => Auth -> Apiary c () -> Apiary c ()-addAuthHandler Auth{..} m = m >> retH >> mapM_ (uncurry go) (providers config)+-- | default auth handlers. since 0.8.0.0.+authHandler :: (Functor n, MonadIO n, HasAuth) => ApiaryT c n m ()+authHandler = retH >> mapM_ (uncurry go) (providers config) where+ Auth{..} = given pfxPath p = function (\_ r -> if p `isPrefixOf` Wai.pathInfo r then Just SNil else Nothing) retH = pfxPath (authPrefix config ++ authReturnToPath config) . stdMethod GET . action $@@ -92,35 +89,35 @@ -- | filter which check whether logged in or not, and get id. since 0.7.0.0. authorized :: HasAuth => Apiary (Snoc as S.ByteString) a -> Apiary as a-authorized = session (authSessionName $ config ?webApiaryAuthenticateAuth) (pOne pByteString)+authorized = session (authSessionName $ config given) (pOne pByteString) -- | get auth config. since 0.7.0.0.-authConfig :: HasAuth => Action AuthConfig-authConfig = return (config ?webApiaryAuthenticateAuth)+authConfig :: (Monad m, HasAuth) => ActionT m AuthConfig+authConfig = return (config given) -- | get providers. since 0.7.0.0.-authProviders :: HasAuth => Action [(T.Text, Provider)]+authProviders :: (Monad m, HasAuth) => ActionT m [(T.Text, Provider)] authProviders = providers <$> authConfig -- | get authenticate routes: (title, route). since 0.7.0.0.-authRoutes :: HasAuth => Action [(T.Text, S.ByteString)]+authRoutes :: (Monad m, HasAuth) => ActionT m [(T.Text, S.ByteString)] authRoutes = do conf <- authConfig return . map (\(k,_) -> (k, toByteString . HTTP.encodePathSegments $ authPrefix conf ++ [k])) $ providers conf -- | delete session. since 0.7.0.0.-authLogout :: HasAuth => Action ()+authLogout :: (Monad m, HasAuth) => ActionT m () authLogout = do conf <- authConfig deleteCookie (authSessionName conf) -authAction :: Client.Manager -> T.Text -> T.Text- -> Maybe T.Text -> [(T.Text, T.Text)] -> Action ()+authAction :: MonadIO m => Client.Manager -> T.Text -> T.Text+ -> Maybe T.Text -> [(T.Text, T.Text)] -> ActionT m () authAction mgr uri returnTo realm param = do fw <- liftIO . runResourceT $ getForwardUrl uri returnTo realm param mgr redirect $ T.encodeUtf8 fw -returnAction :: HasSession => Client.Manager -> S.ByteString -> S.ByteString -> Action ()+returnAction :: (MonadIO m, HasSession) => Client.Manager -> S.ByteString -> S.ByteString -> ActionT m () returnAction mgr key to = do q <- Wai.queryString <$> getRequest r <- liftIO . runResourceT $ authenticateClaimed (mapMaybe queryElem q) mgr