Chromium Code Reviews| Index: remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java |
| diff --git a/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java b/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java |
| index a00038b175160661dc08b0d37fcc64ae0f925456..1c43d74c66152a84fc4cb85867e580671579ca1f 100644 |
| --- a/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java |
| +++ b/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java |
| @@ -10,10 +10,12 @@ import android.content.ComponentName; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.net.Uri; |
| +import android.text.TextUtils; |
| import android.util.Base64; |
| import android.util.Log; |
| import java.security.SecureRandom; |
| +import java.util.ArrayList; |
| import java.util.HashMap; |
| /** |
| @@ -51,46 +53,42 @@ public class ThirdPartyTokenFetcher { |
| */ |
| private final String mState; |
| - /** URL of the third party login page. */ |
| - private final String mTokenUrl; |
| - |
| - /** The client identifier. See http://tools.ietf.org/html/rfc6749#section-2.2. */ |
| - private final String mClientId; |
| - |
| - /** The scope of access request. See http://tools.ietf.org/html/rfc6749#section-3.3. */ |
| - private final String mScope; |
| - |
| private final Callback mCallback; |
| + /** The list of TokenUrls allowed by the domain. */ |
| + private final ArrayList<String> mTokenUrlPatterns; |
| + |
| private final String mRedirectUriScheme; |
| private final String mRedirectUri; |
| public ThirdPartyTokenFetcher(Activity context, |
| - String tokenUrl, |
| - String clientId, |
| - String scope, |
| + ArrayList<String> tokenUrlPatterns, |
| Callback callback) { |
| this.mContext = context; |
| - this.mTokenUrl = tokenUrl; |
| - this.mClientId = clientId; |
| this.mState = generateXsrfToken(); |
| - this.mScope = scope; |
| this.mCallback = callback; |
| + this.mTokenUrlPatterns = tokenUrlPatterns; |
| this.mRedirectUriScheme = context.getApplicationContext().getPackageName(); |
| this.mRedirectUri = mRedirectUriScheme + "://" + REDIRECT_URI_HOST; |
| } |
| - public void fetchToken() { |
| - Uri.Builder uriBuilder = Uri.parse(mTokenUrl).buildUpon(); |
| - uriBuilder.appendQueryParameter("redirect_uri", this.mRedirectUri); |
| - uriBuilder.appendQueryParameter("scope", mScope); |
| - uriBuilder.appendQueryParameter("client_id", mClientId); |
| - uriBuilder.appendQueryParameter("state", mState); |
| - uriBuilder.appendQueryParameter("response_type", RESPONSE_TYPE); |
| + /** |
| + * @param tokenUrl URL of the third party login page. |
| + * @param clientId The client identifier. See http://tools.ietf.org/html/rfc6749#section-2.2. |
| + * @param scope The scope of access request. See http://tools.ietf.org/html/rfc6749#section-3.3. |
| + */ |
| + public void fetchToken(String tokenUrl, String clientId, String scope) { |
| + if (!isValidTokenUrl(tokenUrl)) { |
| + failFetchToken( |
| + "Token URL does not match the domain\'s allowed URL patterns." + |
| + " URL: " + tokenUrl + |
| + ", patterns: " + TextUtils.join(",", this.mTokenUrlPatterns)); |
| + return; |
| + } |
| - Uri uri = uriBuilder.build(); |
| + Uri uri = buildRequestUri(tokenUrl, clientId, scope); |
| Intent intent = new Intent(Intent.ACTION_VIEW, uri); |
| Log.i("ThirdPartyAuth", "fetchToken() url:" + uri); |
| OAuthRedirectActivity.setEnabled(mContext, true); |
| @@ -102,6 +100,27 @@ public class ThirdPartyTokenFetcher { |
| } |
| } |
| + private Uri buildRequestUri(String tokenUrl, String clientId, String scope) { |
| + Uri.Builder uriBuilder = Uri.parse(tokenUrl).buildUpon(); |
| + uriBuilder.appendQueryParameter("redirect_uri", this.mRedirectUri); |
| + uriBuilder.appendQueryParameter("scope", scope); |
| + uriBuilder.appendQueryParameter("client_id", clientId); |
| + uriBuilder.appendQueryParameter("state", mState); |
| + uriBuilder.appendQueryParameter("response_type", RESPONSE_TYPE); |
| + |
| + return uriBuilder.build(); |
| + } |
| + |
| + /** Verify the host-supplied URL matches the domain's allowed URL patterns. */ |
|
Lambros
2014/06/18 23:29:06
nit: s/Verify/Verifies. Function comments are desc
kelvinp
2014/06/19 01:03:50
Done.
|
| + private boolean isValidTokenUrl(String tokenUrl) { |
| + for (String pattern : mTokenUrlPatterns) { |
| + if (tokenUrl.matches(pattern)) { |
| + return true; |
| + } |
| + } |
| + return false; |
| + } |
| + |
| private boolean isValidIntent(Intent intent) { |
| assert intent != null; |