@secfn/core 0.0.1 → 0.0.2

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.
Files changed (100) hide show
  1. package/README.md +30 -322
  2. package/dist/encryption.d.ts +8 -0
  3. package/dist/encryption.d.ts.map +1 -0
  4. package/dist/encryption.js +76 -0
  5. package/dist/encryption.js.map +1 -0
  6. package/dist/errors.d.ts +24 -0
  7. package/dist/errors.d.ts.map +1 -0
  8. package/dist/errors.js +47 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/id.d.ts +3 -0
  11. package/dist/id.d.ts.map +1 -0
  12. package/dist/id.js +11 -0
  13. package/dist/id.js.map +1 -0
  14. package/dist/index.d.ts +9 -11
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +9 -11
  17. package/dist/index.js.map +1 -1
  18. package/dist/scanner/reporters.d.ts +14 -0
  19. package/dist/scanner/reporters.d.ts.map +1 -0
  20. package/dist/scanner/reporters.js +85 -0
  21. package/dist/scanner/reporters.js.map +1 -0
  22. package/dist/scanner/rules.d.ts +24 -0
  23. package/dist/scanner/rules.d.ts.map +1 -0
  24. package/dist/scanner/rules.js +141 -0
  25. package/dist/scanner/rules.js.map +1 -0
  26. package/dist/scanner/scanner.d.ts +25 -0
  27. package/dist/scanner/scanner.d.ts.map +1 -0
  28. package/dist/scanner/scanner.js +73 -0
  29. package/dist/scanner/scanner.js.map +1 -0
  30. package/dist/scanner/utils.d.ts +15 -0
  31. package/dist/scanner/utils.d.ts.map +1 -0
  32. package/dist/scanner/utils.js +40 -0
  33. package/dist/scanner/utils.js.map +1 -0
  34. package/dist/schema.d.ts +9 -0
  35. package/dist/schema.d.ts.map +1 -0
  36. package/dist/schema.js +246 -0
  37. package/dist/schema.js.map +1 -0
  38. package/dist/types.d.ts +258 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +29 -26
  43. package/dist/access-control/rbac.d.ts +0 -48
  44. package/dist/access-control/rbac.d.ts.map +0 -1
  45. package/dist/access-control/rbac.js +0 -203
  46. package/dist/access-control/rbac.js.map +0 -1
  47. package/dist/core/secfn.d.ts +0 -28
  48. package/dist/core/secfn.d.ts.map +0 -1
  49. package/dist/core/secfn.js +0 -73
  50. package/dist/core/secfn.js.map +0 -1
  51. package/dist/monitoring/security-monitor.d.ts +0 -46
  52. package/dist/monitoring/security-monitor.d.ts.map +0 -1
  53. package/dist/monitoring/security-monitor.js +0 -172
  54. package/dist/monitoring/security-monitor.js.map +0 -1
  55. package/dist/rate-limiting/rate-limiter.d.ts +0 -31
  56. package/dist/rate-limiting/rate-limiter.d.ts.map +0 -1
  57. package/dist/rate-limiting/rate-limiter.js +0 -140
  58. package/dist/rate-limiting/rate-limiter.js.map +0 -1
  59. package/dist/scanning/patterns.d.ts +0 -3
  60. package/dist/scanning/patterns.d.ts.map +0 -1
  61. package/dist/scanning/patterns.js +0 -139
  62. package/dist/scanning/patterns.js.map +0 -1
  63. package/dist/scanning/scanner.d.ts +0 -36
  64. package/dist/scanning/scanner.d.ts.map +0 -1
  65. package/dist/scanning/scanner.js +0 -152
  66. package/dist/scanning/scanner.js.map +0 -1
  67. package/dist/secrets/encryption.d.ts +0 -17
  68. package/dist/secrets/encryption.d.ts.map +0 -1
  69. package/dist/secrets/encryption.js +0 -47
  70. package/dist/secrets/encryption.js.map +0 -1
  71. package/dist/secrets/vault.d.ts +0 -43
  72. package/dist/secrets/vault.d.ts.map +0 -1
  73. package/dist/secrets/vault.js +0 -126
  74. package/dist/secrets/vault.js.map +0 -1
  75. package/dist/storage/indexeddb-storage.d.ts +0 -37
  76. package/dist/storage/indexeddb-storage.d.ts.map +0 -1
  77. package/dist/storage/indexeddb-storage.js +0 -284
  78. package/dist/storage/indexeddb-storage.js.map +0 -1
  79. package/dist/types/index.d.ts +0 -189
  80. package/dist/types/index.d.ts.map +0 -1
  81. package/dist/types/index.js +0 -2
  82. package/dist/types/index.js.map +0 -1
  83. package/dist/utils/helpers.d.ts +0 -8
  84. package/dist/utils/helpers.d.ts.map +0 -1
  85. package/dist/utils/helpers.js +0 -73
  86. package/dist/utils/helpers.js.map +0 -1
  87. package/examples/basic-usage.ts +0 -143
  88. package/src/access-control/rbac.ts +0 -271
  89. package/src/core/secfn.ts +0 -90
  90. package/src/index.ts +0 -27
  91. package/src/monitoring/security-monitor.ts +0 -245
  92. package/src/rate-limiting/rate-limiter.ts +0 -181
  93. package/src/scanning/patterns.ts +0 -140
  94. package/src/scanning/scanner.ts +0 -199
  95. package/src/secrets/encryption.ts +0 -74
  96. package/src/secrets/vault.ts +0 -187
  97. package/src/storage/indexeddb-storage.ts +0 -355
  98. package/src/types/index.ts +0 -213
  99. package/src/utils/helpers.ts +0 -84
  100. package/tsconfig.json +0 -26
@@ -1,140 +0,0 @@
1
- import { generateId } from '../utils/helpers.js';
2
- export class RateLimiter {
3
- storage;
4
- rules;
5
- onLimitExceeded;
6
- constructor(config) {
7
- this.storage = config.storage;
8
- this.rules = config.rules;
9
- this.onLimitExceeded = config.onLimitExceeded;
10
- }
11
- async check(request) {
12
- const checks = [];
13
- if (this.rules.global) {
14
- checks.push({
15
- key: 'global',
16
- rule: this.rules.global,
17
- });
18
- }
19
- if (this.rules.perUser && request.userId) {
20
- checks.push({
21
- key: `user:${request.userId}`,
22
- rule: this.rules.perUser,
23
- });
24
- }
25
- if (this.rules.perIP) {
26
- checks.push({
27
- key: `ip:${request.ip}`,
28
- rule: this.rules.perIP,
29
- });
30
- }
31
- if (this.rules.perEndpoint && request.endpoint) {
32
- const endpointRule = this.rules.perEndpoint[request.endpoint];
33
- if (endpointRule) {
34
- checks.push({
35
- key: `endpoint:${request.endpoint}:${request.ip}`,
36
- rule: endpointRule,
37
- });
38
- }
39
- }
40
- for (const check of checks) {
41
- const result = await this.checkLimit(check.key, check.rule);
42
- if (!result.allowed) {
43
- await this.handleViolation({
44
- id: generateId('violation'),
45
- timestamp: Date.now(),
46
- key: check.key,
47
- ip: request.ip,
48
- userId: request.userId,
49
- endpoint: request.endpoint || 'unknown',
50
- requestCount: result.limit || 0,
51
- limit: check.rule.requests,
52
- window: check.rule.window,
53
- blocked: true,
54
- });
55
- return result;
56
- }
57
- }
58
- return {
59
- allowed: true,
60
- remaining: checks.length > 0 ? checks[0].rule.requests : 0,
61
- resetAt: Date.now() + (checks.length > 0 ? checks[0].rule.window : 0),
62
- };
63
- }
64
- async checkLimit(key, rule) {
65
- const now = Date.now();
66
- const entry = await this.storage.getRateLimitEntry(key);
67
- if (!entry || now >= entry.resetAt) {
68
- const newEntry = {
69
- key,
70
- count: 1,
71
- resetAt: now + rule.window,
72
- blocked: false,
73
- };
74
- await this.storage.setRateLimitEntry(newEntry);
75
- return {
76
- allowed: true,
77
- remaining: rule.requests - 1,
78
- resetAt: newEntry.resetAt,
79
- limit: rule.requests,
80
- };
81
- }
82
- if (entry.blocked && entry.blockedUntil && now < entry.blockedUntil) {
83
- return {
84
- allowed: false,
85
- remaining: 0,
86
- resetAt: entry.resetAt,
87
- retryAfter: entry.blockedUntil - now,
88
- limit: rule.requests,
89
- };
90
- }
91
- if (entry.count >= rule.requests) {
92
- entry.blocked = true;
93
- entry.blockedUntil = now + (rule.blockDuration || rule.window);
94
- await this.storage.setRateLimitEntry(entry);
95
- return {
96
- allowed: false,
97
- remaining: 0,
98
- resetAt: entry.resetAt,
99
- retryAfter: entry.blockedUntil - now,
100
- limit: rule.requests,
101
- };
102
- }
103
- entry.count++;
104
- await this.storage.setRateLimitEntry(entry);
105
- return {
106
- allowed: true,
107
- remaining: rule.requests - entry.count,
108
- resetAt: entry.resetAt,
109
- limit: rule.requests,
110
- };
111
- }
112
- async handleViolation(violation) {
113
- if (this.onLimitExceeded) {
114
- try {
115
- await this.onLimitExceeded(violation);
116
- }
117
- catch (error) {
118
- console.error('[SecFn] Error in rate limit violation handler:', error);
119
- }
120
- }
121
- }
122
- async reset(key) {
123
- await this.storage.deleteRateLimitEntry(key);
124
- }
125
- async resetUser(userId) {
126
- await this.reset(`user:${userId}`);
127
- }
128
- async resetIP(ip) {
129
- await this.reset(`ip:${ip}`);
130
- }
131
- async unblock(key) {
132
- const entry = await this.storage.getRateLimitEntry(key);
133
- if (entry) {
134
- entry.blocked = false;
135
- entry.blockedUntil = undefined;
136
- await this.storage.setRateLimitEntry(entry);
137
- }
138
- }
139
- }
140
- //# sourceMappingURL=rate-limiter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/rate-limiting/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { SecretPattern } from '../types/index.js';
2
- export declare const DEFAULT_PATTERNS: SecretPattern[];
3
- //# sourceMappingURL=patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/scanning/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAyI3C,CAAC"}
@@ -1,139 +0,0 @@
1
- export const DEFAULT_PATTERNS = [
2
- {
3
- name: 'AWS Access Key',
4
- pattern: /AKIA[0-9A-Z]{16}/g,
5
- entropy: 4.5,
6
- description: 'AWS Access Key ID',
7
- severity: 'critical',
8
- },
9
- {
10
- name: 'AWS Secret Key',
11
- pattern: /aws[_-]?secret[_-]?access[_-]?key[=:\s]+['"]?([a-zA-Z0-9/+=]{40})['"]?/gi,
12
- entropy: 5.0,
13
- description: 'AWS Secret Access Key',
14
- severity: 'critical',
15
- },
16
- {
17
- name: 'Generic API Key',
18
- pattern: /api[_-]?key[_-]?[=:]\s*['"]?([a-zA-Z0-9]{32,})['"]?/gi,
19
- entropy: 4.0,
20
- description: 'Generic API key pattern',
21
- severity: 'high',
22
- },
23
- {
24
- name: 'Private Key',
25
- pattern: /-----BEGIN (RSA|OPENSSH|DSA|EC|PGP) PRIVATE KEY-----/g,
26
- description: 'Private cryptographic key',
27
- severity: 'critical',
28
- },
29
- {
30
- name: 'JWT Token',
31
- pattern: /eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g,
32
- description: 'JSON Web Token',
33
- severity: 'high',
34
- },
35
- {
36
- name: 'GitHub Token',
37
- pattern: /ghp_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/g,
38
- entropy: 4.5,
39
- description: 'GitHub Personal Access Token',
40
- severity: 'critical',
41
- },
42
- {
43
- name: 'Stripe API Key',
44
- pattern: /sk_live_[a-zA-Z0-9]{24,}|rk_live_[a-zA-Z0-9]{24,}/g,
45
- entropy: 4.5,
46
- description: 'Stripe API Key',
47
- severity: 'critical',
48
- },
49
- {
50
- name: 'Google API Key',
51
- pattern: /AIza[0-9A-Za-z_-]{35}/g,
52
- entropy: 4.5,
53
- description: 'Google API Key',
54
- severity: 'high',
55
- },
56
- {
57
- name: 'Slack Token',
58
- pattern: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24,}/g,
59
- entropy: 4.5,
60
- description: 'Slack API Token',
61
- severity: 'high',
62
- },
63
- {
64
- name: 'OpenAI API Key',
65
- pattern: /sk-[a-zA-Z0-9]{48}/g,
66
- entropy: 4.5,
67
- description: 'OpenAI API Key',
68
- severity: 'critical',
69
- },
70
- {
71
- name: 'Anthropic API Key',
72
- pattern: /sk-ant-[a-zA-Z0-9_-]{95,}/g,
73
- entropy: 4.5,
74
- description: 'Anthropic API Key',
75
- severity: 'critical',
76
- },
77
- {
78
- name: 'Database Connection String',
79
- pattern: /(postgres|mysql|mongodb):\/\/[^\s'"<>]+:[^\s'"<>]+@[^\s'"<>]+/gi,
80
- description: 'Database connection string with credentials',
81
- severity: 'critical',
82
- },
83
- {
84
- name: 'Password in Code',
85
- pattern: /(password|passwd|pwd)[=:\s]+['"]([^'"]{8,})['"]/gi,
86
- entropy: 3.5,
87
- description: 'Hardcoded password',
88
- severity: 'high',
89
- },
90
- {
91
- name: 'Bearer Token',
92
- pattern: /Bearer\s+[a-zA-Z0-9_\-\.]{20,}/gi,
93
- entropy: 4.0,
94
- description: 'Bearer authentication token',
95
- severity: 'high',
96
- },
97
- {
98
- name: 'NPM Token',
99
- pattern: /npm_[a-zA-Z0-9]{36}/g,
100
- entropy: 4.5,
101
- description: 'NPM Access Token',
102
- severity: 'high',
103
- },
104
- {
105
- name: 'Twilio API Key',
106
- pattern: /SK[a-f0-9]{32}/g,
107
- entropy: 4.5,
108
- description: 'Twilio API Key',
109
- severity: 'high',
110
- },
111
- {
112
- name: 'SendGrid API Key',
113
- pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/g,
114
- entropy: 4.5,
115
- description: 'SendGrid API Key',
116
- severity: 'high',
117
- },
118
- {
119
- name: 'Mailgun API Key',
120
- pattern: /key-[a-f0-9]{32}/g,
121
- entropy: 4.0,
122
- description: 'Mailgun API Key',
123
- severity: 'high',
124
- },
125
- {
126
- name: 'Azure Storage Key',
127
- pattern: /DefaultEndpointsProtocol=https;AccountName=[^;]+;AccountKey=[^;]+/gi,
128
- description: 'Azure Storage Connection String',
129
- severity: 'critical',
130
- },
131
- {
132
- name: 'Generic Secret',
133
- pattern: /(secret|token|api[_-]?key|auth[_-]?token)[=:\s]+['"]([a-zA-Z0-9_\-\/.+=]{20,})['"]/gi,
134
- entropy: 3.5,
135
- description: 'Generic secret pattern',
136
- severity: 'medium',
137
- },
138
- ];
139
- //# sourceMappingURL=patterns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/scanning/patterns.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import type { SecretPattern, SecretScanResult } from '../types/index.js';
2
- import type { IndexedDBStorage } from '../storage/indexeddb-storage.js';
3
- export interface SecretScannerConfig {
4
- patterns?: SecretPattern[];
5
- excludePaths?: string[];
6
- minEntropy?: number;
7
- maxFileSize?: number;
8
- storage?: IndexedDBStorage;
9
- }
10
- export interface ScanOptions {
11
- saveResults?: boolean;
12
- }
13
- export interface GitScanOptions {
14
- branch?: string;
15
- commits?: number;
16
- }
17
- export declare class SecretScanner {
18
- private patterns;
19
- private excludePaths;
20
- private minEntropy;
21
- private maxFileSize;
22
- private storage?;
23
- private git;
24
- constructor(config?: SecretScannerConfig);
25
- scanDirectory(dir: string, options?: ScanOptions): Promise<SecretScanResult[]>;
26
- scanFile(filePath: string): Promise<SecretScanResult[]>;
27
- scanContent(content: string, filePath: string): SecretScanResult[];
28
- scanGitHistory(options?: GitScanOptions): Promise<SecretScanResult[]>;
29
- addPattern(pattern: SecretPattern): void;
30
- removePattern(name: string): void;
31
- getPatterns(): SecretPattern[];
32
- private getLineAndColumn;
33
- private getContext;
34
- getScanHistory(limit?: number): Promise<SecretScanResult[]>;
35
- }
36
- //# sourceMappingURL=scanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/scanning/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIxE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAW;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAmB;IACnC,OAAO,CAAC,GAAG,CAAY;gBAEX,MAAM,GAAE,mBAAwB;IAStC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA4BlF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgB7D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IA2C5D,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAoC/E,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAIxC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIjC,WAAW,IAAI,aAAa,EAAE;IAI9B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,UAAU;IAMZ,cAAc,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAM/D"}
@@ -1,152 +0,0 @@
1
- import { readFile } from 'fs/promises';
2
- import { glob } from 'glob';
3
- import simpleGit from 'simple-git';
4
- import { DEFAULT_PATTERNS } from './patterns.js';
5
- import { generateId, calculateEntropy, redactSecret } from '../utils/helpers.js';
6
- export class SecretScanner {
7
- patterns;
8
- excludePaths;
9
- minEntropy;
10
- maxFileSize;
11
- storage;
12
- git;
13
- constructor(config = {}) {
14
- this.patterns = config.patterns || DEFAULT_PATTERNS;
15
- this.excludePaths = config.excludePaths || ['node_modules/**', 'dist/**', 'build/**', '.git/**'];
16
- this.minEntropy = config.minEntropy || 3.0;
17
- this.maxFileSize = config.maxFileSize || 1024 * 1024;
18
- this.storage = config.storage;
19
- this.git = simpleGit();
20
- }
21
- async scanDirectory(dir, options = {}) {
22
- const files = await glob('**/*', {
23
- cwd: dir,
24
- absolute: true,
25
- nodir: true,
26
- ignore: this.excludePaths,
27
- });
28
- const results = [];
29
- for (const file of files) {
30
- try {
31
- const fileResults = await this.scanFile(file);
32
- results.push(...fileResults);
33
- }
34
- catch (error) {
35
- console.error(`[SecFn] Error scanning file ${file}:`, error);
36
- }
37
- }
38
- if (options.saveResults && this.storage) {
39
- for (const result of results) {
40
- await this.storage.saveScanResult(result);
41
- }
42
- }
43
- return results;
44
- }
45
- async scanFile(filePath) {
46
- try {
47
- const content = await readFile(filePath, 'utf-8');
48
- if (content.length > this.maxFileSize) {
49
- console.warn(`[SecFn] Skipping large file: ${filePath}`);
50
- return [];
51
- }
52
- return this.scanContent(content, filePath);
53
- }
54
- catch (error) {
55
- console.error(`[SecFn] Error reading file ${filePath}:`, error);
56
- return [];
57
- }
58
- }
59
- scanContent(content, filePath) {
60
- const results = [];
61
- const lines = content.split('\n');
62
- for (const pattern of this.patterns) {
63
- const matches = content.matchAll(pattern.pattern);
64
- for (const match of matches) {
65
- if (!match[0] || !match.index)
66
- continue;
67
- const matchedSecret = match[1] || match[0];
68
- const entropy = calculateEntropy(matchedSecret);
69
- if (pattern.entropy && entropy < Math.min(pattern.entropy, this.minEntropy)) {
70
- continue;
71
- }
72
- const { line, column } = this.getLineAndColumn(content, match.index);
73
- const context = this.getContext(lines, line);
74
- const result = {
75
- id: generateId('scan'),
76
- timestamp: Date.now(),
77
- file: filePath,
78
- line,
79
- column,
80
- pattern: pattern.name,
81
- match: matchedSecret,
82
- redactedMatch: redactSecret(matchedSecret),
83
- severity: pattern.severity,
84
- entropy,
85
- context,
86
- resolved: false,
87
- falsePositive: false,
88
- };
89
- results.push(result);
90
- }
91
- }
92
- return results;
93
- }
94
- async scanGitHistory(options = {}) {
95
- const branch = options.branch || 'HEAD';
96
- const commitCount = options.commits || 100;
97
- const log = await this.git.log([branch, `-n`, `${commitCount}`]);
98
- const results = [];
99
- for (const commit of log.all) {
100
- try {
101
- const diff = await this.git.show([commit.hash]);
102
- const commitResults = this.scanContent(diff, `commit:${commit.hash.substring(0, 7)}`);
103
- for (const result of commitResults) {
104
- result.metadata = {
105
- commit: commit.hash,
106
- author: commit.author_name,
107
- date: commit.date,
108
- message: commit.message,
109
- };
110
- }
111
- results.push(...commitResults);
112
- }
113
- catch (error) {
114
- console.error(`[SecFn] Error scanning commit ${commit.hash}:`, error);
115
- }
116
- }
117
- if (this.storage) {
118
- for (const result of results) {
119
- await this.storage.saveScanResult(result);
120
- }
121
- }
122
- return results;
123
- }
124
- addPattern(pattern) {
125
- this.patterns.push(pattern);
126
- }
127
- removePattern(name) {
128
- this.patterns = this.patterns.filter(p => p.name !== name);
129
- }
130
- getPatterns() {
131
- return [...this.patterns];
132
- }
133
- getLineAndColumn(content, index) {
134
- const beforeMatch = content.substring(0, index);
135
- const lines = beforeMatch.split('\n');
136
- const line = lines.length;
137
- const column = lines[lines.length - 1].length + 1;
138
- return { line, column };
139
- }
140
- getContext(lines, lineNumber, contextLines = 2) {
141
- const start = Math.max(0, lineNumber - contextLines - 1);
142
- const end = Math.min(lines.length, lineNumber + contextLines);
143
- return lines.slice(start, end).join('\n');
144
- }
145
- async getScanHistory(limit = 100) {
146
- if (!this.storage) {
147
- throw new Error('Storage not configured');
148
- }
149
- return await this.storage.getScanHistory(limit);
150
- }
151
- }
152
- //# sourceMappingURL=scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanning/scanner.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export interface EncryptedData {
2
- iv: string;
3
- encrypted: string;
4
- authTag: string;
5
- }
6
- export declare class SecretEncryption {
7
- private algorithm;
8
- private keyLength;
9
- private ivLength;
10
- private salt;
11
- private iterations;
12
- encrypt(plaintext: string, masterKey: string): Promise<string>;
13
- decrypt(ciphertext: string, masterKey: string): Promise<string>;
14
- private deriveKey;
15
- isEncrypted(value: string): boolean;
16
- }
17
- //# sourceMappingURL=encryption.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/secrets/encryption.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,UAAU,CAAU;IAEtB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkB9D,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBrE,OAAO,CAAC,SAAS;IAUjB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAapC"}
@@ -1,47 +0,0 @@
1
- import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from 'crypto';
2
- export class SecretEncryption {
3
- algorithm = 'aes-256-gcm';
4
- keyLength = 32;
5
- ivLength = 16;
6
- salt = 'secfn-salt-v1';
7
- iterations = 100000;
8
- async encrypt(plaintext, masterKey) {
9
- const key = this.deriveKey(masterKey);
10
- const iv = randomBytes(this.ivLength);
11
- const cipher = createCipheriv(this.algorithm, key, iv);
12
- let encrypted = cipher.update(plaintext, 'utf8', 'hex');
13
- encrypted += cipher.final('hex');
14
- const authTag = cipher.getAuthTag();
15
- const data = {
16
- iv: iv.toString('hex'),
17
- encrypted,
18
- authTag: authTag.toString('hex'),
19
- };
20
- return JSON.stringify(data);
21
- }
22
- async decrypt(ciphertext, masterKey) {
23
- const key = this.deriveKey(masterKey);
24
- const data = JSON.parse(ciphertext);
25
- const decipher = createDecipheriv(this.algorithm, key, Buffer.from(data.iv, 'hex'));
26
- decipher.setAuthTag(Buffer.from(data.authTag, 'hex'));
27
- let decrypted = decipher.update(data.encrypted, 'hex', 'utf8');
28
- decrypted += decipher.final('utf8');
29
- return decrypted;
30
- }
31
- deriveKey(masterKey) {
32
- return pbkdf2Sync(masterKey, this.salt, this.iterations, this.keyLength, 'sha256');
33
- }
34
- isEncrypted(value) {
35
- try {
36
- const parsed = JSON.parse(value);
37
- return (typeof parsed === 'object' &&
38
- 'iv' in parsed &&
39
- 'encrypted' in parsed &&
40
- 'authTag' in parsed);
41
- }
42
- catch {
43
- return false;
44
- }
45
- }
46
- }
47
- //# sourceMappingURL=encryption.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/secrets/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAQnF,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAAG,aAAa,CAAC;IAC1B,SAAS,GAAG,EAAE,CAAC;IACf,QAAQ,GAAG,EAAE,CAAC;IACd,IAAI,GAAG,eAAe,CAAC;IACvB,UAAU,GAAG,MAAM,CAAC;IAE5B,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,SAAiB;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAQ,CAAC;QAE9D,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpC,MAAM,IAAI,GAAkB;YAC1B,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YACtB,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;SACjC,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,SAAiB;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,IAAI,CAAC,SAAS,EACd,GAAG,EACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CACrB,CAAC;QACT,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAEtD,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,SAAS,CAAC,SAAiB;QACjC,OAAO,UAAU,CACf,SAAS,EACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,EACd,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,CACL,OAAO,MAAM,KAAK,QAAQ;gBAC1B,IAAI,IAAI,MAAM;gBACd,WAAW,IAAI,MAAM;gBACrB,SAAS,IAAI,MAAM,CACpB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -1,43 +0,0 @@
1
- import type { Secret, SecretAccess, Environment } from '../types/index.js';
2
- import type { IndexedDBStorage } from '../storage/indexeddb-storage.js';
3
- export interface SecretsVaultConfig {
4
- storage: IndexedDBStorage;
5
- encryption: {
6
- algorithm: 'AES-256-GCM';
7
- masterKey: string;
8
- keyDerivation?: 'PBKDF2' | 'scrypt';
9
- };
10
- rotation?: {
11
- checkInterval: number;
12
- notifyBefore: number;
13
- };
14
- }
15
- export interface SetSecretOptions {
16
- tags?: string[];
17
- environment?: Environment;
18
- expiresAt?: number;
19
- rotateEvery?: number;
20
- createdBy?: string;
21
- }
22
- export declare class SecretsVault {
23
- private storage;
24
- private encryption;
25
- private masterKey;
26
- private rotationInterval?;
27
- constructor(config: SecretsVaultConfig);
28
- set(key: string, value: string, options?: SetSecretOptions): Promise<string>;
29
- get(key: string, userId?: string): Promise<string | null>;
30
- list(filter?: {
31
- environment?: Environment;
32
- tags?: string[];
33
- }): Promise<Array<Omit<Secret, 'value'>>>;
34
- rotate(key: string, newValue: string, userId?: string): Promise<void>;
35
- delete(key: string, userId?: string): Promise<void>;
36
- getAccessLog(key: string, limit?: number): Promise<SecretAccess[]>;
37
- getSecretsNeedingRotation(beforeMs?: number): Promise<Secret[]>;
38
- getExpiredSecrets(): Promise<Secret[]>;
39
- private logAccess;
40
- private startRotationCheck;
41
- stop(): void;
42
- }
43
- //# sourceMappingURL=vault.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/secrets/vault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAIxE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,UAAU,EAAE;QACV,SAAS,EAAE,aAAa,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAiB;gBAE9B,MAAM,EAAE,kBAAkB;IAUhC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BhF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoB3D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAMpG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAU/D,yBAAyB,CAAC,QAAQ,GAAE,MAAgC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAaxF,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAK9B,SAAS;IAYvB,OAAO,CAAC,kBAAkB;IAW1B,IAAI,IAAI,IAAI;CAKb"}