diff --git a/ch.eitchnet.privilege b/ch.eitchnet.privilege
index 5ef43eaeb..a3d76d4cd 160000
--- a/ch.eitchnet.privilege
+++ b/ch.eitchnet.privilege
@@ -1 +1 @@
-Subproject commit 5ef43eaebe670b0cf3f8ea1ccbc251b2c48f3dca
+Subproject commit a3d76d4cd88ffd1fbeb6e9c646db0e55211f6d09
diff --git a/li.strolch.agent/src/test/resources/cachedtest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/cachedtest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/cachedtest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/cachedtest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.agent/src/test/resources/emptytest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/emptytest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/emptytest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/emptytest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.agent/src/test/resources/minimaltest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/minimaltest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/minimaltest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/minimaltest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.agent/src/test/resources/realmtest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/realmtest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/realmtest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/realmtest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.agent/src/test/resources/transactionaltest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/transactionaltest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/transactionaltest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/transactionaltest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.agent/src/test/resources/transienttest/config/PrivilegeConfig.xml b/li.strolch.agent/src/test/resources/transienttest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.agent/src/test/resources/transienttest/config/PrivilegeConfig.xml
+++ b/li.strolch.agent/src/test/resources/transienttest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.postgresql/src/test/resources/cachedruntime/config/PrivilegeConfig.xml b/li.strolch.persistence.postgresql/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.postgresql/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.postgresql/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.postgresql/src/test/resources/realmtest/config/PrivilegeConfig.xml b/li.strolch.persistence.postgresql/src/test/resources/realmtest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.postgresql/src/test/resources/realmtest/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.postgresql/src/test/resources/realmtest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.postgresql/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml b/li.strolch.persistence.postgresql/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.postgresql/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.postgresql/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.xml/src/test/resources/cachedruntime/config/PrivilegeConfig.xml b/li.strolch.persistence.xml/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.xml/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.xml/src/test/resources/cachedruntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.xml/src/test/resources/existingDbRuntime/config/PrivilegeConfig.xml b/li.strolch.persistence.xml/src/test/resources/existingDbRuntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.xml/src/test/resources/existingDbRuntime/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.xml/src/test/resources/existingDbRuntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.persistence.xml/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml b/li.strolch.persistence.xml/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.persistence.xml/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
+++ b/li.strolch.persistence.xml/src/test/resources/transactionalruntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java
index cea19b2e6..e79f86e94 100644
--- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java
+++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/PrivilegeUsersService.java
@@ -15,7 +15,11 @@
*/
package li.strolch.rest.endpoint;
+import static li.strolch.rest.StrolchRestfulConstants.ROLE_STROLCH_PRIVILEGE_ADMIN;
+
+import java.text.MessageFormat;
import java.util.List;
+import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
@@ -35,6 +39,7 @@ import javax.ws.rs.core.Response.Status;
import li.strolch.agent.api.ComponentContainer;
import li.strolch.rest.RestfulStrolchComponent;
import li.strolch.rest.StrolchRestfulConstants;
+import li.strolch.rest.model.PasswordField;
import li.strolch.rest.model.Result;
import org.slf4j.Logger;
@@ -45,6 +50,7 @@ import ch.eitchnet.privilege.base.PrivilegeException;
import ch.eitchnet.privilege.handler.PrivilegeHandler;
import ch.eitchnet.privilege.model.Certificate;
import ch.eitchnet.privilege.model.UserRep;
+import ch.eitchnet.privilege.model.UserState;
/**
* @author Robert von Burg
@@ -55,9 +61,9 @@ public class PrivilegeUsersService {
private static final Logger logger = LoggerFactory.getLogger(PrivilegeUsersService.class);
private PrivilegeHandler getPrivilegeHandler(Certificate cert, boolean requiresStrolchPrivilegeAdminRole) {
- if (requiresStrolchPrivilegeAdminRole && !cert.hasRole(StrolchRestfulConstants.ROLE_STROLCH_PRIVILEGE_ADMIN)) {
- throw new AccessDeniedException("You may not perform the request as you are missing role "
- + StrolchRestfulConstants.ROLE_STROLCH_PRIVILEGE_ADMIN);
+ if (requiresStrolchPrivilegeAdminRole && !cert.hasRole(ROLE_STROLCH_PRIVILEGE_ADMIN)) {
+ String msg = "You may not perform the request as you are missing role {0}";
+ throw new AccessDeniedException(MessageFormat.format(msg, ROLE_STROLCH_PRIVILEGE_ADMIN));
}
ComponentContainer container = RestfulStrolchComponent.getInstance().getContainer();
@@ -222,9 +228,92 @@ public class PrivilegeUsersService {
}
}
- // TODO set password on user
- // TODO set state on user
- // TODO set locale on user
- // TODO change username of user
+ @PUT
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{username}/state/{state}")
+ public Response setUserState(@PathParam("username") String username, @PathParam("state") String state,
+ @Context HttpServletRequest request) {
+ Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE);
+ try {
+ UserState userState;
+ try {
+ userState = UserState.valueOf(state);
+ } catch (Exception e) {
+ String msg = MessageFormat.format("UserState {0} is not valid!", state);
+ return Response.serverError().entity(new Result(msg)).type(MediaType.APPLICATION_JSON).build();
+ }
+
+ PrivilegeHandler privilegeHandler = getPrivilegeHandler(cert, true);
+ UserRep updatedUser = privilegeHandler.setUserState(cert, username, userState);
+ return Response.ok(updatedUser, MediaType.APPLICATION_JSON).build();
+
+ } catch (AccessDeniedException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.UNAUTHORIZED).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ } catch (PrivilegeException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.FORBIDDEN).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ }
+ }
+
+ @PUT
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{username}/password")
+ public Response setUserPassword(@PathParam("username") String username, PasswordField passwordField,
+ @Context HttpServletRequest request) {
+ Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE);
+ try {
+
+ // if user changing own password, then no need for StrolchPrivilegeAdmin
+ PrivilegeHandler privilegeHandler = getPrivilegeHandler(cert, !cert.getUsername().equals(username));
+
+ privilegeHandler.setUserPassword(cert, username, passwordField.getPassword().getBytes());
+ return Response.ok(new Result(), MediaType.APPLICATION_JSON).build();
+
+ } catch (AccessDeniedException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.UNAUTHORIZED).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ } catch (PrivilegeException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.FORBIDDEN).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ }
+ }
+
+ @PUT
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{username}/locale/{locale}")
+ public Response setUserLocale(@PathParam("username") String username, @PathParam("locale") String localeS,
+ @Context HttpServletRequest request) {
+ Certificate cert = (Certificate) request.getAttribute(StrolchRestfulConstants.STROLCH_CERTIFICATE);
+ try {
+
+ Locale locale;
+ try {
+ locale = new Locale(localeS);
+ } catch (Exception e) {
+ String msg = MessageFormat.format("Locale {0} is not valid!", localeS);
+ return Response.serverError().entity(new Result(msg)).type(MediaType.APPLICATION_JSON).build();
+ }
+
+ // if user changing own locale, then no need for StrolchPrivilegeAdmin
+ PrivilegeHandler privilegeHandler = getPrivilegeHandler(cert, !cert.getUsername().equals(username));
+
+ UserRep updatedUser = privilegeHandler.setUserLocale(cert, username, locale);
+ return Response.ok(updatedUser, MediaType.APPLICATION_JSON).build();
+
+ } catch (AccessDeniedException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.UNAUTHORIZED).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ } catch (PrivilegeException e) {
+ logger.error(e.getMessage(), e);
+ return Response.status(Status.FORBIDDEN).entity(new Result(e.getMessage()))
+ .type(MediaType.APPLICATION_JSON).build();
+ }
+ }
}
diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/LoginResult.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/LoginResult.java
index ee7082060..1cc052516 100644
--- a/li.strolch.rest/src/main/java/li/strolch/rest/model/LoginResult.java
+++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/LoginResult.java
@@ -15,6 +15,7 @@
*/
package li.strolch.rest.model;
+import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -133,6 +134,8 @@ public class LoginResult {
*/
@XmlElement(name = "properties")
public List getPropertiesAsKeyValue() {
+ if (this.parameters == null)
+ return new ArrayList<>(0);
return XmlKeyValue.valueOf(this.parameters);
}
diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/PasswordField.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/PasswordField.java
new file mode 100644
index 000000000..cf26c98f6
--- /dev/null
+++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/PasswordField.java
@@ -0,0 +1,25 @@
+package li.strolch.rest.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Robert von Burg
+ */
+@XmlRootElement(name = "PasswordField")
+@XmlAccessorType(XmlAccessType.NONE)
+public class PasswordField {
+
+ @XmlAttribute(name = "password")
+ private String password;
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/li.strolch.rest/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml b/li.strolch.rest/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.rest/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
+++ b/li.strolch.rest/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.service/src/test/resources/migrationstest/config/PrivilegeConfig.xml b/li.strolch.service/src/test/resources/migrationstest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.service/src/test/resources/migrationstest/config/PrivilegeConfig.xml
+++ b/li.strolch.service/src/test/resources/migrationstest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.service/src/test/resources/svctest/config/PrivilegeConfig.xml b/li.strolch.service/src/test/resources/svctest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.service/src/test/resources/svctest/config/PrivilegeConfig.xml
+++ b/li.strolch.service/src/test/resources/svctest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.service/src/test/resources/transienttest/config/PrivilegeConfig.xml b/li.strolch.service/src/test/resources/transienttest/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.service/src/test/resources/transienttest/config/PrivilegeConfig.xml
+++ b/li.strolch.service/src/test/resources/transienttest/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.service/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml b/li.strolch.service/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
index 9d7a227e3..d7f0f7b9c 100644
--- a/li.strolch.service/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
+++ b/li.strolch.service/src/test/resources/withPrivilegeRuntime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.tutorialapp/src/runtime/config/PrivilegeConfig.xml b/li.strolch.tutorialapp/src/runtime/config/PrivilegeConfig.xml
index e264a8929..9d7cfc9f1 100644
--- a/li.strolch.tutorialapp/src/runtime/config/PrivilegeConfig.xml
+++ b/li.strolch.tutorialapp/src/runtime/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/li.strolch.tutorialwebapp/src/main/webapp/WEB-INF/config/PrivilegeConfig.xml b/li.strolch.tutorialwebapp/src/main/webapp/WEB-INF/config/PrivilegeConfig.xml
index e264a8929..9d7cfc9f1 100644
--- a/li.strolch.tutorialwebapp/src/main/webapp/WEB-INF/config/PrivilegeConfig.xml
+++ b/li.strolch.tutorialwebapp/src/main/webapp/WEB-INF/config/PrivilegeConfig.xml
@@ -5,7 +5,7 @@
-
+