diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-03-16 14:35:50 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-03-16 14:35:50 +0530 |
| commit | d8426e9287c37a8e6e277a0e84929239269fd0d5 (patch) | |
| tree | 227ab12adf2fb53375d2b3fa3236b09ffd733f8f | |
| parent | 608ec97c38e95b1e3bfec57daaa0244854c7c3be (diff) | |
Introduced security token for REST clients
Signed-off-by: Shireesh Anjal <shireesh@gluster.com>
7 files changed, 148 insertions, 85 deletions
diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index 17fa84a5..61641d7f 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -10,7 +10,6 @@ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.representation.Form;
-import com.sun.jersey.core.util.Base64;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public abstract class AbstractClient {
@@ -18,12 +17,17 @@ public abstract class AbstractClient { protected static final MultivaluedMap<String, String> NO_PARAMS = new MultivaluedMapImpl();
protected WebResource resource;
+ private String securityToken;
private String authHeader;
-
- public AbstractClient(String serverName, String user, String password) {
+
+ public AbstractClient(String serverName) {
URI baseURI = new ClientUtil().getServerBaseURI(serverName);
resource = Client.create(new DefaultClientConfig()).resource(baseURI).path(getResourceName());
- authHeader = "Basic " + new String(Base64.encode(user + ":" + password));
+ }
+
+ public AbstractClient(String serverName, String securityToken) {
+ this(serverName);
+ setSecurityToken(securityToken);
}
/**
@@ -136,4 +140,19 @@ public abstract class AbstractClient { }
public abstract String getResourceName();
+
+ /**
+ * @return the securityToken
+ */
+ protected String getSecurityToken() {
+ return securityToken;
+ }
+
+ /**
+ * @param securityToken the securityToken to set
+ */
+ protected void setSecurityToken(String securityToken) {
+ this.securityToken = securityToken;
+ authHeader = "Basic " + securityToken;
+ }
}
diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java index 6d9ebdd6..16be2604 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java @@ -32,19 +32,19 @@ import com.sun.jersey.core.util.MultivaluedMapImpl; public class DiscoveredServersClient extends AbstractClient { private static final String RESOURCE_NAME = "discoveredservers"; - public DiscoveredServersClient(String serverName, String user, String password) { - super(serverName, user, password); + public DiscoveredServersClient(String serverName, String securityToken) { + super(serverName, securityToken); } @Override public String getResourceName() { return RESOURCE_NAME; } - + private Object getDiscoveredServers(Boolean getDetails, Class responseClass) { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.putSingle("details", getDetails.toString()); - + // TODO: Used during development to check the response contents. // to be removed later String response = (String) fetchResource(queryParams, String.class); @@ -54,28 +54,31 @@ public class DiscoveredServersClient extends AbstractClient { } public List<String> getDiscoveredServerNames() { - return (List<String>)getDiscoveredServers(Boolean.FALSE, StringListResponse.class); + return (List<String>) getDiscoveredServers(Boolean.FALSE, StringListResponse.class); } - + public List<Server> getDiscoveredServerDetails() { - return (List<Server>)getDiscoveredServers(Boolean.TRUE, ServerListResponse.class); + return (List<Server>) getDiscoveredServers(Boolean.TRUE, ServerListResponse.class); } + @SuppressWarnings("unchecked") public Server getServer(String serverName) { - @SuppressWarnings("unchecked") - GenericResponse<Server> response = (GenericResponse<Server>) fetchSubResource(serverName, - GenericResponse.class); + GenericResponse<Server> response = (GenericResponse<Server>) fetchSubResource(serverName, GenericResponse.class); return response.getData(); } public static void main(String[] args) { - DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", "gluster", "gluster"); - List<String> discoveredServerNames = serverResource.getDiscoveredServerNames(); - System.out.println(discoveredServerNames); - List<Server> discoveredServers = serverResource.getDiscoveredServerDetails(); - System.out.println(discoveredServers); + UsersClient usersClient = new UsersClient("localhost"); + if (usersClient.authenticate("gluster", "gluster")) { + DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", + usersClient.getSecurityToken()); + List<String> discoveredServerNames = serverResource.getDiscoveredServerNames(); + System.out.println(discoveredServerNames); + List<Server> discoveredServers = serverResource.getDiscoveredServerDetails(); + System.out.println(discoveredServers); - // Server serverDetails = ServerResource.getServer("localhost"); - // System.out.println(serverDetails.getName()); + // Server serverDetails = ServerResource.getServer("localhost"); + // System.out.println(serverDetails.getName()); + } } } diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index c192a52c..e15f28a5 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -25,15 +25,15 @@ import java.util.List; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.Disk.DISK_STATUS; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.GlusterDataModel; import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.LogMessage; import com.gluster.storage.management.core.model.NetworkInterface; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.model.Disk.DISK_STATUS; -import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; @@ -46,9 +46,26 @@ public class GlusterDataModelManager { private static List<LogMessage> logMessages = new ArrayList<LogMessage>(); private static GlusterDataModelManager instance = new GlusterDataModelManager(); private GlusterDataModel model; - + private String securityToken; + private String serverName; + private GlusterDataModelManager() { - model = initializeModel(); + } + + public String getSecurityToken() { + return securityToken; + } + + public void setSecurityToken(String securityToken) { + this.securityToken = securityToken; + } + + public String getServerName() { + return serverName; + } + + public void setServerName(String serverName) { + this.serverName = serverName; } public GlusterDataModel getModel() { @@ -87,9 +104,12 @@ public class GlusterDataModelManager { servers.add(server); } - private GlusterDataModel initializeModel() { + public void initializeModel(String serverName, String securityToken) { + setServerName(serverName); + setSecurityToken(securityToken); + // Create the dummy data model for demo - GlusterDataModel model = new GlusterDataModel("Clusters"); + model = new GlusterDataModel("Clusters"); Cluster cluster = new Cluster("Home", model); initializeGlusterServers(cluster); @@ -102,7 +122,6 @@ public class GlusterDataModelManager { createDummyLogMessages(); model.addCluster(cluster); - return model; } private void addVolumeOptions() { @@ -202,11 +221,11 @@ public class GlusterDataModelManager { } private void initializeGlusterServers(Cluster cluster) { - cluster.setServers(new GlusterServersClient("localhost", "gluster", "gluster").getServers()); + cluster.setServers(new GlusterServersClient(serverName, securityToken).getServers()); } private void initializeAutoDiscoveredServers(Cluster cluster) { - cluster.setAutoDiscoveredServers(new DiscoveredServersClient("localhost", "gluster", "gluster") + cluster.setAutoDiscoveredServers(new DiscoveredServersClient(serverName, securityToken) .getDiscoveredServerDetails()); } diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java index 58858aa4..222cdf1c 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -30,8 +30,8 @@ import com.sun.jersey.api.representation.Form; public class GlusterServersClient extends AbstractClient { private static final String RESOURCE_NAME = "/cluster/servers"; - public GlusterServersClient(String serverName, String user, String password) { - super(serverName, user, password); + public GlusterServersClient(String serverName, String securityToken) { + super(serverName, securityToken); } @Override @@ -64,16 +64,20 @@ public class GlusterServersClient extends AbstractClient { } public static void main(String[] args) { - GlusterServersClient ServerResource = new GlusterServersClient("localhost", "gluster", "gluster"); - List<GlusterServer> glusterServers = ServerResource.getServers(); - for(GlusterServer server : glusterServers) { - System.out.println(server.getName()); - } + UsersClient usersClient = new UsersClient("localhost"); + if (usersClient.authenticate("gluster", "gluster")) { + + GlusterServersClient ServerResource = new GlusterServersClient("localhost", usersClient.getSecurityToken()); + List<GlusterServer> glusterServers = ServerResource.getServers(); + for (GlusterServer server : glusterServers) { + System.out.println(server.getName()); + } - // Add server -// Server srv = new Server(); -// srv.setName("my-server"); -// Status response = ServerResource.addServer(srv); -// System.out.println(response.toString()); + // Add server + // Server srv = new Server(); + // srv.setName("my-server"); + // Status response = ServerResource.addServer(srv); + // System.out.println(response.toString()); + } } } diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java index 3f9b5d61..be1b4bba 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -20,33 +20,40 @@ package com.gluster.storage.management.client; import com.gluster.storage.management.core.model.Status; import com.sun.jersey.api.representation.Form; +import com.sun.jersey.core.util.Base64; public class UsersClient extends AbstractClient { private static final String RESOURCE_NAME = "users"; private static final String FORM_PARAM_OLD_PASSWORD = "oldpassword"; private static final String FORM_PARAM_NEW_PASSWORD = "newpassword"; - - private String user; - public UsersClient(String serverName, String user, String password) { - super(serverName, user, password); - this.user = user; + private String generateSecurityToken(String user, String password) { + return new String(Base64.encode(user + ":" + password)); } - public boolean authenticate() { + public UsersClient(String serverName) { + super(serverName); + } + + public boolean authenticate(String user, String password) { + setSecurityToken(generateSecurityToken(user, password)); try { Status authStatus = (Status) fetchSubResource(user, Status.class); - return authStatus.isSuccess(); - } catch(Exception e) { + if (authStatus.isSuccess()) { + return true; + } + } catch (Exception e) { e.printStackTrace(); - return false; } - // Dummy authentication for demo application - // return (connectionDetails.getPassword().equals("gluster") ? true : false); + // If we reach here, it means authentication failed. Clear security token and return false. + setSecurityToken(null); + return false; } public boolean changePassword(String user, String oldPassword, String newPassword) { + setSecurityToken(generateSecurityToken(user, oldPassword)); + Form form = new Form(); form.add(FORM_PARAM_OLD_PASSWORD, oldPassword); form.add(FORM_PARAM_NEW_PASSWORD, newPassword); @@ -56,16 +63,15 @@ public class UsersClient extends AbstractClient { } public static void main(String[] args) { - UsersClient authClient = new UsersClient("localhost", "gluster", "gluster"); - + UsersClient authClient = new UsersClient("localhost"); + // authenticate user - System.out.println(authClient.authenticate()); - + System.out.println(authClient.authenticate("gluster", "gluster")); + // change password to gluster1 System.out.println(authClient.changePassword("gluster", "gluster", "gluster1")); - + // change it back to gluster - authClient = new UsersClient("localhost", "gluster", "gluster1"); System.out.println(authClient.changePassword("gluster", "gluster1", "gluster")); } @@ -78,4 +84,14 @@ public class UsersClient extends AbstractClient { public String getResourceName() { return RESOURCE_NAME; } + + /* + * (non-Javadoc) + * + * @see com.gluster.storage.management.client.AbstractClient#getSecurityToken() + */ + @Override + public String getSecurityToken() { + return super.getSecurityToken(); + } } diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index 2efe7ef0..734edb17 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -33,8 +33,8 @@ import com.gluster.storage.management.core.model.Volume; public class VolumesClient extends AbstractClient { private static final String RESOURCE_NAME = "cluster/volumes"; - public VolumesClient(String serverName, String user, String password) { - super(serverName, user, password); + public VolumesClient(String serverName, String securityToken) { + super(serverName, securityToken); } @Override @@ -44,14 +44,11 @@ public class VolumesClient extends AbstractClient { public String createVolume(Volume volume) { - GenericResponse<String> response = (GenericResponse<String>) resource - .path("createvolume") - .type(MediaType.APPLICATION_XML) - .accept(MediaType.APPLICATION_XML) - .post(GenericResponse.class, volume); - + GenericResponse<String> response = (GenericResponse<String>) resource.path("createvolume") + .type(MediaType.APPLICATION_XML).accept(MediaType.APPLICATION_XML).post(GenericResponse.class, volume); + System.out.println("Response : " + response.getData()); - + return response.getData(); } @@ -60,20 +57,22 @@ public class VolumesClient extends AbstractClient { * @param args */ public static void main(String[] args) { - VolumesClient VC = new VolumesClient("localhost", "gluster", "gluster"); - List<Disk> disks = new ArrayList<Disk>(); - Disk diskElement = new Disk(); - diskElement.setName("sda1"); - diskElement.setStatus(DISK_STATUS.READY); - disks.add(diskElement); - diskElement.setName("sda2"); - diskElement.setStatus(DISK_STATUS.READY); - disks.add(diskElement); - - Volume vol = new Volume("vol1", null, - Volume.VOLUME_TYPE.PLAIN_DISTRIBUTE, - Volume.TRANSPORT_TYPE.ETHERNET, Volume.VOLUME_STATUS.ONLINE); - vol.setDisks(disks); - System.out.println(VC.createVolume(vol)); + UsersClient usersClient = new UsersClient("localhost"); + if (usersClient.authenticate("gluster", "gluster")) { + VolumesClient VC = new VolumesClient("localhost", usersClient.getSecurityToken()); + List<Disk> disks = new ArrayList<Disk>(); + Disk diskElement = new Disk(); + diskElement.setName("sda1"); + diskElement.setStatus(DISK_STATUS.READY); + disks.add(diskElement); + diskElement.setName("sda2"); + diskElement.setStatus(DISK_STATUS.READY); + disks.add(diskElement); + + Volume vol = new Volume("vol1", null, Volume.VOLUME_TYPE.PLAIN_DISTRIBUTE, Volume.TRANSPORT_TYPE.ETHERNET, + Volume.VOLUME_STATUS.ONLINE); + vol.setDisks(disks); + System.out.println(VC.createVolume(vol)); + } } } diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java index 851425ea..3e7fa5c3 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java @@ -39,6 +39,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; +import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.UsersClient; import com.gluster.storage.management.core.model.ConnectionDetails; import com.gluster.storage.management.gui.IImageKeys; @@ -186,11 +187,13 @@ public class LoginDialog extends Dialog { String user = connectionDetails.getUserId(); String password = connectionDetails.getPassword(); String server = connectionDetails.getServer(); - if (new UsersClient(server, user, password).authenticate()) { + + UsersClient usersClient = new UsersClient(server); + if (usersClient.authenticate(user, password)) { + GlusterDataModelManager.getInstance().initializeModel(server, usersClient.getSecurityToken()); super.okPressed(); } else { MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password"); - return; } } } |
