[java-plugin-shibd-oidc] branch main updated: Add mocked Http client for Token response

Codeberg noreply at shibboleth.net
Fri Nov 14 11:19:19 UTC 2025


This is an automated email from the git hooks/post-receive script.

codeberg pushed a commit to branch main
in repository java-plugin-shibd-oidc.

View the commit online:
https://codeberg.org/Shibboleth/java-plugin-shibd-oidc/commit/6c02d6ae9c0ea98b42a1931d07d5c81c37775966

The following commit(s) were added to refs/heads/main by this push:
     new 6c02d6a  Add mocked Http client for Token response
6c02d6a is described below

commit 6c02d6ae9c0ea98b42a1931d07d5c81c37775966
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Fri Nov 14 11:19:10 2025 +0000

    Add mocked Http client for Token response
---
 sp-oidc-conf-impl/pom.xml                          |   5 +
 .../idp/flows/sp/consumer/oidc/oidc-beans.xml      |  10 +-
 .../idp/flows/sp/initiator/oidc/oidc-beans.xml     |   2 +-
 .../net/shibboleth/sp/service/agent/postconfig.xml |   2 -
 .../sp/oidc/flows/OIDCTokenConsumerFlowTest.java   |  64 ++++++-
 ...DCEnvironmentApplicationContextInitializer.java |   2 +
 .../net/shibboleth/idp/module/conf/logback.xml     | 210 +++++++++++++++++++++
 .../net/shibboleth/sp/oidc-test-beans.xml          |   9 +-
 8 files changed, 293 insertions(+), 11 deletions(-)

diff --git a/sp-oidc-conf-impl/pom.xml b/sp-oidc-conf-impl/pom.xml
index abb43c1..8818d6f 100644
--- a/sp-oidc-conf-impl/pom.xml
+++ b/sp-oidc-conf-impl/pom.xml
@@ -295,6 +295,11 @@
             <artifactId>spring-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
 
         <dependency>
             <groupId>org.codehaus.janino</groupId>
diff --git a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/consumer/oidc/oidc-beans.xml b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/consumer/oidc/oidc-beans.xml
index e1e45e6..28a6208 100644
--- a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/consumer/oidc/oidc-beans.xml
+++ b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/consumer/oidc/oidc-beans.xml
@@ -156,14 +156,14 @@
     
     <bean id="ExchangeCodeForAccessToken" scope="prototype"
         class="net.shibboleth.sp.oidc.profile.impl.ExchangeCodeForAccessToken"
-        p:httpClient="#{getObject('shibboleth.authn.oidc.rp.HttpClient') ?: getObject('shibboleth.InternalHttpClient')}"
-        p:httpClientSecurityParameters="#{getObject('shibboleth.authn.oidc.rp.HttpClientSecurityParameters')}"
-        p:httpResponseDecoderStrategy="#{getObject('sp.oidc.TokenResponseDecoder') ?: getObject('DefaultTokenResponseDecoder')}"
-        p:httpRequestEncoderStrategy="#{getObject('sp.oidc.TokenRequestEncoder') ?: getObject('DefaultAuthCodeTokenResponseEncoder')}" />
+        p:httpClient="#{getObject('%{sp.oidc.HttpClient:}') ?: getObject('shibboleth.InternalHttpClient')}"
+        p:httpClientSecurityParameters="#{getObject('%{sp.oidc.httpClientSecurityParameters:}')}"
+        p:httpResponseDecoderStrategy="#{getObject('%{sp.oidc.tokenResponseDecoder:}') ?: getObject('DefaultTokenResponseDecoder')}"
+        p:httpRequestEncoderStrategy="#{getObject('%{sp.oidc.tokenRequestEncoder:}') ?: getObject('DefaultAuthCodeTokenResponseEncoder')}" />
      
     <bean id="DefaultTokenResponseDecoder" scope="prototype"
         class="net.shibboleth.oidc.profile.decoding.impl.AccessTokenResponseDecoder"
-        p:objectMapper="#{getObject('shibboleth.sp.oidc.JSONObjectMapper') ?: getObject('shibboleth.sp.oidc.DefaultJSONObjectMapper')}" />
+        p:objectMapper="#{getObject('%{sp.oidc.jsonObjectMapper:}') ?: getObject('shibboleth.sp.oidc.DefaultJSONObjectMapper')}" />
 
     <bean id="DefaultAuthCodeTokenResponseEncoder" scope="prototype"
         class="net.shibboleth.oidc.profile.encoding.impl.AuthCodeTokenRequestEncoder" 
diff --git a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/initiator/oidc/oidc-beans.xml b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/initiator/oidc/oidc-beans.xml
index 40382fc..0046940 100644
--- a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/initiator/oidc/oidc-beans.xml
+++ b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/sp/initiator/oidc/oidc-beans.xml
@@ -361,7 +361,7 @@
     <bean id="HTTPRedirectAuthnRequestEncoder"
         class="net.shibboleth.oidc.profile.encoding.impl.HTTPRedirectAuthnRequestEncoder" init-method=""
         scope="prototype" p:httpServletResponseSupplier-ref="shibboleth.RemotedHttpServletResponseSupplier"
-        p:authorizationParamsAreValidPredicate="#{OObject('%{sp.oidc.AuthzParamsValidPredicate:}'.trim())}" />
+        p:authorizationParamsAreValidPredicate="#{getObject('%{sp.oidc.AuthzParamsValidPredicate:}'.trim())}" />
 
     <bean id="HTTPPostAuthnRequestEncoder"
         class="net.shibboleth.oidc.profile.encoding.impl.HTTPPostAuthnRequestEncoder" init-method="" scope="prototype"
diff --git a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/sp/service/agent/postconfig.xml b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/sp/service/agent/postconfig.xml
index bdd2080..fbb3ec0 100644
--- a/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/sp/service/agent/postconfig.xml
+++ b/sp-oidc-conf-impl/src/main/resources/META-INF/net/shibboleth/sp/service/agent/postconfig.xml
@@ -82,8 +82,6 @@
         p:tokenEndpointAuthMethod="%{idp.authn.oidc.rp.client.authenticationMethod:client_secret_basic}"
         p:useTargetedEndpointAsJWTAudience="%{idp.oauth2.jwtAuth.targetedEndpointAsJWTAudience:true}"
         p:requireSingleJWTAudience="%{idp.oauth2.jwtAuth.requireSingleJWTAudience:false}"
-        p:clientId="#{%{idp.authn.oidc.rp.provider.discoveryRequired:false} == true ? null : '%{idp.authn.oidc.rp.client.clientId:}'}"
-        p:clientCredential="#{%{idp.authn.oidc.rp.provider.discoveryRequired:false} == true ? {null} : getObject('shibboleth.authn.oidc.rp.DefaultCredential')}"
         p:unregisteredClientPolicy="#{getObject('shibboleth.oidc.DefaultUnregisteredClientPolicy')}"
         p:dpopProofClaimsValidator="#{getObject('DefaultDPoPProofClaimsValidator')}"
         p:dpopProofSignatureValidationConfiguration="#{getObject('DPoPSignatureValidationConfiguration')}"
diff --git a/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/OIDCTokenConsumerFlowTest.java b/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/OIDCTokenConsumerFlowTest.java
index 5e7b288..b019f78 100644
--- a/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/OIDCTokenConsumerFlowTest.java
+++ b/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/OIDCTokenConsumerFlowTest.java
@@ -21,12 +21,18 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.io.HttpClientResponseHandler;
+import org.apache.hc.core5.http.protocol.HttpContext;
+import org.mockito.Mockito;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.io.UnmarshallingException;
@@ -43,6 +49,7 @@ import org.opensaml.xmlsec.signature.support.SignatureException;
 import org.opensaml.xmlsec.signature.support.SignatureSupport;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.webflow.executor.FlowExecutionResult;
@@ -50,10 +57,19 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import com.nimbusds.jose.JWSAlgorithm;
+import com.nimbusds.jose.JWSHeader;
+import com.nimbusds.jwt.JWTClaimsSet;
+import com.nimbusds.jwt.SignedJWT;
 import com.nimbusds.oauth2.sdk.AuthorizationCode;
 import com.nimbusds.oauth2.sdk.ResponseMode;
 import com.nimbusds.oauth2.sdk.id.State;
+import com.nimbusds.oauth2.sdk.token.AccessToken;
+import com.nimbusds.oauth2.sdk.token.BearerAccessToken;
+import com.nimbusds.oauth2.sdk.token.RefreshToken;
 import com.nimbusds.openid.connect.sdk.AuthenticationSuccessResponse;
+import com.nimbusds.openid.connect.sdk.OIDCTokenResponse;
+import com.nimbusds.openid.connect.sdk.token.OIDCTokens;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.shared.codec.Base64Support;
@@ -103,6 +119,9 @@ public class OIDCTokenConsumerFlowTest extends AbstractSPFlowTest {
     
     /** Dummy signing key. */
     @Autowired @Qualifier("dummy.idp.Credential") protected Credential idpCredential;
+    
+    /** The mocked HttpClient to use when responding to Token and UserInfo requests.*/
+    private HttpClient httpClient;
 
     /** Constructor. */
     public OIDCTokenConsumerFlowTest() {
@@ -113,18 +132,59 @@ public class OIDCTokenConsumerFlowTest extends AbstractSPFlowTest {
     @BeforeMethod
     public void beforeMethod() {
         setDefaultAuth();
+        final ApplicationContext applicationContext2 = applicationContext;
+        if (applicationContext2 != null) {
+            httpClient = applicationContext2.getBean("Mock.HttpClient", HttpClient.class);
+        } else {
+            fail("Mocked Http Client could not be found");
+        }
+        if (httpClient == null) {
+            fail("Mocked Http Client could not be found");
+        }
     }
+    
+    /**
+     * Construct a successful OIDC token response.
+     * 
+     * @return the tokens
+     */
+    // TODO need to sign the ID token
+    private OIDCTokens constructSuccessfulTokenResponse() {
+
+         final JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
+                 .subject("fake-user")
+                 .issuer("https://op.example.org")
+                 .audience("mock-client-id")
+                 .expirationTime(new Date(System.currentTimeMillis() + 3600_000)) // 1 hour
+                     .issueTime(new Date())
+                     .build();
+        
+         final SignedJWT idToken = new SignedJWT(new JWSHeader(JWSAlgorithm.RS256), claimsSet);
+         final AccessToken accessToken = new BearerAccessToken("fake-access-token-value", 3600, null);
+         final RefreshToken refreshToken = new RefreshToken("fake-refresh-token-value");
+         return new OIDCTokens(idToken, accessToken, refreshToken);
+    }
+    
 
     /**
      * Test successful flow.
      * 
      * @throws IOException 
      */
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
     public void testSuccess() throws IOException {
-        final AuthenticationSuccessResponse response = 
-                buildOIDCAuthorizationCodeResponse(RESPONSE_URL, ResponseMode.QUERY, "eyJzdGF0ZSI6IjE3NjEzMTY5Njc3MTBfMTYyMmE1YzcyNmRhOGY3YjM2ZTI0ZjE5ZWVkODJhZWEiLCJub25jZSI6ImYyNmQ5MjIyMjEyMjZjZDE4MzcyOWJmMTMyNDdkYmUyIn0");
+        
+        // Create a mocked successful token response
+        final OIDCTokenResponse accessTokenResponse = new OIDCTokenResponse(constructSuccessfulTokenResponse());    
+        Mockito.when(httpClient.execute((ClassicHttpRequest) Mockito.any(), (HttpContext) Mockito.any(), 
+                (HttpClientResponseHandler) Mockito.any())).thenReturn(accessTokenResponse);
+
 
+        final AuthenticationSuccessResponse response = 
+                buildOIDCAuthorizationCodeResponse(RESPONSE_URL, ResponseMode.QUERY, 
+                        "eyJzdGF0ZSI6IjE3NjEzMTY5Njc3MTBfMTYyMmE1YzcyNmRhOGY3YjM2ZTI0ZjE5ZWVkODJhZWEiLCJub25jZSI6ImYyNmQ5MjIyMjEyMjZjZDE4MzcyOWJmMTMyNDdkYmUyIn0");
+        
         final DDF input = buildRemotedQueryStringResponse(response);
         
         // Add cookies
diff --git a/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/TestSPOIDCEnvironmentApplicationContextInitializer.java b/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/TestSPOIDCEnvironmentApplicationContextInitializer.java
index c539d66..652b34f 100644
--- a/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/TestSPOIDCEnvironmentApplicationContextInitializer.java
+++ b/sp-oidc-conf-impl/src/test/java/net/shibboleth/sp/oidc/flows/TestSPOIDCEnvironmentApplicationContextInitializer.java
@@ -45,6 +45,8 @@ public class TestSPOIDCEnvironmentApplicationContextInitializer
         mock.setProperty("idp.webflows", "classpath*:/flows");
         mock.setProperty("sp.service.agents.resources", "test.sp.oidc.AgentResolverResources");
         mock.setProperty("sp.stateToken.Manager","shibboleth.sp.CookieStateTokenManager");
+        // Use the mocked HTTP client
+        mock.setProperty("sp.oidc.HttpClient","Mock.HttpClient");
         mock.setProperty("sp.agent.authn.method", "basic");
         //mock.setProperty("idp.service.logging.resource", "/logback-webauthn-flow-test.xml");
         mock.setProperty("idp.additionalProperties",
diff --git a/sp-oidc-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/logback.xml b/sp-oidc-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/logback.xml
new file mode 100644
index 0000000..f22dd67
--- /dev/null
+++ b/sp-oidc-conf-impl/src/test/resources/net/shibboleth/idp/module/conf/logback.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!-- Variables for simplifying logging configuration. http://logback.qos.ch/manual/configuration.html#variableSubstitution -->
+
+    <!-- If you want to use custom properties in this config file, we load the main property file for you. -->
+    <variable file="${idp.home}/conf/idp.properties" />
+
+    <!-- Location and retention. -->
+
+    <variable name="idp.logfiles" value="${idp.logfiles:-${idp.home}/logs}" />
+    <variable name="idp.loghistory" value="${idp.loghistory:-180}" />
+
+    <!-- Much higher performance if you operate on DEBUG. -->
+    <!-- <variable name="idp.process.appender" value="ASYNC_PROCESS" /> -->
+
+    <!-- Logging level shortcuts. -->
+    <variable name="idp.loglevel.idp" value="${idp.loglevel.idp:-OFF}" />
+    <variable name="idp.loglevel.ldap" value="${idp.loglevel.ldap:-OFF}" />
+    <variable name="idp.loglevel.messages" value="${idp.loglevel.messages:-OFF}" />
+    <variable name="idp.loglevel.encryption" value="${idp.loglevel.encryption:-OFF}" />
+    <variable name="idp.loglevel.opensaml" value="${idp.loglevel.opensaml:-OFF}" />
+    <variable name="idp.loglevel.props" value="${idp.loglevel.props:-OFF}" />
+    <variable name="idp.loglevel.httpclient" value="${idp.loglevel.httpclient:-OFF}" />
+
+    <variable name="idp.loglevel.oidc" value="${idp.loglevel.oidc:-OFF}" />
+    <variable name="idp.loglevel.oidc-rp" value="${idp.loglevel.oidc-rp:-OFF}" />    
+    
+    <!-- Don't turn these up unless you want a *lot* of noise. -->
+    <variable name="idp.loglevel.spring" value="${idp.loglevel.spring:-OFF}" />
+    <variable name="idp.loglevel.container" value="${idp.loglevel.container:-OFF}" />
+    <variable name="idp.loglevel.xmlsec" value="${idp.loglevel.xmlsec:-OFF}" />
+    
+    <!-- =========================================================== -->
+    <!-- ============== Logging Categories and Levels ============== -->
+    <!-- =========================================================== -->
+    
+        <!-- Logs IdP, but not OpenSAML, messages -->
+    <logger name="net.shibboleth" level="${idp.loglevel.idp}"/>
+    <logger name="net.shibboleth.oidc" level="${idp.loglevel.oidc}"/>
+    <logger name="net.shibboleth.sp" level="${idp.loglevel.oidc-rp}"/>
+
+    <!-- Logs OpenSAML, but not IdP, messages -->
+    <logger name="org.opensaml.saml" level="${idp.loglevel.opensaml}"/>
+    
+    <!-- Logs LDAP related messages -->
+    <logger name="org.ldaptive" level="${idp.loglevel.ldap}"/>
+
+    <!-- Logs embedded HTTP client messages -->
+    <logger name="org.apache.http" level="${idp.loglevel.httpclient}"/>
+    
+    <!-- Logs inbound and outbound protocols messages at DEBUG level -->
+    <logger name="PROTOCOL_MESSAGE" level="${idp.loglevel.messages}" />
+
+    <!-- Logs unencrypted SAML at DEBUG level -->
+    <logger name="org.opensaml.saml.saml2.encryption.Encrypter" level="${idp.loglevel.encryption}" />
+    <logger name="org.opensaml.saml.saml2.encryption.Decrypter" level="${idp.loglevel.encryption}" />
+
+    <!-- Logs system properties during startup at DEBUG level -->
+    <logger name="net.shibboleth.idp.log.LogbackLoggingService" level="${idp.loglevel.props}" />
+
+    <!-- Especially chatty. -->
+    <logger name="org.apache.xml.security" level="${idp.loglevel.xmlsec}" />
+    <logger name="org.springframework" level="${idp.loglevel.spring}"/>
+    <logger name="org.apache.catalina" level="${idp.loglevel.container}"/>
+    <logger name="org.eclipse.jetty" level="${idp.loglevel.container}"/>
+
+
+    <!-- =========================================================== -->
+    <!-- ============== Low Level Details or Changes =============== -->
+    <!-- =========================================================== -->
+    
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+            <evaluator>
+                <matcher>
+                    <Name>VelocityStatusViewFilter</Name>
+                    <regex>ResourceManager : unable to find resource 'status.vm' in any resource loader.</regex>
+                </matcher>
+                <expression>VelocityStatusViewFilter.matches(formattedMessage)</expression>
+            </evaluator>
+            <OnMatch>DENY</OnMatch>
+        </filter>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>UTF-8</charset>
+            <Pattern>%date{ISO8601} - %level [%logger:%line] - %msg%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <!-- Process log. -->
+    <appender name="IDP_PROCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${idp.logfiles}/idp-process.log</File>
+        
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${idp.logfiles}/idp-process-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <maxHistory>${idp.loghistory}</maxHistory>
+        </rollingPolicy>
+
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>UTF-8</charset>
+            <Pattern>%date{ISO8601} - %mdc{idp.remote_addr} - %level [%logger:%line] - %msg%n%ex{short}</Pattern>
+        </encoder>
+
+        <!-- Ignore Velocity status page error. -->
+        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+            <evaluator>
+                <matcher>
+                    <Name>VelocityStatusMatcher</Name>
+                    <regex>ResourceManager\s*: unable to find resource 'status\.vm' in any resource loader\.</regex>
+                </matcher>
+                <expression>VelocityStatusMatcher.matches(formattedMessage)</expression>
+            </evaluator>
+            <OnMatch>DENY</OnMatch>
+        </filter>
+    </appender>
+
+    <appender name="ASYNC_PROCESS" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="IDP_PROCESS" />
+        <discardingThreshold>0</discardingThreshold>
+    </appender>
+
+    <appender name="IDP_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- Suppress anything below WARN. -->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>WARN</level>
+        </filter>
+        
+        <File>${idp.logfiles}/idp-warn.log</File>
+        
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${idp.logfiles}/idp-warn-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <maxHistory>${idp.loghistory}</maxHistory>
+        </rollingPolicy>
+        
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>UTF-8</charset>
+            <Pattern>%date{ISO8601} - %mdc{idp.remote_addr} - %level [%logger:%line] - %msg%n%ex{full}</Pattern>
+        </encoder>
+        
+        <!-- Ignore Velocity status page error. -->
+        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
+            <evaluator>
+                <matcher>
+                    <Name>VelocityStatusMatcher</Name>
+                    <regex>ResourceManager\s*: unable to find resource 'status\.vm' in any resource loader\.</regex>
+                </matcher>
+                <expression>VelocityStatusMatcher.matches(formattedMessage)</expression>
+            </evaluator>
+            <OnMatch>DENY</OnMatch>
+        </filter>
+    </appender>
+    
+    <!-- Audit log. -->
+    <appender name="IDP_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${idp.logfiles}/idp-audit.log</File>
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${idp.logfiles}/idp-audit-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <maxHistory>${idp.loghistory}</maxHistory>
+        </rollingPolicy>
+
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>UTF-8</charset>
+            <Pattern>%msg%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <!-- Consent audit log. -->
+    <appender name="IDP_CONSENT_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${idp.logfiles}/idp-consent-audit.log</File>
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${idp.logfiles}/idp-consent-audit-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <maxHistory>${idp.loghistory}</maxHistory>
+        </rollingPolicy>
+
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <charset>UTF-8</charset>
+            <Pattern>%msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <!-- F-TICKS syslog destination. -->
+    <appender name="IDP_FTICKS" class="ch.qos.logback.classic.net.SyslogAppender">
+        <syslogHost>${idp.fticks.loghost:-localhost}</syslogHost>
+        <port>${idp.fticks.logport:-514}</port>
+        <facility>AUTH</facility>
+        <suffixPattern>[%thread] %logger %msg</suffixPattern>
+    </appender>
+
+    <logger name="Shibboleth-Audit" level="${idp.loglevel.audit:-OFF}">
+        <appender-ref ref="${idp.audit.appender:-IDP_AUDIT}"/>
+    </logger>
+
+    <logger name="Shibboleth-FTICKS" level="${idp.loglevel.fticks:-OFF}" additivity="false">
+        <appender-ref ref="${idp.fticks.appender:-IDP_FTICKS}"/>
+    </logger>
+
+    <logger name="Shibboleth-Consent-Audit" level="${idp.loglevel.consent-audit:-OFF}">
+        <appender-ref ref="${idp.consent.appender:-IDP_CONSENT_AUDIT}"/>
+    </logger>
+    
+    <root level="${idp.loglevel.root:-OFF}">
+        <appender-ref ref="${idp.process.appender:-IDP_PROCESS}"/>
+        <appender-ref ref="${idp.warn.appender:-IDP_WARN}" />
+        <appender-ref ref="CONSOLE" />
+    </root>
+
+
+</configuration>
diff --git a/sp-oidc-conf-impl/src/test/resources/net/shibboleth/sp/oidc-test-beans.xml b/sp-oidc-conf-impl/src/test/resources/net/shibboleth/sp/oidc-test-beans.xml
index 2ec55a8..caf31d8 100644
--- a/sp-oidc-conf-impl/src/test/resources/net/shibboleth/sp/oidc-test-beans.xml
+++ b/sp-oidc-conf-impl/src/test/resources/net/shibboleth/sp/oidc-test-beans.xml
@@ -36,6 +36,13 @@
         p:includedAlgorithms="#{getObject('shibboleth.oidc.IncludedEncryptionAlgorithms')}"
         p:excludedAlgorithms="#{getObject('shibboleth.oidc.ExcludedEncryptionAlgorithms')}" />
 
-      
+
+    <!-- Mockito mock for HttpClient -->
+    <bean id="Mock.HttpClient"
+          class="org.mockito.Mockito"
+          factory-method="mock">
+        <constructor-arg value="org.apache.hc.client5.http.classic.HttpClient"/>
+    </bean>
+
 
 </beans>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list