From 5cbca439df33c085580b7da7aabccc2576112443 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 9 Oct 2021 22:33:22 +1000 Subject: [PATCH 01/37] ci(flake8): fix: remove select option as it disables other errors --- .github/workflows/main.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index cdf60ff..f7d584e 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -17,9 +17,8 @@ jobs: python-version: ${{ matrix.python-version }} architecture: x64 - run: python -m pip install flake8 nox poetry - - run: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + - run: flake8 . --count --show-source --statistics - run: python -m nox env: OS: ${{ matrix.os }} PYTHON: ${{ matrix.python-version }} - From 781ac611b9de9178913831c51636fbbba17d20bd Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 9 Oct 2021 22:44:18 +1000 Subject: [PATCH 02/37] style(flake8): F841 local variable is assigned to but never used --- tests/test_filtration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_filtration.py b/tests/test_filtration.py index 44e50fd..b7461c4 100644 --- a/tests/test_filtration.py +++ b/tests/test_filtration.py @@ -101,7 +101,7 @@ def test_distribution6(): def test_distribution7(): with pytest.raises(InvalidTag): - dist = Distribution({"Tags": "Media", "MinRarity": 0.7}) + Distribution({"Tags": "Media", "MinRarity": 0.7}) def test_filter(): From 0c2ebf016a88bfc6f233397fb9ffa6ae7711cca5 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 9 Oct 2021 22:47:04 +1000 Subject: [PATCH 03/37] style(flake8): E711 comparison to None should be 'if cond is None:' --- tests/test_identifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_identifier.py b/tests/test_identifier.py index 125ffed..c7c0993 100644 --- a/tests/test_identifier.py +++ b/tests/test_identifier.py @@ -115,7 +115,7 @@ def test_identifier_sorting6(): def test_only_text(): out = r.identify("fixtures/file") - assert None == out["Regexes"] + assert None is out["Regexes"] out = r.identify("THM{7281j}}", only_text=True) assert "TryHackMe Flag Format" in out["Regexes"]["text"][0]["Regex Pattern"]["Name"] From 8bdd1604d54d596ca61983a1afe1f0a4847489f6 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 9 Oct 2021 22:48:31 +1000 Subject: [PATCH 04/37] ci(flake8): set max-line-length to 88 (black line length) --- .flake8 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..2bcd70e --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 88 From b229549dcb88b1a09bdaa4331b038aa71a1a9989 Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 10 Oct 2021 10:24:09 +1000 Subject: [PATCH 05/37] Update tests/test_identifier.py Co-authored-by: piatrashkakanstantinass <74979584+piatrashkakanstantinass@users.noreply.github.com> --- tests/test_identifier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_identifier.py b/tests/test_identifier.py index c7c0993..10f90e6 100644 --- a/tests/test_identifier.py +++ b/tests/test_identifier.py @@ -115,7 +115,7 @@ def test_identifier_sorting6(): def test_only_text(): out = r.identify("fixtures/file") - assert None is out["Regexes"] + assert out["Regexes"] is None out = r.identify("THM{7281j}}", only_text=True) assert "TryHackMe Flag Format" in out["Regexes"]["text"][0]["Regex Pattern"]["Name"] From dae6d2f02bef81abf08db260422d9aaccf1ad0c0 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 21:47:51 +1000 Subject: [PATCH 06/37] style(flake8): E731 do not assign a lambda expression, use a def --- pywhat/helper.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pywhat/helper.py b/pywhat/helper.py index 233de6b..581ab93 100644 --- a/pywhat/helper.py +++ b/pywhat/helper.py @@ -86,9 +86,15 @@ def issubset(self, other): class Keys(Enum): - NAME = lambda match: match["Regex Pattern"]["Name"] - RARITY = lambda match: match["Regex Pattern"]["Rarity"] - MATCHED = lambda match: match["Matched"] + def NAME(match): + return match["Regex Pattern"]["Name"] + + def RARITY(match): + return match["Regex Pattern"]["Rarity"] + + def MATCHED(match): + return match["Matched"] + NONE = auto() From dd077aa910d89f5698b5ac84549b7be5cb806237 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 22:54:43 +1000 Subject: [PATCH 07/37] refactor tests/test_regex_identifier.py (#202) * refactor: basic implementation of using pytest.mark.parametrize on regex.json * refactor: move _assert_match_first_item seperate tests into paramaterized tests * feat: rename `Matches` to `Examples.Valid` * refactor: parametrize assert name not in res tests * fix: ip is a valid url * refactor: convert more _assert_match_first_item tests * fix: extra comma in json * refactor: paramterize other tests * fix(data/regex): jcb card number is valid * fix(data/regex): Amazon Web Services Secret Access Key typo * fix(test): unix_timestamp match tests * refactor(test): create `regex_valid_match` function * refactor(test): move database tests to tests/data/ * fix(test): set minrarity to 0 for test_valid * refactor(test): object init in test_regex_identifier * refactor(test): parametrize more tests * test: improve `test_regex_successfully_parses` regex * style: format regex.json on main branch * style: format regex.json on `test/parametrize` branch * style: format regex.json on main branch * refactor: update refactor with upstream changes * refactor(test): test_regex_identifier description and exploit tests * style: format regex.json * refactor: finalise test_regex_identifier * refactor(test): move code into `test_regex_database.py` * feat: remove temporary script accidentally commited * ci(coverage): set patch coverage to 80% --- .codecov.yml | 3 + pywhat/Data/regex.json | 944 ++++++++++++-- scripts/format_regex.py | 8 + ...x_formatting.py => test_regex_database.py} | 36 +- tests/test_regex_identifier.py | 1107 ++--------------- 5 files changed, 918 insertions(+), 1180 deletions(-) create mode 100644 scripts/format_regex.py rename tests/{test_regex_formatting.py => test_regex_database.py} (66%) diff --git a/.codecov.yml b/.codecov.yml index 9ec7ff8..d9edfbf 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -3,3 +3,6 @@ coverage: project: default: target: 90% + patch: + default: + target: 80% diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 0d06164..33a087c 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -8,7 +8,13 @@ "URL": null, "Tags": [ "PGP" - ] + ], + "Examples": { + "Valid": [ + "-----BEGIN PGP PUBLIC KEY BLOCK-----Comment: Alice's OpenPGP certificateComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.htmlmDMEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/Ub7O1u120JkFsaWNlIExvdmVsYWNlIDxhbGljZUBvcGVucGdwLmV4YW1wbGU+iJAEExYIADgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQTrhbtfozp14V6UTmPyMVUMT0fjjgUCXaWfOgAKCRDyMVUMT0fjjukrAPoDnHBSogOmsHOsd9qGsiZpgRnOdypvbm+QtXZqth9rvwD9HcDC0tC+PHAsO7OTh1S1TC9RiJsvawAfCPaQZoed8gK4OARcRwTpEgorBgEEAZdVAQUBAQdAQv8GIa2rSTzgqbXCpDDYMiKRVitCsy203x3sE9+eviIDAQgHiHgEGBYIACAWIQTrhbtfozp14V6UTmPyMVUMT0fjjgUCXEcE6QIbDAAKCRDyMVUMT0fjjlnQAQDFHUs6TIcxrNTtEZFjUFm1M0PJ1Dng/cDW4xN80fsn0QEA22Kr7VkCjeAEC08VSTeV+QFsmz55/lntWkwYWhmvOgE==iIGO-----END PGP PUBLIC KEY BLOCK-----" + ], + "Invalid": [] + } }, { "Name": "PGP Private Key", @@ -20,7 +26,13 @@ "Tags": [ "PGP", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "-----BEGIN PGP PRIVATE KEY BLOCK-----Comment: Alice's OpenPGP Transferable Secret KeyComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.htmllFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/Ub7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGljZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2lnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYfa78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYBBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuFu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpMhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWybPnn+We1aTBhaGa86AQ===n8OM-----END PGP PRIVATE KEY BLOCK-----" + ], + "Invalid": [] + } }, { "Name": "SSH RSA Public Key", @@ -32,7 +44,13 @@ "Tags": [ "Credentials", "SSH Public Key" - ] + ], + "Examples": { + "Valid": [ + "ssh-rsa AAAAB3NzaC1tc2EAAAADAQABAAACAQDrnjkGtf3iA46rtwsvRiscvMTCw30l5Mmln/sf8Wohg4RPc7nuIx3/fB86K9jzBNoQk6Fb00p2cSW0dX6c3OTL5R5Q0rBjOFy6GV07MkS7rXa7WYh4ObxBh+M+LEzxVIw29anzQFZkR0TAf6x2rBoErK7JYU4fyqFBDFupTt3coQDPEEmVwtLLUCEnJrurbbnJKcWJ+/FbItLxYyMLPl8TwEn0iqiJ97onCU2DuBtiYv3hp1WoEH08b5WDF0F04zEPRdJT+WisxlEFRgaj51o2BtjOC+D2qZQDb4LHaAfJ0WcO4nu7YocdlcLp2JPfXKKgu9P5J8UDsmXbR3KCJ1oddFa2R6TbHc6d2hKyG4amBzMX5ltxXu7D6FLPZlFqua8YooY7A2zwIVirOUH/cfx+5O9o0CtspkNmj/iYzN0FPaOpELncWsuauy9hrGql/1cF4SUr20zHFoBoDQUtmvmBnWnKoGfpWXzuda449FVtmcrEjvBzCvCb3RStu0BbyOOybJagbKif3MkcYVO10pRbTveIUwgCD6F3ypD11XztoPNsgScmjme0sj/KWWNLyQkLWtpJEQ4k46745NAC5g+nP28TR2JM8doeqsxA8JovQkLWwDcR+WYZu2z/I8dfhOmalnoMRTJ2NzWDc0OSkKGYWjexR4fN6lAKCUOUptl9Nw== r00t@my-random_host" + ], + "Invalid": [] + } }, { "Name": "PEM-formatted Private Key", @@ -44,7 +62,18 @@ "Tags": [ "Credentials", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "-----BEGIN RSA PRIVATE KEY-----MIIEoQIBAAKCAQBYNGcp1Jm7GOGffs9wvpIsi9RKPE/a4usQyEdf8G2C0pLcOoypfG1MiOQCDDRN4HtMDoe9KTVjVnnREfmQq2k1hT1BZHfaRu/3YvpFrleozzYmY1XRSeUiM6G71ADg8cPZlAuH1RjswlevJyhNVWzy+DLumpbRgv6nKR9dYSdy2GsFySX488l05+ZaVKgHwlGeKd33YNPRAUNLSPKLdd9wi1djGaQpSo7jWRb6lIFJUR7FdvxwjAVMhDljxXYHPP0GXFS6KTGcfB97dle90qu/4nwdKWd4RZ5pqIbFi1D5ejItUzY40GpsPuN/tkamwB5jY0AtFY8S9TMxHjRx05/DAgMBAAECggEAKU5pHYLNd3wAdTPqq27jf28APL+f2e64jIRuQHSUpFY+plnY86oseVIGDRtwByRgOU74rFI3CU0/APS8/c34GDNMa2pEYnkj+aNldupdbNWVE0cjsj47yteJHy/6NV2jDSqyd6sI4B9m9sSMsCKYQfSPzYOhq34ACYJNiOptke9PkxpNNODlFJrFQsRKKpv2KdF7Lh3/Yzc6p53gilYR9U+Sn4mBrkuURLm2Qq++r0CNTjpmbunbjAL5q/oK8bpJEz3uZqbSQ5GbSLCNroRyi7eIF1Evvk0Vb9nSyfm94VdP+yVr1VvtOt8WigHwAr8E+ujg0rrAKMswfbvNFroNMQKBgQCs/rQvlTfpRiHUlCB09HZzquM8o7pBxTpKAX9247SW81V41EHsIS69WGZzcYbYQlxOxQi7gHiALB/yRLFNiAHAhODFMGTYtprTdW/JK6TC8CPvK3TBnPSYDPP/ME2F2UZKVHWlD3FFtUqp9BppWCHDLp7N/+i5eJy+ankJYzeGywKBgQCChsDhaPJAnHp/zHJmhDXQkqVeoB8SW2WzH481xVgyu2gIsEGmgActfEAyCqRuzjnMSIjXBL5LSAZXft8d+wveR3PsUiVdUurbcrije1ku3jDPXdBQrjmyWZvCXXnZ8oqX18C05a0pgzX5oDluA1ShcI7uWNHkIPYcZskcp96z6QKBgG9gpP2lopOrtYg5vhPOeJzLvvWBrB9ALeELydbvj4tIKxVaAv9V9dOuIHfe9aQyRV/pd0/QzMQopIDEPSrfj9E1O8l4+NSV7GSMTWZFlRR0q44GemtU9B0Y6da4cJDmbFzat8uHf7QTnniBUqfUOBiD4XZbdqhCwRfPURH8MPm1AoGAWHZ9yQe4kAO9nlnw+vwGAQsymxRImsdpAOKVy+qpIREUrDbQ98hzlOdOFtxRn2uTjplmbNwhIKJ68dfh3c7kt0yUC4mNG1f0JrD05I/X3MToLdK2OcgrAG5s+2khCY6xUcH/MFstZiIwdbOa2K3XMOc5Z964ujWAt7UN/qbjb+kCgYBdPN6J1b6OuTt4xYTCenX+KlGBb9QsuK8uXMDkhJhrtcHAyuxyJrDjQu5i3djeZerflT0EESCet0zGPd5bGyP4KaIsmLwYheDLrziS6xqqXL0irMZiWVaVquC3JlWJMw6/Y66WRuxd+oRBbE62lHWnzT2J8dfG+su483KKgli02Q==-----END RSA PRIVATE KEY-----", + "-----BEGIN DSA PRIVATE KEY-----MIIDTgIBAAKCAQEAj3k12bmq6b+r7Yh6z0lRtvMuxZ47rzcY6OrElh8+/TYG50NRqcQYMzm4CefCrhxTm6dHW4XQEa24tHmHdUmEaVysDo8UszYIKKIv+icRCj1iqZNFNAmg/mlsRlj4S90ggZw3CaAQV7GVrc0AIz26VIS2KR+dZI74g0SGd5ec7AS0NKasLnXpmF3iPbApL8ERjJ/6nYGB5zONt5K3MNe540lZL2gJmHIVORXqPWuLRlPGM0WPgDsypMLg8nKQJW5OP4o7CDihxFDk4YwaKaN9316hQ95LZv8EkD7VzxYj4VjUh8YI6X8hHNgdyiPLbjgHZfgi40K+SEwFdjk5YBzWZwIdALr2lqaFePff3uf6Z8l3x4XvMrIzuuWAwLzVaV0CggEAFqZcWCBIUHBOdQKjl1cEDTTaOjR4wVTU5KXALSQu4E+W5h5L0JBKvayPN+6x4J8xgtI8kEPLZC+IAEFg7fnKCbMgdqecMqYn8kc+kYebosTnRL0ggVRMtVuALDaNH6g+1InpTg+gaI4yQopceMR4xo0FJ7ccmjq7CwvhLERoljnn08502xAaZaorh/ZMaCbbPscvS1WZg0u07bAvfJDppJbTpV1TW+v8RdT2GfY/Pe27hzklwvIk4HcxKW2oh+weR0j4fvtf3rdUhDFrIjLe5VPdrwIRKw0fAtowlzIk/ieu2oudSyki2bqL457Z4QOmPFKBC8aIt+LtQxbh7xfb3gKCAQB87fMOaF3zru0d3blONyvU4kEclm0i79Shdm2r2dBQo9ru8KdmbBoBS3qS7k//hEuLCCdHAKdLrz8cdbah8ONEVVu/HTDS5TKcm1W/czHch0NhYIfMFschQcEAcswOLjGoRGHl2SZb90pF2dxMxKEgi1QLoPRRX8UWpGy5+ghkaIBEUE31p4dS3vJ1EevQc3itZ2Sh7UcY3hQ8idYptzTwL9p7c4V/aWXLFbQdzJCSi1Q5fr85Uj2eFZTHliYe5ZrZ3R+nl1fbk/ySajbLD6RaTm/ppRfWRxyw3MWjKxPapeLFIsxm1A9rnDyfeEDg1Ixahaq0xLk46RwBo6ZblI0aAh0An8MAVnsLGjtDHBGIlDH+XXPsMkClXnYeBRUGAQ==-----END DSA PRIVATE KEY-----", + "-----BEGIN EC PRIVATE KEY-----MIHcAgEBBEIApe6jUvbal/QN6ZoQ9dZMe/pTx4CiFzd4ln9a5f0Ope+788+BwgLpl1888OThkaWMeg2wevZ/ErMId0T3kZGoE7mgBwYFK4EEACOhgYkDgYYABAE4SLWZJs6lE0bwYgMipcRxB1xtARXDwbPt3o7aDI7680kLnELXGYhIhGeXlhXgAXjE66GuM8TdbPsshqP9nRy9OAGbxJU/OA+7/zuZmo10IYWNu1IrcGYq0WZJwzZex+S12+VKVBEwPoLKlgm5r/sI8x7WnDtialy5i8ipkvUyOyPUxg==-----END EC PRIVATE KEY-----", + "-----BEGIN PRIVATE KEY-----MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDaoE09/Cmh1T8I3J9lenqZ2pllw0WXAUrPi4pPV3jmJBsIsfpedZfakdI2ixw2XkWRayAklsxlFFtXCQ6U0yXSd7KJY9vuxb+5cMZejpOoHTZkVwxhlEodCt8DWf5tOc4UA5Ip88WYeszygxuIU6JP0bavJhtQnI5ER+0eZCY8xyNLqQ86h6iuxncAo5fxyc44IKFSm6MDh+GmHBlK5Eql536qfZtA6jMFYnORQ1gVp5J1hQ7bDmiLzFjyCvpNSYLOYbodvcCIWCSUKgp5Q5Uo0EX2h7mX6Z07ONCOQaFXfW3z5/xbn1bJKtI+JSNFS86owWb20EYcopnWwOimmsTXAgMBAAECggEAPW5Tpfon/Jg9+RB9HXeX4YliFw0SjcbILZ9JAthSWWCF1CCmeEpUnA7jYX4fNEuzApR2WLGixzg8Hi2mUj0uYIBPw3kywFoCcGn243Tumoty0CkBip2vYY+/cGKmMizO8iK6vF0KBbljwzUB1IGjlwgXbAmqHTGQbDFFuIdtkx/ggns9X/wNNqK7UPaJoYvlv/YX10/OgBgGQMBWTjvZ3rWg4+TUJymO4edlBK4VmPeBE+syPBcc/YNV+sYDnww8U1hucA5hJ4hOIomFYyaYYUtdWKoAwLJxGf7tZ6hgq16iMbzHcJ2gNCINcWKTByEosqX3aA3TvkyTDMwQguAn8QKBgQD2uViv8qyeVy+RrHH6pC3KoEIUYIz6LTulEDL2YcsRr5FKubzxOU6OEcx1TSmkCmUxyUAyFDyTH/aG0c1H8EWYAwMT7N25Pax1bgjJM+A1z3SU9qxOmdFqFz5v7YC9qnLkODErRByuFsfwdxxJedP4Vles/HZc1tnKYl/v8n81jwKBgQDi2IVlMx9LiBfgZeSI/dkUg3pLT1e3Mu52/WMGmUXRWFKta5P/URw/mgNqJ/nPFQRR3Jn3b6augGtMjomJ+l7pnlv/OX8oj0h46Brx08wrifZMHUStB6Rt2vOy9asLk84rQIgMh7I/PeZ3r/w8dZg7B1IUMyLuyjGcSoh2Q76oOQKBgQDsCy9aRiX35xnPmNgDH4ffz6roq+a0gwoJRZI8Pht19C5g+4pUjqslKMoff49TLc7a7tvIDaxWZcIKAjcPmEQ8xsTvDzKhwut3/anSNRtQ4AV9bvIy0N6VTV+i3erJioUY6tm/tw5pT8pBuPMLKM8vTAvdqDvlXnhHNA7tFWe26QKBgQCok922EiK8n9uWkEIgp/ztqLN2SfVWmIvsc2tm2Pqwk2GFrP+j6mQCw/Krrh+QC/9U0oq8/gUxgw+6Keb+Wci09lFJvzHHM4vZBiwX8Jy28mTNtaZ2q8o/NUqLgNPm26WIMQGpxiHpq5ec9HSPfZhurYcKqeHY8PujOSRmNvv1yQKBgQCx65dznLE32KQhJbN9lXbr7mYdqurJMrchQ4E9zI69cXf7M8kt6FqRHLVv0arPPK+xL6FqF4pq2BuKZlYTqwdG1xsOiEv3IHs3lioTFzbJ1NXhrIuV0H3AiQcw9TbhSs3sWkP7Ri90Uj/fHYQC+psvq5x0L4JZKE3dDTdgjP6vQA==-----END PRIVATE KEY-----", + "-----BEGIN ENCRYPTED PRIVATE KEY-----MIIE6TAbBgkqhkiG9w0BBQMwDgQIHHigg+fwQjQCAggABIIEyLP0cpU55sZ3QSZkCtNtGU425BnZZD57aqO/aa/fV9HGvWn5/GYANT6xDKbUi2kwc68QCi6Zla3C56jPvPsZoDeZ+g81DYjqBVMRsVra1kayQvnKeRvedYPBdfA0VL5n0ndRa9q31Vx6zzXnMYJd9VakUgXYLFntvVeTt/a+iW9LX7mx/ymUPZtD1IrNEJBpW6Al+vc1m6bYA8NpZaT5P6uiclsoEiPDMydEa52cBgcd5q5MfwKllPsQNYtyLsee8W/1k/Eu21pRkCPYreQWgh36gqAn+2zNySCyqiU7USQ1qHMIHPLxJV7awVfOy7eoRMhmbTJ8kCrEpI9r6JyQN3m1VbBN5QifF9p0N0v2yBM8hS6e0fdaSwkFUVFHeWz4140nhaXA6Xu9U+TvJwacdz/FYsN9wi1AIDl8nMT+gFC2v3HuiGmMD0ybA5TOJEsvhdLruxLNLok/uiu6oExDVAV6JI4zM/8ymLruuAibVxSc9bhVEY8FfYbQ5aDiGPm18MXtmCb5UNEG10ylsDl5khfGYwcfuOfgDy3PVst4aA3sHLbk996csBL8FPcGDx7iqgWPYkHEfhuHr4MUt2xqJloOsGlcs6Ts70ldgNHpNCA0DizHnrRY8EF4gXzAJghpJ5gcCllzcVjf26YsoVyNiIZ2IcMe2aoP2WtbnnFqtgl2gOJ6SNAbWyRLhtlSC74mYl0SLvtN5lm7U5bCIlAnAJbm1cqN+Muuxy9/U5TagQYfya4BZNUhHhI9ILH87QLpIWDeCa3v0UZfHi7CBirEusAq+jQGZslTt+fr/iRWQLwo819HA5Yhh4rems2p2aKeuUYPJ/gt5/KIPikYneAEJ2HzqByeS71hWbxpINtEtNz2M1SVGLbFsLrUjfKGTEc29qaaFvM24LpLxahiCTW2huM/1UZFjKyvrL0HYKAZyvA/07EHzY5K9DT3ocNIKApqMzq+D7P5L/gBNQ6E+cx/ZOA+9unVuE7OY6mmQHMsK9MAT6e4T0AxkBqAWg3cf5ovlQNr57mWwms8Zyy1wwIwLr2/wilJ5V3iWSHDIckK1kR92kCDu3MwNIhfM9dalWSsx9FRIg4iFzMIuidYO8pIVq1jJQKqVsgmGXCwioKvD6wDnQqijdDmVpX/Jg08O1iU7URD2MvGLbBRRfzcBFNrEUNjTrbQa3LS+wvDISbizryXKr/8K8okpxV6dBiW3YplePjde/yqrxWl7OQoDbG1F2f2zMmIe8ZNTP15K8aAlq9LC5qn6YnoRTRe2rLecxgP1SQVXUwFvrUKglozy1/cJsuKuCqiRecQneqyasc9mp/0wGu1t9GD3EroMfvuK4zXuaj6uTDyDPUBo6hfvNDG8zSHvEfDDGm4PTFI7kU7U7ohSQZZcGHZBUigFluq9KWJ3SHPgTkRul3nB/Im+89toHSHFoqH/B/GDokAbqsrUPgJ9xpK9lqFEhng5blX2kiae90VHRyb23oE7eIjf3j4G04Amh8m4/W7ER9JDn6nwWqMH4n2MBQRD3USO8DNTgBbggVZZ7MGIUVbv2/YcVZXftBtiS1u+lvVcpYPzwHIj29YrscmBV6ae0CLo1av0xquHYUOrVixSvhmOREOUSZvNSibizBIyNmLkA==-----END ENCRYPTED PRIVATE KEY-----", + "-----BEGIN OPENSSH PRIVATE KEY-----b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBDXVWIoOcQYPyoVODqYrhNAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIDDZHhPJKYsu2hV7bq/vtAbF2Guw8cupqcjv5SqRraVaAAAAoCfV/ZrS3mggJFx1X7aeKzfBFDN2hWrPTHmyJPsw0NaDW+wzL6/yYmWaAB90clbSiCQ7jALlA/RoU/tPz8HvEaKcnj9BgSMN8+Se4RBcfqxMx9eCRYtYcumc9PrQbKSCeywtvsQoCntPxLhyudxH/HYKx7lO5mrMGut9FjOy2s9Iz317p+2F1DJqRYNsEHKyZJpV0DwObF2ZPOlX3PDv3fg=-----END OPENSSH PRIVATE KEY-----" + ], + "Invalid": [] + } }, { "Name": "SSH ECDSA Public Key", @@ -56,7 +85,13 @@ "Tags": [ "Credentials", "SSH Public Key" - ] + ], + "Examples": { + "Valid": [ + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCE9Uli8bGnD4hOWdeo5KKQJ/P/vOazI4MgqJK54w37emP2JwOAOdMmXuwpxbKng3KZz27mz+nKWIlXJ3rzSGMo= r00t@my-random_host" + ], + "Invalid": [] + } }, { "Name": "SSH ED25519 Public Key", @@ -68,7 +103,13 @@ "Tags": [ "Credentials", "SSH Public Key" - ] + ], + "Examples": { + "Valid": [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK0wmN/Cr3JXqmLW7u+g9pTh+wyqDHpSQEIQczXkVx9q r00t@my-random_host" + ], + "Invalid": [] + } }, { "Name": "Access-Control-Allow-Header", @@ -80,7 +121,13 @@ "Tags": [ "Networking", "Website" - ] + ], + "Examples": { + "Valid": [ + "Access-Control-Allow: *" + ], + "Invalid": [] + } }, { "Name": "TryHackMe Flag Format", @@ -91,7 +138,13 @@ "URL": null, "Tags": [ "CTF Flag" - ] + ], + "Examples": { + "Valid": [ + "thm{hello}" + ], + "Invalid": [] + } }, { "Name": "HackTheBox Flag Format", @@ -102,7 +155,13 @@ "URL": null, "Tags": [ "CTF Flag" - ] + ], + "Examples": { + "Valid": [ + "htb{just_a_test}" + ], + "Invalid": [] + } }, { "Name": "Capture The Flag (CTF) Flag", @@ -113,7 +172,13 @@ "URL": null, "Tags": [ "CTF Flag" - ] + ], + "Examples": { + "Valid": [ + "FLAG{hello}" + ], + "Invalid": [] + } }, { "Name": "YouTube Video", @@ -126,7 +191,14 @@ "Media", "YouTube", "YouTube Video" - ] + ], + "Examples": { + "Valid": [ + "https://www.youtube.com/watch?v=ScOAntcCa78", + "http://www.youtube.com/watch?v=dQw4w9WgXcQ" + ], + "Invalid": [] + } }, { "Name": "Bitcoin Cash (BCH) Wallet Address", @@ -140,7 +212,13 @@ "Cryptocurrency Wallet", "Bitcoin Cash Wallet", "Bitcoin" - ] + ], + "Examples": { + "Valid": [ + "bitcoincash:qzlg6uvceehgzgtz6phmvy8gtdqyt6vf359at4n3lq" + ], + "Invalid": [] + } }, { "Name": "Heroku API Key", @@ -170,7 +248,13 @@ "API Keys", "Credentials", "Slack" - ] + ], + "Examples": { + "Valid": [ + "xoxp-514654431830-843187921057-792480346180-d44d2r9b71f954o8z2k5llt41ovpip6v" + ], + "Invalid": [] + } }, { "Name": "Slack Webhook", @@ -198,7 +282,13 @@ "Networking", "AWS", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "http://s3.amazonaws.com/bucket" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services Simple Storage (AWS S3) Internal URL", @@ -211,7 +301,14 @@ "Networking", "AWS", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "s3://bucket/path/key", + "s3://bucket/path/directory/" + ], + "Invalid": [] + } }, { "Name": "Square Application Secret", @@ -226,7 +323,13 @@ "Credentials", "Square", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "sq0csp-LBptIQ85io8CvbjVDvmzD1drQbOERgjlhnNrMgscFGk" + ], + "Invalid": [] + } }, { "Name": "Square Access Token", @@ -241,7 +344,13 @@ "Credentials", "Square", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "EAAAEBQZoq15Ub0PBBr_kw0zK-uIHcBPBZcfjPFT05ODfjng9GqFK9Dbgtj1ILcU" + ], + "Invalid": [] + } }, { "Name": "Stripe API Key", @@ -256,7 +365,13 @@ "Credentials", "Bug Bounty", "Stripe" - ] + ], + "Examples": { + "Valid": [ + "sk_live_vHDDrL02ioRF5vYtyqiYBKma" + ], + "Invalid": [] + } }, { "Name": "GitHub Access Token", @@ -271,7 +386,13 @@ "Credentials", "Bug Bounty", "GitHub" - ] + ], + "Examples": { + "Valid": [ + "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:test@github.com" + ], + "Invalid": [] + } }, { "Name": "Amazon Resource Name (ARN)", @@ -285,7 +406,16 @@ "Networking", "AWS", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "arn:partition:service:region:account-id:resource", + "arn:partition:service:region:account-id:resourcetype/resource", + "arn:partition:service:region:account-id:resourcetype:resource", + "arn:aws:s3:::my_corporate_bucket/Development/*" + ], + "Invalid": [] + } }, { "Name": "Facebook Access Token", @@ -370,7 +500,13 @@ "Token", "Bug Bounty", "NPM" - ] + ], + "Examples": { + "Valid": [ + "npm_ir3kktsOr4JeXqeD72C3cWo2mbs5sQ2pfnt9" + ], + "Invalid": [] + } }, { "Name": "GitHub Personal Access Token", @@ -385,7 +521,13 @@ "Bug Bounty", "Credentials", "GitHub" - ] + ], + "Examples": { + "Valid": [ + "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" + ], + "Invalid": [] + } }, { "Name": "GitHub OAuth Access Token", @@ -400,7 +542,13 @@ "Bug Bounty", "Credentials", "GitHub" - ] + ], + "Examples": { + "Valid": [ + "gho_16C7e42F292c6912E7710c838347Ae178B4a" + ], + "Invalid": [] + } }, { "Name": "GitHub App Token", @@ -415,7 +563,13 @@ "Bug Bounty", "Credentials", "GitHub" - ] + ], + "Examples": { + "Valid": [ + "ghu_16C7e42F292c6912E7710c838347Ae178B4a" + ], + "Invalid": [] + } }, { "Name": "GitHub Refresh Token", @@ -430,7 +584,13 @@ "Bug Bounty", "Credentials", "GitHub" - ] + ], + "Examples": { + "Valid": [ + "ghr_1B4a2e77838347a7E420ce178F2E7c6912E169246c34E1ccbF66C46812d16D5B1A9Dc86A1498" + ], + "Invalid": [] + } }, { "Name": "LinkedIn Client ID", @@ -625,7 +785,13 @@ "Bug Bounty", "Credentials", "StackHawk" - ] + ], + "Examples": { + "Valid": [ + "hawk.wz6bAoFDwcVQFCD9dofE.w2R1PWI8UTvEM4jd56XQ" + ], + "Invalid": [] + } }, { "Name": "NuGet API Key", @@ -683,7 +849,13 @@ "Bug Bounty", "Credentials", "Zapier" - ] + ], + "Examples": { + "Valid": [ + "https://hooks.zapier.com/hooks/catch/1234567/f8f22dgg/" + ], + "Invalid": [] + } }, { "Name": "Datadog API Key", @@ -757,7 +929,13 @@ "Bug Bounty", "Credentials", "New Relic" - ] + ], + "Examples": { + "Valid": [ + "NRRA-2a2d50d7d9449f3bb7ef65ac1184c488bd4fe7a8bd" + ], + "Invalid": [] + } }, { "Name": "New Relic Synthetics Location Key", @@ -770,7 +948,13 @@ "Tags": [ "Bug Bounty", "New Relic" - ] + ], + "Examples": { + "Valid": [ + "NRSP-us010E1E3D1716F721FF39F726B3E4CBCB7" + ], + "Invalid": [] + } }, { "Name": "New Relic User API Key", @@ -785,7 +969,13 @@ "Bug Bounty", "Credentials", "New Relic" - ] + ], + "Examples": { + "Valid": [ + "NRAK-WI4JTVS049IF5A3FGS5N51XS3Y5" + ], + "Invalid": [] + } }, { "Name": "Microsoft Teams Webhook", @@ -828,7 +1018,13 @@ "URL", "Google Calendar", "Google" - ] + ], + "Examples": { + "Valid": [ + "https://calendar.google.com/calendar/embed?src=ht3jlfaac5lfd6263ulfh4tql8%40group.calendar.google.com&ctz=Europe%2FLondon" + ], + "Invalid": [] + } }, { "Name": "Discord Webhook", @@ -842,7 +1038,13 @@ "Bug Bounty", "URL", "Discord" - ] + ], + "Examples": { + "Valid": [ + "https://discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij" + ], + "Invalid": [] + } }, { "Name": "Cloudinary Credentials", @@ -871,7 +1073,13 @@ "Credentials", "API Keys", "PyPI" - ] + ], + "Examples": { + "Valid": [ + "pypi-AgEIcHlwaS5vcmcCJDZlNzEyNGJmLWQ4N2UtNGZhYS1iNWEzLWQzYzg2YjU3NzAxYgACJXsicGVybWlzc2lvbnMiOiAidXNlciIsICJ2ZXJzaW9uIjogMX0AAAYgeYcgrZO31PTS_3ipsd0fTSMy1kVkxCzhQvHN6m97yIE" + ], + "Invalid": [] + } }, { "Name": "Shopify Private App Access Token", @@ -960,11 +1168,17 @@ "Bug Bounty", "AWS", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "arn:aws:sns:us-east-2:123456789012:MyTopic" + ], + "Invalid": [] + } }, { "Name": "Notion Note URI", - "Regex": "(?i)^(https:\/\/www\\.notion\\.so\/[A-Za-z0-9-_]+\/.*-[0-9a-f]{32})$", + "Regex": "(?i)^(https://www\\.notion\\.so/[A-Za-z0-9-_]+/.*-[0-9a-f]{32})$", "plural_name": false, "Description": null, "Rarity": 1, @@ -972,11 +1186,17 @@ "Tags": [ "Bug Bounty", "URL" - ] + ], + "Examples": { + "Valid": [ + "https://www.notion.so/test-user/My-Note-fa45346d9dd4421abc6857ce2e7fb0db" + ], + "Invalid": [] + } }, { "Name": "Notion Team Note URI", - "Regex": "(?i)^(https:\/\/[A-Za-z0-9-_]+\\.notion\\.site\/.*-[0-9a-f]{32})$", + "Regex": "(?i)^(https://[A-Za-z0-9-_]+\\.notion\\.site/.*-[0-9a-f]{32})$", "plural_name": false, "Description": null, "Rarity": 1, @@ -984,7 +1204,13 @@ "Tags": [ "Bug Bounty", "URL" - ] + ], + "Examples": { + "Valid": [ + "https://testorg.notion.site/My-Note-9f8863871e024ea6acc64d6564004a22" + ], + "Invalid": [] + } }, { "Name": "Nano (NANO) Wallet Address", @@ -998,57 +1224,90 @@ "Cryptocurrency Wallet", "Nano Wallet", "Nano" - ] + ], + "Examples": { + "Valid": [ + "nano_1c46rz7xnk98ozhzdjq7thwty844sgnqxk9496yysit1bnio1rcdzshc5ymn" + ], + "Invalid": [] + } }, { - "Name": "Time-Based One-Time Password (TOTP) URI", - "Regex": "^([^?\\n]+:\/\/totp\/[^\\n]+secret=[A-Z2-7=]+[^\\n]+)$", - "plural_name": false, - "Description": null, - "Rarity": 1, - "URL": null, - "Tags": [ + "Name": "Time-Based One-Time Password (TOTP) URI", + "Regex": "^([^?\\n]+://totp/[^\\n]+secret=[A-Z2-7=]+[^\\n]+)$", + "plural_name": false, + "Description": null, + "Rarity": 1, + "URL": null, + "Tags": [ "Credentials", "TOTP", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example", + "otpauth://totp/My_Ex0T1c-L00king.name?issuer=ArgsShouldBeCommutable&secret=JBSWY3DPEHPK3PXP&digits=6&period=30" + ], + "Invalid": [] + } }, { - "Name": "SSHPass Clear Password Argument", - "Regex": "^(sshpass [^\\n]*-p\\s+[^ ]+)$", - "plural_name": false, - "Description": null, - "Rarity": 1, - "URL": null, - "Tags": [ + "Name": "SSHPass Clear Password Argument", + "Regex": "^(sshpass [^\\n]*-p[ ]+[^ ]+)$", + "plural_name": false, + "Description": null, + "Rarity": 1, + "URL": null, + "Tags": [ "Credentials", "SSH", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "sshpass -P 'Please enter your password' -p MyPassw0RD!", + "sshpass -p MyPassw0RD!" + ], + "Invalid": [] + } }, { - "Name": "Mount Command With Clear Credentials", - "Regex": "^(mount(.cifs)?\\s+[^\\n]*(username=[^, \\n]+[^\\n ]*password=[^, \\n]+|password=[^, \\n]+[^\\n ]*username=[^, \\n]+))$", - "plural_name": false, - "Description": null, - "Rarity": 1, - "URL": null, - "Tags": [ + "Name": "Mount Command With Clear Credentials", + "Regex": "^(mount(.cifs)?\\s+[^\\n]*(username=[^, \\n]+[^\\n ]*password=[^, \\n]+|password=[^, \\n]+[^\\n ]*username=[^, \\n]+))$", + "plural_name": false, + "Description": null, + "Rarity": 1, + "URL": null, + "Tags": [ "Credentials", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "mount -o username=myuser,password=password", + "mount.cifs -o username=myuser,password=password", + "mount -t cifs -osec=ntlmv2,password=S3cUr3D!,domain=mydomain,noserverino,username=H4x0r" + ], + "Invalid": [] + } }, { - "Name": "CIFS Fstab Entry With Clear Credentials", - "Regex": "^(cifs\\s+[^\\n]*(username=[^, \\n]+[^\\n ]*password=[^, \\n]+|password=[^, \\n]+[^\\n ]*username=[^, \\n]+))$", - "plural_name": false, - "Description": null, - "Rarity": 1, - "URL": null, - "Tags": [ + "Name": "CIFS Fstab Entry With Clear Credentials", + "Regex": "^(cifs\\s+[^\\n]*(username=[^, \\n]+[^\\n ]*password=[^, \\n]+|password=[^, \\n]+[^\\n ]*username=[^, \\n]+))$", + "plural_name": false, + "Description": null, + "Rarity": 1, + "URL": null, + "Tags": [ "Credentials", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "cifs uid=1000,password=password,gid=1000,noperm,nofail,username=myuser" + ] + } }, { "Name": "Google Cloud Platform API Key", @@ -1089,10 +1348,16 @@ "Rarity": 0.8, "URL": null, "Tags": [ - "Credentials", - "API Keys", - "Bug Bounty" - ] + "Credentials", + "API Keys", + "Bug Bounty" + ], + "Examples": { + "Valid": [ + "secret_n2ZeRrMx743JQ5wiucZ0DBEe47opfKubUp22N0wIrOy" + ], + "Invalid": [] + } }, { "Name": "Internet Protocol (IP) Address Version 6", @@ -1107,7 +1372,14 @@ "IP", "IPv6", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "[2001:db8::1]:8080" + ], + "Invalid": [] + } }, { "Name": "Uniform Resource Locator (URL)", @@ -1119,7 +1391,20 @@ "Tags": [ "Identifiers", "URL" - ] + ], + "Examples": { + "Valid": [ + "tryhackme.com", + "http://username:password@example.com/", + "hTTPs://tryhackme.com", + "https://xn--80aaxitdbjk.xn--p1ai/", + "http://10.1.1.1", + "http://10.1.1.1/just/a/test" + ], + "Invalid": [ + "tryhackme.comm" + ] + } }, { "Name": "Internet Protocol (IP) Address Version 4", @@ -1134,10 +1419,16 @@ "IP", "IPv4", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "192.0.2.235:80" + ], + "Invalid": [] + } }, { - "Name": "Bitcoin (₿) Wallet Address", + "Name": "Bitcoin (\u20bf) Wallet Address", "Regex": "^(([1][a-km-zA-HJ-NP-Z1-9]{25,35})|([3][a-km-zA-HJ-NP-Z1-9]{33})|(bc|tb)1(?!.*[1bio])[a-z0-9]{39,59})$", "plural_name": false, "Description": null, @@ -1148,7 +1439,15 @@ "Cryptocurrency Wallet", "Bitcoin Wallet", "Bitcoin" - ] + ], + "Examples": { + "Valid": [ + "1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY", + "3EmUH8Uh9EXE7axgyAeBsCc2vdUdKkDqWK", + "bc1qj89046x7zv6pm4n00qgqp505nvljnfp6xfznyw" + ], + "Invalid": [] + } }, { "Name": "Latitude & Longitude Coordinates", @@ -1161,7 +1460,18 @@ "Geo-location", "Lat & Long", "Coords" - ] + ], + "Examples": { + "Valid": [ + "52.6169586, -1.9779857", + "53.76297,-1.9388732", + "77\u00b0 30' 29.9988\" N", + "N 32\u00b0 53.733 W 096\u00b0 48.358", + "41\u00b024'12.2\" N 2\u00b010'26.5\" E", + "40.741895,-73.989308" + ], + "Invalid": [] + } }, { "Name": "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)", @@ -1184,6 +1494,18 @@ "entry": "Vendor(s): ", "method": "hashmap", "deletion_pattern": "[:.-]" + }, + "Examples": { + "Valid": [ + "00:00:00:00:00:00", + "00-00-00-00-00-00", + "0000.0000.0000" + ], + "Invalid": [ + "00-00-00-00.00-00", + "00:00-00-00-00-00", + "00:00:0G:00:00:00" + ] } }, { @@ -1198,7 +1520,13 @@ "Cryptocurrency Wallet", "Dogecoin Wallet", "Dogecoin" - ] + ], + "Examples": { + "Valid": [ + "DANHz6EQVoWyZ9rER56DwTXHWUxfkv9k2o" + ], + "Invalid": [] + } }, { "Name": "Email Address", @@ -1212,7 +1540,17 @@ "Credentials", "Email Address", "Email" - ] + ], + "Examples": { + "Valid": [ + "github@skerritt.blog", + "firstname+lastname@example.com", + "john.smith@[123.123.123.123]" + ], + "Invalid": [ + "email@example@example.com" + ] + } }, { "Name": "Phone Number", @@ -1231,6 +1569,15 @@ "path": "phone_codes.json", "entry": "Location(s): ", "method": "hashmap" + }, + "Examples": { + "Valid": [ + "202-555-0178", + "+1-202-555-0156", + "+662025550156", + "+356 202 555 0156" + ], + "Invalid": [] } }, { @@ -1245,7 +1592,23 @@ "SSN", "Social Security Number", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "001-01-0001", + "001:01:0001", + "001.01.0001", + "001 01 0001" + ], + "Invalid": [ + "900-01-2222", + "999-21-2222", + "666-21-2222", + "000-21-5544", + "122-00-5544", + "122-32-0000" + ] + } }, { "Name": "Bitly Secret Key", @@ -1260,7 +1623,13 @@ "Credentials", "API Keys", "Bitly" - ] + ], + "Examples": { + "Valid": [ + "96f79079f1d658895d188a78f303220c6f161b05" + ], + "Invalid": [] + } }, { "Name": "Visual Studio App Center API Token", @@ -1276,7 +1645,13 @@ "Bug Bounty", "Visual Studio", "Microsoft" - ] + ], + "Examples": { + "Valid": [ + "4435bc4358816be97a3f014499116c83ab224fb2" + ], + "Invalid": [] + } }, { "Name": "YouTube Channel ID", @@ -1289,7 +1664,15 @@ "Media", "YouTube", "YouTube Channel" - ] + ], + "Examples": { + "Valid": [ + "UCjXfkj5iapKHJrhYfAF9ZGg" + ], + "Invalid": [ + "078-05-1120" + ] + } }, { "Name": "Discord Bot Token", @@ -1305,7 +1688,15 @@ "Bug Bounty", "Discord", "Discord Bot" - ] + ], + "Examples": { + "Valid": [ + "NzQ4MDk3ODM3OTgzODU4NzIz.X0YeZw.UlcjuCywUAWvPH9s-3cXNBaq3M4", + "MTE4NDQyNjQ0NTAxMjk5MjAz.DPM2DQ.vLNMR02Qxb9DJFucGZK1UtTs__s", + "ODYyOTUyOTE3NTg4NjM5NzY1.YOf1iA.7lARgFXmodxpgmPvOXapaKUga6M" + ], + "Invalid": [] + } }, { "Name": "UUID", @@ -1317,7 +1708,13 @@ "Tags": [ "Identifiers", "UUID" - ] + ], + "Examples": { + "Valid": [ + "b2ced6f5-2542-4f7d-b131-e3ada95d8b75" + ], + "Invalid": [] + } }, { "Name": "Turkish License Plate Number", @@ -1330,7 +1727,17 @@ "Identifiers", "License Plate", "Turkish" - ] + ], + "Examples": { + "Valid": [ + "34A2344", + "34A23415", + "06BK123", + "06JK1234", + "81ABC75" + ], + "Invalid": [] + } }, { "Name": "Date of Birth", @@ -1343,7 +1750,17 @@ "Identifiers", "Date of Birth", "DOB" - ] + ], + "Examples": { + "Valid": [ + "13.08.1987", + "13081987", + "13/08/1987", + "13-08-1987", + "13 08 1987" + ], + "Invalid": [] + } }, { "Name": "Monero (XMR) Wallet Address", @@ -1357,7 +1774,13 @@ "Cryptocurrency Wallet", "Monero Wallet", "Monero" - ] + ], + "Examples": { + "Valid": [ + "47DF8D9NwtmefhFUghynYRMqrexiZTsm48T1hhi2jZcbfcwoPbkhMrrED6zqJRfeYpXFfdaqAT3jnBEwoMwCx6BYDJ1W3ub" + ], + "Invalid": [] + } }, { "Name": "Litecoin (LTC) Wallet Address", @@ -1371,7 +1794,13 @@ "Cryptocurrency Wallet", "Litecoin Wallet", "Litecoin" - ] + ], + "Examples": { + "Valid": [ + "LRX8rSPVjifTxoLeoJtLf2JYdJFTQFcE7m" + ], + "Invalid": [] + } }, { "Name": "Ripple (XRP) Wallet Address", @@ -1386,7 +1815,13 @@ "Ripple Wallet", "Ripple", "XRP" - ] + ], + "Examples": { + "Valid": [ + "rBPAQmwMrt7FDDPNyjwFgwSqbWZPf6SLkk" + ], + "Invalid": [] + } }, { "Name": "American Express Card Number", @@ -1412,7 +1847,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "6556123456789012" + ], + "Invalid": [] + } }, { "Name": "Carte Blanche Card Number", @@ -1424,7 +1865,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "30137891521480" + ], + "Invalid": [] + } }, { "Name": "Diners Club Card Number", @@ -1436,7 +1883,14 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "3056 9309 0259 04", + "30000000000004" + ], + "Invalid": [] + } }, { "Name": "Discover Card Number", @@ -1449,7 +1903,14 @@ "Credit Card", "Finance", "Discover CC" - ] + ], + "Examples": { + "Valid": [ + "6011000000000004", + "6011 1111 1111 1117" + ], + "Invalid": [] + } }, { "Name": "MasterCard Number", @@ -1469,6 +1930,12 @@ "entry": "Issuer(s): ", "deletion_pattern": "\\s", "method": "hashmap" + }, + "Examples": { + "Valid": [ + "5409010000000004", + "5409 0100 0000 0004" + ] } }, { @@ -1481,7 +1948,14 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "5038146401278870", + "6759 6498 2643 8453" + ], + "Invalid": [] + } }, { "Name": "Visa Card Number", @@ -1495,7 +1969,14 @@ "Finance", "Visa CC", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "4111111111111111", + "4607 0000 0000 0009" + ], + "Invalid": [] + } }, { "Name": "Insta Payment Card Number", @@ -1507,7 +1988,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "6387849878080951" + ], + "Invalid": [] + } }, { "Name": "JCB Card Number", @@ -1519,7 +2006,14 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "3537124887293334", + "3543824683332150682" + ], + "Invalid": [] + } }, { "Name": "Korean Local Card Number", @@ -1531,7 +2025,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "9837282929900015" + ], + "Invalid": [] + } }, { "Name": "Laser Card Number", @@ -1543,7 +2043,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "630495060000000000" + ], + "Invalid": [] + } }, { "Name": "Solo Card Number", @@ -1555,7 +2061,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "6334498823141663" + ], + "Invalid": [] + } }, { "Name": "Switch Card Number", @@ -1567,7 +2079,13 @@ "Tags": [ "Credit Card", "Finance" - ] + ], + "Examples": { + "Valid": [ + "633341812811453789" + ], + "Invalid": [] + } }, { "Name": "Ethereum (ETH) Wallet Address", @@ -1581,7 +2099,13 @@ "Cryptocurrency Wallet", "Ethereum Wallet", "Ethereum" - ] + ], + "Examples": { + "Valid": [ + "0x52908400098527886E0F7030069857D2E4169EE7" + ], + "Invalid": [] + } }, { "Name": "Slack Token", @@ -1596,7 +2120,13 @@ "Credentials", "Bug Bounty", "Slack" - ] + ], + "Examples": { + "Valid": [ + "xoxb-51465443183-hgvhXVd2ISC2x7gaoRWBOUdQ" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services Organization Identifier", @@ -1609,7 +2139,13 @@ "Identifiers", "AWS", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "o-aa111bb222" + ], + "Invalid": [] + } }, { "Name": "Google API Key", @@ -1624,7 +2160,13 @@ "Credentials", "Google", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "AIzaSyD7CQl6fRhagGok6CzFGOOPne2X1u1spoA" + ], + "Invalid": [] + } }, { "Name": "Google OAuth Token", @@ -1638,7 +2180,13 @@ "Credentials", "Google", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "ya29.AHES6ZRnn6CfjjaK6GCQ84vikePv_hk4NUAJwzaAXamCL0s" + ], + "Invalid": [] + } }, { "Name": "Mailgun API Key", @@ -1653,7 +2201,13 @@ "Credentials", "Bug Bounty", "Mailgun" - ] + ], + "Examples": { + "Valid": [ + "key-1e1631a9414aff7c262721e7b6ff6e43" + ], + "Invalid": [] + } }, { "Name": "Twilio API Key", @@ -1668,7 +2222,13 @@ "Credentials", "Bug Bounty", "Twilio" - ] + ], + "Examples": { + "Valid": [ + "SK012dab2d3f4dab1c2f33dffafdf23142" + ], + "Invalid": [] + } }, { "Name": "Twilio Account SID", @@ -1682,7 +2242,13 @@ "API Keys", "Credentials", "Twilio" - ] + ], + "Examples": { + "Valid": [ + "AC10a133ffdfb112abb2d3f42d1d2d3b14" + ], + "Invalid": [] + } }, { "Name": "Twilio Application SID", @@ -1695,7 +2261,13 @@ "API Keys", "Credentials", "Twilio" - ] + ], + "Examples": { + "Valid": [ + "APfff01abd2b134a2aff3adc243ab211ab" + ], + "Invalid": [] + } }, { "Name": "Google ReCaptcha API Key", @@ -1710,7 +2282,13 @@ "Credentials", "Google", "Bug Bounty" - ] + ], + "Examples": { + "Valid": [ + "6Le3W6QUAAAANNT8X_9JwlNnK4kZGLaYTB3KqFLM" + ], + "Invalid": [] + } }, { "Name": "Amazon Standard Identification Number (ASIN)", @@ -1722,7 +2300,13 @@ "Tags": [ "Identifiers", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "B07ND5BB8V" + ], + "Invalid": [] + } }, { "Name": "JSON Web Token (JWT)", @@ -1736,7 +2320,13 @@ "Website", "JWT Token", "JWT" - ] + ], + "Examples": { + "Valid": [ + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services Access Key", @@ -1751,7 +2341,14 @@ "API Keys", "AWS", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "AKIA31OMZKYAARWZ3ERH", + "AKIAIOSFODNN7EXAMPLE" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services Secret Access Key", @@ -1767,7 +2364,13 @@ "AWS", "Bug Bounty", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "Nw0XP0t2OdyUkaIk3B8TaAa2gEXAMPLEMvD2tW+g" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services EC2 Instance Identifier", @@ -1780,7 +2383,13 @@ "Identifiers", "AWS", "Amazon" - ] + ], + "Examples": { + "Valid": [ + "i-1234567890abcdef0" + ], + "Invalid": [] + } }, { "Name": "Turkish Identification Number", @@ -1793,7 +2402,14 @@ "Credentials", "Identifiers", "Turkish" - ] + ], + "Examples": { + "Valid": [ + "12345678902", + "12345678900" + ], + "Invalid": [] + } }, { "Name": "ObjectID", @@ -1805,9 +2421,14 @@ "Tags": [ "Identifiers", "ObjectID" - ] + ], + "Examples": { + "Valid": [ + "5fc7c33a7ef88b139122a38a" + ], + "Invalid": [] + } }, - { "Name": "Recent Unix Timestamp", "Regex": "^([0-9]{10})$", @@ -1819,7 +2440,16 @@ "UNIX Timestamp", "Timestamp", "UNIX" - ] + ], + "Examples": { + "Valid": [ + "1577836800" + ], + "Invalid": [ + "94694400", + "1234567" + ] + } }, { "Name": "Recent Unix Millisecond Timestamp", @@ -1832,7 +2462,15 @@ "UNIX Timestamp", "Timestamp", "UNIX" - ] + ], + "Examples": { + "Valid": [ + "1577836800000" + ], + "Invalid": [ + "94694400000" + ] + } }, { "Name": "Unix Timestamp", @@ -1845,7 +2483,16 @@ "UNIX Timestamp", "Timestamp", "UNIX" - ] + ], + "Examples": { + "Valid": [ + "1577836800", + "94694400" + ], + "Invalid": [ + "1234567" + ] + } }, { "Name": "Unix Millisecond Timestamp", @@ -1858,7 +2505,14 @@ "UNIX Timestamp", "Timestamp", "UNIX" - ] + ], + "Examples": { + "Valid": [ + "1577836800000", + "94694400000" + ], + "Invalid": [] + } }, { "Name": "ULID", @@ -1870,7 +2524,13 @@ "Tags": [ "Identifiers", "ULID" - ] + ], + "Examples": { + "Valid": [ + "01ERJ58HMWDN3VTRRHZQV2T5R5" + ], + "Invalid": [] + } }, { "Name": "YouTube Video ID", @@ -1883,7 +2543,13 @@ "Media", "YouTube Video", "YouTube" - ] + ], + "Examples": { + "Valid": [ + "dQw4w9WgXcQ" + ], + "Invalid": [] + } }, { "Name": "Turkish Tax Number", @@ -1896,7 +2562,13 @@ "Credentials", "Identifiers", "Turkish" - ] + ], + "Examples": { + "Valid": [ + "1234567890" + ], + "Invalid": [] + } }, { "Name": "Key:Value Pair", @@ -1907,6 +2579,12 @@ "URL": null, "Tags": [ "Credentials" - ] + ], + "Examples": { + "Valid": [ + "james:S3cr37_P@$$W0rd" + ], + "Invalid": [] + } } -] +] \ No newline at end of file diff --git a/scripts/format_regex.py b/scripts/format_regex.py new file mode 100644 index 0000000..88d59ba --- /dev/null +++ b/scripts/format_regex.py @@ -0,0 +1,8 @@ +import json + +with open("pywhat/Data/regex.json") as file: + database = json.load(file) + + +with open("pywhat/Data/regex.json", "w") as file: + json.dump(database, file, indent=3) diff --git a/tests/test_regex_formatting.py b/tests/test_regex_database.py similarity index 66% rename from tests/test_regex_formatting.py rename to tests/test_regex_database.py index 65b5cc2..f691fff 100644 --- a/tests/test_regex_formatting.py +++ b/tests/test_regex_database.py @@ -1,10 +1,25 @@ import re +import pytest + from pywhat.helper import load_regexes database = load_regexes() +@pytest.mark.skip( + reason="Not all regex have tests now, check https://github.com/bee-san/pyWhat/pull/146#issuecomment-927087231 for info." +) +def test_if_all_tests_exist(): + with open("tests/test_regex_identifier.py", "r", encoding="utf-8") as file: + tests = file.read() + + for regex in database: + assert ( + regex["Name"] in tests + ), "No test for this regex found in 'test_regex_identifier.py'. Note that a test needs to assert the whole name." + + def test_name_capitalization(): for entry in database: entry_name = entry["Name"] @@ -36,16 +51,17 @@ def test_regex_format(): def test_check_keys(): for entry in database: - keys = list(entry.keys()) - entry_name = entry["Name"] - - assert "Name" in keys, entry_name - assert "Regex" in keys, entry_name - assert "plural_name" in keys, entry_name - assert "Description" in keys, entry_name - assert "Rarity" in keys, entry_name - assert "URL" in keys, entry_name - assert "Tags" in keys, entry_name + for key in [ + "Name", + "Regex", + "plural_name", + "Description", + "Rarity", + "URL", + "Tags", + # "Examples", # TODO + ]: + assert key in entry, f"{key} is missing in {entry['Name']}" def test_sorted_by_rarity(): diff --git a/tests/test_regex_identifier.py b/tests/test_regex_identifier.py index 52a1de6..be112bc 100644 --- a/tests/test_regex_identifier.py +++ b/tests/test_regex_identifier.py @@ -1,4 +1,5 @@ import re +from typing import List, Tuple import pytest @@ -8,1056 +9,88 @@ database = load_regexes() r = regex_identifier.RegexIdentifier() -filter1 = Filter({"MinRarity": 0.0}) -d = Distribution(filter1) -r_rarity_0 = regex_identifier.RegexIdentifier() - - -def _assert_match_first_item(name, res): - assert name in res[0]["Regex Pattern"]["Name"] - - -def _assert_match_exploit_first_item(search, res): - assert search in res[0]["Regex Pattern"]["Exploit"] +dist = Distribution(Filter({"MinRarity": 0.0})) def test_regex_successfully_parses(): - assert "Name" in r.distribution.get_regexes()[0] - - -def _assert_match_in_items(name, res): - assert any(name in i["Regex Pattern"]["Name"] for i in res) - - -@pytest.mark.skip( - reason="Not all regex have tests now, check https://github.com/bee-san/pyWhat/pull/146#issuecomment-927087231 for info." -) -def test_if_all_tests_exist(): - with open("tests/test_regex_identifier.py", "r", encoding="utf-8") as file: - tests = file.read() - - for regex in database: - assert ( - regex["Name"] in tests - ), "No test for this regex found in 'test_regex_identifier.py'. Note that a test needs to assert the whole name." - - -def test_dogecoin(): - res = r.check(["DANHz6EQVoWyZ9rER56DwTXHWUxfkv9k2o"]) - _assert_match_first_item("Dogecoin (DOGE) Wallet Address", res) - - -def test_url(): - res = r.check(["tryhackme.com"]) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - - -def test_url_2(): - res = r.check(["http://username:password@example.com/"]) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - - -def test_invalid_tld(): - res = r.check(["tryhackme.comm"]) - assert "Uniform Resource Locator (URL)" not in res - - -def test_https(): - res = r.check(["hTTPs://tryhackme.com"]) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - - -def test_lat_long(): - res = r.check(["52.6169586, -1.9779857"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) - - -def test_lat_long2(): - res = r.check(["53.76297,-1.9388732"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) + regexes = r.distribution.get_regexes() + assert type(regexes) == list + assert len(regexes) != 0 + assert all([type(regex) == dict for regex in regexes]) -def test_lat_long3(): - res = r.check(["77\u00B0 30' 29.9988\" N"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) - - -def test_lat_long4(): - # degree symbol has to be a unicode character, otherwise Windows will not understand it - res = r.check(["N 32\u00B0 53.733 W 096\u00B0 48.358"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) - - -def test_lat_long5(): - res = r.check(["41\u00B024'12.2\" N 2\u00B010'26.5\" E"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) - - -def test_lat_long6(): - res = r.check(["40.741895,-73.989308"]) - _assert_match_first_item("Latitude & Longitude Coordinates", res) - - -def test_ip(): - res = r.check( - ["http://10.1.1.1/just/a/test"], - boundaryless=Filter({"Tags": ["Identifiers"]}), - ) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - assert "Internet Protocol (IP) Address Version 4" in res[1]["Regex Pattern"]["Name"] - - -def test_ip_not_url(): - res = r.check(["http://10.1.1.1"]) - assert "Uniform Resource Locator (URL)" not in res[0] - - -def test_ip2(): - res = r.check(["192.0.2.235:80"]) - assert "192.0.2.235:80" in res[0]["Matched"] - - -def test_ip3(): - res = r.check(["2001:0db8:85a3:0000:0000:8a2e:0370:7334"]) - _assert_match_first_item("Internet Protocol (IP) Address Version 6", res) - - -def test_ip4(): - res = r.check(["[2001:db8::1]:8080"]) - assert "[2001:db8::1]:8080" in res[0]["Matched"] - - -def test_mac(): - res = r.check(["00:00:00:00:00:00"]) - assert ( - res - and "00:00:00:00:00:00" in res[0]["Matched"] - and res[0]["Regex Pattern"]["Name"] - == "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - and "Xerox Corp" in res[0]["Regex Pattern"]["Description"] - ) - - -def test_mac2(): - res = r.check(["00-00-00-00-00-00"]) - assert ( - res - and "00-00-00-00-00-00" in res[0]["Matched"] - and res[0]["Regex Pattern"]["Name"] - == "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - and "Xerox Corp" in res[0]["Regex Pattern"]["Description"] +def regex_valid_match(name: str, match: str) -> bool: + return any( + name in matched["Regex Pattern"]["Name"] + for matched in r.check([match], dist=dist) ) -def test_mac3(): - res = r.check(["0000.0000.0000"]) - assert ( - res - and "0000.0000.0000" in res[0]["Matched"] - and res[0]["Regex Pattern"]["Name"] - == "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - and "Xerox Corp" in res[0]["Regex Pattern"]["Description"] - ) - - -def test_mac4(): - res = r.check(["00-00-00-00.00-00"]) - assert ( - not res - or res[0]["Regex Pattern"]["Name"] - != "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - ) - - -def test_mac5(): - res = r.check(["00:00-00-00-00-00"]) - assert ( - not res - or res[0]["Regex Pattern"]["Name"] - != "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - ) +@pytest.mark.parametrize( + "name,match", + [ + (regex["Name"], match) + for regex in database + for match in regex.get("Examples", {}).get("Valid", []) + ], +) +def test_regex_valid_match(name: str, match: str): + assert regex_valid_match(name, match) -def test_mac6(): - res = r.check(["00:00:0G:00:00:00"]) - assert ( - not res - or res[0]["Regex Pattern"]["Name"] - != "EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc)" - ) +@pytest.mark.parametrize( + "name,match", + [ + (regex["Name"], match) + for regex in database + for match in regex.get("Examples", {}).get("Invalid", []) + ], +) +def test_regex_invalid_match(name: str, match: str): + assert not regex_valid_match(name, match) @pytest.mark.skip( reason="Fails because not a valid TLD. If presented in punycode, it works." ) def test_international_url(): - res = r.check(["http://папироска.рф"]) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - - -def test_same_international_url_in_punycode(): - res = r.check(["https://xn--80aaxitdbjk.xn--p1ai/"]) - _assert_match_first_item("Uniform Resource Locator (URL)", res) - - -def test_ctf_flag(): - res = r.check(["thm{hello}"]) - _assert_match_first_item("TryHackMe Flag Format", res) - - -def test_ctf_flag_uppercase(): - res = r.check(["FLAG{hello}"]) - _assert_match_first_item("Capture The Flag (CTF) Flag", res) - - -def test_htb_flag(): - res = r.check(["htb{just_a_test}"]) - _assert_match_first_item("HackTheBox Flag Format", res) - - -def test_ethereum(): - res = r.check(["0x52908400098527886E0F7030069857D2E4169EE7"]) - _assert_match_first_item("Ethereum (ETH) Wallet Address", res) - - -def test_bitcoin_p2pkh(): - res = r.check(["1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY"]) - _assert_match_first_item("Bitcoin (₿) Wallet Address", res) - - -def test_bitcoin_p2sh(): - res = r.check(["3EmUH8Uh9EXE7axgyAeBsCc2vdUdKkDqWK"]) - _assert_match_first_item("Bitcoin (₿) Wallet Address", res) - - -def test_bitcoin_bech32(): - res = r.check(["bc1qj89046x7zv6pm4n00qgqp505nvljnfp6xfznyw"]) - _assert_match_first_item("Bitcoin (₿) Wallet Address", res) - - -def test_monero(): - res = r.check( - [ - "47DF8D9NwtmefhFUghynYRMqrexiZTsm48T1hhi2jZcbfcwoPbkhMrrED6zqJRfeYpXFfdaqAT3jnBEwoMwCx6BYDJ1W3ub" - ] - ) - _assert_match_first_item("Monero (XMR) Wallet Address", res) - - -def test_litecoin(): - res = r.check(["LRX8rSPVjifTxoLeoJtLf2JYdJFTQFcE7m"]) - _assert_match_first_item("Litecoin (LTC) Wallet Address", res) - - -def test_visual_studio_token(): - res = r.check(["4435bc4358816be97a3f014499116c83ab224fb2"]) - _assert_match_in_items("Visual Studio App Center API Token", res) - - -def test_npm_token(): - res = r.check(["npm_ir3kktsOr4JeXqeD72C3cWo2mbs5sQ2pfnt9"]) - _assert_match_first_item("Node Package Manager (NPM) Token", res) - - -def test_bitly_secret_key(): - res = r.check(["96f79079f1d658895d188a78f303220c6f161b05"]) - _assert_match_in_items("Bitly Secret Key", res) - - -def test_bitcoincash(): - res = r.check(["bitcoincash:qzlg6uvceehgzgtz6phmvy8gtdqyt6vf359at4n3lq"]) - _assert_match_first_item("Bitcoin Cash (BCH) Wallet Address", res) - - -def test_ripple(): - res = r.check(["rBPAQmwMrt7FDDPNyjwFgwSqbWZPf6SLkk"]) - _assert_match_first_item("Ripple (XRP) Wallet Address", res) - - -def test_visa(): - res = r.check(["4111111111111111"]) - _assert_match_first_item("Visa Card Number", res) - - -def test_visa_spaces(): - res = r.check(["4607 0000 0000 0009"]) - _assert_match_first_item("Visa Card Number", res) - - -def test_master_Card(): - res = r.check(["5409010000000004"]) - _assert_match_first_item("MasterCard Number", res) - assert "UNION NATIONAL BANK" in res[0]["Regex Pattern"]["Description"] - - -def test_master_card_spaces(): - res = r.check(["5409 0100 0000 0004"]) - _assert_match_first_item("MasterCard Number", res) - assert "UNION NATIONAL BANK" in res[0]["Regex Pattern"]["Description"] - - -def test_american_express(): - res = r.check(["340000000000009"]) - _assert_match_first_item("American Express Card Number", res) - - -def test_american_express_spaces(): - res = r.check(["3714 4963 5398 431"]) - _assert_match_first_item("American Express Card Number", res) - - -def test_american_diners_club(): - res = r.check(["30000000000004"]) - assert "Diners Club Card Number" in res[1]["Regex Pattern"]["Name"] - - -def test_american_diners_club_spaces(): - res = r.check(["3056 9309 0259 04"]) - _assert_match_first_item("Diners Club Card Number", res) - - -def test_discover_card(): - res = r.check(["6011000000000004"]) - _assert_match_first_item("Discover Card Number", res) - - -def test_discover_card_spaces(): - res = r.check(["6011 1111 1111 1117"]) - _assert_match_first_item("Discover Card Number", res) - - -def test_maestro_card(): - res = r.check(["5038146401278870"]) - _assert_match_first_item("Maestro Card Number", res) - - -def test_maestro_card_spaces(): - res = r.check(["6759 6498 2643 8453"]) - _assert_match_first_item("Maestro Card Number", res) - - -@pytest.mark.skip("Key:Value Pair is not ran by default because of low rarity.") -def test_username(): - res = r.check(["james:S3cr37_P@$$W0rd"]) - _assert_match_first_item("Key:Value Pair", res) - - -def test_email(): - res = r.check(["github@skerritt.blog"]) - _assert_match_first_item("Email Address", res) - - -def test_email2(): - res = r.check(["firstname+lastname@example.com"]) - _assert_match_first_item("Email Address", res) - - -def test_email3(): - res = r.check( - ["john.smith@[123.123.123.123]"], - boundaryless=Filter({"Tags": ["Identifiers"]}), - ) - assert "Email Address" in res[2]["Regex Pattern"]["Name"] - - -def test_email4(): - res = r.check(["email@example@example.com"]) - assert "Email Address" not in res - - -def test_phone_number(): - res = r.check(["202-555-0178"]) - _assert_match_first_item("Phone Number", res) - - -def test_phone_number2(): - res = r.check(["+1-202-555-0156"]) - _assert_match_first_item("Phone Number", res) - assert "United States" in res[0]["Regex Pattern"]["Description"] - - -def test_phone_number3(): - res = r.check(["+662025550156"]) - _assert_match_first_item("Phone Number", res) - assert "Thailand" in res[0]["Regex Pattern"]["Description"] - - -def test_phone_number4(): - res = r.check(["+356 202 555 0156"]) - _assert_match_first_item("Phone Number", res) - assert "Malta" in res[0]["Regex Pattern"]["Description"] - - -def test_youtube(): - res = r.check(["https://www.youtube.com/watch?v=ScOAntcCa78"]) - _assert_match_first_item("YouTube Video", res) - - -def test_youtube2(): - res = r.check(["http://www.youtube.com/watch?v=dQw4w9WgXcQ"]) - _assert_match_first_item("YouTube Video", res) - - -def test_youtube_id(): - res = r.check(["dQw4w9WgXcQ"], dist=d) - _assert_match_first_item("YouTube Video ID", res) - - -def test_youtube_id2(): - res = r.check(["078-05-1120"], dist=d) - assert "YouTube Video ID" not in res - - -def test_youtube_channel_id(): - res = r.check(["UCjXfkj5iapKHJrhYfAF9ZGg"]) - _assert_match_first_item("YouTube Channel ID", res) - - -def test_ssn(): - res = r.check(["001-01-0001"]) - _assert_match_first_item("American Social Security Number", res) - - -def test_ssn2(): - res = r.check(["001:01:0001"]) - _assert_match_first_item("American Social Security Number", res) - - -def test_ssn3(): - res = r.check(["001.01.0001"]) - _assert_match_first_item("American Social Security Number", res) - - -def test_ssn4(): - res = r.check(["001 01 0001"]) - _assert_match_first_item("American Social Security Number", res) - - -def test_ssn5(): - res = r.check(["900-01-2222"]) - assert "American Social Security Number" not in str(res) - - -def test_ssn6(): - res = r.check(["999-21-2222"]) - assert "American Social Security Number" not in str(res) - - -def test_ssn7(): - res = r.check(["666-21-2222"]) - assert "American Social Security Number" not in str(res) - - -def test_ssn8(): - res = r.check(["000-21-5544"]) - assert "American Social Security Number" not in str(res) - - -def test_ssn9(): - res = r.check(["122-00-5544"]) - assert "American Social Security Number" not in str(res) - - -def test_ssn10(): - res = r.check(["122-32-0000"]) - assert "American Social Security Number" not in str(res) - - -def test_cors(): - res = r.check(["Access-Control-Allow: *"]) - _assert_match_first_item("Access-Control-Allow-Header", res) - - -def test_jwt(): - res = r.check( - [ - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" - ] - ) - _assert_match_first_item("JSON Web Token (JWT)", res) - - -def test_s3(): - res = r.check(["http://s3.amazonaws.com/bucket/"]) - _assert_match_first_item("Amazon Web Services Simple Storage (AWS S3) URL", res) - - -def test_s3_internal(): - res = r.check(["s3://bucket/path/key"]) - _assert_match_first_item( - "Amazon Web Services Simple Storage (AWS S3) Internal URL", res - ) - - -def test_s3_internal2(): - res = r.check(["s3://bucket/path/directory/"]) - _assert_match_first_item( - "Amazon Web Services Simple Storage (AWS S3) Internal URL", res - ) - - -def test_arn(): - res = r.check(["arn:partition:service:region:account-id:resource"]) - _assert_match_first_item("Amazon Resource Name (ARN)", res) - - -def test_arn2(): - res = r.check(["arn:partition:service:region:account-id:resourcetype/resource"]) - _assert_match_first_item("Amazon Resource Name (ARN)", res) - - -def test_arn3(): - res = r.check(["arn:partition:service:region:account-id:resourcetype:resource"]) - _assert_match_first_item("Amazon Resource Name (ARN)", res) - - -def test_arn4(): - res = r.check(["arn:aws:s3:::my_corporate_bucket/Development/*"]) - _assert_match_first_item("Amazon Resource Name (ARN)", res) - - -def test_unix_timestamp(): - res = r.check(["1577836800"], dist=d) # 2020-01-01 - keys = [m["Regex Pattern"]["Name"] for m in res] - assert "Unix Timestamp" in keys - assert "Recent Unix Timestamp" in keys - - -def test_unix_timestamp2(): - res = r.check(["94694400"], dist=d) # 1973-01-01 - keys = [m["Regex Pattern"]["Name"] for m in res] - assert "Unix Timestamp" in keys - assert "Recent Unix Timestamp" not in keys - - -def test_unix_timestamp3(): - res = r.check(["1234567"], dist=d) # 7 numbers - keys = [m["Regex Pattern"]["Name"] for m in res] - assert "Unix Timestamp" not in keys - assert "Recent Unix Timestamp" not in keys - - -def test_unix_timestamp4(): - res = r.check(["1577836800000"], dist=d) # 2020-01-01 - keys = [m["Regex Pattern"]["Name"] for m in res] - assert "Unix Millisecond Timestamp" in keys - assert "Recent Unix Millisecond Timestamp" in keys - - -def test_unix_timestamp5(): - res = r.check(["94694400000"], dist=d) # 1973-01-01 - keys = [m["Regex Pattern"]["Name"] for m in res] - assert "Unix Millisecond Timestamp" in keys - assert "Recent Unix Millisecond Timestamp" not in keys - - -def test_ssh_rsa_key(): - res = r.check( - [ - "ssh-rsa AAAAB3NzaC1tc2EAAAADAQABAAACAQDrnjkGtf3iA46rtwsvRiscvMTCw30l5Mmln/sf8Wohg4RPc7nuIx3/fB86K9jzBNoQk6Fb00p2cSW0dX6c3OTL5R5Q0rBjOFy6GV07MkS7rXa7WYh4ObxBh+M+LEzxVIw29anzQFZkR0TAf6x2rBoErK7JYU4fyqFBDFupTt3coQDPEEmVwtLLUCEnJrurbbnJKcWJ+/FbItLxYyMLPl8TwEn0iqiJ97onCU2DuBtiYv3hp1WoEH08b5WDF0F04zEPRdJT+WisxlEFRgaj51o2BtjOC+D2qZQDb4LHaAfJ0WcO4nu7YocdlcLp2JPfXKKgu9P5J8UDsmXbR3KCJ1oddFa2R6TbHc6d2hKyG4amBzMX5ltxXu7D6FLPZlFqua8YooY7A2zwIVirOUH/cfx+5O9o0CtspkNmj/iYzN0FPaOpELncWsuauy9hrGql/1cF4SUr20zHFoBoDQUtmvmBnWnKoGfpWXzuda449FVtmcrEjvBzCvCb3RStu0BbyOOybJagbKif3MkcYVO10pRbTveIUwgCD6F3ypD11XztoPNsgScmjme0sj/KWWNLyQkLWtpJEQ4k46745NAC5g+nP28TR2JM8doeqsxA8JovQkLWwDcR+WYZu2z/I8dfhOmalnoMRTJ2NzWDc0OSkKGYWjexR4fN6lAKCUOUptl9Nw== r00t@my-random_host" - ] - ) - _assert_match_first_item("SSH RSA Public Key", res) - - -def test_pem_rsa_private_key(): - # key size: 2048 bit - res = r.check( - [ - "-----BEGIN RSA PRIVATE KEY-----MIIEoQIBAAKCAQBYNGcp1Jm7GOGffs9wvpIsi9RKPE/a4usQyEdf8G2C0pLcOoypfG1MiOQCDDRN4HtMDoe9KTVjVnnREfmQq2k1hT1BZHfaRu/3YvpFrleozzYmY1XRSeUiM6G71ADg8cPZlAuH1RjswlevJyhNVWzy+DLumpbRgv6nKR9dYSdy2GsFySX488l05+ZaVKgHwlGeKd33YNPRAUNLSPKLdd9wi1djGaQpSo7jWRb6lIFJUR7FdvxwjAVMhDljxXYHPP0GXFS6KTGcfB97dle90qu/4nwdKWd4RZ5pqIbFi1D5ejItUzY40GpsPuN/tkamwB5jY0AtFY8S9TMxHjRx05/DAgMBAAECggEAKU5pHYLNd3wAdTPqq27jf28APL+f2e64jIRuQHSUpFY+plnY86oseVIGDRtwByRgOU74rFI3CU0/APS8/c34GDNMa2pEYnkj+aNldupdbNWVE0cjsj47yteJHy/6NV2jDSqyd6sI4B9m9sSMsCKYQfSPzYOhq34ACYJNiOptke9PkxpNNODlFJrFQsRKKpv2KdF7Lh3/Yzc6p53gilYR9U+Sn4mBrkuURLm2Qq++r0CNTjpmbunbjAL5q/oK8bpJEz3uZqbSQ5GbSLCNroRyi7eIF1Evvk0Vb9nSyfm94VdP+yVr1VvtOt8WigHwAr8E+ujg0rrAKMswfbvNFroNMQKBgQCs/rQvlTfpRiHUlCB09HZzquM8o7pBxTpKAX9247SW81V41EHsIS69WGZzcYbYQlxOxQi7gHiALB/yRLFNiAHAhODFMGTYtprTdW/JK6TC8CPvK3TBnPSYDPP/ME2F2UZKVHWlD3FFtUqp9BppWCHDLp7N/+i5eJy+ankJYzeGywKBgQCChsDhaPJAnHp/zHJmhDXQkqVeoB8SW2WzH481xVgyu2gIsEGmgActfEAyCqRuzjnMSIjXBL5LSAZXft8d+wveR3PsUiVdUurbcrije1ku3jDPXdBQrjmyWZvCXXnZ8oqX18C05a0pgzX5oDluA1ShcI7uWNHkIPYcZskcp96z6QKBgG9gpP2lopOrtYg5vhPOeJzLvvWBrB9ALeELydbvj4tIKxVaAv9V9dOuIHfe9aQyRV/pd0/QzMQopIDEPSrfj9E1O8l4+NSV7GSMTWZFlRR0q44GemtU9B0Y6da4cJDmbFzat8uHf7QTnniBUqfUOBiD4XZbdqhCwRfPURH8MPm1AoGAWHZ9yQe4kAO9nlnw+vwGAQsymxRImsdpAOKVy+qpIREUrDbQ98hzlOdOFtxRn2uTjplmbNwhIKJ68dfh3c7kt0yUC4mNG1f0JrD05I/X3MToLdK2OcgrAG5s+2khCY6xUcH/MFstZiIwdbOa2K3XMOc5Z964ujWAt7UN/qbjb+kCgYBdPN6J1b6OuTt4xYTCenX+KlGBb9QsuK8uXMDkhJhrtcHAyuxyJrDjQu5i3djeZerflT0EESCet0zGPd5bGyP4KaIsmLwYheDLrziS6xqqXL0irMZiWVaVquC3JlWJMw6/Y66WRuxd+oRBbE62lHWnzT2J8dfG+su483KKgli02Q==-----END RSA PRIVATE KEY-----" - ] - ) - _assert_match_first_item("PEM-formatted Private Key", res) - - -def test_pem_dsa_private_key(): - res = r.check( - [ - "-----BEGIN DSA PRIVATE KEY-----MIIDTgIBAAKCAQEAj3k12bmq6b+r7Yh6z0lRtvMuxZ47rzcY6OrElh8+/TYG50NRqcQYMzm4CefCrhxTm6dHW4XQEa24tHmHdUmEaVysDo8UszYIKKIv+icRCj1iqZNFNAmg/mlsRlj4S90ggZw3CaAQV7GVrc0AIz26VIS2KR+dZI74g0SGd5ec7AS0NKasLnXpmF3iPbApL8ERjJ/6nYGB5zONt5K3MNe540lZL2gJmHIVORXqPWuLRlPGM0WPgDsypMLg8nKQJW5OP4o7CDihxFDk4YwaKaN9316hQ95LZv8EkD7VzxYj4VjUh8YI6X8hHNgdyiPLbjgHZfgi40K+SEwFdjk5YBzWZwIdALr2lqaFePff3uf6Z8l3x4XvMrIzuuWAwLzVaV0CggEAFqZcWCBIUHBOdQKjl1cEDTTaOjR4wVTU5KXALSQu4E+W5h5L0JBKvayPN+6x4J8xgtI8kEPLZC+IAEFg7fnKCbMgdqecMqYn8kc+kYebosTnRL0ggVRMtVuALDaNH6g+1InpTg+gaI4yQopceMR4xo0FJ7ccmjq7CwvhLERoljnn08502xAaZaorh/ZMaCbbPscvS1WZg0u07bAvfJDppJbTpV1TW+v8RdT2GfY/Pe27hzklwvIk4HcxKW2oh+weR0j4fvtf3rdUhDFrIjLe5VPdrwIRKw0fAtowlzIk/ieu2oudSyki2bqL457Z4QOmPFKBC8aIt+LtQxbh7xfb3gKCAQB87fMOaF3zru0d3blONyvU4kEclm0i79Shdm2r2dBQo9ru8KdmbBoBS3qS7k//hEuLCCdHAKdLrz8cdbah8ONEVVu/HTDS5TKcm1W/czHch0NhYIfMFschQcEAcswOLjGoRGHl2SZb90pF2dxMxKEgi1QLoPRRX8UWpGy5+ghkaIBEUE31p4dS3vJ1EevQc3itZ2Sh7UcY3hQ8idYptzTwL9p7c4V/aWXLFbQdzJCSi1Q5fr85Uj2eFZTHliYe5ZrZ3R+nl1fbk/ySajbLD6RaTm/ppRfWRxyw3MWjKxPapeLFIsxm1A9rnDyfeEDg1Ixahaq0xLk46RwBo6ZblI0aAh0An8MAVnsLGjtDHBGIlDH+XXPsMkClXnYeBRUGAQ==-----END DSA PRIVATE KEY-----" - ] - ) - _assert_match_first_item("PEM-formatted Private Key", res) - - -def test_pem_ecdsa_private_key(): - res = r.check( - [ - "-----BEGIN EC PRIVATE KEY-----MIHcAgEBBEIApe6jUvbal/QN6ZoQ9dZMe/pTx4CiFzd4ln9a5f0Ope+788+BwgLpl1888OThkaWMeg2wevZ/ErMId0T3kZGoE7mgBwYFK4EEACOhgYkDgYYABAE4SLWZJs6lE0bwYgMipcRxB1xtARXDwbPt3o7aDI7680kLnELXGYhIhGeXlhXgAXjE66GuM8TdbPsshqP9nRy9OAGbxJU/OA+7/zuZmo10IYWNu1IrcGYq0WZJwzZex+S12+VKVBEwPoLKlgm5r/sI8x7WnDtialy5i8ipkvUyOyPUxg==-----END EC PRIVATE KEY-----" - ] - ) - _assert_match_in_items("PEM-formatted Private Key", res) - - -def test_pem_openssl_pkcs8_private_key(): - res = r.check( - [ - "-----BEGIN PRIVATE KEY-----MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDaoE09/Cmh1T8I3J9lenqZ2pllw0WXAUrPi4pPV3jmJBsIsfpedZfakdI2ixw2XkWRayAklsxlFFtXCQ6U0yXSd7KJY9vuxb+5cMZejpOoHTZkVwxhlEodCt8DWf5tOc4UA5Ip88WYeszygxuIU6JP0bavJhtQnI5ER+0eZCY8xyNLqQ86h6iuxncAo5fxyc44IKFSm6MDh+GmHBlK5Eql536qfZtA6jMFYnORQ1gVp5J1hQ7bDmiLzFjyCvpNSYLOYbodvcCIWCSUKgp5Q5Uo0EX2h7mX6Z07ONCOQaFXfW3z5/xbn1bJKtI+JSNFS86owWb20EYcopnWwOimmsTXAgMBAAECggEAPW5Tpfon/Jg9+RB9HXeX4YliFw0SjcbILZ9JAthSWWCF1CCmeEpUnA7jYX4fNEuzApR2WLGixzg8Hi2mUj0uYIBPw3kywFoCcGn243Tumoty0CkBip2vYY+/cGKmMizO8iK6vF0KBbljwzUB1IGjlwgXbAmqHTGQbDFFuIdtkx/ggns9X/wNNqK7UPaJoYvlv/YX10/OgBgGQMBWTjvZ3rWg4+TUJymO4edlBK4VmPeBE+syPBcc/YNV+sYDnww8U1hucA5hJ4hOIomFYyaYYUtdWKoAwLJxGf7tZ6hgq16iMbzHcJ2gNCINcWKTByEosqX3aA3TvkyTDMwQguAn8QKBgQD2uViv8qyeVy+RrHH6pC3KoEIUYIz6LTulEDL2YcsRr5FKubzxOU6OEcx1TSmkCmUxyUAyFDyTH/aG0c1H8EWYAwMT7N25Pax1bgjJM+A1z3SU9qxOmdFqFz5v7YC9qnLkODErRByuFsfwdxxJedP4Vles/HZc1tnKYl/v8n81jwKBgQDi2IVlMx9LiBfgZeSI/dkUg3pLT1e3Mu52/WMGmUXRWFKta5P/URw/mgNqJ/nPFQRR3Jn3b6augGtMjomJ+l7pnlv/OX8oj0h46Brx08wrifZMHUStB6Rt2vOy9asLk84rQIgMh7I/PeZ3r/w8dZg7B1IUMyLuyjGcSoh2Q76oOQKBgQDsCy9aRiX35xnPmNgDH4ffz6roq+a0gwoJRZI8Pht19C5g+4pUjqslKMoff49TLc7a7tvIDaxWZcIKAjcPmEQ8xsTvDzKhwut3/anSNRtQ4AV9bvIy0N6VTV+i3erJioUY6tm/tw5pT8pBuPMLKM8vTAvdqDvlXnhHNA7tFWe26QKBgQCok922EiK8n9uWkEIgp/ztqLN2SfVWmIvsc2tm2Pqwk2GFrP+j6mQCw/Krrh+QC/9U0oq8/gUxgw+6Keb+Wci09lFJvzHHM4vZBiwX8Jy28mTNtaZ2q8o/NUqLgNPm26WIMQGpxiHpq5ec9HSPfZhurYcKqeHY8PujOSRmNvv1yQKBgQCx65dznLE32KQhJbN9lXbr7mYdqurJMrchQ4E9zI69cXf7M8kt6FqRHLVv0arPPK+xL6FqF4pq2BuKZlYTqwdG1xsOiEv3IHs3lioTFzbJ1NXhrIuV0H3AiQcw9TbhSs3sWkP7Ri90Uj/fHYQC+psvq5x0L4JZKE3dDTdgjP6vQA==-----END PRIVATE KEY-----" - ] - ) - _assert_match_first_item("PEM-formatted Private Key", res) - - -def test_pem_openssl_pkcs8_encrypted_private_key(): - res = r.check( - [ - "-----BEGIN ENCRYPTED PRIVATE KEY-----MIIE6TAbBgkqhkiG9w0BBQMwDgQIHHigg+fwQjQCAggABIIEyLP0cpU55sZ3QSZkCtNtGU425BnZZD57aqO/aa/fV9HGvWn5/GYANT6xDKbUi2kwc68QCi6Zla3C56jPvPsZoDeZ+g81DYjqBVMRsVra1kayQvnKeRvedYPBdfA0VL5n0ndRa9q31Vx6zzXnMYJd9VakUgXYLFntvVeTt/a+iW9LX7mx/ymUPZtD1IrNEJBpW6Al+vc1m6bYA8NpZaT5P6uiclsoEiPDMydEa52cBgcd5q5MfwKllPsQNYtyLsee8W/1k/Eu21pRkCPYreQWgh36gqAn+2zNySCyqiU7USQ1qHMIHPLxJV7awVfOy7eoRMhmbTJ8kCrEpI9r6JyQN3m1VbBN5QifF9p0N0v2yBM8hS6e0fdaSwkFUVFHeWz4140nhaXA6Xu9U+TvJwacdz/FYsN9wi1AIDl8nMT+gFC2v3HuiGmMD0ybA5TOJEsvhdLruxLNLok/uiu6oExDVAV6JI4zM/8ymLruuAibVxSc9bhVEY8FfYbQ5aDiGPm18MXtmCb5UNEG10ylsDl5khfGYwcfuOfgDy3PVst4aA3sHLbk996csBL8FPcGDx7iqgWPYkHEfhuHr4MUt2xqJloOsGlcs6Ts70ldgNHpNCA0DizHnrRY8EF4gXzAJghpJ5gcCllzcVjf26YsoVyNiIZ2IcMe2aoP2WtbnnFqtgl2gOJ6SNAbWyRLhtlSC74mYl0SLvtN5lm7U5bCIlAnAJbm1cqN+Muuxy9/U5TagQYfya4BZNUhHhI9ILH87QLpIWDeCa3v0UZfHi7CBirEusAq+jQGZslTt+fr/iRWQLwo819HA5Yhh4rems2p2aKeuUYPJ/gt5/KIPikYneAEJ2HzqByeS71hWbxpINtEtNz2M1SVGLbFsLrUjfKGTEc29qaaFvM24LpLxahiCTW2huM/1UZFjKyvrL0HYKAZyvA/07EHzY5K9DT3ocNIKApqMzq+D7P5L/gBNQ6E+cx/ZOA+9unVuE7OY6mmQHMsK9MAT6e4T0AxkBqAWg3cf5ovlQNr57mWwms8Zyy1wwIwLr2/wilJ5V3iWSHDIckK1kR92kCDu3MwNIhfM9dalWSsx9FRIg4iFzMIuidYO8pIVq1jJQKqVsgmGXCwioKvD6wDnQqijdDmVpX/Jg08O1iU7URD2MvGLbBRRfzcBFNrEUNjTrbQa3LS+wvDISbizryXKr/8K8okpxV6dBiW3YplePjde/yqrxWl7OQoDbG1F2f2zMmIe8ZNTP15K8aAlq9LC5qn6YnoRTRe2rLecxgP1SQVXUwFvrUKglozy1/cJsuKuCqiRecQneqyasc9mp/0wGu1t9GD3EroMfvuK4zXuaj6uTDyDPUBo6hfvNDG8zSHvEfDDGm4PTFI7kU7U7ohSQZZcGHZBUigFluq9KWJ3SHPgTkRul3nB/Im+89toHSHFoqH/B/GDokAbqsrUPgJ9xpK9lqFEhng5blX2kiae90VHRyb23oE7eIjf3j4G04Amh8m4/W7ER9JDn6nwWqMH4n2MBQRD3USO8DNTgBbggVZZ7MGIUVbv2/YcVZXftBtiS1u+lvVcpYPzwHIj29YrscmBV6ae0CLo1av0xquHYUOrVixSvhmOREOUSZvNSibizBIyNmLkA==-----END ENCRYPTED PRIVATE KEY-----" - ] - ) - _assert_match_first_item("PEM-formatted Private Key", res) - - -def test_pem_openssh_private_key(): - res = r.check( - [ - "-----BEGIN OPENSSH PRIVATE KEY-----b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBDXVWIoOcQYPyoVODqYrhNAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIDDZHhPJKYsu2hV7bq/vtAbF2Guw8cupqcjv5SqRraVaAAAAoCfV/ZrS3mggJFx1X7aeKzfBFDN2hWrPTHmyJPsw0NaDW+wzL6/yYmWaAB90clbSiCQ7jALlA/RoU/tPz8HvEaKcnj9BgSMN8+Se4RBcfqxMx9eCRYtYcumc9PrQbKSCeywtvsQoCntPxLhyudxH/HYKx7lO5mrMGut9FjOy2s9Iz317p+2F1DJqRYNsEHKyZJpV0DwObF2ZPOlX3PDv3fg=-----END OPENSSH PRIVATE KEY-----" - ] - ) - _assert_match_first_item("PEM-formatted Private Key", res) - - -def test_ssh_ecdsa_key(): - res = r.check( - [ - "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCE9Uli8bGnD4hOWdeo5KKQJ/P/vOazI4MgqJK54w37emP2JwOAOdMmXuwpxbKng3KZz27mz+nKWIlXJ3rzSGMo= r00t@my-random_host" - ] - ) - _assert_match_first_item("SSH ECDSA Public Key", res) - - -def test_ssh_ed25519_key(): - res = r.check( - [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK0wmN/Cr3JXqmLW7u+g9pTh+wyqDHpSQEIQczXkVx9q r00t@my-random_host" - ] - ) - _assert_match_first_item("SSH ED25519 Public Key", res) - - -def test_aws_access_key(): - res = r.check(["AKIAIOSFODNN7EXAMPLE"]) - assert "Amazon Web Services Access Key" in str(res) - - -def test_aws_secret_access_key(): - res = r.check(["Nw0XP0t2OdyUkaIk3B8TaAa2gEXAMPLEMvD2tW+g"]) - assert "Amazon Web Services Secret Access Key" in str(res) - - -def test_aws_ec2_id(): - res = r.check(["i-1234567890abcdef0"]) - assert "Amazon Web Services EC2 Instance Identifier" in str(res) - - -def test_aws_org_id(): - res = r.check(["o-aa111bb222"]) - assert "Amazon Web Services Organization Identifier" in str(res) - - -def test_aws_sns(): - res = r.check(["arn:aws:sns:us-east-2:123456789012:MyTopic"]) - assert "Amazon SNS Topic" in str(res) - - -def test_asin(): - res = r.check(["B07ND5BB8V"]) - _assert_match_first_item("Amazon Standard Identification Number (ASIN)", res) - - -def test_google_api_key(): - res = r.check(["AIzaSyD7CQl6fRhagGok6CzFGOOPne2X1u1spoA"]) - _assert_match_first_item("Google API Key", res) - - -def test_google_recaptcha_api_key(): - res = r.check(["6Le3W6QUAAAANNT8X_9JwlNnK4kZGLaYTB3KqFLM"]) - _assert_match_first_item("Google ReCaptcha API Key", res) - - -def test_google_oauth_token(): - res = r.check(["ya29.AHES6ZRnn6CfjjaK6GCQ84vikePv_hk4NUAJwzaAXamCL0s"]) - _assert_match_first_item("Google OAuth Token", res) - - -def test_google_cal(): - res = r.check( - [ - "https://calendar.google.com/calendar/embed?src=ht3jlfaac5lfd6263ulfh4tql8%40group.calendar.google.com&ctz=Europe%2FLondon" - ] - ) - assert "Google Calendar URI" in str(res) - - -def test_notion_note(): - res = r.check( - ["https://www.notion.so/test-user/My-Note-fa45346d9dd4421abc6857ce2e7fb0db"] - ) - assert "Notion Note URI" in str(res) - - -def test_notion_team_note(): - res = r.check( - ["https://testorg.notion.site/My-Note-9f8863871e024ea6acc64d6564004a22"] - ) - assert "Notion Team Note URI" in str(res) - - -def test_aws_access_key_id(): - res = r.check(["AKIA31OMZKYAARWZ3ERH"]) - _assert_match_first_item("Amazon Web Services Access Key", res) - - -def test_mailgun_api_key(): - res = r.check(["key-1e1631a9414aff7c262721e7b6ff6e43"]) - _assert_match_first_item("Mailgun API Key", res) - - -def test_twilio_api_key(): - res = r.check(["SK012dab2d3f4dab1c2f33dffafdf23142"]) - _assert_match_first_item("Twilio API Key", res) - - -def test_twilio_account_sid(): - res = r.check(["AC10a133ffdfb112abb2d3f42d1d2d3b14"]) - _assert_match_first_item("Twilio Account SID", res) - - -def test_twilio_application_sid(): - res = r.check(["APfff01abd2b134a2aff3adc243ab211ab"]) - _assert_match_first_item("Twilio Application SID", res) - - -def test_square_application_secret(): - res = r.check(["sq0csp-LBptIQ85io8CvbjVDvmzD1drQbOERgjlhnNrMgscFGk"]) - _assert_match_first_item("Square Application Secret", res) - - -def test_square_access_token(): - res = r.check(["EAAAEBQZoq15Ub0PBBr_kw0zK-uIHcBPBZcfjPFT05ODfjng9GqFK9Dbgtj1ILcU"]) - _assert_match_first_item("Square Access Token", res) - - -def test_stripe_api_key(): - res = r.check(["sk_live_vHDDrL02ioRF5vYtyqiYBKma"]) - _assert_match_first_item("Stripe API Key", res) - - -def test_github_access_token(): - res = r.check(["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:test@github.com"]) - _assert_match_first_item("GitHub Access Token", res) - - -def test_slack_api_key(): - res = r.check( - ["xoxp-514654431830-843187921057-792480346180-d44d2r9b71f954o8z2k5llt41ovpip6v"] - ) - _assert_match_first_item("Slack API Key", res) - _assert_match_exploit_first_item( - "https://slack.com/api/auth.test?token=xoxp-514654431830-843187921057-792480346180-d44d2r9b71f954o8z2k5llt41ovpip6v", - res, - ) - - -def test_slack_token(): - res = r.check(["xoxb-51465443183-hgvhXVd2ISC2x7gaoRWBOUdQ"]) - _assert_match_first_item("Slack Token", res) - _assert_match_exploit_first_item( - "https://slack.com/api/auth.test?token=xoxb-51465443183-hgvhXVd2ISC2x7gaoRWBOUdQ", - res, - ) - - -def test_notion_integration_token(): - res = r.check(["secret_n2ZeRrMx743JQ5wiucZ0DBEe47opfKubUp22N0wIrOy"]) - _assert_match_first_item("Notion Integration Token", res) - - -def test_pgp_public_key(): - res = r.check( - [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----Comment: Alice's OpenPGP certificateComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.htmlmDMEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/Ub7O1u120JkFsaWNlIExvdmVsYWNlIDxhbGljZUBvcGVucGdwLmV4YW1wbGU+iJAEExYIADgCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQTrhbtfozp14V6UTmPyMVUMT0fjjgUCXaWfOgAKCRDyMVUMT0fjjukrAPoDnHBSogOmsHOsd9qGsiZpgRnOdypvbm+QtXZqth9rvwD9HcDC0tC+PHAsO7OTh1S1TC9RiJsvawAfCPaQZoed8gK4OARcRwTpEgorBgEEAZdVAQUBAQdAQv8GIa2rSTzgqbXCpDDYMiKRVitCsy203x3sE9+eviIDAQgHiHgEGBYIACAWIQTrhbtfozp14V6UTmPyMVUMT0fjjgUCXEcE6QIbDAAKCRDyMVUMT0fjjlnQAQDFHUs6TIcxrNTtEZFjUFm1M0PJ1Dng/cDW4xN80fsn0QEA22Kr7VkCjeAEC08VSTeV+QFsmz55/lntWkwYWhmvOgE==iIGO-----END PGP PUBLIC KEY BLOCK-----" - ] - ) - _assert_match_first_item("PGP Public Key", res) - - -def test_pgp_private_key(): - res = r.check( - [ - "-----BEGIN PGP PRIVATE KEY BLOCK-----Comment: Alice's OpenPGP Transferable Secret KeyComment: https://www.ietf.org/id/draft-bre-openpgp-samples-01.htmllFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/Ub7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtCZBbGljZSBMb3ZlbGFjZSA8YWxpY2VAb3BlbnBncC5leGFtcGxlPoiQBBMWCAA4AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE64W7X6M6deFelE5j8jFVDE9H444FAl2lnzoACgkQ8jFVDE9H447pKwD6A5xwUqIDprBzrHfahrImaYEZzncqb25vkLV2arYfa78A/R3AwtLQvjxwLDuzk4dUtUwvUYibL2sAHwj2kGaHnfICnF0EXEcE6RIKKwYBBAGXVQEFAQEHQEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA/3/xFPG6U17rhTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuFu1+jOnXhXpROY/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpMhzGs1O0RkWNQWbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWybPnn+We1aTBhaGa86AQ===n8OM-----END PGP PRIVATE KEY BLOCK-----" - ] - ) - _assert_match_first_item("PGP Private Key", res) - - -def test_discord_token(): - res = r.check(["NzQ4MDk3ODM3OTgzODU4NzIz.X0YeZw.UlcjuCywUAWvPH9s-3cXNBaq3M4"]) - _assert_match_first_item("Discord Bot Token", res) - - -def test_discord_token_2(): - res = r.check(["MTE4NDQyNjQ0NTAxMjk5MjAz.DPM2DQ.vLNMR02Qxb9DJFucGZK1UtTs__s"]) - _assert_match_first_item("Discord Bot Token", res) - - -def test_discord_token_3(): - res = r.check(["ODYyOTUyOTE3NTg4NjM5NzY1.YOf1iA.7lARgFXmodxpgmPvOXapaKUga6M"]) - _assert_match_first_item("Discord Bot Token", res) - - -def test_bcglobal(): - res = r.check(["6556123456789012"]) - _assert_match_first_item("BCGlobal Card Number", res) - - -def test_carte_blanche(): - res = r.check(["30137891521480"]) - _assert_match_first_item("Carte Blanche Card Number", res) - - -def test_instapayment(): - res = r.check(["6387849878080951"]) - _assert_match_first_item("Insta Payment Card Number", res) - - -def test_stackhawk(): - res = r.check(["hawk.wz6bAoFDwcVQFCD9dofE.w2R1PWI8UTvEM4jd56XQ"]) - _assert_match_first_item("StackHawk API Key", res) - - -def test_jcb_card(): - res = r.check(["3537124887293334"]) - _assert_match_first_item("JCB Card Number", res) - - res = r.check(["3543824683332150682"]) - _assert_match_first_item("JCB Card Number", res) - - -def test_switch_card(): - res = r.check(["633341812811453789"]) - _assert_match_first_item("Switch Card Number", res) - - -def test_korean_card(): - res = r.check(["9837282929900015"]) - _assert_match_first_item("Korean Local Card Number", res) - - -def test_laser_card(): - res = r.check(["630495060000000000"]) - _assert_match_first_item("Laser Card Number", res) - - -def test_solo_card(): - res = r.check(["6334498823141663"]) - _assert_match_first_item("Solo Card Number", res) - - -def test_github_personal_access_token(): - res = r.check(["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"]) - _assert_match_first_item("GitHub Personal Access Token", res) - - -def test_discord_webhook(): - res = r.check( - [ - "https://discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij" - ] - ) - _assert_match_first_item("Discord Webhook", res) - - -def test_github_oauth_token(): - res = r.check(["gho_16C7e42F292c6912E7710c838347Ae178B4a"]) - _assert_match_first_item("GitHub OAuth Access Token", res) - - -def test_github_refresh_token(): - res = r.check( - [ - "ghr_1B4a2e77838347a7E420ce178F2E7c6912E169246c34E1ccbF66C46812d16D5B1A9Dc86A1498" - ] - ) - _assert_match_first_item("GitHub Refresh Token", res) - - -def test_github_app_token(): - res = r.check(["ghu_16C7e42F292c6912E7710c838347Ae178B4a"]) - _assert_match_first_item("GitHub App Token", res) - - -def test_zapier_webhook(): - res = r.check(["https://hooks.zapier.com/hooks/catch/1234567/f8f22dgg/"]) - _assert_match_first_item("Zapier Webhook Token", res) - - -def test_datadog_api_key(): - res = r.check(["acb6d73d95a10d30aef9894603e90963"]) - _assert_match_first_item("Datadog API Key", res) - - -def test_datadog_client_token(): - res = r.check(["pub85abf45b82e2f86f25003d559bca07d9"]) - _assert_match_first_item("Datadog Client Token", res) - - -def test_new_relic_rest_api_key(): - res = r.check(["NRRA-2a2d50d7d9449f3bb7ef65ac1184c488bd4fe7a8bd"]) - _assert_match_first_item("New Relic REST API Key", res) - - -def test_new_relic_synthetics_api_key(): - res = r.check(["NRSP-us010E1E3D1716F721FF39F726B3E4CBCB7"]) - _assert_match_first_item("New Relic Synthetics Location Key", res) - - -def test_new_relic_user_api_key(): - res = r.check(["NRAK-WI4JTVS049IF5A3FGS5N51XS3Y5"]) - _assert_match_first_item("New Relic User API Key", res) - - -def test_nano(): - res = r.check(["nano_1c46rz7xnk98ozhzdjq7thwty844sgnqxk9496yysit1bnio1rcdzshc5ymn"]) - _assert_match_first_item("Nano (NANO) Wallet Address", res) - - -def test_pypi_upload_token(): - res = r.check( - [ - "pypi-AgEIcHlwaS5vcmcCJDZlNzEyNGJmLWQ4N2UtNGZhYS1iNWEzLWQzYzg2YjU3NzAxYgACJXsicGVybWlzc2lvbnMiOiAidXNlciIsICJ2ZXJzaW9uIjogMX0AAAYgeYcgrZO31PTS_3ipsd0fTSMy1kVkxCzhQvHN6m97yIE" - ] - ) - _assert_match_first_item("PyPI Upload Token", res) - - -def test_turkish_car_plate(): - res = r.check(["34A2344"]) - _assert_match_first_item("Turkish License Plate Number", res) - - -def test_turkish_car_plate2(): - res = r.check(["34A23415"]) - _assert_match_first_item("Turkish License Plate Number", res) - - -def test_turkish_car_plate3(): - res = r.check(["06BK123"]) - _assert_match_first_item("Turkish License Plate Number", res) - - -def test_turkish_car_plate4(): - res = r.check(["06JK1234"]) - _assert_match_first_item("Turkish License Plate Number", res) - - -def test_turkish_car_plate5(): - res = r.check(["81ABC75"]) - _assert_match_first_item("Turkish License Plate Number", res) - - -def test_date_of_birth(): - res = r.check(["13.08.1987"]) - _assert_match_first_item("Date of Birth", res) - - -def test_date_of_birth2(): - res = r.check(["13081987"]) - _assert_match_first_item("Date of Birth", res) - - -def test_date_of_birth3(): - res = r.check(["13/08/1987"]) - _assert_match_first_item("Date of Birth", res) - - -def test_date_of_birth4(): - res = r.check(["13-08-1987"]) - _assert_match_first_item("Date of Birth", res) - - -def test_date_of_birth5(): - res = r.check(["13 08 1987"]) - _assert_match_first_item("Date of Birth", res) - - -def test_turkish_id_number(): - res = r.check(["12345678902"]) - assert "Turkish Identification Number" in str(res) - - -def test_turkish_id_number2(): - res = r.check(["12345678900"]) - assert "Turkish Identification Number" in str(res) - - -def test_turkish_tax_number(): - res = r.check(["1234567890"], dist=d) - assert "Turkish Tax Number" in str(res) - - -def test_uuid(): - res = r.check(["b2ced6f5-2542-4f7d-b131-e3ada95d8b75"]) - assert "UUID" in str(res) - - -def test_objectid(): - res = r_rarity_0.check(["5fc7c33a7ef88b139122a38a"], dist=d) - assert "ObjectID" in str(res) - - -def test_ulid(): - res = r_rarity_0.check(["01ERJ58HMWDN3VTRRHZQV2T5R5"], dist=d) - assert "ULID" in str(res) - - -def test_totp_URI(): - res = r.check( - [ - "otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example" - ] - ) - _assert_match_first_item("Time-Based One-Time Password (TOTP) URI", res) - - -def test_complex_totp_URI(): - res = r.check( - [ - "otpauth://totp/My_Ex0T1c-L00king.name?issuer=ArgsShouldBeCommutable&secret=JBSWY3DPEHPK3PXP&digits=6&period=30" - ] - ) - _assert_match_first_item("Time-Based One-Time Password (TOTP) URI", res) - - -def test_sshpass(): - res = r.check(["sshpass -p MyPassw0RD!"]) - _assert_match_first_item("SSHPass Clear Password Argument", res) - - -def test_sshpass_multiple_args(): - res = r.check(["sshpass -P 'Please enter your password' -p MyPassw0RD!"]) - _assert_match_first_item("SSHPass Clear Password Argument", res) - - -def test_mount_command(): - res = r.check(["mount -o username=myuser,password=password"]) - _assert_match_first_item("Mount Command With Clear Credentials", res) - - -def test_mountcifs_command(): - res = r.check(["mount.cifs -o username=myuser,password=password"]) - _assert_match_first_item("Mount Command With Clear Credentials", res) - - -def test_complex_mount_command(): - res = r.check( - [ - "mount -t cifs -osec=ntlmv2,password=S3cUr3D!,domain=mydomain,noserverino,username=H4x0r" - ] - ) - _assert_match_first_item("Mount Command With Clear Credentials", res) - - -def test_cifs_fstab_entry(): - res = r.check( - ["cifs uid=1000,password=password,gid=1000,noperm,nofail,username=myuser"] - ) - _assert_match_first_item("CIFS Fstab Entry With Clear Credentials", res) + assert regex_valid_match( + "Uniform Resource Locator (URL)", r.check(["http://папироска.рф"]) + ) + + +@pytest.mark.parametrize( + "match, description", + [ + # EUI-48 Identifier (Ethernet, WiFi, Bluetooth, etc) + ("00:00:00:00:00:00", "Xerox Corp"), + ("00-00-00-00-00-00", "Xerox Corp"), + ("0000.0000.0000", "Xerox Corp"), + # MasterCard Number + ("5409010000000004", "UNION NATIONAL BANK"), + ("5409 0100 0000 0004", "UNION NATIONAL BANK"), + # Phone Number + ("+1-202-555-0156", "United States"), + ("+662025550156", "Thailand"), + ("+356 202 555 0156", "Malta"), + ], +) +def test_match_description(match: str, description: str): + assert description in r.check([match])[0]["Regex Pattern"]["Description"] + + +@pytest.mark.parametrize( + "match, exploit", + [ + ( + "xoxp-514654431830-843187921057-792480346180-d44d2r9b71f954o8z2k5llt41ovpip6v", + "https://slack.com/api/auth.test?token=xoxp-514654431830-843187921057-792480346180-d44d2r9b71f954o8z2k5llt41ovpip6v", + ), + ( + "xoxb-51465443183-hgvhXVd2ISC2x7gaoRWBOUdQ", + "https://slack.com/api/auth.test?token=xoxb-51465443183-hgvhXVd2ISC2x7gaoRWBOUdQ", + ), + ], +) +def test_match_exploit(match: str, exploit: str): + assert exploit in r.check([match])[0]["Regex Pattern"]["Exploit"] From 1b8a17f2379754ca3d16736156c5f6977704ec4e Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 23:18:43 +1000 Subject: [PATCH 08/37] ci(flake8): ignore line too long errors --- .flake8 | 1 + 1 file changed, 1 insertion(+) diff --git a/.flake8 b/.flake8 index 2bcd70e..7d38a5a 100644 --- a/.flake8 +++ b/.flake8 @@ -1,2 +1,3 @@ [flake8] +ignore = E501 max-line-length = 88 From 3bac7dc8c10b8afcf13a9df442a4a15005ccc9bf Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 23:21:41 +1000 Subject: [PATCH 09/37] style(flake8): F401 'pywhat.filter.Distribution' imported but unused --- pywhat/__init__.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pywhat/__init__.py b/pywhat/__init__.py index 200f217..52106fb 100644 --- a/pywhat/__init__.py +++ b/pywhat/__init__.py @@ -7,13 +7,11 @@ tags = AvailableTags().get_tags() pywhat_tags = tags # left for backward compatibility purposes -_contents = ["Identifier", "Distribution", "tags", "pywhat_tags", "Keys", "Filter"] +__all__ = ["Identifier", "Distribution", "tags", "pywhat_tags", "Keys", "Filter"] -__all__ = _contents - del AvailableTags, filter def __dir__(): - return _contents + ["__version__"] + return __all__ + ["__version__"] From ba6f6d37d3209eb8ada6bdca24e9eb458d585ad7 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 23:22:10 +1000 Subject: [PATCH 10/37] style(flake8): ignore W503 line break before binary operator --- .flake8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.flake8 b/.flake8 index 7d38a5a..934fdea 100644 --- a/.flake8 +++ b/.flake8 @@ -1,3 +1,3 @@ [flake8] -ignore = E501 +ignore = E501,W503 max-line-length = 88 From 94050b13ab8fa81600ce26dc5195ae041c50c8ce Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 23:23:36 +1000 Subject: [PATCH 11/37] style(flake8): F401 imported but unused --- tests/test_identifier.py | 2 +- tests/test_regex_identifier.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_identifier.py b/tests/test_identifier.py index 6261d81..b90801c 100644 --- a/tests/test_identifier.py +++ b/tests/test_identifier.py @@ -2,7 +2,7 @@ from pywhat import identifier from pywhat.filter import Distribution, Filter -from pywhat.helper import Keys, load_regexes +from pywhat.helper import Keys r = identifier.Identifier() diff --git a/tests/test_regex_identifier.py b/tests/test_regex_identifier.py index be112bc..c441a1a 100644 --- a/tests/test_regex_identifier.py +++ b/tests/test_regex_identifier.py @@ -1,6 +1,3 @@ -import re -from typing import List, Tuple - import pytest from pywhat import regex_identifier From f7f6de6f9397dc846e57f102249155e6a3659e43 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 16 Oct 2021 23:33:27 +1000 Subject: [PATCH 12/37] style(flake8): W605 invalid escape sequence --- pywhat/what.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pywhat/what.py b/pywhat/what.py index cb6c91d..9ed31da 100644 --- a/pywhat/what.py +++ b/pywhat/what.py @@ -222,7 +222,7 @@ def main(**kwargs): %t - tags (in 'tag1, tag2 ...' format) - If you want to print '%' or '\' character - escape it: '\%', '\\'. + If you want to print '%' or '\\' character - escape it: '\\%', '\\\\'. Examples: From c4b3db38b6538eb14f0bb6bc21bef878d6f9c92e Mon Sep 17 00:00:00 2001 From: Giancarlo <15658199+gVirtu@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:45:33 -0300 Subject: [PATCH 13/37] Update Slack Webhook regex with examples --- pywhat/Data/regex.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 33a087c..b4e7e4f 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -258,7 +258,7 @@ }, { "Name": "Slack Webhook", - "Regex": "(?i)^(https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24})$", + "Regex": "(?i)^(https://hooks.slack.com/services/T[a-zA-Z0-9_]{8,10}/B[a-zA-Z0-9_]{8,10}/[a-zA-Z0-9_]{24})$", "plural_name": false, "Description": null, "Exploit": "If the command below returns 'missing_text_or_fallback_or_attachments', it means\nthat the URL is valid, any other responses would mean that the URL is invalid.\n $ curl -s -X POST -H \"Content-type: application/json\" -d '{\"text\":\"\"}' \"SLACK_WEBOOK_URL_HERE\"\n", @@ -269,7 +269,14 @@ "API Keys", "Credentials", "Slack" - ] + ], + "Examples": { + "Valid": [ + "https://hooks.slack.com/services/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", + "https://hooks.slack.com/services/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" + ], + "Invalid": [] + } }, { "Name": "Amazon Web Services Simple Storage (AWS S3) URL", @@ -2587,4 +2594,4 @@ "Invalid": [] } } -] \ No newline at end of file +] From 8c6fb5e75f00166a3b2d3b4b5f1c4748daf0ce06 Mon Sep 17 00:00:00 2001 From: Giancarlo <15658199+gVirtu@users.noreply.github.com> Date: Sat, 16 Oct 2021 20:52:17 -0300 Subject: [PATCH 14/37] Add Slack Webhook to test fixture --- fixtures/file | 4 +++- tests/test_click.py | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fixtures/file b/fixtures/file index 1101af0..9c4346f 100644 --- a/fixtures/file +++ b/fixtures/file @@ -95,4 +95,6 @@ b2ced6f5-2542-4f7d-b131-e3ada95d8b75 otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example -sshpass -p MyPassw0RD! ssh root@10.0.0.10 \ No newline at end of file +sshpass -p MyPassw0RD! ssh root@10.0.0.10 + +https://hooks.slack.com/services/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 diff --git a/tests/test_click.py b/tests/test_click.py index 6c900f9..130eecd 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -639,6 +639,13 @@ def test_file_fixture_sshpass(): assert re.findall("SSHPass Clear Password Argument", str(result.output)) +def test_file_fixture_slack_webhook(): + runner = CliRunner() + result = runner.invoke(main, ["fixtures/file"]) + assert result.exit_code == 0 + assert re.findall("Slack Webhook", str(result.output)) + + def test_format(): runner = CliRunner() result = runner.invoke( From 30215840d8e848405fed8f23d3ec9d5a5b479b47 Mon Sep 17 00:00:00 2001 From: Hexiro <42787085+Hexiro@users.noreply.github.com> Date: Sun, 17 Oct 2021 12:57:45 -0400 Subject: [PATCH 15/37] remove duplicates from regex.json --- pywhat/Data/regex.json | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index b4e7e4f..43208fe 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -627,21 +627,6 @@ "LinkedIn" ] }, - { - "Name": "GitHub Access Token", - "Regex": "(?i)^([a-zA-Z0-9_-]*:[a-zA-Z0-9_-]+@github\\.com)$", - "plural_name": false, - "Description": null, - "Exploit": null, - "Rarity": 1, - "URL": null, - "Tags": [ - "API Keys", - "Bug Bounty", - "Credentials", - "GitHub" - ] - }, { "Name": "Stripe Restricted API Token", "Regex": "(?i)^(rk_live_[0-9a-zA-Z]{24})$", @@ -672,21 +657,6 @@ "Stripe" ] }, - { - "Name": "Square Access Token", - "Regex": "(?i)^(sqOatp-[0-9A-Za-z\\-_]{22})$", - "plural_name": false, - "Description": null, - "Exploit": "Use the command below to verify that the access token is valid:\n $ curl \"https://squareup.com/oauth2/revoke\" -d '{\"access_token\":\"[RANDOM_STRING]\",\"client_id\":\"[APP_ID]\"}' -H \"Content-Type: application/json\" -H \"Authorization: Client TOKEN_HERE\"\n", - "Rarity": 1, - "URL": null, - "Tags": [ - "API Keys", - "Bug Bounty", - "Credentials", - "Square" - ] - }, { "Name": "Square OAuth Token", "Regex": "(?i)^(sq0csp-[ 0-9A-Za-z\\-_]{43})$", From 1083b4bdd1291ca1277f74bc2c416775d72a8b32 Mon Sep 17 00:00:00 2001 From: Hexiro <42787085+Hexiro@users.noreply.github.com> Date: Sun, 17 Oct 2021 12:59:37 -0400 Subject: [PATCH 16/37] add test to check for duplicate regexes --- tests/test_regex_database.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_regex_database.py b/tests/test_regex_database.py index f691fff..21e0b4d 100644 --- a/tests/test_regex_database.py +++ b/tests/test_regex_database.py @@ -70,3 +70,11 @@ def test_sorted_by_rarity(): assert rarity_num == sorted( rarity_num, reverse=True ), "Regexes should be sorted by rarity in 'regex.json'. Regexes with rarity '1' are at the top of the file and '0' is at the bottom." + + +def test_no_duplicate_regexes(): + names = [regex["Name"] for regex in database] + duplicate_names = {name for name in names if names.count(name) > 1} + assert duplicate_names == set(), ( + ", ".join(duplicate_names) + " present in 'regex.json' more than once." + ) From 5f10e7bad747cd1f97ef79d1be06904ff286c160 Mon Sep 17 00:00:00 2001 From: IlluminatiFish <45714340+IlluminatiFish@users.noreply.github.com> Date: Sun, 17 Oct 2021 20:04:41 +0100 Subject: [PATCH 17/37] Added loads of test candidates and updated discord webhook regex Added loads of test candidates and updated discord webhook regex as per #208 --- pywhat/Data/regex.json | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index b4e7e4f..fcb8d59 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1035,7 +1035,7 @@ }, { "Name": "Discord Webhook", - "Regex": "(?i)^(https://discord\\.com/api/webhooks/[0-9]+/[A-Za-z0-9-_]+)$", + "Regex": "(?i)^(https?:\\/\\/(?:ptb\\.|canary\\.)?discord(?:app)?\\.com\\/api(?:\\/v\\d{1,2})?\\/webhooks\\/(\\d{17,19})\\/([\\w-]{68}))$", "plural_name": false, "Description": null, "Exploit": null, @@ -1048,7 +1048,30 @@ ], "Examples": { "Valid": [ - "https://discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij" + "https://discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://ptb.discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://canary.discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://ptb.discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://canary.discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://ptb.discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://canary.discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://ptb.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://canary.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "https://discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://ptb.discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://canary.discord.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://ptb.discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://canary.discord.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://ptb.discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://canary.discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://ptb.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://canary.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", ], "Invalid": [] } From 8a5540c6400b9465345ce66c9fcab4b476cbcad6 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 18 Oct 2021 17:25:20 +1000 Subject: [PATCH 18/37] style(flake8): E722 do not use bare 'except' --- pywhat/filter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pywhat/filter.py b/pywhat/filter.py index aa47c00..84df01e 100644 --- a/pywhat/filter.py +++ b/pywhat/filter.py @@ -97,7 +97,7 @@ def __contains__(self, item): and set(item["Tags"]) & self["Tags"] and not set(item["Tags"]) & self["ExcludeTags"] ) - except: + except KeyError: return False def setdefault(self, key, default=None): From 6613aafd01d6b3d90534ba9a84f9ca6855163fb1 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 18 Oct 2021 17:30:09 +1000 Subject: [PATCH 19/37] test: add test to test exception --- tests/test_filtration.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_filtration.py b/tests/test_filtration.py index b7461c4..2a92178 100644 --- a/tests/test_filtration.py +++ b/tests/test_filtration.py @@ -149,3 +149,8 @@ def test_filter3(): and "Identifiers" not in regex["Tags"] ): assert regex in dist.get_regexes() + + +def test_invalid_contains_returns_false(): + filter = Filter() + assert ({} in filter) is False From 4342bdc6011afa30dd03a196c7804ead223d3984 Mon Sep 17 00:00:00 2001 From: Joel Date: Mon, 18 Oct 2021 18:51:16 +1000 Subject: [PATCH 20/37] refactor: remove unnecessary try except --- pywhat/filter.py | 13 +++++-------- tests/test_filtration.py | 5 ----- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/pywhat/filter.py b/pywhat/filter.py index 84df01e..30fe5f6 100644 --- a/pywhat/filter.py +++ b/pywhat/filter.py @@ -91,14 +91,11 @@ def __len__(self): return len(self._dict) def __contains__(self, item): - try: - return ( - self["MinRarity"] <= item["Rarity"] <= self["MaxRarity"] - and set(item["Tags"]) & self["Tags"] - and not set(item["Tags"]) & self["ExcludeTags"] - ) - except KeyError: - return False + return ( + self["MinRarity"] <= item["Rarity"] <= self["MaxRarity"] + and set(item["Tags"]) & self["Tags"] + and not set(item["Tags"]) & self["ExcludeTags"] + ) def setdefault(self, key, default=None): return self._dict.setdefault(key, default) diff --git a/tests/test_filtration.py b/tests/test_filtration.py index 2a92178..b7461c4 100644 --- a/tests/test_filtration.py +++ b/tests/test_filtration.py @@ -149,8 +149,3 @@ def test_filter3(): and "Identifiers" not in regex["Tags"] ): assert regex in dist.get_regexes() - - -def test_invalid_contains_returns_false(): - filter = Filter() - assert ({} in filter) is False From 04570d4db604a7041383db813896d6a3be377134 Mon Sep 17 00:00:00 2001 From: IlluminatiFish <45714340+IlluminatiFish@users.noreply.github.com> Date: Wed, 20 Oct 2021 00:45:44 +0100 Subject: [PATCH 21/37] Fix json formatting lmao json formatting goes brr --- pywhat/Data/regex.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 9df84de..210c7b1 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1041,7 +1041,7 @@ "http://ptb.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", "http://canary.discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", "http://discordapp.com/api/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", - "http://discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij", + "http://discordapp.com/api/v9/webhooks/894893734582452235/KhNc2-_zwY9FfCAK0iGUa_KfYyW8m5Ja_5i-V24fEY6ETwvLLn-GmdT_vq0Do9-YRsij" ], "Invalid": [] } From 7c657cff5a08c48cd11f597a7bf16d6afa41ce6e Mon Sep 17 00:00:00 2001 From: "Gabriele N. Tornetta" Date: Wed, 20 Oct 2021 11:21:18 +0100 Subject: [PATCH 22/37] perf: fix RegexIdentifier.check regression It looks like #167 has introduced a performance regression by adding what seems to be an unnecessary deep copy. A shallow dictionary copy seems to work just fine. --- pywhat/regex_identifier.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pywhat/regex_identifier.py b/pywhat/regex_identifier.py index 3d47638..fd4f592 100644 --- a/pywhat/regex_identifier.py +++ b/pywhat/regex_identifier.py @@ -1,4 +1,3 @@ -import copy import re from typing import Optional @@ -28,7 +27,7 @@ def check( reg["Boundaryless Regex"] if reg in boundaryless else reg["Regex"] ) for matched_regex in re.finditer(regex, string, re.MULTILINE): - reg_match = copy.deepcopy(reg) + reg_match = dict(reg) matched = self.clean_text(matched_regex.group(0)) if ( From ff379de6341168dd42b94f1148aab6955ce74100 Mon Sep 17 00:00:00 2001 From: - <-> Date: Wed, 20 Oct 2021 21:22:04 +0200 Subject: [PATCH 23/37] Add DOI support --- fixtures/file | 3 +++ pywhat/Data/regex.json | 18 ++++++++++++++++++ tests/test_click.py | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/fixtures/file b/fixtures/file index 9c4346f..9824d5b 100644 --- a/fixtures/file +++ b/fixtures/file @@ -98,3 +98,6 @@ otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example sshpass -p MyPassw0RD! ssh root@10.0.0.10 https://hooks.slack.com/services/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 + +doi:10.1392/BC1.0 +10.1000/123 diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 43208fe..b7a3148 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1336,6 +1336,24 @@ "Invalid": [] } }, + { + "Name": "Digital Object Identifier (DOI)", + "Regex": "^((?:https?:\\/\\/(?:(?:www\\.)?doi\\.org\\/)|doi:)?(10\\.[1-9][0-9]{3}[0-9]*\\/\\S+[^;,.\\s]))$", + "plural_name": false, + "Description": null, + "Rarity": 0.7, + "URL": null, + "Tags": [ + "Identifiers", + "Media" + ], + "Examples": { + "Valid": [ + "10.1000/182", + "doi:10.1002/0470841559.ch1" + ] + } + }, { "Name": "Internet Protocol (IP) Address Version 6", "Regex": "^((?=.*[0-9])\\[?(?:(?:[0-9a-f]{1,4}:){7,7}[0-9a-f]{1,4}|([0-9a-f]{4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-fA]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|(?:[0-9a-f]{1,4}:){1,4}:(?:(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\]?(?::[0-9]{1,5})?)$", diff --git a/tests/test_click.py b/tests/test_click.py index 130eecd..15779ba 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -350,6 +350,13 @@ def test_file_fixture_xmr(): assert re.findall("Monero", str(result.output)) +def test_file_fixture_doi(): + runner = CliRunner() + result = runner.invoke(main, ["-db", "fixtures/file"]) + assert result.exit_code == 0 + assert re.findall("DOI", str(result.output)) + + def test_file_cors(): runner = CliRunner() result = runner.invoke(main, ["-db", "Access-Control-Allow: *"]) From 395e3cc00eefb62be7d773f8ca81a57691789e67 Mon Sep 17 00:00:00 2001 From: SkeletalDemise <29117662+SkeletalDemise@users.noreply.github.com> Date: Wed, 20 Oct 2021 16:48:07 -0700 Subject: [PATCH 24/37] Use the Flake8 Pytest plugin Adds the Flake8 Pytest plugin and removes the CI Pytest CLI version. This makes it like the other linters and it's easier for contributors to run. Fix Flake8 warnings and errors Fixed the Flake8 config. --- .flake8 | 3 - .github/workflows/main.yaml | 3 +- conftest.py | 6 ++ noxfile.py | 1 + poetry.lock | 157 +++++++++++++++++++----------------- pyproject.toml | 13 +-- 6 files changed, 100 insertions(+), 83 deletions(-) delete mode 100644 .flake8 create mode 100644 conftest.py diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 934fdea..0000000 --- a/.flake8 +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -ignore = E501,W503 -max-line-length = 88 diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index f7d584e..15cff02 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -16,8 +16,7 @@ jobs: with: python-version: ${{ matrix.python-version }} architecture: x64 - - run: python -m pip install flake8 nox poetry - - run: flake8 . --count --show-source --statistics + - run: python -m pip install nox poetry - run: python -m nox env: OS: ${{ matrix.os }} diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..0ca5a9a --- /dev/null +++ b/conftest.py @@ -0,0 +1,6 @@ +import logging + + +def pytest_configure(config): + # Silence Flake8 warnings + logging.getLogger("flake8").setLevel(logging.ERROR) diff --git a/noxfile.py b/noxfile.py index aa327e8..4c794f4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -46,6 +46,7 @@ def tests(session: Session) -> None: "pytest-black", "pytest-cov", "pytest-isort", + "pytest-flake8", "pytest-mypy", "types-requests", "types-orjson", diff --git a/poetry.lock b/poetry.lock index 5e53cbe..688755d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -51,7 +51,7 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2021.5.30" +version = "2021.10.8" description = "Python package for providing Mozilla's CA Bundle." category = "dev" optional = false @@ -59,7 +59,7 @@ python-versions = "*" [[package]] name = "charset-normalizer" -version = "2.0.6" +version = "2.0.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -105,7 +105,7 @@ python-versions = ">=3.6, <3.7" [[package]] name = "filelock" -version = "3.3.0" +version = "3.3.1" description = "A platform independent file lock." category = "dev" optional = false @@ -117,21 +117,21 @@ testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-co [[package]] name = "flake8" -version = "3.8.4" +version = "3.9.2" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" +pycodestyle = ">=2.7.0,<2.8.0" +pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "idna" -version = "3.2" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "dev" optional = false @@ -274,7 +274,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycodestyle" -version = "2.6.0" +version = "2.7.0" description = "Python style guide checker" category = "dev" optional = false @@ -282,7 +282,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyflakes" -version = "2.2.0" +version = "2.3.1" description = "passive checker of Python programs" category = "dev" optional = false @@ -339,6 +339,18 @@ black = {version = "*", markers = "python_version >= \"3.6\""} pytest = ">=3.5.0" toml = "*" +[[package]] +name = "pytest-flake8" +version = "1.0.7" +description = "pytest plugin to check FLAKE8 requirements" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +flake8 = ">=3.5" +pytest = ">=3.5" + [[package]] name = "pytest-isort" version = "2.0.0" @@ -373,7 +385,7 @@ pytest = ">=3.5" [[package]] name = "regex" -version = "2021.9.30" +version = "2021.10.21" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -441,7 +453,7 @@ python-versions = "*" [[package]] name = "types-orjson" -version = "3.6.0" +version = "3.6.1" description = "Typing stubs for orjson" category = "dev" optional = false @@ -449,7 +461,7 @@ python-versions = "*" [[package]] name = "types-requests" -version = "2.25.9" +version = "2.25.11" description = "Typing stubs for requests" category = "dev" optional = false @@ -494,7 +506,7 @@ optimize = ["orjson"] [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "a78669cf63b492bdde411ba7e3bebbcc2dfb468d740ae134c815ea6792195698" +content-hash = "cd8b175220ef5cc8a972320cb9cd194e5216d32559f1bee09c486ee8e16503f8" [metadata.files] atomicwrites = [ @@ -510,12 +522,12 @@ black = [ {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, ] certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, - {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, + {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, + {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, @@ -534,16 +546,16 @@ dataclasses = [ {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] filelock = [ - {file = "filelock-3.3.0-py3-none-any.whl", hash = "sha256:bbc6a0382fe8ec4744ecdf6683a2e07f65eb10ff1aff53fc02a202565446cde0"}, - {file = "filelock-3.3.0.tar.gz", hash = "sha256:8c7eab13dc442dc249e95158bcc12dec724465919bdc9831fdbf0660f03d1785"}, + {file = "filelock-3.3.1-py3-none-any.whl", hash = "sha256:2b5eb3589e7fdda14599e7eb1a50e09b4cc14f34ed98b8ba56d33bfaafcbef2f"}, + {file = "filelock-3.3.1.tar.gz", hash = "sha256:34a9f35f95c441e7b38209775d6e0337f9a3759f3565f6c5798f19618527c76f"}, ] flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] importlib-metadata = [ {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, @@ -640,12 +652,12 @@ py = [ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, @@ -662,6 +674,10 @@ pytest = [ pytest-black = [ {file = "pytest-black-0.3.12.tar.gz", hash = "sha256:1d339b004f764d6cd0f06e690f6dd748df3d62e6fe1a692d6a5500ac2c5b75a5"}, ] +pytest-flake8 = [ + {file = "pytest-flake8-1.0.7.tar.gz", hash = "sha256:f0259761a903563f33d6f099914afef339c085085e643bee8343eb323b32dd6b"}, + {file = "pytest_flake8-1.0.7-py2.py3-none-any.whl", hash = "sha256:c28cf23e7d359753c896745fd4ba859495d02e16c84bac36caa8b1eec58f5bc1"}, +] pytest-isort = [ {file = "pytest-isort-2.0.0.tar.gz", hash = "sha256:821a8c5c9c4f3a3c52cfa9c541fbe89ac9e28728125125af53724c4c3f129117"}, {file = "pytest_isort-2.0.0-py3-none-any.whl", hash = "sha256:ab949c593213dad38ba75db32a0ce361fcddd11d4152be4a2c93b85104cc4376"}, @@ -671,47 +687,42 @@ pytest-mypy = [ {file = "pytest_mypy-0.8.1-py3-none-any.whl", hash = "sha256:6e68e8eb7ceeb7d1c83a1590912f784879f037b51adfb9c17b95c6b2fc57466b"}, ] regex = [ - {file = "regex-2021.9.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66696c8336a1b5d1182464f3af3427cc760118f26d0b09a2ddc16a976a4d2637"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d87459ad3ab40cd8493774f8a454b2e490d8e729e7e402a0625867a983e4e02"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78cf6a1e023caf5e9a982f5377414e1aeac55198831b852835732cfd0a0ca5ff"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:255791523f80ea8e48e79af7120b4697ef3b74f6886995dcdb08c41f8e516be0"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e502f8d4e5ef714bcc2c94d499684890c94239526d61fdf1096547db91ca6aa6"}, - {file = "regex-2021.9.30-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4907fb0f9b9309a5bded72343e675a252c2589a41871874feace9a05a540241e"}, - {file = "regex-2021.9.30-cp310-cp310-win32.whl", hash = "sha256:3be40f720af170a6b20ddd2ad7904c58b13d2b56f6734ee5d09bbdeed2fa4816"}, - {file = "regex-2021.9.30-cp310-cp310-win_amd64.whl", hash = "sha256:c2b180ed30856dfa70cfe927b0fd38e6b68198a03039abdbeb1f2029758d87e7"}, - {file = "regex-2021.9.30-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6f2d2f93001801296fe3ca86515eb04915472b5380d4d8752f09f25f0b9b0ed"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa7ba9ab2eba7284e0d7d94f61df7af86015b0398e123331362270d71fab0b9"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28040e89a04b60d579c69095c509a4f6a1a5379cd865258e3a186b7105de72c6"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f588209d3e4797882cd238195c175290dbc501973b10a581086b5c6bcd095ffb"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42952d325439ef223e4e9db7ee6d9087b5c68c5c15b1f9de68e990837682fc7b"}, - {file = "regex-2021.9.30-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cae4099031d80703954c39680323dabd87a69b21262303160776aa0e55970ca0"}, - {file = "regex-2021.9.30-cp36-cp36m-win32.whl", hash = "sha256:0de8ad66b08c3e673b61981b9e3626f8784d5564f8c3928e2ad408c0eb5ac38c"}, - {file = "regex-2021.9.30-cp36-cp36m-win_amd64.whl", hash = "sha256:b345ecde37c86dd7084c62954468a4a655fd2d24fd9b237949dd07a4d0dd6f4c"}, - {file = "regex-2021.9.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6f08187136f11e430638c2c66e1db091105d7c2e9902489f0dbc69b44c222b4"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b55442650f541d195a535ccec33078c78a9521973fb960923da7515e9ed78fa6"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87e9c489aa98f50f367fb26cc9c8908d668e9228d327644d7aa568d47e456f47"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2cb7d4909ed16ed35729d38af585673f1f0833e73dfdf0c18e5be0061107b99"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0861e7f6325e821d5c40514c551fd538b292f8cc3960086e73491b9c5d8291d"}, - {file = "regex-2021.9.30-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:81fdc90f999b2147fc62e303440c424c47e5573a9b615ed5d43a5b832efcca9e"}, - {file = "regex-2021.9.30-cp37-cp37m-win32.whl", hash = "sha256:8c1ad61fa024195136a6b7b89538030bd00df15f90ac177ca278df9b2386c96f"}, - {file = "regex-2021.9.30-cp37-cp37m-win_amd64.whl", hash = "sha256:e3770781353a4886b68ef10cec31c1f61e8e3a0be5f213c2bb15a86efd999bc4"}, - {file = "regex-2021.9.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c065d95a514a06b92a5026766d72ac91bfabf581adb5b29bc5c91d4b3ee9b83"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9925985be05d54b3d25fd6c1ea8e50ff1f7c2744c75bdc4d3b45c790afa2bcb3"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470f2c882f2672d8eeda8ab27992aec277c067d280b52541357e1acd7e606dae"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad0517df22a97f1da20d8f1c8cb71a5d1997fa383326b81f9cf22c9dadfbdf34"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e30838df7bfd20db6466fd309d9b580d32855f8e2c2e6d74cf9da27dcd9b63"}, - {file = "regex-2021.9.30-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b34d2335d6aedec7dcadd3f8283b9682fadad8b9b008da8788d2fce76125ebe"}, - {file = "regex-2021.9.30-cp38-cp38-win32.whl", hash = "sha256:e07049cece3462c626d650e8bf42ddbca3abf4aa08155002c28cb6d9a5a281e2"}, - {file = "regex-2021.9.30-cp38-cp38-win_amd64.whl", hash = "sha256:37868075eda024470bd0feab872c692ac4ee29db1e14baec103257bf6cc64346"}, - {file = "regex-2021.9.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d331f238a7accfbbe1c4cd1ba610d4c087b206353539331e32a8f05345c74aec"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6348a7ab2a502cbdd0b7fd0496d614007489adb7361956b38044d1d588e66e04"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b1cca6c23f19bee8dc40228d9c314d86d1e51996b86f924aca302fc8f8bf9"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f1125bc5172ab3a049bc6f4b9c0aae95a2a2001a77e6d6e4239fa3653e202b5"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:638e98d069b14113e8afba6a54d1ca123f712c0d105e67c1f9211b2a825ef926"}, - {file = "regex-2021.9.30-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a0b0db6b49da7fa37ca8eddf9f40a8dbc599bad43e64f452284f37b6c34d91c"}, - {file = "regex-2021.9.30-cp39-cp39-win32.whl", hash = "sha256:9910869c472e5a6728680ca357b5846546cbbd2ab3ad5bef986ef0bc438d0aa6"}, - {file = "regex-2021.9.30-cp39-cp39-win_amd64.whl", hash = "sha256:3b71213ec3bad9a5a02e049f2ec86b3d7c3e350129ae0f4e2f99c12b5da919ed"}, - {file = "regex-2021.9.30.tar.gz", hash = "sha256:81e125d9ba54c34579e4539a967e976a3c56150796674aec318b1b2f49251be7"}, + {file = "regex-2021.10.21-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:edff4e31d159672a7b9d70164b21289e4b53b239ce1dc945bf9643d266537573"}, + {file = "regex-2021.10.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6432daf42f2c487b357e1aa0bdc43193f050ff53a3188bfab20b88202b53027"}, + {file = "regex-2021.10.21-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:468de52dd3f20187ab5ca4fd265c1bea61a5346baef01ad0333a5e89fa9fad29"}, + {file = "regex-2021.10.21-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5a2ac760f2fc13a1c58131ec217779911890899ce1a0a63c9409bd23fecde6f"}, + {file = "regex-2021.10.21-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ad1fedca001fefc3030d1e9022b038af429e58dc06a7e9c55e40bd1f834582ec"}, + {file = "regex-2021.10.21-cp310-cp310-win32.whl", hash = "sha256:9c613d797a3790f6b12e78a61e1cd29df7fc88135218467cf8b0891353292b9c"}, + {file = "regex-2021.10.21-cp310-cp310-win_amd64.whl", hash = "sha256:678d9a4ce79e1eaa4ebe88bc9769df52919eb30c597576a0deba1f3cf2360e65"}, + {file = "regex-2021.10.21-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2044174af237bb9c56ecc07294cf38623ee379e8dca14b01e970f8b015c71917"}, + {file = "regex-2021.10.21-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98743a2d827a135bf3390452be18d95839b947a099734d53c17e09a64fc09480"}, + {file = "regex-2021.10.21-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f1b23304855303bd97b5954edab63b8ddd56c91c41c6d4eba408228c0bae95f3"}, + {file = "regex-2021.10.21-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c4fd59747236423016ccd89b9a6485d958bf1aa7a8a902a6ba28029107a87f"}, + {file = "regex-2021.10.21-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:130a002fa386c976615a2f6d6dff0fcc25da24858994a36b14d2e3129dce7de2"}, + {file = "regex-2021.10.21-cp36-cp36m-win32.whl", hash = "sha256:8bd83d9b8ee125350cd666b55294f4bc9993c4f0d9b1be9344a318d0762e94cc"}, + {file = "regex-2021.10.21-cp36-cp36m-win_amd64.whl", hash = "sha256:98fe0e1b07a314f0a86dc58af4e717c379d48a403eddd8d966ab9b8bf91ce164"}, + {file = "regex-2021.10.21-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ded4748c7be6f31fb207387ee83a3a0f625e700defe32f268cb1d350ed6e4a66"}, + {file = "regex-2021.10.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3da121de36a9ead0f32b44ea720ee8c87edbb59dca6bb980d18377d84ad58a3"}, + {file = "regex-2021.10.21-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9dfba513eae785e3d868803f5a7e21a032cb2b038fa4a1ea7ec691037426ad3"}, + {file = "regex-2021.10.21-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ff91696888755e96230138355cbe8ce2965d930d967d6cff7c636082d038c78"}, + {file = "regex-2021.10.21-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0f82de529d7595011a40573cc0f27422e59cafa94943b64a4d17d966d75f2c01"}, + {file = "regex-2021.10.21-cp37-cp37m-win32.whl", hash = "sha256:164e51ace4d00f07c519f85ec2209e8faaeab18bc77be6b35685c18d4ac1c22a"}, + {file = "regex-2021.10.21-cp37-cp37m-win_amd64.whl", hash = "sha256:e39eafa854e469d7225066c806c76b9a0acba5ff5ce36c82c0224b75e24888f2"}, + {file = "regex-2021.10.21-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:740a28580520b099b804776db1e919360fcbf30a734a14c5985d5e39a39e7237"}, + {file = "regex-2021.10.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de7dbf72ae80f06e79444ff9614fb5e3a7956645d513b0e12d1bbe6f3ccebd11"}, + {file = "regex-2021.10.21-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dc1a9bedf389bf3d3627a4d2b21cbdc5fe5e0f029d1f465972f4437833dcc946"}, + {file = "regex-2021.10.21-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd14f22425beecf727f6dbdf5c893e46ecbc5ff16197c16a6f38a9066f2d4d5"}, + {file = "regex-2021.10.21-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b75a3db3aab0bfa51b6af3f820760779d360eb79f59e32c88c7fba648990b4f"}, + {file = "regex-2021.10.21-cp38-cp38-win32.whl", hash = "sha256:f68c71aabb10b1352a06515e25a425a703ba85660ae04cf074da5eb91c0af5e5"}, + {file = "regex-2021.10.21-cp38-cp38-win_amd64.whl", hash = "sha256:c0f49f1f03be3e4a5faaadc35db7afa2b83a871943b889f9f7bba56e0e2e8bd5"}, + {file = "regex-2021.10.21-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:201890fdc8a65396cfb6aa4493201353b2a6378e27d2de65234446f8329233cb"}, + {file = "regex-2021.10.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd1bfc6b7347de9f0ae1fb6f9080426bed6a9ca55b5766fa4fdf7b3a29ccae9c"}, + {file = "regex-2021.10.21-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:72a0b98d41c4508ed23a96eef41090f78630b44ba746e28cd621ecbe961e0a16"}, + {file = "regex-2021.10.21-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b5a0660a63b0703380758a7141b96cc1c1a13dee2b8e9c280a2522962fd12af"}, + {file = "regex-2021.10.21-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f82d3adde46ac9188db3aa7e6e1690865ebb6448d245df5a3ea22284f70d9e46"}, + {file = "regex-2021.10.21-cp39-cp39-win32.whl", hash = "sha256:bc4637390235f1e3e2fcdd3e904ca0b42aa655ae28a78072248b2992b4ad4c08"}, + {file = "regex-2021.10.21-cp39-cp39-win_amd64.whl", hash = "sha256:74d03c256cf0aed81997e87be8e24297b5792c9718f3a735f5055ddfad392f06"}, + {file = "regex-2021.10.21.tar.gz", hash = "sha256:4832736b3f24617e63dc919ce8c4215680ba94250a5d9e710fcc0c5f457b5028"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, @@ -762,12 +773,12 @@ typed-ast = [ {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] types-orjson = [ - {file = "types-orjson-3.6.0.tar.gz", hash = "sha256:e8513f75886a13e6061f5658d53d57d97b3af20cb9c3dcee09e31793f3cee28f"}, - {file = "types_orjson-3.6.0-py3-none-any.whl", hash = "sha256:cdbc920c1354a2b54f2b96ffd95523bbfecdd645063ac5ab40915d0680880d8d"}, + {file = "types-orjson-3.6.1.tar.gz", hash = "sha256:6bc2245b242c9ab4c8845495a4c16a51fa22510c8ac1d83da027ab3ce1f77d8a"}, + {file = "types_orjson-3.6.1-py3-none-any.whl", hash = "sha256:b3e991dd05fc6571a423996cbde37183123983783db64c5bc53e985ae32c7176"}, ] types-requests = [ - {file = "types-requests-2.25.9.tar.gz", hash = "sha256:4ec8b71da73e5344adb9bee725a74ec8598e7286f9bcb17500d627f259fe4fb9"}, - {file = "types_requests-2.25.9-py3-none-any.whl", hash = "sha256:543ba8b3b23e38ac028da1d163aecbbc27d3cc8f654ae64339da539a191a2b1c"}, + {file = "types-requests-2.25.11.tar.gz", hash = "sha256:b279284e51f668e38ee12d9665e4d789089f532dc2a0be4a1508ca0efd98ba9e"}, + {file = "types_requests-2.25.11-py3-none-any.whl", hash = "sha256:ba1d108d512e294b6080c37f6ae7cb2a2abf527560e2b671d1786c1fc46b541a"}, ] typing-extensions = [ {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, diff --git a/pyproject.toml b/pyproject.toml index d8ab60e..dced1fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,13 +14,14 @@ rich = ">=9.9,<11.0" orjson = {version = "^3.6.1", optional = true} [tool.poetry.dev-dependencies] -pytest = "^6.2.4" -black = {version = "^21.6b0", python = "^3.6.2"} -isort = {version = "^5.9.2", python = "^3.6.1"} -flake8 = "3.8.4" +pytest = "^6.2.5" +black = {version = "^21.9b0", python = "^3.6.2"} +isort = {version = "^5.9.3", python = "^3.6.1"} +flake8 = "<4.0" requests = "^2.26.0" pytest-black = "^0.3.12" pytest-isort = "^2.0.0" +pytest-flake8 = "^1.0.7" pytest-mypy = "^0.8.1" types-requests = "^2.25.9" types-orjson = "^3.6.0" @@ -49,4 +50,6 @@ line_length = 88 ignore_missing_imports = true [tool.pytest.ini_options] -addopts = "--black --isort --mypy" +flake8-max-line-length = 88 +flake8-ignore = ["E501", "E203", "W503"] +addopts = "--black --isort --flake8 --mypy" From 5b835d53815fcf87b50c60c9ea89af68971caf31 Mon Sep 17 00:00:00 2001 From: Joel Date: Thu, 21 Oct 2021 21:38:31 +1000 Subject: [PATCH 25/37] ci: test python 3.10 --- .github/workflows/main.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index f7d584e..618a256 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -6,7 +6,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.6', '3.7', '3.8', '3.9'] + python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} name: Python ${{ matrix.python-version }} on ${{ matrix.os }} From bdb288899f01b65273a16e4a7a89066de32eb226 Mon Sep 17 00:00:00 2001 From: SkeletalDemise <29117662+SkeletalDemise@users.noreply.github.com> Date: Fri, 22 Oct 2021 00:24:56 -0700 Subject: [PATCH 26/37] Add old Flake8 config back --- .flake8 | 3 +++ pyproject.toml | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 .flake8 diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..4e3adcc --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 88 +ignore = E501, E203, W503 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index dced1fc..43e2f6c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,4 @@ line_length = 88 ignore_missing_imports = true [tool.pytest.ini_options] -flake8-max-line-length = 88 -flake8-ignore = ["E501", "E203", "W503"] addopts = "--black --isort --flake8 --mypy" From 85f74cd30bded78f46869b6f6d8792a943b750e6 Mon Sep 17 00:00:00 2001 From: bee-san Date: Fri, 22 Oct 2021 17:29:07 +0100 Subject: [PATCH 27/37] 5.0.0 release --- pyproject.toml | 2 +- pywhat/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d8ab60e..e03e3b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pywhat" -version = "4.3.1" +version = "5.0.0" description = "What is that thing?" authors = ["Bee "] license = "MIT" diff --git a/pywhat/__init__.py b/pywhat/__init__.py index 859f02f..d1b290a 100644 --- a/pywhat/__init__.py +++ b/pywhat/__init__.py @@ -2,7 +2,7 @@ from pywhat.helper import AvailableTags, Keys from pywhat.identifier import Identifier -__version__ = "4.3.1" +__version__ = "5.0.0" tags = AvailableTags().get_tags() pywhat_tags = tags # left for backward compatibility purposes From 08f5f789479fef7ee099fb3789c5c09f68ba68bd Mon Sep 17 00:00:00 2001 From: spicyyboi <34308782+spicyyboi@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:36:32 +0200 Subject: [PATCH 28/37] Update Mailchimp with example tokens --- pywhat/Data/regex.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 0318227..25a67b0 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1330,7 +1330,7 @@ "Regex": "(?i)^([0-9a-f]{32}-us[0-9]{1,2})$", "plural_name": false, "Description": null, - "Exploit": "Use the command below to verify that the API key is valid:\n $ curl --request GET --url 'https://.api.mailchimp.com/3.0/' --user 'anystring:API_KEY_HERE' --include\n", + "Exploit": "Use the command below to verify that the API key is valid (substitute for your datacenter, i. e. us5):\n $ curl --request GET --url 'https://.api.mailchimp.com/3.0/' --user 'anystring:API_KEY_HERE' --include\n", "Rarity": 0.8, "URL": null, "Tags": [ @@ -1338,7 +1338,15 @@ "API Keys", "Credentials", "Mailchimp" - ] + ], + "Examples": { + "Valid": [ + "d619ce3b691e29ec064fede7ff9afbff-us5", + "4bf6010e49fb0791f3940681791934e7-us5", + "a80122b2565c3e26a61cbf58d1d1aad7-us5" + ], + "Invalid": [] + } }, { "Name": "Notion Integration Token", From 1e340f2c059338d4131f0475feb262ce43014b9b Mon Sep 17 00:00:00 2001 From: spicyyboi <34308782+spicyyboi@users.noreply.github.com> Date: Mon, 25 Oct 2021 18:44:52 +0200 Subject: [PATCH 29/37] Add Mailchimp to test fixture --- fixtures/file | 2 ++ tests/test_click.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/fixtures/file b/fixtures/file index 9824d5b..99df774 100644 --- a/fixtures/file +++ b/fixtures/file @@ -101,3 +101,5 @@ https://hooks.slack.com/services/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 doi:10.1392/BC1.0 10.1000/123 + +a80122b2565c3e26a61cbf58d1d1aad7-us5 diff --git a/tests/test_click.py b/tests/test_click.py index 15779ba..cdaf5ec 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -357,6 +357,13 @@ def test_file_fixture_doi(): assert re.findall("DOI", str(result.output)) +def test_file_fixture_mailchimp(): + runner = CliRunner() + result = runner.invoke(main, ["-db", "fixtures/file"]) + assert result.exit_code == 0 + assert re.findall("Mailchimp", str(result.output)) + + def test_file_cors(): runner = CliRunner() result = runner.invoke(main, ["-db", "Access-Control-Allow: *"]) From 00592693ae0b8ae0a3009b513a5dc2619c7571f6 Mon Sep 17 00:00:00 2001 From: Jirawat I Date: Tue, 2 Nov 2021 06:08:37 +0700 Subject: [PATCH 30/37] Add new RegEx for facebook tokens - Add new RegEx and tests for facebook app tokens and access token based on v12 API https://developers.facebook.com/docs/facebook-login/access-tokens/ --- fixtures/file | 6 ++++++ pywhat/Data/regex.json | 33 +++++++++++++++++++++++++++++++-- tests/test_click.py | 14 ++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/fixtures/file b/fixtures/file index 99df774..742ad1f 100644 --- a/fixtures/file +++ b/fixtures/file @@ -103,3 +103,9 @@ doi:10.1392/BC1.0 10.1000/123 a80122b2565c3e26a61cbf58d1d1aad7-us5 + +1201566843289141|401fec62f46bc340d4c0e7e75132f731 +1201566843289141|WG1OAKQ-dY0lSj5NKyA6uFkvF7w + +EAARE0ZATePjUBAFxfm2L2aWdtNXOSscOnMYktEPYJuOSrteSQZCh9VWVVKnhSSYNumEnju6XItaRhija3pA7LFPHquTbi4IDZC8k9EMByeQ4NJzCFsc40FMIQIgvnCTOK5qt6xBZCUMf7S95X6nnqCUVw2iS0DRDbqttxauxIDgBRYJ7zZABXe9V0CY872DUl3BfyINIYfCXmRZC8loACc +EAARE0ZATePjUBAHVHoVVbRc9N0u2lNC5eJab59qwD9mG5ZCRgcg3qlbPZC07EkP65Ji3BnPzPKZBMqN7WyOfJ8Riky4RD66aSqX8U0d14EWwHx94rZCtM6qfULiXOrqWKiG2KLyJJnRzAus3ubodKUwTuZCBcPmcGJcvq5Krfk8xgLQVZBoFLGLJs5wT4SlBxiWAdytlggqzQZDZD \ No newline at end of file diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 25a67b0..6f4b11a 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -426,7 +426,7 @@ }, { "Name": "Facebook Access Token", - "Regex": "^(EAACEdEose0cBA[0-9A-Za-z]{512})$", + "Regex": "^(EA[0-9A-Za-z]{190,})$", "plural_name": false, "Description": null, "Exploit": null, @@ -437,7 +437,14 @@ "Bug Bounty", "Credentials", "Facebook" - ] + ], + "Examples": { + "Valid": [ + "EAARE0ZATePjUBAFxfm2L2aWdtNXOSscOnMYktEPYJuOSrteSQZCh9VWVVKnhSSYNumEnju6XItaRhija3pA7LFPHquTbi4IDZC8k9EMByeQ4NJzCFsc40FMIQIgvnCTOK5qt6xBZCUMf7S95X6nnqCUVw2iS0DRDbqttxauxIDgBRYJ7zZABXe9V0CY872DUl3BfyINIYfCXmRZC8loACc", + "EAARE0ZATePjUBAHVHoVVbRc9N0u2lNC5eJab59qwD9mG5ZCRgcg3qlbPZC07EkP65Ji3BnPzPKZBMqN7WyOfJ8Riky4RD66aSqX8U0d14EWwHx94rZCtM6qfULiXOrqWKiG2KLyJJnRzAus3ubodKUwTuZCBcPmcGJcvq5Krfk8xgLQVZBoFLGLJs5wT4SlBxiWAdytlggqzQZDZD" + ], + "Invalid": [] + } }, { "Name": "Facebook Secret Key", @@ -1309,6 +1316,28 @@ ] } }, + { + "Name": "Facebook App Token", + "Regex": "^([0-9]{10,}\\|[A-Za-z0-9\\-]{27,})$", + "plural_name": false, + "Description": null, + "Exploit": null, + "Rarity": 0.8, + "URL": "https://developers.facebook.com/tools/debug/accesstoken/?access_token=", + "Tags": [ + "API Keys", + "Bug Bounty", + "Credentials", + "Facebook" + ], + "Examples": { + "Valid": [ + "1201566843289141|401fec62f46bc340d4c0e7e75132f731", + "1201566843289141|WG1OAKQ-dY0lSj5NKyA6uFkvF7w" + ], + "Invalid": [] + } + }, { "Name": "Google Cloud Platform API Key", "Regex": "(?i)^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", diff --git a/tests/test_click.py b/tests/test_click.py index cdaf5ec..4fcaf90 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -660,6 +660,20 @@ def test_file_fixture_slack_webhook(): assert re.findall("Slack Webhook", str(result.output)) +def test_file_fixture_facebook_access_token(): + runner = CliRunner() + result = runner.invoke(main, ["fixtures/file"]) + assert result.exit_code == 0 + assert re.findall("Facebook Access Token", str(result.output)) + + +def test_file_fixture_facebook_app_token(): + runner = CliRunner() + result = runner.invoke(main, ["fixtures/file"]) + assert result.exit_code == 0 + assert re.findall("Facebook App Token", str(result.output)) + + def test_format(): runner = CliRunner() result = runner.invoke( From 1936c5c37c12b39a057d8d5ee6e48cf584e28cab Mon Sep 17 00:00:00 2001 From: Jirawat I Date: Wed, 3 Nov 2021 16:39:12 +0700 Subject: [PATCH 31/37] Patch #197 Lat / Long matches incorrectly https://github.com/bee-san/pyWhat/issues/197#issuecomment-958700434 --- pywhat/Data/regex.json | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 25a67b0..ff8db8f 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1477,7 +1477,7 @@ }, { "Name": "Latitude & Longitude Coordinates", - "Regex": "(?i)^((?:(?:N|W|S|E)\\s?\\d+\\s?\\u00B0?\\s?\\d+\\.?\\d*\\s?\\'?\\s?\\d*\\.?\\,?\\d*?\"?\\s?){1,2}|(?:\\d+\\s?\\u00B0\\s?\\d+\\s?\\'\\s?\\d+\\.?\\,?\\d{0,}?\"\\s?(?:N|W|S|E)\\s?){1,2}|(?:[-+]?(?:[0-8]?\\d+\\.\\d{4,}|90(?:\\.0+)?),\\s*[-+]?(?:180(?:\\.0+)?|(?:(?:1[0-7]\\d)|(?:[1-9]?\\d))(?:\\.\\d+)?)))$", + "Regex": "(?i)^((?:(?:N|W|S|E)\\s?\\d+\\s?\\u00B0\\s?\\d+\\.?\\d*\\s?\\'?\\s?\\d*\\.?\\,?\\d*?\\\"?\\s?){1,2}|(?:\\d+\\s?\\u00B0\\s?\\d+\\s?\\'?\\s?\\d+\\.?\\,?\\d{0,}?\\\"?\\s?(?:N|W|S|E)\\s?){1,2}|(?:[-+]?(?:[0-8]?\\d+\\.\\d{4,}|90(?:\\.0+)?),\\s*[-+]?(?:180(?:\\.0+)?|(?:(?:1[0-7]\\d)|(?:[1-9]?\\d))(?:\\.\\d+)?))|(?:@\\d+\\.\\d{4,},\\d+.\\d{4,},\\d+z))$", "plural_name": true, "Description": null, "Rarity": 0.7, @@ -1494,9 +1494,16 @@ "77\u00b0 30' 29.9988\" N", "N 32\u00b0 53.733 W 096\u00b0 48.358", "41\u00b024'12.2\" N 2\u00b010'26.5\" E", - "40.741895,-73.989308" + "40.741895,-73.989308", + "@13.923404,101.3395163,17z" ], - "Invalid": [] + "Invalid": [ + "123N", + "E123", + "e12.23123", + "n12.1211,e1.12331", + "123.34,78.8" + ] } }, { From 75a9464c6c562de5e87907f886f48e62d32233eb Mon Sep 17 00:00:00 2001 From: Jirawat I Date: Wed, 3 Nov 2021 17:13:36 +0700 Subject: [PATCH 32/37] Remove testcases and adjust the rarity - Remove testcases from fixtures/file and test_click.py - Adjust the rarity of Access token and App token to 0.2 and 0.3, respectively --- fixtures/file | 6 --- pywhat/Data/regex.json | 88 +++++++++++++++++++++--------------------- tests/test_click.py | 14 ------- 3 files changed, 44 insertions(+), 64 deletions(-) diff --git a/fixtures/file b/fixtures/file index 742ad1f..99df774 100644 --- a/fixtures/file +++ b/fixtures/file @@ -103,9 +103,3 @@ doi:10.1392/BC1.0 10.1000/123 a80122b2565c3e26a61cbf58d1d1aad7-us5 - -1201566843289141|401fec62f46bc340d4c0e7e75132f731 -1201566843289141|WG1OAKQ-dY0lSj5NKyA6uFkvF7w - -EAARE0ZATePjUBAFxfm2L2aWdtNXOSscOnMYktEPYJuOSrteSQZCh9VWVVKnhSSYNumEnju6XItaRhija3pA7LFPHquTbi4IDZC8k9EMByeQ4NJzCFsc40FMIQIgvnCTOK5qt6xBZCUMf7S95X6nnqCUVw2iS0DRDbqttxauxIDgBRYJ7zZABXe9V0CY872DUl3BfyINIYfCXmRZC8loACc -EAARE0ZATePjUBAHVHoVVbRc9N0u2lNC5eJab59qwD9mG5ZCRgcg3qlbPZC07EkP65Ji3BnPzPKZBMqN7WyOfJ8Riky4RD66aSqX8U0d14EWwHx94rZCtM6qfULiXOrqWKiG2KLyJJnRzAus3ubodKUwTuZCBcPmcGJcvq5Krfk8xgLQVZBoFLGLJs5wT4SlBxiWAdytlggqzQZDZD \ No newline at end of file diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 6f4b11a..5a055ed 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -424,28 +424,6 @@ "Invalid": [] } }, - { - "Name": "Facebook Access Token", - "Regex": "^(EA[0-9A-Za-z]{190,})$", - "plural_name": false, - "Description": null, - "Exploit": null, - "Rarity": 1, - "URL": "https://developers.facebook.com/tools/debug/accesstoken/?access_token=", - "Tags": [ - "API Keys", - "Bug Bounty", - "Credentials", - "Facebook" - ], - "Examples": { - "Valid": [ - "EAARE0ZATePjUBAFxfm2L2aWdtNXOSscOnMYktEPYJuOSrteSQZCh9VWVVKnhSSYNumEnju6XItaRhija3pA7LFPHquTbi4IDZC8k9EMByeQ4NJzCFsc40FMIQIgvnCTOK5qt6xBZCUMf7S95X6nnqCUVw2iS0DRDbqttxauxIDgBRYJ7zZABXe9V0CY872DUl3BfyINIYfCXmRZC8loACc", - "EAARE0ZATePjUBAHVHoVVbRc9N0u2lNC5eJab59qwD9mG5ZCRgcg3qlbPZC07EkP65Ji3BnPzPKZBMqN7WyOfJ8Riky4RD66aSqX8U0d14EWwHx94rZCtM6qfULiXOrqWKiG2KLyJJnRzAus3ubodKUwTuZCBcPmcGJcvq5Krfk8xgLQVZBoFLGLJs5wT4SlBxiWAdytlggqzQZDZD" - ], - "Invalid": [] - } - }, { "Name": "Facebook Secret Key", "Regex": "(?i)^((facebook|fb)(.{0,20})?['\\\"][0-9a-f]{32}['\\\"])$", @@ -1316,28 +1294,6 @@ ] } }, - { - "Name": "Facebook App Token", - "Regex": "^([0-9]{10,}\\|[A-Za-z0-9\\-]{27,})$", - "plural_name": false, - "Description": null, - "Exploit": null, - "Rarity": 0.8, - "URL": "https://developers.facebook.com/tools/debug/accesstoken/?access_token=", - "Tags": [ - "API Keys", - "Bug Bounty", - "Credentials", - "Facebook" - ], - "Examples": { - "Valid": [ - "1201566843289141|401fec62f46bc340d4c0e7e75132f731", - "1201566843289141|WG1OAKQ-dY0lSj5NKyA6uFkvF7w" - ], - "Invalid": [] - } - }, { "Name": "Google Cloud Platform API Key", "Regex": "(?i)^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$", @@ -2363,6 +2319,28 @@ "Invalid": [] } }, + { + "Name": "Facebook App Token", + "Regex": "^([0-9]{6,}\\|[A-Za-z0-9\\-]{24,})$", + "plural_name": false, + "Description": null, + "Exploit": null, + "Rarity": 0.3, + "URL": "https://developers.facebook.com/tools/debug/accesstoken/?access_token=", + "Tags": [ + "API Keys", + "Bug Bounty", + "Credentials", + "Facebook" + ], + "Examples": { + "Valid": [ + "1201566843289141|401fec62f46bc340d4c0e7e75132f731", + "1201566843289141|WG1OAKQ-dY0lSj5NKyA6uFkvF7w" + ], + "Invalid": [] + } + }, { "Name": "JSON Web Token (JWT)", "Regex": "(?i)^((?=.*[a-z])(?=.*[0-9])(?:[a-z0-9_=]+\\.){2}(?:[a-z0-9_\\-\\+\\/=]*))$", @@ -2466,6 +2444,28 @@ "Invalid": [] } }, + { + "Name": "Facebook Access Token", + "Regex": "^(EA[0-9A-Za-z]{190,})$", + "plural_name": false, + "Description": null, + "Exploit": null, + "Rarity": 0.2, + "URL": "https://developers.facebook.com/tools/debug/accesstoken/?access_token=", + "Tags": [ + "API Keys", + "Bug Bounty", + "Credentials", + "Facebook" + ], + "Examples": { + "Valid": [ + "EAARE0ZATePjUBAFxfm2L2aWdtNXOSscOnMYktEPYJuOSrteSQZCh9VWVVKnhSSYNumEnju6XItaRhija3pA7LFPHquTbi4IDZC8k9EMByeQ4NJzCFsc40FMIQIgvnCTOK5qt6xBZCUMf7S95X6nnqCUVw2iS0DRDbqttxauxIDgBRYJ7zZABXe9V0CY872DUl3BfyINIYfCXmRZC8loACc", + "EAARE0ZATePjUBAHVHoVVbRc9N0u2lNC5eJab59qwD9mG5ZCRgcg3qlbPZC07EkP65Ji3BnPzPKZBMqN7WyOfJ8Riky4RD66aSqX8U0d14EWwHx94rZCtM6qfULiXOrqWKiG2KLyJJnRzAus3ubodKUwTuZCBcPmcGJcvq5Krfk8xgLQVZBoFLGLJs5wT4SlBxiWAdytlggqzQZDZD" + ], + "Invalid": [] + } + }, { "Name": "ObjectID", "Regex": "^([0-9a-fA-F]{24})$", diff --git a/tests/test_click.py b/tests/test_click.py index 4fcaf90..cdaf5ec 100644 --- a/tests/test_click.py +++ b/tests/test_click.py @@ -660,20 +660,6 @@ def test_file_fixture_slack_webhook(): assert re.findall("Slack Webhook", str(result.output)) -def test_file_fixture_facebook_access_token(): - runner = CliRunner() - result = runner.invoke(main, ["fixtures/file"]) - assert result.exit_code == 0 - assert re.findall("Facebook Access Token", str(result.output)) - - -def test_file_fixture_facebook_app_token(): - runner = CliRunner() - result = runner.invoke(main, ["fixtures/file"]) - assert result.exit_code == 0 - assert re.findall("Facebook App Token", str(result.output)) - - def test_format(): runner = CliRunner() result = runner.invoke( From cf1a1651cf313f1544cb626d9601e488373dfde6 Mon Sep 17 00:00:00 2001 From: amadejpapez Date: Sat, 6 Nov 2021 20:04:22 +0100 Subject: [PATCH 33/37] fix: Amazon EC2 ID getting matched a lot --- pywhat/Data/regex.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 25a67b0..27a5c9c 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -2399,8 +2399,8 @@ } }, { - "Name": "Amazon Web Services EC2 Instance Identifier", - "Regex": "(?i)^(\\b[a-z]+-[a-z0-9]+)$", + "Name": "Amazon Web Services EC2 Instance ID", + "Regex": "(?i)^(i-([a-z0-9]{8}|[a-z0-9]{17}))$", "plural_name": false, "Description": null, "Rarity": 0.2, @@ -2412,7 +2412,8 @@ ], "Examples": { "Valid": [ - "i-1234567890abcdef0" + "i-1234567890abcdef0", + "i-1a2b3c4d" ], "Invalid": [] } From f1ed9d4f741f1a30d850c1489f7400981c1cdc93 Mon Sep 17 00:00:00 2001 From: amadejpapez Date: Sat, 6 Nov 2021 20:13:10 +0100 Subject: [PATCH 34/37] fix: typos in help menu, smaller titles in template --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++---- pywhat/what.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 822b66b..a54644a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,15 +1,15 @@ **⚠ Pull Requests not made with this template will be automatically closed 🔥** -# Prerequisites +## Prerequisites - [ ] Have you read the documentation on contributing? https://github.com/bee-san/pyWhat/wiki/Adding-your-own-Regex -# Why do we need this pull request? +## Why do we need this pull request? * Explain the _why_ behind your PR. We can see what it does from the code. But _why_ does it do that? -# What [GitHub issues](https://github.com/bee-san/pyWhat/issues) does this fix? +## What [GitHub issues](https://github.com/bee-san/pyWhat/issues) does this fix? * Fixes #10000 -# Copy / paste of output +## Copy / paste of output Please copy and paste the output of PyWhat with your new addition using an example that tests this addition below: diff --git a/pywhat/what.py b/pywhat/what.py index 9ed31da..5627bda 100644 --- a/pywhat/what.py +++ b/pywhat/what.py @@ -120,7 +120,7 @@ def get_text(ctx, opts, value): required=False, help="Format output according to specified rules.", ) -@click.option("-pt", "--print-tags", is_flag=True, help="Add flags to ouput") +@click.option("-pt", "--print-tags", is_flag=True, help="Add flags to output") def main(**kwargs): """ pyWhat - Identify what something is. @@ -193,7 +193,7 @@ def main(**kwargs): pretty - Output data in the table - json - Ouput data in json format + json - Output data in json format CUSTOM_STRING - Print data in the way you want. For every match CUSTOM_STRING will be printed and '%x' (See below for possible x values) will be substituted with a match value. @@ -214,11 +214,11 @@ def main(**kwargs): %d - description (will not output if absent) - %e - exploit (will not ouput if absent) + %e - exploit (will not output if absent) %r - rarity - %l - link (will not ouput if absent) + %l - link (will not output if absent) %t - tags (in 'tag1, tag2 ...' format) From db8da145b40a202a312eff0660f1f0a32a4fe97d Mon Sep 17 00:00:00 2001 From: amadejpapez Date: Sat, 6 Nov 2021 22:00:03 +0100 Subject: [PATCH 35/37] fix: improved URL regex --- pywhat/Data/regex.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 25a67b0..0986a04 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1409,7 +1409,7 @@ }, { "Name": "Uniform Resource Locator (URL)", - "Regex": "(?i)^((?:(?:https?|ftp):\\/\\/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?::[0-9]{1,5})?)([a-z0-9-_\\/]?\\.?)*|(?:(?:https?|ftp):\\/\\/)?(?:\\S+:\\S+@)?(?:[a-z0-9-_]?\\.?)+?(?:[a-z0-9-_][a-z0-9-_]{0,62})\\.(?:XN--VERMGENSBERATUNG-PWB|XN--VERMGENSBERATER-CTB|XN--CLCHC0EA0B2G2A9GCD|XN--W4R85EL8FHU5DNRA|NORTHWESTERNMUTUAL|TRAVELERSINSURANCE|XN--3OQ18VL8PN36A|XN--5SU34J936BGSG|XN--BCK1B9A5DRE4C|XN--MGBAH1A3HJKRD|XN--MGBAI9AZGQP6J|XN--MGBERP4A5D4AR|XN--XKC2DL3A5EE0H|XN--FZYS8D69UVGM|XN--MGBA7C0BBN0A|XN--MGBCPQ6GPA1A|XN--XKC2AL3HYE2A|AMERICANEXPRESS|KERRYPROPERTIES|SANDVIKCOROMANT|XN--I1B6B1A6A2E|XN--KCRX77D1X4A|XN--LGBBAT1AD8J|XN--MGBA3A4F16A|XN--MGBAAKC7DVF|XN--MGBC0A9AZCG|XN--NQV7FS00EMA|AFAMILYCOMPANY|AMERICANFAMILY|BANANAREPUBLIC|CANCERRESEARCH|COOKINGCHANNEL|KERRYLOGISTICS|WEATHERCHANNEL|XN--54B7FTA0CC|XN--6QQ986B3XL|XN--80AQECDR1A|XN--B4W605FERD|XN--FIQ228C5HS|XN--H2BREG3EVE|XN--JLQ480N2RG|XN--JLQ61U9W7B|XN--MGBA3A3EJT|XN--MGBAAM7A8H|XN--MGBAYH7GPA|XN--MGBBH1A71E|XN--MGBCA7DZDO|XN--MGBI4ECEXP|XN--MGBX4CD0AB|XN--RVC1E0AM3E|INTERNATIONAL|LIFEINSURANCE|TRAVELCHANNEL|WOLTERSKLUWER|XN--CCKWCXETD|XN--ECKVDTC9D|XN--FPCRJ9C3D|XN--FZC2C9E2C|XN--H2BRJ9C8C|XN--TIQ49XQYJ|XN--YFRO4I67O|XN--YGBI2AMMX|CONSTRUCTION|LPLFINANCIAL|SCHOLARSHIPS|VERSICHERUNG|XN--3E0B707E|XN--45BR5CYL|XN--4DBRK0CE|XN--80ADXHKS|XN--80ASEHDB|XN--8Y0A063A|XN--GCKR3F0F|XN--MGB9AWBF|XN--MGBAB2BD|XN--MGBGU82A|XN--MGBPL2FH|XN--MGBT3DHD|XN--MK1BU44C|XN--NGBC5AZD|XN--NGBE9E0A|XN--OGBPF8FL|XN--QCKA1PMC|ACCOUNTANTS|BARCLAYCARD|BLACKFRIDAY|BLOCKBUSTER|BRIDGESTONE|CALVINKLEIN|CONTRACTORS|CREDITUNION|ENGINEERING|ENTERPRISES|FOODNETWORK|INVESTMENTS|KERRYHOTELS|LAMBORGHINI|MOTORCYCLES|OLAYANGROUP|PHOTOGRAPHY|PLAYSTATION|PRODUCTIONS|PROGRESSIVE|REDUMBRELLA|WILLIAMHILL|XN--11B4C3D|XN--1CK2E1B|XN--1QQW23A|XN--2SCRJ9C|XN--3BST00M|XN--3DS443G|XN--3HCRJ9C|XN--42C2D9A|XN--45BRJ9C|XN--55QW42G|XN--6FRZ82G|XN--80AO21A|XN--9KRT00A|XN--CCK2B3B|XN--CZR694B|XN--D1ACJ3B|XN--EFVY88H|XN--FCT429K|XN--FJQ720A|XN--FLW351E|XN--G2XX48C|XN--GECRJ9C|XN--GK3AT1E|XN--H2BRJ9C|XN--HXT814E|XN--IMR513N|XN--J6W193G|XN--JVR189M|XN--KPRW13D|XN--KPRY57D|XN--MGBBH1A|XN--MGBTX2B|XN--MIX891F|XN--NYQY26A|XN--OTU796D|XN--PGBS0DH|XN--Q9JYB4C|XN--RHQV96G|XN--ROVU88B|XN--S9BRJ9C|XN--SES554G|XN--T60B56A|XN--VUQ861B|XN--W4RS40L|XN--XHQ521B|XN--ZFR164B|ACCOUNTANT|APARTMENTS|ASSOCIATES|BASKETBALL|BNPPARIBAS|BOEHRINGER|CAPITALONE|CONSULTING|CREDITCARD|CUISINELLA|EUROVISION|EXTRASPACE|FOUNDATION|HEALTHCARE|IMMOBILIEN|INDUSTRIES|MANAGEMENT|MITSUBISHI|NEXTDIRECT|PROPERTIES|PROTECTION|PRUDENTIAL|REALESTATE|REPUBLICAN|RESTAURANT|SCHAEFFLER|SWIFTCOVER|TATAMOTORS|TECHNOLOGY|UNIVERSITY|VLAANDEREN|VOLKSWAGEN|XN--30RR7Y|XN--3PXU8K|XN--45Q11C|XN--4GBRIM|XN--55QX5D|XN--5TZM5G|XN--80ASWG|XN--90A3AC|XN--9DBQ2A|XN--9ET52U|XN--C2BR7G|XN--CG4BKI|XN--CZRS0T|XN--CZRU2D|XN--FIQ64B|XN--FIQS8S|XN--FIQZ9S|XN--IO0A7I|XN--KPUT3I|XN--MXTQ1M|XN--O3CW4H|XN--PSSY2U|XN--Q7CE6A|XN--UNUP4Y|XN--WGBH1C|XN--WGBL6A|XN--Y9A3AQ|ACCENTURE|ALFAROMEO|ALLFINANZ|AMSTERDAM|ANALYTICS|AQUARELLE|BARCELONA|BLOOMBERG|CHRISTMAS|COMMUNITY|DIRECTORY|EDUCATION|EQUIPMENT|FAIRWINDS|FINANCIAL|FIRESTONE|FRESENIUS|FRONTDOOR|FURNITURE|GOLDPOINT|HISAMITSU|HOMEDEPOT|HOMEGOODS|HOMESENSE|INSTITUTE|INSURANCE|KUOKGROUP|LANCASTER|LANDROVER|LIFESTYLE|MARKETING|MARSHALLS|MELBOURNE|MICROSOFT|PANASONIC|PASSAGENS|PRAMERICA|RICHARDLI|SCJOHNSON|SHANGRILA|SOLUTIONS|STATEBANK|STATEFARM|STOCKHOLM|TRAVELERS|VACATIONS|XN--90AIS|XN--C1AVG|XN--D1ALF|XN--E1A4C|XN--FHBEI|XN--J1AEF|XN--J1AMH|XN--L1ACC|XN--NGBRX|XN--NQV7F|XN--P1ACF|XN--QXA6A|XN--TCKWE|XN--VHQUV|YODOBASHI|ABUDHABI|AIRFORCE|ALLSTATE|ATTORNEY|BARCLAYS|BAREFOOT|BARGAINS|BASEBALL|BOUTIQUE|BRADESCO|BROADWAY|BRUSSELS|BUDAPEST|BUILDERS|BUSINESS|CAPETOWN|CATERING|CATHOLIC|CIPRIANI|CITYEATS|CLEANING|CLINIQUE|CLOTHING|COMMBANK|COMPUTER|DELIVERY|DELOITTE|DEMOCRAT|DIAMONDS|DISCOUNT|DISCOVER|DOWNLOAD|ENGINEER|ERICSSON|ETISALAT|EXCHANGE|FEEDBACK|FIDELITY|FIRMDALE|FOOTBALL|FRONTIER|GOODYEAR|GRAINGER|GRAPHICS|GUARDIAN|HDFCBANK|HELSINKI|HOLDINGS|HOSPITAL|INFINITI|IPIRANGA|ISTANBUL|JPMORGAN|LIGHTING|LUNDBECK|MARRIOTT|MASERATI|MCKINSEY|MEMORIAL|MERCKMSD|MORTGAGE|OBSERVER|PARTNERS|PHARMACY|PICTURES|PLUMBING|PROPERTY|REDSTONE|RELIANCE|SAARLAND|SAMSCLUB|SECURITY|SERVICES|SHOPPING|SHOWTIME|SOFTBANK|SOFTWARE|STCGROUP|SUPPLIES|TRAINING|VANGUARD|VENTURES|VERISIGN|WOODSIDE|XN--90AE|XN--NODE|XN--P1AI|XN--QXAM|YOKOHAMA|ABOGADO|ACADEMY|AGAKHAN|ALIBABA|ANDROID|ATHLETA|AUCTION|AUDIBLE|AUSPOST|AVIANCA|BANAMEX|BAUHAUS|BENTLEY|BESTBUY|BOOKING|BROTHER|BUGATTI|CAPITAL|CARAVAN|CAREERS|CHANNEL|CHARITY|CHINTAI|CITADEL|CLUBMED|COLLEGE|COLOGNE|COMCAST|COMPANY|COMPARE|CONTACT|COOKING|CORSICA|COUNTRY|COUPONS|COURSES|CRICKET|CRUISES|DENTIST|DIGITAL|DOMAINS|EXPOSED|EXPRESS|FARMERS|FASHION|FERRARI|FERRERO|FINANCE|FISHING|FITNESS|FLIGHTS|FLORIST|FLOWERS|FORSALE|FROGANS|FUJITSU|GALLERY|GENTING|GODADDY|GROCERY|GUITARS|HAMBURG|HANGOUT|HITACHI|HOLIDAY|HOSTING|HOTELES|HOTMAIL|HYUNDAI|ISMAILI|JEWELRY|JUNIPER|KITCHEN|KOMATSU|LACAIXA|LANXESS|LASALLE|LATROBE|LECLERC|LIMITED|LINCOLN|MARKETS|MONSTER|NETBANK|NETFLIX|NETWORK|NEUSTAR|OKINAWA|OLDNAVY|ORGANIC|ORIGINS|PHILIPS|PIONEER|POLITIE|REALTOR|RECIPES|RENTALS|REVIEWS|REXROTH|SAMSUNG|SANDVIK|SCHMIDT|SCHWARZ|SCIENCE|SHIKSHA|SINGLES|STAPLES|STORAGE|SUPPORT|SURGERY|SYSTEMS|TEMASEK|THEATER|THEATRE|TICKETS|TIFFANY|TOSHIBA|TRADING|WALMART|WANGGOU|WATCHES|WEATHER|WEBSITE|WEDDING|WHOSWHO|WINDOWS|WINNERS|XFINITY|YAMAXUN|YOUTUBE|ZUERICH|ABARTH|ABBOTT|ABBVIE|AFRICA|AGENCY|AIRBUS|AIRTEL|ALIPAY|ALSACE|ALSTOM|AMAZON|ANQUAN|ARAMCO|AUTHOR|BAYERN|BEAUTY|BERLIN|BHARTI|BOSTIK|BOSTON|BROKER|CAMERA|CAREER|CASINO|CENTER|CHANEL|CHROME|CHURCH|CIRCLE|CLAIMS|CLINIC|COFFEE|COMSEC|CONDOS|COUPON|CREDIT|CRUISE|DATING|DATSUN|DEALER|DEGREE|DENTAL|DESIGN|DIRECT|DOCTOR|DUNLOP|DUPONT|DURBAN|EMERCK|ENERGY|ESTATE|EVENTS|EXPERT|FAMILY|FLICKR|FUTBOL|GALLUP|GARDEN|GEORGE|GIVING|GLOBAL|GOOGLE|GRATIS|HEALTH|HERMES|HIPHOP|HOCKEY|HOTELS|HUGHES|IMAMAT|INSURE|INTUIT|JAGUAR|JOBURG|JUEGOS|KAUFEN|KINDER|KINDLE|KOSHER|LANCIA|LATINO|LAWYER|LEFRAK|LIVING|LOCKER|LONDON|LUXURY|MADRID|MAISON|MAKEUP|MARKET|MATTEL|MOBILE|MONASH|MORMON|MOSCOW|MUSEUM|MUTUAL|NAGOYA|NATURA|NISSAN|NISSAY|NORTON|NOWRUZ|OFFICE|OLAYAN|ONLINE|ORACLE|ORANGE|OTSUKA|PFIZER|PHOTOS|PHYSIO|PICTET|QUEBEC|RACING|REALTY|REISEN|REPAIR|REPORT|REVIEW|ROCHER|ROGERS|RYUKYU|SAFETY|SAKURA|SANOFI|SCHOOL|SCHULE|SEARCH|SECURE|SELECT|SHOUJI|SOCCER|SOCIAL|STREAM|STUDIO|SUPPLY|SUZUKI|SWATCH|SYDNEY|TAIPEI|TAOBAO|TARGET|TATTOO|TENNIS|TIENDA|TJMAXX|TKMAXX|TOYOTA|TRAVEL|UNICOM|VIAJES|VIKING|VILLAS|VIRGIN|VISION|VOTING|VOYAGE|VUELOS|WALTER|WEBCAM|XIHUAN|YACHTS|YANDEX|ZAPPOS|ACTOR|ADULT|AETNA|AMFAM|AMICA|APPLE|ARCHI|AUDIO|AUTOS|AZURE|BAIDU|BEATS|BIBLE|BINGO|BLACK|BOATS|BOSCH|BUILD|CANON|CARDS|CHASE|CHEAP|CISCO|CITIC|CLICK|CLOUD|COACH|CODES|CROWN|CYMRU|DABUR|DANCE|DEALS|DELTA|DRIVE|DUBAI|EARTH|EDEKA|EMAIL|EPSON|FAITH|FEDEX|FINAL|FOREX|FORUM|GALLO|GAMES|GIFTS|GIVES|GLADE|GLASS|GLOBO|GMAIL|GREEN|GRIPE|GROUP|GUCCI|GUIDE|HOMES|HONDA|HORSE|HOUSE|HYATT|IKANO|IRISH|JETZT|KOELN|KYOTO|LAMER|LEASE|LEGAL|LEXUS|LILLY|LINDE|LIPSY|LIXIL|LOANS|LOCUS|LOTTE|LOTTO|MACYS|MANGO|MEDIA|MIAMI|MONEY|MOVIE|NEXUS|NIKON|NINJA|NOKIA|NOWTV|OMEGA|OSAKA|PARIS|PARTS|PARTY|PHONE|PHOTO|PIZZA|PLACE|POKER|PRAXI|PRESS|PRIME|PROMO|QUEST|RADIO|REHAB|REISE|RICOH|ROCKS|RODEO|RUGBY|SALON|SENER|SEVEN|SHARP|SHELL|SHOES|SKYPE|SLING|SMART|SMILE|SOLAR|SPACE|SPORT|STADA|STORE|STUDY|STYLE|SUCKS|SWISS|TATAR|TIRES|TIROL|TMALL|TODAY|TOKYO|TOOLS|TORAY|TOTAL|TOURS|TRADE|TRUST|TUNES|TUSHU|UBANK|VEGAS|VIDEO|VODKA|VOLVO|WALES|WATCH|WEBER|WEIBO|WORKS|WORLD|XEROX|YAHOO|AARP|ABLE|ADAC|AERO|AKDN|ALLY|AMEX|ARAB|ARMY|ARPA|ARTE|ASDA|ASIA|AUDI|AUTO|BABY|BAND|BANK|BBVA|BEER|BEST|BIKE|BING|BLOG|BLUE|BOFA|BOND|BOOK|BUZZ|CAFE|CALL|CAMP|CARE|CARS|CASA|CASE|CASH|CBRE|CERN|CHAT|CITI|CITY|CLUB|COOL|COOP|CYOU|DATA|DATE|DCLK|DEAL|DELL|DESI|DIET|DISH|DOCS|DUCK|DVAG|ERNI|FAGE|FAIL|FANS|FARM|FAST|FIAT|FIDO|FILM|FIRE|FISH|FLIR|FOOD|FORD|FREE|FUND|GAME|GBIZ|GENT|GGEE|GIFT|GMBH|GOLD|GOLF|GOOG|GUGE|GURU|HAIR|HAUS|HDFC|HELP|HERE|HGTV|HOST|HSBC|ICBC|IEEE|IMDB|IMMO|INFO|ITAU|JAVA|JEEP|JOBS|JPRS|KDDI|KIWI|KPMG|KRED|LAND|LEGO|LGBT|LIDL|LIFE|LIKE|LIMO|LINK|LIVE|LOAN|LOFT|LOVE|LTDA|LUXE|MAIF|MEET|MEME|MENU|MINI|MINT|MOBI|MODA|MOTO|NAME|NAVY|NEWS|NEXT|NICO|NIKE|OLLO|OPEN|PAGE|PARS|PCCW|PICS|PING|PINK|PLAY|PLUS|POHL|PORN|POST|PROD|PROF|QPON|RAID|READ|REIT|RENT|REST|RICH|RMIT|ROOM|RSVP|RUHR|SAFE|SALE|SARL|SAVE|SAXO|SCOT|SEAT|SEEK|SEXY|SHAW|SHIA|SHOP|SHOW|SILK|SINA|SITE|SKIN|SNCF|SOHU|SONG|SONY|SPOT|STAR|SURF|TALK|TAXI|TEAM|TECH|TEVA|TIAA|TIPS|TOWN|TOYS|TUBE|VANA|VISA|VIVA|VIVO|VOTE|VOTO|WANG|WEIR|WIEN|WIKI|WINE|WORK|XBOX|YOGA|ZARA|ZERO|ZONE|AAA|ABB|ABC|ACO|ADS|AEG|AFL|AIG|ANZ|AOL|APP|ART|AWS|AXA|BAR|BBC|BBT|BCG|BCN|BET|BID|BIO|BIZ|BMS|BMW|BOM|BOO|BOT|BOX|BUY|BZH|CAB|CAL|CAM|CAR|CAT|CBA|CBN|CBS|CEO|CFA|CFD|COM|CPA|CRS|CSC|DAD|DAY|DDS|DEV|DHL|DIY|DNP|DOG|DOT|DTV|DVR|EAT|ECO|EDU|ESQ|EUS|FAN|FIT|FLY|FOO|FOX|FRL|FTR|FUN|FYI|GAL|GAP|GAY|GDN|GEA|GLE|GMO|GMX|GOO|GOP|GOT|GOV|HBO|HIV|HKT|HOT|HOW|IBM|ICE|ICU|IFM|INC|ING|INK|INT|IST|ITV|JCB|JIO|JLL|JMP|JNJ|JOT|JOY|KFH|KIA|KIM|KPN|KRD|LAT|LAW|LDS|LLC|LLP|LOL|LPL|LTD|MAN|MAP|MBA|MED|MEN|MIL|MIT|MLB|MLS|MMA|MOE|MOI|MOM|MOV|MSD|MTN|MTR|NAB|NBA|NEC|NET|NEW|NFL|NGO|NHK|NOW|NRA|NRW|NTT|NYC|OBI|OFF|ONE|ONG|ONL|OOO|ORG|OTT|OVH|PAY|PET|PHD|PID|PIN|PNC|PRO|PRU|PUB|PWC|QVC|RED|REN|RIL|RIO|RIP|RUN|RWE|SAP|SAS|SBI|SBS|SCA|SCB|SES|SEW|SEX|SFR|SKI|SKY|SOY|SPA|SRL|STC|TAB|TAX|TCI|TDK|TEL|THD|TJX|TOP|TRV|TUI|TVS|UBS|UNO|UOL|UPS|VET|VIG|VIN|VIP|WED|WIN|WME|WOW|WTC|WTF|XIN|XXX|XYZ|YOU|YUN|ZIP|AC|AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TR|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW)(?::\\d{2,5})?(?:[\\/?#]\\S*)?)$", + "Regex": "(?i)^((?:(?:https?|ftp):\\/\\/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?::[0-9]{1,5})?)([a-z0-9-_\\/]?\\.?)*|(?:(?:https?|ftp):\\/\\/)?(?:\\S+:\\S+@)?(?:[a-z0-9-_~]+\\.)*[a-z0-9-]{1,62}\\.(?:XN--VERMGENSBERATUNG-PWB|XN--VERMGENSBERATER-CTB|XN--CLCHC0EA0B2G2A9GCD|XN--W4R85EL8FHU5DNRA|NORTHWESTERNMUTUAL|TRAVELERSINSURANCE|XN--3OQ18VL8PN36A|XN--5SU34J936BGSG|XN--BCK1B9A5DRE4C|XN--MGBAH1A3HJKRD|XN--MGBAI9AZGQP6J|XN--MGBERP4A5D4AR|XN--XKC2DL3A5EE0H|XN--FZYS8D69UVGM|XN--MGBA7C0BBN0A|XN--MGBCPQ6GPA1A|XN--XKC2AL3HYE2A|AMERICANEXPRESS|KERRYPROPERTIES|SANDVIKCOROMANT|XN--I1B6B1A6A2E|XN--KCRX77D1X4A|XN--LGBBAT1AD8J|XN--MGBA3A4F16A|XN--MGBAAKC7DVF|XN--MGBC0A9AZCG|XN--NQV7FS00EMA|AFAMILYCOMPANY|AMERICANFAMILY|BANANAREPUBLIC|CANCERRESEARCH|COOKINGCHANNEL|KERRYLOGISTICS|WEATHERCHANNEL|XN--54B7FTA0CC|XN--6QQ986B3XL|XN--80AQECDR1A|XN--B4W605FERD|XN--FIQ228C5HS|XN--H2BREG3EVE|XN--JLQ480N2RG|XN--JLQ61U9W7B|XN--MGBA3A3EJT|XN--MGBAAM7A8H|XN--MGBAYH7GPA|XN--MGBBH1A71E|XN--MGBCA7DZDO|XN--MGBI4ECEXP|XN--MGBX4CD0AB|XN--RVC1E0AM3E|INTERNATIONAL|LIFEINSURANCE|TRAVELCHANNEL|WOLTERSKLUWER|XN--CCKWCXETD|XN--ECKVDTC9D|XN--FPCRJ9C3D|XN--FZC2C9E2C|XN--H2BRJ9C8C|XN--TIQ49XQYJ|XN--YFRO4I67O|XN--YGBI2AMMX|CONSTRUCTION|LPLFINANCIAL|SCHOLARSHIPS|VERSICHERUNG|XN--3E0B707E|XN--45BR5CYL|XN--4DBRK0CE|XN--80ADXHKS|XN--80ASEHDB|XN--8Y0A063A|XN--GCKR3F0F|XN--MGB9AWBF|XN--MGBAB2BD|XN--MGBGU82A|XN--MGBPL2FH|XN--MGBT3DHD|XN--MK1BU44C|XN--NGBC5AZD|XN--NGBE9E0A|XN--OGBPF8FL|XN--QCKA1PMC|ACCOUNTANTS|BARCLAYCARD|BLACKFRIDAY|BLOCKBUSTER|BRIDGESTONE|CALVINKLEIN|CONTRACTORS|CREDITUNION|ENGINEERING|ENTERPRISES|FOODNETWORK|INVESTMENTS|KERRYHOTELS|LAMBORGHINI|MOTORCYCLES|OLAYANGROUP|PHOTOGRAPHY|PLAYSTATION|PRODUCTIONS|PROGRESSIVE|REDUMBRELLA|WILLIAMHILL|XN--11B4C3D|XN--1CK2E1B|XN--1QQW23A|XN--2SCRJ9C|XN--3BST00M|XN--3DS443G|XN--3HCRJ9C|XN--42C2D9A|XN--45BRJ9C|XN--55QW42G|XN--6FRZ82G|XN--80AO21A|XN--9KRT00A|XN--CCK2B3B|XN--CZR694B|XN--D1ACJ3B|XN--EFVY88H|XN--FCT429K|XN--FJQ720A|XN--FLW351E|XN--G2XX48C|XN--GECRJ9C|XN--GK3AT1E|XN--H2BRJ9C|XN--HXT814E|XN--IMR513N|XN--J6W193G|XN--JVR189M|XN--KPRW13D|XN--KPRY57D|XN--MGBBH1A|XN--MGBTX2B|XN--MIX891F|XN--NYQY26A|XN--OTU796D|XN--PGBS0DH|XN--Q9JYB4C|XN--RHQV96G|XN--ROVU88B|XN--S9BRJ9C|XN--SES554G|XN--T60B56A|XN--VUQ861B|XN--W4RS40L|XN--XHQ521B|XN--ZFR164B|ACCOUNTANT|APARTMENTS|ASSOCIATES|BASKETBALL|BNPPARIBAS|BOEHRINGER|CAPITALONE|CONSULTING|CREDITCARD|CUISINELLA|EUROVISION|EXTRASPACE|FOUNDATION|HEALTHCARE|IMMOBILIEN|INDUSTRIES|MANAGEMENT|MITSUBISHI|NEXTDIRECT|PROPERTIES|PROTECTION|PRUDENTIAL|REALESTATE|REPUBLICAN|RESTAURANT|SCHAEFFLER|SWIFTCOVER|TATAMOTORS|TECHNOLOGY|UNIVERSITY|VLAANDEREN|VOLKSWAGEN|XN--30RR7Y|XN--3PXU8K|XN--45Q11C|XN--4GBRIM|XN--55QX5D|XN--5TZM5G|XN--80ASWG|XN--90A3AC|XN--9DBQ2A|XN--9ET52U|XN--C2BR7G|XN--CG4BKI|XN--CZRS0T|XN--CZRU2D|XN--FIQ64B|XN--FIQS8S|XN--FIQZ9S|XN--IO0A7I|XN--KPUT3I|XN--MXTQ1M|XN--O3CW4H|XN--PSSY2U|XN--Q7CE6A|XN--UNUP4Y|XN--WGBH1C|XN--WGBL6A|XN--Y9A3AQ|ACCENTURE|ALFAROMEO|ALLFINANZ|AMSTERDAM|ANALYTICS|AQUARELLE|BARCELONA|BLOOMBERG|CHRISTMAS|COMMUNITY|DIRECTORY|EDUCATION|EQUIPMENT|FAIRWINDS|FINANCIAL|FIRESTONE|FRESENIUS|FRONTDOOR|FURNITURE|GOLDPOINT|HISAMITSU|HOMEDEPOT|HOMEGOODS|HOMESENSE|INSTITUTE|INSURANCE|KUOKGROUP|LANCASTER|LANDROVER|LIFESTYLE|MARKETING|MARSHALLS|MELBOURNE|MICROSOFT|PANASONIC|PASSAGENS|PRAMERICA|RICHARDLI|SCJOHNSON|SHANGRILA|SOLUTIONS|STATEBANK|STATEFARM|STOCKHOLM|TRAVELERS|VACATIONS|XN--90AIS|XN--C1AVG|XN--D1ALF|XN--E1A4C|XN--FHBEI|XN--J1AEF|XN--J1AMH|XN--L1ACC|XN--NGBRX|XN--NQV7F|XN--P1ACF|XN--QXA6A|XN--TCKWE|XN--VHQUV|YODOBASHI|ABUDHABI|AIRFORCE|ALLSTATE|ATTORNEY|BARCLAYS|BAREFOOT|BARGAINS|BASEBALL|BOUTIQUE|BRADESCO|BROADWAY|BRUSSELS|BUDAPEST|BUILDERS|BUSINESS|CAPETOWN|CATERING|CATHOLIC|CIPRIANI|CITYEATS|CLEANING|CLINIQUE|CLOTHING|COMMBANK|COMPUTER|DELIVERY|DELOITTE|DEMOCRAT|DIAMONDS|DISCOUNT|DISCOVER|DOWNLOAD|ENGINEER|ERICSSON|ETISALAT|EXCHANGE|FEEDBACK|FIDELITY|FIRMDALE|FOOTBALL|FRONTIER|GOODYEAR|GRAINGER|GRAPHICS|GUARDIAN|HDFCBANK|HELSINKI|HOLDINGS|HOSPITAL|INFINITI|IPIRANGA|ISTANBUL|JPMORGAN|LIGHTING|LUNDBECK|MARRIOTT|MASERATI|MCKINSEY|MEMORIAL|MERCKMSD|MORTGAGE|OBSERVER|PARTNERS|PHARMACY|PICTURES|PLUMBING|PROPERTY|REDSTONE|RELIANCE|SAARLAND|SAMSCLUB|SECURITY|SERVICES|SHOPPING|SHOWTIME|SOFTBANK|SOFTWARE|STCGROUP|SUPPLIES|TRAINING|VANGUARD|VENTURES|VERISIGN|WOODSIDE|XN--90AE|XN--NODE|XN--P1AI|XN--QXAM|YOKOHAMA|ABOGADO|ACADEMY|AGAKHAN|ALIBABA|ANDROID|ATHLETA|AUCTION|AUDIBLE|AUSPOST|AVIANCA|BANAMEX|BAUHAUS|BENTLEY|BESTBUY|BOOKING|BROTHER|BUGATTI|CAPITAL|CARAVAN|CAREERS|CHANNEL|CHARITY|CHINTAI|CITADEL|CLUBMED|COLLEGE|COLOGNE|COMCAST|COMPANY|COMPARE|CONTACT|COOKING|CORSICA|COUNTRY|COUPONS|COURSES|CRICKET|CRUISES|DENTIST|DIGITAL|DOMAINS|EXPOSED|EXPRESS|FARMERS|FASHION|FERRARI|FERRERO|FINANCE|FISHING|FITNESS|FLIGHTS|FLORIST|FLOWERS|FORSALE|FROGANS|FUJITSU|GALLERY|GENTING|GODADDY|GROCERY|GUITARS|HAMBURG|HANGOUT|HITACHI|HOLIDAY|HOSTING|HOTELES|HOTMAIL|HYUNDAI|ISMAILI|JEWELRY|JUNIPER|KITCHEN|KOMATSU|LACAIXA|LANXESS|LASALLE|LATROBE|LECLERC|LIMITED|LINCOLN|MARKETS|MONSTER|NETBANK|NETFLIX|NETWORK|NEUSTAR|OKINAWA|OLDNAVY|ORGANIC|ORIGINS|PHILIPS|PIONEER|POLITIE|REALTOR|RECIPES|RENTALS|REVIEWS|REXROTH|SAMSUNG|SANDVIK|SCHMIDT|SCHWARZ|SCIENCE|SHIKSHA|SINGLES|STAPLES|STORAGE|SUPPORT|SURGERY|SYSTEMS|TEMASEK|THEATER|THEATRE|TICKETS|TIFFANY|TOSHIBA|TRADING|WALMART|WANGGOU|WATCHES|WEATHER|WEBSITE|WEDDING|WHOSWHO|WINDOWS|WINNERS|XFINITY|YAMAXUN|YOUTUBE|ZUERICH|ABARTH|ABBOTT|ABBVIE|AFRICA|AGENCY|AIRBUS|AIRTEL|ALIPAY|ALSACE|ALSTOM|AMAZON|ANQUAN|ARAMCO|AUTHOR|BAYERN|BEAUTY|BERLIN|BHARTI|BOSTIK|BOSTON|BROKER|CAMERA|CAREER|CASINO|CENTER|CHANEL|CHROME|CHURCH|CIRCLE|CLAIMS|CLINIC|COFFEE|COMSEC|CONDOS|COUPON|CREDIT|CRUISE|DATING|DATSUN|DEALER|DEGREE|DENTAL|DESIGN|DIRECT|DOCTOR|DUNLOP|DUPONT|DURBAN|EMERCK|ENERGY|ESTATE|EVENTS|EXPERT|FAMILY|FLICKR|FUTBOL|GALLUP|GARDEN|GEORGE|GIVING|GLOBAL|GOOGLE|GRATIS|HEALTH|HERMES|HIPHOP|HOCKEY|HOTELS|HUGHES|IMAMAT|INSURE|INTUIT|JAGUAR|JOBURG|JUEGOS|KAUFEN|KINDER|KINDLE|KOSHER|LANCIA|LATINO|LAWYER|LEFRAK|LIVING|LOCKER|LONDON|LUXURY|MADRID|MAISON|MAKEUP|MARKET|MATTEL|MOBILE|MONASH|MORMON|MOSCOW|MUSEUM|MUTUAL|NAGOYA|NATURA|NISSAN|NISSAY|NORTON|NOWRUZ|OFFICE|OLAYAN|ONLINE|ORACLE|ORANGE|OTSUKA|PFIZER|PHOTOS|PHYSIO|PICTET|QUEBEC|RACING|REALTY|REISEN|REPAIR|REPORT|REVIEW|ROCHER|ROGERS|RYUKYU|SAFETY|SAKURA|SANOFI|SCHOOL|SCHULE|SEARCH|SECURE|SELECT|SHOUJI|SOCCER|SOCIAL|STREAM|STUDIO|SUPPLY|SUZUKI|SWATCH|SYDNEY|TAIPEI|TAOBAO|TARGET|TATTOO|TENNIS|TIENDA|TJMAXX|TKMAXX|TOYOTA|TRAVEL|UNICOM|VIAJES|VIKING|VILLAS|VIRGIN|VISION|VOTING|VOYAGE|VUELOS|WALTER|WEBCAM|XIHUAN|YACHTS|YANDEX|ZAPPOS|ACTOR|ADULT|AETNA|AMFAM|AMICA|APPLE|ARCHI|AUDIO|AUTOS|AZURE|BAIDU|BEATS|BIBLE|BINGO|BLACK|BOATS|BOSCH|BUILD|CANON|CARDS|CHASE|CHEAP|CISCO|CITIC|CLICK|CLOUD|COACH|CODES|CROWN|CYMRU|DABUR|DANCE|DEALS|DELTA|DRIVE|DUBAI|EARTH|EDEKA|EMAIL|EPSON|FAITH|FEDEX|FINAL|FOREX|FORUM|GALLO|GAMES|GIFTS|GIVES|GLADE|GLASS|GLOBO|GMAIL|GREEN|GRIPE|GROUP|GUCCI|GUIDE|HOMES|HONDA|HORSE|HOUSE|HYATT|IKANO|IRISH|JETZT|KOELN|KYOTO|LAMER|LEASE|LEGAL|LEXUS|LILLY|LINDE|LIPSY|LIXIL|LOANS|LOCUS|LOTTE|LOTTO|MACYS|MANGO|MEDIA|MIAMI|MONEY|MOVIE|NEXUS|NIKON|NINJA|NOKIA|NOWTV|OMEGA|OSAKA|PARIS|PARTS|PARTY|PHONE|PHOTO|PIZZA|PLACE|POKER|PRAXI|PRESS|PRIME|PROMO|QUEST|RADIO|REHAB|REISE|RICOH|ROCKS|RODEO|RUGBY|SALON|SENER|SEVEN|SHARP|SHELL|SHOES|SKYPE|SLING|SMART|SMILE|SOLAR|SPACE|SPORT|STADA|STORE|STUDY|STYLE|SUCKS|SWISS|TATAR|TIRES|TIROL|TMALL|TODAY|TOKYO|TOOLS|TORAY|TOTAL|TOURS|TRADE|TRUST|TUNES|TUSHU|UBANK|VEGAS|VIDEO|VODKA|VOLVO|WALES|WATCH|WEBER|WEIBO|WORKS|WORLD|XEROX|YAHOO|AARP|ABLE|ADAC|AERO|AKDN|ALLY|AMEX|ARAB|ARMY|ARPA|ARTE|ASDA|ASIA|AUDI|AUTO|BABY|BAND|BANK|BBVA|BEER|BEST|BIKE|BING|BLOG|BLUE|BOFA|BOND|BOOK|BUZZ|CAFE|CALL|CAMP|CARE|CARS|CASA|CASE|CASH|CBRE|CERN|CHAT|CITI|CITY|CLUB|COOL|COOP|CYOU|DATA|DATE|DCLK|DEAL|DELL|DESI|DIET|DISH|DOCS|DUCK|DVAG|ERNI|FAGE|FAIL|FANS|FARM|FAST|FIAT|FIDO|FILM|FIRE|FISH|FLIR|FOOD|FORD|FREE|FUND|GAME|GBIZ|GENT|GGEE|GIFT|GMBH|GOLD|GOLF|GOOG|GUGE|GURU|HAIR|HAUS|HDFC|HELP|HERE|HGTV|HOST|HSBC|ICBC|IEEE|IMDB|IMMO|INFO|ITAU|JAVA|JEEP|JOBS|JPRS|KDDI|KIWI|KPMG|KRED|LAND|LEGO|LGBT|LIDL|LIFE|LIKE|LIMO|LINK|LIVE|LOAN|LOFT|LOVE|LTDA|LUXE|MAIF|MEET|MEME|MENU|MINI|MINT|MOBI|MODA|MOTO|NAME|NAVY|NEWS|NEXT|NICO|NIKE|OLLO|OPEN|PAGE|PARS|PCCW|PICS|PING|PINK|PLAY|PLUS|POHL|PORN|POST|PROD|PROF|QPON|RAID|READ|REIT|RENT|REST|RICH|RMIT|ROOM|RSVP|RUHR|SAFE|SALE|SARL|SAVE|SAXO|SCOT|SEAT|SEEK|SEXY|SHAW|SHIA|SHOP|SHOW|SILK|SINA|SITE|SKIN|SNCF|SOHU|SONG|SONY|SPOT|STAR|SURF|TALK|TAXI|TEAM|TECH|TEVA|TIAA|TIPS|TOWN|TOYS|TUBE|VANA|VISA|VIVA|VIVO|VOTE|VOTO|WANG|WEIR|WIEN|WIKI|WINE|WORK|XBOX|YOGA|ZARA|ZERO|ZONE|AAA|ABB|ABC|ACO|ADS|AEG|AFL|AIG|ANZ|AOL|APP|ART|AWS|AXA|BAR|BBC|BBT|BCG|BCN|BET|BID|BIO|BIZ|BMS|BMW|BOM|BOO|BOT|BOX|BUY|BZH|CAB|CAL|CAM|CAR|CAT|CBA|CBN|CBS|CEO|CFA|CFD|COM|CPA|CRS|CSC|DAD|DAY|DDS|DEV|DHL|DIY|DNP|DOG|DOT|DTV|DVR|EAT|ECO|EDU|ESQ|EUS|FAN|FIT|FLY|FOO|FOX|FRL|FTR|FUN|FYI|GAL|GAP|GAY|GDN|GEA|GLE|GMO|GMX|GOO|GOP|GOT|GOV|HBO|HIV|HKT|HOT|HOW|IBM|ICE|ICU|IFM|INC|ING|INK|INT|IST|ITV|JCB|JIO|JLL|JMP|JNJ|JOT|JOY|KFH|KIA|KIM|KPN|KRD|LAT|LAW|LDS|LLC|LLP|LOL|LPL|LTD|MAN|MAP|MBA|MED|MEN|MIL|MIT|MLB|MLS|MMA|MOE|MOI|MOM|MOV|MSD|MTN|MTR|NAB|NBA|NEC|NET|NEW|NFL|NGO|NHK|NOW|NRA|NRW|NTT|NYC|OBI|OFF|ONE|ONG|ONL|OOO|ORG|OTT|OVH|PAY|PET|PHD|PID|PIN|PNC|PRO|PRU|PUB|PWC|QVC|RED|REN|RIL|RIO|RIP|RUN|RWE|SAP|SAS|SBI|SBS|SCA|SCB|SES|SEW|SEX|SFR|SKI|SKY|SOY|SPA|SRL|STC|TAB|TAX|TCI|TDK|TEL|THD|TJX|TOP|TRV|TUI|TVS|UBS|UNO|UOL|UPS|VET|VIG|VIN|VIP|WED|WIN|WME|WOW|WTC|WTF|XIN|XXX|XYZ|YOU|YUN|ZIP|AC|AD|AE|AF|AG|AI|AL|AM|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|SS|ST|SU|SV|SX|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TR|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW)(?::\\d{2,5})?(?:\\/[a-z0-9-_~.]+)*(?:[?#]\\S*)*\\/?)$", "plural_name": false, "Description": null, "Rarity": 0.7, @@ -1425,10 +1425,14 @@ "hTTPs://tryhackme.com", "https://xn--80aaxitdbjk.xn--p1ai/", "http://10.1.1.1", - "http://10.1.1.1/just/a/test" + "http://10.1.1.1/just/a/test", + "https://img.shields.io/twitter/follow/bee_sec_san?style=social", + "google.com/help", + "https://www.google.com" ], "Invalid": [ - "tryhackme.comm" + "tryhackme.comm", + "www..google.com" ] } }, From e3880c00c465308e7953f3cdea1985426c3e6fd6 Mon Sep 17 00:00:00 2001 From: "Gabriele N. Tornetta" Date: Thu, 4 Nov 2021 11:48:56 +0000 Subject: [PATCH 36/37] feat: UPS tracking numbers --- pywhat/Data/regex.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 25a67b0..5549078 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1742,6 +1742,28 @@ "Invalid": [] } }, + { + "Name": "United States Postal Service (UPS) Tracking Number", + "Regex": "^(1Z[0-9A-Z]{6}[0-9]{2}[0-9]{8})$", + "plural_name": false, + "Description": null, + "Rarity": 0.5, + "URL": "https://www.ups.com/track?tracknum=", + "Tags": [ + "Tracking", + "Bug Bounty", + "Identifiers", + "Mailing" + ], + "Examples": { + "Valid": [ + "1Z123ABC0012345678", + "1Z9999999999999999", + "1Z999AA10123456784" + ], + "Invalid": [] + } + }, { "Name": "Turkish License Plate Number", "Regex": "^(0[1-9]|[1-7][0-9]|8[01])(([A-Z])(\\d{4,5})|([A-Z]{2})(\\d{3,4})|([A-Z]{3})(\\d{2,3}))$", From 62b3df8967791ecc308f416271e5b6d5ed4c3626 Mon Sep 17 00:00:00 2001 From: "Gabriele N. Tornetta" Date: Sun, 7 Nov 2021 11:26:43 +0000 Subject: [PATCH 37/37] Update pywhat/Data/regex.json Co-authored-by: piatrashkakanstantinass <74979584+piatrashkakanstantinass@users.noreply.github.com> --- pywhat/Data/regex.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pywhat/Data/regex.json b/pywhat/Data/regex.json index 4725614..ba60af5 100644 --- a/pywhat/Data/regex.json +++ b/pywhat/Data/regex.json @@ -1755,7 +1755,7 @@ }, { "Name": "United States Postal Service (UPS) Tracking Number", - "Regex": "^(1Z[0-9A-Z]{6}[0-9]{2}[0-9]{8})$", + "Regex": "^(1Z[0-9A-Z]{6}[0-9]{10})$", "plural_name": false, "Description": null, "Rarity": 0.5,