diff options
Diffstat (limited to 'BKULocal/src/main/java/at')
11 files changed, 1294 insertions, 0 deletions
| diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/ConfigurationUpdater.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/ConfigurationUpdater.java new file mode 100644 index 00000000..3214f4bc --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/ConfigurationUpdater.java @@ -0,0 +1,44 @@ +/* +* 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.local.conf;
 +
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +import org.quartz.JobExecutionContext;
 +import org.quartz.JobExecutionException;
 +import org.springframework.scheduling.quartz.QuartzJobBean;
 +
 +public class ConfigurationUpdater extends QuartzJobBean {
 +  private static Log log = LogFactory.getLog(ConfigurationUpdater.class);
 +  private Configurator config;
 +
 +  @Override
 +  protected void executeInternal(JobExecutionContext arg0)
 +      throws JobExecutionException {
 +    log.trace("Checking config update");
 +    config.checkUpdate();
 +  }
 +
 +  public Configurator getConfig() {
 +    return config;
 +  }
 +
 +  public void setConfig(Configurator config) {
 +    this.config = config;
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/Configurator.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/Configurator.java new file mode 100644 index 00000000..e9510101 --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/conf/Configurator.java @@ -0,0 +1,274 @@ +/* +* 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.local.conf;
 +
 +import iaik.security.ecc.provider.ECCProvider;
 +import iaik.xml.crypto.XSecProvider;
 +
 +import java.io.File;
 +import java.io.FileInputStream;
 +import java.io.FileOutputStream;
 +import java.io.InputStream;
 +import java.net.HttpURLConnection;
 +import java.security.KeyStore;
 +import java.security.Provider;
 +import java.security.Security;
 +import java.security.cert.CertStore;
 +import java.security.cert.CertificateFactory;
 +import java.security.cert.CollectionCertStoreParameters;
 +import java.security.cert.PKIXBuilderParameters;
 +import java.security.cert.X509CertSelector;
 +import java.security.cert.X509Certificate;
 +import java.util.Enumeration;
 +import java.util.LinkedList;
 +import java.util.List;
 +
 +import javax.net.ssl.CertPathTrustManagerParameters;
 +import javax.net.ssl.HttpsURLConnection;
 +import javax.net.ssl.KeyManager;
 +import javax.net.ssl.KeyManagerFactory;
 +import javax.net.ssl.ManagerFactoryParameters;
 +import javax.net.ssl.SSLContext;
 +import javax.net.ssl.TrustManagerFactory;
 +
 +import org.apache.commons.configuration.ConfigurationException;
 +import org.apache.commons.configuration.XMLConfiguration;
 +import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +
 +import at.gv.egiz.bku.slcommands.impl.xsect.STALProvider;
 +import at.gv.egiz.smcc.SWCard;
 +import at.gv.egiz.smcc.util.SMCCHelper;
 +
 +public class Configurator {
 +  private Log log = LogFactory.getLog(Configurator.class);
 +  private XMLConfiguration baseConfig;
 +  private XMLConfiguration specialConfig;
 +  private boolean autoSave = false;
 +
 +  public Configurator() {
 +    super();
 +    init();
 +    configure();
 +  }
 +
 +  private void init() {
 +    log.debug("Initializing configuration");
 +
 +    baseConfig = new XMLConfiguration();
 +    try {
 +      baseConfig.load(getClass().getClassLoader().getResourceAsStream(
 +          "./at/gv/egiz/bku/local/baseconfig.xml"));
 +      log.debug("Successfully loaded base configuration");
 +    } catch (ConfigurationException e) {
 +      log.error("Cannot load base configuration", e);
 +    }
 +    autoSave = baseConfig.getBoolean("OverrideConfigurationFile[@autosave]");
 +    try {
 +      specialConfig = new XMLConfiguration();
 +      specialConfig.setFileName(baseConfig
 +          .getString("OverrideConfigurationFile"));
 +      specialConfig.load();
 +    } catch (Exception e) {
 +      log.debug("Cannot get special configuration at: "
 +          + baseConfig.getString("OverrideConfigurationFile") + ": " + e);
 +      log.debug("Creating new special configuration");
 +      try {
 +        specialConfig = new XMLConfiguration(baseConfig);
 +        specialConfig.setFileName(baseConfig
 +            .getString("OverrideConfigurationFile"));
 +        specialConfig.save();
 +      } catch (ConfigurationException e1) {
 +        log.error("Cannot load defaults " + e1);
 +      }
 +    }
 +    specialConfig.setReloadingStrategy(new FileChangedReloadingStrategy());
 +    specialConfig.setAutoSave(autoSave);
 +  }
 +
 +  protected void configUrlConnections() {
 +    HttpsURLConnection.setFollowRedirects(false);
 +    HttpURLConnection.setFollowRedirects(false);
 +  }
 +
 +  protected KeyStore loadKeyStore(String fileName, String type, String password) {
 +    KeyStore ks = null;
 +    try {
 +      ks = KeyStore.getInstance(type);
 +      InputStream is = new FileInputStream(fileName);
 +      if (is == null) {
 +        log.warn("Cannot load keystore from: " + fileName);
 +      }
 +      ks.load(is, password.toCharArray());
 +      for (Enumeration<String> alias = ks.aliases(); alias.hasMoreElements();) {
 +        log.debug("Found keystore alias: " + alias.nextElement());
 +      }
 +    } catch (Exception e) {
 +      log.error("Cannot config keystore", e);
 +      return null;
 +    }
 +    return ks;
 +  }
 +
 +  protected void configSSL() {
 +    String trustStoreName = specialConfig.getString("SSL.trustStoreFile");
 +    String trustStoreType = specialConfig.getString("SSL.trustStoreType");
 +    String trustStorePass = specialConfig.getString("SSL.trustStorePass");
 +    String certStoreDirectory = specialConfig
 +        .getString("SSL.certStoreDirectory");
 +    String keyStoreName = specialConfig.getString("SSL.keyStoreFile");
 +    String keyStoreType = specialConfig.getString("SSL.keyStoreType");
 +    String keyStorePass = specialConfig.getString("SSL.keyStorePass");
 +
 +    String caIncludeDir = specialConfig.getString("SSL.caIncludeDirectory");
 +
 +    KeyStore trustStore = loadKeyStore(trustStoreName, trustStoreType,
 +        trustStorePass);
 +    KeyStore keyStore = null;
 +    if (keyStoreName != null) {
 +      keyStore = loadKeyStore(keyStoreName, keyStoreType, keyStorePass);
 +    }
 +
 +    try {
 +      PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(trustStore,
 +          new X509CertSelector());
 +
 +      if (certStoreDirectory != null) {
 +        File dir = new File(certStoreDirectory);
 +        if (dir.isDirectory()) {
 +          List<X509Certificate> certCollection = new LinkedList<X509Certificate>();
 +          CertificateFactory cf = CertificateFactory.getInstance("X.509");
 +          for (File f : dir.listFiles()) {
 +            log.debug("adding " + f.getName());
 +            certCollection.add((X509Certificate) cf
 +                .generateCertificate(new FileInputStream(f)));
 +          }
 +          CollectionCertStoreParameters csp = new CollectionCertStoreParameters(
 +              certCollection);
 +          CertStore cs = CertStore.getInstance("Collection", csp);
 +          pkixParams.addCertStore(cs);
 +          log.debug("Added collection certstore");
 +        } else {
 +          log.error("CertstoreDirectory " + certStoreDirectory
 +              + " is not a directory");
 +        }
 +      }
 +
 +      if (caIncludeDir != null) {
 +        File dir = new File(caIncludeDir);
 +        if (dir.exists() && dir.isDirectory()) {
 +          CertificateFactory cf = CertificateFactory.getInstance("X.509");
 +          try {
 +            for (File f : dir.listFiles()) {
 +              FileInputStream fis = new FileInputStream(f);
 +              X509Certificate cert = (X509Certificate) cf
 +                  .generateCertificate(fis);
 +              fis.close();
 +              log.debug("Adding trusted cert " + cert.getSubjectDN());
 +              trustStore.setCertificateEntry(cert.getSubjectDN().getName(),
 +                  cert);
 +              f.delete();
 +            }
 +          } finally {
 +            trustStore.store(new FileOutputStream(trustStoreName),
 +                trustStorePass.toCharArray());
 +          }
 +        }
 +      }
 +
 +      pkixParams.setRevocationEnabled(specialConfig
 +          .getBoolean("SSL.revocation"));
 +      if (specialConfig.getBoolean("SSL.revocation")) {
 +        System.setProperty("com.sun.security.enableCRLDP ", "true");
 +        Security.setProperty("ocsp.enable", "true");
 +      }
 +      System.setProperty("com.sun.security.enableAIAcaIssuers", "true");
 +      log.debug("Setting revocation check to: "
 +          + pkixParams.isRevocationEnabled());
 +      ManagerFactoryParameters trustParams = new CertPathTrustManagerParameters(
 +          pkixParams);
 +      TrustManagerFactory trustFab = TrustManagerFactory.getInstance("PKIX");
 +      trustFab.init(trustParams);
 +
 +      KeyManager[] km = null;
 +      SSLContext sslCtx = SSLContext.getInstance(specialConfig
 +          .getString("SSL.sslProtocol"));
 +      if (keyStore != null) {
 +        KeyManagerFactory keyFab = KeyManagerFactory.getInstance("SunX509");
 +        keyFab.init(keyStore, keyStorePass.toCharArray());
 +        km = keyFab.getKeyManagers();
 +      }
 +      sslCtx.init(km, trustFab.getTrustManagers(), null);
 +      HttpsURLConnection.setDefaultSSLSocketFactory(sslCtx.getSocketFactory());
 +      log.info("Successfully configured ssl");
 +    } catch (Exception e) {
 +      log.debug("Cannot init ssl", e);
 +    }
 +  }
 +
 +  protected void configureProviders() {
 +    log.debug("Registering security providers");
 +    ECCProvider.addAsProvider(false);
 +    Security.addProvider(new STALProvider());
 +    XSecProvider.addAsProvider(false);
 +    StringBuffer sb = new StringBuffer();
 +    sb.append("Following providers are now registered: ");
 +    int i = 1;
 +    for (Provider prov : Security.getProviders()) {
 +      sb.append((i++) + ". : " + prov);
 +    }
 +    log.debug("Configured provider" + sb.toString());
 +  }
 +
 +  protected void configureBKU() {
 +    if (specialConfig.containsKey("BKU.useSWCard")) {
 +      boolean useSWCard = specialConfig.getBoolean("BKU.useSWCard");
 +      log.info("Setting SW Card to: "+useSWCard);
 +      SMCCHelper.setUseSWCard(useSWCard);
 +    }
 +    if (specialConfig.containsKey("BKU.SWCardDirectory")) {
 +     //SWCard.
 +    }
 +  }
 +
 +  public void configure() {
 +    configureProviders();
 +    configSSL();
 +    configUrlConnections();
 +    configureBKU();
 +
 +  }
 +
 +  public void checkUpdate() {
 +    if (specialConfig.getReloadingStrategy().reloadingRequired()) {
 +      log.info("Reloading configuration: " + specialConfig.getFileName());
 +      specialConfig.setAutoSave(false);
 +      specialConfig.clear();
 +      try {
 +        specialConfig.load();
 +      } catch (ConfigurationException e) {
 +        log.fatal(e);
 +      }
 +      specialConfig.setAutoSave(specialConfig
 +          .getBoolean("OverrideConfigurationFile[@autosave]"));
 +      configure();
 +      specialConfig.getReloadingStrategy().reloadingPerformed();
 +    }
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/PINDialog.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/PINDialog.java new file mode 100644 index 00000000..5bc6bab5 --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/PINDialog.java @@ -0,0 +1,214 @@ +/* +* 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.local.stal;
 +
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
 +import java.awt.event.WindowAdapter;
 +import java.awt.event.WindowEvent;
 +import java.util.regex.Matcher;
 +import java.util.regex.Pattern;
 +
 +import javax.swing.JButton;
 +import javax.swing.JPasswordField;
 +import javax.swing.text.AttributeSet;
 +import javax.swing.text.BadLocationException;
 +import javax.swing.text.PlainDocument;
 +
 +import at.gv.egiz.smcc.PINSpec;
 +
 +public class PINDialog extends javax.swing.JDialog implements ActionListener {
 +
 +  // Variables declaration - do not modify
 +  private javax.swing.JButton okButton;
 +  private javax.swing.JButton cancelButton;
 +  private javax.swing.JLabel label;
 +  private javax.swing.JPasswordField password;
 +  // End of variables declaration
 +
 +  private PINSpec pinSpec;
 +  private String pinString;
 +  private boolean finished = false;
 +
 +  class PinDocument extends PlainDocument {
 +    private Pattern pattern;
 +
 +    public PinDocument() {
 +      pattern = Pattern.compile(pinSpec.getRexepPattern());
 +    }
 +
 +    public void insertString(int offs, String str, AttributeSet a)
 +        throws BadLocationException {
 +      if (pinSpec.getMaxLength() >= (getLength() + str.length())) {
 +        Matcher matcher = pattern.matcher(str);
 +        if (matcher.matches()) {
 +          super.insertString(offs, str, a);
 +        }
 +      }
 +      okButton.setEnabled(getLength() >= pinSpec.getMinLength());
 +    }
 +
 +    @Override
 +    public void remove(int offs, int len) throws BadLocationException {
 +      super.remove(offs, len);
 +      okButton.setEnabled(getLength() >= pinSpec.getMinLength());
 +    }
 +  }
 +
 +  public PINDialog() {
 +  }
 +
 +  private synchronized void finished(boolean ok) {
 +    if (ok) {
 +      pinString = password.getText();
 +    } else {
 +      pinString = null;
 +    }
 +    finished = true;
 +    notifyAll();
 +  }
 +
 +  public synchronized void waitFinished() {
 +    while (!finished) {
 +      try {
 +        wait();
 +      } catch (InterruptedException e) {
 +        // TODO Auto-generated catch block
 +        e.printStackTrace();
 +      }
 +    }
 +  }
 +
 +  public String getPIN() {
 +    return pinString;
 +  }
 +
 +  /** Creates new form NewJDialog */
 +  public PINDialog(java.awt.Frame parent, boolean modal, PINSpec pinSpec,
 +      int retries) {
 +    super(parent, modal);
 +    this.pinSpec = pinSpec;
 +    initComponents();
 +  }
 +
 +  private void initComponents() {
 +    okButton = new javax.swing.JButton();
 +    cancelButton = new javax.swing.JButton();
 +    password = new javax.swing.JPasswordField();
 +    label = new javax.swing.JLabel();
 +    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 +
 +    setTitle("PIN Dialog"); // NOI18N
 +    setName("Form"); // NOI18N
 +
 +    okButton.setText("OK"); // NOI18N
 +    okButton.setName("okButton"); // NOI18N
 +    okButton.setEnabled(false);
 +    okButton.addActionListener(this);
 +
 +    cancelButton.setText("Cancel"); // NOI18N
 +    cancelButton.setName("cancelButton"); // NOI18N
 +    cancelButton.addActionListener(this);
 +
 +    password.setText(""); // NOI18N
 +    password.setName("password"); // NOI18N
 +    password.addActionListener(this);
 +    password.setDocument(new PinDocument());
 +
 +    label.setText("PIN: "); // NOI18N
 +    label.setName("jLabel1"); // NOI18N
 +
 +    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
 +        getContentPane());
 +    getContentPane().setLayout(layout);
 +    layout.setHorizontalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        layout.createSequentialGroup().addContainerGap().addGroup(
 +            layout.createParallelGroup(
 +                javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +                layout.createSequentialGroup().addComponent(label,
 +                    javax.swing.GroupLayout.PREFERRED_SIZE, 61,
 +                    javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(
 +                    javax.swing.LayoutStyle.ComponentPlacement.RELATED,
 +                    javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
 +                    .addComponent(password,
 +                        javax.swing.GroupLayout.PREFERRED_SIZE, 127,
 +                        javax.swing.GroupLayout.PREFERRED_SIZE)).addGroup(
 +                javax.swing.GroupLayout.Alignment.TRAILING,
 +                layout.createSequentialGroup().addComponent(cancelButton)
 +                    .addPreferredGap(
 +                        javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 +                    .addComponent(okButton))).addContainerGap()));
 +    layout.setVerticalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        layout.createSequentialGroup().addContainerGap().addGroup(
 +            layout.createParallelGroup(
 +                javax.swing.GroupLayout.Alignment.BASELINE).addComponent(label,
 +                javax.swing.GroupLayout.PREFERRED_SIZE, 33,
 +                javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(password,
 +                javax.swing.GroupLayout.PREFERRED_SIZE,
 +                javax.swing.GroupLayout.DEFAULT_SIZE,
 +                javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(
 +            javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14,
 +            Short.MAX_VALUE).addGroup(
 +            layout.createParallelGroup(
 +                javax.swing.GroupLayout.Alignment.BASELINE).addComponent(
 +                okButton).addComponent(cancelButton)).addContainerGap()));
 +
 +    pack();
 +  }
 +
 +  /**
 +   * @param args
 +   *          the command line arguments
 +   */
 +  public static void main(String args[]) {
 +    java.awt.EventQueue.invokeLater(new Runnable() {
 +      public void run() {
 +        PINDialog dialog = new PINDialog(new javax.swing.JFrame(), true,
 +            new PINSpec(1, 5, "[0-9]*", "Hansi"), 10);
 +        dialog.setResizable(false);
 +        dialog.addWindowListener(new java.awt.event.WindowAdapter() {
 +          public void windowClosing(java.awt.event.WindowEvent e) {
 +            System.exit(0);
 +          }
 +        });
 +        dialog.setVisible(true);
 +      }
 +    });
 +  }
 +
 +  @Override
 +  public void actionPerformed(ActionEvent e) {
 +    if (e.getSource() instanceof JButton) {
 +      JButton pressed = (JButton) e.getSource();
 +      if (pressed.getName().equals("okButton")) {
 +        finished(true);
 +      } else if (pressed.getName().equals("cancelButton")) {
 +        finished(false);
 +      }
 +    } else if (e.getSource() instanceof JPasswordField) {
 +      JPasswordField pwf = (JPasswordField) e.getSource();
 +      if (pwf.getName().equals("password")) {
 +        if (password.getPassword().length >= pinSpec.getMinLength()) {
 +          finished(true);
 +        }
 +      }
 +    }
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/QuitRequestHandler.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/QuitRequestHandler.java new file mode 100644 index 00000000..5596b7bb --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/QuitRequestHandler.java @@ -0,0 +1,41 @@ +/* +* 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.local.stal;
 +
 +import at.gv.egiz.bku.smccstal.AbstractRequestHandler;
 +import at.gv.egiz.bku.smccstal.SMCCSTALRequestHandler;
 +import at.gv.egiz.stal.STALRequest;
 +import at.gv.egiz.stal.STALResponse;
 +
 +public class QuitRequestHandler extends AbstractRequestHandler {
 +
 +  @Override
 +  public STALResponse handleRequest(STALRequest request) {
 +    return null;
 +  }
 +
 +  @Override
 +  public boolean requireCard() {
 +    return false;
 +  }
 +
 +  @Override
 +  public SMCCSTALRequestHandler newInstance() {
 +    return this;
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTAL.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTAL.java new file mode 100644 index 00000000..26ec2aa8 --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTAL.java @@ -0,0 +1,95 @@ +/* +* 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.local.stal;
 +
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
 +import java.util.Locale;
 +
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +
 +import at.gv.egiz.bku.gui.BKUGUIFacade;
 +import at.gv.egiz.bku.local.ui.TrayIconDialog;
 +import at.gv.egiz.bku.smccstal.AbstractRequestHandler;
 +import at.gv.egiz.bku.smccstal.AbstractSMCCSTAL;
 +import at.gv.egiz.bku.smccstal.STALMessageConsumer;
 +import at.gv.egiz.smcc.PINProvider;
 +import at.gv.egiz.smcc.util.SMCCHelper;
 +import at.gv.egiz.stal.QuitRequest;
 +
 +public class SMCCSTAL extends AbstractSMCCSTAL implements STALMessageConsumer {
 +  private static Log log = LogFactory.getLog(SMCCSTAL.class);
 +
 +  protected PINProvider pinProvider = new SwingPINProvider();
 +  protected SwingInsertCardDialog insertCard = new SwingInsertCardDialog();
 +  private boolean canceled = false;
 +
 +  static {
 +    addRequestHandler(QuitRequest.class, new QuitRequestHandler());
 +  }
 +
 +  public SMCCSTAL() {
 +    AbstractRequestHandler.setMessageConsumer(this);
 +  }
 +
 +  /**
 +   * 
 +   * @return if the user canceled
 +   */
 +  protected boolean waitForCard() {
 +    canceled = false;
 +    while ((smccHelper.getResultCode() != SMCCHelper.CARD_FOUND) && (!canceled)) {
 +      insertCard.setVisible(true);
 +      insertCard.setAlwaysOnTop(true);
 +      insertCard.addCanceledListener(new ActionListener() {
 +        @Override
 +        public void actionPerformed(ActionEvent e) {
 +          canceled = true;
 +        }
 +      });
 +      try {
 +        smccHelper.update(1000);
 +      } catch (Exception ex) {
 +        log.info(ex);
 +      }
 +    }
 +    insertCard.setVisible(false);
 +    signatureCard = smccHelper.getSignatureCard(locale);
 +    return canceled;
 +  }
 +
 +  @Override
 +  public void setLocale(Locale locale) {
 +    super.setLocale(locale);
 +    if (pinProvider instanceof SwingPINProvider) {
 +      ((SwingPINProvider) pinProvider).setLocale(locale);
 +    }
 +  }
 +
 +  @Override
 +  public void consumeNewSTALMessage(String captionId, String messageId) {
 +    TrayIconDialog.getInstance().displayInfo(captionId, messageId);
 +  }
 +
 +  @Override
 +  protected BKUGUIFacade getGUI() {
 +    // TODO Auto-generated method stub
 +    //FIXME
 +    return null;
 +  }
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTALFactory.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTALFactory.java new file mode 100644 index 00000000..014d884a --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SMCCSTALFactory.java @@ -0,0 +1,27 @@ +/* +* 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.local.stal;
 +
 +import at.gv.egiz.stal.STAL;
 +import at.gv.egiz.stal.STALFactory;
 +
 +public class SMCCSTALFactory implements STALFactory {
 +  @Override
 +  public STAL createSTAL() {
 +    return new SMCCSTAL();
 +  }
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingInsertCardDialog.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingInsertCardDialog.java new file mode 100644 index 00000000..eb76f2f2 --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingInsertCardDialog.java @@ -0,0 +1,147 @@ +/* +* 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.local.stal;
 +
 +import java.awt.Dimension;
 +import java.awt.Font;
 +import java.awt.Toolkit;
 +import java.awt.event.ActionListener;
 +import java.awt.event.WindowAdapter;
 +import java.awt.event.WindowEvent;
 +import java.awt.event.WindowListener;
 +import java.io.ByteArrayOutputStream;
 +import java.io.IOException;
 +import java.io.InputStream;
 +import java.util.Locale;
 +import java.util.ResourceBundle;
 +
 +import javax.swing.ImageIcon;
 +import javax.swing.JDialog;
 +
 +import at.gv.egiz.bku.utils.StreamUtil;
 +
 +public class SwingInsertCardDialog extends JDialog {
 +
 +  private javax.swing.JButton cancelButton;
 +  private javax.swing.JLabel jLabel1;
 +  private javax.swing.JLabel jLabel2;
 +  private Locale locale = Locale.getDefault();
 +
 +  public SwingInsertCardDialog() {
 +    super((java.awt.Frame) null, false);
 +    initComponents();
 +  }
 +
 +  public void setLocale(Locale locale) {
 +    this.locale = locale;
 +  }
 +
 +  private void initComponents() {
 +    ResourceBundle rb = ResourceBundle.getBundle(
 +        "at/gv/egiz/bku/local/Userdialog", locale);
 +    setTitle(rb.getString("Insert.Header"));
 +    jLabel1 = new javax.swing.JLabel();
 +    jLabel2 = new javax.swing.JLabel();
 +    cancelButton = new javax.swing.JButton();
 +
 +    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
 +    setName("Form"); // NOI18N
 +    setUndecorated(true);
 +
 +    jLabel1.setFont(new Font("Tahoma", Font.BOLD, 14));
 +    jLabel1.setText(rb.getString("Insert.Text")); // NOI18N
 +    jLabel1.setName("text"); // NOI18N
 +
 +    ByteArrayOutputStream os = new ByteArrayOutputStream();
 +    InputStream is = getClass().getClassLoader().getResourceAsStream(
 +        "at/gv/egiz/bku/local/logo.png");
 +    try {
 +      StreamUtil.copyStream(is, os);
 +      jLabel2.setIcon(new ImageIcon(os.toByteArray())); // NOI18N
 +    } catch (IOException e) {
 +      jLabel2.setText("Chipperling image missing"); // NOI18N
 +    }
 +    jLabel2.setName("jLabel2"); // NOI18N
 +    cancelButton.setText(rb.getString("Insert.Button.Cancel")); // NOI18N
 +    cancelButton.setName("jButton1"); // NOI18N
 +
 +    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
 +        getContentPane());
 +    getContentPane().setLayout(layout);
 +    layout.setHorizontalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        layout.createSequentialGroup().addContainerGap().addComponent(jLabel2)
 +            .addGroup(
 +                layout.createParallelGroup(
 +                    javax.swing.GroupLayout.Alignment.TRAILING).addGroup(
 +                    layout.createSequentialGroup().addGap(35, 35, 35)
 +                        .addComponent(jLabel1,
 +                            javax.swing.GroupLayout.DEFAULT_SIZE,
 +                            javax.swing.GroupLayout.DEFAULT_SIZE,
 +                            Short.MAX_VALUE)).addGroup(
 +                    layout.createSequentialGroup().addPreferredGap(
 +                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 +                        .addComponent(cancelButton))).addGap(29, 29, 29)));
 +    layout.setVerticalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        javax.swing.GroupLayout.Alignment.TRAILING,
 +        layout.createSequentialGroup().addContainerGap().addGroup(
 +            layout.createParallelGroup(
 +                javax.swing.GroupLayout.Alignment.TRAILING).addComponent(
 +                jLabel2).addGroup(
 +                layout.createSequentialGroup().addComponent(jLabel1,
 +                    javax.swing.GroupLayout.DEFAULT_SIZE, 53, Short.MAX_VALUE)
 +                    .addGap(35, 35, 35).addComponent(cancelButton).addGap(9, 9,
 +                        9))).addContainerGap()));
 +
 +    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 +    Dimension frameSize = getSize();
 +    if (frameSize.height > screenSize.height) {
 +      frameSize.height = screenSize.height;
 +    }
 +    if (frameSize.width > screenSize.width) {
 +      frameSize.width = screenSize.width;
 +    }
 +    setLocation((screenSize.width - frameSize.width) / 2,
 +        (screenSize.height - frameSize.height) / 2);
 +    setUndecorated(false);
 +    pack();
 +  }
 +
 +  public void addCanceledListener(ActionListener al) {
 +    cancelButton.addActionListener(al);
 +  }
 +
 +  /**
 +   * @param args
 +   *          the command line arguments
 +   */
 +  public static void main(String args[]) {
 +    java.awt.EventQueue.invokeLater(new Runnable() {
 +      public void run() {
 +        SwingInsertCardDialog dialog = new SwingInsertCardDialog();
 +        dialog.addWindowListener(new java.awt.event.WindowAdapter() {
 +          public void windowClosing(java.awt.event.WindowEvent e) {
 +            System.exit(0);
 +          }
 +        });
 +        //
 +      }
 +    });
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPINProvider.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPINProvider.java new file mode 100644 index 00000000..7d36e68e --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPINProvider.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.local.stal;
 +
 +import java.util.Locale;
 +
 +import at.gv.egiz.smcc.PINProvider;
 +import at.gv.egiz.smcc.PINSpec;
 +
 +public class SwingPINProvider implements PINProvider {
 +  
 +  private Locale locale = Locale.getDefault();
 +  SwingPinDialog dialog; 
 +  
 +  public SwingPINProvider() {
 +    this.locale = Locale.getDefault();
 +   
 +  }
 +
 +  public Locale getLocale() {
 +    return locale;
 +  }
 +
 +  public void setLocale(Locale locale) {
 +    this.locale = locale;
 +  }
 +
 +  @Override
 +  public String providePIN(PINSpec pinSpec, int retries) {
 +    dialog = new SwingPinDialog(null, false);
 +    dialog.setResizable(false);
 +    dialog.setRetries(retries);
 +    dialog.setPinSpec(pinSpec);
 +    dialog.initComponents();
 +    dialog.setVisible(true);
 +    dialog.requestFocus();
 +    dialog.setAlwaysOnTop(true);
 +    dialog.waitFinished();
 +    dialog.dispose();
 +    return dialog.getPIN();
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPinDialog.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPinDialog.java new file mode 100644 index 00000000..3e91972c --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/SwingPinDialog.java @@ -0,0 +1,265 @@ +/* +* 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.local.stal;
 +
 +import java.awt.Dimension;
 +import java.awt.Font;
 +import java.awt.Toolkit;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
 +import java.io.ByteArrayOutputStream;
 +import java.io.InputStream;
 +import java.text.MessageFormat;
 +import java.util.Locale;
 +import java.util.ResourceBundle;
 +import java.util.regex.Matcher;
 +import java.util.regex.Pattern;
 +
 +import javax.swing.ImageIcon;
 +import javax.swing.JButton;
 +import javax.swing.JPasswordField;
 +import javax.swing.text.AttributeSet;
 +import javax.swing.text.BadLocationException;
 +import javax.swing.text.PlainDocument;
 +
 +import at.gv.egiz.bku.utils.StreamUtil;
 +import at.gv.egiz.smcc.PINSpec;
 +
 +public class SwingPinDialog extends javax.swing.JDialog implements
 +    ActionListener {
 +
 +  private javax.swing.JButton okButton;
 +  private javax.swing.JButton cancelButton;
 +  private javax.swing.JLabel jLabel1;
 +  private javax.swing.JLabel jLabel2;
 +  private javax.swing.JPasswordField password;
 +
 +  private PINSpec pinSpec;
 +  private String pinString;
 +  private boolean finished = false;
 +  private int retries = -1;
 +  private Locale locale = Locale.getDefault();
 +  private boolean setUp = false;
 +
 +  class PinDocument extends PlainDocument {
 +    private Pattern pattern;
 +
 +    public PinDocument() {
 +      if ((pinSpec != null) && (pinSpec.getRexepPattern() != null)) {
 +        pattern = Pattern.compile(pinSpec.getRexepPattern());
 +      } else {
 +        pattern = Pattern.compile(".");
 +      }
 +    }
 +
 +    public void insertString(int offs, String str, AttributeSet a)
 +        throws BadLocationException {
 +      if (pinSpec.getMaxLength() >= (getLength() + str.length())) {
 +        Matcher matcher = pattern.matcher(str);
 +        if (matcher.matches()) {
 +          super.insertString(offs, str, a);
 +        }
 +      }
 +      okButton.setEnabled(getLength() >= pinSpec.getMinLength());
 +    }
 +
 +    @Override
 +    public void remove(int offs, int len) throws BadLocationException {
 +      super.remove(offs, len);
 +      okButton.setEnabled(getLength() >= pinSpec.getMinLength());
 +    }
 +  }
 +
 +  /**
 +   * Make sure to call initComponents
 +   * 
 +   * @param parent
 +   * @param modal
 +   */
 +  public SwingPinDialog(java.awt.Frame parent, boolean modal) {
 +    super(parent, modal);
 +  }
 +
 +  public void setLocale(Locale locale) {
 +    this.locale = locale;
 +  }
 +
 +  public void setPinSpec(PINSpec pinSpec) {
 +    this.pinSpec = pinSpec;
 +  }
 +
 +  public void setRetries(int retries) {
 +    this.retries = retries;
 +  }
 +
 +  public void initComponents() {
 +    ResourceBundle rb = ResourceBundle.getBundle(
 +        "at/gv/egiz/bku/local/Userdialog", locale);
 +    okButton = new javax.swing.JButton();
 +    cancelButton = new javax.swing.JButton();
 +    password = new javax.swing.JPasswordField();
 +    jLabel1 = new javax.swing.JLabel();
 +    jLabel2 = new javax.swing.JLabel();
 +
 +    setTitle(rb.getString("Pin.Header"));
 +    setName("Form");
 +    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
 +
 +    okButton.setText(rb.getString("Pin.Button.OK"));
 +    okButton.setName("okButton");
 +    okButton.setEnabled(false);
 +    okButton.addActionListener(this);
 +
 +    cancelButton.setText(rb.getString("Pin.Button.Cancel"));
 +    cancelButton.setName("cancelButton");
 +    cancelButton.addActionListener(this);
 +
 +    password.setText("");
 +    password.setDocument(new PinDocument());
 +    password.setName("password");
 +    password.addActionListener(this);
 +    password.setDocument(new PinDocument());
 +    password.setRequestFocusEnabled(true);
 +    password.requestFocus();
 +
 +    jLabel1.setFont(new Font("Tahoma", Font.BOLD, 14));
 +    String text = null;
 +    Object[] args;
 +    if (retries > 0) {
 +      text = rb.getString("Pin.Text.Retries");
 +      args = new Object[2];
 +      args[0] = pinSpec.getLocalizedName();
 +      args[1] = new Integer(retries);
 +    } else {
 +      text = rb.getString("Pin.Text.NoRetries");
 +      args = new Object[1];
 +      args[0] = pinSpec.getLocalizedName();
 +    }
 +    text = MessageFormat.format(text, args);
 +    jLabel1.setText(text); // NOI18N
 +    jLabel1.setName("jLabel1"); // NOI18N
 +
 +    ByteArrayOutputStream os = new ByteArrayOutputStream();
 +    InputStream is = getClass().getClassLoader().getResourceAsStream(
 +        "at/gv/egiz/bku/local/logo.png");
 +    try {
 +      StreamUtil.copyStream(is, os);
 +      jLabel2.setIcon(new ImageIcon(os.toByteArray())); // NOI18N
 +    } catch (Exception e) {
 +      jLabel2.setText("Chipperling image missing"); // NOI18N
 +    }
 +    jLabel2.setName("jLabel2"); // NOI18N
 +
 +    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
 +        getContentPane());
 +    getContentPane().setLayout(layout);
 +    layout.setHorizontalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        layout.createSequentialGroup().addContainerGap().addComponent(jLabel2)
 +            .addGap(73, 73, 73).addGroup(
 +                layout.createParallelGroup(
 +                    javax.swing.GroupLayout.Alignment.LEADING).addComponent(
 +                    jLabel1).addGroup(
 +                    layout.createParallelGroup(
 +                        javax.swing.GroupLayout.Alignment.TRAILING, false)
 +                        .addComponent(password,
 +                            javax.swing.GroupLayout.Alignment.LEADING)
 +                        .addGroup(
 +                            javax.swing.GroupLayout.Alignment.LEADING,
 +                            layout.createSequentialGroup().addComponent(
 +                                cancelButton).addGap(18, 18, 18).addComponent(
 +                                okButton)))).addContainerGap(31,
 +                Short.MAX_VALUE)));
 +    layout.setVerticalGroup(layout.createParallelGroup(
 +        javax.swing.GroupLayout.Alignment.LEADING).addGroup(
 +        layout.createSequentialGroup().addContainerGap().addGroup(
 +            layout.createParallelGroup(
 +                javax.swing.GroupLayout.Alignment.LEADING)
 +                .addComponent(jLabel2).addGroup(
 +                    layout.createSequentialGroup().addPreferredGap(
 +                        javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 +                        .addComponent(jLabel1,
 +                            javax.swing.GroupLayout.PREFERRED_SIZE, 33,
 +                            javax.swing.GroupLayout.PREFERRED_SIZE).addGap(18,
 +                            18, 18).addComponent(password,
 +                            javax.swing.GroupLayout.PREFERRED_SIZE,
 +                            javax.swing.GroupLayout.DEFAULT_SIZE,
 +                            javax.swing.GroupLayout.PREFERRED_SIZE).addGap(20,
 +                            20, 20).addGroup(
 +                            layout.createParallelGroup(
 +                                javax.swing.GroupLayout.Alignment.BASELINE)
 +                                .addComponent(cancelButton).addComponent(
 +                                    okButton)))).addGap(36, 36, 36)));
 +    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
 +    Dimension frameSize = getSize();
 +    if (frameSize.height > screenSize.height) {
 +      frameSize.height = screenSize.height;
 +    }
 +    if (frameSize.width > screenSize.width) {
 +      frameSize.width = screenSize.width;
 +    }
 +    setLocation((screenSize.width - frameSize.width) / 2,
 +        (screenSize.height - frameSize.height) / 2);
 +    setUndecorated(false);
 +    pack();
 +  }
 +
 +  public String getPIN() {
 +    return pinString;
 +  }
 +
 +  private synchronized void finished(boolean ok) {
 +    if (ok) {
 +      pinString = password.getText();
 +    } else {
 +      pinString = null;
 +    }
 +    finished = true;
 +    notifyAll();
 +  }
 +
 +  public synchronized void waitFinished() {
 +    while (!finished) {
 +      try {
 +        wait();
 +      } catch (InterruptedException e) {
 +        // TODO Auto-generated catch block
 +        e.printStackTrace();
 +      }
 +    }
 +  }
 +
 +  @Override
 +  public void actionPerformed(ActionEvent e) {
 +    if (e.getSource() instanceof JButton) {
 +      JButton pressed = (JButton) e.getSource();
 +      if (pressed.getName().equals("okButton")) {
 +        finished(true);
 +      } else if (pressed.getName().equals("cancelButton")) {
 +        finished(false);
 +      }
 +    } else if (e.getSource() instanceof JPasswordField) {
 +      JPasswordField pwf = (JPasswordField) e.getSource();
 +      if (pwf.getName().equals("password")) {
 +        if (password.getPassword().length >= pinSpec.getMinLength()) {
 +          finished(true);
 +        }
 +      }
 +    }
 +  }
 +
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java new file mode 100644 index 00000000..8529949d --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/BKURequestHandler.java @@ -0,0 +1,100 @@ +/* +* 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.local.webapp;
 +
 +import java.io.IOException;
 +import java.util.Enumeration;
 +import java.util.HashMap;
 +import java.util.Iterator;
 +import java.util.Locale;
 +import java.util.Map;
 +
 +import javax.servlet.ServletException;
 +import javax.servlet.http.HttpServlet;
 +import javax.servlet.http.HttpServletRequest;
 +import javax.servlet.http.HttpServletResponse;
 +
 +import org.apache.commons.logging.Log;
 +import org.apache.commons.logging.LogFactory;
 +import org.springframework.web.HttpRequestHandler;
 +
 +import at.gv.egiz.bku.binding.BindingProcessorManager;
 +import at.gv.egiz.bku.binding.HTTPBindingProcessor;
 +import at.gv.egiz.bku.binding.HttpUtil;
 +import at.gv.egiz.bku.utils.StreamUtil;
 +import at.gv.egiz.org.apache.tomcat.util.http.AcceptLanguage;
 +
 +public abstract class BKURequestHandler extends HttpServlet {
 +
 +  public final static String ENCODING = "UTF-8";
 +
 +  protected Log log = LogFactory.getLog(BKURequestHandler.class);
 +
 +  protected abstract BindingProcessorManager getBindingProcessorManager();
 +
 +  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
 +      throws ServletException, java.io.IOException {
 +    log.debug("Got new request");
 +    String lang = req.getHeader("Accept-Language");
 +    Locale locale = AcceptLanguage.getLocale(lang);
 +    log.debug("Using locale: "+locale);
 +    HTTPBindingProcessor bindingProcessor;
 +    if (req.isSecure()) {
 +      bindingProcessor = (HTTPBindingProcessor) getBindingProcessorManager()
 +          .createBindingProcessor("https", null, locale);
 +    } else {
 +      bindingProcessor = (HTTPBindingProcessor) getBindingProcessorManager()
 +          .createBindingProcessor("http", null, locale);
 +    }
 +    Map<String, String> headerMap = new HashMap<String, String>();
 +    for (Enumeration<String> headerName = req.getHeaderNames(); headerName
 +        .hasMoreElements();) {
 +      String header = headerName.nextElement();
 +      if (header != null) {
 +        headerMap.put(header, req.getHeader(header));
 +      }
 +    }
 +    headerMap.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, req.getContentType()+";"+req.getCharacterEncoding());
 +    bindingProcessor.setHTTPHeaders(headerMap);
 +    bindingProcessor.consumeRequestStream(req.getInputStream());
 +
 +    // fixxme just for testing
 +    bindingProcessor.run();
 +    if (bindingProcessor.getRedirectURL() != null) {
 +      resp.sendRedirect(bindingProcessor.getRedirectURL());
 +      return;
 +    }
 +    resp.setStatus(bindingProcessor.getResponseCode());
 +    for (Iterator<String> it = bindingProcessor.getResponseHeaders().keySet()
 +        .iterator(); it.hasNext();) {
 +      String header = it.next();
 +      resp.setHeader(header, bindingProcessor.getResponseHeaders().get(header));
 +    }
 +    resp.setContentType(bindingProcessor.getResultContentType());
 +    resp.setCharacterEncoding(ENCODING);
 +    bindingProcessor.writeResultTo(resp.getOutputStream(), ENCODING);
 +    req.getInputStream().close();
 +    resp.getOutputStream().flush();
 +    resp.getOutputStream().close();
 +    log.debug("Finished Request");
 +  }
 +
 +  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 +      throws ServletException, java.io.IOException {
 +    doPost(req, resp);
 +  }
 +}
 diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/SpringBKUServlet.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/SpringBKUServlet.java new file mode 100644 index 00000000..c573e52f --- /dev/null +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/webapp/SpringBKUServlet.java @@ -0,0 +1,30 @@ +/* +* 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.local.webapp;
 +
 +import at.gv.egiz.bku.binding.BindingProcessorManager;
 +
 +public class SpringBKUServlet extends BKURequestHandler {
 +
 +  public final static String BEAN_NAME="bindingProcessorManager";
 +  
 +  @Override
 +  protected BindingProcessorManager getBindingProcessorManager() {
 +    return (BindingProcessorManager) getServletContext().getAttribute(BEAN_NAME);
 +  }
 +
 +}
 | 
