From a49eb3a6291492905f0b8572005488b95761f26a Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Sat, 14 Jun 2025 21:28:27 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20format=20everything=20with=20pre?= =?UTF-8?q?-commit=20by=20stirlingbot=20(#3697)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auto-generated by [create-pull-request][1] with **stirlingbot** [1]: https://github.com/peter-evans/create-pull-request Signed-off-by: stirlingbot[bot] Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- .github/scripts/check_language_properties.py | 24 ++++++++-- .../model/dto/TeamWithUserCountDTO.java | 4 +- .../security/config/AccountWebController.java | 6 +-- .../controller/api/TeamController.java | 22 ++++----- .../controller/api/UserController.java | 12 ++--- .../controller/web/TeamWebController.java | 14 +++--- .../database/repository/UserRepository.java | 2 +- .../security/service/UserServiceTest.java | 26 +++++----- .../controller/api/MergeControllerTest.java | 48 +++++++++---------- 9 files changed, 87 insertions(+), 71 deletions(-) diff --git a/.github/scripts/check_language_properties.py b/.github/scripts/check_language_properties.py index ea52fadd8..659ff7027 100644 --- a/.github/scripts/check_language_properties.py +++ b/.github/scripts/check_language_properties.py @@ -196,7 +196,9 @@ def check_for_differences(reference_file, file_list, branch, actor): if len(file_list) == 1: file_arr = file_list[0].split() - base_dir = os.path.abspath(os.path.join(os.getcwd(), "stirling-pdf", "src", "main", "resources")) + base_dir = os.path.abspath( + os.path.join(os.getcwd(), "stirling-pdf", "src", "main", "resources") + ) for file_path in file_arr: file_normpath = os.path.normpath(file_path) @@ -216,10 +218,19 @@ def check_for_differences(reference_file, file_list, branch, actor): or ( # only local windows command not file_normpath.startswith( - os.path.join("", "stirling-pdf", "src", "main", "resources", "messages_") + os.path.join( + "", "stirling-pdf", "src", "main", "resources", "messages_" + ) ) and not file_normpath.startswith( - os.path.join(os.getcwd(), "stirling-pdf", "src", "main", "resources", "messages_") + os.path.join( + os.getcwd(), + "stirling-pdf", + "src", + "main", + "resources", + "messages_", + ) ) ) or not file_normpath.endswith(".properties") @@ -377,7 +388,12 @@ if __name__ == "__main__": else: file_list = glob.glob( os.path.join( - os.getcwd(), "stirling-pdf", "src", "main", "resources", "messages_*.properties" + os.getcwd(), + "stirling-pdf", + "src", + "main", + "resources", + "messages_*.properties", ) ) update_missing_keys(args.reference_file, file_list) diff --git a/proprietary/src/main/java/stirling/software/proprietary/model/dto/TeamWithUserCountDTO.java b/proprietary/src/main/java/stirling/software/proprietary/model/dto/TeamWithUserCountDTO.java index 580e1148d..53e66993a 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/model/dto/TeamWithUserCountDTO.java +++ b/proprietary/src/main/java/stirling/software/proprietary/model/dto/TeamWithUserCountDTO.java @@ -10,11 +10,11 @@ public class TeamWithUserCountDTO { private Long id; private String name; private Long userCount; - + // Constructor for JPQL projection public TeamWithUserCountDTO(Long id, String name, Long userCount) { this.id = id; this.name = name; this.userCount = userCount; } -} \ No newline at end of file +} diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/config/AccountWebController.java b/proprietary/src/main/java/stirling/software/proprietary/security/config/AccountWebController.java index 5bd992967..836b661eb 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/config/AccountWebController.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/config/AccountWebController.java @@ -228,7 +228,7 @@ public class AccountWebController { User user = iterator.next(); if (user != null) { boolean shouldRemove = false; - + // Check if user is an INTERNAL_API_USER for (Authority authority : user.getAuthorities()) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { @@ -237,12 +237,12 @@ public class AccountWebController { break; } } - + // Also check if user is part of the Internal team if (user.getTeam() != null && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { shouldRemove = true; } - + // Remove the user if either condition is true if (shouldRemove) { iterator.remove(); diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/TeamController.java b/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/TeamController.java index be0dda2b7..9c77af94a 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/TeamController.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/TeamController.java @@ -56,12 +56,12 @@ public class TeamController { return new RedirectView("/adminSettings?messageType=teamNameExists"); } Team team = existing.get(); - + // Prevent renaming the Internal team if (team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) { return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible"); } - + team.setName(newName); teamRepository.save(team); return new RedirectView("/adminSettings?messageType=teamRenamed"); @@ -77,12 +77,12 @@ public class TeamController { } Team team = teamOpt.get(); - + // Prevent deleting the Internal team if (team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) { return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible"); } - + long memberCount = userRepository.countByTeam(team); if (memberCount > 0) { return new RedirectView("/adminSettings?messageType=teamHasUsers"); @@ -91,36 +91,36 @@ public class TeamController { teamRepository.delete(team); return new RedirectView("/adminSettings?messageType=teamDeleted"); } - + @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/addUser") @Transactional public RedirectView addUserToTeam( @RequestParam("teamId") Long teamId, @RequestParam("userId") Long userId) { - + // Find the team Team team = teamRepository.findById(teamId) .orElseThrow(() -> new RuntimeException("Team not found")); - + // Prevent adding users to the Internal team if (team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) { return new RedirectView("/teams?error=internalTeamNotAccessible"); } - + // Find the user User user = userRepository.findById(userId) .orElseThrow(() -> new RuntimeException("User not found")); - + // Check if user is in the Internal team - prevent moving them if (user.getTeam() != null && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { return new RedirectView("/teams/" + teamId + "?error=cannotMoveInternalUsers"); } - + // Assign user to team user.setTeam(team); userRepository.save(user); - + // Redirect back to team details page return new RedirectView("/teams/" + teamId + "?messageType=userAdded"); } diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java b/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java index 28034ca54..0499fe01b 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/controller/api/UserController.java @@ -246,7 +246,7 @@ public class UserController { // If the role ID is not valid, redirect with an error message return new RedirectView("/adminSettings?messageType=invalidRole", true); } - + // Use teamId if provided, otherwise use default team Long effectiveTeamId = teamId; if (effectiveTeamId == null) { @@ -261,7 +261,7 @@ public class UserController { return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible", true); } } - + if (authType.equalsIgnoreCase(AuthenticationType.SSO.toString())) { userService.saveUser(username, AuthenticationType.SSO, effectiveTeamId, role); } else { @@ -309,7 +309,7 @@ public class UserController { return new RedirectView("/adminSettings?messageType=invalidRole", true); } User user = userOpt.get(); - + // Update the team if a teamId is provided if (teamId != null) { Team team = teamRepository.findById(teamId).orElse(null); @@ -318,17 +318,17 @@ public class UserController { if (TeamService.INTERNAL_TEAM_NAME.equals(team.getName())) { return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible", true); } - + // Prevent moving users from Internal team if (user.getTeam() != null && TeamService.INTERNAL_TEAM_NAME.equals(user.getTeam().getName())) { return new RedirectView("/adminSettings?messageType=cannotMoveInternalUsers", true); } - + user.setTeam(team); userRepository.save(user); } } - + userService.changeRole(user, role); return new RedirectView( "/adminSettings", // Redirect to account page after adding the user diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/controller/web/TeamWebController.java b/proprietary/src/main/java/stirling/software/proprietary/security/controller/web/TeamWebController.java index 922ad57f8..d41b2aa75 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/controller/web/TeamWebController.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/controller/web/TeamWebController.java @@ -38,7 +38,7 @@ public class TeamWebController { public String listTeams(Model model) { // Get teams with user counts using a DTO projection List allTeamsWithCounts = teamRepository.findAllTeamsWithUserCount(); - + // Filter out the Internal team List teamsWithCounts = allTeamsWithCounts.stream() .filter(team -> !team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) @@ -58,7 +58,7 @@ public class TeamWebController { // Add data to the model model.addAttribute("teamsWithCounts", teamsWithCounts); model.addAttribute("teamLastRequest", teamLastRequest); - + return "accounts/teams"; } @@ -68,23 +68,23 @@ public class TeamWebController { // Get the team Team team = teamRepository.findById(id) .orElseThrow(() -> new RuntimeException("Team not found")); - + // Prevent access to Internal team if (team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) { return "redirect:/teams?error=internalTeamNotAccessible"; } - + // Get users for this team directly using the direct query List teamUsers = userRepository.findAllByTeamId(id); - + // Get all users not in this team for the Add User to Team dropdown // Exclude users that are in the Internal team List allUsers = userRepository.findAllWithTeam(); List availableUsers = allUsers.stream() - .filter(user -> (user.getTeam() == null || !user.getTeam().getId().equals(id)) && + .filter(user -> (user.getTeam() == null || !user.getTeam().getId().equals(id)) && (user.getTeam() == null || !user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME))) .toList(); - + // Get the latest session for each user in the team List userSessions = sessionRepository.findLatestSessionByTeamId(id); diff --git a/proprietary/src/main/java/stirling/software/proprietary/security/database/repository/UserRepository.java b/proprietary/src/main/java/stirling/software/proprietary/security/database/repository/UserRepository.java index 517998ec2..a53eed6d1 100644 --- a/proprietary/src/main/java/stirling/software/proprietary/security/database/repository/UserRepository.java +++ b/proprietary/src/main/java/stirling/software/proprietary/security/database/repository/UserRepository.java @@ -29,7 +29,7 @@ public interface UserRepository extends JpaRepository { @Query(value = "SELECT u FROM User u LEFT JOIN FETCH u.team") List findAllWithTeam(); - + @Query("SELECT u FROM User u JOIN FETCH u.authorities JOIN FETCH u.team WHERE u.team.id = :teamId") List findAllByTeamId(@Param("teamId") Long teamId); diff --git a/proprietary/src/test/java/stirling/software/proprietary/security/service/UserServiceTest.java b/proprietary/src/test/java/stirling/software/proprietary/security/service/UserServiceTest.java index 8cb9f5ff5..d0fbbb154 100644 --- a/proprietary/src/test/java/stirling/software/proprietary/security/service/UserServiceTest.java +++ b/proprietary/src/test/java/stirling/software/proprietary/security/service/UserServiceTest.java @@ -79,7 +79,7 @@ class UserServiceTest { // Given String username = "testuser"; AuthenticationType authType = AuthenticationType.WEB; - + when(teamRepository.findByName("Default")).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); doNothing().when(databaseService).exportDatabase(); @@ -99,7 +99,7 @@ class UserServiceTest { String password = "password123"; Long teamId = 1L; String encodedPassword = "encodedPassword123"; - + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); @@ -124,7 +124,7 @@ class UserServiceTest { String role = Role.ADMIN.getRoleId(); boolean firstLogin = true; String encodedPassword = "encodedPassword123"; - + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); when(userRepository.save(any(User.class))).thenReturn(mockUser); doNothing().when(databaseService).exportDatabase(); @@ -150,7 +150,7 @@ class UserServiceTest { IllegalArgumentException.class, () -> userService.saveUser(invalidUsername, authType) ); - + verify(userRepository, never()).save(any(User.class)); verify(databaseService, never()).exportDatabase(); } @@ -160,7 +160,7 @@ class UserServiceTest { // Given String username = "testuser"; Long teamId = 1L; - + when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); doNothing().when(databaseService).exportDatabase(); @@ -181,7 +181,7 @@ class UserServiceTest { String username = "testuser"; String emptyPassword = ""; Long teamId = 1L; - + when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); doNothing().when(databaseService).exportDatabase(); @@ -201,7 +201,7 @@ class UserServiceTest { // Given String emailUsername = "test@example.com"; AuthenticationType authType = AuthenticationType.SSO; - + when(teamRepository.findByName("Default")).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); doNothing().when(databaseService).exportDatabase(); @@ -225,7 +225,7 @@ class UserServiceTest { IllegalArgumentException.class, () -> userService.saveUser(reservedUsername, authType) ); - + verify(userRepository, never()).save(any(User.class)); verify(databaseService, never()).exportDatabase(); } @@ -241,7 +241,7 @@ class UserServiceTest { IllegalArgumentException.class, () -> userService.saveUser(anonymousUsername, authType) ); - + verify(userRepository, never()).save(any(User.class)); verify(databaseService, never()).exportDatabase(); } @@ -253,7 +253,7 @@ class UserServiceTest { String password = "password123"; Long teamId = 1L; String encodedPassword = "encodedPassword123"; - + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); @@ -261,7 +261,7 @@ class UserServiceTest { // When & Then assertThrows(SQLException.class, () -> userService.saveUser(username, password, teamId)); - + // Verify user was still saved before the exception verify(userRepository).save(any(User.class)); verify(databaseService).exportDatabase(); @@ -276,7 +276,7 @@ class UserServiceTest { boolean firstLogin = true; boolean enabled = false; String encodedPassword = "encodedPassword123"; - + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); @@ -299,7 +299,7 @@ class UserServiceTest { Long teamId = 1L; String customRole = Role.LIMITED_API_USER.getRoleId(); String encodedPassword = "encodedPassword123"; - + when(passwordEncoder.encode(password)).thenReturn(encodedPassword); when(teamRepository.findById(teamId)).thenReturn(Optional.of(mockTeam)); when(userRepository.save(any(User.class))).thenReturn(mockUser); diff --git a/stirling-pdf/src/test/java/stirling/software/SPDF/controller/api/MergeControllerTest.java b/stirling-pdf/src/test/java/stirling/software/SPDF/controller/api/MergeControllerTest.java index 4b175b64e..03ececa62 100644 --- a/stirling-pdf/src/test/java/stirling/software/SPDF/controller/api/MergeControllerTest.java +++ b/stirling-pdf/src/test/java/stirling/software/SPDF/controller/api/MergeControllerTest.java @@ -50,7 +50,7 @@ class MergeControllerTest { mockFile1 = new MockMultipartFile("file1", "document1.pdf", "application/pdf", "PDF content 1".getBytes()); mockFile2 = new MockMultipartFile("file2", "document2.pdf", "application/pdf", "PDF content 2".getBytes()); mockFile3 = new MockMultipartFile("file3", "chapter3.pdf", "application/pdf", "PDF content 3".getBytes()); - + mockDocument = mock(PDDocument.class); mockMergedDocument = mock(PDDocument.class); mockCatalog = mock(PDDocumentCatalog.class); @@ -63,23 +63,23 @@ class MergeControllerTest { void testAddTableOfContents_WithMultipleFiles_Success() throws Exception { // Given MultipartFile[] files = {mockFile1, mockFile2, mockFile3}; - + // Mock the merged document setup when(mockMergedDocument.getDocumentCatalog()).thenReturn(mockCatalog); when(mockMergedDocument.getNumberOfPages()).thenReturn(6); when(mockMergedDocument.getPage(0)).thenReturn(mockPage1); when(mockMergedDocument.getPage(2)).thenReturn(mockPage2); when(mockMergedDocument.getPage(4)).thenReturn(mockPage1); - + // Mock individual document loading for page count PDDocument doc1 = mock(PDDocument.class); PDDocument doc2 = mock(PDDocument.class); PDDocument doc3 = mock(PDDocument.class); - + when(pdfDocumentFactory.load(mockFile1)).thenReturn(doc1); when(pdfDocumentFactory.load(mockFile2)).thenReturn(doc2); when(pdfDocumentFactory.load(mockFile3)).thenReturn(doc3); - + when(doc1.getNumberOfPages()).thenReturn(2); when(doc2.getNumberOfPages()).thenReturn(2); when(doc3.getNumberOfPages()).thenReturn(2); @@ -92,15 +92,15 @@ class MergeControllerTest { // Then ArgumentCaptor outlineCaptor = ArgumentCaptor.forClass(PDDocumentOutline.class); verify(mockCatalog).setDocumentOutline(outlineCaptor.capture()); - + PDDocumentOutline capturedOutline = outlineCaptor.getValue(); assertNotNull(capturedOutline); - + // Verify that documents were loaded for page count verify(pdfDocumentFactory).load(mockFile1); verify(pdfDocumentFactory).load(mockFile2); verify(pdfDocumentFactory).load(mockFile3); - + // Verify document closing verify(doc1).close(); verify(doc2).close(); @@ -111,11 +111,11 @@ class MergeControllerTest { void testAddTableOfContents_WithSingleFile_Success() throws Exception { // Given MultipartFile[] files = {mockFile1}; - + when(mockMergedDocument.getDocumentCatalog()).thenReturn(mockCatalog); when(mockMergedDocument.getNumberOfPages()).thenReturn(3); when(mockMergedDocument.getPage(0)).thenReturn(mockPage1); - + PDDocument doc1 = mock(PDDocument.class); when(pdfDocumentFactory.load(mockFile1)).thenReturn(doc1); when(doc1.getNumberOfPages()).thenReturn(3); @@ -152,25 +152,25 @@ class MergeControllerTest { void testAddTableOfContents_WithIOException_HandlesGracefully() throws Exception { // Given MultipartFile[] files = {mockFile1, mockFile2}; - + when(mockMergedDocument.getDocumentCatalog()).thenReturn(mockCatalog); when(mockMergedDocument.getNumberOfPages()).thenReturn(4); when(mockMergedDocument.getPage(anyInt())).thenReturn(mockPage1); // Use anyInt() to avoid stubbing conflicts - + // First document loads successfully PDDocument doc1 = mock(PDDocument.class); when(pdfDocumentFactory.load(mockFile1)).thenReturn(doc1); when(doc1.getNumberOfPages()).thenReturn(2); - + // Second document throws IOException when(pdfDocumentFactory.load(mockFile2)).thenThrow(new IOException("Failed to load document")); // When Method addTableOfContentsMethod = MergeController.class.getDeclaredMethod("addTableOfContents", PDDocument.class, MultipartFile[].class); addTableOfContentsMethod.setAccessible(true); - + // Should not throw exception - assertDoesNotThrow(() -> + assertDoesNotThrow(() -> addTableOfContentsMethod.invoke(mergeController, mockMergedDocument, files) ); @@ -186,11 +186,11 @@ class MergeControllerTest { // Given MockMultipartFile fileWithoutExtension = new MockMultipartFile("file", "document_no_ext", "application/pdf", "PDF content".getBytes()); MultipartFile[] files = {fileWithoutExtension}; - + when(mockMergedDocument.getDocumentCatalog()).thenReturn(mockCatalog); when(mockMergedDocument.getNumberOfPages()).thenReturn(1); when(mockMergedDocument.getPage(0)).thenReturn(mockPage1); - + PDDocument doc = mock(PDDocument.class); when(pdfDocumentFactory.load(fileWithoutExtension)).thenReturn(doc); when(doc.getNumberOfPages()).thenReturn(1); @@ -209,10 +209,10 @@ class MergeControllerTest { void testAddTableOfContents_PageIndexExceedsDocumentPages_HandlesGracefully() throws Exception { // Given MultipartFile[] files = {mockFile1}; - + when(mockMergedDocument.getDocumentCatalog()).thenReturn(mockCatalog); when(mockMergedDocument.getNumberOfPages()).thenReturn(0); // No pages in merged document - + PDDocument doc1 = mock(PDDocument.class); when(pdfDocumentFactory.load(mockFile1)).thenReturn(doc1); when(doc1.getNumberOfPages()).thenReturn(3); @@ -220,9 +220,9 @@ class MergeControllerTest { // When Method addTableOfContentsMethod = MergeController.class.getDeclaredMethod("addTableOfContents", PDDocument.class, MultipartFile[].class); addTableOfContentsMethod.setAccessible(true); - + // Should not throw exception - assertDoesNotThrow(() -> + assertDoesNotThrow(() -> addTableOfContentsMethod.invoke(mergeController, mockMergedDocument, files) ); @@ -238,12 +238,12 @@ class MergeControllerTest { PDDocument doc1 = mock(PDDocument.class); PDDocument doc2 = mock(PDDocument.class); List documents = Arrays.asList(doc1, doc2); - + PDPageTree pages1 = mock(PDPageTree.class); PDPageTree pages2 = mock(PDPageTree.class); PDPage page1 = mock(PDPage.class); PDPage page2 = mock(PDPage.class); - + when(pdfDocumentFactory.createNewDocument()).thenReturn(mockMergedDocument); when(doc1.getPages()).thenReturn(pages1); when(doc2.getPages()).thenReturn(pages2); @@ -264,7 +264,7 @@ class MergeControllerTest { void testMergeDocuments_EmptyList_ReturnsEmptyDocument() throws IOException { // Given List documents = Arrays.asList(); - + when(pdfDocumentFactory.createNewDocument()).thenReturn(mockMergedDocument); // When