From e2b6138bf6c797754f33f4533bd96633f0a885dd Mon Sep 17 00:00:00 2001 From: Alexandre Gomes Gaigalas Date: Sat, 18 Feb 2023 21:27:50 -0300 Subject: [PATCH] Add PublicDomainSuffix Rule - List will be auto-updated from https://publicsuffix.org/list/public_suffix_list.dat - Updated AbstractSearcher rules to be case insensitive - Updated PR creator bots - Docs and tests --- .../{update-tld.yaml => update-domains.yaml} | 15 +- bin/update-domain-suffixes | 77 + bin/{update-tld => update-domain-toplevel} | 0 bin/update-iso-codes | 2 +- data/domain/public-suffix/AC.php | 11 + data/domain/public-suffix/AD.php | 6 + data/domain/public-suffix/AE.php | 12 + data/domain/public-suffix/AERO.php | 91 + data/domain/public-suffix/AF.php | 10 + data/domain/public-suffix/AG.php | 10 + data/domain/public-suffix/AI.php | 9 + data/domain/public-suffix/AL.php | 11 + data/domain/public-suffix/AM.php | 10 + data/domain/public-suffix/AO.php | 11 + data/domain/public-suffix/AR.php | 19 + data/domain/public-suffix/ARPA.php | 11 + data/domain/public-suffix/AS.php | 6 + data/domain/public-suffix/AT.php | 10 + data/domain/public-suffix/AU.php | 38 + data/domain/public-suffix/AW.php | 6 + data/domain/public-suffix/AZ.php | 17 + data/domain/public-suffix/BA.php | 11 + data/domain/public-suffix/BB.php | 15 + data/domain/public-suffix/BE.php | 6 + data/domain/public-suffix/BF.php | 6 + data/domain/public-suffix/BG.php | 41 + data/domain/public-suffix/BH.php | 10 + data/domain/public-suffix/BI.php | 10 + data/domain/public-suffix/BJ.php | 25 + data/domain/public-suffix/BM.php | 10 + data/domain/public-suffix/BN.php | 10 + data/domain/public-suffix/BO.php | 46 + data/domain/public-suffix/BR.php | 173 ++ data/domain/public-suffix/BS.php | 10 + data/domain/public-suffix/BT.php | 10 + data/domain/public-suffix/BW.php | 7 + data/domain/public-suffix/BY.php | 9 + data/domain/public-suffix/BZ.php | 10 + data/domain/public-suffix/CA.php | 20 + data/domain/public-suffix/CD.php | 6 + data/domain/public-suffix/CI.php | 20 + data/domain/public-suffix/CK.php | 6 + data/domain/public-suffix/CL.php | 9 + data/domain/public-suffix/CM.php | 9 + data/domain/public-suffix/CN.php | 49 + data/domain/public-suffix/CO.php | 18 + data/domain/public-suffix/CR.php | 12 + data/domain/public-suffix/CU.php | 11 + data/domain/public-suffix/CV.php | 10 + data/domain/public-suffix/CW.php | 9 + data/domain/public-suffix/CX.php | 6 + data/domain/public-suffix/CY.php | 17 + data/domain/public-suffix/DM.php | 10 + data/domain/public-suffix/DO.php | 15 + data/domain/public-suffix/DZ.php | 15 + data/domain/public-suffix/EC.php | 17 + data/domain/public-suffix/EE.php | 15 + data/domain/public-suffix/EG.php | 14 + data/domain/public-suffix/ES.php | 10 + data/domain/public-suffix/ET.php | 13 + data/domain/public-suffix/FI.php | 6 + data/domain/public-suffix/FJ.php | 15 + data/domain/public-suffix/FM.php | 9 + data/domain/public-suffix/FR.php | 26 + data/domain/public-suffix/GD.php | 7 + data/domain/public-suffix/GE.php | 12 + data/domain/public-suffix/GG.php | 8 + data/domain/public-suffix/GH.php | 10 + data/domain/public-suffix/GI.php | 11 + data/domain/public-suffix/GL.php | 10 + data/domain/public-suffix/GN.php | 11 + data/domain/public-suffix/GP.php | 11 + data/domain/public-suffix/GR.php | 10 + data/domain/public-suffix/GT.php | 12 + data/domain/public-suffix/GU.php | 13 + data/domain/public-suffix/GY.php | 11 + data/domain/public-suffix/HK.php | 26 + data/domain/public-suffix/HN.php | 11 + data/domain/public-suffix/HR.php | 9 + data/domain/public-suffix/HT.php | 22 + data/domain/public-suffix/HU.php | 36 + data/domain/public-suffix/ID.php | 17 + data/domain/public-suffix/IE.php | 6 + data/domain/public-suffix/IL.php | 13 + data/domain/public-suffix/IM.php | 14 + data/domain/public-suffix/IN.php | 46 + data/domain/public-suffix/INT.php | 6 + data/domain/public-suffix/IO.php | 6 + data/domain/public-suffix/IQ.php | 11 + data/domain/public-suffix/IR.php | 14 + data/domain/public-suffix/IS.php | 11 + data/domain/public-suffix/IT.php | 411 ++++ data/domain/public-suffix/JE.php | 8 + data/domain/public-suffix/JO.php | 13 + data/domain/public-suffix/JP.php | 1795 +++++++++++++++++ data/domain/public-suffix/KE.php | 14 + data/domain/public-suffix/KG.php | 11 + data/domain/public-suffix/KI.php | 12 + data/domain/public-suffix/KM.php | 22 + data/domain/public-suffix/KN.php | 9 + data/domain/public-suffix/KP.php | 11 + data/domain/public-suffix/KR.php | 34 + data/domain/public-suffix/KW.php | 12 + data/domain/public-suffix/KY.php | 9 + data/domain/public-suffix/KZ.php | 11 + data/domain/public-suffix/LA.php | 13 + data/domain/public-suffix/LB.php | 10 + data/domain/public-suffix/LC.php | 11 + data/domain/public-suffix/LK.php | 20 + data/domain/public-suffix/LR.php | 10 + data/domain/public-suffix/LS.php | 14 + data/domain/public-suffix/LT.php | 6 + data/domain/public-suffix/LV.php | 14 + data/domain/public-suffix/LY.php | 14 + data/domain/public-suffix/MA.php | 11 + data/domain/public-suffix/MC.php | 7 + data/domain/public-suffix/ME.php | 13 + data/domain/public-suffix/MG.php | 14 + data/domain/public-suffix/MK.php | 12 + data/domain/public-suffix/ML.php | 12 + data/domain/public-suffix/MN.php | 8 + data/domain/public-suffix/MO.php | 10 + data/domain/public-suffix/MR.php | 6 + data/domain/public-suffix/MS.php | 10 + data/domain/public-suffix/MT.php | 9 + data/domain/public-suffix/MU.php | 12 + data/domain/public-suffix/MUSEUM.php | 551 +++++ data/domain/public-suffix/MV.php | 19 + data/domain/public-suffix/MW.php | 16 + data/domain/public-suffix/MX.php | 10 + data/domain/public-suffix/MY.php | 13 + data/domain/public-suffix/MZ.php | 13 + data/domain/public-suffix/NA.php | 22 + data/domain/public-suffix/NC.php | 7 + data/domain/public-suffix/NF.php | 15 + data/domain/public-suffix/NG.php | 15 + data/domain/public-suffix/NI.php | 19 + data/domain/public-suffix/NO.php | 758 +++++++ data/domain/public-suffix/NR.php | 12 + data/domain/public-suffix/NZ.php | 21 + data/domain/public-suffix/OM.php | 14 + data/domain/public-suffix/PA.php | 16 + data/domain/public-suffix/PE.php | 12 + data/domain/public-suffix/PF.php | 8 + data/domain/public-suffix/PH.php | 13 + data/domain/public-suffix/PK.php | 19 + data/domain/public-suffix/PL.php | 205 ++ data/domain/public-suffix/PN.php | 10 + data/domain/public-suffix/PR.php | 18 + data/domain/public-suffix/PRO.php | 16 + data/domain/public-suffix/PS.php | 12 + data/domain/public-suffix/PT.php | 13 + data/domain/public-suffix/PW.php | 11 + data/domain/public-suffix/PY.php | 12 + data/domain/public-suffix/QA.php | 13 + data/domain/public-suffix/RE.php | 8 + data/domain/public-suffix/RO.php | 16 + data/domain/public-suffix/RS.php | 11 + data/domain/public-suffix/RW.php | 12 + data/domain/public-suffix/SA.php | 13 + data/domain/public-suffix/SB.php | 10 + data/domain/public-suffix/SC.php | 10 + data/domain/public-suffix/SD.php | 13 + data/domain/public-suffix/SE.php | 44 + data/domain/public-suffix/SG.php | 11 + data/domain/public-suffix/SH.php | 10 + data/domain/public-suffix/SL.php | 10 + data/domain/public-suffix/SN.php | 12 + data/domain/public-suffix/SO.php | 11 + data/domain/public-suffix/SS.php | 13 + data/domain/public-suffix/ST.php | 16 + data/domain/public-suffix/SV.php | 10 + data/domain/public-suffix/SX.php | 6 + data/domain/public-suffix/SY.php | 11 + data/domain/public-suffix/SZ.php | 8 + data/domain/public-suffix/TH.php | 12 + data/domain/public-suffix/TJ.php | 20 + data/domain/public-suffix/TL.php | 6 + data/domain/public-suffix/TM.php | 13 + data/domain/public-suffix/TN.php | 18 + data/domain/public-suffix/TO.php | 11 + data/domain/public-suffix/TR.php | 28 + data/domain/public-suffix/TT.php | 22 + data/domain/public-suffix/TW.php | 18 + data/domain/public-suffix/TZ.php | 17 + data/domain/public-suffix/UA.php | 80 + data/domain/public-suffix/UG.php | 13 + data/domain/public-suffix/UK.php | 16 + data/domain/public-suffix/US.php | 234 +++ data/domain/public-suffix/UY.php | 11 + data/domain/public-suffix/UZ.php | 9 + data/domain/public-suffix/VC.php | 11 + data/domain/public-suffix/VE.php | 25 + data/domain/public-suffix/VI.php | 10 + data/domain/public-suffix/VN.php | 17 + data/domain/public-suffix/VU.php | 9 + data/domain/public-suffix/WS.php | 10 + data/domain/public-suffix/XN--4DBRK0CE.php | 9 + data/domain/public-suffix/XN--90A3AC.php | 11 + data/domain/public-suffix/XN--J6W193G.php | 11 + data/domain/public-suffix/XN--O3CW4H.php | 11 + data/domain/public-suffix/YE.php | 11 + data/domain/public-suffix/ZA.php | 23 + data/domain/public-suffix/ZM.php | 16 + data/domain/public-suffix/ZW.php | 10 + docs/rules/PublicDomainSuffix.md | 39 + docs/rules/Tld.md | 2 + .../PublicDomainSuffixException.php | 28 + library/Helpers/DomainInfo.php | 46 + library/Rules/AbstractSearcher.php | 14 +- library/Rules/CountryCode.php | 2 +- library/Rules/CurrencyCode.php | 2 +- library/Rules/PublicDomainSuffix.php | 37 + library/Rules/SubdivisionCode.php | 2 +- tests/unit/Rules/AbstractSearcherTest.php | 4 +- tests/unit/Rules/CurrencyCodeTest.php | 1 - tests/unit/Rules/PublicDomainSuffixTest.php | 50 + 217 files changed, 7201 insertions(+), 16 deletions(-) rename .github/workflows/{update-tld.yaml => update-domains.yaml} (64%) create mode 100755 bin/update-domain-suffixes rename bin/{update-tld => update-domain-toplevel} (100%) create mode 100644 data/domain/public-suffix/AC.php create mode 100644 data/domain/public-suffix/AD.php create mode 100644 data/domain/public-suffix/AE.php create mode 100644 data/domain/public-suffix/AERO.php create mode 100644 data/domain/public-suffix/AF.php create mode 100644 data/domain/public-suffix/AG.php create mode 100644 data/domain/public-suffix/AI.php create mode 100644 data/domain/public-suffix/AL.php create mode 100644 data/domain/public-suffix/AM.php create mode 100644 data/domain/public-suffix/AO.php create mode 100644 data/domain/public-suffix/AR.php create mode 100644 data/domain/public-suffix/ARPA.php create mode 100644 data/domain/public-suffix/AS.php create mode 100644 data/domain/public-suffix/AT.php create mode 100644 data/domain/public-suffix/AU.php create mode 100644 data/domain/public-suffix/AW.php create mode 100644 data/domain/public-suffix/AZ.php create mode 100644 data/domain/public-suffix/BA.php create mode 100644 data/domain/public-suffix/BB.php create mode 100644 data/domain/public-suffix/BE.php create mode 100644 data/domain/public-suffix/BF.php create mode 100644 data/domain/public-suffix/BG.php create mode 100644 data/domain/public-suffix/BH.php create mode 100644 data/domain/public-suffix/BI.php create mode 100644 data/domain/public-suffix/BJ.php create mode 100644 data/domain/public-suffix/BM.php create mode 100644 data/domain/public-suffix/BN.php create mode 100644 data/domain/public-suffix/BO.php create mode 100644 data/domain/public-suffix/BR.php create mode 100644 data/domain/public-suffix/BS.php create mode 100644 data/domain/public-suffix/BT.php create mode 100644 data/domain/public-suffix/BW.php create mode 100644 data/domain/public-suffix/BY.php create mode 100644 data/domain/public-suffix/BZ.php create mode 100644 data/domain/public-suffix/CA.php create mode 100644 data/domain/public-suffix/CD.php create mode 100644 data/domain/public-suffix/CI.php create mode 100644 data/domain/public-suffix/CK.php create mode 100644 data/domain/public-suffix/CL.php create mode 100644 data/domain/public-suffix/CM.php create mode 100644 data/domain/public-suffix/CN.php create mode 100644 data/domain/public-suffix/CO.php create mode 100644 data/domain/public-suffix/CR.php create mode 100644 data/domain/public-suffix/CU.php create mode 100644 data/domain/public-suffix/CV.php create mode 100644 data/domain/public-suffix/CW.php create mode 100644 data/domain/public-suffix/CX.php create mode 100644 data/domain/public-suffix/CY.php create mode 100644 data/domain/public-suffix/DM.php create mode 100644 data/domain/public-suffix/DO.php create mode 100644 data/domain/public-suffix/DZ.php create mode 100644 data/domain/public-suffix/EC.php create mode 100644 data/domain/public-suffix/EE.php create mode 100644 data/domain/public-suffix/EG.php create mode 100644 data/domain/public-suffix/ES.php create mode 100644 data/domain/public-suffix/ET.php create mode 100644 data/domain/public-suffix/FI.php create mode 100644 data/domain/public-suffix/FJ.php create mode 100644 data/domain/public-suffix/FM.php create mode 100644 data/domain/public-suffix/FR.php create mode 100644 data/domain/public-suffix/GD.php create mode 100644 data/domain/public-suffix/GE.php create mode 100644 data/domain/public-suffix/GG.php create mode 100644 data/domain/public-suffix/GH.php create mode 100644 data/domain/public-suffix/GI.php create mode 100644 data/domain/public-suffix/GL.php create mode 100644 data/domain/public-suffix/GN.php create mode 100644 data/domain/public-suffix/GP.php create mode 100644 data/domain/public-suffix/GR.php create mode 100644 data/domain/public-suffix/GT.php create mode 100644 data/domain/public-suffix/GU.php create mode 100644 data/domain/public-suffix/GY.php create mode 100644 data/domain/public-suffix/HK.php create mode 100644 data/domain/public-suffix/HN.php create mode 100644 data/domain/public-suffix/HR.php create mode 100644 data/domain/public-suffix/HT.php create mode 100644 data/domain/public-suffix/HU.php create mode 100644 data/domain/public-suffix/ID.php create mode 100644 data/domain/public-suffix/IE.php create mode 100644 data/domain/public-suffix/IL.php create mode 100644 data/domain/public-suffix/IM.php create mode 100644 data/domain/public-suffix/IN.php create mode 100644 data/domain/public-suffix/INT.php create mode 100644 data/domain/public-suffix/IO.php create mode 100644 data/domain/public-suffix/IQ.php create mode 100644 data/domain/public-suffix/IR.php create mode 100644 data/domain/public-suffix/IS.php create mode 100644 data/domain/public-suffix/IT.php create mode 100644 data/domain/public-suffix/JE.php create mode 100644 data/domain/public-suffix/JO.php create mode 100644 data/domain/public-suffix/JP.php create mode 100644 data/domain/public-suffix/KE.php create mode 100644 data/domain/public-suffix/KG.php create mode 100644 data/domain/public-suffix/KI.php create mode 100644 data/domain/public-suffix/KM.php create mode 100644 data/domain/public-suffix/KN.php create mode 100644 data/domain/public-suffix/KP.php create mode 100644 data/domain/public-suffix/KR.php create mode 100644 data/domain/public-suffix/KW.php create mode 100644 data/domain/public-suffix/KY.php create mode 100644 data/domain/public-suffix/KZ.php create mode 100644 data/domain/public-suffix/LA.php create mode 100644 data/domain/public-suffix/LB.php create mode 100644 data/domain/public-suffix/LC.php create mode 100644 data/domain/public-suffix/LK.php create mode 100644 data/domain/public-suffix/LR.php create mode 100644 data/domain/public-suffix/LS.php create mode 100644 data/domain/public-suffix/LT.php create mode 100644 data/domain/public-suffix/LV.php create mode 100644 data/domain/public-suffix/LY.php create mode 100644 data/domain/public-suffix/MA.php create mode 100644 data/domain/public-suffix/MC.php create mode 100644 data/domain/public-suffix/ME.php create mode 100644 data/domain/public-suffix/MG.php create mode 100644 data/domain/public-suffix/MK.php create mode 100644 data/domain/public-suffix/ML.php create mode 100644 data/domain/public-suffix/MN.php create mode 100644 data/domain/public-suffix/MO.php create mode 100644 data/domain/public-suffix/MR.php create mode 100644 data/domain/public-suffix/MS.php create mode 100644 data/domain/public-suffix/MT.php create mode 100644 data/domain/public-suffix/MU.php create mode 100644 data/domain/public-suffix/MUSEUM.php create mode 100644 data/domain/public-suffix/MV.php create mode 100644 data/domain/public-suffix/MW.php create mode 100644 data/domain/public-suffix/MX.php create mode 100644 data/domain/public-suffix/MY.php create mode 100644 data/domain/public-suffix/MZ.php create mode 100644 data/domain/public-suffix/NA.php create mode 100644 data/domain/public-suffix/NC.php create mode 100644 data/domain/public-suffix/NF.php create mode 100644 data/domain/public-suffix/NG.php create mode 100644 data/domain/public-suffix/NI.php create mode 100644 data/domain/public-suffix/NO.php create mode 100644 data/domain/public-suffix/NR.php create mode 100644 data/domain/public-suffix/NZ.php create mode 100644 data/domain/public-suffix/OM.php create mode 100644 data/domain/public-suffix/PA.php create mode 100644 data/domain/public-suffix/PE.php create mode 100644 data/domain/public-suffix/PF.php create mode 100644 data/domain/public-suffix/PH.php create mode 100644 data/domain/public-suffix/PK.php create mode 100644 data/domain/public-suffix/PL.php create mode 100644 data/domain/public-suffix/PN.php create mode 100644 data/domain/public-suffix/PR.php create mode 100644 data/domain/public-suffix/PRO.php create mode 100644 data/domain/public-suffix/PS.php create mode 100644 data/domain/public-suffix/PT.php create mode 100644 data/domain/public-suffix/PW.php create mode 100644 data/domain/public-suffix/PY.php create mode 100644 data/domain/public-suffix/QA.php create mode 100644 data/domain/public-suffix/RE.php create mode 100644 data/domain/public-suffix/RO.php create mode 100644 data/domain/public-suffix/RS.php create mode 100644 data/domain/public-suffix/RW.php create mode 100644 data/domain/public-suffix/SA.php create mode 100644 data/domain/public-suffix/SB.php create mode 100644 data/domain/public-suffix/SC.php create mode 100644 data/domain/public-suffix/SD.php create mode 100644 data/domain/public-suffix/SE.php create mode 100644 data/domain/public-suffix/SG.php create mode 100644 data/domain/public-suffix/SH.php create mode 100644 data/domain/public-suffix/SL.php create mode 100644 data/domain/public-suffix/SN.php create mode 100644 data/domain/public-suffix/SO.php create mode 100644 data/domain/public-suffix/SS.php create mode 100644 data/domain/public-suffix/ST.php create mode 100644 data/domain/public-suffix/SV.php create mode 100644 data/domain/public-suffix/SX.php create mode 100644 data/domain/public-suffix/SY.php create mode 100644 data/domain/public-suffix/SZ.php create mode 100644 data/domain/public-suffix/TH.php create mode 100644 data/domain/public-suffix/TJ.php create mode 100644 data/domain/public-suffix/TL.php create mode 100644 data/domain/public-suffix/TM.php create mode 100644 data/domain/public-suffix/TN.php create mode 100644 data/domain/public-suffix/TO.php create mode 100644 data/domain/public-suffix/TR.php create mode 100644 data/domain/public-suffix/TT.php create mode 100644 data/domain/public-suffix/TW.php create mode 100644 data/domain/public-suffix/TZ.php create mode 100644 data/domain/public-suffix/UA.php create mode 100644 data/domain/public-suffix/UG.php create mode 100644 data/domain/public-suffix/UK.php create mode 100644 data/domain/public-suffix/US.php create mode 100644 data/domain/public-suffix/UY.php create mode 100644 data/domain/public-suffix/UZ.php create mode 100644 data/domain/public-suffix/VC.php create mode 100644 data/domain/public-suffix/VE.php create mode 100644 data/domain/public-suffix/VI.php create mode 100644 data/domain/public-suffix/VN.php create mode 100644 data/domain/public-suffix/VU.php create mode 100644 data/domain/public-suffix/WS.php create mode 100644 data/domain/public-suffix/XN--4DBRK0CE.php create mode 100644 data/domain/public-suffix/XN--90A3AC.php create mode 100644 data/domain/public-suffix/XN--J6W193G.php create mode 100644 data/domain/public-suffix/XN--O3CW4H.php create mode 100644 data/domain/public-suffix/YE.php create mode 100644 data/domain/public-suffix/ZA.php create mode 100644 data/domain/public-suffix/ZM.php create mode 100644 data/domain/public-suffix/ZW.php create mode 100644 docs/rules/PublicDomainSuffix.md create mode 100644 library/Exceptions/PublicDomainSuffixException.php create mode 100644 library/Helpers/DomainInfo.php create mode 100644 library/Rules/PublicDomainSuffix.php create mode 100644 tests/unit/Rules/PublicDomainSuffixTest.php diff --git a/.github/workflows/update-tld.yaml b/.github/workflows/update-domains.yaml similarity index 64% rename from .github/workflows/update-tld.yaml rename to .github/workflows/update-domains.yaml index 7a08d9e3..6a926e9a 100644 --- a/.github/workflows/update-tld.yaml +++ b/.github/workflows/update-domains.yaml @@ -1,4 +1,4 @@ -name: Update top-level domains +name: Update domains on: workflow_dispatch: @@ -7,7 +7,7 @@ on: jobs: update-tld: - name: Update top-level domains + name: Update domains runs-on: ubuntu-latest @@ -17,15 +17,18 @@ jobs: with: ref: ${{ secrets.LAST_MINOR_VERSION }} - - name: Execute script - run: bin/update-tld + - name: Execute bin/update-domain-toplevel + run: bin/update-domain-toplevel + + - name: Execute bin/update-domain-suffixes + run: bin/update-domain-suffixes - name: Create pull request uses: peter-evans/create-pull-request@v4 with: committer: The Respect Panda author: The Respect Panda - commit-message: Update list of top-level domains - title: Update list of top-level domains + commit-message: Update list of domains + title: Update list of domains base: ${{ secrets.LAST_MINOR_VERSION }} branch: "workflows/update-tld" diff --git a/bin/update-domain-suffixes b/bin/update-domain-suffixes new file mode 100755 index 00000000..c5803cde --- /dev/null +++ b/bin/update-domain-suffixes @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +# Usage: {script} RULE_FILENAME +# Update list of TLD + +set -euo pipefail + +declare -r IFS=$'\n' + +declare -r LIST_URL="https://publicsuffix.org/list/public_suffix_list.dat" +declare -r LIST_FILENAME=$(mktemp) + +declare -r RULE_FILENAME_TEMPORARY=$(mktemp) + +echo "- Downloading list" +curl --silent --location "${LIST_URL}" --output "${LIST_FILENAME}" + +echo "- Removing old data" +rm -Rf data/domain/* +mkdir -p data/domain/public-suffix + +parse_tlds_list () { + sed '/^\/\/*/d' | + idn2 | + tr '[:lower:]' '[:upper:]' | + sed '/^$/d' | while read -r suffix + do + suffix="${suffix#\*\.}" + suffix="${suffix#\!}" + tld="${suffix##*\.}" + if test "$tld" != "$suffix" + then + prefix="${suffix%.$tld}" + echo "$tld $prefix" + else + prefix="" + fi + done +} + +echo "- Creating files" + +cat "$LIST_FILENAME" | + parse_tlds_list | + cut -d" " -f1 | + sort -u | while read -r tld_with_suffix + do + suffixlist="$(cat "$LIST_FILENAME" | while read -r line + do + if test "// ===END ICANN DOMAINS===" = "$line" + then break + else echo "$line" + fi + done | + parse_tlds_list | + grep "^$tld_with_suffix " | + cut -d" " -f2 | + tr '[:lower:]' '[:upper:]' | + sort -u | while read -r suffix + do + echo " '$suffix.$tld_with_suffix'," + done || :)" + + if test -n "$suffixlist" + then + echo "- Creating public-suffix/$tld_with_suffix.php" + echo " "data/domain/public-suffix/$tld_with_suffix.php" + else + echo "- Skipping public-suffix/$tld_with_suffix.php" + fi + done + +echo "Finished!" diff --git a/bin/update-tld b/bin/update-domain-toplevel similarity index 100% rename from bin/update-tld rename to bin/update-domain-toplevel diff --git a/bin/update-iso-codes b/bin/update-iso-codes index 5414425e..c6ba8d79 100755 --- a/bin/update-iso-codes +++ b/bin/update-iso-codes @@ -97,6 +97,6 @@ return [ } clone_repository -# update_country_codes +update_country_codes update_subdivision_codes diff --git a/data/domain/public-suffix/AC.php b/data/domain/public-suffix/AC.php new file mode 100644 index 00000000..5b4fc8ca --- /dev/null +++ b/data/domain/public-suffix/AC.php @@ -0,0 +1,11 @@ +validate('co.uk'); // true +v::publicDomainSuffix->validate('CO.UK'); // true +v::publicDomainSuffix->validate('nom.br'); // true +v::publicDomainSuffix->validate('invalid.com'); // false +``` + +This rule will not match top level domains such as `tk`. +If you want to match either, use a combination with `Tld`: + +```php +v::oneOf(v::tld(), v::publicDomainSuffix())->validate('tk'); // true +``` + +## Categorization + +- Internet + +## Changelog + +Version | Description +--------|------------- + 2.3.0 | Created + +*** +See also: + +- [Tld](Tld.md) +- [CountryCode](CountryCode.md) +- [Domain](Domain.md) +- [Ip](Ip.md) +- [MacAddress](MacAddress.md) +- [SubdivisionCode](SubdivisionCode.md) diff --git a/docs/rules/Tld.md b/docs/rules/Tld.md index fb053be4..80179b8c 100644 --- a/docs/rules/Tld.md +++ b/docs/rules/Tld.md @@ -8,6 +8,7 @@ Validates whether the input is a top-level domain. v::tld()->validate('com'); // true v::tld()->validate('ly'); // true v::tld()->validate('org'); // true +v::tld()->validate('COM'); // true ``` ## Categorization @@ -28,3 +29,4 @@ See also: - [Ip](Ip.md) - [MacAddress](MacAddress.md) - [SubdivisionCode](SubdivisionCode.md) +- [PublicDomainSuffix](PublicDomainSuffix.md) diff --git a/library/Exceptions/PublicDomainSuffixException.php b/library/Exceptions/PublicDomainSuffixException.php new file mode 100644 index 00000000..69e65cfa --- /dev/null +++ b/library/Exceptions/PublicDomainSuffixException.php @@ -0,0 +1,28 @@ + + * SPDX-License-Identifier: MIT + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody + */ +class PublicDomainSuffixException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} must be a public domain suffix', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} must be a public domain suffix', + ], + ]; +} diff --git a/library/Helpers/DomainInfo.php b/library/Helpers/DomainInfo.php new file mode 100644 index 00000000..502da839 --- /dev/null +++ b/library/Helpers/DomainInfo.php @@ -0,0 +1,46 @@ + + * SPDX-License-Identifier: MIT + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use function file_exists; +use function mb_strtoupper; + +final class DomainInfo +{ + /** + * @var mixed[] + */ + private $data; + + /** + * @var mixed[] + */ + private static $runtimeCache = []; + + public function __construct(string $tld) + { + $tld = mb_strtoupper($tld); + + if (!isset(static::$runtimeCache[$tld])) { + $filename = __DIR__ . '/../../data/domain/public-suffix/' . $tld . '.php'; + static::$runtimeCache[$tld] = file_exists($filename) ? require $filename : []; + } + + $this->data = static::$runtimeCache[$tld]; + } + + /** + * @return array + */ + public function getPublicSuffixes(): array + { + return $this->data; + } +} diff --git a/library/Rules/AbstractSearcher.php b/library/Rules/AbstractSearcher.php index f8450686..f73d9630 100644 --- a/library/Rules/AbstractSearcher.php +++ b/library/Rules/AbstractSearcher.php @@ -12,6 +12,8 @@ namespace Respect\Validation\Rules; use Respect\Validation\Helpers\CanValidateUndefined; use function in_array; +use function is_scalar; +use function mb_strtoupper; /** * Abstract class for searches into arrays. @@ -23,20 +25,26 @@ abstract class AbstractSearcher extends AbstractRule use CanValidateUndefined; /** + * @param mixed $input * @return mixed[] */ - abstract protected function getDataSource(): array; + abstract protected function getDataSource($input = null): array; /** * {@inheritDoc} */ public function validate($input): bool { - $dataSource = $this->getDataSource(); + $dataSource = $this->getDataSource($input); + if ($this->isUndefined($input) && empty($dataSource)) { return true; } - return in_array($input, $dataSource, true); + if (!is_scalar($input)) { + return false; + } + + return in_array(mb_strtoupper((string) $input), $dataSource, true); } } diff --git a/library/Rules/CountryCode.php b/library/Rules/CountryCode.php index 54582acb..e9b90d22 100644 --- a/library/Rules/CountryCode.php +++ b/library/Rules/CountryCode.php @@ -368,7 +368,7 @@ final class CountryCode extends AbstractSearcher /** * {@inheritDoc} */ - protected function getDataSource(): array + protected function getDataSource($input = null): array { return array_column(self::COUNTRY_CODES, self::SET_INDEXES[$this->set]); } diff --git a/library/Rules/CurrencyCode.php b/library/Rules/CurrencyCode.php index 350f9902..4c3ab895 100644 --- a/library/Rules/CurrencyCode.php +++ b/library/Rules/CurrencyCode.php @@ -24,7 +24,7 @@ final class CurrencyCode extends AbstractSearcher * * {@inheritDoc} */ - protected function getDataSource(): array + protected function getDataSource($input = null): array { return [ 'AED', // UAE Dirham diff --git a/library/Rules/PublicDomainSuffix.php b/library/Rules/PublicDomainSuffix.php new file mode 100644 index 00000000..67f07ac6 --- /dev/null +++ b/library/Rules/PublicDomainSuffix.php @@ -0,0 +1,37 @@ + + * SPDX-License-Identifier: MIT + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\DomainInfo; + +use function array_pop; +use function explode; + +final class PublicDomainSuffix extends AbstractSearcher +{ + /** + * @var string[] + */ + private $domainInfo; + + /** + * {@inheritDoc} + */ + protected function getDataSource($input = null): array + { + $parts = explode('.', $input); + $tld = array_pop($parts); + + $domainInfo = new DomainInfo($tld); + $this->domainInfo = $domainInfo->getPublicSuffixes(); + + return $this->domainInfo; + } +} diff --git a/library/Rules/SubdivisionCode.php b/library/Rules/SubdivisionCode.php index bd6618b2..fe90a546 100644 --- a/library/Rules/SubdivisionCode.php +++ b/library/Rules/SubdivisionCode.php @@ -45,7 +45,7 @@ final class SubdivisionCode extends AbstractSearcher /** * {@inheritDoc} */ - protected function getDataSource(): array + protected function getDataSource($input = null): array { return $this->countryInfo; } diff --git a/tests/unit/Rules/AbstractSearcherTest.php b/tests/unit/Rules/AbstractSearcherTest.php index 51841c76..1ccf9bac 100644 --- a/tests/unit/Rules/AbstractSearcherTest.php +++ b/tests/unit/Rules/AbstractSearcherTest.php @@ -30,13 +30,13 @@ final class AbstractSearcherTest extends TestCase */ public function shouldValidateFromDataSource(): void { - $input = 'bar'; + $input = 'BAZ'; $rule = $this->getMockForAbstractClass(AbstractSearcher::class); $rule ->expects(self::once()) ->method('getDataSource') - ->willReturn(['foo', $input, 'baz']); + ->willReturn(['FOO', $input, 'BAZ']); self::assertTrue($rule->validate($input)); } diff --git a/tests/unit/Rules/CurrencyCodeTest.php b/tests/unit/Rules/CurrencyCodeTest.php index 291734c3..51477480 100644 --- a/tests/unit/Rules/CurrencyCodeTest.php +++ b/tests/unit/Rules/CurrencyCodeTest.php @@ -49,7 +49,6 @@ final class CurrencyCodeTest extends RuleTestCase [$rule, 'BTC'], [$rule, 'GGP'], [$rule, 'USA'], - [$rule, 'xxx'], ]; } } diff --git a/tests/unit/Rules/PublicDomainSuffixTest.php b/tests/unit/Rules/PublicDomainSuffixTest.php new file mode 100644 index 00000000..748c16f4 --- /dev/null +++ b/tests/unit/Rules/PublicDomainSuffixTest.php @@ -0,0 +1,50 @@ + + * SPDX-License-Identifier: MIT + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Test\RuleTestCase; + +/** + * @covers \Respect\Validation\Exceptions\PublicDomainSuffixException + * @covers \Respect\Validation\Rules\PublicDomainSuffix + * + * @author Alexandre Gomes Gaigalas + */ +final class PublicDomainSuffixTest extends RuleTestCase +{ + /** + * {@inheritDoc} + */ + public function providerForValidInput(): array + { + $rule = new PublicDomainSuffix(); + + return [ + [$rule, 'co.uk'], + [$rule, 'nom.br'], + [$rule, 'WWW.CK'], + ]; + } + + /** + * {@inheritDoc} + */ + public function providerForInvalidInput(): array + { + $rule = new PublicDomainSuffix(); + + return [ + [$rule, 'NONONONONONONONONON'], + [$rule, 'NONONONONONONONONON.uk'], + [$rule, 'invalid.com'], + [$rule, 'tk'], + ]; + } +}