X Tutup
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
2 changes: 1 addition & 1 deletion src/main/java/org/scribe/builder/api/FacebookApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ public class FacebookApi extends DefaultApi20
public String getAuthorizationUrl(OAuthConfig config)
{
Preconditions.checkValidUrl(config.getCallback(), "Must provide a valid url as callback. Facebook does not support OOB");
return String.format(AUTHORIZE_URL, config.getApiKey(), URLUtils.percentEncode(config.getCallback()));
return String.format(AUTHORIZE_URL, config.getApiKey(), URLUtils.urlEncodeWrapper(config.getCallback()));
}
}
28 changes: 24 additions & 4 deletions src/main/java/org/scribe/extractors/BaseStringExtractorImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,31 @@ public String extract(OAuthRequest request)
private String getSortedAndEncodedParams(OAuthRequest request)
{
Map<String, String> params = new HashMap<String, String>();
params.putAll(request.getQueryStringParams());
params.putAll(request.getBodyParams());
params.putAll(request.getOauthParameters());
Map<String, String> tmp = null;
//params.putAll(request.getQueryStringParams());
tmp = request.getQueryStringParams();
for (String key:tmp.keySet()){
params.put(
URLUtils.percentEncode(key),
URLUtils.percentEncode(tmp.get(key))
);
}
tmp = request.getBodyParams();
for (String key:tmp.keySet()){
params.put(
URLUtils.percentEncode(key),
URLUtils.percentEncode(tmp.get(key))
);
}
tmp = request.getOauthParameters();
for (String key:tmp.keySet()){
params.put(
URLUtils.percentEncode(key),
URLUtils.percentEncode(tmp.get(key))
);
}
params = MapUtils.sort(params);
return URLUtils.percentEncode(URLUtils.formURLEncodeMap(params));
return URLUtils.percentEncode(URLUtils.concatSortedPercentEncodedParams(params));
}

private void checkPreconditions(OAuthRequest request)
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/scribe/extractors/TokenExtractorImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public Token extract(String response)
Matcher matcher = Pattern.compile(TOKEN_REGEX).matcher(response);
if (matcher.matches())
{
String token = URLUtils.percentDecode(matcher.group(1));
String secret = URLUtils.percentDecode(matcher.group(2));
String token = URLUtils.urlDecodeWrapper(matcher.group(1));
String secret = URLUtils.urlDecodeWrapper(matcher.group(2));
return new Token(token, secret);
} else
{
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/scribe/model/OAuthRequest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.scribe.model;

import java.net.MalformedURLException;
import java.util.*;

/**
Expand All @@ -19,8 +20,9 @@ public class OAuthRequest extends Request
*
* @param verb Http verb/method
* @param url resource URL
* @throws MalformedURLException
*/
public OAuthRequest(Verb verb, String url)
public OAuthRequest(Verb verb, String url) throws MalformedURLException
{
super(verb, url);
this.oauthParameters = new HashMap<String, String>();
Expand Down
30 changes: 14 additions & 16 deletions src/main/java/org/scribe/model/Request.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class Request
{
private static final String CONTENT_LENGTH = "Content-Length";

private String url;
private URL url;
private Verb verb;
private Map<String, String> querystringParams;
private Map<String, String> bodyParams;
Expand All @@ -30,11 +30,12 @@ class Request
*
* @param verb Http Verb (GET, POST, etc)
* @param url url with optional querystring parameters.
* @throws MalformedURLException
*/
public Request(Verb verb, String url)
public Request(Verb verb, String url) throws MalformedURLException
{
this.verb = verb;
this.url = url;
this.url = new URL(url);
this.querystringParams = new HashMap<String, String>();
this.bodyParams = new HashMap<String, String>();
this.headers = new HashMap<String, String>();
Expand All @@ -61,7 +62,7 @@ public Response send()

private void createConnection() throws IOException
{
String effectiveUrl = URLUtils.appendParametersToQueryString(url, querystringParams);
String effectiveUrl = URLUtils.appendParametersToQueryString(url.toString(), querystringParams);
if (connection == null)
{
connection = (HttpURLConnection) new URL(effectiveUrl).openConnection();
Expand Down Expand Up @@ -147,25 +148,22 @@ public void addPayload(String payload)
*/
public Map<String, String> getQueryStringParams()
{
try
{
Map<String, String> params = new HashMap<String, String>();
String query = new URL(url).getQuery();
String query = url.getQuery();
if (query != null)
{
for (String param : query.split("&"))
{
String pair[] = param.split("=");
params.put(pair[0], pair[1]);
String valuePart = "";
if (pair.length > 1) {
valuePart = URLUtils.urlDecodeWrapper(pair[1]);
}
params.put(URLUtils.urlDecodeWrapper(pair[0]),valuePart );
}
}
params.putAll(querystringParams);
return params;
}
catch (MalformedURLException mue)
{
throw new OAuthException("Malformed URL", mue);
}
return params;
}

/**
Expand All @@ -185,7 +183,7 @@ public Map<String, String> getBodyParams()
*/
public String getUrl()
{
return url;
return url.toString();
}

/**
Expand All @@ -195,7 +193,7 @@ public String getUrl()
*/
public String getSanitizedUrl()
{
return url.replaceAll("\\?.*", "").replace("\\:\\d{4}", "");
return URLUtils.convertUrlToBaseStringURI(url);
}

/**
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/org/scribe/model/Verifier.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package org.scribe.model;

import org.scribe.utils.*;

/**
* Represents an OAuth verifier code.
*
Expand All @@ -19,7 +17,10 @@ public class Verifier
*/
public Verifier(String value)
{
this.value = URLUtils.percentDecode(value);
if (value == null) {
throw new IllegalArgumentException();
}
this.value = value;
}

public String getValue()
Expand Down
17 changes: 15 additions & 2 deletions src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.scribe.oauth;

import java.net.MalformedURLException;

import org.scribe.builder.api.*;
import org.scribe.exceptions.OAuthException;
import org.scribe.model.*;

/**
Expand Down Expand Up @@ -35,7 +38,12 @@ public OAuth10aServiceImpl(DefaultApi10a api, OAuthConfig config)
*/
public Token getRequestToken()
{
OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
OAuthRequest request = null;;
try {
request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
} catch (MalformedURLException e) {
throw new OAuthException("Problems while creating connection", e);
}
addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
addOAuthHeader(request);
Response response = request.send();
Expand All @@ -59,7 +67,12 @@ private void addOAuthParams(OAuthRequest request, Token token)
*/
public Token getAccessToken(Token requestToken, Verifier verifier)
{
OAuthRequest request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
OAuthRequest request = null;
try {
request = new OAuthRequest(api.getAccessTokenVerb(), api.getAccessTokenEndpoint());
} catch (MalformedURLException e) {
throw new OAuthException("Problems while creating connection", e);
}
request.addOAuthParameter(OAuthConstants.TOKEN, requestToken.getToken());
request.addOAuthParameter(OAuthConstants.VERIFIER, verifier.getValue());
addOAuthParams(request, requestToken);
Expand Down
70 changes: 66 additions & 4 deletions src/main/java/org/scribe/utils/URLUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ public class URLUtils
private static final char PAIR_SEPARATOR = '=';
private static final char PARAM_SEPARATOR = '&';
private static final char QUERY_STRING_SEPARATOR = '?';
private static final String HTTP_PROTOCOL = "http";
private static final int HTTP_DEFAULT_PORT = 80;
private static final String HTTPS_PROTOCOL = "https";
private static final int HTTPS_DEFAULT_PORT = 443;

private static final String ERROR_MSG = String.format("Cannot find specified encoding: %s", UTF_8);

Expand All @@ -31,7 +35,7 @@ public class URLUtils
}

/**
* Turns a map into a form-url-encoded string (key=value&key2=value2)
* Turns a map into a form-url-encoded string (key=value&key2&key3=value)
*
* @param map any map
* @return form-url-encoded string
Expand All @@ -51,7 +55,10 @@ private static String doFormUrlEncode(Map<String, String> map)
{
encodedString.append(PARAM_SEPARATOR);
}
encodedString.append(percentEncode(key)).append(PAIR_SEPARATOR).append(percentEncode(map.get(key)));
encodedString.append(urlEncodeWrapper(key));
if (map.get(key).length() > 0) {
encodedString.append(PAIR_SEPARATOR).append(urlEncodeWrapper(map.get(key)));
}
}
return encodedString.toString();
}
Expand Down Expand Up @@ -81,12 +88,31 @@ public static String percentEncode(String string)
}

/**
* Percent decodes a string
* URL encodes a string
*
* @param plain
* @return percent encoded string
*/
public static String urlEncodeWrapper(String string)
{
Preconditions.checkNotNull(string, "Cannot encode null string");
try
{
return URLEncoder.encode(string, UTF_8);
}
catch (UnsupportedEncodingException uee)
{
throw new IllegalStateException(ERROR_MSG, uee);
}
}

/**
* URL decodes a string
*
* @param string percent encoded string
* @return plain string
*/
public static String percentDecode(String string)
public static String urlDecodeWrapper(String string)
{
Preconditions.checkNotNull(string, "Cannot decode null string");
try
Expand Down Expand Up @@ -133,4 +159,40 @@ String apply(String string) {
return string.replace(ch, toCh);
}
}

public static String concatSortedPercentEncodedParams(Map<String, String> params) {
StringBuilder target = new StringBuilder();
for (String key:params.keySet()){
target.append(key);
target.append(PAIR_SEPARATOR);
target.append(params.get(key));
target.append(PARAM_SEPARATOR);
}
return target.deleteCharAt(target.length() - 1).toString();
}

public static String convertUrlToBaseStringURI(URL url){
URI uri = null;
try {
uri = url.toURI();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
String scheme = uri.getScheme().toLowerCase();
String host = uri.getHost().toLowerCase();
int port = uri.getPort();
if (
(scheme.equals(HTTP_PROTOCOL) && port == HTTP_DEFAULT_PORT)
|| (scheme.equals(HTTPS_PROTOCOL) && port == HTTPS_DEFAULT_PORT)
){
port = -1;
}
URI baseUri = null;
try {
baseUri = new URI(scheme,null, host, port, uri.getPath(), null, null);
} catch (URISyntaxException e) {
e.printStackTrace();
}
return baseUri.toString();
}
}
3 changes: 2 additions & 1 deletion src/test/java/org/scribe/examples/FacebookExample.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.scribe.examples;

import java.net.MalformedURLException;
import java.util.*;

import org.scribe.builder.*;
Expand All @@ -14,7 +15,7 @@ public class FacebookExample
private static final String NO_SECRET_NEEDED = "";
private static final Token EMPTY_TOKEN = null;

public static void main(String[] args)
public static void main(String[] args) throws MalformedURLException
{
// Replace these with your own api key and secret
String apiKey = "your_api_key";
Expand Down
3 changes: 2 additions & 1 deletion src/test/java/org/scribe/examples/FoursquareExample.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.scribe.examples;

import java.net.MalformedURLException;
import java.util.Scanner;

import org.scribe.builder.*;
Expand All @@ -11,7 +12,7 @@ public class FoursquareExample
{
private static final String PROTECTED_RESOURCE_URL = "http://api.foursquare.com/v1/user";

public static void main(String[] args)
public static void main(String[] args) throws MalformedURLException
{
OAuthService service = new ServiceBuilder()
.provider(FoursquareApi.class)
Expand Down
3 changes: 2 additions & 1 deletion src/test/java/org/scribe/examples/GoogleExample.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.scribe.examples;

import java.net.MalformedURLException;
import java.util.*;

import org.scribe.builder.*;
Expand All @@ -14,7 +15,7 @@ public class GoogleExample
private static final String PROTECTED_RESOURCE_URL = "https://docs.google.com/feeds/default/private/full/";
private static final String SCOPE = "https://docs.google.com/feeds/";

public static void main(String[] args)
public static void main(String[] args) throws MalformedURLException
{
OAuthService service = new ServiceBuilder()
.provider(GoogleApi.class)
Expand Down
3 changes: 2 additions & 1 deletion src/test/java/org/scribe/examples/LinkedInExample.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.scribe.examples;

import java.net.MalformedURLException;
import java.util.Scanner;

import org.scribe.builder.*;
Expand All @@ -11,7 +12,7 @@ public class LinkedInExample
{
private static final String PROTECTED_RESOURCE_URL = "http://api.linkedin.com/v1/people/~/connections:(id,last-name)";

public static void main(String[] args)
public static void main(String[] args) throws MalformedURLException
{
OAuthService service = new ServiceBuilder()
.provider(LinkedInApi.class)
Expand Down
Loading
X Tutup