@cryptotaxi247 / kubo / commits / faca4518b

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