@cryptotaxi247 / kubo / commits / 85774b89d

namesys: Make paths with multiple segemnts work. Fixes #2059

namesys: Make paths with multiple segemnts work. Fixes #2059 Also fixes non-recursive resolve erring instead showing one step. The patch of core/commands/resolve.go could be done better but I don't know how to get access to ErrResolveRecursion. It allows for dnslinks into sub-segments. So for example hosting multiple blogs on just domains from one pubkey. Fixes #2059 Add tests and fix case when dnslinks references dnslink License: MIT Signed-off-by: Jakub (Kubuxu) Sztandera <kubuxu@gmail.com>

Jakub (Kubuxu) Sztandera committed Jan 2, 2016 at 00:24 UTC 85774b89d3152915c355a4126d8c1c1fba580e85
4 files changed +25 -7
namesys/dns.go
+8 -3
@@ -45,12 +45,14 @@ func (r *DNSResolver) ResolveN(ctx context.Context, name string, depth int) (pat
45 // TXT records for a given domain name should contain a b58
46 // encoded multihash.
47 func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path, error) {
48 - if !isd.IsDomain(name) {
48 + segments := strings.SplitN(name, "/", 2)
49 +
50 + if !isd.IsDomain(segments[0]) {
51 return "", errors.New("not a valid domain name")
52 }
53
52 - log.Infof("DNSResolver resolving %s", name)
53 - txt, err := r.lookupTXT(name)
54 + log.Infof("DNSResolver resolving %s", segments[0])
55 + txt, err := r.lookupTXT(segments[0])
56 if err != nil {
57 return "", err
58 }
@@ -58,6 +60,9 @@ func (r *DNSResolver) resolveOnce(ctx context.Context, name string) (path.Path,
60 for _, t := range txt {
61 p, err := parseEntry(t)
62 if err == nil {
63 + if len(segments) > 1 {
64 + return path.FromSegments(p.String() + "/", segments[1])
65 + }
66 return p, nil
67 }
68 }
namesys/dns_test.go
+9
@@ -18,6 +18,7 @@ func (m *mockDNS) lookupTXT(name string) (txt []string, err error) {
18 }
19
20 func TestDnsEntryParsing(t *testing.T) {
21 +
22 goodEntries := []string{
23 "QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
24 "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD",
@@ -86,6 +87,12 @@ func newMockDNS() *mockDNS {
87 "bad.example.com": []string{
88 "dnslink=",
89 },
90 + "withsegment.example.com": []string{
91 + "dnslink=/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment",
92 + },
93 + "withrecsegment.example.com": []string{
94 + "dnslink=/ipns/withsegment.example.com/subsub",
95 + },
96 },
97 }
98 }
@@ -109,4 +116,6 @@ func TestDNSResolution(t *testing.T) {
116 testResolution(t, r, "loop1.example.com", 3, "/ipns/loop2.example.com", ErrResolveRecursion)
117 testResolution(t, r, "loop1.example.com", DefaultDepthLimit, "/ipns/loop1.example.com", ErrResolveRecursion)
118 testResolution(t, r, "bad.example.com", DefaultDepthLimit, "", ErrResolveFailed)
119 + testResolution(t, r, "withsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment", nil)
120 + testResolution(t, r, "withrecsegment.example.com", DefaultDepthLimit, "/ipfs/QmY3hE8xgFCjGcz6PHgnvJz5HZi1BaKRfPkn1ghZUcYMjD/sub/segment/subsub", nil)
121 }
namesys/namesys.go
+7 -3
@@ -64,17 +64,21 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error)
64 if !strings.HasPrefix(name, "/ipns/") {
65 name = "/ipns/" + name
66 }
67 - segments := strings.SplitN(name, "/", 3)
67 + segments := strings.SplitN(name, "/", 4)
68 if len(segments) < 3 || segments[0] != "" {
69 log.Warningf("Invalid name syntax for %s", name)
70 return "", ErrResolveFailed
71 }
72
73 for protocol, resolver := range ns.resolvers {
74 - log.Debugf("Attempting to resolve %s with %s", name, protocol)
74 + log.Debugf("Attempting to resolve %s with %s", segments[2], protocol)
75 p, err := resolver.resolveOnce(ctx, segments[2])
76 if err == nil {
77 - return p, err
77 + if len(segments) > 3 {
78 + return path.FromSegments(p.String() + "/", segments[3])
79 + } else {
80 + return p, err
81 + }
82 }
83 }
84 log.Warningf("No resolver found for %s", name)
namesys/routing.go
+1 -1
@@ -123,7 +123,7 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa
123
124 hash, err := mh.FromB58String(name)
125 if err != nil {
126 - log.Warning("RoutingResolve: bad input hash: [%s]\n", name)
126 + log.Warningf("RoutingResolve: bad input hash: [%s]\n", name)
127 return "", err
128 }
129 // name should be a multihash. if it isn't, error out here.