diff --git a/.gitignore b/.gitignore index ca82d20..c860d75 100755 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ target/ hs_err*.log application.properties usernames.txt -lucene \ No newline at end of file +lucene + +.vscode \ No newline at end of file diff --git a/pom.xml b/pom.xml index b121700..596289f 100644 --- a/pom.xml +++ b/pom.xml @@ -9,15 +9,16 @@ UTF-8 - 11 - 2.19.0 - 1.5.0 + 17 + 5.0.0 + 6.4.0.Final + 2.0.0 org.springframework.boot spring-boot-starter-parent - 2.7.6 + 3.2.0 @@ -58,35 +59,39 @@ spring-session-jdbc - + org.hibernate.search hibernate-search-mapper-orm - 6.0.7.Final + 7.0.0.Final org.hibernate.search hibernate-search-backend-lucene - 6.0.7.Final + 7.0.0.Final com.querydsl querydsl-apt + ${querydsl.version} + jakarta com.querydsl querydsl-jpa + ${querydsl.version} + jakarta commons-validator commons-validator - 1.7 + 1.8.0 @@ -97,7 +102,7 @@ com.googlecode.owasp-java-html-sanitizer owasp-java-html-sanitizer - 20200713.1 + 20220608.1 @@ -108,7 +113,13 @@ org.bouncycastle bcprov-jdk15on - 1.68 + 1.70 + + + + org.mariadb.jdbc + mariadb-java-client + runtime @@ -175,23 +186,6 @@ - - com.mysema.maven - apt-maven-plugin - 1.1.3 - - - - process - - - target/generated-sources/java - com.querydsl.apt.jpa.JPAAnnotationProcessor - - - - - \ No newline at end of file diff --git a/src/main/java/de/bstly/board/JPAConfig.java b/src/main/java/de/bstly/board/JPAConfig.java index ff6f9b4..533a318 100644 --- a/src/main/java/de/bstly/board/JPAConfig.java +++ b/src/main/java/de/bstly/board/JPAConfig.java @@ -3,7 +3,7 @@ */ package de.bstly.board; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/de/bstly/board/businesslogic/EntryManager.java b/src/main/java/de/bstly/board/businesslogic/EntryManager.java index a4e261d..9b2ca8d 100644 --- a/src/main/java/de/bstly/board/businesslogic/EntryManager.java +++ b/src/main/java/de/bstly/board/businesslogic/EntryManager.java @@ -3,13 +3,9 @@ */ package de.bstly.board.businesslogic; -import java.math.BigInteger; import java.time.Instant; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.Query; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -35,6 +31,8 @@ import de.bstly.board.model.support.Types; import de.bstly.board.model.support.VoteType; import de.bstly.board.repository.EntryRepository; import de.bstly.board.repository.VoteRepository; +import jakarta.persistence.EntityManager; +import jakarta.persistence.Query; /** * The Class EntryManager. @@ -110,7 +108,7 @@ public class EntryManager { @SuppressWarnings("unchecked") List list = query.getResultList(); Query queryTotal = createCountQuery(COUNT_QUERY, username, filter); - long countResult = ((BigInteger) queryTotal.getSingleResult()).longValue(); + long countResult = ((Long) queryTotal.getSingleResult()).longValue(); return new PageImpl(list, PageRequest.of(page, size), countResult); } @@ -131,7 +129,7 @@ public class EntryManager { @SuppressWarnings("unchecked") List list = query.getResultList(); Query queryTotal = createCountQuery(COUNT_QUERY, username, filter); - long countResult = ((BigInteger) queryTotal.getSingleResult()).longValue(); + long countResult = ((Long) queryTotal.getSingleResult()).longValue(); return new PageImpl(list, PageRequest.of(page, size), countResult); } @@ -156,7 +154,7 @@ public class EntryManager { @SuppressWarnings("unchecked") List list = query.getResultList(); Query queryTotal = createCountQuery(COUNT_QUERY, username, filter); - long countResult = ((BigInteger) queryTotal.getSingleResult()).longValue(); + long countResult = ((Long) queryTotal.getSingleResult()).longValue(); return new PageImpl(list, PageRequest.of(page, size), countResult); } @@ -178,7 +176,7 @@ public class EntryManager { @SuppressWarnings("unchecked") List list = query.getResultList(); Query queryTotal = createCountQuery(COUNT_QUERY, username, filter); - long countResult = ((BigInteger) queryTotal.getSingleResult()).longValue(); + long countResult = ((Long) queryTotal.getSingleResult()).longValue(); return new PageImpl(list, PageRequest.of(page, size), countResult); } @@ -204,7 +202,7 @@ public class EntryManager { List list = query.getResultList(); Query queryTotal = createCountQuery(COUNT_QUERY, username, filter); queryTotal.setParameter("username", username); - long countResult = ((BigInteger) queryTotal.getSingleResult()).longValue(); + long countResult = ((Long) queryTotal.getSingleResult()).longValue(); return new PageImpl(list, PageRequest.of(page, size), countResult); } diff --git a/src/main/java/de/bstly/board/businesslogic/SearchManager.java b/src/main/java/de/bstly/board/businesslogic/SearchManager.java index 305126e..b493794 100644 --- a/src/main/java/de/bstly/board/businesslogic/SearchManager.java +++ b/src/main/java/de/bstly/board/businesslogic/SearchManager.java @@ -5,8 +5,8 @@ package de.bstly.board.businesslogic; import java.util.List; -import javax.persistence.EntityManager; -import javax.transaction.Transactional; +import jakarta.persistence.EntityManager; +import jakarta.transaction.Transactional; import org.hibernate.search.engine.search.query.SearchResult; import org.hibernate.search.mapper.orm.Search; diff --git a/src/main/java/de/bstly/board/controller/AuthenticationController.java b/src/main/java/de/bstly/board/controller/AuthenticationController.java index 3da6e9e..779e7b1 100755 --- a/src/main/java/de/bstly/board/controller/AuthenticationController.java +++ b/src/main/java/de/bstly/board/controller/AuthenticationController.java @@ -61,11 +61,10 @@ public class AuthenticationController extends BaseController { ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository).as(Iterable.class); if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) { clientRegistrations = (Iterable) clientRegistrationRepository; + clientRegistrations.forEach(registration -> clients.add(new Client(registration.getRegistrationId(), + authorizationRequestBaseUri + "/" + registration.getRegistrationId()))); } - clientRegistrations.forEach(registration -> clients.add(new Client(registration.getRegistrationId(), - authorizationRequestBaseUri + "/" + registration.getRegistrationId()))); - return clients; } diff --git a/src/main/java/de/bstly/board/controller/DebugController.java b/src/main/java/de/bstly/board/controller/DebugController.java index 8ea1877..77acddf 100644 --- a/src/main/java/de/bstly/board/controller/DebugController.java +++ b/src/main/java/de/bstly/board/controller/DebugController.java @@ -5,9 +5,9 @@ package de.bstly.board.controller; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.SplittableRandom; import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.RandomUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +26,7 @@ import de.bstly.board.model.QLocalUser; import de.bstly.board.model.Vote; import de.bstly.board.model.support.EntryStatus; import de.bstly.board.model.support.EntryType; +import de.bstly.board.model.support.FlaggedStatus; import de.bstly.board.model.support.Types; import de.bstly.board.model.support.VoteType; import de.bstly.board.repository.CommentRepository; @@ -43,58 +44,44 @@ public class DebugController extends BaseController { @Autowired private PasswordEncoder passwordEncoder; - @Autowired private LocalUserRepository localUserRepository; - @Autowired private CommentRepository commentRepository; - @Autowired private VoteRepository voteRepository; - @Autowired private EntryManager entryManager; @Value("${debug.random.users:0}") private int users; - @Value("${debug.random.minEntries:0}") private int minEntries; - @Value("${debug.random.maxEntries:10}") private int maxEntries; - @Value("${debug.random.entryAge:63115200}") private long entryAge; - @Value("${debug.random.minComments:0}") private int minComments; - @Value("${debug.random.maxComments:10}") private int maxComments; - @Value("${debug.random.subCommentsFactor:0.5}") private float subCommentsFactor; - @Value("${debug.random.subCommentsThresh:0.3}") private float subCommentsThresh; - @Value("${debug.random.subCommentsDepth:2}") private int subCommentsDepth; - @Value("${debug.random.minUpvotes:5}") private int minUpvotes; - @Value("${debug.random.maxUpvotes:10}") private int maxUpvotes; - @Value("${debug.random.minDownvotes:0}") private int minDownvotes; - @Value("${debug.random.maxDownvotes:10}") private int maxDownvotes; + SplittableRandom splittableRandom = new SplittableRandom(); + /** * Random. */ @@ -110,6 +97,7 @@ public class DebugController extends BaseController { String username = "user" + i; localUser.setUsername(username); localUser.setPasswordHash(passwordEncoder.encode(username)); + localUser.setLocale("en"); localUserRepository.save(localUser); logger.trace("Created user: '" + username + "'"); } @@ -130,15 +118,16 @@ public class DebugController extends BaseController { * @param userCount the user count */ protected void entries(String username, long userCount) { - long numEntries = RandomUtils.nextLong(minEntries, maxEntries); + long numEntries = splittableRandom.nextLong(minEntries, maxEntries); for (int i = 0; i < numEntries; i++) { Entry entry = new Entry(); entry.setEntryType(EntryType.INTERN); entry.setAuthor(username); - entry.setCreated(Instant.now().minus(RandomUtils.nextLong(0, entryAge), ChronoUnit.SECONDS)); - entry.setTitle(RandomStringUtils.randomAscii(RandomUtils.nextInt(10, 250))); - entry.setText(RandomStringUtils.randomAscii(RandomUtils.nextInt(0, 2500))); + entry.setCreated(Instant.now().minus(splittableRandom.nextLong(0, entryAge), ChronoUnit.SECONDS)); + entry.setTitle(RandomStringUtils.randomAscii(splittableRandom.nextInt(10, 250))); + entry.setText(RandomStringUtils.randomAscii(splittableRandom.nextInt(0, 2500))); entry.setEntryStatus(EntryStatus.NORMAL); + entry.setFlaggedStatus(FlaggedStatus.NORMAL); entry = entryManager.save(entry); logger.trace("Created entry: '" + entry.getId() + "'"); comments(entry.getId(), entry.getCreated(), userCount); @@ -155,15 +144,16 @@ public class DebugController extends BaseController { * @param userCount the user count */ protected void comments(Long target, Instant date, long userCount) { - long numComments = RandomUtils.nextLong(minComments, maxComments); + long numComments = splittableRandom.nextLong(minComments, maxComments); logger.debug("Create " + numComments + " comments for '" + target + "'"); for (int i = 0; i < numComments; i++) { Comment comment = new Comment(); comment.setTarget(target); - comment.setAuthor("user" + RandomUtils.nextLong(0, userCount)); - comment.setText(RandomStringUtils.randomAscii(RandomUtils.nextInt(0, 2500))); + comment.setAuthor("user" + splittableRandom.nextLong(0, userCount)); + comment.setText(RandomStringUtils.randomAscii(splittableRandom.nextInt(0, 2500))); + comment.setFlaggedStatus(FlaggedStatus.NORMAL); comment.setCreated(Instant.now().minus( - RandomUtils.nextLong(0, (Instant.now().toEpochMilli() - date.toEpochMilli()) / 1000), + splittableRandom.nextLong(0, (Instant.now().toEpochMilli() - date.toEpochMilli()) / 1000), ChronoUnit.SECONDS)); comment = commentRepository.save(comment); logger.trace("Created comment: '" + comment.getId() + "'"); @@ -185,17 +175,18 @@ public class DebugController extends BaseController { */ protected void subComments(Long target, Long parent, Instant date, float factor, float thresh, int depth, long userCount) { - if (depth < subCommentsDepth && RandomUtils.nextFloat(0, 1) < thresh) { - long numSubComments = RandomUtils.nextLong(0, Math.round(maxComments * factor)); + if (depth < subCommentsDepth && splittableRandom.nextFloat(0, 1) < thresh) { + long numSubComments = splittableRandom.nextLong(0, Math.round(maxComments * factor)); logger.debug("Create " + numSubComments + " subComments for '" + parent + "'"); for (int i = 0; i < numSubComments; i++) { Comment comment = new Comment(); comment.setTarget(target); comment.setParent(parent); - comment.setAuthor("user" + RandomUtils.nextLong(0, userCount)); - comment.setText(RandomStringUtils.randomAscii(RandomUtils.nextInt(0, 2500))); + comment.setAuthor("user" + splittableRandom.nextLong(0, userCount)); + comment.setText(RandomStringUtils.randomAscii(splittableRandom.nextInt(0, 2500))); + comment.setFlaggedStatus(FlaggedStatus.NORMAL); comment.setCreated(Instant.now().minus( - RandomUtils.nextLong(0, (Instant.now().toEpochMilli() - date.toEpochMilli()) / 1000), + splittableRandom.nextLong(0, (Instant.now().toEpochMilli() - date.toEpochMilli()) / 1000), ChronoUnit.SECONDS)); comment = commentRepository.save(comment); logger.trace("Created subComment: '" + comment.getId() + "'"); @@ -213,26 +204,26 @@ public class DebugController extends BaseController { * @param userCount the user count */ protected void votes(Long target, Types targetType, long userCount) { - long numUpvotes = RandomUtils.nextLong(minUpvotes, maxUpvotes); + long numUpvotes = splittableRandom.nextLong(minUpvotes, maxUpvotes); logger.debug("Create " + numUpvotes + " upvotes for '" + target + "'"); for (int i = 0; i < numUpvotes; i++) { Vote upvote = new Vote(); upvote.setTarget(target); upvote.setType(VoteType.up); upvote.setTargetType(targetType); - upvote.setAuthor("user" + RandomUtils.nextLong(0, userCount)); + upvote.setAuthor("user" + splittableRandom.nextLong(0, userCount)); upvote = voteRepository.save(upvote); logger.trace("Created upvote: '" + upvote.getId() + "'"); } - long numDownvotes = RandomUtils.nextLong(minDownvotes, maxDownvotes); + long numDownvotes = splittableRandom.nextLong(minDownvotes, maxDownvotes); logger.debug("Create " + numDownvotes + " downvotes for '" + target + "'"); for (int i = 0; i < numDownvotes; i++) { Vote downvote = new Vote(); downvote.setTarget(target); downvote.setType(VoteType.down); downvote.setTargetType(targetType); - downvote.setAuthor("user" + RandomUtils.nextLong(0, userCount)); + downvote.setAuthor("user" + splittableRandom.nextLong(0, userCount)); downvote = voteRepository.save(downvote); logger.trace("Created downvote: '" + downvote.getId() + "'"); } diff --git a/src/main/java/de/bstly/board/controller/support/EntityResponseStatusException.java b/src/main/java/de/bstly/board/controller/support/EntityResponseStatusException.java index caab719..5d89d45 100644 --- a/src/main/java/de/bstly/board/controller/support/EntityResponseStatusException.java +++ b/src/main/java/de/bstly/board/controller/support/EntityResponseStatusException.java @@ -5,7 +5,6 @@ package de.bstly.board.controller.support; import javax.annotation.Nullable; -import org.springframework.core.NestedExceptionUtils; import org.springframework.core.NestedRuntimeException; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; @@ -79,8 +78,7 @@ public class EntityResponseStatusException extends NestedRuntimeException { */ @Override public String getMessage() { - String msg = this.status + (this.body != null ? " \"" + this.body + "\"" : ""); - return NestedExceptionUtils.buildMessage(msg, getCause()); + return this.status + (this.body != null ? " \"" + this.body + "\"" : ""); } } diff --git a/src/main/java/de/bstly/board/controller/support/RequestBodyErrors.java b/src/main/java/de/bstly/board/controller/support/RequestBodyErrors.java index 5757f73..8cf377a 100644 --- a/src/main/java/de/bstly/board/controller/support/RequestBodyErrors.java +++ b/src/main/java/de/bstly/board/controller/support/RequestBodyErrors.java @@ -9,7 +9,6 @@ import org.springframework.validation.AbstractBindingResult; /** * The Class RequestBodyErrors. */ -@SuppressWarnings("serial") public class RequestBodyErrors extends AbstractBindingResult { @Nullable diff --git a/src/main/java/de/bstly/board/controller/validation/ViewValidator.java b/src/main/java/de/bstly/board/controller/validation/ViewValidator.java index 52a0982..fde5be6 100644 --- a/src/main/java/de/bstly/board/controller/validation/ViewValidator.java +++ b/src/main/java/de/bstly/board/controller/validation/ViewValidator.java @@ -52,9 +52,7 @@ public class ViewValidator implements Validator { View origView = viewManager.get(view.getId()); if (origView == null) { errors.rejectValue("id", "INVALID"); - } - - if (!origView.getUsername().equals(view.getUsername())) { + } else if (!origView.getUsername().equals(view.getUsername())) { throw new EntityResponseStatusException(HttpStatus.FORBIDDEN); } diff --git a/src/main/java/de/bstly/board/i18n/controller/I18nController.java b/src/main/java/de/bstly/board/i18n/controller/I18nController.java index 5d84bfd..90aab85 100644 --- a/src/main/java/de/bstly/board/i18n/controller/I18nController.java +++ b/src/main/java/de/bstly/board/i18n/controller/I18nController.java @@ -6,7 +6,7 @@ package de.bstly.board.i18n.controller; import java.io.IOException; import java.util.List; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; diff --git a/src/main/java/de/bstly/board/i18n/model/I18n.java b/src/main/java/de/bstly/board/i18n/model/I18n.java index 15eb780..2c5480c 100644 --- a/src/main/java/de/bstly/board/i18n/model/I18n.java +++ b/src/main/java/de/bstly/board/i18n/model/I18n.java @@ -3,12 +3,12 @@ */ package de.bstly.board.i18n.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; /** * The Class I18n. @@ -22,7 +22,7 @@ public class I18n { private String locale; @Lob - @Column(name = "label") + @Column(name = "label", length = 100000) private String label; /** diff --git a/src/main/java/de/bstly/board/model/Bookmarks.java b/src/main/java/de/bstly/board/model/Bookmarks.java index cb7a6a5..cd8aae8 100644 --- a/src/main/java/de/bstly/board/model/Bookmarks.java +++ b/src/main/java/de/bstly/board/model/Bookmarks.java @@ -5,16 +5,15 @@ package de.bstly.board.model; import java.util.List; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; -import org.hibernate.annotations.LazyCollection; -import org.hibernate.annotations.LazyCollectionOption; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import com.google.common.collect.Lists; @@ -30,8 +29,7 @@ public class Bookmarks { @Id @Column(name = "username", nullable = false) private String username; - @ElementCollection - @LazyCollection(LazyCollectionOption.FALSE) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "bookmark_entries") private List entries; diff --git a/src/main/java/de/bstly/board/model/Comment.java b/src/main/java/de/bstly/board/model/Comment.java index 10202bc..e1e7b57 100644 --- a/src/main/java/de/bstly/board/model/Comment.java +++ b/src/main/java/de/bstly/board/model/Comment.java @@ -6,17 +6,17 @@ package de.bstly.board.model; import java.time.Instant; import java.util.Map; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.engine.backend.types.Searchable; @@ -56,7 +56,7 @@ public class Comment { @Column(name = "parent", nullable = true) private Long parent; @Lob - @Column(name = "text", nullable = false) + @Column(name = "text", nullable = false, length = 100000) @FullTextField(name = "text", searchable = Searchable.YES, analyzer = "english", searchAnalyzer = "english_search") @FullTextField(name = "text_de", searchable = Searchable.YES, analyzer = "german", searchAnalyzer = "german_search") private String text; diff --git a/src/main/java/de/bstly/board/model/Entry.java b/src/main/java/de/bstly/board/model/Entry.java index 569d8d3..6a5fe20 100644 --- a/src/main/java/de/bstly/board/model/Entry.java +++ b/src/main/java/de/bstly/board/model/Entry.java @@ -7,17 +7,17 @@ import java.time.Instant; import java.util.List; import java.util.Map; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; -import javax.persistence.Transient; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import org.hibernate.search.engine.backend.types.Projectable; import org.hibernate.search.engine.backend.types.Searchable; @@ -74,7 +74,7 @@ public class Entry { @FullTextField(name = "title_de", searchable = Searchable.YES, analyzer = "german", searchAnalyzer = "german_search") private String title; @Lob - @Column(name = "text") + @Column(name = "text", length = 100000) @FullTextField(name = "text", searchable = Searchable.YES, analyzer = "english", searchAnalyzer = "english_search") @FullTextField(name = "text_de", searchable = Searchable.YES, analyzer = "german", searchAnalyzer = "german_search") private String text; diff --git a/src/main/java/de/bstly/board/model/Flag.java b/src/main/java/de/bstly/board/model/Flag.java index 26361dd..425ef60 100644 --- a/src/main/java/de/bstly/board/model/Flag.java +++ b/src/main/java/de/bstly/board/model/Flag.java @@ -3,13 +3,13 @@ */ package de.bstly.board.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import org.springframework.data.jpa.domain.support.AuditingEntityListener; diff --git a/src/main/java/de/bstly/board/model/LocalUser.java b/src/main/java/de/bstly/board/model/LocalUser.java index 6d946ae..8caf281 100644 --- a/src/main/java/de/bstly/board/model/LocalUser.java +++ b/src/main/java/de/bstly/board/model/LocalUser.java @@ -6,17 +6,14 @@ package de.bstly.board.model; import java.util.List; import java.util.Map; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Lob; -import javax.persistence.Table; -import javax.persistence.Transient; - -import org.hibernate.annotations.LazyCollection; -import org.hibernate.annotations.LazyCollectionOption; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import jakarta.persistence.Transient; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; @@ -24,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.google.common.collect.Maps; import de.bstly.board.model.support.Types; +import jakarta.persistence.FetchType; /** * The Class LocalUser. @@ -41,12 +39,11 @@ public class LocalUser { @JsonIgnore @Column(name = "password_hash", nullable = true) private String passwordHash; - @ElementCollection - @LazyCollection(LazyCollectionOption.FALSE) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "users_roles") private List roles; @Lob - @Column(name = "about", nullable = true) + @Column(name = "about", nullable = true, length = 100000) private String about; @Column(name = "email", nullable = true) private String email; @@ -54,8 +51,7 @@ public class LocalUser { private String locale; @Column(name = "dark_theme", columnDefinition = "boolean default false") private boolean darkTheme; - @ElementCollection - @LazyCollection(LazyCollectionOption.FALSE) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "users_settings") private Map settings; @Transient diff --git a/src/main/java/de/bstly/board/model/PersistentLogin.java b/src/main/java/de/bstly/board/model/PersistentLogin.java index 2582513..99c5f69 100644 --- a/src/main/java/de/bstly/board/model/PersistentLogin.java +++ b/src/main/java/de/bstly/board/model/PersistentLogin.java @@ -5,10 +5,10 @@ package de.bstly.board.model; import java.time.Instant; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; /** * The Class PersistentLogin. diff --git a/src/main/java/de/bstly/board/model/Tag.java b/src/main/java/de/bstly/board/model/Tag.java index 9169948..0c2120a 100644 --- a/src/main/java/de/bstly/board/model/Tag.java +++ b/src/main/java/de/bstly/board/model/Tag.java @@ -5,11 +5,11 @@ package de.bstly.board.model; import java.io.Serializable; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.IdClass; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.IdClass; +import jakarta.persistence.Table; /** * The Class Tag. diff --git a/src/main/java/de/bstly/board/model/View.java b/src/main/java/de/bstly/board/model/View.java index cbde5b9..f77f695 100644 --- a/src/main/java/de/bstly/board/model/View.java +++ b/src/main/java/de/bstly/board/model/View.java @@ -5,24 +5,22 @@ package de.bstly.board.model; import java.util.List; -import javax.persistence.CollectionTable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import org.hibernate.annotations.LazyCollection; -import org.hibernate.annotations.LazyCollectionOption; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import de.bstly.board.model.support.EntryType; import de.bstly.board.model.support.ViewSorting; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; /** * The Class View. @@ -45,12 +43,10 @@ public class View { private ViewSorting sorting; @Column(name = "indexNumber") private int index = 99; - @ElementCollection - @LazyCollection(LazyCollectionOption.FALSE) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "views_tags") private List tags; - @ElementCollection - @LazyCollection(LazyCollectionOption.FALSE) + @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "views_excluded_tags") private List excludedTags; @Column(name = "entry_type", nullable = true) diff --git a/src/main/java/de/bstly/board/model/Vote.java b/src/main/java/de/bstly/board/model/Vote.java index 130a4c9..fe4da70 100644 --- a/src/main/java/de/bstly/board/model/Vote.java +++ b/src/main/java/de/bstly/board/model/Vote.java @@ -3,13 +3,13 @@ */ package de.bstly.board.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import org.springframework.data.jpa.domain.support.AuditingEntityListener; diff --git a/src/main/java/de/bstly/board/security/LocalRememberMeServices.java b/src/main/java/de/bstly/board/security/LocalRememberMeServices.java index 2ee48ff..eb19b44 100644 --- a/src/main/java/de/bstly/board/security/LocalRememberMeServices.java +++ b/src/main/java/de/bstly/board/security/LocalRememberMeServices.java @@ -3,7 +3,7 @@ */ package de.bstly.board.security; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices; diff --git a/src/main/java/de/bstly/board/security/OAuth2AuthenticationSuccessHandler.java b/src/main/java/de/bstly/board/security/OAuth2AuthenticationSuccessHandler.java index 49222a2..80e0aef 100644 --- a/src/main/java/de/bstly/board/security/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/de/bstly/board/security/OAuth2AuthenticationSuccessHandler.java @@ -6,9 +6,9 @@ package de.bstly.board.security; import java.io.IOException; import java.util.List; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; diff --git a/src/main/java/de/bstly/board/security/SecurityConfig.java b/src/main/java/de/bstly/board/security/SecurityConfig.java index dc124ce..c487cb4 100755 --- a/src/main/java/de/bstly/board/security/SecurityConfig.java +++ b/src/main/java/de/bstly/board/security/SecurityConfig.java @@ -10,8 +10,9 @@ import javax.sql.DataSource; 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.http.HttpStatus; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.argon2.Argon2PasswordEncoder; @@ -36,7 +37,8 @@ import de.bstly.board.businesslogic.UserManager; * The Class SecurityConfig. */ @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableMethodSecurity(prePostEnabled = true) +@Configuration public class SecurityConfig { @Autowired @@ -65,28 +67,27 @@ public class SecurityConfig { http // crsf - .csrf().disable() + .csrf((csrf) -> csrf.disable()) // cors // .cors().configurationSource(corsConfigurationSource()).and() // anonymous - .anonymous().disable() + .anonymous((anonymous) -> anonymous.disable()) // login - .formLogin().loginPage("/login").defaultSuccessUrl(loginTargetUrl) - .failureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?error")).and() + .formLogin((formLogin) -> formLogin.loginPage("/login").defaultSuccessUrl(loginTargetUrl) + .failureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?error"))) // remember me - .rememberMe().rememberMeServices(rememberMeServices()).and() + .rememberMe((rememberMe) -> rememberMe.rememberMeServices(rememberMeServices())) // logout - .logout().logoutUrl("/logout") - .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)).and() + .logout((logout) -> logout.logoutUrl("/logout") + .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))) // exception - .exceptionHandling() - .defaultAuthenticationEntryPointFor(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), - new AntPathRequestMatcher("/api/**")) - .and() + .exceptionHandling((exceptionHandling) -> exceptionHandling + .defaultAuthenticationEntryPointFor(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), + new AntPathRequestMatcher("/api/**"))) // oidc - .oauth2Login().successHandler(oAuth2AuthenticationSuccessHandler) - .failureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?externalError")) - .loginPage("/login"); + .oauth2Login((oauth2Login) -> oauth2Login.successHandler(oAuth2AuthenticationSuccessHandler) + .failureHandler(new SimpleUrlAuthenticationFailureHandler(loginUrl + "?externalError")) + .loginPage("/login")); return http.build(); } @@ -98,7 +99,7 @@ public class SecurityConfig { */ @Bean(name = "passwordEncoder") public Argon2PasswordEncoder passwordEncoder() { - return new Argon2PasswordEncoder(); + return Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8(); } /**