Skip to content

Commit f0784a8

Browse files
committed
Fix selection of multiple credentials
1 parent deded30 commit f0784a8

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

creds-ui/src/gui/view_model/mod.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,19 @@ impl<C: CredentialServiceClient + Send> ViewModel<C> {
164164
cred_id, self.selected_device
165165
);
166166

167-
if let Some(cred_tx) = self.usb_cred_tx.take() {
168-
if cred_tx.lock().await.send(cred_id.clone()).await.is_err() {
169-
error!("Failed to send selected credential to device");
170-
}
167+
if let Err(_) = self
168+
.credential_service
169+
.lock()
170+
.await
171+
.select_credential(cred_id)
172+
.await
173+
{
174+
let error_msg = "Failed to select credential from device.";
175+
tracing::error!(error_msg);
176+
self.tx_update
177+
.send(ViewUpdate::Failed(error_msg.to_string()))
178+
.await
179+
.unwrap();
171180
}
172181
}
173182

credsd/src/dbus/flow_control.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ pub async fn start_flow_control_service<
5252
signal_state: Arc::new(AsyncMutex::new(SignalState::Idle)),
5353
svc,
5454
usb_pin_tx: Arc::new(AsyncMutex::new(None)),
55+
usb_cred_tx: Arc::new(AsyncMutex::new(None)),
5556
usb_event_forwarder_task: Arc::new(AsyncMutex::new(None)),
5657
hybrid_event_forwarder_task: Arc::new(AsyncMutex::new(None)),
5758
},
@@ -72,6 +73,7 @@ struct FlowControlService<H: HybridHandler, U: UsbHandler, UC: UiController> {
7273
signal_state: Arc<AsyncMutex<SignalState>>,
7374
svc: Arc<AsyncMutex<CredentialService<H, U, UC>>>,
7475
usb_pin_tx: Arc<AsyncMutex<Option<Sender<String>>>>,
76+
usb_cred_tx: Arc<AsyncMutex<Option<Sender<String>>>>,
7577
usb_event_forwarder_task: Arc<AsyncMutex<Option<AbortHandle>>>,
7678
hybrid_event_forwarder_task: Arc<AsyncMutex<Option<AbortHandle>>>,
7779
}
@@ -181,6 +183,7 @@ where
181183
) -> fdo::Result<()> {
182184
let mut stream = self.svc.lock().await.get_usb_credential();
183185
let usb_pin_tx = self.usb_pin_tx.clone();
186+
let usb_cred_tx = self.usb_cred_tx.clone();
184187
let signal_state = self.signal_state.clone();
185188
let object_server = object_server.clone();
186189
let task = tokio::spawn(async move {
@@ -214,6 +217,10 @@ where
214217
let mut usb_pin_tx = usb_pin_tx.lock().await;
215218
let _ = usb_pin_tx.insert(pin_tx);
216219
}
220+
UsbState::SelectCredential { cred_tx, .. } => {
221+
let mut usb_cred_tx = usb_cred_tx.lock().await;
222+
let _ = usb_cred_tx.insert(cred_tx);
223+
}
217224
UsbState::Completed | UsbState::Failed(_) => {
218225
break;
219226
}
@@ -240,7 +247,10 @@ where
240247
}
241248

242249
async fn select_credential(&self, credential_id: String) -> fdo::Result<()> {
243-
todo!()
250+
if let Some(cred_tx) = self.usb_cred_tx.lock().await.take() {
251+
cred_tx.send(credential_id).await.unwrap();
252+
}
253+
Ok(())
244254
}
245255

246256
#[zbus(signal)]

0 commit comments

Comments
 (0)