mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-26 21:07:45 +08:00
Merge pull request #8071 from mycorrhizas/feat/non-icann-dns
feat: support DNSLink on non-ICANN DNS names
This commit is contained in:
commit
afa98998da
@ -13,8 +13,9 @@ import (
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
coreapi "github.com/ipfs/go-ipfs/core/coreapi"
|
||||
namesys "github.com/ipfs/go-namesys"
|
||||
isd "github.com/jbenet/go-is-domain"
|
||||
"github.com/libp2p/go-libp2p-core/peer"
|
||||
dns "github.com/miekg/dns"
|
||||
|
||||
mbase "github.com/multiformats/go-multibase"
|
||||
|
||||
config "github.com/ipfs/go-ipfs-config"
|
||||
@ -348,13 +349,27 @@ func knownSubdomainDetails(hostname string, knownGateways gatewayHosts) (gw *con
|
||||
return nil, "", "", "", false
|
||||
}
|
||||
|
||||
// isDNSLinkName returns bool if a valid DNS TXT record exist for provided host
|
||||
func isDNSLinkName(ctx context.Context, ipfs iface.CoreAPI, host string) bool {
|
||||
fqdn := stripPort(host)
|
||||
if len(fqdn) == 0 && !isd.IsDomain(fqdn) {
|
||||
// isDomainNameAndNotPeerID returns bool if string looks like a valid DNS name AND is not a PeerID
|
||||
func isDomainNameAndNotPeerID(hostname string) bool {
|
||||
if len(hostname) == 0 {
|
||||
return false
|
||||
}
|
||||
name := "/ipns/" + fqdn
|
||||
if _, err := peer.Decode(hostname); err == nil {
|
||||
return false
|
||||
}
|
||||
_, ok := dns.IsDomainName(hostname)
|
||||
return ok
|
||||
}
|
||||
|
||||
// isDNSLinkName returns bool if a valid DNS TXT record exist for provided host
|
||||
func isDNSLinkName(ctx context.Context, ipfs iface.CoreAPI, host string) bool {
|
||||
dnslinkName := stripPort(host)
|
||||
|
||||
if !isDomainNameAndNotPeerID(dnslinkName) {
|
||||
return false
|
||||
}
|
||||
|
||||
name := "/ipns/" + dnslinkName
|
||||
// check if DNSLink exists
|
||||
depth := options.Name.ResolveOption(nsopts.Depth(1))
|
||||
_, err := ipfs.Name().Resolve(ctx, name, depth)
|
||||
@ -473,7 +488,7 @@ func toSubdomainURL(hostname, path string, r *http.Request, ipfs iface.CoreAPI)
|
||||
}
|
||||
|
||||
// Normalize problematic PeerIDs (eg. ed25519+identity) to CID representation
|
||||
if isPeerIDNamespace(ns) && !isd.IsDomain(rootID) {
|
||||
if isPeerIDNamespace(ns) && !isDomainNameAndNotPeerID(rootID) {
|
||||
peerID, err := peer.Decode(rootID)
|
||||
// Note: PeerID CIDv1 with protobuf multicodec will fail, but we fix it
|
||||
// in the next block
|
||||
|
||||
@ -144,6 +144,25 @@ func TestHasPrefix(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsDomainNameAndNotPeerID(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
hostname string
|
||||
out bool
|
||||
}{
|
||||
{"", false},
|
||||
{"example.com", true},
|
||||
{"non-icann.something", true},
|
||||
{"..", false},
|
||||
{"12D3KooWFB51PRY9BxcXSH6khFXw1BZeszeLDy7C8GciskqCTZn5", false}, // valid peerid
|
||||
{"k51qzi5uqu5di608geewp3nqkg0bpujoasmka7ftkyxgcm3fh1aroup0gsdrna", false}, // valid peerid
|
||||
} {
|
||||
out := isDomainNameAndNotPeerID(test.hostname)
|
||||
if out != test.out {
|
||||
t.Errorf("(%s) returned '%t', expected '%t'", test.hostname, out, test.out)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestPortStripping(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
in string
|
||||
|
||||
1
go.mod
1
go.mod
@ -55,7 +55,6 @@ require (
|
||||
github.com/ipfs/go-verifcid v0.0.1
|
||||
github.com/ipfs/interface-go-ipfs-core v0.4.0
|
||||
github.com/ipld/go-car v0.3.0
|
||||
github.com/jbenet/go-is-domain v1.0.5
|
||||
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0
|
||||
github.com/jbenet/goprocess v0.1.4
|
||||
|
||||
5
go.sum
5
go.sum
@ -518,8 +518,6 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+
|
||||
github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs=
|
||||
github.com/jbenet/go-cienv v0.1.0 h1:Vc/s0QbQtoxX8MwwSLWWh+xNNZvM3Lw7NsTcHrvvhMc=
|
||||
github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA=
|
||||
github.com/jbenet/go-is-domain v1.0.5 h1:r92uiHbMEJo9Fkey5pMBtZAzjPQWic0ieo7Jw1jEuQQ=
|
||||
github.com/jbenet/go-is-domain v1.0.5/go.mod h1:xbRLRb0S7FgzDBTJlguhDVwLYM/5yNtvktxj2Ttfy7Q=
|
||||
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c h1:uUx61FiAa1GI6ZmVd2wf2vULeQZIKG66eybjNXKYCz4=
|
||||
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c/go.mod h1:sdx1xVM9UuLw1tXnhJWN3piypTUO3vCIHYmG15KE/dU=
|
||||
github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs=
|
||||
@ -916,8 +914,6 @@ github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N
|
||||
github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
|
||||
github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY=
|
||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8=
|
||||
github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms=
|
||||
@ -1470,6 +1466,7 @@ golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20201231184435-2d18734c6014/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
||||
Loading…
Reference in New Issue
Block a user