Repository navigation
Expand file tree
/
Copy pathSentryRequestResolver.java
More file actions
122 lines (111 loc) · 4.75 KB
/
Copy pathSentryRequestResolver.java
File metadata and controls
122 lines (111 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package io.sentry.spring7;
import com.jakewharton.nopen.annotation.Open;
import io.sentry.IScopes;
import io.sentry.ISentryLifecycleToken;
import io.sentry.SentryLevel;
import io.sentry.protocol.Request;
import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.HttpUtils;
import io.sentry.util.Objects;
import io.sentry.util.UrlUtils;
import jakarta.servlet.ServletContext;
import jakarta.servlet.SessionCookieConfig;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@Open
public class SentryRequestResolver {
protected static final @NotNull AutoClosableReentrantLock staticLock =
new AutoClosableReentrantLock();
private final @NotNull IScopes scopes;
private volatile @Nullable List<String> extraSecurityCookies;
public SentryRequestResolver(final @NotNull IScopes scopes) {
this.scopes = Objects.requireNonNull(scopes, "options is required");
}
// httpRequest.getRequestURL() returns StringBuffer which is considered an obsolete class.
@SuppressWarnings("JdkObsolete")
public @NotNull Request resolveSentryRequest(final @NotNull HttpServletRequest httpRequest) {
final Request sentryRequest = new Request();
sentryRequest.setMethod(httpRequest.getMethod());
final @NotNull UrlUtils.UrlDetails urlDetails =
UrlUtils.parse(
httpRequest.getRequestURL().toString(),
scopes.getOptions().getDataCollectionResolver());
urlDetails.applyToRequest(sentryRequest);
sentryRequest.setQueryString(
UrlUtils.filterQueryParams(
httpRequest.getQueryString(), scopes.getOptions().getDataCollectionResolver()));
final @NotNull List<String> additionalSecurityCookieNames =
extractSecurityCookieNamesOrUseCached(httpRequest);
sentryRequest.setHeaders(resolveHeadersMap(httpRequest, additionalSecurityCookieNames));
if (scopes.getOptions().isSendDefaultPii()) {
String cookieName = HttpUtils.COOKIE_HEADER_NAME;
final @Nullable List<String> filteredHeaders =
HttpUtils.filterOutSecurityCookiesFromHeader(
httpRequest.getHeaders(cookieName), cookieName, additionalSecurityCookieNames);
sentryRequest.setCookies(toString(filteredHeaders));
}
return sentryRequest;
}
@NotNull
Map<String, String> resolveHeadersMap(
final @NotNull HttpServletRequest request,
final @NotNull List<String> additionalSecurityCookieNames) {
final Map<String, String> headersMap = new HashMap<>();
for (String headerName : Collections.list(request.getHeaderNames())) {
if (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()
|| scopes.getOptions().isSendDefaultPii()
|| !HttpUtils.containsSensitiveHeader(headerName)) {
final @Nullable List<String> filteredHeaders =
HttpUtils.filterOutSecurityCookiesFromHeader(
request.getHeaders(headerName), headerName, additionalSecurityCookieNames);
headersMap.put(headerName, toString(filteredHeaders));
}
}
if (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()) {
return HttpUtils.filterHeaders(
headersMap, scopes.getOptions().getDataCollectionResolver().getHttpRequestHeaders());
}
return headersMap;
}
private List<String> extractSecurityCookieNamesOrUseCached(
final @NotNull HttpServletRequest httpRequest) {
if (extraSecurityCookies == null) {
try (final @NotNull ISentryLifecycleToken ignored = staticLock.acquire()) {
if (extraSecurityCookies == null) {
extraSecurityCookies = extractSecurityCookieNames(httpRequest);
}
}
}
return extraSecurityCookies;
}
private List<String> extractSecurityCookieNames(final @NotNull HttpServletRequest httpRequest) {
try {
final @Nullable ServletContext servletContext = httpRequest.getServletContext();
if (servletContext != null) {
final @Nullable SessionCookieConfig sessionCookieConfig =
servletContext.getSessionCookieConfig();
if (sessionCookieConfig != null) {
final @Nullable String cookieName = sessionCookieConfig.getName();
if (cookieName != null) {
return Arrays.asList(cookieName);
}
}
}
} catch (Throwable t) {
scopes
.getOptions()
.getLogger()
.log(SentryLevel.WARNING, "Failed to extract session cookie name from request.", t);
}
return Collections.emptyList();
}
private static @Nullable String toString(final @Nullable List<String> list) {
return list != null ? String.join(",", list) : null;
}
}