From 4c23f197abe3d008ff4c66f66804f1cd441a3bbe Mon Sep 17 00:00:00 2001 From: Oleksandr Zhabenko <120258924+Oleksandr-Zhabenko@users.noreply.github.com> Date: Thu, 15 Aug 2024 15:21:39 +0300 Subject: [PATCH] Sanitise fake email domain #53 reintroduction (#56) * Update stack.yaml * Update stack.yaml * Changed yaml files to use string-random-0.1.4.3 * Changed yaml files to use text-2.0.2 * Changed yaml files * Changed yaml files * Changed yaml files * Changed yaml files * Changed yaml files * Changed package.yaml file * Changed yaml files * Added stack-lts-2* yaml files * Changed workflow yaml file * Changed workflow yaml file * Changed workflow yaml file * Changed workflow yaml file * Changed stack.yaml file * Changed stack.yaml file * Changed stack.yaml file * Changed stack.yaml file * Added commentary to test/AddressSpec.hs about the reason of random tests failures * Added commentary to test/AddressSpec.hs about the reason of random tests failures * Changed stack.yaml * Added missed data-files in fakedata.cabal * Accepted changes proposed by psibi * Accepted changes proposed by psibi for stack.yaml * Accepted changes proposed by psibi for stack.yaml * Fixed .github/workflows/tests.yml * Added dist/cabal-config-flags to .gitignore file * Removed unneeded binary files * Removed formatting and the commentary * Sanitized fake email domain * Added hyphen into domain name checker in test/TextSpec.hs * Changed domain name checker in test/TextSpec.hs --- ChangeLog.md | 6 ++++++ fakedata.cabal | 2 +- package.yaml | 2 +- src/Faker/Company.hs | 37 +++++++++++++++++++++---------------- test/TextSpec.hs | 2 +- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index a872916..783c9cd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,11 @@ # Changelog for fakedata +## 1.0.4 + +* Only generate fake email domains with alphanumeric characters and hyphens. [#53](https://github.com/fakedata-haskell/fakedata/pull/53) + +Updated according to jezen's pull-request with his permission. + ## 1.0.3 * [Make the `Fake` type synonym partially applied](https://github.com/fakedata-haskell/fakedata/pull/45) diff --git a/fakedata.cabal b/fakedata.cabal index abf65ac..971dff9 100644 --- a/fakedata.cabal +++ b/fakedata.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: fakedata -version: 1.0.3 +version: 1.0.4 synopsis: Library for producing fake data description: Please see the README on GitHub at category: Random, Fake, FakeData diff --git a/package.yaml b/package.yaml index db1f00f..98cf846 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: fakedata -version: 1.0.3 +version: 1.0.4 github: "psibi/fakedata" license: BSD3 author: "Sibi Prabakaran" diff --git a/src/Faker/Company.hs b/src/Faker/Company.hs index f0a7a9c..d71a2b5 100644 --- a/src/Faker/Company.hs +++ b/src/Faker/Company.hs @@ -17,7 +17,8 @@ module Faker.Company ) where import Data.Monoid ((<>)) -import Data.Text +import Data.Text (Text) +import qualified Data.Text as T import qualified Data.Vector as V import Faker import Faker.Internal @@ -44,7 +45,7 @@ bs = Fake (\settings -> do vec :: V.Vector (V.Vector Text) <- companyBsProvider settings - let item :: V.Vector (IO Text) = V.map (\v -> rvec settings v) vec + let item :: V.Vector (IO Text) = V.map (rvec settings) vec item' :: IO (V.Vector Text) = sequence item items <- item' let txt = V.foldl1' (\a b -> a <> " " <> b) items @@ -72,27 +73,31 @@ domain :: Fake Text domain = do suffix <- F.domainSuffix companyName <- name - pure $ fixupName companyName <> "." <> suffix + pure $ sanitise companyName <> "." <> suffix + where + -- Replaces spaces with hyphens and filters out anything that isn't an + -- alphanumeric character or a hyphen, so the domain has a better chance of + -- conforming to RFC 1035. + -- + -- See: https://datatracker.ietf.org/doc/html/rfc1035#section-2.3.1 + sanitise :: Text -> Text + sanitise = T.filter (\c -> isAlphaNum c || c == '-') . T.replace " " "-" -- | Generates an email like "jappie_klooster@crazychairauction.com" -- -- @since 0.8.1 --- email :: Fake Text email = do humanName <- F.name number <- F.fromRange @Int (0, 999999999) -- reasonable uniqueness domainName <- domain let numText :: Text - numText = pack $ show number - pure $ fixupName humanName <> "-" <> numText <> "@" <> domainName - --- | Ensures the spaces are replaced by "_", --- and no special characters are in the name. --- So "Elizabeth Warder!" becomes "Elizabeth_Warder". --- Any fancy symbols such as "!@#$" etc are filtered out. --- --- @since 0.8.1 --- -fixupName :: Text -> Text -fixupName = Data.Text.filter (\c -> isAlphaNum c || c == '_') . replace " " "_" + numText = T.pack $ show number + pure $ sanitise humanName <> "-" <> numText <> "@" <> domainName + where + -- Ensures the spaces are replaced by "_", + -- and no special characters are in the name. + -- So "Elizabeth Warder!" becomes "Elizabeth_Warder". + -- Any fancy symbols such as "!@#$" etc are filtered out. + sanitise :: Text -> Text + sanitise = T.filter (\c -> isAlphaNum c || c == '_') . T.replace " " "_" diff --git a/test/TextSpec.hs b/test/TextSpec.hs index 55f5465..cef19f5 100644 --- a/test/TextSpec.hs +++ b/test/TextSpec.hs @@ -213,7 +213,7 @@ fakeQuickcheck f = do f isDomain :: Text -> Bool -isDomain = (=~ "^[A-Za-z_]+\\.[a-z]{1,4}$") . T.unpack +isDomain = (=~ "^[A-Za-z]{1,}[A-Za-z-]{0,}\\.[a-z]{1,4}$") . T.unpack -- Added to possible domain name also a hyphen inside. According to https://stackoverflow.com/questions/3697202/including-a-hyphen-in-a-regex-character-bracket this should be sufficient. Removed underscore as a possible symbol according to: https://datatracker.ietf.org/doc/html/rfc1035#section-2.3.1 Added check for the first letter character in the domain name. isName :: Text -> Bool isName = (=~ "^[A-Za-z_]+$") . T.unpack