diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2008-09-29 07:35:02 -0700 |
---|---|---|
committer | Andrew <andrewarnott@gmail.com> | 2008-10-02 07:33:06 -0700 |
commit | 824734c85a613e900f552c554aada6cc4588531a (patch) | |
tree | 1aa6b1c3788c4e28c24414630a6004258d64f463 /src | |
parent | c5e676d0fa6daffc8e7be411ec02efdd98f4f78b (diff) | |
download | DotNetOpenAuth-824734c85a613e900f552c554aada6cc4588531a.zip DotNetOpenAuth-824734c85a613e900f552c554aada6cc4588531a.tar.gz DotNetOpenAuth-824734c85a613e900f552c554aada6cc4588531a.tar.bz2 |
Fixed HTTP Authorization header to not include extra parameters.
Combined the AdditionalParametersInHttpRequest and ExtraData concepts
Diffstat (limited to 'src')
8 files changed, 34 insertions, 26 deletions
diff --git a/src/DotNetOAuth/ChannelElements/ITamperResistantOAuthMessage.cs b/src/DotNetOAuth/ChannelElements/ITamperResistantOAuthMessage.cs index 500f65c..961daef 100644 --- a/src/DotNetOAuth/ChannelElements/ITamperResistantOAuthMessage.cs +++ b/src/DotNetOAuth/ChannelElements/ITamperResistantOAuthMessage.cs @@ -37,11 +37,5 @@ namespace DotNetOAuth.ChannelElements { /// Gets or sets the HTTP method that will be used to transmit the message.
/// </summary>
string HttpMethod { get; set; }
-
- /// <summary>
- /// Gets or sets the extra, non-OAuth parameters that will be included in the request.
- /// Only applicable to Consumer (SPs will receive these extra parameters via the ExtraData dictionary).
- /// </summary>
- IDictionary<string, string> AdditionalParametersInHttpRequest { get; set; }
}
}
diff --git a/src/DotNetOAuth/ChannelElements/OAuthChannel.cs b/src/DotNetOAuth/ChannelElements/OAuthChannel.cs index 38e6434..03db91e 100644 --- a/src/DotNetOAuth/ChannelElements/OAuthChannel.cs +++ b/src/DotNetOAuth/ChannelElements/OAuthChannel.cs @@ -290,14 +290,21 @@ namespace DotNetOAuth.ChannelElements { /// This method implements OAuth 1.0 section 5.2, item #1 (described in section 5.4).
/// </remarks>
private HttpWebRequest InitializeRequestAsAuthHeader(IDirectedProtocolMessage requestMessage) {
- var serializer = MessageSerializer.Get(requestMessage.GetType());
- var fields = new Dictionary<string, string>(serializer.Serialize(requestMessage)); // copy so as to not modify original
var protocol = Protocol.Lookup(requestMessage.ProtocolVersion);
+ var dictionary = new MessageDictionary(requestMessage);
+
+ // copy so as to not modify original
+ var fields = new Dictionary<string, string>();
+ foreach (string key in dictionary.DeclaredKeys) {
+ fields.Add(key, dictionary[key]);
+ }
if (this.Realm != null) {
fields.Add("realm", this.Realm.AbsoluteUri);
}
- HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(requestMessage.Recipient);
+ UriBuilder builder = new UriBuilder(requestMessage.Recipient);
+ MessagingUtilities.AppendQueryArgs(builder, requestMessage.ExtraData);
+ HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(builder.Uri);
StringBuilder authorization = new StringBuilder();
authorization.Append(protocol.AuthorizationHeaderScheme);
diff --git a/src/DotNetOAuth/ChannelElements/SigningBindingElementBase.cs b/src/DotNetOAuth/ChannelElements/SigningBindingElementBase.cs index 7886f1c..7ddf7e8 100644 --- a/src/DotNetOAuth/ChannelElements/SigningBindingElementBase.cs +++ b/src/DotNetOAuth/ChannelElements/SigningBindingElementBase.cs @@ -127,9 +127,6 @@ namespace DotNetOAuth.ChannelElements { signatureBaseStringElements.Add(endpoint.Uri.AbsoluteUri);
var encodedDictionary = OAuthChannel.GetEncodedParameters(message);
- if (message.AdditionalParametersInHttpRequest != null) {
- OAuthChannel.EncodeParameters(message.AdditionalParametersInHttpRequest, encodedDictionary);
- }
encodedDictionary.Remove("oauth_signature");
var sortedKeyValueList = new List<KeyValuePair<string, string>>(encodedDictionary);
sortedKeyValueList.Sort(SignatureBaseStringParameterComparer);
diff --git a/src/DotNetOAuth/Consumer.cs b/src/DotNetOAuth/Consumer.cs index cb7cbaa..ce61e60 100644 --- a/src/DotNetOAuth/Consumer.cs +++ b/src/DotNetOAuth/Consumer.cs @@ -92,7 +92,7 @@ namespace DotNetOAuth { ConsumerKey = this.ConsumerKey,
ConsumerSecret = this.ConsumerSecret,
};
- requestToken.AddExtraFields(extraParameters);
+ requestToken.AddNonOAuthParameters(extraParameters);
var requestTokenResponse = this.Channel.Request<UnauthorizedRequestTokenMessage>(requestToken);
this.TokenManager.StoreNewRequestToken(this.ConsumerKey, requestTokenResponse.RequestToken, requestTokenResponse.TokenSecret, null/*TODO*/);
diff --git a/src/DotNetOAuth/Messages/SignedMessageBase.cs b/src/DotNetOAuth/Messages/SignedMessageBase.cs index c1c2d1c..1b52f7e 100644 --- a/src/DotNetOAuth/Messages/SignedMessageBase.cs +++ b/src/DotNetOAuth/Messages/SignedMessageBase.cs @@ -75,11 +75,6 @@ namespace DotNetOAuth.Messages { /// </summary>
string ITamperResistantOAuthMessage.HttpMethod { get; set; }
- /// <summary>
- /// Gets or sets the extra, non-OAuth parameters that will be included in the request.
- /// </summary>
- IDictionary<string, string> ITamperResistantOAuthMessage.AdditionalParametersInHttpRequest { get; set; }
-
#endregion
#region ITamperResistantProtocolMessage Members
diff --git a/src/DotNetOAuth/Messaging/IProtocolMessage.cs b/src/DotNetOAuth/Messaging/IProtocolMessage.cs index 53b77d6..dac1c11 100644 --- a/src/DotNetOAuth/Messaging/IProtocolMessage.cs +++ b/src/DotNetOAuth/Messaging/IProtocolMessage.cs @@ -30,11 +30,10 @@ namespace DotNetOAuth.Messaging { MessageTransport Transport { get; }
/// <summary>
- /// Gets the dictionary of additional name/value fields tacked on to this message.
+ /// Gets the extra, non-OAuth parameters that will be included in the request.
/// </summary>
/// <remarks>
- /// Implementations of <see cref="IProtocolMessage"/> should ensure that this property
- /// never returns null.
+ /// Implementations of this interface should ensure that this property never returns null.
/// </remarks>
IDictionary<string, string> ExtraData { get; }
diff --git a/src/DotNetOAuth/Messaging/MessagingUtilities.cs b/src/DotNetOAuth/Messaging/MessagingUtilities.cs index 24ad0c4..226e4e9 100644 --- a/src/DotNetOAuth/Messaging/MessagingUtilities.cs +++ b/src/DotNetOAuth/Messaging/MessagingUtilities.cs @@ -13,6 +13,7 @@ namespace DotNetOAuth.Messaging { using System.Net;
using System.Text;
using System.Web;
+ using DotNetOAuth.ChannelElements;
using DotNetOAuth.Messaging.Reflection;
/// <summary>
@@ -145,7 +146,7 @@ namespace DotNetOAuth.Messaging { /// </summary>
/// <param name="message">The message to copy the extra data into.</param>
/// <param name="extraParameters">The extra data to copy into the message. May be null to do nothing.</param>
- internal static void AddExtraFields(this IProtocolMessage message, IDictionary<string, string> extraParameters) {
+ internal static void AddNonOAuthParameters(this ITamperResistantOAuthMessage message, IDictionary<string, string> extraParameters) {
if (message == null) {
throw new ArgumentNullException("message");
}
diff --git a/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs b/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs index 3c233ce..5416e5f 100644 --- a/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs +++ b/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs @@ -65,6 +65,18 @@ namespace DotNetOAuth.Messaging.Reflection { public ICollection<string> Keys {
get {
List<string> keys = new List<string>(this.message.ExtraData.Count + this.description.Mapping.Count);
+ keys.AddRange(this.DeclaredKeys);
+ keys.AddRange(this.AdditionalKeys);
+ return keys.AsReadOnly();
+ }
+ }
+
+ /// <summary>
+ /// Gets the set of official OAuth keys that have non-null values associated with them.
+ /// </summary>
+ public ICollection<string> DeclaredKeys {
+ get {
+ List<string> keys = new List<string>(this.description.Mapping.Count);
foreach (var pair in this.description.Mapping) {
// Don't include keys with null values, but default values for structs is ok
if (pair.Value.GetValue(this.message) != null) {
@@ -72,15 +84,18 @@ namespace DotNetOAuth.Messaging.Reflection { }
}
- foreach (string key in this.message.ExtraData.Keys) {
- keys.Add(key);
- }
-
return keys.AsReadOnly();
}
}
/// <summary>
+ /// Gets the keys that are in the message but not declared as official OAuth properties.
+ /// </summary>
+ public ICollection<string> AdditionalKeys {
+ get { return this.message.ExtraData.Keys; }
+ }
+
+ /// <summary>
/// Gets all the values.
/// </summary>
public ICollection<string> Values {
|