13
13
*/
14
14
package org .orbeon .oxf .servlet
15
15
16
+ import cats .data .NonEmptyList
16
17
import org .apache .logging .log4j .ThreadContext
17
- import org .orbeon .oxf .externalcontext .ServletPortletRequest
18
+ import org .orbeon .oxf .externalcontext .{ Credentials , ServletPortletRequest }
18
19
import org .orbeon .oxf .fr .FormRunnerAuth
19
20
import org .orbeon .oxf .http .Headers
20
21
import org .orbeon .oxf .properties .Properties
21
22
import org .orbeon .oxf .util .StringUtils .*
22
23
import org .slf4j .LoggerFactory
23
24
24
- import scala .jdk .CollectionConverters .*
25
-
26
25
// For backward compatibility
27
26
class FormRunnerAuthFilter extends JavaxFormRunnerAuthFilter
28
27
@@ -31,7 +30,7 @@ class JakartaFormRunnerAuthFilter extends JakartaFilter(new FormRunnerAuthFilter
31
30
32
31
class FormRunnerAuthFilterImpl extends Filter {
33
32
34
- import FormRunnerAuthFilterImpl ._
33
+ import FormRunnerAuthFilterImpl .*
35
34
36
35
private case class FilterSettings (contentSecurityPolicy : Option [String ])
37
36
@@ -85,48 +84,90 @@ object FormRunnerAuthFilterImpl {
85
84
// The Form Runner service path is hardcoded but that's ok. When we are filtering a service, we don't retrieve the
86
85
// credentials, which would be provided by the container or by incoming headers. Instead, credentials are provided
87
86
// directly with `Orbeon-*` headers. See https://github.com/orbeon/orbeon-forms/issues/2275
88
- val requestWithAmendedHeaders =
89
- if (servletRequest.getRequestPathInfo.startsWith(" /fr/service/" )) {
90
-
91
- // `ServletPortletRequest` gets credentials from the session, which means we need to store the credentials into
92
- // the session. This is done by `getCredentialsAsHeadersUseSession()` if we are not a service, but here we
93
- // don't use that function so we need to do make sure they are stored.
94
-
95
- ServletPortletRequest .findCredentialsInSession(httpSession) match {
96
- case None =>
97
- ServletPortletRequest .storeCredentialsInSession(
98
- httpSession,
99
- FormRunnerAuth .fromHeaderValues(
100
- credentialsOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonCredentials ),
101
- usernameOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonUsername ),
102
- rolesList = getHttpHeaders(Headers .OrbeonRoles ),
103
- groupOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonGroup ),
104
- )
105
- )
106
- case Some (_) =>
107
- }
87
+ val ServicePath = " /fr/service/"
108
88
109
- servletRequest
110
- } else if (servletRequest.getRequestPathInfo.endsWith(" .map" )) {
89
+ val requestWithAmendedHeaders =
90
+ if (WildflyOidcAuth .hasWildflyOidcAuth(servletRequest)) {
91
+ credentialsFromSessionOrParameter(httpSession, servletRequest, WildflyOidcAuth .credentialsOpt(servletRequest))
92
+ } else if (servletRequest.getRequestPathInfo.startsWith(ServicePath )) {
93
+ credentialsFromSessionOrHeaders(httpSession, servletRequest, getHttpHeaders)
94
+ } else if (servletRequest.isSourceMap) {
111
95
// Don't amend headers for `.map` as this would cause the credentials code to clear the credentials
112
96
// unnecessarily. https://github.com/orbeon/orbeon-forms/issues/6080
113
97
servletRequest
114
98
} else {
115
-
116
- trait CustomHeaders extends RequestRemoveHeaders with RequestPrependHeaders {
117
- override def headersToRemoveAsSet : Set [String ] = FormRunnerAuth .AllAuthHeaderNames
118
- val headersToPrependAsMap = FormRunnerAuth .getCredentialsAsHeadersUseSession(
119
- userRoles = servletRequest,
120
- session = httpSession,
121
- getHeader = getHttpHeaders
122
- ).toMap
123
- }
124
-
125
- new HttpServletRequestWrapper (servletRequest) with CustomHeaders
99
+ credentialsFromSessionHeadersOrContainer(httpSession, servletRequest, getHttpHeaders)
126
100
}
127
101
128
102
logger.debug(s " amended headers: \n ${requestWithAmendedHeaders.headersAsString}" )
129
103
130
104
requestWithAmendedHeaders
131
105
}
106
+
107
+ private def credentialsFromSessionOrHeaders (
108
+ httpSession : ServletSessionImpl ,
109
+ servletRequest : HttpServletRequest ,
110
+ getHttpHeaders : String => List [String ]
111
+ ): HttpServletRequest = {
112
+
113
+ // `ServletPortletRequest` gets credentials from the session, which means we need to store the credentials into
114
+ // the session. This is done by `getCredentialsAsHeadersUseSession()` if we are not a service, but here we
115
+ // don't use that function so we need to do make sure they are stored.
116
+
117
+ ServletPortletRequest .findCredentialsInSession(httpSession) match {
118
+ case None =>
119
+ ServletPortletRequest .storeCredentialsInSession(
120
+ httpSession,
121
+ FormRunnerAuth .fromHeaderValues(
122
+ credentialsOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonCredentials ),
123
+ usernameOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonUsername ),
124
+ rolesList = getHttpHeaders(Headers .OrbeonRoles ),
125
+ groupOpt = servletRequest.headerFirstValueOpt(Headers .OrbeonGroup ),
126
+ )
127
+ )
128
+ case Some (_) =>
129
+ }
130
+
131
+ servletRequest
132
+ }
133
+
134
+ private def credentialsFromSessionOrParameter (
135
+ httpSession : ServletSessionImpl ,
136
+ servletRequest : HttpServletRequest ,
137
+ credentialsOpt : => Option [Credentials ]
138
+ ): HttpServletRequest =
139
+ requestWithCredentialsHeaders(
140
+ servletRequest = servletRequest,
141
+ credentialHeaders = FormRunnerAuth .getCredentialsAsHeadersUseSession(
142
+ credentialsOpt = credentialsOpt,
143
+ session = httpSession
144
+ ).toMap
145
+ )
146
+
147
+ private def credentialsFromSessionHeadersOrContainer (
148
+ httpSession : ServletSessionImpl ,
149
+ servletRequest : HttpServletRequest ,
150
+ getHttpHeaders : String => List [String ]
151
+ ): HttpServletRequest =
152
+ requestWithCredentialsHeaders(
153
+ servletRequest = servletRequest,
154
+ credentialHeaders = FormRunnerAuth .getCredentialsAsHeadersUseSession(
155
+ userRoles = servletRequest,
156
+ session = httpSession,
157
+ getHeader = getHttpHeaders
158
+ ).toMap
159
+ )
160
+
161
+ private def requestWithCredentialsHeaders (
162
+ servletRequest : HttpServletRequest ,
163
+ credentialHeaders : Map [String , NonEmptyList [String ]]
164
+ ): HttpServletRequest = {
165
+
166
+ trait CustomHeaders extends RequestRemoveHeaders with RequestPrependHeaders {
167
+ override def headersToRemoveAsSet : Set [String ] = FormRunnerAuth .AllAuthHeaderNames
168
+ val headersToPrependAsMap : Map [String , NonEmptyList [String ]] = credentialHeaders
169
+ }
170
+
171
+ new HttpServletRequestWrapper (servletRequest) with CustomHeaders
172
+ }
132
173
}
0 commit comments