@pan-sec/notebooklm-mcp 1.4.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 +289 -0
- package/SECURITY.md +539 -0
- package/dist/auth/auth-manager.d.ts +137 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +984 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/mcp-auth.d.ts +102 -0
- package/dist/auth/mcp-auth.d.ts.map +1 -0
- package/dist/auth/mcp-auth.js +286 -0
- package/dist/auth/mcp-auth.js.map +1 -0
- package/dist/config.d.ts +89 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +216 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +70 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +279 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/resources/resource-handlers.d.ts +22 -0
- package/dist/resources/resource-handlers.d.ts.map +1 -0
- package/dist/resources/resource-handlers.js +216 -0
- package/dist/resources/resource-handlers.js.map +1 -0
- package/dist/session/browser-session.d.ts +108 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +621 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +77 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +314 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-timeout.d.ts +122 -0
- package/dist/session/session-timeout.d.ts.map +1 -0
- package/dist/session/session-timeout.js +281 -0
- package/dist/session/session-timeout.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/tools/definitions/ask-question.d.ts +8 -0
- package/dist/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/tools/definitions/ask-question.js +211 -0
- package/dist/tools/definitions/ask-question.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-management.js +243 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -0
- package/dist/tools/definitions/session-management.d.ts +3 -0
- package/dist/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/tools/definitions/session-management.js +41 -0
- package/dist/tools/definitions/session-management.js.map +1 -0
- package/dist/tools/definitions/system.d.ts +3 -0
- package/dist/tools/definitions/system.d.ts.map +1 -0
- package/dist/tools/definitions/system.js +143 -0
- package/dist/tools/definitions/system.js.map +1 -0
- package/dist/tools/definitions.d.ts +12 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +26 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +213 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +813 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/audit-logger.d.ts +140 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +361 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cert-pinning.d.ts +97 -0
- package/dist/utils/cert-pinning.d.ts.map +1 -0
- package/dist/utils/cert-pinning.js +328 -0
- package/dist/utils/cert-pinning.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/cli-handler.d.ts +16 -0
- package/dist/utils/cli-handler.d.ts.map +1 -0
- package/dist/utils/cli-handler.js +102 -0
- package/dist/utils/cli-handler.js.map +1 -0
- package/dist/utils/crypto.d.ts +175 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +612 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +405 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/response-validator.d.ts +98 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js +352 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/secrets-scanner.d.ts +126 -0
- package/dist/utils/secrets-scanner.d.ts.map +1 -0
- package/dist/utils/secrets-scanner.js +443 -0
- package/dist/utils/secrets-scanner.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +130 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +279 -0
- package/dist/utils/secure-memory.js.map +1 -0
- package/dist/utils/security.d.ts +83 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +272 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +37 -0
- package/dist/utils/settings-manager.d.ts.map +1 -0
- package/dist/utils/settings-manager.js +125 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +398 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/dist/utils/tool-validation.d.ts +93 -0
- package/dist/utils/tool-validation.d.ts.map +1 -0
- package/dist/utils/tool-validation.js +277 -0
- package/dist/utils/tool-validation.js.map +1 -0
- package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
- package/docs/configuration.md +94 -0
- package/docs/tools.md +34 -0
- package/docs/troubleshooting.md +59 -0
- package/docs/usage-guide.md +245 -0
- package/package.json +82 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logger for NotebookLM MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive audit logging with:
|
|
5
|
+
* - Tool invocation logging
|
|
6
|
+
* - Authentication event logging
|
|
7
|
+
* - Session lifecycle logging
|
|
8
|
+
* - Security event logging
|
|
9
|
+
* - Tamper detection via hash chaining
|
|
10
|
+
* - Log rotation and retention
|
|
11
|
+
*
|
|
12
|
+
* Added by Pantheon Security for hardened fork.
|
|
13
|
+
*/
|
|
14
|
+
import fs from "fs";
|
|
15
|
+
import path from "path";
|
|
16
|
+
import crypto from "crypto";
|
|
17
|
+
import { CONFIG } from "../config.js";
|
|
18
|
+
import { sanitizeForLogging } from "./security.js";
|
|
19
|
+
/**
|
|
20
|
+
* Get audit configuration from environment
|
|
21
|
+
*/
|
|
22
|
+
function getAuditConfig() {
|
|
23
|
+
return {
|
|
24
|
+
enabled: process.env.NLMCP_AUDIT_ENABLED !== "false",
|
|
25
|
+
logDir: process.env.NLMCP_AUDIT_DIR || path.join(CONFIG.dataDir, "audit"),
|
|
26
|
+
retentionDays: parseInt(process.env.NLMCP_AUDIT_RETENTION_DAYS || "30", 10),
|
|
27
|
+
includeDetails: process.env.NLMCP_AUDIT_INCLUDE_DETAILS !== "false",
|
|
28
|
+
hashChainEnabled: process.env.NLMCP_AUDIT_HASH_CHAIN !== "false",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Audit Logger Class
|
|
33
|
+
*
|
|
34
|
+
* Thread-safe audit logging with hash chain integrity verification.
|
|
35
|
+
*/
|
|
36
|
+
export class AuditLogger {
|
|
37
|
+
config;
|
|
38
|
+
currentLogFile = "";
|
|
39
|
+
previousHash = "GENESIS";
|
|
40
|
+
writeQueue = [];
|
|
41
|
+
isWriting = false;
|
|
42
|
+
stats = {
|
|
43
|
+
totalEvents: 0,
|
|
44
|
+
toolEvents: 0,
|
|
45
|
+
authEvents: 0,
|
|
46
|
+
sessionEvents: 0,
|
|
47
|
+
securityEvents: 0,
|
|
48
|
+
systemEvents: 0,
|
|
49
|
+
};
|
|
50
|
+
constructor(config) {
|
|
51
|
+
this.config = { ...getAuditConfig(), ...config };
|
|
52
|
+
if (this.config.enabled) {
|
|
53
|
+
this.ensureLogDirectory();
|
|
54
|
+
this.initializeLogFile();
|
|
55
|
+
this.cleanOldLogs();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Ensure audit log directory exists
|
|
60
|
+
*/
|
|
61
|
+
ensureLogDirectory() {
|
|
62
|
+
if (!fs.existsSync(this.config.logDir)) {
|
|
63
|
+
fs.mkdirSync(this.config.logDir, { recursive: true, mode: 0o700 });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Initialize log file for today
|
|
68
|
+
*/
|
|
69
|
+
initializeLogFile() {
|
|
70
|
+
const today = new Date().toISOString().split("T")[0];
|
|
71
|
+
this.currentLogFile = path.join(this.config.logDir, `audit-${today}.jsonl`);
|
|
72
|
+
// Read last hash from existing file if present
|
|
73
|
+
if (fs.existsSync(this.currentLogFile)) {
|
|
74
|
+
try {
|
|
75
|
+
const content = fs.readFileSync(this.currentLogFile, "utf-8");
|
|
76
|
+
const lines = content.trim().split("\n").filter(l => l.length > 0);
|
|
77
|
+
if (lines.length > 0) {
|
|
78
|
+
const lastEvent = JSON.parse(lines[lines.length - 1]);
|
|
79
|
+
this.previousHash = lastEvent.hash;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Start fresh if file is corrupted
|
|
84
|
+
this.previousHash = "GENESIS";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clean up old log files based on retention policy
|
|
90
|
+
*/
|
|
91
|
+
cleanOldLogs() {
|
|
92
|
+
try {
|
|
93
|
+
const files = fs.readdirSync(this.config.logDir);
|
|
94
|
+
const cutoffDate = new Date();
|
|
95
|
+
cutoffDate.setDate(cutoffDate.getDate() - this.config.retentionDays);
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
if (!file.startsWith("audit-") || !file.endsWith(".jsonl"))
|
|
98
|
+
continue;
|
|
99
|
+
// Extract date from filename (audit-YYYY-MM-DD.jsonl)
|
|
100
|
+
const dateStr = file.slice(6, 16);
|
|
101
|
+
const fileDate = new Date(dateStr);
|
|
102
|
+
if (fileDate < cutoffDate) {
|
|
103
|
+
fs.unlinkSync(path.join(this.config.logDir, file));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Ignore cleanup errors
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Compute hash for an event (includes previous hash for chaining)
|
|
113
|
+
*/
|
|
114
|
+
computeHash(event) {
|
|
115
|
+
const data = JSON.stringify({
|
|
116
|
+
timestamp: event.timestamp,
|
|
117
|
+
eventType: event.eventType,
|
|
118
|
+
eventName: event.eventName,
|
|
119
|
+
success: event.success,
|
|
120
|
+
duration_ms: event.duration_ms,
|
|
121
|
+
details: event.details,
|
|
122
|
+
previousHash: event.previousHash,
|
|
123
|
+
});
|
|
124
|
+
return crypto.createHash("sha256").update(data).digest("hex").slice(0, 16);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Sanitize details object for logging (remove sensitive data)
|
|
128
|
+
*/
|
|
129
|
+
sanitizeDetails(details) {
|
|
130
|
+
const sanitized = {};
|
|
131
|
+
for (const [key, value] of Object.entries(details)) {
|
|
132
|
+
// Skip sensitive keys entirely
|
|
133
|
+
if (/password|secret|token|key|credential|auth/i.test(key)) {
|
|
134
|
+
sanitized[key] = "[REDACTED]";
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// Sanitize string values
|
|
138
|
+
if (typeof value === "string") {
|
|
139
|
+
sanitized[key] = sanitizeForLogging(value);
|
|
140
|
+
}
|
|
141
|
+
else if (typeof value === "object" && value !== null) {
|
|
142
|
+
// Recursively sanitize objects
|
|
143
|
+
sanitized[key] = this.sanitizeDetails(value);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
sanitized[key] = value;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return sanitized;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Write event to log file
|
|
153
|
+
*/
|
|
154
|
+
async writeEvent(event) {
|
|
155
|
+
this.writeQueue.push(event);
|
|
156
|
+
if (this.isWriting)
|
|
157
|
+
return;
|
|
158
|
+
this.isWriting = true;
|
|
159
|
+
try {
|
|
160
|
+
while (this.writeQueue.length > 0) {
|
|
161
|
+
const batch = this.writeQueue.splice(0, 100); // Write up to 100 events at once
|
|
162
|
+
const lines = batch.map(e => JSON.stringify(e)).join("\n") + "\n";
|
|
163
|
+
// Check if we need to rotate to new day's file
|
|
164
|
+
const today = new Date().toISOString().split("T")[0];
|
|
165
|
+
const expectedFile = path.join(this.config.logDir, `audit-${today}.jsonl`);
|
|
166
|
+
if (this.currentLogFile !== expectedFile) {
|
|
167
|
+
this.currentLogFile = expectedFile;
|
|
168
|
+
}
|
|
169
|
+
fs.appendFileSync(this.currentLogFile, lines, { mode: 0o600 });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
this.isWriting = false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Log a generic event
|
|
178
|
+
*/
|
|
179
|
+
async log(eventType, eventName, success, details = {}, duration_ms) {
|
|
180
|
+
if (!this.config.enabled)
|
|
181
|
+
return;
|
|
182
|
+
// Update stats
|
|
183
|
+
this.stats.totalEvents++;
|
|
184
|
+
this.stats[`${eventType}Events`]++;
|
|
185
|
+
const sanitizedDetails = this.config.includeDetails
|
|
186
|
+
? this.sanitizeDetails(details)
|
|
187
|
+
: {};
|
|
188
|
+
const eventWithoutHash = {
|
|
189
|
+
timestamp: new Date().toISOString(),
|
|
190
|
+
eventType,
|
|
191
|
+
eventName,
|
|
192
|
+
success,
|
|
193
|
+
duration_ms,
|
|
194
|
+
details: sanitizedDetails,
|
|
195
|
+
previousHash: this.config.hashChainEnabled ? this.previousHash : "",
|
|
196
|
+
};
|
|
197
|
+
const hash = this.config.hashChainEnabled
|
|
198
|
+
? this.computeHash(eventWithoutHash)
|
|
199
|
+
: "";
|
|
200
|
+
const event = {
|
|
201
|
+
...eventWithoutHash,
|
|
202
|
+
hash,
|
|
203
|
+
};
|
|
204
|
+
if (this.config.hashChainEnabled) {
|
|
205
|
+
this.previousHash = hash;
|
|
206
|
+
}
|
|
207
|
+
await this.writeEvent(event);
|
|
208
|
+
}
|
|
209
|
+
// ============================================================================
|
|
210
|
+
// Public Logging Methods
|
|
211
|
+
// ============================================================================
|
|
212
|
+
/**
|
|
213
|
+
* Log a tool invocation
|
|
214
|
+
*/
|
|
215
|
+
async logToolCall(toolName, args, success, duration_ms, error) {
|
|
216
|
+
await this.log("tool", toolName, success, {
|
|
217
|
+
args_summary: this.summarizeArgs(args),
|
|
218
|
+
error: error ? sanitizeForLogging(error) : undefined,
|
|
219
|
+
}, duration_ms);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Log an authentication event
|
|
223
|
+
*/
|
|
224
|
+
async logAuthEvent(eventName, success, details = {}) {
|
|
225
|
+
await this.log("auth", eventName, success, details);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Log a session lifecycle event
|
|
229
|
+
*/
|
|
230
|
+
async logSessionEvent(eventName, sessionId, details = {}) {
|
|
231
|
+
await this.log("session", eventName, true, {
|
|
232
|
+
session_id: sessionId,
|
|
233
|
+
...details,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Log a security event
|
|
238
|
+
*/
|
|
239
|
+
async logSecurityEvent(eventName, severity, details = {}) {
|
|
240
|
+
const success = severity === "info";
|
|
241
|
+
await this.log("security", eventName, success, {
|
|
242
|
+
severity,
|
|
243
|
+
...details,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Log a system event
|
|
248
|
+
*/
|
|
249
|
+
async logSystemEvent(eventName, details = {}) {
|
|
250
|
+
await this.log("system", eventName, true, details);
|
|
251
|
+
}
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// Helper Methods
|
|
254
|
+
// ============================================================================
|
|
255
|
+
/**
|
|
256
|
+
* Summarize tool arguments (avoid logging full content)
|
|
257
|
+
*/
|
|
258
|
+
summarizeArgs(args) {
|
|
259
|
+
const summary = {};
|
|
260
|
+
for (const [key, value] of Object.entries(args)) {
|
|
261
|
+
if (typeof value === "string") {
|
|
262
|
+
// Log length for long strings, actual value for short ones
|
|
263
|
+
if (value.length > 100) {
|
|
264
|
+
summary[key] = `[string, ${value.length} chars]`;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
summary[key] = sanitizeForLogging(value);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if (Array.isArray(value)) {
|
|
271
|
+
summary[key] = `[array, ${value.length} items]`;
|
|
272
|
+
}
|
|
273
|
+
else if (typeof value === "object" && value !== null) {
|
|
274
|
+
summary[key] = `[object]`;
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
summary[key] = value;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return summary;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Get audit statistics
|
|
284
|
+
*/
|
|
285
|
+
getStats() {
|
|
286
|
+
return { ...this.stats };
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Verify integrity of audit log file
|
|
290
|
+
*/
|
|
291
|
+
async verifyIntegrity(logFile) {
|
|
292
|
+
const file = logFile || this.currentLogFile;
|
|
293
|
+
const errors = [];
|
|
294
|
+
if (!fs.existsSync(file)) {
|
|
295
|
+
return { valid: false, errors: ["Log file does not exist"] };
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
const content = fs.readFileSync(file, "utf-8");
|
|
299
|
+
const lines = content.trim().split("\n").filter(l => l.length > 0);
|
|
300
|
+
let expectedPreviousHash = "GENESIS";
|
|
301
|
+
for (let i = 0; i < lines.length; i++) {
|
|
302
|
+
try {
|
|
303
|
+
const event = JSON.parse(lines[i]);
|
|
304
|
+
// Verify hash chain
|
|
305
|
+
if (this.config.hashChainEnabled) {
|
|
306
|
+
if (event.previousHash !== expectedPreviousHash) {
|
|
307
|
+
errors.push(`Line ${i + 1}: Hash chain broken. Expected previous hash ${expectedPreviousHash}, got ${event.previousHash}`);
|
|
308
|
+
}
|
|
309
|
+
// Recompute hash to verify
|
|
310
|
+
const { hash, ...eventWithoutHash } = event;
|
|
311
|
+
const computedHash = this.computeHash(eventWithoutHash);
|
|
312
|
+
if (computedHash !== hash) {
|
|
313
|
+
errors.push(`Line ${i + 1}: Hash mismatch. Event may have been tampered.`);
|
|
314
|
+
}
|
|
315
|
+
expectedPreviousHash = event.hash;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
errors.push(`Line ${i + 1}: Invalid JSON`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return { valid: errors.length === 0, errors };
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
return { valid: false, errors: [`Failed to read log file: ${e}`] };
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Force flush any pending writes
|
|
330
|
+
*/
|
|
331
|
+
async flush() {
|
|
332
|
+
// Wait for any pending writes to complete
|
|
333
|
+
while (this.isWriting || this.writeQueue.length > 0) {
|
|
334
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Global audit logger instance
|
|
340
|
+
*/
|
|
341
|
+
let globalAuditLogger = null;
|
|
342
|
+
/**
|
|
343
|
+
* Get or create the global audit logger
|
|
344
|
+
*/
|
|
345
|
+
export function getAuditLogger() {
|
|
346
|
+
if (!globalAuditLogger) {
|
|
347
|
+
globalAuditLogger = new AuditLogger();
|
|
348
|
+
}
|
|
349
|
+
return globalAuditLogger;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Convenience functions for quick logging
|
|
353
|
+
*/
|
|
354
|
+
export const audit = {
|
|
355
|
+
tool: (name, args, success, duration_ms, error) => getAuditLogger().logToolCall(name, args, success, duration_ms, error),
|
|
356
|
+
auth: (event, success, details) => getAuditLogger().logAuthEvent(event, success, details),
|
|
357
|
+
session: (event, sessionId, details) => getAuditLogger().logSessionEvent(event, sessionId, details),
|
|
358
|
+
security: (event, severity, details) => getAuditLogger().logSecurityEvent(event, severity, details),
|
|
359
|
+
system: (event, details) => getAuditLogger().logSystemEvent(event, details),
|
|
360
|
+
};
|
|
361
|
+
//# sourceMappingURL=audit-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../../src/utils/audit-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Certificate Pinning for NotebookLM MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides certificate pinning for HTTPS connections:
|
|
5
|
+
* - Pin Google's root CA certificates
|
|
6
|
+
* - Detect MITM attacks
|
|
7
|
+
* - Validate certificate chains
|
|
8
|
+
*
|
|
9
|
+
* Why this matters:
|
|
10
|
+
* - Prevents man-in-the-middle attacks
|
|
11
|
+
* - Protects against rogue CA certificates
|
|
12
|
+
* - Ensures only Google's real servers are trusted
|
|
13
|
+
*
|
|
14
|
+
* Added by Pantheon Security for hardened fork.
|
|
15
|
+
*/
|
|
16
|
+
import https from "https";
|
|
17
|
+
import tls from "tls";
|
|
18
|
+
/**
|
|
19
|
+
* Configuration for certificate pinning
|
|
20
|
+
*/
|
|
21
|
+
export interface CertPinningConfig {
|
|
22
|
+
/** Enable certificate pinning (default: true) */
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
/** Allow connections to fail open if pinning fails (default: false for security) */
|
|
25
|
+
failOpen: boolean;
|
|
26
|
+
/** Report-only mode - log but don't block (default: false) */
|
|
27
|
+
reportOnly: boolean;
|
|
28
|
+
/** Additional pinned certificates (SPKI hashes) */
|
|
29
|
+
additionalPins: Record<string, string[]>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calculate SPKI hash for a certificate
|
|
33
|
+
*/
|
|
34
|
+
export declare function calculateSPKIHash(cert: tls.PeerCertificate): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get all SPKI hashes from a certificate chain
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCertificateChainHashes(socket: tls.TLSSocket): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Validate a certificate chain against pinned certificates
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateCertificatePin(hostname: string, chainHashes: string[], config?: CertPinningConfig): {
|
|
43
|
+
valid: boolean;
|
|
44
|
+
matchedPin?: string;
|
|
45
|
+
error?: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Certificate Pinning Manager
|
|
49
|
+
*/
|
|
50
|
+
export declare class CertificatePinningManager {
|
|
51
|
+
private config;
|
|
52
|
+
private violationCount;
|
|
53
|
+
private lastViolation?;
|
|
54
|
+
constructor(config?: Partial<CertPinningConfig>);
|
|
55
|
+
/**
|
|
56
|
+
* Check if pinning is enabled
|
|
57
|
+
*/
|
|
58
|
+
isEnabled(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Validate a TLS connection
|
|
61
|
+
*/
|
|
62
|
+
validateConnection(socket: tls.TLSSocket, hostname: string): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Create an HTTPS agent with certificate pinning
|
|
65
|
+
*/
|
|
66
|
+
createPinnedAgent(_hostname: string): https.Agent;
|
|
67
|
+
/**
|
|
68
|
+
* Get violation statistics
|
|
69
|
+
*/
|
|
70
|
+
getStats(): {
|
|
71
|
+
enabled: boolean;
|
|
72
|
+
reportOnly: boolean;
|
|
73
|
+
violationCount: number;
|
|
74
|
+
lastViolation?: {
|
|
75
|
+
hostname: string;
|
|
76
|
+
timestamp: Date;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Update configuration
|
|
81
|
+
*/
|
|
82
|
+
updateConfig(config: Partial<CertPinningConfig>): void;
|
|
83
|
+
/**
|
|
84
|
+
* Add a custom pin for a hostname
|
|
85
|
+
*/
|
|
86
|
+
addPin(hostname: string, spkiHash: string): void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get or create the global pinning manager
|
|
90
|
+
*/
|
|
91
|
+
export declare function getCertificatePinningManager(): CertificatePinningManager;
|
|
92
|
+
/**
|
|
93
|
+
* Utility to extract and display certificate pins from a hostname
|
|
94
|
+
* Useful for updating pinned certificates
|
|
95
|
+
*/
|
|
96
|
+
export declare function extractCertificatePins(hostname: string): Promise<string[]>;
|
|
97
|
+
//# sourceMappingURL=cert-pinning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-pinning.d.ts","sourceRoot":"","sources":["../../src/utils/cert-pinning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAmDtB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,QAAQ,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC1C;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,eAAe,GAAG,MAAM,CAUnE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,CA8BzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,GAAE,iBAAsC,GAC7C;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0BzD;AA8BD;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,aAAa,CAAC,CAIpB;gBAEU,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAI/C;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+CnF;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,KAAK;IA8BjD;;OAEG;IACH,QAAQ,IAAI;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE;YACd,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,IAAI,CAAC;SACjB,CAAC;KACH;IAcD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAQjD;AAOD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,yBAAyB,CAKxE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BhF"}
|