Skip to content

Commit f566354

Browse files
committed
nit
1 parent 420b017 commit f566354

File tree

4 files changed

+109
-34
lines changed

4 files changed

+109
-34
lines changed

client/src/main/java/org/asynchttpclient/oauth/OAuthSignatureCalculator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package org.asynchttpclient.oauth;
1515

16+
import io.netty.handler.codec.http.HttpHeaderNames;
1617
import org.asynchttpclient.Request;
1718
import org.asynchttpclient.RequestBuilderBase;
1819
import org.asynchttpclient.SignatureCalculator;
@@ -49,7 +50,14 @@ public OAuthSignatureCalculator(ConsumerKey consumerAuth, RequestToken userAuth)
4950
@Override
5051
public void calculateAndAddSignature(Request request, RequestBuilderBase<?> requestBuilder) {
5152
try {
52-
INSTANCES.get().sign(consumerAuth, userAuth, request, requestBuilder);
53+
String authorization = INSTANCES.get().computeAuthorizationHeader(
54+
consumerAuth,
55+
userAuth,
56+
request.getUri(),
57+
request.getMethod(),
58+
request.getFormParams(),
59+
request.getQueryParams());
60+
requestBuilder.setHeader(HttpHeaderNames.AUTHORIZATION, authorization);
5361
} catch (InvalidKeyException e) {
5462
throw new IllegalArgumentException("Failed to compute a valid key from consumer and user secrets", e);
5563
}

client/src/main/java/org/asynchttpclient/oauth/OAuthSignatureCalculatorInstance.java

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313
*/
1414
package org.asynchttpclient.oauth;
1515

16-
import io.netty.handler.codec.http.HttpHeaderNames;
1716
import org.asynchttpclient.Param;
18-
import org.asynchttpclient.Request;
19-
import org.asynchttpclient.RequestBuilderBase;
2017
import org.asynchttpclient.SignatureCalculator;
18+
import org.asynchttpclient.uri.Uri;
2119
import org.asynchttpclient.util.StringBuilderPool;
2220
import org.asynchttpclient.util.StringUtils;
2321
import org.asynchttpclient.util.Utf8UrlEncoder;
@@ -40,7 +38,7 @@
4038
* Supports most common signature inclusion and calculation methods: HMAC-SHA1 for calculation, and Header inclusion as inclusion method. Nonce generation uses simple random
4139
* numbers with base64 encoding.
4240
*/
43-
class OAuthSignatureCalculatorInstance {
41+
public class OAuthSignatureCalculatorInstance {
4442

4543
private static final Pattern STAR_CHAR_PATTERN = Pattern.compile("*", Pattern.LITERAL);
4644
private static final Pattern PLUS_CHAR_PATTERN = Pattern.compile("+", Pattern.LITERAL);
@@ -60,19 +58,19 @@ class OAuthSignatureCalculatorInstance {
6058
private final byte[] nonceBuffer = new byte[16];
6159
private final Parameters parameters = new Parameters();
6260

63-
OAuthSignatureCalculatorInstance() throws NoSuchAlgorithmException {
61+
public OAuthSignatureCalculatorInstance() throws NoSuchAlgorithmException {
6462
mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
6563
}
6664

67-
private static long generateTimestamp() {
68-
return System.currentTimeMillis() / 1000L;
69-
}
70-
71-
public void sign(ConsumerKey consumerAuth, RequestToken userAuth, Request request, RequestBuilderBase<?> requestBuilder) throws InvalidKeyException {
65+
public String computeAuthorizationHeader(ConsumerKey consumerAuth,
66+
RequestToken userAuth,
67+
Uri uri,
68+
String method,
69+
List<Param> formParams,
70+
List<Param> queryParams) throws InvalidKeyException {
7271
String nonce = generateNonce();
7372
long timestamp = generateTimestamp();
74-
String authorization = computeAuthorizationHeader(consumerAuth, userAuth, request, timestamp, nonce);
75-
requestBuilder.setHeader(HttpHeaderNames.AUTHORIZATION, authorization);
73+
return computeAuthorizationHeader(consumerAuth, userAuth, uri, method, formParams, queryParams, timestamp, nonce);
7674
}
7775

7876
private String generateNonce() {
@@ -81,30 +79,63 @@ private String generateNonce() {
8179
return Base64.getEncoder().encodeToString(nonceBuffer);
8280
}
8381

84-
String computeAuthorizationHeader(ConsumerKey consumerAuth, RequestToken userAuth, Request request, long timestamp, String nonce) throws InvalidKeyException {
85-
String percentEncodedNonce = Utf8UrlEncoder.percentEncodeQueryElement(nonce);
86-
String signature = calculateSignature(consumerAuth, userAuth, request, timestamp, percentEncodedNonce);
87-
return constructAuthHeader(consumerAuth, userAuth, signature, timestamp, percentEncodedNonce);
82+
private static long generateTimestamp() {
83+
return System.currentTimeMillis() / 1000L;
8884
}
8985

90-
String calculateSignature(ConsumerKey consumerAuth, RequestToken userAuth, Request request, long oauthTimestamp, String percentEncodedNonce) throws InvalidKeyException {
86+
String computeAuthorizationHeader(ConsumerKey consumerAuth,
87+
RequestToken userAuth,
88+
Uri uri,
89+
String method,
90+
List<Param> formParams,
91+
List<Param> queryParams,
92+
long timestamp,
93+
String nonce) throws InvalidKeyException {
94+
String percentEncodedNonce = Utf8UrlEncoder.percentEncodeQueryElement(nonce);
95+
String signature = computeSignature(consumerAuth, userAuth, uri, method, formParams, queryParams, timestamp, percentEncodedNonce);
96+
return computeAuthorizationHeader(consumerAuth, userAuth, signature, timestamp, percentEncodedNonce);
97+
}
9198

92-
StringBuilder sb = signatureBaseString(consumerAuth, userAuth, request, oauthTimestamp, percentEncodedNonce);
99+
String computeSignature(ConsumerKey consumerAuth,
100+
RequestToken userAuth,
101+
Uri uri,
102+
String method,
103+
List<Param> formParams,
104+
List<Param> queryParams,
105+
long oauthTimestamp,
106+
String percentEncodedNonce) throws InvalidKeyException {
107+
108+
StringBuilder sb = signatureBaseString(
109+
consumerAuth,
110+
userAuth,
111+
uri,
112+
method,
113+
queryParams,
114+
formParams,
115+
oauthTimestamp,
116+
percentEncodedNonce);
93117

94118
ByteBuffer rawBase = StringUtils.charSequence2ByteBuffer(sb, UTF_8);
95119
byte[] rawSignature = digest(consumerAuth, userAuth, rawBase);
96120
// and finally, base64 encoded... phew!
97121
return Base64.getEncoder().encodeToString(rawSignature);
98122
}
99123

100-
StringBuilder signatureBaseString(ConsumerKey consumerAuth, RequestToken userAuth, Request request, long oauthTimestamp, String percentEncodedNonce) {
124+
StringBuilder signatureBaseString(ConsumerKey consumerAuth,
125+
RequestToken userAuth,
126+
Uri uri,
127+
String method,
128+
List<Param> formParams,
129+
List<Param> queryParams,
130+
long oauthTimestamp,
131+
String percentEncodedNonce) {
101132

102133
// beware: must generate first as we're using pooled StringBuilder
103-
String baseUrl = request.getUri().toBaseUrl();
104-
String encodedParams = encodedParams(consumerAuth, userAuth, oauthTimestamp, percentEncodedNonce, request.getFormParams(), request.getQueryParams());
134+
String baseUrl = uri.toBaseUrl();
135+
String encodedParams = encodedParams(consumerAuth, userAuth, oauthTimestamp, percentEncodedNonce, formParams, queryParams);
105136

106137
StringBuilder sb = StringBuilderPool.DEFAULT.stringBuilder();
107-
sb.append(request.getMethod()); // POST / GET etc (nothing to URL encode)
138+
sb.append(method); // POST / GET etc (nothing to URL encode)
108139
sb.append('&');
109140
Utf8UrlEncoder.encodeAndAppendPercentEncoded(sb, baseUrl);
110141

@@ -114,7 +145,12 @@ StringBuilder signatureBaseString(ConsumerKey consumerAuth, RequestToken userAut
114145
return sb;
115146
}
116147

117-
private String encodedParams(ConsumerKey consumerAuth, RequestToken userAuth, long oauthTimestamp, String percentEncodedNonce, List<Param> formParams, List<Param> queryParams) {
148+
private String encodedParams(ConsumerKey consumerAuth,
149+
RequestToken userAuth,
150+
long oauthTimestamp,
151+
String percentEncodedNonce,
152+
List<Param> formParams,
153+
List<Param> queryParams) {
118154

119155
parameters.reset();
120156

@@ -168,7 +204,7 @@ private byte[] digest(ConsumerKey consumerAuth, RequestToken userAuth, ByteBuffe
168204
return mac.doFinal();
169205
}
170206

171-
String constructAuthHeader(ConsumerKey consumerAuth, RequestToken userAuth, String signature, long oauthTimestamp, String percentEncodedNonce) {
207+
String computeAuthorizationHeader(ConsumerKey consumerAuth, RequestToken userAuth, String signature, long oauthTimestamp, String percentEncodedNonce) {
172208
StringBuilder sb = StringBuilderPool.DEFAULT.stringBuilder();
173209
sb.append("OAuth ");
174210
sb.append(KEY_OAUTH_CONSUMER_KEY).append("=\"").append(consumerAuth.getPercentEncodedKey()).append("\", ");

client/src/test/java/org/asynchttpclient/oauth/OAuthSignatureCalculatorTest.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ private void testSignatureBaseString(Request request) throws NoSuchAlgorithmExce
5252
.signatureBaseString(//
5353
new ConsumerKey("9djdj82h48djs9d2", CONSUMER_SECRET),
5454
new RequestToken("kkk9d7dh3k39sjv7", TOKEN_SECRET),
55-
request,
55+
request.getUri(),
56+
request.getMethod(),
57+
request.getFormParams(),
58+
request.getQueryParams(),
5659
137131201,
5760
"7d8f3e4a").toString();
5861

@@ -78,7 +81,10 @@ private void testSignatureBaseStringWithEncodableOAuthToken(Request request) thr
7881
.signatureBaseString(//
7982
new ConsumerKey("9djdj82h48djs9d2", CONSUMER_SECRET),
8083
new RequestToken("kkk9d7dh3k39sjv7", TOKEN_SECRET),
81-
request,
84+
request.getUri(),
85+
request.getMethod(),
86+
request.getFormParams(),
87+
request.getQueryParams(),
8288
137131201,
8389
Utf8UrlEncoder.percentEncodeQueryElement("ZLc92RAkooZcIO/0cctl0Q==")).toString();
8490

@@ -135,9 +141,12 @@ public void testGetCalculateSignature() throws NoSuchAlgorithmException, Invalid
135141
.build();
136142

137143
String signature = new OAuthSignatureCalculatorInstance()
138-
.calculateSignature(new ConsumerKey(CONSUMER_KEY, CONSUMER_SECRET),
144+
.computeSignature(new ConsumerKey(CONSUMER_KEY, CONSUMER_SECRET),
139145
new RequestToken(TOKEN_KEY, TOKEN_SECRET),
140-
request,
146+
request.getUri(),
147+
request.getMethod(),
148+
request.getFormParams(),
149+
request.getQueryParams(),
141150
TIMESTAMP,
142151
NONCE);
143152

@@ -261,7 +270,10 @@ public void testWithNullRequestToken() throws NoSuchAlgorithmException {
261270
.signatureBaseString(//
262271
new ConsumerKey("9djdj82h48djs9d2", CONSUMER_SECRET),
263272
new RequestToken(null, null),
264-
request,
273+
request.getUri(),
274+
request.getMethod(),
275+
request.getFormParams(),
276+
request.getQueryParams(),
265277
137131201,
266278
Utf8UrlEncoder.percentEncodeQueryElement("ZLc92RAkooZcIO/0cctl0Q==")).toString();
267279

@@ -282,7 +294,10 @@ public void testWithStarQueryParameterValue() throws NoSuchAlgorithmException {
282294
.signatureBaseString(
283295
new ConsumerKey("key", "secret"),
284296
new RequestToken(null, null),
285-
request,
297+
request.getUri(),
298+
request.getMethod(),
299+
request.getFormParams(),
300+
request.getQueryParams(),
286301
1469019732,
287302
"6ad17f97334700f3ec2df0631d5b7511").toString();
288303

@@ -306,10 +321,18 @@ public void testSignatureGenerationWithAsteriskInPath() throws InvalidKeyExcepti
306321
final Request request = get("http://example.com/oauth/example/*path/wi*th/asterisks*").build();
307322

308323
String expectedSignature = "cswi/v3ZqhVkTyy5MGqW841BxDA=";
309-
String actualSignature = new OAuthSignatureCalculatorInstance().calculateSignature(consumerKey, requestToken, request, timestamp, nonce);
324+
String actualSignature = new OAuthSignatureCalculatorInstance().computeSignature(
325+
consumerKey,
326+
requestToken,
327+
request.getUri(),
328+
request.getMethod(),
329+
request.getFormParams(),
330+
request.getQueryParams(),
331+
timestamp,
332+
nonce);
310333
assertEquals(actualSignature, expectedSignature);
311334

312-
String generatedAuthHeader = new OAuthSignatureCalculatorInstance().constructAuthHeader(consumerKey, requestToken, actualSignature, timestamp, nonce);
335+
String generatedAuthHeader = new OAuthSignatureCalculatorInstance().computeAuthorizationHeader(consumerKey, requestToken, actualSignature, timestamp, nonce);
313336
assertTrue(generatedAuthHeader.contains("oauth_signature=\"cswi%2Fv3ZqhVkTyy5MGqW841BxDA%3D\""));
314337
}
315338

client/src/test/java/org/asynchttpclient/oauth/StaticOAuthSignatureCalculator.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@ class StaticOAuthSignatureCalculator implements SignatureCalculator {
3838
@Override
3939
public void calculateAndAddSignature(Request request, RequestBuilderBase<?> requestBuilder) {
4040
try {
41-
String authorization = new OAuthSignatureCalculatorInstance().computeAuthorizationHeader(consumerKey, requestToken, request, timestamp, nonce);
41+
String authorization = new OAuthSignatureCalculatorInstance().computeAuthorizationHeader(
42+
consumerKey,
43+
requestToken,
44+
request.getUri(),
45+
request.getMethod(),
46+
request.getFormParams(),
47+
request.getQueryParams(),
48+
timestamp,
49+
nonce);
4250
requestBuilder.setHeader(HttpHeaderNames.AUTHORIZATION, authorization);
4351
} catch (InvalidKeyException | NoSuchAlgorithmException e) {
4452
throw new IllegalArgumentException(e);

0 commit comments

Comments
 (0)