Skip to content

Commit 0dfe7d0

Browse files
committed
improvement: adding sanitizing for error message. Improving error handling for non-JSON responses.
1 parent fb6f3e1 commit 0dfe7d0

File tree

1 file changed

+49
-7
lines changed
  • packages/plugin-coinbase/advanced-sdk-ts/src/rest

1 file changed

+49
-7
lines changed

packages/plugin-coinbase/advanced-sdk-ts/src/rest/errors.ts

+49-7
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,50 @@ export class CoinbaseError extends Error {
3737
}
3838

3939
function parseErrorResponse(responseText: string): Record<string, any> {
40+
if (!responseText) {
41+
return {
42+
error: 'Empty response',
43+
originalResponse: responseText
44+
};
45+
}
46+
4047
try {
4148
return JSON.parse(responseText);
42-
} catch {
43-
return {};
49+
} catch (error) {
50+
// Create a more informative error object
51+
return {
52+
error: 'Invalid JSON response',
53+
message: error instanceof Error ? error.message : 'Unknown parsing error',
54+
originalResponse: responseText.slice(0, 200) // Include first 200 chars to aid debugging
55+
};
4456
}
4557
}
4658

59+
// Sanitize error messages to prevent sensitive information exposure
60+
function sanitizeErrorMessage(message: string): string {
61+
// Remove potential sensitive patterns (API keys, tokens, credentials)
62+
return message.replace(/([A-Za-z0-9+/]{32,})/g, '[REDACTED]')
63+
.replace(/key-[a-zA-Z0-9]{32,}/g, '[REDACTED]')
64+
.replace(/sk-[a-zA-Z0-9]{32,}/g, '[REDACTED]')
65+
.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, '[REDACTED_EMAIL]');
66+
}
67+
68+
function sanitizeErrorDetails(details: Record<string, any>): Record<string, any> {
69+
const sensitiveKeys = ['apiKey', 'secret', 'token', 'password', 'credential', 'key', 'auth'];
70+
return Object.entries(details).reduce((acc, [key, value]) => {
71+
if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {
72+
acc[key] = '[REDACTED]';
73+
} else if (typeof value === 'object' && value !== null) {
74+
acc[key] = sanitizeErrorDetails(value);
75+
} else if (typeof value === 'string') {
76+
acc[key] = sanitizeErrorMessage(value);
77+
} else {
78+
acc[key] = value;
79+
}
80+
return acc;
81+
}, {} as Record<string, any>);
82+
}
83+
4784
function getErrorDetails(response: Response, responseText: string): CoinbaseErrorDetails {
4885
const parsedError = parseErrorResponse(responseText);
4986
const status = response.status;
@@ -77,8 +114,8 @@ function getErrorDetails(response: Response, responseText: string): CoinbaseErro
77114
if (status === 400) {
78115
return {
79116
type: CoinbaseErrorType.VALIDATION,
80-
message: parsedError.message || 'Invalid request parameters',
81-
details: parsedError,
117+
message: sanitizeErrorMessage(parsedError.message || 'Invalid request parameters'),
118+
details: sanitizeErrorDetails(parsedError),
82119
suggestion: 'Please verify all required parameters are provided and have valid values.'
83120
};
84121
}
@@ -104,9 +141,9 @@ function getErrorDetails(response: Response, responseText: string): CoinbaseErro
104141
// Default unknown error
105142
return {
106143
type: CoinbaseErrorType.UNKNOWN,
107-
message: `Unexpected error: ${response.statusText}`,
108-
details: parsedError,
109-
suggestion: 'If this persists, please contact team with the error details.'
144+
message: sanitizeErrorMessage(`Unexpected error: ${response.statusText}`),
145+
details: sanitizeErrorDetails(parsedError),
146+
suggestion: 'If this persists, please contact support with the error details.'
110147
};
111148
}
112149

@@ -118,6 +155,11 @@ export function handleException(
118155
if ((400 <= response.status && response.status <= 499) ||
119156
(500 <= response.status && response.status <= 599)) {
120157
const errorDetails = getErrorDetails(response, responseText);
158+
// Sanitize any additional error information
159+
errorDetails.message = sanitizeErrorMessage(errorDetails.message);
160+
if (errorDetails.details) {
161+
errorDetails.details = sanitizeErrorDetails(errorDetails.details);
162+
}
121163
throw new CoinbaseError(errorDetails, response.status, response);
122164
}
123165
}

0 commit comments

Comments
 (0)