rclone/vendor/storj.io/uplink/config.go
2020-05-12 15:56:50 +00:00

70 lines
1.9 KiB
Go

// Copyright (C) 2020 Storj Labs, Inc.
// See LICENSE for copying information.
package uplink
import (
"context"
"time"
"storj.io/common/identity"
"storj.io/common/macaroon"
"storj.io/common/peertls/tlsopts"
"storj.io/common/rpc"
"storj.io/common/storj"
"storj.io/uplink/private/metainfo"
)
// Config defines configuration for using uplink library.
type Config struct {
UserAgent string
// DialTimeout defines how long client should wait for establishing
// a connection to peers.
DialTimeout time.Duration
}
func (config Config) dial(ctx context.Context, satelliteAddress string, apiKey *macaroon.APIKey) (_ *metainfo.Client, _ rpc.Dialer, fullNodeURL string, err error) {
ident, err := identity.NewFullIdentity(ctx, identity.NewCAOptions{
Difficulty: 0,
Concurrency: 1,
})
if err != nil {
return nil, rpc.Dialer{}, "", packageError.Wrap(err)
}
tlsConfig := tlsopts.Config{
UsePeerCAWhitelist: false,
PeerIDVersions: "0",
}
tlsOptions, err := tlsopts.NewOptions(ident, tlsConfig, nil)
if err != nil {
return nil, rpc.Dialer{}, "", packageError.Wrap(err)
}
dialer := rpc.NewDefaultDialer(tlsOptions)
dialer.DialTimeout = config.DialTimeout
nodeURL, err := storj.ParseNodeURL(satelliteAddress)
if err != nil {
return nil, rpc.Dialer{}, "", packageError.Wrap(err)
}
// Node id is required in satelliteNodeID for all unknown (non-storj) satellites.
// For known satellite it will be automatically prepended.
if nodeURL.ID.IsZero() {
nodeID, found := rpc.KnownNodeID(nodeURL.Address)
if !found {
return nil, rpc.Dialer{}, "", packageError.New("node id is required in satelliteNodeURL")
}
satelliteAddress = storj.NodeURL{
ID: nodeID,
Address: nodeURL.Address,
}.String()
}
metainfo, err := metainfo.DialNodeURL(ctx, dialer, satelliteAddress, apiKey, config.UserAgent)
return metainfo, dialer, satelliteAddress, packageError.Wrap(err)
}