Make expire date certificate optional.

This commit is contained in:
Jean-Christophe Amiel 2025-12-14 12:50:27 +01:00
parent 802ef42ab5
commit be3f658fbd
No known key found for this signature in database
GPG Key ID: 07FF11CFD55356CC
4 changed files with 17 additions and 11 deletions

View File

@ -30,7 +30,7 @@ pub struct Certificate {
subject: Option<String>,
issuer: Option<String>,
start_date: Option<DateTime<Utc>>,
pub expire_date: DateTime<Utc>,
pub expire_date: Option<DateTime<Utc>>,
pub serial_number: String,
pub subject_alt_name: Option<String>,
}
@ -41,7 +41,7 @@ impl Certificate {
subject: Option<String>,
issuer: Option<String>,
start_date: Option<DateTime<Utc>>,
expire_date: DateTime<Utc>,
expire_date: Option<DateTime<Utc>>,
serial_number: String,
subject_alt_name: Option<String>,
) -> Self {
@ -80,7 +80,7 @@ impl TryFrom<CertInfo> for Certificate {
let subject = parse_subject(&attributes).ok();
let issuer = parse_issuer(&attributes).ok();
let start_date = parse_start_date(&attributes).ok();
let expire_date = parse_expire_date(&attributes)?;
let expire_date = parse_expire_date(&attributes).ok();
let serial_number = parse_serial_number(&attributes)?;
let subject_alt_name = parse_subject_alt_name(&attributes).ok();
Ok(Certificate {
@ -307,9 +307,9 @@ mod tests {
start_date: Some(DateTime::parse_from_rfc2822("Tue, 10 Jan 2023 08:29:52 GMT")
.unwrap()
.with_timezone(&Utc)),
expire_date: DateTime::parse_from_rfc2822("Thu, 30 Oct 2025 08:29:52 GMT")
expire_date: Some(DateTime::parse_from_rfc2822("Thu, 30 Oct 2025 08:29:52 GMT")
.unwrap()
.with_timezone(&Utc),
.with_timezone(&Utc)),
serial_number: "1e:e8:b1:7f:1b:64:d8:d6:b3:de:87:01:03:d2:a4:f5:33:53:5a:b0"
.to_string(),
subject_alt_name: Some("DNS:localhost, IP address:127.0.0.1, IP address:0:0:0:0:0:0:0:1".to_string())
@ -319,7 +319,7 @@ mod tests {
Certificate::try_from(CertInfo { data: vec![] })
.err()
.unwrap(),
"missing expire date attribute".to_string()
"Missing serial number attribute in {}".to_string()
);
}
}

View File

@ -195,7 +195,8 @@ struct CertificateJson {
issuer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
start_date: Option<String>,
expire_date: String,
#[serde(skip_serializing_if = "Option::is_none")]
expire_date: Option<String>,
serial_number: String,
#[serde(skip_serializing_if = "Option::is_none")]
subject_alt_name: Option<String>,
@ -451,7 +452,7 @@ impl CertificateJson {
subject: c.subject().cloned(),
issuer: c.issuer().cloned(),
start_date: c.start_date().map(|d| d.to_string()),
expire_date: c.expire_date.to_string(),
expire_date: c.expire_date.map(|d| d.to_string()),
serial_number: c.serial_number.to_string(),
subject_alt_name: c.subject_alt_name.clone(),
}

View File

@ -131,7 +131,6 @@ fn get_call_html(
// Certificate
if let Some(certificate) = &call.response.certificate {
let end_date = certificate.expire_date.to_string();
let mut values = vec![];
if let Some(subject) = certificate.subject() {
@ -144,7 +143,10 @@ fn get_call_html(
if let Some(start_date) = start_date.as_ref() {
values.push(("Start Date", start_date.as_str()));
}
values.push(("Expire Date", end_date.as_str()));
let expire_date = certificate.expire_date.map(|d| d.to_string());
if let Some(expire_date) = expire_date.as_ref() {
values.push(("Expire Date", expire_date.as_str()));
}
values.push(("Serial Number", certificate.serial_number.as_str()));
if let Some(subject_alt_name) = certificate.subject_alt_name.as_ref() {
values.push(("Subject Alt Name", subject_alt_name.as_str()));

View File

@ -396,7 +396,10 @@ fn eval_query_certificate(
Some(date) => Value::Date(date),
None => return Ok(None),
},
CertificateAttributeName::ExpireDate => Value::Date(certificate.expire_date),
CertificateAttributeName::ExpireDate => match certificate.expire_date {
Some(date) => Value::Date(date),
None => return Ok(None),
},
CertificateAttributeName::SerialNumber => {
Value::String(certificate.serial_number.clone())
}