This repository has been archived by the owner on Apr 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 27.5k
fix($parse): fix CSP nested property evaluation, and issue that prevente... #5592
Closed
Closed
Changes from 1 commit
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
339fc96
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat 5177a62
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat e1d7a5f
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat 3a126a9
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat 6f991b7
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat c4fd978
tests
dozingcat ba7fce5
fix($parse): fix CSP nested property evaluation, and issue that preve…
dozingcat 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 |
---|---|---|
|
@@ -894,15 +894,19 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { | |
if (pathVal == null) return pathVal; | ||
pathVal = pathVal[key0]; | ||
|
||
if (!key1) return pathVal; | ||
if (pathVal == null) return key1 ? undefined : pathVal; | ||
pathVal = pathVal[key1]; | ||
|
||
if (!key2) return pathVal; | ||
if (pathVal == null) return key2 ? undefined : pathVal; | ||
pathVal = pathVal[key2]; | ||
|
||
if (!key3) return pathVal; | ||
if (pathVal == null) return key3 ? undefined : pathVal; | ||
pathVal = pathVal[key3]; | ||
|
||
if (!key4) return pathVal; | ||
if (pathVal == null) return key4 ? undefined : pathVal; | ||
pathVal = pathVal[key4]; | ||
|
||
|
@@ -924,6 +928,7 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { | |
} | ||
pathVal = pathVal.$$v; | ||
} | ||
if (!key1) return pathVal; | ||
if (pathVal == null) return key1 ? undefined : pathVal; | ||
|
||
pathVal = pathVal[key1]; | ||
|
@@ -936,6 +941,7 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { | |
} | ||
pathVal = pathVal.$$v; | ||
} | ||
if (!key2) return pathVal; | ||
if (pathVal == null) return key2 ? undefined : pathVal; | ||
|
||
pathVal = pathVal[key2]; | ||
|
@@ -948,6 +954,7 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { | |
} | ||
pathVal = pathVal.$$v; | ||
} | ||
if (!key3) return pathVal; | ||
if (pathVal == null) return key3 ? undefined : pathVal; | ||
|
||
pathVal = pathVal[key3]; | ||
|
@@ -960,6 +967,7 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) { | |
} | ||
pathVal = pathVal.$$v; | ||
} | ||
if (!key4) return pathVal; | ||
if (pathVal == null) return key4 ? undefined : pathVal; | ||
|
||
pathVal = pathVal[key4]; | ||
|
@@ -1218,8 +1226,6 @@ function $ParseProvider() { | |
|
||
|
||
this.$get = ['$filter', '$sniffer', '$log', function($filter, $sniffer, $log) { | ||
$parseOptions.csp = $sniffer.csp; | ||
|
||
promiseWarning = function promiseWarningFn(fullExp) { | ||
if (!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp)) return; | ||
promiseWarningCache[fullExp] = true; | ||
|
@@ -1237,6 +1243,9 @@ function $ParseProvider() { | |
return cache[exp]; | ||
} | ||
|
||
// The csp option has to be set here because in tests the $sniffer service sets its csp | ||
// property after $get has executed. | ||
$parseOptions.csp = $sniffer.csp; | ||
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. I'm still not sure about this though, it seems weird to read this every time $parse is called. If it's the best we can do then that's one thing, but is there not a better solution? |
||
var lexer = new Lexer($parseOptions); | ||
var parser = new Parser(lexer, $filter, $parseOptions); | ||
parsedExpression = parser.parse(exp, false); | ||
|
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
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.
Look at this line (897)... Now look at the one below it...
What we're doing here is this: if the path key is not present, and there is another path key after it, we always want to return undefined.
If there are problems with the existing algorithm, we'll need to fix it, but to undo that would be essentially reverting a desirable fix. Lets find a better solution for the csp issue.
I'm fairly sure that this changeset would have broken tests if the test suite for the changeset fixing #5442 / #2249 didn't get shrunk down, with a few test cases removed
Even if it doesn't break tests, we can make this more concise and not breaking the logic mentioned above by combining it into the second if statement
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 think that's a separate issue. As I understand it given scope.a={b: null}, $eval('a.b') should return null and $eval('a.b.c') should return undefined. This changeset doesn't modify that behavior. It addresses the case where cspSafeGetterFn is called with an expression of 'a.b.c', so the key3 and key4 parameters are undefined. pathVal then becomes undefined after evaluating pathVal[key3], unless we check for the key being undefined first.
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.
At the very least, it does duplicate functionality, and this could be made much more concise.
An 8 byte change
|| !key1
would have the same impact, and absolutely avoid breaking logicGood catch on the csp test fixes, though