Commit 3e78a0a0 authored by Adam Langley's avatar Adam Langley Committed by Commit Bot

webauthn: allow USB or QR caBLE transactions to preempt FCM.

If an FCM transactions triggers but then one happens to plug in a USB
cable, the mobile side hits this DCHECK. But it's fine to cancel the FCM
transaction if the user has taken action to try another channel.

Also, drop the notification if the FCM transaction is deleted.

BUG=1002262

Change-Id: I857016e31a0a3d56ee17f54ca4eecb4e6b3f9fdf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2511974Reviewed-by: default avatarMartin Kreichgauer <martinkr@google.com>
Commit-Queue: Adam Langley <agl@chromium.org>
Cr-Commit-Position: refs/heads/master@{#823842}
parent 912c0fd2
...@@ -526,6 +526,13 @@ class CableAuthenticator { ...@@ -526,6 +526,13 @@ class CableAuthenticator {
notificationManager.notify(NOTIFICATION_CHANNEL_ID, ID, builder.build()); notificationManager.notify(NOTIFICATION_CHANNEL_ID, ID, builder.build());
} }
@CalledByNative
public static void dropNotification() {
Context context = ContextUtils.getApplicationContext();
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
notificationManager.cancel(NOTIFICATION_CHANNEL_ID, ID);
}
@NativeMethods @NativeMethods
interface Natives { interface Natives {
/** /**
......
...@@ -202,6 +202,12 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform { ...@@ -202,6 +202,12 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform {
: env_(env), : env_(env),
interaction_needed_callback_(std::move(interaction_needed_callback)) {} interaction_needed_callback_(std::move(interaction_needed_callback)) {}
~AndroidPlatform() override {
if (notification_showing_) {
Java_CableAuthenticator_dropNotification(env_);
}
}
// Platform: // Platform:
void MakeCredential(std::unique_ptr<MakeCredentialParams> params) override { void MakeCredential(std::unique_ptr<MakeCredentialParams> params) override {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
...@@ -289,6 +295,7 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform { ...@@ -289,6 +295,7 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform {
void NeedInteractive() { void NeedInteractive() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
notification_showing_ = true;
std::move(interaction_needed_callback_) std::move(interaction_needed_callback_)
.Run(base::BindOnce(&AndroidPlatform::OnInteractionReady, .Run(base::BindOnce(&AndroidPlatform::OnInteractionReady,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
...@@ -299,11 +306,13 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform { ...@@ -299,11 +306,13 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform {
void OnInteractionReady(ScopedJavaGlobalRef<jobject> cable_authenticator) { void OnInteractionReady(ScopedJavaGlobalRef<jobject> cable_authenticator) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!cable_authenticator_); DCHECK(!cable_authenticator_);
DCHECK(notification_showing_);
DCHECK(env_->IsInstanceOf( DCHECK(env_->IsInstanceOf(
cable_authenticator.obj(), cable_authenticator.obj(),
org_chromium_chrome_browser_webauth_authenticator_CableAuthenticator_clazz( org_chromium_chrome_browser_webauth_authenticator_CableAuthenticator_clazz(
env_))); env_)));
cable_authenticator_ = std::move(cable_authenticator); cable_authenticator_ = std::move(cable_authenticator);
notification_showing_ = false;
DCHECK(static_cast<bool>(pending_make_credential_) ^ DCHECK(static_cast<bool>(pending_make_credential_) ^
static_cast<bool>(pending_get_assertion_)); static_cast<bool>(pending_get_assertion_));
...@@ -315,6 +324,7 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform { ...@@ -315,6 +324,7 @@ class AndroidPlatform : public device::cablev2::authenticator::Platform {
} }
JNIEnv* const env_; JNIEnv* const env_;
bool notification_showing_ = false;
ScopedJavaGlobalRef<jobject> cable_authenticator_; ScopedJavaGlobalRef<jobject> cable_authenticator_;
std::unique_ptr<MakeCredentialParams> pending_make_credential_; std::unique_ptr<MakeCredentialParams> pending_make_credential_;
std::unique_ptr<GetAssertionParams> pending_get_assertion_; std::unique_ptr<GetAssertionParams> pending_get_assertion_;
...@@ -442,7 +452,6 @@ static void JNI_CableAuthenticator_StartUSB( ...@@ -442,7 +452,6 @@ static void JNI_CableAuthenticator_StartUSB(
DCHECK(!global_data.usb_callback); DCHECK(!global_data.usb_callback);
global_data.usb_callback = transport->GetCallback(); global_data.usb_callback = transport->GetCallback();
DCHECK(!global_data.current_transaction);
global_data.current_transaction = global_data.current_transaction =
device::cablev2::authenticator::TransactWithPlaintextTransport( device::cablev2::authenticator::TransactWithPlaintextTransport(
std::make_unique<AndroidPlatform>(env, cable_authenticator), std::make_unique<AndroidPlatform>(env, cable_authenticator),
...@@ -464,7 +473,6 @@ static jboolean JNI_CableAuthenticator_StartQR( ...@@ -464,7 +473,6 @@ static jboolean JNI_CableAuthenticator_StartQR(
return false; return false;
} }
DCHECK(!global_data.current_transaction);
global_data.current_transaction = global_data.current_transaction =
device::cablev2::authenticator::TransactFromQRCode( device::cablev2::authenticator::TransactFromQRCode(
std::make_unique<AndroidPlatform>(env, cable_authenticator), std::make_unique<AndroidPlatform>(env, cable_authenticator),
......
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