diff --git a/cloudinary-core/src/main/java/com/cloudinary/Configuration.java b/cloudinary-core/src/main/java/com/cloudinary/Configuration.java index b21aa799..18e813ce 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/Configuration.java +++ b/cloudinary-core/src/main/java/com/cloudinary/Configuration.java @@ -47,6 +47,7 @@ public class Configuration { public boolean forceVersion = true; public boolean longUrlSignature = DEFAULT_IS_LONG_SIGNATURE; public SignatureAlgorithm signatureAlgorithm = DEFAULT_SIGNATURE_ALGORITHM; + public String oauthToken = null; public Configuration() { } @@ -71,7 +72,8 @@ private Configuration( boolean loadStrategies, boolean forceVersion, boolean longUrlSignature, - SignatureAlgorithm signatureAlgorithm) { + SignatureAlgorithm signatureAlgorithm, + String oauthToken) { this.cloudName = cloudName; this.apiKey = apiKey; this.apiSecret = apiSecret; @@ -87,11 +89,12 @@ private Configuration( this.proxyPort = proxyPort; this.secureCdnSubdomain = secureCdnSubdomain; this.useRootPath = useRootPath; - this.timeout = 0; + this.timeout = timeout; this.loadStrategies = loadStrategies; this.forceVersion = forceVersion; this.longUrlSignature = longUrlSignature; this.signatureAlgorithm = signatureAlgorithm; + this.oauthToken = oauthToken; } @SuppressWarnings("rawtypes") @@ -130,6 +133,7 @@ public void update(Map config) { } this.longUrlSignature = ObjectUtils.asBoolean(config.get("long_url_signature"), DEFAULT_IS_LONG_SIGNATURE); this.signatureAlgorithm = SignatureAlgorithm.valueOf(ObjectUtils.asString(config.get(CONFIG_PROP_SIGNATURE_ALGORITHM), DEFAULT_SIGNATURE_ALGORITHM.name())); + this.oauthToken = (String) config.get("oauth_token"); } @SuppressWarnings("rawtypes") @@ -160,6 +164,7 @@ public Map asMap() { map.put("properties", new HashMap(properties)); map.put("long_url_signature", longUrlSignature); map.put(CONFIG_PROP_SIGNATURE_ALGORITHM, signatureAlgorithm.toString()); + map.put("oauth_token", oauthToken); return map; } @@ -190,6 +195,7 @@ public Configuration(Configuration other) { this.properties.putAll(other.properties); this.longUrlSignature = other.longUrlSignature; this.signatureAlgorithm = other.signatureAlgorithm; + this.oauthToken = other.oauthToken; } /** @@ -301,6 +307,7 @@ public static class Builder { private boolean forceVersion = true; private boolean longUrlSignature = DEFAULT_IS_LONG_SIGNATURE; private SignatureAlgorithm signatureAlgorithm = DEFAULT_SIGNATURE_ALGORITHM; + private String oauthToken = null; /** * Set the HTTP connection timeout. @@ -337,7 +344,8 @@ public Configuration build() { loadStrategies, forceVersion, longUrlSignature, - signatureAlgorithm); + signatureAlgorithm, + oauthToken); configuration.clientHints = clientHints; return configuration; } @@ -466,6 +474,11 @@ public Builder setSignatureAlgorithm(SignatureAlgorithm signatureAlgorithm) { return this; } + public Builder setOAuthToken(String oauthToken) { + this.oauthToken = oauthToken; + return this; + } + /** * Initialize builder from existing {@link Configuration} * @@ -495,6 +508,7 @@ public Builder from(Configuration other) { this.forceVersion = other.forceVersion; this.longUrlSignature = other.longUrlSignature; this.signatureAlgorithm = other.signatureAlgorithm; + this.oauthToken = other.oauthToken; return this; } } diff --git a/cloudinary-core/src/main/java/com/cloudinary/strategies/AbstractApiStrategy.java b/cloudinary-core/src/main/java/com/cloudinary/strategies/AbstractApiStrategy.java index 65d0970d..9e427c4a 100644 --- a/cloudinary-core/src/main/java/com/cloudinary/strategies/AbstractApiStrategy.java +++ b/cloudinary-core/src/main/java/com/cloudinary/strategies/AbstractApiStrategy.java @@ -4,6 +4,7 @@ import com.cloudinary.Api.HttpMethod; import com.cloudinary.SmartUrlEncoder; import com.cloudinary.api.ApiResponse; +import com.cloudinary.utils.Base64Coder; import com.cloudinary.utils.StringUtils; import java.util.Arrays; import java.util.Map; @@ -31,4 +32,19 @@ protected String createApiUrl (Iterable uri, String prefix, String cloud public abstract ApiResponse callApi(HttpMethod method, Iterable uri, Map params, Map options) throws Exception; public abstract ApiResponse callAccountApi(HttpMethod method, Iterable uri, Map params, Map options) throws Exception; + + protected String getAuthorizationHeaderValue(String apiKey, String apiSecret, String oauthToken) { + if (oauthToken != null){ + return "Bearer " + oauthToken; + } else { + return "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret); + } + } + + protected void validateAuthorization(String apiKey, String apiSecret, String oauthToken) { + if (oauthToken == null) { + if (apiKey == null) throw new IllegalArgumentException("Must supply api_key"); + if (apiSecret == null) throw new IllegalArgumentException("Must supply api_secret"); + } + } } diff --git a/cloudinary-http42/src/main/java/com/cloudinary/http42/ApiStrategy.java b/cloudinary-http42/src/main/java/com/cloudinary/http42/ApiStrategy.java index 7c19aeb9..a8aa7c93 100644 --- a/cloudinary-http42/src/main/java/com/cloudinary/http42/ApiStrategy.java +++ b/cloudinary-http42/src/main/java/com/cloudinary/http42/ApiStrategy.java @@ -38,14 +38,15 @@ public ApiResponse callApi(HttpMethod method, Iterable uri, Map uri, Map params, String apiKey, String apiSecret, String contentType, int timeout, String apiUrl) throws Exception { + private ApiResponse getApiResponse(HttpMethod method, Map params, String apiKey, String apiSecret, String oauthToken, String contentType, int timeout, String apiUrl) throws Exception { URIBuilder apiUrlBuilder = new URIBuilder(apiUrl); if (!contentType.equals("json")) { for (Map.Entry param : params.entrySet()) { @@ -105,7 +106,7 @@ private ApiResponse getApiResponse(HttpMethod method, Map params, Str request = new HttpDelete(apiUri); break; } - request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret)); + request.setHeader("Authorization", getAuthorizationHeaderValue(apiKey, apiSecret, oauthToken)); request.setHeader("User-Agent", Cloudinary.USER_AGENT + " ApacheHTTPComponents/4.2"); if (contentType.equals("json")) { JSONObject asJSON = ObjectUtils.toJSON(params); diff --git a/cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java b/cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java index 400e252d..1d1b4232 100644 --- a/cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java +++ b/cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java @@ -79,15 +79,15 @@ public ApiResponse callApi(HttpMethod method, Iterable uri, Map uri, Map uri, Map 0); } + @Test + public void testOAuthToken() { + String message = ""; + try { + api.resource(API_TEST, Collections.singletonMap("oauth_token", "not_a_real_token")); + } catch (Exception e) { + message = e.getMessage(); + } + + assertTrue(message.contains("Invalid token")); + } + @Test public void test05ResourcesByPrefix() throws Exception { // should allow listing resources by prefix @@ -996,7 +1008,7 @@ public void testCinemagraphAnalysisResource() throws Exception { ApiResponse res = api.resource(API_TEST, Collections.singletonMap("cinemagraph_analysis", true)); assertNotNull(res.get("cinemagraph_analysis")); } - + @Test public void testAccessibilityAnalysisResource() throws Exception { ApiResponse res = api.resource(API_TEST, Collections.singletonMap("accessibility_analysis", true));