project-shield 1.0.2 → 1.1.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.md +87 -9
- package/dist/index.js +62 -20
- package/dist/index.js.map +1 -1
- package/dist/license/commands.d.ts +17 -0
- package/dist/license/commands.d.ts.map +1 -0
- package/dist/license/commands.js +154 -0
- package/dist/license/commands.js.map +1 -0
- package/dist/license/gate.d.ts +14 -0
- package/dist/license/gate.d.ts.map +1 -0
- package/dist/license/gate.js +35 -0
- package/dist/license/gate.js.map +1 -0
- package/dist/license/http.d.ts +7 -0
- package/dist/license/http.d.ts.map +1 -0
- package/dist/license/http.js +89 -0
- package/dist/license/http.js.map +1 -0
- package/dist/license/index.d.ts +6 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +20 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/storage.d.ts +31 -0
- package/dist/license/storage.d.ts.map +1 -0
- package/dist/license/storage.js +138 -0
- package/dist/license/storage.js.map +1 -0
- package/dist/license/types.d.ts +55 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +4 -0
- package/dist/license/types.js.map +1 -0
- package/dist/license/usage.d.ts +22 -0
- package/dist/license/usage.d.ts.map +1 -0
- package/dist/license/usage.js +60 -0
- package/dist/license/usage.js.map +1 -0
- package/dist/license/validator.d.ts +28 -0
- package/dist/license/validator.d.ts.map +1 -0
- package/dist/license/validator.js +108 -0
- package/dist/license/validator.js.map +1 -0
- package/dist/output/terminal.d.ts +8 -2
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +21 -2
- package/dist/output/terminal.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,11 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
Detects leaked API keys, PII, insecure MCP configs, and prompt injection — in one command.
|
|
6
6
|
|
|
7
|
+
[](https://www.npmjs.com/package/project-shield)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
7
10
|
```bash
|
|
8
11
|
npx project-shield scan ./my-project
|
|
9
12
|
```
|
|
10
13
|
|
|
11
14
|
```
|
|
15
|
+
Tier: Free (0/5 scans)
|
|
16
|
+
|
|
12
17
|
Project Shield v1.0.0
|
|
13
18
|
Ruleset: v1.0.0 (SHA-256: f408a4fd...)
|
|
14
19
|
Scanning: 47 files (3 excluded)
|
|
@@ -33,7 +38,7 @@ Scanning: 47 files (3 excluded)
|
|
|
33
38
|
|
|
34
39
|
━━━ Injection ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
35
40
|
CRITICAL prompts/system.txt:3
|
|
36
|
-
Hidden injection in comment
|
|
41
|
+
Hidden injection in comment [structural]
|
|
37
42
|
Pattern: inj_ignore_prev | Layers: keyword ✓ structure ✓
|
|
38
43
|
|
|
39
44
|
━━━ Score ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
@@ -92,10 +97,10 @@ project-shield scan ./my-project --format json
|
|
|
92
97
|
project-shield scan ./my-project --fix
|
|
93
98
|
|
|
94
99
|
# Pro: all guides with code examples + references
|
|
95
|
-
project-shield scan ./my-project --fix
|
|
100
|
+
project-shield scan ./my-project --fix
|
|
96
101
|
```
|
|
97
102
|
|
|
98
|
-
### Evidence pack (JSON + PDF)
|
|
103
|
+
### Evidence pack (Pro — JSON + PDF)
|
|
99
104
|
|
|
100
105
|
```bash
|
|
101
106
|
project-shield scan ./my-project --evidence ./report
|
|
@@ -108,8 +113,8 @@ project-shield scan ./my-project --evidence ./report
|
|
|
108
113
|
# Free badge (with watermark)
|
|
109
114
|
project-shield scan ./my-project --badge shield-badge.svg
|
|
110
115
|
|
|
111
|
-
# Pro badge (no watermark)
|
|
112
|
-
project-shield scan ./my-project --badge shield-badge.svg
|
|
116
|
+
# Pro badge (no watermark, with UUID + verify URL)
|
|
117
|
+
project-shield scan ./my-project --badge shield-badge.svg
|
|
113
118
|
```
|
|
114
119
|
|
|
115
120
|
### Custom ignore
|
|
@@ -126,13 +131,41 @@ project-shield scan <path>
|
|
|
126
131
|
-i, --ignore <path> Path to .shieldignore file
|
|
127
132
|
-r, --ruleset <path> Path to custom ruleset JSON
|
|
128
133
|
-b, --badge <path> Output path for SVG badge
|
|
129
|
-
--pro Pro mode (no watermark, full fix-it guides)
|
|
130
134
|
--fix Show fix-it remediation guides
|
|
131
135
|
--evidence <path> Output path for evidence pack (JSON + PDF)
|
|
132
136
|
```
|
|
133
137
|
|
|
134
138
|
---
|
|
135
139
|
|
|
140
|
+
## Free vs Pro
|
|
141
|
+
|
|
142
|
+
| Feature | Free | Pro |
|
|
143
|
+
|---------|------|-----|
|
|
144
|
+
| Scans per month | 5 | 50 |
|
|
145
|
+
| Secrets / MCP / Injection details | Full | Full |
|
|
146
|
+
| PII details | Count only | File:line details |
|
|
147
|
+
| Fix-it guides | Top 3, summary | All, with code + references |
|
|
148
|
+
| Badge | Watermark | Clean + UUID + verify URL |
|
|
149
|
+
| Evidence Pack | Blocked | JSON + PDF |
|
|
150
|
+
| Seal UUID | No | Yes |
|
|
151
|
+
|
|
152
|
+
### License Management
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Check current status
|
|
156
|
+
project-shield status
|
|
157
|
+
|
|
158
|
+
# Activate Pro license
|
|
159
|
+
project-shield activate PSH-XXXX-XXXX-XXXX-XXXX
|
|
160
|
+
|
|
161
|
+
# Deactivate license
|
|
162
|
+
project-shield deactivate
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**License validation**: Server-validated with 7-day local cache. If the server is unreachable, a 3-day grace period keeps Pro active. After that, it gracefully downgrades to Free.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
136
169
|
## What It Detects
|
|
137
170
|
|
|
138
171
|
### F001: Secrets (3-layer detection)
|
|
@@ -227,7 +260,7 @@ docs/examples/
|
|
|
227
260
|
|
|
228
261
|
## Evidence Pack
|
|
229
262
|
|
|
230
|
-
The `--evidence` flag generates a compliance-ready report:
|
|
263
|
+
The `--evidence` flag generates a compliance-ready report (Pro only):
|
|
231
264
|
|
|
232
265
|
**JSON** (`report.json`):
|
|
233
266
|
- Full findings (secrets, PII, MCP, injection)
|
|
@@ -289,6 +322,14 @@ src/
|
|
|
289
322
|
badge.ts SVG badge generator (shields.io style)
|
|
290
323
|
fixit.ts 10-type fix-it guide system
|
|
291
324
|
evidence.ts Evidence pack (JSON + PDF)
|
|
325
|
+
license/
|
|
326
|
+
types.ts License type definitions
|
|
327
|
+
storage.ts Local file I/O (~/.project-shield/)
|
|
328
|
+
http.ts HTTPS request wrapper
|
|
329
|
+
validator.ts Key validation + 7-day cache + 3-day grace
|
|
330
|
+
usage.ts Scan usage tracking (monthly)
|
|
331
|
+
gate.ts Feature gating (Free/Pro)
|
|
332
|
+
commands.ts activate / deactivate / status
|
|
292
333
|
rules/
|
|
293
334
|
v1.0.0.json Ruleset (secrets + PII + MCP + injection patterns)
|
|
294
335
|
```
|
|
@@ -367,10 +408,10 @@ project-shield scan ./my-project
|
|
|
367
408
|
project-shield scan ./my-project --fix
|
|
368
409
|
|
|
369
410
|
# Pro: 전체 가이드 + 코드 예제 + 참조
|
|
370
|
-
project-shield scan ./my-project --fix
|
|
411
|
+
project-shield scan ./my-project --fix
|
|
371
412
|
```
|
|
372
413
|
|
|
373
|
-
### Evidence Pack (JSON + PDF)
|
|
414
|
+
### Evidence Pack (Pro 전용 — JSON + PDF)
|
|
374
415
|
|
|
375
416
|
```bash
|
|
376
417
|
project-shield scan ./my-project --evidence ./report
|
|
@@ -385,6 +426,35 @@ project-shield scan ./my-project --badge shield-badge.svg
|
|
|
385
426
|
|
|
386
427
|
---
|
|
387
428
|
|
|
429
|
+
## Free vs Pro
|
|
430
|
+
|
|
431
|
+
| 기능 | Free | Pro |
|
|
432
|
+
|------|------|-----|
|
|
433
|
+
| 월간 스캔 | 5회 | 50회 |
|
|
434
|
+
| 시크릿 / MCP / 인젝션 상세 | 전체 표시 | 전체 표시 |
|
|
435
|
+
| PII 상세 | 건수만 표시 | 파일:라인 상세 |
|
|
436
|
+
| Fix-it 가이드 | 상위 3개, 요약만 | 전체, 코드 + 참조 포함 |
|
|
437
|
+
| 뱃지 | 워터마크 | 클린 + UUID + 검증 URL |
|
|
438
|
+
| Evidence Pack | 차단 | JSON + PDF 생성 |
|
|
439
|
+
| Seal UUID | 미포함 | 포함 |
|
|
440
|
+
|
|
441
|
+
### 라이선스 관리
|
|
442
|
+
|
|
443
|
+
```bash
|
|
444
|
+
# 현재 상태 확인
|
|
445
|
+
project-shield status
|
|
446
|
+
|
|
447
|
+
# Pro 라이선스 활성화
|
|
448
|
+
project-shield activate PSH-XXXX-XXXX-XXXX-XXXX
|
|
449
|
+
|
|
450
|
+
# 라이선스 비활성화
|
|
451
|
+
project-shield deactivate
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
**라이선스 검증**: 서버 검증 후 7일간 로컬 캐시. 서버 불통 시 3일 유예 기간. 유예 이후 Free로 자동 다운그레이드.
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
388
458
|
## 탐지 항목
|
|
389
459
|
|
|
390
460
|
### F001: 시크릿(Secret) 탐지
|
|
@@ -435,6 +505,14 @@ tests/fixtures/
|
|
|
435
505
|
|
|
436
506
|
---
|
|
437
507
|
|
|
508
|
+
## 무결성
|
|
509
|
+
|
|
510
|
+
- 룰셋은 매 로드마다 SHA-256 검증. 변조된 룰셋 = 스캔 거부.
|
|
511
|
+
- 스캔 결과는 해시 봉인. 동일 입력 = 동일 해시.
|
|
512
|
+
- Fail-safe: 스캔 중 크래시 = `SCAN_FAILED` (거짓 통과 없음).
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
438
516
|
## 라이선스
|
|
439
517
|
|
|
440
518
|
MIT
|
package/dist/index.js
CHANGED
|
@@ -46,6 +46,10 @@ const terminal_js_1 = require("./output/terminal.js");
|
|
|
46
46
|
const fixit_js_1 = require("./output/fixit.js");
|
|
47
47
|
const evidence_js_1 = require("./output/evidence.js");
|
|
48
48
|
const failsafe_js_1 = require("./integrity/failsafe.js");
|
|
49
|
+
const validator_js_1 = require("./license/validator.js");
|
|
50
|
+
const usage_js_1 = require("./license/usage.js");
|
|
51
|
+
const gate_js_1 = require("./license/gate.js");
|
|
52
|
+
const commands_js_1 = require("./license/commands.js");
|
|
49
53
|
const program = new commander_1.Command();
|
|
50
54
|
program
|
|
51
55
|
.name('project-shield')
|
|
@@ -59,11 +63,22 @@ program
|
|
|
59
63
|
.option('-i, --ignore <path>', 'Path to .shieldignore file')
|
|
60
64
|
.option('-r, --ruleset <path>', 'Path to ruleset JSON file')
|
|
61
65
|
.option('-b, --badge <path>', 'Output path for SVG badge', '')
|
|
62
|
-
.option('--pro', 'Generate Pro badge (no watermark)', false)
|
|
63
66
|
.option('--fix', 'Show fix-it remediation guides', false)
|
|
64
67
|
.option('--evidence <path>', 'Output path for evidence pack (JSON + PDF)')
|
|
65
68
|
.action(async (targetPath, options) => {
|
|
66
69
|
try {
|
|
70
|
+
// ─── License validation ───────────────────────────────
|
|
71
|
+
const tier = await (0, validator_js_1.validateLicense)();
|
|
72
|
+
const gate = (0, gate_js_1.getFeatureGate)(tier);
|
|
73
|
+
// Check scan limit
|
|
74
|
+
const scanCheck = (0, usage_js_1.canScan)(tier);
|
|
75
|
+
if (!scanCheck.allowed) {
|
|
76
|
+
console.error(`Error: ${scanCheck.reason}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
// Show tier header
|
|
80
|
+
const tierLabel = tier.isPro ? '\x1b[32mPro\x1b[0m' : 'Free';
|
|
81
|
+
console.log(`Tier: ${tierLabel} (${tier.scansUsed}/${tier.maxScans} scans)`);
|
|
67
82
|
const resolvedPath = path.resolve(targetPath);
|
|
68
83
|
const format = options.format;
|
|
69
84
|
// Load ruleset info for display
|
|
@@ -77,39 +92,44 @@ program
|
|
|
77
92
|
// Calculate score and lock status
|
|
78
93
|
const score = (0, score_js_1.calculateScore)(result);
|
|
79
94
|
const lockStatus = (0, lock_js_1.getLockStatus)(score);
|
|
80
|
-
const seal = (0, seal_js_1.sealResult)(result, score, ruleset.version, { isPro:
|
|
95
|
+
const seal = (0, seal_js_1.sealResult)(result, score, ruleset.version, { isPro: gate.canGenerateSealUUID });
|
|
81
96
|
if (format === 'json') {
|
|
82
|
-
const jsonObj = JSON.parse((0, terminal_js_1.formatJsonOutput)(result, score, seal));
|
|
97
|
+
const jsonObj = JSON.parse((0, terminal_js_1.formatJsonOutput)(result, score, seal, { isPro: gate.isPro }));
|
|
83
98
|
if (options.fix) {
|
|
84
|
-
const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro:
|
|
85
|
-
jsonObj.fixit = (0, fixit_js_1.formatFixitJson)(guides,
|
|
99
|
+
const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: gate.canSeeFullFixit });
|
|
100
|
+
jsonObj.fixit = (0, fixit_js_1.formatFixitJson)(guides, gate.canSeeFullFixit);
|
|
86
101
|
}
|
|
87
102
|
console.log(JSON.stringify(jsonObj, null, 2));
|
|
88
103
|
}
|
|
89
104
|
else {
|
|
90
|
-
console.log((0, terminal_js_1.formatTerminalOutput)(result, ruleset.version, ruleset.sha256, score, lockStatus));
|
|
105
|
+
console.log((0, terminal_js_1.formatTerminalOutput)(result, ruleset.version, ruleset.sha256, score, lockStatus, { isPro: gate.isPro }));
|
|
91
106
|
if (options.fix) {
|
|
92
|
-
const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro:
|
|
93
|
-
console.log((0, fixit_js_1.formatFixitTerminal)(guides,
|
|
107
|
+
const guides = (0, fixit_js_1.getFixitGuides)(result, { isPro: gate.canSeeFullFixit });
|
|
108
|
+
console.log((0, fixit_js_1.formatFixitTerminal)(guides, gate.canSeeFullFixit));
|
|
94
109
|
}
|
|
95
110
|
}
|
|
96
|
-
// Evidence Pack generation
|
|
111
|
+
// Evidence Pack generation (Pro only)
|
|
97
112
|
if (options.evidence) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
if (!gate.canGenerateEvidence) {
|
|
114
|
+
console.error('Error: Evidence Pack is a Pro feature. Upgrade: https://project-shield.dev/pro');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const evidencePath = path.resolve(options.evidence);
|
|
118
|
+
const pack = (0, evidence_js_1.generateEvidenceJSON)(result, score, lockStatus, seal, {
|
|
119
|
+
scanTarget: resolvedPath,
|
|
120
|
+
rulesetHash: ruleset.sha256,
|
|
121
|
+
rulesetVersion: ruleset.version,
|
|
122
|
+
});
|
|
123
|
+
(0, evidence_js_1.saveEvidenceJSON)(pack, `${evidencePath}.json`);
|
|
124
|
+
console.log(`Evidence JSON saved to: ${evidencePath}.json`);
|
|
125
|
+
await (0, evidence_js_1.generateEvidencePDF)(pack, `${evidencePath}.pdf`);
|
|
126
|
+
console.log(`Evidence PDF saved to: ${evidencePath}.pdf`);
|
|
127
|
+
}
|
|
108
128
|
}
|
|
109
129
|
// Badge generation
|
|
110
130
|
if (options.badge) {
|
|
111
131
|
try {
|
|
112
|
-
const svg = (0, badge_js_1.generateBadge)(score, lockStatus, { isPro:
|
|
132
|
+
const svg = (0, badge_js_1.generateBadge)(score, lockStatus, { isPro: gate.canSeeCleanBadge });
|
|
113
133
|
const badgePath = path.resolve(options.badge);
|
|
114
134
|
(0, badge_js_1.saveBadge)(svg, badgePath);
|
|
115
135
|
console.log(`Badge saved to: ${badgePath}`);
|
|
@@ -123,6 +143,8 @@ program
|
|
|
123
143
|
}
|
|
124
144
|
}
|
|
125
145
|
}
|
|
146
|
+
// Record the scan AFTER successful completion
|
|
147
|
+
(0, usage_js_1.recordScan)();
|
|
126
148
|
// Exit with code 1 if critical findings
|
|
127
149
|
const hasCritical = result.summary.critical > 0 ||
|
|
128
150
|
result.summary.confirmedPii > 0 ||
|
|
@@ -147,5 +169,25 @@ program
|
|
|
147
169
|
process.exit(1);
|
|
148
170
|
}
|
|
149
171
|
});
|
|
172
|
+
// ─── License commands ─────────────────────────────────────────
|
|
173
|
+
program
|
|
174
|
+
.command('activate')
|
|
175
|
+
.description('Activate a Pro license key')
|
|
176
|
+
.argument('<key>', 'License key (PSH-XXXX-XXXX-XXXX-XXXX)')
|
|
177
|
+
.action(async (key) => {
|
|
178
|
+
await (0, commands_js_1.activateCommand)(key);
|
|
179
|
+
});
|
|
180
|
+
program
|
|
181
|
+
.command('deactivate')
|
|
182
|
+
.description('Deactivate the current license')
|
|
183
|
+
.action(async () => {
|
|
184
|
+
await (0, commands_js_1.deactivateCommand)();
|
|
185
|
+
});
|
|
186
|
+
program
|
|
187
|
+
.command('status')
|
|
188
|
+
.description('Show license and usage status')
|
|
189
|
+
.action(async () => {
|
|
190
|
+
await (0, commands_js_1.statusCommand)();
|
|
191
|
+
});
|
|
150
192
|
program.parse();
|
|
151
193
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,gDAAkC;AAClC,mDAA2C;AAC3C,uDAAqD;AACrD,iDAAoD;AACpD,+CAAkD;AAClD,iDAAiD;AACjD,gDAA+E;AAC/E,sDAA8E;AAC9E,gDAAyF;AACzF,sDAAmG;AACnG,yDAIiC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a machine ID from hostname + username + platform.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getMachineId(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Activate a license key.
|
|
7
|
+
*/
|
|
8
|
+
export declare function activateCommand(key: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Deactivate the current license.
|
|
11
|
+
*/
|
|
12
|
+
export declare function deactivateCommand(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Show current license status.
|
|
15
|
+
*/
|
|
16
|
+
export declare function statusCommand(): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/license/commands.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmBvD;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBnD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getMachineId = getMachineId;
|
|
37
|
+
exports.activateCommand = activateCommand;
|
|
38
|
+
exports.deactivateCommand = deactivateCommand;
|
|
39
|
+
exports.statusCommand = statusCommand;
|
|
40
|
+
const crypto = __importStar(require("node:crypto"));
|
|
41
|
+
const os = __importStar(require("node:os"));
|
|
42
|
+
const validator_js_1 = require("./validator.js");
|
|
43
|
+
const storage_js_1 = require("./storage.js");
|
|
44
|
+
const usage_js_1 = require("./usage.js");
|
|
45
|
+
const http_js_1 = require("./http.js");
|
|
46
|
+
const API_BASE = 'https://project-shield-license-api.vnddns999.workers.dev/api/v1';
|
|
47
|
+
const colors = {
|
|
48
|
+
red: (s) => `\x1b[31m${s}\x1b[0m`,
|
|
49
|
+
green: (s) => `\x1b[32m${s}\x1b[0m`,
|
|
50
|
+
yellow: (s) => `\x1b[33m${s}\x1b[0m`,
|
|
51
|
+
cyan: (s) => `\x1b[36m${s}\x1b[0m`,
|
|
52
|
+
bold: (s) => `\x1b[1m${s}\x1b[0m`,
|
|
53
|
+
dim: (s) => `\x1b[2m${s}\x1b[0m`,
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Generate a machine ID from hostname + username + platform.
|
|
57
|
+
*/
|
|
58
|
+
function getMachineId() {
|
|
59
|
+
const raw = `${os.hostname()}${os.userInfo().username}${process.platform}`;
|
|
60
|
+
return crypto.createHash('sha256').update(raw).digest('hex').substring(0, 16);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Activate a license key.
|
|
64
|
+
*/
|
|
65
|
+
async function activateCommand(key) {
|
|
66
|
+
// 1. Key format validation
|
|
67
|
+
if (!(0, validator_js_1.isValidKeyFormat)(key)) {
|
|
68
|
+
console.error(colors.red('Invalid license key format.'));
|
|
69
|
+
console.error(colors.dim('Expected: PSH-XXXX-XXXX-XXXX-XXXX'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// 2. Server activation
|
|
73
|
+
const machineId = getMachineId();
|
|
74
|
+
try {
|
|
75
|
+
const response = await (0, http_js_1.postJSON)(`${API_BASE}/activate`, {
|
|
76
|
+
key,
|
|
77
|
+
machineId,
|
|
78
|
+
});
|
|
79
|
+
if (response.success && response.license) {
|
|
80
|
+
// 3. Save license file
|
|
81
|
+
const now = new Date();
|
|
82
|
+
const validUntil = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
|
83
|
+
(0, storage_js_1.writeLicenseFile)({
|
|
84
|
+
cache: {
|
|
85
|
+
license: response.license,
|
|
86
|
+
validatedAt: now.toISOString(),
|
|
87
|
+
validUntil: validUntil.toISOString(),
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
console.log(colors.green('License activated successfully!'));
|
|
91
|
+
console.log(` Tier: ${colors.bold(response.license.tier.toUpperCase())}`);
|
|
92
|
+
console.log(` Email: ${response.license.email}`);
|
|
93
|
+
console.log(` Expires: ${response.license.expiresAt}`);
|
|
94
|
+
console.log(` Scans/month: ${response.license.maxScansPerMonth}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.error(colors.red(`Activation failed: ${response.error ?? 'Unknown error'}`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
console.error(colors.red('Could not reach license server.'));
|
|
102
|
+
console.error(colors.dim(err instanceof Error ? err.message : String(err)));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Deactivate the current license.
|
|
107
|
+
*/
|
|
108
|
+
async function deactivateCommand() {
|
|
109
|
+
const file = (0, storage_js_1.readLicenseFile)();
|
|
110
|
+
if (!file) {
|
|
111
|
+
console.log(colors.yellow('No active license found.'));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const machineId = getMachineId();
|
|
115
|
+
try {
|
|
116
|
+
await (0, http_js_1.postJSON)(`${API_BASE}/deactivate`, {
|
|
117
|
+
key: file.cache.license.key,
|
|
118
|
+
machineId,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Server unreachable — still remove local license
|
|
123
|
+
}
|
|
124
|
+
(0, storage_js_1.deleteLicenseFile)();
|
|
125
|
+
console.log(colors.green('License deactivated. Reverted to Free tier.'));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Show current license status.
|
|
129
|
+
*/
|
|
130
|
+
async function statusCommand() {
|
|
131
|
+
const tier = await (0, validator_js_1.validateLicense)();
|
|
132
|
+
const monthKey = (0, usage_js_1.getCurrentMonthKey)();
|
|
133
|
+
const usage = (0, usage_js_1.getUsageForMonth)(monthKey);
|
|
134
|
+
const file = (0, storage_js_1.readLicenseFile)();
|
|
135
|
+
console.log('');
|
|
136
|
+
console.log(colors.bold('Project Shield — License Status'));
|
|
137
|
+
console.log('');
|
|
138
|
+
console.log(` Tier: ${tier.isPro ? colors.green('Pro') : 'Free'}`);
|
|
139
|
+
console.log(` Scans: ${usage.scanCount}/${tier.maxScans} this month (${tier.scansRemaining} remaining)`);
|
|
140
|
+
console.log(` Source: ${tier.source === 'license' ? 'License key' : 'Default (no key)'}`);
|
|
141
|
+
if (file) {
|
|
142
|
+
const cache = file.cache;
|
|
143
|
+
console.log(` Key: ${cache.license.key.substring(0, 8)}...`);
|
|
144
|
+
console.log(` Email: ${cache.license.email}`);
|
|
145
|
+
console.log(` Expires: ${cache.license.expiresAt}`);
|
|
146
|
+
console.log(` Cache: Valid until ${cache.validUntil}`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log('');
|
|
150
|
+
console.log(colors.dim(' Activate a Pro license: project-shield activate PSH-XXXX-XXXX-XXXX-XXXX'));
|
|
151
|
+
}
|
|
152
|
+
console.log('');
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/license/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TierStatus, FeatureGate } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Determine feature access based on tier status.
|
|
4
|
+
*
|
|
5
|
+
* | Feature | Free | Pro |
|
|
6
|
+
* |-------------------|-------|------|
|
|
7
|
+
* | evidence | false | true |
|
|
8
|
+
* | piiDetails | false | true |
|
|
9
|
+
* | cleanBadge | false | true |
|
|
10
|
+
* | fullFixit | false | true |
|
|
11
|
+
* | sealUUID | false | true |
|
|
12
|
+
*/
|
|
13
|
+
export declare function getFeatureGate(tier: TierStatus): FeatureGate;
|
|
14
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAoB5D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFeatureGate = getFeatureGate;
|
|
4
|
+
/**
|
|
5
|
+
* Determine feature access based on tier status.
|
|
6
|
+
*
|
|
7
|
+
* | Feature | Free | Pro |
|
|
8
|
+
* |-------------------|-------|------|
|
|
9
|
+
* | evidence | false | true |
|
|
10
|
+
* | piiDetails | false | true |
|
|
11
|
+
* | cleanBadge | false | true |
|
|
12
|
+
* | fullFixit | false | true |
|
|
13
|
+
* | sealUUID | false | true |
|
|
14
|
+
*/
|
|
15
|
+
function getFeatureGate(tier) {
|
|
16
|
+
if (tier.isPro) {
|
|
17
|
+
return {
|
|
18
|
+
isPro: true,
|
|
19
|
+
canGenerateEvidence: true,
|
|
20
|
+
canSeePiiDetails: true,
|
|
21
|
+
canSeeCleanBadge: true,
|
|
22
|
+
canSeeFullFixit: true,
|
|
23
|
+
canGenerateSealUUID: true,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
isPro: false,
|
|
28
|
+
canGenerateEvidence: false,
|
|
29
|
+
canSeePiiDetails: false,
|
|
30
|
+
canSeeCleanBadge: false,
|
|
31
|
+
canSeeFullFixit: false,
|
|
32
|
+
canGenerateSealUUID: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/license/gate.ts"],"names":[],"mappings":";;AAaA,wCAoBC;AA/BD;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,IAAgB;IAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,IAAI;YACX,mBAAmB,EAAE,IAAI;YACzB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,IAAI;YACrB,mBAAmB,EAAE,IAAI;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,KAAK;QACvB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,mBAAmB,EAAE,KAAK;KAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/license/http.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA+CrE"}
|