fn describe_token()

in src/vtok_srv/src/worker.rs [120:166]


    fn describe_token(label: String, pin: String) -> ApiResponse {
        let config = config::Config::load_ro().map_err(|_| ApiError::InternalError)?;
        let (slot_id, token) = config
            .slots()
            .iter()
            .enumerate()
            .filter_map(|(idx, slot)| {
                slot.as_ref()
                    .filter(|tok| tok.label == label)
                    .map(|tok| (idx, tok))
            })
            .next()
            .ok_or(ApiError::TokenNotFound)?;
        if token.pin != pin {
            return Err(ApiError::AccessDenied);
        }

        let token_desc = schema::TokenDescription {
            label: token.label.clone(),
            slot_id,
            ttl_secs: token
                .expiry_ts
                .checked_sub(util::time::monotonic_secs())
                .unwrap_or(0),
            keys: Some(
                token
                    .private_keys
                    .iter()
                    .map(|key| schema::PrivateKeyDescription {
                        label: key.label.clone(),
                        id: key.id,
                        uri: format!(
                            "pkcs11:model={};manufacturer={};serial=EVT{:02X};token={};id=%{:02x};object={};type=private",
                            defs::TOKEN_MODEL,
                            defs::MANUFACTURER,
                            slot_id,
                            token.label.as_str(),
                            key.id,
                            key.label.as_str(),
                        )
                    })
                    .collect(),
            ),
        };

        Ok(ApiOk::TokenDescription(token_desc))
    }