Skip to content

Commit

Permalink
Merge pull request #5529 from overbool/fix/issue-#5523
Browse files Browse the repository at this point in the history
fix(p2p): issue #5523
  • Loading branch information
Stebalien authored Oct 18, 2018
2 parents f6c6327 + 717c0c8 commit dd4d8bb
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 8 deletions.
40 changes: 40 additions & 0 deletions core/commands/p2p.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,12 @@ Example:
return
}

// port can't be 0
if err := checkPort(target); err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}

allowCustom, _, err := req.Option(allowCustomProtocolOptionName).Bool()
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
Expand All @@ -235,6 +241,40 @@ Example:
},
}

// checkPort checks whether target multiaddr contains tcp or udp protocol
// and whether the port is equal to 0
func checkPort(target ma.Multiaddr) error {
// get tcp or udp port from multiaddr
getPort := func() (string, error) {
sport, _ := target.ValueForProtocol(ma.P_TCP)
if sport != "" {
return sport, nil
}

sport, _ = target.ValueForProtocol(ma.P_UDP)
if sport != "" {
return sport, nil
}
return "", fmt.Errorf("address does not contain tcp or udp protocol")
}

sport, err := getPort()
if err != nil {
return err
}

port, err := strconv.Atoi(sport)
if err != nil {
return err
}

if port == 0 {
return fmt.Errorf("port can not be 0")
}

return nil
}

// forwardRemote forwards libp2p service connections to a manet address
func forwardRemote(ctx context.Context, p *p2p.P2P, proto protocol.ID, target ma.Multiaddr) error {
// TODO: return some info
Expand Down
10 changes: 4 additions & 6 deletions p2p/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,19 @@ type localListener struct {
// ForwardLocal creates new P2P stream to a remote listener
func (p2p *P2P) ForwardLocal(ctx context.Context, peer peer.ID, proto protocol.ID, bindAddr ma.Multiaddr) (Listener, error) {
listener := &localListener{
ctx: ctx,

p2p: p2p,

ctx: ctx,
p2p: p2p,
proto: proto,
laddr: bindAddr,
peer: peer,
}

maListener, err := manet.Listen(listener.laddr)
maListener, err := manet.Listen(bindAddr)
if err != nil {
return nil, err
}

listener.listener = maListener
listener.laddr = maListener.Multiaddr()

if err := p2p.ListenersLocal.Register(listener); err != nil {
return nil, err
Expand Down
22 changes: 20 additions & 2 deletions test/sharness/t0180-p2p.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ test_description="Test experimental p2p commands"

# start iptb + wait for peering
test_expect_success 'init iptb' '
iptb init -n 2 --bootstrap=none --port=0
iptb init -n 3 --bootstrap=none --port=0
'

test_expect_success 'generate test data' '
echo "ABCDEF" > test0.bin &&
echo "012345" > test1.bin
'

startup_cluster 2
startup_cluster 3

test_expect_success 'peer ids' '
PEERID_0=$(iptb get id 0) &&
Expand All @@ -37,6 +37,7 @@ test_expect_success 'fail without config option being enabled' '
test_expect_success "enable filestore config setting" '
ipfsi 0 config --json Experimental.Libp2pStreamMounting true
ipfsi 1 config --json Experimental.Libp2pStreamMounting true
ipfsi 2 config --json Experimental.Libp2pStreamMounting true
'

test_expect_success 'start p2p listener' '
Expand Down Expand Up @@ -147,6 +148,23 @@ test_expect_success 'C->S Close local listener' '

check_test_ports

# Checking port

test_expect_success "cannot accept 0 port in 'ipfs p2p listen'" '
test_must_fail ipfsi 2 p2p listen /x/p2p-test/0 /ip4/127.0.0.1/tcp/0
'

test_expect_success "'ipfs p2p forward' accept 0 port" '
ipfsi 2 p2p forward /x/p2p-test/0 /ip4/127.0.0.1/tcp/0 /ipfs/$PEERID_0
'

test_expect_success "'ipfs p2p ls' output looks good" '
echo "true" > forward_0_expected &&
ipfsi 2 p2p ls | awk '\''{print $2}'\'' | sed "s/.*\///" | awk -F: '\''{if($1>0)print"true"}'\'' > forward_0_actual &&
ipfsi 2 p2p close -p /x/p2p-test/0 &&
test_cmp forward_0_expected forward_0_actual
'

# Listing streams

test_expect_success "'ipfs p2p ls' succeeds" '
Expand Down

0 comments on commit dd4d8bb

Please sign in to comment.