git.iko.soy/typeable/servant
on master help sign in
Merge pull request #1238 from roberth/redact-authorization-header

servant-client-core: Redact Authorization header

commite1039523ec1687d6fa3f6fcac5eba5dea37199f3 authorOleg Grenrus <oleg.grenrus@iki.fi> dateSat 14 Dec 2019, 22:22 (7 years ago) parent78cf24a13b21cb
4 files changed+47−1
changelog.d/pull1238+2 servant-client-core/servant-client-core.cabal+1 servant-client-core/src/Servant/Client/Core/Request.hs+25−1 servant-client-core/test/Servant/Client/Core/RequestSpec.hs+19
changelog.d/pull1238new file+2
@@ -0,0 +1,2 @@
1+synopsis: Redact the authorization header in Show and exceptions
2+prs: #1238
servant-client-core/servant-client-core.cabal+1
@@ -96,6 +96,7 @@ test-suite spec
9696 main-is: Spec.hs
9797 other-modules:
9898 Servant.Client.Core.Internal.BaseUrlSpec
99+ Servant.Client.Core.RequestSpec
99100
100101 -- Dependencies inherited from the library. No need to specify bounds.
101102 build-depends:
servant-client-core/src/Servant/Client/Core/Request.hs+25−1
@@ -64,8 +64,32 @@ data RequestF body path = Request
6464 , requestHeaders :: Seq.Seq Header
6565 , requestHttpVersion :: HttpVersion
6666 , requestMethod :: Method
67− } deriving (Generic, Typeable, Eq, Show, Functor, Foldable, Traversable)
67+ } deriving (Generic, Typeable, Eq, Functor, Foldable, Traversable)
6868
69+instance (Show a, Show b) =>
70+ Show (Servant.Client.Core.Request.RequestF a b) where
71+ showsPrec p req
72+ = showParen
73+ (p >= 11)
74+ ( showString "Request {requestPath = "
75+ . showsPrec 0 (requestPath req)
76+ . showString ", requestQueryString = "
77+ . showsPrec 0 (requestQueryString req)
78+ . showString ", requestBody = "
79+ . showsPrec 0 (requestBody req)
80+ . showString ", requestAccept = "
81+ . showsPrec 0 (requestAccept req)
82+ . showString ", requestHeaders = "
83+ . showsPrec 0 (redactSensitiveHeader <$> requestHeaders req))
84+ . showString ", requestHttpVersion = "
85+ . showsPrec 0 (requestHttpVersion req)
86+ . showString ", requestMethod = "
87+ . showsPrec 0 (requestMethod req)
88+ . showString "}"
89+ where
90+ redactSensitiveHeader :: Header -> Header
91+ redactSensitiveHeader ("Authorization", _) = ("Authorization", "<REDACTED>")
92+ redactSensitiveHeader h = h
6993instance Bifunctor RequestF where bimap = bimapDefault
7094instance Bifoldable RequestF where bifoldMap = bifoldMapDefault
7195instance Bitraversable RequestF where
servant-client-core/test/Servant/Client/Core/RequestSpec.hsnew file+19
@@ -0,0 +1,19 @@
1+{-# OPTIONS_GHC -fno-warn-orphans #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+module Servant.Client.Core.RequestSpec (spec) where
4+
5+
6+import Prelude ()
7+import Prelude.Compat
8+import Control.Monad
9+import Data.List (isInfixOf)
10+import Servant.Client.Core.Request
11+import Test.Hspec
12+
13+spec :: Spec
14+spec = do
15+ describe "Request" $ do
16+ describe "show" $ do
17+ it "redacts the authorization header" $ do
18+ let request = void $ defaultRequest { requestHeaders = pure ("authorization", "secret") }
19+ isInfixOf "secret" (show request) `shouldBe` False