OSDN Git Service

Split entity resolver from resource resolver to prevent XXE vulnerability.
[mikutoga/TogaGem.git] / src / main / java / jp / sfjp / mikutoga / xml / XmlResourceResolver.java
index e103268..e3c5a53 100644 (file)
@@ -18,9 +18,6 @@ import java.util.HashMap;
 import java.util.Map;
 import org.w3c.dom.ls.LSInput;
 import org.w3c.dom.ls.LSResourceResolver;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 /**
  * URL変換マップに従い、XML文書からの外部参照をリダイレクトする。
@@ -28,7 +25,7 @@ import org.xml.sax.SAXException;
  * 主な用途は外部スキーマのリソース化など。
  */
 public class XmlResourceResolver
-        implements LSResourceResolver, EntityResolver {
+        implements LSResourceResolver{
 
     /** XML Schema. */
     public static final String SCHEMA_XML =
@@ -58,7 +55,7 @@ public class XmlResourceResolver
         assert this.getClass().equals(THISCLASS);
 
         Map<URI, URI> map;
-        map = new HashMap<URI, URI>();
+        map = new HashMap<>();
         map = Collections.synchronizedMap(map);
         this.uriMap = map;
 
@@ -77,6 +74,7 @@ public class XmlResourceResolver
     /**
      * 絶対URIと相対URIを合成したURIを返す。
      * 正規化も行われる。
+     *
      * @param base 絶対URIでなければならない。nullでもよい。
      * @param relative 絶対URIでもよいがその場合baseは無視される。null可。
      * @return 合成結果のURLオブジェクト。必ず絶対URIになる。
@@ -103,7 +101,23 @@ public class XmlResourceResolver
             relativeURI = EMPTY_URI;
         }
 
+        URI result = buildBaseRelativeURI(baseURI, relativeURI);
+        return result;
+    }
+
+    /**
+     * 絶対URIと相対URIを合成したURIを返す。
+     * 正規化も行われる。
+     *
+     * @param baseURI 絶対URIでなければならない。nullでもよい。
+     * @param relativeURI 絶対URIでもよいがその場合baseは無視される。
+     * @return 合成結果のURLオブジェクト。必ず絶対URIになる。
+     * @throws java.lang.IllegalArgumentException 絶対URIが生成できない。
+     */
+    private static URI buildBaseRelativeURI(URI baseURI, URI relativeURI)
+            throws IllegalArgumentException {
         URI resultURI;
+
         if(baseURI == null || relativeURI.isAbsolute()){
             resultURI = relativeURI;
         }else{
@@ -206,7 +220,7 @@ public class XmlResourceResolver
      * @param originalURI オリジナルURI
      * @return 入力ストリーム。リダイレクト先が未登録の場合はnull
      * @throws java.io.IOException 入出力エラー。
-     * もしくはリソースが見つからない。
+     *     もしくはリソースが見つからない。
      */
     private InputStream getXMLResourceAsStream(URI originalURI)
             throws IOException{
@@ -261,36 +275,6 @@ public class XmlResourceResolver
         return input;
     }
 
-    /**
-     * {@inheritDoc}
-     * URL変換したあとの入力ソースを返す。
-     * @param publicId {@inheritDoc}
-     * @param systemId {@inheritDoc}
-     * @return {@inheritDoc}
-     * @throws org.xml.sax.SAXException {@inheritDoc}
-     * @throws java.io.IOException {@inheritDoc}
-     */
-    @Override
-    public InputSource resolveEntity(String publicId, String systemId)
-            throws SAXException, IOException{
-        if(systemId == null) return null;
-
-        URI originalUri;
-        try{
-            originalUri = new URI(systemId);
-        }catch(URISyntaxException e){
-            return null;
-        }
-
-        InputStream is = getXMLResourceAsStream(originalUri);
-        if(is == null) return null;
-
-        InputSource source = new InputSource(is);
-        source.setPublicId(publicId);
-        source.setSystemId(systemId);
-
-        return source;
-    }
 
     /**
      * JRE1.5用LSInput実装。