Compare commits

..

3 commits

Author SHA1 Message Date
bad
6bed1a222e Update tests to include multiple signatures 2022-08-19 15:55:03 +02:00
bad
b5156b645f Fix signature serialization 2022-08-19 15:53:40 +02:00
bad
3e34190ede Fix the sig parsing in narinfo parsing code
Unlike references, multiple signatures are stored as separate key-value
pairs. Previously this crate assumed that narinfo sigs were stored as a
single key, separated by spaces.
2022-08-19 13:47:32 +02:00
3 changed files with 14 additions and 12 deletions

View file

@ -8,3 +8,4 @@ NarSize: 11374872
References: mhhlymrg2m70r8h94cwhv2d7a0c8l7g6-glibc-2.34-210 ppn8983d9b5r6k7mnhkbg6rqw7vgl1ij-libyaml-0.2.5 qm2lv1gpbyn0rsfai40cbvj3h4gz69yc-bash-5.1-p16 sn0w3f12547crckss4ybmnxmi29gpgq7-perl-5.34.1 zzxrhj9056vjlanfjkinvhd7458yc2z8-liblouis-3.22.0 References: mhhlymrg2m70r8h94cwhv2d7a0c8l7g6-glibc-2.34-210 ppn8983d9b5r6k7mnhkbg6rqw7vgl1ij-libyaml-0.2.5 qm2lv1gpbyn0rsfai40cbvj3h4gz69yc-bash-5.1-p16 sn0w3f12547crckss4ybmnxmi29gpgq7-perl-5.34.1 zzxrhj9056vjlanfjkinvhd7458yc2z8-liblouis-3.22.0
Deriver: dlxmsgfc0am35fh0kiy88zqr91x2dn5j-liblouis-3.22.0.drv Deriver: dlxmsgfc0am35fh0kiy88zqr91x2dn5j-liblouis-3.22.0.drv
Sig: cache.nixos.org-1:BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ== Sig: cache.nixos.org-1:BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ==
Sig: fake-test-sig-1:BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ==

View file

@ -23,6 +23,8 @@ impl<'a> NarInfo<'a> {
/// ``` /// ```
pub fn parse(value: &'a str) -> ParsingResult<Self> { pub fn parse(value: &'a str) -> ParsingResult<Self> {
let mut builder = NarInfoBuilder::default(); let mut builder = NarInfoBuilder::default();
let mut sigs = Vec::new();
for line in value.lines() { for line in value.lines() {
let (key, value) = line let (key, value) = line
.split_once(':') .split_once(':')
@ -46,20 +48,15 @@ impl<'a> NarInfo<'a> {
"Deriver" => builder.deriver(Some(Cow::from(value))), "Deriver" => builder.deriver(Some(Cow::from(value))),
"System" => builder.system(Some(Cow::from(value))), "System" => builder.system(Some(Cow::from(value))),
"References" => builder.references(value.split(' ').map(Cow::from).collect()), "References" => builder.references(value.split(' ').map(Cow::from).collect()),
// TODO: replace with try_collect once that gets stabilized "Sig" => {
"Sig" => builder.sigs(value.split(' ').map(Sig::try_from).try_fold( sigs.push(Sig::try_from(value)?);
Vec::new(), &mut builder
|mut a, c| {
c.map(|c| {
a.push(c);
a
})
}, },
)?),
_ => return Err(ParsingError::UnknownKey { key }), _ => return Err(ParsingError::UnknownKey { key }),
}; };
} }
builder.sigs(sigs);
builder.build() builder.build()
} }
} }
@ -124,6 +121,10 @@ mod tests {
assert_eq!(sig.key_name, "cache.nixos.org-1"); assert_eq!(sig.key_name, "cache.nixos.org-1");
assert_eq!(sig.sig, "BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ=="); assert_eq!(sig.sig, "BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ==");
assert!(info.sigs.len() == 1); let sig = &info.sigs[1];
assert_eq!(sig.key_name, "fake-test-sig-1");
assert_eq!(sig.sig, "BJ5QGcOta2s76XC6sep9DbAv0x3TILh3hHSKyR+9rFWYuBDTWdHs1KHeUEpw2espE/zPPBp2yURO6/J4Dhf9DQ==");
assert!(info.sigs.len() == 2);
} }
} }

View file

@ -17,8 +17,8 @@ impl<'a> NarInfo<'a> {
write!(w, "\nNarSize: {}", self.nar_size)?; write!(w, "\nNarSize: {}", self.nar_size)?;
write!(w, "\nReferences: {}", self.references.join(" "))?; write!(w, "\nReferences: {}", self.references.join(" "))?;
write!(w, "\nSig: ")?;
for sig in self.sigs.iter() { for sig in self.sigs.iter() {
write!(w, "\nSig: ")?;
sig.serialize_into(w)?; sig.serialize_into(w)?;
} }