- commit
- 1b0e04dd5052eb712e5fb5a5f88bac6e0cee12c4
- parent
- 4700b7c74a91045279df5ce5880708732919a687
- author
- Dami <dami.etoile@gmail.com>
| M | src-tauri/ | 51 | +++++++++++++++--------------- |
| M | src/ | 26 | ++++++++------- |
@@ -176,23 +176,21 @@ pub fn fido_device_info() -> FidoDeviceInfo {
176176 let dev = &devices[0];177177 let vid = dev.vid;178178 let pid = dev.pid;179- let product = format!("{:?}", dev.info);179+ // product_string is the human-readable name from the HID descriptor180+ let product = if dev.product_string.is_empty() {181+ dev.info.clone()182+ } else {183+ dev.product_string.clone()184+ };180185 186+ // Try to open the device and query CTAP info; degrade gracefully if it fails187+ // (device may be busy or need user presence for some operations)181188 let cfg = Cfg::init();182189 match FidoKeyHidFactory::create(&cfg) {183190 Ok(device) => {184- let info = match device.get_info() {185- Ok(i) => i,186- Err(e) => {187- return FidoDeviceInfo {188- found: true,189- vid,190- pid,191- product,192- error: Some(format!("get_info failed: {:?}", e)),193- ..Default::default()194- };195- }191+ let (versions, extensions, options, max_msg_size) = match device.get_info() {192+ Ok(i) => (i.versions.clone(), i.extensions.clone(), i.options.clone(), i.max_msg_size as u32),193+ Err(_) => (vec![], vec![], vec![], 0),196194 };197195 let pin_retries = device.get_pin_retries().unwrap_or(0);198196 FidoDeviceInfo {@@ -200,22 +198,25 @@ pub fn fido_device_info() -> FidoDeviceInfo {
200198 vid,201199 pid,202200 product,203- versions: info.versions.clone(),204- extensions: info.extensions.clone(),205- options: info.options.clone(),206- max_msg_size: info.max_msg_size as u32,201+ versions,202+ extensions,203+ options,204+ max_msg_size,207205 pin_retries: pin_retries as u32,208206 error: None,209207 }210208 }211- Err(e) => FidoDeviceInfo {212- found: true,213- vid,214- pid,215- product,216- error: Some(format!("Failed to open device: {:?}", e)),217- ..Default::default()218- },209+ Err(e) => {210+ // Device was enumerated but couldn't be opened — still report it as found211+ FidoDeviceInfo {212+ found: true,213+ vid,214+ pid,215+ product,216+ error: Some(format!("{:?}", e)),217+ ..Default::default()218+ }219+ }219220 }220221 }221222 @@ -930,21 +930,23 @@
930930 try {931931 const info = await invoke('fido_device_info');932932 const el = document.getElementById('fido-status');933- if (info.found && !info.error) {934- el.textContent = 'connected';935- el.style.color = 'var(--green)';936- document.getElementById('fido-product').textContent = info.product;937- document.getElementById('fido-vidpid').textContent =938- `0x${info.vid.toString(16)}:0x${info.pid.toString(16)}`;939- document.getElementById('fido-versions').textContent = info.versions.join(', ');940- document.getElementById('fido-extensions').textContent = info.extensions.join(', ');941- document.getElementById('fido-pin').textContent = info.pin_retries;942- } else {943- el.textContent = info.error || 'no device';933+ if (!info.found) {934+ el.textContent = 'no device';944935 el.style.color = 'var(--muted-fg)';936+ return;945937 }938+ // Device found — populate basic info regardless of whether CTAP query succeeded939+ el.textContent = info.error ? `found (${info.error})` : 'connected';940+ el.style.color = info.error ? 'var(--yellow)' : 'var(--green)';941+ document.getElementById('fido-product').textContent = info.product || '—';942+ document.getElementById('fido-vidpid').textContent =943+ `${info.vid.toString(16).padStart(4,'0')}:${info.pid.toString(16).padStart(4,'0')}`;944+ document.getElementById('fido-versions').textContent = info.versions.join(', ') || '—';945+ document.getElementById('fido-extensions').textContent = info.extensions.join(', ') || '—';946+ document.getElementById('fido-pin').textContent = info.pin_retries ?? '—';946947 } catch (e) {947- console.error(e);948+ console.error('scanFido failed:', e);949+ document.getElementById('fido-status').textContent = 'error';948950 }949951 }950952