1
0
mirror of https://github.com/pcvolkmer/cert-tools.git synced 2025-04-19 17:06:49 +00:00

refactor: extract merge command

This commit is contained in:
Paul-Christian Volkmer 2025-01-14 20:23:04 +01:00
parent 6b5fefec71
commit a380a2ac96

View File

@ -93,57 +93,12 @@ fn main() -> Result<(), ()> {
return Err(()); return Err(());
} }
} }
SubCommand::Merge { cert, ca } => { SubCommand::Merge { cert, ca } => match merge(&cert, ca) {
let chain = Chain::read(Path::new(&cert)); Ok(pem) => {
println!("{pem}");
if let Ok(mut chain) = chain { eprintln!("{}", style("success").green());
if let Some(ca) = ca { },
if let Ok(ca_chain) = Chain::read(Path::new(&ca)) { Err(err) => eprintln!("{}", style(err).red()),
for ca_cert in ca_chain.into_vec() {
chain.push(ca_cert);
}
} else {
eprintln!("{}", style(format!("Cannot read file: {ca}")).red());
return Err(());
}
}
if !chain.is_valid() {
eprintln!(
"{}",
style("Cannot merge files to valid chain - try to sort unique certs")
.yellow()
);
}
let mut certs = chain.into_vec();
certs.sort_by(|cert1, cert2| {
if cert1.subject_key_id() == cert2.authority_key_id() {
Ordering::Greater
} else {
Ordering::Less
}
});
let chain = Chain::from(certs.into_iter().unique().collect::<Vec<_>>());
if !chain.is_valid() {
eprintln!(
"{}",
style("Cannot merge files to valid chain - giving up!").red()
);
return Err(());
}
for cert in chain.certs() {
if let Ok(plain) = cert.to_pem() { print!("{plain}") } else {
eprintln!(
"{}",
style("Cannot merge files to valid chain - Cert error!").red()
);
return Err(());
}
}
} else {
eprintln!("{}", style(format!("Cannot read file: {cert}")).red());
return Err(());
}
eprintln!("{}", style("Success!").green());
} }
} }
Ok(()) Ok(())
@ -184,3 +139,39 @@ Authority-Key-Id: {}",
); );
} }
} }
fn merge(cert: &str, ca: Option<String>) -> Result<String, String> {
let chain = Chain::read(Path::new(&cert));
if let Ok(mut chain) = chain {
if let Some(ca) = ca {
if let Ok(ca_chain) = Chain::read(Path::new(&ca)) {
for ca_cert in ca_chain.into_vec() {
chain.push(ca_cert);
}
} else {
return Err(format!("Cannot read file: {ca}"));
}
}
let mut certs = chain.into_vec();
certs.sort_by(|cert1, cert2| {
if cert1.subject_key_id() == cert2.authority_key_id() {
Ordering::Greater
} else {
Ordering::Less
}
});
let chain = Chain::from(certs.into_iter().unique().collect::<Vec<_>>());
if !chain.is_valid() {
return Err("Cannot merge files to valid chain - giving up!".to_string());
}
let mut pem = vec![];
for cert in chain.certs() {
if let Ok(plain) = cert.to_pem() { pem.push(plain) } else {
return Err("Cannot merge files to valid chain - Cert error!".to_string());
}
}
return Ok(pem.join(""));
}
Err(format!("Cannot read file: {cert}"))
}