[java-opensaml COMMIT] /trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynam...
noreply at shibboleth.net
noreply at shibboleth.net
Tue Oct 11 18:43:23 EDT 2016
Author: putmanb
Date: Tue Oct 11 18:43:23 2016
New Revision: 4529
URL: http://svn.shibboleth.net/view/java-opensaml?rev=4529&view=rev
Log:
OSJ-168: On-disk caching of dynamically acquired metadata
Added fix for subtle issue that: If the metadata filter mutates the XMLObject,
then that will cause DOM drop and issues with persistence to cache if the
XMLObject can't be rountripped, e.g. signatures. So in that case filter on
a clone of the root object input. This would also be relevant even when we
have the planned origin byte[] object metadata, since that will be dropped
along with the DOM.
Modified:
trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java
Modified: trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java
URL: http://svn.shibboleth.net/view/java-opensaml/trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java?rev=4529&r1=4528&r2=4529&view=diff
==============================================================================
--- trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java (original)
+++ trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/metadata/resolver/impl/AbstractDynamicMetadataResolver.java Tue Oct 11 18:43:23 2016
@@ -33,6 +33,28 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.joda.time.DateTime;
+import org.joda.time.chrono.ISOChronology;
+import org.opensaml.core.criterion.EntityIdCriterion;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.core.xml.util.XMLObjectSupport.CloneOutputOption;
+import org.opensaml.saml.metadata.resolver.DynamicMetadataResolver;
+import org.opensaml.saml.metadata.resolver.filter.FilterException;
+import org.opensaml.saml.saml2.common.SAML2Support;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.opensaml.security.crypto.JCAConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Strings;
+
import net.shibboleth.utilities.java.support.annotation.Duration;
import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
@@ -47,24 +69,6 @@
import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
import net.shibboleth.utilities.java.support.resolver.ResolverException;
-import org.joda.time.DateTime;
-import org.joda.time.chrono.ISOChronology;
-import org.opensaml.core.criterion.EntityIdCriterion;
-import org.opensaml.core.xml.XMLObject;
-import org.opensaml.core.xml.persist.XMLObjectLoadSaveManager;
-import org.opensaml.saml.metadata.resolver.DynamicMetadataResolver;
-import org.opensaml.saml.metadata.resolver.filter.FilterException;
-import org.opensaml.saml.saml2.common.SAML2Support;
-import org.opensaml.saml.saml2.metadata.EntityDescriptor;
-import org.opensaml.security.crypto.JCAConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.base.Strings;
-
/**
* Abstract subclass for metadata resolvers that resolve metadata dynamically, as needed and on demand.
*/
@@ -500,7 +504,7 @@
@Nonnull protected void processNewMetadata(@Nonnull final XMLObject root, @Nonnull final String expectedEntityID)
throws FilterException {
- final XMLObject filteredMetadata = filterMetadata(root);
+ final XMLObject filteredMetadata = filterMetadata(prepareForFiltering(root));
if (filteredMetadata == null) {
log.info("Metadata filtering process produced a null document, resulting in an empty data set");
@@ -546,6 +550,30 @@
}
//CheckStyle: ReturnCount ON
+
+ /**
+ * Prepare the object for filtering: If persistent caching is enabled, return a clone of the object
+ * in case the configured filter mutates the object.
+ *
+ * @param input the XMLObject on which to operate
+ * @return the XMLObject instance to be filtered
+ */
+ @Nonnull protected XMLObject prepareForFiltering(@Nonnull final XMLObject input) {
+ if (getMetadataFilter() != null && isPersistentCachingEnabled()) {
+ // For this case, we want to filter a clone of the input root object, since filters can mutate
+ // the XMLObject and this will cause DOM to be dropped. This will muck with the persistent cache if
[... 16 lines stripped ...]
More information about the commits
mailing list