summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-06-23 21:47:16 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-06-23 21:47:16 +0530
commit83e384323d8c9ac3ad78084663c477eb6729eeaa (patch)
treece1031a8f2a18f36abf2b02bae18c46b16435c23 /src
parentd7bee34ac953b8fe1c3f1595d20e2d3d72a942ec (diff)
REST API Enhancements
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java2
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java44
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java5
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java5
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java58
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java98
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java20
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java61
10 files changed, 166 insertions, 134 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
index 9eaaca93..3d13a8de 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
@@ -126,7 +126,7 @@ public abstract class AbstractClient {
return res.queryParams(queryParams)
.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_XML).get(responseClass);
} catch(UniformInterfaceException e) {
- throw new GlusterRuntimeException(e.getResponse().getEntity(String.class));
+ throw new GlusterRuntimeException(e.getResponse().getEntity(String.class), e);
}
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java
index dadeadf8..31809c75 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java
@@ -74,27 +74,29 @@ public class ClustersClient extends AbstractClient {
public static void main(String args[]) {
UsersClient usersClient = new UsersClient();
- Status authStatus = usersClient.authenticate("gluster", "gluster");
- if (authStatus.isSuccess()) {
- ClustersClient client = new ClustersClient();
- client.setSecurityToken(usersClient.getSecurityToken());
- System.out.println(client.getClusterNames());
- try {
- client.createCluster("test1");
- } catch(GlusterRuntimeException e) {
- System.out.println(e.getMessage());
- }
-
- System.out.println(client.getClusterNames());
-
- try {
- client.deleteCluster("test1");
- } catch (GlusterRuntimeException e) {
- System.out.println(e.getMessage());
- }
- System.out.println(client.getClusterNames());
- } else {
- System.out.println("authentication failed: " + authStatus);
+
+ try {
+ usersClient.authenticate("gluster", "gluster");
+ } catch(Exception e) {
+ e.printStackTrace();
}
+
+ ClustersClient client = new ClustersClient();
+ client.setSecurityToken(usersClient.getSecurityToken());
+ System.out.println(client.getClusterNames());
+ try {
+ client.createCluster("test1");
+ } catch (GlusterRuntimeException e) {
+ System.out.println(e.getMessage());
+ }
+
+ System.out.println(client.getClusterNames());
+
+ try {
+ client.deleteCluster("test1");
+ } catch (GlusterRuntimeException e) {
+ System.out.println(e.getMessage());
+ }
+ System.out.println(client.getClusterNames());
}
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java
index f35c3e36..3704e2ff 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java
@@ -68,12 +68,15 @@ public class DiscoveredServersClient extends AbstractClient {
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
- if (usersClient.authenticate("gluster", "gluster").isSuccess()) {
+ try {
+ usersClient.authenticate("gluster", "gluster");
DiscoveredServersClient serverResource = new DiscoveredServersClient(usersClient.getSecurityToken());
List<String> discoveredServerNames = serverResource.getDiscoveredServerNames();
System.out.println(discoveredServerNames);
List<Server> discoveredServers = serverResource.getDiscoveredServerDetails();
System.out.println(discoveredServers);
+ } catch(Exception e) {
+ e.printStackTrace();
}
}
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
index b525da01..b780e1c0 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java
@@ -68,7 +68,8 @@ public class GlusterServersClient extends AbstractClient {
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
- if (usersClient.authenticate("gluster", "gluster").isSuccess()) {
+ try {
+ usersClient.authenticate("gluster", "gluster");
GlusterServersClient glusterServersClient = new GlusterServersClient(usersClient.getSecurityToken(), "cluster1");
List<GlusterServer> glusterServers = glusterServersClient.getServers();
for (GlusterServer server : glusterServers) {
@@ -79,6 +80,8 @@ public class GlusterServersClient extends AbstractClient {
Server srv = new Server();
srv.setName("server3");
glusterServersClient.addServer(srv);
+ } catch(Exception e) {
+ e.printStackTrace();
}
}
}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java
index 84ed4e4c..522b87c1 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java
@@ -22,6 +22,7 @@ import java.net.ConnectException;
import javax.ws.rs.core.Response;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Status;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.representation.Form;
@@ -40,60 +41,57 @@ public class UsersClient extends AbstractClient {
super();
}
- public Status authenticate(String user, String password) {
+ public void authenticate(String user, String password) {
setSecurityToken(generateSecurityToken(user, password));
try {
- Status authStatus = (Status) fetchSubResource(user, Status.class);
- if (!authStatus.isSuccess()) {
- // authentication failed. clear security token.
- setSecurityToken(null);
- }
- return authStatus;
- } catch (UniformInterfaceException e) {
- if ((e.getResponse().getStatus() == Response.Status.UNAUTHORIZED.getStatusCode())) {
- // authentication failed. clear security token.
- setSecurityToken(null);
- return new Status(Status.STATUS_CODE_FAILURE, "Invalid user id or password!");
- } else {
+ fetchSubResource(user, String.class);
+ } catch (RuntimeException e) {
+ Throwable cause = e.getCause();
+ if(cause == null) {
throw e;
}
- } catch (Exception e) {
- // authentication failed. clear security token.
- setSecurityToken(null);
- Throwable cause = e.getCause();
- if(cause != null && cause instanceof ConnectException) {
- return new Status(Status.STATUS_CODE_FAILURE, "Couldn't connect to Gluster Management Gateway!");
+ if (cause instanceof UniformInterfaceException) {
+ UniformInterfaceException e1 = (UniformInterfaceException) cause;
+ if ((e1.getResponse().getStatus() == Response.Status.UNAUTHORIZED.getStatusCode())) {
+ // authentication failed. clear security token.
+ setSecurityToken(null);
+ throw new GlusterRuntimeException("Invalid user id or password!");
+ } else {
+ // TODO: Log the exception
+ throw new GlusterRuntimeException("Exception during authentication: ["
+ + e1.getResponse().getStatus() + "]");
+ }
+ } else if(cause instanceof ConnectException) {
+ throw new GlusterRuntimeException("Couldn't connect to Gluster Management Gateway!");
+ } else {
+ throw new GlusterRuntimeException("Exception during authentication: [" + e.getMessage() + "]");
}
- return new Status(Status.STATUS_CODE_FAILURE, "Exception during authentication: [" + e.getMessage() + "]");
}
}
- public boolean changePassword(String user, String oldPassword, String newPassword) {
+ public void 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);
- try {
- putRequest(user, form);
- return true;
- } catch (Exception e) {
- return false;
- }
+ putRequest(user, form);
}
public static void main(String[] args) {
UsersClient authClient = new UsersClient();
// authenticate user
- System.out.println(authClient.authenticate("gluster", "gluster"));
+ authClient.authenticate("gluster", "gluster");
// change password to gluster1
- System.out.println(authClient.changePassword("gluster", "gluster", "gluster1"));
+ authClient.changePassword("gluster", "gluster", "gluster1");
// change it back to gluster
- System.out.println(authClient.changePassword("gluster", "gluster1", "gluster"));
+ authClient.changePassword("gluster", "gluster1", "gluster");
+
+ System.out.println("success");
}
/*
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
index d237f010..c04389d1 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
@@ -232,10 +232,13 @@ public class VolumesClient extends AbstractClient {
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
- if (usersClient.authenticate("gluster", "gluster").isSuccess()) {
+ try {
+ usersClient.authenticate("gluster", "gluster");
VolumesClient client = new VolumesClient(usersClient.getSecurityToken());
System.out.println(client.getAllVolumes());
// client.downloadLogs("vol1", "/tmp/temp1.tar.gz");
+ } catch(Exception e) {
+ e.printStackTrace();
}
}
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
index b3dc30c2..fa266b50 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
@@ -25,6 +25,7 @@ package com.gluster.storage.management.core.constants;
*/
public class RESTConstants {
// REST Resource paths
+ public static final String RESOURCE_PATH_USERS = "/users";
public static final String RESOURCE_PATH_CLUSTERS = "/clusters";
public static final String RESOURCE_PATH_DISCOVERED_SERVERS = "/discoveredservers";
@@ -72,6 +73,7 @@ public class RESTConstants {
public static final String PATH_PARAM_CLUSTER_NAME = "clusterName";
public static final String PATH_PARAM_SERVER_NAME = "serverName";
public static final String PATH_PARAM_TASK_ID = "taskId";
+ public static final String PATH_PARAM_USER = "user";
public static final String QUERY_PARAM_BRICK_NAME = "brickName";
public static final String QUERY_PARAM_DISKS = "disks";
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
index 563e6416..5cdb2648 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
@@ -199,56 +199,60 @@ public class LoginDialog extends Dialog {
String password = connectionDetails.getPassword();
UsersClient usersClient = new UsersClient();
- Status loginStatus = usersClient.authenticate(user, password);
- if (loginStatus.isSuccess()) {
- // authentication successful. close the login dialog and open the next one.
- close();
-
- ClustersClient clustersClient = new ClustersClient(usersClient.getSecurityToken());
-
- IEclipsePreferences preferences = new ConfigurationScope().getNode(Application.PLUGIN_ID);
- boolean showClusterSelectionDialog = preferences.getBoolean(PreferenceConstants.P_SHOW_CLUSTER_SELECTION_DIALOG, true);
-
- String clusterName = null;
- if(!showClusterSelectionDialog) {
- clusterName = preferences.get(PreferenceConstants.P_DEFAULT_CLUSTER_NAME, null);
- if(clusterName == null || clusterName.isEmpty()) {
- // Cluster name not available in preferences. Hence we must show the cluster selection dialog.
- showClusterSelectionDialog = true;
- }
- }
-
- CLUSTER_MODE mode;
- String serverName = null;
-
- if (showClusterSelectionDialog) {
- ClusterSelectionDialog clusterDialog = new ClusterSelectionDialog(getParentShell(),
- clustersClient.getClusterNames());
- int userAction = clusterDialog.open();
- if (userAction == Window.CANCEL) {
- MessageDialog.openError(getShell(), "Login Cancelled",
- "User cancelled login at cluster selection. Application will close!");
- cancelPressed();
- return;
- }
- mode = clusterDialog.getClusterMode();
- clusterName = clusterDialog.getClusterName();
- serverName = clusterDialog.getServerName();
- } else {
- mode = CLUSTER_MODE.SELECT;
+ try {
+ usersClient.authenticate(user, password);
+ } catch(Exception e) {
+ MessageDialog.openError(getShell(), "Authentication Failed", e.getMessage());
+ setReturnCode(RETURN_CODE_ERROR);
+ return;
+ }
+
+ // authentication successful. close the login dialog and open the next one.
+ close();
+
+ ClustersClient clustersClient = new ClustersClient(usersClient.getSecurityToken());
+
+ IEclipsePreferences preferences = new ConfigurationScope().getNode(Application.PLUGIN_ID);
+ boolean showClusterSelectionDialog = preferences.getBoolean(
+ PreferenceConstants.P_SHOW_CLUSTER_SELECTION_DIALOG, true);
+
+ String clusterName = null;
+ if (!showClusterSelectionDialog) {
+ clusterName = preferences.get(PreferenceConstants.P_DEFAULT_CLUSTER_NAME, null);
+ if (clusterName == null || clusterName.isEmpty()) {
+ // Cluster name not available in preferences. Hence we must show the cluster selection dialog.
+ showClusterSelectionDialog = true;
}
-
- try {
- createOrRegisterCluster(clustersClient, clusterName, serverName, mode);
- GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), clusterName);
- super.okPressed();
- } catch (Exception e) {
- setReturnCode(RETURN_CODE_ERROR);
- MessageDialog.openError(getShell(), "Initialization Error", e.getMessage());
- close();
+ }
+
+ CLUSTER_MODE mode;
+ String serverName = null;
+
+ if (showClusterSelectionDialog) {
+ ClusterSelectionDialog clusterDialog = new ClusterSelectionDialog(getParentShell(),
+ clustersClient.getClusterNames());
+ int userAction = clusterDialog.open();
+ if (userAction == Window.CANCEL) {
+ MessageDialog.openError(getShell(), "Login Cancelled",
+ "User cancelled login at cluster selection. Application will close!");
+ cancelPressed();
+ return;
}
+ mode = clusterDialog.getClusterMode();
+ clusterName = clusterDialog.getClusterName();
+ serverName = clusterDialog.getServerName();
} else {
- MessageDialog.openError(getShell(), "Authentication Failed", loginStatus.getMessage());
+ mode = CLUSTER_MODE.SELECT;
+ }
+
+ try {
+ createOrRegisterCluster(clustersClient, clusterName, serverName, mode);
+ GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), clusterName);
+ super.okPressed();
+ } catch (Exception e) {
+ setReturnCode(RETURN_CODE_ERROR);
+ MessageDialog.openError(getShell(), "Initialization Error", e.getMessage());
+ close();
}
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java
index ee65add0..4523ff75 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java
@@ -123,6 +123,15 @@ public class AbstractResource {
protected Response badRequestResponse(String errMessage) {
return Response.status(Status.BAD_REQUEST).type(MediaType.TEXT_HTML).entity(errMessage).build();
}
+
+ /**
+ * Creates a response with HTTP status code of 401 (unauthorized)
+ *
+ * @return the {@link Response} object
+ */
+ protected Response unauthorizedResponse() {
+ return Response.status(Status.UNAUTHORIZED).build();
+ }
/**
* Creates an OK response and sets the entity in the response body.
@@ -138,6 +147,17 @@ public class AbstractResource {
}
/**
+ * Creates an OK response without any entity in the response body.
+ *
+ * @param mediaType
+ * Media type to be set on the response
+ * @return the {@link Response} object
+ */
+ protected Response okResponse(String mediaType) {
+ return Response.ok().type(mediaType).build();
+ }
+
+ /**
* Creates a streaming output response and sets the given streaming output in the response. Typically used for
* "download" requests
*
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java
index 0326793b..1b1f0d72 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java
@@ -18,6 +18,9 @@
*******************************************************************************/
package com.gluster.storage.management.server.resources;
+import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_USER;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_USERS;
+
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
@@ -25,6 +28,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.encoding.PasswordEncoder;
@@ -38,55 +42,48 @@ import com.sun.jersey.spi.resource.Singleton;
@Singleton
@Component
-@Path("/users")
-public class UsersResource {
+@Path(RESOURCE_PATH_USERS)
+public class UsersResource extends AbstractResource {
@Autowired
private JdbcUserDetailsManager jdbcUserService;
@Autowired
private PasswordEncoder passwordEncoder;
- /**
- * Authenticates given user with given password for login on current system
- *
- * @param user
- * @param password
- * @return true is user can be successfully authenticated using given password, else false
- */
- /*
- * NOTE: This method is no more required as user authentication is performed on every request by the spring security
- * framework. Can be removed after testing.
- */
- /*
- * private boolean authenticate(String user, String password) { String tmpFileName = "tmp"; File saltFile = new
- * File(tmpFileName); ProcessResult result = new ProcessUtil().executeCommand("get-user-password.py", user,
- * tmpFileName); if (result.isSuccess()) { String salt = new FileUtil().readFileAsString(saltFile); String
- * encryptedPassword = MD5Crypt.crypt(password, salt); return encryptedPassword.equals(salt); }
- *
- * return false; }
- */
-
- @Path("{user}")
+ @Path("{" + PATH_PARAM_USER + "}")
@GET
@Produces(MediaType.APPLICATION_XML)
- public Status authenticate(@PathParam("user") String user) {
+ public Response authenticateXML(@PathParam("user") String user) {
+ // success only if the user passed in query is same as the one passed in security header
+ // spring security would have already authenticated the user credentials
+ return getAuthenticationResponse(user, MediaType.APPLICATION_XML);
+ }
+
+ @Path("{" + PATH_PARAM_USER + "}")
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response authenticateJSON(@PathParam("user") String user) {
// success only if the user passed in query is same as the one passed in security header
// spring security would have already authenticated the user credentials
- return (SecurityContextHolder.getContext().getAuthentication().getName().equals(user) ? Status.STATUS_SUCCESS
- : Status.STATUS_FAILURE);
+ return getAuthenticationResponse(user, MediaType.APPLICATION_JSON);
}
- @Path("{user}")
+ public Response getAuthenticationResponse(String user, String mediaType) {
+ return (SecurityContextHolder.getContext().getAuthentication().getName().equals(user) ? okResponse(mediaType)
+ : unauthorizedResponse());
+ }
+
+ @Path("{" + PATH_PARAM_USER + "}")
@PUT
- @Produces(MediaType.APPLICATION_XML)
- public Status changePassword(@FormParam("oldpassword") String oldPassword,
+ public Response changePassword(@FormParam("oldpassword") String oldPassword,
@FormParam("newpassword") String newPassword) {
try {
jdbcUserService.changePassword(oldPassword, passwordEncoder.encodePassword(newPassword, null));
- } catch (AuthenticationException ex) {
+ } catch (Exception ex) {
+ // TODO: Log the exception
ex.printStackTrace();
- return new Status(Status.STATUS_CODE_FAILURE, "Could not change password: [" + ex.getMessage() + "]");
+ return errorResponse("Could not change password. Error: [" + ex.getMessage() + "]");
}
- return Status.STATUS_SUCCESS;
+ return noContentResponse();
}
}