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 extends GrantedAuthority> 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);
+ }
+
+}