diff options
Diffstat (limited to 'bkucommon/src/main/java/at')
12 files changed, 652 insertions, 440 deletions
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrl.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrl.java index 2e2cc38a..7b682136 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrl.java @@ -1,21 +1,21 @@ /* -* 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.binding;
-
+ * 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.binding; + import java.net.MalformedURLException; import java.net.URL; import java.util.Properties; @@ -27,63 +27,87 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.bku.slexceptions.SLRuntimeException; -
-/**
- * Used to handle DataUrl connections as specified in the CCE's HTTP protocol binding.
- *
- */
-public class DataUrl {
- private static DataUrlConnectionSPI defaultDataUrlConnection = new DataUrlConnectionImpl();
+ +/** + * Used to handle DataUrl connections as specified in the CCE's HTTP protocol binding. + * + */ +public class DataUrl { + private static Log log = LogFactory.getLog(DataUrl.class); + private static DataUrlConnectionSPI connection; private static Properties configuration; - private static SSLSocketFactory sslSocketFactory;
+ private static SSLSocketFactory sslSocketFactory; private static HostnameVerifier hostNameVerifier; - -
- private URL url;
-
- /**
- * Sets the default DataUrlConnection implementation
- * @param aClass must not be null
- */
- public static void setDataUrlConnectionClass(DataUrlConnectionSPI dataUrlConnection) {
- if (dataUrlConnection == null) {
- throw new NullPointerException("Default dataurlconnection must not be set to null");
- }
- defaultDataUrlConnection = dataUrlConnection; - defaultDataUrlConnection.setConfiguration(configuration); - defaultDataUrlConnection.setSSLSocketFactory(sslSocketFactory); - defaultDataUrlConnection.setHostnameVerifier(hostNameVerifier);
- }
-
- public DataUrl(String aUrlString) throws MalformedURLException {
- url = new URL(aUrlString);
- }
-
- public DataUrlConnection openConnection() {
+ private URL url; + + /** + * Sets the default DataUrlConnection implementation + * @param aClass must not be null + */ + static void setDataUrlConnectionImpl(DataUrlConnectionSPI conn) { + if (conn != null) { + connection = conn; + } + } + + public DataUrl(String aUrlString) throws MalformedURLException { + url = new URL(aUrlString); + if (connection == null) { + log.debug("Using default DataURLConnection class"); + connection = new DataUrlConnectionImpl(); + } + connection.setConfiguration(configuration); + connection.setSSLSocketFactory(sslSocketFactory); + connection.setHostnameVerifier(hostNameVerifier); + } + + public DataUrlConnection openConnection() { try { - log.debug("Opening dataurl connection");
- DataUrlConnectionSPI retVal = defaultDataUrlConnection.newInstance();
- retVal.init(url);
- return retVal;
- } catch (Exception e) {
- log.error(e);
- throw new SLRuntimeException("Cannot instantiate a dataurlconnection:",e);
- }
+ log.debug("Opening dataurl connection"); + DataUrlConnectionSPI retVal = connection.newInstance(); + retVal.init(url); + return retVal; + } catch (Exception e) { + log.error(e); + throw new SLRuntimeException("Cannot instantiate a dataurlconnection:", e); + } } - + + + /** + * set configuration for all subsequently instantiated DataURL objects + * @param props + */ public static void setConfiguration(Properties props) { configuration = props; - defaultDataUrlConnection.setConfiguration(configuration); + if (configuration != null) { + String className = configuration.getProperty(DataUrlConnection.DATAURLCONNECTION_CONFIG_P); + if (className != null) { + try { + log.info("set DataURLConnection class: " + className); + Class c = Class.forName(className); + connection = (DataUrlConnectionSPI) c.newInstance(); + } catch (Exception ex) { + log.error("failed to instantiate DataURL connection " + className, ex); + } + } + } } - + + /** + * set SSLSocketFactory for all subsequently instantiated DataURL objects + * @param socketFactory + */ public static void setSSLSocketFactory(SSLSocketFactory socketFactory) { sslSocketFactory = socketFactory; - defaultDataUrlConnection.setSSLSocketFactory(socketFactory); } + /** + * set HostnameVerifier for all subsequently instantiated DataURL objects + * @param hostNameVerifier + */ public static void setHostNameVerifier(HostnameVerifier hostNameVerifier) { DataUrl.hostNameVerifier = hostNameVerifier; - defaultDataUrlConnection.setHostnameVerifier(hostNameVerifier); - }
+ } }
\ No newline at end of file diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnection.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnection.java index c6ffa32a..21407cc3 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnection.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnection.java @@ -14,8 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package at.gv.egiz.bku.binding;
-
+package at.gv.egiz.bku.binding; + import java.io.IOException; import java.io.InputStream; import java.net.SocketTimeoutException; @@ -23,62 +23,66 @@ import java.net.URL; import java.security.cert.X509Certificate; import at.gv.egiz.bku.slcommands.SLResult; -
-/**
- * Transmit a security layer result to DataURL via HTTP POST, encoded as multipart/form-data.
- * The HTTP header user-agent is set to <em>citizen-card-environment/1.2 BKU2 1.0</em>.
- * The form-parameter ResponseType is set to <em>HTTP-Security-Layer-RESPONSE</em>.
- * All other headers/parameters are set by the caller.
- *
- * @author clemens
- */
-public interface DataUrlConnection {
-
- public static final String DEFAULT_USERAGENT = "citizen-card-environment/1.2 MOCCA Unknown";
- public static final String FORMPARAM_RESPONSETYPE = "ResponseType";
- public static final String DEFAULT_RESPONSETYPE = "HTTP-Security-Layer-RESPONSE";
- public static final String FORMPARAM_XMLRESPONSE = "XMLResponse";
- public static final String FORMPARAM_BINARYRESPONSE = "BinaryResponse";
-
- public static final String XML_RESPONSE_ENCODING = "UTF-8";
- public final static String USER_AGENT_PROPERTY_KEY="UserAgent"; -
+/** + * Transmit a security layer result to DataURL via HTTP POST, encoded as multipart/form-data. + * The HTTP header user-agent is set to <em>citizen-card-environment/1.2 BKU2 1.0</em>. + * The form-parameter ResponseType is set to <em>HTTP-Security-Layer-RESPONSE</em>. + * All other headers/parameters are set by the caller. + * + * @author clemens + */ +public interface DataUrlConnection { + + public final static String USERAGENT_CONFIG_P = "UserAgent"; + public static final String USERAGENT_DEFAULT = "citizen-card-environment/1.2 MOCCA/UNKNOWN"; + public static final String USERAGENT_BASE = "citizen-card-environment/1.2 MOCCA/"; + + public static final String DATAURLCONNECTION_CONFIG_P = "DataURLConnectionImplClass"; + + public static final String FORMPARAM_RESPONSETYPE = "ResponseType"; + public static final String DEFAULT_RESPONSETYPE = "HTTP-Security-Layer-RESPONSE"; + public static final String FORMPARAM_XMLRESPONSE = "XMLResponse"; + public static final String FORMPARAM_BINARYRESPONSE = "BinaryResponse"; + + public static final String XML_RESPONSE_ENCODING = "UTF-8"; + + public String getProtocol(); - public URL getUrl();
-
- /**
- * Set a HTTP Header.
- * @param key
- * @param value multiple values are assumed to have the correct formatting (comma-separated list)
- */
- public void setHTTPHeader(String key, String value);
-
- /**
- * Set a form-parameter.
- * @param name
- * @param data
- * @param contentType may be null
- * @param charSet may be null
- * @param transferEncoding may be null
- */
- public void setHTTPFormParameter(String name, InputStream data, String contentType, String charSet, String transferEncoding);
-
- /**
- * @pre httpHeaders != null
- * @throws java.net.SocketTimeoutException
- * @throws java.io.IOException
- */
- public void connect() throws SocketTimeoutException, IOException;
-
- public X509Certificate getServerCertificate();
-
- /**
- * @pre connection != null
- * @throws java.io.IOException
- */
- public void transmit(SLResult slResult) throws IOException;
-
- public DataUrlResponse getResponse() throws IOException;
+ public URL getUrl(); + + /** + * Set a HTTP Header. + * @param key + * @param value multiple values are assumed to have the correct formatting (comma-separated list) + */ + public void setHTTPHeader(String key, String value); + + /** + * Set a form-parameter. + * @param name + * @param data + * @param contentType may be null + * @param charSet may be null + * @param transferEncoding may be null + */ + public void setHTTPFormParameter(String name, InputStream data, String contentType, String charSet, String transferEncoding); + + /** + * @pre httpHeaders != null + * @throws java.net.SocketTimeoutException + * @throws java.io.IOException + */ + public void connect() throws SocketTimeoutException, IOException; + + public X509Certificate getServerCertificate(); + + /** + * @pre connection != null + * @throws java.io.IOException + */ + public void transmit(SLResult slResult) throws IOException; + + public DataUrlResponse getResponse() throws IOException; }
\ No newline at end of file diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java index 57d89c89..d9a9454e 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java @@ -225,12 +225,12 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI { boundary = "--" + IdFactory.getInstance().createId().toString(); requestHttpHeaders = new HashMap<String, String>(); if ((config != null) - && (config.getProperty(USER_AGENT_PROPERTY_KEY) != null)) { + && (config.getProperty(USERAGENT_CONFIG_P) != null)) { requestHttpHeaders.put(HttpUtil.HTTP_HEADER_USER_AGENT, config - .getProperty(USER_AGENT_PROPERTY_KEY)); + .getProperty(USERAGENT_CONFIG_P)); } else { requestHttpHeaders - .put(HttpUtil.HTTP_HEADER_USER_AGENT, DEFAULT_USERAGENT); + .put(HttpUtil.HTTP_HEADER_USER_AGENT, USERAGENT_DEFAULT); } requestHttpHeaders.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/HTTPBindingProcessor.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/HTTPBindingProcessor.java index 98b5b775..43f42331 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/HTTPBindingProcessor.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/HTTPBindingProcessor.java @@ -91,7 +91,7 @@ public class HTTPBindingProcessor extends AbstractBindingProcessor implements * Defines the maximum number of dataurl connects that are allowed within a * single SL Request processing. */ - protected static int MAX_DATAURL_HOPS = 10; + protected static int MAX_DATAURL_HOPS = 50; protected static String XML_MIME_TYPE = "text/xml"; protected static String BINARY_MIME_TYPE = "application/octet-stream"; diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/LegacyDataUrlConnectionImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/LegacyDataUrlConnectionImpl.java index 452c45e5..ef9dd199 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/LegacyDataUrlConnectionImpl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/LegacyDataUrlConnectionImpl.java @@ -165,7 +165,7 @@ public class LegacyDataUrlConnectionImpl implements DataUrlConnectionSPI { } catch (IOException iox) { log.info(iox); } - log.trace("Reading response");
+ log.trace("Reading response"); result = new DataUrlResponse(url.toString(), connection.getResponseCode(), is); Map<String, String> responseHttpHeaders = new HashMap<String, String>(); Map<String, List<String>> httpHeaders = connection.getHeaderFields(); @@ -212,12 +212,13 @@ public class LegacyDataUrlConnectionImpl implements DataUrlConnectionSPI { this.url = url; requestHttpHeaders = new HashMap<String, String>(); if ((config != null) - && (config.getProperty(USER_AGENT_PROPERTY_KEY) != null)) { + && (config.getProperty(USERAGENT_CONFIG_P) != null)) { + log.debug("setting User-Agent header: " + config.getProperty(USERAGENT_CONFIG_P)); requestHttpHeaders.put(HttpUtil.HTTP_HEADER_USER_AGENT, config - .getProperty(USER_AGENT_PROPERTY_KEY)); + .getProperty(USERAGENT_CONFIG_P)); } else { requestHttpHeaders - .put(HttpUtil.HTTP_HEADER_USER_AGENT, DEFAULT_USERAGENT); + .put(HttpUtil.HTTP_HEADER_USER_AGENT, USERAGENT_DEFAULT); } requestHttpHeaders.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/conf/Configurator.java b/bkucommon/src/main/java/at/gv/egiz/bku/conf/Configurator.java index 7f180ad0..a6c70d2c 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/conf/Configurator.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/conf/Configurator.java @@ -46,6 +46,7 @@ import at.gv.egiz.bku.slexceptions.SLRuntimeException; import at.gv.egiz.bku.utils.urldereferencer.URLDereferencer;
public abstract class Configurator {
+
private Log log = LogFactory.getLog(Configurator.class);
protected Properties properties;
@@ -202,22 +203,22 @@ public abstract class Configurator { }
public void configureVersion() {
- if (properties.getProperty(DataUrlConnection.USER_AGENT_PROPERTY_KEY) == null) {
+ if (properties.getProperty(DataUrlConnection.USERAGENT_CONFIG_P) == null) {
Properties p = new Properties();
try {
InputStream is = getManifest();
if (is != null) {
p.load(getManifest());
String version = p.getProperty("Implementation-Build");
- properties.setProperty(DataUrlConnection.USER_AGENT_PROPERTY_KEY,
- "citizen-card-environment/1.2 MOCCA " + version);
+ properties.setProperty(DataUrlConnection.USERAGENT_CONFIG_P,
+ DataUrlConnection.USERAGENT_BASE + version);
log.debug("Setting user agent to: "
+ properties
- .getProperty(DataUrlConnection.USER_AGENT_PROPERTY_KEY));
+ .getProperty(DataUrlConnection.USERAGENT_CONFIG_P));
} else {
log.warn("Cannot read manifest");
- properties.setProperty(DataUrlConnection.USER_AGENT_PROPERTY_KEY,
- "citizen-card-environment/1.2 MOCCA UNKNOWN");
+ properties.setProperty(DataUrlConnection.USERAGENT_CONFIG_P,
+ DataUrlConnection.USERAGENT_DEFAULT);
}
} catch (IOException e) {
log.error(e);
@@ -254,6 +255,7 @@ public abstract class Configurator { log.error("Cannot load CA certificates", e1);
}
String disableAll = getProperty("SSL.disableAllChecks");
+ String disableHostnameVerification = getProperty("SSL.disableHostnameVerification");
try {
KeyManager[] km = null;
SSLContext sslCtx = SSLContext
@@ -275,7 +277,7 @@ public abstract class Configurator { } catch (Exception e) {
log.error("Cannot configure SSL", e);
}
- if ((disableAll != null) && (Boolean.parseBoolean(disableAll))) {
+ if ((disableAll != null && Boolean.parseBoolean(disableAll)) || (disableHostnameVerification != null && Boolean.parseBoolean(disableHostnameVerification))) {
log.warn("---------------------------------");
log.warn(" Disabling Hostname Verification ");
log.warn("---------------------------------");
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusCommand.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusCommand.java new file mode 100644 index 00000000..19099b63 --- /dev/null +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusCommand.java @@ -0,0 +1,26 @@ +/* + * 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.slcommands; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public interface GetStatusCommand extends SLCommand { + +} diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusResult.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusResult.java new file mode 100644 index 00000000..c5518f51 --- /dev/null +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/GetStatusResult.java @@ -0,0 +1,26 @@ +/* + * 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.slcommands; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public interface GetStatusResult extends SLResult { + +} diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java index bec2b253..1ef94e81 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/SLCommandFactory.java @@ -14,10 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package at.gv.egiz.bku.slcommands;
-
+package at.gv.egiz.bku.slcommands; + import java.io.IOException; -import java.io.Reader; import java.net.URL; import java.util.HashMap; import java.util.Map; @@ -42,7 +41,6 @@ import org.apache.commons.logging.LogFactory; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; -import at.buergerkarte.namespaces.cardchannel.ObjectFactory; import at.gv.egiz.bku.slexceptions.SLCommandException; import at.gv.egiz.bku.slexceptions.SLExceptionMessages; import at.gv.egiz.bku.slexceptions.SLRequestException; @@ -50,38 +48,38 @@ import at.gv.egiz.bku.slexceptions.SLRuntimeException; import at.gv.egiz.bku.utils.DebugReader; import at.gv.egiz.slbinding.RedirectEventFilter; import at.gv.egiz.slbinding.RedirectUnmarshallerListener; -
-public class SLCommandFactory {
-
- /**
- * Schema files required for Security Layer command validation.
- */
- public static final String[] SCHEMA_FILES = new String[]{
- "at/gv/egiz/bku/slcommands/schema/xml.xsd",
- "at/gv/egiz/bku/slcommands/schema/xmldsig-core-schema.xsd",
- "at/gv/egiz/bku/slcommands/schema/Core-1.2.xsd"
- };
- /**
- * Logging facility.
- */
- static Log log = LogFactory.getLog(SLCommandFactory.class);
- /**
- * The instance returned by {@link #getInstance()}.
- */
- private static SLCommandFactory instance;
- /**
- * Schema for Security Layer command validation.
- */
- private Schema slSchema;
- /**
- * The JAXBContext.
- */
- private JAXBContext jaxbContext;
- /**
- * The map of <namespaceURI>:<localName> to implementation class of the
- * corresponding {@link SLCommand}.
- */
- private Map<String, Class<? extends SLCommand>> slRequestTypeMap = new HashMap<String, Class<? extends SLCommand>>();
+ +public class SLCommandFactory { + + /** + * Schema files required for Security Layer command validation. + */ + public static final String[] SCHEMA_FILES = new String[]{ + "at/gv/egiz/bku/slcommands/schema/xml.xsd", + "at/gv/egiz/bku/slcommands/schema/xmldsig-core-schema.xsd", + "at/gv/egiz/bku/slcommands/schema/Core-1.2.xsd" + }; + /** + * Logging facility. + */ + static Log log = LogFactory.getLog(SLCommandFactory.class); + /** + * The instance returned by {@link #getInstance()}. + */ + private static SLCommandFactory instance; + /** + * Schema for Security Layer command validation. + */ + private Schema slSchema; + /** + * The JAXBContext. + */ + private JAXBContext jaxbContext; + /** + * The map of <namespaceURI>:<localName> to implementation class of the + * corresponding {@link SLCommand}. + */ + private Map<String, Class<? extends SLCommand>> slRequestTypeMap = new HashMap<String, Class<? extends SLCommand>>(); /** * Configures the singleton instance with command implementations @@ -96,239 +94,239 @@ public class SLCommandFactory { log.debug("Registering sl command implementation for :"+key+ "; implementation class: "+impl.getCanonicalName()); slRequestTypeMap.put(key, impl); } - }
-
- /**
- * Register an {@link SLCommand} implementation class of a Security Layer
- * command with the given <code>namespaceUri</code> and <code>localname</code>
- * .
- *
- * @param namespaceUri
- * the namespace URI of the Security Layer command
- * @param localname
- * the localname of the Security Layer command
- * @param slCommandClass
- * the implementation class, or <code>null</code> to deregister a
- * currently registered class
- */
- public void setImplClass(String namespaceUri, String localname,
- Class<? extends SLCommand> slCommandClass) {
- if (slCommandClass != null) {
- slRequestTypeMap.put(namespaceUri + ":" + localname, slCommandClass);
- } else {
- slRequestTypeMap.remove(namespaceUri + ":" + localname);
- }
- }
-
- /**
- * Returns the implementation class of an {@link SLCommand} with the given
- * <code>name</code>, or <code>null</code> if no such class is registered.
- *
- * @param name
- * the <code>QName</code> of the Security Layer command
- * @return the implementation class, or <code>null</code> if no class is
- * registered for the given <code>name</code>
- */
- public Class<? extends SLCommand> getImplClass(QName name) {
- String namespaceURI = name.getNamespaceURI();
- String localPart = name.getLocalPart();
- return slRequestTypeMap.get(namespaceURI + ":" + localPart);
- }
-
- /**
- * Sets the schema to validate Security Layer commands with.
- *
- * @param slSchema the schema to validate Security Layer commands with
- */
- public void setSLSchema(Schema slSchema) {
- this.slSchema = slSchema;
- }
-
- /**
- * @return the jaxbContext
- */
- public JAXBContext getJaxbContext() {
- ensureJaxbContext();
- return jaxbContext;
- }
-
- /**
- * @param jaxbContext the jaxbContext to set
- */
- public void setJaxbContext(JAXBContext jaxbContext) {
- this.jaxbContext = jaxbContext;
- }
-
- /**
- * Initialize the JAXBContext.
- */
- private synchronized void ensureJaxbContext() {
- if (jaxbContext == null) {
- try {
- String slPkg = at.buergerkarte.namespaces.securitylayer._1.ObjectFactory.class.getPackage().getName();
+ } + + /** + * Register an {@link SLCommand} implementation class of a Security Layer + * command with the given <code>namespaceUri</code> and <code>localname</code> + * . + * + * @param namespaceUri + * the namespace URI of the Security Layer command + * @param localname + * the localname of the Security Layer command + * @param slCommandClass + * the implementation class, or <code>null</code> to deregister a + * currently registered class + */ + public void setImplClass(String namespaceUri, String localname, + Class<? extends SLCommand> slCommandClass) { + if (slCommandClass != null) { + slRequestTypeMap.put(namespaceUri + ":" + localname, slCommandClass); + } else { + slRequestTypeMap.remove(namespaceUri + ":" + localname); + } + } + + /** + * Returns the implementation class of an {@link SLCommand} with the given + * <code>name</code>, or <code>null</code> if no such class is registered. + * + * @param name + * the <code>QName</code> of the Security Layer command + * @return the implementation class, or <code>null</code> if no class is + * registered for the given <code>name</code> + */ + public Class<? extends SLCommand> getImplClass(QName name) { + String namespaceURI = name.getNamespaceURI(); + String localPart = name.getLocalPart(); + return slRequestTypeMap.get(namespaceURI + ":" + localPart); + } + + /** + * Sets the schema to validate Security Layer commands with. + * + * @param slSchema the schema to validate Security Layer commands with + */ + public void setSLSchema(Schema slSchema) { + this.slSchema = slSchema; + } + + /** + * @return the jaxbContext + */ + public JAXBContext getJaxbContext() { + ensureJaxbContext(); + return jaxbContext; + } + + /** + * @param jaxbContext the jaxbContext to set + */ + public void setJaxbContext(JAXBContext jaxbContext) { + this.jaxbContext = jaxbContext; + } + + /** + * Initialize the JAXBContext. + */ + private synchronized void ensureJaxbContext() { + if (jaxbContext == null) { + try { + String slPkg = at.buergerkarte.namespaces.securitylayer._1.ObjectFactory.class.getPackage().getName(); String xmldsigPkg = org.w3._2000._09.xmldsig_.ObjectFactory.class.getPackage().getName(); String cardChannelPkg = at.buergerkarte.namespaces.cardchannel.ObjectFactory.class.getPackage().getName(); - setJaxbContext(JAXBContext.newInstance(slPkg + ":" + xmldsigPkg + ":" + cardChannelPkg));
- } catch (JAXBException e) {
- log.error("Failed to setup JAXBContext security layer request.", e);
- throw new SLRuntimeException(e);
- }
- }
- }
-
- /**
- * Initialize the security layer schema.
- */
- private synchronized void ensureSchema() {
- if (slSchema == null) {
- try {
- SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- ClassLoader cl = SLCommandFactory.class.getClassLoader();
- Source[] sources = new Source[SCHEMA_FILES.length];
- for (int i = 0; i < SCHEMA_FILES.length; i++) {
- String schemaFile = SCHEMA_FILES[i];
- URL schemaURL = cl.getResource(schemaFile);
- if (schemaURL == null) {
- throw new SLRuntimeException("Failed to load schema file " + schemaFile + ".");
- }
- log.debug("Schema location: " + schemaURL);
- sources[i] = new StreamSource(schemaURL.openStream());
- }
- Schema schema = schemaFactory.newSchema(sources);
- log.debug("Schema successfully created.");
- setSLSchema(schema);
- } catch (SAXException e) {
- log.error("Failed to load security layer schema.", e);
- throw new SLRuntimeException("Failed to load security layer schema.", e);
- } catch (IOException e) {
- log.error("Failed to load security layer schema.", e);
- throw new SLRuntimeException("Failed to load security layer schema.", e);
- }
-
- }
- }
-
- /**
- * Get an instance of the <code>SLCommandFactory</code>.
- */
- public synchronized static SLCommandFactory getInstance() {
- if (instance == null) {
- instance = new SLCommandFactory();
- instance.ensureJaxbContext();
- instance.ensureSchema();
- }
- return instance;
- }
-
- /**
- * Private constructor used by {@link #getInstance()}.
- */
- private SLCommandFactory() {
- }
-
- /**
- * Unmarshalls from the given <code>source</code>.
- *
- * @see Unmarshaller#unmarshal(Source)
- *
- * <em>Note:</em>Could replace JAXB's unmarshal-time validation engine (see commented code), however,
- * we need a redirect filter.
- *
- * @param source
- * the source to unmarshal from
- * @return the object returned by {@link Unmarshaller#unmarshal(Source)}
- * @throws SLRequestException
- * if unmarshalling fails
- * @throws SLRuntimeException
- * if an unexpected error occurs configuring the unmarshaller or if
- * unmarshalling fails with an unexpected error
- */
- protected Object unmarshal(Source source) throws SLRuntimeException,
- SLRequestException {
-
- Object object;
- try {
-
-// ValidatorHandler validator = slSchema.newValidatorHandler();
-// validator.getContentHandler();
-//
-// SAXParserFactory spf = SAXParserFactory.newInstance();
-// spf.setNamespaceAware(true);
-// XMLReader saxReader = spf.newSAXParser().getXMLReader();
-// //TODO extend validator to implement redirectContentHandler (validate+redirect)
-// saxReader.setContentHandler(validator);
-// //TODO get a InputSource
-// SAXSource saxSource = new SAXSource(saxReader, source);
-//
-// Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
-// //turn off duplicate jaxb validation
-// unmarshaller.setSchema(null);
-// unmarshaller.setListener(listener);
-// unmarshaller.unmarshal(saxSource);
-
-
- XMLInputFactory inputFactory = XMLInputFactory.newInstance();
- XMLEventReader eventReader = inputFactory.createXMLEventReader(source);
- RedirectEventFilter redirectEventFilter = new RedirectEventFilter();
- XMLEventReader filteredReader = inputFactory.createFilteredReader(eventReader, redirectEventFilter);
-
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- unmarshaller.setListener(new RedirectUnmarshallerListener(redirectEventFilter));
- if (slSchema != null) {
- unmarshaller.setSchema(slSchema);
- }
- log.trace("Before unmarshal().");
- object = unmarshaller.unmarshal(filteredReader);
- log.trace("After unmarshal().");
- } catch (UnmarshalException e) {
- if (log.isDebugEnabled()) {
- log.debug("Failed to unmarshall security layer request.", e);
- } else {
- log.info("Failed to unmarshall security layer request." + e.getMessage());
- }
- Throwable cause = e.getCause();
- if (cause instanceof SAXParseException) {
- throw new SLRequestException(3000,
- SLExceptionMessages.EC3000_UNCLASSIFIED, new Object[]{cause.getMessage()});
- } else {
- throw new SLRequestException(3000,
- SLExceptionMessages.EC3000_UNCLASSIFIED, new Object[]{e});
- }
- } catch (JAXBException e) {
- // unexpected error
- log.error("Failed to unmarshall security layer request.", e);
- throw new SLRuntimeException(e);
- } catch (XMLStreamException e) {
- // unexpected error
- log.error("Failed to unmarshall security layer request.", e);
- throw new SLRuntimeException(e);
- }
-
- return object;
-
- }
-
- /**
- * Creates a new <code>SLCommand</code> from the given <code>source</code> and
- * <code>context</code>.
- *
- * @param source
- * the <code>Source</code> to unmarshall from
- * @param context
- * the context for the created <code>SLCommand</code>
- * @return the <code>SLCommand</code> unmarshalled from the given
- * <code>source</code>
- * @throws SLRequestException
- * if unmarshalling fails
- * @throws SLCommandException
- * if command ist not supported
- * @throws SLRuntimeException
- * if an unexpected error occurs configuring the unmarshaller, if
- * unmarshalling fails with an unexpected error or if the
- * corresponding <code>SLCommand</code> could not be instantiated
- */
- @SuppressWarnings("unchecked")
- public SLCommand createSLCommand(Source source, SLCommandContext context)
+ setJaxbContext(JAXBContext.newInstance(slPkg + ":" + xmldsigPkg + ":" + cardChannelPkg)); + } catch (JAXBException e) { + log.error("Failed to setup JAXBContext security layer request.", e); + throw new SLRuntimeException(e); + } + } + } + + /** + * Initialize the security layer schema. + */ + private synchronized void ensureSchema() { + if (slSchema == null) { + try { + SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + ClassLoader cl = SLCommandFactory.class.getClassLoader(); + Source[] sources = new Source[SCHEMA_FILES.length]; + for (int i = 0; i < SCHEMA_FILES.length; i++) { + String schemaFile = SCHEMA_FILES[i]; + URL schemaURL = cl.getResource(schemaFile); + if (schemaURL == null) { + throw new SLRuntimeException("Failed to load schema file " + schemaFile + "."); + } + log.debug("Schema location: " + schemaURL); + sources[i] = new StreamSource(schemaURL.openStream()); + } + Schema schema = schemaFactory.newSchema(sources); + log.debug("Schema successfully created."); + setSLSchema(schema); + } catch (SAXException e) { + log.error("Failed to load security layer schema.", e); + throw new SLRuntimeException("Failed to load security layer schema.", e); + } catch (IOException e) { + log.error("Failed to load security layer schema.", e); + throw new SLRuntimeException("Failed to load security layer schema.", e); + } + + } + } + + /** + * Get an instance of the <code>SLCommandFactory</code>. + */ + public synchronized static SLCommandFactory getInstance() { + if (instance == null) { + instance = new SLCommandFactory(); + instance.ensureJaxbContext(); + instance.ensureSchema(); + } + return instance; + } + + /** + * Private constructor used by {@link #getInstance()}. + */ + private SLCommandFactory() { + } + + /** + * Unmarshalls from the given <code>source</code>. + * + * @see Unmarshaller#unmarshal(Source) + * + * <em>Note:</em>Could replace JAXB's unmarshal-time validation engine (see commented code), however, + * we need a redirect filter. + * + * @param source + * the source to unmarshal from + * @return the object returned by {@link Unmarshaller#unmarshal(Source)} + * @throws SLRequestException + * if unmarshalling fails + * @throws SLRuntimeException + * if an unexpected error occurs configuring the unmarshaller or if + * unmarshalling fails with an unexpected error + */ + protected Object unmarshal(Source source) throws SLRuntimeException, + SLRequestException { + + Object object; + try { + +// ValidatorHandler validator = slSchema.newValidatorHandler(); +// validator.getContentHandler(); +// +// SAXParserFactory spf = SAXParserFactory.newInstance(); +// spf.setNamespaceAware(true); +// XMLReader saxReader = spf.newSAXParser().getXMLReader(); +// //TODO extend validator to implement redirectContentHandler (validate+redirect) +// saxReader.setContentHandler(validator); +// //TODO get a InputSource +// SAXSource saxSource = new SAXSource(saxReader, source); +// +// Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); +// //turn off duplicate jaxb validation +// unmarshaller.setSchema(null); +// unmarshaller.setListener(listener); +// unmarshaller.unmarshal(saxSource); + + + XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + XMLEventReader eventReader = inputFactory.createXMLEventReader(source); + RedirectEventFilter redirectEventFilter = new RedirectEventFilter(); + XMLEventReader filteredReader = inputFactory.createFilteredReader(eventReader, redirectEventFilter); + + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + unmarshaller.setListener(new RedirectUnmarshallerListener(redirectEventFilter)); + if (slSchema != null) { + unmarshaller.setSchema(slSchema); + } + log.trace("Before unmarshal()."); + object = unmarshaller.unmarshal(filteredReader); + log.trace("After unmarshal()."); + } catch (UnmarshalException e) { + if (log.isDebugEnabled()) { + log.debug("Failed to unmarshall security layer request.", e); + } else { + log.info("Failed to unmarshall security layer request." + e.getMessage()); + } + Throwable cause = e.getCause(); + if (cause instanceof SAXParseException) { + throw new SLRequestException(3000, + SLExceptionMessages.EC3000_UNCLASSIFIED, new Object[]{cause.getMessage()}); + } else { + throw new SLRequestException(3000, + SLExceptionMessages.EC3000_UNCLASSIFIED, new Object[]{e}); + } + } catch (JAXBException e) { + // unexpected error + log.error("Failed to unmarshall security layer request.", e); + throw new SLRuntimeException(e); + } catch (XMLStreamException e) { + // unexpected error + log.error("Failed to unmarshall security layer request.", e); + throw new SLRuntimeException(e); + } + + return object; + + } + + /** + * Creates a new <code>SLCommand</code> from the given <code>source</code> and + * <code>context</code>. + * + * @param source + * the <code>Source</code> to unmarshall from + * @param context + * the context for the created <code>SLCommand</code> + * @return the <code>SLCommand</code> unmarshalled from the given + * <code>source</code> + * @throws SLRequestException + * if unmarshalling fails + * @throws SLCommandException + * if command ist not supported + * @throws SLRuntimeException + * if an unexpected error occurs configuring the unmarshaller, if + * unmarshalling fails with an unexpected error or if the + * corresponding <code>SLCommand</code> could not be instantiated + */ + @SuppressWarnings("unchecked") + public SLCommand createSLCommand(Source source, SLCommandContext context) throws SLCommandException, SLRuntimeException, SLRequestException { DebugReader dr = null; @@ -338,8 +336,8 @@ public class SLCommandFactory { dr = new DebugReader(streamSource.getReader(), "SLCommand unmarshalled from:\n"); streamSource.setReader(dr); } - }
-
+ } + Object object; try { object = unmarshal(source); @@ -351,44 +349,44 @@ public class SLCommandFactory { } } - if (!(object instanceof JAXBElement)) {
- // invalid request
+ if (!(object instanceof JAXBElement)) { + // invalid request log.info("Invalid security layer request. " + object.toString()); - throw new SLRequestException(3002, SLExceptionMessages.EC3002_INVALID,
- new Object[]{object.toString()});
- }
-
- QName qName = ((JAXBElement) object).getName();
- Class<? extends SLCommand> implClass = getImplClass(qName);
- if (implClass == null) {
- // command not supported
- log.info("Unsupported command received: " + qName.toString());
- throw new SLCommandException(4011,
- SLExceptionMessages.EC4011_NOTIMPLEMENTED, new Object[]{qName.toString()});
- }
+ throw new SLRequestException(3002, SLExceptionMessages.EC3002_INVALID, + new Object[]{object.toString()}); + } + QName qName = ((JAXBElement) object).getName(); + Class<? extends SLCommand> implClass = getImplClass(qName); + if (implClass == null) { + // command not supported + log.info("Unsupported command received: " + qName.toString()); + throw new SLCommandException(4011, + SLExceptionMessages.EC4011_NOTIMPLEMENTED, new Object[]{qName.toString()}); + } + + -
- // try to instantiate
- SLCommand slCommand;
- try {
- slCommand = implClass.newInstance();
- log.debug("SLCommand " + slCommand.getName() + " created.");
- } catch (InstantiationException e) {
- // unexpected error
- log.error("Failed to instantiate security layer command implementation.",
- e);
- throw new SLRuntimeException(e);
- } catch (IllegalAccessException e) {
- // unexpected error
- log.error("Failed to instantiate security layer command implementation.",
- e);
- throw new SLRuntimeException(e);
- }
+ // try to instantiate + SLCommand slCommand; + try { + slCommand = implClass.newInstance(); + log.debug("SLCommand " + slCommand.getName() + " created."); + } catch (InstantiationException e) { + // unexpected error + log.error("Failed to instantiate security layer command implementation.", + e); + throw new SLRuntimeException(e); + } catch (IllegalAccessException e) { + // unexpected error + log.error("Failed to instantiate security layer command implementation.", + e); + throw new SLRuntimeException(e); + } + + slCommand.init(context, (JAXBElement) object); + + return slCommand; - slCommand.init(context, (JAXBElement) object);
-
- return slCommand;
-
- }
+ } }
\ No newline at end of file diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java index 4b1cc779..19b84ac7 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/CardChannelInfoboxImpl.java @@ -118,7 +118,7 @@ public class CardChannelInfoboxImpl extends AbstractBinaryFileInfobox { ByteArrayOutputStream redirectedStream = ((at.gv.egiz.slbinding.impl.XMLContentType) content).getRedirectedStream(); if (redirectedStream != null) { - + if (log.isDebugEnabled()) { StringBuilder sb = new StringBuilder(); diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusCommandImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusCommandImpl.java new file mode 100644 index 00000000..46bfe18b --- /dev/null +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusCommandImpl.java @@ -0,0 +1,79 @@ +/* + * 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.slcommands.impl; + +import at.buergerkarte.namespaces.securitylayer._1.GetStatusRequestType; +import at.gv.egiz.bku.slcommands.GetStatusCommand; +import at.gv.egiz.bku.slcommands.SLCommandContext; +import at.gv.egiz.bku.slcommands.SLResult; +import at.gv.egiz.bku.slexceptions.SLCommandException; +import at.gv.egiz.bku.slexceptions.SLException; +import at.gv.egiz.stal.ErrorResponse; +import at.gv.egiz.stal.STAL; +import at.gv.egiz.stal.STALResponse; +import at.gv.egiz.stal.StatusRequest; +import at.gv.egiz.stal.StatusResponse; +import java.util.Collections; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class GetStatusCommandImpl extends SLCommandImpl<GetStatusRequestType> implements GetStatusCommand { + + protected static Log log = LogFactory.getLog(GetStatusCommandImpl.class); + + @Override + public String getName() { + return "GetStatusRequest"; + } + + @Override + public SLResult execute() { + + //ignore maxDelay and TokenStatus +// GetStatusRequestType req = getRequestValue(); + + log.debug("execute GetStatusRequest"); + + StatusRequest stalRequest = new StatusRequest(); + + STAL stal = cmdCtx.getSTAL(); + + List<STALResponse> responses = stal.handleRequest(Collections.singletonList(stalRequest)); + + if (responses != null && responses.size() == 1) { + STALResponse stalResponse = responses.get(0); + if (stalResponse instanceof StatusResponse) { + boolean ready = ((StatusResponse) stalResponse).isCardReady(); + log.trace("received status response cardReady: " + ready); + return new GetStatusResultImpl(ready); + } else if (stalResponse instanceof ErrorResponse) { + log.debug("received error response"); + SLCommandException ex = new SLCommandException(((ErrorResponse) stalResponse).getErrorCode()); + return new ErrorResultImpl(ex, cmdCtx.getLocale()); + } + } + log.error("received unexpected responses"); + return new ErrorResultImpl(new SLCommandException(4000), cmdCtx.getLocale()); + + } +} diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusResultImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusResultImpl.java new file mode 100644 index 00000000..fddd3b0b --- /dev/null +++ b/bkucommon/src/main/java/at/gv/egiz/bku/slcommands/impl/GetStatusResultImpl.java @@ -0,0 +1,52 @@ +/* + * 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.slcommands.impl; + +import at.buergerkarte.namespaces.securitylayer._1.GetStatusResponseType; +import at.buergerkarte.namespaces.securitylayer._1.ObjectFactory; +import at.buergerkarte.namespaces.securitylayer._1.TokenStatusType; +import at.gv.egiz.bku.slcommands.GetStatusResult; +import javax.xml.bind.JAXBElement; +import javax.xml.transform.Result; +import javax.xml.transform.Templates; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class GetStatusResultImpl extends SLResultImpl implements GetStatusResult { + + protected ObjectFactory of; + protected GetStatusResponseType responseType; + + public GetStatusResultImpl(boolean ready) { + of = new ObjectFactory(); + responseType = of.createGetStatusResponseType(); + if (ready) { + responseType.setTokenStatus(TokenStatusType.READY); + } else { + responseType.setTokenStatus(TokenStatusType.REMOVED); + } + + } + + @Override + public void writeTo(Result result, Templates templates) { + JAXBElement<GetStatusResponseType> response = of.createGetStatusResponse(responseType); + writeTo(response, result, templates); + } +} |