Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions src/main/java/org/scribe/builder/ServiceBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class ServiceBuilder
{
private String apiKey;
private String apiSecret;
private String callback;
private Callback callback;
private Api api;
private String scope;
private SignatureType signatureType;
Expand All @@ -27,7 +27,7 @@ public class ServiceBuilder
*/
public ServiceBuilder()
{
this.callback = OAuthConstants.OUT_OF_BAND;
this.callback = Callback.outOfBand();
}

/**
Expand Down Expand Up @@ -80,8 +80,18 @@ public ServiceBuilder provider(Api api)
*/
public ServiceBuilder callback(String callback)
{
Preconditions.checkValidOAuthCallback(callback, "Callback must be a valid URL or 'oob'");
this.callback = callback;
this.callback = Callback.from( callback );
return this;
}

/**
* Removes the callback parameter completely
*
* @return the {@link ServiceBuilder} instance for method chaining
*/
public ServiceBuilder noCallback()
{
this.callback = Callback.none();
return this;
}

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/scribe/builder/api/FacebookApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ public String getAccessTokenEndpoint()
@Override
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Facebook does not support OOB");
Preconditions.check(config.getCallback().hasValidUrl(), "Must provide a valid url as callback. Facebook does not support OOB");

// Append scope if present
if(config.hasScope())
{
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()), formURLEncode(config.getScope()));
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(),config.getCallback().makeURLEncodedValue(), formURLEncode(config.getScope()));
}
else
{
return String.format(AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()));
return String.format(AUTHORIZE_URL, config.getApiKey(), config.getCallback().makeURLEncodedValue());
}
}
}
4 changes: 2 additions & 2 deletions src/main/java/org/scribe/builder/api/Foursquare2Api.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ public String getAccessTokenEndpoint()
@Override
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Foursquare2 does not support OOB");
return String.format(AUTHORIZATION_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()));
Preconditions.check(config.getCallback().hasValidUrl(), "Must provide a valid url as callback. Foursquare2 does not support OOB");
return String.format(AUTHORIZATION_URL, config.getApiKey(),config.getCallback().makeURLEncodedValue());
}

@Override
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/scribe/builder/api/LiveApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@ public String getAccessTokenEndpoint()
@Override
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Live does not support OOB");
Preconditions.check(config.getCallback().hasValidUrl(), "Must provide a valid url as callback. Live does not support OOB");

// Append scope if present
if (config.hasScope())
{
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()), formURLEncode(config.getScope()));
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), config.getCallback().makeURLEncodedValue(), formURLEncode(config.getScope()));
} else
{
return String.format(AUTHORIZE_URL, config.getApiKey(), formURLEncode(config.getCallback()));
return String.format(AUTHORIZE_URL, config.getApiKey(), config.getCallback().makeURLEncodedValue());
}
}

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/scribe/builder/api/VkontakteApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ public String getAccessTokenEndpoint()
@Override
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Valid url is required for a callback. Vkontakte does not support OOB");
Preconditions.check(config.getCallback().hasValidUrl(), "Valid url is required for a callback. Vkontakte does not support OOB");
if(config.hasScope())// Appending scope if present
{
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()),URLUtils.formURLEncode(config.getScope()));
return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), config.getCallback().makeURLEncodedValue(),URLUtils.formURLEncode(config.getScope()));
}
else
{
return String.format(AUTHORIZE_URL, config.getApiKey(), URLUtils.formURLEncode(config.getCallback()));
return String.format(AUTHORIZE_URL, config.getApiKey(), config.getCallback().makeURLEncodedValue());
}
}

Expand Down
79 changes: 79 additions & 0 deletions src/main/java/org/scribe/model/Callback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package org.scribe.model;

import org.scribe.utils.Preconditions;
import org.scribe.utils.URLUtils;


public class Callback {

private final static Callback OUT_OF_BAND = new Callback( OAuthConstants.OUT_OF_BAND );
private final static Callback NONE = new Callback( null );

private final String callbackValue;

private Callback( final String value ) {
callbackValue = value;
}

public static Callback from( final String callback ) {
if ( OUT_OF_BAND.equals( callback ) ) {
return outOfBand();
}
if ( null == callback || "".equals( callback ) ) {
return none();
}
Preconditions.checkValidUrl( callback, "Callback must be a valid URL");
return new Callback( callback );
}

public static Callback outOfBand() {
return OUT_OF_BAND;
}

public static Callback none() {
return NONE;
}

public String getCallbackValue() {
return callbackValue;
}

public String makeURLEncodedValue() {
return URLUtils.formURLEncode(callbackValue);
}

public boolean addToRequest() {
return this != NONE && this.callbackValue != null;
}

public boolean hasValidUrl() {
return this != NONE && this != OUT_OF_BAND;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((callbackValue == null) ? 0 : callbackValue.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Callback other = (Callback) obj;
if (callbackValue == null) {
if (other.callbackValue != null)
return false;
} else if (!callbackValue.equals(other.callbackValue))
return false;
return true;
}

}
8 changes: 4 additions & 4 deletions src/main/java/org/scribe/model/OAuthConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public class OAuthConfig
{
private final String apiKey;
private final String apiSecret;
private final String callback;
private final Callback callback;
private final SignatureType signatureType;
private final String scope;

Expand All @@ -18,11 +18,11 @@ public OAuthConfig(String key, String secret)
this(key, secret, null, null, null);
}

public OAuthConfig(String key, String secret, String callback, SignatureType type, String scope)
public OAuthConfig(String key, String secret, Callback callback, SignatureType type, String scope)
{
this.apiKey = key;
this.apiSecret = secret;
this.callback = callback != null ? callback : OAuthConstants.OUT_OF_BAND;
this.callback = callback != null ? callback : Callback.outOfBand();
this.signatureType = (type != null) ? type : SignatureType.Header;
this.scope = scope;
}
Expand All @@ -37,7 +37,7 @@ public String getApiSecret()
return apiSecret;
}

public String getCallback()
public Callback getCallback()
{
return callback;
}
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/org/scribe/model/Verifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
public class Verifier
{

private final static Verifier NONE = new Verifier();

private final String value;

/**
Expand All @@ -22,9 +24,21 @@ public Verifier(String value)
Preconditions.checkNotNull(value, "Must provide a valid string as verifier");
this.value = value;
}

private Verifier() {
this.value = null;
}

public String getValue()
{
return value;
}

public static Verifier none() {
return NONE;
}

public boolean isDefined() {
return this != NONE;
}
}
10 changes: 8 additions & 2 deletions src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,11 @@ public OAuth10aServiceImpl(DefaultApi10a api, OAuthConfig config)
public Token getRequestToken()
{
OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
request.addOAuthParameter(OAuthConstants.CALLBACK, config.getCallback());
final Callback callback = config.getCallback();

if ( callback.addToRequest() ) {
request.addOAuthParameter(OAuthConstants.CALLBACK, callback.getCallbackValue() );
}
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
addSignature(request);
Response response = request.send();
Expand All @@ -60,7 +64,9 @@ public Token getAccessToken(Token requestToken, Verifier verifier)
{
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
if ( verifier.isDefined() ) {
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
}
addOAuthParams(request, requestToken);
addSignature(request);
Response response = request.send();
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/org/scribe/oauth/OAuth20ServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,14 @@ public Token getAccessToken(Token requestToken, Verifier verifier)
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
request.addQuerystringParameter(OAuthConstants.CLIENT_ID, config.getApiKey());
request.addQuerystringParameter(OAuthConstants.CLIENT_SECRET, config.getApiSecret());
request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
request.addQuerystringParameter(OAuthConstants.REDIRECT_URI, config.getCallback());
if ( verifier.isDefined() ) {
request.addQuerystringParameter(OAuthConstants.CODE, verifier.getValue());
}
final Callback callback = config.getCallback();

if ( callback.addToRequest() ) {
request.addOAuthParameter(OAuthConstants.REDIRECT_URI, callback.getCallbackValue() );
}
if(config.hasScope()) request.addQuerystringParameter(OAuthConstants.SCOPE, config.getScope());
Response response = request.send();
return api.getAccessTokenExtractor().extract(response.getBody());
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/scribe/utils/Preconditions.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ private static boolean isUrl(String url)
return URL_PATTERN.matcher(url).matches();
}

private static void check(boolean requirements, String error)
public static void check(boolean requirements, String error)
{
String message = (error == null || error.trim().length() <= 0) ? DEFAULT_MESSAGE : error;
if (!requirements)
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/org/scribe/builder/ServiceBuilderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void shouldReturnConfigDefaultValues()
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").build();
assertEquals(ApiMock.config.getApiKey(), "key");
assertEquals(ApiMock.config.getApiSecret(), "secret");
assertEquals(ApiMock.config.getCallback(), OAuthConstants.OUT_OF_BAND);
assertEquals(ApiMock.config.getCallback(), Callback.outOfBand());
assertEquals(ApiMock.config.getSignatureType(), SignatureType.Header);
}

Expand All @@ -33,7 +33,7 @@ public void shouldAcceptValidCallbackUrl()
builder.provider(ApiMock.class).apiKey("key").apiSecret("secret").callback("http://example.com").build();
assertEquals(ApiMock.config.getApiKey(), "key");
assertEquals(ApiMock.config.getApiSecret(), "secret");
assertEquals(ApiMock.config.getCallback(), "http://example.com");
assertEquals( ApiMock.config.getCallback(), Callback.from( "http://example.com" ) );
}

@Test
Expand Down
6 changes: 3 additions & 3 deletions src/test/java/org/scribe/model/OAuthConfigTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@ public class OAuthConfigTest
public void shouldReturnDefaultValuesIfNotSet()
{
OAuthConfig config = new OAuthConfig("key", "secret");
assertEquals(OAuthConstants.OUT_OF_BAND, config.getCallback());
assertEquals(Callback.outOfBand(), config.getCallback());
assertEquals(SignatureType.Header, config.getSignatureType());
assertFalse(config.hasScope());
}

@Test
public void shouldOverrideDefaultsIfSet()
{
OAuthConfig config = new OAuthConfig("key", "secret", "http://callback", SignatureType.Header, "scope");
assertEquals("http://callback", config.getCallback());
OAuthConfig config = new OAuthConfig("key", "secret", Callback.from( "http://callback" ), SignatureType.Header, "scope");
assertEquals( Callback.from( "http://callback" ), config.getCallback());
assertEquals("key", config.getApiKey());
assertEquals("secret", config.getApiSecret());
}
Expand Down