ipfs-cluster/config/identity.go
Hector Sanjuan 3f5490424b
Dependency upgrades (#1451)
* Bump github.com/hashicorp/go-hclog from 0.16.1 to 0.16.2

Bumps [github.com/hashicorp/go-hclog](https://github.com/hashicorp/go-hclog) from 0.16.1 to 0.16.2.
- [Release notes](https://github.com/hashicorp/go-hclog/releases)
- [Commits](https://github.com/hashicorp/go-hclog/compare/v0.16.1...v0.16.2)

---
updated-dependencies:
- dependency-name: github.com/hashicorp/go-hclog
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-log/v2 from 2.2.0 to 2.3.0

Bumps [github.com/ipfs/go-log/v2](https://github.com/ipfs/go-log) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/ipfs/go-log/releases)
- [Commits](https://github.com/ipfs/go-log/compare/v2.2.0...v2.3.0)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-log/v2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p from 0.14.3 to 0.14.4

Bumps [github.com/libp2p/go-libp2p](https://github.com/libp2p/go-libp2p) from 0.14.3 to 0.14.4.
- [Release notes](https://github.com/libp2p/go-libp2p/releases)
- [Commits](https://github.com/libp2p/go-libp2p/compare/v0.14.3...v0.14.4)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-quic-transport from 0.11.1 to 0.11.2

Bumps [github.com/libp2p/go-libp2p-quic-transport](https://github.com/libp2p/go-libp2p-quic-transport) from 0.11.1 to 0.11.2.
- [Release notes](https://github.com/libp2p/go-libp2p-quic-transport/releases)
- [Commits](https://github.com/libp2p/go-libp2p-quic-transport/compare/v0.11.1...v0.11.2)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-quic-transport
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/google/uuid from 1.2.0 to 1.3.0

Bumps [github.com/google/uuid](https://github.com/google/uuid) from 1.2.0 to 1.3.0.
- [Release notes](https://github.com/google/uuid/releases)
- [Commits](https://github.com/google/uuid/compare/v1.2.0...v1.3.0)

---
updated-dependencies:
- dependency-name: github.com/google/uuid
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-peerstore from 0.2.7 to 0.2.8

Bumps [github.com/libp2p/go-libp2p-peerstore](https://github.com/libp2p/go-libp2p-peerstore) from 0.2.7 to 0.2.8.
- [Release notes](https://github.com/libp2p/go-libp2p-peerstore/releases)
- [Commits](https://github.com/libp2p/go-libp2p-peerstore/compare/v0.2.7...v0.2.8)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-peerstore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-datastore from 0.4.5 to 0.4.6

Bumps [github.com/ipfs/go-datastore](https://github.com/ipfs/go-datastore) from 0.4.5 to 0.4.6.
- [Release notes](https://github.com/ipfs/go-datastore/releases)
- [Commits](https://github.com/ipfs/go-datastore/compare/v0.4.5...v0.4.6)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-datastore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-fs-lock from 0.0.6 to 0.0.7

Bumps [github.com/ipfs/go-fs-lock](https://github.com/ipfs/go-fs-lock) from 0.0.6 to 0.0.7.
- [Release notes](https://github.com/ipfs/go-fs-lock/releases)
- [Commits](https://github.com/ipfs/go-fs-lock/compare/v0.0.6...v0.0.7)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-fs-lock
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-ipns from 0.1.0 to 0.1.2

Bumps [github.com/ipfs/go-ipns](https://github.com/ipfs/go-ipns) from 0.1.0 to 0.1.2.
- [Release notes](https://github.com/ipfs/go-ipns/releases)
- [Commits](https://github.com/ipfs/go-ipns/compare/v0.1.0...v0.1.2)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-ipns
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-noise from 0.2.0 to 0.2.2

Bumps [github.com/libp2p/go-libp2p-noise](https://github.com/libp2p/go-libp2p-noise) from 0.2.0 to 0.2.2.
- [Release notes](https://github.com/libp2p/go-libp2p-noise/releases)
- [Commits](https://github.com/libp2p/go-libp2p-noise/compare/v0.2.0...v0.2.2)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-noise
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-pubsub from 0.4.1 to 0.5.4

Bumps [github.com/libp2p/go-libp2p-pubsub](https://github.com/libp2p/go-libp2p-pubsub) from 0.4.1 to 0.5.4.
- [Release notes](https://github.com/libp2p/go-libp2p-pubsub/releases)
- [Commits](https://github.com/libp2p/go-libp2p-pubsub/compare/v0.4.1...v0.5.4)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-pubsub
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update go-ipfs-pinner

* Bump github.com/libp2p/go-libp2p-kad-dht from 0.12.2 to 0.13.0

Bumps [github.com/libp2p/go-libp2p-kad-dht](https://github.com/libp2p/go-libp2p-kad-dht) from 0.12.2 to 0.13.0.
- [Release notes](https://github.com/libp2p/go-libp2p-kad-dht/releases)
- [Commits](https://github.com/libp2p/go-libp2p-kad-dht/compare/v0.12.2...v0.13.0)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-kad-dht
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-path from 0.0.9 to 0.1.0

Bumps [github.com/ipfs/go-path](https://github.com/ipfs/go-path) from 0.0.9 to 0.1.0.
- [Release notes](https://github.com/ipfs/go-path/releases)
- [Commits](https://github.com/ipfs/go-path/compare/v0.0.9...v0.1.0)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-path
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-raft from 0.1.7 to 0.1.8

Bumps [github.com/libp2p/go-libp2p-raft](https://github.com/libp2p/go-libp2p-raft) from 0.1.7 to 0.1.8.
- [Release notes](https://github.com/libp2p/go-libp2p-raft/releases)
- [Commits](https://github.com/libp2p/go-libp2p-raft/compare/v0.1.7...v0.1.8)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-raft
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/libp2p/go-libp2p-tls from 0.1.3 to 0.2.0

Bumps [github.com/libp2p/go-libp2p-tls](https://github.com/libp2p/go-libp2p-tls) from 0.1.3 to 0.2.0.
- [Release notes](https://github.com/libp2p/go-libp2p-tls/releases)
- [Commits](https://github.com/libp2p/go-libp2p-tls/compare/v0.1.3...v0.2.0)

---
updated-dependencies:
- dependency-name: github.com/libp2p/go-libp2p-tls
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Bump github.com/ipfs/go-merkledag from 0.3.2 to 0.4.0

Bumps [github.com/ipfs/go-merkledag](https://github.com/ipfs/go-merkledag) from 0.3.2 to 0.4.0.
- [Release notes](https://github.com/ipfs/go-merkledag/releases)
- [Commits](https://github.com/ipfs/go-merkledag/compare/v0.3.2...v0.4.0)

---
updated-dependencies:
- dependency-name: github.com/ipfs/go-merkledag
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Chore: dependency upgrades

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-16 17:52:31 +02:00

194 lines
4.3 KiB
Go

package config
import (
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
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 ioutil.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 := ioutil.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)
}