chore: fix all clippy warnings across workspace
This commit is contained in:
@@ -1376,12 +1376,12 @@ pub fn cmd_export(
|
||||
///
|
||||
/// Prints a summary. Does not require the encryption password (structural check only).
|
||||
pub fn cmd_export_verify(input: &Path) -> anyhow::Result<()> {
|
||||
use quicproquo_core::{verify_transcript_chain, ChainVerdict};
|
||||
use quicproquo_core::{validate_transcript_structure, ChainVerdict};
|
||||
|
||||
let data = std::fs::read(input)
|
||||
.with_context(|| format!("read transcript file '{}'", input.display()))?;
|
||||
|
||||
match verify_transcript_chain(&data)? {
|
||||
match validate_transcript_structure(&data)? {
|
||||
ChainVerdict::Ok { records } => {
|
||||
println!(
|
||||
"OK: transcript '{}' is structurally valid. {} record(s) found, hash chain intact.",
|
||||
|
||||
@@ -169,6 +169,7 @@ impl ConversationStore {
|
||||
|
||||
let salt = get_or_create_salt(&salt_path)?;
|
||||
let key = derive_convdb_key(password, &salt)?;
|
||||
#[allow(clippy::needless_borrows_for_generic_args)]
|
||||
let hex_key = Zeroizing::new(hex::encode(&*key));
|
||||
|
||||
let conn = Connection::open(db_path).context("open conversation db")?;
|
||||
@@ -188,6 +189,7 @@ impl ConversationStore {
|
||||
) -> anyhow::Result<()> {
|
||||
let salt = get_or_create_salt(salt_path)?;
|
||||
let key = derive_convdb_key(password, &salt)?;
|
||||
#[allow(clippy::needless_borrows_for_generic_args)]
|
||||
let hex_key = Zeroizing::new(hex::encode(&*key));
|
||||
|
||||
let enc_path = db_path.with_extension("convdb-enc");
|
||||
|
||||
@@ -914,11 +914,11 @@ fn parse_duration_secs(s: &str) -> Option<u32> {
|
||||
|
||||
/// Format a TTL in seconds into a human-friendly string.
|
||||
fn format_ttl(secs: u32) -> String {
|
||||
if secs >= 86400 && secs % 86400 == 0 {
|
||||
if secs >= 86400 && secs.is_multiple_of(86400) {
|
||||
format!("{} day(s)", secs / 86400)
|
||||
} else if secs >= 3600 && secs % 3600 == 0 {
|
||||
} else if secs >= 3600 && secs.is_multiple_of(3600) {
|
||||
format!("{} hour(s)", secs / 3600)
|
||||
} else if secs >= 60 && secs % 60 == 0 {
|
||||
} else if secs >= 60 && secs.is_multiple_of(60) {
|
||||
format!("{} minute(s)", secs / 60)
|
||||
} else {
|
||||
format!("{} second(s)", secs)
|
||||
|
||||
@@ -85,6 +85,7 @@ pub fn anyhow_is_retriable(err: &anyhow::Error) -> bool {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ pub fn set_auth(auth: &mut auth::Builder<'_>) -> anyhow::Result<()> {
|
||||
)
|
||||
})?;
|
||||
auth.set_version(ctx.version);
|
||||
auth.set_access_token(&*ctx.access_token);
|
||||
auth.set_access_token(&ctx.access_token);
|
||||
auth.set_device_id(&ctx.device_id);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -217,6 +217,7 @@ pub fn sha256(bytes: &[u8]) -> Vec<u8> {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@ pub fn clear_cached_session(state_path: &Path) {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
// cargo_bin! only works for current package's binary; we spawn qpq-server from another package.
|
||||
#![allow(deprecated)]
|
||||
#![allow(clippy::unwrap_used)]
|
||||
#![allow(clippy::await_holding_lock)] // AUTH_LOCK intentionally held across await to serialize tests
|
||||
|
||||
use std::{path::PathBuf, process::Command, sync::Mutex, time::Duration};
|
||||
|
||||
@@ -8,7 +10,6 @@ use portpicker::pick_unused_port;
|
||||
use rand::RngCore;
|
||||
use tempfile::TempDir;
|
||||
use tokio::time::sleep;
|
||||
use hex;
|
||||
|
||||
// Required by rustls 0.23 when QUIC/TLS is used from this process (e.g. client in test).
|
||||
fn ensure_rustls_provider() {
|
||||
@@ -46,7 +47,7 @@ impl Drop for ChildGuard {
|
||||
}
|
||||
}
|
||||
|
||||
async fn wait_for_health(server: &str, ca_cert: &PathBuf, server_name: &str) -> anyhow::Result<()> {
|
||||
async fn wait_for_health(server: &str, ca_cert: &std::path::Path, server_name: &str) -> anyhow::Result<()> {
|
||||
let local = tokio::task::LocalSet::new();
|
||||
for _ in 0..30 {
|
||||
if local
|
||||
@@ -1090,7 +1091,7 @@ async fn e2e_key_rotation_update_path() -> anyhow::Result<()> {
|
||||
|
||||
let alice_seed = bincode::deserialize::<StoredStateCompat>(&std::fs::read(&alice_state)?)?.identity_seed;
|
||||
let bob_seed = bincode::deserialize::<StoredStateCompat>(&std::fs::read(&bob_state)?)?.identity_seed;
|
||||
let alice_pk = IdentityKeypair::from_seed(alice_seed).public_key_bytes().to_vec();
|
||||
let _alice_pk = IdentityKeypair::from_seed(alice_seed).public_key_bytes().to_vec();
|
||||
let bob_pk = IdentityKeypair::from_seed(bob_seed).public_key_bytes().to_vec();
|
||||
let bob_pk_hex = hex_encode(&bob_pk);
|
||||
|
||||
@@ -1372,7 +1373,7 @@ async fn e2e_file_upload_download() -> anyhow::Result<()> {
|
||||
|
||||
// Build 2 KB of known data.
|
||||
let pattern = b"hello-world-file-test\n";
|
||||
let repeat_count = (2048 + pattern.len() - 1) / pattern.len();
|
||||
let repeat_count = 2048_usize.div_ceil(pattern.len());
|
||||
let file_data: Vec<u8> = pattern.iter().copied().cycle().take(repeat_count * pattern.len()).collect();
|
||||
let file_data = &file_data[..2048]; // exactly 2 KB
|
||||
|
||||
@@ -1472,7 +1473,7 @@ async fn e2e_file_upload_download() -> anyhow::Result<()> {
|
||||
.await?;
|
||||
|
||||
anyhow::ensure!(
|
||||
partial == &file_data[100..300],
|
||||
partial == file_data[100..300],
|
||||
"partial download [100..300] does not match expected slice"
|
||||
);
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
//! Benchmark: Identity keypair operations, sealed sender, and message padding.
|
||||
//!
|
||||
//! Covers:
|
||||
@@ -34,14 +35,12 @@ fn bench_identity_verify(c: &mut Criterion) {
|
||||
|
||||
c.bench_function("identity_verify", |b| {
|
||||
b.iter(|| {
|
||||
black_box(
|
||||
IdentityKeypair::verify_raw(
|
||||
black_box(&pk),
|
||||
black_box(payload),
|
||||
black_box(&sig),
|
||||
)
|
||||
.unwrap()
|
||||
IdentityKeypair::verify_raw(
|
||||
black_box(&pk),
|
||||
black_box(payload),
|
||||
black_box(&sig),
|
||||
)
|
||||
.unwrap();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
//! Benchmark: Hybrid KEM (X25519 + ML-KEM-768) vs classical-only encryption.
|
||||
//!
|
||||
//! Compares keypair generation, encryption, and decryption times for the
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
//! Benchmark: MLS group operations at various group sizes.
|
||||
//!
|
||||
//! Measures KeyPackage generation, group creation, member addition,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(clippy::unwrap_used)]
|
||||
//! Benchmark: Cap'n Proto vs Protobuf serialization for chat message envelopes.
|
||||
//!
|
||||
//! Compares serialization/deserialization speed and encoded size at three
|
||||
|
||||
@@ -349,6 +349,7 @@ fn parse_file_ref(payload: &[u8]) -> Result<AppMessage, CoreError> {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -631,6 +631,7 @@ impl GroupMember {
|
||||
// ── Unit tests ────────────────────────────────────────────────────────────────
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -364,6 +364,7 @@ impl OpenMlsCryptoProvider for HybridCryptoProvider {
|
||||
// ── Tests ───────────────────────────────────────────────────────────────────
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use openmls_traits::types::HpkeKdfType;
|
||||
|
||||
@@ -476,6 +476,7 @@ fn derive_aead_key(x25519_ss: &[u8], mlkem_ss: &[u8], extra_info: &[u8]) -> Key
|
||||
// ── Tests ───────────────────────────────────────────────────────────────────
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -151,7 +151,43 @@ pub fn verify_delivery_proof(
|
||||
Ok(true)
|
||||
}
|
||||
|
||||
impl Serialize for IdentityKeypair {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
serializer.serialize_bytes(&self.seed[..])
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for IdentityKeypair {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let bytes: Vec<u8> = serde::Deserialize::deserialize(deserializer)?;
|
||||
let seed: [u8; 32] = bytes
|
||||
.as_slice()
|
||||
.try_into()
|
||||
.map_err(|_| serde::de::Error::custom("identity seed must be 32 bytes"))?;
|
||||
Ok(IdentityKeypair::from_seed(seed))
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for IdentityKeypair {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let fp = self.fingerprint();
|
||||
f.debug_struct("IdentityKeypair")
|
||||
.field(
|
||||
"fingerprint",
|
||||
&format!("{:02x}{:02x}{:02x}{:02x}…", fp[0], fp[1], fp[2], fp[3]),
|
||||
)
|
||||
.finish_non_exhaustive()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod proof_tests {
|
||||
use super::*;
|
||||
use sha2::{Digest, Sha256};
|
||||
@@ -207,38 +243,3 @@ mod proof_tests {
|
||||
assert!(verify_delivery_proof(&pk, &proof).is_err());
|
||||
}
|
||||
}
|
||||
|
||||
impl Serialize for IdentityKeypair {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
serializer.serialize_bytes(&self.seed[..])
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for IdentityKeypair {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
let bytes: Vec<u8> = serde::Deserialize::deserialize(deserializer)?;
|
||||
let seed: [u8; 32] = bytes
|
||||
.as_slice()
|
||||
.try_into()
|
||||
.map_err(|_| serde::de::Error::custom("identity seed must be 32 bytes"))?;
|
||||
Ok(IdentityKeypair::from_seed(seed))
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for IdentityKeypair {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let fp = self.fingerprint();
|
||||
f.debug_struct("IdentityKeypair")
|
||||
.field(
|
||||
"fingerprint",
|
||||
&format!("{:02x}{:02x}{:02x}{:02x}…", fp[0], fp[1], fp[2], fp[3]),
|
||||
)
|
||||
.finish_non_exhaustive()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ pub fn unpad(padded: &[u8]) -> Result<Vec<u8>, CoreError> {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ pub fn is_sealed(bytes: &[u8]) -> bool {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -95,6 +95,7 @@ fn recompute_root(leaf: [u8; 32], path: &[PathStep]) -> Result<[u8; 32], KtError
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::tree::MerkleLog;
|
||||
|
||||
@@ -182,6 +182,7 @@ fn largest_power_of_two_less_than(n: usize) -> usize {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ impl MeshIdentity {
|
||||
/// contains the Ed25519 seed in the clear.
|
||||
pub fn save(&self, path: &Path) -> anyhow::Result<()> {
|
||||
let file = IdentityFile {
|
||||
seed: hex::encode(&*self.keypair.seed_bytes()),
|
||||
seed: hex::encode(self.keypair.seed_bytes()),
|
||||
peers: self.known_peers.clone(),
|
||||
};
|
||||
let json = serde_json::to_string_pretty(&file)?;
|
||||
|
||||
@@ -114,6 +114,7 @@ impl ConversationStore {
|
||||
|
||||
if let Some(pw) = password {
|
||||
let key = derive_db_key(pw, db_path)?;
|
||||
#[allow(clippy::needless_borrows_for_generic_args)]
|
||||
let hex_key = Zeroizing::new(hex::encode(&*key));
|
||||
conn.pragma_update(None, "key", format!("x'{}'", &*hex_key))
|
||||
.context("set SQLCipher key")?;
|
||||
@@ -561,6 +562,7 @@ fn row_to_message(
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ use crate::error::SdkError;
|
||||
/// Returns `(conversation_id, was_new)`.
|
||||
/// - `was_new = true` — caller created the MLS group and sent the Welcome.
|
||||
/// - `was_new = false` — peer is the MLS initiator; caller should wait for Welcome.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub async fn create_dm(
|
||||
rpc: &RpcClient,
|
||||
conv_store: &ConversationStore,
|
||||
@@ -177,6 +178,7 @@ pub fn create_group(
|
||||
/// Invite a peer to an existing group.
|
||||
///
|
||||
/// Sends the Welcome to the new peer and the Commit to all existing members.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub async fn invite_to_group(
|
||||
rpc: &RpcClient,
|
||||
conv_store: &ConversationStore,
|
||||
|
||||
@@ -143,6 +143,7 @@ pub fn load_state(path: &Path, password: Option<&str>) -> Result<StoredState, Sd
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ impl BlobService {
|
||||
if req
|
||||
.offset
|
||||
.checked_add(req.chunk.len() as u64)
|
||||
.map_or(true, |end| end > req.total_size)
|
||||
.is_none_or(|end| end > req.total_size)
|
||||
{
|
||||
return Err(DomainError::BadParams(format!(
|
||||
"chunk out of bounds: offset={} + chunk_len={} > total_size={}",
|
||||
|
||||
@@ -29,6 +29,7 @@ pub fn resolve_destination(
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ impl NodeServiceImpl {
|
||||
}
|
||||
|
||||
// Validate chunk bounds.
|
||||
if offset.checked_add(chunk.len() as u64).map_or(true, |end| end > total_size) {
|
||||
if offset.checked_add(chunk.len() as u64).is_none_or(|end| end > total_size) {
|
||||
return Promise::err(coded_error(
|
||||
E020_BAD_PARAMS,
|
||||
format!(
|
||||
|
||||
@@ -263,7 +263,7 @@ impl NodeServiceImpl {
|
||||
if self.redact_logs {
|
||||
let redacted_sender = sender_identity
|
||||
.as_deref()
|
||||
.map(|id| redacted_prefix(id))
|
||||
.map(redacted_prefix)
|
||||
.unwrap_or_else(|| "sealed".to_string());
|
||||
tracing::info!(
|
||||
sender_prefix = %redacted_sender,
|
||||
|
||||
@@ -1004,6 +1004,7 @@ impl<T> OptionalExt<T> for Result<T, rusqlite::Error> {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::path::PathBuf;
|
||||
|
||||
@@ -320,6 +320,7 @@ pub struct FileBackedStore {
|
||||
identity_keys: Mutex<HashMap<String, Vec<u8>>>,
|
||||
endpoints: Mutex<HashMap<Vec<u8>, Vec<u8>>>,
|
||||
/// Device registry: identity_key -> Vec<(device_id, device_name, registered_at)>
|
||||
#[allow(clippy::type_complexity)]
|
||||
devices: Mutex<HashMap<Vec<u8>, Vec<(Vec<u8>, String, u64)>>>,
|
||||
}
|
||||
|
||||
@@ -958,6 +959,7 @@ impl Store for FileBackedStore {
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[allow(clippy::unwrap_used)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use tempfile::TempDir;
|
||||
|
||||
Reference in New Issue
Block a user