Skip to content

Commit 1ae3cf9

Browse files
Add version property to X509Request. Various test fixes. Update CI. (#41)
1 parent 74ce7df commit 1ae3cf9

File tree

6 files changed

+57
-32
lines changed

6 files changed

+57
-32
lines changed

.github/dependabot.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
2+
version: 2
3+
updates:
4+
- package-ecosystem: "github-actions"
5+
directory: "/" # Location of package manifests
6+
schedule:
7+
interval: "weekly"
8+
groups:
9+
all-actions:
10+
patterns:
11+
- "*"

.github/workflows/CI.yml

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
name: CI
44

5-
# Controls when the action will run.
5+
# Controls when the action will run.
66
on:
77
# Triggers the workflow on push or pull request events but only for the main branch
88
push:
@@ -26,35 +26,26 @@ jobs:
2626
fail-fast: false
2727
matrix:
2828
version:
29-
- '1.6'
29+
- 'lts'
3030
- '1'
3131
- 'nightly'
3232
os:
3333
- ubuntu-latest
3434
- macOS-latest
3535
- windows-latest
3636
arch:
37-
- x64
37+
- 'default'
3838
include:
3939
- os: windows-latest
4040
version: '1'
4141
arch: x86
4242
steps:
4343
- uses: actions/checkout@v2
44-
- uses: julia-actions/setup-julia@v1
44+
- uses: julia-actions/setup-julia@v2
4545
with:
4646
version: ${{ matrix.version }}
4747
arch: ${{ matrix.arch }}
48-
- uses: actions/cache@v1
49-
env:
50-
cache-name: cache-artifacts
51-
with:
52-
path: ~/.julia/artifacts
53-
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }}
54-
restore-keys: |
55-
${{ runner.os }}-test-${{ env.cache-name }}-
56-
${{ runner.os }}-test-
57-
${{ runner.os }}-
48+
- uses: julia-actions/cache@v2
5849
- uses: julia-actions/julia-buildpkg@v1
5950
- uses: julia-actions/julia-runtest@v1
6051
- name: Test with OpenSSL v1.1

src/OpenSSL.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,6 +2668,22 @@ function set_public_key(x509_req::X509Request, evp_pkey::EvpPKey)
26682668
end
26692669
end
26702670

2671+
function set_version(x509_req::X509Request, version::Int)
2672+
if ccall(
2673+
(:X509_REQ_set_version, libcrypto),
2674+
Cint,
2675+
(X509Request, Cint),
2676+
x509_req,
2677+
version) != 1
2678+
throw(OpenSSLError())
2679+
end
2680+
end
2681+
2682+
function get_version(x509_req::X509Request)::Int
2683+
version = ccall((:X509_REQ_get_version, libcrypto), Clong, (X509Request,), x509_req)
2684+
return Int(version)
2685+
end
2686+
26712687
function get_extensions(x509_req::X509Request)
26722688
sk = ccall(
26732689
(:X509_REQ_get_extensions, libcrypto),
@@ -2688,6 +2704,8 @@ function Base.getproperty(x509_req::X509Request, name::Symbol)
26882704
return get_public_key(x509_req)
26892705
elseif name === :extensions
26902706
return get_extensions(x509_req)
2707+
elseif name === :version
2708+
return get_version(x509_req)
26912709
else
26922710
# fallback to getfield
26932711
return getfield(x509_req, name)
@@ -2699,6 +2717,8 @@ function Base.setproperty!(x509_req::X509Request, name::Symbol, value)
26992717
set_subject_name(x509_req, value)
27002718
elseif name === :public_key
27012719
set_public_key(x509_req, value)
2720+
elseif name === :version
2721+
set_version(x509_req, value)
27022722
else
27032723
# fallback to setfield
27042724
setfield!(x509_req, name, value)

src/ssl.jl

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -679,25 +679,23 @@ end
679679
Close SSL stream.
680680
"""
681681
function Base.close(ssl::SSLStream, shutdown::Bool=true)
682-
close_socket = false
683682
Base.@lock ssl.lock begin
684683
ssl.closed && return
685684
ssl.closed = true
686-
close_socket = true
687-
# Ignore the disconnect result.
688-
shutdown && ssl_disconnect(ssl.ssl)
685+
if shutdown
686+
try
687+
ssl_disconnect(ssl.ssl)
688+
catch err
689+
@debug "SSL disconnect failed" err
690+
end
691+
end
689692
free(ssl.ssl)
690693
end
691-
if close_socket
692-
# close underlying io; because closing a TCPSocket may block
693-
# we do it outside holding the ssl.lock
694-
try
695-
Base.close(ssl.io)
696-
catch e
697-
e isa Base.IOError || rethrow()
698-
end
694+
@async try
695+
Base.close(ssl.io)
696+
catch e
697+
e isa Base.IOError || rethrow()
699698
end
700-
return
701699
end
702700

703701
"""

test/http_helpers.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ using Dates
22
using OpenSSL
33
using Sockets
44

5-
function test_server()
5+
function test_server(handshake_ready::Threads.Condition)
66
x509_certificate = X509Certificate()
77

88
evp_pkey = EvpPKey(rsa_generate_key())
@@ -22,6 +22,7 @@ function test_server()
2222
sign_certificate(x509_certificate, evp_pkey)
2323

2424
server_socket = listen(5000)
25+
@lock handshake_ready notify(handshake_ready)
2526
try
2627
accepted_socket = accept(server_socket)
2728

@@ -59,7 +60,8 @@ function test_server()
5960
return nothing
6061
end
6162

62-
function test_client()
63+
function test_client(handshake_ready::Threads.Condition)
64+
@lock handshake_ready wait(handshake_ready)
6365
tcp_stream = connect(5000)
6466

6567
ssl_ctx = OpenSSL.SSLContext(OpenSSL.TLSClientMethod())

test/runtests.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ end
187187

188188
x509_server_cert = OpenSSL.get_peer_certificate(ssl)
189189

190-
@test String(x509_server_cert.issuer_name) == "/C=US/O=Let's Encrypt/CN=R3"
190+
@test String(x509_server_cert.issuer_name) == "/C=US/O=Let's Encrypt/CN=R11"
191191
@test String(x509_server_cert.subject_name) == "/CN=httpbingo.julialang.org"
192192

193193
request_str = "GET /status/200 HTTP/1.1\r\nHost: httpbingo.julialang.org\r\nUser-Agent: curl\r\nAccept: */*\r\n\r\n"
@@ -339,6 +339,8 @@ end
339339

340340
# Create a certificate sign request.
341341
x509_request = X509Request()
342+
x509_request.version = 0
343+
@test x509_request.version == 0
342344

343345
evp_pkey = EvpPKey(rsa_generate_key())
344346

@@ -570,8 +572,9 @@ end
570572
end
571573

572574
@testset "SSLServer" begin
573-
server_task = @async test_server()
574-
client_task = @async test_client()
575+
server_ready = Threads.Condition()
576+
server_task = @async test_server(server_ready)
577+
client_task = @async test_client(server_ready)
575578
if isdefined(Base, :errormonitor)
576579
errormonitor(server_task)
577580
errormonitor(client_task)

0 commit comments

Comments
 (0)