diff --git a/btc-UI/src/app/constants/http-routs.ts b/btc-UI/src/app/constants/http-routs.ts index faa7833..e516515 100755 --- a/btc-UI/src/app/constants/http-routs.ts +++ b/btc-UI/src/app/constants/http-routs.ts @@ -1,6 +1,6 @@ export class ApplicationHttpRouts { private static readonly PROTOCOL: string = 'http'; - private static readonly BACKEND_SERVER: string = '192.168.0.100'; + private static readonly BACKEND_SERVER: string = '10.131.90.167'; private static readonly FRONT_PORT_NUMBER: string = '4200'; private static readonly PORT_NUMBER: string = '8083'; private static readonly SOCKET: string = `${this.PROTOCOL}://${this.BACKEND_SERVER}:${this.PORT_NUMBER}`; diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 0000000..b7be805 --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1,2 @@ +# Ignore database data directory +/db_data/ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index ec077ed..987f7aa 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -31,7 +31,7 @@ services: spring: #image: mathewfrancisv/spring_back_postgres:v1.0.0 - image: mathewfrancisv/btc_cezen_backend:v1.0.0 + image: mathewfrancisv/btc_cezen_backend:v1.0.2 container_name: spring_app ports: - "8083:8080" @@ -41,7 +41,7 @@ services: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/horse SPRING_DATASOURCE_USERNAME: postgres # Ensure this matches POSTGRES_USER SPRING_DATASOURCE_PASSWORD: root # Ensure this matches POSTGRES_PASSWORD - SPRING_DATASOURCE_CORSIP: http://192.168.0.100:4200 + SPRING_DATASOURCE_CORSIP: http://10.131.90.167:4200 #network_mode: host networks: - app_network diff --git a/springHorse/pom.xml b/springHorse/pom.xml index be8640a..5b79e9a 100755 --- a/springHorse/pom.xml +++ b/springHorse/pom.xml @@ -55,6 +55,12 @@ + + + org.springframework.boot + spring-boot-starter-websocket + + org.springframework.boot spring-boot-starter-test diff --git a/springHorse/src/main/java/com/example/cezenBTC/config/CezenRoutsSecurityChain.java b/springHorse/src/main/java/com/example/cezenBTC/config/CezenRoutsSecurityChain.java index 36d8396..a86e877 100755 --- a/springHorse/src/main/java/com/example/cezenBTC/config/CezenRoutsSecurityChain.java +++ b/springHorse/src/main/java/com/example/cezenBTC/config/CezenRoutsSecurityChain.java @@ -91,7 +91,7 @@ public class CezenRoutsSecurityChain { //.csrf(AbstractHttpConfigurer::disable) .csrf((csrf) -> csrf.csrfTokenRequestHandler(requestHandler). - ignoringRequestMatchers("/open/signup","/user/getXSRfToken","/user/ping") + ignoringRequestMatchers("/open/signup","/user/getXSRfToken","/user/ping","/websocket","/websocket/**") //.csrfTokenRepository(new CookieCsrfTokenRepository()) .csrfTokenRepository(cookieCsrfTokenRepo) ) @@ -111,11 +111,13 @@ public class CezenRoutsSecurityChain { "/btc/get_race_card", "/cezen/set_aors", "/cezen/set_password", - "/cezen/add_extension" + "/cezen/add_extension", + "/test/crash" ).hasAnyRole("admin") //any one who is authenticated can access /logout .requestMatchers("/user/getXSRfToken","/user/ping", "/logout").authenticated() //all the rest are open to public + .requestMatchers("/websocket", "/websocket/**").permitAll() .requestMatchers( "/open/login").permitAll() ) // redirect to /login if the user is not authenticated Customizer.withDefaults() enables a security feature using the defaults provided by Spring Security diff --git a/springHorse/src/main/java/com/example/cezenBTC/config/CezenWebSocketConfig.java b/springHorse/src/main/java/com/example/cezenBTC/config/CezenWebSocketConfig.java new file mode 100644 index 0000000..98fd464 --- /dev/null +++ b/springHorse/src/main/java/com/example/cezenBTC/config/CezenWebSocketConfig.java @@ -0,0 +1,27 @@ +package com.example.cezenBTC.config; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +// written by mathew francis +// this class is the configuration for a web socket +@Configuration +@EnableWebSocketMessageBroker +public class CezenWebSocketConfig implements WebSocketMessageBrokerConfigurer{ + + @Override + public void configureMessageBroker(MessageBrokerRegistry config) { + config.enableSimpleBroker("/topic"); // Enables a simple memory-based message broker to carry messages back to the client on destinations prefixed with /topic + config.setApplicationDestinationPrefixes("/app"); // Prefix for messages from client to backend + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/websocket").setAllowedOrigins("*"); // Native WebSocket + + registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS(); // Registers "/websocket" endpoint and enables SockJS fallback + } + +} diff --git a/springHorse/src/main/java/com/example/cezenBTC/controller/TestApi.java b/springHorse/src/main/java/com/example/cezenBTC/controller/TestApi.java new file mode 100644 index 0000000..0f50846 --- /dev/null +++ b/springHorse/src/main/java/com/example/cezenBTC/controller/TestApi.java @@ -0,0 +1,23 @@ +package com.example.cezenBTC.controller; + +import com.example.cezenBTC.service.BtcWebSocketService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/test") +public class TestApi { + + @Autowired + BtcWebSocketService btcWebSocketService; + + @GetMapping("/crash") + String breakConnection(){ + + btcWebSocketService.sendServerDownNotification(); + + return "Backend error"; + } +} diff --git a/springHorse/src/main/java/com/example/cezenBTC/security/JWTTokenValidatorFilter.java b/springHorse/src/main/java/com/example/cezenBTC/security/JWTTokenValidatorFilter.java index 186fcd7..9cd5eb1 100755 --- a/springHorse/src/main/java/com/example/cezenBTC/security/JWTTokenValidatorFilter.java +++ b/springHorse/src/main/java/com/example/cezenBTC/security/JWTTokenValidatorFilter.java @@ -79,8 +79,10 @@ public class JWTTokenValidatorFilter extends OncePerRequestFilter { protected boolean shouldNotFilter(HttpServletRequest request) { return request.getServletPath().equals("/open/signup") - || request.getServletPath().equals("/open/login"); + || request.getServletPath().equals("/open/login") + || request.getServletPath().equals("/websocket/**") + || request.getServletPath().equals("/websocket"); // //bellow was done to archive this /exposed/** -// request.getServletPath().split("/")[1].equals("exposed"); +// request.getServletPath().split("/")[1].equals("exposed"); /websocket/** } } diff --git a/springHorse/src/main/java/com/example/cezenBTC/service/BtcWebSocketService.java b/springHorse/src/main/java/com/example/cezenBTC/service/BtcWebSocketService.java new file mode 100644 index 0000000..39a5ef5 --- /dev/null +++ b/springHorse/src/main/java/com/example/cezenBTC/service/BtcWebSocketService.java @@ -0,0 +1,17 @@ +package com.example.cezenBTC.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.stereotype.Service; + +@Service +public class BtcWebSocketService { + + @Autowired + private SimpMessagingTemplate template; + + public void sendServerDownNotification() { + template.convertAndSend("/topic/server-status", "DOWN"); + } + +}