mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-15 11:34:24 +03:00
4e3b21b7da
refs #3083, #3096 In order to implement advanced permissions based on roles for specific actions, we need to know what role the current context user has and also what action we are granting permissions for: - Permissible gets passed the action type - Effective permissions keeps the user role and eventually passes it to permissible - Fixed spelling - Still needs tests
48 lines
1.7 KiB
JavaScript
48 lines
1.7 KiB
JavaScript
var _ = require('lodash'),
|
|
Models = require('../models'),
|
|
errors = require('../errors');
|
|
|
|
var effective = {
|
|
user: function (id) {
|
|
return Models.User.findOne({id: id}, { include: ['permissions', 'roles', 'roles.permissions'] })
|
|
.then(function (foundUser) {
|
|
var seenPerms = {},
|
|
rolePerms = _.map(foundUser.related('roles').models, function (role) {
|
|
return role.related('permissions').models;
|
|
}),
|
|
allPerms = [],
|
|
user = foundUser.toJSON();
|
|
|
|
rolePerms.push(foundUser.related('permissions').models);
|
|
|
|
_.each(rolePerms, function (rolePermGroup) {
|
|
_.each(rolePermGroup, function (perm) {
|
|
var key = perm.get('action_type') + '-' + perm.get('object_type') + '-' + perm.get('object_id');
|
|
|
|
// Only add perms once
|
|
if (seenPerms[key]) {
|
|
return;
|
|
}
|
|
|
|
allPerms.push(perm);
|
|
seenPerms[key] = true;
|
|
});
|
|
});
|
|
|
|
return {permissions: allPerms, roles: user.roles};
|
|
}, errors.logAndThrowError);
|
|
},
|
|
|
|
app: function (appName) {
|
|
return Models.App.findOne({name: appName}, { withRelated: ['permissions'] })
|
|
.then(function (foundApp) {
|
|
if (!foundApp) {
|
|
return [];
|
|
}
|
|
|
|
return {permissions: foundApp.related('permissions').models};
|
|
}, errors.logAndThrowError);
|
|
}
|
|
};
|
|
|
|
module.exports = effective; |