diff --git a/README.md b/README.md index a9f2005..73c7657 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,8 @@ file.save.path=files file.max.age=30 (In days) logging.file.name=log/quickdrop.log file.deletion.cron=0 0 2 * * * +app.basic.password=test +app.enable.password=false ``` - Run the application with the external configuration: diff --git a/mvnw b/mvnw index 19529dd..ce13e23 100644 --- a/mvnw +++ b/mvnw @@ -25,7 +25,7 @@ # ----------------- # JAVA_HOME - location of a JDK home dir, required when download maven via java source # MVNW_REPOURL - repo url base for downloading maven distribution -# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_USERNAME/MVNW_PASSWORD - user and password.html for downloading maven # MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- diff --git a/src/main/java/org/rostislav/quickdrop/config/WebConfig.java b/src/main/java/org/rostislav/quickdrop/config/WebConfig.java new file mode 100644 index 0000000..e601a6e --- /dev/null +++ b/src/main/java/org/rostislav/quickdrop/config/WebConfig.java @@ -0,0 +1,21 @@ +package org.rostislav.quickdrop.config; + +import org.rostislav.quickdrop.interceptor.PasswordInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + private final PasswordInterceptor passwordInterceptor; + + public WebConfig(PasswordInterceptor passwordInterceptor) { + this.passwordInterceptor = passwordInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(passwordInterceptor) + .excludePathPatterns("/password/login", "/favicon.ico", "/error"); + } +} diff --git a/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java b/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java index 895f655..8d5f65d 100644 --- a/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java +++ b/src/main/java/org/rostislav/quickdrop/controller/FileViewController.java @@ -46,7 +46,7 @@ public class FileViewController { if (fileEntity.passwordHash != null && (password == null || !fileService.checkPassword(uuid, password))) { model.addAttribute("uuid", uuid); - return "password"; + return "filePassword"; } populateModelAttributes(fileEntity, model, request); @@ -54,11 +54,6 @@ public class FileViewController { return "fileView"; } - @GetMapping("/password") - public String passwordPage(Model model) { - return "password"; - } - @PostMapping("/password") public String checkPassword(String uuid, String password, HttpServletRequest request, Model model) { if (fileService.checkPassword(uuid, password)) { @@ -66,7 +61,7 @@ public class FileViewController { return "redirect:/file/" + uuid; } else { model.addAttribute("uuid", uuid); - return "password"; + return "filePassword"; } } diff --git a/src/main/java/org/rostislav/quickdrop/controller/PasswordController.java b/src/main/java/org/rostislav/quickdrop/controller/PasswordController.java new file mode 100644 index 0000000..87a797c --- /dev/null +++ b/src/main/java/org/rostislav/quickdrop/controller/PasswordController.java @@ -0,0 +1,33 @@ +package org.rostislav.quickdrop.controller; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +@RequestMapping("/password") +public class PasswordController { + @Value("${app.basic.password}") + private String appPassword; + + @GetMapping("/login") + public String passwordPage(Model model) { + return "password"; + } + + @PostMapping("/login") + public String processPassword(@RequestParam("password") String password, HttpServletRequest request) { + if (appPassword.equals(password)) { + request.getSession().setAttribute("authenticated", true); + return "redirect:/"; // Redirect to home or the intended page + } else { + request.setAttribute("error", "Invalid Password"); + return "password"; // Show the password page with an error message + } + } +} diff --git a/src/main/java/org/rostislav/quickdrop/interceptor/PasswordInterceptor.java b/src/main/java/org/rostislav/quickdrop/interceptor/PasswordInterceptor.java new file mode 100644 index 0000000..71d3a3e --- /dev/null +++ b/src/main/java/org/rostislav/quickdrop/interceptor/PasswordInterceptor.java @@ -0,0 +1,29 @@ +package org.rostislav.quickdrop.interceptor; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +@Component +public class PasswordInterceptor implements HandlerInterceptor { + @Value("${app.enable.password}") + private Boolean enablePassword; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!enablePassword) { + return true; + } + + Boolean authenticated = (Boolean) request.getSession().getAttribute("authenticated"); + + if (authenticated != null && authenticated) { + return true; + } + + response.sendRedirect("/password/login"); + return false; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8da5c31..f834977 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -15,5 +15,7 @@ file.save.path=files file.max.age=30 logging.file.name=log/quickdrop.log file.deletion.cron=0 0 2 * * * +app.basic.password=test +app.enable.password=false #logging.level.org.springframework=DEBUG #logging.level.org.hibernate=DEBUG \ No newline at end of file diff --git a/src/main/resources/templates/filePassword.html b/src/main/resources/templates/filePassword.html new file mode 100644 index 0000000..6134ef9 --- /dev/null +++ b/src/main/resources/templates/filePassword.html @@ -0,0 +1,35 @@ + + + + + Enter Password + + + + + +

Enter Password

+
+ + +
+ + +
+ +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/password.html b/src/main/resources/templates/password.html index 6134ef9..3f71ffc 100644 --- a/src/main/resources/templates/password.html +++ b/src/main/resources/templates/password.html @@ -2,34 +2,23 @@ - Enter Password + Password Required - - - -

Enter Password

-
- - -
- - -
- -
- + - \ No newline at end of file +