package org.limewire.rest.oauth; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; import org.apache.http.NameValuePair; import org.limewire.rest.RestUtils; /** * Utility methods to support OAuth. */ class OAuthUtils { private static final char AMPERSAND = '&'; private static final char EQUAL = '='; /** * Creates the signature base string for the specified request. This is * composed of three elements: HTTP request method, request URL, and * normalized request parameters. */ public static String createSignatureBaseString(OAuthRequest request, String baseUrl) { StringBuilder buf = new StringBuilder(); buf.append(request.getMethod().toUpperCase(Locale.US)).append(AMPERSAND); buf.append(RestUtils.percentEncode(baseUrl + request.getUri())).append(AMPERSAND); buf.append(RestUtils.percentEncode(createParameterString(request))); return buf.toString(); } /** * Creates the request parameter string for the specified request. This * includes all parameters except the realm and signature, sorted by * parameter name. */ private static String createParameterString(OAuthRequest request) { StringBuilder buf = new StringBuilder(); List<NameValuePair> parameters = request.getParameters(); Collections.sort(parameters, new NameValueComparator()); for (NameValuePair parameter : parameters) { // Skip realm and signature parameters. if (OAuthRequest.AUTH_REALM.equalsIgnoreCase(parameter.getName()) || OAuthRequest.OAUTH_SIGNATURE.equalsIgnoreCase(parameter.getName())) { continue; } // Append parameter to string. if (buf.length() > 0) { buf.append(AMPERSAND); } buf.append(RestUtils.percentEncode(parameter.getName())); buf.append(EQUAL).append(RestUtils.percentEncode(parameter.getValue())); } // Return parameter string. return buf.toString(); } /** * Comparator for sorting the request parameters by name. */ private static class NameValueComparator implements Comparator<NameValuePair> { @Override public int compare(NameValuePair o1, NameValuePair o2) { return o1.getName().compareTo(o2.getName()); } } }