yesod-auth-oauth2 0.7.0.0 → 0.7.0.1
raw patch · 3 files changed
+130/−32 lines, 3 filesdep +transformersdep ~aeson-prettydep ~containersdep ~hspecPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: transformers
Dependency ranges changed: aeson-pretty, containers, hspec, load-env, memory, microlens, safe-exceptions, unliftio, uri-bytestring, warp, yesod
API changes (from Hackage documentation)
- Network.OAuth.OAuth2.Compat: IdToken :: Text -> IdToken
- Network.OAuth.OAuth2.Compat: OAuth2Error :: Either Text a -> Maybe Text -> Maybe (URIRef Absolute) -> OAuth2Error a
- Network.OAuth.OAuth2.Compat: [errorDescription] :: OAuth2Error a -> Maybe Text
- Network.OAuth.OAuth2.Compat: [errorUri] :: OAuth2Error a -> Maybe (URIRef Absolute)
- Network.OAuth.OAuth2.Compat: [error] :: OAuth2Error a -> Either Text a
- Network.OAuth.OAuth2.Compat: [idtoken] :: IdToken -> Text
- Network.OAuth.OAuth2.Compat: accessTokenToParam :: AccessToken -> [(ByteString, ByteString)]
- Network.OAuth.OAuth2.Compat: accessTokenUrl :: OAuth2 -> ExchangeToken -> (URI, PostBody)
- Network.OAuth.OAuth2.Compat: accessTokenUrl' :: OAuth2 -> ExchangeToken -> Maybe Text -> (URI, PostBody)
- Network.OAuth.OAuth2.Compat: appendAccessToken :: URIRef a -> AccessToken -> URIRef a
- Network.OAuth.OAuth2.Compat: appendQueryParams :: [(ByteString, ByteString)] -> URIRef a -> URIRef a
- Network.OAuth.OAuth2.Compat: authGetBS2 :: Manager -> AccessToken -> URI -> IO (Either ByteString ByteString)
- Network.OAuth.OAuth2.Compat: authGetJSON :: FromJSON b => Manager -> AccessToken -> URI -> IO (Either ByteString b)
- Network.OAuth.OAuth2.Compat: authPostBS :: Manager -> AccessToken -> URI -> PostBody -> IO (Either ByteString ByteString)
- Network.OAuth.OAuth2.Compat: authPostBS2 :: Manager -> AccessToken -> URI -> PostBody -> IO (Either ByteString ByteString)
- Network.OAuth.OAuth2.Compat: authPostBS3 :: Manager -> AccessToken -> URI -> IO (Either ByteString ByteString)
- Network.OAuth.OAuth2.Compat: authPostJSON :: FromJSON b => Manager -> AccessToken -> URI -> PostBody -> IO (Either ByteString b)
- Network.OAuth.OAuth2.Compat: authRequest :: Request -> (Request -> Request) -> Manager -> IO (Either ByteString ByteString)
- Network.OAuth.OAuth2.Compat: doSimplePostRequest :: FromJSON err => Manager -> OAuth2 -> URI -> PostBody -> IO (OAuth2Result err ByteString)
- Network.OAuth.OAuth2.Compat: hostLens :: Lens' Request ByteString
- Network.OAuth.OAuth2.Compat: mkDecodeOAuth2Error :: ByteString -> String -> OAuth2Error err
- Network.OAuth.OAuth2.Compat: newtype IdToken
- Network.OAuth.OAuth2.Compat: parseIntFlexible :: Value -> Parser Int
- Network.OAuth.OAuth2.Compat: parseOAuth2Error :: FromJSON err => ByteString -> OAuth2Error err
- Network.OAuth.OAuth2.Compat: portLens :: Lens' Request Int
- Network.OAuth.OAuth2.Compat: refreshAccessToken :: Manager -> OAuth2 -> RefreshToken -> IO (OAuth2Result Errors OAuth2Token)
- Network.OAuth.OAuth2.Compat: refreshAccessToken2 :: Manager -> OAuth2 -> RefreshToken -> IO (OAuth2Result Errors OAuth2Token)
- Network.OAuth.OAuth2.Compat: refreshAccessTokenUrl :: OAuth2 -> RefreshToken -> (URI, PostBody)
- Network.OAuth.OAuth2.Compat: requestToUri :: Request -> URI
- Network.OAuth.OAuth2.Compat: type PostBody = [(ByteString, ByteString)]
- Network.OAuth.OAuth2.Compat: type QueryParams = [(ByteString, ByteString)]
- Network.OAuth.OAuth2.Compat: uriToRequest :: MonadThrow m => URI -> m Request
- Network.OAuth.OAuth2.Compat: type OAuth2Result err a = Either OAuth2Error err a
+ Network.OAuth.OAuth2.Compat: type OAuth2Result err a = Either (OAuth2Error err) a
- Yesod.Auth.OAuth2.Prelude: (.:) :: FromJSON a => Object -> Text -> Parser a
+ Yesod.Auth.OAuth2.Prelude: (.:) :: FromJSON a => Object -> Key -> Parser a
- Yesod.Auth.OAuth2.Prelude: (.:?) :: FromJSON a => Object -> Text -> Parser (Maybe a)
+ Yesod.Auth.OAuth2.Prelude: (.:?) :: FromJSON a => Object -> Key -> Parser (Maybe a)
- Yesod.Auth.OAuth2.Prelude: (.=) :: (KeyValue kv, ToJSON v) => Text -> v -> kv
+ Yesod.Auth.OAuth2.Prelude: (.=) :: (KeyValue kv, ToJSON v) => Key -> v -> kv
Files
- CHANGELOG.md +5/−1
- src/Network/OAuth/OAuth2/Compat.hs +111/−18
- yesod-auth-oauth2.cabal +14/−13
CHANGELOG.md view
@@ -1,6 +1,10 @@-## [_Unreleased_](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.0.0...main)+## [_Unreleased_](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.0.1...main) None++## [v0.7.0.1](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.0.0...v0.7.0.1)++- Support `hoauth-2.2` and `2.3` ## [v0.7.0.0](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.6.3.4...v0.7.0.0)
src/Network/OAuth/OAuth2/Compat.hs view
@@ -2,27 +2,34 @@ module Network.OAuth.OAuth2.Compat ( OAuth2(..)+ , OAuth2Result , authorizationUrl , fetchAccessToken , fetchAccessToken2+ , authGetBS++ -- * Re-exports , module Network.OAuth.OAuth2 ) where +import Data.ByteString.Lazy (ByteString)+import Data.Text (Text) import Network.HTTP.Conduit (Manager)-import Network.OAuth.OAuth2 hiding- (OAuth2(..), authorizationUrl, fetchAccessToken, fetchAccessToken2)+import Network.OAuth.OAuth2+ ( AccessToken(..)+ , ExchangeToken(..)+ , OAuth2Error+ , OAuth2Token(..)+ , RefreshToken(..)+ ) import qualified Network.OAuth.OAuth2 as OAuth2 import Network.OAuth.OAuth2.TokenRequest (Errors) import URI.ByteString -#if MIN_VERSION_hoauth2(2,0,0)-import Network.OAuth.OAuth2 (OAuth2(..))--getOAuth2 :: OAuth2 -> OAuth2-getOAuth2 = id--#else-import Data.Text (Text)+#if MIN_VERSION_hoauth2(2,2,0)+import Control.Monad.Trans.Except (ExceptT, runExceptT)+import Data.Maybe (fromMaybe)+#endif data OAuth2 = OAuth2 { oauth2ClientId :: Text@@ -32,30 +39,116 @@ , oauth2RedirectUri :: Maybe (URIRef Absolute) } +type OAuth2Result err a = Either (OAuth2Error err) a++authorizationUrl :: OAuth2 -> URI+authorizationUrl = OAuth2.authorizationUrl . getOAuth2++fetchAccessToken+ :: Manager+ -> OAuth2+ -> ExchangeToken+ -> IO (OAuth2Result Errors OAuth2Token)+fetchAccessToken = fetchAccessTokenBasic++fetchAccessToken2+ :: Manager+ -> OAuth2+ -> ExchangeToken+ -> IO (OAuth2Result Errors OAuth2Token)+fetchAccessToken2 = fetchAccessTokenPost++authGetBS :: Manager -> AccessToken -> URI -> IO (Either ByteString ByteString)+authGetBS m a u = runOAuth2 $ OAuth2.authGetBS m a u++-- Normalize the rename of record fields at hoauth2-2.0. Our type is the newer+-- names and we up-convert if hoauth2-1.x is in use. getClientSecret and+-- getRedirectUri handle the differences in hoauth2-2.2 and 2.3.++#if MIN_VERSION_hoauth2(2,0,0) getOAuth2 :: OAuth2 -> OAuth2.OAuth2 getOAuth2 o = OAuth2.OAuth2+ { OAuth2.oauth2ClientId = oauth2ClientId o+ , OAuth2.oauth2ClientSecret = getClientSecret $ oauth2ClientSecret o+ , OAuth2.oauth2AuthorizeEndpoint = oauth2AuthorizeEndpoint o+ , OAuth2.oauth2TokenEndpoint = oauth2TokenEndpoint o+ , OAuth2.oauth2RedirectUri = getRedirectUri $ oauth2RedirectUri o+ }+#else+getOAuth2 :: OAuth2 -> OAuth2.OAuth2+getOAuth2 o = OAuth2.OAuth2 { OAuth2.oauthClientId = oauth2ClientId o- , OAuth2.oauthClientSecret = oauth2ClientSecret o+ , OAuth2.oauthClientSecret = getClientSecret $ oauth2ClientSecret o , OAuth2.oauthOAuthorizeEndpoint = oauth2AuthorizeEndpoint o , OAuth2.oauthAccessTokenEndpoint = oauth2TokenEndpoint o- , OAuth2.oauthCallback = oauth2RedirectUri o+ , OAuth2.oauthCallback = getRedirectUri $ oauth2RedirectUri o }+#endif +-- hoauth2-2.2 made oauth2ClientSecret non-Maybe, after 2.0 had just made it+-- Maybe so we have to adjust, twice. TODO: change ours type to non-Maybe (major+-- bump) and reverse this to up-convert with Just in pre-2.2.++#if MIN_VERSION_hoauth2(2,2,0)+getClientSecret :: Maybe Text -> Text+getClientSecret =+ fromMaybe $ error "Cannot use OAuth2.oauth2ClientSecret with Nothing"+#else+getClientSecret :: Maybe Text -> Maybe Text+getClientSecret = id #endif -authorizationUrl :: OAuth2 -> URI-authorizationUrl = OAuth2.authorizationUrl . getOAuth2+-- hoauth2-2.3 then made oauth2RedirectUri non-Maybe too. We logically rely on+-- instantiating with Nothing at definition-time, then setting it to the+-- callback at use-time, which means we can't just change our type and invert+-- this shim; we'll have to do something much more pervasive to avoid this+-- fromMaybe. -fetchAccessToken+#if MIN_VERSION_hoauth2(2,3,0)+getRedirectUri :: Maybe (URIRef Absolute) -> (URIRef Absolute)+getRedirectUri =+ fromMaybe $ error "Cannot use OAuth2.oauth2RedirectUri with Nothing"+#else+getRedirectUri :: Maybe (URIRef Absolute) -> Maybe (URIRef Absolute)+getRedirectUri = id+#endif++-- hoauth-2.2 moved most IO-Either functions to ExceptT. This reverses that.++#if MIN_VERSION_hoauth2(2,2,0)+runOAuth2 :: ExceptT e m a -> m (Either e a)+runOAuth2 = runExceptT+#else+runOAuth2 :: IO (Either e a) -> IO (Either e a)+runOAuth2 = id+#endif++-- The fetchAccessToken functions grew a nicer interface in hoauth2-2.3. This+-- up-converts the older ones. We should update our code to use these functions+-- directly.++fetchAccessTokenBasic :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessToken m = OAuth2.fetchAccessToken m . getOAuth2+fetchAccessTokenBasic m o e = runOAuth2 $ f m (getOAuth2 o) e+ where+#if MIN_VERSION_hoauth2(2,3,0)+ f = OAuth2.fetchAccessTokenInternal OAuth2.ClientSecretBasic+#else+ f = OAuth2.fetchAccessToken+#endif -fetchAccessToken2+fetchAccessTokenPost :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessToken2 m = OAuth2.fetchAccessToken2 m . getOAuth2+fetchAccessTokenPost m o e = runOAuth2 $ f m (getOAuth2 o) e+ where+#if MIN_VERSION_hoauth2(2,3,0)+ f = OAuth2.fetchAccessTokenInternal OAuth2.ClientSecretPost+#else+ f = OAuth2.fetchAccessToken2+#endif
yesod-auth-oauth2.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.12 name: yesod-auth-oauth2-version: 0.7.0.0+version: 0.7.0.1 license: MIT license-file: LICENSE maintainer: engineering@freckle.com@@ -70,13 +70,14 @@ http-client >=0.4.0, http-conduit >=2.0, http-types >=0.8,- memory >=0.15.0,- microlens >=0.4.12.0,+ memory >=0.14.18,+ microlens >=0.4.10, mtl >=2.2.2,- safe-exceptions >=0.1.7.2,+ safe-exceptions >=0.1.7.0, text >=0.7,- unliftio >=0.2.20,- uri-bytestring >=0.3.3.1,+ transformers >=0.5.5.0,+ unliftio >=0.2.10,+ uri-bytestring >=0.3.2.1, yesod-auth >=1.6.0, yesod-core >=1.6.0 @@ -88,15 +89,15 @@ ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N build-depends: aeson >=0.6,- aeson-pretty >=0.8.9,+ aeson-pretty >=0.8.7, base >=4.9.0.0 && <5, bytestring >=0.9.1.4,- containers >=0.6.5.1,+ containers >=0.6.0.1, http-conduit >=2.0,- load-env >=0.2.1.0,+ load-env >=0.2.0.2, text >=0.7,- warp >=3.3.18,- yesod >=1.6.1.2,+ warp >=3.2.25,+ yesod >=1.6.0, yesod-auth >=1.6.0, yesod-auth-oauth2 -any @@ -115,6 +116,6 @@ ghc-options: -Wall build-depends: base >=4.9.0.0 && <5,- hspec >=2.7.10,- uri-bytestring >=0.3.3.1,+ hspec >=2.6.1,+ uri-bytestring >=0.3.2.1, yesod-auth-oauth2 -any