We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
MYSQL_PWD not recognized as sensitive field
In Sentry 8.11.0, the data key `MYSQL_PWD` is not treated as sensitive and is transmitted in cleartext and shown in the UI, while things that look like mysql connection string are rendered as `mysql://readonly:[Filtered]@db1.example.com/`

MYSQL_PWD is the standard way of providing a password to mysql cli tools, and I'd argue any field that ends in _PWD is unsafe.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/sentry/constants.py`
Content:
```
1 """
2 sentry.constants
3 ~~~~~~~~~~~~~~~~
4 
5 These settings act as the default (base) settings for the Sentry-provided
6 web-server
7 
8 :copyright: (c) 2010-2014 by the Sentry Team, see AUTHORS for more details.
9 :license: BSD, see LICENSE for more details.
10 """
11 from __future__ import absolute_import, print_function
12 
13 import logging
14 import os.path
15 import six
16 
17 from collections import OrderedDict
18 from django.conf import settings
19 from django.utils.translation import ugettext_lazy as _
20 from operator import attrgetter
21 
22 
23 def get_all_languages():
24     results = []
25     for path in os.listdir(os.path.join(MODULE_ROOT, 'locale')):
26         if path.startswith('.'):
27             continue
28         if '_' in path:
29             pre, post = path.split('_', 1)
30             path = '{}-{}'.format(pre, post.lower())
31         results.append(path)
32     return results
33 
34 MODULE_ROOT = os.path.dirname(__import__('sentry').__file__)
35 DATA_ROOT = os.path.join(MODULE_ROOT, 'data')
36 
37 SORT_OPTIONS = OrderedDict((
38     ('priority', _('Priority')),
39     ('date', _('Last Seen')),
40     ('new', _('First Seen')),
41     ('freq', _('Frequency')),
42 ))
43 
44 SEARCH_SORT_OPTIONS = OrderedDict((
45     ('score', _('Score')),
46     ('date', _('Last Seen')),
47     ('new', _('First Seen')),
48 ))
49 
50 # XXX: Deprecated: use GroupStatus instead
51 STATUS_UNRESOLVED = 0
52 STATUS_RESOLVED = 1
53 STATUS_IGNORED = 2
54 
55 STATUS_CHOICES = {
56     'resolved': STATUS_RESOLVED,
57     'unresolved': STATUS_UNRESOLVED,
58     'ignored': STATUS_IGNORED,
59 
60     # TODO(dcramer): remove in 9.0
61     'muted': STATUS_IGNORED,
62 }
63 
64 # Normalize counts to the 15 minute marker. This value MUST be less than 60. A
65 # value of 0 would store counts for every minute, and is the lowest level of
66 # accuracy provided.
67 MINUTE_NORMALIZATION = 15
68 
69 MAX_TAG_KEY_LENGTH = 32
70 MAX_TAG_VALUE_LENGTH = 200
71 MAX_CULPRIT_LENGTH = 200
72 MAX_EMAIL_FIELD_LENGTH = 75
73 
74 # Team slugs which may not be used. Generally these are top level URL patterns
75 # which we don't want to worry about conflicts on.
76 RESERVED_ORGANIZATION_SLUGS = frozenset((
77     'admin', 'manage', 'login', 'account', 'register', 'api',
78     'accept', 'organizations', 'teams', 'projects', 'help',
79     'docs', 'logout', '404', '500', '_static', 'out', 'debug',
80     'remote', 'get-cli', 'blog', 'welcome', 'features',
81     'customers', 'integrations', 'signup', 'pricing',
82     'subscribe', 'enterprise', 'about', 'jobs', 'thanks', 'guide',
83     'privacy', 'security', 'terms', 'from', 'sponsorship', 'for',
84     'at', 'platforms', 'branding', 'vs', 'answers', '_admin',
85     'support',
86 ))
87 
88 LOG_LEVELS = {
89     logging.DEBUG: 'debug',
90     logging.INFO: 'info',
91     logging.WARNING: 'warning',
92     logging.ERROR: 'error',
93     logging.FATAL: 'fatal',
94 }
95 DEFAULT_LOG_LEVEL = 'error'
96 DEFAULT_LOGGER_NAME = ''
97 LOG_LEVELS_MAP = {v: k for k, v in six.iteritems(LOG_LEVELS)}
98 
99 
100 # Default alerting threshold values
101 DEFAULT_ALERT_PROJECT_THRESHOLD = (500, 25)  # 500%, 25 events
102 DEFAULT_ALERT_GROUP_THRESHOLD = (1000, 25)  # 1000%, 25 events
103 
104 # Default paginator value
105 EVENTS_PER_PAGE = 15
106 
107 # Default sort option for the group stream
108 DEFAULT_SORT_OPTION = 'date'
109 
110 # Setup languages for only available locales
111 LANGUAGE_MAP = dict(settings.LANGUAGES)
112 LANGUAGES = [(k, LANGUAGE_MAP[k]) for k in get_all_languages() if k in LANGUAGE_MAP]
113 
114 # TODO(dcramer): We eventually want to make this user-editable
115 TAG_LABELS = {
116     'exc_type': 'Exception Type',
117     'sentry:user': 'User',
118     'sentry:filename': 'File',
119     'sentry:function': 'Function',
120     'sentry:release': 'Release',
121     'os': 'OS',
122     'url': 'URL',
123     'server_name': 'Server',
124 }
125 
126 # TODO(dcramer): once this is more flushed out we want this to be extendable
127 SENTRY_RULES = (
128     'sentry.rules.actions.notify_event.NotifyEventAction',
129     'sentry.rules.actions.notify_event_service.NotifyEventServiceAction',
130     'sentry.rules.conditions.every_event.EveryEventCondition',
131     'sentry.rules.conditions.first_seen_event.FirstSeenEventCondition',
132     'sentry.rules.conditions.regression_event.RegressionEventCondition',
133     'sentry.rules.conditions.tagged_event.TaggedEventCondition',
134     'sentry.rules.conditions.event_frequency.EventFrequencyCondition',
135     'sentry.rules.conditions.event_frequency.EventUniqueUserFrequencyCondition',
136     'sentry.rules.conditions.event_attribute.EventAttributeCondition',
137     'sentry.rules.conditions.level.LevelCondition',
138 )
139 
140 # methods as defined by http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + PATCH
141 HTTP_METHODS = ('GET', 'POST', 'PUT', 'OPTIONS', 'HEAD', 'DELETE', 'TRACE', 'CONNECT', 'PATCH')
142 
143 CLIENT_RESERVED_ATTRS = (
144     'project',
145     'errors',
146     'event_id',
147     'message',
148     'checksum',
149     'culprit',
150     'fingerprint',
151     'level',
152     'time_spent',
153     'logger',
154     'server_name',
155     'site',
156     'received',
157     'timestamp',
158     'extra',
159     'modules',
160     'tags',
161     'platform',
162     'release',
163     'environment',
164 )
165 
166 DEFAULT_SCRUBBED_FIELDS = (
167     'password',
168     'secret',
169     'passwd',
170     'authorization',
171     'api_key',
172     'apikey',
173     'access_token',
174     'auth',
175     'credentials',
176 )
177 
178 VALID_PLATFORMS = set([
179     'as3',
180     'c',
181     'cfml',
182     'cocoa',
183     'csharp',
184     'go',
185     'java',
186     'javascript',
187     'node',
188     'objc',
189     'other',
190     'perl',
191     'php',
192     'python',
193     'ruby',
194     'elixir',
195     'haskell',
196     'groovy',
197 ])
198 
199 OK_PLUGIN_ENABLED = _("The {name} integration has been enabled.")
200 
201 OK_PLUGIN_DISABLED = _("The {name} integration has been disabled.")
202 
203 OK_PLUGIN_SAVED = _('Configuration for the {name} integration has been saved.')
204 
205 WARN_SESSION_EXPIRED = 'Your session has expired.'  # TODO: translate this
206 
207 # Key to use when ordering a list of events manually
208 EVENT_ORDERING_KEY = attrgetter('datetime', 'id')
209 
210 FILTER_MASK = '[Filtered]'
211 
212 # Maximum length of a symbol
213 MAX_SYM = 256
214 
215 # Known dsym mimetypes
216 KNOWN_DSYM_TYPES = {
217     'application/x-mach-binary': 'macho'
218 }
219 
220 NATIVE_UNKNOWN_STRING = '<unknown>'
221 
222 
223 class ObjectStatus(object):
224     VISIBLE = 0
225     HIDDEN = 1
226     PENDING_DELETION = 2
227     DELETION_IN_PROGRESS = 3
228 
229     @classmethod
230     def as_choices(cls):
231         return (
232             (cls.VISIBLE, 'visible'),
233             (cls.HIDDEN, 'hidden'),
234             (cls.PENDING_DELETION, 'pending_deletion'),
235             (cls.DELETION_IN_PROGRESS, 'deletion_in_progress'),
236         )
237
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/sentry/constants.py b/src/sentry/constants.py
--- a/src/sentry/constants.py
+++ b/src/sentry/constants.py
@@ -173,6 +173,7 @@
     'access_token',
     'auth',
     'credentials',
+    'mysql_pwd',
 )
 
 VALID_PLATFORMS = set([

{"golden_diff": "diff --git a/src/sentry/constants.py b/src/sentry/constants.py\n--- a/src/sentry/constants.py\n+++ b/src/sentry/constants.py\n@@ -173,6 +173,7 @@\n     'access_token',\n     'auth',\n     'credentials',\n+    'mysql_pwd',\n )\n \n VALID_PLATFORMS = set([\n", "issue": "MYSQL_PWD not recognized as sensitive field\nIn Sentry 8.11.0, the data key `MYSQL_PWD` is not treated as sensitive and is transmitted in cleartext and shown in the UI, while things that look like mysql connection string are rendered as `mysql://readonly:[Filtered]@db1.example.com/`\r\n\r\nMYSQL_PWD is the standard way of providing a password to mysql cli tools, and I'd argue any field that ends in _PWD is unsafe.\n", "before_files": [{"content": "\"\"\"\nsentry.constants\n~~~~~~~~~~~~~~~~\n\nThese settings act as the default (base) settings for the Sentry-provided\nweb-server\n\n:copyright: (c) 2010-2014 by the Sentry Team, see AUTHORS for more details.\n:license: BSD, see LICENSE for more details.\n\"\"\"\nfrom __future__ import absolute_import, print_function\n\nimport logging\nimport os.path\nimport six\n\nfrom collections import OrderedDict\nfrom django.conf import settings\nfrom django.utils.translation import ugettext_lazy as _\nfrom operator import attrgetter\n\n\ndef get_all_languages():\n    results = []\n    for path in os.listdir(os.path.join(MODULE_ROOT, 'locale')):\n        if path.startswith('.'):\n            continue\n        if '_' in path:\n            pre, post = path.split('_', 1)\n            path = '{}-{}'.format(pre, post.lower())\n        results.append(path)\n    return results\n\nMODULE_ROOT = os.path.dirname(__import__('sentry').__file__)\nDATA_ROOT = os.path.join(MODULE_ROOT, 'data')\n\nSORT_OPTIONS = OrderedDict((\n    ('priority', _('Priority')),\n    ('date', _('Last Seen')),\n    ('new', _('First Seen')),\n    ('freq', _('Frequency')),\n))\n\nSEARCH_SORT_OPTIONS = OrderedDict((\n    ('score', _('Score')),\n    ('date', _('Last Seen')),\n    ('new', _('First Seen')),\n))\n\n# XXX: Deprecated: use GroupStatus instead\nSTATUS_UNRESOLVED = 0\nSTATUS_RESOLVED = 1\nSTATUS_IGNORED = 2\n\nSTATUS_CHOICES = {\n    'resolved': STATUS_RESOLVED,\n    'unresolved': STATUS_UNRESOLVED,\n    'ignored': STATUS_IGNORED,\n\n    # TODO(dcramer): remove in 9.0\n    'muted': STATUS_IGNORED,\n}\n\n# Normalize counts to the 15 minute marker. This value MUST be less than 60. A\n# value of 0 would store counts for every minute, and is the lowest level of\n# accuracy provided.\nMINUTE_NORMALIZATION = 15\n\nMAX_TAG_KEY_LENGTH = 32\nMAX_TAG_VALUE_LENGTH = 200\nMAX_CULPRIT_LENGTH = 200\nMAX_EMAIL_FIELD_LENGTH = 75\n\n# Team slugs which may not be used. Generally these are top level URL patterns\n# which we don't want to worry about conflicts on.\nRESERVED_ORGANIZATION_SLUGS = frozenset((\n    'admin', 'manage', 'login', 'account', 'register', 'api',\n    'accept', 'organizations', 'teams', 'projects', 'help',\n    'docs', 'logout', '404', '500', '_static', 'out', 'debug',\n    'remote', 'get-cli', 'blog', 'welcome', 'features',\n    'customers', 'integrations', 'signup', 'pricing',\n    'subscribe', 'enterprise', 'about', 'jobs', 'thanks', 'guide',\n    'privacy', 'security', 'terms', 'from', 'sponsorship', 'for',\n    'at', 'platforms', 'branding', 'vs', 'answers', '_admin',\n    'support',\n))\n\nLOG_LEVELS = {\n    logging.DEBUG: 'debug',\n    logging.INFO: 'info',\n    logging.WARNING: 'warning',\n    logging.ERROR: 'error',\n    logging.FATAL: 'fatal',\n}\nDEFAULT_LOG_LEVEL = 'error'\nDEFAULT_LOGGER_NAME = ''\nLOG_LEVELS_MAP = {v: k for k, v in six.iteritems(LOG_LEVELS)}\n\n\n# Default alerting threshold values\nDEFAULT_ALERT_PROJECT_THRESHOLD = (500, 25)  # 500%, 25 events\nDEFAULT_ALERT_GROUP_THRESHOLD = (1000, 25)  # 1000%, 25 events\n\n# Default paginator value\nEVENTS_PER_PAGE = 15\n\n# Default sort option for the group stream\nDEFAULT_SORT_OPTION = 'date'\n\n# Setup languages for only available locales\nLANGUAGE_MAP = dict(settings.LANGUAGES)\nLANGUAGES = [(k, LANGUAGE_MAP[k]) for k in get_all_languages() if k in LANGUAGE_MAP]\n\n# TODO(dcramer): We eventually want to make this user-editable\nTAG_LABELS = {\n    'exc_type': 'Exception Type',\n    'sentry:user': 'User',\n    'sentry:filename': 'File',\n    'sentry:function': 'Function',\n    'sentry:release': 'Release',\n    'os': 'OS',\n    'url': 'URL',\n    'server_name': 'Server',\n}\n\n# TODO(dcramer): once this is more flushed out we want this to be extendable\nSENTRY_RULES = (\n    'sentry.rules.actions.notify_event.NotifyEventAction',\n    'sentry.rules.actions.notify_event_service.NotifyEventServiceAction',\n    'sentry.rules.conditions.every_event.EveryEventCondition',\n    'sentry.rules.conditions.first_seen_event.FirstSeenEventCondition',\n    'sentry.rules.conditions.regression_event.RegressionEventCondition',\n    'sentry.rules.conditions.tagged_event.TaggedEventCondition',\n    'sentry.rules.conditions.event_frequency.EventFrequencyCondition',\n    'sentry.rules.conditions.event_frequency.EventUniqueUserFrequencyCondition',\n    'sentry.rules.conditions.event_attribute.EventAttributeCondition',\n    'sentry.rules.conditions.level.LevelCondition',\n)\n\n# methods as defined by http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + PATCH\nHTTP_METHODS = ('GET', 'POST', 'PUT', 'OPTIONS', 'HEAD', 'DELETE', 'TRACE', 'CONNECT', 'PATCH')\n\nCLIENT_RESERVED_ATTRS = (\n    'project',\n    'errors',\n    'event_id',\n    'message',\n    'checksum',\n    'culprit',\n    'fingerprint',\n    'level',\n    'time_spent',\n    'logger',\n    'server_name',\n    'site',\n    'received',\n    'timestamp',\n    'extra',\n    'modules',\n    'tags',\n    'platform',\n    'release',\n    'environment',\n)\n\nDEFAULT_SCRUBBED_FIELDS = (\n    'password',\n    'secret',\n    'passwd',\n    'authorization',\n    'api_key',\n    'apikey',\n    'access_token',\n    'auth',\n    'credentials',\n)\n\nVALID_PLATFORMS = set([\n    'as3',\n    'c',\n    'cfml',\n    'cocoa',\n    'csharp',\n    'go',\n    'java',\n    'javascript',\n    'node',\n    'objc',\n    'other',\n    'perl',\n    'php',\n    'python',\n    'ruby',\n    'elixir',\n    'haskell',\n    'groovy',\n])\n\nOK_PLUGIN_ENABLED = _(\"The {name} integration has been enabled.\")\n\nOK_PLUGIN_DISABLED = _(\"The {name} integration has been disabled.\")\n\nOK_PLUGIN_SAVED = _('Configuration for the {name} integration has been saved.')\n\nWARN_SESSION_EXPIRED = 'Your session has expired.'  # TODO: translate this\n\n# Key to use when ordering a list of events manually\nEVENT_ORDERING_KEY = attrgetter('datetime', 'id')\n\nFILTER_MASK = '[Filtered]'\n\n# Maximum length of a symbol\nMAX_SYM = 256\n\n# Known dsym mimetypes\nKNOWN_DSYM_TYPES = {\n    'application/x-mach-binary': 'macho'\n}\n\nNATIVE_UNKNOWN_STRING = '<unknown>'\n\n\nclass ObjectStatus(object):\n    VISIBLE = 0\n    HIDDEN = 1\n    PENDING_DELETION = 2\n    DELETION_IN_PROGRESS = 3\n\n    @classmethod\n    def as_choices(cls):\n        return (\n            (cls.VISIBLE, 'visible'),\n            (cls.HIDDEN, 'hidden'),\n            (cls.PENDING_DELETION, 'pending_deletion'),\n            (cls.DELETION_IN_PROGRESS, 'deletion_in_progress'),\n        )\n", "path": "src/sentry/constants.py"}], "after_files": [{"content": "\"\"\"\nsentry.constants\n~~~~~~~~~~~~~~~~\n\nThese settings act as the default (base) settings for the Sentry-provided\nweb-server\n\n:copyright: (c) 2010-2014 by the Sentry Team, see AUTHORS for more details.\n:license: BSD, see LICENSE for more details.\n\"\"\"\nfrom __future__ import absolute_import, print_function\n\nimport logging\nimport os.path\nimport six\n\nfrom collections import OrderedDict\nfrom django.conf import settings\nfrom django.utils.translation import ugettext_lazy as _\nfrom operator import attrgetter\n\n\ndef get_all_languages():\n    results = []\n    for path in os.listdir(os.path.join(MODULE_ROOT, 'locale')):\n        if path.startswith('.'):\n            continue\n        if '_' in path:\n            pre, post = path.split('_', 1)\n            path = '{}-{}'.format(pre, post.lower())\n        results.append(path)\n    return results\n\nMODULE_ROOT = os.path.dirname(__import__('sentry').__file__)\nDATA_ROOT = os.path.join(MODULE_ROOT, 'data')\n\nSORT_OPTIONS = OrderedDict((\n    ('priority', _('Priority')),\n    ('date', _('Last Seen')),\n    ('new', _('First Seen')),\n    ('freq', _('Frequency')),\n))\n\nSEARCH_SORT_OPTIONS = OrderedDict((\n    ('score', _('Score')),\n    ('date', _('Last Seen')),\n    ('new', _('First Seen')),\n))\n\n# XXX: Deprecated: use GroupStatus instead\nSTATUS_UNRESOLVED = 0\nSTATUS_RESOLVED = 1\nSTATUS_IGNORED = 2\n\nSTATUS_CHOICES = {\n    'resolved': STATUS_RESOLVED,\n    'unresolved': STATUS_UNRESOLVED,\n    'ignored': STATUS_IGNORED,\n\n    # TODO(dcramer): remove in 9.0\n    'muted': STATUS_IGNORED,\n}\n\n# Normalize counts to the 15 minute marker. This value MUST be less than 60. A\n# value of 0 would store counts for every minute, and is the lowest level of\n# accuracy provided.\nMINUTE_NORMALIZATION = 15\n\nMAX_TAG_KEY_LENGTH = 32\nMAX_TAG_VALUE_LENGTH = 200\nMAX_CULPRIT_LENGTH = 200\nMAX_EMAIL_FIELD_LENGTH = 75\n\n# Team slugs which may not be used. Generally these are top level URL patterns\n# which we don't want to worry about conflicts on.\nRESERVED_ORGANIZATION_SLUGS = frozenset((\n    'admin', 'manage', 'login', 'account', 'register', 'api',\n    'accept', 'organizations', 'teams', 'projects', 'help',\n    'docs', 'logout', '404', '500', '_static', 'out', 'debug',\n    'remote', 'get-cli', 'blog', 'welcome', 'features',\n    'customers', 'integrations', 'signup', 'pricing',\n    'subscribe', 'enterprise', 'about', 'jobs', 'thanks', 'guide',\n    'privacy', 'security', 'terms', 'from', 'sponsorship', 'for',\n    'at', 'platforms', 'branding', 'vs', 'answers', '_admin',\n    'support',\n))\n\nLOG_LEVELS = {\n    logging.DEBUG: 'debug',\n    logging.INFO: 'info',\n    logging.WARNING: 'warning',\n    logging.ERROR: 'error',\n    logging.FATAL: 'fatal',\n}\nDEFAULT_LOG_LEVEL = 'error'\nDEFAULT_LOGGER_NAME = ''\nLOG_LEVELS_MAP = {v: k for k, v in six.iteritems(LOG_LEVELS)}\n\n\n# Default alerting threshold values\nDEFAULT_ALERT_PROJECT_THRESHOLD = (500, 25)  # 500%, 25 events\nDEFAULT_ALERT_GROUP_THRESHOLD = (1000, 25)  # 1000%, 25 events\n\n# Default paginator value\nEVENTS_PER_PAGE = 15\n\n# Default sort option for the group stream\nDEFAULT_SORT_OPTION = 'date'\n\n# Setup languages for only available locales\nLANGUAGE_MAP = dict(settings.LANGUAGES)\nLANGUAGES = [(k, LANGUAGE_MAP[k]) for k in get_all_languages() if k in LANGUAGE_MAP]\n\n# TODO(dcramer): We eventually want to make this user-editable\nTAG_LABELS = {\n    'exc_type': 'Exception Type',\n    'sentry:user': 'User',\n    'sentry:filename': 'File',\n    'sentry:function': 'Function',\n    'sentry:release': 'Release',\n    'os': 'OS',\n    'url': 'URL',\n    'server_name': 'Server',\n}\n\n# TODO(dcramer): once this is more flushed out we want this to be extendable\nSENTRY_RULES = (\n    'sentry.rules.actions.notify_event.NotifyEventAction',\n    'sentry.rules.actions.notify_event_service.NotifyEventServiceAction',\n    'sentry.rules.conditions.every_event.EveryEventCondition',\n    'sentry.rules.conditions.first_seen_event.FirstSeenEventCondition',\n    'sentry.rules.conditions.regression_event.RegressionEventCondition',\n    'sentry.rules.conditions.tagged_event.TaggedEventCondition',\n    'sentry.rules.conditions.event_frequency.EventFrequencyCondition',\n    'sentry.rules.conditions.event_frequency.EventUniqueUserFrequencyCondition',\n    'sentry.rules.conditions.event_attribute.EventAttributeCondition',\n    'sentry.rules.conditions.level.LevelCondition',\n)\n\n# methods as defined by http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + PATCH\nHTTP_METHODS = ('GET', 'POST', 'PUT', 'OPTIONS', 'HEAD', 'DELETE', 'TRACE', 'CONNECT', 'PATCH')\n\nCLIENT_RESERVED_ATTRS = (\n    'project',\n    'errors',\n    'event_id',\n    'message',\n    'checksum',\n    'culprit',\n    'fingerprint',\n    'level',\n    'time_spent',\n    'logger',\n    'server_name',\n    'site',\n    'received',\n    'timestamp',\n    'extra',\n    'modules',\n    'tags',\n    'platform',\n    'release',\n    'environment',\n)\n\nDEFAULT_SCRUBBED_FIELDS = (\n    'password',\n    'secret',\n    'passwd',\n    'authorization',\n    'api_key',\n    'apikey',\n    'access_token',\n    'auth',\n    'credentials',\n    'mysql_pwd',\n)\n\nVALID_PLATFORMS = set([\n    'as3',\n    'c',\n    'cfml',\n    'cocoa',\n    'csharp',\n    'go',\n    'java',\n    'javascript',\n    'node',\n    'objc',\n    'other',\n    'perl',\n    'php',\n    'python',\n    'ruby',\n    'elixir',\n    'haskell',\n    'groovy',\n])\n\nOK_PLUGIN_ENABLED = _(\"The {name} integration has been enabled.\")\n\nOK_PLUGIN_DISABLED = _(\"The {name} integration has been disabled.\")\n\nOK_PLUGIN_SAVED = _('Configuration for the {name} integration has been saved.')\n\nWARN_SESSION_EXPIRED = 'Your session has expired.'  # TODO: translate this\n\n# Key to use when ordering a list of events manually\nEVENT_ORDERING_KEY = attrgetter('datetime', 'id')\n\nFILTER_MASK = '[Filtered]'\n\n# Maximum length of a symbol\nMAX_SYM = 256\n\n# Known dsym mimetypes\nKNOWN_DSYM_TYPES = {\n    'application/x-mach-binary': 'macho'\n}\n\nNATIVE_UNKNOWN_STRING = '<unknown>'\n\n\nclass ObjectStatus(object):\n    VISIBLE = 0\n    HIDDEN = 1\n    PENDING_DELETION = 2\n    DELETION_IN_PROGRESS = 3\n\n    @classmethod\n    def as_choices(cls):\n        return (\n            (cls.VISIBLE, 'visible'),\n            (cls.HIDDEN, 'hidden'),\n            (cls.PENDING_DELETION, 'pending_deletion'),\n            (cls.DELETION_IN_PROGRESS, 'deletion_in_progress'),\n        )\n", "path": "src/sentry/constants.py"}]}