Implement structured desktop entry viewer

This commit is contained in:
2026-08-10 16:27:47 +02:00
parent f363081fa2
commit f6e74cbb1d
3 changed files with 428 additions and 11 deletions

View File

@@ -41,12 +41,19 @@ pub enum EntrySensitivity {
Empty,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum EntryFieldDiagnostic {
MalformedOtpUri,
NonUtf8Value,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct EntryFieldMetadata {
kind: EntryFieldKind,
sensitivity: EntrySensitivity,
name: Option<String>,
otp: Option<EntryOtpMetadata>,
diagnostic: Option<EntryFieldDiagnostic>,
value: Range<usize>,
}
@@ -66,6 +73,10 @@ impl EntryFieldMetadata {
pub fn otp(&self) -> Option<&EntryOtpMetadata> {
self.otp.as_ref()
}
pub fn diagnostic(&self) -> Option<EntryFieldDiagnostic> {
self.diagnostic
}
}
/// Non-secret presentation metadata parsed from a validated `otpauth` URI.
@@ -545,6 +556,8 @@ fn classify(index: usize, line: &[u8]) -> EntryFieldMetadata {
sensitivity: EntrySensitivity::Sensitive,
name: Some("password".to_owned()),
otp: None,
diagnostic: (!line.is_ascii() && std::str::from_utf8(line).is_err())
.then_some(EntryFieldDiagnostic::NonUtf8Value),
value: 0..line.len(),
};
}
@@ -568,6 +581,17 @@ fn classify(index: usize, line: &[u8]) -> EntryFieldMetadata {
sensitivity: EntrySensitivity::Sensitive,
name: Some("otp".to_owned()),
otp: Some(otp),
diagnostic: None,
value: 0..line.len(),
};
}
if line.starts_with(b"otpauth://") {
return EntryFieldMetadata {
kind: EntryFieldKind::OtpUri,
sensitivity: EntrySensitivity::Sensitive,
name: Some("otp".to_owned()),
otp: None,
diagnostic: Some(EntryFieldDiagnostic::MalformedOtpUri),
value: 0..line.len(),
};
}
@@ -583,6 +607,9 @@ fn classify(index: usize, line: &[u8]) -> EntryFieldMetadata {
sensitivity: field_sensitivity(name, kind),
name: Some(name.to_owned()),
otp: None,
diagnostic: std::str::from_utf8(&line[value_start..])
.is_err()
.then_some(EntryFieldDiagnostic::NonUtf8Value),
value: value_start..line.len(),
};
}
@@ -592,6 +619,9 @@ fn classify(index: usize, line: &[u8]) -> EntryFieldMetadata {
sensitivity: EntrySensitivity::Sensitive,
name: None,
otp: None,
diagnostic: std::str::from_utf8(line)
.is_err()
.then_some(EntryFieldDiagnostic::NonUtf8Value),
value: 0..line.len(),
}
}
@@ -624,6 +654,7 @@ fn blank_metadata() -> EntryFieldMetadata {
sensitivity: EntrySensitivity::Empty,
name: None,
otp: None,
diagnostic: None,
value: 0..0,
}
}