summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2010-04-30 18:51:29 -0700
committerAndrew Arnott <andrewarnott@gmail.com>2010-04-30 18:51:29 -0700
commitcc2073706f7d1d3d331883433c0b79028c4eb204 (patch)
tree6edfaf1de2a8559746c196462c785b61369c33be /src
parentf364b60d7b8b5ea09e64b6accfb09fb27793b645 (diff)
parent91822352075ce6402ebddf78f41ec7073dfd5b6c (diff)
downloadDotNetOpenAuth-cc2073706f7d1d3d331883433c0b79028c4eb204.zip
DotNetOpenAuth-cc2073706f7d1d3d331883433c0b79028c4eb204.tar.gz
DotNetOpenAuth-cc2073706f7d1d3d331883433c0b79028c4eb204.tar.bz2
Merge branch 'v3.0' into v3.1
Diffstat (limited to 'src')
-rw-r--r--src/DotNetOpenAuth/Messaging/OutgoingWebResponse.cs4
-rw-r--r--src/DotNetOpenAuth/OpenId/AssociationMemoryStore.cs39
-rw-r--r--src/DotNetOpenAuth/OpenId/IAssociationStore.cs17
-rw-r--r--src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs13
-rw-r--r--src/DotNetOpenAuth/OpenId/RelyingParty/AssociationManager.cs24
-rw-r--r--src/DotNetOpenAuth/OpenId/RelyingParty/AuthenticationRequest.cs3
-rw-r--r--src/DotNetOpenAuth/OpenId/RelyingParty/StandardRelyingPartyApplicationStore.cs13
7 files changed, 52 insertions, 61 deletions
diff --git a/src/DotNetOpenAuth/Messaging/OutgoingWebResponse.cs b/src/DotNetOpenAuth/Messaging/OutgoingWebResponse.cs
index 147cd66..c013fae 100644
--- a/src/DotNetOpenAuth/Messaging/OutgoingWebResponse.cs
+++ b/src/DotNetOpenAuth/Messaging/OutgoingWebResponse.cs
@@ -120,7 +120,7 @@ namespace DotNetOpenAuth.Messaging {
/// Automatically sends the appropriate response to the user agent
/// and ends execution on the current page or handler.
/// </summary>
- /// <exception cref="ThreadAbortException">Thrown by ASP.NET in order to prevent additional data from the page being sent to the client and corrupting the response.</exception>
+ /// <exception cref="ThreadAbortException">Typically thrown by ASP.NET in order to prevent additional data from the page being sent to the client and corrupting the response.</exception>
/// <remarks>
/// Requires a current HttpContext.
/// </remarks>
@@ -137,7 +137,7 @@ namespace DotNetOpenAuth.Messaging {
/// </summary>
/// <param name="context">The context of the HTTP request whose response should be set.
/// Typically this is <see cref="HttpContext.Current"/>.</param>
- /// <exception cref="ThreadAbortException">Thrown by ASP.NET in order to prevent additional data from the page being sent to the client and corrupting the response.</exception>
+ /// <exception cref="ThreadAbortException">Typically thrown by ASP.NET in order to prevent additional data from the page being sent to the client and corrupting the response.</exception>
public virtual void Send(HttpContext context) {
Contract.Requires(context != null);
ErrorUtilities.VerifyArgumentNotNull(context, "context");
diff --git a/src/DotNetOpenAuth/OpenId/AssociationMemoryStore.cs b/src/DotNetOpenAuth/OpenId/AssociationMemoryStore.cs
index 13633b4..7a20fd5 100644
--- a/src/DotNetOpenAuth/OpenId/AssociationMemoryStore.cs
+++ b/src/DotNetOpenAuth/OpenId/AssociationMemoryStore.cs
@@ -20,12 +20,22 @@ namespace DotNetOpenAuth.OpenId {
/// </remarks>
internal class AssociationMemoryStore<TKey> : IAssociationStore<TKey> {
/// <summary>
+ /// How many association store requests should occur between each spring cleaning.
+ /// </summary>
+ private const int PeriodicCleaningFrequency = 10;
+
+ /// <summary>
/// For Relying Parties, this maps OP Endpoints to a set of associations with that endpoint.
/// For Providers, this keeps smart and dumb associations in two distinct pools.
/// </summary>
private Dictionary<TKey, Associations> serverAssocsTable = new Dictionary<TKey, Associations>();
/// <summary>
+ /// A counter to track how close we are to an expired association cleaning run.
+ /// </summary>
+ private int periodicCleaning;
+
+ /// <summary>
/// Stores a given association for later recall.
/// </summary>
/// <param name="distinguishingFactor">The distinguishing factor, either an OP Endpoint or smart/dumb mode.</param>
@@ -38,6 +48,13 @@ namespace DotNetOpenAuth.OpenId {
Associations server_assocs = this.serverAssocsTable[distinguishingFactor];
server_assocs.Set(association);
+
+ unchecked {
+ this.periodicCleaning++;
+ }
+ if (this.periodicCleaning % PeriodicCleaningFrequency == 0) {
+ this.ClearExpiredAssociations();
+ }
}
}
@@ -88,17 +105,6 @@ namespace DotNetOpenAuth.OpenId {
}
/// <summary>
- /// Clears all expired associations from the store.
- /// </summary>
- public void ClearExpiredAssociations() {
- lock (this) {
- foreach (Associations assocs in this.serverAssocsTable.Values) {
- assocs.ClearExpired();
- }
- }
- }
-
- /// <summary>
/// Gets the server associations for a given OP Endpoint or dumb/smart mode.
/// </summary>
/// <param name="distinguishingFactor">The distinguishing factor, either an OP Endpoint (for relying parties) or smart/dumb (for providers).</param>
@@ -112,5 +118,16 @@ namespace DotNetOpenAuth.OpenId {
return this.serverAssocsTable[distinguishingFactor];
}
}
+
+ /// <summary>
+ /// Clears all expired associations from the store.
+ /// </summary>
+ private void ClearExpiredAssociations() {
+ lock (this) {
+ foreach (Associations assocs in this.serverAssocsTable.Values) {
+ assocs.ClearExpired();
+ }
+ }
+ }
}
}
diff --git a/src/DotNetOpenAuth/OpenId/IAssociationStore.cs b/src/DotNetOpenAuth/OpenId/IAssociationStore.cs
index 2376b0d..a3c5305 100644
--- a/src/DotNetOpenAuth/OpenId/IAssociationStore.cs
+++ b/src/DotNetOpenAuth/OpenId/IAssociationStore.cs
@@ -33,6 +33,12 @@ namespace DotNetOpenAuth.OpenId {
/// <see cref="System.Uri"/> for consumers (to distinguish associations across servers) or
/// <see cref="AssociationRelyingPartyType"/> for providers (to distinguish dumb and smart client associations).
/// </typeparam>
+ /// <remarks>
+ /// Expired associations should be periodically cleared out of an association store.
+ /// This should be done frequently enough to avoid a memory leak, but sparingly enough
+ /// to not be a performance drain. Because this balance can vary by host, it is the
+ /// responsibility of the host to initiate this cleaning.
+ /// </remarks>
public interface IAssociationStore<TKey> {
/// <summary>
/// Saves an <see cref="Association"/> for later recall.
@@ -80,16 +86,5 @@ namespace DotNetOpenAuth.OpenId {
/// before this call.
/// </remarks>
bool RemoveAssociation(TKey distinguishingFactor, string handle);
-
- /// <summary>
- /// Clears all expired associations from the store.
- /// </summary>
- /// <remarks>
- /// If another algorithm is in place to periodically clear out expired associations,
- /// this method call may be ignored.
- /// This should be done frequently enough to avoid a memory leak, but sparingly enough
- /// to not be a performance drain.
- /// </remarks>
- void ClearExpiredAssociations();
}
}
diff --git a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
index f33a655..4fa2d64 100644
--- a/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
+++ b/src/DotNetOpenAuth/OpenId/Provider/StandardProviderApplicationStore.cs
@@ -100,19 +100,6 @@ namespace DotNetOpenAuth.OpenId.Provider {
return this.associationStore.RemoveAssociation(distinguishingFactor, handle);
}
- /// <summary>
- /// Clears all expired associations from the store.
- /// </summary>
- /// <remarks>
- /// If another algorithm is in place to periodically clear out expired associations,
- /// this method call may be ignored.
- /// This should be done frequently enough to avoid a memory leak, but sparingly enough
- /// to not be a performance drain.
- /// </remarks>
- public void ClearExpiredAssociations() {
- this.associationStore.ClearExpiredAssociations();
- }
-
#endregion
#region INonceStore Members
diff --git a/src/DotNetOpenAuth/OpenId/RelyingParty/AssociationManager.cs b/src/DotNetOpenAuth/OpenId/RelyingParty/AssociationManager.cs
index 8ed63f5..9af947a 100644
--- a/src/DotNetOpenAuth/OpenId/RelyingParty/AssociationManager.cs
+++ b/src/DotNetOpenAuth/OpenId/RelyingParty/AssociationManager.cs
@@ -148,10 +148,20 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
return null;
}
- var associateRequest = AssociateRequest.Create(this.securitySettings, provider);
+ try {
+ var associateRequest = AssociateRequest.Create(this.securitySettings, provider);
- const int RenegotiateRetries = 1;
- return this.CreateNewAssociation(provider, associateRequest, RenegotiateRetries);
+ const int RenegotiateRetries = 1;
+ return this.CreateNewAssociation(provider, associateRequest, RenegotiateRetries);
+ } catch (VerificationException ex) {
+ // See Trac ticket #163. In partial trust host environments, the
+ // Diffie-Hellman implementation we're using for HTTP OP endpoints
+ // sometimes causes the CLR to throw:
+ // "VerificationException: Operation could destabilize the runtime."
+ // Just give up and use dumb mode in this case.
+ Logger.OpenId.ErrorFormat("VerificationException occurred while trying to create an association with {0}. {1}", provider.Endpoint, ex);
+ return null;
+ }
}
/// <summary>
@@ -222,14 +232,6 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
// the exception so that auth may continue in dumb mode.
Logger.OpenId.ErrorFormat("An error occurred while trying to create an association with {0}. {1}", provider.Endpoint, ex);
return null;
- } catch (VerificationException ex) {
- // See Trac ticket #163. In partial trust host environments, the
- // Diffie-Hellman implementation we're using for HTTP OP endpoints
- // sometimes causes the CLR to throw:
- // "VerificationException: Operation could destabilize the runtime."
- // Just give up and use dumb mode in this case.
- Logger.OpenId.ErrorFormat("VerificationException occurred while trying to create an association with {0}. {1}", provider.Endpoint, ex);
- return null;
}
}
}
diff --git a/src/DotNetOpenAuth/OpenId/RelyingParty/AuthenticationRequest.cs b/src/DotNetOpenAuth/OpenId/RelyingParty/AuthenticationRequest.cs
index 753425a..a0ef0e6 100644
--- a/src/DotNetOpenAuth/OpenId/RelyingParty/AuthenticationRequest.cs
+++ b/src/DotNetOpenAuth/OpenId/RelyingParty/AuthenticationRequest.cs
@@ -4,6 +4,8 @@
// </copyright>
//-----------------------------------------------------------------------
+using System.Threading;
+
namespace DotNetOpenAuth.OpenId.RelyingParty {
using System;
using System.Collections.Generic;
@@ -217,6 +219,7 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
/// <remarks>
/// This method requires an ASP.NET HttpContext.
/// </remarks>
+ /// <exception cref="ThreadAbortException">Typically thrown by ASP.NET in order to prevent additional data from the page being sent to the client and corrupting the response.</exception>
public void RedirectToProvider() {
this.RedirectingResponse.Send();
}
diff --git a/src/DotNetOpenAuth/OpenId/RelyingParty/StandardRelyingPartyApplicationStore.cs b/src/DotNetOpenAuth/OpenId/RelyingParty/StandardRelyingPartyApplicationStore.cs
index 96dd8d8..9e1aa89 100644
--- a/src/DotNetOpenAuth/OpenId/RelyingParty/StandardRelyingPartyApplicationStore.cs
+++ b/src/DotNetOpenAuth/OpenId/RelyingParty/StandardRelyingPartyApplicationStore.cs
@@ -84,19 +84,6 @@ namespace DotNetOpenAuth.OpenId.RelyingParty {
return this.associationStore.RemoveAssociation(distinguishingFactor, handle);
}
- /// <summary>
- /// Clears all expired associations from the store.
- /// </summary>
- /// <remarks>
- /// If another algorithm is in place to periodically clear out expired associations,
- /// this method call may be ignored.
- /// This should be done frequently enough to avoid a memory leak, but sparingly enough
- /// to not be a performance drain.
- /// </remarks>
- public void ClearExpiredAssociations() {
- this.associationStore.ClearExpiredAssociations();
- }
-
#endregion
#region INonceStore Members