From fcad646a7c912463c53de946b2586e4a49a6e1ff Mon Sep 17 00:00:00 2001 From: developerKurt Date: Wed, 1 Jan 2020 13:42:05 +0300 Subject: As requested in issue #4393, added logging IP address functionality when login attempts fail. --- .../java/org/traccar/helper/IpRetrieverTest.java | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/org/traccar/helper/IpRetrieverTest.java (limited to 'src/test/java/org/traccar/helper') diff --git a/src/test/java/org/traccar/helper/IpRetrieverTest.java b/src/test/java/org/traccar/helper/IpRetrieverTest.java new file mode 100644 index 000000000..628b5dd63 --- /dev/null +++ b/src/test/java/org/traccar/helper/IpRetrieverTest.java @@ -0,0 +1,38 @@ +package org.traccar.helper; + + +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; + +import static org.junit.Assert.assertEquals; + +public class IpRetrieverTest { + + private static final String NORMAL_IP_ADDRESS = "231.23.45.65"; + private static final String GATEWAY_IP_ADDRESS = "147.120.1.5"; + private static final String IP_ADDRESS_BEHIND_REVERSE_PROXY = "231.23.45.65, 10.20.10.33, 10.20.20.34"; + + private MockHttpServletRequest mockHttpServletRequest; + + @Before + public void init(){ + mockHttpServletRequest = new MockHttpServletRequest(); + } + + @Test + public void testIpBehindReverseProxy(){ + mockHttpServletRequest.setRemoteAddr(GATEWAY_IP_ADDRESS); + mockHttpServletRequest.addHeader("X-FORWARDED-FOR",IP_ADDRESS_BEHIND_REVERSE_PROXY); + + assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); + } + + @Test + public void testNormalIp(){ + mockHttpServletRequest.setRemoteAddr(NORMAL_IP_ADDRESS); + assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); + + } + +} -- cgit v1.2.3 From aff84ec3ae6faf7d930319329d8750634195445a Mon Sep 17 00:00:00 2001 From: developerKurt Date: Thu, 2 Jan 2020 09:17:23 +0300 Subject: Implemented project's code style --- src/main/java/org/traccar/helper/IpRetriever.java | 62 +++++++++++----------- src/main/java/org/traccar/helper/LogAction.java | 8 ++- .../java/org/traccar/helper/IpRetrieverTest.java | 12 ++--- 3 files changed, 40 insertions(+), 42 deletions(-) (limited to 'src/test/java/org/traccar/helper') diff --git a/src/main/java/org/traccar/helper/IpRetriever.java b/src/main/java/org/traccar/helper/IpRetriever.java index 4bab93edb..814a78a4b 100644 --- a/src/main/java/org/traccar/helper/IpRetriever.java +++ b/src/main/java/org/traccar/helper/IpRetriever.java @@ -3,45 +3,45 @@ package org.traccar.helper; import javax.servlet.http.HttpServletRequest; /** - * Gets the client's IP address regardless of whether the server is behind a proxy/reverse proxy server or a load balancer. - * + * Gets the client's IP address regardless of whether + * the server is behind a proxy/reverse proxy server or a load balancer. */ -public final class IpRetriever - { - - - /** - * Retrieves the client's IP address. - * Handles the cases like whether the server is behind a proxy/reverse proxy server or a load balancer - * - * @param request {@link HttpServletRequest} instance - * @return client's IP address - */ +public final class IpRetriever { + + /** + * Retrieves the client's IP address. + * Handles the cases like whether the server is behind a proxy/reverse proxy server or a load balancer + * + * @param request {@link HttpServletRequest} instance + * @return client's IP address + */ public static String retrieveIP(HttpServletRequest request) { - if(request != null){ - String ipAddress = request.getHeader("X-FORWARDED-FOR"); + if (request != null) { + String ipAddress = request.getHeader("X-FORWARDED-FOR"); - if (ipAddress != null && !ipAddress.isEmpty()) { - return removeUnwantedData(ipAddress); - } - else{ - ipAddress = request.getRemoteAddr(); - return ipAddress; - } + if (ipAddress != null && !ipAddress.isEmpty()) { + return removeUnwantedData(ipAddress); + } else { + ipAddress = request.getRemoteAddr(); + return ipAddress; + } } else return null; } - /** - * If the server is behind a reverse proxy, the header value will also contain the IP's from load balancer and reverse proxy - * This method gets rid of them. - * - * @param ipAddress IP address value from the header - * @return IP address of the client - */ - private static String removeUnwantedData(String ipAddress){ + /** + * If the server is behind a reverse proxy, the header value will also contain the IP's from load balancer and reverse proxy + * This method gets rid of them. + * + * @param ipAddress IP address value from the header + * @return IP address of the client + */ + private static String removeUnwantedData(String ipAddress) { return ipAddress.contains(",") ? ipAddress.split(",")[0] : ipAddress; - } + } + + private IpRetriever() { + } } diff --git a/src/main/java/org/traccar/helper/LogAction.java b/src/main/java/org/traccar/helper/LogAction.java index 1fbd78c4d..21fe4c3fa 100644 --- a/src/main/java/org/traccar/helper/LogAction.java +++ b/src/main/java/org/traccar/helper/LogAction.java @@ -78,11 +78,9 @@ public final class LogAction { public static void failedLogin(String ipAddress) { - if(ipAddress == null || ipAddress.isEmpty()) { + if (ipAddress == null || ipAddress.isEmpty()) { LOGGER.info(ACTION_FAILED_LOGIN_NO_IP); - } - - else{ + } else { LOGGER.info(String.format( PATTERN_FAILED_LOGIN, ipAddress)); } @@ -101,7 +99,7 @@ public final class LogAction { } private static void logLinkAction(String action, long userId, - Class owner, long ownerId, Class property, long propertyId) { + Class owner, long ownerId, Class property, long propertyId) { LOGGER.info(String.format( PATTERN_LINK, userId, action, Introspector.decapitalize(owner.getSimpleName()), ownerId, diff --git a/src/test/java/org/traccar/helper/IpRetrieverTest.java b/src/test/java/org/traccar/helper/IpRetrieverTest.java index 628b5dd63..63e2c0073 100644 --- a/src/test/java/org/traccar/helper/IpRetrieverTest.java +++ b/src/test/java/org/traccar/helper/IpRetrieverTest.java @@ -16,22 +16,22 @@ public class IpRetrieverTest { private MockHttpServletRequest mockHttpServletRequest; @Before - public void init(){ + public void init() { mockHttpServletRequest = new MockHttpServletRequest(); } @Test - public void testIpBehindReverseProxy(){ + public void testIpBehindReverseProxy() { mockHttpServletRequest.setRemoteAddr(GATEWAY_IP_ADDRESS); - mockHttpServletRequest.addHeader("X-FORWARDED-FOR",IP_ADDRESS_BEHIND_REVERSE_PROXY); + mockHttpServletRequest.addHeader("X-FORWARDED-FOR", IP_ADDRESS_BEHIND_REVERSE_PROXY); assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); } @Test - public void testNormalIp(){ - mockHttpServletRequest.setRemoteAddr(NORMAL_IP_ADDRESS); - assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); + public void testNormalIp() { + mockHttpServletRequest.setRemoteAddr(NORMAL_IP_ADDRESS); + assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); } -- cgit v1.2.3 From 13b27f8d7ac08bb3ff1a56a48865201263d6462d Mon Sep 17 00:00:00 2001 From: developerKurt Date: Fri, 3 Jan 2020 10:20:07 +0300 Subject: As the owner requested: • Javadocs are removed • Spring test framework removed, created custom mock implementation instead • Added class and method renamed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - pom.xml | 8 - .../org/traccar/api/resource/SessionResource.java | 4 +- src/main/java/org/traccar/helper/IpRetriever.java | 50 --- .../java/org/traccar/helper/ServletHelper.java | 27 ++ .../java/org/traccar/helper/IpRetrieverTest.java | 38 -- .../java/org/traccar/helper/ServletHelperTest.java | 407 +++++++++++++++++++++ 7 files changed, 436 insertions(+), 99 deletions(-) delete mode 100644 src/main/java/org/traccar/helper/IpRetriever.java create mode 100644 src/main/java/org/traccar/helper/ServletHelper.java delete mode 100644 src/test/java/org/traccar/helper/IpRetrieverTest.java create mode 100644 src/test/java/org/traccar/helper/ServletHelperTest.java (limited to 'src/test/java/org/traccar/helper') diff --git a/build.gradle b/build.gradle index 3622bdbd4..8e65bfdd1 100644 --- a/build.gradle +++ b/build.gradle @@ -75,7 +75,6 @@ dependencies { implementation "com.sun.xml.bind:jaxb-impl:2.3.2" implementation "javax.activation:activation:1.1.1" testImplementation "junit:junit:4.12" - testImplementation group: 'org.springframework', name: 'spring-test', version: '5.2.2.RELEASE' } task copyDependencies(type: Copy) { diff --git a/pom.xml b/pom.xml index 1de77eb66..050321d7b 100644 --- a/pom.xml +++ b/pom.xml @@ -19,14 +19,6 @@ - - - org.springframework - spring-test - 5.2.2.RELEASE - test - - junit junit diff --git a/src/main/java/org/traccar/api/resource/SessionResource.java b/src/main/java/org/traccar/api/resource/SessionResource.java index 65e05a4a2..e3c5d457f 100644 --- a/src/main/java/org/traccar/api/resource/SessionResource.java +++ b/src/main/java/org/traccar/api/resource/SessionResource.java @@ -18,7 +18,7 @@ package org.traccar.api.resource; import org.traccar.Context; import org.traccar.api.BaseResource; import org.traccar.helper.DataConverter; -import org.traccar.helper.IpRetriever; +import org.traccar.helper.ServletHelper; import org.traccar.helper.LogAction; import org.traccar.model.User; @@ -107,7 +107,7 @@ public class SessionResource extends BaseResource { LogAction.login(user.getId()); return user; } else { - LogAction.failedLogin(IpRetriever.retrieveIP(request)); + LogAction.failedLogin(ServletHelper.retrieveRemoteAddress(request)); throw new WebApplicationException(Response.status(Response.Status.UNAUTHORIZED).build()); } } diff --git a/src/main/java/org/traccar/helper/IpRetriever.java b/src/main/java/org/traccar/helper/IpRetriever.java deleted file mode 100644 index ff211d181..000000000 --- a/src/main/java/org/traccar/helper/IpRetriever.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.traccar.helper; - -import javax.servlet.http.HttpServletRequest; - -/** - * Gets the client's IP address regardless of whether - * the server is behind a proxy/reverse proxy server or a load balancer. - */ -public final class IpRetriever { - - /** - * Retrieves the client's IP address. - * Handles the cases like whether the server is behind a proxy/reverse proxy server or a load balancer - * - * @param request {@link HttpServletRequest} instance - * @return client's IP address - */ - public static String retrieveIP(HttpServletRequest request) { - - if (request != null) { - String ipAddress = request.getHeader("X-FORWARDED-FOR"); - - if (ipAddress != null && !ipAddress.isEmpty()) { - return removeUnwantedData(ipAddress); - } else { - ipAddress = request.getRemoteAddr(); - return ipAddress; - } - - } else { - return null; - } - - } - - /** - * If the server is behind a reverse proxy, the header value will also - * contain the IP's from load balancer and reverse proxy. - * This method gets rid of them. - * - * @param ipAddress IP address value from the header - * @return IP address of the client - */ - private static String removeUnwantedData(String ipAddress) { - return ipAddress.contains(",") ? ipAddress.split(",")[0] : ipAddress; - } - - private IpRetriever() { - } -} diff --git a/src/main/java/org/traccar/helper/ServletHelper.java b/src/main/java/org/traccar/helper/ServletHelper.java new file mode 100644 index 000000000..4eab49001 --- /dev/null +++ b/src/main/java/org/traccar/helper/ServletHelper.java @@ -0,0 +1,27 @@ +package org.traccar.helper; + +import javax.servlet.http.HttpServletRequest; + + +public final class ServletHelper { + + + public static String retrieveRemoteAddress(HttpServletRequest request) { + + if (request != null) { + String ipAddress = request.getHeader("X-FORWARDED-FOR"); + + if (ipAddress != null && !ipAddress.isEmpty()) { + return ipAddress.substring(0, ipAddress.indexOf(",")); //Removes the additional data + } else { + ipAddress = request.getRemoteAddr(); + return ipAddress; + } + + } else { + return null; + } + + + } +} \ No newline at end of file diff --git a/src/test/java/org/traccar/helper/IpRetrieverTest.java b/src/test/java/org/traccar/helper/IpRetrieverTest.java deleted file mode 100644 index 63e2c0073..000000000 --- a/src/test/java/org/traccar/helper/IpRetrieverTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.traccar.helper; - - -import org.junit.Before; -import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; - -import static org.junit.Assert.assertEquals; - -public class IpRetrieverTest { - - private static final String NORMAL_IP_ADDRESS = "231.23.45.65"; - private static final String GATEWAY_IP_ADDRESS = "147.120.1.5"; - private static final String IP_ADDRESS_BEHIND_REVERSE_PROXY = "231.23.45.65, 10.20.10.33, 10.20.20.34"; - - private MockHttpServletRequest mockHttpServletRequest; - - @Before - public void init() { - mockHttpServletRequest = new MockHttpServletRequest(); - } - - @Test - public void testIpBehindReverseProxy() { - mockHttpServletRequest.setRemoteAddr(GATEWAY_IP_ADDRESS); - mockHttpServletRequest.addHeader("X-FORWARDED-FOR", IP_ADDRESS_BEHIND_REVERSE_PROXY); - - assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); - } - - @Test - public void testNormalIp() { - mockHttpServletRequest.setRemoteAddr(NORMAL_IP_ADDRESS); - assertEquals(NORMAL_IP_ADDRESS, IpRetriever.retrieveIP(mockHttpServletRequest)); - - } - -} diff --git a/src/test/java/org/traccar/helper/ServletHelperTest.java b/src/test/java/org/traccar/helper/ServletHelperTest.java new file mode 100644 index 000000000..963be998c --- /dev/null +++ b/src/test/java/org/traccar/helper/ServletHelperTest.java @@ -0,0 +1,407 @@ +package org.traccar.helper; + + +import org.junit.Before; +import org.junit.Test; + + +import javax.servlet.*; +import javax.servlet.http.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.*; + +import static org.junit.Assert.assertEquals; + +public class ServletHelperTest { + + + private MockHttpServletRequestForRemoteAddr mockHttpServletRequest; + + + @Before + public void init() { + mockHttpServletRequest = new MockHttpServletRequestForRemoteAddr(); + } + + @Test + public void testIpBehindReverseProxy() { + mockHttpServletRequest.setRemoteAddr("147.120.1.5"); + mockHttpServletRequest.addHeader("X-FORWARDED-FOR", "231.23.45.65, 10.20.10.33, 10.20.20.34"); + + assertEquals("231.23.45.65", ServletHelper.retrieveRemoteAddress(mockHttpServletRequest)); + } + + @Test + public void testNormalIp() { + mockHttpServletRequest.setRemoteAddr("231.23.45.65"); + assertEquals("231.23.45.65", ServletHelper.retrieveRemoteAddress(mockHttpServletRequest)); + + } + + /** + * This mock implementation only supports IP address-related operations. + */ + private final class MockHttpServletRequestForRemoteAddr implements HttpServletRequest { + + private String remoteAddr; + private Map headers = new HashMap<>(); + + public void setRemoteAddr(String remoteAddr) { + this.remoteAddr = remoteAddr; + } + + public void addHeader(String name, String value) { + headers.put(name, value); + } + + @Override + public String getHeader(String name) { + return headers.get(name); + } + + @Override + public String getRemoteAddr() { + return remoteAddr; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getMethod() { + return null; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getContextPath() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public String changeSessionId() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException { + + } + + @Override + public void logout() throws ServletException { + + } + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + public T upgrade(Class handlerClass) throws IOException, ServletException { + return null; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public void setCharacterEncoding(String env) throws UnsupportedEncodingException { + + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public long getContentLengthLong() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String name) { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public String getProtocol() { + return null; + } + + @Override + public String getScheme() { + return null; + } + + @Override + public String getServerName() { + return null; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public void setAttribute(String name, Object o) { + + } + + @Override + public void removeAttribute(String name) { + + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public String getRealPath(String path) { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + } + +} -- cgit v1.2.3