Skip to content

Commit e6a26e7

Browse files
committed
Finish wiring up USB error page
1 parent 5978952 commit e6a26e7

File tree

9 files changed

+61
-13
lines changed

9 files changed

+61
-13
lines changed

.idea/.gitignore

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/linux-webauthn-platform-api.iml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xyz-iinuwa-credential-manager-portal-gtk/data/resources/ui/window.ui

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@
219219
<property name="orientation">vertical</property>
220220
<child>
221221
<object class="GtkLabel">
222+
<binding name="label">
223+
<lookup name="prompt">
224+
<lookup name="view-model">
225+
ExampleApplicationWindow
226+
</lookup>
227+
</lookup>
228+
</binding>
222229
<property name="label">Something went wrong while retrieving a credential. Please try again later or use a different authenticator.</property>
223230
</object>
224231
</child>

xyz-iinuwa-credential-manager-portal-gtk/src/credential_service/usb.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,19 @@ impl InProcessUsbHandler {
180180
UsbStateInternal::NeedsPin { .. }
181181
| UsbStateInternal::NeedsUserVerification { .. }
182182
| UsbStateInternal::NeedsUserPresence => match signal_rx.recv().await {
183-
Some(msg) => match msg? {
184-
UsbUvMessage::NeedsPin {
183+
Some(msg) => match msg {
184+
Ok(UsbUvMessage::NeedsPin {
185185
attempts_left,
186186
pin_tx,
187-
} => Ok(UsbStateInternal::NeedsPin {
187+
}) => Ok(UsbStateInternal::NeedsPin {
188188
attempts_left,
189189
pin_tx,
190190
}),
191-
UsbUvMessage::NeedsUserVerification { attempts_left } => {
191+
Ok(UsbUvMessage::NeedsUserVerification { attempts_left }) => {
192192
Ok(UsbStateInternal::NeedsUserVerification { attempts_left })
193193
}
194-
UsbUvMessage::NeedsUserPresence => Ok(UsbStateInternal::NeedsUserPresence),
195-
UsbUvMessage::ReceivedCredentials(response) => match response {
194+
Ok(UsbUvMessage::NeedsUserPresence) => Ok(UsbStateInternal::NeedsUserPresence),
195+
Ok(UsbUvMessage::ReceivedCredentials(response)) => match response {
196196
AuthenticatorResponse::CredentialCreated(make_credential_response) => {
197197
Ok(UsbStateInternal::Completed(
198198
CredentialResponse::from_make_credential(
@@ -218,6 +218,7 @@ impl InProcessUsbHandler {
218218
}
219219
}
220220
},
221+
Err(err) => Err(err),
221222
},
222223
None => Err(Error::Internal("USB UV handler channel closed".to_string())),
223224
},

xyz-iinuwa-credential-manager-portal-gtk/src/view_model/gtk/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,10 @@ impl ViewModel {
175175
view_model.set_qr_spinner_visible(false);
176176
view_model.set_completed(true);
177177
}
178-
ViewUpdate::Failed => {
178+
ViewUpdate::Failed(error_msg) => {
179179
view_model.set_qr_spinner_visible(false);
180180
view_model.set_failed(true);
181+
view_model.set_prompt(error_msg);
181182
}
182183
}
183184
}

xyz-iinuwa-credential-manager-portal-gtk/src/view_model/mod.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use async_std::{
1010
use tokio::sync::mpsc;
1111
use tracing::{error, info};
1212

13-
use crate::credential_service::{CredentialServiceClient, UsbState};
13+
use crate::credential_service::{CredentialServiceClient, Error as CredentialServiceError, UsbState};
1414

1515
#[derive(Debug)]
1616
pub(crate) struct ViewModel<C>
@@ -281,8 +281,13 @@ impl<C: CredentialServiceClient + Send> ViewModel<C> {
281281
.unwrap();
282282
}
283283
// TODO: Provide more specific error messages using the wrapped Error.
284-
UsbState::Failed(_) => {
285-
self.tx_update.send(ViewUpdate::Failed).await.unwrap()
284+
UsbState::Failed(err) => {
285+
let error_msg = String::from(match err {
286+
CredentialServiceError::NoCredentials => "No matching credentials found on this authenticator.",
287+
CredentialServiceError::PinAttemptsExhausted => "No more PIN attempts allowed. Try removing your device and plugging it back in.",
288+
CredentialServiceError::AuthenticatorError | CredentialServiceError::Internal(_) => "Something went wrong while retrieving a credential. Please try again later or use a different authenticator.",
289+
});
290+
self.tx_update.send(ViewUpdate::Failed(error_msg)).await.unwrap()
286291
}
287292
}
288293
}
@@ -323,7 +328,7 @@ impl<C: CredentialServiceClient + Send> ViewModel<C> {
323328
}
324329
HybridState::Failed => {
325330
self.hybrid_qr_code_data = None;
326-
self.tx_update.send(ViewUpdate::Failed).await.unwrap();
331+
self.tx_update.send(ViewUpdate::Failed(String::from("Something went wrong. Try again later or use a different authenticator."))).await.unwrap();
327332
}
328333
};
329334
}
@@ -357,7 +362,7 @@ pub enum ViewUpdate {
357362
HybridConnected,
358363

359364
Completed,
360-
Failed,
365+
Failed(String),
361366
}
362367

363368
pub enum BackgroundEvent {

xyz-iinuwa-credential-manager-portal-gtk/src/window.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ impl ExampleApplicationWindow {
194194
#[weak]
195195
stack,
196196
move |vm| {
197-
if vm.completed() {
197+
if vm.failed() {
198198
stack.set_visible_child_name("failed");
199199
}
200200
}

0 commit comments

Comments
 (0)