From f0b9f140ac4e16e387aec1d805bf3dc6fb9e835f Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Tue, 13 Aug 2019 22:28:56 -0700 Subject: [PATCH 1/6] fix Gradle --- build.gradle | 4 ++-- library/build.gradle | 50 ++++++++++++-------------------------------- 2 files changed, 15 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index edb3243..8e6261d 100644 --- a/build.gradle +++ b/build.gradle @@ -10,11 +10,11 @@ buildscript { } plugins { - id "com.jfrog.bintray" version "1.7.3" + id "com.jfrog.bintray" version "1.8.4" } plugins { - id "com.github.dcendents.android-maven" version "2.0" + id "com.github.dcendents.android-maven" version "2.1" } bintray { diff --git a/library/build.gradle b/library/build.gradle index 471e149..0b64ac1 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -54,49 +54,16 @@ android { } } -install { - repositories.mavenInstaller { - pom.project { - name POM_NAME - description POM_DESCRIPTION - url POM_URL - inceptionYear '2016' - - packaging 'aar' - group GROUP - artifactId POM_ARTIFACT_ID - version VERSION_NAME - - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - scm { - connection POM_SCM_URL - url POM_SCM_CONNECTION - - } - developers { - developer { - name 'CodePath, Inc.' - } - } - } - } -} - bintray { - user = System.getenv('BINTRAY_USER') - key = System.getenv('BINTRAY_API_KEY') + user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') + key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') + configurations = ['archives'] // needs apply plugin 'com.jfrog.bintray' to work pkg { repo = 'maven' name = 'android-oauth-handler' -// userOrg = 'codepath' + userOrg = 'codepath' licenses = ['Apache-2.0'] vcsUrl = 'https://github.com/codepath/android-oauth-handler.git' version { @@ -109,6 +76,15 @@ bintray { } +task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + archiveClassifier.set("sources") +} + +artifacts { + archives sourcesJar +} + ext { supportVersion = '28.0.0' } From 2ba284d231abff1ffded726287f115a346b6ba44 Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Sun, 18 Aug 2019 21:13:43 -0700 Subject: [PATCH 2/6] delete CodePath utils library, move GenericsUtil into this dir --- library/libs/codepath-utils.jar | Bin 4793 -> 0 bytes .../java/com/codepath/utils/GenericsUtil.java | 80 ++++++++++++++++++ 2 files changed, 80 insertions(+) delete mode 100755 library/libs/codepath-utils.jar create mode 100644 library/src/main/java/com/codepath/utils/GenericsUtil.java diff --git a/library/libs/codepath-utils.jar b/library/libs/codepath-utils.jar deleted file mode 100755 index 7294db1dfb79f406c8ccc7c240317ffba0bcc13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4793 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 diff --git a/library/src/main/java/com/codepath/utils/GenericsUtil.java b/library/src/main/java/com/codepath/utils/GenericsUtil.java new file mode 100644 index 0000000..66298f9 --- /dev/null +++ b/library/src/main/java/com/codepath/utils/GenericsUtil.java @@ -0,0 +1,80 @@ +package com.codepath.utils; + +import java.lang.reflect.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@SuppressWarnings("rawtypes") +public class GenericsUtil { + public static List> getTypeArguments(Class baseClass, + Class childClass) { + Map resolvedTypes = new HashMap(); + Type type = childClass; + // start walking up the inheritance hierarchy until we hit baseClass + while (!getClass(type).equals(baseClass)) { + if (type instanceof Class) { + type = ((Class) type).getGenericSuperclass(); + } else { + ParameterizedType parameterizedType = (ParameterizedType) type; + assert parameterizedType != null; + Class rawType = (Class) parameterizedType.getRawType(); + + Type[] actualTypeArguments = parameterizedType + .getActualTypeArguments(); + TypeVariable[] typeParameters = rawType.getTypeParameters(); + for (int i = 0; i < actualTypeArguments.length; i++) { + resolvedTypes + .put(typeParameters[i], actualTypeArguments[i]); + } + + if (!rawType.equals(baseClass)) { + type = rawType.getGenericSuperclass(); + } + } + } + + // finally, for each actual type argument provided to baseClass, + // determine (if possible) + // the raw class for that type argument. + Type[] actualTypeArguments; + if (type instanceof Class) { + actualTypeArguments = ((Class) type).getTypeParameters(); + } else { + assert !(type == null); + actualTypeArguments = ((ParameterizedType) type) + .getActualTypeArguments(); + } + List> typeArgumentsAsClasses = new ArrayList>(); + // resolve types by chasing down type variables. + for (Type baseType : actualTypeArguments) { + while (resolvedTypes.containsKey(baseType)) { + baseType = resolvedTypes.get(baseType); + } + typeArgumentsAsClasses.add(getClass(baseType)); + } + return typeArgumentsAsClasses; + } + + private static Class getClass(Type type) { + if (type instanceof Class) { + return (Class) type; + } else if (type instanceof ParameterizedType) { + return getClass(((ParameterizedType) type).getRawType()); + } else if (type instanceof GenericArrayType) { + Type componentType = ((GenericArrayType) type) + .getGenericComponentType(); + Class componentClass = getClass(componentType); + if (componentClass != null) { + return Array.newInstance(componentClass, 0).getClass(); + } else { + return null; + } + } else { + return null; + } + } + +} From 5cb29ef05e8e2b915f564a5b47df928664a1a458 Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Sun, 18 Aug 2019 21:14:18 -0700 Subject: [PATCH 3/6] Bump Async Http Client version --- library/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index 0b64ac1..51953bc 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -91,7 +91,7 @@ ext { dependencies { api "androidx.appcompat:appcompat:1.0.2" - api 'com.codepath.libraries:asynchttpclient:0.0.5' + api 'com.codepath.libraries:asynchttpclient:0.0.8' implementation files('libs/codepath-utils.jar') api 'com.github.scribejava:scribejava-apis:4.1.1' api 'com.github.scribejava:scribejava-httpclient-okhttp:4.1.1' From bcbc33b293c883e883bac9531b6ea1f8e035101c Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Sun, 18 Aug 2019 21:14:58 -0700 Subject: [PATCH 4/6] kill this line --- library/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index 51953bc..c19833d 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -92,7 +92,6 @@ ext { dependencies { api "androidx.appcompat:appcompat:1.0.2" api 'com.codepath.libraries:asynchttpclient:0.0.8' - implementation files('libs/codepath-utils.jar') api 'com.github.scribejava:scribejava-apis:4.1.1' api 'com.github.scribejava:scribejava-httpclient-okhttp:4.1.1' implementation 'se.akerfeldt:okhttp-signpost:1.1.0' From 0a22b0db3192b2b053a75e7b672718a82fc058ab Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Sun, 18 Aug 2019 21:15:36 -0700 Subject: [PATCH 5/6] bump version --- library/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index c19833d..4be67ea 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -8,7 +8,7 @@ ext { GROUP = 'com.codepath.libraries' BASE_VERSION = "2.0" - VERSION_NAME = "2.0.0" + VERSION_NAME = "2.0.1" POM_PACKAGING = "aar" POM_DESCRIPTION = "CodePath OAuth Handler" From 92a5de212ddfbb77dd9aae99e3a69650edd13f84 Mon Sep 17 00:00:00 2001 From: Roger Hu Date: Sun, 18 Aug 2019 22:53:26 -0700 Subject: [PATCH 6/6] Support OAuth2 tokens too --- library/build.gradle | 2 +- .../codepath/oauth/OAuthAsyncHttpClient.java | 30 ++++++++++++++++++- .../com/codepath/oauth/OAuthBaseClient.java | 15 ++++++---- .../com/codepath/oauth/OAuthTokenClient.java | 3 +- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 4be67ea..d44f271 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -8,7 +8,7 @@ ext { GROUP = 'com.codepath.libraries' BASE_VERSION = "2.0" - VERSION_NAME = "2.0.1" + VERSION_NAME = "2.1.0" POM_PACKAGING = "aar" POM_DESCRIPTION = "CodePath OAuth Handler" diff --git a/library/src/main/java/com/codepath/oauth/OAuthAsyncHttpClient.java b/library/src/main/java/com/codepath/oauth/OAuthAsyncHttpClient.java index 8b345e7..2ddfc23 100644 --- a/library/src/main/java/com/codepath/oauth/OAuthAsyncHttpClient.java +++ b/library/src/main/java/com/codepath/oauth/OAuthAsyncHttpClient.java @@ -3,8 +3,16 @@ import com.codepath.asynchttpclient.AsyncHttpClient; import com.facebook.stetho.okhttp3.StethoInterceptor; import com.github.scribejava.core.model.OAuth1AccessToken; +import com.github.scribejava.core.model.OAuth2AccessToken; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +import okhttp3.Interceptor; import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; import se.akerfeldt.okhttp.signpost.OkHttpOAuthConsumer; import se.akerfeldt.okhttp.signpost.SigningInterceptor; @@ -17,10 +25,30 @@ protected OAuthAsyncHttpClient(OkHttpClient httpClient) { public static OAuthAsyncHttpClient create(String consumerKey, String consumerSecret, OAuth1AccessToken token) { OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer(consumerKey, consumerSecret); consumer.setTokenWithSecret(token.getToken(), token.getTokenSecret()); - OkHttpClient httpClient = new OkHttpClient.Builder().addNetworkInterceptor(new StethoInterceptor()).addInterceptor(new SigningInterceptor(consumer)).build(); + OkHttpClient httpClient = new OkHttpClient.Builder() + .addNetworkInterceptor(new StethoInterceptor()) + .addInterceptor(new SigningInterceptor(consumer)).build(); OAuthAsyncHttpClient asyncHttpClient = new OAuthAsyncHttpClient(httpClient); return asyncHttpClient; } + public static OAuthAsyncHttpClient create(final OAuth2AccessToken token) { + final String bearer = String.format("Bearer %s", token.getAccessToken()); + + OkHttpClient httpClient = new OkHttpClient.Builder() + .addNetworkInterceptor(new StethoInterceptor()) + .addInterceptor(new Interceptor() { + @NotNull + @Override + public Response intercept(@NotNull Chain chain) throws IOException { + Request originalRequest = chain.request(); + Request authedRequest = originalRequest.newBuilder().header("Authorization", bearer).build(); + return chain.proceed(authedRequest); + } + }).build(); + + OAuthAsyncHttpClient asyncHttpClient = new OAuthAsyncHttpClient(httpClient); + return asyncHttpClient; + } } \ No newline at end of file diff --git a/library/src/main/java/com/codepath/oauth/OAuthBaseClient.java b/library/src/main/java/com/codepath/oauth/OAuthBaseClient.java index 04ef5fc..1b0dcff 100755 --- a/library/src/main/java/com/codepath/oauth/OAuthBaseClient.java +++ b/library/src/main/java/com/codepath/oauth/OAuthBaseClient.java @@ -5,6 +5,8 @@ import android.content.SharedPreferences; import android.net.Uri; +import androidx.annotation.Nullable; + import com.github.scribejava.core.builder.api.BaseApi; import com.github.scribejava.core.model.OAuth1AccessToken; import com.github.scribejava.core.model.OAuth1RequestToken; @@ -46,11 +48,11 @@ public static OAuthBaseClient getInstance(Class klass return instance; } - public OAuthBaseClient(Context c, final BaseApi apiInstance, String consumerUrl, final String consumerKey, final String consumerSecret, String callbackUrl) { + public OAuthBaseClient(Context c, final BaseApi apiInstance, String consumerUrl, final String consumerKey, final String consumerSecret, @Nullable String scope, String callbackUrl) { this.baseUrl = consumerUrl; this.callbackUrl = callbackUrl; tokenClient = new OAuthTokenClient(apiInstance, consumerKey, - consumerSecret, callbackUrl, new OAuthTokenClient.OAuthTokenHandler() { + consumerSecret, callbackUrl, scope, new OAuthTokenClient.OAuthTokenHandler() { // Store request token and launch the authorization URL in the browser @Override @@ -86,8 +88,7 @@ public void onReceivedAccessToken(Token accessToken, String oAuthVersion) { editor.commit(); } else if (oAuthVersion == OAUTH2_VERSION) { OAuth2AccessToken oAuth2AccessToken = (OAuth2AccessToken) accessToken; - - //TODO(rhu) - create client for OAuth2 cases + instantiateClient(consumerKey, consumerSecret, oAuth2AccessToken); tokenClient.setAccessToken(accessToken); editor.putString(OAuthConstants.TOKEN, oAuth2AccessToken.getAccessToken()); editor.putString(OAuthConstants.SCOPE, oAuth2AccessToken.getScope()); @@ -122,8 +123,10 @@ public void instantiateClient(String consumerKey, String consumerSecret, Token t if (token instanceof OAuth1AccessToken) { client = OAuthAsyncHttpClient.create(consumerKey, consumerSecret, (OAuth1AccessToken)(token)); + } else if (token instanceof OAuth2AccessToken){ + client = OAuthAsyncHttpClient.create((OAuth2AccessToken) token); } else { - + throw new IllegalStateException("unrecognized token type" + token); } } @@ -138,7 +141,7 @@ public void authorize(Uri uri, OAuthAccessHandler handler) { this.accessHandler = handler; if (checkAccessToken() == null && uri != null) { // TODO: check UriServiceCallback with intent:// scheme - tokenClient.fetchAccessToken(getOAuth1RequestToken(), uri); + tokenClient.fetchAccessToken(checkAccessToken(), uri); } else if (checkAccessToken() != null) { // already have access token this.accessHandler.onLoginSuccess(); diff --git a/library/src/main/java/com/codepath/oauth/OAuthTokenClient.java b/library/src/main/java/com/codepath/oauth/OAuthTokenClient.java index b92c578..03629b4 100755 --- a/library/src/main/java/com/codepath/oauth/OAuthTokenClient.java +++ b/library/src/main/java/com/codepath/oauth/OAuthTokenClient.java @@ -30,7 +30,7 @@ public class OAuthTokenClient { // Requires the apiClass, consumerKey, consumerSecret and callbackUrl along with the TokenHandler public OAuthTokenClient(BaseApi apiInstance, String consumerKey, String consumerSecret, String callbackUrl, - OAuthTokenHandler handler) { + String scope, OAuthTokenHandler handler) { this.apiInstance = apiInstance; this.handler = handler; if (callbackUrl == null) { callbackUrl = OAuthConstants.OUT_OF_BAND; }; @@ -38,6 +38,7 @@ public OAuthTokenClient(BaseApi apiInstance, String consumerKey, String consumer .apiKey(consumerKey) .apiSecret(consumerSecret).callback(callbackUrl) .httpClientConfig(OkHttpHttpClientConfig.defaultConfig()) + .scope(scope) // OAuth2 requires scope .build(apiInstance); }