mirror of https://github.com/rancher/ui.git
121 lines
3.8 KiB
JavaScript
121 lines
3.8 KiB
JavaScript
import { inject as service } from '@ember/service';
|
|
import Controller from '@ember/controller';
|
|
import { get, computed /* , set */ } from '@ember/object';
|
|
|
|
export default Controller.extend({
|
|
router: service(),
|
|
|
|
sortGlobalBy: 'name',
|
|
globalHeaders: [
|
|
{
|
|
name: 'enabled',
|
|
searchField: null,
|
|
width: 30
|
|
},
|
|
{
|
|
name: 'name',
|
|
sort: ['globalRole.displayName'],
|
|
searchField: 'globalRole.displayName',
|
|
translationKey: 'accountsPage.detail.table.headers.permission',
|
|
},
|
|
{
|
|
name: 'created',
|
|
searchField: null,
|
|
sort: ['createdTs'],
|
|
translationKey: 'accountsPage.detail.table.headers.created',
|
|
width: 200,
|
|
},
|
|
],
|
|
|
|
sortClusterBy: 'name',
|
|
clusterHeaders: [
|
|
{
|
|
name: 'clusterName',
|
|
searchField: 'cluster.displayName',
|
|
sort: ['cluster.displayName', 'project.displayName'],
|
|
translationKey: 'accountsPage.detail.table.headers.clusterName',
|
|
},
|
|
{
|
|
name: 'name',
|
|
searchField: 'roleTemplate.displayName',
|
|
sort: ['roleTemplate.displayNAme'],
|
|
translationKey: 'accountsPage.detail.table.headers.role',
|
|
},
|
|
{
|
|
name: 'created',
|
|
searchField: null,
|
|
sort: ['createdTs'],
|
|
translationKey: 'accountsPage.detail.table.headers.created',
|
|
width: 200,
|
|
},
|
|
],
|
|
|
|
sortProjectBy: 'projectName',
|
|
projectHeaders: [
|
|
{
|
|
name: 'projectName',
|
|
searchField: 'project.displayName',
|
|
sort: ['project.displayName', 'displayName'],
|
|
translationKey: 'accountsPage.detail.table.headers.projectName',
|
|
},
|
|
{
|
|
name: 'name',
|
|
searchField: 'roleTemplate.displayName',
|
|
sort: ['roleTemplate.displayName', 'project.displayName'],
|
|
translationKey: 'accountsPage.detail.table.headers.role',
|
|
},
|
|
{
|
|
name: 'created',
|
|
searchField: null,
|
|
sort: ['createdTs'],
|
|
translationKey: 'accountsPage.detail.table.headers.created',
|
|
width: 200,
|
|
},
|
|
],
|
|
|
|
hasPermission: function (globalRoleRules, permission) {
|
|
return globalRoleRules.find(gRule =>
|
|
((get(gRule, 'apiGroups') || []).indexOf('*') > -1 || (get(gRule, 'apiGroups') || []).indexOf(permission.apiGroup) > -1) &&
|
|
((get(gRule, 'resources') || []).indexOf('*') > -1 || (get(gRule, 'resources') || []).indexOf(permission.resource) > -1) &&
|
|
((get(gRule, 'verbs') || []).indexOf('*') > -1 || (get(gRule, 'verbs') || []).indexOf(permission.verb) > -1));
|
|
},
|
|
|
|
containsRule: function (globalRoleRules, rule) {
|
|
const apiGroups = (get(rule, 'apiGroups') || []);
|
|
const resources = (get(rule, 'resources') || []);
|
|
const verbs = (get(rule, 'verbs') || []);
|
|
const permissions = [];
|
|
apiGroups.forEach(apiGroup => resources.forEach(resource => verbs.forEach(verb => permissions.push({ apiGroup, resource, verb }))));
|
|
return permissions.every(permission => this.hasPermission(globalRoleRules, permission));
|
|
},
|
|
|
|
getEnabledRoles: function (globalRole, out) {
|
|
const globalRoleRules = (get(globalRole, 'rules') || []);
|
|
return out.filter(r => (get(r, 'role.rules') || []).every(rule => this.containsRule(globalRoleRules, rule)));
|
|
},
|
|
|
|
globalRoleMapping: computed('model.user.globalRoleBindings.[]', 'model.globalRoles', function () {
|
|
let out = (get(this, 'model.globalRoles') || []).filterBy('isHidden', false).map(role => {
|
|
return { role, enabled: false };
|
|
});
|
|
|
|
(get(this, 'model.user.globalRoleBindings') || []).forEach((binding) => {
|
|
const globalRole = get(binding, 'globalRole');
|
|
if (get(globalRole, 'isHidden')) {
|
|
this.getEnabledRoles(globalRole, out).forEach(r => {
|
|
r.enabled = true;
|
|
r.binding = binding;
|
|
});
|
|
} else {
|
|
let entry = out.findBy('role', globalRole);
|
|
if (entry) {
|
|
entry.enabled = true;
|
|
entry.binding = binding;
|
|
}
|
|
}
|
|
});
|
|
|
|
return out;
|
|
}),
|
|
});
|