Treat PIN fields as sensitive (#81)

This commit is contained in:
2026-08-12 20:11:05 +02:00
parent 00a22e9968
commit b5571fcc5b
3 changed files with 53 additions and 5 deletions

View File

@@ -277,6 +277,53 @@ fn mobile_projection_marks_an_empty_first_line_without_a_reveal_control() -> Tes
Ok(())
}
#[test]
fn pin_fields_are_sensitive_case_insensitively() -> TestResult {
let fixture = FixtureSet::load()?;
let store = fixture.materialize_store("basic")?;
let repository = Repository::open(store.path())?;
let keys = KeyStore::load(fixture.path("keys"))?;
let mut secrets = FixtureSecrets::all(&fixture);
write_plaintext(
&repository,
&keys,
"documents/pins",
b"password\nPIN: 1234\npin: 5678\nPiN: 9012\n",
)?;
let document =
EntryDocumentService::new(&repository, &keys).open("documents/pins", &mut secrets)?;
let pins = &document.fields()[1..];
assert!(pins.iter().all(|field| {
field.metadata().kind() == EntryFieldKind::Field
&& field.metadata().sensitivity() == EntrySensitivity::Sensitive
}));
let page = MobileEntryPage::from_document(&document);
let projected = page
.sections()
.iter()
.flat_map(|section| section.fields())
.filter(|field| field.id() != 0)
.collect::<Vec<_>>();
assert_eq!(projected.len(), 3);
assert!(projected.iter().all(|field| {
field.sensitive()
&& field.value().is_none()
&& field.masked_value() == "Hidden"
&& !field.selectable()
}));
assert_eq!(field_value(&document, pins[0].id().value())?, "1234");
let editor = MobileEntryDraft::new(document, false).page();
assert!(
editor.fields()[1..]
.iter()
.all(|field| field.sensitive() && field.masked_value() == "Hidden")
);
Ok(())
}
#[test]
fn named_multiline_fields_are_one_lossless_logical_field() -> TestResult {
let fixture = FixtureSet::load()?;