You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by mu...@apache.org on 2007/09/10 23:03:17 UTC

svn commit: r574372 - /xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java

Author: mullan
Date: Mon Sep 10 14:03:16 2007
New Revision: 574372

URL: http://svn.apache.org/viewvc?rev=574372&view=rev
Log:
Use StaxURIDereferencer to dereference URIs.

Modified:
    xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java

Modified: xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java
URL: http://svn.apache.org/viewvc/xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java?rev=574372&r1=574371&r2=574372&view=diff
==============================================================================
--- xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java (original)
+++ xml/security/branches/stax_jsr105/src/com/r_bg/stax/XMLSignatureWorker.java Mon Sep 10 14:03:16 2007
@@ -3,14 +3,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.InputStream;
-import java.io.IOException;
 import java.math.BigInteger;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
 import java.security.KeyException;
 import java.security.KeyFactory;
 import java.security.MessageDigest;
@@ -30,6 +24,8 @@
 import javax.xml.crypto.KeySelectorException;
 import javax.xml.crypto.KeySelectorResult;
 import javax.xml.crypto.MarshalException;
+import javax.xml.crypto.OctetStreamData;
+import javax.xml.crypto.URIDereferencer;
 import javax.xml.crypto.XMLCryptoContext;
 import javax.xml.crypto.XMLStructure;
 import javax.xml.crypto.dsig.*;
@@ -39,7 +35,6 @@
 import javax.xml.crypto.dsig.keyinfo.RetrievalMethod;
 import javax.xml.crypto.dsig.keyinfo.X509Data;
 import javax.xml.crypto.dsig.keyinfo.X509IssuerSerial;
-import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 
@@ -66,9 +61,9 @@
 	private String id;
 	private String type;
 	List<Transform> transforms = new ArrayList<Transform>();
-	private String baseURI;
-	ReferenceWorker(String baseURI) {
-	    this.baseURI = baseURI;
+	private XMLCryptoContext context;
+	ReferenceWorker(XMLCryptoContext context) {
+	    this.context = context;
 	}
 	public StaxWorker read(XMLStreamReader reader) {
 		switch (reader.getEventType()) {
@@ -122,78 +117,48 @@
 		return null;
 	}
 	public StaxWatcher remove() {		
+	    String baseURI = context.getBaseURI();
 	    if (uri != null) {
 		if (uri.startsWith("#")) {
 		    return new IdWatcher(uri.substring(1), this, transforms, os);
 //		    return new IdWatcher(uri.substring(1),this,transforms,System.out);
-		} else if (uri.isEmpty()) {
-		    System.out.println("enveloped");
-//		    return new EnvelopedIdWatcher(transforms, os);
-		} else if (uri.startsWith("http:") ||
-		    (baseURI != null && baseURI.startsWith("http:"))) {
+		} else {
+		    URIDereferencer ud = StaxURIDereferencer.INSTANCE;
 		    try {
-			URLConnection uc = null;
-		        if (baseURI != null) {
-		            uc = new URL(new URL(baseURI),uri).openConnection();
-			} else {
-		            uc = new URL(uri).openConnection();
-			}
-			InputStream is = uc.getInputStream();
-                        if (!transforms.isEmpty()) {
-                            // only Base64 supported right now ...
-			    try {
-                                Base64.decode(is, os);
-			    } catch (Base64DecodingException e) {
-				e.printStackTrace();
+		        Data data = ud.dereference(this, context);
+                       	for (Transform t : transforms) {
+                       	    // Only one Transform supported right now
+			    if (data instanceof StaxData) {
+			        XMLStreamReader re = 
+				    ((StaxData) data).getXMLStreamReader();
+			        while (re.getEventType() 
+				    != XMLStreamReader.END_DOCUMENT) {
+                       	    	    t.transform(data, null, os);
+				    re.next();
+				}
+			    } else {
+               	    	        data = t.transform(data, null, os);
 			    }
-			} else {
-         		    byte buf[] = new byte[4096];
+		            break;
+		        }
+			if (data instanceof OctetStreamData) {
+			    InputStream is = 
+				((OctetStreamData) data).getOctetStream();
+         		    byte buf[] = new byte[1024];
          		    int read = 0;
          		    while ((read = is.read(buf)) >= 0) {
             		        os.write(buf, 0, read);
          		    }
 			}
-			setResult(null);
-
-		    } catch (IOException e) {
-			e.printStackTrace();
-		    }
-		} else if (uri.startsWith("file:") ||
-		    (baseURI != null && baseURI.startsWith("file:"))) {
-		    try {
-		        URI fileURI = null;
-		        if (baseURI != null) {
-			    fileURI = new URI(baseURI).resolve(uri);
-		        } else {
-			    fileURI = new URI(uri);
-		        }
-		        FileInputStream fs = new FileInputStream(new File(fileURI));
-			XMLInputFactory xif = XMLInputFactory.newInstance();
-			XMLStreamReader re = xif.createXMLStreamReader(fs);
-			while (re.getEventType() != XMLStreamReader.END_DOCUMENT) {
-//			    System.out.println(re.getEventType());
-/*
-                        if (transforms.isEmpty()) {
-                            return new C14nWorker(re, os, false);
-                        }
-*/
-                            for (Transform t : transforms) {
-                                // Only one Transform supported right now
-                                t.transform(new StaxData(re), null, os);
-//                                t.transform(new StaxData(re), null, System.out);
-				break;
-			    }
-			    re.next();
-                        }
-
-			setResult(null);
 		    } catch (Exception e) {
 			e.printStackTrace();
 		    }
 		}
-	    } 
+		setResult(null);
+	    }
 	    return null;
 	}
+
 	/* (non-Javadoc)
 	 * @see com.r_bg.stax.DigestResultListener#setResult(byte[])
 	 */
@@ -259,9 +224,9 @@
 	StaxSignatureMethod signatureMethod;
 	String c14nMethod;
 	private String id;
-	private String baseURI;
-	SignedInfoWorker(String baseURI) {
-	    this.baseURI = baseURI;
+	private XMLCryptoContext context;
+	SignedInfoWorker(XMLCryptoContext context) {
+	    this.context = context;
 	}
 	public StaxWorker read(XMLStreamReader reader) {
 		if (reader.getEventType()==XMLStreamReader.START_ELEMENT && Constants.DS_URI.equals(reader.getNamespaceURI())) {
@@ -269,7 +234,7 @@
 			if (name.equals("SignedInfo") ) {
 				id=reader.getAttributeValue(null,"Id");
 			} else if (name.equals("Reference") ) {
-				ReferenceWorker r=new ReferenceWorker(baseURI);
+				ReferenceWorker r=new ReferenceWorker(context);
 				references.add(r);
 				return r;			
 			} else if (name.equals("SignatureMethod")) {
@@ -351,7 +316,7 @@
 	String name=reader.getLocalName();
 	String uri=reader.getNamespaceURI();
 	if (name.equals("Signature") && uri.equals(XMLSignature.XMLNS)) {
-	    XMLSignatureWorker s = new XMLSignatureWorker(context.getBaseURI());
+	    XMLSignatureWorker s = new XMLSignatureWorker(context);
 	    sig.addSignature(s);
 	    return s;
 	}
@@ -761,9 +726,9 @@
 class ManifestWorker implements StaxWorker, Manifest {		
     private String id;
     private List<Reference> refs = new ArrayList<Reference>();
-    private String baseURI;
-    ManifestWorker(String baseURI) {
-	this.baseURI = baseURI;
+    private XMLCryptoContext context;
+    ManifestWorker(XMLCryptoContext context) {
+	this.context = context;
     }
     public StaxWorker read(XMLStreamReader reader) {
 	switch (reader.getEventType()) {
@@ -773,7 +738,7 @@
 		    if (name.equals("Manifest") ) {
 			id = reader.getAttributeValue(null, "Id");
 		    } else if (name.equals("Reference")) {
-			ReferenceWorker rw = new ReferenceWorker(baseURI);
+			ReferenceWorker rw = new ReferenceWorker(context);
 			refs.add(rw);
 			return rw;
 		    }
@@ -801,9 +766,9 @@
     private String mimeType;
     private String encoding;
     private List<XMLStructure> content = new ArrayList<XMLStructure>();
-    private String baseURI;
-    XMLObjectWorker(String baseURI) {
-	this.baseURI = baseURI;
+    private XMLCryptoContext context;
+    XMLObjectWorker(XMLCryptoContext context) {
+	this.context = context;
     }
     public StaxWorker read(XMLStreamReader reader) {
 	switch (reader.getEventType()) {
@@ -815,7 +780,7 @@
 			mimeType = reader.getAttributeValue(null, "MimeType");
 			encoding = reader.getAttributeValue(null, "Encoding");
 		    } else if (name.equals("Manifest")) {
-			ManifestWorker mw = new ManifestWorker(baseURI);
+			ManifestWorker mw = new ManifestWorker(context);
 			content.add(mw);
 			return mw;
 		    } else if (name.equals("SignatureProperties")) {
@@ -859,9 +824,9 @@
 	private String id;
 	private List<XMLObject> xmlObjects = new ArrayList<XMLObject>();
 	private KeySelectorResult ksr;
-	private String baseURI;
-	XMLSignatureWorker(String baseURI) {
-	    this.baseURI = baseURI;
+	private XMLCryptoContext context;
+	XMLSignatureWorker(XMLCryptoContext context) {
+	    this.context = context;
 	}
 	public StaxWorker read(XMLStreamReader reader) {
 		switch (reader.getEventType()) {
@@ -871,13 +836,13 @@
 				if (name.equals("Signature") ) {
 					id=reader.getAttributeValue(null,"Id");
 				} else if (name.equals("SignedInfo") ) {
-					si=new SignedInfoWorker(baseURI);
+					si=new SignedInfoWorker(context);
 					return si;			
 				} else if (name.equals("SignatureValue")) {
 					sv=new SignatureValueWorker();
 					return sv;
 				} else if (name.equals("Object")) {
-					XMLObjectWorker xo=new XMLObjectWorker(baseURI);
+					XMLObjectWorker xo=new XMLObjectWorker(context);
 					xmlObjects.add(xo);
 					return xo;
 				} else if (name.equals("KeyInfo")) {