From 3872e0f725193615af949d755e97dc87aa53fcc7 Mon Sep 17 00:00:00 2001 From: anhefti Date: Fri, 30 Apr 2021 13:32:22 +0200 Subject: [PATCH] SEBSERV-135 gui --- .../ch/ethz/seb/sebserver/SEBServerInit.java | 2 ++ .../gui/content/CertificateList.java | 21 ++++++++++- .../gui/content/InstitutionList.java | 35 +------------------ .../api/seb/cert/RemoveCertificate.java | 11 +++--- .../servicelayer/dao/CertificateDAO.java | 3 +- .../dao/impl/CertificateDAOImpl.java | 8 +++-- .../dao/impl/InstitutionDAOImpl.java | 5 ++- .../sebconfig/CertificateService.java | 3 +- .../impl/CertificateServiceImpl.java | 3 +- .../weblayer/api/CertificateController.java | 17 ++++++--- 10 files changed, 58 insertions(+), 50 deletions(-) diff --git a/src/main/java/ch/ethz/seb/sebserver/SEBServerInit.java b/src/main/java/ch/ethz/seb/sebserver/SEBServerInit.java index 8a704889..1bf3beb8 100644 --- a/src/main/java/ch/ethz/seb/sebserver/SEBServerInit.java +++ b/src/main/java/ch/ethz/seb/sebserver/SEBServerInit.java @@ -48,6 +48,8 @@ public class SEBServerInit { INIT_LOGGER.info("---->"); INIT_LOGGER.info("----> Active profiles: {}", Arrays.toString(this.environment.getActiveProfiles())); INIT_LOGGER.info("---->"); + INIT_LOGGER.info("----> Context Path: {}", this.environment.getProperty("server.servlet.context-path")); + INIT_LOGGER.info("---->"); this.initialized = true; } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/CertificateList.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/CertificateList.java index cac0ce10..d525d258 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/CertificateList.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/CertificateList.java @@ -16,7 +16,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; +import ch.ethz.seb.sebserver.gbl.Constants; +import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.EntityType; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition; @@ -28,6 +31,7 @@ import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.cert.GetCertificatePage; +import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.cert.RemoveCertificate; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser.GrantCheck; import ch.ethz.seb.sebserver.gui.table.ColumnDefinition; @@ -149,11 +153,26 @@ public class CertificateList implements TemplateComposer { .newAction(ActionDefinition.SEB_CERTIFICATE_REMOVE) .withSelect( table::getSelection, - PageAction::applySingleSelectionAsEntityKey, + this::removeCertificate, EMPTY_SELECTION_TEXT_KEY) .publishIf(() -> grantCheck.iw(), false); } + private PageAction removeCertificate(final PageAction action) { + final String ids = StringUtils.join( + action.getMultiSelection().stream() + .map(EntityKey::getModelId) + .collect(Collectors.toList()), + Constants.LIST_SEPARATOR); + + this.restService.getBuilder(RemoveCertificate.class) + .withFormParam(API.CERTIFICATE_ALIAS, ids) + .call() + .onError(erorr -> action.pageContext().notifyRemoveError(EntityType.CERTIFICATE, erorr)); + + return action; + } + private String getTypeInfo(final CertificateInfo certificateInfo) { final I18nSupport i18nSupport = this.pageService.getI18nSupport(); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionList.java b/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionList.java index e533a1ef..bf763abd 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionList.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/content/InstitutionList.java @@ -8,23 +8,17 @@ package ch.ethz.seb.sebserver.gui.content; -import java.util.ArrayList; -import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.eclipse.swt.widgets.Composite; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.EntityType; import ch.ethz.seb.sebserver.gbl.model.Domain; import ch.ethz.seb.sebserver.gbl.model.Entity; -import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.institution.Institution; import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; -import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.gui.content.action.ActionDefinition; import ch.ethz.seb.sebserver.gui.service.i18n.LocTextKey; import ch.ethz.seb.sebserver.gui.service.page.PageContext; @@ -34,7 +28,6 @@ import ch.ethz.seb.sebserver.gui.service.page.TemplateComposer; import ch.ethz.seb.sebserver.gui.service.page.impl.PageAction; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestService; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.institution.GetInstitutionPage; -import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.cert.RemoveCertificate; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser; import ch.ethz.seb.sebserver.gui.service.remote.webservice.auth.CurrentUser.GrantCheck; import ch.ethz.seb.sebserver.gui.table.ColumnDefinition; @@ -152,7 +145,7 @@ public class InstitutionList implements TemplateComposer { .newAction(ActionDefinition.INSTITUTION_MODIFY_FROM_LIST) .withSelect( table::getSelection, - this::removeCertificates, + PageAction::applySingleSelectionAsEntityKey, EMPTY_SELECTION_TEXT_KEY) .publishIf(() -> instGrant.m(), false) @@ -162,30 +155,4 @@ public class InstitutionList implements TemplateComposer { .publishIf(() -> instGrant.m(), false); } - private PageAction removeCertificates(final PageAction action) { - final Set multiSelection = action.getMultiSelection(); - if (multiSelection != null) { - final ArrayList errors = new ArrayList<>(); - multiSelection - .stream() - .forEach(key -> { - final Result call = this.restService.getBuilder(RemoveCertificate.class) - .withURIVariable( - API.CERTIFICATE_ALIAS_VAR_PATH_SEGMENT, - key.modelId) - .call(); - if (call.hasError()) { - errors.add(call.getError()); - } - }); - if (!errors.isEmpty()) { - action.pageContext().notifyRemoveError( - EntityType.CERTIFICATE, - errors.get(0)); - } - } - - return action; - } - } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/api/seb/cert/RemoveCertificate.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/api/seb/cert/RemoveCertificate.java index 18b69d3f..8ca63db3 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/api/seb/cert/RemoveCertificate.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/remote/webservice/api/seb/cert/RemoveCertificate.java @@ -8,6 +8,8 @@ package ch.ethz.seb.sebserver.gui.service.remote.webservice.api.seb.cert; +import java.util.Collection; + import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -17,21 +19,22 @@ import com.fasterxml.jackson.core.type.TypeReference; import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.EntityType; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; import ch.ethz.seb.sebserver.gui.service.remote.webservice.api.RestCall; @Lazy @Component @GuiProfile -public class RemoveCertificate extends RestCall { +public class RemoveCertificate extends RestCall> { public RemoveCertificate() { super(new TypeKey<>( - CallType.GET_SINGLE, + CallType.DELETE, EntityType.CERTIFICATE, - new TypeReference() { + new TypeReference>() { }), - HttpMethod.GET, + HttpMethod.DELETE, MediaType.APPLICATION_FORM_URLENCODED, API.CERTIFICATE_ENDPOINT + API.CERTIFICATE_ALIAS_VAR_PATH_SEGMENT); } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/CertificateDAO.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/CertificateDAO.java index 00213a17..5c50642f 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/CertificateDAO.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/CertificateDAO.java @@ -22,6 +22,7 @@ import org.bouncycastle.asn1.x500.style.IETFUtils; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.joda.time.DateTime; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo.CertificateType; import ch.ethz.seb.sebserver.gbl.model.sebconfig.Certificates; @@ -34,7 +35,7 @@ public interface CertificateDAO { Result addCertificate(Long institutionId, String alias, Certificate certificate); - Result removeCertificate(Long institutionId, String alias); + Result removeCertificate(Long institutionId, String alias); static Result getDataFromCertificate(final Certificates certificates, final String alias) { return Result.tryCatch(() -> { diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/CertificateDAOImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/CertificateDAOImpl.java index ccf155f0..d5f10975 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/CertificateDAOImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/CertificateDAOImpl.java @@ -29,7 +29,9 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import ch.ethz.seb.sebserver.gbl.Constants; +import ch.ethz.seb.sebserver.gbl.api.APIMessage.FieldValidationException; import ch.ethz.seb.sebserver.gbl.api.EntityType; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.model.sebconfig.Certificates; import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile; @@ -88,11 +90,12 @@ public class CertificateDAOImpl implements CertificateDAO { @Override @Transactional - public Result removeCertificate(final Long institutionId, final String alias) { + public Result removeCertificate(final Long institutionId, final String alias) { return getCertificatesFromPersistent(institutionId) .flatMap(record -> removeCertificate(record, alias)) .flatMap(this::storeUpdate) + .map(cert -> new EntityKey(alias, EntityType.CERTIFICATE)) .onError(TransactionHandler::rollback); } @@ -151,7 +154,8 @@ public class CertificateDAOImpl implements CertificateDAO { final Certificate certificate) { if (store.engineContainsAlias(alias)) { - throw new RuntimeException("Alias name already exists: " + alias); + throw new FieldValidationException("name", "institution:name:exists"); + //throw new RuntimeException("Alias name already exists: " + alias); } Collections.list(store.engineAliases()) diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/InstitutionDAOImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/InstitutionDAOImpl.java index 0a99a81d..ceedf424 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/InstitutionDAOImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/dao/impl/InstitutionDAOImpl.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.APIMessage.FieldValidationException; import ch.ethz.seb.sebserver.gbl.api.EntityType; import ch.ethz.seb.sebserver.gbl.model.EntityDependency; @@ -265,7 +266,9 @@ public class InstitutionDAOImpl implements InstitutionDAO { .execute(); if (count != null && count > 0) { - throw new FieldValidationException("name", "institution:name:exists"); + throw new FieldValidationException( + API.IMPORT_FILE_ATTR_NAME, + "certificate:certificate:exists"); } } } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/CertificateService.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/CertificateService.java index 9a7ef13e..217993e5 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/CertificateService.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/CertificateService.java @@ -14,6 +14,7 @@ import java.util.function.Predicate; import org.apache.commons.lang3.StringUtils; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo.CertificateFileType; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo.CertificateType; @@ -35,7 +36,7 @@ public interface CertificateService { String alias, InputStream in); - Result removeCertificate(Long institutionId, String alias); + Result removeCertificate(Long institutionId, String alias); Result> toCertificateInfo(Certificates certificates); diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/impl/CertificateServiceImpl.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/impl/CertificateServiceImpl.java index 26a077e2..6de4b861 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/impl/CertificateServiceImpl.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/sebconfig/impl/CertificateServiceImpl.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo.CertificateFileType; import ch.ethz.seb.sebserver.gbl.model.sebconfig.Certificates; @@ -81,7 +82,7 @@ public class CertificateServiceImpl implements CertificateService { } @Override - public Result removeCertificate(final Long institutionId, final String alias) { + public Result removeCertificate(final Long institutionId, final String alias) { return this.certificateDAO.removeCertificate(institutionId, alias); } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/CertificateController.java b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/CertificateController.java index 01a9bfd1..53ad813d 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/CertificateController.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/CertificateController.java @@ -10,6 +10,7 @@ package ch.ethz.seb.sebserver.webservice.weblayer.api; import java.io.BufferedInputStream; import java.io.InputStream; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -32,10 +33,12 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import ch.ethz.seb.sebserver.gbl.Constants; import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.EntityType; import ch.ethz.seb.sebserver.gbl.api.authorization.PrivilegeType; import ch.ethz.seb.sebserver.gbl.model.Entity; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.EntityName; import ch.ethz.seb.sebserver.gbl.model.Page; import ch.ethz.seb.sebserver.gbl.model.PageSortOrder; @@ -43,6 +46,7 @@ import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo; import ch.ethz.seb.sebserver.gbl.model.sebconfig.CertificateInfo.CertificateFileType; import ch.ethz.seb.sebserver.gbl.model.user.UserLogActivityType; import ch.ethz.seb.sebserver.gbl.profile.WebServiceProfile; +import ch.ethz.seb.sebserver.gbl.util.Result; import ch.ethz.seb.sebserver.webservice.servicelayer.PaginationService; import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.AuthorizationService; import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.UserService; @@ -229,18 +233,21 @@ public class CertificateController { method = RequestMethod.DELETE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public void deleteCertificate( + public Collection deleteCertificate( @RequestParam( name = API.PARAM_INSTITUTION_ID, required = true, defaultValue = UserService.USERS_INSTITUTION_AS_DEFAULT) final Long institutionId, - @PathVariable final String alias) { + @RequestParam(name = API.CERTIFICATE_ALIAS, required = true) final String aliases) { this.checkWritePrivilege(institutionId); - this.certificateService - .removeCertificate(institutionId, alias) - .getOrThrow(); + return Arrays.asList(StringUtils.split(aliases, Constants.LIST_SEPARATOR)) + .stream() + .map(alias -> this.certificateService + .removeCertificate(institutionId, alias)) + .flatMap(Result::onErrorLogAndSkip) + .collect(Collectors.toList()); } private void checkReadPrivilege(final Long institutionId) {