From 283ad9c42107ff2e3f41cd10bcbee98da463e1fa Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Mon, 20 May 2019 23:24:18 +0200 Subject: [PATCH] Make modal-ids always css-compatible --- src/Utils/Frontend/Modal.hs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Utils/Frontend/Modal.hs b/src/Utils/Frontend/Modal.hs index dd83497ea..f5ddbf67a 100644 --- a/src/Utils/Frontend/Modal.hs +++ b/src/Utils/Frontend/Modal.hs @@ -11,8 +11,8 @@ import Utils.Route import Settings (widgetFile) -import Control.Monad.Random.Class (MonadRandom(..)) -import qualified Data.UUID as UUID +import Control.Monad.Random.Class (uniform) +import Control.Monad.Trans.Random (evalRandTIO) data Modal site = Modal @@ -47,8 +47,17 @@ msgModal :: WidgetT site IO () -> Either (SomeRoute site) (WidgetT site IO ()) -> WidgetT site IO () msgModal modalTrigger' modalContent = do - modalTriggerId <- Just . UUID.toText <$> liftIO getRandom - modalId <- Just . UUID.toText <$> liftIO getRandom + let + randomIdentifier :: MonadIO m => m Text + -- ^ Generates valid CSS-Identifiers with roughly 128 bits of entropy + -- + -- See https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + randomIdentifier = fmap pack . evalRandTIO $ do + prefix <- uniform $ ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] + suffix <- replicateM 21 . uniform $ ['a'..'z'] ++ ['A'..'Z'] + return $ prefix : suffix + modalTriggerId <- Just <$> randomIdentifier + modalId <- Just <$> randomIdentifier customModal Modal{..} where modalTrigger mRoute triggerId = $(widgetFile "widgets/modal/trigger")