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 @@ - +