Skip to content

Commit 63cddaa

Browse files
apply first round of CR
1 parent 9700e26 commit 63cddaa

File tree

4 files changed

+26
-239
lines changed

4 files changed

+26
-239
lines changed

src/dist/download.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,13 @@ impl<'a> DownloadCfg<'a> {
137137
})
138138
})?;
139139

140-
let content = utils::read_file("channel data", file).map(|s| s.to_owned())?;
141-
if !crate::dist::signatures::verify_signature(&content, &signature)? {
140+
let file_path: &Path = &file;
141+
let content = std::fs::File::open(file_path).chain_err(|| ErrorKind::ReadingFile {
142+
name: "channel data",
143+
path: PathBuf::from(file_path),
144+
})?;
145+
146+
if !crate::dist::signatures::verify_signature(content, &signature)? {
142147
Err(ErrorKind::SignatureVerificationFailed {
143148
url: url.to_owned(),
144149
}
@@ -199,12 +204,11 @@ impl<'a> DownloadCfg<'a> {
199204
}
200205

201206
// No signatures for tarballs for now.
202-
if !url_str.ends_with(".tar.gz") && !url_str.ends_with(".tar.xz") {
203-
if let Err(err) = self.check_signature(&url_str, &file) {
204-
// TODO: this should probably be warn!, but log is not used in this part of the code
205-
// at the moment.
206-
println!("Invalid signature detected: {}", err);
207-
}
207+
if !url_str.ends_with(".tar.gz")
208+
&& !url_str.ends_with(".tar.xz")
209+
&& self.check_signature(&url_str, &file).is_err()
210+
{
211+
(self.notify_handler)(Notification::SignatureInvalid(url_str));
208212
}
209213

210214
Ok(Some((file, partial_hash)))

src/dist/notifications.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub enum Notification<'a> {
3535
ManifestChecksumFailedHack,
3636
ComponentUnavailable(&'a str, Option<&'a TargetTriple>),
3737
StrayHash(&'a Path),
38+
SignatureInvalid(&'a str),
3839
}
3940

4041
impl<'a> From<crate::utils::Notification<'a>> for Notification<'a> {
@@ -79,6 +80,7 @@ impl<'a> Notification<'a> {
7980
| ForcingUnavailableComponent(_)
8081
| StrayHash(_) => NotificationLevel::Warn,
8182
NonFatalError(_) => NotificationLevel::Error,
83+
SignatureInvalid(_) => NotificationLevel::Warn,
8284
}
8385
}
8486
}
@@ -171,6 +173,7 @@ impl<'a> Display for Notification<'a> {
171173
ForcingUnavailableComponent(component) => {
172174
write!(f, "Force-skipping unavailable component '{}'", component)
173175
}
176+
SignatureInvalid(url) => write!(f, "Signature verification failed for '{}'", url),
174177
}
175178
}
176179
}

src/dist/rust-signing-key.asc

Lines changed: 0 additions & 221 deletions
This file was deleted.

src/dist/signatures.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use pgp::{Deserializable, SignedPublicKey, StandaloneSignature};
77

88
use crate::errors::*;
99

10-
// const SIGNING_KEY_BYTES: &[u8] = include_bytes!("rust-signing-key.asc");
10+
use std::io::Read;
11+
12+
// const SIGNING_KEY_BYTES: &[u8] = include_bytes!("../rust-key.gpg.ascii");
1113
const SIGNING_KEY_BYTES: &[u8] = include_bytes!("../../tests/mock/signing-key.pub.asc");
1214

1315
lazy_static::lazy_static! {
@@ -24,24 +26,23 @@ fn squish_internal_err<E: std::fmt::Display>(err: E) -> Error {
2426
ErrorKind::SignatureVerificationInternalError(format!("{}", err)).into()
2527
}
2628

27-
pub fn verify_signature(content: &str, signature: &str) -> Result<bool> {
29+
pub fn verify_signature<T: Read>(mut content: T, signature: &str) -> Result<bool> {
30+
let mut content_buf = Vec::new();
31+
content.read_to_end(&mut content_buf)?;
2832
let (signatures, _) =
2933
StandaloneSignature::from_string_many(signature).map_err(squish_internal_err)?;
3034

3135
for signature in signatures {
3236
let signature = signature.map_err(squish_internal_err)?;
3337

3438
for key in &*SIGNING_KEYS {
35-
if key.is_signing_key() {
36-
if signature.verify(key, content.as_bytes()).is_ok() {
37-
return Ok(true);
38-
}
39+
if key.is_signing_key() && signature.verify(key, &content_buf).is_ok() {
40+
return Ok(true);
3941
}
42+
4043
for sub_key in &key.public_subkeys {
41-
if sub_key.is_signing_key() {
42-
if signature.verify(sub_key, content.as_bytes()).is_ok() {
43-
return Ok(true);
44-
}
44+
if sub_key.is_signing_key() && signature.verify(sub_key, &content_buf).is_ok() {
45+
return Ok(true);
4546
}
4647
}
4748
}

0 commit comments

Comments
 (0)