Skip to content

Commit

Permalink
BREAKING: disallow static import of local modules from remote modules (
Browse files Browse the repository at this point in the history
…#5050)

This commit changes module loading logic to disallow statically import
local module (file:// scheme) from remote modules (http://, https://
schemes).
  • Loading branch information
bartlomieju authored May 2, 2020
1 parent de2c042 commit 2872b36
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 0 deletions.
18 changes: 18 additions & 0 deletions cli/ops/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,24 @@ fn op_fetch_source_files(
async move {
let resolved_specifier = ModuleSpecifier::resolve_url(&specifier)
.expect("Invalid specifier");
// TODO(bartlomieju): duplicated from `state.rs::ModuleLoader::load` - deduplicate
// Verify that remote file doesn't try to statically import local file.
if let Some(referrer) = ref_specifier_.as_ref() {
let referrer_url = referrer.as_url();
match referrer_url.scheme() {
"http" | "https" => {
let specifier_url = resolved_specifier.as_url();
match specifier_url.scheme() {
"http" | "https" => {},
_ => {
let e = OpError::permission_denied("Remote module are not allowed to statically import local modules. Use dynamic import instead.".to_string());
return Err(e.into());
}
}
},
_ => {}
}
}
file_fetcher_
.fetch_source_file(&resolved_specifier, ref_specifier_)
.await
Expand Down
18 changes: 18 additions & 0 deletions cli/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,24 @@ impl ModuleLoader for State {
if let Err(e) = self.check_dyn_import(&module_specifier) {
return async move { Err(e.into()) }.boxed_local();
}
} else {
// Verify that remote file doesn't try to statically import local file.
if let Some(referrer) = maybe_referrer.as_ref() {
let referrer_url = referrer.as_url();
match referrer_url.scheme() {
"http" | "https" => {
let specifier_url = module_specifier.as_url();
match specifier_url.scheme() {
"http" | "https" => {}
_ => {
let e = OpError::permission_denied("Remote module are not allowed to statically import local modules. Use dynamic import instead.".to_string());
return async move { Err(e.into()) }.boxed_local();
}
}
}
_ => {}
}
}
}

let mut state = self.borrow_mut();
Expand Down
1 change: 1 addition & 0 deletions cli/tests/error_local_static_import_from_remote.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import "file:///some/dir/file.js";
2 changes: 2 additions & 0 deletions cli/tests/error_local_static_import_from_remote.js.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[WILDCARD]
Remote module are not allowed to statically import local modules. Use dynamic import instead.
1 change: 1 addition & 0 deletions cli/tests/error_local_static_import_from_remote.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import "file:///some/dir/file.ts";
9 changes: 9 additions & 0 deletions cli/tests/error_local_static_import_from_remote.ts.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[WILDCARD]
error: Uncaught PermissionDenied: Remote module are not allowed to statically import local modules. Use dynamic import instead.
at unwrapResponse ($deno$/ops/dispatch_json.ts:[WILDCARD])
at Object.sendAsync ($deno$/ops/dispatch_json.ts:[WILDCARD])
at async processImports ($deno$/compiler/imports.ts:[WILDCARD])
at async Object.processImports ($deno$/compiler/imports.ts:[WILDCARD])
at async compile ([WILDCARD]compiler.ts:[WILDCARD])
at async tsCompilerOnMessage ([WILDCARD]compiler.ts:[WILDCARD])
at async workerMessageRecvCallback ($deno$/runtime_worker.ts:[WILDCARD])
16 changes: 16 additions & 0 deletions cli/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,22 @@ itest!(error_type_definitions {
output: "error_type_definitions.ts.out",
});

itest!(error_local_static_import_from_remote_ts {
args: "run --reload http://localhost:4545/cli/tests/error_local_static_import_from_remote.ts",
check_stderr: true,
exit_code: 1,
http_server: true,
output: "error_local_static_import_from_remote.ts.out",
});

itest!(error_local_static_import_from_remote_js {
args: "run --reload http://localhost:4545/cli/tests/error_local_static_import_from_remote.js",
check_stderr: true,
exit_code: 1,
http_server: true,
output: "error_local_static_import_from_remote.js.out",
});

// TODO(bartlomieju) Re-enable
itest_ignore!(error_worker_dynamic {
args: "run --reload error_worker_dynamic.ts",
Expand Down

0 comments on commit 2872b36

Please sign in to comment.