summaryrefslogtreecommitdiff
path: root/utils/src/main/java/at/gv/egiz
diff options
context:
space:
mode:
Diffstat (limited to 'utils/src/main/java/at/gv/egiz')
-rw-r--r--utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingInputStream.java62
-rw-r--r--utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingOutputStream.java134
-rw-r--r--utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingWriter.java57
-rw-r--r--utils/src/main/java/at/gv/egiz/marshal/MarshallerFactory.java12
-rw-r--r--utils/src/main/java/at/gv/egiz/marshal/NamespacePrefix.java34
-rw-r--r--utils/src/main/java/at/gv/egiz/marshal/NamespacePrefixMapperImpl.java54
-rw-r--r--utils/src/main/java/at/gv/egiz/validation/ReportingValidationEventHandler.java (renamed from utils/src/main/java/at/gv/egiz/validation/ValidationEventLogger.java)13
-rw-r--r--utils/src/main/java/at/gv/egiz/xades/QualifyingPropertiesFactory.java8
8 files changed, 301 insertions, 73 deletions
diff --git a/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingInputStream.java b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingInputStream.java
new file mode 100644
index 00000000..28ef6b88
--- /dev/null
+++ b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingInputStream.java
@@ -0,0 +1,62 @@
+/**
+ *
+ */
+package at.gv.egiz.bku.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.CharBuffer;
+
+/**
+ * @author mcentner
+ *
+ */
+public class URLEncodingInputStream extends InputStream {
+
+ private char[] buffer = new char[1];
+
+ private CharBuffer charBuffer = CharBuffer.wrap(buffer);
+
+ protected Readable in;
+
+ /**
+ * @param in
+ */
+ public URLEncodingInputStream(Readable in) {
+ this.in = in;
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.InputStream#read()
+ */
+ @Override
+ public int read() throws IOException {
+ charBuffer.rewind();
+ if (in.read(charBuffer) == -1) {
+ return -1;
+ }
+ if (buffer[0] == '+') {
+ return ' ';
+ } else if (buffer[0] == '%') {
+ charBuffer.rewind();
+ if (in.read(charBuffer) == -1) {
+ throw new IOException("Invalid URL encoding.");
+ }
+ int c1 = Character.digit(buffer[0], 16);
+ charBuffer.rewind();
+ if (in.read(charBuffer) == -1) {
+ throw new IOException("Invalid URL encoding.");
+ }
+ int c2 = Character.digit(buffer[0], 16);
+ if (c1 == -1 || c2 == -1) {
+ throw new IOException("Invalid URL encoding.");
+ }
+ return ((c1 << 4) | c2);
+ } else {
+ return buffer[0];
+ }
+ }
+
+
+
+}
diff --git a/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingOutputStream.java b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingOutputStream.java
new file mode 100644
index 00000000..df42df6d
--- /dev/null
+++ b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingOutputStream.java
@@ -0,0 +1,134 @@
+/*
+* Copyright 2008 Federal Chancellery Austria and
+* Graz University of Technology
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package at.gv.egiz.bku.utils;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.CharBuffer;
+import java.util.BitSet;
+
+/**
+ * An URLEncoding <a
+ * href="http://tools.ietf.org/html/rfc3986#section-2.1">RFC3986, Section 2.1</a>
+ * OutputStream.
+ *
+ * @author mcentner
+ */
+public class URLEncodingOutputStream extends OutputStream {
+
+ private static final int MAX_BUFFER_SIZE = 512;
+
+ private static final BitSet UNRESERVED = new BitSet(256);
+
+ static {
+ for (int i = '0'; i <= '9'; i++) {
+ UNRESERVED.set(i);
+ }
+ for (int i = 'a'; i <= 'z'; i++) {
+ UNRESERVED.set(i);
+ }
+ for (int i = 'A'; i <= 'Z'; i++) {
+ UNRESERVED.set(i);
+ }
+ UNRESERVED.set('-');
+ UNRESERVED.set('_');
+ UNRESERVED.set('.');
+ UNRESERVED.set('*');
+ UNRESERVED.set(' ');
+ }
+
+ private static final char[] HEX = new char[] {
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+ };
+
+ private char[] buf;
+
+ protected Appendable out;
+
+ /**
+ * Creates a new instance of this URLEncodingOutputStream that writes to the
+ * given Appendable.
+ * <p>
+ * Note: According to
+ * http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars the input
+ * for the {@link #write()} methods should be the UTF-8.
+ * </p>
+ *
+ * @param out
+ */
+ public URLEncodingOutputStream(Appendable out) {
+ this.out = out;
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.OutputStream#write(int)
+ */
+ @Override
+ public void write(int b) throws IOException {
+ b &= 0xFF;
+ if (UNRESERVED.get(b)) {
+ if (b == ' ') {
+ out.append('+');
+ } else {
+ out.append((char) b);
+ }
+ } else {
+ out.append('%').append(HEX[b >>> 4]).append(HEX[b & 0xF]);
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see java.io.OutputStream#write(byte[], int, int)
+ */
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+
+ // ensure a buffer at least double the size of end - start + 1
+ // but max
+ int sz = Math.min(len + 1, MAX_BUFFER_SIZE);
+ if (buf == null || buf.length < sz) {
+ buf = new char[sz];
+ }
+
+ int bPos = 0;
+ for (int i = 0; i < len; i++) {
+ if (bPos + 3 > buf.length) {
+ // flush buffer
+ out.append(CharBuffer.wrap(buf, 0, bPos));
+ bPos = 0;
+ }
+ int c = 0xFF & b[off + i];
+ if (UNRESERVED.get(c)) {
+ if (c == ' ') {
+ buf[bPos++] = '+';
+ } else {
+ buf[bPos++] = (char) c;
+ }
+ } else {
+ buf[bPos++] = '%';
+ buf[bPos++] = HEX[c >>> 4];
+ buf[bPos++] = HEX[c & 0xF];
+ }
+ }
+ out.append(CharBuffer.wrap(buf, 0, bPos));
+
+ }
+
+
+}
diff --git a/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingWriter.java b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingWriter.java
new file mode 100644
index 00000000..3ba90265
--- /dev/null
+++ b/utils/src/main/java/at/gv/egiz/bku/utils/URLEncodingWriter.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */package at.gv.egiz.bku.utils;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.Charset;
+
+/**
+ * An URLEncoding <a
+ * href="http://tools.ietf.org/html/rfc3986#section-2.1">RFC3986, Section
+ * 2.1</a> Writer, that uses an UTF-8 encoding according to <a href
+ * ="http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars"
+ * >http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars</a> for
+ * writing non-ASCII characters.
+ *
+ * @author mcentner
+ */
+public class URLEncodingWriter extends Writer {
+
+ protected OutputStreamWriter osw;
+
+ public URLEncodingWriter(Appendable out) {
+ URLEncodingOutputStream urlEnc = new URLEncodingOutputStream(out);
+ osw = new OutputStreamWriter(urlEnc, Charset.forName("UTF-8"));
+ }
+
+ @Override
+ public void close() throws IOException {
+ osw.close();
+ }
+
+ @Override
+ public void flush() throws IOException {
+ osw.flush();
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ osw.write(cbuf, off, len);
+ }
+
+}
diff --git a/utils/src/main/java/at/gv/egiz/marshal/MarshallerFactory.java b/utils/src/main/java/at/gv/egiz/marshal/MarshallerFactory.java
index ccebcc81..3ac0a86e 100644
--- a/utils/src/main/java/at/gv/egiz/marshal/MarshallerFactory.java
+++ b/utils/src/main/java/at/gv/egiz/marshal/MarshallerFactory.java
@@ -31,13 +31,17 @@ public class MarshallerFactory {
private static final Log log = LogFactory.getLog(MarshallerFactory.class);
- public static Marshaller createMarshaller(JAXBContext ctx, boolean formattedOutput) throws JAXBException {
+ public static Marshaller createMarshaller(JAXBContext ctx, boolean formattedOutput, boolean fragment) throws JAXBException {
Marshaller m = ctx.createMarshaller();
try {
if (formattedOutput) {
log.trace("setting marshaller property FORMATTED_OUTPUT");
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
}
+ if (fragment) {
+ log.trace("setting marshaller property FRAGMENT");
+ m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
+ }
log.trace("setting marshaller property NamespacePrefixMapper");
m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapperImpl());
} catch (PropertyException ex) {
@@ -45,8 +49,12 @@ public class MarshallerFactory {
}
return m;
}
+
+ public static Marshaller createMarshaller(JAXBContext ctx, boolean formattedOutput) throws JAXBException {
+ return createMarshaller(ctx, formattedOutput, false);
+ }
public static Marshaller createMarshaller(JAXBContext ctx) throws JAXBException {
- return createMarshaller(ctx, false);
+ return createMarshaller(ctx, false, false);
}
}
diff --git a/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefix.java b/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefix.java
deleted file mode 100644
index 3ae1d0ff..00000000
--- a/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefix.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2008 Federal Chancellery Austria and
- * Graz University of Technology
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package at.gv.egiz.marshal;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public interface NamespacePrefix {
- String CARDCHANNEL_PREFIX = "cc";
- String ECDSA_PREFIX = "ecdsa";
- String PERSONDATA_PREFIX = "pr";
- String SAML10_PREFIX = "saml";
- String SL_PREFIX = "sl";
- String XADES_PREFIX = "xades";
- String XMLDSIG_PREFIX = "dsig";
- String XSI_PREFIX = "xsi";
-
-}
diff --git a/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefixMapperImpl.java b/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefixMapperImpl.java
index 519f6b1f..e0698977 100644
--- a/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefixMapperImpl.java
+++ b/utils/src/main/java/at/gv/egiz/marshal/NamespacePrefixMapperImpl.java
@@ -17,6 +17,9 @@
package at.gv.egiz.marshal;
//import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
+import java.util.HashMap;
+import java.util.Map;
+
import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -29,45 +32,32 @@ public class NamespacePrefixMapperImpl extends NamespacePrefixMapper {
private static final Log log = LogFactory.getLog(NamespacePrefixMapperImpl.class);
+ protected static final Map<String, String> prefixMap = new HashMap<String, String>();
+
+ static {
+ prefixMap.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");
+ prefixMap.put("http://www.w3.org/2000/09/xmldsig#", "dsig");
+ prefixMap.put("http://www.buergerkarte.at/namespaces/securitylayer/1.2#", "sl");
+ prefixMap.put("http://www.buergerkarte.at/cardchannel", "cc");
+ prefixMap.put("http://www.w3.org/2001/04/xmldsig-more#", "ecdsa");
+ prefixMap.put("http://reference.e-government.gv.at/namespace/persondata/20020228#", "pr");
+ prefixMap.put("urn:oasis:names:tc:SAML:1.0:assertion", "saml");
+ prefixMap.put("http://uri.etsi.org/01903/v1.1.1#", "xades");
+ prefixMap.put("http://www.buergerkarte.at/namespaces/securitylayer/20020225#", "sl10");
+ prefixMap.put("http://www.buergerkarte.at/namespaces/securitylayer/20020831#", "sl11");
+ }
+
+
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
if (log.isTraceEnabled()) {
log.trace("prefix for namespace " + namespaceUri + " requested");
}
- if ("http://www.w3.org/2001/XMLSchema-instance".equals(namespaceUri)) {
- return NamespacePrefix.XSI_PREFIX;
- }
-
- if ("http://www.w3.org/2000/09/xmldsig#".equals(namespaceUri)) {
- return NamespacePrefix.XMLDSIG_PREFIX;
- }
-
- if ("http://www.buergerkarte.at/namespaces/securitylayer/1.2#".equals(namespaceUri)) {
- return NamespacePrefix.SL_PREFIX;
- }
-
- if ("http://www.buergerkarte.at/cardchannel".equals(namespaceUri)) {
- return NamespacePrefix.CARDCHANNEL_PREFIX;
- }
-
- if ("http://www.w3.org/2001/04/xmldsig-more#".equals(namespaceUri)) {
- return NamespacePrefix.ECDSA_PREFIX;
- }
-
- if ("http://reference.e-government.gv.at/namespace/persondata/20020228#".equals(namespaceUri)) {
- return NamespacePrefix.PERSONDATA_PREFIX;
- }
-
- if ("urn:oasis:names:tc:SAML:1.0:assertion".equals(namespaceUri)) {
- return NamespacePrefix.SAML10_PREFIX;
- }
-
- if ("http://uri.etsi.org/01903/v1.1.1#".equals(namespaceUri)) {
- return NamespacePrefix.XADES_PREFIX;
- }
- return suggestion;
+ String prefix = prefixMap.get(namespaceUri);
+
+ return (prefix != null) ? prefix : suggestion;
}
/**
diff --git a/utils/src/main/java/at/gv/egiz/validation/ValidationEventLogger.java b/utils/src/main/java/at/gv/egiz/validation/ReportingValidationEventHandler.java
index 0fafdd7f..6543c333 100644
--- a/utils/src/main/java/at/gv/egiz/validation/ValidationEventLogger.java
+++ b/utils/src/main/java/at/gv/egiz/validation/ReportingValidationEventHandler.java
@@ -25,9 +25,11 @@ import org.apache.commons.logging.LogFactory;
*
* @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
*/
-public class ValidationEventLogger implements ValidationEventHandler {
+public class ReportingValidationEventHandler implements ValidationEventHandler {
- protected static final Log log = LogFactory.getLog(ValidationEventLogger.class);
+ protected static final Log log = LogFactory.getLog(ReportingValidationEventHandler.class);
+
+ protected ValidationEvent errorEvent;
/**
*
@@ -43,13 +45,20 @@ public class ValidationEventLogger implements ValidationEventHandler {
return true;
case ValidationEvent.ERROR:
log.warn(event.getMessage());
+ errorEvent = event;
return false;
case ValidationEvent.FATAL_ERROR:
log.error(event.getMessage());
+ errorEvent = event;
return false;
default:
log.debug(event.getMessage());
return false;
}
}
+
+ public ValidationEvent getErrorEvent() {
+ return errorEvent;
+ }
+
}
diff --git a/utils/src/main/java/at/gv/egiz/xades/QualifyingPropertiesFactory.java b/utils/src/main/java/at/gv/egiz/xades/QualifyingPropertiesFactory.java
index 71ca1db9..82cba624 100644
--- a/utils/src/main/java/at/gv/egiz/xades/QualifyingPropertiesFactory.java
+++ b/utils/src/main/java/at/gv/egiz/xades/QualifyingPropertiesFactory.java
@@ -16,8 +16,6 @@
*/
package at.gv.egiz.xades;
-import at.gv.egiz.marshal.MarshallerFactory;
-import at.gv.egiz.marshal.NamespacePrefixMapperImpl;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -51,6 +49,8 @@ import org.w3._2000._09.xmldsig_.DigestMethodType;
import org.w3._2000._09.xmldsig_.X509IssuerSerialType;
import org.w3c.dom.Node;
+import at.gv.egiz.marshal.MarshallerFactory;
+
public class QualifyingPropertiesFactory {
public static String NS_URI_V1_1_1 = "http://uri.etsi.org/01903/v1.1.1#";
@@ -155,7 +155,7 @@ public class QualifyingPropertiesFactory {
return dataObjectFormatType;
}
- public JAXBElement<QualifyingPropertiesType> createQualifyingProperties111(Date signingTime, List<X509Certificate> certificates, String idValue, List<DataObjectFormatType> dataObjectFormats) throws QualifyingPropertiesException {
+ public JAXBElement<QualifyingPropertiesType> createQualifyingProperties111(String target, Date signingTime, List<X509Certificate> certificates, String idValue, List<DataObjectFormatType> dataObjectFormats) throws QualifyingPropertiesException {
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTimeZone(TimeZone.getTimeZone("UTC"));
@@ -206,6 +206,8 @@ public class QualifyingPropertiesFactory {
QualifyingPropertiesType qualifyingPropertiesType = qpFactory.createQualifyingPropertiesType();
qualifyingPropertiesType.setSignedProperties(signedPropertiesType);
+ qualifyingPropertiesType.setTarget(target);
+
return qpFactory.createQualifyingProperties(qualifyingPropertiesType);
}