Skip to content

Commit 7d3beeb

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

File tree

9 files changed

+68
-13
lines changed

9 files changed

+68
-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: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -180,19 +180,21 @@ 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) => {
195+
Ok(UsbStateInternal::NeedsUserPresence)
196+
}
197+
Ok(UsbUvMessage::ReceivedCredentials(response)) => match response {
196198
AuthenticatorResponse::CredentialCreated(make_credential_response) => {
197199
Ok(UsbStateInternal::Completed(
198200
CredentialResponse::from_make_credential(
@@ -218,6 +220,7 @@ impl InProcessUsbHandler {
218220
}
219221
}
220222
},
223+
Err(err) => Err(err),
221224
},
222225
None => Err(Error::Internal("USB UV handler channel closed".to_string())),
223226
},

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: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ 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::{
14+
CredentialServiceClient, Error as CredentialServiceError, UsbState,
15+
};
1416

1517
#[derive(Debug)]
1618
pub(crate) struct ViewModel<C>
@@ -281,8 +283,16 @@ impl<C: CredentialServiceClient + Send> ViewModel<C> {
281283
.unwrap();
282284
}
283285
// TODO: Provide more specific error messages using the wrapped Error.
284-
UsbState::Failed(_) => {
285-
self.tx_update.send(ViewUpdate::Failed).await.unwrap()
286+
UsbState::Failed(err) => {
287+
let error_msg = String::from(match err {
288+
CredentialServiceError::NoCredentials => "No matching credentials found on this authenticator.",
289+
CredentialServiceError::PinAttemptsExhausted => "No more PIN attempts allowed. Try removing your device and plugging it back in.",
290+
CredentialServiceError::AuthenticatorError | CredentialServiceError::Internal(_) => "Something went wrong while retrieving a credential. Please try again later or use a different authenticator.",
291+
});
292+
self.tx_update
293+
.send(ViewUpdate::Failed(error_msg))
294+
.await
295+
.unwrap()
286296
}
287297
}
288298
}
@@ -323,7 +333,7 @@ impl<C: CredentialServiceClient + Send> ViewModel<C> {
323333
}
324334
HybridState::Failed => {
325335
self.hybrid_qr_code_data = None;
326-
self.tx_update.send(ViewUpdate::Failed).await.unwrap();
336+
self.tx_update.send(ViewUpdate::Failed(String::from("Something went wrong. Try again later or use a different authenticator."))).await.unwrap();
327337
}
328338
};
329339
}
@@ -357,7 +367,7 @@ pub enum ViewUpdate {
357367
HybridConnected,
358368

359369
Completed,
360-
Failed,
370+
Failed(String),
361371
}
362372

363373
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)