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/07 16:33:18 UTC

svn commit: r573597 - /xml/security/branches/stax_jsr105/src/com/r_bg/stax/StaxSignatureValidator.java

Author: mullan
Date: Fri Sep  7 07:33:17 2007
New Revision: 573597

URL: http://svn.apache.org/viewvc?rev=573597&view=rev
Log:
Add support for xpointer ids.
Invoke transforms using TransformService API. Only one transform is
currently supported, pipelining is not supported yet.

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

Modified: xml/security/branches/stax_jsr105/src/com/r_bg/stax/StaxSignatureValidator.java
URL: http://svn.apache.org/viewvc/xml/security/branches/stax_jsr105/src/com/r_bg/stax/StaxSignatureValidator.java?rev=573597&r1=573596&r2=573597&view=diff
==============================================================================
--- xml/security/branches/stax_jsr105/src/com/r_bg/stax/StaxSignatureValidator.java (original)
+++ xml/security/branches/stax_jsr105/src/com/r_bg/stax/StaxSignatureValidator.java Fri Sep  7 07:33:17 2007
@@ -5,34 +5,66 @@
 import java.util.List;
 
 import javax.xml.crypto.dsig.Transform;
+import javax.xml.crypto.dsig.TransformException;
 import javax.xml.stream.StreamFilter;
 import javax.xml.stream.XMLStreamReader;
 
+import com.r_bg.stax.transforms.StaxTransform;
 
 class IdWatcher implements StaxWatcher {
-	String uri;
+	String id;
 	DigestResultListener re;
 	OutputStream os;
 	List<Transform> transforms;
 	public IdWatcher(String uri, DigestResultListener reader, 
 	    List<Transform> transforms, OutputStream os) {
-		this.uri=uri;
+		if (uri.startsWith("xpointer(id(")) {
+                    int i1 = uri.indexOf('\'');
+                    int i2 = uri.indexOf('\'', i1+1);
+                    this.id = uri.substring(i1+1, i2);
+                } else {
+		    this.id=uri;
+		}
 		this.re=reader;
 		this.transforms=transforms;
 		this.os=os;
 	}
 	public StaxWorker watch(XMLStreamReader reader, StaxSignatureValidator sig) {
-		if (uri.equals(reader.getAttributeValue(null, "Id"))) {
-			if (!transforms.isEmpty()) {
-			    // only Base64 supported right now ...
-			    return new StaxBase64TransformWorker(re, os);
-			} else {
-			    return new C14nWorker(re,os);
+		if (id.equals(reader.getAttributeValue(null, "Id"))) {
+			if (transforms.isEmpty()) {
+			    return new C14nWorker(re, os, false);
+			}
+			for (Transform t : transforms) {
+			    // Only one Transform supported right now
+			    return new TransformWorker(t, re, os);
 			}
 		}
 		return null;
 	}
-	
+
+	private static class TransformWorker implements StaxWorker {
+	    private Transform t;
+	    private DigestResultListener re;
+	    private OutputStream os;
+	    TransformWorker
+		(Transform t, DigestResultListener re, OutputStream os) {
+		this.t = t;
+		this.re = re;
+		this.os = os;
+	    }
+	    public StaxWorker read(XMLStreamReader reader) {
+	        try {
+	            t.transform(new StaxData(reader), null, os);
+	        } catch (TransformException te) {
+		    te.printStackTrace();
+	        }
+		return null;
+	    }
+	    public StaxWatcher remove() {
+		re.setResult(null);
+		return null;
+	    }
+	}
 }
 
 public class StaxSignatureValidator implements StreamFilter{
@@ -41,8 +73,8 @@
 	List<Integer> filterStart=new ArrayList<Integer>();
 	List<StaxWatcher> watchers=new ArrayList<StaxWatcher>();
 	int level=0;
-	public StaxSignatureValidator() {
-		watchers.add(new SignatureWatcher());
+	public StaxSignatureValidator(StaxValidateContext context) {
+		watchers.add(new SignatureWatcher(context));
 	}
 	public void addSignature(XMLSignatureWorker s) {
 		signatures.add(s);