diff --git a/pom.xml b/pom.xml index 35c733a..620c477 100644 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,12 @@ vaadin-testbench-junit5 test + + org.projectlombok + lombok + 1.18.30 + provided + diff --git a/src/main/java/pro/norbot/application/security/SecurityConfiguration.java b/src/main/java/pro/norbot/application/security/SecurityConfiguration.java index 2d58d77..060eb2d 100644 --- a/src/main/java/pro/norbot/application/security/SecurityConfiguration.java +++ b/src/main/java/pro/norbot/application/security/SecurityConfiguration.java @@ -8,7 +8,6 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import pro.norbot.application.views.login.LoginView; @EnableWebSecurity @Configuration @@ -22,15 +21,17 @@ @Override protected void configure(HttpSecurity http) throws Exception { - http.authorizeHttpRequests( - authorize -> authorize.requestMatchers(new AntPathRequestMatcher("/images/*.png")).permitAll()); + //http.authorizeHttpRequests( + // authorize -> authorize.requestMatchers(new AntPathRequestMatcher("/images/*.png")).permitAll()); // Icons from the line-awesome addon - http.authorizeHttpRequests(authorize -> authorize - .requestMatchers(new AntPathRequestMatcher("/line-awesome/**/*.svg")).permitAll()); + //http.authorizeHttpRequests(authorize -> authorize + // .requestMatchers(new AntPathRequestMatcher("/line-awesome/**/*.svg")).permitAll()); + + http.authorizeHttpRequests(authorize -> authorize.requestMatchers(new AntPathRequestMatcher("/**", "GET")).permitAll()); super.configure(http); - setLoginView(http, LoginView.class); + //setLoginView(http, LoginView.class); } } diff --git a/src/main/java/pro/norbot/application/views/admin/AdminView.java b/src/main/java/pro/norbot/application/views/admin/AdminView.java index 5707fe2..2f74707 100644 --- a/src/main/java/pro/norbot/application/views/admin/AdminView.java +++ b/src/main/java/pro/norbot/application/views/admin/AdminView.java @@ -15,9 +15,9 @@ import com.vaadin.flow.theme.lumo.LumoUtility.Padding; import jakarta.annotation.security.RolesAllowed; -@PageTitle("Admin") -@Route(value = "admin") -@RolesAllowed("ADMIN") +//@PageTitle("Admin") +//@Route(value = "admin") +//@RolesAllowed("ADMIN") public class AdminView extends Composite { public AdminView() { diff --git a/src/main/java/pro/norbot/application/views/error/NotFoundView.java b/src/main/java/pro/norbot/application/views/error/NotFoundView.java new file mode 100644 index 0000000..05f8f7f --- /dev/null +++ b/src/main/java/pro/norbot/application/views/error/NotFoundView.java @@ -0,0 +1,85 @@ +package pro.norbot.application.views.error; + +import com.vaadin.flow.component.*; +import com.vaadin.flow.component.page.Push; +import com.vaadin.flow.router.BeforeEnterEvent; +import com.vaadin.flow.router.ErrorParameter; +import com.vaadin.flow.router.HasErrorParameter; +import com.vaadin.flow.router.NotFoundException; +import com.vaadin.flow.server.VaadinSession; +import com.vaadin.flow.shared.communication.PushMode; +import jakarta.servlet.http.HttpServletResponse; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; + +@Tag(Tag.DIV) +public class NotFoundView extends Component implements HasErrorParameter { + + private final Map sessionMap = new HashMap<>(); + + @Override + protected void onAttach(AttachEvent event) { + String sessionId = event.getUI().getSession().getSession().getId(); + if (!sessionMap.containsKey(sessionId)) return; + CustomSession customSession = sessionMap.get(sessionId); + customSession.newTask(); + } + + @Override + protected void onDetach(DetachEvent event) { + String sessionId = event.getUI().getSession().getSession().getId(); + if (!sessionMap.containsKey(sessionId)) return; + sessionMap.get(sessionId).cancel(); + } + + @Override + public int setErrorParameter(BeforeEnterEvent event, ErrorParameter errorParameter) { + String sessionId = event.getUI().getSession().getSession().getId(); + CustomSession customSession = sessionMap.getOrDefault(sessionId, new CustomSession(sessionId, event.getLocation().getPath())); + sessionMap.put(sessionId, customSession); + return HttpServletResponse.SC_NOT_FOUND; + } + + @Getter + @RequiredArgsConstructor + private class CustomSession { + private final AtomicInteger atomicInteger = new AtomicInteger(5); + private final String sessionId; + private final String path; + private Timer timer = null; + + private void newTask() { + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + getUI().ifPresent(ui -> ui.access(() -> { + if (ui.getPushConfiguration().getPushMode() != PushMode.AUTOMATIC) + ui.getPushConfiguration().setPushMode(PushMode.AUTOMATIC); + ui.getElement().setText(generateText()); + if (atomicInteger.get() >= 0) return; + cancel(); + ui.getPage().setLocation("/"); + })); + } + }, 0, 1000); + } + + private void cancel() { + if (timer == null) return; + timer.cancel(); + sessionMap.remove(sessionId); + } + + private String generateText() { + return String.format("Could not navigate to '%s'. Redirection in %s seconds...", getPath(), getAtomicInteger().getAndDecrement()); + } + } +} diff --git a/src/main/java/pro/norbot/application/views/login/LoginView.java b/src/main/java/pro/norbot/application/views/login/LoginView.java index c031bce..f46497b 100644 --- a/src/main/java/pro/norbot/application/views/login/LoginView.java +++ b/src/main/java/pro/norbot/application/views/login/LoginView.java @@ -11,9 +11,9 @@ import com.vaadin.flow.server.auth.AnonymousAllowed; import pro.norbot.application.security.AuthenticatedUser; -@AnonymousAllowed -@PageTitle("Login") -@Route(value = "login") +//@AnonymousAllowed +//@PageTitle("Login") +//@Route(value = "login") public class LoginView extends LoginOverlay implements BeforeEnterObserver { private final AuthenticatedUser authenticatedUser; diff --git a/src/main/java/pro/norbot/application/views/main/MainView.java b/src/main/java/pro/norbot/application/views/main/MainView.java index f046429..640b536 100644 --- a/src/main/java/pro/norbot/application/views/main/MainView.java +++ b/src/main/java/pro/norbot/application/views/main/MainView.java @@ -1,19 +1,14 @@ package pro.norbot.application.views.main; import com.vaadin.flow.component.Component; -import com.vaadin.flow.component.Svg; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.Image; -import com.vaadin.flow.component.html.Paragraph; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import com.vaadin.flow.server.auth.AnonymousAllowed; -import com.vaadin.flow.theme.lumo.LumoUtility.Margin; -@PageTitle("Main") +@PageTitle("Norbot.pro") @Route(value = "") @AnonymousAllowed public class MainView extends VerticalLayout { @@ -30,6 +25,9 @@ // add(header); // add(new Paragraph("It’s a place where you can grow your own UI 🤗")); add(createHorizontalLayout( + createImg("images/discord.png", "discord", "https://discordapp.com/users/287220288205225984") + )); + add(createHorizontalLayout( createImg("images/jb_teamcity.png", "teamcity", "/teamcity"), createImg("images/jb_youtrack.png", "youtrack", "/youtrack"), createImg("images/gitbucket.png", "git", "/git"), @@ -49,7 +47,7 @@ private Image createImg(String path, String name, String url) { Image img = new Image(path, name); - img.setWidth("80px"); + img.setWidth("115px"); img.addClickListener(event -> getUI().ifPresent(ui -> ui.getPage().setLocation(url))); return img; } diff --git a/src/main/resources/META-INF/resources/images/gitbucket.png b/src/main/resources/META-INF/resources/images/gitbucket.png index 945d93a..3eafb2d 100644 --- a/src/main/resources/META-INF/resources/images/gitbucket.png +++ b/src/main/resources/META-INF/resources/images/gitbucket.png Binary files differ