Skip to content

Commit 26d656e

Browse files
claudehyperpolymath
authored andcommitted
fix(tests): repair botched bounded-read rewrite (mismatched delimiters)
main's "remediate UnboundedAllocation" commit mechanically rewrote fs::read_to_string(PATH) into a bounded File::open(...).take(...).read_to_string() form, but for multi-.join(...) paths it glued `.and_then` onto the path's join instead of File::open and stranded a paren -- leaving 9 test sites that don't compile (mismatched/unexpected closing delimiter). This reddened ALL januskey CI (Rust Build + Unit Tests, E2E), #65 included. Repairs the 9 sites in aspect_test / p2p_test / concurrency_test / e2e_test: close File::open(FULL_PATH) before .and_then(...), drop the stray paren. Kept the bounded-read form (respects the remediation's intent); cargo fmt normalized the expressions. cargo test --workspace green (all suites pass). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJmfoz1ZS1Pejy9LLMY742
1 parent e606d2b commit 26d656e

18 files changed

Lines changed: 511 additions & 325 deletions

crates/januskey-cli/src/attestation.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,11 @@ impl AuditLog {
269269
}
270270

271271
/// Log key retrieval
272-
pub fn log_key_retrieved(&self, key_id: Uuid, fingerprint: &str) -> std::io::Result<AuditEntry> {
272+
pub fn log_key_retrieved(
273+
&self,
274+
key_id: Uuid,
275+
fingerprint: &str,
276+
) -> std::io::Result<AuditEntry> {
273277
let details = KeyEventDetails {
274278
key_id,
275279
fingerprint: fingerprint.to_string(),
@@ -301,11 +305,7 @@ impl AuditLog {
301305
rotated_to: None,
302306
rotated_from: Some(old_key_id),
303307
};
304-
let reason = format!(
305-
"Rotated from key {} ({})",
306-
old_key_id,
307-
old_fingerprint
308-
);
308+
let reason = format!("Rotated from key {} ({})", old_key_id, old_fingerprint);
309309
self.log_event(AuditEventType::KeyRotated, Some(details), Some(reason))
310310
}
311311

@@ -426,10 +426,7 @@ impl AuditLog {
426426
valid: true,
427427
total_entries: entries.len(),
428428
first_invalid_index: None,
429-
message: format!(
430-
"Audit log integrity verified: {} entries",
431-
entries.len()
432-
),
429+
message: format!("Audit log integrity verified: {} entries", entries.len()),
433430
})
434431
}
435432

@@ -538,14 +535,21 @@ mod tests {
538535
let key_id = Uuid::new_v4();
539536
let new_key_id = Uuid::new_v4();
540537

541-
log.log_key_generated(key_id, "abc", KeyAlgorithm::Aes256Gcm, KeyPurpose::Encryption)
542-
.expect("failed to log key generation");
538+
log.log_key_generated(
539+
key_id,
540+
"abc",
541+
KeyAlgorithm::Aes256Gcm,
542+
KeyPurpose::Encryption,
543+
)
544+
.expect("failed to log key generation");
543545
log.log_key_rotated(key_id, "abc", new_key_id, "def")
544546
.expect("failed to log key rotation");
545547
log.log_key_revoked(key_id, "abc", Some("rotated"))
546548
.expect("failed to log key revocation");
547549

548-
let history = log.get_key_history(key_id).expect("failed to get key history");
550+
let history = log
551+
.get_key_history(key_id)
552+
.expect("failed to get key history");
549553
assert_eq!(history.len(), 3);
550554
}
551555
}

crates/januskey-cli/src/delta.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,11 @@ impl Delta {
260260
}
261261

262262
// Preserve original line endings
263-
let line_ending = if original_str.contains("\r\n") { "\r\n" } else { "\n" };
263+
let line_ending = if original_str.contains("\r\n") {
264+
"\r\n"
265+
} else {
266+
"\n"
267+
};
264268
let result = result_lines.join(line_ending);
265269

266270
// Add final newline if original had one
@@ -435,7 +439,12 @@ fn find_block(original: &[u8], start: usize, block: &[u8]) -> Option<usize> {
435439
}
436440

437441
/// Find how much content before the next matching block
438-
fn find_next_match(original: &[u8], orig_start: usize, new_content: &[u8], block_size: usize) -> Option<usize> {
442+
fn find_next_match(
443+
original: &[u8],
444+
orig_start: usize,
445+
new_content: &[u8],
446+
block_size: usize,
447+
) -> Option<usize> {
439448
for i in 1..new_content.len() {
440449
let remaining = &new_content[i..];
441450
if remaining.len() >= block_size {
@@ -495,8 +504,10 @@ mod tests {
495504

496505
#[test]
497506
fn test_delta_roundtrip() {
498-
let original = b"Original content here\nWith multiple lines\nAnd some more text\n".repeat(50);
499-
let new = b"Modified content here\nWith multiple lines\nAnd some different text\n".repeat(50);
507+
let original =
508+
b"Original content here\nWith multiple lines\nAnd some more text\n".repeat(50);
509+
let new =
510+
b"Modified content here\nWith multiple lines\nAnd some different text\n".repeat(50);
500511

501512
let delta = Delta::compute(&original, &new);
502513
let restored = delta.apply(&original).unwrap();

crates/januskey-cli/src/keys.rs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,9 @@ impl KeyManager {
340340
self.save_store(&store)?;
341341

342342
// Log key generation
343-
let _ = self.audit_log.log_key_generated(id, &fingerprint, algorithm, purpose);
343+
let _ = self
344+
.audit_log
345+
.log_key_generated(id, &fingerprint, algorithm, purpose);
344346

345347
Ok(id)
346348
}
@@ -388,7 +390,9 @@ impl KeyManager {
388390
}
389391

390392
// Log key retrieval
391-
let _ = self.audit_log.log_key_retrieved(id, &wrapped.metadata.fingerprint);
393+
let _ = self
394+
.audit_log
395+
.log_key_retrieved(id, &wrapped.metadata.fingerprint);
392396

393397
unwrap_key(kek, &wrapped)
394398
}
@@ -445,7 +449,9 @@ impl KeyManager {
445449
self.save_store(&store)?;
446450

447451
// Log rotation event
448-
let _ = self.audit_log.log_key_rotated(id, &old_fingerprint, new_id, &fingerprint);
452+
let _ = self
453+
.audit_log
454+
.log_key_rotated(id, &old_fingerprint, new_id, &fingerprint);
449455

450456
Ok(new_id)
451457
}
@@ -501,7 +507,9 @@ impl KeyManager {
501507
self.save_store(&store)?;
502508

503509
// Log revocation with reason
504-
let _ = self.audit_log.log_key_revoked(id, &fingerprint, Some(reason));
510+
let _ = self
511+
.audit_log
512+
.log_key_revoked(id, &fingerprint, Some(reason));
505513

506514
Ok(())
507515
}
@@ -531,7 +539,14 @@ impl KeyManager {
531539

532540
fn load_store_raw(&self) -> Result<KeyStoreData> {
533541
let path = self.store_path.join("keystore.jks");
534-
let content = ({ use std::io::Read; std::fs::File::open(&path).and_then(|mut f| { let mut buf = String::new(); f.take(10 * 1024 * 1024).read_to_string(&mut buf)?; Ok(buf) }) })?;
542+
let content = ({
543+
use std::io::Read;
544+
std::fs::File::open(&path).and_then(|mut f| {
545+
let mut buf = String::new();
546+
f.take(10 * 1024 * 1024).read_to_string(&mut buf)?;
547+
Ok(buf)
548+
})
549+
})?;
535550
let store: KeyStoreData = serde_json::from_str(&content)?;
536551
Ok(store)
537552
}
@@ -641,7 +656,8 @@ mod tests {
641656
let mut km = KeyManager::new(tmp.path());
642657

643658
assert!(!km.is_initialized());
644-
km.init("test-passphrase").expect("failed to init key manager");
659+
km.init("test-passphrase")
660+
.expect("failed to init key manager");
645661
assert!(km.is_initialized());
646662
}
647663

@@ -650,7 +666,8 @@ mod tests {
650666
let tmp = TempDir::new().expect("failed to create temp dir");
651667
let mut km = KeyManager::new(tmp.path());
652668

653-
km.init("test-passphrase").expect("failed to init key manager");
669+
km.init("test-passphrase")
670+
.expect("failed to init key manager");
654671

655672
let id = km
656673
.generate(
@@ -676,7 +693,8 @@ mod tests {
676693
let tmp = TempDir::new().expect("failed to create temp dir");
677694
let mut km = KeyManager::new(tmp.path());
678695

679-
km.init("test-passphrase").expect("failed to init key manager");
696+
km.init("test-passphrase")
697+
.expect("failed to init key manager");
680698

681699
let old_id = km
682700
.generate(KeyAlgorithm::Aes256Gcm, KeyPurpose::Encryption, None, None)
@@ -697,7 +715,8 @@ mod tests {
697715
let tmp = TempDir::new().expect("failed to create temp dir");
698716
let mut km = KeyManager::new(tmp.path());
699717

700-
km.init("correct-passphrase").expect("failed to init key manager");
718+
km.init("correct-passphrase")
719+
.expect("failed to init key manager");
701720

702721
// Generate a key so we have something to verify against
703722
km.generate(KeyAlgorithm::Aes256Gcm, KeyPurpose::Encryption, None, None)

crates/januskey-cli/src/keys_cli.rs

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,10 @@ fn cmd_init(km: &mut KeyManager, _no_recovery: bool) -> Result<(), Box<dyn std::
201201
println!();
202202
println!("{}", "✓ Key store initialized successfully".green());
203203
println!();
204-
println!("Location: {}/.januskey/keys/", std::env::current_dir()?.display());
204+
println!(
205+
"Location: {}/.januskey/keys/",
206+
std::env::current_dir()?.display()
207+
);
205208
println!();
206209
println!("{}", "Next steps:".cyan());
207210
println!(" • Generate a key: jk-keys generate --type aes256 --purpose encryption");
@@ -217,12 +220,17 @@ fn cmd_list(km: &mut KeyManager, active_only: bool) -> Result<(), Box<dyn std::e
217220
let keys = km.list()?;
218221

219222
if keys.is_empty() {
220-
println!("{}", "No keys in store. Generate one with: jk-keys generate".yellow());
223+
println!(
224+
"{}",
225+
"No keys in store. Generate one with: jk-keys generate".yellow()
226+
);
221227
return Ok(());
222228
}
223229

224230
let filtered: Vec<_> = if active_only {
225-
keys.into_iter().filter(|k| k.state == KeyState::Active).collect()
231+
keys.into_iter()
232+
.filter(|k| k.state == KeyState::Active)
233+
.collect()
226234
} else {
227235
keys
228236
};
@@ -273,15 +281,27 @@ fn cmd_generate(
273281
"aes256" | "aes-256" | "aes256gcm" => KeyAlgorithm::Aes256Gcm,
274282
"ed25519" => KeyAlgorithm::Ed25519,
275283
"x25519" => KeyAlgorithm::X25519,
276-
_ => return Err(format!("Unknown key type: {}. Use: aes256, ed25519, x25519", key_type).into()),
284+
_ => {
285+
return Err(format!(
286+
"Unknown key type: {}. Use: aes256, ed25519, x25519",
287+
key_type
288+
)
289+
.into())
290+
}
277291
};
278292

279293
let key_purpose = match purpose.to_lowercase().as_str() {
280294
"encryption" | "encrypt" => KeyPurpose::Encryption,
281295
"signing" | "sign" => KeyPurpose::Signing,
282296
"keywrap" | "key-wrap" | "wrap" => KeyPurpose::KeyWrap,
283297
"recovery" => KeyPurpose::Recovery,
284-
_ => return Err(format!("Unknown purpose: {}. Use: encryption, signing, keywrap, recovery", purpose).into()),
298+
_ => {
299+
return Err(format!(
300+
"Unknown purpose: {}. Use: encryption, signing, keywrap, recovery",
301+
purpose
302+
)
303+
.into())
304+
}
285305
};
286306

287307
println!("{}", "Generating key...".cyan());
@@ -318,7 +338,10 @@ fn cmd_show(km: &mut KeyManager, key_id: Uuid) -> Result<(), Box<dyn std::error:
318338
println!(" Purpose: {}", meta.purpose);
319339
println!(" State: {}", format_state(meta.state));
320340
println!(" Fingerprint: {}", meta.fingerprint.cyan());
321-
println!(" Created: {}", meta.created_at.format("%Y-%m-%d %H:%M:%S UTC"));
341+
println!(
342+
" Created: {}",
343+
meta.created_at.format("%Y-%m-%d %H:%M:%S UTC")
344+
);
322345

323346
if let Some(exp) = meta.expires_at {
324347
let now = chrono::Utc::now();
@@ -327,7 +350,11 @@ fn cmd_show(km: &mut KeyManager, key_id: Uuid) -> Result<(), Box<dyn std::error:
327350
} else {
328351
"".normal()
329352
};
330-
println!(" Expires: {}{}", exp.format("%Y-%m-%d %H:%M:%S UTC"), status);
353+
println!(
354+
" Expires: {}{}",
355+
exp.format("%Y-%m-%d %H:%M:%S UTC"),
356+
status
357+
);
331358
}
332359

333360
if let Some(rot) = meta.rotation_of {
@@ -470,9 +497,7 @@ fn unlock_store(km: &mut KeyManager) -> Result<(), Box<dyn std::error::Error>> {
470497
return Err("Key store not initialized. Run 'jk-keys init' first.".into());
471498
}
472499

473-
let passphrase = Password::new()
474-
.with_prompt("Enter passphrase")
475-
.interact()?;
500+
let passphrase = Password::new().with_prompt("Enter passphrase").interact()?;
476501

477502
km.unlock(&passphrase)?;
478503
Ok(())
@@ -563,18 +588,29 @@ fn cmd_audit_history(km: &mut KeyManager, key_id: Uuid) -> Result<(), Box<dyn st
563588
let entries = km.audit_log().get_key_history(key_id)?;
564589

565590
if entries.is_empty() {
566-
println!("{}", format!("No audit entries found for key {}", key_id).yellow());
591+
println!(
592+
"{}",
593+
format!("No audit entries found for key {}", key_id).yellow()
594+
);
567595
return Ok(());
568596
}
569597

570-
println!("{}", format!("Audit History for Key: {}", key_id).cyan().bold());
598+
println!(
599+
"{}",
600+
format!("Audit History for Key: {}", key_id).cyan().bold()
601+
);
571602
println!();
572603

573604
for entry in entries {
574605
let timestamp = entry.timestamp.format("%Y-%m-%d %H:%M:%S UTC");
575606
let event_str = format_event_type(entry.event_type);
576607

577-
println!("{} {} by {}", timestamp.to_string().dimmed(), event_str, entry.actor);
608+
println!(
609+
"{} {} by {}",
610+
timestamp.to_string().dimmed(),
611+
event_str,
612+
entry.actor
613+
);
578614

579615
if let Some(ref kd) = entry.key_details {
580616
println!(" Fingerprint: {}", kd.fingerprint.cyan());
@@ -622,19 +658,27 @@ fn cmd_audit_verify(km: &mut KeyManager) -> Result<(), Box<dyn std::error::Error
622658
println!();
623659
println!(
624660
"{}",
625-
"WARNING: The audit log may have been tampered with!".yellow().bold()
661+
"WARNING: The audit log may have been tampered with!"
662+
.yellow()
663+
.bold()
626664
);
627665
}
628666

629667
Ok(())
630668
}
631669

632-
fn cmd_audit_export(km: &mut KeyManager, output: &PathBuf) -> Result<(), Box<dyn std::error::Error>> {
670+
fn cmd_audit_export(
671+
km: &mut KeyManager,
672+
output: &PathBuf,
673+
) -> Result<(), Box<dyn std::error::Error>> {
633674
unlock_store(km)?;
634675

635676
if output.exists() {
636677
let confirm = Confirm::new()
637-
.with_prompt(format!("File {} already exists. Overwrite?", output.display()))
678+
.with_prompt(format!(
679+
"File {} already exists. Overwrite?",
680+
output.display()
681+
))
638682
.default(false)
639683
.interact()?;
640684

crates/januskey-cli/src/lib.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@ pub mod operations;
2424
pub use reversible_core::content_store::{self, ContentHash, ContentStore};
2525
/// Error module — re-exports reversible-core error types with JanusKey naming
2626
pub mod error {
27-
pub use reversible_core::error::ReversibleError as JanusError;
2827
pub use reversible_core::error::Result;
28+
pub use reversible_core::error::ReversibleError as JanusError;
2929
}
3030
pub use error::{JanusError, Result};
3131
pub use reversible_core::manifest::{self, ManifestEmitter};
3232
pub use reversible_core::metadata::{self, MetadataStore, OperationMetadata, OperationType};
33-
pub use reversible_core::transaction::{
34-
self, Transaction, TransactionManager, TransactionPreview,
35-
};
33+
pub use reversible_core::transaction::{self, Transaction, TransactionManager, TransactionPreview};
3634
pub use reversible_core::ReversibleExecutor;
3735

3836
pub use attestation::{AuditEntry, AuditEventType, AuditLog, IntegrityReport, KeyEventDetails};
@@ -78,7 +76,14 @@ impl Config {
7876
pub fn load(dir: &std::path::Path) -> Self {
7977
let config_path = dir.join(".januskey").join("config.json");
8078
if config_path.exists() {
81-
if let Ok(content) = ({ use std::io::Read; std::fs::File::open(&config_path).and_then(|mut f| { let mut buf = String::new(); f.take(10 * 1024 * 1024).read_to_string(&mut buf)?; Ok(buf) }) }) {
79+
if let Ok(content) = ({
80+
use std::io::Read;
81+
std::fs::File::open(&config_path).and_then(|mut f| {
82+
let mut buf = String::new();
83+
f.take(10 * 1024 * 1024).read_to_string(&mut buf)?;
84+
Ok(buf)
85+
})
86+
}) {
8287
if let Ok(config) = serde_json::from_str(&content) {
8388
return config;
8489
}

0 commit comments

Comments
 (0)