@goodsamsoftware/freshbooks-mcp 1.0.1 → 1.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.
- package/dist/auth/confirmation-store.d.ts +94 -0
- package/dist/auth/confirmation-store.d.ts.map +1 -0
- package/dist/auth/confirmation-store.js +126 -0
- package/dist/auth/confirmation-store.js.map +1 -0
- package/dist/auth/state-store.d.ts +96 -0
- package/dist/auth/state-store.d.ts.map +1 -0
- package/dist/auth/state-store.js +122 -0
- package/dist/auth/state-store.js.map +1 -0
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/config/environment.d.ts +25 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +39 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/errors/error-handler.d.ts.map +1 -1
- package/dist/errors/error-handler.js +18 -5
- package/dist/errors/error-handler.js.map +1 -1
- package/dist/errors/response-formatter.d.ts +3 -2
- package/dist/errors/response-formatter.d.ts.map +1 -1
- package/dist/errors/response-formatter.js +19 -2
- package/dist/errors/response-formatter.js.map +1 -1
- package/dist/server.js +85 -11
- package/dist/server.js.map +1 -1
- package/dist/tools/base-tool.d.ts +2 -2
- package/dist/tools/bill/bill-create.d.ts +4 -4
- package/dist/tools/bill/bill-delete.d.ts +6 -0
- package/dist/tools/bill/bill-delete.d.ts.map +1 -1
- package/dist/tools/bill/bill-list.d.ts +12 -12
- package/dist/tools/bill/bill-single.d.ts +4 -4
- package/dist/tools/bill/schemas.d.ts +28 -22
- package/dist/tools/bill/schemas.d.ts.map +1 -1
- package/dist/tools/bill/schemas.js +2 -0
- package/dist/tools/bill/schemas.js.map +1 -1
- package/dist/tools/bill-payment/billpayment-create.d.ts +4 -4
- package/dist/tools/bill-payment/billpayment-delete.d.ts +6 -0
- package/dist/tools/bill-payment/billpayment-delete.d.ts.map +1 -1
- package/dist/tools/bill-payment/billpayment-list.d.ts +12 -12
- package/dist/tools/bill-payment/billpayment-single.d.ts +4 -4
- package/dist/tools/bill-payment/billpayment-update.d.ts +4 -4
- package/dist/tools/bill-payment/schemas.d.ts +28 -22
- package/dist/tools/bill-payment/schemas.d.ts.map +1 -1
- package/dist/tools/bill-payment/schemas.js +2 -0
- package/dist/tools/bill-payment/schemas.js.map +1 -1
- package/dist/tools/bill-vendor/billvendor-create.d.ts +6 -6
- package/dist/tools/bill-vendor/billvendor-delete.d.ts +6 -0
- package/dist/tools/bill-vendor/billvendor-delete.d.ts.map +1 -1
- package/dist/tools/bill-vendor/billvendor-list.d.ts +14 -14
- package/dist/tools/bill-vendor/billvendor-single.d.ts +4 -4
- package/dist/tools/bill-vendor/billvendor-update.d.ts +6 -6
- package/dist/tools/bill-vendor/schemas.d.ts +34 -28
- package/dist/tools/bill-vendor/schemas.d.ts.map +1 -1
- package/dist/tools/bill-vendor/schemas.js +2 -0
- package/dist/tools/bill-vendor/schemas.js.map +1 -1
- package/dist/tools/callback/callback-create.d.ts +6 -6
- package/dist/tools/callback/callback-delete.d.ts +6 -0
- package/dist/tools/callback/callback-delete.d.ts.map +1 -1
- package/dist/tools/callback/callback-list.d.ts +12 -12
- package/dist/tools/callback/callback-resend-verification.d.ts +4 -4
- package/dist/tools/callback/callback-single.d.ts +4 -4
- package/dist/tools/callback/callback-update.d.ts +6 -6
- package/dist/tools/callback/schemas.d.ts +32 -26
- package/dist/tools/callback/schemas.d.ts.map +1 -1
- package/dist/tools/callback/schemas.js +2 -0
- package/dist/tools/callback/schemas.js.map +1 -1
- package/dist/tools/client/client-create.d.ts +2 -2
- package/dist/tools/client/client-delete.d.ts +8 -2
- package/dist/tools/client/client-delete.d.ts.map +1 -1
- package/dist/tools/client/client-list.d.ts +9 -9
- package/dist/tools/client/client-update.d.ts +2 -2
- package/dist/tools/client/schemas.d.ts +26 -20
- package/dist/tools/client/schemas.d.ts.map +1 -1
- package/dist/tools/client/schemas.js +2 -0
- package/dist/tools/client/schemas.js.map +1 -1
- package/dist/tools/credit-note/creditnote-create.d.ts +10 -10
- package/dist/tools/credit-note/creditnote-delete.d.ts +6 -0
- package/dist/tools/credit-note/creditnote-delete.d.ts.map +1 -1
- package/dist/tools/credit-note/creditnote-list.d.ts +14 -14
- package/dist/tools/credit-note/creditnote-single.d.ts +6 -6
- package/dist/tools/credit-note/creditnote-update.d.ts +10 -10
- package/dist/tools/credit-note/schemas.d.ts +42 -36
- package/dist/tools/credit-note/schemas.d.ts.map +1 -1
- package/dist/tools/credit-note/schemas.js +2 -0
- package/dist/tools/credit-note/schemas.js.map +1 -1
- package/dist/tools/expense/expense-create.d.ts +2 -2
- package/dist/tools/expense/expense-delete.d.ts +6 -0
- package/dist/tools/expense/expense-delete.d.ts.map +1 -1
- package/dist/tools/expense/expense-list.d.ts +8 -8
- package/dist/tools/expense/expense-single.d.ts +2 -2
- package/dist/tools/expense/expense-update.d.ts +2 -2
- package/dist/tools/expense/expense-update.d.ts.map +1 -1
- package/dist/tools/expense/expense-update.js +88 -63
- package/dist/tools/expense/expense-update.js.map +1 -1
- package/dist/tools/expense/schemas.d.ts +18 -12
- package/dist/tools/expense/schemas.d.ts.map +1 -1
- package/dist/tools/expense/schemas.js +2 -0
- package/dist/tools/expense/schemas.js.map +1 -1
- package/dist/tools/expense-category/expensecategory-list.d.ts +4 -4
- package/dist/tools/expense-category/schemas.d.ts +4 -4
- package/dist/tools/invoice/invoice-create.d.ts +10 -10
- package/dist/tools/invoice/invoice-delete.d.ts +6 -0
- package/dist/tools/invoice/invoice-delete.d.ts.map +1 -1
- package/dist/tools/invoice/invoice-list.d.ts +24 -24
- package/dist/tools/invoice/invoice-single.d.ts +10 -10
- package/dist/tools/invoice/invoice-update.d.ts +12 -12
- package/dist/tools/invoice/schemas.d.ts +56 -50
- package/dist/tools/invoice/schemas.d.ts.map +1 -1
- package/dist/tools/invoice/schemas.js +2 -0
- package/dist/tools/invoice/schemas.js.map +1 -1
- package/dist/tools/item/item-create.d.ts +8 -8
- package/dist/tools/item/item-list.d.ts +18 -18
- package/dist/tools/item/item-single.d.ts +6 -6
- package/dist/tools/item/item-update.d.ts +10 -10
- package/dist/tools/item/schemas.d.ts +38 -38
- package/dist/tools/journal-entry/journalentry-create.d.ts +4 -4
- package/dist/tools/journal-entry/schemas.d.ts +8 -8
- package/dist/tools/journal-entry-account/journalentryaccount-list.d.ts +14 -14
- package/dist/tools/journal-entry-account/schemas.d.ts +24 -24
- package/dist/tools/metadata.d.ts +13 -1
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +68 -1
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/other-income/otherincome-create.d.ts +10 -10
- package/dist/tools/other-income/otherincome-delete.d.ts +6 -0
- package/dist/tools/other-income/otherincome-delete.d.ts.map +1 -1
- package/dist/tools/other-income/otherincome-list.d.ts +14 -14
- package/dist/tools/other-income/otherincome-single.d.ts +6 -6
- package/dist/tools/other-income/otherincome-update.d.ts +10 -10
- package/dist/tools/other-income/schemas.d.ts +40 -34
- package/dist/tools/other-income/schemas.d.ts.map +1 -1
- package/dist/tools/other-income/schemas.js +2 -0
- package/dist/tools/other-income/schemas.js.map +1 -1
- package/dist/tools/payment/payment-create.d.ts +2 -2
- package/dist/tools/payment/payment-delete.d.ts +6 -0
- package/dist/tools/payment/payment-delete.d.ts.map +1 -1
- package/dist/tools/payment/payment-list.d.ts +8 -8
- package/dist/tools/payment/payment-single.d.ts +2 -2
- package/dist/tools/payment/payment-update.d.ts +2 -2
- package/dist/tools/payment/schemas.d.ts +18 -12
- package/dist/tools/payment/schemas.d.ts.map +1 -1
- package/dist/tools/payment/schemas.js +3 -1
- package/dist/tools/payment/schemas.js.map +1 -1
- package/dist/tools/project/project-create.d.ts +8 -8
- package/dist/tools/project/project-delete.d.ts +8 -2
- package/dist/tools/project/project-delete.d.ts.map +1 -1
- package/dist/tools/project/project-list.d.ts +21 -21
- package/dist/tools/project/project-single.d.ts +6 -6
- package/dist/tools/project/project-update.d.ts +10 -10
- package/dist/tools/project/schemas.d.ts +52 -46
- package/dist/tools/project/schemas.d.ts.map +1 -1
- package/dist/tools/project/schemas.js +2 -0
- package/dist/tools/project/schemas.js.map +1 -1
- package/dist/tools/service/schemas.d.ts +11 -11
- package/dist/tools/service/service-create.d.ts +2 -2
- package/dist/tools/service/service-list.d.ts +8 -8
- package/dist/tools/task/schemas.d.ts +34 -28
- package/dist/tools/task/schemas.d.ts.map +1 -1
- package/dist/tools/task/schemas.js +2 -0
- package/dist/tools/task/schemas.js.map +1 -1
- package/dist/tools/task/task-create.d.ts +6 -6
- package/dist/tools/task/task-delete.d.ts +6 -0
- package/dist/tools/task/task-delete.d.ts.map +1 -1
- package/dist/tools/task/task-list.d.ts +18 -18
- package/dist/tools/task/task-single.d.ts +4 -4
- package/dist/tools/task/task-update.d.ts +8 -8
- package/dist/tools/time-entry/schemas.d.ts +42 -36
- package/dist/tools/time-entry/schemas.d.ts.map +1 -1
- package/dist/tools/time-entry/schemas.js +2 -0
- package/dist/tools/time-entry/schemas.js.map +1 -1
- package/dist/tools/time-entry/timeentry-create.d.ts +6 -6
- package/dist/tools/time-entry/timeentry-delete.d.ts +8 -2
- package/dist/tools/time-entry/timeentry-delete.d.ts.map +1 -1
- package/dist/tools/time-entry/timeentry-list.d.ts +17 -17
- package/dist/tools/time-entry/timeentry-single.d.ts +4 -4
- package/dist/tools/time-entry/timeentry-update.d.ts +6 -6
- package/dist/tools/timer/schemas.d.ts +30 -24
- package/dist/tools/timer/schemas.d.ts.map +1 -1
- package/dist/tools/timer/schemas.js +2 -0
- package/dist/tools/timer/schemas.js.map +1 -1
- package/dist/tools/timer/timer-current.d.ts +8 -8
- package/dist/tools/timer/timer-discard.d.ts +8 -2
- package/dist/tools/timer/timer-discard.d.ts.map +1 -1
- package/dist/tools/timer/timer-start.d.ts +6 -6
- package/dist/tools/timer/timer-stop.d.ts +4 -4
- package/dist/tools/types.d.ts +16 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/user/schemas.d.ts +14 -14
- package/dist/tools/user/user-me.d.ts +6 -6
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +114 -20
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/sanitizer.d.ts +49 -0
- package/dist/utils/sanitizer.d.ts.map +1 -0
- package/dist/utils/sanitizer.js +163 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation Store
|
|
3
|
+
*
|
|
4
|
+
* Manages confirmation tokens for destructive operations.
|
|
5
|
+
* Implements a two-phase confirmation flow to prevent bypass attacks:
|
|
6
|
+
*
|
|
7
|
+
* 1. First call (no confirmation): Generate unique token, return to client
|
|
8
|
+
* 2. Second call (with token): Validate token, execute if valid
|
|
9
|
+
*
|
|
10
|
+
* Security features:
|
|
11
|
+
* - Cryptographically secure random tokens
|
|
12
|
+
* - One-time use (tokens are consumed on validation)
|
|
13
|
+
* - TTL expiration (default 5 minutes)
|
|
14
|
+
* - Request binding (token tied to specific tool + args hash)
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Confirmation data structure
|
|
18
|
+
*/
|
|
19
|
+
export interface ConfirmationData {
|
|
20
|
+
/** Unique confirmation token */
|
|
21
|
+
token: string;
|
|
22
|
+
/** Tool name that requires confirmation */
|
|
23
|
+
toolName: string;
|
|
24
|
+
/** Hash of the original request arguments (for binding) */
|
|
25
|
+
argsHash: string;
|
|
26
|
+
/** Timestamp when confirmation was created */
|
|
27
|
+
createdAt: number;
|
|
28
|
+
/** Timestamp when confirmation expires */
|
|
29
|
+
expiresAt: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Confirmation store interface
|
|
33
|
+
*/
|
|
34
|
+
export interface ConfirmationStore {
|
|
35
|
+
/**
|
|
36
|
+
* Create a new confirmation token for a destructive operation
|
|
37
|
+
* @param toolName - Tool requiring confirmation
|
|
38
|
+
* @param args - Original request arguments (will be hashed)
|
|
39
|
+
* @param ttlSeconds - Time-to-live in seconds (default 300 = 5 min)
|
|
40
|
+
* @returns Confirmation data with token
|
|
41
|
+
*/
|
|
42
|
+
create(toolName: string, args: unknown, ttlSeconds?: number): Promise<ConfirmationData>;
|
|
43
|
+
/**
|
|
44
|
+
* Validate and consume a confirmation token (one-time use)
|
|
45
|
+
* @param token - Confirmation token to validate
|
|
46
|
+
* @param toolName - Tool name (must match original)
|
|
47
|
+
* @param args - Request arguments (hash must match original)
|
|
48
|
+
* @returns true if valid and consumed, false otherwise
|
|
49
|
+
*/
|
|
50
|
+
consume(token: string, toolName: string, args: unknown): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Clear all expired confirmations (called periodically)
|
|
53
|
+
*/
|
|
54
|
+
clearExpired(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Clear all confirmations (for testing)
|
|
57
|
+
*/
|
|
58
|
+
clear(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* In-memory confirmation store implementation
|
|
62
|
+
*/
|
|
63
|
+
export declare class InMemoryConfirmationStore implements ConfirmationStore {
|
|
64
|
+
private confirmations;
|
|
65
|
+
private cleanupInterval;
|
|
66
|
+
/** Default TTL: 5 minutes */
|
|
67
|
+
private static readonly DEFAULT_TTL_SECONDS;
|
|
68
|
+
/** Token size: 32 bytes = 256 bits of entropy */
|
|
69
|
+
private static readonly TOKEN_BYTES;
|
|
70
|
+
/** Cleanup interval: every 60 seconds */
|
|
71
|
+
private static readonly CLEANUP_INTERVAL_MS;
|
|
72
|
+
constructor();
|
|
73
|
+
/**
|
|
74
|
+
* Generate a secure random confirmation token
|
|
75
|
+
*/
|
|
76
|
+
private generateToken;
|
|
77
|
+
/**
|
|
78
|
+
* Hash the request arguments for binding
|
|
79
|
+
*/
|
|
80
|
+
private hashArgs;
|
|
81
|
+
/**
|
|
82
|
+
* Remove confirmation fields from args before hashing
|
|
83
|
+
*/
|
|
84
|
+
private removeConfirmationFields;
|
|
85
|
+
create(toolName: string, args: unknown, ttlSeconds?: number): Promise<ConfirmationData>;
|
|
86
|
+
consume(token: string, toolName: string, args: unknown): Promise<boolean>;
|
|
87
|
+
clearExpired(): Promise<void>;
|
|
88
|
+
clear(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Stop the cleanup interval (for graceful shutdown)
|
|
91
|
+
*/
|
|
92
|
+
destroy(): void;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=confirmation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-store.d.ts","sourceRoot":"","sources":["../../src/auth/confirmation-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAExF;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1E;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,eAAe,CAA+C;IAEtE,6BAA6B;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;IAEzC,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;;IAgBrD;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAU1B,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,UAAU,GAAE,MAAsD,GACjE,OAAO,CAAC,gBAAgB,CAAC;IAkBtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BzE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confirmation Store
|
|
3
|
+
*
|
|
4
|
+
* Manages confirmation tokens for destructive operations.
|
|
5
|
+
* Implements a two-phase confirmation flow to prevent bypass attacks:
|
|
6
|
+
*
|
|
7
|
+
* 1. First call (no confirmation): Generate unique token, return to client
|
|
8
|
+
* 2. Second call (with token): Validate token, execute if valid
|
|
9
|
+
*
|
|
10
|
+
* Security features:
|
|
11
|
+
* - Cryptographically secure random tokens
|
|
12
|
+
* - One-time use (tokens are consumed on validation)
|
|
13
|
+
* - TTL expiration (default 5 minutes)
|
|
14
|
+
* - Request binding (token tied to specific tool + args hash)
|
|
15
|
+
*/
|
|
16
|
+
import { randomBytes, createHash } from 'crypto';
|
|
17
|
+
/**
|
|
18
|
+
* In-memory confirmation store implementation
|
|
19
|
+
*/
|
|
20
|
+
export class InMemoryConfirmationStore {
|
|
21
|
+
confirmations = new Map();
|
|
22
|
+
cleanupInterval = null;
|
|
23
|
+
/** Default TTL: 5 minutes */
|
|
24
|
+
static DEFAULT_TTL_SECONDS = 300;
|
|
25
|
+
/** Token size: 32 bytes = 256 bits of entropy */
|
|
26
|
+
static TOKEN_BYTES = 32;
|
|
27
|
+
/** Cleanup interval: every 60 seconds */
|
|
28
|
+
static CLEANUP_INTERVAL_MS = 60_000;
|
|
29
|
+
constructor() {
|
|
30
|
+
// Start periodic cleanup
|
|
31
|
+
this.cleanupInterval = setInterval(() => {
|
|
32
|
+
this.clearExpired().catch(() => {
|
|
33
|
+
// Ignore cleanup errors
|
|
34
|
+
});
|
|
35
|
+
}, InMemoryConfirmationStore.CLEANUP_INTERVAL_MS);
|
|
36
|
+
// Don't keep process alive for cleanup
|
|
37
|
+
if (this.cleanupInterval.unref) {
|
|
38
|
+
this.cleanupInterval.unref();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate a secure random confirmation token
|
|
43
|
+
*/
|
|
44
|
+
generateToken() {
|
|
45
|
+
return randomBytes(InMemoryConfirmationStore.TOKEN_BYTES).toString('hex');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Hash the request arguments for binding
|
|
49
|
+
*/
|
|
50
|
+
hashArgs(args) {
|
|
51
|
+
// Remove the confirmation-related fields before hashing
|
|
52
|
+
const cleanArgs = this.removeConfirmationFields(args);
|
|
53
|
+
const json = JSON.stringify(cleanArgs, Object.keys(cleanArgs || {}).sort());
|
|
54
|
+
return createHash('sha256').update(json).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Remove confirmation fields from args before hashing
|
|
58
|
+
*/
|
|
59
|
+
removeConfirmationFields(args) {
|
|
60
|
+
if (!args || typeof args !== 'object') {
|
|
61
|
+
return args;
|
|
62
|
+
}
|
|
63
|
+
const cleaned = { ...args };
|
|
64
|
+
delete cleaned['confirmed'];
|
|
65
|
+
delete cleaned['confirmationId'];
|
|
66
|
+
return cleaned;
|
|
67
|
+
}
|
|
68
|
+
async create(toolName, args, ttlSeconds = InMemoryConfirmationStore.DEFAULT_TTL_SECONDS) {
|
|
69
|
+
const token = this.generateToken();
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const argsHash = this.hashArgs(args);
|
|
72
|
+
const confirmation = {
|
|
73
|
+
token,
|
|
74
|
+
toolName,
|
|
75
|
+
argsHash,
|
|
76
|
+
createdAt: now,
|
|
77
|
+
expiresAt: now + ttlSeconds * 1000,
|
|
78
|
+
};
|
|
79
|
+
this.confirmations.set(token, confirmation);
|
|
80
|
+
return confirmation;
|
|
81
|
+
}
|
|
82
|
+
async consume(token, toolName, args) {
|
|
83
|
+
const confirmation = this.confirmations.get(token);
|
|
84
|
+
if (!confirmation) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
// Check expiration
|
|
88
|
+
if (Date.now() > confirmation.expiresAt) {
|
|
89
|
+
this.confirmations.delete(token);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
// Verify tool name matches
|
|
93
|
+
if (confirmation.toolName !== toolName) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
// Verify args hash matches (prevents parameter tampering)
|
|
97
|
+
const argsHash = this.hashArgs(args);
|
|
98
|
+
if (confirmation.argsHash !== argsHash) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
// Consume (one-time use)
|
|
102
|
+
this.confirmations.delete(token);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
async clearExpired() {
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
for (const [token, confirmation] of this.confirmations) {
|
|
108
|
+
if (now > confirmation.expiresAt) {
|
|
109
|
+
this.confirmations.delete(token);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async clear() {
|
|
114
|
+
this.confirmations.clear();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Stop the cleanup interval (for graceful shutdown)
|
|
118
|
+
*/
|
|
119
|
+
destroy() {
|
|
120
|
+
if (this.cleanupInterval) {
|
|
121
|
+
clearInterval(this.cleanupInterval);
|
|
122
|
+
this.cleanupInterval = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=confirmation-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation-store.js","sourceRoot":"","sources":["../../src/auth/confirmation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth State Store
|
|
3
|
+
*
|
|
4
|
+
* Manages OAuth2 state parameters for CSRF protection.
|
|
5
|
+
* States are one-time use and expire after a configurable TTL.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* OAuth state data
|
|
9
|
+
*/
|
|
10
|
+
export interface OAuthStateData {
|
|
11
|
+
/** Cryptographically random state value */
|
|
12
|
+
state: string;
|
|
13
|
+
/** Unix timestamp when state was created */
|
|
14
|
+
createdAt: number;
|
|
15
|
+
/** Unix timestamp when state expires */
|
|
16
|
+
expiresAt: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* State store interface for OAuth CSRF protection
|
|
20
|
+
*/
|
|
21
|
+
export interface StateStore {
|
|
22
|
+
/**
|
|
23
|
+
* Create a new state with optional TTL
|
|
24
|
+
* @param ttlSeconds Time-to-live in seconds (default: 600 = 10 minutes)
|
|
25
|
+
*/
|
|
26
|
+
create(ttlSeconds?: number): Promise<OAuthStateData>;
|
|
27
|
+
/**
|
|
28
|
+
* Validate that a state exists and is not expired
|
|
29
|
+
* Does NOT consume the state (use for pre-validation)
|
|
30
|
+
*/
|
|
31
|
+
validate(state: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Consume a state (one-time use)
|
|
34
|
+
* Returns true if valid and consumed, false otherwise
|
|
35
|
+
*/
|
|
36
|
+
consume(state: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Clear all stored states
|
|
39
|
+
*/
|
|
40
|
+
clear(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* In-memory state store implementation
|
|
44
|
+
*
|
|
45
|
+
* Suitable for single-instance deployments.
|
|
46
|
+
* States are automatically cleaned up when expired.
|
|
47
|
+
*/
|
|
48
|
+
export declare class InMemoryStateStore implements StateStore {
|
|
49
|
+
private states;
|
|
50
|
+
private cleanupInterval;
|
|
51
|
+
/** Default TTL: 10 minutes */
|
|
52
|
+
private static readonly DEFAULT_TTL_SECONDS;
|
|
53
|
+
/** Cleanup interval: 1 minute */
|
|
54
|
+
private static readonly CLEANUP_INTERVAL_MS;
|
|
55
|
+
/** State entropy: 32 bytes = 256 bits */
|
|
56
|
+
private static readonly STATE_BYTES;
|
|
57
|
+
constructor();
|
|
58
|
+
/**
|
|
59
|
+
* Create a new cryptographically random state
|
|
60
|
+
*/
|
|
61
|
+
create(ttlSeconds?: number): Promise<OAuthStateData>;
|
|
62
|
+
/**
|
|
63
|
+
* Validate a state without consuming it
|
|
64
|
+
*/
|
|
65
|
+
validate(state: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Consume a state (one-time use)
|
|
68
|
+
* This is the primary validation method - states can only be used once
|
|
69
|
+
*/
|
|
70
|
+
consume(state: string): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Clear all stored states
|
|
73
|
+
*/
|
|
74
|
+
clear(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Stop the cleanup interval (for testing/cleanup)
|
|
77
|
+
*/
|
|
78
|
+
destroy(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get the number of stored states (for testing)
|
|
81
|
+
*/
|
|
82
|
+
size(): number;
|
|
83
|
+
/**
|
|
84
|
+
* Start periodic cleanup of expired states
|
|
85
|
+
*/
|
|
86
|
+
private startCleanup;
|
|
87
|
+
/**
|
|
88
|
+
* Remove expired states
|
|
89
|
+
*/
|
|
90
|
+
private cleanup;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a default state store instance
|
|
94
|
+
*/
|
|
95
|
+
export declare function createStateStore(): StateStore;
|
|
96
|
+
//# sourceMappingURL=state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/auth/state-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAErD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1C;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,eAAe,CAA+C;IAEtE,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,iCAAiC;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAEpD,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAM;;IAOzC;;OAEG;IACG,MAAM,CAAC,UAAU,SAAyC,GAAG,OAAO,CAAC,cAAc,CAAC;IAgB1F;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB/C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,OAAO;CAShB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth State Store
|
|
3
|
+
*
|
|
4
|
+
* Manages OAuth2 state parameters for CSRF protection.
|
|
5
|
+
* States are one-time use and expire after a configurable TTL.
|
|
6
|
+
*/
|
|
7
|
+
import { randomBytes } from 'crypto';
|
|
8
|
+
/**
|
|
9
|
+
* In-memory state store implementation
|
|
10
|
+
*
|
|
11
|
+
* Suitable for single-instance deployments.
|
|
12
|
+
* States are automatically cleaned up when expired.
|
|
13
|
+
*/
|
|
14
|
+
export class InMemoryStateStore {
|
|
15
|
+
states = new Map();
|
|
16
|
+
cleanupInterval = null;
|
|
17
|
+
/** Default TTL: 10 minutes */
|
|
18
|
+
static DEFAULT_TTL_SECONDS = 600;
|
|
19
|
+
/** Cleanup interval: 1 minute */
|
|
20
|
+
static CLEANUP_INTERVAL_MS = 60000;
|
|
21
|
+
/** State entropy: 32 bytes = 256 bits */
|
|
22
|
+
static STATE_BYTES = 32;
|
|
23
|
+
constructor() {
|
|
24
|
+
// Start periodic cleanup
|
|
25
|
+
this.startCleanup();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a new cryptographically random state
|
|
29
|
+
*/
|
|
30
|
+
async create(ttlSeconds = InMemoryStateStore.DEFAULT_TTL_SECONDS) {
|
|
31
|
+
// Generate cryptographically secure random state
|
|
32
|
+
const state = randomBytes(InMemoryStateStore.STATE_BYTES).toString('hex');
|
|
33
|
+
const now = Math.floor(Date.now() / 1000);
|
|
34
|
+
const stateData = {
|
|
35
|
+
state,
|
|
36
|
+
createdAt: now,
|
|
37
|
+
expiresAt: now + ttlSeconds,
|
|
38
|
+
};
|
|
39
|
+
this.states.set(state, stateData);
|
|
40
|
+
return stateData;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate a state without consuming it
|
|
44
|
+
*/
|
|
45
|
+
async validate(state) {
|
|
46
|
+
const stateData = this.states.get(state);
|
|
47
|
+
if (!stateData) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const now = Math.floor(Date.now() / 1000);
|
|
51
|
+
if (now > stateData.expiresAt) {
|
|
52
|
+
// Expired - remove and return false
|
|
53
|
+
this.states.delete(state);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Consume a state (one-time use)
|
|
60
|
+
* This is the primary validation method - states can only be used once
|
|
61
|
+
*/
|
|
62
|
+
async consume(state) {
|
|
63
|
+
const isValid = await this.validate(state);
|
|
64
|
+
if (isValid) {
|
|
65
|
+
// Remove state after successful validation (one-time use)
|
|
66
|
+
this.states.delete(state);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear all stored states
|
|
73
|
+
*/
|
|
74
|
+
async clear() {
|
|
75
|
+
this.states.clear();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Stop the cleanup interval (for testing/cleanup)
|
|
79
|
+
*/
|
|
80
|
+
destroy() {
|
|
81
|
+
if (this.cleanupInterval) {
|
|
82
|
+
clearInterval(this.cleanupInterval);
|
|
83
|
+
this.cleanupInterval = null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the number of stored states (for testing)
|
|
88
|
+
*/
|
|
89
|
+
size() {
|
|
90
|
+
return this.states.size;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Start periodic cleanup of expired states
|
|
94
|
+
*/
|
|
95
|
+
startCleanup() {
|
|
96
|
+
this.cleanupInterval = setInterval(() => {
|
|
97
|
+
this.cleanup();
|
|
98
|
+
}, InMemoryStateStore.CLEANUP_INTERVAL_MS);
|
|
99
|
+
// Don't prevent process exit
|
|
100
|
+
if (this.cleanupInterval.unref) {
|
|
101
|
+
this.cleanupInterval.unref();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove expired states
|
|
106
|
+
*/
|
|
107
|
+
cleanup() {
|
|
108
|
+
const now = Math.floor(Date.now() / 1000);
|
|
109
|
+
for (const [state, data] of this.states.entries()) {
|
|
110
|
+
if (now > data.expiresAt) {
|
|
111
|
+
this.states.delete(state);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create a default state store instance
|
|
118
|
+
*/
|
|
119
|
+
export function createStateStore() {
|
|
120
|
+
return new InMemoryStateStore();
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/auth/state-store.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -53,7 +53,7 @@ export interface AuthStatus {
|
|
|
53
53
|
/**
|
|
54
54
|
* OAuth error codes
|
|
55
55
|
*/
|
|
56
|
-
export type OAuthErrorCode = 'not_authenticated' | 'token_exchange_failed' | 'refresh_failed' | 'invalid_grant' | 'invalid_client' | 'invalid_request' | 'unauthorized_client' | 'unsupported_grant_type' | 'no_refresh_token' | 'session_expired';
|
|
56
|
+
export type OAuthErrorCode = 'not_authenticated' | 'token_exchange_failed' | 'refresh_failed' | 'invalid_grant' | 'invalid_client' | 'invalid_request' | 'unauthorized_client' | 'unsupported_grant_type' | 'no_refresh_token' | 'session_expired' | 'invalid_state' | 'state_required';
|
|
57
57
|
/**
|
|
58
58
|
* OAuth-specific error class
|
|
59
59
|
*/
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,aAAa,EAAE,OAAO,CAAC;IAEvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IAExD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IAEjB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,aAAa,EAAE,OAAO,CAAC;IAEvB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IAExD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,mBAAmB,GACnB,uBAAuB,GACvB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,gBAAgB,CAAC;AAErB;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,cAAc;aAEpB,OAAO,CAAC,EAAE,GAAG;gBAFb,IAAI,EAAE,cAAc,EACpC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,GAAG,YAAA;CAMhC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,GAAG,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEjC,sBAAsB;IACtB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC,8BAA8B;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
package/dist/auth/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkFH;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAEjB;IAEA;IAHlB,YACkB,IAAoB,EACpC,OAAe,EACC,OAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAgB;QAEpB,YAAO,GAAP,OAAO,CAAM;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities for FreshBooks MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent environment detection across the codebase
|
|
5
|
+
* for security-sensitive decisions like stack trace exposure.
|
|
6
|
+
*/
|
|
7
|
+
export type Environment = 'development' | 'test' | 'production';
|
|
8
|
+
/**
|
|
9
|
+
* Get the current environment from NODE_ENV
|
|
10
|
+
* Defaults to 'development' if not set
|
|
11
|
+
*/
|
|
12
|
+
export declare function getEnvironment(): Environment;
|
|
13
|
+
/**
|
|
14
|
+
* Check if running in production environment
|
|
15
|
+
*/
|
|
16
|
+
export declare function isProduction(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Check if running in development environment
|
|
19
|
+
*/
|
|
20
|
+
export declare function isDevelopment(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Check if running in test environment
|
|
23
|
+
*/
|
|
24
|
+
export declare function isTest(): boolean;
|
|
25
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAY5C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection utilities for FreshBooks MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent environment detection across the codebase
|
|
5
|
+
* for security-sensitive decisions like stack trace exposure.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get the current environment from NODE_ENV
|
|
9
|
+
* Defaults to 'development' if not set
|
|
10
|
+
*/
|
|
11
|
+
export function getEnvironment() {
|
|
12
|
+
const env = process.env.NODE_ENV?.toLowerCase();
|
|
13
|
+
if (env === 'production' || env === 'prod') {
|
|
14
|
+
return 'production';
|
|
15
|
+
}
|
|
16
|
+
if (env === 'test' || env === 'testing') {
|
|
17
|
+
return 'test';
|
|
18
|
+
}
|
|
19
|
+
return 'development';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if running in production environment
|
|
23
|
+
*/
|
|
24
|
+
export function isProduction() {
|
|
25
|
+
return getEnvironment() === 'production';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if running in development environment
|
|
29
|
+
*/
|
|
30
|
+
export function isDevelopment() {
|
|
31
|
+
return getEnvironment() === 'development';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if running in test environment
|
|
35
|
+
*/
|
|
36
|
+
export function isTest() {
|
|
37
|
+
return getEnvironment() === 'test';
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/config/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAEhD,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,cAAc,EAAE,KAAK,YAAY,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,EAAE,KAAK,aAAa,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,cAAc,EAAE,KAAK,MAAM,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,QAAQ,EAIR,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,QAAQ,EAIR,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAKpB;;;;GAIG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GACjE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC;IA6B5D;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAiFvE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAoB7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAW1B;;;;;;;;OAQG;IACH,MAAM,CAAC,qBAAqB,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;IAiBX;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,QAAQ;IAiBzE;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,OAAO,CAAC,EAAE,YAAY,GACrB,QAAQ;CAkBZ;AAED;;;;;;GAMG;AACH,iBAAS,iBAAiB,IAAI,MAAM,CAInC;AAED;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,WAAW,oCAAiD,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,eAAe,qCAAkD,CAAC"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import { MCPErrorCode, OAuthError, } from "./types.js";
|
|
11
11
|
import { ErrorMapper } from "./error-mapper.js";
|
|
12
|
+
import { isProduction } from "../config/environment.js";
|
|
13
|
+
import { sanitizeForMcpResponse } from "../utils/sanitizer.js";
|
|
12
14
|
/**
|
|
13
15
|
* Error Handler Class
|
|
14
16
|
*
|
|
@@ -46,7 +48,8 @@ export class ErrorHandler {
|
|
|
46
48
|
// Note: In production, this would use a proper logger
|
|
47
49
|
// For now, we avoid logging to keep stdio clean for MCP
|
|
48
50
|
const result = await handler(input, context);
|
|
49
|
-
|
|
51
|
+
// Sanitize output to prevent prompt injection from API responses
|
|
52
|
+
return sanitizeForMcpResponse(result);
|
|
50
53
|
}
|
|
51
54
|
catch (error) {
|
|
52
55
|
const errorContext = {
|
|
@@ -108,7 +111,6 @@ export class ErrorHandler {
|
|
|
108
111
|
}
|
|
109
112
|
// Unknown error - create generic internal error
|
|
110
113
|
const message = error instanceof Error ? error.message : String(error);
|
|
111
|
-
const stack = error instanceof Error ? error.stack : undefined;
|
|
112
114
|
const errorData = {
|
|
113
115
|
recoverable: true,
|
|
114
116
|
suggestion: "An unexpected error occurred. Please try again.",
|
|
@@ -116,11 +118,22 @@ export class ErrorHandler {
|
|
|
116
118
|
if (context) {
|
|
117
119
|
errorData.context = context;
|
|
118
120
|
}
|
|
119
|
-
|
|
121
|
+
// Only include stack traces and detailed messages in non-production environments
|
|
122
|
+
if (!isProduction()) {
|
|
123
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
124
|
+
if (stack) {
|
|
125
|
+
errorData.freshbooksError = {
|
|
126
|
+
code: "UNKNOWN_ERROR",
|
|
127
|
+
message,
|
|
128
|
+
details: { stack },
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// In production, include error code but sanitize the message
|
|
120
134
|
errorData.freshbooksError = {
|
|
121
135
|
code: "UNKNOWN_ERROR",
|
|
122
|
-
message,
|
|
123
|
-
details: { stack },
|
|
136
|
+
message: "An internal error occurred",
|
|
124
137
|
};
|
|
125
138
|
}
|
|
126
139
|
const mcpError = Object.assign(new Error(`Unexpected error: ${message}`), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,YAAY,EAEZ,UAAU,GAGX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/errors/error-handler.ts"],"names":[],"mappings":"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"}
|