From f907e370d1ee342166eaf9dd0a27dada79ed79f5 Mon Sep 17 00:00:00 2001 From: will Date: Wed, 3 Nov 2010 22:10:54 -0700 Subject: [PATCH] - Added the rest of the VPN UI feature with the exception of displaying the preshared key. - AddVpnUserCmd will now return the embedded object. - Fixed RemoteAccssVpnResponse to return "iprange" instead of "ipRange" --- .../com/cloud/api/commands/AddVpnUserCmd.java | 25 +- .../api/response/RemoteAccessVpnResponse.java | 2 +- .../src/com/cloud/network/NetworkManager.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 24 +- ui/jsp/ipaddress.jsp | 112 ++++++-- ui/scripts/cloud.core.ipaddress.js | 264 +++++++++++++++++- 6 files changed, 389 insertions(+), 40 deletions(-) diff --git a/server/src/com/cloud/api/commands/AddVpnUserCmd.java b/server/src/com/cloud/api/commands/AddVpnUserCmd.java index 193420cb1d1..cd01e4e0155 100644 --- a/server/src/com/cloud/api/commands/AddVpnUserCmd.java +++ b/server/src/com/cloud/api/commands/AddVpnUserCmd.java @@ -24,11 +24,11 @@ import com.cloud.api.ApiDBUtils; import com.cloud.api.BaseAsyncCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.response.RemoteAccessVpnResponse; import com.cloud.api.response.SuccessResponse; +import com.cloud.api.response.VpnUsersResponse; import com.cloud.event.EventTypes; import com.cloud.network.NetworkManager; -import com.cloud.network.RemoteAccessVpnVO; +import com.cloud.network.VpnUserVO; import com.cloud.user.Account; import com.cloud.user.UserContext; @@ -93,12 +93,21 @@ public class AddVpnUserCmd extends BaseAsyncCmd { } @Override @SuppressWarnings("unchecked") - public SuccessResponse getResponse() { - Boolean success = (Boolean)getResponseObject(); - SuccessResponse response = new SuccessResponse(); - response.setSuccess(success); - response.setResponseName(getName()); - return response; + public VpnUsersResponse getResponse() { + VpnUserVO vpnUser = (VpnUserVO)getResponseObject(); + VpnUsersResponse vpnResponse = new VpnUsersResponse(); + vpnResponse.setId(vpnUser.getId()); + vpnResponse.setUsername(vpnUser.getUsername()); + vpnResponse.setAccountName(vpnUser.getAccountName()); + + Account accountTemp = ApiDBUtils.findAccountById(vpnUser.getAccountId()); + if (accountTemp != null) { + vpnResponse.setDomainId(accountTemp.getDomainId()); + vpnResponse.setDomainName(ApiDBUtils.findDomainById(accountTemp.getDomainId()).getName()); + } + + vpnResponse.setResponseName(getName()); + return vpnResponse; } @Override diff --git a/server/src/com/cloud/api/response/RemoteAccessVpnResponse.java b/server/src/com/cloud/api/response/RemoteAccessVpnResponse.java index 41de0de2e5d..3b753b6849b 100644 --- a/server/src/com/cloud/api/response/RemoteAccessVpnResponse.java +++ b/server/src/com/cloud/api/response/RemoteAccessVpnResponse.java @@ -27,7 +27,7 @@ public class RemoteAccessVpnResponse extends BaseResponse { @SerializedName("publicip") @Param(description="the public ip address of the vpn server") private String publicIp; - @SerializedName("ipRange") @Param(description="the range of ips to allocate to the clients") + @SerializedName("iprange") @Param(description="the range of ips to allocate to the clients") private String ipRange; @SerializedName("presharedkey") @Param(description="the ipsec preshared key") diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index d1c06b06777..de5247e72ab 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -345,7 +345,7 @@ public interface NetworkManager extends Manager { */ public boolean destroyRemoteAccessVpn(DeleteRemoteAccessVpnCmd cmd) throws ConcurrentOperationException; - boolean addVpnUser(AddVpnUserCmd cmd) throws ConcurrentOperationException; + VpnUserVO addVpnUser(AddVpnUserCmd cmd) throws ConcurrentOperationException; boolean removeVpnUser(RemoveVpnUserCmd cmd) throws ConcurrentOperationException; } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index f7c4c436fea..8c5c9c667f6 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2741,7 +2741,7 @@ public class NetworkManagerImpl implements NetworkManager, DomainRouterService { } @Override - public boolean addVpnUser(AddVpnUserCmd cmd) throws ConcurrentOperationException, InvalidParameterValueException { + public VpnUserVO addVpnUser(AddVpnUserCmd cmd) throws ConcurrentOperationException, InvalidParameterValueException { Long userId = UserContext.current().getUserId(); Account account = getAccountForApiCommand(cmd.getAccountName(), cmd.getDomainId()); EventUtils.saveStartedEvent(userId, account.getId(), EventTypes.EVENT_VPN_USER_ADD, "Add VPN user for account: " + account.getAccountName(), cmd.getStartEventId()); @@ -2752,13 +2752,13 @@ public class NetworkManagerImpl implements NetworkManager, DomainRouterService { if (!cmd.getPassword().matches("^[a-zA-Z0-9][a-zA-Z0-9@#+=._-]{2,31}$")) { throw new InvalidParameterValueException("Password has to be 3-32 characters including alphabets, numbers and the set '@#+=.-_'"); } - boolean added = addRemoveVpnUser(account, cmd.getUserName(), cmd.getPassword(), true); - if (added) { + VpnUserVO user = addRemoveVpnUser(account, cmd.getUserName(), cmd.getPassword(), true); + if (user != null) { EventUtils.saveEvent(userId, account.getId(), EventTypes.EVENT_VPN_USER_ADD, "Added a VPN user for account: " + account.getAccountName() + " username= " + cmd.getUserName()); } else { EventUtils.saveEvent(userId, account.getId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VPN_USER_ADD, "Unable to add VPN user for account: ", account.getAccountName() + " username= " + cmd.getUserName()); } - return added; + return user; } @@ -2768,18 +2768,18 @@ public class NetworkManagerImpl implements NetworkManager, DomainRouterService { Account account = getAccountForApiCommand(cmd.getAccountName(), cmd.getDomainId()); EventUtils.saveStartedEvent(userId, account.getId(), EventTypes.EVENT_VPN_USER_REMOVE, "Remove VPN user for account: " + account.getAccountName(), cmd.getStartEventId()); - boolean added = addRemoveVpnUser(account, cmd.getUserName(), null, false); - if (added) { + VpnUserVO user = addRemoveVpnUser(account, cmd.getUserName(), null, false); + if (user != null) { EventUtils.saveEvent(userId, account.getId(), EventTypes.EVENT_VPN_USER_REMOVE, "Removed a VPN user for account: " + account.getAccountName() + " username= " + cmd.getUserName()); } else { EventUtils.saveEvent(userId, account.getId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VPN_USER_ADD, "Unable to remove VPN user for account: ", account.getAccountName() + " username= " + cmd.getUserName()); } - return added; + return (user != null); } @DB - protected boolean addRemoveVpnUser(Account account, String username, String password, boolean add) throws ConcurrentOperationException { + protected VpnUserVO addRemoveVpnUser(Account account, String username, String password, boolean add) throws ConcurrentOperationException { List vpnVOList = _remoteAccessVpnDao.findByAccount(account.getId()); Transaction txn = Transaction.currentTxn(); @@ -2812,7 +2812,13 @@ public class NetworkManagerImpl implements NetworkManager, DomainRouterService { for (RemoteAccessVpnVO vpn : vpnVOList) { success = success && _routerMgr.addRemoveVpnUsers(vpn, addVpnUsers, removeVpnUsers); } - return success; + + // Note: If the router was successfully updated, we then return the user. + if (success) { + return user; + } else { + return null; + } } finally { if (success) { txn.commit(); diff --git a/ui/jsp/ipaddress.jsp b/ui/jsp/ipaddress.jsp index c9e4c2dea2e..f2d83b21b0b 100644 --- a/ui/jsp/ipaddress.jsp +++ b/ui/jsp/ipaddress.jsp @@ -287,31 +287,20 @@
VPN Users
- @@ -514,6 +503,21 @@
+ + + + + +
+ + + + + + diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js index 794187459f5..344869dbdf9 100644 --- a/ui/scripts/cloud.core.ipaddress.js +++ b/ui/scripts/cloud.core.ipaddress.js @@ -28,6 +28,9 @@ function afterLoadIpJSP() { initDialog("dialog_acquire_public_ip", 325); initDialog("dialog_confirmation_release_ip"); initDialog("dialog_enable_vpn"); + initDialog("dialog_disable_vpn"); + initDialog("dialog_add_vpnuser"); + initDialog("dialog_confirmation_remove_vpnuser"); //*** Acquire New IP (begin) *** $.ajax({ @@ -335,13 +338,15 @@ function showEnableVPNDialog($thisTab) { return; //Job has not completed } else { $("body").stopTime(timerKey); - $spinningWheel.hide(); if (result.jobstatus == 1) { // Succeeded + showVpnUsers(); $thisDialog.dialog("close"); + $spinningWheel.hide(); $thisTab.find("#tab_container").show(); $thisTab.find("#vpn_disabled_msg").hide(); } else if (result.jobstatus == 2) { // Failed + $spinningWheel.hide(); var errorMsg = "We were unable to enable VPN access. Please contact support."; $thisDialog.find("#info_container").text(errorMsg).show(); } @@ -382,8 +387,8 @@ function ipJsonToVPNTab() { dataType: "json", success: function(json) { var items = json.listremoteaccessvpnsresponse.remoteaccessvpn; - if (items != null && items.length > 0) { - // List the VPN users + if (items != null && items.length > 0) { + showVpnUsers(); } else { showEnableVPNDialog($thisTab); } @@ -393,6 +398,259 @@ function ipJsonToVPNTab() { } }); } + +function showVpnUsers() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + var $vpnTab = $("#right_panel_content #tab_content_vpn"); + var $actionMenu = $vpnTab.find("#vpn_action_menu"); + $actionMenu.find("#action_list").empty(); + + var $listItemTemplate = $("#action_list_item"); + var $listItem = $listItemTemplate.clone(); + $listItem.find("#link").text("Disable VPN"); + $listItem.bind("click", function(event) { + $actionMenu.hide(); + $("#dialog_disable_vpn") + .dialog('option', 'buttons', { + "Disable": function() { + var $thisDialog = $(this); + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=deleteRemoteAccessVpn&account="+ipObj.account+"&domainid="+ipObj.domainid+"&zoneid="+ipObj.zoneid), + dataType: "json", + success: function(json) { + var jobId = json.deleteremoteaccessvpnresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + + if (result.jobstatus == 1) { // Succeeded + $thisDialog.dialog("close"); + $vpnTab.find("#enable_vpn_link").unbind("click").bind("click", function(event) { + showEnableVPNDialog($vpnTab); + }); + $vpnTab.find("#tab_container").hide(); + $vpnTab.find("#vpn_disabled_msg").show(); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = "We were unable to disable VPN access. Please contact support."; + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + return false; + }); + $actionMenu.find("#action_list").append($listItem.show()); + + $listItem = $listItemTemplate.clone(); + $listItem.find("#link").text("Add VPN User"); + $listItem.bind("click", function(event) { + $actionMenu.hide(); + $("#dialog_add_vpnuser") + .dialog('option', 'buttons', { + "Add": function() { + var $thisDialog = $(this); + var isValid = true; + isValid &= validateString("Username", $thisDialog.find("#username"), $thisDialog.find("#username_errormsg")); + isValid &= validateString("Password", $thisDialog.find("#password"), $thisDialog.find("#password_errormsg")); + if (!isValid) return; + + var username = todb($thisDialog.find("#username").val()); + var password = todb($thisDialog.find("#username").val()); + + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=addVpnUser&username="+username+"&password="+password), + dataType: "json", + success: function(json) { + var jobId = json.addvpnuserresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + + if (result.jobstatus == 1) { // Succeeded + $thisDialog.dialog("close"); + $("#tab_content_vpn #grid_content").append(vpnUserJsonToTemplate(result.jobresult.addvpnuserresponse).fadeIn()); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = "We were unable to add user access to your VPN. Please contact support."; + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + return false; + }); + $actionMenu.find("#action_list").append($listItem.show()); + + // Enable action menu for vpn + var $actionLink = $vpnTab.find("#vpn_action_link"); + $actionLink.unbind("mouseover").bind("mouseover", function(event) { + $(this).find("#vpn_action_menu").show(); + return false; + }); + $actionLink.unbind("mouseout").bind("mouseout", function(event) { + $(this).find("#vpn_action_menu").hide(); + return false; + }); + + // List users + $.ajax({ + data: createURL("command=listVpnUsers&account="+ipObj.account+"&domainid="+ipObj.domainid), + dataType: "json", + async: false, + success: function(json) { + var items = json.listvpnusersresponse.vpnuser; + if(items != null && items.length > 0) { + var $gridContent = $("#tab_content_vpn #grid_content").empty(); + for (var i = 0; i < items.length; i++) { + $gridContent.append(vpnUserJsonToTemplate(items[i]).show()); + } + + //Enable delete user + $gridContent.bind("click", function(event) { + var target = $(event.target); + var targetId = target.attr("id"); + if (targetId == "vpn_delete_user") { + var id = target.data("id"); + var username = target.data("username"); + var account = target.data("account"); + var domainId = target.data("domainid"); + var params = []; + params.push("&username="+username); + params.push("&account="+account); + params.push("&domainid="+domainId); + var $thisDialog = $("#dialog_confirmation_remove_vpnuser"); + $thisDialog.find("#username").text(target.data("username")); + $thisDialog.dialog('option', 'buttons', { + "Ok": function() { + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=removeVpnUser"+params.join("")), + dataType: "json", + success: function(json) { + var jobId = json.removevpnuserresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + + if (result.jobstatus == 1) { // Succeeded + $thisDialog.dialog("close"); + + //remove user from grid + $vpnTab.find("#vpnuser"+id).slideUp(); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = "We were unable to add user access to your VPN. Please contact support."; + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + + } + return false; + }); + } + } + }); +} + +var vpnItem = 1; +function vpnUserJsonToTemplate(json) { + var $template = $("#vpn_template").clone(); + if (vpnItem++ % 2 == 0) $template.removeClass("odd").addClass("even"); + $template.find("#username").text(json.username); + $template.attr("id", "vpnuser"+json.id); + $template.find("#vpn_delete_user").data("id", json.id).data("username", json.username).data("account", json.account).data("domainid", json.domainid); + return $template; +} function ipClearRightPanel() { ipClearDetailsTab();