packages feed

mariadb-haskell-0.1.0.0: validation/hs/Validation/ExternalAuthFixture.hs

-- | Client endpoints for the disposable PAM/Kerberos fixture. Keep these
-- shared benchmark paths independent of changes to correctness case inventories.
module Validation.ExternalAuthFixture (authConfig, pamConnect, gssapiConnect) where

import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import Database.MySQL.Base
import qualified Database.MySQL.TLS as TLS
import System.Environment

-- The manager supplies only fixture-specific variables. Ordinary validation
-- and benchmark credentials continue to target the managed host MariaDB.
authConfig :: B.ByteString -> IO ConnectInfo
authConfig user = do
    host <- getEnv "MB_AUTH_HOST"
    port <- read <$> getEnv "MB_AUTH_PORT"
    pure defaultConnectInfoMB4 {ciHost=host,ciPort=port,
        ciDatabase="mariadb_haskell_validation",ciUser=user,ciPassword=""}

pamConnect :: B.ByteString -> (DialogPrompt -> IO B.ByteString) -> IO MySQLConn
pamConnect user callback = do
    ci <- authConfig user
    ca <- getEnv "MB_AUTH_TLS_CA"
    params <- TLS.makeClientParams (TLS.CustomCAStore ca)
    TLS.connectWithAuthentication defaultConnectionOptions
        defaultAuthenticationOptions {authenticationDialog=Just callback} ci (params,"localhost")

gssapiConnect :: IO MySQLConn
gssapiConnect = do
    ci <- authConfig "mariadb_gssapi"
    principal <- BC.pack <$> getEnv "MB_AUTH_GSSAPI_PRINCIPAL"
    connectWithAuthentication defaultConnectionOptions
        defaultAuthenticationOptions {authenticationGSSAPIPrincipal=Just principal} ci