/
cleaning.go
71 lines (64 loc) · 1.85 KB
/
cleaning.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package idgen
import (
"sync"
"github.com/hashicorp/go-multierror"
"github.com/libp2p/go-libp2p-core/crypto"
)
// CleaningIDGenerator is an identity generator that provides an extra method to
// remove all previously generated identities without passing any arguments.
type CleaningIDGenerator struct {
idgen IdentityGenerator
keys []crypto.PrivKey
locker sync.Mutex
}
// NewCleaningIDGenerator creates a new delegated identity
// generator that provides an extra method to remove all previously generated
// identities without passing any arguments.
func NewCleaningIDGenerator(idgen IdentityGenerator) *CleaningIDGenerator {
return &CleaningIDGenerator{idgen: idgen}
}
// AddBalanced stores the result of calling AddBalanced on the underlying
// identify generator and then returns it.
func (c *CleaningIDGenerator) AddBalanced() (crypto.PrivKey, error) {
pk, err := c.idgen.AddBalanced()
if err != nil {
return nil, err
}
c.locker.Lock()
defer c.locker.Unlock()
c.keys = append(c.keys, pk)
return pk, nil
}
// Remove calls Remove on the underlying identity generator and also removes the
// passed key from it's memory of keys generated.
func (c *CleaningIDGenerator) Remove(privKey crypto.PrivKey) error {
err := c.idgen.Remove(privKey)
if err != nil {
return err
}
c.locker.Lock()
defer c.locker.Unlock()
var keys []crypto.PrivKey
for _, pk := range c.keys {
if !pk.Equals(privKey) {
keys = append(keys, pk)
}
}
c.keys = keys
return nil
}
// Clean removes ALL previously generated keys by calling Remove on the
// underlying identity generator for each key in it's memory.
func (c *CleaningIDGenerator) Clean() error {
var errs error
c.locker.Lock()
defer c.locker.Unlock()
for _, pk := range c.keys {
err := c.idgen.Remove(pk)
if err != nil {
errs = multierror.Append(errs, err)
}
}
c.keys = []crypto.PrivKey{}
return errs
}