pnet: integrate PNet
License: MIT Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
Jakub Sztandera committed
Feb 17, 2017 at 13:36 UTC
faca4518b36be06d8753969892e99914cd39aa71
7 files changed
+67
-8
cmd/ipfs/daemon.go
+5
@@ -347,6 +347,11 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
347
}
348
node.SetLocal(false)
349
350
+ if node.PNetFingerpint != nil {
351
+ fmt.Println("Swarm is limited to private network of peers with the swarm key")
352
+ fmt.Printf("Swarm key fingerprint: %x\n", node.PNetFingerpint)
353
+ }
354
+
355
printSwarmAddrs(node)
356
357
defer func() {
core/core.go
+26
-7
@@ -10,6 +10,7 @@ interfaces and how core/... fits into the bigger IPFS picture, see:
10
package core
11
12
import (
13
+ "bytes"
14
"context"
15
"errors"
16
"fmt"
@@ -44,6 +45,7 @@ import (
45
ic "gx/ipfs/QmNiCwBNA8MWDADTFVq1BonUEJbS2SvjAoNkZZrhEwcuUi/go-libp2p-crypto"
46
addrutil "gx/ipfs/QmPB5aAzt2wo5Xk8SoZi6y2oFN7shQMvYWgduMATojkdpj/go-addr-util"
47
metrics "gx/ipfs/QmPj6rmE2sWJ65h6b8F4fcN5kySDhYqL2Ty8DWWF3WEUNS/go-libp2p-metrics"
48
+ pnet "gx/ipfs/QmQ2sk2irQYkeMMVKpLjq1bSiNPn9B5wZB53Nx8dd4dhnQ/go-libp2p-pnet"
49
mplex "gx/ipfs/QmQ3UABWTgK78utKeiVXaH9BrjC7Ydn1pRuwqnWHT3p4zh/go-smux-multiplex"
50
floodsub "gx/ipfs/QmQDb7jmfC33qzGUGpWrfgRootQnmQvN7DMktfuekShsiF/floodsub"
51
pstore "gx/ipfs/QmQMQ2RUjnaEEX8ybmrhuFFGhAwPjyL1Eo6ZoJGD7aAccM/go-libp2p-peerstore"
@@ -67,6 +69,7 @@ import (
69
u "gx/ipfs/QmZuY8aV7zbNXVy6DyN9SmnuH3o9nG852F4aTiSBpts8d1/go-ipfs-util"
70
yamux "gx/ipfs/Qmbn7RYyWzBVXiUp9jZ1dA4VADHy9DtS7iZLwfhEUQvm3U/go-smux-yamux"
71
p2phost "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host"
72
+ ipnet "gx/ipfs/QmcT6bMjz32yoMdyvZsMvqFnbbsDxhTYw6FG1yMqKV8Rbh/go-libp2p-interface-pnet"
73
smux "gx/ipfs/QmeZBgYBHvxMukGK5ojg28BCNLB9SeXqT7XXg6o7r2GbJy/go-stream-muxer"
74
)
75
@@ -100,9 +103,10 @@ type IpfsNode struct {
103
Repo repo.Repo
104
105
// Local node
103
- Pinning pin.Pinner // the pinning manager
104
- Mounts Mounts // current mount state, if any.
105
- PrivateKey ic.PrivKey // the local node's private Key
106
+ Pinning pin.Pinner // the pinning manager
107
+ Mounts Mounts // current mount state, if any.
108
+ PrivateKey ic.PrivKey // the local node's private Key
109
+ PNetFingerpint []byte // fingerprint of private network
110
111
// Services
112
Peerstore pstore.Peerstore // storage for other Peer instances
@@ -174,7 +178,22 @@ func (n *IpfsNode) startOnlineServices(ctx context.Context, routingOption Routin
178
179
tpt := makeSmuxTransport(mplex)
180
177
- peerhost, err := hostOption(ctx, n.Identity, n.Peerstore, n.Reporter, addrfilter, tpt)
181
+ swarmkey, err := n.Repo.SwarmKey()
182
+ if err != nil {
183
+ return err
184
+ }
185
+
186
+ var protec ipnet.Protector
187
+ if swarmkey != nil {
188
+ protec, err = pnet.NewProtector(bytes.NewReader(swarmkey))
189
+ if err != nil {
190
+ return err
191
+ }
192
+ n.PNetFingerpint = protec.Fingerprint()
193
+ }
194
+
195
+ peerhost, err := hostOption(ctx, n.Identity, n.Peerstore, n.Reporter,
196
+ addrfilter, tpt, protec)
197
if err != nil {
198
return err
199
}
@@ -671,15 +690,15 @@ func listenAddresses(cfg *config.Config) ([]ma.Multiaddr, error) {
690
return listen, nil
691
}
692
674
-type HostOption func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport) (p2phost.Host, error)
693
+type HostOption func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protc ipnet.Protector) (p2phost.Host, error)
694
695
var DefaultHostOption HostOption = constructPeerHost
696
697
// isolates the complex initialization steps
679
-func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport) (p2phost.Host, error) {
698
+func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protec ipnet.Protector) (p2phost.Host, error) {
699
700
// no addresses to begin with. we'll start later.
682
- swrm, err := swarm.NewSwarmWithProtector(ctx, nil, id, ps, nil, tpt, bwr)
701
+ swrm, err := swarm.NewSwarmWithProtector(ctx, nil, id, ps, protec, tpt, bwr)
702
if err != nil {
703
return nil, err
704
}
core/mock/mock.go
+2
-1
@@ -18,6 +18,7 @@ import (
18
mocknet "gx/ipfs/QmU3g3psEDiC4tQh1Qu2NYg5aYVQqxC3m74ZavLwPfJEtu/go-libp2p/p2p/net/mock"
19
peer "gx/ipfs/QmZcUPvPhD1Xvk6mwijYF8AfR3mG31S1YsEfHG4khrFPRr/go-libp2p-peer"
20
host "gx/ipfs/QmbzbRyd22gcW92U1rA2yKagB3myMYhk45XBknJ49F9XWJ/go-libp2p-host"
21
+ ipnet "gx/ipfs/QmcT6bMjz32yoMdyvZsMvqFnbbsDxhTYw6FG1yMqKV8Rbh/go-libp2p-interface-pnet"
22
smux "gx/ipfs/QmeZBgYBHvxMukGK5ojg28BCNLB9SeXqT7XXg6o7r2GbJy/go-stream-muxer"
23
)
24
@@ -33,7 +34,7 @@ func NewMockNode() (*core.IpfsNode, error) {
34
}
35
36
func MockHostOption(mn mocknet.Mocknet) core.HostOption {
36
- return func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, _ smux.Transport) (host.Host, error) {
37
+ return func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, _ smux.Transport, _ ipnet.Protector) (host.Host, error) {
38
return mn.AddPeerWithPeerstore(id, ps)
39
}
40
}
package.json
+6
@@ -294,6 +294,12 @@
294
"hash": "QmU1N5xVAUXgo3XRTt6GhJ2SuJEbxj2zRgMS7FpjSR2U83",
295
"name": "semver",
296
"version": "3.3.0"
297
+ },
298
+ {
299
+ "author": "libp2p",
300
+ "hash": "QmQ2sk2irQYkeMMVKpLjq1bSiNPn9B5wZB53Nx8dd4dhnQ",
301
+ "name": "go-libp2p-pnet",
302
+ "version": "2.2.1"
303
}
304
],
305
"gxVersion": "0.10.0",
repo/fsrepo/fsrepo.go
+22
@@ -4,6 +4,7 @@ import (
4
"errors"
5
"fmt"
6
"io"
7
+ "io/ioutil"
8
"os"
9
"path/filepath"
10
"strconv"
@@ -62,6 +63,7 @@ func (err NoRepoError) Error() string {
63
}
64
65
const apiFile = "api"
66
+const swarmKeyFile = "swarm.key"
67
68
var (
69
@@ -592,6 +594,26 @@ func (r *FSRepo) GetStorageUsage() (uint64, error) {
594
return du, err
595
}
596
597
+func (r *FSRepo) SwarmKey() ([]byte, error) {
598
+ repoPath := filepath.Clean(r.path)
599
+ spath := filepath.Join(repoPath, swarmKeyFile)
600
+
601
+ f, err := os.Open(spath)
602
+ if err != nil {
603
+ if os.IsNotExist(err) {
604
+ return nil, nil
605
+ } else {
606
+ return nil, err
607
+ }
608
+ }
609
+ defer f.Close()
610
+ if err != nil {
611
+ return nil, err
612
+ }
613
+
614
+ return ioutil.ReadAll(f)
615
+}
616
+
617
var _ io.Closer = &FSRepo{}
618
var _ repo.Repo = &FSRepo{}
619
repo/mock.go
+4
@@ -44,3 +44,7 @@ func (m *Mock) Close() error { return errTODO }
44
func (m *Mock) SetAPIAddr(addr ma.Multiaddr) error { return errTODO }
45
46
func (m *Mock) Keystore() keystore.Keystore { return nil }
47
+
48
+func (m *Mock) SwarmKey() ([]byte, error) {
49
+ return nil, nil
50
+}
repo/repo.go
+2
@@ -30,6 +30,8 @@ type Repo interface {
30
// SetAPIAddr sets the API address in the repo.
31
SetAPIAddr(addr ma.Multiaddr) error
32
33
+ SwarmKey() ([]byte, error)
34
+
35
io.Closer
36
}
37