Skip to content

Commit 0dcd54c

Browse files
authored
Merge pull request #614 from syn-4ck/feature/discord-plugin
Add Discord Bot token detector
2 parents a12a15e + 5b4073c commit 0dcd54c

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ AWSKeyDetector
9696
AzureStorageKeyDetector
9797
BasicAuthDetector
9898
CloudantDetector
99+
DiscordBotTokenDetector
100+
GitHubTokenDetector
99101
Base64HighEntropyString
100102
HexHighEntropyString
101103
IbmCloudIamDetector
@@ -105,8 +107,10 @@ KeywordDetector
105107
MailchimpDetector
106108
NpmDetector
107109
PrivateKeyDetector
110+
SendGridDetector
108111
SlackDetector
109112
SoftlayerDetector
113+
SquareOAuthDetector
110114
StripeDetector
111115
TwilioKeyDetector
112116
```

detect_secrets/plugins/discord.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""
2+
This plugin searches for Discord Bot Token
3+
"""
4+
import re
5+
6+
from .base import RegexBasedDetector
7+
8+
9+
class DiscordBotTokenDetector(RegexBasedDetector):
10+
"""Scans for Discord Bot token."""
11+
secret_type = 'Discord Bot Token'
12+
13+
denylist = [
14+
# Discord Bot Token ([M|N]XXXXXXXXXXXXXXXXXXXXXXX.XXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX)
15+
# Reference: https://discord.com/developers/docs/reference#authentication
16+
re.compile(r'[MN][a-zA-Z\d_-]{23}\.[a-zA-Z\d_-]{6}\.[a-zA-Z\d_-]{27}'),
17+
]

tests/plugins/discord_test.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import pytest
2+
3+
from detect_secrets.plugins.discord import DiscordBotTokenDetector
4+
5+
6+
class TestDiscordBotTokenDetector:
7+
8+
@pytest.mark.parametrize(
9+
'payload, should_flag',
10+
[
11+
# From https://discord.com/developers/docs/reference#authentication
12+
(
13+
'MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs',
14+
True,
15+
),
16+
(
17+
'Nzk5MjgxNDk0NDc2NDU1OTg3.YABS5g.2lmzECVlZv3vv6miVnUaKPQi2wI',
18+
True,
19+
),
20+
# From https://docs.gitguardian.com/secrets-detection/detectors/specifics/discord_bot_token#examples # noqa: E501
21+
(
22+
'MZ1yGvKTjE0rY0cV8i47CjAa.uRHQPq.Xb1Mk2nEhe-4iUcrGOuegj57zMC',
23+
True,
24+
),
25+
# Random values to fail
26+
(
27+
'MZ1yGvKTj0rY0cV8i47CjAa.uHQPq.Xb1Mk2nEhe-4icrGOuegj57zMC',
28+
False,
29+
),
30+
(
31+
'SZ1yGvKTj0rY0cV8i47CjAa.uHQPq.Xb1Mk2nEhe-4icrGOuegj57zMC',
32+
False,
33+
),
34+
(
35+
'MZ1yGvKTj0rY0cV8i47CjAa.uHQPq.Xb1Mk2nEhe-4icrGOuegj57zM',
36+
False,
37+
),
38+
],
39+
)
40+
def test_analyze(self, payload, should_flag):
41+
logic = DiscordBotTokenDetector()
42+
output = logic.analyze_line(filename='mock_filename', line=payload)
43+
assert len(output) == (1 if should_flag else 0)

0 commit comments

Comments
 (0)