@@ -26,6 +26,7 @@ import Hasql.Pool qualified as Pool
2626import Hasql.Pool.Config qualified as Pool
2727import Network.URI (parseURI )
2828import Servant.API qualified as Servant
29+ import Servant.Client qualified as ServantClient
2930import System.Environment (lookupEnv )
3031import System.Exit
3132import System.Log.FastLogger qualified as FL
@@ -34,6 +35,9 @@ import System.Log.Raven.Transport.HttpConduit qualified as Sentry
3435import System.Log.Raven.Types qualified as Sentry
3536import Unison.Runtime.Interface as RT
3637import Data.Time.Clock qualified as Time
38+ import Network.HTTP.Client.TLS qualified as TLS
39+ import Network.HTTP.Client qualified as HTTPClient
40+ import Vault qualified
3741
3842withEnv :: (Env () -> IO a ) -> IO a
3943withEnv action = do
@@ -114,6 +118,31 @@ withEnv action = do
114118 pgConnectionPool <- Pool. acquire pgSettings
115119 timeCache <- FL. newTimeCache FL. simpleTimeFormat -- E.g. 05/Sep/2023:13:23:56 -0700
116120 sandboxedRuntime <- RT. startRuntime True RT. Persistent " share"
121+
122+ -- Vault setup
123+ unproxiedHttpClient <- TLS. newTlsManager
124+ vaultHost <- fromEnv " VAULT_HOST" parseBaseUrl
125+ userSecretsVaultMount <- fromEnv " USER_SECRETS_VAULT_MOUNT" ((fmap . fmap ) Vault. SecretMount . nonEmptyTextParser " USER_SECRETS_VAULT_MOUNT" )
126+ shareVaultToken <- fromEnv " VAULT_TOKEN" ((fmap . fmap ) Vault. VaultToken . nonEmptyTextParser " VAULT_TOKEN" )
127+ let vaultClientEnv = ServantClient. mkClientEnv unproxiedHttpClient vaultHost
128+
129+
130+
131+ proxiedHttpClient <- do
132+ if Deployment. onLocal
133+ then TLS. newTlsManager
134+ else do
135+ httpProxyHost <- fromEnv " SHARE_PROXY_HOST" ((fmap . fmap ) Text. encodeUtf8 . nonEmptyTextParser " SHARE_PROXY_HOST" )
136+ httpProxyPort <- fromEnv " SHARE_PROXY_PORT" (pure . maybeToEither " Invalid SHARE_PROXY_PORT" . readMaybe)
137+
138+ -- http proxy setup
139+ let proxyOverride = HTTPClient. useProxy (HTTPClient. Proxy {HTTPClient. proxyHost = httpProxyHost, HTTPClient. proxyPort = httpProxyPort})
140+ let proxiedManagerSettings =
141+ TLS. tlsManagerSettings
142+ & HTTPClient. managerSetProxy proxyOverride
143+ TLS. newTlsManagerWith proxiedManagerSettings
144+
145+ -- Logging setup
117146 let ctx = ()
118147 -- We use a zero-width-space to separate log-lines on ingestion, this allows us to use newlines for
119148 -- formatting, but without affecting log-grouping.
@@ -122,6 +151,15 @@ withEnv action = do
122151 action $ Env {logger = (logger . (\ msg -> zeroWidthSpace <> msg <> " \n " )), .. }
123152 where
124153 readPort p = pure $ maybeToRight " SHARE_PORT was not a number" (readMaybe p)
154+ nonEmptyTextParser :: Text -> String -> IO (Either String Text )
155+ nonEmptyTextParser varName = \ case
156+ " " -> pure . Left . Text. unpack $ " Expected a value for env var " <> varName <> " , but got an empty string"
157+ str -> pure . Right $ Text. pack str
158+
159+ parseBaseUrl :: String -> IO (Either String ServantClient. BaseUrl )
160+ parseBaseUrl str = do
161+ u <- ServantClient. parseBaseUrl str
162+ pure $ Right u
125163
126164fromEnv :: String -> (String -> IO (Either String a )) -> IO a
127165fromEnv var from = do
0 commit comments