-
Notifications
You must be signed in to change notification settings - Fork 117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add schema checks for addresses in url endpoints #2692
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -4,6 +4,7 @@ import { | |||||||||||||||||||||||||||||||||||||||||||
MAX_PARENT_SUBACCOUNTS, | ||||||||||||||||||||||||||||||||||||||||||||
CHILD_SUBACCOUNT_MULTIPLIER, | ||||||||||||||||||||||||||||||||||||||||||||
} from '@dydxprotocol-indexer/postgres'; | ||||||||||||||||||||||||||||||||||||||||||||
import { decode } from 'bech32'; | ||||||||||||||||||||||||||||||||||||||||||||
import { body, checkSchema, ParamSchema } from 'express-validator'; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
import config from '../../config'; | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -12,6 +13,10 @@ export const CheckSubaccountSchema = checkSchema({ | |||||||||||||||||||||||||||||||||||||||||||
address: { | ||||||||||||||||||||||||||||||||||||||||||||
in: ['params', 'query'], | ||||||||||||||||||||||||||||||||||||||||||||
isString: true, | ||||||||||||||||||||||||||||||||||||||||||||
custom: { | ||||||||||||||||||||||||||||||||||||||||||||
options: isValidAddress, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
errorMessage: 'address must be a valid dydx address', | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
subaccountNumber: { | ||||||||||||||||||||||||||||||||||||||||||||
in: ['params', 'query'], | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -26,6 +31,10 @@ export const CheckParentSubaccountSchema = checkSchema({ | |||||||||||||||||||||||||||||||||||||||||||
address: { | ||||||||||||||||||||||||||||||||||||||||||||
in: ['params', 'query'], | ||||||||||||||||||||||||||||||||||||||||||||
isString: true, | ||||||||||||||||||||||||||||||||||||||||||||
custom: { | ||||||||||||||||||||||||||||||||||||||||||||
options: isValidAddress, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
errorMessage: 'address must be a valid dydx address', | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
parentSubaccountNumber: { | ||||||||||||||||||||||||||||||||||||||||||||
in: ['params', 'query'], | ||||||||||||||||||||||||||||||||||||||||||||
|
@@ -40,6 +49,10 @@ export const checkAddressSchemaRecord: Record<string, ParamSchema> = { | |||||||||||||||||||||||||||||||||||||||||||
address: { | ||||||||||||||||||||||||||||||||||||||||||||
in: ['params'], | ||||||||||||||||||||||||||||||||||||||||||||
isString: true, | ||||||||||||||||||||||||||||||||||||||||||||
custom: { | ||||||||||||||||||||||||||||||||||||||||||||
options: isValidAddress, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
errorMessage: 'address must be a valid dydx address', | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
|
@@ -262,3 +275,23 @@ export const RegisterTokenValidationSchema = [ | |||||||||||||||||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
function verifyIsBech32(address: string): Error | undefined { | ||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||
decode(address); | ||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||
return error; | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
return undefined; | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+279
to
+287
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add input validation to verifyIsBech32. The function should validate its input before attempting to decode. function verifyIsBech32(address: string): Error | undefined {
+ if (!address || typeof address !== 'string') {
+ return new Error('Invalid input: address must be a non-empty string');
+ }
try {
decode(address);
} catch (error) {
- return error;
+ return error instanceof Error ? error : new Error('Invalid bech32 format');
}
return undefined;
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
export function isValidDydxAddress(address: string): boolean { | ||||||||||||||||||||||||||||||||||||||||||||
// An address is valid if it starts with `dydx1` and is Bech32 format. | ||||||||||||||||||||||||||||||||||||||||||||
return address.startsWith('dydx1') && (verifyIsBech32(address) === undefined); | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+289
to
+292
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add input validation to isValidDydxAddress. The function should validate its input and handle edge cases. export function isValidDydxAddress(address: string): boolean {
+ if (!address || typeof address !== 'string') {
+ return false;
+ }
// An address is valid if it starts with `dydx1` and is Bech32 format.
return address.startsWith('dydx1') && (verifyIsBech32(address) === undefined);
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
export function isValidAddress(address: string): boolean { | ||||||||||||||||||||||||||||||||||||||||||||
// Address is valid if its under 90 characters and alphanumeric | ||||||||||||||||||||||||||||||||||||||||||||
return address.length <= 90 && /^[a-zA-Z0-9]*$/.test(address); | ||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Inconsistency between error message and validation logic.
The error message states "address must be a valid dydx address", but
isValidAddress
only checks for alphanumeric characters and length ≤ 90. Consider either:isValidDydxAddress
instead ofisValidAddress
to match the error message, orExample fix:
Or:
Also applies to: 34-37, 52-55
💡 Codebase verification
Review comment is correct - schemas should use stricter validation
The codebase confirms that while
isValidDydxAddress
is properly implemented to enforce bech32 validation (requiring 'dydx1' prefix and valid bech32 format), the schemas are still using the more lenientisValidAddress
function that only checks for length and alphanumeric characters.Switching to
isValidDydxAddress
would properly enforce the PR's objective of adding bech32 schema checks.🔗 Analysis chain
Align implementation with PR objectives.
The PR's objective is to add bech32 schema checks for addresses, but the current implementation uses a more lenient validation (
isValidAddress
) in the schemas instead of the bech32-specific validation (isValidDydxAddress
). This doesn't fully achieve the PR's goal of ensuring addresses are valid dydx addresses.Consider using
isValidDydxAddress
in all schemas to enforce proper bech32 validation as intended by the PR.Let's verify the impact of this change:
Also applies to: 34-37, 52-55, 289-292
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 1108
Script:
Length of output: 642
Script:
Length of output: 13609