deel-local-cli 1.20.0 → 1.20.1
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.
- package/README.ko.md +3 -2
- package/README.md +3 -2
- package/package.json +1 -1
- package/src/safety/secrets.js +30 -6
package/README.ko.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
22
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
-
[](docs/ko/develop.md)
|
|
24
24
|
|
|
25
25
|
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
26
|
[](package.json)
|
|
@@ -301,7 +301,7 @@ deel --offline
|
|
|
301
301
|
무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
|
|
302
302
|
|
|
303
303
|
```
|
|
304
|
-
deel 1.20.
|
|
304
|
+
deel 1.20.1 ⌂ 이 안
|
|
305
305
|
보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
|
|
306
306
|
```
|
|
307
307
|
|
|
@@ -1289,6 +1289,7 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
|
|
|
1289
1289
|
|
|
1290
1290
|
| 판 | 무엇이 바뀌었나 |
|
|
1291
1291
|
|---|---|
|
|
1292
|
+
| [1.20.1](docs/ko/releases/1.20.md#1201) | `PASSWORD=` 는 한 번도 안 잡히고 있었습니다 |
|
|
1292
1293
|
| [1.20.0](docs/ko/releases/1.20.md#1200) | 대문자로 안 적은 열쇠는 그대로 나가고 있었습니다 |
|
|
1293
1294
|
| [1.19.5](docs/ko/releases/1.19.md#1195) | 윈도우 줄바꿈에서는 앞 판의 고침이 통째로 헛돌고 있었습니다 |
|
|
1294
1295
|
| [1.19.4](docs/ko/releases/1.19.md#1194) | 주석을 달아 둔 자리에서 비밀이 또 샜습니다 |
|
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ Vendor APIs connect too — **only when you say so**
|
|
|
20
20
|
|
|
21
21
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
22
|
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
-
[](docs/en/develop.md)
|
|
24
24
|
|
|
25
25
|
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
26
|
[](package.json)
|
|
@@ -374,7 +374,7 @@ deel --offline
|
|
|
374
374
|
The destination is printed at the top of every session:
|
|
375
375
|
|
|
376
376
|
```
|
|
377
|
-
deel 1.20.
|
|
377
|
+
deel 1.20.1 ⌂ inside
|
|
378
378
|
Sends to this machine 127.0.0.1:11434 ← nowhere else
|
|
379
379
|
```
|
|
380
380
|
|
|
@@ -1350,6 +1350,7 @@ so one run tells you everything.
|
|
|
1350
1350
|
|
|
1351
1351
|
| Version | What changed |
|
|
1352
1352
|
|---|---|
|
|
1353
|
+
| [1.20.1](docs/en/releases/1.20.md#1201) | `PASSWORD=` was never once caught |
|
|
1353
1354
|
| [1.20.0](docs/en/releases/1.20.md#1200) | A key not written in capitals was going out as it was |
|
|
1354
1355
|
| [1.19.5](docs/en/releases/1.19.md#1195) | On Windows line endings the previous release's fix did nothing at all |
|
|
1355
1356
|
| [1.19.4](docs/en/releases/1.19.md#1194) | Secrets leaked again wherever a comment was written |
|
package/package.json
CHANGED
package/src/safety/secrets.js
CHANGED
|
@@ -57,8 +57,18 @@ const 표 = (종류) => `«가림:${종류}»`;
|
|
|
57
57
|
* 안의 `#` 부터 잘려 뒤쪽 `;` 이 사라지고, 멀쩡한 코드가 가려진다.
|
|
58
58
|
*
|
|
59
59
|
* 그래서 따옴표를 세면서 걷는다. **따옴표 밖**의 첫 `#` 부터가 주석이다.
|
|
60
|
-
*
|
|
60
|
+
*
|
|
61
|
+
* 자바스크립트의 몰래칸(`#`)은 넘긴다 — `obj.#몰래칸` 처럼 점 뒤에 오거나,
|
|
62
|
+
* ` #apiKey = config.apiKey;` 처럼 줄머리에 온다. 뒤에 이름씨 글자가 붙어
|
|
63
|
+
* 있어야 몰래칸이다. 안 넘기면 그 선언 줄이 통째로 잘려 나가고, 남은 빈 줄에
|
|
64
|
+
* 코드의 표시가 없어 멀쩡한 코드가 가려진다(17차 리뷰).
|
|
65
|
+
*
|
|
66
|
+
* 줄머리 `#` 을 안 잘라도 설정 줄은 안 상한다 — `# API_KEY: 값` 은 잘라도
|
|
67
|
+
* 안 잘라도 코드의 표시가 없어 어차피 가려진다.
|
|
61
68
|
*/
|
|
69
|
+
const 몰래칸 = (줄, i) => /^[\p{L}_$]/u.test(줄[i + 1] ?? '')
|
|
70
|
+
&& (줄[i - 1] === '.' || /^[ \t]*$/.test(줄.slice(0, i)));
|
|
71
|
+
|
|
62
72
|
const 주석떼기 = (줄) => {
|
|
63
73
|
let 따 = '';
|
|
64
74
|
for (let i = 0; i < 줄.length; i += 1) {
|
|
@@ -69,7 +79,7 @@ const 주석떼기 = (줄) => {
|
|
|
69
79
|
continue;
|
|
70
80
|
}
|
|
71
81
|
if (자 === '"' || 자 === "'" || 자 === '`') { 따 = 자; continue; }
|
|
72
|
-
if (자 === '#' &&
|
|
82
|
+
if (자 === '#' && !몰래칸(줄, i)) return 줄.slice(0, i);
|
|
73
83
|
}
|
|
74
84
|
return 줄;
|
|
75
85
|
};
|
|
@@ -139,7 +149,7 @@ const 코드표시 = /[()]|=>|\/\/|\/\*|;|,[ \t]*$|\b(?:const|let|var|interface|
|
|
|
139
149
|
* 낱말을 점으로 이은 꼴이다. 그러니 값 모양으로 가를 수 있다는 생각을
|
|
140
150
|
* 버린다. 갈리지 않는 것을 갈리는 척하면 그게 더 위험하다.
|
|
141
151
|
*
|
|
142
|
-
* 점 뒤의 `#` 도 이름씨의 한
|
|
152
|
+
* 점 뒤의 `#` 도, 물음표 이음(`config?.apiKey`)도 이름씨의 한 조각이다.
|
|
143
153
|
*
|
|
144
154
|
* 이름씨는 영문만이 아니다. `설정.비밀번호` 를 이름씨로 안 보면
|
|
145
155
|
* `const API_KEY = 설정.비밀번호;` 가 가려진다 — 이 저장소 집안 스타일이
|
|
@@ -176,7 +186,7 @@ const 코드표시 = /[()]|=>|\/\/|\/\*|;|,[ \t]*$|\b(?:const|let|var|interface|
|
|
|
176
186
|
* @returns {boolean} 가릴까
|
|
177
187
|
*/
|
|
178
188
|
const 점값을가릴까 = (전체, 자리, 값) => {
|
|
179
|
-
if (!/^[\p{L}_$][\p{L}\p{N}_$]*(
|
|
189
|
+
if (!/^[\p{L}_$][\p{L}\p{N}_$]*(?:\??\.#?[\p{L}_$][\p{L}\p{N}_$]*)+$/u.test(값)) return true;
|
|
180
190
|
return !코드표시.test(주석떼기(줄떼기(전체, 자리)));
|
|
181
191
|
};
|
|
182
192
|
|
|
@@ -529,6 +539,19 @@ export const 갈래 = [
|
|
|
529
539
|
* 한다 — `_key` 아니면 `Key`. 그냥 소문자 `key` 로 끝나는 것까지 받으면
|
|
530
540
|
* `monkey` · `hotkey` 가 걸린다.
|
|
531
541
|
*
|
|
542
|
+
* 앞머리는 있어도 없어도 된다. `PASSWORD=` · `SECRET=` · `TOKEN=` 은
|
|
543
|
+
* `.env` 에서 제일 흔한 이름인데 **앞머리를 요구하는 바람에 하나도 안
|
|
544
|
+
* 잡히고 있었다**(17차 리뷰). 짧은 앞머리(`A_KEY`)와 밑줄로 시작하는
|
|
545
|
+
* 이름(`_apiKey`)도 같은 까닭으로 샜다.
|
|
546
|
+
*
|
|
547
|
+
* 민 이름으로 받을 때 빼는 것이 셋 있다. 재 보고 뺐다.
|
|
548
|
+
*
|
|
549
|
+
* - 소문자 `key` — `key: 값` 은 그냥 짝의 이름일 때가 너무 많다.
|
|
550
|
+
* - `PWD` — 셸의 **현재 폴더**다. `PWD: '/work'` 가 가려졌다.
|
|
551
|
+
* 앞머리가 붙은 `DB_PWD` 는 그대로 본다.
|
|
552
|
+
* - 붙임표로 이은 낱말 — `id-token: write` 는 깃허브 액션 문법이다.
|
|
553
|
+
* 밑줄과 낙타등은 이름씨 관례고, 붙임표는 YAML 짝 이름 관례다.
|
|
554
|
+
*
|
|
532
555
|
* 재 봤다. 이 저장소 파일 348개에 넣어 보니 21줄이 새로 가려졌고,
|
|
533
556
|
* **전부 진짜 열쇠였다**(`apiKey: 'sk-…'` 꼴).
|
|
534
557
|
*
|
|
@@ -537,11 +560,12 @@ export const 갈래 = [
|
|
|
537
560
|
* 것보다 낫다(1.19.0). 검사로 못 박아 둔다.
|
|
538
561
|
*/
|
|
539
562
|
id: '환경변수',
|
|
540
|
-
re: /\b((?:[A-
|
|
563
|
+
re: /\b(_?(?:[A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)|[A-Z0-9_]+PWD|[A-Za-z][A-Za-z0-9]*(?:_(?:key|token|secret|password|passwd|pwd|credentials?)|Key|Token|Secret|Password|Passwd|Pwd|Credentials?)|(?<![-\w])(?:password|secret|token|passwd|credentials?)))(?:(["']?[ \t]*(?::[^\n,;]{0,200}?|:[^\n]{0,200}?[>\])}][^\n,;]{0,80}?)[ \t]*=(?!=|>)\s*)((?:\(\s*)+)?(["'`])(?!«)((?:\\[^\n]|(?!\4)[^\n]){4,}?)\4((?:\s*\))+)?|(["']?\s*(?::(?![^\n]{0,200}?=[ \t]*«가림:)|=)\s*)((?:\(\s*)+)?(?:(["'`])(?!«)((?:\\[^\n]|(?!\9)[^\n]){4,}?)\9|(?!«)(?![\w$.]+\s*[([])(?!(?:string|number|boolean|bigint|symbol|object|unknown|never|void|null|undefined|true|false)\b)(?![^\n]{0,200}?}[ \t]*(?:=(?!=|>)|\)))(?!\(*\s*(?:process\.env|import\.meta\.env|globalThis\.process\.env|globalThis\.env|os\.environ|os\.getenv|ENV(?=\s*[[.(])|Deno\.env|Bun\.env)\b)([^\s"'()[\]{},;<>]{4,})(?=[ \t]*(?:[;,)\]}\r\n#]|$)))((?:\s*\))+)?)/g,
|
|
541
564
|
바꾸기: (m, 이름, 타입사이, 타입여는, 따A, 값A, 타입닫는,
|
|
542
565
|
민사이, 여는, 따B, 값B, 값C, 닫는, 자리, 전체) => {
|
|
543
566
|
// 따옴표 없는 맨 값만 「코드가 가리키는 이름인가」 를 되묻는다.
|
|
544
|
-
|
|
567
|
+
// 짝이 여러 줄에 걸리면 이름 줄이 아니라 **값이 놓인 줄**을 물어야 한다.
|
|
568
|
+
if (값C !== undefined && !점값을가릴까(전체, 자리 + m.lastIndexOf(값C), 값C)) return m;
|
|
545
569
|
return 타입사이 === undefined
|
|
546
570
|
? `${이름}${민사이}${여는 ?? ''}${표('환경변수')}${닫는 ?? ''}`
|
|
547
571
|
: `${이름}${타입사이}${타입여는 ?? ''}${표('환경변수')}${타입닫는 ?? ''}`;
|