Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MERGE: API SERVER #52

Open
wants to merge 48 commits into
base: feature/merge
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
36c1d1e
init(project): structure
CatOrLeader Jun 10, 2024
f93f2a2
init(project): action
CatOrLeader Jun 10, 2024
9ca17d6
init(project): action
CatOrLeader Jun 10, 2024
f3b68b0
impl(file-server): token filter
CatOrLeader Jun 11, 2024
94bdc04
impl(file-server): token filter
CatOrLeader Jun 11, 2024
ba3591b
impl(file-server): token filter
CatOrLeader Jun 11, 2024
0651959
impl(file-server): token filter
CatOrLeader Jun 11, 2024
bc224e8
Merge pull request #8 from IU-Capstone-Project-2024/feature/auth-filter
CatOrLeader Jun 11, 2024
0b9900d
impl(file-server): db
CatOrLeader Jun 11, 2024
9f48412
impl(api-server): db
CatOrLeader Jun 13, 2024
bb8467a
impl(api-server): db
CatOrLeader Jun 13, 2024
a3ed6d0
impl(api-server): db
CatOrLeader Jun 13, 2024
ddf337a
Merge pull request #18 from IU-Capstone-Project-2024/feature/db-conne…
CatOrLeader Jun 13, 2024
a2da9bb
impl(api-server): db
CatOrLeader Jun 13, 2024
2973c18
impl(api-server): api
CatOrLeader Jun 14, 2024
9c6ef6c
Merge pull request #19 from IU-Capstone-Project-2024/feature/api-impl
m0t9 Jun 14, 2024
f5dd651
impl(api-server): api
CatOrLeader Jun 21, 2024
a6a182e
impl(api-server): api
CatOrLeader Jun 21, 2024
3f84eb8
Merge pull request #27 from IU-Capstone-Project-2024/feature/api-refa…
CatOrLeader Jun 21, 2024
5c7bd21
impl(api-server): api
CatOrLeader Jun 22, 2024
f96bf65
Merge pull request #33 from IU-Capstone-Project-2024/feature/python-a…
CatOrLeader Jun 22, 2024
f71d666
impl(api-server): SonarQube
CatOrLeader Jul 6, 2024
5458190
impl(api-server): tests
CatOrLeader Jul 6, 2024
5f14f13
impl(api-server): tests
CatOrLeader Jul 6, 2024
6ca6c83
impl(api-server): tests
CatOrLeader Jul 6, 2024
d492559
Merge remote-tracking branch 'origin/feature/tests' into feature/tests
CatOrLeader Jul 6, 2024
1704116
impl(api-server): tests
CatOrLeader Jul 6, 2024
981bc75
impl(api-server): tests
CatOrLeader Jul 6, 2024
0f573b2
Merge remote-tracking branch 'origin/feature/tests' into feature/tests
CatOrLeader Jul 6, 2024
0af9a6d
impl(api-server): tests
CatOrLeader Jul 6, 2024
bf773d3
Merge pull request #39 from IU-Capstone-Project-2024/feature/tests
CatOrLeader Jul 6, 2024
7c6a50a
impl(db): ddos prevention
CatOrLeader Jul 6, 2024
2b9e8cb
Merge pull request #40 from IU-Capstone-Project-2024/db/trigger
CatOrLeader Jul 6, 2024
4a4b5d9
impl(api-server): cors
CatOrLeader Jul 7, 2024
575daf6
Merge pull request #41 from IU-Capstone-Project-2024/feature/cors-ena…
CatOrLeader Jul 7, 2024
abd1b64
fix(api-server): linux docker compose
CatOrLeader Jul 7, 2024
e58a344
fix(api-server): token disable
CatOrLeader Jul 7, 2024
40e3f88
impl(api-server): one folder
CatOrLeader Jul 10, 2024
74f83ef
impl(api-server): one folder
CatOrLeader Jul 10, 2024
5a775d0
Merge remote-tracking branch 'origin/feature/one-folder' into feature…
CatOrLeader Jul 10, 2024
0bc7b78
impl(api-server): one folder
CatOrLeader Jul 10, 2024
6a15880
Merge pull request #50 from IU-Capstone-Project-2024/feature/one-folder
CatOrLeader Jul 10, 2024
aac1b95
impl(api-server): cors
CatOrLeader Jul 10, 2024
11fd1a6
impl(api-server): cors
CatOrLeader Jul 10, 2024
0ac61f4
impl(api-server): db & cors & controller
CatOrLeader Jul 10, 2024
137d414
impl(api-server): db & cors & controller
CatOrLeader Jul 10, 2024
f3e1dd3
impl(api-server): db & cors & controller
CatOrLeader Jul 10, 2024
2fb5a6f
Merge pull request #51 from IU-Capstone-Project-2024/feature/refactoring
CatOrLeader Jul 10, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -317,8 +317,12 @@
</goals>
<configuration>
<excludes>
<!-- TO FILL LATER -->
<!-- <exclude>com/java/FileServerApplication*</exclude> -->
<exclude>com/java/api/exception/*</exclude>
<exclude>com/java/api/model/**</exclude>
<exclude>com/java/api/*API.*</exclude>
<exclude>com.java.api.ApiExceptionHandler</exclude>
<exclude>com/java/configuration/*.*</exclude>
<exclude>com/java/MonidormApplication*</exclude>
</excludes>
</configuration>
</execution>
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/java/api/ApiExceptionHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.java.api;

import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ApiExceptionHandler {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.java.api.exception;

public class MissingOrIncorrectAuthorizationHeaderException extends RuntimeException {
}
41 changes: 41 additions & 0 deletions src/main/java/com/java/api/filter/AuthorizationFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.java.api.filter;

import com.java.api.exception.MissingOrIncorrectAuthorizationHeaderException;
import com.java.configuration.ApplicationConfiguration;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import java.io.IOException;
import org.springframework.http.HttpStatus;

public class AuthorizationFilter implements Filter {
private final String apiToken;

public AuthorizationFilter(@NotNull ApplicationConfiguration configuration) {
this.apiToken = configuration.apiToken();
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

var token = request.getHeader("Authorization");

try {
if (token == null || !token.equals(apiToken)) {
throw new MissingOrIncorrectAuthorizationHeaderException();
}

filterChain.doFilter(servletRequest, servletResponse);
} catch (MissingOrIncorrectAuthorizationHeaderException exception) {
response.sendError(HttpStatus.FORBIDDEN.value());
}
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/java/configuration/FilterConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.java.configuration;

import com.java.api.filter.AuthorizationFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
@RequiredArgsConstructor
public class FilterConfiguration {
private final ApplicationConfiguration configuration;

@Bean
public FilterRegistrationBean<AuthorizationFilter> authorizationFilter() {
FilterRegistrationBean<AuthorizationFilter> registrationBean = new FilterRegistrationBean<>();

registrationBean.setFilter(new AuthorizationFilter(configuration));
registrationBean.addUrlPatterns("/api/*");
registrationBean.setOrder(1);

return registrationBean;
}
}
72 changes: 72 additions & 0 deletions src/test/java/com/java/api/filter/AuthorizationFilterTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.java.api.filter;

import com.java.api.exception.MissingOrIncorrectAuthorizationHeaderException;
import com.java.configuration.ApplicationConfiguration;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.HttpStatus;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.assertj.core.api.Assertions.assertThatNoException;

@ExtendWith(MockitoExtension.class)
public class AuthorizationFilterTest {
private static final String HEADER_NAME = "Authorization";
private static final String API_TOKEN = "TOKEN";
private static ServletRequest request;
private static ServletResponse response;
private static FilterChain chain;
private static Filter authorizationFilter;

@BeforeAll
static void tearUp() throws ServletException, IOException {
ApplicationConfiguration configuration = Mockito.mock(ApplicationConfiguration.class);
Mockito.when(configuration.apiToken()).thenReturn(API_TOKEN);

authorizationFilter = new AuthorizationFilter(configuration);

request = Mockito.mock(ServletRequest.class, Mockito.withSettings().extraInterfaces(HttpServletRequest.class));
response =
Mockito.mock(ServletResponse.class, Mockito.withSettings().extraInterfaces(HttpServletResponse.class));

chain = Mockito.mock(FilterChain.class);
Mockito.doNothing().when(chain).doFilter(request, response);
}

@Test
void givenNoActualToken_whenFiltering_thenExceptionIsThrown() throws IOException {
Mockito.when(((HttpServletRequest) request).getHeader(HEADER_NAME)).thenReturn(null);
Mockito.doThrow(new MissingOrIncorrectAuthorizationHeaderException()).when((HttpServletResponse) response)
.sendError(HttpStatus.FORBIDDEN.value());

assertThatExceptionOfType(MissingOrIncorrectAuthorizationHeaderException.class)
.isThrownBy(() -> authorizationFilter.doFilter(request, response, chain));
}

@Test
void givenIncorrectToken_whenFiltering_thenExceptionIsThrown() throws IOException {
Mockito.when(((HttpServletRequest) request).getHeader(HEADER_NAME)).thenReturn("INCORRECT_TOKEN");
Mockito.doThrow(new MissingOrIncorrectAuthorizationHeaderException()).when((HttpServletResponse) response)
.sendError(HttpStatus.FORBIDDEN.value());

assertThatExceptionOfType(MissingOrIncorrectAuthorizationHeaderException.class)
.isThrownBy(() -> authorizationFilter.doFilter(request, response, chain));
}

@Test
void givenActualToken_whenFiltering_thenNothingIsThrown() {
Mockito.when(((HttpServletRequest) request).getHeader(HEADER_NAME)).thenReturn(API_TOKEN);

assertThatNoException().isThrownBy(() -> authorizationFilter.doFilter(request, response, chain));
}
}