@caddis/cli 0.4.58 → 0.4.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -148,12 +148,19 @@ OUTPUT_MASKS: list[tuple[re.Pattern, str]] = [
|
|
|
148
148
|
(re.compile(r"\bgh[pousr]_[A-Za-z0-9]{36,}\b"), "***"), # secret_filter github-token
|
|
149
149
|
(re.compile(r"\bxox[abprs]-[A-Za-z0-9-]{10,}\b"), "***"), # secret_filter slack-token
|
|
150
150
|
(re.compile(r"\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b"), "***"), # secret_filter jwt
|
|
151
|
-
# secret_filter assignment, widened: a quoted value may hold spaces (a passphrase of several words).
|
|
152
|
-
|
|
151
|
+
# secret_filter assignment, widened: a quoted value may hold spaces (a passphrase of several words). A match
|
|
152
|
+
# starts only at the start of a word: a match inside a word always has one from the word start too, and without
|
|
153
|
+
# the lookbehind each character of a long word started a new scan (quadratic: 50 KB of one word took 64 s).
|
|
154
|
+
(re.compile(r"(?i)(?<![A-Za-z0-9_])"
|
|
155
|
+
r"([A-Za-z0-9_]*(?:password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*\s*[:=]\s*)"
|
|
153
156
|
r"(['\"])[^'\"\n]{8,}\2"), r"\1\2***\2"),
|
|
154
157
|
(re.compile(r"(?im)^(\s*(?:export\s+)?[A-Za-z0-9_]*(?:PASSWORD|PASSWD|SECRET|API_KEY|APIKEY|TOKEN|PRIVATE_KEY)"
|
|
155
158
|
r"[A-Za-z0-9_]*\s*=\s*)[^\s'\"#]{8,}"), r"\1***"), # secret_filter env-assignment
|
|
156
|
-
|
|
159
|
+
# URL credentials. The scheme starts at a letter after a word boundary. Every such letter in one run of scheme
|
|
160
|
+
# characters reaches the same `://`, so only the first one is tried: group 1 skips, possessively, the run's
|
|
161
|
+
# digits, `+.-` and letters that follow a word character. Without that, `a.a.a.a...` was quadratic.
|
|
162
|
+
(re.compile(r"(?<![A-Za-z0-9+.-])((?:[0-9+.-]|(?<=\w)[A-Za-z])*+)([A-Za-z][A-Za-z0-9+.-]*://)"
|
|
163
|
+
r"[^/\s:@]+:[^/\s@]+@"), r"\1\2***@"),
|
|
157
164
|
# Absolute paths, which can name a user or a host. A path may hold spaces, so each one runs to the end of the
|
|
158
165
|
# line or a quote; a Windows drive or UNC path also stops at `<`, `>` or `|` (never part of a Windows path).
|
|
159
166
|
(re.compile(r"(?<![A-Za-z0-9])[A-Za-z]:[\\/][^\r\n'\"<>|]*"), "<path>"), # a Windows drive path
|
|
@@ -101,11 +101,15 @@ SECRET_RULES: list[tuple[str, re.Pattern]] = [
|
|
|
101
101
|
("npm-token", re.compile(r"\bnpm_[A-Za-z0-9]{36}\b")),
|
|
102
102
|
("slack-webhook", re.compile(r"https://hooks\.slack\.com/services/[A-Za-z0-9_/]+")),
|
|
103
103
|
# user:password@host in a URL. `value` is the password; placeholders are exempted in code.
|
|
104
|
+
# Both rules below start a match only at the start of a run of the characters their first part takes (the
|
|
105
|
+
# lookbehind). A match that starts inside the run finds the same value from the run start too, and without the
|
|
106
|
+
# lookbehind each character of a long word started a new scan: quadratic, minutes on one long line.
|
|
104
107
|
("url-credentials", re.compile(
|
|
105
|
-
r"[a-z][a-z0-9+.-]*://[^/\s:@]*:(?P<value>[^/\s@]{3,})@", re.I)),
|
|
108
|
+
r"(?<![a-z0-9+.-])[0-9+.-]*[a-z][a-z0-9+.-]*://[^/\s:@]*:(?P<value>[^/\s@]{3,})@", re.I)),
|
|
106
109
|
# `name = "v"`, `name: "v"`, and a quoted key: `"name": "v"`, `'name': 'v'`.
|
|
107
110
|
("assignment", re.compile(
|
|
108
|
-
r"(?i)[A-Za-z0-9_]*(password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*['\"]?\s*[:=]\s*
|
|
111
|
+
r"(?i)(?<![A-Za-z0-9_])[A-Za-z0-9_]*(password|passwd|secret|api[_-]?key|token)[A-Za-z0-9_]*['\"]?\s*[:=]\s*"
|
|
112
|
+
r"['\"](?P<value>[^'\"\s]{8,})['\"]"
|
|
109
113
|
)),
|
|
110
114
|
("env-assignment", re.compile(
|
|
111
115
|
r"^\s*(?:export\s+)?[A-Za-z0-9_]*(?:PASSWORD|PASSWD|SECRET|API_KEY|APIKEY|TOKEN|PRIVATE_KEY)"
|
package/bundles/manifest.json
CHANGED
package/package.json
CHANGED