Fix acl.resolvePermission for wildcard req

When acl.resolvePermission was called with a request containing a
wildcard, it would return the matching acl with lowest score instead of
higher.

Fixes #2153
This commit is contained in:
Farid Neshat 2017-03-18 16:10:15 +08:00
parent 4c4430ea95
commit d2d8fabb16
2 changed files with 36 additions and 0 deletions

View File

@ -243,6 +243,7 @@ module.exports = function(ACL) {
var permissionOrder = AccessContext.permissionOrder[permission]; var permissionOrder = AccessContext.permissionOrder[permission];
if (candidateOrder > permissionOrder) { if (candidateOrder > permissionOrder) {
permission = candidate.permission; permission = candidate.permission;
break;
} }
} }
} }

View File

@ -186,6 +186,41 @@ describe('security ACLs', function() {
// }); // });
}); });
it('should order ACL entries based on the matching score even with wildcard req', function() {
var acls = [
{
'model': 'account',
'accessType': '*',
'permission': 'DENY',
'principalType': 'ROLE',
'principalId': '$everyone',
},
{
'model': 'account',
'accessType': '*',
'permission': 'ALLOW',
'principalType': 'ROLE',
'principalId': '$owner',
}];
var req = {
model: 'account',
property: '*',
accessType: 'WRITE',
};
acls = acls.map(function(a) { return new ACL(a); });
var perm = ACL.resolvePermission(acls, req);
// remove the registry from AccessRequest instance to ease asserting.
// Check the above test case for more info.
delete perm.registry;
assert.deepEqual(perm, {model: 'account',
property: '*',
accessType: 'WRITE',
permission: 'ALLOW',
methodNames: []});
});
it('should allow access to models for the given principal by wildcard', function() { it('should allow access to models for the given principal by wildcard', function() {
// jscs:disable validateIndentation // jscs:disable validateIndentation
ACL.create({ ACL.create({