Fix build with current Guix

This commit is contained in:
Saku Laesvuori 2026-08-05 16:35:54 +03:00
parent 5b73e9d888
commit dcd884b2a0
Signed by: slaesvuo
GPG Key ID: 257D284A2A1D3A32
7 changed files with 423 additions and 512 deletions

File diff suppressed because it is too large Load Diff

View File

@ -37,6 +37,7 @@ executable datarekisteri-backend
smtp-mail, smtp-mail,
text, text,
time, time,
unliftio-core,
containers, containers,
wai, wai,
warp, warp,

View File

@ -13,6 +13,7 @@ import "cryptonite" Crypto.Random (MonadRandom(..))
import qualified "base64" Data.ByteString.Base64 as B64 import qualified "base64" Data.ByteString.Base64 as B64
import Control.Monad.Except (catchError) import Control.Monad.Except (catchError)
import Control.Monad.IO.Unlift (MonadUnliftIO)
import Control.Monad.Logger (runStderrLoggingT) import Control.Monad.Logger (runStderrLoggingT)
import Data.Default (def) import Data.Default (def)
import Data.Map (findWithDefault) import Data.Map (findWithDefault)
@ -76,7 +77,7 @@ runMigrations dbUrl = do
callProcess "dbmate" ["--url", toString dbUrl, "--migrations-dir", migrationsPath, "up"] callProcess "dbmate" ["--url", toString dbUrl, "--migrations-dir", migrationsPath, "up"]
serverApp :: Config -> IO Application serverApp :: Config -> IO Application
serverApp config = scottyAppT (runAPIM config) $ do serverApp config = scottyAppT defaultOptions (runAPIM config) $ do
middleware $ gzip def middleware $ gzip def
middleware $ cors $ const $ Just CorsResourcePolicy middleware $ cors $ const $ Just CorsResourcePolicy
{ corsOrigins = Nothing -- all { corsOrigins = Nothing -- all
@ -109,7 +110,7 @@ parseBearer auth = do
guard $ toLower authType == "bearer" guard $ toLower authType == "bearer"
pure $ BearerToken authData pure $ BearerToken authData
authBearer :: Maybe BearerToken -> ActionT LText APIM a -> ActionT LText APIM a authBearer :: Maybe BearerToken -> ActionT APIM a -> ActionT APIM a
authBearer Nothing m = m authBearer Nothing m = m
authBearer (Just (BearerToken bearer)) m = do authBearer (Just (BearerToken bearer)) m = do
let getUserPermissions = do let getUserPermissions = do
@ -129,14 +130,14 @@ parseBasic txt = do
[authType, authData] <- words <$> txt [authType, authData] <- words <$> txt
guard $ toLower authType == "basic" guard $ toLower authType == "basic"
(email, password) <- rightToMaybe $ (email, password) <- rightToMaybe $
breakOn' ":" . decodeUtf8 <$> B64.decodeBase64 (encodeUtf8 authData) breakOn' ":" . decodeUtf8 <$> B64.decodeBase64Untyped (encodeUtf8 authData)
emailAddress <- toEmail email emailAddress <- toEmail email
pure $ BasicAuth {..} pure $ BasicAuth {..}
where breakOn' x xs = let (fst, snd) = breakOn x xs where breakOn' x xs = let (fst, snd) = breakOn x xs
in (fst, fromMaybe "" $ stripPrefix x snd) in (fst, fromMaybe "" $ stripPrefix x snd)
authBasic :: Maybe BasicAuth -> ActionT LText APIM a -> ActionT LText APIM a authBasic :: Maybe BasicAuth -> ActionT APIM a -> ActionT APIM a
authBasic Nothing m = m authBasic Nothing m = m
authBasic (Just basic) m = do authBasic (Just basic) m = do
DBUser {..} <- verifyBasic basic DBUser {..} <- verifyBasic basic
@ -148,7 +149,7 @@ authBasic (Just basic) m = do
, statePermissions = permissions , statePermissions = permissions
} }
verifyBasic :: BasicAuth -> ActionT LText APIM (DBUser APIM) verifyBasic :: BasicAuth -> ActionT APIM (DBUser APIM)
verifyBasic BasicAuth {..} = do verifyBasic BasicAuth {..} = do
maybeUser <- lift $ dbGetUserByEmail emailAddress maybeUser <- lift $ dbGetUserByEmail emailAddress
let unauthorized = do let unauthorized = do
@ -162,7 +163,7 @@ verifyBasic BasicAuth {..} = do
pure user pure user
newtype APIM a = APIM (ReaderT RequestState IO a) newtype APIM a = APIM (ReaderT RequestState IO a)
deriving (Functor, Applicative, Monad, MonadIO, MonadReader RequestState) deriving (Functor, Applicative, Monad, MonadIO, MonadReader RequestState, MonadUnliftIO)
data RequestState = RequestState data RequestState = RequestState
{ stateCurrentUser :: Maybe UserID { stateCurrentUser :: Maybe UserID

View File

@ -22,6 +22,7 @@ import Relude hiding (Undefined, get)
import "cryptonite" Crypto.Random (getRandomBytes, MonadRandom) import "cryptonite" Crypto.Random (getRandomBytes, MonadRandom)
import qualified "base64" Data.ByteString.Base64 as B64 import qualified "base64" Data.ByteString.Base64 as B64
import qualified "base64" Data.Base64.Types as B64
import Control.Monad.Except (MonadError, throwError, catchError) import Control.Monad.Except (MonadError, throwError, catchError)
import Data.Morpheus.Server (deriveApp, runApp) import Data.Morpheus.Server (deriveApp, runApp)
@ -106,7 +107,7 @@ updateUser user args = do
newTokenArgsToData :: (MonadRandom m, MonadTime m, MonadPermissions m) => newTokenArgsToData :: (MonadRandom m, MonadTime m, MonadPermissions m) =>
NewTokenArgs -> UserID -> m NewTokenData NewTokenArgs -> UserID -> m NewTokenData
newTokenArgsToData NewTokenArgs {..} user = do newTokenArgsToData NewTokenArgs {..} user = do
tokenData <- B64.encodeBase64 <$> getRandomBytes 128 tokenData <- B64.extractBase64 . B64.encodeBase64 <$> getRandomBytes 128
issued <- currentTime issued <- currentTime
permissions <- maybe currentPermissions pure =<< maybe (pure Nothing) toPermissions permissions permissions <- maybe currentPermissions pure =<< maybe (pure Nothing) toPermissions permissions
let expires = Nothing let expires = Nothing

View File

@ -3,7 +3,7 @@
(url "https://git.savannah.gnu.org/git/guix.git") (url "https://git.savannah.gnu.org/git/guix.git")
(branch "master") (branch "master")
(commit (commit
"27ae140024b6d05506cdf0d9fd5b91c25466f295") "86813d5779253bb50002d79ab791eeda5a8b4729")
(introduction (introduction
(make-channel-introduction (make-channel-introduction
"9edb3f66fd807b096b48283debdcddccfea34bad" "9edb3f66fd807b096b48283debdcddccfea34bad"

View File

@ -35,6 +35,7 @@ module Datarekisteri.Core.Types
import Relude import Relude
import qualified "base64" Data.ByteString.Base64 as B64 import qualified "base64" Data.ByteString.Base64 as B64
import qualified "base64" Data.Base64.Types as B64
import Data.Aeson (ToJSON(..), FromJSON(..)) import Data.Aeson (ToJSON(..), FromJSON(..))
import Data.Char (isSpace) import Data.Char (isSpace)
@ -51,10 +52,10 @@ import Text.Email.Validate (EmailAddress, toByteString, validate, emailAddress)
import qualified Data.Text as T import qualified Data.Text as T
base64Encode :: ByteString -> Base64 base64Encode :: ByteString -> Base64
base64Encode = Base64 . B64.encodeBase64 base64Encode = Base64 . B64.extractBase64 . B64.encodeBase64
base64Decode :: Base64 -> Maybe ByteString base64Decode :: Base64 -> Maybe ByteString
base64Decode (Base64 x) = either (const Nothing) Just $ B64.decodeBase64 $ encodeUtf8 x base64Decode (Base64 x) = either (const Nothing) Just $ B64.decodeBase64Untyped $ encodeUtf8 x
toEmail :: Text -> Maybe Email toEmail :: Text -> Maybe Email
toEmail = fmap Email . emailAddress . encodeUtf8 toEmail = fmap Email . emailAddress . encodeUtf8

View File

@ -15,6 +15,7 @@ module Datarekisteri.Frontend.Auth where
import Relude import Relude
import qualified "base64" Data.ByteString.Base64 as B64 import qualified "base64" Data.ByteString.Base64 as B64
import qualified "base64" Data.Base64.Types as B64
import Yesod import Yesod
import Yesod.Auth import Yesod.Auth
@ -37,7 +38,7 @@ postLoginR authReq = do
<$> ireq textField "email" <*> ireq textField "password" <$> ireq textField "email" <*> ireq textField "password"
case res of case res of
FormSuccess auth -> do FormSuccess auth -> do
maybeAuth <- liftHandler $ authReq $ ("Basic " <> ) $ B64.encodeBase64 $ encodeUtf8 auth maybeAuth <- liftHandler $ authReq $ ("Basic " <> ) $ B64.extractBase64 $ B64.encodeBase64 $ encodeUtf8 auth
case maybeAuth of case maybeAuth of
Nothing -> loginErrorMessageI LoginR Msg.InvalidEmailPass -- invalid creds Nothing -> loginErrorMessageI LoginR Msg.InvalidEmailPass -- invalid creds
Just txt -> do Just txt -> do