Shifted some of the maximum message age references.
[dotnetoauth.git] / src / DotNetOpenAuth / OpenId / RelyingParty / StandardRelyingPartyApplicationStore.cs
blob542b5e1933a788a07b5d7cfc29cec2b23b459684
1 //-----------------------------------------------------------------------
2 // <copyright file="StandardRelyingPartyApplicationStore.cs" company="Andrew Arnott">
3 // Copyright (c) Andrew Arnott. All rights reserved.
4 // </copyright>
5 //-----------------------------------------------------------------------
7 namespace DotNetOpenAuth.OpenId.RelyingParty {
8 using System;
9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 using DotNetOpenAuth.Messaging.Bindings;
13 using DotNetOpenAuth.OpenId.ChannelElements;
15 /// <summary>
16 /// An in-memory store for Relying Parties, suitable for single server, single process
17 /// ASP.NET web sites.
18 /// </summary>
19 internal class StandardRelyingPartyApplicationStore : IRelyingPartyApplicationStore {
20 /// <summary>
21 /// The nonce store to use.
22 /// </summary>
23 private readonly INonceStore nonceStore;
25 /// <summary>
26 /// The association store to use.
27 /// </summary>
28 private readonly IAssociationStore<Uri> associationStore;
30 /// <summary>
31 /// The private secret store to use.
32 /// </summary>
33 private readonly IPrivateSecretStore privateSecretStore;
35 /// <summary>
36 /// Initializes a new instance of the <see cref="StandardRelyingPartyApplicationStore"/> class.
37 /// </summary>
38 internal StandardRelyingPartyApplicationStore() {
39 this.nonceStore = new NonceMemoryStore(Configuration.MaximumUserAgentAuthenticationTime);
40 this.associationStore = new AssociationMemoryStore<Uri>();
41 this.privateSecretStore = new PrivateSecretMemoryStore();
44 #region IPrivateSecretStore Members
46 /// <summary>
47 /// Gets or sets a secret key that can be used for signing.
48 /// </summary>
49 /// <value>A 64-byte binary value, which may contain null bytes.</value>
50 public byte[] PrivateSecret {
51 get { return this.privateSecretStore.PrivateSecret; }
52 set { this.privateSecretStore.PrivateSecret = value; }
55 #endregion
57 #region IAssociationStore<Uri> Members
59 /// <summary>
60 /// Saves an <see cref="Association"/> for later recall.
61 /// </summary>
62 /// <param name="distinguishingFactor">The Uri (for relying parties) or Smart/Dumb (for providers).</param>
63 /// <param name="association">The association to store.</param>
64 public void StoreAssociation(Uri distinguishingFactor, Association association) {
65 this.associationStore.StoreAssociation(distinguishingFactor, association);
68 /// <summary>
69 /// Gets the best association (the one with the longest remaining life) for a given key.
70 /// </summary>
71 /// <param name="distinguishingFactor">The Uri (for relying parties) or Smart/Dumb (for Providers).</param>
72 /// <returns>
73 /// The requested association, or null if no unexpired <see cref="Association"/>s exist for the given key.
74 /// </returns>
75 public Association GetAssociation(Uri distinguishingFactor) {
76 return this.associationStore.GetAssociation(distinguishingFactor);
79 /// <summary>
80 /// Gets the association for a given key and handle.
81 /// </summary>
82 /// <param name="distinguishingFactor">The Uri (for relying parties) or Smart/Dumb (for Providers).</param>
83 /// <param name="handle">The handle of the specific association that must be recalled.</param>
84 /// <returns>
85 /// The requested association, or null if no unexpired <see cref="Association"/>s exist for the given key and handle.
86 /// </returns>
87 public Association GetAssociation(Uri distinguishingFactor, string handle) {
88 return this.associationStore.GetAssociation(distinguishingFactor, handle);
91 /// <summary>
92 /// Removes a specified handle that may exist in the store.
93 /// </summary>
94 /// <param name="distinguishingFactor">The Uri (for relying parties) or Smart/Dumb (for Providers).</param>
95 /// <param name="handle">The handle of the specific association that must be deleted.</param>
96 /// <returns>
97 /// True if the association existed in this store previous to this call.
98 /// </returns>
99 /// <remarks>
100 /// No exception should be thrown if the association does not exist in the store
101 /// before this call.
102 /// </remarks>
103 public bool RemoveAssociation(Uri distinguishingFactor, string handle) {
104 return this.associationStore.RemoveAssociation(distinguishingFactor, handle);
107 /// <summary>
108 /// Clears all expired associations from the store.
109 /// </summary>
110 /// <remarks>
111 /// If another algorithm is in place to periodically clear out expired associations,
112 /// this method call may be ignored.
113 /// This should be done frequently enough to avoid a memory leak, but sparingly enough
114 /// to not be a performance drain.
115 /// </remarks>
116 public void ClearExpiredAssociations() {
117 this.associationStore.ClearExpiredAssociations();
120 #endregion
122 #region INonceStore Members
124 /// <summary>
125 /// Stores a given nonce and timestamp.
126 /// </summary>
127 /// <param name="nonce">A series of random characters.</param>
128 /// <param name="timestamp">The timestamp that together with the nonce string make it unique.
129 /// The timestamp may also be used by the data store to clear out old nonces.</param>
130 /// <returns>
131 /// True if the nonce+timestamp (combination) was not previously in the database.
132 /// False if the nonce was stored previously with the same timestamp.
133 /// </returns>
134 /// <remarks>
135 /// The nonce must be stored for no less than the maximum time window a message may
136 /// be processed within before being discarded as an expired message.
137 /// If the binding element is applicable to your channel, this expiration window
138 /// is retrieved or set using the
139 /// <see cref="StandardExpirationBindingElement.MaximumMessageAge"/> property.
140 /// </remarks>
141 public bool StoreNonce(string nonce, DateTime timestamp) {
142 return this.nonceStore.StoreNonce(nonce, timestamp);
145 #endregion