diff --git a/application/pom.xml b/application/pom.xml index e227efa..87932f2 100755 --- a/application/pom.xml +++ b/application/pom.xml @@ -82,6 +82,11 @@ webstly-urlshortener ${revision} + + de.bstly.we + webauthn + ${revision} + de.bstly.we webstly-wireguard diff --git a/application/src/main/java/de/bstly/we/Application.java b/application/src/main/java/de/bstly/we/Application.java index 9701da5..a580a2b 100755 --- a/application/src/main/java/de/bstly/we/Application.java +++ b/application/src/main/java/de/bstly/we/Application.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we; import java.util.EnumSet; diff --git a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowItemManager.java b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowItemManager.java index 54454e2..72ff470 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowItemManager.java +++ b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowItemManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.businesslogic; import java.util.Iterator; diff --git a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowPermissions.java b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowPermissions.java index 156ddd2..34a9c0a 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowPermissions.java +++ b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.businesslogic; /** diff --git a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowRequestManager.java b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowRequestManager.java index 1ca1da3..5a68b59 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowRequestManager.java +++ b/borrow/src/main/java/de/bstly/we/borrow/businesslogic/BorrowRequestManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.businesslogic; import java.text.ParseException; diff --git a/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowItemController.java b/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowItemController.java index b3e7ab5..61fb709 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowItemController.java +++ b/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowItemController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.controller; import java.util.Optional; @@ -100,7 +97,7 @@ public class BorrowItemController extends BaseController { */ @PreAuthorize("isAuthenticated()") @GetMapping("/{id}") - public BorrowItem getBorrowItem(@PathVariable("id") Long id) { + public BorrowItem getBorrowItem(@PathVariable Long id) { if (!permissionManager.hasPermission(getCurrentUserId(), BorrowPermissions.BORROW_REQUESTS) || !permissionManager.isFullUser(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); @@ -109,7 +106,7 @@ public class BorrowItemController extends BaseController { BorrowItem borrowItem = borrowItemManager.get(id); if (borrowItem == null) { - throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY); + throw new EntityResponseStatusException(HttpStatus.CONFLICT); } if (!borrowItem.getOwner().equals(getCurrentUserId())) { @@ -166,7 +163,7 @@ public class BorrowItemController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{id}") - public void deleteBorrowItem(@PathVariable("id") Long id) { + public void deleteBorrowItem(@PathVariable Long id) { BorrowItem borrowItem = borrowItemManager.get(id); if (borrowItem == null || !borrowItem.getOwner().equals(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); diff --git a/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowRequestController.java b/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowRequestController.java index c920054..5da098a 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowRequestController.java +++ b/borrow/src/main/java/de/bstly/we/borrow/controller/BorrowRequestController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.controller; import java.text.ParseException; @@ -163,7 +160,7 @@ public class BorrowRequestController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{id}") - public void deleteBorrowRequest(@PathVariable("id") Long id) { + public void deleteBorrowRequest(@PathVariable Long id) { BorrowRequest borrowRequest = borrowRequestManager.get(id); if (borrowRequest == null || !borrowRequest.getUser().equals(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); @@ -212,14 +209,14 @@ public class BorrowRequestController extends BaseController { */ @PreAuthorize("isAuthenticated()") @GetMapping("/code/{id}") - public String getCode(@PathVariable("id") Long id, HttpServletRequest request) { + public String getCode(@PathVariable Long id, HttpServletRequest request) { BorrowRequest borrowRequest = borrowRequestManager.get(id); if (borrowRequest == null || !borrowRequest.getUser().equals(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); } if (!borrowRequest.getStatus().equals(BorrowRequestStatus.ACCEPTED)) { - throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY); + throw new EntityResponseStatusException(HttpStatus.CONFLICT); } String issuer = jwtBorrowIssuer; diff --git a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowItemValidator.java b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowItemValidator.java index aa3a0a9..12037f1 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowItemValidator.java +++ b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowItemValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.controller.validation; import org.apache.commons.validator.routines.EmailValidator; diff --git a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowJwtValidator.java b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowJwtValidator.java index 2772328..0b22c82 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowJwtValidator.java +++ b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowJwtValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.controller.validation; import java.text.ParseException; diff --git a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowRequestValidator.java b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowRequestValidator.java index 489a45c..c104b83 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowRequestValidator.java +++ b/borrow/src/main/java/de/bstly/we/borrow/controller/validation/BorrowRequestValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.controller.validation; import java.time.Duration; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItem.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItem.java index 19dc9d8..92ce7e4 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItem.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItem.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; import java.time.Duration; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemAvailability.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemAvailability.java index 24dbaa0..01f4760 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemAvailability.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemAvailability.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; /** diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemManualSlot.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemManualSlot.java index 1cb9707..3e84018 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemManualSlot.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemManualSlot.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; import java.time.Instant; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemPeriodSlot.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemPeriodSlot.java index d586485..7807390 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemPeriodSlot.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemPeriodSlot.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; import java.time.DayOfWeek; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemSlot.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemSlot.java index 86e0fbc..bfe03e4 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemSlot.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowItemSlot.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; import jakarta.persistence.Column; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequest.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequest.java index 27270fc..c44d73f 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequest.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequest.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; import java.time.Instant; diff --git a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequestStatus.java b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequestStatus.java index 781a7bf..b482091 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequestStatus.java +++ b/borrow/src/main/java/de/bstly/we/borrow/model/BorrowRequestStatus.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.model; /** diff --git a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemManualSlotRepository.java b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemManualSlotRepository.java index b0567d6..c9efff3 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemManualSlotRepository.java +++ b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemManualSlotRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemPeriodSlotRepository.java b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemPeriodSlotRepository.java index a7906be..1406e23 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemPeriodSlotRepository.java +++ b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemPeriodSlotRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemRepository.java b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemRepository.java index 0c20bdd..2452952 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemRepository.java +++ b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemSlotRepository.java b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemSlotRepository.java index 7127056..a77d4b4 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemSlotRepository.java +++ b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowItemSlotRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowRequestRepository.java b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowRequestRepository.java index e76ba27..4d0f68c 100644 --- a/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowRequestRepository.java +++ b/borrow/src/main/java/de/bstly/we/borrow/repository/BorrowRequestRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.borrow.repository; import org.springframework.data.domain.Page; diff --git a/core/src/main/java/de/bstly/we/CoreConfiguration.java b/core/src/main/java/de/bstly/we/CoreConfiguration.java index e013274..0f5ad00 100644 --- a/core/src/main/java/de/bstly/we/CoreConfiguration.java +++ b/core/src/main/java/de/bstly/we/CoreConfiguration.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we; import jakarta.persistence.EntityManager; diff --git a/core/src/main/java/de/bstly/we/businesslogic/PermissionManager.java b/core/src/main/java/de/bstly/we/businesslogic/PermissionManager.java index ce79041..2af67c7 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/PermissionManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/PermissionManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/businesslogic/PermissionMappingManager.java b/core/src/main/java/de/bstly/we/businesslogic/PermissionMappingManager.java index 93f4555..a6297b9 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/PermissionMappingManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/PermissionMappingManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/businesslogic/Permissions.java b/core/src/main/java/de/bstly/we/businesslogic/Permissions.java index a7b7941..749fe99 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/Permissions.java +++ b/core/src/main/java/de/bstly/we/businesslogic/Permissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; /** diff --git a/core/src/main/java/de/bstly/we/businesslogic/PretixItemStatus.java b/core/src/main/java/de/bstly/we/businesslogic/PretixItemStatus.java index c4eab51..49ee713 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/PretixItemStatus.java +++ b/core/src/main/java/de/bstly/we/businesslogic/PretixItemStatus.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; /** diff --git a/core/src/main/java/de/bstly/we/businesslogic/PretixManager.java b/core/src/main/java/de/bstly/we/businesslogic/PretixManager.java index 1bdc47f..272f34e 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/PretixManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/PretixManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionManager.java b/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionManager.java new file mode 100644 index 0000000..cff592d --- /dev/null +++ b/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionManager.java @@ -0,0 +1,457 @@ +package de.bstly.we.businesslogic; + +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import com.google.common.collect.Lists; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; + +import de.bstly.we.businesslogic.support.InstantHelper; +import de.bstly.we.model.QQuotaExtension; +import de.bstly.we.model.QuotaExtension; +import de.bstly.we.model.QuotaExtensionMapping; +import de.bstly.we.model.UserData; +import de.bstly.we.repository.QuotaExtensionRepository; + +/** + * The Class QuotaExtensionManager. + */ +@Component +public class QuotaExtensionManager implements UserDataProvider { + + @Autowired + private QuotaExtensionRepository quotaExtensionRepository; + @Autowired + private QuotaExtensionMappingManager quotaExtensionMappingManager; + private QQuotaExtension qQuotaExtension = QQuotaExtension.quotaExtension; + + DateTimeFormatter pretixOffsetDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssx"); + + /** + * Gets the active extensions by target. + * + * @param target the target + * @return the active extensions by target + */ + public List getNotExpiresByTarget(Long target) { + return getNotExpiresByTarget(target, null); + } + + /** + * Gets the active extensions by target. + * + * @param target the target + * @param sort the sort + * @return the active extensions by target + */ + public List getNotExpiresByTarget(Long target, String sort) { + if (target != null) { + return Lists.newArrayList(quotaExtensionRepository.findAll( + qQuotaExtension.target.eq(target) + .and(qQuotaExtension.expires.after(Instant.now()) + .and(qQuotaExtension.starts.isNull() + .or(qQuotaExtension.starts.before(Instant.now())))), + Sort.by(StringUtils.hasText(sort) ? sort : "id"))); + } + return Lists.newArrayList(); + } + + /** + * Gets the active extensions by target and name. + * + * @param target the target + * @param name the name + * @return the active extensions by target and name + */ + public List getActiveExtensions(Long target, String name) { + return getActiveExtensions(target, name, null); + } + + /** + * Gets the active extensions by target and name. + * + * @param target the target + * @param name the name + * @param sort the sort + * @return the active extensions by target and name + */ + public List getActiveExtensions(Long target, String name, String sort) { + if (target != null && StringUtils.hasText(name)) { + return Lists.newArrayList(quotaExtensionRepository.findAll( + qQuotaExtension.target.eq(target).and(qQuotaExtension.name.eq(name)) + .and(qQuotaExtension.expires.after(Instant.now()) + .and(qQuotaExtension.starts.isNull() + .or(qQuotaExtension.starts.before(Instant.now())))), + Sort.by(StringUtils.hasText(sort) ? sort : "id"))); + } + return Lists.newArrayList(); + } + + /** + * Gets the total active extension value. + * + * @param target the target + * @param name the name + * @return the total active extension value + */ + public long getActiveExtensionValue(Long target, String name) { + return getActiveExtensions(target, name).stream() + .mapToLong(QuotaExtension::getValue) + .sum(); + } + + /** + * Gets the all by target. + * + * @param target the target + * @return the all by target + */ + public List getAllByTarget(Long target) { + return getAllByTarget(target, null); + } + + /** + * Gets the all by target. + * + * @param target the target + * @param sort the sort + * @return the all by target + */ + public List getAllByTarget(Long target, String sort) { + if (target != null) { + return Lists.newArrayList(quotaExtensionRepository.findAll(qQuotaExtension.target.eq(target), + Sort.by(StringUtils.hasText(sort) ? sort : "id"))); + } + return Lists.newArrayList(); + } + + /** + * Creates the. + * + * @param target the target + * @param name the name + * @param value the value + * @param unit the unit + * @param starts the starts + * @param expires the expires + * @param source the source + * @param description the description + * @return the quota extension + */ + public QuotaExtension create(Long target, String name, long value, String unit, Instant starts, Instant expires, + String source, String description) { + QuotaExtension newQuotaExtension = new QuotaExtension(); + newQuotaExtension.setTarget(target); + newQuotaExtension.setName(name); + newQuotaExtension.setValue(value); + newQuotaExtension.setUnit(unit); + newQuotaExtension.setStarts(starts); + newQuotaExtension.setExpires(expires); + newQuotaExtension.setSource(source); + newQuotaExtension.setDescription(description); + + return quotaExtensionRepository.save(newQuotaExtension); + } + + /** + * Update. + * + * @param quotaExtension the quota extension + * @return the quota extension + */ + public QuotaExtension update(QuotaExtension quotaExtension) { + Assert.isTrue(quotaExtensionRepository.existsById(quotaExtension.getId()), + "QuotaExtension '" + quotaExtension.getId() + "' does not exists!"); + QuotaExtension updateQuotaExtension = quotaExtensionRepository.findById(quotaExtension.getId()).get(); + updateQuotaExtension.setValue(quotaExtension.getValue()); + updateQuotaExtension.setUnit(quotaExtension.getUnit()); + updateQuotaExtension.setStarts(quotaExtension.getStarts()); + updateQuotaExtension.setExpires(quotaExtension.getExpires()); + updateQuotaExtension.setSource(quotaExtension.getSource()); + updateQuotaExtension.setDescription(quotaExtension.getDescription()); + return quotaExtensionRepository.save(updateQuotaExtension); + } + + /** + * Delete. + * + * @param id the id + */ + public void delete(Long id) { + Assert.isTrue(quotaExtensionRepository.existsById(id), "QuotaExtension '" + id + "' does not exists!"); + quotaExtensionRepository.deleteById(id); + } + + public void addForItem(Long target, Integer item, List quotas) { + for (QuotaExtensionMapping quotaMapping : quotaExtensionMappingManager.getAllByItem(item)) { + boolean added = false; + for (QuotaExtension quotaExtension : quotas) { + if (quotaExtension.getName().equals(quotaMapping.getName())) { + quotaExtension.setValue(quotaMapping.getValue()); + added = true; + } + } + + if (!added) { + QuotaExtension quotaExtension = new QuotaExtension(); + quotaExtension.setName(quotaMapping.getName()); + quotaExtension.setValue(quotaMapping.getValue()); + quotaExtension.setUnit(quotaMapping.getUnit()); + quotas.add(quotaExtension); + } + } + } + + /** + * Apply item - creates extensions based on mapping rules. + * + * @param target the target + * @param item the item + * @param answers the answers + * @param starts the starts + * @param expires the expires + */ + public void applyItem(Long target, Integer item, JsonArray answers, Instant starts, Instant expires) { + for (QuotaExtension quotaExtension : getForItem(target, item, answers, starts, expires)) { + quotaExtensionRepository.save(quotaExtension); + } + } + + /** + * Gets extensions for item - mirrors PermissionManager.getForItem logic. + * + * @param target the target + * @param item the item + * @param answers the answers + * @param starts the starts + * @param expires the expires + * @return the list of quota extensions + */ + public List getForItem(Long target, Integer item, JsonArray answers, Instant starts, + Instant expires) { + List extensions = Lists.newArrayList(); + + for (QuotaExtensionMapping extensionMapping : quotaExtensionMappingManager.getAllByItem(item)) { + Instant extensionStarts = starts; + Instant extensionExpires = expires; + + if (extensionMapping.getStarts() != null) { + extensionStarts = extensionMapping.getStarts(); + } + + if (extensionMapping.getExpires() != null) { + extensionExpires = extensionMapping.getExpires(); + } + + if (extensionExpires == null) { + extensionExpires = InstantHelper.plus(extensionStarts == null ? Instant.now() : extensionStarts, + extensionMapping.getLifetime(), extensionMapping.getLifetimeUnit()); + } + + // Process question-based dates (mirroring permission logic) + for (JsonElement answer : answers) { + if (answer.isJsonObject() && answer.getAsJsonObject().has("question_identifier")) { + if (StringUtils.hasText(extensionMapping.getStartsQuestion()) + && extensionMapping.getStartsQuestion() + .equals(answer.getAsJsonObject().get("question_identifier").getAsString()) + && answer.getAsJsonObject().has("answer")) { + String dateTimeString = answer.getAsJsonObject().get("answer").getAsString(); + if (StringUtils.hasText(dateTimeString)) { + dateTimeString = dateTimeString.replace(" ", "T"); + extensionStarts = OffsetDateTime.parse(dateTimeString).toInstant(); + extensionExpires = InstantHelper.plus(extensionStarts, + extensionMapping.getLifetime(), extensionMapping.getLifetimeUnit()); + } + } + + if (StringUtils.hasText(extensionMapping.getExpiresQuestion()) + && extensionMapping.getExpiresQuestion() + .equals(answer.getAsJsonObject().get("question_identifier").getAsString()) + && answer.getAsJsonObject().has("answer")) { + String dateTimeString = answer.getAsJsonObject().get("answer").getAsString(); + if (StringUtils.hasText(dateTimeString)) { + dateTimeString = dateTimeString.replace(" ", "T"); + extensionExpires = InstantHelper.plus( + OffsetDateTime.parse(dateTimeString).toInstant(), + extensionMapping.getLifetime(), extensionMapping.getLifetimeUnit()); + } + } + } + } + + // Create the extension + QuotaExtension extension = new QuotaExtension(); + extension.setTarget(target); + extension.setName(extensionMapping.getName()); + extension.setValue(extensionMapping.getValue()); + extension.setUnit(extensionMapping.getUnit()); + extension.setStarts(extensionStarts); + extension.setExpires(extensionExpires); + // Apply start cleanup and lifetime rounding + if (extension.getStarts() != null && extension.getStarts().isBefore(Instant.now())) { + extension.setStarts(null); + } + + if (extensionMapping.isLifetimeRound()) { + extension.setExpires( + InstantHelper.truncate(extension.getExpires(), extensionMapping.getLifetimeUnit())); + } + + extensions.add(extension); + } + + return extensions; + } + + /** + * Cleanup expired extensions. + */ + public void cleanupExpiredExtensions() { + for (QuotaExtension extension : quotaExtensionRepository + .findAll(qQuotaExtension.expires.before(Instant.now()))) { + quotaExtensionRepository.delete(extension); + } + } + + /* + * @see de.bstly.we.businesslogic.UserDataProvider#getId() + */ + @Override + public String getId() { + return "quota_extensions"; + } + + /* + * @see de.bstly.we.businesslogic.UserDataProvider#getUserData(java.lang.Long) + */ + @Override + public List getUserData(Long userId) { + List result = Lists.newArrayList(); + for (QuotaExtension extension : getAllByTarget(userId)) { + result.add(extension); + } + return result; + } + + /** + * Gets all quota extensions with predicate and pageable. + * + * @param predicate the predicate + * @param pageable the pageable + * @return the page of quota extensions + */ + public org.springframework.data.domain.Page getAll(com.querydsl.core.types.Predicate predicate, + org.springframework.data.domain.Pageable pageable) { + return quotaExtensionRepository.findAll(predicate, pageable); + } + + /** + * Gets quota extension by id. + * + * @param id the id + * @return the quota extension + */ + public QuotaExtension get(Long id) { + Assert.notNull(id, "id must not be null!"); + return quotaExtensionRepository.findById(id).orElse(null); + } + + /** + * Gets quota extensions by target. + * + * @param target the target + * @return the list of quota extensions + */ + public List getByTarget(Long target) { + Assert.notNull(target, "target must not be empty!"); + return Lists.newArrayList(quotaExtensionRepository.findAll(qQuotaExtension.target.eq(target), + Sort.by("expires").ascending())); + } + + /** + * Gets active quota extensions by target. + * + * @param target the target + * @return the list of active quota extensions + */ + public List getActiveExtensions(Long target) { + Assert.notNull(target, "target must not be empty!"); + Instant now = Instant.now(); + return Lists.newArrayList(quotaExtensionRepository.findAll( + qQuotaExtension.target.eq(target) + .and(qQuotaExtension.expires.after(now)) + .and(qQuotaExtension.starts.isNull().or(qQuotaExtension.starts.before(now))), + Sort.by("expires").ascending())); + } + + /** + * Creates a quota extension. + * + * @param quotaExtension the quota extension to create + * @return the created quota extension + */ + public QuotaExtension create(QuotaExtension quotaExtension) { + Assert.notNull(quotaExtension, "quotaExtension must not be null!"); + Assert.isNull(quotaExtension.getTarget(), "target must not be empty!"); + Assert.hasText(quotaExtension.getName(), "name must not be empty!"); + Assert.notNull(quotaExtension.getExpires(), "expires must not be null!"); + Assert.isTrue(quotaExtension.getValue() > 0, "value must be positive!"); + + return quotaExtensionRepository.save(quotaExtension); + } + + /** + * Updates a quota extension. + * + * @param id the id of the quota extension + * @param quotaExtension the updated quota extension data + * @return the updated quota extension + */ + public QuotaExtension update(Long id, QuotaExtension quotaExtension) { + Assert.notNull(id, "id must not be null!"); + Assert.notNull(quotaExtension, "quotaExtension must not be null!"); + + QuotaExtension existingExtension = get(id); + Assert.notNull(existingExtension, "QuotaExtension with id " + id + " not found!"); + + existingExtension.setTarget(quotaExtension.getTarget()); + existingExtension.setName(quotaExtension.getName()); + existingExtension.setValue(quotaExtension.getValue()); + + existingExtension.setUnit(quotaExtension.getUnit()); + existingExtension.setExpires(quotaExtension.getExpires()); + existingExtension.setStarts(quotaExtension.getStarts()); + existingExtension.setSource(quotaExtension.getSource()); + + existingExtension.setDescription(quotaExtension.getDescription()); + + return quotaExtensionRepository.save(existingExtension); + } + + /** + * Cleanup expired quota extensions. + */ + public void cleanupExpired() { + Instant now = Instant.now(); + List expiredExtensions = Lists.newArrayList(quotaExtensionRepository.findAll( + qQuotaExtension.expires.before(now))); + quotaExtensionRepository.deleteAll(expiredExtensions); + } + + @Override + public void purgeUserData(Long userId) { + for (QuotaExtension quotaExtension : getAllByTarget(userId)) { + quotaExtensionRepository.delete(quotaExtension); + } + } + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionMappingManager.java b/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionMappingManager.java new file mode 100644 index 0000000..ab9319e --- /dev/null +++ b/core/src/main/java/de/bstly/we/businesslogic/QuotaExtensionMappingManager.java @@ -0,0 +1,153 @@ +package de.bstly.we.businesslogic; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import com.google.common.collect.Lists; + +import de.bstly.we.model.QQuotaExtensionMapping; +import de.bstly.we.model.QuotaExtensionMapping; +import de.bstly.we.repository.QuotaExtensionMappingRepository; + +/** + * The Class QuotaExtensionMappingManager. + */ +@Component +public class QuotaExtensionMappingManager { + + @Autowired + private QuotaExtensionMappingRepository quotaExtensionMappingRepository; + private QQuotaExtensionMapping qQuotaExtensionMapping = QQuotaExtensionMapping.quotaExtensionMapping; + + /** + * Gets the all by item. + * + * @param item the item + * @return the all by item + */ + public List getAllByItem(Integer item) { + return Lists.newArrayList(quotaExtensionMappingRepository.findAll(qQuotaExtensionMapping.items.contains(item))); + } + + /** + * Exists. + * + * @param item the item + * @return true, if successful + */ + public boolean exists(Integer item) { + return quotaExtensionMappingRepository.exists(qQuotaExtensionMapping.items.contains(item)); + } + + /** + * Exists. + * + * @param item the item + * @param name the name + * @return true, if successful + */ + public boolean exists(Integer item, String name) { + return quotaExtensionMappingRepository + .exists(qQuotaExtensionMapping.items.contains(item).and(qQuotaExtensionMapping.name.eq(name))); + } + + /** + * Creates the. + * + * @param items the items + * @param name the name + * @param value the value + * @param unit the unit + * @param lifetime the lifetime + * @param lifetimeUnit the lifetime unit + * @param lifetimeRound the lifetime round + * @param products the products + * @param starts the starts + * @param expires the expires + * @param startsQuestion the starts question + * @param expiresQuestion the expires question + * @return the quota extension mapping + */ + public QuotaExtensionMapping create(Set items, String name, long value, String unit, Long lifetime, + ChronoUnit lifetimeUnit, boolean lifetimeRound, Set products, Instant starts, Instant expires, + String startsQuestion, String expiresQuestion) { + + QuotaExtensionMapping quotaExtensionMapping = new QuotaExtensionMapping(); + quotaExtensionMapping.setItems(items); + quotaExtensionMapping.setName(name); + quotaExtensionMapping.setValue(value); + quotaExtensionMapping.setUnit(unit); + quotaExtensionMapping.setLifetime(lifetime); + quotaExtensionMapping.setLifetimeUnit(lifetimeUnit); + quotaExtensionMapping.setLifetimeRound(lifetimeRound); + quotaExtensionMapping.setProducts(products); + quotaExtensionMapping.setStarts(starts); + quotaExtensionMapping.setExpires(expires); + quotaExtensionMapping.setStartsQuestion(startsQuestion); + quotaExtensionMapping.setExpiresQuestion(expiresQuestion); + return quotaExtensionMappingRepository.save(quotaExtensionMapping); + } + + /** + * Update. + * + * @param quotaExtensionMapping the quota extension mapping + * @return the quota extension mapping + */ + public QuotaExtensionMapping update(QuotaExtensionMapping quotaExtensionMapping) { + Assert.isTrue( + quotaExtensionMapping.getId() != null + && quotaExtensionMappingRepository.existsById(quotaExtensionMapping.getId()), + "QuotaExtensionMapping '" + quotaExtensionMapping.getId() + "' does not exists!"); + + QuotaExtensionMapping updateQuotaExtensionMapping = quotaExtensionMappingRepository + .findById(quotaExtensionMapping.getId()).get(); + updateQuotaExtensionMapping.setItems(quotaExtensionMapping.getItems()); + updateQuotaExtensionMapping.setName(quotaExtensionMapping.getName()); + updateQuotaExtensionMapping.setValue(quotaExtensionMapping.getValue()); + updateQuotaExtensionMapping.setUnit(quotaExtensionMapping.getUnit()); + updateQuotaExtensionMapping.setLifetime(quotaExtensionMapping.getLifetime()); + updateQuotaExtensionMapping.setLifetimeUnit(quotaExtensionMapping.getLifetimeUnit()); + updateQuotaExtensionMapping.setLifetimeRound(quotaExtensionMapping.isLifetimeRound()); + updateQuotaExtensionMapping.setProducts(quotaExtensionMapping.getProducts()); + updateQuotaExtensionMapping.setStarts(quotaExtensionMapping.getStarts()); + updateQuotaExtensionMapping.setExpires(quotaExtensionMapping.getExpires()); + updateQuotaExtensionMapping.setStartsQuestion(quotaExtensionMapping.getStartsQuestion()); + updateQuotaExtensionMapping.setExpiresQuestion(quotaExtensionMapping.getExpiresQuestion()); + return quotaExtensionMappingRepository.save(updateQuotaExtensionMapping); + } + + /** + * Delete. + * + * @param id the id + */ + public void delete(Long id) { + Assert.isTrue(quotaExtensionMappingRepository.existsById(id), + "QuotaExtensionMapping '" + id + "' does not exists!"); + quotaExtensionMappingRepository.deleteById(id); + } + + /** + * Gets the. + * + * @param page the page + * @param size the size + * @param sortBy the sort by + * @param descending the descending + * @return the page + */ + public Page get(int page, int size, String sortBy, boolean descending) { + Sort sort = descending ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending(); + return quotaExtensionMappingRepository.findAll(PageRequest.of(page, size, sort)); + } +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/businesslogic/QuotaManager.java b/core/src/main/java/de/bstly/we/businesslogic/QuotaManager.java index 81dc257..2975fd9 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/QuotaManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/QuotaManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; @@ -29,6 +26,8 @@ public class QuotaManager implements UserDataProvider { private QuotaRepository quotaRepository; @Autowired private QuotaMappingManager quotaMappingManager; + @Autowired + private QuotaExtensionManager quotaExtensionManager; private QQuota qQuota = QQuota.quota; /** @@ -129,6 +128,23 @@ public class QuotaManager implements UserDataProvider { && quotaRepository.exists(qQuota.name.eq(name).and(qQuota.target.eq(target)).and(qQuota.value.gt(0))); } + /** + * Gets the effective quota value (base quota + active extensions). + * + * @param target the target + * @param name the name + * @return the effective quota value + */ + public long getEffectiveQuotaValue(Long target, String name) { + Quota baseQuota = get(target, name); + long baseValue = baseQuota != null ? baseQuota.getValue() : 0; + + // Add all active extension values + long extensionValue = quotaExtensionManager.getActiveExtensionValue(target, name); + + return baseValue + extensionValue; + } + /** * Creates the. * diff --git a/core/src/main/java/de/bstly/we/businesslogic/QuotaMappingManager.java b/core/src/main/java/de/bstly/we/businesslogic/QuotaMappingManager.java index de80b7b..7a96669 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/QuotaMappingManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/QuotaMappingManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/Quotas.java b/core/src/main/java/de/bstly/we/businesslogic/Quotas.java index b7a3ead..89897ae 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/Quotas.java +++ b/core/src/main/java/de/bstly/we/businesslogic/Quotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; /** diff --git a/core/src/main/java/de/bstly/we/businesslogic/SessionManager.java b/core/src/main/java/de/bstly/we/businesslogic/SessionManager.java index 446aa98..bce7f66 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/SessionManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/SessionManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/businesslogic/Setup.java b/core/src/main/java/de/bstly/we/businesslogic/Setup.java index e03b95d..ef9a79c 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/Setup.java +++ b/core/src/main/java/de/bstly/we/businesslogic/Setup.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.io.BufferedReader; diff --git a/core/src/main/java/de/bstly/we/businesslogic/SystemProfileFieldManager.java b/core/src/main/java/de/bstly/we/businesslogic/SystemProfileFieldManager.java index a539ff3..2a80ffb 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/SystemProfileFieldManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/SystemProfileFieldManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/businesslogic/SystemPropertyManager.java b/core/src/main/java/de/bstly/we/businesslogic/SystemPropertyManager.java index 671ebf4..cf4ff5b 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/SystemPropertyManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/SystemPropertyManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserAliasManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserAliasManager.java index c2df266..5219843 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserAliasManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserAliasManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserDataManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserDataManager.java index 9797437..69b9c9e 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserDataManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserDataManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserDataProvider.java b/core/src/main/java/de/bstly/we/businesslogic/UserDataProvider.java index 967b1c6..505769c 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserDataProvider.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserDataProvider.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserDomainManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserDomainManager.java index 65d09f5..db79173 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserDomainManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserDomainManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.Hashtable; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserManager.java index 23eae3b..6186f57 100755 --- a/core/src/main/java/de/bstly/we/businesslogic/UserManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.io.BufferedReader; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserProfileFieldManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserProfileFieldManager.java index 9f6d3e9..d788f28 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserProfileFieldManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserProfileFieldManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserProfileFields.java b/core/src/main/java/de/bstly/we/businesslogic/UserProfileFields.java index 6cf8ee6..b01205b 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserProfileFields.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserProfileFields.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; /** diff --git a/core/src/main/java/de/bstly/we/businesslogic/UserTotpManager.java b/core/src/main/java/de/bstly/we/businesslogic/UserTotpManager.java index 7ec0930..604a92d 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/UserTotpManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/UserTotpManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/VoucherMappingManager.java b/core/src/main/java/de/bstly/we/businesslogic/VoucherMappingManager.java index 6af5e5c..8547c53 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/VoucherMappingManager.java +++ b/core/src/main/java/de/bstly/we/businesslogic/VoucherMappingManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/businesslogic/support/AbstractModelEventListener.java b/core/src/main/java/de/bstly/we/businesslogic/support/AbstractModelEventListener.java index d8dcbd5..3ea2535 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/support/AbstractModelEventListener.java +++ b/core/src/main/java/de/bstly/we/businesslogic/support/AbstractModelEventListener.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic.support; import jakarta.persistence.PostLoad; diff --git a/core/src/main/java/de/bstly/we/businesslogic/support/ChronoUnitConverter.java b/core/src/main/java/de/bstly/we/businesslogic/support/ChronoUnitConverter.java new file mode 100644 index 0000000..1524453 --- /dev/null +++ b/core/src/main/java/de/bstly/we/businesslogic/support/ChronoUnitConverter.java @@ -0,0 +1,21 @@ +package de.bstly.we.businesslogic.support; + +import java.time.temporal.ChronoUnit; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; + +@Converter +public class ChronoUnitConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(ChronoUnit chronoUnit) { + return chronoUnit.name(); + } + + @Override + public ChronoUnit convertToEntityAttribute(String value) { + return ChronoUnit.valueOf(value); + } + +} diff --git a/core/src/main/java/de/bstly/we/businesslogic/support/InstantHelper.java b/core/src/main/java/de/bstly/we/businesslogic/support/InstantHelper.java index 95361db..b7eb37e 100644 --- a/core/src/main/java/de/bstly/we/businesslogic/support/InstantHelper.java +++ b/core/src/main/java/de/bstly/we/businesslogic/support/InstantHelper.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.businesslogic.support; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/controller/Authentication2FAController.java b/core/src/main/java/de/bstly/we/controller/Authentication2FAController.java index 369da7e..5e61b68 100644 --- a/core/src/main/java/de/bstly/we/controller/Authentication2FAController.java +++ b/core/src/main/java/de/bstly/we/controller/Authentication2FAController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -110,8 +107,8 @@ public class Authentication2FAController extends BaseController { */ @PreAuthorize("authentication.authenticated") @GetMapping("/{id}") - public void isSecondFactorEnabled(@PathVariable("id") String providerId) { - SecondFactorProvider provider = secondFactorProviderManager.getProvider(providerId); + public void isSecondFactorEnabled(@PathVariable String id) { + SecondFactorProvider provider = secondFactorProviderManager.getProvider(id); if (provider == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); @@ -123,18 +120,19 @@ public class Authentication2FAController extends BaseController { } /** - * Request second factor mail. + * Request second factor. * * @param providerId the provider id + * @return the challenge data (e.g., PublicKeyCredentialRequestOptions for WebAuthn) */ @PreAuthorize("hasRole('ROLE_PRE_AUTH_USER')") @PostMapping("/{id}") - public void requestSecondFactorMail(@PathVariable("id") String providerId) { + public Object requestSecondFactor(@PathVariable String id) { Long userId = getPreAuthenticationId(); if (userId == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); } - SecondFactorProvider provider = secondFactorProviderManager.getProvider(providerId); + SecondFactorProvider provider = secondFactorProviderManager.getProvider(id); if (provider == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); @@ -146,7 +144,7 @@ public class Authentication2FAController extends BaseController { SecondFactorRequestProvider requestProvider = (SecondFactorRequestProvider) provider; - requestProvider.request(userId); + return requestProvider.request(userId); } /** @@ -157,8 +155,8 @@ public class Authentication2FAController extends BaseController { */ @PreAuthorize("authentication.authenticated") @PutMapping("/{id}") - public SecondFactor createSecondFactor(@PathVariable("id") String providerId) { - SecondFactorProvider provider = secondFactorProviderManager.getProvider(providerId); + public SecondFactor createSecondFactor(@PathVariable String id) { + SecondFactorProvider provider = secondFactorProviderManager.getProvider(id); if (provider == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); @@ -179,8 +177,8 @@ public class Authentication2FAController extends BaseController { */ @PreAuthorize("authentication.authenticated") @PatchMapping("/{id}") - public void enableSecondFactor(@PathVariable("id") String providerId, @RequestBody String token) { - SecondFactorProvider provider = secondFactorProviderManager.getProvider(providerId); + public void enableSecondFactor(@PathVariable String id, @RequestBody String token) { + SecondFactorProvider provider = secondFactorProviderManager.getProvider(id); if (provider == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); @@ -198,8 +196,8 @@ public class Authentication2FAController extends BaseController { */ @PreAuthorize("authentication.authenticated") @DeleteMapping("/{id}") - public void removeSecondFactorMail(@PathVariable("id") String providerId) { - SecondFactorProvider provider = secondFactorProviderManager.getProvider(providerId); + public void removeSecondFactorMail(@PathVariable String id) { + SecondFactorProvider provider = secondFactorProviderManager.getProvider(id); if (provider == null) { throw new EntityResponseStatusException(HttpStatus.UNAUTHORIZED); diff --git a/core/src/main/java/de/bstly/we/controller/AuthenticationController.java b/core/src/main/java/de/bstly/we/controller/AuthenticationController.java index cb6e7e4..edc4e42 100755 --- a/core/src/main/java/de/bstly/we/controller/AuthenticationController.java +++ b/core/src/main/java/de/bstly/we/controller/AuthenticationController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.io.IOException; diff --git a/core/src/main/java/de/bstly/we/controller/BaseController.java b/core/src/main/java/de/bstly/we/controller/BaseController.java index f79e918..dcd58ed 100755 --- a/core/src/main/java/de/bstly/we/controller/BaseController.java +++ b/core/src/main/java/de/bstly/we/controller/BaseController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import org.springframework.security.core.Authentication; diff --git a/core/src/main/java/de/bstly/we/controller/ItemController.java b/core/src/main/java/de/bstly/we/controller/ItemController.java index 0bf25ed..2f4e9d8 100755 --- a/core/src/main/java/de/bstly/we/controller/ItemController.java +++ b/core/src/main/java/de/bstly/we/controller/ItemController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.Map; @@ -135,7 +132,7 @@ public class ItemController extends BaseController { */ @PreAuthorize("isAuthenticated()") @PostMapping("/{username}") - public void redeemForUser(@PathVariable("username") String username, HttpSession session) { + public void redeemForUser(@PathVariable String username, HttpSession session) { if (tokenSessionManager.getTokenFromSession(session).isEmpty()) { throw new EntityResponseStatusException(HttpStatus.NOT_MODIFIED); diff --git a/core/src/main/java/de/bstly/we/controller/PermissionController.java b/core/src/main/java/de/bstly/we/controller/PermissionController.java index f72e012..2f64ae5 100644 --- a/core/src/main/java/de/bstly/we/controller/PermissionController.java +++ b/core/src/main/java/de/bstly/we/controller/PermissionController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/PermissionManagementController.java b/core/src/main/java/de/bstly/we/controller/PermissionManagementController.java index d21820b..0c841f8 100644 --- a/core/src/main/java/de/bstly/we/controller/PermissionManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/PermissionManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.time.Instant; @@ -49,8 +46,8 @@ public class PermissionManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public List getPermissionsForUser(@PathVariable("username") String username, - @RequestParam("sort") Optional sort, @RequestParam("ignoreStart") Optional ignoreStart) { + public List getPermissionsForUser(@PathVariable String username, + @RequestParam Optional sort, @RequestParam Optional ignoreStart) { User user = userManager.getByUsername(username); if (user == null) { @@ -73,7 +70,7 @@ public class PermissionManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}/all") - public List getAllPermissionsForUser(@PathVariable("username") String username, + public List getAllPermissionsForUser(@PathVariable String username, @RequestParam("sort") Optional sort) { User user = userManager.getByUsername(username); @@ -161,7 +158,7 @@ public class PermissionManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/{name}/clone/{clone}") - public List clone(@PathVariable("name") String name, @PathVariable("clone") String clone) { + public List clone(@PathVariable String name, @PathVariable String clone) { if (name.equals(clone)) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); } @@ -192,7 +189,7 @@ public class PermissionManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{target}") - public void deleteAll(@PathVariable("target") Long target) { + public void deleteAll(@PathVariable Long target) { permissionManager.deleteAll(target); } @@ -203,7 +200,7 @@ public class PermissionManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/byname/{name}") - public void deleteAllByName(@PathVariable("name") String name) { + public void deleteAllByName(@PathVariable String name) { permissionManager.deleteAll(name); } diff --git a/core/src/main/java/de/bstly/we/controller/PermissionMappingController.java b/core/src/main/java/de/bstly/we/controller/PermissionMappingController.java index b6cc542..0a8f9f3 100644 --- a/core/src/main/java/de/bstly/we/controller/PermissionMappingController.java +++ b/core/src/main/java/de/bstly/we/controller/PermissionMappingController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/PretixApiController.java b/core/src/main/java/de/bstly/we/controller/PretixApiController.java index 2e0e8bf..9930c88 100755 --- a/core/src/main/java/de/bstly/we/controller/PretixApiController.java +++ b/core/src/main/java/de/bstly/we/controller/PretixApiController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.io.IOException; diff --git a/core/src/main/java/de/bstly/we/controller/QuotaController.java b/core/src/main/java/de/bstly/we/controller/QuotaController.java index d309603..3bc9a01 100644 --- a/core/src/main/java/de/bstly/we/controller/QuotaController.java +++ b/core/src/main/java/de/bstly/we/controller/QuotaController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/QuotaExtensionController.java b/core/src/main/java/de/bstly/we/controller/QuotaExtensionController.java new file mode 100644 index 0000000..179166a --- /dev/null +++ b/core/src/main/java/de/bstly/we/controller/QuotaExtensionController.java @@ -0,0 +1,77 @@ +package de.bstly.we.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Lists; + +import de.bstly.we.businesslogic.QuotaExtensionManager; +import de.bstly.we.controller.support.TokenSessionManager; +import de.bstly.we.model.QuotaExtension; +import jakarta.servlet.http.HttpSession; + +/** + * The Class QuotaExtensionController. + */ +@RestController +@RequestMapping("/quota/extensions") +public class QuotaExtensionController extends BaseController { + + @Autowired + private QuotaExtensionManager quotaExtensionManager; + @Autowired + private TokenSessionManager tokenSessionManager; + + /** + * Gets the quotas. + * + * @return the quotas + */ + @GetMapping + public List getQuotaExtensions() { + if (getCurrentUserId() == null) { + return Lists.newArrayList(); + } + + return quotaExtensionManager.getNotExpiresByTarget(getCurrentUserId()); + } + + /** + * Gets the new quotas. + * + * @param session the session + * @return the new quotas + */ + @GetMapping("/new") + public List getNewQuotaExtensions(HttpSession session) { + List quotas = Lists.newArrayList(); + if (tokenSessionManager.getTokenFromSession(session).isEmpty()) { + return quotas; + } + + for (String token : tokenSessionManager.getTokenFromSession(session)) { + tokenSessionManager.addQuotaExtensionsForToken(getCurrentUserId(), token, quotas); + } + + return quotas; + } + + /** + * Gets the all quotas. + * + * @return the all quotas + */ + @GetMapping("/all") + public List getAllQuotas() { + if (getCurrentUserId() == null) { + return Lists.newArrayList(); + } + + return quotaExtensionManager.getAllByTarget(getCurrentUserId()); + } + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/controller/QuotaExtensionManagementController.java b/core/src/main/java/de/bstly/we/controller/QuotaExtensionManagementController.java new file mode 100644 index 0000000..94204c4 --- /dev/null +++ b/core/src/main/java/de/bstly/we/controller/QuotaExtensionManagementController.java @@ -0,0 +1,122 @@ +package de.bstly.we.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.querydsl.binding.QuerydslPredicate; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import com.querydsl.core.types.Predicate; + +import de.bstly.we.businesslogic.QuotaExtensionManager; +import de.bstly.we.businesslogic.UserManager; +import de.bstly.we.controller.support.EntityResponseStatusException; +import de.bstly.we.model.QuotaExtension; +import de.bstly.we.model.User; + +/** + * The Class QuotaExtensionManagementController. + */ +@RestController +@RequestMapping("/management/quota/extensions") +@PreAuthorize("hasRole('ROLE_ADMIN')") +public class QuotaExtensionManagementController { + + @Autowired + private QuotaExtensionManager quotaExtensionManager; + @Autowired + private UserManager userManager; + + /** + * Get all quota extensions. + */ + @GetMapping + public Page get(@QuerydslPredicate(root = QuotaExtension.class) Predicate predicate, + Pageable pageable) { + return quotaExtensionManager.getAll(predicate, pageable); + } + + /** + * Get quota extension by id. + */ + @GetMapping("/{id}") + public QuotaExtension get(@PathVariable Long id) { + return quotaExtensionManager.get(id); + } + + /** + * Get quota extensions by target. + */ + @GetMapping("/by-target/{target}") + public List getByTarget(@PathVariable String username) { + User user = userManager.getByUsername(username); + + if (user == null) { + throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); + } + + return quotaExtensionManager.getByTarget(user.getId()); + } + + /** + * Get active quota extensions for target. + */ + @GetMapping("/by-target/{target}/active") + public List getActiveByTarget(@PathVariable String username) { + User user = userManager.getByUsername(username); + + if (user == null) { + throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); + } + + return quotaExtensionManager.getActiveExtensions(user.getId()); + } + + /** + * Create quota extension. + */ + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public QuotaExtension create(@RequestBody QuotaExtension quotaExtension) { + return quotaExtensionManager.create(quotaExtension); + } + + /** + * Update quota extension. + */ + @PatchMapping("/{id}") + public QuotaExtension update(@PathVariable Long id, @RequestBody QuotaExtension quotaExtension) { + return quotaExtensionManager.update(id, quotaExtension); + } + + /** + * Delete quota extension. + */ + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void delete(@PathVariable Long id) { + quotaExtensionManager.delete(id); + } + + /** + * Cleanup expired quota extensions. + */ + @PostMapping("/cleanup") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void cleanup() { + quotaExtensionManager.cleanupExpired(); + } + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/controller/QuotaExtensionMappingController.java b/core/src/main/java/de/bstly/we/controller/QuotaExtensionMappingController.java new file mode 100644 index 0000000..7afd6de --- /dev/null +++ b/core/src/main/java/de/bstly/we/controller/QuotaExtensionMappingController.java @@ -0,0 +1,141 @@ +package de.bstly.we.controller; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.Errors; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.google.common.collect.Lists; + +import de.bstly.we.businesslogic.QuotaExtensionMappingManager; +import de.bstly.we.controller.support.EntityResponseStatusException; +import de.bstly.we.controller.support.RequestBodyErrors; +import de.bstly.we.controller.validation.QuotaExtensionMappingValidator; +import de.bstly.we.model.QuotaExtensionMapping; + +/** + * The Class QuotaExtensionMappingController. + */ +@RestController +@RequestMapping("/quotas/extension-mappings") +public class QuotaExtensionMappingController extends BaseController { + + @Autowired + private QuotaExtensionMappingManager quotaExtensionMappingManager; + @Autowired + private QuotaExtensionMappingValidator quotaExtensionMappingValidator; + + /** + * Gets the quota extension mappings. + * + * @param pageParameter the page parameter + * @param sizeParameter the size parameter + * @return the quota extension mappings + */ + @PreAuthorize("hasRole('ROLE_ADMIN')") + @GetMapping + public Page getQuotaExtensionMappings(@RequestParam("page") Optional pageParameter, + @RequestParam("size") Optional sizeParameter) { + return quotaExtensionMappingManager.get(pageParameter.orElse(0), sizeParameter.orElse(10), "id", true); + } + + /** + * Creates the. + * + * @param quotaExtensionMapping the quota extension mapping + * @return the quota extension mapping + */ + @PreAuthorize("hasRole('ROLE_ADMIN')") + @PostMapping + public QuotaExtensionMapping create(@RequestBody QuotaExtensionMapping quotaExtensionMapping) { + + Errors errors = new RequestBodyErrors(quotaExtensionMapping); + + quotaExtensionMappingValidator.validate(quotaExtensionMapping, errors); + + if (errors.hasErrors()) { + throw new EntityResponseStatusException(errors.getAllErrors(), HttpStatus.CONFLICT); + } + + return quotaExtensionMappingManager.create(quotaExtensionMapping.getItems(), quotaExtensionMapping.getName(), + quotaExtensionMapping.getValue(), quotaExtensionMapping.getUnit(), quotaExtensionMapping.getLifetime(), + quotaExtensionMapping.getLifetimeUnit(), quotaExtensionMapping.isLifetimeRound(), + quotaExtensionMapping.getProducts(), quotaExtensionMapping.getStarts(), + quotaExtensionMapping.getExpires(), + quotaExtensionMapping.getStartsQuestion(), quotaExtensionMapping.getExpiresQuestion()); + } + + /** + * Creates the list. + * + * @param quotaExtensionMappings the quota extension mappings + * @return the list + */ + @PreAuthorize("hasRole('ROLE_ADMIN')") + @PostMapping("/list") + public List createList(@RequestBody List quotaExtensionMappings) { + List result = Lists.newArrayList(); + + for (QuotaExtensionMapping quotaExtensionMapping : quotaExtensionMappings) { + Errors errors = new RequestBodyErrors(quotaExtensionMapping); + + quotaExtensionMappingValidator.validate(quotaExtensionMapping, errors); + + if (errors.hasErrors()) { + throw new EntityResponseStatusException(errors.getAllErrors(), HttpStatus.CONFLICT); + } + + result.add(quotaExtensionMappingManager.create(quotaExtensionMapping.getItems(), + quotaExtensionMapping.getName(), + quotaExtensionMapping.getValue(), quotaExtensionMapping.getUnit(), + quotaExtensionMapping.getLifetime(), + quotaExtensionMapping.getLifetimeUnit(), quotaExtensionMapping.isLifetimeRound(), + quotaExtensionMapping.getProducts(), quotaExtensionMapping.getStarts(), + quotaExtensionMapping.getExpires(), + quotaExtensionMapping.getStartsQuestion(), quotaExtensionMapping.getExpiresQuestion())); + } + return result; + } + + /** + * Update. + * + * @param quotaExtensionMapping the quota extension mapping + * @return the quota extension mapping + */ + @PreAuthorize("hasRole('ROLE_ADMIN')") + @PatchMapping + public QuotaExtensionMapping update(@RequestBody QuotaExtensionMapping quotaExtensionMapping) { + + Errors errors = new RequestBodyErrors(quotaExtensionMapping); + + if (errors.hasErrors()) { + throw new EntityResponseStatusException(errors.getAllErrors(), HttpStatus.CONFLICT); + } + + return quotaExtensionMappingManager.update(quotaExtensionMapping); + } + + /** + * Delete. + * + * @param quotaExtensionMapping the quota extension mapping + */ + @PreAuthorize("hasRole('ROLE_ADMIN')") + @DeleteMapping + public void delete(@RequestBody QuotaExtensionMapping quotaExtensionMapping) { + quotaExtensionMappingManager.delete(quotaExtensionMapping.getId()); + } +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/controller/QuotaManagementController.java b/core/src/main/java/de/bstly/we/controller/QuotaManagementController.java index bb4b20e..8997103 100644 --- a/core/src/main/java/de/bstly/we/controller/QuotaManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/QuotaManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -48,8 +45,8 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public List getQuotasForUser(@PathVariable("username") String username, - @RequestParam("sort") Optional sort) { + public List getQuotasForUser(@PathVariable String username, + @RequestParam Optional sort) { User user = userManager.getByUsername(username); if (user == null) { @@ -68,8 +65,8 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}/all") - public List getAllQuotasForUser(@PathVariable("username") String username, - @RequestParam("sort") Optional sort) { + public List getAllQuotasForUser(@PathVariable String username, + @RequestParam Optional sort) { User user = userManager.getByUsername(username); if (user == null) { @@ -88,7 +85,7 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/byname/{name}") - public List getQuotasByName(@PathVariable("name") String name, @RequestParam("sort") Optional sort) { + public List getQuotasByName(@PathVariable String name, @RequestParam Optional sort) { return quotaManager.getAllByName(name, sort.orElse(null)); } @@ -174,7 +171,7 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/{name}/clone/{clone}") - public List clone(@PathVariable("name") String name, @PathVariable("clone") String clone, + public List clone(@PathVariable String name, @PathVariable String clone, @RequestBody long value) { if (name.equals(clone)) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); @@ -205,7 +202,7 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{target}") - public void deleteAll(@PathVariable("target") Long target) { + public void deleteAll(@PathVariable Long target) { quotaManager.deleteAll(target); } @@ -216,7 +213,7 @@ public class QuotaManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/byname/{name}") - public void deleteAllByName(@PathVariable("name") String name) { + public void deleteAllByName(@PathVariable String name) { quotaManager.deleteAll(name); } diff --git a/core/src/main/java/de/bstly/we/controller/QuotaMappingController.java b/core/src/main/java/de/bstly/we/controller/QuotaMappingController.java index 9cb19c5..76b38a1 100644 --- a/core/src/main/java/de/bstly/we/controller/QuotaMappingController.java +++ b/core/src/main/java/de/bstly/we/controller/QuotaMappingController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/SystemController.java b/core/src/main/java/de/bstly/we/controller/SystemController.java index dd1f413..fe4761a 100644 --- a/core/src/main/java/de/bstly/we/controller/SystemController.java +++ b/core/src/main/java/de/bstly/we/controller/SystemController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -73,7 +70,7 @@ public class SystemController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/properties/{key}") - public SystemProperty getProperty(@PathVariable("key") String key) { + public SystemProperty getProperty(@PathVariable String key) { if (!systemPropertyRepository.existsById(key)) { throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); } @@ -111,7 +108,7 @@ public class SystemController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/properties/{key}") - public void deleteProperty(@PathVariable("key") String key) { + public void deleteProperty(@PathVariable String key) { if (!systemPropertyRepository.existsById(key)) { throw new EntityResponseStatusException(HttpStatus.NOT_MODIFIED); } diff --git a/core/src/main/java/de/bstly/we/controller/SystemProfileFieldController.java b/core/src/main/java/de/bstly/we/controller/SystemProfileFieldController.java index 69fd6fa..b3f01d8 100644 --- a/core/src/main/java/de/bstly/we/controller/SystemProfileFieldController.java +++ b/core/src/main/java/de/bstly/we/controller/SystemProfileFieldController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -57,7 +54,7 @@ public class SystemProfileFieldController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{name}") - public SystemProfileField getByName(@PathVariable("name") String name) { + public SystemProfileField getByName(@PathVariable String name) { SystemProfileField systemProfileField = systemProfileFieldManager.get(name); if (systemProfileField == null) { @@ -104,7 +101,7 @@ public class SystemProfileFieldController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{name}") - public void deleteByName(@PathVariable("name") String name) { + public void deleteByName(@PathVariable String name) { SystemProfileField systemProfileField = systemProfileFieldManager.get(name); if (systemProfileField == null) { diff --git a/core/src/main/java/de/bstly/we/controller/UserAliasController.java b/core/src/main/java/de/bstly/we/controller/UserAliasController.java index 522626d..809a73f 100644 --- a/core/src/main/java/de/bstly/we/controller/UserAliasController.java +++ b/core/src/main/java/de/bstly/we/controller/UserAliasController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -123,7 +120,7 @@ public class UserAliasController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{id}") - public void deleteAlias(@PathVariable("id") Long id) { + public void deleteAlias(@PathVariable Long id) { UserAlias userAlias = userAliasManager.get(id); if (userAlias == null || !userAlias.getTarget().equals(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); diff --git a/core/src/main/java/de/bstly/we/controller/UserAliasManagementController.java b/core/src/main/java/de/bstly/we/controller/UserAliasManagementController.java index 2efd72a..fe7fcc9 100644 --- a/core/src/main/java/de/bstly/we/controller/UserAliasManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/UserAliasManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -64,7 +61,7 @@ public class UserAliasManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public List getAliasesForUser(@PathVariable("username") String username) { + public List getAliasesForUser(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -100,7 +97,7 @@ public class UserAliasManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{id}") - public void deleteAlias(@PathVariable("id") Long id) { + public void deleteAlias(@PathVariable Long id) { UserAlias userAlias = userAliasManager.get(id); if (userAlias == null) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); diff --git a/core/src/main/java/de/bstly/we/controller/UserController.java b/core/src/main/java/de/bstly/we/controller/UserController.java index 6e5674e..a2977ed 100755 --- a/core/src/main/java/de/bstly/we/controller/UserController.java +++ b/core/src/main/java/de/bstly/we/controller/UserController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import jakarta.servlet.http.HttpSession; diff --git a/core/src/main/java/de/bstly/we/controller/UserDataManagementController.java b/core/src/main/java/de/bstly/we/controller/UserDataManagementController.java index f3723f3..853b93e 100644 --- a/core/src/main/java/de/bstly/we/controller/UserDataManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/UserDataManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -42,7 +39,7 @@ public class UserDataManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public Map> getForUser(@PathVariable("username") String username) { + public Map> getForUser(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -59,7 +56,7 @@ public class UserDataManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/purge") - public void purge(@RequestParam("dry") boolean dry) { + public void purge(@RequestParam boolean dry) { userDataManager.purge(dry); } @@ -71,7 +68,7 @@ public class UserDataManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/purge/{username}") - public void purgeByUsername(@PathVariable("username") String username, @RequestParam("dry") boolean dry) { + public void purgeByUsername(@PathVariable String username, @RequestParam boolean dry) { User user = userManager.getByUsername(username); if (user == null) { diff --git a/core/src/main/java/de/bstly/we/controller/UserDomainController.java b/core/src/main/java/de/bstly/we/controller/UserDomainController.java index d7f8a2f..05b3be2 100644 --- a/core/src/main/java/de/bstly/we/controller/UserDomainController.java +++ b/core/src/main/java/de/bstly/we/controller/UserDomainController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -118,7 +115,7 @@ public class UserDomainController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{id}") - public void deleteDomain(@PathVariable("id") Long id) { + public void deleteDomain(@PathVariable Long id) { UserDomain userDomain = userDomainManager.get(id); if (userDomain == null || !userDomain.getTarget().equals(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); diff --git a/core/src/main/java/de/bstly/we/controller/UserDomainManagementController.java b/core/src/main/java/de/bstly/we/controller/UserDomainManagementController.java index 40b0e35..f2af4e3 100644 --- a/core/src/main/java/de/bstly/we/controller/UserDomainManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/UserDomainManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -68,7 +65,7 @@ public class UserDomainManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public List getDomainsForUser(@PathVariable("username") String username) { + public List getDomainsForUser(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -113,7 +110,7 @@ public class UserDomainManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{id}") - public void deleteDomain(@PathVariable("id") Long id) { + public void deleteDomain(@PathVariable Long id) { UserDomain userDomain = userDomainManager.get(id); if (userDomain == null) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); @@ -128,7 +125,7 @@ public class UserDomainManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/validate/{id}") - public void validate(@PathVariable("id") Long id) { + public void validate(@PathVariable Long id) { UserDomain userDomain = userDomainManager.get(id); if (userDomain == null) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); diff --git a/core/src/main/java/de/bstly/we/controller/UserManagementController.java b/core/src/main/java/de/bstly/we/controller/UserManagementController.java index fb28c01..2eaaf9b 100644 --- a/core/src/main/java/de/bstly/we/controller/UserManagementController.java +++ b/core/src/main/java/de/bstly/we/controller/UserManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.time.Instant; @@ -95,7 +92,7 @@ public class UserManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{username}") - public User getUserByUsername(@PathVariable("username") String username) { + public User getUserByUsername(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -201,7 +198,7 @@ public class UserManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{username}") - public void deleteUserByUsername(@PathVariable("username") String username) { + public void deleteUserByUsername(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { diff --git a/core/src/main/java/de/bstly/we/controller/UserProfileFieldController.java b/core/src/main/java/de/bstly/we/controller/UserProfileFieldController.java index b11b1f5..7b3a30d 100644 --- a/core/src/main/java/de/bstly/we/controller/UserProfileFieldController.java +++ b/core/src/main/java/de/bstly/we/controller/UserProfileFieldController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -79,7 +76,7 @@ public class UserProfileFieldController extends BaseController { */ @PreAuthorize("isAuthenticated()") @GetMapping("/field/{name}") - public UserProfileField getField(@PathVariable("name") String name) { + public UserProfileField getField(@PathVariable String name) { UserProfileField userProfileField = userProfileFieldManager.get(getCurrentUserId(), name); if (userProfileField == null) { @@ -96,7 +93,7 @@ public class UserProfileFieldController extends BaseController { * @return the for user */ @GetMapping("/{username}") - public ProfileModel getForUser(@PathVariable("username") String username) { + public ProfileModel getForUser(@PathVariable String username) { Long currentUserId = getCurrentUserId(); User user = userManager.getByUsername(username); @@ -182,8 +179,8 @@ public class UserProfileFieldController extends BaseController { * @return the field for user */ @GetMapping("/{username}/field/{name}") - public UserProfileField getFieldForUser(@PathVariable("username") String username, - @PathVariable("name") String name) { + public UserProfileField getFieldForUser(@PathVariable String username, + @PathVariable String name) { User user = userManager.getByUsername(username); @@ -275,7 +272,7 @@ public class UserProfileFieldController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{name}") - public void delete(@PathVariable("name") String name) { + public void delete(@PathVariable String name) { if (userProfileFieldManager.get(getCurrentUserId(), name) == null) { throw new EntityResponseStatusException(HttpStatus.NOT_MODIFIED); } diff --git a/core/src/main/java/de/bstly/we/controller/VoucherController.java b/core/src/main/java/de/bstly/we/controller/VoucherController.java index 17988db..75aba83 100644 --- a/core/src/main/java/de/bstly/we/controller/VoucherController.java +++ b/core/src/main/java/de/bstly/we/controller/VoucherController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; @@ -66,7 +63,7 @@ public class VoucherController extends BaseController { */ @PreAuthorize("isAuthenticated()") @PostMapping("/{name}") - public String getVoucher(@PathVariable("name") String name) { + public String getVoucher(@PathVariable String name) { if (!permissionManager.isFullUser(getCurrentUserId())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); } diff --git a/core/src/main/java/de/bstly/we/controller/VoucherMappingController.java b/core/src/main/java/de/bstly/we/controller/VoucherMappingController.java index cd9b0db..97dc6e7 100644 --- a/core/src/main/java/de/bstly/we/controller/VoucherMappingController.java +++ b/core/src/main/java/de/bstly/we/controller/VoucherMappingController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/debug/MigrationController.java b/core/src/main/java/de/bstly/we/controller/debug/MigrationController.java index b143778..cd88779 100644 --- a/core/src/main/java/de/bstly/we/controller/debug/MigrationController.java +++ b/core/src/main/java/de/bstly/we/controller/debug/MigrationController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.debug; import java.util.Map; diff --git a/core/src/main/java/de/bstly/we/controller/model/ItemModel.java b/core/src/main/java/de/bstly/we/controller/model/ItemModel.java index d5b4d85..7299822 100644 --- a/core/src/main/java/de/bstly/we/controller/model/ItemModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/ItemModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.Map; diff --git a/core/src/main/java/de/bstly/we/controller/model/ItemResultModel.java b/core/src/main/java/de/bstly/we/controller/model/ItemResultModel.java index 87efb46..256cd46 100644 --- a/core/src/main/java/de/bstly/we/controller/model/ItemResultModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/ItemResultModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/model/LoginModel.java b/core/src/main/java/de/bstly/we/controller/model/LoginModel.java index 4c7ca28..7ff022d 100755 --- a/core/src/main/java/de/bstly/we/controller/model/LoginModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/LoginModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import lombok.Getter; diff --git a/core/src/main/java/de/bstly/we/controller/model/PagesResult.java b/core/src/main/java/de/bstly/we/controller/model/PagesResult.java index 0806bd5..80e8c17 100644 --- a/core/src/main/java/de/bstly/we/controller/model/PagesResult.java +++ b/core/src/main/java/de/bstly/we/controller/model/PagesResult.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/model/PasswordModel.java b/core/src/main/java/de/bstly/we/controller/model/PasswordModel.java index 259e932..ff4433c 100755 --- a/core/src/main/java/de/bstly/we/controller/model/PasswordModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/PasswordModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import lombok.Getter; diff --git a/core/src/main/java/de/bstly/we/controller/model/PasswordResetModel.java b/core/src/main/java/de/bstly/we/controller/model/PasswordResetModel.java index f5e044e..3b9b8d6 100644 --- a/core/src/main/java/de/bstly/we/controller/model/PasswordResetModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/PasswordResetModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import lombok.Getter; diff --git a/core/src/main/java/de/bstly/we/controller/model/PretixRequest.java b/core/src/main/java/de/bstly/we/controller/model/PretixRequest.java index dc4212c..1ef1c16 100644 --- a/core/src/main/java/de/bstly/we/controller/model/PretixRequest.java +++ b/core/src/main/java/de/bstly/we/controller/model/PretixRequest.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.Map; diff --git a/core/src/main/java/de/bstly/we/controller/model/ProfileModel.java b/core/src/main/java/de/bstly/we/controller/model/ProfileModel.java index 742371a..d28b7da 100644 --- a/core/src/main/java/de/bstly/we/controller/model/ProfileModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/ProfileModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/model/SecondFactorProviderModel.java b/core/src/main/java/de/bstly/we/controller/model/SecondFactorProviderModel.java index f853c9a..bee3c58 100644 --- a/core/src/main/java/de/bstly/we/controller/model/SecondFactorProviderModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/SecondFactorProviderModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import lombok.AllArgsConstructor; diff --git a/core/src/main/java/de/bstly/we/controller/model/UserModel.java b/core/src/main/java/de/bstly/we/controller/model/UserModel.java index def338e..ca8d9a1 100755 --- a/core/src/main/java/de/bstly/we/controller/model/UserModel.java +++ b/core/src/main/java/de/bstly/we/controller/model/UserModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.model; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/controller/support/ControllerExceptionHandler.java b/core/src/main/java/de/bstly/we/controller/support/ControllerExceptionHandler.java index faaa549..641ab6b 100644 --- a/core/src/main/java/de/bstly/we/controller/support/ControllerExceptionHandler.java +++ b/core/src/main/java/de/bstly/we/controller/support/ControllerExceptionHandler.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.support; import org.springframework.http.HttpHeaders; diff --git a/core/src/main/java/de/bstly/we/controller/support/EntityResponseStatusException.java b/core/src/main/java/de/bstly/we/controller/support/EntityResponseStatusException.java index 5705439..574348e 100644 --- a/core/src/main/java/de/bstly/we/controller/support/EntityResponseStatusException.java +++ b/core/src/main/java/de/bstly/we/controller/support/EntityResponseStatusException.java @@ -1,10 +1,5 @@ -/** - * - */ package de.bstly.we.controller.support; -import org.springframework.lang.Nullable; - import org.springframework.core.NestedRuntimeException; import org.springframework.http.HttpStatusCode; import org.springframework.util.Assert; @@ -21,7 +16,6 @@ public class EntityResponseStatusException extends NestedRuntimeException { private final HttpStatusCode status; - @Nullable private final Object body; /** @@ -39,7 +33,7 @@ public class EntityResponseStatusException extends NestedRuntimeException { * @param body the body * @param status the status */ - public EntityResponseStatusException(@Nullable Object body, HttpStatusCode status) { + public EntityResponseStatusException(Object body, HttpStatusCode status) { this(body, status, null); } @@ -50,7 +44,7 @@ public class EntityResponseStatusException extends NestedRuntimeException { * @param status the status * @param cause the cause */ - public EntityResponseStatusException(@Nullable Object body, HttpStatusCode status, @Nullable Throwable cause) { + public EntityResponseStatusException(Object body, HttpStatusCode status, Throwable cause) { super(null, cause); Assert.notNull(status, "HttpStatus is required"); this.status = status; @@ -71,7 +65,6 @@ public class EntityResponseStatusException extends NestedRuntimeException { * * @return the body */ - @Nullable public Object getBody() { return this.body; } diff --git a/core/src/main/java/de/bstly/we/controller/support/JsonStringBodyControllerAdvice.java b/core/src/main/java/de/bstly/we/controller/support/JsonStringBodyControllerAdvice.java index 2e7ceae..22486ec 100644 --- a/core/src/main/java/de/bstly/we/controller/support/JsonStringBodyControllerAdvice.java +++ b/core/src/main/java/de/bstly/we/controller/support/JsonStringBodyControllerAdvice.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.support; import java.io.IOException; diff --git a/core/src/main/java/de/bstly/we/controller/support/RequestBodyErrors.java b/core/src/main/java/de/bstly/we/controller/support/RequestBodyErrors.java index 9553646..b437d22 100644 --- a/core/src/main/java/de/bstly/we/controller/support/RequestBodyErrors.java +++ b/core/src/main/java/de/bstly/we/controller/support/RequestBodyErrors.java @@ -1,9 +1,5 @@ -/** - * - */ package de.bstly.we.controller.support; -import org.springframework.lang.Nullable; import org.springframework.validation.AbstractBindingResult; /** @@ -12,7 +8,6 @@ import org.springframework.validation.AbstractBindingResult; @SuppressWarnings("serial") public class RequestBodyErrors extends AbstractBindingResult { - @Nullable private final Object target; /** @@ -20,7 +15,7 @@ public class RequestBodyErrors extends AbstractBindingResult { * * @param target the target */ - public RequestBodyErrors(@Nullable Object target) { + public RequestBodyErrors(Object target) { super("request-body"); this.target = target; } diff --git a/core/src/main/java/de/bstly/we/controller/support/TokenSessionManager.java b/core/src/main/java/de/bstly/we/controller/support/TokenSessionManager.java index 6f04b81..ff72164 100644 --- a/core/src/main/java/de/bstly/we/controller/support/TokenSessionManager.java +++ b/core/src/main/java/de/bstly/we/controller/support/TokenSessionManager.java @@ -1,14 +1,9 @@ -/** - * - */ package de.bstly.we.controller.support; import java.time.Instant; import java.util.List; import java.util.Set; -import jakarta.servlet.http.HttpSession; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -22,15 +17,20 @@ import com.google.gson.JsonObject; import de.bstly.we.businesslogic.PermissionManager; import de.bstly.we.businesslogic.PermissionMappingManager; import de.bstly.we.businesslogic.PretixManager; +import de.bstly.we.businesslogic.QuotaExtensionManager; +import de.bstly.we.businesslogic.QuotaExtensionMappingManager; import de.bstly.we.businesslogic.QuotaManager; import de.bstly.we.businesslogic.QuotaMappingManager; import de.bstly.we.controller.model.ItemResultModel; import de.bstly.we.model.Permission; import de.bstly.we.model.PermissionMapping; import de.bstly.we.model.Quota; +import de.bstly.we.model.QuotaExtension; +import de.bstly.we.model.QuotaExtensionMapping; import de.bstly.we.model.QuotaMapping; import de.bstly.we.security.model.LocalUserDetails; import de.bstly.we.security.token.LocalAnonymousAuthenticationToken; +import jakarta.servlet.http.HttpSession; /** * The Class TokenSessionManager. @@ -47,8 +47,12 @@ public class TokenSessionManager { @Autowired private QuotaMappingManager quotaMappingManager; @Autowired + private QuotaExtensionMappingManager quotaExtensionMappingManager; + @Autowired private QuotaManager quotaManager; @Autowired + private QuotaExtensionManager quotaExtensionManager; + @Autowired private PretixManager pretixManager; /** @@ -154,6 +158,51 @@ public class TokenSessionManager { } } + /** + * Gets the quota mappings for token. + * + * @param userId the user id + * @param token the token + * @return the quota mappings for token + */ + public List getQuotaExtensionMappingsForToken(Long userId, String token) { + List quotaMappings = Lists.newArrayList(); + + try { + JsonObject result = pretixManager.getCheckInItemBySecret(token); + if (result != null && result.get("secret").getAsString().equals(token) + && result.getAsJsonArray("checkins").size() < 1 + && "p".equals(result.get("order__status").getAsString())) { + int item = result.get("item").getAsInt(); + quotaMappings.addAll(quotaExtensionMappingManager.getAllByItem(item)); + } + } catch (Exception e) { + // ignore + } + return quotaMappings; + } + + /** + * Adds the quotas for token. + * + * @param userId the user id + * @param token the token + * @param quotas the quotas + */ + public void addQuotaExtensionsForToken(Long userId, String token, List quotas) { + try { + JsonObject result = pretixManager.getCheckInItemBySecret(token); + if (result != null && result.get("secret").getAsString().equals(token) + && result.getAsJsonArray("checkins").size() < 1 + && "p".equals(result.get("order__status").getAsString())) { + int item = result.get("item").getAsInt(); + quotaExtensionManager.addForItem(userId, item, quotas); + } + } catch (Exception e) { + // ignore + } + } + /** * Apply tokens. * diff --git a/core/src/main/java/de/bstly/we/controller/validation/PasswordModelValidator.java b/core/src/main/java/de/bstly/we/controller/validation/PasswordModelValidator.java index 5a7d5a9..9e09e76 100755 --- a/core/src/main/java/de/bstly/we/controller/validation/PasswordModelValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/PasswordModelValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import java.util.ArrayList; diff --git a/core/src/main/java/de/bstly/we/controller/validation/PermissionMappingValidator.java b/core/src/main/java/de/bstly/we/controller/validation/PermissionMappingValidator.java index 8a6343d..dc85c99 100755 --- a/core/src/main/java/de/bstly/we/controller/validation/PermissionMappingValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/PermissionMappingValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/controller/validation/QuotaExtensionMappingValidator.java b/core/src/main/java/de/bstly/we/controller/validation/QuotaExtensionMappingValidator.java new file mode 100644 index 0000000..db383ed --- /dev/null +++ b/core/src/main/java/de/bstly/we/controller/validation/QuotaExtensionMappingValidator.java @@ -0,0 +1,53 @@ +package de.bstly.we.controller.validation; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +import de.bstly.we.businesslogic.QuotaExtensionMappingManager; +import de.bstly.we.model.QuotaExtensionMapping; + +/** + * The Class QuotaExtensionMappingValidator. + */ +@Component +public class QuotaExtensionMappingValidator implements Validator { + + @Autowired + private QuotaExtensionMappingManager quotaExtensionMappingManager; + + /* + * @see org.springframework.validation.Validator#supports(java.lang.Class) + */ + @Override + public boolean supports(Class clazz) { + return clazz.isAssignableFrom(QuotaExtensionMapping.class); + } + + /* + * + * @see org.springframework.validation.Validator#validate(java.lang.Object, + * org.springframework.validation.Errors) + */ + @Override + public void validate(Object target, Errors errors) { + QuotaExtensionMapping quotaExtensionMapping = (QuotaExtensionMapping) target; + + for (Integer item : quotaExtensionMapping.getItems()) { + if (quotaExtensionMappingManager.exists(item, quotaExtensionMapping.getName())) { + errors.rejectValue("item", "ALREADY_EXISTS"); + errors.rejectValue("name", "ALREADY_EXISTS"); + } + } + + if (quotaExtensionMapping.getValue() <= 0) { + errors.rejectValue("value", "TOO_SHORT"); + } + + if (quotaExtensionMapping.getLifetime() != null && quotaExtensionMapping.getLifetime() <= 0) { + errors.rejectValue("lifetime", "TOO_SHORT"); + } + } + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/controller/validation/QuotaMappingValidator.java b/core/src/main/java/de/bstly/we/controller/validation/QuotaMappingValidator.java index fd644db..2a2bc4e 100644 --- a/core/src/main/java/de/bstly/we/controller/validation/QuotaMappingValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/QuotaMappingValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/controller/validation/UserAliasValidator.java b/core/src/main/java/de/bstly/we/controller/validation/UserAliasValidator.java index 73df165..d5fb0f8 100644 --- a/core/src/main/java/de/bstly/we/controller/validation/UserAliasValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/UserAliasValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/controller/validation/UserDomainValidator.java b/core/src/main/java/de/bstly/we/controller/validation/UserDomainValidator.java index fcbb284..5f4363e 100644 --- a/core/src/main/java/de/bstly/we/controller/validation/UserDomainValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/UserDomainValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.apache.commons.validator.routines.DomainValidator; diff --git a/core/src/main/java/de/bstly/we/controller/validation/UserModelValidator.java b/core/src/main/java/de/bstly/we/controller/validation/UserModelValidator.java index 963b6a2..5c46c26 100755 --- a/core/src/main/java/de/bstly/we/controller/validation/UserModelValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/UserModelValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/controller/validation/UserProfileFieldValidator.java b/core/src/main/java/de/bstly/we/controller/validation/UserProfileFieldValidator.java index 2dc94da..865f9de 100644 --- a/core/src/main/java/de/bstly/we/controller/validation/UserProfileFieldValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/UserProfileFieldValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/controller/validation/VoucherMappingValidator.java b/core/src/main/java/de/bstly/we/controller/validation/VoucherMappingValidator.java index 05a3496..0fd8815 100644 --- a/core/src/main/java/de/bstly/we/controller/validation/VoucherMappingValidator.java +++ b/core/src/main/java/de/bstly/we/controller/validation/VoucherMappingValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/de/bstly/we/event/AbstractModelEvent.java b/core/src/main/java/de/bstly/we/event/AbstractModelEvent.java index 3426c3e..a8146c8 100644 --- a/core/src/main/java/de/bstly/we/event/AbstractModelEvent.java +++ b/core/src/main/java/de/bstly/we/event/AbstractModelEvent.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.event; import org.springframework.context.ApplicationEvent; diff --git a/core/src/main/java/de/bstly/we/event/AbstractModelEventType.java b/core/src/main/java/de/bstly/we/event/AbstractModelEventType.java index 66a0a29..822d919 100644 --- a/core/src/main/java/de/bstly/we/event/AbstractModelEventType.java +++ b/core/src/main/java/de/bstly/we/event/AbstractModelEventType.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.event; /** diff --git a/core/src/main/java/de/bstly/we/model/AbstractModel.java b/core/src/main/java/de/bstly/we/model/AbstractModel.java index e4c9475..855d738 100644 --- a/core/src/main/java/de/bstly/we/model/AbstractModel.java +++ b/core/src/main/java/de/bstly/we/model/AbstractModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/Permission.java b/core/src/main/java/de/bstly/we/model/Permission.java index 8a6036a..30cd6dc 100755 --- a/core/src/main/java/de/bstly/we/model/Permission.java +++ b/core/src/main/java/de/bstly/we/model/Permission.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/model/PermissionMapping.java b/core/src/main/java/de/bstly/we/model/PermissionMapping.java index 181df70..64b5707 100755 --- a/core/src/main/java/de/bstly/we/model/PermissionMapping.java +++ b/core/src/main/java/de/bstly/we/model/PermissionMapping.java @@ -1,17 +1,13 @@ -/** - * - */ package de.bstly.we.model; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Set; -import jakarta.persistence.AttributeConverter; +import de.bstly.we.businesslogic.support.ChronoUnitConverter; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.Convert; -import jakarta.persistence.Converter; import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -62,21 +58,4 @@ public class PermissionMapping { @Column(name = "expires_question") private String expiresQuestion; - /** - * The Class ChronoUnitConverter. - */ - @Converter - public static class ChronoUnitConverter implements AttributeConverter { - - @Override - public String convertToDatabaseColumn(ChronoUnit chronoUnit) { - return chronoUnit.name(); - } - - @Override - public ChronoUnit convertToEntityAttribute(String value) { - return ChronoUnit.valueOf(value); - } - } - } diff --git a/core/src/main/java/de/bstly/we/model/PersistentLogin.java b/core/src/main/java/de/bstly/we/model/PersistentLogin.java index 1cf5ee6..a582c74 100644 --- a/core/src/main/java/de/bstly/we/model/PersistentLogin.java +++ b/core/src/main/java/de/bstly/we/model/PersistentLogin.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/model/ProfileFieldType.java b/core/src/main/java/de/bstly/we/model/ProfileFieldType.java index 1b67991..78d036f 100644 --- a/core/src/main/java/de/bstly/we/model/ProfileFieldType.java +++ b/core/src/main/java/de/bstly/we/model/ProfileFieldType.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/Quota.java b/core/src/main/java/de/bstly/we/model/Quota.java index 4caf584..2d41935 100644 --- a/core/src/main/java/de/bstly/we/model/Quota.java +++ b/core/src/main/java/de/bstly/we/model/Quota.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/QuotaExtension.java b/core/src/main/java/de/bstly/we/model/QuotaExtension.java new file mode 100644 index 0000000..9958079 --- /dev/null +++ b/core/src/main/java/de/bstly/we/model/QuotaExtension.java @@ -0,0 +1,44 @@ +package de.bstly.we.model; + +import java.time.Instant; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +/** + * The Class QuotaExtension. + */ +@Entity +@Table(name = "quota_extensions") +@Getter +@Setter +public class QuotaExtension implements UserData { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", updatable = false) + private Long id; + @Column(name = "target", nullable = false) + private Long target; + @Column(name = "name", nullable = false) + private String name; + @Column(name = "value", nullable = false) + private long value; + @Column(name = "unit", nullable = true) + private String unit; + @Column(name = "expires", nullable = false) + private Instant expires; + @Column(name = "starts", nullable = true) + private Instant starts; + @Column(name = "source", nullable = true) + private String source; + @Column(name = "description", nullable = true) + private String description; + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/model/QuotaExtensionMapping.java b/core/src/main/java/de/bstly/we/model/QuotaExtensionMapping.java new file mode 100644 index 0000000..4cb65db --- /dev/null +++ b/core/src/main/java/de/bstly/we/model/QuotaExtensionMapping.java @@ -0,0 +1,64 @@ +package de.bstly.we.model; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Set; + +import de.bstly.we.businesslogic.support.ChronoUnitConverter; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +/** + * The Class QuotaExtensionMapping. + */ +@Entity +@Table(name = "quota_extension_mappings") +@Getter +@Setter +public class QuotaExtensionMapping { + + public static final ChronoUnit DEFAULT_LIFETIME_UNIT = ChronoUnit.DAYS; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", updatable = false) + private Long id; + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "quota_extension_mappings_products") + private Set products; + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "quota_extension_mappings_items") + private Set items; + @Column(name = "name", nullable = false) + private String name; + @Column(name = "value", nullable = false) + private long value; + @Column(name = "unit", nullable = true) + private String unit; + @Column(name = "lifetime") + private Long lifetime; + @Column(name = "lifetime_unit") + @Convert(converter = ChronoUnitConverter.class) + private ChronoUnit lifetimeUnit = DEFAULT_LIFETIME_UNIT; + @Column(name = "lifetime_round", columnDefinition = "boolean default false") + private boolean lifetimeRound; + @Column(name = "starts") + private Instant starts; + @Column(name = "expires") + private Instant expires; + @Column(name = "starts_question") + private String startsQuestion; + @Column(name = "expires_question") + private String expiresQuestion; + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/model/QuotaMapping.java b/core/src/main/java/de/bstly/we/model/QuotaMapping.java index 7b27535..83fb4ca 100644 --- a/core/src/main/java/de/bstly/we/model/QuotaMapping.java +++ b/core/src/main/java/de/bstly/we/model/QuotaMapping.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import java.util.Set; diff --git a/core/src/main/java/de/bstly/we/model/SecondFactor.java b/core/src/main/java/de/bstly/we/model/SecondFactor.java index f9378ac..4268d7b 100644 --- a/core/src/main/java/de/bstly/we/model/SecondFactor.java +++ b/core/src/main/java/de/bstly/we/model/SecondFactor.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/SystemProfileField.java b/core/src/main/java/de/bstly/we/model/SystemProfileField.java index 09e9f8f..fb77ee1 100644 --- a/core/src/main/java/de/bstly/we/model/SystemProfileField.java +++ b/core/src/main/java/de/bstly/we/model/SystemProfileField.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/SystemProperty.java b/core/src/main/java/de/bstly/we/model/SystemProperty.java index 283bf04..2d4d925 100755 --- a/core/src/main/java/de/bstly/we/model/SystemProperty.java +++ b/core/src/main/java/de/bstly/we/model/SystemProperty.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/User.java b/core/src/main/java/de/bstly/we/model/User.java index 398906c..13ee05e 100755 --- a/core/src/main/java/de/bstly/we/model/User.java +++ b/core/src/main/java/de/bstly/we/model/User.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/UserAlias.java b/core/src/main/java/de/bstly/we/model/UserAlias.java index 1339566..bac8c3c 100644 --- a/core/src/main/java/de/bstly/we/model/UserAlias.java +++ b/core/src/main/java/de/bstly/we/model/UserAlias.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/UserData.java b/core/src/main/java/de/bstly/we/model/UserData.java index 367ccd4..80a1ca4 100644 --- a/core/src/main/java/de/bstly/we/model/UserData.java +++ b/core/src/main/java/de/bstly/we/model/UserData.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/UserDomain.java b/core/src/main/java/de/bstly/we/model/UserDomain.java index 05f71dd..537c8c9 100644 --- a/core/src/main/java/de/bstly/we/model/UserDomain.java +++ b/core/src/main/java/de/bstly/we/model/UserDomain.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/model/UserProfileField.java b/core/src/main/java/de/bstly/we/model/UserProfileField.java index 1a95087..d317c92 100644 --- a/core/src/main/java/de/bstly/we/model/UserProfileField.java +++ b/core/src/main/java/de/bstly/we/model/UserProfileField.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import java.io.Serializable; diff --git a/core/src/main/java/de/bstly/we/model/UserStatus.java b/core/src/main/java/de/bstly/we/model/UserStatus.java index 9d7e32f..335cd19 100644 --- a/core/src/main/java/de/bstly/we/model/UserStatus.java +++ b/core/src/main/java/de/bstly/we/model/UserStatus.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/UserTotp.java b/core/src/main/java/de/bstly/we/model/UserTotp.java index 9c8ef2e..b89b057 100644 --- a/core/src/main/java/de/bstly/we/model/UserTotp.java +++ b/core/src/main/java/de/bstly/we/model/UserTotp.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/model/Visibility.java b/core/src/main/java/de/bstly/we/model/Visibility.java index 3cfb6da..6655980 100644 --- a/core/src/main/java/de/bstly/we/model/Visibility.java +++ b/core/src/main/java/de/bstly/we/model/Visibility.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; /** diff --git a/core/src/main/java/de/bstly/we/model/VoucherMapping.java b/core/src/main/java/de/bstly/we/model/VoucherMapping.java index 6364be2..84b64c1 100644 --- a/core/src/main/java/de/bstly/we/model/VoucherMapping.java +++ b/core/src/main/java/de/bstly/we/model/VoucherMapping.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.model; import jakarta.persistence.Column; diff --git a/core/src/main/java/de/bstly/we/repository/PermissionMappingRepository.java b/core/src/main/java/de/bstly/we/repository/PermissionMappingRepository.java index c5254fb..bd544f3 100755 --- a/core/src/main/java/de/bstly/we/repository/PermissionMappingRepository.java +++ b/core/src/main/java/de/bstly/we/repository/PermissionMappingRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/PermissionRepository.java b/core/src/main/java/de/bstly/we/repository/PermissionRepository.java index a2ed23a..ccdc077 100755 --- a/core/src/main/java/de/bstly/we/repository/PermissionRepository.java +++ b/core/src/main/java/de/bstly/we/repository/PermissionRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/QuotaExtensionMappingRepository.java b/core/src/main/java/de/bstly/we/repository/QuotaExtensionMappingRepository.java new file mode 100644 index 0000000..a984c84 --- /dev/null +++ b/core/src/main/java/de/bstly/we/repository/QuotaExtensionMappingRepository.java @@ -0,0 +1,13 @@ +package de.bstly.we.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; + +import de.bstly.we.model.QuotaExtensionMapping; + +/** + * The Interface QuotaExtensionMappingRepository. + */ +public interface QuotaExtensionMappingRepository extends JpaRepository, QuerydslPredicateExecutor { + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/repository/QuotaExtensionRepository.java b/core/src/main/java/de/bstly/we/repository/QuotaExtensionRepository.java new file mode 100644 index 0000000..0da0913 --- /dev/null +++ b/core/src/main/java/de/bstly/we/repository/QuotaExtensionRepository.java @@ -0,0 +1,13 @@ +package de.bstly.we.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; + +import de.bstly.we.model.QuotaExtension; + +/** + * The Interface QuotaExtensionRepository. + */ +public interface QuotaExtensionRepository extends JpaRepository, QuerydslPredicateExecutor { + +} \ No newline at end of file diff --git a/core/src/main/java/de/bstly/we/repository/QuotaMappingRepository.java b/core/src/main/java/de/bstly/we/repository/QuotaMappingRepository.java index d4975c1..a1cc726 100644 --- a/core/src/main/java/de/bstly/we/repository/QuotaMappingRepository.java +++ b/core/src/main/java/de/bstly/we/repository/QuotaMappingRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/QuotaRepository.java b/core/src/main/java/de/bstly/we/repository/QuotaRepository.java index 5dc4bf9..7532cc7 100644 --- a/core/src/main/java/de/bstly/we/repository/QuotaRepository.java +++ b/core/src/main/java/de/bstly/we/repository/QuotaRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/SystemProfileFieldRepository.java b/core/src/main/java/de/bstly/we/repository/SystemProfileFieldRepository.java index 211f5e2..f316b78 100644 --- a/core/src/main/java/de/bstly/we/repository/SystemProfileFieldRepository.java +++ b/core/src/main/java/de/bstly/we/repository/SystemProfileFieldRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/SystemPropertyRepository.java b/core/src/main/java/de/bstly/we/repository/SystemPropertyRepository.java index c79ffd8..c06794c 100755 --- a/core/src/main/java/de/bstly/we/repository/SystemPropertyRepository.java +++ b/core/src/main/java/de/bstly/we/repository/SystemPropertyRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/UserAliasRepository.java b/core/src/main/java/de/bstly/we/repository/UserAliasRepository.java index 87a4211..806fd8b 100644 --- a/core/src/main/java/de/bstly/we/repository/UserAliasRepository.java +++ b/core/src/main/java/de/bstly/we/repository/UserAliasRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/UserDomainRepository.java b/core/src/main/java/de/bstly/we/repository/UserDomainRepository.java index 88d6457..52d0e28 100644 --- a/core/src/main/java/de/bstly/we/repository/UserDomainRepository.java +++ b/core/src/main/java/de/bstly/we/repository/UserDomainRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/UserProfileFieldRepository.java b/core/src/main/java/de/bstly/we/repository/UserProfileFieldRepository.java index f0095e6..0abf73d 100644 --- a/core/src/main/java/de/bstly/we/repository/UserProfileFieldRepository.java +++ b/core/src/main/java/de/bstly/we/repository/UserProfileFieldRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/UserRepository.java b/core/src/main/java/de/bstly/we/repository/UserRepository.java index 2b10598..6f1f1a4 100755 --- a/core/src/main/java/de/bstly/we/repository/UserRepository.java +++ b/core/src/main/java/de/bstly/we/repository/UserRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/UserTotpRepository.java b/core/src/main/java/de/bstly/we/repository/UserTotpRepository.java index 378920f..e65daa0 100644 --- a/core/src/main/java/de/bstly/we/repository/UserTotpRepository.java +++ b/core/src/main/java/de/bstly/we/repository/UserTotpRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/repository/VoucherMappingRepository.java b/core/src/main/java/de/bstly/we/repository/VoucherMappingRepository.java index 27a4a8d..2dade92 100644 --- a/core/src/main/java/de/bstly/we/repository/VoucherMappingRepository.java +++ b/core/src/main/java/de/bstly/we/repository/VoucherMappingRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/core/src/main/java/de/bstly/we/security/LocalAuthenticationEntryPoint.java b/core/src/main/java/de/bstly/we/security/LocalAuthenticationEntryPoint.java index 288185d..1915ad4 100644 --- a/core/src/main/java/de/bstly/we/security/LocalAuthenticationEntryPoint.java +++ b/core/src/main/java/de/bstly/we/security/LocalAuthenticationEntryPoint.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security; import java.io.IOException; diff --git a/core/src/main/java/de/bstly/we/security/LocalAuthenticationProvider.java b/core/src/main/java/de/bstly/we/security/LocalAuthenticationProvider.java index 83b1074..0f2338d 100755 --- a/core/src/main/java/de/bstly/we/security/LocalAuthenticationProvider.java +++ b/core/src/main/java/de/bstly/we/security/LocalAuthenticationProvider.java @@ -1,9 +1,10 @@ -/** - * - */ package de.bstly.we.security; +import java.util.List; + +import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; @@ -14,6 +15,9 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.stereotype.Component; +import com.google.common.collect.Lists; + +import de.bstly.we.security.businesslogic.AdditionalAuthenticationProvider; import de.bstly.we.security.businesslogic.SecondFactorProvider; import de.bstly.we.security.businesslogic.SecondFactorProviderManager; import de.bstly.we.security.model.LocalUserDetails; @@ -24,43 +28,33 @@ import de.bstly.we.security.token.LocalSecondFactorAuthenticationToken; * The Class LocalAuthenticationProvider. */ @Component -public class LocalAuthenticationProvider extends DaoAuthenticationProvider { +public class LocalAuthenticationProvider extends DaoAuthenticationProvider implements SmartInitializingSingleton { @Autowired private SecondFactorProviderManager secondFactorProviderManager; + @Autowired + private ApplicationContext context; + private List> providers; - /** - * Instantiates a new local authentication provider. - * - * @param userDetailService the user detail service - */ public LocalAuthenticationProvider(UserDetailsService userDetailService) { super(userDetailService); } - /* - * @see org.springframework.security.authentication.dao. - * AbstractUserDetailsAuthenticationProvider#authenticate(org.springframework. - * security.core.Authentication) - */ + @Override + public void afterSingletonsInstantiated() { + providers = Lists.newArrayList(); + + for (AdditionalAuthenticationProvider provider : context + .getBeansOfType(AdditionalAuthenticationProvider.class).values()) { + providers.add(provider); + } + } + @Override public Authentication authenticate(Authentication auth) throws AuthenticationException { - if (auth instanceof UsernamePasswordAuthenticationToken) { auth = super.authenticate(auth); - if (auth.getPrincipal() instanceof LocalUserDetails) { - LocalUserDetails details = (LocalUserDetails) auth.getPrincipal(); - if (!secondFactorProviderManager.getEnabled(details.getUserId()).isEmpty()) { - PreAuthenticatedAuthenticationToken newAuth = new PreAuthenticatedAuthenticationToken(details, "", - AuthorityUtils.createAuthorityList("ROLE_PRE_AUTH_USER")); - newAuth.setAuthenticated(false); - return newAuth; - } - - return new UsernamePasswordAuthenticationToken(details, auth.getCredentials(), - details.getAuthorities()); - } - + return secondFactorCheck(auth); } else if (auth instanceof LocalSecondFactorAuthenticationToken) { LocalSecondFactorAuthenticationToken secondFactorAuth = (LocalSecondFactorAuthenticationToken) auth; if (auth.getPrincipal() instanceof LocalUserDetails) { @@ -89,11 +83,34 @@ public class LocalAuthenticationProvider extends DaoAuthenticationProvider { return newAuth; } } + } else { + for (AdditionalAuthenticationProvider provider : providers) { + if (provider.supports(auth.getClass())) { + auth = provider.authenticate(auth); + return this.secondFactorCheck(auth); + } + } } return auth; } + protected Authentication secondFactorCheck(Authentication auth) { + if (auth.getPrincipal() instanceof LocalUserDetails) { + LocalUserDetails details = (LocalUserDetails) auth.getPrincipal(); + if (!secondFactorProviderManager.getEnabled(details.getUserId()).isEmpty()) { + PreAuthenticatedAuthenticationToken newAuth = new PreAuthenticatedAuthenticationToken(details, "", + AuthorityUtils.createAuthorityList("ROLE_PRE_AUTH_USER")); + newAuth.setAuthenticated(false); + return newAuth; + } + + return new UsernamePasswordAuthenticationToken(details, auth.getCredentials(), + details.getAuthorities()); + } + return auth; + } + /* * @see org.springframework.security.authentication.dao. * AbstractUserDetailsAuthenticationProvider#supports(java.lang.Class) @@ -101,7 +118,8 @@ public class LocalAuthenticationProvider extends DaoAuthenticationProvider { public boolean supports(Class authentication) { return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)) || (LocalSecondFactorAuthenticationToken.class.isAssignableFrom(authentication)) - || (LocalAnonymousAuthenticationToken.class.isAssignableFrom(authentication)); + || (LocalAnonymousAuthenticationToken.class.isAssignableFrom(authentication)) + || providers.stream().anyMatch(p -> p.supports(authentication)); } /** diff --git a/core/src/main/java/de/bstly/we/security/LocalRememberMeServices.java b/core/src/main/java/de/bstly/we/security/LocalRememberMeServices.java index da04a88..37476e0 100644 --- a/core/src/main/java/de/bstly/we/security/LocalRememberMeServices.java +++ b/core/src/main/java/de/bstly/we/security/LocalRememberMeServices.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security; import java.time.Instant; diff --git a/core/src/main/java/de/bstly/we/security/LocalServletContextListener.java b/core/src/main/java/de/bstly/we/security/LocalServletContextListener.java index ecf4f64..53d2cee 100644 --- a/core/src/main/java/de/bstly/we/security/LocalServletContextListener.java +++ b/core/src/main/java/de/bstly/we/security/LocalServletContextListener.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security; /** diff --git a/core/src/main/java/de/bstly/we/security/PasswordEncoderConfig.java b/core/src/main/java/de/bstly/we/security/PasswordEncoderConfig.java index 2f11a6d..57eb56f 100644 --- a/core/src/main/java/de/bstly/we/security/PasswordEncoderConfig.java +++ b/core/src/main/java/de/bstly/we/security/PasswordEncoderConfig.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security; import org.springframework.context.annotation.Bean; diff --git a/core/src/main/java/de/bstly/we/security/SecurityConfig.java b/core/src/main/java/de/bstly/we/security/SecurityConfig.java index d20468f..6d16203 100755 --- a/core/src/main/java/de/bstly/we/security/SecurityConfig.java +++ b/core/src/main/java/de/bstly/we/security/SecurityConfig.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security; import java.io.UnsupportedEncodingException; @@ -33,6 +30,7 @@ import org.springframework.security.web.authentication.session.SessionFixationPr import org.springframework.security.web.firewall.StrictHttpFirewall; import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter.ReferrerPolicy; import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher; +import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @@ -54,6 +52,7 @@ import dev.samstevens.totp.code.HashingAlgorithm; @EnableWebSecurity @EnableMethodSecurity(prePostEnabled = true) @Configuration +@EnableJdbcHttpSession public class SecurityConfig { @Autowired @@ -97,14 +96,14 @@ public class SecurityConfig { // disable deprectated xss protection, x-frame .headers((headers) -> headers.xssProtection((xssProtection) -> xssProtection.disable())) // form login - .formLogin((formLogin) -> formLogin.loginPage(loginUrl).usernameParameter("username") + .formLogin((formLogin) -> formLogin.usernameParameter("username") .passwordParameter("password") .loginProcessingUrl("/auth/login").defaultSuccessUrl(loginTargetUrl) .successHandler(formAuthenticationSuccessHandler()) .failureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?error"))) // remember me .rememberMe((rememberMe) -> rememberMe.rememberMeServices(rememberMeServices())) - // form totp + // anonymous .addFilterBefore(formSecondFactorAuthenticationFilter(http), LocalAnonymousAuthenticationFilter.class) // rest login .addFilterBefore(restAuthenticationFilter(http), UsernamePasswordAuthenticationFilter.class) diff --git a/core/src/main/java/de/bstly/we/security/businesslogic/AdditionalAuthenticationProvider.java b/core/src/main/java/de/bstly/we/security/businesslogic/AdditionalAuthenticationProvider.java new file mode 100644 index 0000000..e3b1f73 --- /dev/null +++ b/core/src/main/java/de/bstly/we/security/businesslogic/AdditionalAuthenticationProvider.java @@ -0,0 +1,12 @@ +package de.bstly.we.security.businesslogic; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +public interface AdditionalAuthenticationProvider { + + Authentication authenticate(Authentication auth) throws AuthenticationException; + + boolean supports(Class authentication); + +} diff --git a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProvider.java b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProvider.java index c340b10..49c68c5 100644 --- a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProvider.java +++ b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProvider.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.businesslogic; import de.bstly.we.businesslogic.UserDataProvider; diff --git a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProviderManager.java b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProviderManager.java index 677ee9d..0759c51 100644 --- a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProviderManager.java +++ b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorProviderManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.businesslogic; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorRequestProvider.java b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorRequestProvider.java index 8e74365..f5d4cb4 100644 --- a/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorRequestProvider.java +++ b/core/src/main/java/de/bstly/we/security/businesslogic/SecondFactorRequestProvider.java @@ -1,22 +1,8 @@ -/** - * - */ package de.bstly.we.security.businesslogic; import de.bstly.we.model.SecondFactor; -/** - * The Interface SecondFactorRequestProvider. - * - * @param the generic type - */ public interface SecondFactorRequestProvider extends SecondFactorProvider { - /** - * Request. - * - * @param userId the user id - */ - void request(Long userId); - + Object request(Long userId); } diff --git a/core/src/main/java/de/bstly/we/security/filter/FormSecondFactorAuthenticationFilter.java b/core/src/main/java/de/bstly/we/security/filter/FormSecondFactorAuthenticationFilter.java index f057b4d..34140a7 100644 --- a/core/src/main/java/de/bstly/we/security/filter/FormSecondFactorAuthenticationFilter.java +++ b/core/src/main/java/de/bstly/we/security/filter/FormSecondFactorAuthenticationFilter.java @@ -1,15 +1,7 @@ -/** - * - */ package de.bstly.we.security.filter; import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import org.springframework.lang.Nullable; import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.InsufficientAuthenticationException; @@ -22,6 +14,9 @@ import org.springframework.util.StringUtils; import de.bstly.we.security.model.LocalUserDetails; import de.bstly.we.security.token.LocalSecondFactorAuthenticationToken; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * The Class FormSecondFactorAuthenticationFilter. @@ -92,24 +87,10 @@ public class FormSecondFactorAuthenticationFilter extends AbstractAuthentication getFailureHandler().onAuthenticationFailure(request, response, failed); } - /** - * Obtain provider. - * - * @param request the request - * @return the string - */ - @Nullable protected String obtainProvider(HttpServletRequest request) { return request.getParameter(SPRING_SECURITY_FORM_2FA_PROVIDER_KEY); } - /** - * Obtain code. - * - * @param request the request - * @return the string - */ - @Nullable protected String obtainCode(HttpServletRequest request) { return request.getParameter(SPRING_SECURITY_FORM_2FA_CODE_KEY); } diff --git a/core/src/main/java/de/bstly/we/security/filter/LocalAnonymousAuthenticationFilter.java b/core/src/main/java/de/bstly/we/security/filter/LocalAnonymousAuthenticationFilter.java index 76f21e6..652cffd 100755 --- a/core/src/main/java/de/bstly/we/security/filter/LocalAnonymousAuthenticationFilter.java +++ b/core/src/main/java/de/bstly/we/security/filter/LocalAnonymousAuthenticationFilter.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.filter; import java.io.IOException; diff --git a/core/src/main/java/de/bstly/we/security/filter/RestAuthenticationFilter.java b/core/src/main/java/de/bstly/we/security/filter/RestAuthenticationFilter.java index ef951c8..3ec5c37 100644 --- a/core/src/main/java/de/bstly/we/security/filter/RestAuthenticationFilter.java +++ b/core/src/main/java/de/bstly/we/security/filter/RestAuthenticationFilter.java @@ -1,14 +1,7 @@ -/** - * - */ package de.bstly.we.security.filter; import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -18,13 +11,15 @@ import org.springframework.security.web.authentication.AbstractAuthenticationPro import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.util.Assert; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; import com.google.gson.JsonElement; +import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.bstly.we.security.SecurityConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * The Class RestAuthenticationFilter. @@ -79,7 +74,7 @@ public class RestAuthenticationFilter extends AbstractAuthenticationProcessingFi Authentication authRequest = new UsernamePasswordAuthenticationToken( loginModel.get(usernameKey).getAsString(), loginModel.get(passwordKey).getAsString()); return this.getAuthenticationManager().authenticate(authRequest); - } catch (JsonMappingException | JsonParseException exception) { + } catch (JsonIOException exception) { throw new AuthenticationCredentialsNotFoundException("Bad request"); } } diff --git a/core/src/main/java/de/bstly/we/security/filter/RestSecondFactorAuthenticationFilter.java b/core/src/main/java/de/bstly/we/security/filter/RestSecondFactorAuthenticationFilter.java index 85708a1..940d0e7 100644 --- a/core/src/main/java/de/bstly/we/security/filter/RestSecondFactorAuthenticationFilter.java +++ b/core/src/main/java/de/bstly/we/security/filter/RestSecondFactorAuthenticationFilter.java @@ -3,10 +3,6 @@ package de.bstly.we.security.filter; import java.io.IOException; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.InsufficientAuthenticationException; @@ -15,15 +11,17 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; import com.google.gson.JsonElement; +import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import de.bstly.we.security.SecurityConfig; import de.bstly.we.security.model.LocalUserDetails; import de.bstly.we.security.token.LocalSecondFactorAuthenticationToken; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; /** * The Class RestSecondFactorAuthenticationFilter. @@ -84,7 +82,7 @@ public class RestSecondFactorAuthenticationFilter extends FormSecondFactorAuthen LocalUserDetails details = (LocalUserDetails) authentication.getPrincipal(); authentication = new LocalSecondFactorAuthenticationToken(details, provider, code); return this.getAuthenticationManager().authenticate(authentication); - } catch (JsonMappingException | JsonParseException exception) { + } catch (JsonIOException exception) { throw new AuthenticationCredentialsNotFoundException("Bad request"); } } diff --git a/core/src/main/java/de/bstly/we/security/handler/LocalAccessDeniedHandler.java b/core/src/main/java/de/bstly/we/security/handler/LocalAccessDeniedHandler.java index 9a3fb72..2186540 100644 --- a/core/src/main/java/de/bstly/we/security/handler/LocalAccessDeniedHandler.java +++ b/core/src/main/java/de/bstly/we/security/handler/LocalAccessDeniedHandler.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.handler; import org.springframework.security.web.access.AccessDeniedHandlerImpl; diff --git a/core/src/main/java/de/bstly/we/security/model/LocalUserDetails.java b/core/src/main/java/de/bstly/we/security/model/LocalUserDetails.java index a9726f3..5464d92 100755 --- a/core/src/main/java/de/bstly/we/security/model/LocalUserDetails.java +++ b/core/src/main/java/de/bstly/we/security/model/LocalUserDetails.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.model; import java.util.Collection; diff --git a/core/src/main/java/de/bstly/we/security/token/LocalAnonymousAuthenticationToken.java b/core/src/main/java/de/bstly/we/security/token/LocalAnonymousAuthenticationToken.java index 01252fa..9bbb96d 100644 --- a/core/src/main/java/de/bstly/we/security/token/LocalAnonymousAuthenticationToken.java +++ b/core/src/main/java/de/bstly/we/security/token/LocalAnonymousAuthenticationToken.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.token; import java.util.List; diff --git a/core/src/main/java/de/bstly/we/security/token/LocalSecondFactorAuthenticationToken.java b/core/src/main/java/de/bstly/we/security/token/LocalSecondFactorAuthenticationToken.java index 724d758..1b08798 100644 --- a/core/src/main/java/de/bstly/we/security/token/LocalSecondFactorAuthenticationToken.java +++ b/core/src/main/java/de/bstly/we/security/token/LocalSecondFactorAuthenticationToken.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.security.token; import java.util.List; diff --git a/developer/pom.xml b/developer/pom.xml index 2020597..15f3a48 100755 --- a/developer/pom.xml +++ b/developer/pom.xml @@ -9,7 +9,7 @@ - 1.6.9 + 1.8.0 developer diff --git a/developer/pom.xml.versionsBackup b/developer/pom.xml.versionsBackup new file mode 100755 index 0000000..2020597 --- /dev/null +++ b/developer/pom.xml.versionsBackup @@ -0,0 +1,31 @@ + + 4.0.0 + + de.bstly.we + webstly-main + ${revision} + + + + 1.6.9 + + + developer + webstly-developer + + + + de.bstly.we + webstly-core + ${revision} + + + + org.springdoc + springdoc-openapi-ui + ${springdoc-openapi-ui.version} + + + diff --git a/developer/src/main/java/de/bstly/we/developer/SpringDocConfig.java b/developer/src/main/java/de/bstly/we/developer/SpringDocConfig.java index 0500c7a..ac94d37 100644 --- a/developer/src/main/java/de/bstly/we/developer/SpringDocConfig.java +++ b/developer/src/main/java/de/bstly/we/developer/SpringDocConfig.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.developer; import org.springdoc.core.GroupedOpenApi; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsManager.java b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsManager.java index 262db74..b263d10 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsManager.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.businesslogic; import java.util.Optional; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenManager.java b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenManager.java index 7641fb5..9748ad0 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenManager.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.businesslogic; import java.util.List; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenPermissions.java b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenPermissions.java index 44b4df4..694b633 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenPermissions.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.businesslogic; /** diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenQuotas.java b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenQuotas.java index 15edd5a..13d8269 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenQuotas.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/businesslogic/DyndnsTokenQuotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.businesslogic; /** diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsController.java b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsController.java index c9a588c..3e9a606 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsController.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.controller; import java.util.Optional; @@ -65,14 +62,14 @@ public class DyndnsController extends BaseController { } if (ip.isEmpty() && ipv6.isEmpty()) { - throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY); + throw new EntityResponseStatusException(HttpStatus.CONFLICT); } try { dyndnsManager.setRecord(name, ip, ipv6); } catch (Exception e) { e.printStackTrace(); - throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY); + throw new EntityResponseStatusException(HttpStatus.CONFLICT); } } diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenController.java b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenController.java index e7fd32f..6b1fe5c 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenController.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.controller; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenManagementController.java b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenManagementController.java index 6c8f5de..9e09592 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenManagementController.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/controller/DyndnsTokenManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/model/DyndnsToken.java b/dyndns/src/main/java/de/bstly/we/dyndns/model/DyndnsToken.java index 0cce247..871d892 100644 --- a/dyndns/src/main/java/de/bstly/we/dyndns/model/DyndnsToken.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/model/DyndnsToken.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.model; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/dyndns/src/main/java/de/bstly/we/dyndns/repository/DyndnsTokenRepository.java b/dyndns/src/main/java/de/bstly/we/dyndns/repository/DyndnsTokenRepository.java index b96cdde..6879698 100755 --- a/dyndns/src/main/java/de/bstly/we/dyndns/repository/DyndnsTokenRepository.java +++ b/dyndns/src/main/java/de/bstly/we/dyndns/repository/DyndnsTokenRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.dyndns.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/email/src/main/java/de/bstly/we/email/businesslogic/EmailManager.java b/email/src/main/java/de/bstly/we/email/businesslogic/EmailManager.java index c32bc9f..b682620 100644 --- a/email/src/main/java/de/bstly/we/email/businesslogic/EmailManager.java +++ b/email/src/main/java/de/bstly/we/email/businesslogic/EmailManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.email.businesslogic; import org.springframework.beans.factory.annotation.Autowired; diff --git a/email/src/main/java/de/bstly/we/email/controller/EmailController.java b/email/src/main/java/de/bstly/we/email/controller/EmailController.java index 46af7cb..948f70f 100644 --- a/email/src/main/java/de/bstly/we/email/controller/EmailController.java +++ b/email/src/main/java/de/bstly/we/email/controller/EmailController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.email.controller; import java.util.List; diff --git a/email/src/main/java/de/bstly/we/email/controller/model/UserMailModel.java b/email/src/main/java/de/bstly/we/email/controller/model/UserMailModel.java index 33f15af..ef299f5 100644 --- a/email/src/main/java/de/bstly/we/email/controller/model/UserMailModel.java +++ b/email/src/main/java/de/bstly/we/email/controller/model/UserMailModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.email.controller.model; import lombok.Getter; diff --git a/i18n/src/main/java/de/bstly/we/i18n/businesslogic/I18nManager.java b/i18n/src/main/java/de/bstly/we/i18n/businesslogic/I18nManager.java index 2dee68a..6ec2e37 100644 --- a/i18n/src/main/java/de/bstly/we/i18n/businesslogic/I18nManager.java +++ b/i18n/src/main/java/de/bstly/we/i18n/businesslogic/I18nManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.i18n.businesslogic; import java.util.List; diff --git a/i18n/src/main/java/de/bstly/we/i18n/controller/I18nController.java b/i18n/src/main/java/de/bstly/we/i18n/controller/I18nController.java index 967fb74..854f1b7 100644 --- a/i18n/src/main/java/de/bstly/we/i18n/controller/I18nController.java +++ b/i18n/src/main/java/de/bstly/we/i18n/controller/I18nController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.i18n.controller; import java.io.IOException; @@ -58,7 +55,7 @@ public class I18nController extends BaseController { * @throws IOException Signals that an I/O exception has occurred. */ @GetMapping("/{locale}") - public void getLabel(@PathVariable("locale") String locale, HttpServletResponse response) + public void getLabel(@PathVariable String locale, HttpServletResponse response) throws JsonIOException, IOException { JsonObject label = i18nManager.getLabel(locale); if (label != null) { @@ -75,7 +72,7 @@ public class I18nController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/{locale}") - public void setLabel(@PathVariable("locale") String locale, @RequestBody Object label) { + public void setLabel(@PathVariable String locale, @RequestBody Object label) { JsonElement element = gson.toJsonTree(label); if (element != null && element.isJsonObject()) { @@ -91,7 +88,7 @@ public class I18nController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PutMapping("/{locale}") - public void addLabel(@PathVariable("locale") String locale, @RequestBody Object label) { + public void addLabel(@PathVariable String locale, @RequestBody Object label) { JsonElement element = gson.toJsonTree(label); if (element != null && element.isJsonObject()) { @@ -106,7 +103,7 @@ public class I18nController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{locale}") - public void deleteLocale(@PathVariable("locale") String locale) { + public void deleteLocale(@PathVariable String locale) { i18nManager.deleteLabel(locale); } diff --git a/i18n/src/main/java/de/bstly/we/i18n/model/I18n.java b/i18n/src/main/java/de/bstly/we/i18n/model/I18n.java index 38a53ab..da13132 100644 --- a/i18n/src/main/java/de/bstly/we/i18n/model/I18n.java +++ b/i18n/src/main/java/de/bstly/we/i18n/model/I18n.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.i18n.model; import jakarta.persistence.Column; diff --git a/i18n/src/main/java/de/bstly/we/i18n/repository/I18nRepository.java b/i18n/src/main/java/de/bstly/we/i18n/repository/I18nRepository.java index 70a1266..de40f40 100644 --- a/i18n/src/main/java/de/bstly/we/i18n/repository/I18nRepository.java +++ b/i18n/src/main/java/de/bstly/we/i18n/repository/I18nRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.i18n.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteManager.java b/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteManager.java index 94cf3a9..f83d156 100644 --- a/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteManager.java +++ b/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.businesslogic; import java.util.List; diff --git a/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteMappingManager.java b/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteMappingManager.java index 2155427..0d19bd8 100644 --- a/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteMappingManager.java +++ b/invite/src/main/java/de/bstly/we/invite/businesslogic/InviteMappingManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.businesslogic; import java.time.Instant; diff --git a/invite/src/main/java/de/bstly/we/invite/controller/InviteController.java b/invite/src/main/java/de/bstly/we/invite/controller/InviteController.java index 22f840c..673b224 100644 --- a/invite/src/main/java/de/bstly/we/invite/controller/InviteController.java +++ b/invite/src/main/java/de/bstly/we/invite/controller/InviteController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.controller; import java.time.Instant; @@ -82,7 +79,7 @@ public class InviteController extends BaseController { * @return the invite */ @GetMapping("/{code}") - public Invite get(@PathVariable("code") String code) { + public Invite get(@PathVariable String code) { Invite invite = inviteManager.getByCode(code); if (invite == null) { throw new EntityResponseStatusException(HttpStatus.NOT_ACCEPTABLE); @@ -113,7 +110,7 @@ public class InviteController extends BaseController { * @return the permissions */ @GetMapping("/{code}/permissions") - public List getPermissions(@PathVariable("code") String code) { + public List getPermissions(@PathVariable String code) { Invite invite = inviteManager.getByCode(code); if (invite == null) { throw new EntityResponseStatusException(HttpStatus.NOT_ACCEPTABLE); @@ -130,7 +127,7 @@ public class InviteController extends BaseController { * @return the quotas */ @GetMapping("/{code}/quotas") - public List getQuotas(@PathVariable("code") String code) { + public List getQuotas(@PathVariable String code) { Invite invite = inviteManager.getByCode(code); if (invite == null) { throw new EntityResponseStatusException(HttpStatus.NOT_ACCEPTABLE); @@ -290,7 +287,7 @@ public class InviteController extends BaseController { */ @PreAuthorize("isAuthenticated()") @GetMapping("/{quota}/others") - public Page getOtherInvites(@PathVariable("quota") String quota, + public Page getOtherInvites(@PathVariable String quota, @RequestParam("page") Optional pageParameter, @RequestParam("size") Optional sizeParameter, @RequestParam("search") Optional searchParameter, @@ -324,7 +321,7 @@ public class InviteController extends BaseController { */ @PreAuthorize("isAuthenticated()") @PostMapping("/{quota}") - public Invite createInvite(@PathVariable("quota") String quota, @RequestBody Invite inviteModel) { + public Invite createInvite(@PathVariable String quota, @RequestBody Invite inviteModel) { InviteMapping inviteMapping = inviteMappingManager.get(quota); Quota inviteQuota = quotaManager.get(getCurrentUserId(), InviteMapping.QUOTA_PREFIX + quota); if (inviteMapping == null || inviteQuota == null || inviteQuota.getValue() < 1) { diff --git a/invite/src/main/java/de/bstly/we/invite/controller/InviteManagingController.java b/invite/src/main/java/de/bstly/we/invite/controller/InviteManagingController.java index d5520de..5843d73 100644 --- a/invite/src/main/java/de/bstly/we/invite/controller/InviteManagingController.java +++ b/invite/src/main/java/de/bstly/we/invite/controller/InviteManagingController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.controller; import java.util.List; @@ -101,7 +98,7 @@ public class InviteManagingController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{id}") - public void delete(@PathVariable("id") Long id) { + public void delete(@PathVariable Long id) { if (inviteManager.get(id) == null) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); } diff --git a/invite/src/main/java/de/bstly/we/invite/controller/InviteMappingController.java b/invite/src/main/java/de/bstly/we/invite/controller/InviteMappingController.java index a5eecd3..e137ce1 100644 --- a/invite/src/main/java/de/bstly/we/invite/controller/InviteMappingController.java +++ b/invite/src/main/java/de/bstly/we/invite/controller/InviteMappingController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.controller; import java.util.List; @@ -92,7 +89,7 @@ public class InviteMappingController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{quota}") - public void delete(@PathVariable("quota") String quota) { + public void delete(@PathVariable String quota) { if (inviteMappingManager.get(quota) == null) { throw new EntityResponseStatusException(HttpStatus.CONFLICT); } diff --git a/invite/src/main/java/de/bstly/we/invite/model/Invite.java b/invite/src/main/java/de/bstly/we/invite/model/Invite.java index 6d25138..a9c8438 100644 --- a/invite/src/main/java/de/bstly/we/invite/model/Invite.java +++ b/invite/src/main/java/de/bstly/we/invite/model/Invite.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.model; import java.time.Instant; diff --git a/invite/src/main/java/de/bstly/we/invite/model/InviteMapping.java b/invite/src/main/java/de/bstly/we/invite/model/InviteMapping.java index aa23878..fb8be0c 100644 --- a/invite/src/main/java/de/bstly/we/invite/model/InviteMapping.java +++ b/invite/src/main/java/de/bstly/we/invite/model/InviteMapping.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.model; import java.time.Instant; diff --git a/invite/src/main/java/de/bstly/we/invite/repository/InviteMappingRepository.java b/invite/src/main/java/de/bstly/we/invite/repository/InviteMappingRepository.java index 71e24eb..a47165b 100755 --- a/invite/src/main/java/de/bstly/we/invite/repository/InviteMappingRepository.java +++ b/invite/src/main/java/de/bstly/we/invite/repository/InviteMappingRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/invite/src/main/java/de/bstly/we/invite/repository/InviteRepository.java b/invite/src/main/java/de/bstly/we/invite/repository/InviteRepository.java index 07c6f3d..b84992a 100644 --- a/invite/src/main/java/de/bstly/we/invite/repository/InviteRepository.java +++ b/invite/src/main/java/de/bstly/we/invite/repository/InviteRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.invite.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiPermissions.java b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiPermissions.java index 9a7dc85..d951b4a 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiPermissions.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.businesslogic; /** diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiQuotas.java b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiQuotas.java index e20ac1c..e516cc9 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiQuotas.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiQuotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.businesslogic; /** diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiRoomManager.java b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiRoomManager.java index cf0a340..4be0cee 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiRoomManager.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/JitsiRoomManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.businesslogic; import java.time.Instant; diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/support/UrlShortenerSync.java b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/support/UrlShortenerSync.java index c2cea76..61d5024 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/support/UrlShortenerSync.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/businesslogic/support/UrlShortenerSync.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.businesslogic.support; import org.springframework.beans.factory.annotation.Autowired; diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomController.java b/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomController.java index c97ee74..fcf004d 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomController.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.controller; import java.util.Optional; @@ -175,7 +172,7 @@ public class JitsiRoomController extends BaseController { */ @PreAuthorize("isAuthenticated()") @PatchMapping("/{id}") - public JitsiRoom createShortenedUrl(@PathVariable("id") Long id) { + public JitsiRoom createShortenedUrl(@PathVariable Long id) { JitsiRoom jitsiRoom = jitsiRoomManager.get(id); if (jitsiRoom == null || !(jitsiRoom.getOwner().equals(getCurrentUserId()))) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); @@ -202,7 +199,7 @@ public class JitsiRoomController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{id}") - public void deleteJitsiRoom(@PathVariable("id") Long id) { + public void deleteJitsiRoom(@PathVariable Long id) { if (!permissionManager.hasPermission(getCurrentUserId(), JitsiPermissions.JITSI_MEET)) { jitsiRoomManager.deleteAll(getCurrentUserId(), false); diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomManagementController.java b/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomManagementController.java index c439dde..78440aa 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomManagementController.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/controller/JitsiRoomManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.controller; import java.util.Optional; @@ -85,7 +82,7 @@ public class JitsiRoomManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{id}") - public void deleteJitsiRoom(@PathVariable("id") Long id, @RequestParam("quota") Optional quota) { + public void deleteJitsiRoom(@PathVariable Long id, @RequestParam("quota") Optional quota) { JitsiRoom jitsiRoom = jitsiRoomManager.get(id); if (jitsiRoom == null) { @@ -103,7 +100,7 @@ public class JitsiRoomManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/all/{owner}") - public void deleteAll(@PathVariable("owner") Long owner, @RequestParam("quota") Optional quota) { + public void deleteAll(@PathVariable Long owner, @RequestParam("quota") Optional quota) { jitsiRoomManager.deleteAll(owner, quota.isPresent() && quota.get().booleanValue()); } diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/controller/validation/JitsiRoomValidator.java b/jitsi/src/main/java/de/bstly/we/jitsi/controller/validation/JitsiRoomValidator.java index 2b7567a..a7a99f3 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/controller/validation/JitsiRoomValidator.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/controller/validation/JitsiRoomValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.controller.validation; import java.time.Instant; diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/model/JitsiRoom.java b/jitsi/src/main/java/de/bstly/we/jitsi/model/JitsiRoom.java index fb04dde..ccd8f0b 100644 --- a/jitsi/src/main/java/de/bstly/we/jitsi/model/JitsiRoom.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/model/JitsiRoom.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.model; import java.time.Instant; diff --git a/jitsi/src/main/java/de/bstly/we/jitsi/repository/JitsiRoomRepository.java b/jitsi/src/main/java/de/bstly/we/jitsi/repository/JitsiRoomRepository.java index 5bc138f..e4b32a3 100755 --- a/jitsi/src/main/java/de/bstly/we/jitsi/repository/JitsiRoomRepository.java +++ b/jitsi/src/main/java/de/bstly/we/jitsi/repository/JitsiRoomRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jitsi.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/JukeboxManager.java b/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/JukeboxManager.java index c59ad09..365a4aa 100644 --- a/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/JukeboxManager.java +++ b/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/JukeboxManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jukebox.businesslogic; import java.io.IOException; diff --git a/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/model/JukeboxConfig.java b/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/model/JukeboxConfig.java index 2262cac..c4ddecc 100644 --- a/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/model/JukeboxConfig.java +++ b/jukebox/src/main/java/de/bstly/we/jukebox/businesslogic/model/JukeboxConfig.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jukebox.businesslogic.model; import java.time.Instant; diff --git a/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxController.java b/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxController.java index 28b6aaf..980f8e1 100644 --- a/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxController.java +++ b/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jukebox.controller; import java.io.IOException; diff --git a/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxManagementController.java b/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxManagementController.java index e8e59d6..1460a13 100644 --- a/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxManagementController.java +++ b/jukebox/src/main/java/de/bstly/we/jukebox/controller/JukeboxManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jukebox.controller; import java.io.IOException; diff --git a/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtKeyManager.java b/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtKeyManager.java index b5e1bd8..4d75748 100644 --- a/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtKeyManager.java +++ b/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtKeyManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jwt.businesslogic; import java.text.ParseException; diff --git a/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtUserManager.java b/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtUserManager.java index b3dce19..8bb7dcb 100644 --- a/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtUserManager.java +++ b/jwt/src/main/java/de/bstly/we/jwt/businesslogic/JwtUserManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jwt.businesslogic; import java.text.ParseException; diff --git a/jwt/src/main/java/de/bstly/we/jwt/controller/JwtUserDataController.java b/jwt/src/main/java/de/bstly/we/jwt/controller/JwtUserDataController.java index 2cd154d..d1f58e6 100644 --- a/jwt/src/main/java/de/bstly/we/jwt/controller/JwtUserDataController.java +++ b/jwt/src/main/java/de/bstly/we/jwt/controller/JwtUserDataController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jwt.controller; import java.text.ParseException; @@ -106,7 +103,7 @@ public class JwtUserDataController extends BaseController { throw new EntityResponseStatusException(HttpStatus.NOT_ACCEPTABLE); } } catch (ParseException e) { - throw new EntityResponseStatusException(HttpStatus.UNPROCESSABLE_ENTITY); + throw new EntityResponseStatusException(HttpStatus.CONFLICT); } catch (JOSEException e) { e.printStackTrace(); throw new EntityResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/jwt/src/main/java/de/bstly/we/jwt/model/JwtKey.java b/jwt/src/main/java/de/bstly/we/jwt/model/JwtKey.java index cfe58e0..a739ada 100644 --- a/jwt/src/main/java/de/bstly/we/jwt/model/JwtKey.java +++ b/jwt/src/main/java/de/bstly/we/jwt/model/JwtKey.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jwt.model; import java.time.Instant; diff --git a/jwt/src/main/java/de/bstly/we/jwt/repository/JwtKeyRepository.java b/jwt/src/main/java/de/bstly/we/jwt/repository/JwtKeyRepository.java index 5d68211..9cf618c 100644 --- a/jwt/src/main/java/de/bstly/we/jwt/repository/JwtKeyRepository.java +++ b/jwt/src/main/java/de/bstly/we/jwt/repository/JwtKeyRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.jwt.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/membership/src/main/java/de/bstly/we/membership/businesslogic/MembershipManager.java b/membership/src/main/java/de/bstly/we/membership/businesslogic/MembershipManager.java index 07a8397..df62c93 100644 --- a/membership/src/main/java/de/bstly/we/membership/businesslogic/MembershipManager.java +++ b/membership/src/main/java/de/bstly/we/membership/businesslogic/MembershipManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.membership.businesslogic; import java.io.IOException; diff --git a/membership/src/main/java/de/bstly/we/membership/controller/MembershipController.java b/membership/src/main/java/de/bstly/we/membership/controller/MembershipController.java index eb878cc..46a56cc 100644 --- a/membership/src/main/java/de/bstly/we/membership/controller/MembershipController.java +++ b/membership/src/main/java/de/bstly/we/membership/controller/MembershipController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.membership.controller; import java.io.IOException; diff --git a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestAccountManager.java b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestAccountManager.java index 6f365ad..d5413f7 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestAccountManager.java +++ b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestAccountManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.businesslogic; import java.util.List; diff --git a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestPermissions.java b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestPermissions.java index 3136e5a..a77117f 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestPermissions.java +++ b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.businesslogic; /** diff --git a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestQuotas.java b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestQuotas.java index eec468e..b07c761 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestQuotas.java +++ b/minetest/src/main/java/de/bstly/we/minetest/businesslogic/MinetestQuotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.businesslogic; /** diff --git a/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountController.java b/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountController.java index c307813..5d88c8f 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountController.java +++ b/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.controller; import java.util.List; @@ -98,7 +95,7 @@ public class MinetestAccountController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{name}") - public void deleteMinetestAccount(@PathVariable("name") String name) { + public void deleteMinetestAccount(@PathVariable String name) { if (!permissionManager.hasPermission(getCurrentUserId(), MinetestPermissions.MINETEST)) { minetestAccountManager.deleteAll(getCurrentUserId(), true); throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); diff --git a/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountManagementController.java b/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountManagementController.java index f019566..56847e4 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountManagementController.java +++ b/minetest/src/main/java/de/bstly/we/minetest/controller/MinetestAccountManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.controller; import java.util.Optional; @@ -80,7 +77,7 @@ public class MinetestAccountManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{name}") - public void deleteMinetestAccount(@PathVariable("name") String name, + public void deleteMinetestAccount(@PathVariable String name, @RequestParam("quota") Optional quota) { MinetestAccount minetestAccount = minetestAccountManager.get(name); @@ -99,7 +96,7 @@ public class MinetestAccountManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/all/{owner}") - public void deleteAll(@PathVariable("owner") Long owner, @RequestParam("quota") Optional quota) { + public void deleteAll(@PathVariable Long owner, @RequestParam("quota") Optional quota) { minetestAccountManager.deleteAll(owner, quota.isPresent() && quota.get().booleanValue()); } diff --git a/minetest/src/main/java/de/bstly/we/minetest/controller/validation/MinetestAccountValidator.java b/minetest/src/main/java/de/bstly/we/minetest/controller/validation/MinetestAccountValidator.java index daee3bf..f3e2133 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/controller/validation/MinetestAccountValidator.java +++ b/minetest/src/main/java/de/bstly/we/minetest/controller/validation/MinetestAccountValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.controller.validation; import org.springframework.beans.factory.annotation.Autowired; diff --git a/minetest/src/main/java/de/bstly/we/minetest/model/MinetestAccount.java b/minetest/src/main/java/de/bstly/we/minetest/model/MinetestAccount.java index 0397c89..848c2c7 100644 --- a/minetest/src/main/java/de/bstly/we/minetest/model/MinetestAccount.java +++ b/minetest/src/main/java/de/bstly/we/minetest/model/MinetestAccount.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.model; import jakarta.persistence.Column; diff --git a/minetest/src/main/java/de/bstly/we/minetest/repository/MinetestAccountRepository.java b/minetest/src/main/java/de/bstly/we/minetest/repository/MinetestAccountRepository.java index 1c86780..bc47cb0 100755 --- a/minetest/src/main/java/de/bstly/we/minetest/repository/MinetestAccountRepository.java +++ b/minetest/src/main/java/de/bstly/we/minetest/repository/MinetestAccountRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.minetest.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationCodeManager.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationCodeManager.java index 3728d49..53beb6e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationCodeManager.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationCodeManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationManager.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationManager.java index 0b2b7c6..6303365 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationManager.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcAuthorizationManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcClientManager.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcClientManager.java index 69ca6be..634db48 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcClientManager.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcClientManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic; import java.util.Set; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcSessionManager.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcSessionManager.java index 6094bb7..fad09e4 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcSessionManager.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcSessionManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic; import java.util.Date; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcTokenManager.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcTokenManager.java index 341ccf3..e2512d6 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcTokenManager.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/OidcTokenManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic; import java.time.Instant; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidAuthorizationRequestException.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidAuthorizationRequestException.java index 3ec235e..d984a32 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidAuthorizationRequestException.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidAuthorizationRequestException.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.exception; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidTokenRequestException.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidTokenRequestException.java index edc1aeb..b30d7e2 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidTokenRequestException.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/exception/InvalidTokenRequestException.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.exception; import de.bstly.we.oidc.businesslogic.model.OidcTokenErrorCode; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationCode.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationCode.java index abda225..14aa0c5 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationCode.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationCode.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationErrorCode.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationErrorCode.java index 7f344dd..7d22939 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationErrorCode.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationErrorCode.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; /** diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationGrantType.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationGrantType.java index 59a6fc4..ffded7d 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationGrantType.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationGrantType.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; /** diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationRequest.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationRequest.java index ff0acec..d6329aa 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationRequest.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationRequest.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationResponseType.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationResponseType.java index d455105..e2c13a5 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationResponseType.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcAuthorizationResponseType.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; /** diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcClientAuthenticationMethod.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcClientAuthenticationMethod.java index 56fecf7..445f944 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcClientAuthenticationMethod.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcClientAuthenticationMethod.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; /** diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenErrorCode.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenErrorCode.java index 3267215..24f751c 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenErrorCode.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenErrorCode.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; /** diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRequest.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRequest.java index 7cab5f5..7aaa83f 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRequest.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRequest.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenResponse.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenResponse.java index 5c95a99..3104f91 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenResponse.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenResponse.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRevokeRequest.java b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRevokeRequest.java index 28c61af..8f4ba4c 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRevokeRequest.java +++ b/oidc/src/main/java/de/bstly/we/oidc/businesslogic/model/OidcTokenRevokeRequest.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.businesslogic.model; import lombok.Getter; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcAuthorizationController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcAuthorizationController.java index 40e015b..abffd8e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcAuthorizationController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcAuthorizationController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.io.IOException; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcClientController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcClientController.java index a4d43b2..0df311d 100755 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcClientController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcClientController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.util.Optional; @@ -64,7 +61,7 @@ public class OidcClientController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/{name}") - public OidcClient get(@PathVariable("name") String name) { + public OidcClient get(@PathVariable String name) { OidcClient client = registeredClientService.getByClientName(name); if (client == null) { throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); @@ -81,7 +78,7 @@ public class OidcClientController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/id/{clientId}") - public OidcClient getByClientId(@PathVariable("clientId") String clientId) { + public OidcClient getByClientId(@PathVariable String clientId) { OidcClient client = registeredClientService.getByClientId(clientId); if (client == null) { throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); @@ -152,7 +149,7 @@ public class OidcClientController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{name}") - public void deleteClient(@PathVariable("name") String name) { + public void deleteClient(@PathVariable String name) { if (registeredClientService.getByClientName(name) == null) { throw new EntityResponseStatusException(HttpStatus.NOT_MODIFIED); } @@ -167,7 +164,7 @@ public class OidcClientController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/{name}/secret") - public OidcClient createNewSecret(@PathVariable("name") String name) { + public OidcClient createNewSecret(@PathVariable String name) { if (registeredClientService.getByClientName(name) == null) { throw new EntityResponseStatusException(HttpStatus.NOT_MODIFIED); } diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcDiscoveryController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcDiscoveryController.java index 52b9a14..cc2250f 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcDiscoveryController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcDiscoveryController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcJwksController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcJwksController.java index 76231eb..1f8b580 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcJwksController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcJwksController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.util.Map; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcSessionController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcSessionController.java index 6777eb6..a76df2e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcSessionController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcSessionController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.io.IOException; @@ -101,7 +98,7 @@ public class OidcSessionController extends BaseController { */ @PreAuthorize("authentication.authenticated") @GetMapping("/{target}") - public OidcClientInfo getSessionsForTarget(@PathVariable("target") Long target) { + public OidcClientInfo getSessionsForTarget(@PathVariable Long target) { OidcClient client = oidcClientManager.get(target); if (client == null || !client.isAlwaysPermitted() && (!permissionManager.hasPermission(getCurrentUserId(), client.getClientName()) @@ -163,7 +160,7 @@ public class OidcSessionController extends BaseController { */ @PreAuthorize("authentication.authenticated") @RequestMapping(value = "/logout/sid/{sid}", method = { RequestMethod.GET, RequestMethod.POST }) - public void logoutBySid(@PathVariable("sid") String sid, + public void logoutBySid(@PathVariable String sid, @RequestParam("redirect_url") Optional redirectUrlParam, HttpServletRequest request, HttpServletResponse response) throws IOException { String issuer = oidcClientManager.getIssuer(request); @@ -182,7 +179,7 @@ public class OidcSessionController extends BaseController { */ @PreAuthorize("authentication.authenticated") @RequestMapping(value = "/logout/all/{target}", method = { RequestMethod.GET, RequestMethod.POST }) - public void logoutAllForTarget(@PathVariable("target") Long target, + public void logoutAllForTarget(@PathVariable Long target, @RequestParam("redirect_url") Optional redirectUrlParam, HttpServletRequest request, HttpServletResponse response) throws IOException { String issuer = oidcClientManager.getIssuer(request); diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcTokenController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcTokenController.java index 9b106d6..35e1b9e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcTokenController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcTokenController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import java.io.IOException; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcUserInfoController.java b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcUserInfoController.java index 819e203..b64886e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/OidcUserInfoController.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/OidcUserInfoController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller; import org.springframework.beans.factory.annotation.Autowired; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientInfo.java b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientInfo.java index ceb825f..5053df2 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientInfo.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientInfo.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller.model; import java.util.List; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientModel.java b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientModel.java index 6fa3e0b..58855ca 100755 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientModel.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcClientModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller.model; import java.util.Set; diff --git a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcConfiguration.java b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcConfiguration.java index 43e90d6..1bfb5e8 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcConfiguration.java +++ b/oidc/src/main/java/de/bstly/we/oidc/controller/model/OidcConfiguration.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.controller.model; import java.net.URI; diff --git a/oidc/src/main/java/de/bstly/we/oidc/model/OidcAuthorization.java b/oidc/src/main/java/de/bstly/we/oidc/model/OidcAuthorization.java index fabd696..d090dbf 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/model/OidcAuthorization.java +++ b/oidc/src/main/java/de/bstly/we/oidc/model/OidcAuthorization.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.model; import java.util.Set; diff --git a/oidc/src/main/java/de/bstly/we/oidc/model/OidcClient.java b/oidc/src/main/java/de/bstly/we/oidc/model/OidcClient.java index 0b4c25e..0566048 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/model/OidcClient.java +++ b/oidc/src/main/java/de/bstly/we/oidc/model/OidcClient.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.model; import java.util.Set; diff --git a/oidc/src/main/java/de/bstly/we/oidc/model/OidcSession.java b/oidc/src/main/java/de/bstly/we/oidc/model/OidcSession.java index 50bd94c..09c7e1d 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/model/OidcSession.java +++ b/oidc/src/main/java/de/bstly/we/oidc/model/OidcSession.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.model; import jakarta.persistence.Column; diff --git a/oidc/src/main/java/de/bstly/we/oidc/model/OidcToken.java b/oidc/src/main/java/de/bstly/we/oidc/model/OidcToken.java index a42b20b..426ae34 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/model/OidcToken.java +++ b/oidc/src/main/java/de/bstly/we/oidc/model/OidcToken.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.model; import java.time.Instant; diff --git a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcAuthorizationRepository.java b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcAuthorizationRepository.java index a45a278..ac40d75 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcAuthorizationRepository.java +++ b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcAuthorizationRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcClientRepository.java b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcClientRepository.java index 88a04ee..ffb50c6 100755 --- a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcClientRepository.java +++ b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcClientRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcSessionRepository.java b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcSessionRepository.java index dabc7b4..b884d62 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcSessionRepository.java +++ b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcSessionRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcTokenRepository.java b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcTokenRepository.java index 25c5ba3..763c88e 100644 --- a/oidc/src/main/java/de/bstly/we/oidc/repository/OidcTokenRepository.java +++ b/oidc/src/main/java/de/bstly/we/oidc/repository/OidcTokenRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.oidc.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/DebugController.java b/partey/src/main/java/de/bstly/we/partey/api/controller/DebugController.java index 2072cfc..7082c87 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/DebugController.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/DebugController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller; import java.util.Optional; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/MapController.java b/partey/src/main/java/de/bstly/we/partey/api/controller/MapController.java index c35cf11..f2fdbf6 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/MapController.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/MapController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller; import java.util.Optional; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/ReportController.java b/partey/src/main/java/de/bstly/we/partey/api/controller/ReportController.java index a146543..93cac8c 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/ReportController.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/ReportController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller; import jakarta.servlet.http.HttpServletRequest; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/RoomController.java b/partey/src/main/java/de/bstly/we/partey/api/controller/RoomController.java index e5bcc53..64a2ab6 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/RoomController.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/RoomController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/WokaController.java b/partey/src/main/java/de/bstly/we/partey/api/controller/WokaController.java index d0bc95c..e206a28 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/WokaController.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/WokaController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller; import java.util.Map; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/CharacterTexture.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/CharacterTexture.java index 655fab0..a1c94f0 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/CharacterTexture.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/CharacterTexture.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import lombok.Getter; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/MapDetailsData.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/MapDetailsData.java index d0cbfc8..c8fd94a 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/MapDetailsData.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/MapDetailsData.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/MemberData.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/MemberData.java index 3cd292f..9e26987 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/MemberData.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/MemberData.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/UserReport.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/UserReport.java index ac19340..8d2240d 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/UserReport.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/UserReport.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import lombok.Getter; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaCollection.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaCollection.java index 1584557..11016dd 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaCollection.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaCollection.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaLayer.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaLayer.java index 2705c71..3d6c0b2 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaLayer.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaLayer.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaTexture.java b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaTexture.java index 8377d3d..18342fa 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaTexture.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/model/WokaTexture.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.model; import lombok.Getter; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/support/DebugLogger.java b/partey/src/main/java/de/bstly/we/partey/api/controller/support/DebugLogger.java index 4618644..6b8a715 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/support/DebugLogger.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/support/DebugLogger.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.support; import java.util.Iterator; diff --git a/partey/src/main/java/de/bstly/we/partey/api/controller/support/WokaListManager.java b/partey/src/main/java/de/bstly/we/partey/api/controller/support/WokaListManager.java index 1b75f2d..4839913 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/controller/support/WokaListManager.java +++ b/partey/src/main/java/de/bstly/we/partey/api/controller/support/WokaListManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.controller.support; import java.io.IOException; diff --git a/partey/src/main/java/de/bstly/we/partey/api/security/ParteyApiAuthentication.java b/partey/src/main/java/de/bstly/we/partey/api/security/ParteyApiAuthentication.java index 5b4cb0a..4168ca9 100644 --- a/partey/src/main/java/de/bstly/we/partey/api/security/ParteyApiAuthentication.java +++ b/partey/src/main/java/de/bstly/we/partey/api/security/ParteyApiAuthentication.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.api.security; import jakarta.servlet.http.HttpServletRequest; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyMapManager.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyMapManager.java index 6340f46..9a5844e 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyMapManager.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyMapManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; import java.net.URI; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyPermissions.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyPermissions.java index 8894a41..51b7e43 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyPermissions.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; /** diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyQuotas.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyQuotas.java index bcfecf5..121bac9 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyQuotas.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyQuotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; /** diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportManager.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportManager.java index f471d2d..e2cd634 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportManager.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; import java.time.Instant; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportModeratorManager.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportModeratorManager.java index 608760f..ad67f53 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportModeratorManager.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserReportModeratorManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTagManager.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTagManager.java index b907809..bdae5e3 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTagManager.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTagManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; import java.time.Instant; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTexturesManager.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTexturesManager.java index 884401d..07e77a8 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTexturesManager.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/ParteyUserTexturesManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/businesslogic/model/Room.java b/partey/src/main/java/de/bstly/we/partey/businesslogic/model/Room.java index c3c9a64..eacda4d 100644 --- a/partey/src/main/java/de/bstly/we/partey/businesslogic/model/Room.java +++ b/partey/src/main/java/de/bstly/we/partey/businesslogic/model/Room.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.businesslogic.model; import lombok.Getter; diff --git a/partey/src/main/java/de/bstly/we/partey/controller/MapManagementController.java b/partey/src/main/java/de/bstly/we/partey/controller/MapManagementController.java index 3ea7f75..c81c3ac 100644 --- a/partey/src/main/java/de/bstly/we/partey/controller/MapManagementController.java +++ b/partey/src/main/java/de/bstly/we/partey/controller/MapManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.controller; import java.util.Optional; @@ -83,7 +80,7 @@ public class MapManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("{id}") - public void deleteParteyMap(@PathVariable("id") String id) { + public void deleteParteyMap(@PathVariable String id) { parteyMapManager.delete(id); } diff --git a/partey/src/main/java/de/bstly/we/partey/controller/UserReportManagementController.java b/partey/src/main/java/de/bstly/we/partey/controller/UserReportManagementController.java index c7a5c8f..4fead99 100644 --- a/partey/src/main/java/de/bstly/we/partey/controller/UserReportManagementController.java +++ b/partey/src/main/java/de/bstly/we/partey/controller/UserReportManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.controller; import java.time.Instant; @@ -73,7 +70,7 @@ public class UserReportManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("{id}") - public void deleteParteyUserReport(@PathVariable("id") Long id) { + public void deleteParteyUserReport(@PathVariable Long id) { parteyUserReportManager.delete(id); } diff --git a/partey/src/main/java/de/bstly/we/partey/controller/UserReportModeratorManagementController.java b/partey/src/main/java/de/bstly/we/partey/controller/UserReportModeratorManagementController.java index f4a8721..2c24d35 100644 --- a/partey/src/main/java/de/bstly/we/partey/controller/UserReportModeratorManagementController.java +++ b/partey/src/main/java/de/bstly/we/partey/controller/UserReportModeratorManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.controller; import java.util.Optional; @@ -74,7 +71,7 @@ public class UserReportModeratorManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("{id}") - public void deleteParteyUserReportModerator(@PathVariable("id") Long id) { + public void deleteParteyUserReportModerator(@PathVariable Long id) { parteyUserReportModeratorManager.delete(id); } diff --git a/partey/src/main/java/de/bstly/we/partey/controller/UserTagController.java b/partey/src/main/java/de/bstly/we/partey/controller/UserTagController.java index 358ab89..16ebd2e 100644 --- a/partey/src/main/java/de/bstly/we/partey/controller/UserTagController.java +++ b/partey/src/main/java/de/bstly/we/partey/controller/UserTagController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.controller; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/controller/UserTagManagementController.java b/partey/src/main/java/de/bstly/we/partey/controller/UserTagManagementController.java index dae8fb0..97b6cc0 100644 --- a/partey/src/main/java/de/bstly/we/partey/controller/UserTagManagementController.java +++ b/partey/src/main/java/de/bstly/we/partey/controller/UserTagManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.controller; import java.util.List; @@ -68,7 +65,7 @@ public class UserTagManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("{username}") - public List getParteyUserTagsForTarget(@PathVariable("username") String username) { + public List getParteyUserTagsForTarget(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -86,7 +83,7 @@ public class UserTagManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("{username}/active") - public List getNonExpiredParteyUserTagsForTarget(@PathVariable("username") String username) { + public List getNonExpiredParteyUserTagsForTarget(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { @@ -104,7 +101,7 @@ public class UserTagManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("{username}/upcoming") - public List getUpcomingParteyUserTagsForTarget(@PathVariable("username") String username) { + public List getUpcomingParteyUserTagsForTarget(@PathVariable String username) { User user = userManager.getByUsername(username); if (user == null) { diff --git a/partey/src/main/java/de/bstly/we/partey/model/GameRoomPolicyTypes.java b/partey/src/main/java/de/bstly/we/partey/model/GameRoomPolicyTypes.java index cf9c85c..f30eee2 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/GameRoomPolicyTypes.java +++ b/partey/src/main/java/de/bstly/we/partey/model/GameRoomPolicyTypes.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import com.fasterxml.jackson.annotation.JsonFormat; diff --git a/partey/src/main/java/de/bstly/we/partey/model/ParteyMap.java b/partey/src/main/java/de/bstly/we/partey/model/ParteyMap.java index 651d398..14b73ca 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/ParteyMap.java +++ b/partey/src/main/java/de/bstly/we/partey/model/ParteyMap.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReport.java b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReport.java index 144868d..b081b4b 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReport.java +++ b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReport.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import java.time.Instant; diff --git a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReportModerator.java b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReportModerator.java index 615857b..0cd075b 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReportModerator.java +++ b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserReportModerator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import jakarta.persistence.Column; diff --git a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTag.java b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTag.java index f661e00..a1ce954 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTag.java +++ b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTag.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import java.io.Serializable; diff --git a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTextures.java b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTextures.java index 6e2188e..33ab861 100644 --- a/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTextures.java +++ b/partey/src/main/java/de/bstly/we/partey/model/ParteyUserTextures.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.model; import java.util.List; diff --git a/partey/src/main/java/de/bstly/we/partey/repository/ParteyMapRepository.java b/partey/src/main/java/de/bstly/we/partey/repository/ParteyMapRepository.java index 2cb7b56..88f85a3 100755 --- a/partey/src/main/java/de/bstly/we/partey/repository/ParteyMapRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/repository/ParteyMapRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportModeratorRepository.java b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportModeratorRepository.java index 7adff03..af77fda 100644 --- a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportModeratorRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportModeratorRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportRepository.java b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportRepository.java index 1654f70..1ae263a 100644 --- a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserReportRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTagRepository.java b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTagRepository.java index b7ef6a5..f15da25 100644 --- a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTagRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTagRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTexturesRepository.java b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTexturesRepository.java index b7cbc8d..3d30496 100644 --- a/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTexturesRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/repository/ParteyUserTexturesRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/businesslogic/TimeslotManager.java b/partey/src/main/java/de/bstly/we/partey/timeslot/businesslogic/TimeslotManager.java index 04d181a..931f17c 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/businesslogic/TimeslotManager.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/businesslogic/TimeslotManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.businesslogic; import java.time.Instant; diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotController.java b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotController.java index 0a7a058..568663c 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotController.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.controller; import java.time.Instant; @@ -218,7 +215,7 @@ public class TimeslotController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("{id}") - public void deleteTimeslot(@PathVariable("id") Long id) { + public void deleteTimeslot(@PathVariable Long id) { Timeslot existing = timeslotManager.get(id); if (existing == null || !getCurrentUserId().equals(existing.getOwner())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotManagementController.java b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotManagementController.java index 9f80f97..26d335d 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotManagementController.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/TimeslotManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.controller; import java.time.Instant; @@ -106,7 +103,7 @@ public class TimeslotManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("{id}") - public void deleteTimeslot(@PathVariable("id") Long id) { + public void deleteTimeslot(@PathVariable Long id) { timeslotManager.delete(id); } diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/validation/TimeslotValidator.java b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/validation/TimeslotValidator.java index 015f2d7..c527a78 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/controller/validation/TimeslotValidator.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/controller/validation/TimeslotValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.controller.validation; import java.time.temporal.ChronoUnit; diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/model/Timeslot.java b/partey/src/main/java/de/bstly/we/partey/timeslot/model/Timeslot.java index 773c8e8..1dd1169 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/model/Timeslot.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/model/Timeslot.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.model; import java.time.Instant; diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/model/TimeslotType.java b/partey/src/main/java/de/bstly/we/partey/timeslot/model/TimeslotType.java index 013478a..85720cd 100644 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/model/TimeslotType.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/model/TimeslotType.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.model; /** diff --git a/partey/src/main/java/de/bstly/we/partey/timeslot/repository/TimeslotRepository.java b/partey/src/main/java/de/bstly/we/partey/timeslot/repository/TimeslotRepository.java index 9f2b6a0..fb930b1 100755 --- a/partey/src/main/java/de/bstly/we/partey/timeslot/repository/TimeslotRepository.java +++ b/partey/src/main/java/de/bstly/we/partey/timeslot/repository/TimeslotRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.partey.timeslot.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/pom.xml b/pom.xml index 7677d6b..620d894 100755 --- a/pom.xml +++ b/pom.xml @@ -14,21 +14,22 @@ 17 5.1.0 10.6 - 1.10.0 + 1.10.1 33.5.0-jre 1.6.6 1.7.1 - 1.82 + 2.8.0 + 1.83 2.2 1.14.1 3.6.3 - 3.7.0 + 4.0.0 org.springframework.boot spring-boot-starter-parent - 3.5.7 + 4.0.0 @@ -50,6 +51,7 @@ partey services urlshortener + webauthn wireguard \ No newline at end of file diff --git a/services/src/main/java/de/bstly/we/services/businesslogic/ServiceManager.java b/services/src/main/java/de/bstly/we/services/businesslogic/ServiceManager.java index 202849c..db6b079 100644 --- a/services/src/main/java/de/bstly/we/services/businesslogic/ServiceManager.java +++ b/services/src/main/java/de/bstly/we/services/businesslogic/ServiceManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.services.businesslogic; import java.util.List; diff --git a/services/src/main/java/de/bstly/we/services/controller/ServiceController.java b/services/src/main/java/de/bstly/we/services/controller/ServiceController.java index 1ec387d..4c599da 100644 --- a/services/src/main/java/de/bstly/we/services/controller/ServiceController.java +++ b/services/src/main/java/de/bstly/we/services/controller/ServiceController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.services.controller; import java.util.List; diff --git a/services/src/main/java/de/bstly/we/services/controller/ServiceManagementController.java b/services/src/main/java/de/bstly/we/services/controller/ServiceManagementController.java index a0ebe80..1730613 100644 --- a/services/src/main/java/de/bstly/we/services/controller/ServiceManagementController.java +++ b/services/src/main/java/de/bstly/we/services/controller/ServiceManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.services.controller; import java.util.Optional; diff --git a/services/src/main/java/de/bstly/we/services/model/Service.java b/services/src/main/java/de/bstly/we/services/model/Service.java index 2ffac57..4c23e53 100644 --- a/services/src/main/java/de/bstly/we/services/model/Service.java +++ b/services/src/main/java/de/bstly/we/services/model/Service.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.services.model; import jakarta.persistence.Column; diff --git a/services/src/main/java/de/bstly/we/services/repository/ServiceRepository.java b/services/src/main/java/de/bstly/we/services/repository/ServiceRepository.java index 301380a..caec6c2 100644 --- a/services/src/main/java/de/bstly/we/services/repository/ServiceRepository.java +++ b/services/src/main/java/de/bstly/we/services/repository/ServiceRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.services.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlManager.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlManager.java index 4dbf97e..57dffef 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlManager.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlManager.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.businesslogic; import java.time.Instant; diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlPermissions.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlPermissions.java index 46c2e92..a8366ae 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlPermissions.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlPermissions.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.businesslogic; /** diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlQuotas.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlQuotas.java index d7b8e96..520926f 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlQuotas.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/businesslogic/ShortenedUrlQuotas.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.businesslogic; /** diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlController.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlController.java index 91c4814..856dee7 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlController.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.controller; import java.io.IOException; @@ -73,7 +70,7 @@ public class ShortenedUrlController extends BaseController { * @throws IOException Signals that an I/O exception has occurred. */ @GetMapping("/{code}") - public void getShortenedUrlLink(@PathVariable("code") String code, HttpServletRequest request, + public void getShortenedUrlLink(@PathVariable String code, HttpServletRequest request, HttpServletResponse response) throws IOException { ShortenedUrl shortenedUrl = shortenedUrlManager.get(code); @@ -114,7 +111,7 @@ public class ShortenedUrlController extends BaseController { * @throws IOException Signals that an I/O exception has occurred. */ @PostMapping("/{code}") - public void getProtectedShortenedUrlLink(@PathVariable("code") String code, + public void getProtectedShortenedUrlLink(@PathVariable String code, @ModelAttribute("password") String password, HttpServletRequest request, HttpServletResponse response) throws IOException { ShortenedUrl shortenedUrl = shortenedUrlManager.get(code); @@ -193,7 +190,7 @@ public class ShortenedUrlController extends BaseController { */ @PreAuthorize("isAuthenticated()") @GetMapping("/model/{code}") - public ShortenedUrl getShortenedUrl(@PathVariable("code") String code) { + public ShortenedUrl getShortenedUrl(@PathVariable String code) { ShortenedUrl shortenedUrl = shortenedUrlManager.get(code); if (shortenedUrl == null) { throw new EntityResponseStatusException(HttpStatus.NO_CONTENT); @@ -340,7 +337,7 @@ public class ShortenedUrlController extends BaseController { */ @PreAuthorize("isAuthenticated()") @DeleteMapping("/{code}") - public void deleteShortenedUrl(@PathVariable("code") String code) { + public void deleteShortenedUrl(@PathVariable String code) { if (!permissionManager.hasPermission(getCurrentUserId(), ShortenedUrlPermissions.URL_SHORTENER)) { shortenedUrlManager.deleteAll(getCurrentUserId(), true); throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlManagementController.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlManagementController.java index 326626f..6f4c2c0 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlManagementController.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/ShortenedUrlManagementController.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.controller; import java.util.Optional; @@ -70,7 +67,7 @@ public class ShortenedUrlManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/{code}") - public void deleteShortenedUrl(@PathVariable("code") String code, @RequestParam("quota") Optional quota) { + public void deleteShortenedUrl(@PathVariable String code, @RequestParam("quota") Optional quota) { ShortenedUrl shortenedUrl = shortenedUrlManager.get(code); if (shortenedUrl == null) { @@ -88,7 +85,7 @@ public class ShortenedUrlManagementController extends BaseController { */ @PreAuthorize("hasRole('ROLE_ADMIN')") @DeleteMapping("/all/{owner}") - public void deleteAll(@PathVariable("owner") Long owner, @RequestParam("quota") Optional quota) { + public void deleteAll(@PathVariable Long owner, @RequestParam("quota") Optional quota) { shortenedUrlManager.deleteAll(owner, quota.isPresent() && quota.get().booleanValue()); } diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/model/ShortenedUrlModel.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/model/ShortenedUrlModel.java index bc067b7..7d20032 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/model/ShortenedUrlModel.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/model/ShortenedUrlModel.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.controller.model; import java.time.Instant; diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/validation/ShortenedUrlModelValidator.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/validation/ShortenedUrlModelValidator.java index 8d9a60a..5d7381d 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/validation/ShortenedUrlModelValidator.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/controller/validation/ShortenedUrlModelValidator.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.controller.validation; import java.time.Instant; diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/model/ShortenedUrl.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/model/ShortenedUrl.java index b44678e..e7ebcc8 100644 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/model/ShortenedUrl.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/model/ShortenedUrl.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.model; import java.time.Instant; diff --git a/urlshortener/src/main/java/de/bstly/we/urlshortener/repository/ShortenedUrlRepository.java b/urlshortener/src/main/java/de/bstly/we/urlshortener/repository/ShortenedUrlRepository.java index 052af00..7873a89 100755 --- a/urlshortener/src/main/java/de/bstly/we/urlshortener/repository/ShortenedUrlRepository.java +++ b/urlshortener/src/main/java/de/bstly/we/urlshortener/repository/ShortenedUrlRepository.java @@ -1,6 +1,3 @@ -/** - * - */ package de.bstly.we.urlshortener.repository; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/webauthn/pom.xml b/webauthn/pom.xml new file mode 100644 index 0000000..4876948 --- /dev/null +++ b/webauthn/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + de.bstly.we + webstly-main + ${revision} + + webauthn + webauthn + + + + de.bstly.we + webstly-core + ${revision} + + + com.yubico + webauthn-server-core + ${webauthn-server-core.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + + + org.projectlombok + lombok + true + + + diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/WebAuthnConfiguration.java b/webauthn/src/main/java/de/bstly/we/webauthn/WebAuthnConfiguration.java new file mode 100644 index 0000000..0c27c03 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/WebAuthnConfiguration.java @@ -0,0 +1,44 @@ +package de.bstly.we.webauthn; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.yubico.webauthn.RelyingParty; +import com.yubico.webauthn.data.RelyingPartyIdentity; + +import de.bstly.we.webauthn.businesslogic.WebAuthnCredentialRepositoryManager; + +@Configuration +public class WebAuthnConfiguration { + + @Value("${webauthn.rp.id:localhost}") + private String rpId; + + @Value("${webauthn.rp.name:we.bstly}") + private String rpName; + + @Value("${webauthn.rp.origins:http://localhost:4200}") + private List origins; + + @Bean + public RelyingParty relyingParty(WebAuthnCredentialRepositoryManager credentialRepository) { + RelyingPartyIdentity rpIdentity = RelyingPartyIdentity.builder() + .id(rpId) + .name(rpName) + .build(); + + Set originsSet = new HashSet<>(origins); + + return RelyingParty.builder() + .identity(rpIdentity) + .credentialRepository(credentialRepository) + .origins(originsSet) + .build(); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnCredentialRepositoryManager.java b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnCredentialRepositoryManager.java new file mode 100644 index 0000000..31a9ec6 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnCredentialRepositoryManager.java @@ -0,0 +1,121 @@ +package de.bstly.we.webauthn.businesslogic; + +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.yubico.webauthn.CredentialRepository; +import com.yubico.webauthn.RegisteredCredential; +import com.yubico.webauthn.data.ByteArray; +import com.yubico.webauthn.data.PublicKeyCredentialDescriptor; + +import de.bstly.we.businesslogic.UserManager; +import de.bstly.we.model.User; +import de.bstly.we.webauthn.model.WebAuthnCredential; +import de.bstly.we.webauthn.model.WebAuthnUserHandle; +import de.bstly.we.webauthn.repository.WebAuthnCredentialRepository; +import de.bstly.we.webauthn.repository.WebAuthnUserHandleRepository; + +@Component +public class WebAuthnCredentialRepositoryManager implements CredentialRepository { + + @Autowired + private WebAuthnCredentialRepository credentialRepository; + @Autowired + private WebAuthnUserHandleRepository webAuthnUserHandleRepository; + @Autowired + private UserManager userManager; + + @Override + public Set getCredentialIdsForUsername(String username) { + User user = userManager.getByUsername(username); + if (user == null) { + return Set.of(); + } + + return credentialRepository.findByTarget(user.getId()).stream().map(c -> { + try { + return PublicKeyCredentialDescriptor.builder() + .id(ByteArray.fromBase64Url(c.getCredentialId())) + .build(); + } catch (Exception e) { + throw new RuntimeException("Failed to parse credential ID", e); + } + }).collect(Collectors.toSet()); + } + + @Override + public Optional getUserHandleForUsername(String username) { + User user = userManager.getByUsername(username); + + if (user == null) { + return Optional.empty(); + } + + WebAuthnUserHandle webAuthnUserHandle = webAuthnUserHandleRepository.findByTarget(user.getId()); + + if (webAuthnUserHandle == null) { + return Optional.empty(); + } + + try { + return Optional.of(ByteArray.fromBase64Url(webAuthnUserHandle.getUserHandle())); + } catch (Exception e) { + throw new RuntimeException("Failed to parse user handle", e); + } + } + + @Override + public Optional getUsernameForUserHandle(ByteArray userHandle) { + WebAuthnUserHandle webAuthnUserHandle = webAuthnUserHandleRepository + .findByUserHandle(userHandle.getBase64Url()); + + if (webAuthnUserHandle == null) { + return Optional.empty(); + } + + User user = userManager.get(webAuthnUserHandle.getTarget()); + + if (user == null) { + return Optional.empty(); + } + + return Optional.of(user.getUsername()); + } + + @Override + public Optional lookup(ByteArray credentialId, ByteArray userHandle) { + WebAuthnCredential credential = credentialRepository.findByCredentialId(credentialId.getBase64Url()); + + if (credential == null) { + return Optional.empty(); + } + + return Optional.of(RegisteredCredential.builder() + .credentialId(credential.getCredentialIdBytes()) + .userHandle(credential.getUserHandleBytes()) + .publicKeyCose(credential.getPublicKeyBytes()) + .signatureCount(credential.getSignatureCount()) + .build()); + } + + @Override + public Set lookupAll(ByteArray credentialId) { + WebAuthnCredential credential = credentialRepository.findByCredentialId(credentialId.getBase64Url()); + + if (credential == null) { + return Set.of(); + } + + return Set.of(RegisteredCredential.builder() + .credentialId(credential.getCredentialIdBytes()) + .userHandle(credential.getUserHandleBytes()) + .publicKeyCose(credential.getPublicKeyBytes()) + .signatureCount(credential.getSignatureCount()) + .build()); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnManager.java b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnManager.java new file mode 100644 index 0000000..7164d87 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnManager.java @@ -0,0 +1,422 @@ +package de.bstly.we.webauthn.businesslogic; + +import java.security.SecureRandom; +import java.time.Instant; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.beust.jcommander.internal.Lists; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.yubico.webauthn.AssertionRequest; +import com.yubico.webauthn.AssertionResult; +import com.yubico.webauthn.FinishAssertionOptions; +import com.yubico.webauthn.FinishRegistrationOptions; +import com.yubico.webauthn.RegistrationResult; +import com.yubico.webauthn.RelyingParty; +import com.yubico.webauthn.StartAssertionOptions; +import com.yubico.webauthn.StartRegistrationOptions; +import com.yubico.webauthn.data.AuthenticatorAssertionResponse; +import com.yubico.webauthn.data.AuthenticatorAttachment; +import com.yubico.webauthn.data.AuthenticatorAttestationResponse; +import com.yubico.webauthn.data.AuthenticatorSelectionCriteria; +import com.yubico.webauthn.data.ByteArray; +import com.yubico.webauthn.data.ClientAssertionExtensionOutputs; +import com.yubico.webauthn.data.ClientRegistrationExtensionOutputs; +import com.yubico.webauthn.data.PublicKeyCredential; +import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions; +import com.yubico.webauthn.data.PublicKeyCredentialDescriptor; +import com.yubico.webauthn.data.PublicKeyCredentialRequestOptions; +import com.yubico.webauthn.data.ResidentKeyRequirement; +import com.yubico.webauthn.data.UserIdentity; +import com.yubico.webauthn.data.UserVerificationRequirement; +import com.yubico.webauthn.exception.RegistrationFailedException; + +import de.bstly.we.businesslogic.UserDataProvider; +import de.bstly.we.businesslogic.UserManager; +import de.bstly.we.model.User; +import de.bstly.we.model.UserData; +import de.bstly.we.webauthn.model.WebAuthnChallenge; +import de.bstly.we.webauthn.model.WebAuthnCredential; +import de.bstly.we.webauthn.model.WebAuthnUsage; +import de.bstly.we.webauthn.model.WebAuthnUserHandle; +import de.bstly.we.webauthn.repository.WebAuthnChallengeRepository; +import de.bstly.we.webauthn.repository.WebAuthnCredentialRepository; +import de.bstly.we.webauthn.repository.WebAuthnUserHandleRepository; + +@Component +public class WebAuthnManager implements UserDataProvider { + + @Autowired + private WebAuthnCredentialRepository credentialRepository; + @Autowired + private WebAuthnChallengeRepository challengeRepository; + @Autowired + private WebAuthnUserHandleRepository webAuthnUserHandleRepository; + @Autowired + private UserManager userManager; + @Autowired + private RelyingParty relyingParty; + + private ObjectMapper objectMapper = new ObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, + false).setDefaultPropertyInclusion(Include.NON_ABSENT).registerModule(new Jdk8Module()); + + public List getAllCredentials(Long userId) { + return credentialRepository.findByTarget(userId); + } + + public WebAuthnCredential updateNickname(Long credentialId, Long userId, String nickname) { + Optional credential = credentialRepository.findById(credentialId); + if (credential.isPresent() && credential.get().getTarget().equals(userId)) { + credential.get().setNickname(nickname); + return credentialRepository.save(credential.get()); + } + return null; + } + + public WebAuthnCredential updateUsage(Long credentialId, Long userId, String usage) { + Optional credential = credentialRepository.findById(credentialId); + if (credential.isPresent() && credential.get().getTarget().equals(userId)) { + try { + WebAuthnUsage usageEnum = WebAuthnUsage.valueOf(usage); + credential.get().setUsage(usageEnum); + return credentialRepository.save(credential.get()); + } catch (IllegalArgumentException e) { + // Invalid usage value + return null; + } + } + return null; + } + + public boolean deleteCredential(Long credentialId, Long userId) { + Optional credential = credentialRepository.findById(credentialId); + if (credential.isPresent() && credential.get().getTarget().equals(userId)) { + credentialRepository.delete(credential.get()); + return true; + } + return false; + } + + public PublicKeyCredentialCreationOptions startRegistration(Long userId) { + User user = userManager.get(userId); + ByteArray userHandle = getUserHandle(userId); + + UserIdentity userIdentity = UserIdentity.builder() + .name(user.getUsername()) + .displayName(user.getUsername()) + .id(userHandle) + .build(); + + StartRegistrationOptions.StartRegistrationOptionsBuilder optionsBuilder = StartRegistrationOptions.builder() + .user(userIdentity); + + optionsBuilder + .authenticatorSelection(AuthenticatorSelectionCriteria.builder() + .authenticatorAttachment( + Optional.of(AuthenticatorAttachment.CROSS_PLATFORM)) + .residentKey(ResidentKeyRequirement.PREFERRED) + .userVerification(UserVerificationRequirement.PREFERRED) + .build()); + + PublicKeyCredentialCreationOptions request; + try { + request = relyingParty.startRegistration(optionsBuilder.build()); + + WebAuthnChallenge challenge = new WebAuthnChallenge(); + challenge.setUserId(userId); + challenge.setChallenge(request.getChallenge().getBase64Url()); + challenge.setType("registration"); + challenge.setCreatedAt(Instant.now()); + challenge.setExpiresAt(Instant.now().plusSeconds(300)); // 5 minutes + challenge.setRequestJson(request.toJson()); + challengeRepository.save(challenge); + + return request; + } catch (Exception e) { + throw new RuntimeException("Failed to start WebAuthn registration", e); + } + } + + public WebAuthnCredential finishRegistration(Long userId, String credentialJson, String nickname) + throws RegistrationFailedException { + try { + PublicKeyCredential pkc = PublicKeyCredential + .parseRegistrationResponseJson(credentialJson.toString()); + + JsonNode response = objectMapper.readTree(credentialJson).get("response"); + JsonNode clientDataJSON = objectMapper + .readTree(ByteArray.fromBase64Url(response.get("clientDataJSON").asText()).getBytes()); + ByteArray challenge; + try { + challenge = ByteArray.fromBase64Url(clientDataJSON.get("challenge").asText()); + } catch (Exception e) { + throw new RegistrationFailedException(new IllegalArgumentException("Invalid challenge format")); + } + + WebAuthnChallenge storedChallenge = challengeRepository.findByUserIdAndChallengeAndTypeAndExpiresAtAfter( + userId, challenge.getBase64Url(), "registration", Instant.now()); + + if (storedChallenge == null) { + throw new RegistrationFailedException(new IllegalArgumentException("Challenge not found or expired")); + } + + PublicKeyCredentialCreationOptions originalRequest = PublicKeyCredentialCreationOptions + .fromJson(storedChallenge.getRequestJson()); + + RegistrationResult result = relyingParty.finishRegistration(FinishRegistrationOptions.builder() + .request(originalRequest) + .response(pkc) + .build()); + + WebAuthnCredential credential = new WebAuthnCredential(); + credential.setTarget(userId); + credential.setCredentialIdBytes(result.getKeyId().getId()); + credential.setPublicKeyBytes(result.getPublicKeyCose()); + credential.setUserHandleBytes(getUserHandle(userId)); + credential.setSignatureCount(result.getSignatureCount()); + credential.setNickname(nickname); + credential.setCreatedAt(Instant.now()); + credential.setEnabled(true); + + credentialRepository.save(credential); + challengeRepository.delete(storedChallenge); + + return credential; + } catch (Exception e) { + throw new RegistrationFailedException(new IllegalArgumentException(e.getMessage())); + } + } + + public String createRequest(Long userId, WebAuthnUsage usage) { + try { + User user = userManager.get(userId); + List credentials = credentialRepository.findByTarget(userId); + credentials = credentials.stream() + .filter(c -> c.getUsage() == usage && c.isEnabled()) + .collect(Collectors.toList()); + + if (credentials.isEmpty()) { + throw new RuntimeException("No credentials found for user"); + } + + StartAssertionOptions.StartAssertionOptionsBuilder optionsBuilder = StartAssertionOptions.builder() + .username(user.getUsername()) + .userVerification(UserVerificationRequirement.REQUIRED); + + AssertionRequest request = relyingParty.startAssertion(optionsBuilder.build()); + + // Filter allowCredentials to only include credentials of this type + List allowCredentials = credentials.stream() + .map(c -> { + try { + return PublicKeyCredentialDescriptor.builder() + .id(ByteArray.fromBase64Url(c.getCredentialId())) + .build(); + } catch (Exception e) { + throw new RuntimeException("Failed to parse credential ID", e); + } + }) + .collect(Collectors.toList()); + + PublicKeyCredentialRequestOptions filteredOptions = request.getPublicKeyCredentialRequestOptions() + .toBuilder() + .allowCredentials(allowCredentials) + .build(); + + AssertionRequest filteredRequest = AssertionRequest.builder() + .publicKeyCredentialRequestOptions(filteredOptions) + .username(request.getUsername()) + .build(); + + WebAuthnChallenge challenge = new WebAuthnChallenge(); + challenge.setUserId(userId); + challenge + .setChallenge(filteredRequest.getPublicKeyCredentialRequestOptions().getChallenge().getBase64Url()); + challenge.setType("authentication"); + challenge.setCreatedAt(Instant.now()); + challenge.setExpiresAt(Instant.now().plusSeconds(300)); // 5 minutes + challenge.setRequestJson(filteredRequest.toJson()); + challengeRepository.save(challenge); + + return filteredRequest.toCredentialsGetJson(); + } catch (Exception e) { + throw new RuntimeException("Failed to generate WebAuthn challenge", e); + } + } + + /** + * Creates a WebAuthn login request that does not depend on the username. + * + * This avoids username enumeration and allows resolving the user from the + * returned credentialId during the finish step. + */ + public String createLoginRequest() { + try { + StartAssertionOptions.StartAssertionOptionsBuilder optionsBuilder = StartAssertionOptions.builder() + .userVerification(UserVerificationRequirement.PREFERRED); + + AssertionRequest request = relyingParty.startAssertion(optionsBuilder.build()); + + WebAuthnChallenge challenge = new WebAuthnChallenge(); + challenge.setUserId(-1L); + challenge.setChallenge(request.getPublicKeyCredentialRequestOptions().getChallenge().getBase64Url()); + challenge.setType("login"); + challenge.setCreatedAt(Instant.now()); + challenge.setExpiresAt(Instant.now().plusSeconds(300)); // 5 minutes + challenge.setRequestJson(request.toJson()); + challengeRepository.save(challenge); + + return request.toCredentialsGetJson(); + } catch (Exception e) { + throw new RuntimeException("Failed to generate WebAuthn login challenge", e); + } + } + + /** + * Validates a WebAuthn login assertion where the user is resolved from the + * credentialId contained in the assertion. + * + * @return the authenticated userId if successful, otherwise empty. + */ + public Optional validateLoginRequest(String assertionJson) { + try { + JsonNode assertionNode = objectMapper.readTree(assertionJson); + PublicKeyCredential pkc = PublicKeyCredential + .parseAssertionResponseJson(assertionJson); + + ByteArray credentialId = pkc.getId(); + WebAuthnCredential credential = credentialRepository.findByCredentialId(credentialId.getBase64Url()); + if (credential == null || !credential.isEnabled() || credential.getUsage() != WebAuthnUsage.LOGIN) { + return Optional.empty(); + } + + String clientDataBase64 = assertionNode.get("response").get("clientDataJSON").asText(); + ByteArray clientDataBytes = ByteArray.fromBase64Url(clientDataBase64); + JsonNode clientData = objectMapper.readTree(clientDataBytes.getBytes()); + String challengeBase64 = clientData.get("challenge").asText(); + + WebAuthnChallenge storedChallenge = challengeRepository + .findByUserIdAndChallengeAndTypeAndExpiresAtAfter(-1L, challengeBase64, + "login", Instant.now()); + if (storedChallenge == null) { + return Optional.empty(); + } + + AssertionRequest originalRequest = AssertionRequest.fromJson(storedChallenge.getRequestJson()); + AssertionResult result = relyingParty.finishAssertion(FinishAssertionOptions.builder() + .request(originalRequest) + .response(pkc) + .build()); + + if (!result.isSuccess()) { + return Optional.empty(); + } + + credential.setSignatureCount(result.getSignatureCount()); + credential.setLastUsedAt(Instant.now()); + credentialRepository.save(credential); + challengeRepository.delete(storedChallenge); + return Optional.ofNullable(credential.getTarget()); + } catch (Exception e) { + return Optional.empty(); + } + } + + public boolean validateRequest(String assertionJson, WebAuthnUsage usage) { + try { + JsonNode assertionNode = objectMapper.readTree(assertionJson); + + PublicKeyCredential pkc = PublicKeyCredential + .parseAssertionResponseJson(assertionJson); + + ByteArray credentialId = pkc.getId(); + WebAuthnCredential credential = credentialRepository.findByCredentialId(credentialId.getBase64Url()); + + if (credential == null || !credential.isEnabled() + || (credential.getUsage() != usage)) { + return false; + } + + Long userId = credential.getTarget(); + + String clientDataBase64 = assertionNode.get("response").get("clientDataJSON").asText(); + ByteArray clientDataBytes = ByteArray.fromBase64Url(clientDataBase64); + JsonNode clientData = objectMapper.readTree(clientDataBytes.getBytes()); + String challengeBase64 = clientData.get("challenge").asText(); + + WebAuthnChallenge storedChallenge = challengeRepository + .findByUserIdAndChallengeAndTypeAndExpiresAtAfter(userId, challengeBase64, + "authentication", Instant.now()); + + if (storedChallenge == null) { + return false; + } + + AssertionRequest filteredRequest = AssertionRequest.fromJson(storedChallenge.getRequestJson()); + + AssertionResult result = relyingParty.finishAssertion(FinishAssertionOptions.builder() + .request(filteredRequest) + .response(pkc).build()); + + if (result.isSuccess()) { + credential.setSignatureCount(result.getSignatureCount()); + credential.setLastUsedAt(Instant.now()); + credentialRepository.save(credential); + challengeRepository.delete(storedChallenge); + return true; + } + + } catch (Exception e) { + throw new RuntimeException("Failed to generate WebAuthn challenge", e); + } + + return false; + } + + public ByteArray getUserHandle(Long userId) { + WebAuthnUserHandle webAuthnUserHandle = webAuthnUserHandleRepository.findByTarget(userId); + + if (webAuthnUserHandle == null) { + ByteArray userHandle = new ByteArray(new SecureRandom().generateSeed(32)); + webAuthnUserHandle = new WebAuthnUserHandle(userId, userHandle.getBase64Url()); + webAuthnUserHandleRepository.save(webAuthnUserHandle); + } + + try { + return ByteArray.fromBase64Url(webAuthnUserHandle.getUserHandle()); + } catch (Exception e) { + throw new RuntimeException("Failed to parse user handle", e); + } + } + + @Override + public String getId() { + return "webauthn-credentials"; + } + + @Override + public List getUserData(Long userId) { + List result = Lists.newArrayList(); + Iterator items = credentialRepository.findByTarget(userId).iterator(); + while (items.hasNext()) { + result.add(items.next()); + } + + return result; + } + + @Override + public void purgeUserData(Long userId) { + credentialRepository.deleteAll(credentialRepository.findByTarget(userId)); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnSecondFactorRequestProvider.java b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnSecondFactorRequestProvider.java new file mode 100644 index 0000000..ee55a98 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/businesslogic/WebAuthnSecondFactorRequestProvider.java @@ -0,0 +1,93 @@ +package de.bstly.we.webauthn.businesslogic; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.bstly.we.model.UserData; +import de.bstly.we.security.businesslogic.SecondFactorRequestProvider; +import de.bstly.we.webauthn.model.QWebAuthnCredential; +import de.bstly.we.webauthn.model.WebAuthnCredential; +import de.bstly.we.webauthn.model.WebAuthnUsage; +import de.bstly.we.webauthn.repository.WebAuthnCredentialRepository; + +@Component +public class WebAuthnSecondFactorRequestProvider implements SecondFactorRequestProvider { + + @Autowired + private WebAuthnCredentialRepository credentialRepository; + @Autowired + private WebAuthnManager webAuthnManager; + + protected QWebAuthnCredential qCredential = QWebAuthnCredential.webAuthnCredential; + + @Override + public String getId() { + return "webauthn"; + } + + @Override + public boolean supports(String provider) { + return getId().equals(provider); + } + + @Override + public boolean isEnabled(Long userId) { + return credentialRepository.exists(qCredential.target.eq(userId) + .and(qCredential.enabled.isTrue()) + .and(qCredential.usage.eq(WebAuthnUsage.TWO_FA))); + } + + @Override + public Object request(Long userId) { + return webAuthnManager.createRequest(userId, WebAuthnUsage.TWO_FA); + } + + @Override + public boolean validate(Long userId, String assertionJson) { + return webAuthnManager.validateRequest(assertionJson, WebAuthnUsage.TWO_FA); + } + + @Override + public WebAuthnCredential get(Long userId) { + List credentials = credentialRepository.findByTarget(userId); + // Filter for 2FA usage + return credentials.stream() + .filter(c -> c.getUsage() == WebAuthnUsage.TWO_FA) + .findFirst() + .orElse(null); + } + + @Override + public WebAuthnCredential create(Long userId) { + // not used, handled by WebAuthnManager + return null; + } + + @Override + public boolean enable(Long userId, String credentialJson) { + // not used, handled by WebAuthnManager + return true; + } + + @Override + public void delete(Long userId) { + // handled by WebAuthnManager + } + + /* + * @see de.bstly.we.businesslogic.UserDataProvider#getUserData(java.lang.Long) + */ + @Override + public List getUserData(Long userId) { + // handled by WebAuthnManager + return List.of(); + } + + @Override + public void purgeUserData(Long userId) { + // handled by WebAuthnManager + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnController.java b/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnController.java new file mode 100644 index 0000000..02b0f5e --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnController.java @@ -0,0 +1,87 @@ +package de.bstly.we.webauthn.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.yubico.webauthn.data.PublicKeyCredentialCreationOptions; + +import de.bstly.we.controller.BaseController; +import de.bstly.we.controller.support.EntityResponseStatusException; +import de.bstly.we.webauthn.businesslogic.WebAuthnManager; +import de.bstly.we.webauthn.controller.model.RegistrationFinishRequest; +import de.bstly.we.webauthn.model.WebAuthnCredential; + +@RestController +@RequestMapping("/auth/webauthn") +public class WebAuthnController extends BaseController { + + @Autowired + private WebAuthnManager webAuthnManager; + + @PreAuthorize("authentication.authenticated") + @GetMapping + public List getCredentials() { + Long userId = getCurrentUserId(); + return webAuthnManager.getAllCredentials(userId); + } + + @PreAuthorize("authentication.authenticated") + @DeleteMapping("/{id}") + public void deleteCredential(@PathVariable Long id) { + Long userId = getCurrentUserId(); + if (!webAuthnManager.deleteCredential(id, userId)) { + throw new EntityResponseStatusException(HttpStatus.NOT_FOUND); + } + } + + @PreAuthorize("authentication.authenticated") + @PatchMapping("/{id}/nickname") + public WebAuthnCredential updateNickname(@PathVariable Long id, @RequestBody String nickname) { + Long userId = getCurrentUserId(); + WebAuthnCredential credential = webAuthnManager.updateNickname(id, userId, nickname); + if (credential == null) { + throw new EntityResponseStatusException(HttpStatus.NOT_FOUND); + } + return credential; + } + + @PreAuthorize("authentication.authenticated") + @PatchMapping("/{id}/usage") + public WebAuthnCredential updateUsage(@PathVariable Long id, @RequestBody String usage) { + Long userId = getCurrentUserId(); + WebAuthnCredential credential = webAuthnManager.updateUsage(id, userId, usage); + if (credential == null) { + throw new EntityResponseStatusException(HttpStatus.NOT_FOUND); + } + return credential; + } + + @PreAuthorize("authentication.authenticated") + @PostMapping("/register/start") + public PublicKeyCredentialCreationOptions startSecurityKeyRegistration() { + Long userId = getCurrentUserId(); + return webAuthnManager.startRegistration(userId); + } + + @PreAuthorize("authentication.authenticated") + @PostMapping("/register/finish") + public WebAuthnCredential finishRegistration(@RequestBody RegistrationFinishRequest request) { + Long userId = getCurrentUserId(); + try { + return webAuthnManager.finishRegistration(userId, request.getCredential(), request.getNickname()); + } catch (Exception e) { + throw new EntityResponseStatusException(HttpStatus.BAD_REQUEST); + } + } +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnLoginController.java b/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnLoginController.java new file mode 100644 index 0000000..5081758 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/controller/WebAuthnLoginController.java @@ -0,0 +1,22 @@ +package de.bstly.we.webauthn.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import de.bstly.we.webauthn.businesslogic.WebAuthnManager; + +@RestController +@RequestMapping("/auth/webauthn/login/start") +public class WebAuthnLoginController { + + @Autowired + private WebAuthnManager webAuthnManager; + + @PostMapping() + public String startLogin() { + return webAuthnManager.createLoginRequest(); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/controller/model/RegistrationFinishRequest.java b/webauthn/src/main/java/de/bstly/we/webauthn/controller/model/RegistrationFinishRequest.java new file mode 100644 index 0000000..4831b53 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/controller/model/RegistrationFinishRequest.java @@ -0,0 +1,17 @@ +package de.bstly.we.webauthn.controller.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class RegistrationFinishRequest { + + private String credential; + private String nickname; + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnChallenge.java b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnChallenge.java new file mode 100644 index 0000000..b06beaa --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnChallenge.java @@ -0,0 +1,49 @@ +package de.bstly.we.webauthn.model; + +import java.time.Instant; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "webauthn_challenges") +@Getter +@Setter +public class WebAuthnChallenge { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "user_id", nullable = false) + private Long userId; + + @Column(name = "challenge", nullable = false, length = 512) + private String challenge; + + @Column(name = "type", nullable = false) + private String type; + + @Column(name = "created_at", nullable = false) + private Instant createdAt; + + @Column(name = "expires_at", nullable = false) + private Instant expiresAt; + + @Lob + @Column(name = "request_json", nullable = false, length = 100000) + private String requestJson; + + public boolean isExpired() { + return Instant.now().isAfter(expiresAt); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnCredential.java b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnCredential.java new file mode 100644 index 0000000..bfdeb9c --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnCredential.java @@ -0,0 +1,97 @@ +package de.bstly.we.webauthn.model; + +import java.time.Instant; + +import com.yubico.webauthn.data.ByteArray; + +import de.bstly.we.model.SecondFactor; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "webauthn_credentials") +@Getter +@Setter +public class WebAuthnCredential implements SecondFactor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "target", nullable = false) + private Long target; + + @Column(name = "enabled", nullable = false) + private boolean enabled = true; + + @Enumerated(EnumType.STRING) + @Column(name = "credential_usage", nullable = false) + private WebAuthnUsage usage = WebAuthnUsage.NONE; + + @Column(name = "credential_id", nullable = false, unique = true, length = 1024) + private String credentialId; + + @Column(name = "public_key", nullable = false, length = 1024) + private String publicKey; + + @Column(name = "user_handle", nullable = false, length = 64) + private String userHandle; + + @Column(name = "signature_count", nullable = false) + private long signatureCount; + + @Column(name = "nickname") + private String nickname; + + @Column(name = "created_at", nullable = false) + private Instant createdAt; + + @Column(name = "last_used_at") + private Instant lastUsedAt; + + public ByteArray getCredentialIdBytes() { + try { + return ByteArray.fromBase64Url(credentialId); + } catch (Exception e) { + throw new RuntimeException("Failed to decode credential ID", e); + } + } + + public void setCredentialIdBytes(ByteArray credentialId) { + this.credentialId = credentialId.getBase64Url(); + } + + public ByteArray getPublicKeyBytes() { + try { + return ByteArray.fromBase64Url(publicKey); + } catch (Exception e) { + throw new RuntimeException("Failed to decode public key", e); + } + } + + public void setPublicKeyBytes(ByteArray publicKey) { + this.publicKey = publicKey.getBase64Url(); + } + + public ByteArray getUserHandleBytes() { + try { + return ByteArray.fromBase64Url(userHandle); + } catch (Exception e) { + throw new RuntimeException("Failed to decode user handle", e); + } + } + + public void setUserHandleBytes(ByteArray userHandle) { + this.userHandle = userHandle.getBase64Url(); + } + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUsage.java b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUsage.java new file mode 100644 index 0000000..853f97f --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUsage.java @@ -0,0 +1,5 @@ +package de.bstly.we.webauthn.model; + +public enum WebAuthnUsage { + NONE, TWO_FA, LOGIN +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUserHandle.java b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUserHandle.java new file mode 100644 index 0000000..5006c6f --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/model/WebAuthnUserHandle.java @@ -0,0 +1,26 @@ +package de.bstly.we.webauthn.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "webauthn_userhandle_mapping") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class WebAuthnUserHandle { + + @Id + @Column(name = "target") + private Long target; + + @Column(name = "user_handle", nullable = false, length = 64) + private String userHandle; +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnChallengeRepository.java b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnChallengeRepository.java new file mode 100644 index 0000000..f22f7d3 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnChallengeRepository.java @@ -0,0 +1,20 @@ +package de.bstly.we.webauthn.repository; + +import java.time.Instant; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.stereotype.Repository; + +import de.bstly.we.webauthn.model.WebAuthnChallenge; + +@Repository +public interface WebAuthnChallengeRepository + extends JpaRepository, QuerydslPredicateExecutor { + + WebAuthnChallenge findByUserIdAndChallengeAndTypeAndExpiresAtAfter(Long userId, String challenge, String type, + Instant now); + + void deleteByExpiresAtBefore(Instant now); + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnCredentialRepository.java b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnCredentialRepository.java new file mode 100644 index 0000000..5fb0b13 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnCredentialRepository.java @@ -0,0 +1,19 @@ +package de.bstly.we.webauthn.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.stereotype.Repository; + +import de.bstly.we.webauthn.model.WebAuthnCredential; + +@Repository +public interface WebAuthnCredentialRepository + extends JpaRepository, QuerydslPredicateExecutor { + + List findByTarget(Long userId); + + WebAuthnCredential findByCredentialId(String credentialId); + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnUserHandleRepository.java b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnUserHandleRepository.java new file mode 100644 index 0000000..46aebad --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/repository/WebAuthnUserHandleRepository.java @@ -0,0 +1,17 @@ +package de.bstly.we.webauthn.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.stereotype.Repository; + +import de.bstly.we.webauthn.model.WebAuthnUserHandle; + +@Repository +public interface WebAuthnUserHandleRepository + extends JpaRepository, QuerydslPredicateExecutor { + + WebAuthnUserHandle findByTarget(Long userId); + + WebAuthnUserHandle findByUserHandle(String userHandle); + +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationProvider.java b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationProvider.java new file mode 100644 index 0000000..67d3881 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationProvider.java @@ -0,0 +1,58 @@ +package de.bstly.we.webauthn.security; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import de.bstly.we.businesslogic.UserManager; +import de.bstly.we.model.User; +import de.bstly.we.security.LocalUserDetailsService; +import de.bstly.we.security.businesslogic.AdditionalAuthenticationProvider; +import de.bstly.we.webauthn.businesslogic.WebAuthnManager; + +@Component +public class WebAuthnAuthenticationProvider implements AdditionalAuthenticationProvider { + + @Autowired + private UserManager userManager; + @Autowired + private LocalUserDetailsService userDetailsService; + @Autowired + private WebAuthnManager webAuthnManager; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + if (!(authentication instanceof WebAuthnAuthenticationToken)) { + return null; + } + + WebAuthnAuthenticationToken token = (WebAuthnAuthenticationToken) authentication; + String assertionJson = token.getAssertionJson(); + + Long userId = webAuthnManager.validateLoginRequest(assertionJson).orElse(null); + if (userId == null) { + throw new BadCredentialsException("User not authenticated"); + } + + User user = userManager.get(userId); + if (user == null || user.isDisabled() || user.isLocked()) { + throw new BadCredentialsException("User not authenticated"); + } + + UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername()); + List authorities = List.copyOf(userDetails.getAuthorities()); + return new UsernamePasswordAuthenticationToken(userDetails, assertionJson, authorities); + } + + @Override + public boolean supports(Class authentication) { + return WebAuthnAuthenticationToken.class.isAssignableFrom(authentication); + } +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationToken.java b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationToken.java new file mode 100644 index 0000000..eb3781d --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnAuthenticationToken.java @@ -0,0 +1,59 @@ +package de.bstly.we.webauthn.security; + +import java.util.Collection; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import com.google.common.collect.Lists; + +public class WebAuthnAuthenticationToken extends AbstractAuthenticationToken { + + private static final long serialVersionUID = 1L; + + private final Object principal; + private final String assertionJson; + + public WebAuthnAuthenticationToken(Object principal, String assertionJson) { + super(Lists.newArrayList()); + this.principal = principal; + this.assertionJson = assertionJson; + setAuthenticated(false); + } + + public WebAuthnAuthenticationToken(Object principal, String assertionJson, + Collection authorities) { + super(authorities); + this.principal = principal; + this.assertionJson = assertionJson; + super.setAuthenticated(true); + } + + @Override + public Object getCredentials() { + return assertionJson; + } + + @Override + public Object getPrincipal() { + return principal; + } + + public String getAssertionJson() { + return assertionJson; + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + if (isAuthenticated) { + throw new IllegalArgumentException( + "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); + } + super.setAuthenticated(false); + } + + @Override + public void eraseCredentials() { + super.eraseCredentials(); + } +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnSecurityConfig.java b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnSecurityConfig.java new file mode 100644 index 0000000..e30d3e1 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/security/WebAuthnSecurityConfig.java @@ -0,0 +1,48 @@ +package de.bstly.we.webauthn.security; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +import de.bstly.we.security.handler.FormAuthenticationSuccessHandler; +import de.bstly.we.webauthn.security.filter.WebAuthnAuthenticationFilter; + +@Configuration +public class WebAuthnSecurityConfig { + + @Autowired + private FormAuthenticationSuccessHandler formAuthenticationSuccessHandler; + @Autowired + private AuthenticationManager authenticationManager; + + @Value("${loginUrl:/login}") + private String loginUrl; + + @Bean + public WebAuthnAuthenticationFilter webAuthnAuthenticationFilter() throws Exception { + WebAuthnAuthenticationFilter filter = new WebAuthnAuthenticationFilter("/auth/webauthn/login"); + filter.setAuthenticationManager(authenticationManager); + filter.setAuthenticationSuccessHandler(formAuthenticationSuccessHandler); + filter.setAuthenticationFailureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?error")); + return filter; + } + + @Bean + @Order(1) + public SecurityFilterChain webAuthnFilterChain(HttpSecurity http) throws Exception { + http + .securityMatcher("/auth/webauthn/login") + .csrf((csrf) -> csrf.disable()) + .securityContext((securityContext) -> securityContext.requireExplicitSave(false)) + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .addFilterBefore(webAuthnAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); + return http.build(); + } +} diff --git a/webauthn/src/main/java/de/bstly/we/webauthn/security/filter/WebAuthnAuthenticationFilter.java b/webauthn/src/main/java/de/bstly/we/webauthn/security/filter/WebAuthnAuthenticationFilter.java new file mode 100644 index 0000000..17c6761 --- /dev/null +++ b/webauthn/src/main/java/de/bstly/we/webauthn/security/filter/WebAuthnAuthenticationFilter.java @@ -0,0 +1,76 @@ +package de.bstly.we.webauthn.security.filter; + +import java.io.IOException; + +import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; +import org.springframework.util.StringUtils; + +import de.bstly.we.webauthn.security.WebAuthnAuthenticationToken; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public class WebAuthnAuthenticationFilter extends AbstractAuthenticationProcessingFilter { + + public static final String SPRING_SECURITY_FORM_WEBAUTHN_USERID = "userId"; + public static final String SPRING_SECURITY_FORM_WEBAUTHN_JSON = "assertionJson"; + + public WebAuthnAuthenticationFilter(String defaultFilterProcessesUrl) { + super(defaultFilterProcessesUrl); + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException, IOException, ServletException { + + if (!request.getMethod().equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); + } + Long userId = null; + String userIdParam = obtainUserId(request); + if (StringUtils.hasText(userIdParam)) { + try { + userId = Long.valueOf(userIdParam); + } catch (NumberFormatException e) { + throw new AuthenticationCredentialsNotFoundException("Bad request"); + } + } + String assertionJson = optainJson(request); + + if (!StringUtils.hasText(assertionJson)) { + throw new AuthenticationCredentialsNotFoundException("Bad request"); + } + + WebAuthnAuthenticationToken authRequest = new WebAuthnAuthenticationToken(userId, assertionJson); + authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); + + return this.getAuthenticationManager().authenticate(authRequest); + + } + + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, + AuthenticationException failed) throws IOException, ServletException { + if (logger.isDebugEnabled()) { + logger.debug("Authentication request failed: " + failed.toString(), failed); + logger.debug("Updated SecurityContextHolder to contain null Authentication"); + logger.debug("Delegating to authentication failure handler " + getFailureHandler()); + } + + getRememberMeServices().loginFail(request, response); + getFailureHandler().onAuthenticationFailure(request, response, failed); + } + + protected String obtainUserId(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_WEBAUTHN_USERID); + } + + protected String optainJson(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_WEBAUTHN_JSON); + } + +}