-
Notifications
You must be signed in to change notification settings - Fork 561
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
feat: allow wildcards in allowedOrigins
#2458
Merged
Merged
Changes from 3 commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
84a173c
feat: allow wildcards in allowedOrigins
FrederikBolding 5da4f44
Add coverage
FrederikBolding 5a0e508
Add max number of wildcards
FrederikBolding 7272093
Simplify
FrederikBolding b5654d4
Tweak error message
FrederikBolding 8c1d6a4
Add checkAllowedOrigin function and more docs
FrederikBolding File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
{ | ||
"branches": 96.7, | ||
"functions": 98.72, | ||
"lines": 98.81, | ||
"statements": 94.79 | ||
"branches": 96.72, | ||
"functions": 98.75, | ||
"lines": 98.82, | ||
"statements": 94.84 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,11 +12,28 @@ import { | |
import type { Infer } from 'superstruct'; | ||
import { array, boolean, object, optional, refine, string } from 'superstruct'; | ||
|
||
const AllowedOriginsStruct = array( | ||
refine(string(), 'Allowed origin', (value) => { | ||
const wildcards = value.split('').reduce((accumulator, character) => { | ||
if (character === '*') { | ||
return accumulator + 1; | ||
} | ||
return accumulator; | ||
}, 0); | ||
FrederikBolding marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
if (wildcards > 2) { | ||
return 'No more than two wildcards (*) are allowed in "allowedOrigins".'; | ||
FrederikBolding marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
return true; | ||
}), | ||
); | ||
|
||
export const RpcOriginsStruct = refine( | ||
object({ | ||
dapps: optional(boolean()), | ||
snaps: optional(boolean()), | ||
allowedOrigins: optional(array(string())), | ||
allowedOrigins: optional(AllowedOriginsStruct), | ||
}), | ||
'RPC origins', | ||
(value) => { | ||
|
@@ -58,7 +75,7 @@ export function assertIsRpcOrigins( | |
} | ||
|
||
export const KeyringOriginsStruct = object({ | ||
allowedOrigins: optional(array(string())), | ||
allowedOrigins: optional(AllowedOriginsStruct), | ||
}); | ||
|
||
export type KeyringOrigins = Infer<typeof KeyringOriginsStruct>; | ||
|
@@ -84,6 +101,20 @@ export function assertIsKeyringOrigins( | |
); | ||
} | ||
|
||
/** | ||
* Create regular expression for matching against an origin while allowing wildcards. | ||
* | ||
* @param matcher - The string to create the regular expression with. | ||
* @returns The regular expression. | ||
*/ | ||
function createOriginRegExp(matcher: string) { | ||
// Escape potential Regex characters | ||
const escaped = matcher.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&'); | ||
// Support wildcards | ||
const regex = escaped.replace(/\*/gu, '.*'); | ||
return RegExp(regex, 'u'); | ||
} | ||
|
||
/** | ||
* Check if the given origin is allowed by the given JSON-RPC origins object. | ||
* | ||
|
@@ -103,7 +134,11 @@ export function isOriginAllowed( | |
} | ||
|
||
// If the origin is in the `allowedOrigins` list, it is allowed. | ||
if (origins.allowedOrigins?.includes(origin)) { | ||
if ( | ||
origins.allowedOrigins | ||
?.map(createOriginRegExp) | ||
.some((regex) => regex.test(origin)) | ||
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. To avoid creating regex unnecessarily, what do you think of function checkOrigin(origin: string, originSpecifier: string) {
if (originSpecifier === '*') {
return true;
}
// Create regex and test.
}
// ...
origins.allowedOrigins?.some((specifier) => checkOrigin(origin, specifier)) 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. Yeah, I added one more optimization to this |
||
) { | ||
return true; | ||
} | ||
|
||
|
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
These tests are maybe a bit more readable with
it.each
.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.
I don't find
it.each
that readable personally tbh 😅