[Kimchi-devel] [PATCHv2 2/2] Change guest edit permission logic
Aline Manera
alinefm at linux.vnet.ibm.com
Mon Nov 24 15:32:19 UTC 2014
On 11/20/2014 08:22 AM, lvroyce at linux.vnet.ibm.com wrote:
> From: Royce Lv <lvroyce at 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 at linux.vnet.ibm.com>
> ---
> ui/js/src/kimchi.api.js | 15 +-
> ui/js/src/kimchi.guest_edit_main.js | 300 ++++++++++++++++++++++++------------
> 2 files changed, 212 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) {
Let's rename it to "GetUsers" or if you want to differ from PAM, use
"GetUserById"
> + 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) {
Same here.
> 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..bb621d2 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,193 @@ 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);
> + $(".edit", itemNode).button({
> + disabled: data.freeze,
> + icons: { primary: "ui-icon-pencil" },
> + text: false
> + }).click(function(evt){
> + evt.preventDefault();
> + toggleEdit($(this).parent().parent(), true);
> });
> - 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);
> + $(".delete", itemNode).button({
> + icons: { primary: "ui-icon-trash" },
> + text: false
> + }).click(function(evt){
> + evt.preventDefault();
> + var item = $(this).parent().parent();
> + item.remove();
> + });
> + $("input").focusout(function() {
> + var item = $(this).parent().parent();
> + var user= $(this).val();
> + item.prop("id", user);
> + $("label", item).text(user);
> + toggleEdit(item, false);
> + });
> + if (data.checked == true) {
> + $(".checked", itemNode).addClass("hide");
> }
> + $(".cancel", itemNode).button({
> + icons: { primary: "ui-icon-arrowreturnthick-1-w" },
> + text: false
> + }).click(function(evt){
> + evt.preventDefault();
> + var item = $(this).parent().parent();
> + $("label", item).text()==="" ? item.remove() : toggleEdit(item, false);
> + });
> };
> - 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) {
The capabilities values are cached on kimchi.capabilities variable so
you don't need to request it again.
You can check kimchi.host.js for details on how use the
kimchi.capabilities variable.
> + 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 +617,30 @@ 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) {
> + }, function (data) {
> + $(".checked", tmp).removeClass("hide");
> + });
> + content.users.push($(this).attr("id"));
> + });
> + }
> + kimchi.updateVM(kimchi.selectedGuest, content, function(){
> + kimchi.window.close();
> + });
> });
> }
>
More information about the Kimchi-devel
mailing list