Skip to content

Commit 3f0bd78

Browse files
authored
Merge pull request #6087 from ipfs/fix/recursive-resolve
resolve: fix recursion
2 parents 37db5be + 417bd24 commit 3f0bd78

File tree

4 files changed

+65
-54
lines changed

4 files changed

+65
-54
lines changed

core/commands/dns.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ The resolver can recursively resolve:
5858
cmdkit.StringArg("domain-name", true, false, "The domain-name name to resolve.").EnableStdin(),
5959
},
6060
Options: []cmdkit.Option{
61-
cmdkit.BoolOption(dnsRecursiveOptionName, "r", "Resolve until the result is not a DNS link."),
61+
cmdkit.BoolOption(dnsRecursiveOptionName, "r", "Resolve until the result is not a DNS link.").WithDefault(true),
6262
},
6363
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
6464
recursive, _ := req.Options[dnsRecursiveOptionName].(bool)
@@ -71,10 +71,7 @@ The resolver can recursively resolve:
7171
}
7272

7373
output, err := resolver.Resolve(req.Context, name, ropts...)
74-
if err == namesys.ErrResolveFailed {
75-
return err
76-
}
77-
if err != nil {
74+
if err != nil && (recursive || err != namesys.ErrResolveRecursion) {
7875
return err
7976
}
8077
return cmds.EmitOnce(res, &ncmd.ResolvedPath{Path: output})

core/commands/name/ipns.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
11+
namesys "github.com/ipfs/go-ipfs/namesys"
1112

1213
cmdkit "github.com/ipfs/go-ipfs-cmdkit"
1314
cmds "github.com/ipfs/go-ipfs-cmds"
@@ -73,7 +74,7 @@ Resolve the value of a dnslink:
7374
cmdkit.StringArg("name", false, false, "The IPNS name to resolve. Defaults to your node's peerID."),
7475
},
7576
Options: []cmdkit.Option{
76-
cmdkit.BoolOption(recursiveOptionName, "r", "Resolve until the result is not an IPNS name."),
77+
cmdkit.BoolOption(recursiveOptionName, "r", "Resolve until the result is not an IPNS name.").WithDefault(true),
7778
cmdkit.BoolOption(nocacheOptionName, "n", "Do not use cached entries."),
7879
cmdkit.UintOption(dhtRecordCountOptionName, "dhtrc", "Number of records to request for DHT resolution."),
7980
cmdkit.StringOption(dhtTimeoutOptionName, "dhtt", "Max time to collect values during DHT resolution eg \"30s\". Pass 0 for no timeout."),
@@ -130,7 +131,7 @@ Resolve the value of a dnslink:
130131

131132
if !stream {
132133
output, err := api.Name().Resolve(req.Context, name, opts...)
133-
if err != nil {
134+
if err != nil && (recursive || err != namesys.ErrResolveRecursion) {
134135
return err
135136
}
136137

@@ -143,8 +144,8 @@ Resolve the value of a dnslink:
143144
}
144145

145146
for v := range output {
146-
if v.Err != nil {
147-
return err
147+
if v.Err != nil && (recursive || v.Err != namesys.ErrResolveRecursion) {
148+
return v.Err
148149
}
149150
if err := res.Emit(&ResolvedPath{path.FromString(v.Path.String())}); err != nil {
150151
return err

core/commands/resolve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Resolve the value of an IPFS DAG path:
7070
cmdkit.StringArg("name", true, false, "The name to resolve.").EnableStdin(),
7171
},
7272
Options: []cmdkit.Option{
73-
cmdkit.BoolOption(resolveRecursiveOptionName, "r", "Resolve until the result is an IPFS name."),
73+
cmdkit.BoolOption(resolveRecursiveOptionName, "r", "Resolve until the result is an IPFS name.").WithDefault(true),
7474
cmdkit.IntOption(resolveDhtRecordCountOptionName, "dhtrc", "Number of records to request for DHT resolution."),
7575
cmdkit.StringOption(resolveDhtTimeoutOptionName, "dhtt", "Max time to collect values during DHT resolution eg \"30s\". Pass 0 for no timeout."),
7676
},

test/sharness/t0160-resolve.sh

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,26 @@ test_expect_success "resolve: prepare dag" '
2121
dag_hash=$(ipfs dag put <<<"{\"i\": {\"j\": {\"k\": \"asdfasdfasdf\"}}}")
2222
'
2323

24+
test_expect_success "resolve: prepare keys" '
25+
self_hash=$(ipfs id -f="<id>") &&
26+
alt_hash=$(ipfs key gen -t rsa alt)
27+
'
28+
2429
test_resolve_setup_name() {
25-
ref=$1
26-
27-
test_expect_success "resolve: prepare name" '
28-
id_hash=$(ipfs id -f="<id>") &&
29-
ipfs name publish --allow-offline "$ref" &&
30-
printf "$ref\n" >expected_nameval &&
31-
ipfs name resolve >actual_nameval &&
32-
test_cmp expected_nameval actual_nameval
30+
local key="$1"
31+
local ref="$2"
32+
33+
test_expect_success "resolve: prepare $key" '
34+
ipfs name publish --key="$key" --allow-offline "$ref"
3335
'
3436
}
3537

3638
test_resolve_setup_name_fail() {
37-
ref=$1
38-
39-
test_expect_failure "resolve: prepare name" '
40-
id_hash=$(ipfs id -f="<id>") &&
41-
ipfs name publish --allow-offline "$ref" &&
42-
printf "$ref" >expected_nameval &&
43-
ipfs name resolve >actual_nameval &&
44-
test_cmp expected_nameval actual_nameval
39+
local key="$1"
40+
local ref="$2"
41+
42+
test_expect_failure "resolve: prepare $key" '
43+
ipfs name publish --key="$key" --allow-offline "$ref"
4544
'
4645
}
4746

@@ -51,7 +50,7 @@ test_resolve() {
5150
extra=$3
5251

5352
test_expect_success "resolve succeeds: $src" '
54-
ipfs resolve $extra -r "$src" >actual
53+
ipfs resolve $extra "$src" >actual
5554
'
5655

5756
test_expect_success "resolved correctly: $src -> $dst" '
@@ -69,17 +68,31 @@ test_resolve_cmd() {
6968
test_resolve "/ipld/$dag_hash/i/j" "/ipld/$dag_hash/i/j"
7069
test_resolve "/ipld/$dag_hash/i" "/ipld/$dag_hash/i"
7170

72-
test_resolve_setup_name "/ipfs/$a_hash"
73-
test_resolve "/ipns/$id_hash" "/ipfs/$a_hash"
74-
test_resolve "/ipns/$id_hash/b" "/ipfs/$b_hash"
75-
test_resolve "/ipns/$id_hash/b/c" "/ipfs/$c_hash"
71+
test_resolve_setup_name "self" "/ipfs/$a_hash"
72+
test_resolve "/ipns/$self_hash" "/ipfs/$a_hash"
73+
test_resolve "/ipns/$self_hash/b" "/ipfs/$b_hash"
74+
test_resolve "/ipns/$self_hash/b/c" "/ipfs/$c_hash"
7675

77-
test_resolve_setup_name "/ipfs/$b_hash"
78-
test_resolve "/ipns/$id_hash" "/ipfs/$b_hash"
79-
test_resolve "/ipns/$id_hash/c" "/ipfs/$c_hash"
76+
test_resolve_setup_name "self" "/ipfs/$b_hash"
77+
test_resolve "/ipns/$self_hash" "/ipfs/$b_hash"
78+
test_resolve "/ipns/$self_hash/c" "/ipfs/$c_hash"
8079

81-
test_resolve_setup_name "/ipfs/$c_hash"
82-
test_resolve "/ipns/$id_hash" "/ipfs/$c_hash"
80+
test_resolve_setup_name "self" "/ipfs/$c_hash"
81+
test_resolve "/ipns/$self_hash" "/ipfs/$c_hash"
82+
83+
# simple recursion succeeds
84+
test_resolve_setup_name "alt" "/ipns/$self_hash"
85+
test_resolve "/ipns/$alt_hash" "/ipfs/$c_hash"
86+
87+
# partial resolve succeeds
88+
test_resolve "/ipns/$alt_hash" "/ipns/$self_hash" -r=false
89+
90+
# infinite recursion fails
91+
test_resolve_setup_name "self" "/ipns/$self_hash"
92+
test_expect_success "recursive resolve terminates" '
93+
test_expect_code 1 ipfs resolve /ipns/$self_hash 2>recursion_error &&
94+
grep "recursion limit exceeded" recursion_error
95+
'
8396
}
8497

8598
test_resolve_cmd_b32() {
@@ -92,17 +105,17 @@ test_resolve_cmd_b32() {
92105

93106
# flags needed passed in path does not contain cid to derive base
94107

95-
test_resolve_setup_name "/ipfs/$a_hash_b32"
96-
test_resolve "/ipns/$id_hash" "/ipfs/$a_hash_b32" --cid-base=base32
97-
test_resolve "/ipns/$id_hash/b" "/ipfs/$b_hash_b32" --cid-base=base32
98-
test_resolve "/ipns/$id_hash/b/c" "/ipfs/$c_hash_b32" --cid-base=base32
108+
test_resolve_setup_name "self" "/ipfs/$a_hash_b32"
109+
test_resolve "/ipns/$self_hash" "/ipfs/$a_hash_b32" --cid-base=base32
110+
test_resolve "/ipns/$self_hash/b" "/ipfs/$b_hash_b32" --cid-base=base32
111+
test_resolve "/ipns/$self_hash/b/c" "/ipfs/$c_hash_b32" --cid-base=base32
99112

100-
test_resolve_setup_name "/ipfs/$b_hash_b32" --cid-base=base32
101-
test_resolve "/ipns/$id_hash" "/ipfs/$b_hash_b32" --cid-base=base32
102-
test_resolve "/ipns/$id_hash/c" "/ipfs/$c_hash_b32" --cid-base=base32
113+
test_resolve_setup_name "self" "/ipfs/$b_hash_b32" --cid-base=base32
114+
test_resolve "/ipns/$self_hash" "/ipfs/$b_hash_b32" --cid-base=base32
115+
test_resolve "/ipns/$self_hash/c" "/ipfs/$c_hash_b32" --cid-base=base32
103116

104-
test_resolve_setup_name "/ipfs/$c_hash_b32"
105-
test_resolve "/ipns/$id_hash" "/ipfs/$c_hash_b32" --cid-base=base32
117+
test_resolve_setup_name "self" "/ipfs/$c_hash_b32"
118+
test_resolve "/ipns/$self_hash" "/ipfs/$c_hash_b32" --cid-base=base32
106119
}
107120

108121

@@ -131,17 +144,17 @@ test_resolve_cmd_fail() {
131144
test_resolve "/ipld/$dag_hash/i/j" "/ipld/$dag_hash/i/j"
132145
test_resolve "/ipld/$dag_hash/i" "/ipld/$dag_hash/i"
133146

134-
test_resolve_setup_name_fail "/ipfs/$a_hash"
135-
test_resolve_fail "/ipns/$id_hash" "/ipfs/$a_hash"
136-
test_resolve_fail "/ipns/$id_hash/b" "/ipfs/$b_hash"
137-
test_resolve_fail "/ipns/$id_hash/b/c" "/ipfs/$c_hash"
147+
test_resolve_setup_name_fail "self" "/ipfs/$a_hash"
148+
test_resolve_fail "/ipns/$self_hash" "/ipfs/$a_hash"
149+
test_resolve_fail "/ipns/$self_hash/b" "/ipfs/$b_hash"
150+
test_resolve_fail "/ipns/$self_hash/b/c" "/ipfs/$c_hash"
138151

139-
test_resolve_setup_name_fail "/ipfs/$b_hash"
140-
test_resolve_fail "/ipns/$id_hash" "/ipfs/$b_hash"
141-
test_resolve_fail "/ipns/$id_hash/c" "/ipfs/$c_hash"
152+
test_resolve_setup_name_fail "self" "/ipfs/$b_hash"
153+
test_resolve_fail "/ipns/$self_hash" "/ipfs/$b_hash"
154+
test_resolve_fail "/ipns/$self_hash/c" "/ipfs/$c_hash"
142155

143-
test_resolve_setup_name_fail "/ipfs/$c_hash"
144-
test_resolve_fail "/ipns/$id_hash" "/ipfs/$c_hash"
156+
test_resolve_setup_name_fail "self" "/ipfs/$c_hash"
157+
test_resolve_fail "/ipns/$self_hash" "/ipfs/$c_hash"
145158
}
146159

147160
# should work offline

0 commit comments

Comments
 (0)