Repository navigation
Expand file tree
/
Copy pathSentryRequestResolver.java
More file actions
131 lines (120 loc) · 5.16 KB
/
Copy pathSentryRequestResolver.java
File metadata and controls
131 lines (120 loc) · 5.16 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
123
124
125
126
127
128
129
130
131
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.CookieUtils;
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
@SuppressWarnings("deprecation")
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));
final @NotNull String cookieName = CookieUtils.COOKIE_HEADER_NAME;
if (scopes.getOptions().getDataCollectionResolver().isDataCollectionConfigured()) {
sentryRequest.setCookies(
toString(
CookieUtils.filterCookiesFromHeader(
httpRequest.getHeaders(cookieName),
scopes.getOptions().getDataCollectionResolver().getCookies(),
additionalSecurityCookieNames)));
} else if (scopes.getOptions().isSendDefaultPii()) {
sentryRequest.setCookies(
toString(
CookieUtils.filterOutSecurityCookiesFromHeader(
httpRequest.getHeaders(cookieName), cookieName, additionalSecurityCookieNames)));
}
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 =
CookieUtils.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;
}
}