14
14
import io .swagger .v3 .oas .models .responses .ApiResponse ;
15
15
import io .swagger .v3 .oas .models .security .SecurityScheme ;
16
16
import io .swagger .v3 .parser .core .models .AuthorizationValue ;
17
+ import io .swagger .v3 .parser .urlresolver .PermittedUrlsChecker ;
18
+ import io .swagger .v3 .parser .urlresolver .exceptions .HostDeniedException ;
19
+ import io .swagger .v3 .parser .util .RemoteUrl ;
17
20
import org .apache .commons .lang3 .StringUtils ;
18
21
import org .slf4j .LoggerFactory ;
19
22
@@ -31,6 +34,7 @@ public class ReferenceVisitor extends AbstractVisitor {
31
34
protected HashMap <Object , Object > visitedMap ;
32
35
protected OpenAPI31Traverser openAPITraverser ;
33
36
protected Reference reference ;
37
+ protected DereferencerContext context ;
34
38
35
39
public ReferenceVisitor (
36
40
Reference reference ,
@@ -41,6 +45,20 @@ public ReferenceVisitor(
41
45
this .openAPITraverser = openAPITraverser ;
42
46
this .visited = visited ;
43
47
this .visitedMap = visitedMap ;
48
+ this .context = null ;
49
+ }
50
+
51
+ public ReferenceVisitor (
52
+ Reference reference ,
53
+ OpenAPI31Traverser openAPITraverser ,
54
+ HashSet <Object > visited ,
55
+ HashMap <Object , Object > visitedMap ,
56
+ DereferencerContext context ) {
57
+ this .reference = reference ;
58
+ this .openAPITraverser = openAPITraverser ;
59
+ this .visited = visited ;
60
+ this .visitedMap = visitedMap ;
61
+ this .context = context ;
44
62
}
45
63
46
64
public String toBaseURI (String uri ) throws Exception {
@@ -174,13 +192,21 @@ public Header visitHeader(Header header){
174
192
return resolveRef (header , header .get$ref (), Header .class , openAPITraverser ::traverseHeader );
175
193
}
176
194
195
+ @ Override
196
+ public String readHttp (String uri , List <AuthorizationValue > auths ) throws Exception {
197
+ if (context .getParseOptions ().isSafelyResolveURL ()){
198
+ checkUrlIsPermitted (uri );
199
+ }
200
+ return RemoteUrl .urlToString (uri , auths );
201
+ }
202
+
177
203
public <T > T resolveRef (T visiting , String ref , Class <T > clazz , BiFunction <T , ReferenceVisitor , T > traverseFunction ){
178
204
try {
179
205
Reference reference = toReference (ref );
180
206
String fragment = ReferenceUtils .getFragment (ref );
181
207
JsonNode node = ReferenceUtils .jsonPointerEvaluate (fragment , reference .getJsonNode (), ref );
182
208
T resolved = openAPITraverser .deserializeFragment (node , clazz , ref , fragment , reference .getMessages ());
183
- ReferenceVisitor visitor = new ReferenceVisitor (reference , openAPITraverser , this .visited , this .visitedMap );
209
+ ReferenceVisitor visitor = new ReferenceVisitor (reference , openAPITraverser , this .visited , this .visitedMap , context );
184
210
return traverseFunction .apply (resolved , visitor );
185
211
186
212
} catch (Exception e ) {
@@ -232,7 +258,7 @@ public Schema resolveSchemaRef(Schema visiting, String ref, List<String> inherit
232
258
if (isAnchor ) {
233
259
resolved .$anchor (null );
234
260
}
235
- ReferenceVisitor visitor = new ReferenceVisitor (reference , openAPITraverser , this .visited , this .visitedMap );
261
+ ReferenceVisitor visitor = new ReferenceVisitor (reference , openAPITraverser , this .visited , this .visitedMap , context );
236
262
return openAPITraverser .traverseSchema (resolved , visitor , inheritedIds );
237
263
} catch (Exception e ) {
238
264
LOGGER .error ("Error resolving schema " + ref , e );
@@ -278,4 +304,11 @@ public JsonNode deserializeIntoTree(String content) throws Exception {
278
304
public JsonNode parse (String absoluteUri , List <AuthorizationValue > auths ) throws Exception {
279
305
return deserializeIntoTree (readURI (absoluteUri , auths ));
280
306
}
307
+
308
+ protected void checkUrlIsPermitted (String refSet ) throws HostDeniedException {
309
+ PermittedUrlsChecker permittedUrlsChecker = new PermittedUrlsChecker (context .getParseOptions ().getRemoteRefAllowList (),
310
+ context .getParseOptions ().getRemoteRefBlockList ());
311
+
312
+ permittedUrlsChecker .verify (refSet );
313
+ }
281
314
}
0 commit comments