
From: Royce Lv <lvroyce@linux.vnet.ibm.com> Update api for ldap user query, also adopt guest edit permission, validate user when change permission, add notice icon to indicate invalid user input. Signed-off-by: Royce Lv <lvroyce@linux.vnet.ibm.com> --- ui/js/src/kimchi.api.js | 15 +- ui/js/src/kimchi.guest_edit_main.js | 289 ++++++++++++++++++++++++------------ 2 files changed, 201 insertions(+), 103 deletions(-) diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js index 78c6d66..d868a4a 100644 --- a/ui/js/src/kimchi.api.js +++ b/ui/js/src/kimchi.api.js @@ -1087,14 +1087,21 @@ var kimchi = { }); }, - getHostUsers : function(suc, err) { + getHostUsers : function(usr_data, suc, err) { + var usr = usr_data ? '?_user_id='+usr_data.user_id : ''; + var handler = function(data) { + if (usr_data) { + data['_kimchi_user'] = usr_data.user_id; + } + suc(data); + } kimchi.requestJSON({ - url : kimchi.url + 'host/users', + url : kimchi.url + '/users' + usr, type : 'GET', contentType : 'application/json', dataType : 'json', resend : true, - success : suc, + success : handler, error : err ? err : function(data) { kimchi.message.error(data.responseJSON.reason); } @@ -1103,7 +1110,7 @@ var kimchi = { getHostGroups : function(suc, err) { kimchi.requestJSON({ - url : kimchi.url + 'host/groups', + url : kimchi.url + '/groups', type : 'GET', contentType : 'application/json', dataType : 'json', diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js index 9d87a73..ad0c976 100644 --- a/ui/js/src/kimchi.guest_edit_main.js +++ b/ui/js/src/kimchi.guest_edit_main.js @@ -35,6 +35,7 @@ kimchi.guest_edit_main = function() { var guestEditForm = $('#form-guest-edit-general'); var saveButton = $('#guest-edit-button-save'); + var authType; var refreshCDROMs = function() { kimchi.listVMStorages({ @@ -42,7 +43,6 @@ kimchi.guest_edit_main = function() { }, function(storages) { var container = $('#form-guest-edit-storage .body'); $(container).empty(); - $.each(storages, function(index, storage) { storage['vm'] = kimchi.selectedGuest; rowHTML = $('#' + storage['type'] + '-row-tmpl').html(); @@ -256,107 +256,180 @@ kimchi.guest_edit_main = function() { }; var setupPermission = function() { - var userNodes = {}, groupNodes = {}; - kimchi.retrieveVM(kimchi.selectedGuest, function(vm){ - kimchi.getHostUsers(function(users){ - kimchi.getHostGroups(function(groups){ - var subArray = function(a1, a2){ //a1-a2 - for(var i=0; i<a2.length; i++){ - for(var j=0; j<a1.length; j++){ - if(a2[i] == a1[j]){ - a1.splice(j, 1); - break; - } - } - } - }; - subArray(users, vm.users); subArray(groups, vm.groups); - init(users, groups, vm.users, vm.groups); - }); + //set up for LDAP + $(".add", "#form-guest-edit-permission").button({ + icons: { primary: "ui-icon-plusthick" }, + text: false + }).click(function(evt){ + evt.preventDefault(); + addItem({ + user: "", + freeze: false, + viewMode: "hide", + editMode: "", + checked: true }); }); - var sortNodes = function(container, isUser){ - nodes = container.children(); - var keys = []; - nodes.each(function(){ - keys.push($("label", this).text()); + var addItem = function(data) { + var itemNode = $.parseHTML(kimchi.substitute($('#ldap-user-tmpl').html(),data)); + $(".body", "#form-guest-edit-permission .ldap").append(itemNode); + $(".delete", itemNode).button({ + icons: { primary: "ui-icon-trash" }, + text: false + }).click(function(evt){ + evt.preventDefault(); + var item = $(this).parent().parent(); + item.remove(); }); - keys.sort(); - container.empty(); - for(var i=0; i<keys.length; i++){ - var itemNode = isUser ? userNodes[keys[i]] : groupNodes[keys[i]]; - $(itemNode).click(function(){ - $(this).toggleClass("item-picked"); - }); - container.append(itemNode); + $("input").focusout(function() { + var item = $(this).parent().parent(); + var user= $(this).val(); + item.prop("id", user); + $("label", item).text(user); + }); + $("input").focusin(function() { + $(this).removeClass("checked"); + }); + + if (data.checked == true) { + $(".checked", itemNode).addClass("hide"); } }; - var init = function(availUsers, availGroups, selUsers, selGroups){ - var initNode = function(key, isUserNode){ - var nodeGroups = isUserNode ? userNodes : groupNodes; - nodeGroups[key] = $.parseHTML(kimchi.substitute($('#permission-item').html(), { - val: key, - class: isUserNode? "user-icon" : "group-icon" - })); - }; - for(var i=0; i<availUsers.length; i++){ - initNode(availUsers[i], true); - $("#permission-avail-users").append(userNodes[availUsers[i]]); - sortNodes($("#permission-avail-users"), true); + var toggleEdit = function(item, on){ + $("label", item).toggleClass("hide", on); + $("input", item).toggleClass("hide", !on); + $(".action-area", item).toggleClass("hide"); + }; + //set up for PAM + var userNodes = {}, groupNodes = {}; + kimchi.getCapabilities(function(result) { + authType = result.auth; + if (authType == 'pam') { + $("#form-guest-edit-permission .ldap").hide(); + kimchi.retrieveVM(kimchi.selectedGuest, function(vm){ + kimchi.getHostUsers(undefined, function(users){ + kimchi.getHostGroups(function(groups){ + var subArray = function(a1, a2){ //a1-a2 + for(var i=0; i<a2.length; i++){ + for(var j=0; j<a1.length; j++){ + if(a2[i] == a1[j]){ + a1.splice(j, 1); + break; + } + } + } + }; + subArray(users, vm.users); subArray(groups, vm.groups); + init(users, groups, vm.users, vm.groups); + }); + }); + }); } - for(var i=0; i<selUsers.length; i++){ - initNode(selUsers[i], true); - $("#permission-sel-users").append(userNodes[selUsers[i]]); - sortNodes($("#permission-sel-users"), true); + else if (authType == 'ldap') { + $("#form-guest-edit-permission .pam").hide(); + kimchi.retrieveVM(kimchi.selectedGuest, function(vm){ + for (var i=0; i<vm.users.length; i++) { + var user = {'user_id' :vm.users[i]}; + kimchi.getHostUsers(user, function(data) { + addItem({ + user: data._kimchi_user, + viewMode: "", + freeze: true, + editMode: "hide", + checked: true}); + }, function (data) { + addItem({ + user: data._kimchi_user, + viewMode: "", + freeze: true, + editMode: "hide", + checked: false}); + }); + } + }); } - for(var i=0; i<availGroups.length; i++){ - initNode(availGroups[i], false); - $("#permission-avail-groups").append(groupNodes[availGroups[i]]); - sortNodes($("#permission-avail-groups"), false); + var sortNodes = function(container, isUser){ + nodes = container.children(); + var keys = []; + nodes.each(function(){ + keys.push($("label", this).text()); + }); + keys.sort(); + container.empty(); + for(var i=0; i<keys.length; i++){ + var itemNode = isUser ? userNodes[keys[i]] : groupNodes[keys[i]]; + $(itemNode).click(function(){ + $(this).toggleClass("item-picked"); + }); + container.append(itemNode); + } + }; + var init = function(availUsers, availGroups, selUsers, selGroups){ + var initNode = function(key, isUserNode){ + var nodeGroups = isUserNode ? userNodes : groupNodes; + nodeGroups[key] = $.parseHTML(kimchi.substitute($('#permission-item-pam').html(), { + val: key, + class: isUserNode? "user-icon" : "group-icon" + })); + }; + for(var i=0; i<availUsers.length; i++){ + initNode(availUsers[i], true); + $("#permission-avail-users").append(userNodes[availUsers[i]]); + sortNodes($("#permission-avail-users"), true); + } + for(var i=0; i<selUsers.length; i++){ + initNode(selUsers[i], true); + $("#permission-sel-users").append(userNodes[selUsers[i]]); + sortNodes($("#permission-sel-users"), true); + } + for(var i=0; i<availGroups.length; i++){ + initNode(availGroups[i], false); + $("#permission-avail-groups").append(groupNodes[availGroups[i]]); + sortNodes($("#permission-avail-groups"), false); + } + for(var i=0; i<selGroups.length; i++){ + initNode(selGroups[i], false); + $("#permission-sel-groups").append(groupNodes[selGroups[i]]); + sortNodes($("#permission-sel-groups"), false); + } + }; + var filterNodes = function(key, container){ + container.children().each(function(){ + $(this).css("display", $("label", this).text().indexOf(key)==-1 ? "none" : ""); + }); } - for(var i=0; i<selGroups.length; i++){ - initNode(selGroups[i], false); - $("#permission-sel-groups").append(groupNodes[selGroups[i]]); + $("#permission-avail-searchBox").on("keyup", function() { + var key = $(this).val(); + filterNodes(key, $("#permission-avail-users")); + filterNodes(key, $("#permission-avail-groups")); + }); + $("#permission-sel-searchBox").on("keyup", function() { + var key = $(this).val(); + filterNodes(key, $("#permission-sel-users")); + filterNodes(key, $("#permission-sel-groups")); + }); + $('#permissionGo').button().click(function(evt) { + evt.preventDefault(); + $("#permission-avail-users").children(".item-picked").appendTo("#permission-sel-users").removeClass("item-picked"); + sortNodes($("#permission-sel-users"), true); + $("#permission-avail-groups").children(".item-picked").appendTo("#permission-sel-groups").removeClass("item-picked"); sortNodes($("#permission-sel-groups"), false); - } - }; - var filterNodes = function(key, container){ - container.children().each(function(){ - $(this).css("display", $("label", this).text().indexOf(key)==-1 ? "none" : ""); + $("#permission-sel-searchBox").val(""); + filterNodes("", $("#permission-sel-users")); + filterNodes("", $("#permission-sel-groups")); + }); + $('#permissionBack').button().click(function(evt) { + evt.preventDefault(); + $("#permission-sel-users").children(".item-picked").appendTo("#permission-avail-users").removeClass("item-picked"); + sortNodes($("#permission-avail-users"), true); + $("#permission-sel-groups").children(".item-picked").appendTo("#permission-avail-groups").removeClass("item-picked"); + sortNodes($("#permission-avail-groups"), false); + $("#permission-avail-searchBox").val(""); + filterNodes("", $("#permission-avail-users")); + filterNodes("", $("#permission-avail-groups")); }); - } - $("#permission-avail-searchBox").on("keyup", function() { - var key = $(this).val(); - filterNodes(key, $("#permission-avail-users")); - filterNodes(key, $("#permission-avail-groups")); - }); - $("#permission-sel-searchBox").on("keyup", function() { - var key = $(this).val(); - filterNodes(key, $("#permission-sel-users")); - filterNodes(key, $("#permission-sel-groups")); - }); - $('#permissionGo').button().click(function(evt) { - evt.preventDefault(); - $("#permission-avail-users").children(".item-picked").appendTo("#permission-sel-users").removeClass("item-picked"); - sortNodes($("#permission-sel-users"), true); - $("#permission-avail-groups").children(".item-picked").appendTo("#permission-sel-groups").removeClass("item-picked"); - sortNodes($("#permission-sel-groups"), false); - $("#permission-sel-searchBox").val(""); - filterNodes("", $("#permission-sel-users")); - filterNodes("", $("#permission-sel-groups")); - }); - $('#permissionBack').button().click(function(evt) { - evt.preventDefault(); - $("#permission-sel-users").children(".item-picked").appendTo("#permission-avail-users").removeClass("item-picked"); - sortNodes($("#permission-avail-users"), true); - $("#permission-sel-groups").children(".item-picked").appendTo("#permission-avail-groups").removeClass("item-picked"); - sortNodes($("#permission-avail-groups"), false); - $("#permission-avail-searchBox").val(""); - filterNodes("", $("#permission-avail-users")); - filterNodes("", $("#permission-avail-groups")); }); - }; - + } var setupPCIDevice = function(){ kimchi.getHostPCIDevices(function(hostPCIs){ kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs){ @@ -531,14 +604,32 @@ kimchi.guest_edit_main = function() { var permissionSubmit = function(event) { var content = { users: [], groups: [] }; - $("#permission-sel-users").children().each(function(){ - content.users.push($("label", this).text()); - }); - $("#permission-sel-groups").children().each(function(){ - content.groups.push($("label", this).text()); - }); - kimchi.updateVM(kimchi.selectedGuest, content, function(){ - kimchi.window.close(); + kimchi.getCapabilities(function(result) { + authType = result.auth; + if (authType == 'pam') { + $("#permission-sel-users").children().each(function(){ + content.users.push($("label", this).text()); + }); + $("#permission-sel-groups").children().each(function(){ + content.groups.push($("label", this).text()); + }); + } + else if (authType == 'ldap') { + $(".body","#form-guest-edit-permission .ldap").children().each(function () { + var user = {'user_id': $(this).attr("id")}; + var tmp = $(this); + kimchi.getHostUsers(user, function(data) { + $("label", tmp).toggleClass("hide", false); + $("input", tmp).toggleClass("hide", true); + }, function (data) { + $("input", tmp).addClass("checked"); + }); + content.users.push($(this).attr("id")); + }); + } + kimchi.updateVM(kimchi.selectedGuest, content, function(){ + kimchi.window.close(); + }); }); } -- 1.8.3.2