@@ -14,8 +14,12 @@ import Control.Monad.Except
1414import Control.Monad.IO.Unlift
1515import Control.Monad.Reader
1616import Control.Task.Scheduler
17+import Crypto.PubKey.RSA.Read
1718import Data.Aeson
1819import Data.ByteString
20+import qualified Data.ByteString as BS
21+import qualified Data.ByteString.Char8 as BSC
22+import qualified Data.ByteString.Lazy.Char8 as BSCL
1923import qualified Data.Csv as Csv
2024import Data.IORef
2125import Data.Map (Map)
@@ -30,9 +34,11 @@ import GHC.Generics
3034import GitHub hiding (Accept)
3135import GitHub.App.Auth
3236import GitHub.App.Request
37+import GitHub.Auth (Auth (OAuth))
3338import GitHub.Data.Name
3439import GitHub.Data.Webhooks.Events
3540import GitHub.Data.Webhooks.Payload
41+import Network.HTTP.Client.TLS (newTlsManager)
3642import Network.HTTP.Media.MediaType
3743import Network.Wai.Handler.Warp
3844import Servant
@@ -44,7 +50,7 @@ import Server.Schema
4450import Squeal.PostgreSQL
4551import System.IO
4652import Text.Blaze.Html
47−import UnliftIO.Exception (catch, throwIO, try)
53+import UnliftIO.Exception (catch, displayException, handleAny, throwIO, try)
4854
4955type API =
5056 "github-webhook"
@@ -161,6 +167,10 @@ runServer :: IO ()
161167runServer = do
162168 c@Config {..} <- getConfig
163169 print c
170+ pem <- BS.readFile appPkPemPath
171+ appPkPem <- case readRsaPem pem of
172+ Right k -> return k
173+ Left e -> error (show e)
164174 auth <- mkInstallationAuth (AppAuth appId appPkPem) installationId
165175 ts <- newIORef mempty
166176 pool <- createConnectionPool databseUrl 1 0.5 10
@@ -173,8 +183,6 @@ runServer = do
173183 serverData =
174184 ServerData
175185 { githubAppAuth = auth,
176− githubUserName = GithubUserName githubUsername,
177− githubAccessToken = GithubAccessToken personalAccessToken,
178186 tasks = ts,
179187 logger = cfilter ((logSeverity <=) . msgSeverity) richMessageAction,
180188 baseUrl = baseSiteUrl,
@@ -183,17 +191,21 @@ runServer = do
183191 repeatIfNotEmpty n f = f >>= \m -> do
184192 when (m == 0) $ liftIO $ threadDelay n
185193 repeatIfNotEmpty n f
194+ printingErrors =
195+ handleAny (logError . T.pack . displayException >=> const (return 0))
186196 _ <-
187197 forkIO . repeatIfNotEmpty (10 ^ (6 :: Int))
188198 . usingConnectionPool pool
189199 . (`runReaderT` serverData)
190200 . unApp
201+ . printingErrors
191202 $ runTasks @'[Build] 1
192203 _ <-
193204 forkIO . repeatIfNotEmpty (10 ^ (6 :: Int))
194205 . usingConnectionPool pool
195206 . (`runReaderT` serverData)
196207 . unApp
208+ . printingErrors
197209 $ runTasks @'[StatusUpdate] 5
198210 run port $ serveWithContext (Proxy @API) context $
199211 hoistServerWithContext
@@ -211,8 +223,6 @@ updateTasks ref path =
211223data ServerData m
212224 = ServerData
213225 { githubAppAuth :: !InstallationAuth,
214− githubUserName :: !GithubUserName,
215− githubAccessToken :: !GithubAccessToken,
216226 tasks :: IORef TasksConfig,
217227 logger :: LogAction m Message,
218228 baseUrl :: String,
@@ -227,10 +237,18 @@ gitPolyHubKey k = PolyGitHubKey (Servant.GitHub.Webhook.gitHubKey k)
227237instance HasContextEntry '[PolyGitHubKey] (GitHubKey result) where
228238 getContextEntry (PolyGitHubKey x :. _) = x
229239
230−instance MonadReader (ServerData n) m => GithubCloner m where
231− getGithubAccessToken = asks githubAccessToken
232−
233− getGithubUserName = asks githubUserName
240+instance (MonadReader (ServerData n) m, MonadIO m, MonadError ServerError m) => GithubCloner m where
241+ getGithubInstallationToken =
242+ either
243+ (\e -> throwError err500 {errBody = BSCL.pack . displayException $ e})
244+ return
245+ <=< runExceptT
246+ $ do
247+ iAuth <- asks githubAppAuth
248+ manager <- newTlsManager
249+ liftIO (obtainAccessToken manager iAuth) >>= either throwError return >>= \case
250+ OAuth token -> return $ InstallationToken (BSC.unpack token)
251+ _ -> throwError $ UserError "Not OAuth token. This should never happen."
234252
235253instance (MonadIO m, MonadReader (ServerData n) m) => AppRequestable m where
236254 appRequest req = do