[java-identity-provider] 01/02: IDP-2069 Null handling
Rod Widdowson
rdw at steadingsoftware.com
Thu Feb 9 10:40:50 UTC 2023
This is an automated email from the git hooks/post-receive script.
rdw pushed a commit to branch main
in repository java-identity-provider.
View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=c70b0d7fc6d509417e28a1c536ca4d21385d8b6e
commit c70b0d7fc6d509417e28a1c536ca4d21385d8b6e
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Wed Feb 8 14:40:00 2023 +0000
IDP-2069 Null handling
https://shibboleth.atlassian.net/browse/IDP-2069
A whole bunch more uses of null safe methods. Also includes some drive by
fixes of individual modules where the nullability was entirely inside that
one module.
One real NPE fixed.
Multiple potential NPEs fixed of the sort that we 'know' that a
setter won't be called between two getters (ofetn but not always)
because the objects has been initialized.
Multiple asserts added for flows we know to be safe
---
.../idp/admin/impl/UnlockDataSealers.java | 16 ++--
.../idp/admin/impl/UnlockPrivateKeys.java | 25 ++---
.../attribute/AbstractCASAttributeTranscoder.java | 1 +
.../cas/config/AbstractProtocolConfiguration.java | 15 ++-
.../idp/cas/config/LoginConfiguration.java | 25 +++--
.../idp/cas/protocol/ServiceTicketRequest.java | 6 +-
.../idp/cas/protocol/ServiceTicketResponse.java | 14 ++-
.../idp/cas/ticket/ProxyGrantingTicket.java | 4 +-
.../net/shibboleth/idp/cas/ticket/ProxyTicket.java | 2 +-
.../cas/service/impl/ServiceEntityDescriptor.java | 15 +--
.../net/shibboleth/idp/cli/impl/JarCheckCLI.java | 20 ++--
.../impl/AbstractConsentIndexedStorageAction.java | 15 ++-
.../impl/AbstractAttributeDisplayFunction.java | 13 ++-
.../logic/impl/PreferExplicitOrderComparator.java | 16 ++--
.../idp/spring/DeprecatedPropertyBean.java | 6 +-
.../idp/profile/audit/impl/WriteAuditLog.java | 13 +--
.../idp/profile/impl/ResolveAttributes.java | 2 +-
.../impl/PopulateProfileInterceptorContext.java | 7 +-
.../support/PathInfoSupportingFlowUrlHandler.java | 7 +-
.../impl/CriteriaSelfEntityIDResolver.java | 31 +++---
.../DefaultRelyingPartyConfigurationResolver.java | 41 ++++----
...gCriteriaRelyingPartyConfigurationResolver.java | 24 +++--
.../impl/EncryptionCredentialsResolver.java | 7 +-
.../impl/SigningCredentialsResolver.java | 7 +-
.../config/SingleLogoutProfileConfiguration.java | 13 ++-
...tributeSourcedSAML1NameIdentifierGenerator.java | 6 +-
.../impl/AttributeSourcedSAML2NameIDGenerator.java | 6 +-
.../saml/nameid/impl/BaseTransformingDecoder.java | 11 ++-
.../impl/PersistentSAML2NameIDGenerator.java | 9 +-
.../impl/PopulateBindingAndEndpointContexts.java | 60 +++++++-----
.../idp/session/impl/DetectIdentitySwitch.java | 25 +++--
.../session/impl/StorageBackedSessionManager.java | 38 +++++---
.../factory/FlowDefinitionResourceFactory.java | 15 +--
.../idp/ui/context/RelyingPartyUIContext.java | 104 +++++++++++----------
34 files changed, 349 insertions(+), 270 deletions(-)
diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockDataSealers.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockDataSealers.java
index 230308e5d..b1645a50b 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockDataSealers.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockDataSealers.java
@@ -19,9 +19,7 @@ package net.shibboleth.idp.admin.impl;
import java.security.KeyException;
import java.util.Collection;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -34,6 +32,8 @@ import org.slf4j.Logger;
import net.shibboleth.idp.profile.AbstractProfileAction;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
+import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.security.impl.BasicKeystoreKeyStrategy;
@@ -69,7 +69,7 @@ public class UnlockDataSealers extends AbstractProfileAction {
/** Constructor. */
public UnlockDataSealers() {
- keyStrategies = Collections.emptyList();
+ keyStrategies = CollectionSupport.emptyList();
}
/**
@@ -81,15 +81,15 @@ public class UnlockDataSealers extends AbstractProfileAction {
checkSetterPreconditions();
if (strategies != null) {
- keyStrategies = List.copyOf(strategies);
+ keyStrategies = CollectionSupport.copyToList(strategies);
} else {
- keyStrategies = Collections.emptyList();
+ keyStrategies = CollectionSupport.emptyList();
}
}
/** {@inheritDoc} */
@Override
- protected boolean doPreExecute(final ProfileRequestContext profileRequestContext) {
+ protected boolean doPreExecute(final @Nonnull ProfileRequestContext profileRequestContext) {
if (!super.doPreExecute(profileRequestContext) || keyStrategies.isEmpty()) {
return false;
@@ -103,9 +103,9 @@ public class UnlockDataSealers extends AbstractProfileAction {
}
/** {@inheritDoc} */
- @Override protected void doExecute(final ProfileRequestContext profileRequestContext) {
+ @Override protected void doExecute(final @Nonnull ProfileRequestContext profileRequestContext) {
- final HttpServletRequest request = getHttpServletRequest();
+ @Nonnull final HttpServletRequest request = Constraint.isNotNull(getHttpServletRequest(), "Could noit locate servlet request");
final String[] keystorePasswords = request.getParameterValues(KEYSTORE_PASSWORD_PARAM_NAME);
final String[] keyPasswords = request.getParameterValues(KEY_PASSWORD_PARAM_NAME);
diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockPrivateKeys.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockPrivateKeys.java
index 5a0842a99..fe68cc7db 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockPrivateKeys.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/UnlockPrivateKeys.java
@@ -21,9 +21,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.security.KeyException;
import java.util.Collection;
-import java.util.Collections;
import java.util.Iterator;
-import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -40,9 +38,12 @@ import org.springframework.core.io.Resource;
import net.shibboleth.idp.profile.AbstractProfileAction;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.primitive.LoggerFactory;
+import jakarta.servlet.http.HttpServletRequest;
+
/**
* Action that creates private key objects and injects them into existing
* {@link MutableCredential} objects.
@@ -71,8 +72,8 @@ public class UnlockPrivateKeys extends AbstractProfileAction {
/** Constructor. */
public UnlockPrivateKeys() {
- credentials = Collections.emptyList();
- keyResources = Collections.emptyList();
+ credentials = CollectionSupport.emptyList();
+ keyResources = CollectionSupport.emptyList();
}
/**
@@ -84,9 +85,9 @@ public class UnlockPrivateKeys extends AbstractProfileAction {
checkSetterPreconditions();
if (creds != null) {
- credentials = List.copyOf(creds);
+ credentials = CollectionSupport.copyToList(creds);
} else {
- credentials = Collections.emptyList();
+ credentials = CollectionSupport.emptyList();
}
}
@@ -99,9 +100,9 @@ public class UnlockPrivateKeys extends AbstractProfileAction {
checkSetterPreconditions();
if (keys != null) {
- keyResources = List.copyOf(keys);
+ keyResources = CollectionSupport.copyToList(keys);
} else {
- keyResources = Collections.emptyList();
+ keyResources = CollectionSupport.emptyList();
}
}
@@ -117,7 +118,7 @@ public class UnlockPrivateKeys extends AbstractProfileAction {
/** {@inheritDoc} */
@Override
- protected boolean doPreExecute(final ProfileRequestContext profileRequestContext) {
+ protected boolean doPreExecute(final @Nonnull ProfileRequestContext profileRequestContext) {
if (!super.doPreExecute(profileRequestContext) || credentials.isEmpty() || keyResources.isEmpty()) {
return false;
@@ -131,9 +132,11 @@ public class UnlockPrivateKeys extends AbstractProfileAction {
}
/** {@inheritDoc} */
- @Override protected void doExecute(final ProfileRequestContext profileRequestContext) {
+ @Override protected void doExecute(final @Nonnull ProfileRequestContext profileRequestContext) {
- final String[] keyPasswords = getHttpServletRequest().getParameterValues(KEY_PASSWORD_PARAM_NAME);
+ final HttpServletRequest request = getHttpServletRequest();
+ assert request != null;
+ final String[] keyPasswords = request.getParameterValues(KEY_PASSWORD_PARAM_NAME);
if (keyPasswords == null || keyPasswords.length != credentials.size()) {
log.warn("{} Password parameter count does not match number of configured credentials", getLogPrefix());
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
index dbd1ecf9c..310b2bd64 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/attribute/AbstractCASAttributeTranscoder.java
@@ -194,6 +194,7 @@ public abstract class AbstractCASAttributeTranscoder<EncodedType extends IdPAttr
if (Strings.isNullOrEmpty(id)) {
throw new AttributeDecodingException("Required transcoder property 'id' not found");
}
+ assert id != null;
if (!attribute.getValues().isEmpty() && attributeValues.isEmpty()) {
throw new AttributeDecodingException("Failed to decode any values for attribute " + attribute.getName());
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
index e64459a79..4ac12f6c2 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/AbstractProtocolConfiguration.java
@@ -24,6 +24,10 @@ import java.util.function.Predicate;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.opensaml.security.config.BasicSecurityConfiguration;
+import org.opensaml.security.config.SecurityConfiguration;
+
import net.shibboleth.idp.cas.ticket.TicketIdentifierGenerationStrategy;
import net.shibboleth.idp.profile.config.AbstractConditionalProfileConfiguration;
import net.shibboleth.idp.profile.config.AttributeResolvingProfileConfiguration;
@@ -31,12 +35,7 @@ import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.component.InitializableComponent;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.logic.FunctionSupport;
-
-import org.opensaml.profile.context.ProfileRequestContext;
-import org.opensaml.security.config.BasicSecurityConfiguration;
-import org.opensaml.security.config.SecurityConfiguration;
-
-import com.google.common.base.Predicates;
+import net.shibboleth.shared.logic.PredicateSupport;
/**
* Base class for CAS protocol configuration.
@@ -69,7 +68,7 @@ public abstract class AbstractProtocolConfiguration extends AbstractConditionalP
public AbstractProtocolConfiguration(@Nonnull @NotEmpty final String profileId) {
super(profileId);
- resolveAttributesPredicate = Predicates.alwaysTrue();
+ resolveAttributesPredicate = PredicateSupport.alwaysTrue();
ticketValidityPeriodLookupStrategy = FunctionSupport.constant(DEFAULT_TICKET_VALIDITY_PERIOD);
defaultSecurityConfiguration = new BasicSecurityConfiguration(Duration.ofMinutes(5),
@@ -134,7 +133,7 @@ public abstract class AbstractProtocolConfiguration extends AbstractConditionalP
* @param flag flag to set
*/
public void setResolveAttributes(final boolean flag) {
- resolveAttributesPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+ resolveAttributesPredicate = flag ? PredicateSupport.alwaysTrue() : PredicateSupport.alwaysFalse();
}
/**
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/LoginConfiguration.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/LoginConfiguration.java
index d6cd8ea4d..1c7ced06f 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/LoginConfiguration.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/config/LoginConfiguration.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.cas.config;
import java.security.Principal;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -30,8 +29,6 @@ import javax.annotation.Nullable;
import org.opensaml.profile.context.ProfileRequestContext;
-import com.google.common.base.Predicates;
-
import net.shibboleth.idp.authn.config.AuthenticationProfileConfiguration;
import net.shibboleth.idp.saml.authn.principal.AuthnContextClassRefPrincipal;
import net.shibboleth.shared.annotation.constraint.NonNegative;
@@ -39,8 +36,10 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.annotation.constraint.NotLive;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
import net.shibboleth.shared.primitive.StringSupport;
@@ -87,8 +86,8 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
authenticationFlowsLookupStrategy = FunctionSupport.constant(null);
postAuthenticationFlowsLookupStrategy = FunctionSupport.constant(null);
defaultAuthenticationContextsLookupStrategy = FunctionSupport.constant(null);
- forceAuthnPredicate = Predicates.alwaysFalse();
- storeConsentInTicketsPredicate = Predicates.alwaysFalse();
+ forceAuthnPredicate = PredicateSupport.alwaysFalse();
+ storeConsentInTicketsPredicate = PredicateSupport.alwaysFalse();
proxyCountLookupStrategy = FunctionSupport.constant(null);
}
@@ -98,9 +97,9 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
final Collection<AuthnContextClassRefPrincipal> methods =
defaultAuthenticationContextsLookupStrategy.apply(profileRequestContext);
if (methods != null) {
- return List.copyOf(methods);
+ return CollectionSupport.copyToList(methods);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/**
@@ -133,9 +132,9 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
final Set<String> flows = authenticationFlowsLookupStrategy.apply(profileRequestContext);
if (flows != null) {
- return Set.copyOf(flows);
+ return CollectionSupport.copyToSet(flows);
}
- return Collections.emptySet();
+ return CollectionSupport.emptySet();
}
/**
@@ -167,9 +166,9 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
@Nullable final ProfileRequestContext profileRequestContext) {
final Collection<String> flows = postAuthenticationFlowsLookupStrategy.apply(profileRequestContext);
if (flows != null) {
- return List.copyOf(flows);
+ return CollectionSupport.copyToList(flows);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/**
@@ -207,7 +206,7 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
* @param flag flag to set
*/
public void setForceAuthn(final boolean flag) {
- forceAuthnPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+ forceAuthnPredicate = flag ? PredicateSupport.alwaysTrue() : PredicateSupport.alwaysFalse();
}
/**
@@ -240,7 +239,7 @@ public class LoginConfiguration extends AbstractProtocolConfiguration
* @since 4.2.0
*/
public void setStoreConsentInTickets(final boolean flag) {
- storeConsentInTicketsPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+ storeConsentInTicketsPredicate = flag ? PredicateSupport.alwaysTrue() : PredicateSupport.alwaysFalse();
}
/**
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketRequest.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketRequest.java
index 219b2572b..31e0ff785 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketRequest.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketRequest.java
@@ -29,10 +29,10 @@ import net.shibboleth.shared.logic.Constraint;
public class ServiceTicketRequest {
/** HTTP GET method. */
- public static final String METHOD_GET = "GET";
+ @Nonnull public static final String METHOD_GET = "GET";
/** HTTP POST method. */
- public static final String METHOD_POST = "POST";
+ @Nonnull public static final String METHOD_POST = "POST";
/** Service URL. */
@Nonnull private final String serviceURL;
@@ -47,7 +47,7 @@ public class ServiceTicketRequest {
private boolean saml;
/** CAS protocol 3.0 "method" parameter. */
- private String method = METHOD_GET;
+ @Nonnull private String method = METHOD_GET;
/**
* Constructor.
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketResponse.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketResponse.java
index 8c317101d..e1ccb2188 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketResponse.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/protocol/ServiceTicketResponse.java
@@ -17,12 +17,12 @@
package net.shibboleth.idp.cas.protocol;
+import javax.annotation.Nonnull;
+
import org.springframework.web.util.UriComponentsBuilder;
import net.shibboleth.shared.logic.Constraint;
-import javax.annotation.Nonnull;
-
/**
* CAS protocol response message for a successfully granted service ticket.
*
@@ -91,11 +91,15 @@ public class ServiceTicketResponse {
*
* @return the name of the ticket parameter returned to the requesting service
*/
- public String getTicketParameterName() {
+ @Nonnull public String getTicketParameterName() {
+ final String result;
if (saml) {
- return SamlParam.SAMLart.name();
+ result = SamlParam.SAMLart.name();
+ } else {
+ result = ProtocolParam.Ticket.id();
}
- return ProtocolParam.Ticket.id();
+ assert result != null;
+ return result;
}
/**
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyGrantingTicket.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyGrantingTicket.java
index dbf236af8..b1e768b96 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyGrantingTicket.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyGrantingTicket.java
@@ -32,7 +32,7 @@ import net.shibboleth.shared.primitive.StringSupport;
public class ProxyGrantingTicket extends Ticket {
/** Proxy callback URL that uniquely identifies the proxying party to which the PGT was issued. */
- private String proxyCallbackUrl;
+ @Nonnull private String proxyCallbackUrl;
/** The ID of the parent proxy-granting ticket. */
@Nullable
@@ -82,7 +82,7 @@ public class ProxyGrantingTicket extends Ticket {
}
@Override
- protected Ticket newInstance(final String newId) {
+ protected Ticket newInstance(@Nonnull final String newId) {
return new ProxyGrantingTicket(
newId, getService(), getExpirationInstant(), getProxyCallbackUrl(), parentPgTicketId);
}
diff --git a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyTicket.java b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyTicket.java
index 8bf0987cf..5242ddc78 100644
--- a/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyTicket.java
+++ b/idp-cas-api/src/main/java/net/shibboleth/idp/cas/ticket/ProxyTicket.java
@@ -61,7 +61,7 @@ public class ProxyTicket extends Ticket {
}
@Override
- protected Ticket newInstance(final String newId) {
+ protected Ticket newInstance(@Nonnull final String newId) {
return new ProxyTicket(newId, getService(), getExpirationInstant(), pgTicketId);
}
diff --git a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/ServiceEntityDescriptor.java b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/ServiceEntityDescriptor.java
index e2c1f6592..631950bea 100644
--- a/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/ServiceEntityDescriptor.java
+++ b/idp-cas-impl/src/main/java/net/shibboleth/idp/cas/service/impl/ServiceEntityDescriptor.java
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
import javax.xml.namespace.QName;
import net.shibboleth.idp.cas.service.Service;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.StringSupport;
@@ -69,8 +70,10 @@ public class ServiceEntityDescriptor extends AbstractXMLObject implements Entity
super(SAMLConstants.SAML20MD_NS, EntityDescriptor.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20MD_PREFIX);
svc = Constraint.isNotNull(service, "Service cannot be null");
- if (StringSupport.trimOrNull(service.getGroup()) != null) {
- getObjectMetadata().put(new EntityGroupName(service.getGroup()));
+ final String group = service.getGroup();
+ if (StringSupport.trimOrNull(group) != null) {
+ assert group != null;
+ getObjectMetadata().put(new EntityGroupName(group));
}
}
@@ -182,12 +185,12 @@ public class ServiceEntityDescriptor extends AbstractXMLObject implements Entity
/** {@inheritDoc} */
public List<ContactPerson> getContactPersons() {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/** {@inheritDoc} */
public List<AdditionalMetadataLocation> getAdditionalMetadataLocations() {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/** {@inheritDoc} */
@@ -244,14 +247,14 @@ public class ServiceEntityDescriptor extends AbstractXMLObject implements Entity
}
/** {@inheritDoc} */
- public void setValidUntil(final Instant validUntil) {
+ public void setValidUntil(final @Nullable Instant validUntil) {
throw new UnsupportedOperationException();
}
/** {@inheritDoc} */
@Override
public List<XMLObject> getOrderedChildren() {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
}
\ No newline at end of file
diff --git a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckCLI.java b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckCLI.java
index 0eddbfc09..aefabc771 100644
--- a/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckCLI.java
+++ b/idp-cli/src/main/java/net/shibboleth/idp/cli/impl/JarCheckCLI.java
@@ -45,6 +45,7 @@ import org.slf4j.Logger;
import net.shibboleth.idp.Version;
import net.shibboleth.idp.cli.AbstractIdPHomeAwareCommandLine;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.primitive.LoggerFactory;
/**
@@ -56,13 +57,13 @@ public final class JarCheckCLI extends AbstractIdPHomeAwareCommandLine<JarCheckA
@Nullable private Logger log;
/** Jar files in edit-webapp. */
- @Nonnull private List<String> webAppJars = Collections.emptyList();
+ @Nonnull private List<String> webAppJars = CollectionSupport.emptyList();
/** Jar files Plugin Folder. */
- @Nonnull private List<String> pluginJars = Collections.emptyList();
+ @Nonnull private List<String> pluginJars = CollectionSupport.emptyList();
/** Jar files Distributions . */
- @Nonnull private List<String> distJars = Collections.emptyList();
+ @Nonnull private List<String> distJars = CollectionSupport.emptyList();
/** Populate {@link #webAppJars}, {@link #pluginJars} and {@link #distJars}.
* @param args the arguments
@@ -79,19 +80,21 @@ public final class JarCheckCLI extends AbstractIdPHomeAwareCommandLine<JarCheckA
* @param webapp folder to start at.
* @return the list of names as a strung
*/
- private List<String> listJars(final Path webapp) {
+ @Nonnull private List<String> listJars(final Path webapp) {
final Path libDir = webapp.resolve("WEB-INF").resolve("lib");
if (!Files.exists(libDir) || !Files.isDirectory(libDir)) {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
- return Arrays.asList(libDir.toFile().list(new FilenameFilter() {
+ final List<String> result = Arrays.asList(libDir.toFile().list(new FilenameFilter() {
public boolean accept(final File dir, final String name) {
final String nameUpper = name.toUpperCase();
return nameUpper.endsWith(".JAR");
}
}));
+ assert result != null;
+ return result;
}
/** Check for the same file in two places.
@@ -140,7 +143,7 @@ public final class JarCheckCLI extends AbstractIdPHomeAwareCommandLine<JarCheckA
}
/** {@inheritDoc} */
- protected Class<JarCheckArguments> getArgumentClass() {
+ protected @Nonnull Class<JarCheckArguments> getArgumentClass() {
return JarCheckArguments.class;
}
@@ -150,10 +153,11 @@ public final class JarCheckCLI extends AbstractIdPHomeAwareCommandLine<JarCheckA
}
/** {@inheritDoc} */
- protected synchronized Logger getLogger() {
+ @Nonnull protected synchronized Logger getLogger() {
if (log == null) {
log = LoggerFactory.getLogger(JarCheckCLI.class);
}
+ assert log != null;
return log;
}
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
index 128d36cef..e51d05301 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/flow/storage/impl/AbstractConsentIndexedStorageAction.java
@@ -21,7 +21,6 @@ import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
@@ -39,8 +38,10 @@ import net.shibboleth.idp.consent.flow.impl.ConsentFlowDescriptor;
import net.shibboleth.idp.consent.storage.impl.CollectionSerializer;
import net.shibboleth.idp.profile.context.ProfileInterceptorContext;
import net.shibboleth.idp.profile.interceptor.ProfileInterceptorResult;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.collection.Pair;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
@@ -65,7 +66,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
@Nullable private String storageIndexKey;
/** Strategy used to determine the storage key of the index record. */
- @Nullable private Function<ProfileRequestContext, String> storageIndexKeyLookupStrategy;
+ @NonnullAfterInit private Function<ProfileRequestContext, String> storageIndexKeyLookupStrategy;
/** Strategy used to manipulate the storage keys when pruning storage records. */
@Nullable private Function<Pair<ProfileRequestContext, List<String>>, List<String>> storageKeysStrategy;
@@ -76,7 +77,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
/** Constructor. */
public AbstractConsentIndexedStorageAction() {
super();
- setStorageKeysSerializer(new CollectionSerializer());
+ storageKeysSerializer = new CollectionSerializer();
}
/**
@@ -127,10 +128,6 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
if (storageIndexKeyLookupStrategy == null) {
throw new ComponentInitializationException("Storage key lookup strategy cannot be null");
}
-
- if (storageKeysSerializer == null) {
- throw new ComponentInitializationException("Storage keys serializer cannot be null");
- }
}
/** {@inheritDoc} */
@@ -175,7 +172,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
getStorageContext(), getStorageIndexKey());
if (storageRecord == null) {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
return new ArrayList<>(storageRecord.getValue(getStorageKeysSerializer(), getStorageContext(),
@@ -198,7 +195,7 @@ public class AbstractConsentIndexedStorageAction extends AbstractConsentStorageA
if (storageRecord == null) {
log.debug("{} Creating storage index with key '{}'", getLogPrefix(), keyToAdd);
return getStorageService().create(getStorageContext(), getStorageIndexKey(),
- Collections.singletonList(keyToAdd), storageKeysSerializer, null);
+ CollectionSupport.singletonList(keyToAdd), storageKeysSerializer, null);
}
final LinkedHashSet<String> keys = new LinkedHashSet<>(getStorageKeysFromIndex());
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
index 547cfe31b..22151979e 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/AbstractAttributeDisplayFunction.java
@@ -17,7 +17,6 @@
package net.shibboleth.idp.consent.logic.impl;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -28,10 +27,11 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import jakarta.servlet.http.HttpServletRequest;
+
import net.shibboleth.idp.attribute.IdPAttribute;
import net.shibboleth.idp.attribute.transcoding.AttributeTranscoderRegistry;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.StringSupport;
import net.shibboleth.shared.service.ReloadableService;
@@ -39,6 +39,8 @@ import net.shibboleth.shared.service.ServiceException;
import net.shibboleth.shared.service.ServiceableComponent;
import net.shibboleth.shared.spring.util.SpringSupport;
+import jakarta.servlet.http.HttpServletRequest;
+
/**
* Abstract Function which returns {@link Locale}-aware information about an attribute. The abstract method
* {@link #getDisplayInfo(AttributeTranscoderRegistry, IdPAttribute)} returns the information selected for
@@ -75,14 +77,15 @@ public abstract class AbstractAttributeDisplayFunction implements Function<IdPAt
languageRange = SpringSupport.getLanguageRange(request);
transcoder = Constraint.isNotNull(transcoderService, "Injected transocde service should be non-null");
if (defaultLanguages == null || defaultLanguages.isEmpty()) {
- defaultLanguageRange = Collections.emptyList();
+ defaultLanguageRange = CollectionSupport.emptyList();
} else {
defaultLanguageRange = defaultLanguages.
stream().
map(StringSupport::trimOrNull).
filter(e -> e != null).
map(s -> new LanguageRange(s)).
- collect(Collectors.toUnmodifiableList());
+ collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
}
}
@@ -98,7 +101,7 @@ public abstract class AbstractAttributeDisplayFunction implements Function<IdPAt
transcoder.getServiceableComponent()) {
displayInfo = getDisplayInfo(component.getComponent(), input);
} catch (final ServiceException e) {
- // Ignore.
+ displayInfo = CollectionSupport.emptyMap();
}
cachedInfo.put(input, displayInfo);
}
diff --git a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
index 4aa65985d..4d9785a2b 100644
--- a/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
+++ b/idp-consent-impl/src/main/java/net/shibboleth/idp/consent/logic/impl/PreferExplicitOrderComparator.java
@@ -17,7 +17,6 @@
package net.shibboleth.idp.consent.logic.impl;
-import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@@ -30,6 +29,7 @@ import com.google.common.collect.Ordering;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NullableElements;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.primitive.StringSupport;
/**
@@ -44,10 +44,10 @@ import net.shibboleth.shared.primitive.StringSupport;
public class PreferExplicitOrderComparator implements Comparator<String> {
/** Explicit ordering. */
- @Nullable private Ordering<String> explicitOrdering;
+ @Nonnull final private Ordering<String> explicitOrdering;
/** Strings in order. */
- @Nonnull @NonnullElements @Unmodifiable private List<String> explicitOrder;
+ @Nonnull @NonnullElements @Unmodifiable final private List<String> explicitOrder;
/**
* Constructor.
@@ -56,7 +56,7 @@ public class PreferExplicitOrderComparator implements Comparator<String> {
*/
public PreferExplicitOrderComparator(@Nullable @NullableElements final List<String> order) {
if (order == null) {
- explicitOrder = Collections.emptyList();
+ explicitOrder = CollectionSupport.emptyList();
} else {
// no duplicates
explicitOrder = order.
@@ -64,10 +64,12 @@ public class PreferExplicitOrderComparator implements Comparator<String> {
map(StringSupport::trimOrNull).
filter(e -> e != null).
distinct().
- collect(Collectors.toUnmodifiableList());
-
- explicitOrdering = Ordering.explicit(explicitOrder);
+ collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
}
+ final Ordering<String> ord =Ordering.explicit(explicitOrder);
+ assert ord != null;
+ explicitOrdering = ord;
}
/**
diff --git a/idp-core/src/main/java/net/shibboleth/idp/spring/DeprecatedPropertyBean.java b/idp-core/src/main/java/net/shibboleth/idp/spring/DeprecatedPropertyBean.java
index 54b72872e..1989d6cfb 100644
--- a/idp-core/src/main/java/net/shibboleth/idp/spring/DeprecatedPropertyBean.java
+++ b/idp-core/src/main/java/net/shibboleth/idp/spring/DeprecatedPropertyBean.java
@@ -18,7 +18,6 @@
package net.shibboleth.idp.spring;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -30,6 +29,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.AbstractInitializableComponent;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
@@ -58,8 +58,8 @@ public class DeprecatedPropertyBean extends AbstractInitializableComponent imple
/** Constructor. */
public DeprecatedPropertyBean() {
- deprecatedProperties = Collections.emptyMap();
- deadProperties = Collections.emptyList();
+ deprecatedProperties = CollectionSupport.emptyMap();
+ deadProperties = CollectionSupport.emptyList();
}
/**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
index 2cb45a02a..9276d949e 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLog.java
@@ -47,6 +47,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.annotation.constraint.NotLive;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -92,8 +93,8 @@ public class WriteAuditLog extends AbstractProfileAction {
/** Constructor. */
public WriteAuditLog() {
auditContextLookupStrategy = new ChildContextLookup<>(AuditContext.class);
- formattingMap = Collections.emptyMap();
- categoriesToLog = Collections.emptyList();
+ formattingMap = CollectionSupport.emptyMap();
+ categoriesToLog = CollectionSupport.emptyList();
dateTimeFormatter = DateTimeFormatter.ISO_INSTANT;
includeProfileLoggingId = true;
}
@@ -115,7 +116,7 @@ public class WriteAuditLog extends AbstractProfileAction {
* @return map of formatting tokens
*/
@Nonnull @NonnullElements @NotLive @Unmodifiable public Map<String,List<String>> getFormattingMap() {
- return Map.copyOf(formattingMap);
+ return CollectionSupport.copyToMap(formattingMap);
}
// Checkstyle: CyclomaticComplexity OFF
@@ -132,7 +133,7 @@ public class WriteAuditLog extends AbstractProfileAction {
checkSetterPreconditions();
if (map == null) {
- formattingMap = Collections.emptyMap();
+ formattingMap = CollectionSupport.emptyMap();
return;
}
@@ -191,9 +192,9 @@ public class WriteAuditLog extends AbstractProfileAction {
checkSetterPreconditions();
if (categories != null) {
- categoriesToLog = List.copyOf(categories);
+ categoriesToLog = CollectionSupport.copyToList(categories);
} else {
- categoriesToLog = Collections.emptyList();
+ categoriesToLog = CollectionSupport.emptyList();
}
}
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
index 024cfbb24..6efbcca29 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
@@ -256,7 +256,7 @@ public final class ResolveAttributes extends AbstractProfileAction {
final AttributeResolutionContext resolutionContext;
if (createResolutionContext) {
- resolutionContext = profileRequestContext.getSubcontext(AttributeResolutionContext.class, true);
+ resolutionContext = profileRequestContext.getOrCreateSubcontext(AttributeResolutionContext.class);
populateResolutionContext(profileRequestContext, resolutionContext);
} else {
resolutionContext = profileRequestContext.getSubcontext(AttributeResolutionContext.class);
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
index 6978a867a..dba5f94f1 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/interceptor/impl/PopulateProfileInterceptorContext.java
@@ -18,8 +18,6 @@
package net.shibboleth.idp.profile.interceptor.impl;
import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
import java.util.Optional;
import java.util.function.Function;
@@ -37,6 +35,7 @@ import net.shibboleth.idp.profile.interceptor.ProfileInterceptorFlowDescriptor;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -68,7 +67,7 @@ public class PopulateProfileInterceptorContext extends AbstractProfileIntercepto
/** Constructor. */
public PopulateProfileInterceptorContext() {
- availableFlows = Collections.emptyList();
+ availableFlows = CollectionSupport.emptyList();
}
/**
@@ -78,7 +77,7 @@ public class PopulateProfileInterceptorContext extends AbstractProfileIntercepto
*/
public void setAvailableFlows(@Nonnull @NonnullElements final Collection<ProfileInterceptorFlowDescriptor> flows) {
checkSetterPreconditions();
- availableFlows = List.copyOf(Constraint.isNotNull(flows, "Flow collection cannot be null"));
+ availableFlows = CollectionSupport.copyToList(Constraint.isNotNull(flows, "Flow collection cannot be null"));
}
/**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/support/PathInfoSupportingFlowUrlHandler.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/support/PathInfoSupportingFlowUrlHandler.java
index 072be05a4..c3e127339 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/support/PathInfoSupportingFlowUrlHandler.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/support/PathInfoSupportingFlowUrlHandler.java
@@ -18,16 +18,17 @@
package net.shibboleth.idp.profile.support;
import java.util.Collection;
-import java.util.Collections;
import javax.annotation.Nonnull;
-import jakarta.servlet.http.HttpServletRequest;
import org.springframework.webflow.context.servlet.DefaultFlowUrlHandler;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.primitive.StringSupport;
+import jakarta.servlet.http.HttpServletRequest;
+
/**
* Extension of standard SWF URL handler that checks for requests in which a valid flow ID
* is a prefix of the PATH_INFO value, allowing the flow to run with the rest of the path
@@ -45,7 +46,7 @@ public class PathInfoSupportingFlowUrlHandler extends DefaultFlowUrlHandler {
/** Constructor. */
public PathInfoSupportingFlowUrlHandler() {
- supportedFlowIds = Collections.emptyList();
+ supportedFlowIds = CollectionSupport.emptyList();
}
/**
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
index f8ce65845..5ff7a5ee8 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/CriteriaSelfEntityIDResolver.java
@@ -17,8 +17,6 @@
package net.shibboleth.idp.relyingparty.impl;
-import java.util.Collections;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -38,9 +36,11 @@ import net.shibboleth.idp.relyingparty.RelyingPartyConfiguration;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.component.IdentifiableComponent;
+import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.resolver.CriteriaSet;
import net.shibboleth.shared.resolver.Resolver;
@@ -100,15 +100,15 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
checkComponentActive();
final String entityID = resolveSingle(criteria);
if (entityID != null) {
- return Collections.singletonList(entityID);
+ return CollectionSupport.singletonList(entityID);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/** {@inheritDoc} */
@Nullable public String resolveSingle(@Nullable final CriteriaSet criteria) throws ResolverException {
checkComponentActive();
- final ProfileRequestContext prc = buildContext(criteria);
+ @Nonnull final ProfileRequestContext prc = Constraint.isNotNull(buildContext(criteria), "Could not build context");
final CriteriaSet prcSet = new CriteriaSet(new ProfileRequestContextCriterion(prc));
final RelyingPartyConfiguration rpc = rpcResolver.resolveSingle(prcSet);
@@ -130,8 +130,9 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
return null;
}
- if (criteria.contains(ProfileRequestContextCriterion.class)) {
- return criteria.get(ProfileRequestContextCriterion.class).getProfileRequestContext();
+ final ProfileRequestContextCriterion prcCriterion = criteria.get(ProfileRequestContextCriterion.class);
+ if (prcCriterion != null) {
+ return prcCriterion.getProfileRequestContext();
}
final String entityID = resolveEntityID(criteria);
@@ -145,13 +146,13 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
if (entityID != null || entityDescriptor != null || roleDescriptor != null) {
final ProfileRequestContext prc = new ProfileRequestContext();
- final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class, true);
+ final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
rpc.setVerified(true);
rpc.setRelyingPartyId(entityID);
if (entityDescriptor != null || roleDescriptor != null) {
- final SAMLPeerEntityContext peerContext = prc.getSubcontext(SAMLPeerEntityContext.class, true);
+ final SAMLPeerEntityContext peerContext = prc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
rpc.setRelyingPartyIdContextTree(peerContext);
peerContext.setEntityId(entityID);
@@ -161,7 +162,7 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
? roleDescriptor.getSchemaType() : roleDescriptor.getElementQName());
}
- final SAMLMetadataContext metadataContext = peerContext.getSubcontext(SAMLMetadataContext.class, true);
+ final SAMLMetadataContext metadataContext = peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
metadataContext.setEntityDescriptor(entityDescriptor);
metadataContext.setRoleDescriptor(roleDescriptor);
}
@@ -177,8 +178,9 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
* @return the input entityID criterion or null if could not be resolved
*/
private String resolveEntityID(@Nonnull final CriteriaSet criteria) {
- if (criteria.contains(EntityIdCriterion.class)) {
- return criteria.get(EntityIdCriterion.class).getEntityId();
+ final EntityIdCriterion eic = criteria.get(EntityIdCriterion.class);
+ if (eic != null) {
+ return eic.getEntityId();
}
final EntityDescriptor ed = resolveEntityDescriptor(criteria);
@@ -211,8 +213,9 @@ public class CriteriaSelfEntityIDResolver extends AbstractIdentifiedInitializabl
* @return the input role descriptor criterion or null if could not be resolved
*/
private RoleDescriptor resolveRoleDescriptor(@Nonnull final CriteriaSet criteria) {
- if (criteria.contains(RoleDescriptorCriterion.class)) {
- return criteria.get(RoleDescriptorCriterion.class).getRole();
+ final RoleDescriptorCriterion rdc = criteria.get(RoleDescriptorCriterion.class);
+ if (rdc != null) {
+ return rdc.getRole();
}
return null;
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
index 9b9020076..6abe2cac2 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DefaultRelyingPartyConfigurationResolver.java
@@ -18,7 +18,6 @@
package net.shibboleth.idp.relyingparty.impl;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.function.Predicate;
@@ -42,6 +41,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.annotation.constraint.NotLive;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
@@ -72,23 +72,23 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
@NonnullAfterInit private RelyingPartyConfiguration defaultConfiguration;
/** The predicate which decides if this request is "verified". */
- @NonnullAfterInit private Predicate<ProfileRequestContext> verificationPredicate;
+ @Nonnull private Predicate<ProfileRequestContext> verificationPredicate;
/** A global default security configuration. */
@Nullable private SecurityConfiguration defaultSecurityConfiguration;
/** The global list of all configured signing credentials. */
- @Nullable private List<Credential> signingCredentials;
+ @Nonnull private List<Credential> signingCredentials;
/** The global list of all configured encryption credentials. */
- @Nullable private List<Credential> encryptionCredentials;
+ @Nonnull private List<Credential> encryptionCredentials;
/** Constructor. */
public DefaultRelyingPartyConfigurationResolver() {
- rpConfigurations = Collections.emptyList();
+ rpConfigurations = CollectionSupport.emptyList();
verificationPredicate = new VerifiedProfilePredicate();
- signingCredentials = Collections.emptyList();
- encryptionCredentials = Collections.emptyList();
+ signingCredentials = CollectionSupport.emptyList();
+ encryptionCredentials = CollectionSupport.emptyList();
}
/**
@@ -108,7 +108,7 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
*/
public void setRelyingPartyConfigurations(@Nonnull @NonnullElements final List<RelyingPartyConfiguration> configs) {
checkSetterPreconditions();
- rpConfigurations = List.copyOf(Constraint.isNotNull(configs, "RelyingPartyConfiguration list cannot be null"));
+ rpConfigurations = CollectionSupport.copyToList(Constraint.isNotNull(configs, "RelyingPartyConfiguration list cannot be null"));
}
/**
@@ -200,18 +200,20 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
checkComponentActive();
if (context == null) {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
log.debug("Resolving relying party configuration");
if (!verificationPredicate.test(context)) {
if (getUnverifiedConfiguration() == null) {
log.warn("Profile request was unverified, but no such configuration is available");
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
+ final RelyingPartyConfiguration uvc = getUnverifiedConfiguration();
+ assert uvc != null;
log.debug("Profile request is unverified, returning configuration {}",
- getUnverifiedConfiguration().getId());
- return Collections.singleton(getUnverifiedConfiguration());
+ uvc.getId());
+ return CollectionSupport.singleton(uvc);
}
final ArrayList<RelyingPartyConfiguration> matches = new ArrayList<>();
@@ -227,9 +229,10 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
}
if (matches.isEmpty()) {
+ final RelyingPartyConfiguration dc = getDefaultConfiguration();
log.debug("No matching Relying Party Configuration found, returning the default configuration {}",
- getDefaultConfiguration().getId());
- return Collections.singleton(getDefaultConfiguration());
+ dc.getId());
+ return CollectionSupport.singleton(dc);
}
return matches;
}
@@ -297,9 +300,10 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
if (credentials != null) {
signingCredentials = credentials.stream()
.flatMap(h -> h.getCredentials().stream())
- .collect(Collectors.toUnmodifiableList());
+ .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
} else {
- signingCredentials = Collections.emptyList();
+ signingCredentials = CollectionSupport.emptyList();
}
}
@@ -326,9 +330,10 @@ public class DefaultRelyingPartyConfigurationResolver extends AbstractIdentifiab
if (credentials != null) {
encryptionCredentials = credentials.stream()
.flatMap(h -> h.getCredentials().stream())
- .collect(Collectors.toUnmodifiableList());
+ .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
} else {
- encryptionCredentials = Collections.emptyList();
+ encryptionCredentials = CollectionSupport.emptyList();
}
}
}
\ No newline at end of file
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
index dc3bf65c2..bcf1a8506 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/DelegatingCriteriaRelyingPartyConfigurationResolver.java
@@ -41,6 +41,7 @@ import net.shibboleth.idp.relyingparty.RelyingPartyConfigurationResolver;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.AbstractIdentifiedInitializableComponent;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.component.IdentifiableComponent;
@@ -132,7 +133,7 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
if (prc != null) {
return delegate.resolve(prc);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
@@ -148,8 +149,9 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
return null;
}
- if (criteria.contains(ProfileRequestContextCriterion.class)) {
- return criteria.get(ProfileRequestContextCriterion.class).getProfileRequestContext();
+ final ProfileRequestContextCriterion prcc = criteria.get(ProfileRequestContextCriterion.class);
+ if (prcc != null) {
+ return prcc.getProfileRequestContext();
}
final String entityID = resolveEntityID(criteria);
@@ -163,13 +165,13 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
if (entityID != null || entityDescriptor != null || roleDescriptor != null) {
final ProfileRequestContext prc = new ProfileRequestContext();
- final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class, true);
+ final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
rpc.setVerified(true);
rpc.setRelyingPartyId(entityID);
if (entityDescriptor != null || roleDescriptor != null) {
- final SAMLPeerEntityContext peerContext = prc.getSubcontext(SAMLPeerEntityContext.class, true);
+ final SAMLPeerEntityContext peerContext = prc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
rpc.setRelyingPartyIdContextTree(peerContext);
peerContext.setEntityId(entityID);
@@ -179,7 +181,7 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
? roleDescriptor.getSchemaType() : roleDescriptor.getElementQName());
}
- final SAMLMetadataContext metadataContext = peerContext.getSubcontext(SAMLMetadataContext.class, true);
+ final SAMLMetadataContext metadataContext = peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
metadataContext.setEntityDescriptor(entityDescriptor);
metadataContext.setRoleDescriptor(roleDescriptor);
}
@@ -195,8 +197,9 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
* @return the input entityID criterion or null if could not be resolved
*/
private String resolveEntityID(@Nonnull final CriteriaSet criteria) {
- if (criteria.contains(EntityIdCriterion.class)) {
- return criteria.get(EntityIdCriterion.class).getEntityId();
+ final EntityIdCriterion eic = criteria.get(EntityIdCriterion.class);
+ if (eic != null) {
+ return eic.getEntityId();
}
final EntityDescriptor ed = resolveEntityDescriptor(criteria);
@@ -229,8 +232,9 @@ public class DelegatingCriteriaRelyingPartyConfigurationResolver extends Abstrac
* @return the input role descriptor criterion or null if could not be resolved
*/
private RoleDescriptor resolveRoleDescriptor(@Nonnull final CriteriaSet criteria) {
- if (criteria.contains(RoleDescriptorCriterion.class)) {
- return criteria.get(RoleDescriptorCriterion.class).getRole();
+ final RoleDescriptorCriterion rdc = criteria.get(RoleDescriptorCriterion.class);
+ if (rdc != null) {
+ return rdc.getRole();
}
return null;
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
index d60a54484..ac082f51b 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/EncryptionCredentialsResolver.java
@@ -17,8 +17,6 @@
package net.shibboleth.idp.relyingparty.impl;
-import java.util.Collections;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -28,6 +26,7 @@ import org.slf4j.Logger;
import net.shibboleth.idp.relyingparty.RelyingPartyConfigurationResolver;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.IdentifiableComponent;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -92,12 +91,12 @@ public class EncryptionCredentialsResolver implements CredentialResolver, Identi
return ((DefaultRelyingPartyConfigurationResolver)resolver).getEncryptionCredentials();
}
log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
} catch (final ServiceException e) {
log.error("EncryptionCredentialsResolver '{}': Invalid RelyingPartyResolver configuration", getId(), e);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
}
\ No newline at end of file
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
index 93b0e1fa7..75bf987fc 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/relyingparty/impl/SigningCredentialsResolver.java
@@ -17,8 +17,6 @@
package net.shibboleth.idp.relyingparty.impl;
-import java.util.Collections;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -28,6 +26,7 @@ import org.slf4j.Logger;
import net.shibboleth.idp.relyingparty.RelyingPartyConfigurationResolver;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.IdentifiableComponent;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -93,12 +92,12 @@ public class SigningCredentialsResolver implements CredentialResolver, Identifia
return ((DefaultRelyingPartyConfigurationResolver)resolver).getSigningCredentials();
}
log.trace("Did NOT see expected instance of DefaultRelyingPartyConfigurationResolver");
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
} catch (final ServiceException e) {
log.error("SigningCredentialsResolver '{}': Invalid RelyingPartyResolver configuration", getId(), e);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
}
\ No newline at end of file
diff --git a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
index 2fa3da9c7..c4d782367 100644
--- a/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
+++ b/idp-saml-api/src/main/java/net/shibboleth/idp/saml/saml2/profile/config/SingleLogoutProfileConfiguration.java
@@ -18,7 +18,6 @@
package net.shibboleth.idp.saml.saml2.profile.config;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
@@ -31,13 +30,13 @@ import org.opensaml.profile.context.ProfileRequestContext;
import org.opensaml.profile.logic.NoConfidentialityMessageChannelPredicate;
import org.opensaml.profile.logic.NoIntegrityMessageChannelPredicate;
-import com.google.common.base.Predicates;
-
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
import net.shibboleth.shared.primitive.StringSupport;
/** Configuration support for SAML 2 Single Logout. */
@@ -98,7 +97,7 @@ public class SingleLogoutProfileConfiguration extends AbstractSAML2ArtifactAware
* @since 4.0.0
*/
public void setSignSOAPRequests(final boolean flag) {
- signSOAPRequestsPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+ signSOAPRequestsPredicate = flag ? PredicateSupport.alwaysTrue() : PredicateSupport.alwaysFalse();
}
/**
@@ -134,7 +133,7 @@ public class SingleLogoutProfileConfiguration extends AbstractSAML2ArtifactAware
* @since 4.0.0
*/
public void setClientTLSSOAPRequests(final boolean flag) {
- clientTLSSOAPRequestsPredicate = flag ? Predicates.alwaysTrue() : Predicates.alwaysFalse();
+ clientTLSSOAPRequestsPredicate = flag ? PredicateSupport.alwaysTrue() : PredicateSupport.alwaysFalse();
}
/**
@@ -168,9 +167,9 @@ public class SingleLogoutProfileConfiguration extends AbstractSAML2ArtifactAware
@Nullable final ProfileRequestContext profileRequestContext) {
final Collection<String> formats = qualifiedNameIDFormatsLookupStrategy.apply(profileRequestContext);
if (formats != null) {
- return List.copyOf(formats);
+ return CollectionSupport.copyToList(formats);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
/**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
index dd50e048f..75547bbf9 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGenerator.java
@@ -17,7 +17,6 @@
package net.shibboleth.idp.saml.nameid.impl;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -46,6 +45,7 @@ import net.shibboleth.idp.profile.context.navigate.RelyingPartyIdLookupFunction;
import net.shibboleth.idp.profile.context.navigate.ResponderIdLookupFunction;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.ThreadSafeAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -78,7 +78,7 @@ public class AttributeSourcedSAML1NameIdentifierGenerator extends AbstractSAML1N
new ChildContextLookup<>(AttributeContext.class).compose(
new ChildContextLookup<>(RelyingPartyContext.class));
delimiter = '@';
- attributeSourceIds = Collections.emptyList();
+ attributeSourceIds = CollectionSupport.emptyList();
setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
setDefaultSPNameQualifierLookupStrategy(new RelyingPartyIdLookupFunction());
useUnfilteredAttributes = false;
@@ -113,7 +113,7 @@ public class AttributeSourcedSAML1NameIdentifierGenerator extends AbstractSAML1N
*/
public void setAttributeSourceIds(@Nonnull @NonnullElements final List<String> ids) {
checkSetterPreconditions();
- attributeSourceIds = List.copyOf(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
+ attributeSourceIds = CollectionSupport.copyToList(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
}
/**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
index dfec413a6..69ba5e5b3 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGenerator.java
@@ -17,7 +17,6 @@
package net.shibboleth.idp.saml.nameid.impl;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -45,6 +44,7 @@ import net.shibboleth.idp.profile.context.navigate.RelyingPartyIdLookupFunction;
import net.shibboleth.idp.profile.context.navigate.ResponderIdLookupFunction;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.ThreadSafeAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -77,7 +77,7 @@ public class AttributeSourcedSAML2NameIDGenerator extends AbstractSAML2NameIDGen
new ChildContextLookup<>(AttributeContext.class).compose(
new ChildContextLookup<>(RelyingPartyContext.class));
delimiter = '@';
- attributeSourceIds = Collections.emptyList();
+ attributeSourceIds = CollectionSupport.emptyList();
setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
setDefaultSPNameQualifierLookupStrategy(new RelyingPartyIdLookupFunction());
useUnfilteredAttributes = false;
@@ -112,7 +112,7 @@ public class AttributeSourcedSAML2NameIDGenerator extends AbstractSAML2NameIDGen
*/
public void setAttributeSourceIds(@Nonnull @NonnullElements final List<String> ids) {
checkSetterPreconditions();
- attributeSourceIds = List.copyOf(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
+ attributeSourceIds = CollectionSupport.copyToList(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
}
/**
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
index bee73a6e4..6ff7416dc 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/BaseTransformingDecoder.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.saml.nameid.impl;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -31,6 +30,7 @@ import org.slf4j.Logger;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.collection.Pair;
import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
import net.shibboleth.shared.logic.Constraint;
@@ -54,7 +54,7 @@ public abstract class BaseTransformingDecoder extends AbstractIdentifiableInitia
/** Constructor. */
public BaseTransformingDecoder() {
- transforms = Collections.emptyList();
+ transforms = CollectionSupport.emptyList();
}
/**
@@ -120,9 +120,10 @@ public abstract class BaseTransformingDecoder extends AbstractIdentifiableInitia
return s;
}
- for (final Pair<Pattern,String> p : transforms) {
- final Matcher m = p.getFirst().matcher(s);
- log.debug("Applying replacement expression '{}' against input '{}'", p.getFirst().pattern(), s);
+ for (final Pair<Pattern,String> p : transforms) {
+ @Nonnull final Pattern first = Constraint.isNotNull(p.getFirst(), "Transforms did not contain pattern");
+ final Matcher m = first.matcher(s);
+ log.debug("Applying replacement expression '{}' against input '{}'", first.pattern(), s);
s = m.replaceAll(p.getSecond());
log.debug("Result of replacement is '{}'", s);
}
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
index e0d96ea64..28d788ff1 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGenerator.java
@@ -18,7 +18,6 @@
package net.shibboleth.idp.saml.nameid.impl;
import java.io.IOException;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -49,6 +48,7 @@ import net.shibboleth.idp.profile.context.navigate.ResponderIdLookupFunction;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.ThreadSafeAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.LoggerFactory;
@@ -89,7 +89,7 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
attributeContextLookupStrategy =
new ChildContextLookup<>(AttributeContext.class).compose(
new ChildContextLookup<>(RelyingPartyContext.class));
- attributeSourceIds = Collections.emptyList();
+ attributeSourceIds = CollectionSupport.emptyList();
setDefaultIdPNameQualifierLookupStrategy(new ResponderIdLookupFunction());
setDefaultSPNameQualifierLookupStrategy(new RelyingPartyIdLookupFunction());
useUnfilteredAttributes = true;
@@ -125,7 +125,7 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
*/
public void setAttributeSourceIds(@Nonnull @NonnullElements final List<String> ids) {
checkSetterPreconditions();
- attributeSourceIds = List.copyOf(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
+ attributeSourceIds = CollectionSupport.copyToList(Constraint.isNotNull(ids, "Attribute ID collection cannot be null"));
}
/**
@@ -172,6 +172,7 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
if (dataSource != null) {
log.debug("Creating JDBCPersistentStoreEx instance around supplied DataSource");
final JDBCPairwiseIdStore newStore = new JDBCPairwiseIdStore();
+ assert dataSource != null;
newStore.setDataSource(dataSource);
newStore.initialize();
pidStore = newStore;
@@ -242,6 +243,7 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
pid.setSourceSystemId(((ScopedStringAttributeValue) value).getValue() + '@'
+ ((ScopedStringAttributeValue) value).getScope());
pid = pidStore.getBySourceValue(pid, true);
+ assert pid != null;
return pid.getPairwiseId();
} else if (value instanceof StringAttributeValue) {
// Check for all whitespace, but don't trim the value used.
@@ -252,6 +254,7 @@ public class PersistentSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator
log.debug("Generating persistent NameID from String-valued attribute {}", sourceId);
pid.setSourceSystemId(((StringAttributeValue) value).getValue());
pid = pidStore.getBySourceValue(pid, true);
+ assert pid != null;
return pid.getPairwiseId();
} else {
log.info("Unrecognized attribute value type: {}", value.getClass().getName());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
index 6113b1955..7b509e105 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
@@ -18,7 +18,6 @@
package net.shibboleth.idp.saml.profile.impl;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
@@ -30,6 +29,7 @@ import javax.xml.namespace.QName;
import org.opensaml.core.xml.XMLObjectBuilder;
import org.opensaml.core.xml.util.XMLObjectSupport;
import org.opensaml.messaging.context.MessageChannelSecurityContext;
+import org.opensaml.messaging.context.MessageContext;
import org.opensaml.messaging.context.navigate.ChildContextLookup;
import org.opensaml.profile.action.ActionSupport;
import org.opensaml.profile.action.EventIds;
@@ -51,8 +51,9 @@ import org.opensaml.saml.criterion.RoleDescriptorCriterion;
import org.opensaml.saml.saml2.core.AuthnRequest;
import org.opensaml.saml.saml2.metadata.Endpoint;
import org.opensaml.saml.saml2.metadata.IndexedEndpoint;
+import org.opensaml.saml.saml2.metadata.RoleDescriptor;
import org.slf4j.Logger;
-import net.shibboleth.shared.primitive.LoggerFactory;
+
import net.shibboleth.idp.profile.AbstractProfileAction;
import net.shibboleth.idp.profile.context.RelyingPartyContext;
import net.shibboleth.idp.saml.profile.config.SAMLArtifactAwareProfileConfiguration;
@@ -62,9 +63,11 @@ import net.shibboleth.idp.saml.saml2.profile.config.BrowserSSOProfileConfigurati
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
import net.shibboleth.shared.resolver.CriteriaSet;
import net.shibboleth.shared.resolver.ResolverException;
@@ -96,7 +99,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
@Nonnull private final Logger log = LoggerFactory.getLogger(PopulateBindingAndEndpointContexts.class);
/** The type of endpoint to resolve. */
- @Nonnull private QName endpointType;
+ @Nullable private QName endpointType;
/** Endpoint resolver. */
@NonnullAfterInit private EndpointResolver<?> endpointResolver;
@@ -123,7 +126,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
@Nullable private Function<ProfileRequestContext,BestMatchLocationCriterion> bestMatchCriterionLookupStrategy;
/** List of possible bindings, in preference order. */
- @Nonnull @NonnullElements private List<BindingDescriptor> bindingDescriptors;
+ @Nullable @NonnullElements private List<BindingDescriptor> bindingDescriptors;
/** Whether an artifact-based binding implies the use of a secure channel. */
private boolean artifactImpliesSecureChannel;
@@ -151,7 +154,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
/** Constructor. */
public PopulateBindingAndEndpointContexts() {
- bindingDescriptorsLookupStrategy = FunctionSupport.constant(Collections.emptyList());
+ bindingDescriptorsLookupStrategy = FunctionSupport.constant(CollectionSupport.emptyList());
relyingPartyContextLookupStrategy = new ChildContextLookup<>(RelyingPartyContext.class);
@@ -308,12 +311,13 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
throw new ComponentInitializationException("EndpointResolver cannot be null");
}
- if (endpointType != null) {
+ final QName et = endpointType;
+ if (et != null) {
endpointBuilder = XMLObjectSupport.getBuilder(endpointType);
if (endpointBuilder == null) {
throw new ComponentInitializationException("Unable to obtain builder for endpoint type "
- + endpointType);
- } else if (!(endpointBuilder.buildObject(endpointType) instanceof Endpoint)) {
+ + et);
+ } else if (!(endpointBuilder.buildObject(et) instanceof Endpoint)) {
throw new ComponentInitializationException("Builder for endpoint type " + endpointType
+ " did not result in Endpoint object");
}
@@ -329,8 +333,9 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
return false;
}
- if (profileRequestContext.getInboundMessageContext() != null) {
- inboundMessage = profileRequestContext.getInboundMessageContext().getMessage();
+ final MessageContext imc = profileRequestContext.getInboundMessageContext();
+ if (imc != null) {
+ inboundMessage = imc.getMessage();
}
final RelyingPartyContext rpContext = relyingPartyContextLookupStrategy.apply(profileRequestContext);
@@ -353,7 +358,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
inboundMessage instanceof AuthnRequest
&& ssoConfig.isSkipEndpointValidationWhenSigned(profileRequestContext)
&& !ssoConfig.isIgnoreRequestSignatures(profileRequestContext)
- && SAMLBindingSupport.isMessageSigned(profileRequestContext.getInboundMessageContext());
+ && SAMLBindingSupport.isMessageSigned(Constraint.isNotNull(imc, "No Inboud Message Context"));
}
}
}
@@ -366,7 +371,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
bindingDescriptors = bindingDescriptorsLookupStrategy.apply(profileRequestContext);
if (bindingDescriptors == null) {
- bindingDescriptors = Collections.emptyList();
+ bindingDescriptors = CollectionSupport.emptyList();
}
mdContext = metadataContextLookupStrategy.apply(profileRequestContext);
@@ -388,9 +393,11 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
log.debug("{} Attempting to resolve endpoint of type {} for outbound message", getLogPrefix(), endpointType);
- // Compile binding list.
- final List<String> bindings = new ArrayList<>(bindingDescriptors.size());
- for (final BindingDescriptor bindingDescriptor : bindingDescriptors) {
+ // Compile binding list. binding descriptors were checked for being non null in pre
+ final List<BindingDescriptor> bds = bindingDescriptors;
+ assert bds != null;
+ @Nonnull final List<String> bindings = new ArrayList<>(bds.size());
+ for (final BindingDescriptor bindingDescriptor : bds) {
if (bindingDescriptor.test(profileRequestContext)) {
bindings.add(bindingDescriptor.getId());
}
@@ -414,8 +421,14 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
}
}
- if (mdContext != null && mdContext.getRoleDescriptor() != null) {
- criteria.add(new RoleDescriptorCriterion(mdContext.getRoleDescriptor()));
+ final RoleDescriptor rdc;
+ if (mdContext != null) {
+ rdc = mdContext.getRoleDescriptor();
+ } else {
+ rdc = null;
+ }
+ if (rdc != null) {
+ criteria.add(new RoleDescriptorCriterion(rdc));
} else {
log.debug("{} No metadata available for endpoint resolution", getLogPrefix());
}
@@ -449,7 +462,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
bindingCtx.setRelayState(SAMLBindingSupport.getRelayState(profileRequestContext.getInboundMessageContext()));
final Optional<BindingDescriptor> bindingDescriptor =
- bindingDescriptors.stream().filter(b -> b.getId().equals(bindingURI)).findFirst();
+ bds.stream().filter(b -> b.getId().equals(bindingURI)).findFirst();
if (bindingDescriptor.isPresent()) {
bindingCtx.setBindingDescriptor(bindingDescriptor.orElseThrow());
@@ -459,20 +472,21 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
// Handle artifact details.
if (bindingDescriptor.isPresent() && bindingDescriptor.get().isArtifact()) {
- if (artifactConfiguration != null) {
+ final SAMLArtifactConfiguration artifactCfg = artifactConfiguration;
+ if (artifactCfg != null) {
final SAMLArtifactContext artifactCtx = artifactContextLookupStrategy.apply(profileRequestContext);
- artifactCtx.setArtifactType(artifactConfiguration.getArtifactType());
+ artifactCtx.setArtifactType(artifactCfg.getArtifactType());
artifactCtx.setSourceArtifactResolutionServiceEndpointURL(
- artifactConfiguration.getArtifactResolutionServiceURL());
+ artifactCfg.getArtifactResolutionServiceURL());
artifactCtx.setSourceArtifactResolutionServiceEndpointIndex(
- artifactConfiguration.getArtifactResolutionServiceIndex());
+ artifactCfg.getArtifactResolutionServiceIndex());
}
if (artifactImpliesSecureChannel) {
log.debug("{} Use of artifact binding implies the channel will be secure, "
+ "overriding MessageChannelSecurityContext flags", getLogPrefix());
final MessageChannelSecurityContext channelCtx =
- profileRequestContext.getSubcontext(MessageChannelSecurityContext.class, true);
+ profileRequestContext.getOrCreateSubcontext(MessageChannelSecurityContext.class);
channelCtx.setIntegrityActive(true);
channelCtx.setConfidentialityActive(true);
}
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
index 7217485b7..d1297d7c0 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/DetectIdentitySwitch.java
@@ -35,10 +35,12 @@ import net.shibboleth.idp.authn.AuthenticationResult;
import net.shibboleth.idp.authn.AuthnEventIds;
import net.shibboleth.idp.authn.context.AuthenticationContext;
import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
+import net.shibboleth.idp.session.IdPSession;
import net.shibboleth.idp.session.SessionException;
import net.shibboleth.idp.session.SessionManager;
import net.shibboleth.idp.session.context.SessionContext;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
@@ -139,8 +141,8 @@ public class DetectIdentitySwitch extends AbstractAuthenticationAction {
return false;
}
- sessionCtx = sessionContextLookupStrategy.apply(profileRequestContext);
- if (sessionCtx == null || sessionCtx.getIdPSession() == null) {
+ final SessionContext ctx = sessionCtx = sessionContextLookupStrategy.apply(profileRequestContext);
+ if (ctx == null || ctx.getIdPSession() == null) {
log.debug("{} No previous session found, nothing to do", getLogPrefix());
return false;
}
@@ -160,25 +162,30 @@ public class DetectIdentitySwitch extends AbstractAuthenticationAction {
protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext,
@Nonnull final AuthenticationContext authenticationContext) {
- if (sessionCtx.getIdPSession().getPrincipalName().equals(newPrincipalName)) {
+ // Nullability checked in pre;
+ final SessionContext ctx = sessionCtx;
+ assert ctx != null;
+ final IdPSession idpSession = ctx.getIdPSession();
+ assert idpSession != null;
+ if (idpSession.getPrincipalName().equals(newPrincipalName)) {
log.debug("{} Identities from session and new authentication result match, nothing to do", getLogPrefix());
return;
}
log.info("{} Identity switch to {} detected, destroying original session {} for principal {}",
- getLogPrefix(), newPrincipalName, sessionCtx.getIdPSession().getId(),
- sessionCtx.getIdPSession().getPrincipalName());
+ getLogPrefix(), newPrincipalName, idpSession.getId(),
+ idpSession.getPrincipalName());
try {
- sessionManager.destroySession(sessionCtx.getIdPSession().getId(), true);
+ sessionManager.destroySession(idpSession.getId(), true);
} catch (final SessionException e) {
- log.error("{} Error destroying session {}", getLogPrefix(), sessionCtx.getIdPSession().getId(), e);
+ log.error("{} Error destroying session {}", getLogPrefix(), idpSession.getId(), e);
ActionSupport.buildEvent(profileRequestContext, EventIds.IO_ERROR);
}
// Establish context state as if the original session didn't exist.
- sessionCtx.setIdPSession(null);
- authenticationContext.setActiveResults(Collections.<AuthenticationResult>emptyList());
+ ctx.setIdPSession(null);
+ authenticationContext.setActiveResults(CollectionSupport.<AuthenticationResult>emptyList());
ActionSupport.buildEvent(profileRequestContext, AuthnEventIds.IDENTITY_SWITCH);
}
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
index 196af9937..b3ac25ee5 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/StorageBackedSessionManager.java
@@ -55,6 +55,7 @@ import net.shibboleth.idp.session.criterion.SessionIdCriterion;
import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
import net.shibboleth.shared.component.ComponentInitializationException;
import net.shibboleth.shared.logic.Constraint;
@@ -120,7 +121,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
@Nonnull private final Logger log = LoggerFactory.getLogger(StorageBackedSessionManager.class);
/** Servlet request to read from. */
- @Nullable private NonnullSupplier<HttpServletRequest> httpRequestSupplier;
+ @NonnullAfterInit private NonnullSupplier<HttpServletRequest> httpRequestSupplier;
/** Inactivity timeout for sessions. */
@Nonnull private Duration sessionTimeout;
@@ -354,6 +355,8 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
* @return the back-end to use
*/
@Nonnull public StorageService getStorageService() {
+ checkComponentActive();
+ assert storageService != null;
return storageService;
}
@@ -426,6 +429,14 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
getAuthenticationFlowDescriptor(@Nonnull @NotEmpty final String flowId) {
return flowDescriptorMap.get(flowId);
}
+
+ @Nullable final private HttpServletRequest getHttpRequest() {
+ final NonnullSupplier<HttpServletRequest> supplier = httpRequestSupplier;
+ if (supplier == null) {
+ return null;
+ }
+ return supplier.get();
+ }
/**
* Set the {@link AuthenticationFlowDescriptor} collection active in the system.
@@ -478,7 +489,6 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
} else if (trackSPSessions && spSessionSerializerRegistry == null) {
throw new ComponentInitializationException("Tracking SPSessions requires a spSessionSerializerRegistry");
}
-
// This is our private instance, so we initialize it.
serializer.initialize();
}
@@ -488,7 +498,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
throws SessionException {
checkComponentActive();
- final HttpServletRequest httpRequest = httpRequestSupplier == null?null:httpRequestSupplier.get();
+ final HttpServletRequest httpRequest = getHttpRequest();
if (httpRequest == null) {
throw new SessionException("No HttpServletRequest available, can't bind to client address");
}
@@ -557,7 +567,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (criteria != null) {
final HttpServletRequestCriterion requestCriterion = criteria.get(HttpServletRequestCriterion.class);
if (requestCriterion != null) {
- final HttpServletRequest httpRequest = httpRequestSupplier == null?null:httpRequestSupplier.get();
+ final HttpServletRequest httpRequest = getHttpRequest();
if (httpRequest != null) {
final Cookie[] cookies = httpRequest.getCookies();
if (cookies != null) {
@@ -565,12 +575,12 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (cookieName.equals(cookie.getName())) {
final IdPSession session = lookupBySessionId(cookie.getValue());
if (session != null) {
- return Collections.singletonList(session);
+ return CollectionSupport.singletonList(session);
}
}
}
}
- return ImmutableList.of();
+ return CollectionSupport.emptyList();
}
throw new ResolverException("HttpServletRequest is null");
}
@@ -579,9 +589,9 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (sessionIdCriterion != null) {
final IdPSession session = lookupBySessionId(sessionIdCriterion.getSessionId());
if (session != null) {
- return Collections.singletonList(session);
+ return CollectionSupport.singletonList(session);
}
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
final SPSessionCriterion serviceCriterion = criteria.get(SPSessionCriterion.class);
@@ -627,6 +637,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
}
} else if (secondaryServiceIndex && storageServiceMeetsThreshold()) {
String serviceId = spSession.getId();
+ assert serviceId != null;
String serviceKey = spSession.getSPSessionKey();
if (serviceKey == null) {
return;
@@ -643,7 +654,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (serviceKey.length() > keySize) {
serviceKey = serviceKey.substring(0, keySize);
}
-
+ assert serviceId != null && serviceKey != null;
StorageRecord<?> sessionList = null;
try {
@@ -661,7 +672,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
// Need to update record.
final String updated = sessionList.getValue() + idpSession.getId() + ',';
if (storageService.updateWithVersion(sessionList.getVersion(), serviceId, serviceKey, updated,
- Math.max(sessionList.getExpiration(),
+ Math.max(Constraint.isNotNull(sessionList.getExpiration(),"Session List Expiration not set"),
spSession.getExpirationInstant().plus(sessionSlop).toEpochMilli())) == null) {
log.debug("Secondary index record disappeared, retrying as insert");
indexBySPSession(idpSession, spSession, attempts - 1);
@@ -706,6 +717,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
}
} else if (secondaryServiceIndex && storageServiceMeetsThreshold()) {
String serviceId = spSession.getId();
+ assert serviceId != null;
String serviceKey = spSession.getSPSessionKey();
if (serviceKey == null) {
return;
@@ -722,6 +734,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (serviceKey.length() > keySize) {
serviceKey = serviceKey.substring(0, keySize);
}
+ assert serviceId != null && serviceKey != null;
StorageRecord<?> sessionList = null;
@@ -781,6 +794,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
log.debug("Lookup of null/empty session ID");
return null;
}
+ assert sessionId != null;
log.debug("Performing primary lookup on session ID {}", sessionId);
@@ -822,9 +836,11 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
// Truncate context and key if needed.
if (serviceId.length() > contextSize) {
serviceId = serviceId.substring(0, contextSize);
+ assert serviceId != null;
}
if (serviceKey.length() > keySize) {
serviceKey = serviceKey.substring(0, keySize);
+ assert serviceKey != null;
}
StorageRecord<?> sessionList = null;
@@ -840,7 +856,7 @@ public class StorageBackedSessionManager extends AbstractIdentifiableInitializab
if (sessionList == null) {
log.debug("Secondary lookup failed on service ID {} and key {}", serviceId, serviceKey);
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
final ImmutableList.Builder<IdPSession> builder = ImmutableList.builder();
diff --git a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
index 783264041..aa104aacd 100644
--- a/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
+++ b/idp-spring/src/main/java/net/shibboleth/idp/profile/spring/factory/FlowDefinitionResourceFactory.java
@@ -20,7 +20,6 @@ package net.shibboleth.idp.profile.spring.factory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -38,6 +37,7 @@ import org.springframework.webflow.config.FlowDefinitionResource;
import org.springframework.webflow.core.collection.AttributeMap;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
/**
@@ -148,7 +148,7 @@ public class FlowDefinitionResourceFactory {
}
if (resources.length == 0) {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
final Collection<FlowDefinitionResource> flowResources = new ArrayList<>(resources.length);
@@ -265,15 +265,18 @@ public class FlowDefinitionResourceFactory {
* @return the input with the scheme removed.
*/
@Nonnull private String removeScheme(@Nonnull @NotEmpty final String path) {
+ final String result;
if (path.startsWith(CLASSPATH_SCHEME)) {
- return path.substring(CLASSPATH_SCHEME.length());
+ result = path.substring(CLASSPATH_SCHEME.length());
} else if (path.startsWith(FILESYSTEM_SCHEME)) {
- return path.substring(FILESYSTEM_SCHEME.length());
+ result = path.substring(FILESYSTEM_SCHEME.length());
} else if (path.startsWith(CLASSPATH_STAR_SCHEME)) {
- return path.substring(CLASSPATH_STAR_SCHEME.length());
+ result = path.substring(CLASSPATH_STAR_SCHEME.length());
} else {
- return path;
+ result = path;
}
+ assert result != null;
+ return result;
}
}
\ No newline at end of file
diff --git a/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java b/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
index 552d4b1fa..9d0b707a6 100644
--- a/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
+++ b/idp-ui/src/main/java/net/shibboleth/idp/ui/context/RelyingPartyUIContext.java
@@ -54,6 +54,7 @@ import net.shibboleth.shared.annotation.constraint.NonnullElements;
import net.shibboleth.shared.annotation.constraint.NotEmpty;
import net.shibboleth.shared.annotation.constraint.NotLive;
import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.collection.CollectionSupport;
import net.shibboleth.shared.logic.Constraint;
import net.shibboleth.shared.primitive.DeprecationSupport;
import net.shibboleth.shared.primitive.DeprecationSupport.ObjectType;
@@ -82,7 +83,7 @@ public final class RelyingPartyUIContext extends BaseContext {
@Nullable private IdPUIInfo rpUIInfo;
/** The (statically defined) languages that this user wants to know about. */
- @Nullable @NonnullElements private List<LanguageRange> browserLanguages;
+ @Nonnull @NonnullElements private List<LanguageRange> browserLanguages;
/** The languages that this the Operator want to fall back to. */
@Nonnull private List<LanguageRange> fallbackLanguages;
@@ -93,8 +94,8 @@ public final class RelyingPartyUIContext extends BaseContext {
/** Constructor. */
public RelyingPartyUIContext() {
- browserLanguages = Collections.emptyList();
- fallbackLanguages = Collections.emptyList();
+ browserLanguages = CollectionSupport.emptyList();
+ fallbackLanguages = CollectionSupport.emptyList();
}
/**
@@ -154,7 +155,7 @@ public final class RelyingPartyUIContext extends BaseContext {
XMLObject object = getRPEntityDescriptor();
if (object == null) {
- return Collections.emptyList();
+ return CollectionSupport.emptyList();
}
final List<String> accumulator = new ArrayList<>();
@@ -165,7 +166,7 @@ public final class RelyingPartyUIContext extends BaseContext {
object = object.getParent();
}
- return List.copyOf(accumulator);
+ return CollectionSupport.copyToList(accumulator);
}
/**
@@ -254,7 +255,8 @@ public final class RelyingPartyUIContext extends BaseContext {
stream().
filter(e -> e != null).
map(s -> new LanguageRange(s)).
- collect(Collectors.toUnmodifiableList());
+ collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
return this;
}
@@ -279,10 +281,13 @@ public final class RelyingPartyUIContext extends BaseContext {
* @return the languages.
*/
@Nonnull @NonnullElements protected List<LanguageRange> getBrowserLanguages() {
- if (requestSupplier == null || requestSupplier.get() == null) {
+ final NonnullSupplier<HttpServletRequest> supplier = requestSupplier;
+ if (supplier == null || supplier.get() == null) {
return browserLanguages;
+ } else {
+ // TODO handle null value
}
- return SpringSupport.getLanguageRange(requestSupplier.get());
+ return SpringSupport.getLanguageRange(supplier.get());
}
/**
@@ -294,13 +299,15 @@ public final class RelyingPartyUIContext extends BaseContext {
*/
@Nonnull public RelyingPartyUIContext setFallbackLanguages(@Nullable final List<String> languages) {
if (languages == null || languages.isEmpty()) {
- fallbackLanguages = Collections.emptyList();
+ fallbackLanguages = CollectionSupport.emptyList();
+ } else {
+ fallbackLanguages = languages.
+ stream().
+ filter(s -> s != null).
+ map(s -> new LanguageRange(s)).
+ collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableList())).
+ get();
}
- fallbackLanguages = languages.
- stream().
- filter(s -> s != null).
- map(s -> new LanguageRange(s)).
- collect(Collectors.toUnmodifiableList());
return this;
}
@@ -353,7 +360,7 @@ public final class RelyingPartyUIContext extends BaseContext {
* @return the input or the default as appropriate
*/
@Nullable protected String policeURLLogo(@Nullable final String url) {
- return policeURL(url, Arrays.asList("http", "https", "data"));
+ return policeURL(url, CollectionSupport.listOf("http", "https", "data"));
}
/**
@@ -363,7 +370,7 @@ public final class RelyingPartyUIContext extends BaseContext {
* @return the input or the default as appropriate
*/
@Nullable protected String policeURLNonLogo(@Nullable final String url) {
- return policeURL(url, Arrays.asList("http", "https", "mailto"));
+ return policeURL(url, CollectionSupport.listOf("http", "https", "mailto"));
}
/**
@@ -401,11 +408,12 @@ public final class RelyingPartyUIContext extends BaseContext {
*/
@Nullable protected String getNameFromEntityId() {
- if (null == getRPEntityDescriptor()) {
+ final EntityDescriptor entityDescriptor = getRPEntityDescriptor();
+ if (null == entityDescriptor) {
log.trace("No relying party, no Name");
return null;
}
- final String spName = getRPEntityDescriptor().getEntityID();
+ final String spName = entityDescriptor.getEntityID();
try {
final URI entityId = new URI(spName);
@@ -437,7 +445,7 @@ public final class RelyingPartyUIContext extends BaseContext {
return null;
}
- final Map<Locale, String> descriptions = getRPUInfo().getDescriptions();
+ final Map<Locale, String> descriptions = info.getDescriptions();
Locale l = Locale.lookup(getBrowserLanguages(), descriptions.keySet());
if (l == null) {
@@ -488,11 +496,13 @@ public final class RelyingPartyUIContext extends BaseContext {
@Nullable protected OrganizationUIInfo getOrganization() {
Organization organization = null;
- if (null != getRPSPSSODescriptor()) {
- organization = getRPSPSSODescriptor().getOrganization();
+ final SPSSODescriptor descriptor = getRPSPSSODescriptor();
+ if (null != descriptor) {
+ organization = descriptor.getOrganization();
}
- if (organization == null && getRPEntityDescriptor() != null) {
- organization = getRPEntityDescriptor().getOrganization();
+ final EntityDescriptor entityDescriptor = getRPEntityDescriptor();
+ if (organization == null && entityDescriptor != null) {
+ organization = entityDescriptor.getOrganization();
}
if (organization == null) {
return null;
@@ -517,15 +527,15 @@ public final class RelyingPartyUIContext extends BaseContext {
log.warn("no parameter provided to contactType");
return ContactPersonTypeEnumeration.SUPPORT;
}
- if (type.equals(ContactPersonTypeEnumeration.ADMINISTRATIVE.toString())) {
+ if (value.equals(ContactPersonTypeEnumeration.ADMINISTRATIVE.toString())) {
return ContactPersonTypeEnumeration.ADMINISTRATIVE;
- } else if (type.equals(ContactPersonTypeEnumeration.BILLING.toString())) {
+ } else if (value.equals(ContactPersonTypeEnumeration.BILLING.toString())) {
return ContactPersonTypeEnumeration.BILLING;
- } else if (type.equals(ContactPersonTypeEnumeration.OTHER.toString())) {
+ } else if (value.equals(ContactPersonTypeEnumeration.OTHER.toString())) {
return ContactPersonTypeEnumeration.OTHER;
- } else if (type.equals(ContactPersonTypeEnumeration.SUPPORT.toString())) {
+ } else if (value.equals(ContactPersonTypeEnumeration.SUPPORT.toString())) {
return ContactPersonTypeEnumeration.SUPPORT;
- } else if (type.equals(ContactPersonTypeEnumeration.TECHNICAL.toString())) {
+ } else if (value.equals(ContactPersonTypeEnumeration.TECHNICAL.toString())) {
return ContactPersonTypeEnumeration.TECHNICAL;
} else {
log.warn("parameter provided to contactType: " + type + " is invalid");
@@ -540,10 +550,11 @@ public final class RelyingPartyUIContext extends BaseContext {
* @return the {@link ContactPerson} or null.
*/
@Nullable public ContactPerson getContactPerson(final ContactPersonTypeEnumeration contactType) {
- if (null == getRPEntityDescriptor()) {
+ final EntityDescriptor entityDescriptor = getRPEntityDescriptor();
+ if (entityDescriptor == null) {
return null;
}
- final List<ContactPerson> contacts = getRPEntityDescriptor().getContactPersons();
+ final List<ContactPerson> contacts = entityDescriptor.getContactPersons();
if (null == contacts || contacts.isEmpty()) {
log.trace("No Contacts found at all");
return null;
@@ -589,7 +600,7 @@ public final class RelyingPartyUIContext extends BaseContext {
l = Locale.lookup(getFallbackLanguages(), names.keySet());
}
if (l != null) {
- final String result = names.get(l);
+ final String result = Constraint.isNotNull(names, "Names not found in metadata").get(l);
log.debug("Found Name '{}' for Locale '{}'", result, l);
return result;
}
@@ -630,7 +641,7 @@ public final class RelyingPartyUIContext extends BaseContext {
l = Locale.lookup(getFallbackLanguages(), names.keySet());
}
if (l != null) {
- final String result = names.get(l);
+ final String result = Constraint.isNotNull(names, "Names not found in metadata").get(l);
log.debug("Found Name '{}' for Locale '{}'", result, l);
return result;
}
@@ -758,11 +769,12 @@ public final class RelyingPartyUIContext extends BaseContext {
*/
@Nullable public String getInformationURL() {
- if (null == getRPUInfo()) {
+ final IdPUIInfo info = getRPUInfo();
+ if (info == null) {
log.debug("No UIInfo returning null");
return null;
}
- return policeURLNonLogo(getLocalizeString(getRPUInfo().getInformationURLs(), "InformationURL"));
+ return policeURLNonLogo(getLocalizeString(info.getInformationURLs(), "InformationURL"));
}
/**
@@ -771,11 +783,12 @@ public final class RelyingPartyUIContext extends BaseContext {
* @return the value or null
*/
@Nullable public String getPrivacyStatementURL() {
- if (null == getRPUInfo()) {
+ final IdPUIInfo info = getRPUInfo();
+ if (info == null) {
log.debug("No UIInfo returning null");
return null;
}
- return policeURLNonLogo(getLocalizeString(getRPUInfo().getPrivacyStatementURLs(), "PrivacyStatementURL"));
+ return policeURLNonLogo(getLocalizeString(info.getPrivacyStatementURLs(), "PrivacyStatementURL"));
}
/**
@@ -788,21 +801,17 @@ public final class RelyingPartyUIContext extends BaseContext {
* @param maxHeight max Height
* @return whether it fits
*/
- private boolean logoFits(final Logo logo, final int minWidth, final int minHeight, final int maxWidth,
+ private boolean logoFits(@Nonnull final Logo logo, final int minWidth, final int minHeight, final int maxWidth,
final int maxHeight) {
- final int height;
- if (null == logo.getHeight()) {
+ Integer height = logo.getHeight();
+ if (height == null) {
log.warn("No height available for {} assuming a fit", logo.getURI());
height = maxHeight -1;
- } else {
- height = logo.getHeight();
}
- final int width;
- if (null == logo.getWidth()) {
+ Integer width = logo.getWidth();
+ if (width == null) {
log.warn("No width available for {} assuming a fit", logo.getURI());
width = maxWidth - 1;
- } else {
- width = logo.getWidth();
}
return height <= maxHeight && height >= minHeight && width <= maxWidth && width >= minWidth;
}
@@ -820,12 +829,13 @@ public final class RelyingPartyUIContext extends BaseContext {
// CheckStyle: CyclomaticComplexity OFF
@Nullable public String getLogo(final int minWidth, final int minHeight, final int maxWidth, final int maxHeight) {
- if (null == getRPUInfo()) {
+ final IdPUIInfo info = getRPUInfo();
+ if (info == null) {
log.debug("No UIInfo or logos returning null");
return null;
}
- final Map<Locale, List<Logo>> logos = getRPUInfo().getLocaleLogos();
+ final Map<Locale, List<Logo>> logos = info.getLocaleLogos();
if (logos != null && !logos.isEmpty()) {
for (final Locale l: Locale.filter(getBrowserLanguages(), logos.keySet())) {
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list