mirror of
https://github.com/rclone/rclone.git
synced 2024-11-26 18:34:41 +01:00
71 lines
1.9 KiB
Go
71 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)
|
|
}
|