From 21af54bbd62f31351a3e5ea5f74cadcd5b8e36b1 Mon Sep 17 00:00:00 2001 From: Simon Pichugin Date: Oct 15 2018 18:00:14 +0000 Subject: Issue 49928 - Fix various small WebUI schema issues Description: Make standard schema attributes and objectclasses non-editable. Attributes table should contain a string representation of the syntax attributes, and if you point a cursor on them you can see an ID. MAY and MUST attributes list shouldn't contain empty lines. Make WebUI form and CLI functionality consistent. Fix formatting and forloop lint issues. https://pagure.io/389-ds-base/issue/49928 Reviewed by: mreynolds, wibrown, mhonek (Thanks!) --- diff --git a/src/cockpit/389-console/js/schema.js b/src/cockpit/389-console/js/schema.js index 7382943..a490fac 100644 --- a/src/cockpit/389-console/js/schema.js +++ b/src/cockpit/389-console/js/schema.js @@ -10,6 +10,11 @@ var attr_btn_html = '' + ''; +var attr_btn_html_only_view = + ''; + var oc_btn_html = ''; +var oc_btn_html_only_view = + ''; + var schema_oc_table; var schema_at_table; var schema_mr_table; +var attr_usage_opts = ['userApplications', 'directoryOperation', 'distributedOperation', 'dSAOperation']; +var oc_kind_opts = ['STRUCTURAL', 'ABSTRACT', 'AUXILIARY']; + +function is_x_origin_user_defined(x_origin) { + if (typeof x_origin === 'string' && x_origin.toLowerCase() !== 'user defined' || x_origin == null) { + return false; + } else { + return true; + } +} + +// Leave only user defined attributes if the checkbox is crossed +$.fn.dataTable.ext.search.push( + function(settings, searchData, index, rowData, counter) { + var x_origin; + if ( $("#attr-user-defined").is(":checked") ) { + x_origin = rowData[10]; + if (!is_x_origin_user_defined(x_origin)) { + return false; + } + } + if ( $("#oc-user-defined").is(":checked") ) { + x_origin = rowData[6]; + if (!is_x_origin_user_defined(x_origin)) { + return false; + } + } + return true; + } +); + function clear_oc_form() { // Clear input fields and reset dropboxes $("#add-edit-oc-header").html('Add Objectclass'); @@ -34,11 +75,14 @@ function clear_oc_form() { $("#oc-name").val(""); $(".ds-input").css("border-color", "initial"); $("#oc-oid").val(""); + $("#oc-kind").prop('selectedIndex',0); + $("#oc-desc").val(""); $("#oc-parent").prop('selectedIndex',0); $("#schema-list").prop('selectedIndex',-1); $('#oc-required-list').find('option').remove(); $('#oc-allowed-list').find('option').remove(); -}; + $("#save-oc-button").attr('disabled', false); +} function clear_attr_form() { // Clear input fields and reset dropboxes @@ -49,22 +93,26 @@ function clear_attr_form() { $(".ds-input").css("border-color", "initial"); $("#attr-syntax").val(""); $("#attr-desc").val(""); + $("#attr-parent").prop('selectedIndex',0); + $("#attr-usage").prop('selectedIndex',0); $("#attr-oid").val(""); $("#attr-alias").val(""); $('#attr-multivalued').prop('checked', false); + $('#attr-no-user-mod').prop('checked', false); $("#attr-eq-mr-select").prop('selectedIndex',0); $("#attr-order-mr-select").prop('selectedIndex',0); $("#attr-sub-mr-select").prop('selectedIndex',0); -}; + $("#save-attr-button").attr('disabled', false); +} function load_schema_objects_to_select(object, select_id) { var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', object, 'list']; console.log("CMD: Get schema: " + cmd.join(' ')); - cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(data) { - var obj = JSON.parse(data); - var data = [] - for (var idx in obj['items']) { - item = obj['items'][idx]; + cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(select_data) { + var obj = JSON.parse(select_data); + var data = []; + for (var i = 0; i < obj.items.length; i++) { + item = obj.items[i]; if (item.name) { data.push.apply(data, [item.name]); } else { @@ -78,8 +126,8 @@ function load_schema_objects_to_select(object, select_id) { text : item })); }); - }).fail(function(data) { - console.log("failed: " + data.message); + }).fail(function(select_data) { + console.log("failed: " + select_data.message); check_inst_alive(1); }); } @@ -87,51 +135,45 @@ function load_schema_objects_to_select(object, select_id) { function get_and_set_schema_tables() { console.log("Loading schema..."); - // Load syntaxes - var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', "attributetypes", 'get_syntaxes']; - console.log("CMD: Get syntaxes: " + cmd.join(' ')); - cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(data) { - var obj = JSON.parse(data); - var data = [] - - load_schema_objects_to_select('matchingrules', 'attr-eq-mr-select') - load_schema_objects_to_select('matchingrules', 'attr-order-mr-select') - load_schema_objects_to_select('matchingrules', 'attr-sub-mr-select') - load_schema_objects_to_select('attributetypes', 'schema-list') - load_schema_objects_to_select('objectclasses', 'oc-parent') - - for (var idx in obj['items']) { - item = obj['items'][idx]; - data.push.apply(data, [item]); - } - // Update html select - $.each(data, function (i, item) { - $("#attr-syntax").append($('').attr("value", oc_name).text(oc_name); $("#oc-parent").append(option); } + $("#save-oc-spinner").hide(); + popup_success("The objectClass was saved in DS"); $("#add-edit-oc-form").modal('toggle'); }). fail(function(data) { $("#save-oc-spinner").hide(); popup_err("Error", "Failed to save the objectClass\n" + data.message); $("#add-edit-oc-form").modal('toggle'); - }) + }); }); // Required Attributes @@ -394,13 +518,17 @@ $(document).ready( function() { */ $("#create-attr-button").on("click", function() { clear_attr_form(); - }) + }); $("#save-attr-button").on("click", function() { var attr_name = $("#attr-name").val(); var attr_oid = $("#attr-oid").val(); var attr_syntax = $("#attr-syntax").val(); + var attr_syntax_text = $("#attr-syntax :selected").text(); + var attr_usage = $('#attr-usage').val(); var attr_desc = $('#attr-desc').val(); + var attr_x_origin= $('#attr-x-origin').val(); + var attr_parent = $('#attr-parent').val(); var attr_aliases = $('#attr-alias').val().split(" "); var eq_mr= $('#attr-eq-mr-select').val(); var order_mr = $('#attr-order-mr-select').val(); @@ -408,7 +536,11 @@ $(document).ready( function() { var multiple = 'no'; if ( $("#attr-multivalued").is(":checked") ) { multiple = 'yes'; - }; + } + var no_user_mod = false; + if ( $("#attr-no-user-mod").is(":checked") ) { + no_user_mod = true; + } var action = 'add'; var edit = false; if ( $("#add-edit-attr-header").text().indexOf("Edit Attribute") != -1){ @@ -439,95 +571,156 @@ $(document).ready( function() { } else { cmd.push.apply(cmd, ["--multi-value"]); } + if (no_user_mod) { + cmd.push.apply(cmd, ["--no-user-mod"]); + } else { + cmd.push.apply(cmd, ["--user-mod"]); + } cmd.push.apply(cmd, ["--oid", attr_oid]); + cmd.push.apply(cmd, ["--usage", attr_usage]); + cmd.push.apply(cmd, ["--sup", attr_parent]); cmd.push.apply(cmd, ["--desc", attr_desc]); - cmd.push.apply(cmd, ["--equality", eq_mr]); - cmd.push.apply(cmd, ["--substr", order_mr]); - cmd.push.apply(cmd, ["--ordering", sub_mr]); + cmd.push.apply(cmd, ["--x-origin", attr_x_origin]); + cmd.push.apply(cmd, ["--equality"]); + if (eq_mr) { + cmd.push.apply(cmd, [eq_mr]); + } else { + cmd.push.apply(cmd, [""]); + } + cmd.push.apply(cmd, ["--substr"]); + if (sub_mr) { + cmd.push.apply(cmd, [sub_mr]); + } else { + cmd.push.apply(cmd, [""]); + } + cmd.push.apply(cmd, ["--ordering"]); + if (order_mr) { + cmd.push.apply(cmd, [order_mr]); + } else { + cmd.push.apply(cmd, [""]); + } $("#save-attr-spinner").show(); console.log("CMD: Save attribute: " + cmd.join(' ')); cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}). done(function(data) { - $("#save-attr-spinner").hide(); - popup_success("The attribute was saved in DS"); + var attr_syntax_name = '
' + + attr_syntax_text.substr(0, attr_syntax_text.indexOf(" (")) + '
'; $("#attr-name").attr('disabled', false); // Update html table (if edit: delete old then add new) if ( edit ) { var selector = $('tr:contains(' + attr_name + ')'); schema_at_table.row(selector).remove().draw(false); } - - // Create attribute row to dataTable - schema_at_table.row.add( [ - attr_name, - attr_oid, - attr_syntax, - multiple, - eq_mr, - order_mr, - sub_mr, - attr_btn_html, - attr_desc, - attr_aliases - ] ).draw( false ); - if (!edit) { - var option = $('').attr("value", attr_name).text(attr_name); - $("#schema-list").append(option); - } + var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', 'attributetypes', 'query', attr_name]; + console.log("CMD: Query attribute: " + cmd.join(' ')); + cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}). + done(function(at_data) { + var obj = JSON.parse(at_data); + var item = obj.at; + schema_at_table.row.add( [ + item.name, + item.oid, + attr_syntax_name, + multiple, + item.equality, + item.ordering, + item.substr, + attr_btn_html, + item.desc, + item.aliases, + item.x_origin, + attr_usage_opts[item.usage], + item.no_user_mod, + item.sup + ] ).draw( false ); + $("#attr-name").attr('disabled', false); + }). + fail(function(at_data) { + popup_err("err", at_data.message); + console.log("failed: " + at_data.message); + check_inst_alive(1); + }); + if (!edit) { + var option = $('').attr("value", attr_name).text(attr_name); + $("#schema-list").append(option); + } + $("#save-attr-spinner").hide(); + popup_success("The attribute was saved in DS"); $("#add-edit-attr-form").modal('toggle'); }). fail(function(data) { $("#save-attr-spinner").hide(); popup_err("Error", "Failed to save the attribute\n" + data.message); $("#add-edit-attr-form").modal('toggle'); - }) + }); }); - $(document).on('click', '.attr-edit-btn', function(e) { - e.preventDefault(); - clear_attr_form(); - var data = schema_at_table.row( $(this).parents('tr') ).data(); - var edit_attr_name = data[0]; - var edit_attr_oid = data[1]; - var edit_attr_syntax = data[2]; - var edit_attr_multivalued = data[3]; - var edit_attr_eq_mr = data[4]; - var edit_attr_order_mr = data[5]; - var edit_attr_sub_mr = data[6]; - var edit_attr_desc = data[8]; - var edit_attr_aliases = data[9]; - if (edit_attr_eq_mr) { - edit_attr_eq_mr = data[4] - } - if (edit_attr_order_mr) { - edit_attr_order_mr = data[5] - } - if (edit_attr_sub_mr) { - edit_attr_sub_mr = data[6] - } + function load_attr_form(element) { + clear_attr_form(); + var data = schema_at_table.row(element.parents('tr') ).data(); + var edit_attr_name = data[0]; + var edit_attr_oid = data[1]; + var edit_attr_syntax = $.parseHTML(data[2])[0].title; + var edit_attr_multivalued = data[3]; + var edit_attr_eq_mr = data[4]; + var edit_attr_order_mr = data[5]; + var edit_attr_sub_mr = data[6]; + var edit_attr_desc = data[8]; + var edit_attr_aliases = data[9]; + var edit_attr_x_origin = data[10]; + var edit_attr_usage = data[11]; + var edit_attr_no_user_mod = data[12]; + var edit_attr_parent = data[13]; + if (edit_attr_eq_mr) { + edit_attr_eq_mr = data[4]; + } + if (edit_attr_order_mr) { + edit_attr_order_mr = data[5]; + } + if (edit_attr_sub_mr) { + edit_attr_sub_mr = data[6]; + } - $("#add-edit-attr-header").html('Edit Attribute: ' + edit_attr_name); - $("#attr-name").val(edit_attr_name); - $("#attr-name").attr('disabled', true); - $("#attr-oid").val(edit_attr_oid); - $("#attr-desc").val(edit_attr_desc); - if (edit_attr_aliases) { - $("#attr-alias").val(edit_attr_aliases.join(" ")); - } - $("#attr-syntax").val(edit_attr_syntax); - $("#attr-multivalued").val(edit_attr_syntax); - $("#attr-multivalued").prop('checked', false); - if (edit_attr_multivalued == "yes") { - $("#attr-multivalued").prop('checked', true); - } - $("#save-attr-spinner").show(); - $("#attr-eq-mr-select")[0].value = edit_attr_eq_mr; - $("#attr-order-mr-select")[0].value = edit_attr_order_mr; - $("#attr-sub-mr-select")[0].value = edit_attr_sub_mr; - $("#save-attr-spinner").hide(); + $("#add-edit-attr-header").html('Edit Attribute: ' + edit_attr_name); + $("#attr-name").val(edit_attr_name); + $("#attr-name").attr('disabled', true); + $("#attr-oid").val(edit_attr_oid); + $("#attr-usage")[0].value = edit_attr_usage; + $("#attr-parent")[0].value = edit_attr_parent; + $("#attr-desc").val(edit_attr_desc); + $("#attr-x-origin").val(edit_attr_x_origin); + if (edit_attr_aliases) { + $("#attr-alias").val(edit_attr_aliases.join(" ")); + } + $("#attr-syntax").val(edit_attr_syntax); + $("#attr-multivalued").prop('checked', false); + if (edit_attr_multivalued == "yes") { + $("#attr-multivalued").prop('checked', true); + } + $("#attr-no-user-mod").prop('checked', false); + if (edit_attr_no_user_mod) { + $("#attr-no-user-mod").prop('checked', true); + } + $("#save-attr-spinner").show(); + $("#attr-eq-mr-select")[0].value = edit_attr_eq_mr; + $("#attr-order-mr-select")[0].value = edit_attr_order_mr; + $("#attr-sub-mr-select")[0].value = edit_attr_sub_mr; + $("#save-attr-spinner").hide(); - $("#add-edit-attr-form").modal('toggle'); - } ); + $("#add-edit-attr-form").modal('toggle'); + } + + $(document).on('click', '.attr-view-btn', function(e) { + e.preventDefault(); + load_attr_form($(this)); + $("#save-attr-button").attr('title', 'Only user-defined attributes can be modified'); + $("#save-attr-button").attr('disabled', true); + }); + + $(document).on('click', '.attr-edit-btn', function(e) { + e.preventDefault(); + load_attr_form($(this)); + }); $(document).on('click', '.attr-del-btn', function(e) { e.preventDefault(); @@ -537,9 +730,9 @@ $(document).ready( function() { popup_confirm("Are you sure you want to delete attribute: " + del_attr_name + "", "Confirmation", function (yes) { if (yes) { var cmd = [DSCONF, '-j', 'ldapi://%2fvar%2frun%2f' + server_id + '.socket', 'schema', 'attributetypes', 'remove', del_attr_name]; - console.log("CMD: remove attribute: " + cmd.join(' ')); + console.log("CMD: Remove attribute: " + cmd.join(' ')); cockpit.spawn(cmd, { superuser: true, "err": "message", "environ": [ENV]}).done(function(data) { - popup_success("Attribute was successfully removed!") + popup_success("Attribute was successfully removed!"); schema_at_table.row( at_row.parents('tr') ).remove().draw( false ); $("#schema-list option[value='" + del_attr_name + "']").remove(); }).fail(function(data) { @@ -549,17 +742,19 @@ $(document).ready( function() { }); }); - $(document).on('click', '.oc-edit-btn', function(e) { - e.preventDefault(); + function load_oc_form(element) { clear_oc_form(); - var data = schema_oc_table.row( $(this).parents('tr') ).data(); + var data = schema_oc_table.row(element.parents('tr') ).data(); var edit_oc_name = data[0]; var edit_oc_oid = data[1]; - var edit_oc_parent = data[2] + var edit_oc_parent = data[2]; var edit_oc_required = data[3].split(" "); var edit_oc_allowed = data[4].split(" "); + var edit_oc_x_origin = data[6]; + var edit_oc_kind = data[7]; + var edit_oc_desc = data[8]; if (edit_oc_parent) { - edit_oc_parent = data[2] + edit_oc_parent = data[2]; } $("#save-oc-spinner").show(); @@ -567,24 +762,42 @@ $(document).ready( function() { $("#oc-name").attr('disabled', true); $("#oc-name").val(edit_oc_name); $("#oc-oid").val(edit_oc_oid); + $("#oc-kind")[0].value = edit_oc_kind; + $("#oc-desc").val(edit_oc_desc); + $("#oc-x-origin").val(edit_oc_x_origin); $("#oc-parent")[0].value = edit_oc_parent; $.each(edit_oc_required, function (i, item) { - $("#oc-required-list").append($('