handle non-string users
Some checks failed
CI / matrix (push) Failing after 2s
CI / (push) Has been skipped
CI / build (push) Has been skipped
CI / build-nixpkgs (push) Has been skipped

This commit is contained in:
Robin Appelman 2025-04-07 19:45:27 +02:00
commit de82dcf793
3 changed files with 43 additions and 5 deletions

View file

@ -3,7 +3,7 @@ use crate::logfile::LogIndex;
use ahash::AHasher;
use derive_more::{Display, From};
use logsmash_data::LogLevel;
use serde::Deserialize;
use serde::{Deserialize, Deserializer};
use serde_json::Value;
use std::borrow::Cow;
use std::fmt::{Display, Formatter};
@ -30,7 +30,7 @@ pub struct LogLine<'a> {
pub index: LogIndex,
#[serde(rename = "reqId")]
pub request_id: TinyAsciiStr<32>,
pub user: TinyAsciiStr<64>,
pub user: LogUser,
pub method: TinyAsciiStr<12>,
pub url: Cow<'a, str>,
#[serde(rename = "remoteAddr")]
@ -44,6 +44,39 @@ pub struct LogLine<'a> {
pub time: OffsetDateTime,
}
#[derive(Clone)]
pub enum LogUser {
None,
User(TinyAsciiStr<64>),
}
impl LogUser {
pub fn as_str(&self) -> &str {
match self {
LogUser::None => "",
LogUser::User(user) => user.as_str(),
}
}
}
impl From<TinyAsciiStr<64>> for LogUser {
fn from(user: TinyAsciiStr<64>) -> Self {
LogUser::User(user)
}
}
impl<'de> Deserialize<'de> for LogUser {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
match TinyAsciiStr::deserialize(deserializer) {
Ok(user) => Ok(LogUser::User(user)),
Err(_) => Ok(LogUser::None),
}
}
}
mod date {
use crate::logfile::logline::CUSTOM_TIME_FORMAT;
use serde::de::Error;
@ -160,7 +193,7 @@ impl<'a> LogLine<'a> {
|| filter_part.is_match(&self.url)
|| filter_part.is_match(&self.method)
|| filter_part.is_match(&self.remote)
|| filter_part.is_match(&self.user)
|| filter_part.is_match(self.user.as_str())
})
}
}

View file

@ -337,7 +337,7 @@ fn test_matcher() {
index: LogIndex::from(0),
method: TinyAsciiStr::from_str("GET").unwrap(),
remote: TinyAsciiStr::from_str("1.2.3.4").unwrap(),
user: TinyAsciiStr::from_str("user").unwrap(),
user: TinyAsciiStr::from_str("user").unwrap().into(),
url: "/url".into(),
request_id: TinyAsciiStr::from_str("123456").unwrap(),
};

View file

@ -57,7 +57,12 @@ impl StatefulWidget for GroupedLogs<'_> {
.wrap(Wrap::default()),
GroupedLogGrouping::Request => Paragraph::new(format!(
"{} {}\n\n {} from {} by {} - Nextcloud {}",
line.method, line.url, line.request_id, line.remote, line.user, line.version,
line.method,
line.url,
line.request_id,
line.remote,
line.user.as_str(),
line.version,
))
.wrap(Wrap::default()),
};