Skip to content

Commit 3356bb4

Browse files
committed
Fall back to unverified SSL when system CA store is unavailable
The old ponylang/http HTTPClient silently created an unverified SSL context when the caller's context was None. Our SSLContextFactory was treating set_authority(None)? failure as fatal, which broke on systems without a discoverable CA bundle (e.g. WSL2 without ca-certificates). Passing None to set_authority means "use the default system CA store" — when there isn't one, there's nothing to verify against, so falling back to set_client_verify(false) is the correct behavior. This also simplifies callers: SSLContextFactory now always returns SSLContext val (never None), eliminating the match/None branch in all four request actors and LinkedJsonRequester. Removed unused ssl and lori imports from request actors.
1 parent cefda99 commit 3356bb4

5 files changed

Lines changed: 19 additions & 39 deletions

File tree

github_rest_api/paginated_list.pony

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use courier = "courier"
22
use "json"
33
use lori = "lori"
44
use "promises"
5-
use ssl = "ssl/net"
65
use req = "request"
76

87
interface tag LinkedResultReceiver
@@ -163,13 +162,9 @@ actor LinkedJsonRequester is courier.HTTPClientConnectionActor
163162
| let parsed: courier.ParsedURL =>
164163
_request_path = parsed.request_path()
165164
let config = courier.ClientConnectionConfig
166-
match req.SSLContextFactory()
167-
| let ctx: ssl.SSLContext val =>
168-
_http = courier.HTTPClientConnection.ssl(
169-
_creds.auth, ctx, parsed.host, parsed.port, this, config)
170-
| None =>
171-
_fail("Unable to create SSL context")
172-
end
165+
_http = courier.HTTPClientConnection.ssl(
166+
_creds.auth, req.SSLContextFactory(), parsed.host, parsed.port,
167+
this, config)
173168
| let _: courier.URLParseError =>
174169
_fail("Unable to parse URL: " + url)
175170
end

github_rest_api/request/_ssl.pony

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ use ssl = "ssl/net"
22

33
primitive SSLContextFactory
44
"""
5-
Creates an SSL context configured for HTTPS client connections with
6-
certificate verification enabled.
5+
Creates an SSL context for HTTPS client connections. Attempts to load the
6+
system CA store for certificate verification. If no CA store is available,
7+
falls back to an unverified context.
78
"""
8-
fun apply(): (ssl.SSLContext val | None) =>
9+
fun apply(): ssl.SSLContext val =>
910
try
1011
recover val
1112
ssl.SSLContext
1213
.>set_client_verify(true)
1314
.>set_authority(None)?
1415
end
1516
else
16-
None
17+
recover val
18+
ssl.SSLContext.>set_client_verify(false)
19+
end
1720
end

github_rest_api/request/check_requester.pony

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use courier = "courier"
2-
use lori = "lori"
32
use "promises"
4-
use ssl = "ssl/net"
53

64
interface tag CheckResultReceiver
75
"""
@@ -60,13 +58,9 @@ actor CheckRequester is courier.HTTPClientConnectionActor
6058
| let parsed: courier.ParsedURL =>
6159
_request_path = parsed.request_path()
6260
let config = courier.ClientConnectionConfig
63-
match SSLContextFactory()
64-
| let ctx: ssl.SSLContext val =>
65-
_http = courier.HTTPClientConnection.ssl(
66-
_creds.auth, ctx, parsed.host, parsed.port, this, config)
67-
| None =>
68-
_fail("Unable to create SSL context")
69-
end
61+
_http = courier.HTTPClientConnection.ssl(
62+
_creds.auth, SSLContextFactory(), parsed.host, parsed.port,
63+
this, config)
7064
| let _: courier.URLParseError =>
7165
_fail("Unable to parse URL: " + url)
7266
end

github_rest_api/request/json_requester.pony

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use courier = "courier"
22
use "json"
3-
use lori = "lori"
4-
use ssl = "ssl/net"
53

64
interface tag JsonRequesterResultReceiver
75
"""
@@ -79,13 +77,9 @@ actor JsonRequester is courier.HTTPClientConnectionActor
7977
| let parsed: courier.ParsedURL =>
8078
_request_path = parsed.request_path()
8179
let config = courier.ClientConnectionConfig
82-
match SSLContextFactory()
83-
| let ctx: ssl.SSLContext val =>
84-
_http = courier.HTTPClientConnection.ssl(
85-
_creds.auth, ctx, parsed.host, parsed.port, this, config)
86-
| None =>
87-
_fail("Unable to create SSL context")
88-
end
80+
_http = courier.HTTPClientConnection.ssl(
81+
_creds.auth, SSLContextFactory(), parsed.host, parsed.port,
82+
this, config)
8983
| let _: courier.URLParseError =>
9084
_fail("Unable to parse URL: " + url)
9185
end

github_rest_api/request/no_content_requester.pony

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use courier = "courier"
2-
use lori = "lori"
32
use "promises"
4-
use ssl = "ssl/net"
53

64
interface tag DeleteResultReceiver
75
"""
@@ -79,13 +77,9 @@ actor NoContentRequester is courier.HTTPClientConnectionActor
7977
| let parsed: courier.ParsedURL =>
8078
_request_path = parsed.request_path()
8179
let config = courier.ClientConnectionConfig
82-
match SSLContextFactory()
83-
| let ctx: ssl.SSLContext val =>
84-
_http = courier.HTTPClientConnection.ssl(
85-
_creds.auth, ctx, parsed.host, parsed.port, this, config)
86-
| None =>
87-
_fail("Unable to create SSL context")
88-
end
80+
_http = courier.HTTPClientConnection.ssl(
81+
_creds.auth, SSLContextFactory(), parsed.host, parsed.port,
82+
this, config)
8983
| let _: courier.URLParseError =>
9084
_fail("Unable to parse URL: " + url)
9185
end

0 commit comments

Comments
 (0)