configproof 0.3.0
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/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/adapters/dotenv.d.ts +3 -0
- package/dist/adapters/dotenv.js +277 -0
- package/dist/adapters/dotenv.js.map +1 -0
- package/dist/adapters/native-env.d.ts +7 -0
- package/dist/adapters/native-env.js +196 -0
- package/dist/adapters/native-env.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.js +30 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/agent/server.d.ts +15 -0
- package/dist/agent/server.js +254 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/analysis/diagnose.d.ts +64 -0
- package/dist/analysis/diagnose.js +142 -0
- package/dist/analysis/diagnose.js.map +1 -0
- package/dist/analysis/history.d.ts +52 -0
- package/dist/analysis/history.js +119 -0
- package/dist/analysis/history.js.map +1 -0
- package/dist/analysis/policy.d.ts +161 -0
- package/dist/analysis/policy.js +192 -0
- package/dist/analysis/policy.js.map +1 -0
- package/dist/analysis/provenance.d.ts +45 -0
- package/dist/analysis/provenance.js +144 -0
- package/dist/analysis/provenance.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +286 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/analyze.d.ts +46 -0
- package/dist/core/analyze.js +168 -0
- package/dist/core/analyze.js.map +1 -0
- package/dist/core/collect.d.ts +5 -0
- package/dist/core/collect.js +147 -0
- package/dist/core/collect.js.map +1 -0
- package/dist/core/export.d.ts +53 -0
- package/dist/core/export.js +155 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/io.d.ts +13 -0
- package/dist/core/io.js +100 -0
- package/dist/core/io.js.map +1 -0
- package/dist/core/privacy.d.ts +25 -0
- package/dist/core/privacy.js +113 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/schema.d.ts +2149 -0
- package/dist/core/schema.js +181 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/demo.d.ts +1 -0
- package/dist/demo.js +45 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +27 -0
- package/dist/launcher.js +122 -0
- package/dist/launcher.js.map +1 -0
- package/dist/report/html.d.ts +5 -0
- package/dist/report/html.js +109 -0
- package/dist/report/html.js.map +1 -0
- package/dist/runtime/api.d.ts +44 -0
- package/dist/runtime/api.js +29 -0
- package/dist/runtime/api.js.map +1 -0
- package/dist/runtime/callsite.d.ts +3 -0
- package/dist/runtime/callsite.js +61 -0
- package/dist/runtime/callsite.js.map +1 -0
- package/dist/runtime/children.d.ts +8 -0
- package/dist/runtime/children.js +69 -0
- package/dist/runtime/children.js.map +1 -0
- package/dist/runtime/environment.d.ts +3 -0
- package/dist/runtime/environment.js +53 -0
- package/dist/runtime/environment.js.map +1 -0
- package/dist/runtime/preload.d.ts +1 -0
- package/dist/runtime/preload.js +117 -0
- package/dist/runtime/preload.js.map +1 -0
- package/dist/runtime/recorder.d.ts +59 -0
- package/dist/runtime/recorder.js +254 -0
- package/dist/runtime/recorder.js.map +1 -0
- package/dist/runtime/workers.d.ts +12 -0
- package/dist/runtime/workers.js +127 -0
- package/dist/runtime/workers.js.map +1 -0
- package/docs/ARCHITECTURE.md +54 -0
- package/docs/COMPATIBILITY.md +24 -0
- package/docs/PRIVACY.md +17 -0
- package/docs/VALIDATION.md +42 -0
- package/fixtures/bypass/app.cjs +6 -0
- package/fixtures/bypass/early.cjs +2 -0
- package/fixtures/child-process/child.cjs +2 -0
- package/fixtures/child-process/parent.cjs +5 -0
- package/fixtures/custom-target/app.cjs +4 -0
- package/fixtures/custom-target/sample.env +1 -0
- package/fixtures/esm/app.mjs +5 -0
- package/fixtures/exit-code/app.cjs +4 -0
- package/fixtures/failure-boundary/app.cjs +7 -0
- package/fixtures/load-order/app.cjs +9 -0
- package/fixtures/load-order/first.env +1 -0
- package/fixtures/load-order/second.env +1 -0
- package/fixtures/manifest.json +16 -0
- package/fixtures/native-env/app.cjs +6 -0
- package/fixtures/native-env/failure.cjs +4 -0
- package/fixtures/native-env/sample.env +1 -0
- package/fixtures/native-env/startup.cjs +2 -0
- package/fixtures/runtime-mutation/app.cjs +12 -0
- package/fixtures/source-map/input.ts +5 -0
- package/fixtures/source-map/tsconfig.json +7 -0
- package/fixtures/stale-inheritance/app.cjs +4 -0
- package/fixtures/stale-inheritance/sample.env +1 -0
- package/fixtures/v03-manifest.json +32 -0
- package/fixtures/worker/parent.cjs +3 -0
- package/fixtures/worker/worker.cjs +2 -0
- package/fixtures/worker-modes/parent.cjs +17 -0
- package/fixtures/worker-modes/worker.cjs +4 -0
- package/package.json +64 -0
- package/policies/configtrace-policy.yaml +23 -0
- package/policies/issue-share.yaml +12 -0
- package/policies/minimal.yaml +8 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PathScrubber = exports.WatchSet = void 0;
|
|
7
|
+
exports.createComparisonKey = createComparisonKey;
|
|
8
|
+
exports.writeComparisonKey = writeComparisonKey;
|
|
9
|
+
exports.readComparisonKey = readComparisonKey;
|
|
10
|
+
exports.fingerprint = fingerprint;
|
|
11
|
+
exports.sameValue = sameValue;
|
|
12
|
+
exports.globToRegex = globToRegex;
|
|
13
|
+
exports.parseWatch = parseWatch;
|
|
14
|
+
const node_crypto_1 = require("node:crypto");
|
|
15
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
16
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
17
|
+
const node_url_1 = require("node:url");
|
|
18
|
+
const schema_1 = require("./schema");
|
|
19
|
+
const io_1 = require("./io");
|
|
20
|
+
function createComparisonKey() {
|
|
21
|
+
return { version: 1, domainId: (0, io_1.uniqueId)('d'), secret: (0, node_crypto_1.randomBytes)(32).toString('hex') };
|
|
22
|
+
}
|
|
23
|
+
function writeComparisonKey(file) {
|
|
24
|
+
const key = createComparisonKey();
|
|
25
|
+
(0, io_1.writeNew)(file, JSON.stringify(key, null, 2) + '\n');
|
|
26
|
+
return key;
|
|
27
|
+
}
|
|
28
|
+
function readComparisonKey(file) {
|
|
29
|
+
try {
|
|
30
|
+
const stat = node_fs_1.default.lstatSync(file);
|
|
31
|
+
if (!stat.isFile() || (process.platform !== 'win32' && (stat.mode & 0o077) !== 0)) {
|
|
32
|
+
throw new io_1.UserError('Comparison key must be a regular private file (chmod 600 on POSIX).', 65);
|
|
33
|
+
}
|
|
34
|
+
return schema_1.KeyFileSchema.parse(JSON.parse((0, io_1.readBounded)(file, 4096)));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof io_1.UserError)
|
|
38
|
+
throw error;
|
|
39
|
+
throw new io_1.UserError('Invalid comparison key file.', 65);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Length framing prevents collisions across key/value boundaries. No raw-value cache. */
|
|
43
|
+
function fingerprint(key, name, value) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
return { state: 'missing' };
|
|
46
|
+
const digest = (0, node_crypto_1.createHmac)('sha256', Buffer.from(key.secret, 'hex'))
|
|
47
|
+
.update('configtrace:value:v1\0').update(String(Buffer.byteLength(name))).update(':')
|
|
48
|
+
.update(name).update(':').update(value).digest('hex');
|
|
49
|
+
return { state: 'present', token: digest, empty: value.length === 0 };
|
|
50
|
+
}
|
|
51
|
+
function sameValue(a, b) {
|
|
52
|
+
return !!a && !!b && a.state === b.state &&
|
|
53
|
+
(a.state === 'missing' || (a.state === 'present' && b.state === 'present' && a.token === b.token));
|
|
54
|
+
}
|
|
55
|
+
function globToRegex(pattern, insensitive = false) {
|
|
56
|
+
const escaped = pattern.split('').map(c => c === '*' ? '.*' : c === '?' ? '.' : c.replace(/[\\^$+.[\]{}()|]/g, '\\$&')).join('');
|
|
57
|
+
return new RegExp(`^${escaped}$`, insensitive ? 'i' : '');
|
|
58
|
+
}
|
|
59
|
+
function parseWatch(raw) {
|
|
60
|
+
const patterns = [...new Set(raw.flatMap(x => x.split(',')).map(x => x.trim()).filter(Boolean))];
|
|
61
|
+
if (!patterns.length || patterns.length > 64 || patterns.some(p => !/^[A-Za-z_*?][A-Za-z0-9_.*?-]{0,127}$/.test(p))) {
|
|
62
|
+
throw new io_1.UserError('Supply 1–64 environment key patterns using letters, digits, _, ., -, * and ?.');
|
|
63
|
+
}
|
|
64
|
+
return patterns;
|
|
65
|
+
}
|
|
66
|
+
class WatchSet {
|
|
67
|
+
patterns;
|
|
68
|
+
insensitive;
|
|
69
|
+
regex;
|
|
70
|
+
constructor(patterns, insensitive) {
|
|
71
|
+
this.patterns = patterns;
|
|
72
|
+
this.insensitive = insensitive;
|
|
73
|
+
this.regex = patterns.map(p => globToRegex(p, insensitive));
|
|
74
|
+
}
|
|
75
|
+
canonical(key) { return this.insensitive ? key.toUpperCase() : key; }
|
|
76
|
+
matches(key) {
|
|
77
|
+
return typeof key === 'string' && key.length <= 128 && !key.toUpperCase().startsWith('__CONFIGTRACE_') && this.regex.some(r => r.test(key));
|
|
78
|
+
}
|
|
79
|
+
exact() { return this.patterns.filter(p => !/[*?]/.test(p)).map(k => this.canonical(k)); }
|
|
80
|
+
}
|
|
81
|
+
exports.WatchSet = WatchSet;
|
|
82
|
+
/** Metadata is minimized, not magically anonymized. Export can remove remaining project names. */
|
|
83
|
+
class PathScrubber {
|
|
84
|
+
root;
|
|
85
|
+
salt;
|
|
86
|
+
constructor(root, salt) {
|
|
87
|
+
this.root = root;
|
|
88
|
+
this.salt = salt;
|
|
89
|
+
}
|
|
90
|
+
scrub(input) {
|
|
91
|
+
let file = input;
|
|
92
|
+
try {
|
|
93
|
+
if (file.startsWith('file://'))
|
|
94
|
+
file = (0, node_url_1.fileURLToPath)(file);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return '<unresolved>';
|
|
98
|
+
}
|
|
99
|
+
file = file.split('?')[0].split('#')[0];
|
|
100
|
+
if (file.startsWith('node:') || file.startsWith('<'))
|
|
101
|
+
return file.slice(0, 256);
|
|
102
|
+
const absolute = node_path_1.default.resolve(this.root, file);
|
|
103
|
+
const relative = node_path_1.default.relative(this.root, absolute);
|
|
104
|
+
if (relative && !relative.startsWith(`..${node_path_1.default.sep}`) && relative !== '..' && !node_path_1.default.isAbsolute(relative)) {
|
|
105
|
+
return relative.split(node_path_1.default.sep).join('/').slice(0, 512);
|
|
106
|
+
}
|
|
107
|
+
if (!relative)
|
|
108
|
+
return '.';
|
|
109
|
+
return `<external:${(0, node_crypto_1.createHmac)('sha256', this.salt).update(absolute).digest('hex').slice(0, 12)}>`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.PathScrubber = PathScrubber;
|
|
113
|
+
//# sourceMappingURL=privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/core/privacy.ts"],"names":[],"mappings":"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"}
|