Skip to content

Commit 5be376b

Browse files
committed
1 parent 45f7ea0 commit 5be376b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+219
-1548
lines changed

DevDefined.OAuth/Consumer/ConsumerRequest.cs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using System.Web;
77
using System.Xml.Linq;
88
using Castle.Core;
9-
using DevDefined.OAuth.Core;
9+
using DevDefined.OAuth.Framework;
1010

1111
namespace DevDefined.OAuth.Consumer
1212
{
@@ -120,40 +120,6 @@ public override string ToString()
120120
return FromStream(stream => new StreamReader(stream).ReadToEnd());
121121
}
122122

123-
private HttpWebResponse GetResponse(OAuthContext context, IToken accessToken)
124-
{
125-
// TODO: refactor this, seems clunky
126-
if (accessToken != null)
127-
{
128-
_consumerContext.SignContextWithToken(context, accessToken);
129-
}
130-
else
131-
{
132-
_consumerContext.SignContext(context);
133-
}
134-
135-
Uri uri = context.GenerateUri();
136-
137-
var request = (HttpWebRequest)WebRequest.Create(uri);
138-
request.Method = context.RequestMethod;
139-
140-
if ((context.FormEncodedParameters != null) && (context.FormEncodedParameters.Count > 0))
141-
{
142-
request.ContentType = "application/x-www-form-urlencoded";
143-
using (var writer = new StreamWriter(request.GetRequestStream()))
144-
{
145-
writer.Write(UriUtility.FormatQueryString(context.FormEncodedParameters));
146-
}
147-
}
148-
149-
if (_consumerContext.UseHeaderForOAuthParameters)
150-
{
151-
request.Headers[Parameters.OAuth_Authorization_Header] = context.GenerateOAuthParametersForHeader();
152-
}
153-
154-
return (HttpWebResponse)request.GetResponse();
155-
}
156-
157123
public XDocument ToDocument()
158124
{
159125
return FromStream(stream => XDocument.Load(new StreamReader(stream)));
@@ -170,10 +136,8 @@ public byte[] ToBytes()
170136
}
171137

172138
private T FromStream<T>(Func<Stream, T> streamParser)
173-
{
174-
HttpWebResponse response = GetResponse(_context, _token);
175-
176-
using (Stream stream = response.GetResponseStream())
139+
{
140+
using (Stream stream = ToWebResponse().GetResponseStream())
177141
{
178142
return streamParser(stream);
179143
}
@@ -196,17 +160,46 @@ private void ApplyParameters(NameValueCollection destination, IDictionary additi
196160

197161
public HttpWebRequest ToWebRequest()
198162
{
199-
var request = (HttpWebRequest) WebRequest.Create(_context.GenerateUri());
163+
if (string.IsNullOrEmpty(_context.Signature))
164+
{
165+
if (_token != null)
166+
{
167+
_consumerContext.SignContextWithToken(_context, _token);
168+
}
169+
else
170+
{
171+
_consumerContext.SignContext(_context);
172+
}
173+
}
174+
175+
Uri uri = _context.GenerateUri();
200176

177+
var request = (HttpWebRequest) WebRequest.Create(uri);
201178
request.Method = _context.RequestMethod;
202179

203-
if (_context.Headers != null) request.Headers.Add(_context.Headers);
180+
if ((_context.FormEncodedParameters != null) && (_context.FormEncodedParameters.Count > 0))
181+
{
182+
request.ContentType = "application/x-www-form-urlencoded";
183+
using (var writer = new StreamWriter(request.GetRequestStream()))
184+
{
185+
writer.Write(UriUtility.FormatQueryString(_context.FormEncodedParameters));
186+
}
187+
}
204188

205-
// TODO: implement support for cookies
189+
if (_consumerContext.UseHeaderForOAuthParameters)
190+
{
191+
request.Headers[Parameters.OAuth_Authorization_Header] = _context.GenerateOAuthParametersForHeader();
192+
}
206193

207194
return request;
208195
}
209196

197+
public HttpWebResponse ToWebResponse()
198+
{
199+
HttpWebRequest request = ToWebRequest();
200+
return (HttpWebResponse) request.GetResponse();
201+
}
202+
210203
public NameValueCollection ToBodyParameters()
211204
{
212205
try
@@ -242,6 +235,7 @@ public T Select<T>(Func<NameValueCollection, T> selectFunc)
242235

243236
public ConsumerRequest SignWithoutToken()
244237
{
238+
EnsureRequestHasNotBeenSignedYet();
245239
_consumerContext.SignContext(_context);
246240
return this;
247241
}
@@ -253,10 +247,19 @@ public ConsumerRequest SignWithToken()
253247

254248
public ConsumerRequest SignWithToken(IToken token)
255249
{
250+
EnsureRequestHasNotBeenSignedYet();
256251
_consumerContext.SignContextWithToken(_context, token);
257252
return this;
258253
}
259254

255+
private void EnsureRequestHasNotBeenSignedYet()
256+
{
257+
if (!string.IsNullOrEmpty(_context.Signature))
258+
{
259+
throw Error.ThisConsumerRequestHasAlreadyBeenSigned();
260+
}
261+
}
262+
260263
public static implicit operator OAuthContext(ConsumerRequest request)
261264
{
262265
return request._context;

DevDefined.OAuth/Consumer/IOAuthConsumerContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using System.Security.Cryptography;
2-
using DevDefined.OAuth.Core;
2+
using DevDefined.OAuth.Framework;
33

44
namespace DevDefined.OAuth.Consumer
55
{
Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,3 @@
1-
using System;
2-
using System.Collections;
3-
using DevDefined.OAuth.Core;
4-
51
namespace DevDefined.OAuth.Consumer
62
{
7-
public interface IOAuthSession
8-
{
9-
IOAuthConsumerContext ConsumerContext { get; set; }
10-
Uri RequestTokenUri { get; set; }
11-
Uri AccessTokenUri { get; set; }
12-
Uri UserAuthorizeUri { get; set; }
13-
IToken AccessToken { get; set; }
14-
ConsumerRequest Request();
15-
IToken GetRequestToken();
16-
IToken ExchangeRequestTokenForAccessToken(IToken requestToken);
17-
ConsumerRequest BuildRequestTokenContext();
18-
ConsumerRequest BuildExchangeRequestTokenForAccessTokenContext(IToken requestToken);
19-
string GetUserAuthorizationUrlForToken(IToken token, string callbackUrl);
20-
OAuthSession WithFormParameters(IDictionary dictionary);
21-
OAuthSession WithFormParameters(object anonymousClass);
22-
OAuthSession WithQueryParameters(IDictionary dictionary);
23-
OAuthSession WithQueryParameters(object anonymousClass);
24-
OAuthSession WithCookies(IDictionary dictionary);
25-
OAuthSession WithCookies(object anonymousClass);
26-
OAuthSession WithHeaders(IDictionary dictionary);
27-
OAuthSession WithHeaders(object anonymousClass);
28-
}
293
}

DevDefined.OAuth/Consumer/OAuthConsumerContext.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
using System;
22
using System.Security.Cryptography;
3-
using DevDefined.OAuth.Core;
3+
using DevDefined.OAuth.Framework;
4+
using DevDefined.OAuth.Framework.Signing;
45

56
namespace DevDefined.OAuth.Consumer
67
{
78
public class OAuthConsumerContext : IOAuthConsumerContext
89
{
910
private INonceGenerator _nonceGenerator = new GuidNonceGenerator();
10-
11-
public string Realm { get; set; }
12-
public string ConsumerKey { get; set; }
13-
public string ConsumerSecret { get; set; }
14-
public string SignatureMethod { get; set; }
15-
public AsymmetricAlgorithm Key { get; set; }
16-
public bool UseHeaderForOAuthParameters { get; set; }
17-
11+
1812
public OAuthConsumerContext()
1913
{
20-
SignatureMethod = Core.SignatureMethod.PlainText;
14+
SignatureMethod = Framework.SignatureMethod.PlainText;
2115
}
2216

2317
public INonceGenerator NonceGenerator
@@ -26,14 +20,23 @@ public INonceGenerator NonceGenerator
2620
set { _nonceGenerator = value; }
2721
}
2822

23+
#region IOAuthConsumerContext Members
24+
25+
public string Realm { get; set; }
26+
public string ConsumerKey { get; set; }
27+
public string ConsumerSecret { get; set; }
28+
public string SignatureMethod { get; set; }
29+
public AsymmetricAlgorithm Key { get; set; }
30+
public bool UseHeaderForOAuthParameters { get; set; }
31+
2932
public void SignContext(OAuthContext context)
3033
{
3134
EnsureStateIsValid();
3235

3336
var signer = new OAuthContextSigner();
3437

3538
context.UseAuthorizationHeader = UseHeaderForOAuthParameters;
36-
context.Nonce = _nonceGenerator.GenerateNonce(context);
39+
context.Nonce = _nonceGenerator.GenerateNonce(context);
3740
context.ConsumerKey = ConsumerKey;
3841
context.Realm = Realm;
3942
context.SignatureMethod = SignatureMethod;
@@ -45,7 +48,8 @@ public void SignContext(OAuthContext context)
4548
string signatureBase = context.GenerateSignatureBase();
4649

4750
signer.SignContext(context,
48-
new SigningContext { Algorithm = Key, SignatureBase = signatureBase, ConsumerSecret = ConsumerSecret });
51+
new SigningContext
52+
{Algorithm = Key, SignatureBase = signatureBase, ConsumerSecret = ConsumerSecret});
4953
}
5054

5155
public void SignContextWithToken(OAuthContext context, IToken token)
@@ -56,11 +60,13 @@ public void SignContextWithToken(OAuthContext context, IToken token)
5660
SignContext(context);
5761
}
5862

63+
#endregion
64+
5965
private void EnsureStateIsValid()
6066
{
6167
if (string.IsNullOrEmpty(ConsumerKey)) throw Error.EmptyConsumerKey();
6268
if (string.IsNullOrEmpty(SignatureMethod)) throw Error.UnknownSignatureMethod(SignatureMethod);
63-
if ((SignatureMethod == Core.SignatureMethod.RsaSha1)
69+
if ((SignatureMethod == Framework.SignatureMethod.RsaSha1)
6470
&& (Key == null)) throw Error.ForRsaSha1SignatureMethodYouMustSupplyAssymetricKeyParameter();
6571
}
6672
}

0 commit comments

Comments
 (0)