mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-15 07:58:15 +08:00
Merge pull request #4977 from ipfs/fix/4973-1
only resolve dnslinks once in the gateway
This commit is contained in:
core/corehttp
@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"math"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
@ -31,11 +32,25 @@ var emptyDir = "/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn"
|
||||
type mockNamesys map[string]path.Path
|
||||
|
||||
func (m mockNamesys) Resolve(ctx context.Context, name string, opts ...nsopts.ResolveOpt) (value path.Path, err error) {
|
||||
p, ok := m[name]
|
||||
if !ok {
|
||||
return "", namesys.ErrResolveFailed
|
||||
cfg := nsopts.DefaultResolveOpts()
|
||||
for _, o := range opts {
|
||||
o(cfg)
|
||||
}
|
||||
return p, nil
|
||||
depth := cfg.Depth
|
||||
if depth == nsopts.UnlimitedDepth {
|
||||
depth = math.MaxUint64
|
||||
}
|
||||
for depth > 0 && strings.HasPrefix(name, "/ipns/") {
|
||||
depth--
|
||||
|
||||
var ok bool
|
||||
value, ok = m[name]
|
||||
if !ok {
|
||||
return "", namesys.ErrResolveFailed
|
||||
}
|
||||
name = value.String()
|
||||
}
|
||||
return value, nil
|
||||
}
|
||||
|
||||
func (m mockNamesys) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error {
|
||||
@ -130,6 +145,10 @@ func TestGatewayGet(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
ns["/ipns/example.com"] = path.FromString("/ipfs/" + k)
|
||||
ns["/ipns/working.example.com"] = path.FromString("/ipfs/" + k)
|
||||
ns["/ipns/double.example.com"] = path.FromString("/ipns/working.example.com")
|
||||
ns["/ipns/triple.example.com"] = path.FromString("/ipns/double.example.com")
|
||||
ns["/ipns/broken.example.com"] = path.FromString("/ipns/" + k)
|
||||
|
||||
t.Log(ts.URL)
|
||||
for _, test := range []struct {
|
||||
@ -145,6 +164,13 @@ func TestGatewayGet(t *testing.T) {
|
||||
{"localhost:5001", "/ipns/%0D%0A%0D%0Ahello", http.StatusNotFound, "ipfs resolve -r /ipns/%0D%0A%0D%0Ahello: " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||
{"localhost:5001", "/ipns/example.com", http.StatusOK, "fnord"},
|
||||
{"example.com", "/", http.StatusOK, "fnord"},
|
||||
|
||||
{"working.example.com", "/", http.StatusOK, "fnord"},
|
||||
{"double.example.com", "/", http.StatusOK, "fnord"},
|
||||
{"triple.example.com", "/", http.StatusOK, "fnord"},
|
||||
{"working.example.com", "/ipfs/" + k, http.StatusNotFound, "ipfs resolve -r /ipns/working.example.com/ipfs/" + k + ": no link named \"ipfs\" under " + k + "\n"},
|
||||
{"broken.example.com", "/", http.StatusNotFound, "ipfs resolve -r /ipns/broken.example.com/: " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||
{"broken.example.com", "/ipfs/" + k, http.StatusNotFound, "ipfs resolve -r /ipns/broken.example.com/ipfs/" + k + ": " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||
} {
|
||||
var c http.Client
|
||||
r, err := http.NewRequest("GET", ts.URL+test.path, nil)
|
||||
|
@ -6,7 +6,8 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
nsopts "github.com/ipfs/go-ipfs/namesys/opts"
|
||||
|
||||
isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain"
|
||||
)
|
||||
@ -24,7 +25,7 @@ func IPNSHostnameOption() ServeOption {
|
||||
host := strings.SplitN(r.Host, ":", 2)[0]
|
||||
if len(host) > 0 && isd.IsDomain(host) {
|
||||
name := "/ipns/" + host
|
||||
if _, err := n.Namesys.Resolve(ctx, name); err == nil {
|
||||
if _, err := n.Namesys.Resolve(ctx, name, nsopts.Depth(1)); err == nil {
|
||||
r.Header["X-Ipns-Original-Path"] = []string{r.URL.Path}
|
||||
r.URL.Path = name + r.URL.Path
|
||||
}
|
||||
|
Reference in New Issue
Block a user