Skip to content

Commit 987f19d

Browse files
author
Alex Helfet
committed
Forbid relative path in registry index (relative URL only), update tests.
1 parent ef00aa9 commit 987f19d

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

src/cargo/util/config.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use crate::util::errors::{self, internal, CargoResult, CargoResultExt};
2929
use crate::util::toml as cargo_toml;
3030
use crate::util::Filesystem;
3131
use crate::util::Rustc;
32-
use crate::util::ToUrlWithBase;
32+
use crate::util::{ToUrl, ToUrlWithBase};
3333
use crate::util::{paths, validate_package_name};
3434

3535
/// Configuration information for cargo. This is not specific to a build, it is information
@@ -684,7 +684,9 @@ impl Config {
684684
}
685685

686686
fn resolve_registry_index(&self, index: Value<String>) -> CargoResult<Url> {
687-
let base = index.definition.root(&self).join("truncated-by-url-with-base");
687+
let base = index.definition.root(&self).join("truncated-by-url_with_base");
688+
// Parse val to check it is a URL, not a relative path without a protocol.
689+
let _parsed = index.val.to_url()?;
688690
let url = index.val.to_url_with_base(Some(&*base))?;
689691
if url.password().is_some() {
690692
failure::bail!("Registry URLs may not contain passwords");

tests/testsuite/alt_registry.rs

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,13 +1167,13 @@ fn unknown_registry() {
11671167
}
11681168

11691169
#[test]
1170-
fn registries_index_relative_path() {
1170+
fn registries_index_relative_url() {
11711171
let config = paths::root().join(".cargo/config");
11721172
fs::create_dir_all(config.parent().unwrap()).unwrap();
11731173
File::create(&config).unwrap()
11741174
.write_all(br#"
11751175
[registries.relative]
1176-
index = "alternative-registry"
1176+
index = "file:alternative-registry"
11771177
"#).unwrap();
11781178

11791179
registry::init();
@@ -1215,13 +1215,13 @@ fn registries_index_relative_path() {
12151215
}
12161216

12171217
#[test]
1218-
fn registry_index_relative_path() {
1218+
fn registry_index_relative_url() {
12191219
let config = paths::root().join(".cargo/config");
12201220
fs::create_dir_all(config.parent().unwrap()).unwrap();
12211221
File::create(&config).unwrap()
12221222
.write_all(br#"
12231223
[registry]
1224-
index = "alternative-registry"
1224+
index = "file:alternative-registry"
12251225
"#).unwrap();
12261226

12271227
registry::init();
@@ -1263,3 +1263,49 @@ warning: custom registry support via the `registry.index` configuration is being
12631263
))
12641264
.run();
12651265
}
1266+
1267+
#[test]
1268+
fn registries_index_relative_path_not_allowed() {
1269+
let config = paths::root().join(".cargo/config");
1270+
fs::create_dir_all(config.parent().unwrap()).unwrap();
1271+
File::create(&config).unwrap()
1272+
.write_all(br#"
1273+
[registries.relative]
1274+
index = "alternative-registry"
1275+
"#).unwrap();
1276+
1277+
registry::init();
1278+
1279+
let p = project()
1280+
.file(
1281+
"Cargo.toml",
1282+
r#"
1283+
[project]
1284+
name = "foo"
1285+
version = "0.0.1"
1286+
authors = []
1287+
1288+
[dependencies.bar]
1289+
version = "0.0.1"
1290+
registry = "relative"
1291+
"#,
1292+
)
1293+
.file("src/main.rs", "fn main() {}")
1294+
.build();
1295+
1296+
Package::new("bar", "0.0.1")
1297+
.alternative(true)
1298+
.publish();
1299+
1300+
p.cargo("build")
1301+
.with_stderr(&format!(
1302+
"\
1303+
error: failed to parse manifest at `{root}/foo/Cargo.toml`
1304+
1305+
Caused by:
1306+
invalid url `alternative-registry`: relative URL without a base
1307+
"
1308+
, root = paths::root().to_str().unwrap()))
1309+
.with_status(101)
1310+
.run();
1311+
}

0 commit comments

Comments
 (0)