Skip to content

Commit bebbb77

Browse files
authored
fix: make the file fetcher respect the root certificate store configured via DENO_TLS_CA_STORE (#633)
* fix: make the file fetcher respect the root certificate store configured via `DENO_TLS_CA_STORE` * stamp: oops
1 parent b00234e commit bebbb77

File tree

7 files changed

+563
-54
lines changed

7 files changed

+563
-54
lines changed

crates/base/src/runtime/mod.rs

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ use deno::deno_package_json;
4242
use deno::deno_telemetry;
4343
use deno::deno_telemetry::OtelConfig;
4444
use deno::deno_tls;
45-
use deno::deno_tls::deno_native_certs::load_native_certs;
46-
use deno::deno_tls::rustls::RootCertStore;
47-
use deno::deno_tls::RootCertStoreProvider;
4845
use deno::deno_url;
4946
use deno::deno_web;
5047
use deno::deno_webidl;
@@ -70,6 +67,7 @@ use deno_core::OpState;
7067
use deno_core::PollEventLoopOptions;
7168
use deno_core::ResolutionKind;
7269
use deno_core::RuntimeOptions;
70+
use deno_facade::cert_provider::get_root_cert_store_provider;
7371
use deno_facade::generate_binary_eszip;
7472
use deno_facade::metadata::Entrypoint;
7573
use deno_facade::migrate::MigrateOptions;
@@ -82,7 +80,6 @@ use either::Either;
8280
use either::Either::Left;
8381
use either::Either::Right;
8482
use ext_event_worker::events::WorkerEventWithMetadata;
85-
use ext_runtime::cert::ValueRootCertStoreProvider;
8683
use ext_runtime::external_memory::CustomAllocator;
8784
use ext_runtime::MemCheckWaker;
8885
use ext_runtime::PromiseMetrics;
@@ -2239,53 +2236,6 @@ fn terminate_execution_if_cancelled(
22392236
)
22402237
}
22412238

2242-
fn get_root_cert_store_provider(
2243-
) -> Result<Arc<dyn RootCertStoreProvider>, AnyError> {
2244-
// Create and populate a root cert store based on environment variable.
2245-
// Reference: https://github.com/denoland/deno/blob/v1.37.0/cli/args/mod.rs#L467
2246-
let mut root_cert_store = RootCertStore::empty();
2247-
let ca_stores: Vec<String> = (|| {
2248-
let env_ca_store = std::env::var("DENO_TLS_CA_STORE").ok()?;
2249-
Some(
2250-
env_ca_store
2251-
.split(',')
2252-
.map(|s| s.trim().to_string())
2253-
.filter(|s| !s.is_empty())
2254-
.collect(),
2255-
)
2256-
})()
2257-
.unwrap_or_else(|| vec!["mozilla".to_string()]);
2258-
2259-
for store in ca_stores.iter() {
2260-
match store.as_str() {
2261-
"mozilla" => {
2262-
root_cert_store = deno_tls::create_default_root_cert_store();
2263-
}
2264-
"system" => {
2265-
let roots = load_native_certs().expect("could not load platform certs");
2266-
for root in roots {
2267-
root_cert_store
2268-
.add((&*root.0).into())
2269-
.expect("Failed to add platform cert to root cert store");
2270-
}
2271-
}
2272-
_ => {
2273-
bail!(
2274-
concat!(
2275-
"Unknown certificate store \"{0}\" specified ",
2276-
"(allowed: \"system,mozilla\")"
2277-
),
2278-
store
2279-
);
2280-
}
2281-
}
2282-
}
2283-
2284-
Ok(Arc::new(ValueRootCertStoreProvider::new(
2285-
root_cert_store.clone(),
2286-
)))
2287-
}
2288-
22892239
fn set_v8_flags() {
22902240
let v8_flags = std::env::var("V8_FLAGS").unwrap_or("".to_string());
22912241
let mut vec = vec![""];
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use std::sync::Arc;
2+
3+
use anyhow::bail;
4+
use deno::deno_tls;
5+
use deno::deno_tls::deno_native_certs::load_native_certs;
6+
use deno::deno_tls::rustls::RootCertStore;
7+
use deno::deno_tls::RootCertStoreProvider;
8+
use deno_core::error::AnyError;
9+
use ext_runtime::cert::ValueRootCertStoreProvider;
10+
11+
pub fn get_root_cert_store_provider(
12+
) -> Result<Arc<dyn RootCertStoreProvider>, AnyError> {
13+
// Create and populate a root cert store based on environment variable.
14+
// Reference: https://github.com/denoland/deno/blob/v1.37.0/cli/args/mod.rs#L467
15+
let mut root_cert_store = RootCertStore::empty();
16+
let ca_stores: Vec<String> = (|| {
17+
let env_ca_store = std::env::var("DENO_TLS_CA_STORE").ok()?;
18+
Some(
19+
env_ca_store
20+
.split(',')
21+
.map(|s| s.trim().to_string())
22+
.filter(|s| !s.is_empty())
23+
.collect(),
24+
)
25+
})()
26+
.unwrap_or_else(|| vec!["mozilla".to_string()]);
27+
28+
for store in ca_stores.iter() {
29+
match store.as_str() {
30+
"mozilla" => {
31+
root_cert_store = deno_tls::create_default_root_cert_store();
32+
}
33+
"system" => {
34+
let roots = load_native_certs().expect("could not load platform certs");
35+
for root in roots {
36+
root_cert_store
37+
.add((&*root.0).into())
38+
.expect("Failed to add platform cert to root cert store");
39+
}
40+
}
41+
_ => {
42+
bail!(
43+
concat!(
44+
"Unknown certificate store \"{0}\" specified ",
45+
"(allowed: \"system,mozilla\")"
46+
),
47+
store
48+
);
49+
}
50+
}
51+
}
52+
53+
Ok(Arc::new(ValueRootCertStoreProvider::new(
54+
root_cert_store.clone(),
55+
)))
56+
}

crates/deno_facade/emitter.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ use ext_node::DenoFsNodeResolverEnv;
5858
use ext_node::NodeResolver;
5959
use ext_node::PackageJsonResolver;
6060

61+
use crate::cert_provider::get_root_cert_store_provider;
6162
use crate::permissions::RuntimePermissionDescriptorParser;
6263

6364
struct Deferred<T>(once_cell::unsync::OnceCell<T>);
@@ -281,9 +282,12 @@ impl EmitterFactory {
281282
}
282283

283284
pub fn http_client_provider(&self) -> &Arc<HttpClientProvider> {
284-
self
285-
.http_client_provider
286-
.get_or_init(|| Arc::new(HttpClientProvider::new(None, None)))
285+
self.http_client_provider.get_or_init(|| {
286+
Arc::new(HttpClientProvider::new(
287+
get_root_cert_store_provider().ok(),
288+
None,
289+
))
290+
})
287291
}
288292

289293
pub fn fs(&self) -> Arc<dyn deno::deno_fs::FileSystem> {

crates/deno_facade/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use tokio::fs::create_dir_all;
1313
mod emitter;
1414
mod eszip;
1515

16+
pub mod cert_provider;
1617
pub mod errors;
1718
pub mod graph;
1819
pub mod jsr;

examples/serve/deno.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"workspace": [],
3+
"imports": {
4+
"@supabase/functions-js": "jsr:@supabase/functions-js@^2.5.0"
5+
}
6+
}

examples/serve/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1+
import { FunctionsClient } from "@supabase/functions-js";
2+
import "@supabase/functions-js/edge-runtime.d.ts";
3+
4+
console.log(FunctionsClient);
5+
addEventListener("beforeunload", (ev: CustomEvent<BeforeunloadReason>) => {
6+
console.log(ev);
7+
});
8+
9+
console.log("meow");
110
Deno.serve((_req) => new Response("Hello, world"));

0 commit comments

Comments
 (0)