mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-11-01 01:21:18 +01:00 
			
		
		
		
	Merge pull request #325 from Frooodle/testversions
test dynamic security
This commit is contained in:
		
						commit
						0f8ab20db7
					
				
							
								
								
									
										6
									
								
								.github/workflows/push-docker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/push-docker.yml
									
									
									
									
										vendored
									
									
								
							@ -21,6 +21,8 @@ jobs:
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    - uses: gradle/gradle-build-action@v2.4.2
 | 
			
		||||
      env:
 | 
			
		||||
        ENABLE_SECURITY: false
 | 
			
		||||
      with:
 | 
			
		||||
        gradle-version: 7.6
 | 
			
		||||
        arguments: clean build
 | 
			
		||||
@ -77,6 +79,8 @@ jobs:
 | 
			
		||||
        cache-to: type=gha,mode=max
 | 
			
		||||
        tags: ${{ steps.meta.outputs.tags }}
 | 
			
		||||
        labels: ${{ steps.meta.outputs.labels }}
 | 
			
		||||
        build-args: 
 | 
			
		||||
          VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
 | 
			
		||||
        platforms: linux/amd64,linux/arm64/v8
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -105,6 +109,8 @@ jobs:
 | 
			
		||||
        cache-to: type=gha,mode=max
 | 
			
		||||
        tags: ${{ steps.meta2.outputs.tags }}
 | 
			
		||||
        labels: ${{ steps.meta2.outputs.labels }}
 | 
			
		||||
        build-args: 
 | 
			
		||||
          VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
 | 
			
		||||
        platforms: linux/amd64,linux/arm64/v8
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								.github/workflows/releaseArtifacts.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/releaseArtifacts.yml
									
									
									
									
										vendored
									
									
								
							@ -1,10 +1,20 @@
 | 
			
		||||
name: Release Artifacts
 | 
			
		||||
 | 
			
		||||
on: 
 | 
			
		||||
  release: 
 | 
			
		||||
    types: [created]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  push:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        enable_security: [true, false]
 | 
			
		||||
        include:
 | 
			
		||||
          - enable_security: true
 | 
			
		||||
            file_suffix: '-with-login'
 | 
			
		||||
          - enable_security: false
 | 
			
		||||
            file_suffix: ''
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3.5.2
 | 
			
		||||
    
 | 
			
		||||
@ -17,15 +27,17 @@ jobs:
 | 
			
		||||
    - name: Grant execute permission for gradlew
 | 
			
		||||
      run: chmod +x gradlew
 | 
			
		||||
 | 
			
		||||
    - name: Generate jar
 | 
			
		||||
    - name: Generate jar (With Security=${{ matrix.enable_security }})
 | 
			
		||||
      run: ./gradlew clean createExe
 | 
			
		||||
      env:
 | 
			
		||||
        ENABLE_SECURITY: ${{ matrix.enable_security }}
 | 
			
		||||
 | 
			
		||||
    - name: Upload binaries to release
 | 
			
		||||
      uses: svenstaro/upload-release-action@v2
 | 
			
		||||
      with:
 | 
			
		||||
        repo_token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        file: ./build/launch4j/Stirling-PDF.exe
 | 
			
		||||
        asset_name: Stirling-PDF.exe
 | 
			
		||||
        file: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
 | 
			
		||||
        asset_name: Stirling-PDF${{ matrix.file_suffix }}.exe
 | 
			
		||||
        tag: ${{ github.ref }}
 | 
			
		||||
        overwrite: true
 | 
			
		||||
    
 | 
			
		||||
@ -33,13 +45,11 @@ jobs:
 | 
			
		||||
      id: versionNumber
 | 
			
		||||
      run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)"
 | 
			
		||||
      
 | 
			
		||||
    - name: Upload binaries to release
 | 
			
		||||
    - name: Upload jar binaries to release
 | 
			
		||||
      uses: svenstaro/upload-release-action@v2
 | 
			
		||||
      with:
 | 
			
		||||
        repo_token: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        file: ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar
 | 
			
		||||
        asset_name: Stirling-PDF.jar
 | 
			
		||||
        file: ./build/libs/Stirling-PDF-${{ matrix.file_suffix }}-${{ steps.versionNumber.outputs.versionNumber }}.jar
 | 
			
		||||
        asset_name: Stirling-PDF${{ matrix.file_suffix }}.jar
 | 
			
		||||
        tag: ${{ github.ref }}
 | 
			
		||||
        overwrite: true
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										24
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Dockerfile
									
									
									
									
									
								
							@ -1,6 +1,15 @@
 | 
			
		||||
# Build jbig2enc in a separate stage
 | 
			
		||||
FROM frooodle/stirling-pdf-base:beta4
 | 
			
		||||
 | 
			
		||||
ARG VERSION_TAG
 | 
			
		||||
ENV VERSION_TAG=$VERSION_TAG
 | 
			
		||||
 | 
			
		||||
ENV ENABLE_SECURITY=false
 | 
			
		||||
 | 
			
		||||
ARG ALPHA=false
 | 
			
		||||
ENV ALPHA=$ALPHA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Create scripts folder and copy local scripts
 | 
			
		||||
RUN mkdir /scripts
 | 
			
		||||
COPY ./scripts/* /scripts/
 | 
			
		||||
@ -11,16 +20,23 @@ COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/
 | 
			
		||||
COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/
 | 
			
		||||
RUN fc-cache -f -v
 | 
			
		||||
 | 
			
		||||
# Copy the application JAR file
 | 
			
		||||
COPY build/libs/*.jar app.jar
 | 
			
		||||
# Depending on the ENABLE_SECURITY flag, download the correct JAR
 | 
			
		||||
COPY build/libs/*.jar app-temp.jar
 | 
			
		||||
RUN if [ "$ALPHA" = "true" ]; then \
 | 
			
		||||
        mv app-temp.jar app.jar; \
 | 
			
		||||
    elif [ "$ENABLE_SECURITY" = "true" ]; then \
 | 
			
		||||
        wget -O app.jar https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login-$VERSION_TAG.jar; \
 | 
			
		||||
        rm -f app-temp.jar; \
 | 
			
		||||
    else \
 | 
			
		||||
        wget -O app.jar https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-$VERSION_TAG.jar; \
 | 
			
		||||
        rm -f app-temp.jar; \
 | 
			
		||||
    fi
 | 
			
		||||
    
 | 
			
		||||
# Expose the application port
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
 | 
			
		||||
# Set environment variables
 | 
			
		||||
ENV APP_HOME_NAME="Stirling PDF"
 | 
			
		||||
#ENV APP_HOME_DESCRIPTION="Personal PDF Website!"
 | 
			
		||||
#ENV APP_NAVBAR_NAME="Stirling PDF"
 | 
			
		||||
 | 
			
		||||
# Run the application
 | 
			
		||||
RUN chmod +x /scripts/init.sh
 | 
			
		||||
 | 
			
		||||
@ -13,11 +13,14 @@ RUN apt-get update && \
 | 
			
		||||
# Copy the application JAR file
 | 
			
		||||
COPY build/libs/*.jar app.jar
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Expose the application port
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
 | 
			
		||||
# Set environment variables
 | 
			
		||||
ENV GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF
 | 
			
		||||
ENV ENABLE_SECURITY=false
 | 
			
		||||
 | 
			
		||||
# Run the application
 | 
			
		||||
CMD ["java", "-jar", "/app.jar"]
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,11 @@ COPY build/libs/*.jar app.jar
 | 
			
		||||
# Expose the application port
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Set environment variables
 | 
			
		||||
ENV GROUPS_TO_REMOVE=CLI
 | 
			
		||||
ENV ENABLE_SECURITY=false
 | 
			
		||||
 | 
			
		||||
# Run the application
 | 
			
		||||
CMD ["java", "-jar", "/app.jar"]
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								build.gradle
									
									
									
									
									
								
							@ -15,6 +15,24 @@ repositories {
 | 
			
		||||
	mavenCentral()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sourceSets {
 | 
			
		||||
    main {
 | 
			
		||||
        java {
 | 
			
		||||
            if (System.getenv('ENABLE_SECURITY') == 'false') {
 | 
			
		||||
                exclude 'stirling/software/SPDF/config/security/**'
 | 
			
		||||
                exclude 'stirling/software/SPDF/controller/api/UserController.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/controller/web/AccountWebController.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/model/ApiKeyAuthenticationToken.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/model/Authority.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/model/PersistentLogin.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/model/User.java'
 | 
			
		||||
                exclude 'stirling/software/SPDF/repository/**'
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
openApi {
 | 
			
		||||
    apiDocsUrl = "http://localhost:8080/v3/api-docs"
 | 
			
		||||
    outputDir = file("$projectDir")
 | 
			
		||||
@ -48,11 +66,17 @@ dependencies {
 | 
			
		||||
	implementation 'org.yaml:snakeyaml:2.1'
 | 
			
		||||
	implementation 'org.springframework.boot:spring-boot-starter-web:3.1.2'
 | 
			
		||||
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.1.2'
 | 
			
		||||
	
 | 
			
		||||
	if (System.getenv('ENABLE_SECURITY') != 'false') {
 | 
			
		||||
        implementation 'org.springframework.boot:spring-boot-starter-security:3.1.2'
 | 
			
		||||
	testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.2'
 | 
			
		||||
        implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE'
 | 
			
		||||
        implementation "org.springframework.boot:spring-boot-starter-data-jpa"
 | 
			
		||||
		implementation "com.h2database:h2"
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
	testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.2'
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	// https://mvnrepository.com/artifact/org.apache.pdfbox/jbig2-imageio
 | 
			
		||||
	implementation group: 'org.apache.pdfbox', name: 'jbig2-imageio', version: '3.0.4'
 | 
			
		||||
 | 
			
		||||
@ -8,15 +8,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.core.env.Environment;
 | 
			
		||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import jakarta.annotation.PostConstruct;
 | 
			
		||||
import stirling.software.SPDF.config.ConfigInitializer;
 | 
			
		||||
import stirling.software.SPDF.utils.GeneralUtils;
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
@EnableWebSecurity()
 | 
			
		||||
@EnableGlobalMethodSecurity(prePostEnabled = true)
 | 
			
		||||
 | 
			
		||||
//@EnableScheduling
 | 
			
		||||
public class SPdfApplication {
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
@ -11,11 +11,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
 | 
			
		||||
import jakarta.annotation.PostConstruct;
 | 
			
		||||
import stirling.software.SPDF.config.security.UserService;
 | 
			
		||||
import stirling.software.SPDF.model.ApplicationProperties;
 | 
			
		||||
import stirling.software.SPDF.model.Role;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class InitialSetup {
 | 
			
		||||
public class InitialSecuritySetup {
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserService userService;
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
package stirling.software.SPDF.config.security;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Qualifier;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
@ -17,6 +20,8 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 | 
			
		||||
 | 
			
		||||
import stirling.software.SPDF.repository.JPATokenRepositoryImpl;
 | 
			
		||||
@Configuration
 | 
			
		||||
@EnableWebSecurity()
 | 
			
		||||
@EnableGlobalMethodSecurity(prePostEnabled = true)
 | 
			
		||||
public class SecurityConfiguration {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
package stirling.software.SPDF.config;
 | 
			
		||||
package stirling.software.SPDF.config.security;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.time.Duration;
 | 
			
		||||
@ -0,0 +1,121 @@
 | 
			
		||||
package stirling.software.SPDF.controller.web;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.nio.file.Paths;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.core.io.support.ResourcePatternUtils;
 | 
			
		||||
import org.springframework.security.access.prepost.PreAuthorize;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.security.core.userdetails.UserDetails;
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
import org.springframework.ui.Model;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.core.JsonProcessingException;
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.Hidden;
 | 
			
		||||
import io.swagger.v3.oas.annotations.tags.Tag;
 | 
			
		||||
import jakarta.servlet.http.HttpServletRequest;
 | 
			
		||||
import stirling.software.SPDF.config.security.UserService;
 | 
			
		||||
import stirling.software.SPDF.model.User;
 | 
			
		||||
import stirling.software.SPDF.repository.UserRepository;
 | 
			
		||||
@Controller
 | 
			
		||||
@Tag(name = "Account Security", description = "Account Security APIs")
 | 
			
		||||
public class AccountWebController {
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	@GetMapping("/login")
 | 
			
		||||
	public String login(HttpServletRequest request, Model model, Authentication authentication) {
 | 
			
		||||
		if (authentication != null && authentication.isAuthenticated()) {
 | 
			
		||||
            return "redirect:/";
 | 
			
		||||
        }
 | 
			
		||||
		
 | 
			
		||||
		if (request.getParameter("error") != null) {
 | 
			
		||||
 | 
			
		||||
	        model.addAttribute("error", request.getParameter("error"));
 | 
			
		||||
	    }
 | 
			
		||||
	    if (request.getParameter("logout") != null) {
 | 
			
		||||
 | 
			
		||||
	        model.addAttribute("logoutMessage", "You have been logged out.");
 | 
			
		||||
	    }
 | 
			
		||||
	    
 | 
			
		||||
	    return "login";
 | 
			
		||||
	}
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserRepository userRepository;  // Assuming you have a repository for user operations
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserService userService;  // Assuming you have a repository for user operations
 | 
			
		||||
 | 
			
		||||
	@PreAuthorize("hasRole('ROLE_ADMIN')")
 | 
			
		||||
	@GetMapping("/addUsers")
 | 
			
		||||
	public String showAddUserForm(Model model) {
 | 
			
		||||
	    List<User> allUsers = userRepository.findAll();
 | 
			
		||||
	    model.addAttribute("users", allUsers);
 | 
			
		||||
	    return "addUsers";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	@GetMapping("/account")
 | 
			
		||||
	public String account(HttpServletRequest request, Model model, Authentication authentication) {
 | 
			
		||||
		if (authentication == null || !authentication.isAuthenticated()) {
 | 
			
		||||
            return "redirect:/";
 | 
			
		||||
        }
 | 
			
		||||
		if (authentication != null && authentication.isAuthenticated()) {
 | 
			
		||||
	        Object principal = authentication.getPrincipal();
 | 
			
		||||
 | 
			
		||||
	        if (principal instanceof UserDetails) {
 | 
			
		||||
	            // Cast the principal object to UserDetails
 | 
			
		||||
	            UserDetails userDetails = (UserDetails) principal;
 | 
			
		||||
 | 
			
		||||
	            // Retrieve username and other attributes
 | 
			
		||||
	            String username = userDetails.getUsername();
 | 
			
		||||
 | 
			
		||||
	            // Fetch user details from the database
 | 
			
		||||
	            Optional<User> user = userRepository.findByUsername(username);  // Assuming findByUsername method exists
 | 
			
		||||
	            if (!user.isPresent()) {
 | 
			
		||||
	                // Handle error appropriately
 | 
			
		||||
	                return "redirect:/error";  // Example redirection in case of error
 | 
			
		||||
	            }
 | 
			
		||||
 | 
			
		||||
	            // Convert settings map to JSON string
 | 
			
		||||
	            ObjectMapper objectMapper = new ObjectMapper();
 | 
			
		||||
	            String settingsJson;
 | 
			
		||||
	            try {
 | 
			
		||||
	                settingsJson = objectMapper.writeValueAsString(user.get().getSettings());
 | 
			
		||||
	            } catch (JsonProcessingException e) {
 | 
			
		||||
	                // Handle JSON conversion error
 | 
			
		||||
	                e.printStackTrace();
 | 
			
		||||
	                return "redirect:/error";  // Example redirection in case of error
 | 
			
		||||
	            }
 | 
			
		||||
 | 
			
		||||
	            // Add attributes to the model
 | 
			
		||||
	            model.addAttribute("username", username);
 | 
			
		||||
	            model.addAttribute("role", user.get().getRolesAsString());
 | 
			
		||||
	            model.addAttribute("settings", settingsJson);
 | 
			
		||||
	        }
 | 
			
		||||
		} else {
 | 
			
		||||
	        	return "redirect:/";
 | 
			
		||||
	        }
 | 
			
		||||
	    return "account";
 | 
			
		||||
	}
 | 
			
		||||
	 
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@ -9,7 +9,6 @@ import java.util.Arrays;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Optional;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
import java.util.stream.Stream;
 | 
			
		||||
 | 
			
		||||
@ -17,105 +16,20 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.core.io.Resource;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.core.io.support.ResourcePatternUtils;
 | 
			
		||||
import org.springframework.security.access.prepost.PreAuthorize;
 | 
			
		||||
import org.springframework.security.core.Authentication;
 | 
			
		||||
import org.springframework.security.core.userdetails.UserDetails;
 | 
			
		||||
import org.springframework.stereotype.Controller;
 | 
			
		||||
import org.springframework.ui.Model;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.core.JsonProcessingException;
 | 
			
		||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.Hidden;
 | 
			
		||||
import io.swagger.v3.oas.annotations.tags.Tag;
 | 
			
		||||
import jakarta.servlet.http.HttpServletRequest;
 | 
			
		||||
import stirling.software.SPDF.config.security.UserService;
 | 
			
		||||
import stirling.software.SPDF.model.User;
 | 
			
		||||
import stirling.software.SPDF.repository.UserRepository;
 | 
			
		||||
 | 
			
		||||
@Controller
 | 
			
		||||
@Tag(name = "General", description = "General APIs")
 | 
			
		||||
public class GeneralWebController {
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	@GetMapping("/login")
 | 
			
		||||
	public String login(HttpServletRequest request, Model model, Authentication authentication) {
 | 
			
		||||
		if (authentication != null && authentication.isAuthenticated()) {
 | 
			
		||||
            return "redirect:/";
 | 
			
		||||
        }
 | 
			
		||||
		
 | 
			
		||||
		if (request.getParameter("error") != null) {
 | 
			
		||||
 | 
			
		||||
	        model.addAttribute("error", request.getParameter("error"));
 | 
			
		||||
	    }
 | 
			
		||||
	    if (request.getParameter("logout") != null) {
 | 
			
		||||
 | 
			
		||||
	        model.addAttribute("logoutMessage", "You have been logged out.");
 | 
			
		||||
	    }
 | 
			
		||||
	    
 | 
			
		||||
	    return "login";
 | 
			
		||||
	}
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserRepository userRepository;  // Assuming you have a repository for user operations
 | 
			
		||||
 | 
			
		||||
	@Autowired
 | 
			
		||||
	private UserService userService;  // Assuming you have a repository for user operations
 | 
			
		||||
 | 
			
		||||
	@PreAuthorize("hasRole('ROLE_ADMIN')")
 | 
			
		||||
	@GetMapping("/addUsers")
 | 
			
		||||
	public String showAddUserForm(Model model) {
 | 
			
		||||
	    List<User> allUsers = userRepository.findAll();
 | 
			
		||||
	    model.addAttribute("users", allUsers);
 | 
			
		||||
	    return "addUsers";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	@GetMapping("/account")
 | 
			
		||||
	public String account(HttpServletRequest request, Model model, Authentication authentication) {
 | 
			
		||||
		if (authentication == null || !authentication.isAuthenticated()) {
 | 
			
		||||
            return "redirect:/";
 | 
			
		||||
        }
 | 
			
		||||
		if (authentication != null && authentication.isAuthenticated()) {
 | 
			
		||||
	        Object principal = authentication.getPrincipal();
 | 
			
		||||
 | 
			
		||||
	        if (principal instanceof UserDetails) {
 | 
			
		||||
	            // Cast the principal object to UserDetails
 | 
			
		||||
	            UserDetails userDetails = (UserDetails) principal;
 | 
			
		||||
 | 
			
		||||
	            // Retrieve username and other attributes
 | 
			
		||||
	            String username = userDetails.getUsername();
 | 
			
		||||
 | 
			
		||||
	            // Fetch user details from the database
 | 
			
		||||
	            Optional<User> user = userRepository.findByUsername(username);  // Assuming findByUsername method exists
 | 
			
		||||
	            if (!user.isPresent()) {
 | 
			
		||||
	                // Handle error appropriately
 | 
			
		||||
	                return "redirect:/error";  // Example redirection in case of error
 | 
			
		||||
	            }
 | 
			
		||||
 | 
			
		||||
	            // Convert settings map to JSON string
 | 
			
		||||
	            ObjectMapper objectMapper = new ObjectMapper();
 | 
			
		||||
	            String settingsJson;
 | 
			
		||||
	            try {
 | 
			
		||||
	                settingsJson = objectMapper.writeValueAsString(user.get().getSettings());
 | 
			
		||||
	            } catch (JsonProcessingException e) {
 | 
			
		||||
	                // Handle JSON conversion error
 | 
			
		||||
	                e.printStackTrace();
 | 
			
		||||
	                return "redirect:/error";  // Example redirection in case of error
 | 
			
		||||
	            }
 | 
			
		||||
 | 
			
		||||
	            // Add attributes to the model
 | 
			
		||||
	            model.addAttribute("username", username);
 | 
			
		||||
	            model.addAttribute("role", user.get().getRolesAsString());
 | 
			
		||||
	            model.addAttribute("settings", settingsJson);
 | 
			
		||||
	        }
 | 
			
		||||
		} else {
 | 
			
		||||
	        	return "redirect:/";
 | 
			
		||||
	        }
 | 
			
		||||
	    return "account";
 | 
			
		||||
	}
 | 
			
		||||
	 
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
	@GetMapping("/pipeline")
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user