Implement structured desktop entry viewer
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user