Commit 41ad73f8 authored by Adam Langley's avatar Adam Langley Committed by Commit Bot

webauthn: wire up link checkbox.

If one unchecks the checkbox in the QR-scanning dialog, the phone is no
longer linked to the desktop.

BUG=1002262

Change-Id: I9c6d97637ba5361b6d1f24f4d270f172d7e15363
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2527888Reviewed-by: default avatarAdam Langley <agl@chromium.org>
Reviewed-by: default avatarMartin Kreichgauer <martinkr@google.com>
Commit-Queue: Adam Langley <agl@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827461}
parent 9a18ecfa
...@@ -440,9 +440,9 @@ class CableAuthenticator { ...@@ -440,9 +440,9 @@ class CableAuthenticator {
* @param value contents of the QR code, which will be a valid caBLE * @param value contents of the QR code, which will be a valid caBLE
* URL, i.e. "fido://"... * URL, i.e. "fido://"...
*/ */
void onQRCode(String value) { void onQRCode(String value, boolean link) {
assert mTaskRunner.belongsToCurrentThread(); assert mTaskRunner.belongsToCurrentThread();
CableAuthenticatorJni.get().startQR(this, getName(), value); CableAuthenticatorJni.get().startQR(this, getName(), value, link);
// TODO: show the user an error if that returned false. // TODO: show the user an error if that returned false.
// that indicates that the QR code was invalid. // that indicates that the QR code was invalid.
} }
...@@ -558,8 +558,8 @@ class CableAuthenticator { ...@@ -558,8 +558,8 @@ class CableAuthenticator {
* should be human-meaningful. The qrUrl must be a caBLE URL, i.e. starting with * should be human-meaningful. The qrUrl must be a caBLE URL, i.e. starting with
* "fido://c1/" * "fido://c1/"
*/ */
boolean startQR( boolean startQR(CableAuthenticator cableAuthenticator, String authenticatorName,
CableAuthenticator cableAuthenticator, String authenticatorName, String qrUrl); String qrUrl, boolean link);
/** /**
* unlink causes the root secret to be rotated and the FCM token to be rotated. This * unlink causes the root secret to be rotated and the FCM token to be rotated. This
......
...@@ -183,9 +183,9 @@ public class CableAuthenticatorUI ...@@ -183,9 +183,9 @@ public class CableAuthenticatorUI
*/ */
@Override @Override
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
public void onQRCode(String value) { public void onQRCode(String value, boolean link) {
setHeader(R.style.step1); setHeader(R.style.step1);
mAuthenticator.onQRCode(value); mAuthenticator.onQRCode(value, link);
} }
void onStatus(int code) { void onStatus(int code) {
......
...@@ -12,6 +12,7 @@ import android.util.SparseArray; ...@@ -12,6 +12,7 @@ import android.util.SparseArray;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CheckBox;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
...@@ -42,10 +43,11 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback { ...@@ -42,10 +43,11 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback {
* Receives a single call containing the decoded QR value. It will * Receives a single call containing the decoded QR value. It will
* begin with FIDO_QR_PREFIX. * begin with FIDO_QR_PREFIX.
*/ */
public static interface Callback { void onQRCode(String value); } public static interface Callback { void onQRCode(String value, boolean link); }
private final Callback mCallback; private final Callback mCallback;
private BarcodeDetector mQRScanner; private BarcodeDetector mQRScanner;
private CheckBox mLinkCheckbox;
private CameraView mCameraView; private CameraView mCameraView;
private ByteBuffer mBuffer; private ByteBuffer mBuffer;
private boolean mDismissed; private boolean mDismissed;
...@@ -62,6 +64,8 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback { ...@@ -62,6 +64,8 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback {
mCameraView = v.findViewById(R.id.camera_view); mCameraView = v.findViewById(R.id.camera_view);
mCameraView.setCallback(this); mCameraView.setCallback(this);
mCameraView.setDisplay(getActivity().getWindowManager().getDefaultDisplay()); mCameraView.setDisplay(getActivity().getWindowManager().getDefaultDisplay());
mLinkCheckbox = v.findViewById(R.id.link_checkbox);
return v; return v;
} }
...@@ -126,7 +130,7 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback { ...@@ -126,7 +130,7 @@ class QRScanDialog extends DialogFragment implements Camera.PreviewCallback {
for (int i = 0; i < barcodes.size(); i++) { for (int i = 0; i < barcodes.size(); i++) {
String value = barcodes.valueAt(i).rawValue; String value = barcodes.valueAt(i).rawValue;
if (value.startsWith(FIDO_QR_PREFIX)) { if (value.startsWith(FIDO_QR_PREFIX)) {
mCallback.onQRCode(value); mCallback.onQRCode(value, mLinkCheckbox.isChecked());
dismiss(); dismiss();
return; return;
} }
......
...@@ -477,7 +477,8 @@ static jboolean JNI_CableAuthenticator_StartQR( ...@@ -477,7 +477,8 @@ static jboolean JNI_CableAuthenticator_StartQR(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& cable_authenticator, const JavaParamRef<jobject>& cable_authenticator,
const JavaParamRef<jstring>& authenticator_name, const JavaParamRef<jstring>& authenticator_name,
const JavaParamRef<jstring>& qr_url) { const JavaParamRef<jstring>& qr_url,
jboolean link) {
GlobalData& global_data = GetGlobalData(); GlobalData& global_data = GetGlobalData();
const std::string& qr_string = ConvertJavaStringToUTF8(qr_url); const std::string& qr_string = ConvertJavaStringToUTF8(qr_url);
base::Optional<device::cablev2::qr::Components> decoded_qr( base::Optional<device::cablev2::qr::Components> decoded_qr(
...@@ -492,7 +493,8 @@ static jboolean JNI_CableAuthenticator_StartQR( ...@@ -492,7 +493,8 @@ static jboolean JNI_CableAuthenticator_StartQR(
std::make_unique<AndroidPlatform>(env, cable_authenticator), std::make_unique<AndroidPlatform>(env, cable_authenticator),
global_data.network_context, global_data.root_secret, global_data.network_context, global_data.root_secret,
ConvertJavaStringToUTF8(authenticator_name), decoded_qr->secret, ConvertJavaStringToUTF8(authenticator_name), decoded_qr->secret,
decoded_qr->peer_identity, global_data.registration->contact_id()); decoded_qr->peer_identity,
link ? global_data.registration->contact_id() : base::nullopt);
return true; return true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment