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