diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go index 7f190984960..940897eea0d 100644 --- a/cmd/ipfs/daemon.go +++ b/cmd/ipfs/daemon.go @@ -673,8 +673,8 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error return nil, fmt.Errorf("serveHTTPApi: ConstructNode() failed: %s", err) } - if err := node.Repo.SetAPIAddr(listeners[0].Multiaddr()); err != nil { - return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %s", err) + if err := node.Repo.SetAPIAddr(rewriteMaddrToUseLocalhostIfItsAny(listeners[0].Multiaddr())); err != nil { + return nil, fmt.Errorf("serveHTTPApi: SetAPIAddr() failed: %w", err) } errc := make(chan error) @@ -695,6 +695,19 @@ func serveHTTPApi(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, error return errc, nil } +func rewriteMaddrToUseLocalhostIfItsAny(maddr ma.Multiaddr) ma.Multiaddr { + first, rest := ma.SplitFirst(maddr) + + switch { + case first.Equal(manet.IP4Unspecified): + return manet.IP4Loopback.Encapsulate(rest) + case first.Equal(manet.IP6Unspecified): + return manet.IP6Loopback.Encapsulate(rest) + default: + return maddr // not ip + } +} + // printSwarmAddrs prints the addresses of the host func printSwarmAddrs(node *core.IpfsNode) { if !node.IsOnline { @@ -808,7 +821,11 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e } if len(listeners) > 0 { - if err := node.Repo.SetGatewayAddr(listeners[0].Addr()); err != nil { + addr, err := manet.ToNetAddr(rewriteMaddrToUseLocalhostIfItsAny(listeners[0].Multiaddr())) + if err != nil { + return nil, fmt.Errorf("serveHTTPGateway: manet.ToIP() failed: %w", err) + } + if err := node.Repo.SetGatewayAddr(addr); err != nil { return nil, fmt.Errorf("serveHTTPGateway: SetGatewayAddr() failed: %w", err) } } @@ -831,7 +848,7 @@ func serveHTTPGateway(req *cmds.Request, cctx *oldcmds.Context) (<-chan error, e return errc, nil } -//collects options and opens the fuse mountpoint +// collects options and opens the fuse mountpoint func mountFuse(req *cmds.Request, cctx *oldcmds.Context) error { cfg, err := cctx.GetConfig() if err != nil { diff --git a/test/sharness/t0064-api-file.sh b/test/sharness/t0064-api-file.sh index 97c1a7b239c..67879fe82f8 100755 --- a/test/sharness/t0064-api-file.sh +++ b/test/sharness/t0064-api-file.sh @@ -97,4 +97,16 @@ test_expect_success "pin ls fails when daemon is running but API file is missing test_kill_ipfs_daemon +APIPORT=32563 + +test_expect_success "Verify gateway file diallable while on unspecified" ' + ipfs config Addresses.API /ip4/0.0.0.0/tcp/$APIPORT && + test_launch_ipfs_daemon && + cat "$IPFS_PATH/api" > api_file_actual && + echo -n "/ip4/127.0.0.1/tcp/$APIPORT" > api_file_expected && + test_cmp api_file_expected api_file_actual +' + +test_kill_ipfs_daemon + test_done diff --git a/test/sharness/t0110-gateway.sh b/test/sharness/t0110-gateway.sh index 484eefe4a0d..ba6ecb354cb 100755 --- a/test/sharness/t0110-gateway.sh +++ b/test/sharness/t0110-gateway.sh @@ -288,16 +288,25 @@ test_expect_success "GET compact blocks succeeds" ' ' test_expect_success "Verify gateway file" ' - cat "$IPFS_PATH/gateway" >> gateway_file_actual && - echo -n "http://$GWAY_ADDR" >> gateway_daemon_actual && + cat "$IPFS_PATH/gateway" > gateway_file_actual && + echo -n "http://$GWAY_ADDR" > gateway_daemon_actual && test_cmp gateway_daemon_actual gateway_file_actual ' test_kill_ipfs_daemon - GWPORT=32563 +test_expect_success "Verify gateway file diallable while on unspecified" ' + ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/$GWPORT && + test_launch_ipfs_daemon && + cat "$IPFS_PATH/gateway" > gateway_file_actual && + echo -n "http://127.0.0.1:$GWPORT" > gateway_file_expected && + test_cmp gateway_file_expected gateway_file_actual +' + +test_kill_ipfs_daemon + test_expect_success "set up iptb testbed" ' iptb testbed create -type localipfs -count 5 -force -init && ipfsi 0 config Addresses.Gateway /ip4/127.0.0.1/tcp/$GWPORT &&