atlassian-connect-core 0.8.0.1 → 0.8.1.0
raw patch · 4 files changed
+53/−4 lines, 4 filesdep ~jwt
Dependency ranges changed: jwt
Files
- atlassian-connect-core.cabal +2/−2
- src/Snap/AtlassianConnect.hs +3/−0
- src/Snap/AtlassianConnect/QueryStringHash.hs +44/−2
- src/Snap/Helpers.hs +4/−0
atlassian-connect-core.cabal view
@@ -10,7 +10,7 @@ -- PVP summary: +-+------- breaking API changes -- | | +----- non-breaking API additions -- | | | +--- code changes with no API change-version: 0.8.0.1+version: 0.8.1.0 -- A short (one-line) description of the package. synopsis: Atlassian Connect snaplet for the Snap Framework and helper code.@@ -95,7 +95,7 @@ -- Other library packages from which modules are imported. build-depends: base >=4.7 && < 5 , atlassian-connect-descriptor >= 0.4.5- , jwt >= 0.6+ , jwt >= 0.6 && < 0.8 , aeson >= 0.7.0.3 , bytestring >= 0.9 , base64-bytestring == 1.0.*
src/Snap/AtlassianConnect.hs view
@@ -50,6 +50,8 @@ , Tenant(..) , TenantKey , TenantWithUser+ -- * QSH+ , generateQSH -- * Page Tokens , PageToken(..) -- TODO make it so that you can query the token but nothing else , generateToken@@ -75,4 +77,5 @@ import Snap.AtlassianConnect.Routes import Snap.AtlassianConnect.Tenant import Snap.AtlassianConnect.TimeUnits+import Snap.AtlassianConnect.QueryStringHash (generateQSH)
src/Snap/AtlassianConnect/QueryStringHash.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE OverloadedStrings #-} module Snap.AtlassianConnect.QueryStringHash ( createQueryStringHash+ , generateQSH , module Network.HTTP.Types ) where @@ -15,12 +16,53 @@ import Data.Maybe import Data.Monoid import Data.Ord-import qualified Data.Text as T-import qualified Data.Text.Encoding as TE+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE import Network.HTTP.Types import Network.URI+import qualified Snap.Helpers as SH+import qualified Snap.Core as SC+import qualified Snap.AtlassianConnect.Data as AC+import Control.Monad.Trans.Class (lift)+import Control.Monad.Trans.Except +generateQSH :: (SC.MonadSnap m, AC.HasConnect m) => m (Either String T.Text)+generateQSH = runExceptT $ do+ connect <- lift $ AC.getConnect+ request <- lift $ SC.getRequest+ let connectBaseUrl = AC.connectBaseUrl connect+ incomingRequestUrl <- ExceptT $ getRequestUri connectBaseUrl+ let fullUrl = T.pack $ uriToString id incomingRequestUrl ""+ let rawMethod = SC.rqMethod $ request+ method <- except . SH.m2e (couldNotConvertMethod ++ (show rawMethod)) . convertMethod $ rawMethod+ except . SH.m2e qshGenerationFailed $ createQueryStringHash method connectBaseUrl fullUrl+ where+ couldNotConvertMethod = "Could not convert the incoming request method: "+ qshGenerationFailed = "Failed to generate a QSH for the current url" +getRequestUri :: SC.MonadSnap m => URI -> m (Either String URI)+getRequestUri connectBaseUrl = runExceptT $ do+ request <- lift $ SC.getRequest+ let rawRequestUri = B.unpack . SC.rqURI $ request+ temporaryUri <- except . SH.m2e (couldNotParseUrl ++ rawRequestUri) . parseURI $ "https://example.com" ++ rawRequestUri+ return $ temporaryUri+ { uriScheme = uriScheme connectBaseUrl+ , uriAuthority = uriAuthority connectBaseUrl+ }+ where+ couldNotParseUrl = "Could not parse the current URL that the App is processing: "++convertMethod :: SC.Method -> Maybe StdMethod+convertMethod SC.GET = Just GET+convertMethod SC.HEAD = Just HEAD+convertMethod SC.POST = Just POST+convertMethod SC.PUT = Just PUT+convertMethod SC.DELETE = Just DELETE+convertMethod SC.TRACE = Just TRACE+convertMethod SC.OPTIONS = Just OPTIONS+convertMethod SC.CONNECT = Just CONNECT+convertMethod SC.PATCH = Just PATCH+convertMethod _ = Nothing -- $setup -- >>> import Data.Maybe -- >>> import Data.Text
src/Snap/Helpers.hs view
@@ -21,6 +21,7 @@ , respondWithErrors -- Write Aeson into a response , writeJson+ , m2e ) where import Data.Aeson@@ -68,3 +69,6 @@ } deriving (Show, Generic) instance ToJSON ErrorResponse++m2e :: e -> Maybe a -> Either e a+m2e e = maybe (Left e) Right