aboutsummaryrefslogtreecommitdiffstats
path: root/src/ngResource/resource.js
diff options
context:
space:
mode:
authorChirayu Krishnappa2013-11-08 20:44:32 -0800
committerChirayu Krishnappa2013-11-11 16:17:34 -0800
commit9577702e8d2519c1a60f5ac4058e63bd7b919815 (patch)
tree69a063c50e1b575a77d86abec1587a74d07cc3fd /src/ngResource/resource.js
parenta61b65d01b468502fe53d68818949d3fcc9f20f6 (diff)
downloadangular.js-9577702e8d2519c1a60f5ac4058e63bd7b919815.tar.bz2
fix($resource): don't use $parse for @dotted.member
params and paramDefaults support looking up the parameter value from the data object. The syntax for that is `@nested.property.name`. Currently, $resource uses $parse to do this. This is too liberal (you can use values like `@a=b` or `@a | filter` and have it work - which doesn't really make sense). It also puts up a dependency on $parse which is has restrictions to secure expressions used in templates. The value here, though a string, is specified in Javascript code and shouldn't have those restrictions.
Diffstat (limited to 'src/ngResource/resource.js')
-rw-r--r--src/ngResource/resource.js32
1 files changed, 26 insertions, 6 deletions
diff --git a/src/ngResource/resource.js b/src/ngResource/resource.js
index 56d32f5e..f2e7ff62 100644
--- a/src/ngResource/resource.js
+++ b/src/ngResource/resource.js
@@ -2,6 +2,28 @@
var $resourceMinErr = angular.$$minErr('$resource');
+// Helper functions and regex to lookup a dotted path on an object
+// stopping at undefined/null. The path must be composed of ASCII
+// identifiers (just like $parse)
+var MEMBER_NAME_REGEX = /^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;
+
+function isValidDottedPath(path) {
+ return (path != null && path !== '' && path !== 'hasOwnProperty' &&
+ MEMBER_NAME_REGEX.test('.' + path));
+}
+
+function lookupDottedPath(obj, path) {
+ if (!isValidDottedPath(path)) {
+ throw $resourceMinErr('badmember', 'Dotted member path "@{0}" is invalid.', path);
+ }
+ var keys = path.split('.');
+ for (var i = 0, ii = keys.length; i < ii && obj !== undefined; i++) {
+ var key = keys[i];
+ obj = (obj !== null) ? obj[key] : undefined;
+ }
+ return obj;
+}
+
/**
* @ngdoc overview
* @name ngResource
@@ -285,7 +307,8 @@ var $resourceMinErr = angular.$$minErr('$resource');
</doc:example>
*/
angular.module('ngResource', ['ng']).
- factory('$resource', ['$http', '$parse', '$q', function($http, $parse, $q) {
+ factory('$resource', ['$http', '$q', function($http, $q) {
+
var DEFAULT_ACTIONS = {
'get': {method:'GET'},
'save': {method:'POST'},
@@ -297,10 +320,7 @@ angular.module('ngResource', ['ng']).
forEach = angular.forEach,
extend = angular.extend,
copy = angular.copy,
- isFunction = angular.isFunction,
- getter = function(obj, path) {
- return $parse(path)(obj);
- };
+ isFunction = angular.isFunction;
/**
* We need our custom method because encodeURIComponent is too aggressive and doesn't follow
@@ -415,7 +435,7 @@ angular.module('ngResource', ['ng']).
forEach(actionParams, function(value, key){
if (isFunction(value)) { value = value(); }
ids[key] = value && value.charAt && value.charAt(0) == '@' ?
- getter(data, value.substr(1)) : value;
+ lookupDottedPath(data, value.substr(1)) : value;
});
return ids;
}