sonar 대응

This commit is contained in:
현성필
2023-08-22 13:57:28 +09:00
parent 32a5719a12
commit 1063aaf19e
36 changed files with 188 additions and 243 deletions
@@ -4,7 +4,6 @@ import com.eactive.httpmockserver.api.dto.MockRequest;
import com.eactive.httpmockserver.api.entity.MockCondition;
import com.eactive.httpmockserver.api.entity.MockResponse;
import com.eactive.httpmockserver.api.entity.MockRoute;
import com.eactive.httpmockserver.api.repository.MockRouteRepository;
import com.eactive.httpmockserver.api.service.MockRouteService;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
@@ -19,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -35,7 +35,7 @@ public class MockApiController {
@RequestMapping(value = "/{_:^(?!swagger-ui|mgmt|min-maps|plugins|dist|css|fonts|js|h2-console|img|pages|favicon.ico).*$}/**")
public ResponseEntity<String> handleRequest(HttpServletRequest httpRequest) {
public ResponseEntity<String> handleRequest(HttpServletRequest httpRequest) throws IOException {
MockRequest request = new MockRequest(httpRequest);
AntPathMatcher pathMatcher = new AntPathMatcher();
@@ -51,7 +51,7 @@ public class MockApiController {
try {
Thread.sleep(matchingResponse.getDelay());
} catch (InterruptedException e) {
e.printStackTrace();
logger.error("Error while delaying response", e);
}
}
HttpHeaders responseHeaders = new HttpHeaders();
@@ -98,34 +98,59 @@ public class MockApiController {
private boolean isRequestMatching(List<MockCondition> conditions, MockRequest request, Map<String, String> pathVariables) {
if (conditions == null || conditions.size() == 0) {
if (conditions == null) {
return true;
}
for (MockCondition condition : conditions) {
if (condition.getType().equalsIgnoreCase("query")) {
if(!condition.getValue().equals(request.getParam(condition.getKey()))){
return false;
}
} else if (condition.getType().equalsIgnoreCase("header")) {
if (!condition.getValue().equals(request.getHeader(condition.getKey()))){
return false;
}
} else if (condition.getType().equalsIgnoreCase("path")) {
if (!condition.getValue().equals(pathVariables.get(condition.getKey()))){
return false;
}
} else if (condition.getType().equalsIgnoreCase("jsonpath")) {
try{
Object value = JsonPath.read(request.getBody(), condition.getKey());
return value.toString().equals(condition.getValue());
}catch(PathNotFoundException e) {
return false;
}
switch (condition.getType().toLowerCase()) {
case "query":
if (!isQueryMatching(condition, request)) {
return false;
}
break;
case "header":
if (!isHeaderMatching(condition, request)) {
return false;
}
break;
case "path":
if (!isPathMatching(condition, pathVariables)) {
return false;
}
break;
case "jsonpath":
if (!isJsonPathMatching(condition, request)) {
return false;
}
break;
default:
break;
}
}
return true;
}
private boolean isQueryMatching(MockCondition condition, MockRequest request) {
return condition.getValue().equals(request.getParam(condition.getKey()));
}
private boolean isHeaderMatching(MockCondition condition, MockRequest request) {
return condition.getValue().equals(request.getHeader(condition.getKey()));
}
private boolean isPathMatching(MockCondition condition, Map<String, String> pathVariables) {
return condition.getValue().equals(pathVariables.get(condition.getKey()));
}
private boolean isJsonPathMatching(MockCondition condition, MockRequest request) {
try {
Object value = JsonPath.read(request.getBody(), condition.getKey());
return value.toString().equals(condition.getValue());
} catch (PathNotFoundException e) {
return false;
}
}
}
@@ -17,11 +17,14 @@ import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import java.util.List;
@Controller
@RequestMapping("/mgmt/routes")
public class MockRouteMgmtController {
private static final String MOCK_ROUTE = "mockRoute";
@PostConstruct
public void init() {
mockRouteService.initAllRoutes();
@@ -56,7 +59,7 @@ public class MockRouteMgmtController {
MockResponseDTO defaultResponse = new MockResponseDTO();
defaultResponse.setDefaultResponse("true");
defaultRoute.getResponses().add(defaultResponse);
model.addAttribute("mockRoute", defaultRoute);
model.addAttribute(MOCK_ROUTE, defaultRoute);
return MOCK_ROUTE_EDIT;
}
@@ -65,7 +68,7 @@ public class MockRouteMgmtController {
MockRoute found = mockRouteService.findById(id);
model.addAttribute("mockRoute", mockRouteMapper.map(found));
model.addAttribute(MOCK_ROUTE, mockRouteMapper.map(found));
return MOCK_ROUTE_EDIT;
}
@@ -79,7 +82,7 @@ public class MockRouteMgmtController {
validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("mockRoute", dto);
model.addAttribute(MOCK_ROUTE, dto);
return MOCK_ROUTE_EDIT;
}
@@ -102,7 +105,7 @@ public class MockRouteMgmtController {
validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("mockRoute", dto);
model.addAttribute(MOCK_ROUTE, dto);
return MOCK_ROUTE_EDIT;
}
@@ -114,10 +117,10 @@ public class MockRouteMgmtController {
@PostMapping("/delete.do")
public String delete(@ModelAttribute MockRouteSearch modelSearch) {
modelSearch.getCheckedIdForDel().forEach(id -> {
public String delete(@RequestParam("checkedIdForDel") List<String> ids) {
for (String id : ids) {
mockRouteService.deleteById(Long.parseLong(id));
});
}
mockRouteService.initAllRoutes();
return MOCK_ROUTE_LIST_VIEW;
}
@@ -27,7 +27,7 @@ public class MockRequest {
return queryParams;
}
public MockRequest(HttpServletRequest request) {
public MockRequest(HttpServletRequest request) throws IOException {
this.method = request.getMethod();
this.uri = request.getRequestURI();
this.headers = Collections.list(request.getHeaderNames()).stream()
@@ -35,11 +35,7 @@ public class MockRequest {
this.params = parseQueryString(request);
try {
this.body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
} catch (IOException e) {
e.printStackTrace();
}
this.body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
}
private String uri;
@@ -13,8 +13,6 @@ public class MockRouteSearch implements BaseSearch<MockRoute> {
private String name;
private List<String> checkedIdForDel;
@Override
public List<SearchModel> buildSearchCondition() {
List<SearchModel> models = new ArrayList<>();
@@ -30,11 +28,4 @@ public class MockRouteSearch implements BaseSearch<MockRoute> {
this.name = name;
}
public List<String> getCheckedIdForDel() {
return checkedIdForDel;
}
public void setCheckedIdForDel(List<String> checkedIdForDel) {
this.checkedIdForDel = checkedIdForDel;
}
}
@@ -73,8 +73,4 @@ public class MockRoute {
this.description = description;
}
public void updateFields(MockRoute update) {
}
}
@@ -77,23 +77,26 @@ public abstract class MockRouteMapper {
public List<MockHeaderDTO> mapHeadersToList(Map<String, String> headers) {
List<MockHeaderDTO> list = new ArrayList<>();
if (headers != null) {
headers.forEach((key, value) -> {
for (Map.Entry<String, String> entry : headers.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
MockHeaderDTO header = new MockHeaderDTO();
header.setKey(key);
header.setValue(value);
list.add(header);
});
}
}
return list;
}
@Named("mapHeadersToMap")
public Map<String, String> mapHeadersToMap(List<MockHeaderDTO> headers) {
Map<String, String> map = new HashMap<>();
if (headers != null) {
headers.forEach(header -> {
for (MockHeaderDTO header : headers) {
map.put(header.getKey(), header.getValue());
});
}
}
return map;
}
@@ -13,11 +13,8 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;
import java.lang.reflect.InvocationTargetException;
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
@@ -30,10 +27,7 @@ public class MockRouteService {
@Autowired
MockRouteRepository mockRouteRepository;
@PersistenceContext
private EntityManager entityManager;
private List<MockRoute> allRoutes = new ArrayList<MockRoute>();
private List<MockRoute> allRoutes = new ArrayList<>();
public List<MockRoute> getAllRoutes() {
return allRoutes;
@@ -116,7 +110,6 @@ public class MockRouteService {
}
Hibernate.initialize(response);
}
// entityManager.detach(route);
try {
MockRoute cloned = (MockRoute) BeanUtils.cloneBean(route);
allRoutes.add(cloned);
@@ -2,9 +2,9 @@ package com.eactive.httpmockserver.client.controller;
import com.eactive.httpmockserver.client.dto.ApiRequestDTO;
import com.eactive.httpmockserver.client.dto.ApiResponse;
import com.eactive.httpmockserver.client.service.NettyApiClient;
import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.client.service.NettyApiClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@@ -6,9 +6,9 @@ import com.eactive.httpmockserver.client.entity.ApiCollection;
import com.eactive.httpmockserver.client.entity.ApiRequestInfo;
import com.eactive.httpmockserver.client.mapper.ApiRequestMapper;
import com.eactive.httpmockserver.client.service.ApiRequestMgmtService;
import com.eactive.httpmockserver.common.security.CurrentUser;
import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.entity.StaffUser;
import org.springframework.beans.factory.annotation.Autowired;
import com.eactive.httpmockserver.user.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@@ -17,28 +17,36 @@ import java.util.List;
@RestController
public class ApiRequestMgmtController {
@Autowired
private static final String SUCCESS = "success";
ApiRequestMgmtService apiRequestMgmtService;
@Autowired
ApiRequestMapper apiRequestMapper;
UserService userService;
public ApiRequestMgmtController(ApiRequestMgmtService apiRequestMgmtService, ApiRequestMapper apiRequestMapper, UserService userService) {
this.apiRequestMgmtService = apiRequestMgmtService;
this.apiRequestMapper = apiRequestMapper;
this.userService = userService;
}
@GetMapping("/mgmt/collections/list.do")
public ResponseEntity<List<ApiCollectionDTO>> listApiRequests(@CurrentUser StaffUser user) {
public ResponseEntity<List<ApiCollectionDTO>> listApiRequests() {
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
List<ApiCollection> collections = apiRequestMgmtService.getMyApis(user);
return ResponseEntity.ok(apiRequestMapper.mapCollections(collections));
}
@PostMapping("/mgmt/collections/create.do")
public ResponseEntity<String> createApiCollection(
@CurrentUser StaffUser user,
@RequestBody ApiCollectionDTO dto) {
ApiCollection collection = apiRequestMapper.map(dto);
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
collection.setOwner(user);
apiRequestMgmtService.createNewApiCollection(collection);
return ResponseEntity.ok("success");
return ResponseEntity.ok(SUCCESS);
}
@@ -46,20 +54,20 @@ public class ApiRequestMgmtController {
public ResponseEntity<String> updateApiCollection(@RequestBody ApiCollectionDTO dto) {
ApiCollection updated = apiRequestMapper.map(dto);
apiRequestMgmtService.updateApiCollection(updated.getId(), updated);
return ResponseEntity.ok("success");
return ResponseEntity.ok(SUCCESS);
}
@PostMapping("/mgmt/collections/delete.do")
public ResponseEntity<String> deleteApiCollection(@RequestBody ApiCollectionDTO dto) {
apiRequestMgmtService.deleteApiCollection(dto.getId());
return ResponseEntity.ok("success");
return ResponseEntity.ok(SUCCESS);
}
@PostMapping("/mgmt/collections/{id}/apis/save.do")
public ResponseEntity<String> addApiToCollection(@PathVariable(name = "id") String id,
@RequestBody ApiRequestDTO dto,
@CurrentUser StaffUser user) {
@RequestBody ApiRequestDTO dto) {
ApiRequestInfo apiRequestInfo = apiRequestMapper.map(dto);
StaffUser user = userService.findByEsntlId(SecurityUtil.getCurrentUserEsntlId());
apiRequestInfo.setOwner(user);
String apiId = apiRequestMgmtService.saveApiToCollection(id, apiRequestInfo);
return ResponseEntity.ok(apiId);
@@ -69,7 +77,7 @@ public class ApiRequestMgmtController {
public ResponseEntity<String> removeApiFromCollection(@PathVariable(name = "id") String id,
@RequestBody ApiRequestDTO dto) {
apiRequestMgmtService.removeApiFromCollection(id, dto.getId());
return ResponseEntity.ok("success");
return ResponseEntity.ok(SUCCESS);
}
}
@@ -119,12 +119,4 @@ public class ApiRequestInfo {
return Objects.hash(id, server, owner, method, path, headers, queryParams, requestBody);
}
public static void main(String[] args) {
ApiRequestInfo a= new ApiRequestInfo();
a.setId("a");
ApiRequestInfo b = new ApiRequestInfo();
a.setId("a");
System.out.println(a.equals(b));
}
}
@@ -1,13 +1,9 @@
package com.eactive.httpmockserver.client.repository;
import com.eactive.httpmockserver.client.entity.ApiCollection;
import com.eactive.httpmockserver.client.entity.ApiRequestInfo;
import com.eactive.httpmockserver.user.entity.StaffUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List;
public interface ApiRequestRepository extends JpaRepository<ApiRequestInfo, String>, JpaSpecificationExecutor<ApiRequestInfo> {
}
@@ -18,6 +18,10 @@ import java.util.UUID;
@Transactional
public class ApiRequestMgmtService {
private static final String API_COLLECTION_NOT_FOUND = "api collection[%s] not found";
private static final String API_NOT_FOUND = "api collection[%s] not found";
@Autowired
ApiCollectionRepository apiCollectionRepository;
@@ -30,9 +34,9 @@ public class ApiRequestMgmtService {
}
public void deleteApiCollection(String id) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found"));
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
if (collection.getApis().size()>0){
if (!collection.getApis().isEmpty()) {
throw new RuntimeException("api collection[" + id + "] is not empty");
}
apiCollectionRepository.deleteById(id);
@@ -44,20 +48,20 @@ public class ApiRequestMgmtService {
}
public void updateApiCollection(String id, ApiCollection updated) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found"));
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
collection.setName(updated.getName());
apiCollectionRepository.save(collection);
}
public String saveApiToCollection(String id, ApiRequestInfo api) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found"));
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
if (StringUtils.isEmpty(api.getId())) {
api.setId(UUID.randomUUID().toString());
apiRequestRepository.save(api);
} else {
String apiId = api.getId();
ApiRequestInfo existing = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found"));
ApiRequestInfo existing = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException(String.format(API_NOT_FOUND, apiId)));
existing.setName(api.getName());
existing.setMethod(api.getMethod());
existing.setPath(api.getPath());
@@ -79,8 +83,8 @@ public class ApiRequestMgmtService {
}
public void removeApiFromCollection(String id, String apiId) {
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException("api collection[" + id + "] not found"));
ApiRequestInfo api = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException("api[" + apiId + "] not found"));
ApiCollection collection = apiCollectionRepository.findById(id).orElseThrow(() -> new NotFoundException(String.format(API_COLLECTION_NOT_FOUND, id)));
ApiRequestInfo api = apiRequestRepository.findById(apiId).orElseThrow(() -> new NotFoundException(String.format(API_NOT_FOUND, apiId)));
collection.getApis().remove(api);
apiCollectionRepository.save(collection);
@@ -20,8 +20,8 @@ public class ApiRequestMigrationService {
public void migrate() {
apiRequestRepository.findAll().forEach(apiRequest -> {
apiRequest.setHeaders(apiRequest.getHeaders().replaceAll("=", "::"));
apiRequest.setQueryParams(apiRequest.getQueryParams().replaceAll("=", "::"));
apiRequest.setHeaders(apiRequest.getHeaders().replace("=", "::"));
apiRequest.setQueryParams(apiRequest.getQueryParams().replace("=", "::"));
apiRequestRepository.save(apiRequest);
});
@@ -1,8 +1,9 @@
package com.eactive.httpmockserver.client.service;
import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO;
import com.eactive.httpmockserver.client.dto.ApiRequestDTO;
import com.eactive.httpmockserver.client.dto.ApiRequestKeyValueDTO;
import com.eactive.httpmockserver.client.dto.ApiResponse;
import com.eactive.httpmockserver.common.exception.ServerNotFoundException;
import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import io.netty.bootstrap.Bootstrap;
@@ -24,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.net.ssl.SSLException;
import java.nio.file.Paths;
import java.util.concurrent.CompletableFuture;
@Service
@@ -32,9 +34,9 @@ public class NettyApiClient {
@Autowired
ServerRepository serverRepository;
public CompletableFuture<ApiResponse> handleRequest(ApiRequestDTO apiRequest) throws Exception {
public CompletableFuture<ApiResponse> handleRequest(ApiRequestDTO apiRequest) throws InterruptedException {
Server server = serverRepository.findById(apiRequest.getServer()).orElseThrow(() -> new Exception("Server not found"));
Server server = serverRepository.findById(apiRequest.getServer()).orElseThrow(() -> new ServerNotFoundException("Server not found"));
String host = server.getHostname();
int port = server.getPort();
@@ -74,12 +76,9 @@ public class NettyApiClient {
}
String basePath = server.getBasePath();
if(!apiRequest.getPath().startsWith("/")){
basePath = basePath + "/";
}
String fullPath = Paths.get(basePath, apiRequest.getPath()).toString();
HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.valueOf(apiRequest.getMethod()),
(basePath + apiRequest.getPath()).replaceAll("//", "/"), content);
HttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.valueOf(apiRequest.getMethod()), fullPath, content);
request.headers().set("Host", host);
request.headers().set("Connection", HttpHeaderValues.CLOSE);
@@ -89,9 +88,9 @@ public class NettyApiClient {
request.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
}
if (apiRequest.getHeaders().size() > 0) {
if (!apiRequest.getHeaders().isEmpty()) {
HttpHeaders customHeaders = new DefaultHttpHeaders();
apiRequest.getHeaders().stream().filter(ApiRequestKeyValueDTO::isEnabled).forEach((header) -> {
apiRequest.getHeaders().stream().filter(ApiRequestKeyValueDTO::isEnabled).forEach(header -> {
if(StringUtils.isNotEmpty(header.getKey()) && StringUtils.isNotEmpty(header.getValue())){
customHeaders.set(header.getKey(), header.getValue());
}
@@ -0,0 +1,8 @@
package com.eactive.httpmockserver.common.exception;
public class ServerNotFoundException extends RuntimeException {
public ServerNotFoundException(String message) {
super(message);
}
}
@@ -1,9 +0,0 @@
package com.eactive.httpmockserver.common.security;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser {
}
@@ -1,49 +0,0 @@
package com.eactive.httpmockserver.common.security;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.common.exception.UserNotLoginException;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.security.core.Authentication;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import java.lang.reflect.InvocationTargetException;
public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(CurrentUser.class) != null &&
parameter.getParameterType().equals(StaffUser.class);
}
@Override
@Transactional
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
Authentication authentication = (Authentication) webRequest.getUserPrincipal();
if (authentication == null || !authentication.isAuthenticated()) {
throw new UserNotLoginException();
}
StaffUser user = null;
try {
user = userService.findByEsntlId((String) PropertyUtils.getProperty(authentication.getPrincipal(), "esntlId"));
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
throw new NotFoundException("User not found");
}
if (user == null) throw new UserNotLoginException();
return user;
}
}
@@ -1,8 +1,8 @@
package com.eactive.httpmockserver.common.validator;
import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.common.util.ApplicationContextUtil;
import com.eactive.httpmockserver.user.service.UserService;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
@@ -7,7 +7,8 @@ import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Service;
@@ -22,12 +23,16 @@ import java.io.IOException;
@Transactional
public class PortalAuthenticationFailureHandler implements AuthenticationFailureHandler {
@Autowired
private static final Logger logger = LoggerFactory.getLogger(PortalAuthenticationFailureHandler.class);
UserService userService;
@Autowired
StaffUserRepository staffUserRepository;
public PortalAuthenticationFailureHandler(UserService userService, StaffUserRepository staffUserRepository) {
this.userService = userService;
this.staffUserRepository = staffUserRepository;
}
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {AuthenticationException.class, UserNotFoundException.class})
@@ -44,7 +49,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure
staffUserRepository.save((StaffUser) user);
}
} catch (UserNotFoundException ignored) {
} catch (UserNotFoundException e) {
logger.error("{} login try {}", username, e.getMessage());
}
request.getSession().setAttribute(LoginController.LOGIN_MESSAGE, exception.getLocalizedMessage());
@@ -31,7 +31,7 @@ public class PortalAuthenticationSuccessHandler implements AuthenticationSuccess
userService.updateUser((User) user);
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/");
response.sendRedirect(contextPath + "/mgmt/routes/list_view.do");
}
@Override
@@ -3,13 +3,10 @@ package com.eactive.httpmockserver.config;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
/**
* @author
@@ -16,6 +16,21 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@EnableWebSecurity
public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
private final PortalAuthenticationFailureHandler authenticationFailureHandler;
private final PortalAuthenticationSuccessHandler authenticationSuccessHandler;
private final PortalAuthenticationManager portalAuthenticationManager;
@Autowired
public PortalConfigSecurity(PortalAuthenticationFailureHandler authenticationFailureHandler,
PortalAuthenticationSuccessHandler authenticationSuccessHandler,
PortalAuthenticationManager portalAuthenticationManager) {
this.authenticationFailureHandler = authenticationFailureHandler;
this.authenticationSuccessHandler = authenticationSuccessHandler;
this.portalAuthenticationManager = portalAuthenticationManager;
}
@Bean
public FilterRegistrationBean<XssEscapeServletFilter> xssFilterRegistrationBean() {
FilterRegistrationBean<XssEscapeServletFilter> registrationBean = new FilterRegistrationBean<>();
@@ -26,12 +41,6 @@ public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
return registrationBean;
}
@Autowired
public PortalAuthenticationFailureHandler authenticationFailureHandler;
@Autowired
public PortalAuthenticationSuccessHandler authenticationSuccessHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
@@ -56,9 +65,6 @@ public class PortalConfigSecurity extends WebSecurityConfigurerAdapter {
}
@Autowired
PortalAuthenticationManager portalAuthenticationManager;
@Override
@Bean
public PortalAuthenticationManager authenticationManager() {
@@ -1,7 +1,6 @@
package com.eactive.httpmockserver.config;
import com.eactive.httpmockserver.common.interceptor.AuthenticInterceptor;
import com.eactive.httpmockserver.common.security.CurrentUserArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
@@ -42,13 +41,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserArgumentResolver());
resolvers.add(pageableHandlerMethodArgumentResolver());
}
@Bean
public CurrentUserArgumentResolver currentUserArgumentResolver() {
return new CurrentUserArgumentResolver();
}
@Bean
public PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver() {
@@ -8,6 +8,6 @@ public class HomeController {
@GetMapping("/")
public String home() {
return "index";
return "redirect:/mgmt/routes/list_view.do";
}
}
@@ -1,9 +1,9 @@
package com.eactive.httpmockserver.server.controller;
import com.eactive.httpmockserver.server.mapper.ServerMapper;
import com.eactive.httpmockserver.server.dto.ServerDTO;
import com.eactive.httpmockserver.server.dto.ServerSearch;
import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.mapper.ServerMapper;
import com.eactive.httpmockserver.server.service.ServerMgmtService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +15,8 @@ import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequestMapping("/mgmt/servers")
@@ -29,6 +31,8 @@ public class ServerMgmtController {
@Autowired
private Validator validator;
public static final String SERVER = "server";
public static final String SERVER_EDIT = "page/servers/serverEdit";
public static final String SERVER_LIST_VIEW = "redirect:/mgmt/servers/list_view.do";
@@ -49,7 +53,7 @@ public class ServerMgmtController {
@GetMapping("/create_view.do")
public String createView(ModelMap model) {
ServerDTO defaultServer = new ServerDTO();
model.addAttribute("server", defaultServer);
model.addAttribute(SERVER, defaultServer);
return SERVER_EDIT;
}
@@ -57,12 +61,12 @@ public class ServerMgmtController {
public String updateView(ModelMap model, @RequestParam("id") Long id) {
Server found = serverMgmtService.findById(id);
ServerDTO server = serverMapper.map(found);
model.addAttribute("server", server);
model.addAttribute(SERVER, server);
return SERVER_EDIT;
}
@PostMapping("/register.do")
public String register(@ModelAttribute("server") ServerDTO dto,
public String register(@ModelAttribute(SERVER) ServerDTO dto,
BindingResult bindingResult,
ModelMap model) {
@@ -73,7 +77,7 @@ public class ServerMgmtController {
validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("server", dto);
model.addAttribute(SERVER, dto);
return SERVER_EDIT;
}
@@ -83,7 +87,7 @@ public class ServerMgmtController {
}
@PostMapping("/update.do")
public String update(@ModelAttribute("server") ServerDTO dto,
public String update(@ModelAttribute(SERVER) ServerDTO dto,
BindingResult bindingResult,
ModelMap model) {
@@ -94,7 +98,7 @@ public class ServerMgmtController {
validator.validate(dto, bindingResult);
if (bindingResult.hasErrors()) {
model.addAttribute("server", dto);
model.addAttribute(SERVER, dto);
return SERVER_EDIT;
}
@@ -104,12 +108,10 @@ public class ServerMgmtController {
}
@PostMapping("/delete.do")
public String delete(@ModelAttribute ServerSearch modelSearch) {
modelSearch.getCheckedIdForDel().forEach(id -> {
public String delete(@RequestParam("checkedIdForDel") List<String> checkedIdForDel) {
for (String id : checkedIdForDel) {
serverMgmtService.delete(Long.parseLong(id));
});
}
return SERVER_LIST_VIEW;
}
@@ -20,8 +20,6 @@ public class ServerSearch implements BaseSearch<Server> {
private String port;
private List<String> checkedIdForDel;
@Override
public List<SearchModel> buildSearchCondition() {
List<SearchModel> models = new ArrayList<>();
@@ -77,11 +75,4 @@ public class ServerSearch implements BaseSearch<Server> {
this.port = port;
}
public List<String> getCheckedIdForDel() {
return checkedIdForDel;
}
public void setCheckedIdForDel(List<String> checkedIdForDel) {
this.checkedIdForDel = checkedIdForDel;
}
}
@@ -1,10 +1,10 @@
package com.eactive.httpmockserver.server.mapper;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.server.dto.ServerDTO;
import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
import org.springframework.beans.factory.annotation.Autowired;
@@ -1,8 +1,8 @@
package com.eactive.httpmockserver.server.service;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import com.eactive.httpmockserver.common.exception.NotFoundException;
import com.eactive.httpmockserver.server.entity.Server;
import com.eactive.httpmockserver.server.entity.ServerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -1,10 +1,8 @@
package com.eactive.httpmockserver.user.controller;
import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.dto.PasswordChangeRequestDTO;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.service.UserService;
import com.eactive.httpmockserver.common.security.CurrentUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
@@ -18,6 +16,7 @@ import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class AccountController {
public static final String UPDATE_PW = "page/updatePw";
@Autowired
private Validator validator;
@@ -25,33 +24,31 @@ public class AccountController {
private UserService userService;
@GetMapping("/change_password.do")
public String changePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO) {
return "page/updatePw";
public String changePassword( @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO) {
return UPDATE_PW;
}
@PostMapping(value = "/update_password.do")
@Transactional
public String updatePassword(ModelMap model, @ModelAttribute("passwordChangeRequest") PasswordChangeRequestDTO passwordChangeRequestDTO,
@CurrentUser StaffUser user,
BindingResult result) {
validator.validate(passwordChangeRequestDTO, result);
if (result.hasErrors()) {
model.addAttribute("errors", result);
return "page/updatePw";
return UPDATE_PW;
}
String oldPassword = passwordChangeRequestDTO.getOldPassword();
String newPassword = passwordChangeRequestDTO.getNewPassword();
String newPassword2 = passwordChangeRequestDTO.getNewPassword2();
String resultMsg = userService.updateUserPassword(user.getUserId(), oldPassword, newPassword, newPassword2);
String resultMsg = userService.updateUserPassword(SecurityUtil.getCurrentUserEsntlId(), oldPassword, newPassword, newPassword2);
model.addAttribute("resultMsg", resultMsg);
model.addAttribute("passwordChangeRequest", new PasswordChangeRequestDTO());
return "page/updatePw";
return "redirect:/";
}
@@ -1,11 +1,10 @@
package com.eactive.httpmockserver.user.controller;
import com.eactive.httpmockserver.common.security.CurrentUser;
import com.eactive.httpmockserver.common.util.SecurityUtil;
import com.eactive.httpmockserver.user.dto.UserRegisterDTO;
import com.eactive.httpmockserver.user.dto.UserSearch;
import com.eactive.httpmockserver.user.dto.UserUpdateDTO;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.mapper.StaffUserMapper;
import com.eactive.httpmockserver.user.service.StaffUserService;
import org.apache.commons.lang3.StringUtils;
@@ -108,10 +107,9 @@ public class UserMgmtController {
@PostMapping("/delete.do")
public String delete(@CurrentUser User user,
@ModelAttribute UserSearch modelSearch) {
public String delete(@ModelAttribute UserSearch modelSearch) {
modelSearch.getCheckedIdForDel().forEach(id -> {
if (!user.getEsntlId().equals(id)) { // 자기 자신은 삭제 불가
if (!SecurityUtil.getCurrentUserEsntlId().equals(id)) { // 자기 자신은 삭제 불가
staffUserService.deleteById(id);
}
});
@@ -1,11 +1,10 @@
package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.validator.PasswordMatch;
import com.eactive.httpmockserver.common.validator.UniqueId;
import com.eactive.httpmockserver.user.entity.UserStatus;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
@@ -23,7 +22,7 @@ public class UserRegisterDTO implements Serializable {
*/
@NotEmpty
@UniqueId
@Email
// @Email
private String userId;
@@ -1,11 +1,11 @@
package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.search.BaseSearch;
import com.eactive.httpmockserver.common.search.ColumnSearchModel;
import com.eactive.httpmockserver.common.search.SearchCondition;
import com.eactive.httpmockserver.common.search.SearchModel;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus;
import java.util.ArrayList;
import java.util.List;
@@ -1,7 +1,7 @@
package com.eactive.httpmockserver.user.dto;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.user.entity.UserStatus;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@@ -1,12 +1,11 @@
package com.eactive.httpmockserver.user.mapper;
import com.eactive.httpmockserver.common.mapper.CommonMapper;
import com.eactive.httpmockserver.common.util.EncryptionUtil;
import com.eactive.httpmockserver.user.dto.UserRegisterDTO;
import com.eactive.httpmockserver.user.dto.UserUpdateDTO;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.common.mapper.CommonMapper;
import com.eactive.httpmockserver.common.util.EncryptionUtil;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
@@ -1,10 +1,10 @@
package com.eactive.httpmockserver.user.service;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.UserStatus;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
@@ -1,11 +1,11 @@
package com.eactive.httpmockserver.user.service;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import com.eactive.httpmockserver.common.entity.EnabledStatus;
import com.eactive.httpmockserver.common.exception.UserNotFoundException;
import com.eactive.httpmockserver.common.util.EncryptionUtil;
import com.eactive.httpmockserver.user.entity.StaffUser;
import com.eactive.httpmockserver.user.entity.User;
import com.eactive.httpmockserver.user.repository.StaffUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -39,8 +39,8 @@ public class UserService implements UserDetailsService {
return staffUserRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE));
}
public String updateUserPassword(String userId, String oldPassword, String newPassword, String newPassword2) {
User user = staffUserRepository.findByUserId(userId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE));
public String updateUserPassword(String esntlId, String oldPassword, String newPassword, String newPassword2) {
User user = staffUserRepository.findById(esntlId).orElseThrow(() -> new UserNotFoundException(USER_NOT_FOUND_MESSAGE));
String encryptedOldPass = encryptionUtil.encryptPassword(oldPassword, user.getUserId());
String resultMsg = null;