summaryrefslogtreecommitdiffstats
path: root/install/ui/src/freeipa/aci.js
diff options
context:
space:
mode:
Diffstat (limited to 'install/ui/src/freeipa/aci.js')
-rw-r--r--install/ui/src/freeipa/aci.js897
1 files changed, 897 insertions, 0 deletions
diff --git a/install/ui/src/freeipa/aci.js b/install/ui/src/freeipa/aci.js
new file mode 100644
index 000000000..bd7de19ab
--- /dev/null
+++ b/install/ui/src/freeipa/aci.js
@@ -0,0 +1,897 @@
+/*jsl:import ipa.js */
+
+/* Authors:
+ * Adam Young <ayoung@redhat.com>
+ * Endi S. Dewata <edewata@redhat.com>
+ *
+ * Copyright (C) 2010 Red Hat
+ * see file 'COPYING' for use and warranty information
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 only
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* REQUIRES: ipa.js, details.js, search.js, add.js, facet.js, entity.js */
+
+IPA.aci = {};
+
+IPA.aci.permission_entity = function(spec) {
+
+ var that = IPA.entity(spec);
+
+ that.init = function() {
+ that.entity_init();
+
+ that.builder.facet_groups(['settings', 'privilege']).
+ search_facet({
+ columns: [ 'cn' ]
+ }).
+ details_facet({
+ factory: IPA.aci.permission_details_facet,
+ fields: [
+ {
+ name:'cn',
+ widget: 'identity.cn'
+ },
+ {
+ type: 'rights',
+ name: 'permissions',
+ widget: 'rights.permissions'
+ },
+ {
+ type: 'select',
+ name: 'target',
+ widget: 'target.target',
+ enabled: false
+ },
+ {
+ name: 'filter',
+ widget: 'target.filter',
+ enabled: false
+ },
+ {
+ type: 'entity_select',
+ name: 'memberof',
+ widget: 'target.memberof',
+ enabled: false
+ },
+ {
+ name: 'subtree',
+ widget: 'target.subtree',
+ enabled: false
+ },
+ {
+ type: 'entity_select',
+ name: 'targetgroup',
+ widget: 'target.targetgroup',
+ enabled: false
+ },
+ {
+ type: 'select',
+ name: 'type',
+ widget: 'target.type',
+ enabled: false
+ },
+ {
+ name: 'attrs',
+ widget: 'target.attrs',
+ enabled: false
+ },
+ {
+ name: 'attrs_multi',
+ param: 'attrs',
+ type: 'multivalued',
+ widget: 'target.attrs_multi',
+ enabled: false
+ }
+ ],
+ widgets: [
+ {
+ type: 'details_table_section',
+ name: 'identity',
+ label: IPA.messages.objects.permission.identity,
+ widgets: [
+ 'cn'
+ ]
+ },
+ {
+ type: 'details_table_section',
+ name: 'rights',
+ label: IPA.messages.objects.permission.rights,
+ widgets: [
+ {
+ type: 'rights',
+ name: 'permissions'
+ }
+ ]
+ },
+ {
+ type: 'permission_target',
+ container_factory: IPA.details_table_section,
+ label: IPA.messages.objects.permission.target,
+ name: 'target',
+ show_target: false
+ }
+ ],
+ policies: [
+ IPA.permission_target_policy('target')
+ ]
+ }).
+ association_facet({
+ name: 'member_privilege',
+ facet_group: 'privilege'
+ }).
+ adder_dialog({
+ height: 450,
+ fields: [
+ {
+ name:'cn',
+ widget: 'general.cn'
+ },
+ {
+ type: 'rights',
+ name: 'permissions',
+ widget: 'general.permissions'
+ },
+ {
+ type: 'select',
+ name: 'target',
+ widget: 'target.target',
+ enabled: false
+ },
+ {
+ name: 'filter',
+ widget: 'target.filter',
+ enabled: false
+ },
+ {
+ type: 'entity_select',
+ name: 'memberof',
+ widget: 'target.memberof',
+ enabled: false
+ },
+ {
+ name: 'subtree',
+ widget: 'target.subtree',
+ enabled: false
+ },
+ {
+ type: 'entity_select',
+ name: 'targetgroup',
+ widget: 'target.targetgroup',
+ enabled: false
+ },
+ {
+ type: 'select',
+ name: 'type',
+ widget: 'target.type',
+ enabled: false
+ },
+ {
+ name: 'attrs',
+ widget: 'target.attrs',
+ enabled: false
+ },
+ {
+ name: 'attrs_multi',
+ type: 'multivalued',
+ param: 'attrs',
+ widget: 'target.attrs_multi',
+ enabled: false
+ }
+ ],
+ widgets: [
+ {
+ type: 'details_table_section_nc',
+ name: 'general',
+ widgets: [
+ 'cn',
+ {
+ type: 'rights',
+ name: 'permissions'
+ }
+ ]
+ },
+ {
+ type: 'permission_target',
+ name:'target',
+ show_target: true
+ }
+ ],
+ policies: [
+ IPA.permission_target_policy('target')
+ ]
+ });
+ };
+
+ return that;
+};
+
+IPA.aci.permission_details_facet = function(spec) {
+
+ var that = IPA.details_facet(spec);
+
+ that.get_refresh_command_name = function() {
+ return that.entity.name+'_show_'+that.pkey;
+ };
+
+ return that;
+};
+
+IPA.aci.privilege_entity = function(spec) {
+
+ var that = IPA.entity(spec);
+
+ that.init = function() {
+ that.entity_init();
+
+ that.builder.facet_groups(['permission', 'settings', 'role']).
+ search_facet({
+ columns: [
+ 'cn',
+ 'description'
+ ]
+ }).
+ details_facet({
+ sections: [
+ {
+ name: 'identity',
+ label: IPA.messages.details.identity,
+ fields: [
+ 'cn',
+ {
+ type: 'textarea',
+ name: 'description'
+ }
+ ]
+ }
+ ]
+ }).
+ association_facet({
+ name: 'member_role',
+ facet_group: 'role',
+ add_method: 'add_privilege',
+ remove_method: 'remove_privilege',
+ associator: IPA.serial_associator
+ }).
+ association_facet({
+ name: 'memberof_permission',
+ facet_group: 'permission',
+ add_method: 'add_permission',
+ remove_method: 'remove_permission'
+ }).
+ standard_association_facets().
+ adder_dialog({
+ fields: [
+ 'cn',
+ {
+ type: 'textarea',
+ name: 'description'
+ }
+ ]
+ });
+ };
+
+ return that;
+};
+
+IPA.aci.role_entity = function(spec) {
+
+ var that = IPA.entity(spec);
+
+ that.init = function() {
+ that.entity_init();
+
+ that.builder.facet_groups(['member', 'privilege', 'settings']).
+ search_facet({
+ columns: [
+ 'cn',
+ 'description'
+ ]
+ }).
+ details_facet({
+ sections: [
+ {
+ name: 'identity',
+ label: IPA.messages.objects.role.identity,
+ fields: [
+ 'cn',
+ {
+ type: 'textarea',
+ name: 'description'
+ }
+ ]
+ }
+ ]
+ }).
+ association_facet({
+ name: 'memberof_privilege',
+ facet_group: 'privilege',
+ add_method: 'add_privilege',
+ remove_method: 'remove_privilege'
+ }).
+ standard_association_facets().
+ adder_dialog({
+ fields: [
+ 'cn',
+ {
+ type: 'textarea',
+ name: 'description'
+ }
+ ]
+ });
+ };
+
+ return that;
+};
+
+IPA.aci.selfservice_entity = function(spec) {
+
+ var that = IPA.entity(spec);
+
+ that.init = function() {
+ that.entity_init();
+
+ that.builder.search_facet({
+ columns: [ 'aciname' ],
+ pagination: false
+ }).
+ details_facet({
+ check_rights: false,
+ sections: [
+ {
+ name: 'general',
+ label: IPA.messages.details.general,
+ fields: [
+ 'aciname',
+ {
+ type: 'attributes',
+ object_type: 'user',
+ name: 'attrs'
+ }
+ ]
+ }
+ ]
+ }).
+ adder_dialog({
+ fields: [
+ 'aciname',
+ {
+ type: 'attributes',
+ object_type: 'user',
+ name: 'attrs'
+ }
+ ]
+ });
+ };
+
+ return that;
+};
+
+IPA.aci.delegation_entity = function(spec) {
+
+ var that = IPA.entity(spec);
+
+ that.group_entity = IPA.get_entity(spec.group_entity || 'group');
+
+ that.init = function() {
+ that.entity_init();
+
+ that.builder.search_facet({
+ columns: [ 'aciname' ],
+ pagination: false
+ }).
+ details_facet({
+ check_rights: false,
+ sections: [
+ {
+ name: 'general',
+ label: IPA.messages.details.general,
+ fields: [
+ 'aciname',
+ {
+ type: 'checkboxes',
+ name: 'permissions',
+ required: true,
+ options: IPA.create_options(['read', 'write'])
+ },
+ {
+ type: 'entity_select',
+ name: 'group',
+ other_entity: that.group_entity,
+ other_field: 'cn'
+ },
+ {
+ type: 'entity_select',
+ name: 'memberof',
+ other_entity: that.group_entity,
+ other_field: 'cn'
+ },
+ {
+ type: 'attributes',
+ name: 'attrs',
+ object_type: 'user'
+ }
+ ]
+ }
+ ]
+ }).
+ standard_association_facets().
+ adder_dialog({
+ fields: [
+ 'aciname',
+ {
+ type: 'checkboxes',
+ name: 'permissions',
+ options: IPA.create_options(['read', 'write'])
+ },
+ {
+ type: 'entity_select',
+ name: 'group',
+ other_entity: that.group_entity,
+ other_field: 'cn'
+ },
+ {
+ type: 'entity_select',
+ name: 'memberof',
+ other_entity: that.group_entity,
+ other_field: 'cn'
+ },
+ {
+ type: 'attributes',
+ name: 'attrs',
+ object_type: 'user'
+ }
+ ]
+ });
+ };
+
+ return that;
+};
+
+
+IPA.attributes_widget = function(spec) {
+
+ spec = spec || {};
+
+ var that = IPA.checkboxes_widget(spec);
+
+ that.object_type = spec.object_type;
+ that.skip_unmatched = spec.skip_unmatched === undefined ? false : spec.skip_unmatched;
+
+ var id = spec.name;
+
+ that.create = function(container) {
+ that.container = container;
+
+ var attr_container = $('<div/>', {
+ 'class': 'aci-attribute-table-container'
+ }).appendTo(container);
+
+ that.table = $('<table/>', {
+ id:id,
+ 'class':'search-table aci-attribute-table scrollable'
+ }).
+ append('<thead/>').
+ append('<tbody/>').
+ appendTo(attr_container);
+
+ var tr = $('<tr></tr>').appendTo($('thead', that.table));
+
+ tr.append($('<th/>', {
+ html: $('<input/>', {
+ type: "checkbox",
+ click: function() {
+ $('.aci-attribute', that.table).
+ prop('checked', $(this).prop('checked'));
+ that.value_changed.notify([], that);
+ }
+ })
+ })).append($('<th/>', {
+ 'class': 'aci-attribute-column',
+ html: IPA.messages.objects.aci.attribute
+ }));
+
+ if (that.undo) {
+ that.create_undo(container);
+ }
+
+ if (that.object_type) {
+ that.populate(that.object_type);
+ }
+
+ that.create_error_link(container);
+ };
+
+ that.create_options = function(options) {
+ var tbody = $('tbody', that.table);
+
+ for (var i=0; i<options.length ; i++){
+ var value = options[i].toLowerCase();
+ var tr = $('<tr/>').appendTo(tbody);
+
+ var td = $('<td/>').appendTo(tr);
+ td.append($('<input/>',{
+ type: 'checkbox',
+ name: that.name,
+ value: value,
+ 'class': 'aci-attribute',
+ change: function() {
+ that.value_changed.notify([], that);
+ }
+ }));
+ td = $('<td/>').appendTo(tr);
+ td.append($('<label/>',{
+ text: value
+ }));
+ }
+ };
+
+ that.update = function(values) {
+
+ that.values = [];
+
+ values = values || [];
+ for (var i=0; i<values.length; i++) {
+
+ var value = values[i];
+
+ if (!value || value === '') continue;
+
+ value = value.toLowerCase();
+ that.values.push(value);
+ }
+
+ that.populate(that.object_type);
+ that.append();
+ that.checkboxes_update(values);
+ };
+
+ that.populate = function(object_type) {
+
+ $('tbody tr', that.table).remove();
+
+ if (!object_type || object_type === '') return;
+
+ var metadata = IPA.metadata.objects[object_type];
+ if (!metadata) return;
+
+ var aciattrs = metadata.aciattrs;
+
+ that.create_options(aciattrs);
+ };
+
+ that.append = function() {
+
+ if (!that.values) return;
+
+ var unmatched = [];
+
+ for (var i=0; i<that.values.length; i++) {
+ var input = $('input[name="'+that.name+'"]'+
+ '[value="'+that.values[i]+'"]', that.container);
+ if (!input.length) {
+ unmatched.push(that.values[i]);
+ }
+ }
+
+ if (unmatched.length > 0 && !that.skip_unmatched) {
+ that.create_options(unmatched);
+ }
+ };
+
+ that.show_undo = function() {
+ $(that.undo_span).css('display', 'inline-block');
+ };
+
+ return that;
+};
+
+IPA.widget_factories['attributes'] = IPA.attributes_widget;
+IPA.field_factories['attributes'] = IPA.checkboxes_field;
+
+IPA.rights_widget = function(spec) {
+
+ var that = IPA.checkboxes_widget(spec);
+
+ that.rights = ['write', 'add', 'delete'];
+ for (var i=0; i<that.rights.length; i++) {
+ var right = that.rights[i];
+ that.add_option({label: right, value: right});
+ }
+
+ return that;
+};
+
+IPA.widget_factories['rights'] = IPA.rights_widget;
+IPA.field_factories['rights'] = IPA.checkboxes_field;
+
+IPA.permission_target_widget = function(spec) {
+
+ spec = spec || {};
+
+ var factory = spec.container_factory || IPA.details_table_section_nc;
+
+ var that = factory(spec);
+
+ that.group_entity = IPA.get_entity(spec.group_entity || 'group');
+
+ that.targets = [ 'filter', 'subtree', 'targetgroup', 'type' ];
+ that.target = that.targets[0];
+ that.show_target = spec.show_target;
+
+ var init = function() {
+
+ that.target_select = IPA.select_widget({
+ entity: that.entity,
+ name: 'target',
+ label: IPA.messages.objects.permission.target,
+ hidden: !that.show_target
+ });
+
+ for (var i=0; i<that.targets.length; i++) {
+ var target = that.targets[i];
+ var target_param = IPA.get_entity_param('permission', target);
+
+ that.target_select.options.push({
+ label: target_param.label,
+ value: target
+ });
+ }
+
+ that.widgets.add_widget(that.target_select);
+
+
+ that.memberof_select = IPA.entity_select_widget({
+ entity: that.entity,
+ name: 'memberof',
+ other_entity: that.group_entity,
+ other_field: 'cn',
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.memberof_select);
+
+ that.filter_text = IPA.text_widget({
+ entity: that.entity,
+ name: 'filter',
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.filter_text);
+
+ that.subtree_textarea = IPA.textarea_widget({
+ entity: that.entity,
+ name: 'subtree',
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.subtree_textarea);
+
+ that.group_select = IPA.entity_select_widget({
+ entity: that.entity,
+ name: 'targetgroup',
+ other_entity: that.group_entity,
+ other_field: 'cn',
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.group_select);
+
+ that.type_select = IPA.select_widget({
+ entity: that.entity,
+ name: 'type',
+ hidden: true
+ });
+
+ var type_param = IPA.get_entity_param('permission', 'type');
+
+ for (var j=0; j<type_param.values.length; j++) {
+ var type_name = type_param.values[j];
+ var type_label = IPA.metadata.objects[type_name].label_singular;
+
+ that.type_select.options.push({
+ label: type_label,
+ value: type_name
+ });
+ }
+
+ that.widgets.add_widget(that.type_select);
+
+ that.attribute_table = IPA.attributes_widget({
+ entity: that.entity,
+ name: 'attrs',
+ object_type: type_param.values[0],
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.attribute_table);
+
+ that.attribute_multivalued = IPA.multivalued_widget({
+ entity: that.entity,
+ name: 'attrs_multi',
+ hidden: true
+ });
+
+ that.widgets.add_widget(that.attribute_multivalued);
+ };
+
+ init();
+
+ return that;
+};
+
+IPA.permission_target_policy = function (widget_name) {
+
+ var that = IPA.facet_policy();
+
+ that.init = function() {
+
+ that.permission_target = that.container.widgets.get_widget(widget_name);
+ var widgets = that.permission_target.widgets;
+
+ var target_select = widgets.get_widget('target');
+ target_select.value_changed.attach(function() {
+ var target = target_select.save()[0];
+ that.select_target(target);
+ });
+
+ var type_select = widgets.get_widget('type');
+
+ type_select.value_changed.attach(function() {
+ var type = type_select.save()[0];
+ that.set_attrs_type(type, true);
+ });
+
+ type_select.undo_clicked.attach(function() {
+ var type = type_select.save()[0];
+ that.set_attrs_type(type, true);
+ });
+ };
+
+ that.set_attrs_type = function(type, skip_unmatched) {
+ var attribute_field = that.container.fields.get_field('attrs');
+ var attribute_table = that.permission_target.widgets.get_widget('attrs');
+ var skip_unmatched_org = attribute_table.skip_unmatched;
+ attribute_table.object_type = type;
+ // skip values which don't belong to new type. Bug #2617
+ attribute_table.skip_unmatched = skip_unmatched || skip_unmatched_org;
+ attribute_field.reset();
+ // force value_change to update dirty status if some unmatched values were skipped
+ attribute_table.value_changed.notify([], attribute_table);
+ attribute_table.skip_unmatched = skip_unmatched_org;
+ };
+
+ that.update_attrs = function() {
+
+ var type_select = that.permission_target.widgets.get_widget('type');
+ var type = type_select.save()[0];
+ that.set_attrs_type(type, false);
+ };
+
+ that.post_create = function() {
+ that.select_target(that.permission_target.targets[0]);
+ };
+
+ that.post_load = function(data) {
+
+ var displayed_target;
+
+ for (var target in that.target_mapping) {
+
+ if (data.result.result[target]) {
+ displayed_target = target;
+ } else {
+ that.set_target_visible(target, false);
+ }
+ }
+
+ if (displayed_target) {
+ that.permission_target.target = displayed_target;
+ that.set_target_visible(displayed_target, true);
+ }
+ };
+
+ that.select_target = function(target) {
+ that.set_target_visible(that.permission_target.target, false);
+ that.permission_target.target = target;
+ that.set_target_visible(that.permission_target.target, true);
+ };
+
+ that.set_target_visible = function(target, visible) {
+
+ var target_info = that.target_mapping[target];
+ that.set_target_visible_core(target_info, visible);
+ };
+
+ that.set_target_visible_core = function(target_info, visible) {
+ var widget = that.permission_target.widgets.get_widget(target_info.name);
+ var field = that.container.fields.get_field(target_info.name);
+ that.permission_target.set_row_visible(target_info.name, visible);
+ field.enabled = visible;
+ field.set_required(visible && target_info.required);
+ widget.hidden = !visible;
+
+ if (target_info.additional) {
+ for (var i=0; i<target_info.additional.length; i++) {
+ var nested_info = target_info.additional[i];
+ that.set_target_visible_core(nested_info, visible);
+ }
+ }
+
+ if (target_info.action) target_info.action();
+ };
+
+
+ that.target_mapping = {
+ filter: {
+ name: 'filter',
+ required: true,
+ additional: [
+ {
+ name: 'attrs_multi'
+ }
+ ]
+ },
+ subtree: {
+ name: 'subtree',
+ required: true,
+ additional: [
+ {
+ name: 'memberof'
+ },
+ {
+ name: 'attrs_multi'
+ }
+ ]
+ },
+ targetgroup: {
+ name: 'targetgroup',
+ required: true,
+ additional: [
+ {
+ name: 'attrs'
+ }
+ ],
+ action: function() {
+ that.set_attrs_type('group', false);
+ }
+ },
+ type: {
+ name: 'type',
+ additional: [
+ {
+ name: 'memberof'
+ },
+ {
+ name: 'attrs'
+ }
+ ],
+ action: function() {
+ that.update_attrs();
+ }
+ }
+ };
+
+
+ return that;
+};
+
+IPA.widget_factories['permission_target'] = IPA.permission_target_widget;
+
+
+IPA.register('permission', IPA.aci.permission_entity);
+IPA.register('privilege', IPA.aci.privilege_entity);
+IPA.register('role', IPA.aci.role_entity);
+IPA.register('selfservice', IPA.aci.selfservice_entity);
+IPA.register('delegation', IPA.aci.delegation_entity);