5452b59a2e
* Update go-libp2p to v0.22.0 * Testing with go1.19 * build(deps): bump github.com/multiformats/go-multicodec Bumps [github.com/multiformats/go-multicodec](https://github.com/multiformats/go-multicodec) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/multiformats/go-multicodec/releases) - [Commits](https://github.com/multiformats/go-multicodec/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: github.com/multiformats/go-multicodec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ipld/go-car from 0.4.0 to 0.5.0 Bumps [github.com/ipld/go-car](https://github.com/ipld/go-car) from 0.4.0 to 0.5.0. - [Release notes](https://github.com/ipld/go-car/releases) - [Commits](https://github.com/ipld/go-car/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/ipld/go-car dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.12.2 to 1.13.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.12.2...v1.13.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/hashicorp/go-hclog from 1.2.1 to 1.3.0 Bumps [github.com/hashicorp/go-hclog](https://github.com/hashicorp/go-hclog) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/hashicorp/go-hclog/releases) - [Commits](https://github.com/hashicorp/go-hclog/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-hclog dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ipfs/go-ds-crdt from 0.3.6 to 0.3.7 Bumps [github.com/ipfs/go-ds-crdt](https://github.com/ipfs/go-ds-crdt) from 0.3.6 to 0.3.7. - [Release notes](https://github.com/ipfs/go-ds-crdt/releases) - [Commits](https://github.com/ipfs/go-ds-crdt/compare/v0.3.6...v0.3.7) --- updated-dependencies: - dependency-name: github.com/ipfs/go-ds-crdt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/urfave/cli/v2 from 2.10.2 to 2.14.1 Bumps [github.com/urfave/cli/v2](https://github.com/urfave/cli) from 2.10.2 to 2.14.1. - [Release notes](https://github.com/urfave/cli/releases) - [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/urfave/cli/compare/v2.10.2...v2.14.1) --- updated-dependencies: - dependency-name: github.com/urfave/cli/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-http from 0.3.0 to 0.4.0 Bumps [github.com/libp2p/go-libp2p-http](https://github.com/libp2p/go-libp2p-http) from 0.3.0 to 0.4.0. - [Release notes](https://github.com/libp2p/go-libp2p-http/releases) - [Commits](https://github.com/libp2p/go-libp2p-http/compare/v0.3.0...v0.4.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-gorpc from 0.4.0 to 0.5.0 Bumps [github.com/libp2p/go-libp2p-gorpc](https://github.com/libp2p/go-libp2p-gorpc) from 0.4.0 to 0.5.0. - [Release notes](https://github.com/libp2p/go-libp2p-gorpc/releases) - [Commits](https://github.com/libp2p/go-libp2p-gorpc/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-gorpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump contrib.go.opencensus.io/exporter/prometheus Bumps [contrib.go.opencensus.io/exporter/prometheus](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus) from 0.4.1 to 0.4.2. - [Release notes](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus/releases) - [Commits](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus/compare/v0.4.1...v0.4.2) --- updated-dependencies: - dependency-name: contrib.go.opencensus.io/exporter/prometheus dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-raft from 0.1.8 to 0.2.0 Bumps [github.com/libp2p/go-libp2p-raft](https://github.com/libp2p/go-libp2p-raft) from 0.1.8 to 0.2.0. - [Release notes](https://github.com/libp2p/go-libp2p-raft/releases) - [Commits](https://github.com/libp2p/go-libp2p-raft/compare/v0.1.8...v0.2.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-raft dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/urfave/cli from 1.22.9 to 1.22.10 Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.9 to 1.22.10. - [Release notes](https://github.com/urfave/cli/releases) - [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/urfave/cli/compare/v1.22.9...v1.22.10) --- updated-dependencies: - dependency-name: github.com/urfave/cli dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Fix checker/linter/staticcheck warnings Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
194 lines
4.3 KiB
Go
194 lines
4.3 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
crypto "github.com/libp2p/go-libp2p/core/crypto"
|
|
peer "github.com/libp2p/go-libp2p/core/peer"
|
|
|
|
"github.com/kelseyhightower/envconfig"
|
|
)
|
|
|
|
const configKey = "cluster"
|
|
|
|
// Identity defaults
|
|
const (
|
|
DefaultConfigCrypto = crypto.Ed25519
|
|
DefaultConfigKeyLength = -1
|
|
)
|
|
|
|
// Identity represents identity of a cluster peer for communication,
|
|
// including the Consensus component.
|
|
type Identity struct {
|
|
ID peer.ID
|
|
PrivateKey crypto.PrivKey
|
|
}
|
|
|
|
// identityJSON represents a Cluster peer identity as it will look when it is
|
|
// saved using JSON.
|
|
type identityJSON struct {
|
|
ID string `json:"id"`
|
|
PrivateKey string `json:"private_key"`
|
|
}
|
|
|
|
// NewIdentity returns a new random identity.
|
|
func NewIdentity() (*Identity, error) {
|
|
ident := &Identity{}
|
|
err := ident.Default()
|
|
return ident, err
|
|
}
|
|
|
|
// Default generates a random keypair for this identity.
|
|
func (ident *Identity) Default() error {
|
|
// pid and private key generation
|
|
priv, pub, err := crypto.GenerateKeyPair(
|
|
DefaultConfigCrypto,
|
|
DefaultConfigKeyLength,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pid, err := peer.IDFromPublicKey(pub)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ident.ID = pid
|
|
ident.PrivateKey = priv
|
|
return nil
|
|
}
|
|
|
|
// ConfigKey returns a human-readable string to identify
|
|
// a cluster Identity.
|
|
func (ident *Identity) ConfigKey() string {
|
|
return configKey
|
|
}
|
|
|
|
// SaveJSON saves the JSON representation of the Identity to
|
|
// the given path.
|
|
func (ident *Identity) SaveJSON(path string) error {
|
|
logger.Info("Saving identity")
|
|
|
|
bs, err := ident.ToJSON()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return os.WriteFile(path, bs, 0600)
|
|
}
|
|
|
|
// ToJSON generates a human-friendly version of Identity.
|
|
func (ident *Identity) ToJSON() (raw []byte, err error) {
|
|
jID, err := ident.toIdentityJSON()
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
raw, err = json.MarshalIndent(jID, "", " ")
|
|
return
|
|
}
|
|
|
|
func (ident *Identity) toIdentityJSON() (jID *identityJSON, err error) {
|
|
jID = &identityJSON{}
|
|
|
|
// Private Key
|
|
pkeyBytes, err := crypto.MarshalPrivateKey(ident.PrivateKey)
|
|
if err != nil {
|
|
return
|
|
}
|
|
pKey := base64.StdEncoding.EncodeToString(pkeyBytes)
|
|
|
|
// Set all identity fields
|
|
jID.ID = ident.ID.Pretty()
|
|
jID.PrivateKey = pKey
|
|
return
|
|
}
|
|
|
|
// LoadJSON receives a raw json-formatted identity and
|
|
// sets the Config fields from it. Note that it should be JSON
|
|
// as generated by ToJSON().
|
|
func (ident *Identity) LoadJSON(raw []byte) error {
|
|
jID := &identityJSON{}
|
|
err := json.Unmarshal(raw, jID)
|
|
if err != nil {
|
|
logger.Error("Error unmarshaling cluster config")
|
|
return err
|
|
}
|
|
|
|
return ident.applyIdentityJSON(jID)
|
|
}
|
|
|
|
func (ident *Identity) applyIdentityJSON(jID *identityJSON) error {
|
|
pid, err := peer.Decode(jID.ID)
|
|
if err != nil {
|
|
err = fmt.Errorf("error decoding cluster ID: %s", err)
|
|
return err
|
|
}
|
|
ident.ID = pid
|
|
|
|
pkb, err := base64.StdEncoding.DecodeString(jID.PrivateKey)
|
|
if err != nil {
|
|
err = fmt.Errorf("error decoding private_key: %s", err)
|
|
return err
|
|
}
|
|
pKey, err := crypto.UnmarshalPrivateKey(pkb)
|
|
if err != nil {
|
|
err = fmt.Errorf("error parsing private_key ID: %s", err)
|
|
return err
|
|
}
|
|
ident.PrivateKey = pKey
|
|
|
|
return ident.Validate()
|
|
}
|
|
|
|
// Validate will check that the values of this identity
|
|
// seem to be working ones.
|
|
func (ident *Identity) Validate() error {
|
|
if ident.ID == "" {
|
|
return errors.New("identity ID not set")
|
|
}
|
|
|
|
if ident.PrivateKey == nil {
|
|
return errors.New("no identity private_key set")
|
|
}
|
|
|
|
if !ident.ID.MatchesPrivateKey(ident.PrivateKey) {
|
|
return errors.New("identity ID does not match the private_key")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// LoadJSONFromFile reads an Identity file from disk and parses
|
|
// it and return Identity.
|
|
func (ident *Identity) LoadJSONFromFile(path string) error {
|
|
file, err := os.ReadFile(path)
|
|
if err != nil {
|
|
logger.Error("error reading the configuration file: ", err)
|
|
return err
|
|
}
|
|
|
|
return ident.LoadJSON(file)
|
|
}
|
|
|
|
// ApplyEnvVars fills in any Config fields found
|
|
// as environment variables.
|
|
func (ident *Identity) ApplyEnvVars() error {
|
|
jID, err := ident.toIdentityJSON()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = envconfig.Process(ident.ConfigKey(), jID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return ident.applyIdentityJSON(jID)
|
|
}
|
|
|
|
// Equals returns true if equal to provided identity.
|
|
func (ident *Identity) Equals(i *Identity) bool {
|
|
return ident.ID == i.ID && ident.PrivateKey.Equals(i.PrivateKey)
|
|
}
|