diff --git a/changelog/unreleased/eos-http-client-tls.md b/changelog/unreleased/eos-http-client-tls.md new file mode 100644 index 0000000000..57d1d9e809 --- /dev/null +++ b/changelog/unreleased/eos-http-client-tls.md @@ -0,0 +1,8 @@ +Enhancement: Only load X509 on https + +Currently, the EOS HTTP Client always tries to read an X509 key pair from the file system (by default, from /etc/grid-security/host{key,cert}.pem). This makes it harder to write unit tests, as these fail when this key pair is not on the file system (which is the case for the test pipeline as well). + +This PR introduces a fix for this problem, by only loading the X509 key pair if the scheme of the EOS endpoint is https. Unit tests can then create a mock HTTP endpoint, which will not trigger the loading of the key pair. + + +https://github.com/cs3org/reva/pull/4870 \ No newline at end of file diff --git a/pkg/eosclient/eosgrpc/eoshttp.go b/pkg/eosclient/eosgrpc/eoshttp.go index ee1aa3aacf..4966355335 100644 --- a/pkg/eosclient/eosgrpc/eoshttp.go +++ b/pkg/eosclient/eosgrpc/eoshttp.go @@ -22,6 +22,7 @@ import ( "bytes" "context" "crypto/tls" + "errors" "fmt" "io" "net/http" @@ -147,19 +148,12 @@ func NewEOSHTTPClient(opt *HTTPOptions) (*EOSHTTPClient, error) { } opt.init() - cert, err := tls.LoadX509KeyPair(opt.ClientCertFile, opt.ClientKeyFile) + baseUrl, err := url.Parse(opt.BaseURL) if err != nil { - return nil, err + return nil, errors.New("Failed to parse BaseURL") } - // TODO: the error reporting of http.transport is insufficient - // we may want to check manually at least the existence of the certfiles - // The point is that also the error reporting of the context that calls this function - // is weak t := &http.Transport{ - TLSClientConfig: &tls.Config{ - Certificates: []tls.Certificate{cert}, - }, MaxIdleConns: opt.MaxIdleConns, MaxConnsPerHost: opt.MaxConnsPerHost, MaxIdleConnsPerHost: opt.MaxIdleConnsPerHost, @@ -167,6 +161,21 @@ func NewEOSHTTPClient(opt *HTTPOptions) (*EOSHTTPClient, error) { DisableCompression: true, } + if baseUrl.Scheme == "https" { + cert, err := tls.LoadX509KeyPair(opt.ClientCertFile, opt.ClientKeyFile) + if err != nil { + return nil, err + } + t.TLSClientConfig = &tls.Config{ + Certificates: []tls.Certificate{cert}, + } + } + + // TODO: the error reporting of http.transport is insufficient + // we may want to check manually at least the existence of the certfiles + // The point is that also the error reporting of the context that calls this function + // is weak + cl := &http.Client{ Transport: t, CheckRedirect: func(req *http.Request, via []*http.Request) error {