Skip to content

Commit

Permalink
tls: build without openssl linkage
Browse files Browse the repository at this point in the history
Closes #1101
  • Loading branch information
patapenka-alexey committed Mar 3, 2025
1 parent e0d2ca3 commit 79e1673
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 50 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- `tt pack `: added TCM file packaging.
- `tt aeon connect`: add connection from the cluster config.
- `tt aeon connect`: add connection from the `app:insance_name`.
- `tt` can be built without linking to OpenSSL.

### Changed

Expand Down
52 changes: 23 additions & 29 deletions cli/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
"time"

"github.com/tarantool/go-tarantool/v2"
"github.com/tarantool/go-tlsdialer"
libcluster "github.com/tarantool/tt/lib/cluster"
"github.com/tarantool/tt/lib/connect"
"github.com/tarantool/tt/lib/dial"
)

const (
Expand Down Expand Up @@ -96,35 +96,29 @@ func collectTarantoolConfig(collectors libcluster.CollectorFactory,
network, address = connect.ParseBaseURI(endpoint.Uri)
}
addr := fmt.Sprintf("%s://%s", network, address)
if endpoint.Params.Transport == "" || endpoint.Params.Transport != "ssl" {
opts = append(opts, tarantoolOpts{
addr: addr,
dialer: tarantool.NetDialer{
Address: addr,
User: endpoint.Login,
Password: endpoint.Password,
},
opts: tarantool.Opts{
SkipSchema: true,
},
})
} else {
opts = append(opts, tarantoolOpts{
addr: addr,
dialer: tlsdialer.OpenSSLDialer{
Address: addr,
User: endpoint.Login,
Password: endpoint.Password,
SslKeyFile: endpoint.Params.SslKeyFile,
SslCertFile: endpoint.Params.SslCertFile,
SslCaFile: endpoint.Params.SslCaFile,
SslCiphers: endpoint.Params.SslCiphers,
},
opts: tarantool.Opts{
SkipSchema: true,
},
})

dialer, err := dial.New(dial.Opts{
Address: addr,
User: endpoint.Login,
Password: endpoint.Password,
SslKeyFile: endpoint.Params.SslKeyFile,
SslCertFile: endpoint.Params.SslCertFile,
SslCaFile: endpoint.Params.SslCaFile,
SslCiphers: endpoint.Params.SslCiphers,
SslPassword: endpoint.Params.SslPassword,
SslPasswordFile: endpoint.Params.SslPasswordFile,
Transport: endpoint.Params.Transport, // [ssl|plain]
})
if err != nil {
return nil, err
}
opts = append(opts, tarantoolOpts{
addr: addr,
dialer: dialer,
opts: tarantool.Opts{
SkipSchema: true,
},
})
}

var connectionErrors []error
Expand Down
30 changes: 10 additions & 20 deletions cli/cluster/cmd/uri.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
"time"

"github.com/tarantool/go-tarantool/v2"
"github.com/tarantool/go-tlsdialer"

libcluster "github.com/tarantool/tt/lib/cluster"
"github.com/tarantool/tt/lib/dial"
)

const (
Expand Down Expand Up @@ -149,25 +149,15 @@ func MakeEtcdOptsFromUriOpts(src UriOpts) libcluster.EtcdOpts {
func MakeConnectOptsFromUriOpts(src UriOpts) (tarantool.Dialer, tarantool.Opts) {
address := fmt.Sprintf("tcp://%s", src.Host)

var dialer tarantool.Dialer

if src.KeyFile != "" || src.CertFile != "" || src.CaFile != "" || src.Ciphers != "" {
dialer = tlsdialer.OpenSSLDialer{
Address: address,
User: src.Username,
Password: src.Password,
SslKeyFile: src.KeyFile,
SslCertFile: src.CertFile,
SslCaFile: src.CaFile,
SslCiphers: src.Ciphers,
}
} else {
dialer = tarantool.NetDialer{
Address: address,
User: src.Username,
Password: src.Password,
}
}
var dialer, _ = dial.New(dial.Opts{
Address: address,
User: src.Username,
Password: src.Password,
SslKeyFile: src.KeyFile,
SslCertFile: src.CertFile,
SslCaFile: src.CaFile,
SslCiphers: src.Ciphers,
})

opts := tarantool.Opts{
Timeout: src.Timeout,
Expand Down
1 change: 1 addition & 0 deletions golangci-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ run:
timeout: 3m
build-tags:
- go_tarantool_ssl_disable
- tt_ssl_disable

linters:
disable-all: true
Expand Down
33 changes: 33 additions & 0 deletions lib/dial/dial.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package dial

import (
"fmt"

"github.com/tarantool/go-tarantool/v2"
)

func New(opts Opts) (tarantool.Dialer, error) {
transport := ConvertTransport(opts.Transport)

if transport == TransportDefault {
if opts.SslKeyFile != "" || opts.SslCaFile != "" || opts.SslCertFile != "" ||
opts.SslCiphers != "" || opts.SslPassword != "" || opts.SslPasswordFile != "" {
transport = TransportSSL
} else {
transport = TransportPlain
}
}

switch transport {
case TransportPlain:
return tarantool.NetDialer{
Address: opts.Address,
User: opts.User,
Password: opts.Password,
}, nil
case TransportSSL:
return ssl(opts)
default:
return nil, fmt.Errorf("unsupported transport type: %s", opts.Transport)
}
}
41 changes: 41 additions & 0 deletions lib/dial/opts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package dial

// Transport is a type, with a restriction on the list of supported connection modes.
type Transport string

func (t Transport) String() string {
return string(t)
}

const (
TransportDefault Transport = ""
TransportPlain Transport = "plain"
TransportSSL Transport = "ssl"
TransportInvalid Transport = "invalid"
)

func ConvertTransport(tr string) Transport {
switch tr {
case "":
return TransportDefault
case "plain":
return TransportPlain
case "ssl":
return TransportSSL
default:
return TransportInvalid
}
}

type Opts struct {
Address string
User string
Password string
SslKeyFile string
SslCertFile string
SslCaFile string
SslCiphers string
SslPassword string
SslPasswordFile string
Transport string
}
23 changes: 23 additions & 0 deletions lib/dial/ssl.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
//go:build !tt_ssl_disable
// +build !tt_ssl_disable

package dial

import (
"github.com/tarantool/go-tarantool/v2"
"github.com/tarantool/go-tlsdialer"
)

func ssl(opts Opts) (tarantool.Dialer, error) {
return tlsdialer.OpenSSLDialer{
Address: opts.Address,
User: opts.User,
Password: opts.Password,
SslKeyFile: opts.SslKeyFile,
SslCertFile: opts.SslCertFile,
SslCaFile: opts.SslCaFile,
SslCiphers: opts.SslCiphers,
SslPassword: opts.SslPassword,
SslPasswordFile: opts.SslPasswordFile,
}, nil
}
14 changes: 14 additions & 0 deletions lib/dial/ssl_disable.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//go:build tt_ssl_disable
// +build tt_ssl_disable

package dial

import (
"errors"

"github.com/tarantool/go-tarantool/v2"
)

func ssl(opts Opts) (tarantool.Dialer, error) {
return nil, errors.New("SSL support is disabled")
}
2 changes: 1 addition & 1 deletion magefile.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func appendTags(args []string) ([]string, error) {
case BuildTypeDefault:
fallthrough
case BuildTypeNoCgo:
tags = append(tags, "go_tarantool_ssl_disable")
tags = append(tags, "go_tarantool_ssl_disable", "tt_ssl_disable")
case BuildTypeStatic:
tags = append(tags, "openssl_static")
case BuildTypeShared:
Expand Down

0 comments on commit 79e1673

Please sign in to comment.