#REGTEST_TYPE=devel

# This reg-test ensures that SSL related configuration specified in a
# default-server option are properly taken into account by the servers
# (frontend). It mainly focuses on the client certificate used by the frontend,
# that can either be defined in the server line itself, in the default-server
# line or in both.
#
# It was created following a bug raised in redmine (issue #3906) in which a
# server used an "empty" SSL context instead of the proper one.
#

varnishtest "Test the 'set ssl cert' feature of the CLI"
feature cmd "$HAPROXY_PROGRAM -cc 'version_atleast(2.5-dev0)'"
feature cmd "$HAPROXY_PROGRAM -cc 'feature(OPENSSL)'"
feature ignore_unknown_macro

server s1 -repeat 7 {
  rxreq
  txresp
} -start

haproxy h1 -conf {
    global
        tune.ssl.default-dh-param 2048
        tune.ssl.capture-buffer-size 1
        stats socket "${tmpdir}/h1/stats" level admin
        crt-base ${testdir}
        ca-base ${testdir}

    defaults
        mode http
        option httplog
        log stderr local0 debug err
        option logasap
        timeout connect "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout client  "${HAPROXY_TEST_TIMEOUT-5s}"
        timeout server  "${HAPROXY_TEST_TIMEOUT-5s}"

    listen clear-lst
        bind "fd@${clearlst}"
        use_backend first_be if { path /first }
        use_backend second_be if { path /second }
        use_backend third_be if { path /third }
        use_backend fourth_be if { path /fourth }
        use_backend fifth_be if { path /fifth }


    backend first_be
        default-server ssl crt client1.pem ca-file ca-auth.crt verify none
        server s1 "${tmpdir}/ssl.sock"

    backend second_be
        default-server ssl ca-file ca-auth.crt verify none
        server s1 "${tmpdir}/ssl.sock" crt client1.pem

    backend third_be
        default-server ssl crt client1.pem ca-file ca-auth.crt verify none
        server s1 "${tmpdir}/ssl.sock" crt client2_expired.pem

    backend fourth_be
        default-server ssl crt client1.pem verify none
        server s1 "${tmpdir}/ssl.sock" ca-file ca-auth.crt

    backend fifth_be
        balance roundrobin
        default-server ssl crt client1.pem verify none
        server s1 "${tmpdir}/ssl.sock"
        server s2 "${tmpdir}/ssl.sock" crt client2_expired.pem
        server s3 "${tmpdir}/ssl.sock"


    listen ssl-lst
        bind "${tmpdir}/ssl.sock" ssl crt ${testdir}/common.pem ca-file ca-auth.crt verify required crt-ignore-err all

        acl cert_expired ssl_c_verify 10
        acl cert_revoked ssl_c_verify 23
        acl cert_ok ssl_c_verify 0

        http-response add-header X-SSL Ok if cert_ok
        http-response add-header X-SSL Expired if cert_expired
        http-response add-header X-SSL Revoked if cert_revoked

        server s1 ${s1_addr}:${s1_port}
} -start



client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/first"
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Ok"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/second"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Ok"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/third"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Expired"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/fourth"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Ok"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/fifth"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Ok"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/fifth"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Expired"
} -run

client c1 -connect ${h1_clearlst_sock} {
    txreq -url "/fifth"
    txreq
    rxresp
    expect resp.status == 200
    expect resp.http.x-ssl == "Ok"
} -run
