Index: android_webview/glue/java/src/com/android/webview/chromium/TokenBindingManagerAdapter.java |
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/TokenBindingManagerAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/TokenBindingManagerAdapter.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3bb802808645acf76b7f4ee1f2c5194c2e9b390e |
--- /dev/null |
+++ b/android_webview/glue/java/src/com/android/webview/chromium/TokenBindingManagerAdapter.java |
@@ -0,0 +1,105 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package com.android.webview.chromium; |
+ |
+import android.net.Uri; |
+import android.webkit.TokenBindingService; |
+import android.webkit.TokenBindingService.TokenBindingKey; |
+import android.webkit.ValueCallback; |
+ |
+import org.chromium.android_webview.AwTokenBindingManager; |
+ |
+import java.security.KeyPair; |
+ |
+/** |
+ * Chromium implementation of TokenBindingManager. The API requires |
+ * all access to TokenBindingManager to be on UI thread, so we start the |
+ * chromium engines with this assumption. |
+ */ |
+public class TokenBindingManagerAdapter extends TokenBindingService { |
+ |
+ private AwTokenBindingManager mTokenBindingManager = new AwTokenBindingManager(); |
+ private WebViewChromiumFactoryProvider mProvider; |
+ private boolean mEnabled; |
+ |
+ TokenBindingManagerAdapter(WebViewChromiumFactoryProvider provider) { |
+ mProvider = provider; |
+ } |
+ |
+ @Override |
+ public void enableTokenBinding() { |
+ // We cannot start the chromium engine yet, since doing so would |
+ // initialize the UrlRequestContextGetter and then it would be too |
+ // late to enable token binding. |
+ if (mProvider.hasStarted()) { |
+ throw new IllegalStateException( |
+ "Token binding cannot be enabled after webview creation"); |
+ } |
+ mEnabled = true; |
+ mTokenBindingManager.enableTokenBinding(); |
+ } |
+ |
+ @Override |
+ public void getKey(Uri origin, |
+ String[] algorithm, |
+ final ValueCallback<TokenBindingKey> callback) { |
+ startChromiumEngine(); |
+ if (algorithm != null && algorithm.length == 0) { |
+ throw new IllegalArgumentException("algorithms cannot be empty"); |
+ } |
+ if (algorithm != null) { |
+ boolean found = false; |
+ for (String alg:algorithm) { |
+ if (alg.equals(TokenBindingService.KEY_ALGORITHM_ECDSAP256)) { |
+ found = true; break; |
+ } |
+ } |
+ if (!found) { |
+ throw new IllegalArgumentException("no supported algorithm found"); |
+ } |
+ } |
+ // Only return the KeyPair for now. We retrieve the key from Channel Id |
+ // store which does not provide a way to set/retrieve the Token |
+ // Binding algorithms yet. |
+ ValueCallback<KeyPair> newCallback = new ValueCallback<KeyPair>() { |
+ @Override |
+ public void onReceiveValue(final KeyPair value) { |
+ TokenBindingKey key = new TokenBindingKey() { |
+ @Override |
+ public KeyPair getKeyPair() { |
+ return value; |
+ } |
+ @Override |
+ public String getAlgorithm() { |
+ return TokenBindingService.KEY_ALGORITHM_ECDSAP256; |
+ } |
+ }; |
+ callback.onReceiveValue(key); |
+ } |
+ }; |
+ mTokenBindingManager.getKey(origin, null, newCallback); |
+ } |
+ |
+ @Override |
+ public void deleteKey(Uri origin, |
+ ValueCallback<Boolean> callback) { |
+ startChromiumEngine(); |
+ mTokenBindingManager.deleteKey(origin, callback); |
+ } |
+ |
+ @Override |
+ public void deleteAllKeys(ValueCallback<Boolean> callback) { |
+ startChromiumEngine(); |
+ mTokenBindingManager.deleteAllKeys(callback); |
+ } |
+ |
+ private void startChromiumEngine() { |
+ if (!mEnabled) { |
+ throw new IllegalStateException("Token binding is not enabled"); |
+ } |
+ // Make sure chromium engine is running. |
+ mProvider.startYourEngines(false); |
+ } |
+} |