Skip to content

Commit b477fcd

Browse files
committed
WIP: Android support
1 parent cafccfa commit b477fcd

File tree

3 files changed

+221
-39
lines changed

3 files changed

+221
-39
lines changed

android/src/main/java/io/fullstack/oauth/OAuthManagerDialogFragment.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
9797
}
9898

9999
private void setupWebView(AdvancedWebView webView) {
100-
Log.d(TAG, "Setting webview client");
101100
webView.setWebViewClient(new WebViewClient() {
102101
@Override
103102
public boolean shouldOverrideUrlLoading(WebView view, String url) {
104-
Log.i(TAG, "shouldOverrideUrlLoading: " + url);
105103
interceptUrl(view, url, true);
106104
return true;
107105
}
@@ -116,7 +114,6 @@ public void onReceivedError(WebView view, int code, String desc, String failingU
116114
private boolean interceptUrl(WebView view, String url, boolean loadUrl) {
117115
if (isCallbackUri(url, mController.getCallbackUrl())) {
118116
// We are on callback page
119-
Log.d(TAG, "We got the callback url: " + url);
120117
Uri responseUri = Uri.parse(url);
121118
String oauthToken = responseUri.getQueryParameter("oauth_token");
122119
String oauthVerifier = responseUri.getQueryParameter("oauth_verifier");

android/src/main/java/io/fullstack/oauth/OAuthManagerModule.java

Lines changed: 79 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.IOException;
1919
import java.util.Map;
20+
import java.util.Set;
2021
import java.util.HashMap;
2122
import java.util.List;
2223
import java.util.ArrayList;
@@ -62,8 +63,10 @@
6263
import com.github.scribejava.core.model.Verb;
6364
import com.github.scribejava.core.oauth.OAuth10aService;
6465

65-
interface KeySetterFn {
66-
String setKeyOrDefault(String a, String b);
66+
class ProviderNotConfiguredException extends Exception {
67+
public ProviderNotConfiguredException(String message) {
68+
super(message);
69+
}
6770
}
6871

6972
@SuppressWarnings("WeakerAccess")
@@ -75,12 +78,13 @@ class OAuthManagerModule extends ReactContextBaseJavaModule {
7578

7679
private HashMap _configuration = new HashMap<String, HashMap<String,String>>();
7780
private ArrayList _callbackUrls = new ArrayList<String>();
78-
private SharedPreferences _credentialsStore;
81+
private OAuthManagerStore _credentialsStore;
7982

8083
public OAuthManagerModule(ReactApplicationContext reactContext) {
8184
super(reactContext);
8285
mReactContext = reactContext;
8386

87+
_credentialsStore = OAuthManagerStore.getOAuthManagerStore(mReactContext, TAG, Context.MODE_PRIVATE);
8488
Log.d(TAG, "New instance");
8589
}
8690

@@ -142,17 +146,16 @@ public void configureProvider(
142146
public void authorize(
143147
final String providerName,
144148
@Nullable final ReadableMap params,
145-
final Callback callback) throws Exception
149+
final Callback callback)
146150
{
147-
Log.i(TAG, "authorize called for " + providerName);
148-
149-
HashMap<String,String> cfg = this.getConfiguration(providerName);
150-
final String authVersion = (String) cfg.get("auth_version");
151-
Activity activity = mReactContext.getCurrentActivity();
152-
FragmentManager fragmentManager = activity.getFragmentManager();
153-
String callbackUrl = "http://localhost/" + providerName;
154-
155151
try {
152+
final OAuthManagerModule self = this;
153+
HashMap<String,String> cfg = this.getConfiguration(providerName);
154+
final String authVersion = (String) cfg.get("auth_version");
155+
Activity activity = mReactContext.getCurrentActivity();
156+
FragmentManager fragmentManager = activity.getFragmentManager();
157+
String callbackUrl = "http://localhost/" + providerName;
158+
156159
if (authVersion.equals("1.0")) {
157160
final OAuth10aService service =
158161
OAuthManagerProviders.getApiFor10aProvider(providerName, cfg, callbackUrl);
@@ -163,21 +166,10 @@ public void authorize(
163166
ctrl.requestAuth(new OAuthManagerOnAccessTokenListener() {
164167
public void onRequestTokenError(final Exception ex) {}
165168
public void onOauth1AccessToken(final OAuth1AccessToken accessToken) {
166-
Log.d(TAG, "onAccessToken: " + accessToken.getRawResponse());
167-
WritableMap resp = Arguments.createMap();
168-
WritableMap response = Arguments.createMap();
169-
170-
resp.putString("status", "ok");
171-
response.putString("uuid", accessToken.getParameter("user_id"));
172-
response.putString("provider", providerName);
173-
174-
WritableMap credentials = Arguments.createMap();
175-
credentials.putString("oauth_token", accessToken.getToken());
176-
credentials.putString("oauth_secret", accessToken.getTokenSecret());
177-
response.putMap("credentials", credentials);
178-
179-
resp.putMap("response", response);
169+
_credentialsStore.store(providerName, accessToken);
170+
_credentialsStore.commit();
180171

172+
WritableMap resp = self.accessTokenResponse(providerName, accessToken, authVersion);
181173
callback.invoke(null, resp);
182174
}
183175
});
@@ -237,7 +229,30 @@ public void getSavedAccount(
237229
final ReadableMap options,
238230
final Callback onComplete)
239231
{
240-
Log.i(TAG, "getSavedAccount for " + providerName);
232+
try {
233+
HashMap<String,String> cfg = this.getConfiguration(providerName);
234+
final String authVersion = (String) cfg.get("auth_version");
235+
236+
Log.i(TAG, "getSavedAccount for " + providerName);
237+
238+
if (authVersion.equals("1.0")) {
239+
OAuth1AccessToken token = _credentialsStore.get(providerName, OAuth1AccessToken.class);
240+
Log.d(TAG, "Found token: " + token);
241+
242+
WritableMap resp = this.accessTokenResponse(providerName, token, authVersion);
243+
onComplete.invoke(null, resp);
244+
} else {
245+
246+
}
247+
} catch (ProviderNotConfiguredException ex) {
248+
Log.e(TAG, "Provider not yet configured: " + providerName);
249+
exceptionCallback(ex, onComplete);
250+
} catch (Exception ex) {
251+
Log.e(TAG, "An exception occurred getSavedAccount: " + ex.getMessage());
252+
ex.printStackTrace();
253+
exceptionCallback(ex, onComplete);
254+
}
255+
241256

242257
// try {
243258
// Credential creds = this.loadCredentialForProvider(providerName, options);
@@ -283,7 +298,20 @@ public void getSavedAccount(
283298

284299
@ReactMethod
285300
public void deauthorize(final String providerName, final Callback onComplete) {
286-
Log.i(TAG, "deauthorizing " + providerName);
301+
try {
302+
Log.i(TAG, "deauthorizing " + providerName);
303+
HashMap<String,String> cfg = this.getConfiguration(providerName);
304+
final String authVersion = (String) cfg.get("auth_version");
305+
306+
_credentialsStore.delete(providerName);
307+
308+
WritableMap resp = Arguments.createMap();
309+
resp.putString("status", "ok");
310+
311+
onComplete.invoke(null, resp);
312+
} catch (Exception ex) {
313+
exceptionCallback(ex, onComplete);
314+
}
287315
// try {
288316
// OAuthManager manager = this.getManager(providerName, null, true);
289317
// OAuthCallback<Boolean> cb = new OAuthCallback<Boolean>() {
@@ -340,13 +368,35 @@ private HashMap<String,String> getConfiguration(
340368
final String providerName
341369
) throws Exception {
342370
if (!_configuration.containsKey(providerName)) {
343-
throw new Exception("Provider not configured: " + providerName);
371+
throw new ProviderNotConfiguredException("Provider not configured: " + providerName);
344372
}
345373

346374
HashMap<String,String> cfg = (HashMap) _configuration.get(providerName);
347375
return cfg;
348376
}
349377

378+
private WritableMap accessTokenResponse(
379+
final String providerName,
380+
final OAuth1AccessToken accessToken,
381+
final String oauthVersion
382+
) {
383+
WritableMap resp = Arguments.createMap();
384+
WritableMap response = Arguments.createMap();
385+
386+
resp.putString("status", "ok");
387+
resp.putString("provider", providerName);
388+
response.putString("uuid", accessToken.getParameter("user_id"));
389+
390+
WritableMap credentials = Arguments.createMap();
391+
credentials.putString("oauth_token", accessToken.getToken());
392+
credentials.putString("oauth_secret", accessToken.getTokenSecret());
393+
response.putMap("credentials", credentials);
394+
395+
resp.putMap("response", response);
396+
397+
return resp;
398+
}
399+
350400
// private OAuthManager getManager(
351401
// final String providerName,
352402
// @Nullable final ReadableMap params,
Lines changed: 142 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,162 @@
11
package io.fullstack.oauth;
22

3+
import java.lang.reflect.Type;
4+
import android.content.Context;
35
import android.util.Log;
6+
import java.util.Set;
7+
import java.util.HashMap;
48
import android.content.Context;
59
import android.net.Uri;
610
import android.os.Handler;
711
import android.content.SharedPreferences;
12+
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
813
import com.google.gson.Gson;
9-
// import com.google.gson.reflect.TypeToken;
14+
import android.text.TextUtils;
15+
import java.util.Collection;
16+
17+
import com.github.scribejava.core.model.OAuth1AccessToken;
18+
import com.github.scribejava.core.model.Token;
19+
import com.google.gson.reflect.TypeToken;
1020

1121
public class OAuthManagerStore {
12-
private final SharedPreferences prefs;
22+
private static final String TAG = "OAuthManagerStore";
23+
private static final String MAP_TAG = "CredentialList";
24+
// private static final Type MAP_TYPE = new TypeToken<HashMap<String, Credential>>() {}.getType();
25+
private static OAuthManagerStore oauthManagerStore;
26+
private Context context;
27+
28+
private SharedPreferences prefs;
29+
private SharedPreferences.Editor editor;
30+
private OnSharedPreferenceChangeListener listener;
31+
32+
public OAuthManagerStore(Context ctx) {
33+
this(ctx, TAG, Context.MODE_PRIVATE);
34+
}
1335

1436
public OAuthManagerStore(Context ctx, String name) {
37+
this(ctx, name, Context.MODE_PRIVATE);
38+
}
39+
40+
public OAuthManagerStore(Context ctx, String name, int mode) {
1541
// setup credential store
16-
this.prefs =
17-
ctx.getSharedPreferences(name, Context.MODE_PRIVATE);
42+
this.context = ctx;
43+
this.prefs = ctx.getSharedPreferences(name, Context.MODE_PRIVATE);
44+
editor = this.prefs.edit();
45+
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
46+
@Override
47+
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
48+
Log.d(TAG, "Preferences changed: " + key);
49+
}
50+
};
51+
prefs.registerOnSharedPreferenceChangeListener(listener);
52+
}
53+
54+
public static OAuthManagerStore getOAuthManagerStore(Context ctx, String name, int mode) {
55+
if (oauthManagerStore == null) {
56+
oauthManagerStore = new OAuthManagerStore(ctx, name, mode);
57+
}
58+
return oauthManagerStore;
1859
}
1960

20-
public void store(String name) {
21-
// TODO
61+
public void store(String providerName, final OAuth1AccessToken accessToken) {
62+
if (accessToken == null) {
63+
throw new IllegalArgumentException("Token is null");
64+
}
65+
if (providerName.equals("") || providerName == null) {
66+
throw new IllegalArgumentException("Provider is null");
67+
}
68+
editor.putString(providerName, new Gson().toJson(accessToken));
2269
}
2370

24-
public void load(String name) {
71+
public void commit() {
72+
editor.commit();
73+
}
74+
75+
public <T> T get(String providerName, Class<T> a) {
76+
String gson = this.prefs.getString(providerName, null);
77+
if (gson == null) {
78+
return null;
79+
} else {
80+
try {
81+
return new Gson().fromJson(gson, a);
82+
} catch (Exception ex) {
83+
throw new IllegalArgumentException("Object storaged with key " + providerName + " is instanceof other class");
84+
}
85+
}
86+
}
2587

88+
public void delete(String providerName) {
89+
editor.remove(providerName);
90+
this.commit();
2691
}
92+
93+
// private class CredentialList {
94+
// private HashMap<String, Credential> _credentials;
95+
// private SharedPreferences prefs;
96+
97+
// public CredentialList(final SharedPreferences prefs) {
98+
// this.prefs = prefs;
99+
// _credentials = this.load();
100+
// }
101+
102+
// public CredentialList add(String providerName, OAuth1AccessToken token) {
103+
// Credential cred = new Credential(providerName, token);
104+
// if (_credentials == null) {
105+
// _credentials = this.load();
106+
// }
107+
// Log.d(TAG, "adding " + providerName + " = " + cred + " ( " + new Gson().toJson(cred) + ")");
108+
// _credentials.put(providerName, cred);
109+
// this.saveMap();
110+
// return this;
111+
// }
112+
113+
// public Set<String> keys() {
114+
// return _credentials.keySet();
115+
// }
116+
117+
// public Credential getCredentialFor(String providerName) {
118+
// return _credentials.get(providerName);
119+
// }
120+
121+
// public void delete(String providerName) {
122+
// SharedPreferences.Editor editor = prefs.edit();
123+
// editor.remove(providerName);
124+
// }
125+
126+
// public void saveMap() {
127+
// SharedPreferences.Editor editor = prefs.edit();
128+
// editor.putString(MAP_TAG, new Gson().toJson(this._credentials));
129+
// editor.commit();
130+
// this.load();
131+
// }
132+
133+
// public HashMap<String, Credential> load() {
134+
// _credentials = new Gson().fromJson(prefs.getString(MAP_TAG, null), MAP_TYPE);
135+
// return _credentials;
136+
// }
137+
// }
138+
139+
// private class Credential {
140+
// private String providerName;
141+
// private OAuth1AccessToken oauth1AccessToken;
142+
// private String authVersion;
143+
144+
// public Credential(String providerName, OAuth1AccessToken token) {
145+
// this.providerName = providerName;
146+
// this.oauth1AccessToken = token;
147+
// this.authVersion = "1.0";
148+
// }
149+
150+
// public Token getToken() {
151+
// if (authVersion.equals("1.0")) {
152+
// return this.oauth1AccessToken;
153+
// } else {
154+
// return null;
155+
// }
156+
// }
157+
158+
// public Credential createInstance(Type type) {
159+
// return new Credential()
160+
// }
161+
// }
27162
}

0 commit comments

Comments
 (0)