Skip to content

Commit 78ed3af

Browse files
iroquetaBeta Bot
authored andcommitted
Cherry pick branch 'genexuslabs:fix/secure-jsessionid' into beta
1 parent f20b1e9 commit 78ed3af

File tree

5 files changed

+47
-10
lines changed

5 files changed

+47
-10
lines changed

gxspringboot/src/main/java/com/genexus/springboot/GXConfig.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import com.genexus.common.interfaces.SpecificImplementation;
55
import com.genexus.diagnostics.core.ILogger;
66
import com.genexus.diagnostics.core.LogManager;
7+
import com.genexus.filters.SessionFilter;
78
import com.genexus.servlet.CorsFilter;
89
import com.genexus.xml.GXXMLSerializable;
910

1011
import jakarta.annotation.PreDestroy;
12+
import jakarta.servlet.DispatcherType;
1113
import org.glassfish.jersey.server.ResourceConfig;
1214
import org.glassfish.jersey.servlet.ServletContainer;
1315
import org.glassfish.jersey.servlet.ServletProperties;
@@ -92,6 +94,24 @@ public FilterRegistrationBean<UrlRewriteFilter> urlRewriteFilter() {
9294
return registrationBean;
9395
}
9496

97+
@Bean
98+
public FilterRegistrationBean<SessionFilter> sessionFilter() {
99+
FilterRegistrationBean<SessionFilter> registration =
100+
new FilterRegistrationBean<>();
101+
102+
registration.setFilter(new SessionFilter());
103+
registration.setName("session-filter");
104+
registration.addUrlPatterns("/*");
105+
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 2);
106+
107+
registration.setDispatcherTypes(
108+
DispatcherType.REQUEST,
109+
DispatcherType.FORWARD
110+
);
111+
112+
return registration;
113+
}
114+
95115
@Bean
96116
public ServletContextInitializer jerseyFilter() {
97117
Set<Class<?>> rrcs = JaxrsResourcesHolder.getAll();

java/src/main/java/com/genexus/filters/SecureCookieHttpServletResponseWrapper.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,22 @@ public SecureCookieHttpServletResponseWrapper(IHttpServletResponse response, Str
1818
}
1919
@Override
2020
public void addCookie(ICookie cookie) {
21-
if (!cookie.getSecure() && cookie.getName().toLowerCase()==cookieId){
21+
if (!cookie.getSecure() && cookie.getName().toLowerCase().equals(cookieId)){
2222
cookie.setSecure(true);
2323
}
2424
super.addCookie(cookie);
2525
}
2626

27+
@Override
28+
public void addHeader(String name, String value) {
29+
if (name.equalsIgnoreCase("Set-Cookie") && value.toLowerCase().startsWith(cookieId.toLowerCase() + "=")) {
30+
if (!value.toLowerCase().contains("secure")) {
31+
value += "; Secure";
32+
}
33+
}
34+
super.addHeader(name, value);
35+
}
36+
2737
public IServletOutputStream getWrapperOutputStream() throws IOException {
2838
return response.getOutputStream();
2939
}

java/src/main/java/com/genexus/filters/SessionFilter.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Arrays;
44
import java.util.Map;
55

6+
import com.genexus.WrapperUtils;
67
import com.genexus.servlet.*;
78
import com.genexus.servlet.http.*;
89

@@ -19,12 +20,7 @@ public void init(Map<String, String> headers, String path, String sessionCookieN
1920
public void doFilter(IServletRequest request, IServletResponse response, IFilterChain chain) throws Exception {
2021
IHttpServletRequest req = request.getHttpServletRequest();
2122
IHttpServletResponse res = response.getHttpServletResponse();
22-
ICookie session=null;
23-
ICookie[] allCookies = req.getCookies();
24-
if (allCookies != null) {
25-
session = Arrays.stream(allCookies).filter(x -> x.getName().equals(JSESSIONID)).findFirst().orElse(null);
26-
}
27-
if (session!=null && req.isSecure() && !session.getSecure())
23+
if (WrapperUtils.isSecureConnection(req))
2824
{
2925
chain.doFilter(request, new SecureCookieHttpServletResponseWrapper(res, JSESSIONID));
3026
}

java/src/main/java/com/genexus/webpanels/HttpContextWeb.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,9 +1005,8 @@ public String getScriptPath() {
10051005
}
10061006

10071007
public int getHttpSecure() {
1008-
String protocol = getHeader("X-Forwarded-Proto");
1009-
if (protocol != null && !protocol.equals("")) {
1010-
return protocol.equalsIgnoreCase("https") ? 1 : 0;
1008+
if (WrapperUtils.isSecureConnection(request)) {
1009+
return 1;
10111010
}
10121011
String serverProtocolProperty = ModelContext.getModelContext().getPreferences().getProperty("SERVER_PROTOCOL", "");
10131012
if (!StringUtils.isBlank(serverProtocolProperty)) {

wrappercommon/src/main/java/com/genexus/WrapperUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.stream.Collectors;
88

99
import com.genexus.opentelemetry.OpenTelemetryHelper;
10+
import com.genexus.servlet.http.IHttpServletRequest;
1011
import org.json.JSONException;
1112
import com.genexus.json.JSONObjectWrapper;
1213
import org.apache.commons.io.IOUtils;
@@ -56,4 +57,15 @@ public static InputStream storeRestRequestBody(InputStream is) throws IOExceptio
5657

5758
return IOUtils.toInputStream(body, "UTF-8");
5859
}
60+
61+
public static boolean isSecureConnection(IHttpServletRequest req) {
62+
return req.isSecure() ||
63+
"https".equalsIgnoreCase(req.getHeader("X-Forwarded-Proto")) ||
64+
"on".equalsIgnoreCase(req.getHeader("X-Forwarded-Ssl")) ||
65+
"1".equals(req.getHeader("X-Forwarded-Ssl")) ||
66+
"true".equalsIgnoreCase(req.getHeader("X-Forwarded-Ssl")) ||
67+
"https".equalsIgnoreCase(req.getHeader("X-Forwarded-Scheme")) ||
68+
"on".equalsIgnoreCase(req.getHeader("Front-End-Https")) ||
69+
"https".equalsIgnoreCase(req.getHeader("X-Url-Scheme"));
70+
}
5971
}

0 commit comments

Comments
 (0)