[java-opensaml COMMIT] in /trunk: opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageR...
noreply at shibboleth.net
noreply at shibboleth.net
Tue Apr 30 23:17:07 EDT 2013
Author: scantor
Date: Tue Apr 30 23:17:06 2013
New Revision: 3330
URL: http://svn.shibboleth.net/view/java-opensaml?rev=3330&view=rev
Log:
Rebase ReplayCache on top of storage API and fix tests.
Modified:
trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageReplayRule.java
trunk/opensaml-saml-impl/src/test/java/org/opensaml/saml/common/binding/security/MessageReplayRuleTest.java
trunk/opensaml-util/src/main/java/org/opensaml/util/storage/ReplayCache.java
trunk/opensaml-util/src/main/java/org/opensaml/util/storage/ReplayCacheEntry.java
trunk/opensaml-util/src/test/java/org/opensaml/util/storage/ReplayCacheTest.java
Modified: trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageReplayRule.java
URL: http://svn.shibboleth.net/view/java-opensaml/trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageReplayRule.java?rev=3330&r1=3329&r2=3330&view=diff
==============================================================================
--- trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageReplayRule.java (original)
+++ trunk/opensaml-saml-impl/src/main/java/org/opensaml/saml/common/binding/security/MessageReplayRule.java Tue Apr 30 23:17:06 2013
@@ -17,8 +17,11 @@
package org.opensaml.saml.common.binding.security;
+import javax.annotation.Nonnull;
+
import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import org.joda.time.DateTime;
import org.opensaml.saml.common.binding.SAMLMessageContext;
import org.opensaml.util.storage.ReplayCache;
import org.opensaml.ws.message.MessageContext;
@@ -40,15 +43,19 @@
/** Whether this rule is required to be met. */
private boolean requiredRule;
+
+ /** Time in seconds to expire cache entries. Default value: (180) */
+ private long expires;
/**
* Constructor.
*
* @param newReplayCache the new replay cache instance
*/
- public MessageReplayRule(ReplayCache newReplayCache) {
+ public MessageReplayRule(@Nonnull ReplayCache newReplayCache) {
replayCache = newReplayCache;
requiredRule = true;
+ expires = 180;
}
/**
@@ -69,8 +76,26 @@
requiredRule = required;
}
+ /**
+ * Gets the lifetime in seconds of replay entries.
+ *
+ * @return lifetime in seconds of entries
+ */
+ public long getExpires() {
+ return expires;
+ }
+
+ /**
+ * Sets the lifetime in seconds of replay entries.
+ *
+ * @param exp lifetime in seconds of entries
+ */
+ public void setExpires(long exp) {
+ expires = exp;
+ }
+
/** {@inheritDoc} */
- public void evaluate(MessageContext messageContext) throws SecurityPolicyException {
+ public void evaluate(@Nonnull MessageContext messageContext) throws SecurityPolicyException {
if (!(messageContext instanceof SAMLMessageContext)) {
log.debug("Invalid message context type, this policy rule only supports SAMLMessageContext");
return;
@@ -78,28 +103,30 @@
SAMLMessageContext samlMsgCtx = (SAMLMessageContext) messageContext;
- String messageIsuer = StringSupport.trimOrNull(samlMsgCtx.getInboundMessageIssuer());
- if (messageIsuer == null) {
- if (requiredRule) {
- log.warn("Message contained no Issuer ID, replay check not possible");
- throw new SecurityPolicyException("Message contained no Issuer ID, replay check not possible");
- }
- return;
+ String messageIssuer = StringSupport.trimOrNull(samlMsgCtx.getInboundMessageIssuer());
+ if (messageIssuer == null) {
+ messageIssuer = "(unknown)";
}
String messageId = StringSupport.trimOrNull(samlMsgCtx.getInboundSAMLMessageId());
if (messageId == null) {
if (requiredRule) {
log.warn("Message contained no ID, replay check not possible");
- throw new SecurityPolicyException("SAML message from issuer " + messageIsuer + " did not contain an ID");
+ throw new SecurityPolicyException("SAML message from issuer " + messageIssuer
+ + " did not contain an ID");
}
return;
}
- if (replayCache.isReplay(messageIsuer, messageId)) {
- log.warn("Replay detected of message '" + messageId + "' from issuer " + messageIsuer);
+ DateTime issueInstant = samlMsgCtx.getInboundSAMLMessageIssueInstant();
+ if (issueInstant == null) {
+ issueInstant = new DateTime();
+ }
+
+ if (!replayCache.check(getClass().getName(), messageId, issueInstant.getMillis() / 1000 + expires)) {
+ log.warn("Replay detected of message '" + messageId + "' from issuer " + messageIssuer);
throw new SecurityPolicyException("Rejecting replayed message ID '" + messageId + "' from issuer "
- + messageIsuer);
[... 413 lines stripped ...]
More information about the commits
mailing list