minio-hs 1.3.0 → 1.3.1
raw patch · 5 files changed
+62/−30 lines, 5 filesdep +connectiondep +http-client-tlsPVP ok
version bump matches the API change (PVP)
Dependencies added: connection, http-client-tls
API changes (from Hackage documentation)
+ Network.Minio: disableTLSCertValidation :: ConnectInfo -> ConnectInfo
+ Network.Minio: isConnectInfoSecure :: ConnectInfo -> Bool
Files
- CHANGELOG.md +5/−0
- examples/BucketExists.hs +5/−5
- minio-hs.cabal +10/−4
- src/Network/Minio.hs +2/−0
- src/Network/Minio/Data.hs +40/−21
CHANGELOG.md view
@@ -1,6 +1,11 @@ Changelog ========== +## Version 1.3.1++* Add TLS helpers to check if server uses TLS, and to disable+ certificate validation for easier testing (#121)+ ## Version 1.3.0 * Retry requests that timeout using full-jitter backoff (#119)
examples/BucketExists.hs view
@@ -17,11 +17,11 @@ -- limitations under the License. -- -{-# Language OverloadedStrings #-}-import Network.Minio+{-# LANGUAGE OverloadedStrings #-}+import Network.Minio -import Control.Monad.IO.Class (liftIO)-import Prelude+import Control.Monad.IO.Class (liftIO)+import Prelude -- | The following example uses minio's play server at -- https://play.min.io:9000. The endpoint and associated@@ -39,5 +39,5 @@ liftIO $ putStrLn $ "Does " ++ show bucket ++ " exist? - " ++ show foundBucket case res1 of- Left e -> putStrLn $ "bucketExists failed." ++ show e+ Left e -> putStrLn $ "bucketExists failed." ++ show e Right () -> return ()
minio-hs.cabal view
@@ -1,5 +1,5 @@ name: minio-hs-version: 1.3.0+version: 1.3.1 synopsis: A MinIO Haskell Library for Amazon S3 compatible cloud storage. description: The MinIO Haskell client library provides simple APIs to@@ -56,6 +56,7 @@ , case-insensitive >= 1.2 , conduit >= 1.3 , conduit-extra >= 1.3+ , connection , containers >= 0.5 , cryptonite >= 0.25 , cryptonite-conduit >= 0.2@@ -64,6 +65,7 @@ , exceptions , filepath >= 1.4 , http-client >= 0.5+ , http-client-tls , http-conduit >= 2.3 , http-types >= 0.12 , ini@@ -142,6 +144,7 @@ build-depends: base >= 4.7 && < 5 , minio-hs , protolude >= 0.1.6+ , QuickCheck , aeson , base64-bytestring , binary@@ -149,6 +152,7 @@ , case-insensitive , conduit , conduit-extra+ , connection , containers , cryptonite , cryptonite-conduit@@ -157,11 +161,11 @@ , exceptions , filepath , http-client+ , http-client-tls , http-conduit , http-types , ini , memory- , QuickCheck , raw-strings-qq >= 1 , resourcet , retry@@ -187,6 +191,7 @@ build-depends: base >= 4.7 && < 5 , minio-hs , protolude >= 0.1.6+ , QuickCheck , aeson , base64-bytestring , binary@@ -194,19 +199,20 @@ , case-insensitive , conduit , conduit-extra+ , connection , containers , cryptonite , cryptonite-conduit- , filepath , digest , directory , exceptions+ , filepath , http-client+ , http-client-tls , http-conduit , http-types , ini , memory- , QuickCheck , raw-strings-qq >= 1 , resourcet , retry
src/Network/Minio.hs view
@@ -39,6 +39,8 @@ , setRegion , setCreds , setCredsFrom+ , isConnectInfoSecure+ , disableTLSCertValidation , MinioConn , mkMinioConn
src/Network/Minio/Data.hs view
@@ -37,7 +37,9 @@ import qualified Data.Text.Encoding as TE import Data.Time (defaultTimeLocale, formatTime) import GHC.Show (Show (show))+import qualified Network.Connection as Conn import Network.HTTP.Client (defaultManagerSettings)+import qualified Network.HTTP.Client.TLS as TLS import qualified Network.HTTP.Conduit as NC import Network.HTTP.Types (ByteRange, Header, Method, Query, hRange)@@ -94,28 +96,30 @@ -- `IsString` instance to provide a URL, for example: -- -- > let c :: ConnectInfo = "https://play.min.io:9000"-data ConnectInfo = ConnectInfo {- connectHost :: Text- , connectPort :: Int- , connectAccessKey :: Text- , connectSecretKey :: Text- , connectIsSecure :: Bool- , connectRegion :: Region- , connectAutoDiscoverRegion :: Bool- } deriving (Eq, Show)-+data ConnectInfo =+ ConnectInfo { connectHost :: Text+ , connectPort :: Int+ , connectAccessKey :: Text+ , connectSecretKey :: Text+ , connectIsSecure :: Bool+ , connectRegion :: Region+ , connectAutoDiscoverRegion :: Bool+ , connectDisableTLSCertValidation :: Bool+ } deriving (Eq, Show) instance IsString ConnectInfo where- fromString str = let req = NC.parseRequest_ str- in ConnectInfo- { connectHost = TE.decodeUtf8 $ NC.host req- , connectPort = NC.port req- , connectAccessKey = ""- , connectSecretKey = ""- , connectIsSecure = NC.secure req- , connectRegion = ""- , connectAutoDiscoverRegion = True- }+ fromString str =+ let req = NC.parseRequest_ str+ in ConnectInfo+ { connectHost = TE.decodeUtf8 $ NC.host req+ , connectPort = NC.port req+ , connectAccessKey = ""+ , connectSecretKey = ""+ , connectIsSecure = NC.secure req+ , connectRegion = ""+ , connectAutoDiscoverRegion = True+ , connectDisableTLSCertValidation = False+ } -- | Contains access key and secret key to access object storage. data Credentials = Credentials { cAccessKey :: Text@@ -187,6 +191,18 @@ , connectAutoDiscoverRegion = False } +-- | Check if the connection to object storage server is secure+-- (i.e. uses TLS)+isConnectInfoSecure :: ConnectInfo -> Bool+isConnectInfoSecure = connectIsSecure++-- | Disable TLS certificate validation completely! This makes TLS+-- insecure! Use only for testing with self-signed or temporary+-- certificates. Note that this option has no effect, if you provide+-- your own Manager in `mkMinioConn`.+disableTLSCertValidation :: ConnectInfo -> ConnectInfo+disableTLSCertValidation c = c { connectDisableTLSCertValidation = True }+ getHostAddr :: ConnectInfo -> ByteString getHostAddr ci = if | port == 80 || port == 443 -> toS host | otherwise -> toS $@@ -955,7 +971,10 @@ -- object storage is accessed. connect :: ConnectInfo -> IO MinioConn connect ci = do- let settings | connectIsSecure ci = NC.tlsManagerSettings+ let settings | connectIsSecure ci && connectDisableTLSCertValidation ci =+ let badTlsSettings = Conn.TLSSettingsSimple True False False+ in TLS.mkManagerSettings badTlsSettings Nothing+ | connectIsSecure ci = NC.tlsManagerSettings | otherwise = defaultManagerSettings mgr <- NC.newManager settings mkMinioConn ci mgr