diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2008-11-11 12:15:15 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2008-11-11 12:15:15 +0000 | 
| commit | 82c59c9d862d3ee9ad43fdc1509d0b5a61cc107c (patch) | |
| tree | cf777ea709b0d49e7ebc0ea61cc95e8f67c14059 | |
| parent | b04b2a83dd3db53be5cc8bdd7635501726472545 (diff) | |
| download | mocca-82c59c9d862d3ee9ad43fdc1509d0b5a61cc107c.tar.gz mocca-82c59c9d862d3ee9ad43fdc1509d0b5a61cc107c.tar.bz2 mocca-82c59c9d862d3ee9ad43fdc1509d0b5a61cc107c.zip | |
Frame HashData Display
Interrupt in waitForAction (applet closed)
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@161 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
18 files changed, 569 insertions, 71 deletions
| diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletBKUWorker.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletBKUWorker.java index cf842d55..8e88c012 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletBKUWorker.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletBKUWorker.java @@ -31,6 +31,7 @@ import at.gv.egiz.stal.service.types.RequestType;  import at.gv.egiz.stal.service.types.ResponseType;  import at.gv.egiz.stal.util.STALTranslator;  import java.applet.AppletContext; +import java.awt.Dimension;  import java.net.MalformedURLException;  import java.net.URL;  import java.util.ArrayList; @@ -194,12 +195,15 @@ public class AppletBKUWorker extends AbstractBKUWorker implements Runnable {      String hashDataDisplayStyle = params.getAppletParameter(BKUApplet.HASHDATA_DISPLAY);      if (BKUApplet.HASHDATA_DISPLAY_INTERNAL.equals(hashDataDisplayStyle)) {        log.debug("register SignRequestHandler for STAL port " + BKUApplet.WSDL_URL); -      addRequestHandler(SignRequest.class, new WebServiceSignRequestHandler(stalPort, sessionId)); -    } else { -      //if (HASHDATADISPLAY_EXTERNAL.equals(displayStyle)) { +      addRequestHandler(SignRequest.class, new AppletHashDataDisplay(stalPort, sessionId)); +    } else if (BKUApplet.HASHDATA_DISPLAY_BROWSER.equals(hashDataDisplayStyle)) {        URL hashDataURL = params.getURLParameter(BKUApplet.HASHDATA_URL, sessionId);        log.debug("register SignRequestHandler for HashDataURL " + hashDataURL); -      addRequestHandler(SignRequest.class, new ExternalDisplaySignRequestHandler(hashDataURL)); // +      addRequestHandler(SignRequest.class, new BrowserHashDataDisplay(ctx, hashDataURL)); +    } else { +      //BKUApplet.HASHDATA_DISPLAY_FRAME +      log.debug("register SignRequestHandler for STAL port " + BKUApplet.WSDL_URL); +      addRequestHandler(SignRequest.class, new JDialogHashDataDisplay(stalPort, sessionId, new Dimension(400, 300), locale));      }    }  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/WebServiceSignRequestHandler.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java index 014065f2..b77485d9 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/WebServiceSignRequestHandler.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java @@ -37,15 +37,18 @@ import at.gv.egiz.stal.signedinfo.DigestMethodType;  import at.gv.egiz.stal.signedinfo.ReferenceType;  /** - * @author clemens + * A SignRequesthandler displaying hashdata inputs in the applet  + * (only plaintext data is displayed, other hashdata inputs may be saved to disk). + *  + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */ -public class WebServiceSignRequestHandler extends SignRequestHandler { +public class AppletHashDataDisplay extends SignRequestHandler { -  private static final Log log = LogFactory.getLog(WebServiceSignRequestHandler.class); +  private static final Log log = LogFactory.getLog(AppletHashDataDisplay.class);    STALPortType stalPort;    String sessId; -    public WebServiceSignRequestHandler(STALPortType stalPort, String sessId) { +    public AppletHashDataDisplay(STALPortType stalPort, String sessId) {      if (stalPort == null || sessId == null) {        throw new NullPointerException("STAL port must not be null");      } @@ -159,6 +162,6 @@ public class WebServiceSignRequestHandler extends SignRequestHandler {        hashDataInputs.add(new ByteArrayHashDataInput(hdi, signedRefId, mimeType, encoding));      } -    gui.showHashDataInputDialog(hashDataInputs, this, "ok"); +    gui.showHashDataInputDialog(hashDataInputs, false, this, "ok");    }  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHelpListener.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHelpListener.java index 743dc7ef..5d199872 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHelpListener.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHelpListener.java @@ -18,45 +18,28 @@  package at.gv.egiz.bku.online.applet;  import at.gv.egiz.bku.gui.AbstractHelpListener; -import java.awt.Desktop; +import java.applet.AppletContext;  import java.net.URL;  import java.util.Locale;  /** - * Now uses java.awt.Desktop, which deprecates  - * the distinction between local and applet help listener - * TODO: integrate in AbstractHelpListener   *  - * @deprecated  - * @author clemens + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */  public class AppletHelpListener extends AbstractHelpListener { -//  protected AppletContext ctx; -  protected Desktop desktop; +  protected AppletContext ctx; -  public AppletHelpListener(URL helpURL, Locale locale) { +  public AppletHelpListener(AppletContext ctx, URL helpURL, Locale locale) {      super(helpURL, locale); -//    if (ctx == null) { -//      throw new RuntimeException("no applet context provided"); -//    } -//    this.ctx = ctx; -    if (Desktop.isDesktopSupported()) { -      this.desktop = Desktop.getDesktop(); +    if (ctx == null) { +      throw new RuntimeException("no applet context provided");      } +    this.ctx = ctx;    }    @Override    public void showDocument(URL helpDocument) throws Exception { -//    ctx.showDocument(helpDocument, "_blank"); -    if (desktop == null) { -      log.error("Failed to open default browser: Desktop API not available (libgnome installed?)"); -    } else { -      if (!desktop.isSupported(Desktop.Action.BROWSE)) { -        log.error("Failed to open default browser: The system provides the Desktop API, but does not support the BROWSE action"); -      } else { -        Desktop.getDesktop().browse(helpDocument.toURI()); -      } -    } +    ctx.showDocument(helpDocument, "_blank");    }  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BKUApplet.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BKUApplet.java index 829cc79d..9d640dee 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BKUApplet.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BKUApplet.java @@ -52,6 +52,8 @@ public class BKUApplet extends JApplet implements AppletParameterProvider {    public static final String REDIRECT_URL = "RedirectURL";    public static final String REDIRECT_TARGET = "RedirectTarget";    public static final String HASHDATA_DISPLAY_INTERNAL = "internal"; +  public static final String HASHDATA_DISPLAY_BROWSER = "browser"; +  public static final String HASHDATA_DISPLAY_FRAME = "frame";    /**     * STAL WSDL namespace and service name @@ -86,7 +88,7 @@ public class BKUApplet extends JApplet implements AppletParameterProvider {      AppletHelpListener helpListener = null;      try {        URL helpURL = getURLParameter(HELP_URL); //, getAppletParameter(SESSION_ID)); -      helpListener = new AppletHelpListener(helpURL, getLocale()); //getAppletContext(), +      helpListener = new AppletHelpListener(getAppletContext(), helpURL, getLocale());      } catch (MalformedURLException ex) {        log.warn("failed to load help URL, disabling help: " + ex.getMessage());      } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/ExternalDisplaySignRequestHandler.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BrowserHashDataDisplay.java index e4567a6c..c30921da 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/ExternalDisplaySignRequestHandler.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BrowserHashDataDisplay.java @@ -25,42 +25,28 @@ import org.apache.commons.logging.LogFactory;  import at.gv.egiz.bku.smccstal.SignRequestHandler;  import at.gv.egiz.stal.signedinfo.ReferenceType; -import java.awt.Desktop; +import java.applet.AppletContext;  /**   *   * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */ -public class ExternalDisplaySignRequestHandler extends SignRequestHandler { +public class BrowserHashDataDisplay extends SignRequestHandler { -  private static final Log log = LogFactory.getLog(ExternalDisplaySignRequestHandler.class); +  private static final Log log = LogFactory.getLog(BrowserHashDataDisplay.class); -//  AppletContext ctx; +  protected AppletContext ctx;    protected URL hashDataURL; -  protected Desktop desktop; -  public ExternalDisplaySignRequestHandler(URL hashDataURL) { -//    this.ctx = ctx; +  public BrowserHashDataDisplay(AppletContext ctx, URL hashDataURL) { +    this.ctx = ctx;      this.hashDataURL = hashDataURL; -    if (Desktop.isDesktopSupported()) { -      desktop = Desktop.getDesktop(); -    }    }    @Override    public void displayHashDataInputs(List<ReferenceType> signedReferences) throws Exception {      //TODO pass reference Id's to servlet (TODO servlet)      log.debug("displaying hashdata inputs at " + hashDataURL); -//    ctx.showDocument(hashDataURL, "_blank"); -    if (desktop == null) { -      log.error("Failed to open default browser: Desktop API not available (libgnome installed?)"); -    } else { -      if (!desktop.isSupported(Desktop.Action.BROWSE)) { -        log.error("Failed to open default browser: The system provides the Desktop API, but does not support the BROWSE action"); -      } else { -        Desktop.getDesktop().browse(hashDataURL.toURI()); -      } -    } +    ctx.showDocument(hashDataURL, "_blank");    } -  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/JDialogHashDataDisplay.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/JDialogHashDataDisplay.java new file mode 100644 index 00000000..1f0eda90 --- /dev/null +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/JDialogHashDataDisplay.java @@ -0,0 +1,221 @@ +/* + * 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.online.applet; + +import at.gv.egiz.bku.smccstal.SignRequestHandler; +import at.gv.egiz.stal.HashDataInput; +import at.gv.egiz.stal.impl.ByteArrayHashDataInput; +import at.gv.egiz.stal.service.GetHashDataInputFault; +import at.gv.egiz.stal.service.STALPortType; +import at.gv.egiz.stal.service.types.GetHashDataInputResponseType; +import at.gv.egiz.stal.service.types.GetHashDataInputType; +import at.gv.egiz.stal.signedinfo.ReferenceType; +import java.awt.Dimension; +import java.security.DigestException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class JDialogHashDataDisplay extends SignRequestHandler { + +  private static final Log log = LogFactory.getLog(JDialogHashDataDisplay.class); +  protected STALPortType stalPort; +  protected String sessId; +//  protected HashDataViewer viewer; +       +  public JDialogHashDataDisplay(STALPortType stalPort, String sessId, Dimension viewerSize, Locale locale) { +    if (stalPort == null || sessId == null) { +      throw new NullPointerException("STAL port must not be null"); +    } +    this.sessId = sessId; +    this.stalPort = stalPort; +//    this.viewer = new HashDataViewer(viewerSize, locale); +  } + +  @Override +  public void displayHashDataInputs(List<ReferenceType> signedReferences) throws DigestException, Exception { + +    List<GetHashDataInputResponseType.Reference> hdi = getHashDataInput(signedReferences); +    final List<HashDataInput> verifiedHashDataInputs = verifyHashDataInput(signedReferences, hdi); + +    if (verifiedHashDataInputs.size() > 1) { +      gui.showHashDataInputDialog(verifiedHashDataInputs, false, this, "ok"); +    } else if (verifiedHashDataInputs.size() == 1) { +      gui.showHashDataInputDialog(verifiedHashDataInputs, true, this, "ok"); +//      SwingUtilities.invokeLater(new Runnable() { +// +//        @Override +//        public void run() { +//          viewer.displayHashData(verifiedHashDataInputs.get(0)); +//        } +//      }); +       +    } else { +      log.error("No hashdata input to display"); +    } + +  } + +  /** +   * Get all hashdata inputs that contain an ID attribute and no Type attribute. +   * @param signedReferences +   * @return +   * @throws at.gv.egiz.stal.service.GetHashDataInputFault +   */ +  private List<GetHashDataInputResponseType.Reference> getHashDataInput(List<ReferenceType> signedReferences) throws GetHashDataInputFault, Exception { +    GetHashDataInputType request = new GetHashDataInputType(); +    request.setSessionId(sessId); + +//    HashMap<String, ReferenceType> idSignedRefMap = new HashMap<String, ReferenceType>(); +    for (ReferenceType signedRef : signedReferences) { +      //don't get Manifest, QualifyingProperties, ... +      if (signedRef.getType() == null) { +        String signedRefId = signedRef.getId(); +        if (signedRefId != null) { +          if (log.isTraceEnabled()) { +            log.trace("requesting hashdata input for reference " + signedRefId); +          } +//          idSignedRefMap.put(signedRefId, signedRef); +          GetHashDataInputType.Reference ref = new GetHashDataInputType.Reference(); +          ref.setID(signedRefId); +          request.getReference().add(ref); + +        } else { +          throw new Exception("Cannot resolve HashDataInput for reference without Id attribute"); +        } +      } +    } + +    if (log.isDebugEnabled()) { +      log.debug("WebService call GetHashDataInput for " + request.getReference().size() + " references in session " + sessId); +    } +    GetHashDataInputResponseType response = stalPort.getHashDataInput(request); +    return response.getReference(); +  } + +  /** +   * Verifies all signed references and returns STAL HashDataInputs +   * @param signedReferences +   * @param hashDataInputs +   * @return +   * @throws java.security.DigestException +   * @throws java.security.NoSuchAlgorithmException +   * @throws Exception if no hashdata input is provided for a signed reference +   */ +  private List<HashDataInput> verifyHashDataInput(List<ReferenceType> signedReferences, List<GetHashDataInputResponseType.Reference> hashDataInputs) throws DigestException, NoSuchAlgorithmException, Exception { + +    ArrayList<HashDataInput> verifiedHashDataInputs = new ArrayList<HashDataInput>(); + +    //hashdata inputs returned from service +//    HashMap<String, GetHashDataInputResponseType.Reference> idRefMap = new HashMap<String, GetHashDataInputResponseType.Reference>(); +//    for (GetHashDataInputResponseType.Reference hashDataInput : hashDataInputs) { +//      String id = hashDataInput.getID(); +//      byte[] hdi = hashDataInput.getValue(); +//      if (hdi == null) { +//        throw new Exception("Did not receive hashdata input for reference " + id); +//      } +//      idRefMap.put(id, hashDataInput); +//    } + +    for (ReferenceType signedRef : signedReferences) { +      if (signedRef.getType() == null) { +        log.info("Verifying digest for signed reference " + signedRef.getId()); + +        String signedRefId = signedRef.getId(); +        byte[] signedDigest = signedRef.getDigestValue(); +        String signedDigestAlg = null; +        if (signedRef.getDigestMethod() != null) { +          signedDigestAlg = signedRef.getDigestMethod().getAlgorithm(); +        } else { +          throw new NoSuchAlgorithmException("Failed to verify digest value for reference " + signedRefId + ": no digest algorithm"); +        } + +        GetHashDataInputResponseType.Reference hashDataInput = null; //idRefMap.get(signedRefId); +        for (GetHashDataInputResponseType.Reference hdi : hashDataInputs) { +          if (signedRefId.equals(hdi.getID())) { +            hashDataInput = hdi; +          } +        } +        if (hashDataInput == null) { +          throw new Exception("No hashdata input for reference " + signedRefId + " returned by service"); +        } + +        byte[] hdi = hashDataInput.getValue(); +        String mimeType = hashDataInput.getMimeType(); +        String encoding = hashDataInput.getEncoding(); + +        if (hdi == null) { +          throw new Exception("No hashdata input for reference " + signedRefId + " provided by service"); +        } +        if (log.isDebugEnabled()) { +          log.debug("Got HashDataInput " + signedRefId + " (" + mimeType + ";" + encoding + ")"); +        } + +        byte[] hashDataInputDigest = digest(hdi, signedDigestAlg); + +        if (log.isDebugEnabled()) { +          log.debug("Comparing digest values... "); +        } +        log.warn("DISABLED DIGEST VERIFICATION FOR DEBUGGING"); +//        if (!Arrays.equals(hashDataInputDigest, signedDigest)) { +//          log.error("Bad digest value for reference " + signedRefId); +//          throw new DigestException("Bad digest value for reference " + signedRefId); +//        } + +        verifiedHashDataInputs.add(new ByteArrayHashDataInput(hdi, signedRefId, mimeType, encoding)); +      } +    } +     +    return verifiedHashDataInputs; +  } + +  //TODO +  private byte[] digest(byte[] hashDataInput, String mdAlg) throws NoSuchAlgorithmException { +    if ("http://www.w3.org/2000/09/xmldsig#sha1".equals(mdAlg)) { +      mdAlg = "SHA-1"; +    } else if ("http://www.w3.org/2001/04/xmlenc#sha256".equals(mdAlg)) { +      mdAlg = "SHA-256"; +    } else if ("http://www.w3.org/2001/04/xmlenc#sha224".equals(mdAlg)) { +      mdAlg = "SHA-224"; +    } else if ("http://www.w3.org/2001/04/xmldsig-more#sha224".equals(mdAlg)) { +      mdAlg = "SHA-224"; +    } else if ("http://www.w3.org/2001/04/xmldsig-more#sha384".equals(mdAlg)) { +      mdAlg = "SHA-384"; +    } else if ("http://www.w3.org/2001/04/xmlenc#sha512".equals(mdAlg)) { +      mdAlg = "SHA-512"; +    } else if ("http://www.w3.org/2001/04/xmldsig-more#md2 ".equals(mdAlg)) { +      mdAlg = "MD2"; +    } else if ("http://www.w3.org/2001/04/xmldsig-more#md5".equals(mdAlg)) { +      mdAlg = "MD5"; +    } else if ("http://www.w3.org/2001/04/xmlenc#ripemd160 ".equals(mdAlg)) { +      mdAlg = "RipeMD-160"; +    } else { +      throw new NoSuchAlgorithmException("Failed to verify digest value: unsupported digest algorithm " + mdAlg); +    } + +    MessageDigest md = MessageDigest.getInstance(mdAlg); +    return md.digest(hashDataInput); +  } +} diff --git a/BKUApplet/src/main/resources/simplelog.properties b/BKUApplet/src/main/resources/simplelog.properties index d62508cf..51be76a8 100644 --- a/BKUApplet/src/main/resources/simplelog.properties +++ b/BKUApplet/src/main/resources/simplelog.properties @@ -15,7 +15,7 @@  # Logging detail level,  # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal"). -org.apache.commons.logging.simplelog.defaultlog=debug +org.apache.commons.logging.simplelog.defaultlog=trace  # Logs the Log instance used  org.apache.commons.logging.simplelog.showlogname=true  #Logs the class name with package(or Path) diff --git a/BKUApplet/src/test/resources/appletTest.html b/BKUApplet/src/test/resources/appletTest.html index 5aec1998..1ba88e47 100644 --- a/BKUApplet/src/test/resources/appletTest.html +++ b/BKUApplet/src/test/resources/appletTest.html @@ -20,11 +20,11 @@        <applet code="at.gv.egiz.bku.online.applet.BKUApplet.class"                archive="../BKUApplet-1.0-SNAPSHOT.jar, ../test-libs/commons-logging-1.1.1.jar , ../test-libs/iaik_jce_me4se-3.04.jar"                width=300 height=200> -              <param name="GuiStyle" value="advanced"/> +              <param name="GuiStyle" value="simple"/>                <param name="Background" value="http://localhost:3495/DemoIntegration/mocca_background.png"/>                <param name="WSDL_URL" value="http://localhost:3495/stal?wsdl"/>                <param name="HelpURL" value="http://localhost:3495/help/"/> -              <param name="HashDataDisplay" value="internal"/> +              <param name="HashDataDisplay" value="frame"/>                <!--param name="HashDataURL" value="http://localhost:3495/BKUOnline-1.0-SNAPSHOT/hashDataInput"/-->                <param name="SessionId" value="TestSession"/>                <param name="RedirectURL" value="http://localhost:3495/bkuResult"/> diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java index d96d22c8..d661c71a 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java @@ -814,7 +814,7 @@ public class BKUGUI implements BKUGUIFacade {      }      @Override -    public void showHashDataInputDialog(final List<HashDataInput> signedReferences, final ActionListener okListener, final String okCommand) { +    public void showHashDataInputDialog(final List<HashDataInput> signedReferences, boolean standalone, final ActionListener okListener, final String okCommand) {        if (signedReferences == null) {          showErrorDialog(messages.getString(ERR_NO_HASHDATA), new Object[] {"No SignedReferences provided"}, okListener, okCommand); diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java index ad489c2e..38638b5d 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java @@ -57,6 +57,7 @@ public interface BKUGUIFacade {      public static final String WINDOWTITLE_SAVE = "windowtitle.save";      public static final String WINDOWTITLE_SAVEDIR = "windowtitle.savedir";      public static final String WINDOWTITLE_OVERWRITE = "windowtitle.overwrite"; +    public static final String WINDOWTITLE_VIEWER = "windowtitle.viewer";      public static final String MESSAGE_WAIT = "message.wait";      public static final String MESSAGE_INSERTCARD = "message.insertcard";      public static final String MESSAGE_ENTERPIN = "message.enterpin"; @@ -77,12 +78,14 @@ public interface BKUGUIFacade {      public static final String HELP_RETRY = "help.retry";      public static final String HELP_HASHDATA = "help.hashdata";      public static final String HELP_HASHDATALIST = "help.hashdatalist"; +    public static final String HELP_HASHDATAVIEWER = "help.hashdataviewer";      public static final String BUTTON_OK = "button.ok";      public static final String BUTTON_CANCEL = "button.cancel";      public static final String BUTTON_BACK = "button.back";      public static final String BUTTON_SIGN = "button.sign";      public static final String BUTTON_SAVE = "button.save"; +    public static final String BUTTON_CLOSE = "button.close";      public static final String SAVE_HASHDATAINPUT_PREFIX = "save.hashdatainput.prefix"; @@ -116,7 +119,7 @@ public interface BKUGUIFacade {      public char[] getPin(); -    public void showHashDataInputDialog(List<HashDataInput> signedReferences, ActionListener okListener, String actionCommand); +    public void showHashDataInputDialog(List<HashDataInput> signedReferences, boolean standalone, ActionListener okListener, String actionCommand);  //    public void showPlainTextHashDataInputDialog(String text, ActionListener saveListener, String saveCommand, ActionListener cancelListener, String cancelCommand); diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataViewer.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataViewer.java new file mode 100644 index 00000000..3db06e19 --- /dev/null +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataViewer.java @@ -0,0 +1,260 @@ +/* + * 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.gui; + +import at.gv.egiz.stal.HashDataInput; +import java.awt.Component; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.InputStreamReader; +import java.io.Reader; +import java.text.MessageFormat; +import java.util.List; +import java.util.ResourceBundle; +import javax.swing.GroupLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.LayoutStyle; +import javax.swing.text.Document; +import javax.swing.text.EditorKit; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class HashDataViewer extends JDialog +        implements ActionListener, WindowListener { + +  public static final String PLAINTEXT_FONT = "Monospaced"; +     +  protected static final Log log = LogFactory.getLog(HashDataViewer.class); +  private static HashDataViewer dialog; + +  public static void showDialog(Component frameComp, List<HashDataInput> signedReferences, ResourceBundle messages, ActionListener saveListener, String saveCommand, HelpMouseListener helpListener) { +     +    log.info("******************* SHOW HASHDATA DIALOG"); +     +    Frame frame = JOptionPane.getFrameForComponent(frameComp); + +    dialog = new HashDataViewer(frame, signedReferences.get(0), messages, saveListener, saveCommand, helpListener); +    dialog.addWindowListener(dialog); +    dialog.setVisible(true); + +  } + +  private HashDataViewer(Frame frame, HashDataInput hashData, ResourceBundle messages, ActionListener saveListener, String saveCommand, HelpMouseListener helpListener) { +    super(frame, messages.getString(BKUGUIFacade.WINDOWTITLE_VIEWER), true); + +    JPanel viewerPanel = createViewerPanel(messages, hashData, helpListener); +    JPanel buttonPanel = createButtonPanel(messages, saveListener, saveCommand); + + +    Container contentPane = getContentPane(); +    contentPane.setPreferredSize(new Dimension(400, 300)); + +    GroupLayout mainLayout = new GroupLayout(contentPane); +    contentPane.setLayout(mainLayout); + +        mainLayout.setHorizontalGroup( +          mainLayout.createSequentialGroup() +            .addContainerGap() +            .addGroup( +              mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                .addComponent(viewerPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) +            .addContainerGap()); +        mainLayout.setVerticalGroup( +          mainLayout.createSequentialGroup() +            .addContainerGap() +            .addComponent(viewerPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  +            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)  +            .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +            .addContainerGap()); + +    pack(); +    setLocationRelativeTo(frame); +  } + +  private JPanel createViewerPanel(ResourceBundle messages, HashDataInput hashData, HelpMouseListener helpListener) { +    String mimeType = hashData.getMimeType(); +    String encoding = hashData.getEncoding(); + +    log.debug("display hashdata: " + mimeType + ";" + encoding); + +    if (mimeType == null) { +      mimeType = "text/plain"; +    } +    if (encoding == null) { +      encoding = "UTF-8"; +    } + +    JEditorPane viewer = new JEditorPane(); +    viewer.setEditable(false); +    viewer.setContentType(mimeType); +    if ("text/plain".equals(mimeType)) { +      viewer.setFont(new Font(PLAINTEXT_FONT, viewer.getFont().getStyle(), viewer.getFont().getSize())); +    } +     +    EditorKit editorKit = viewer.getEditorKit(); +    Document document = editorKit.createDefaultDocument(); + +    Reader reader; +    try { +      reader = new InputStreamReader(hashData.getHashDataInput(), encoding); +      viewer.read(reader, document); +    } catch (Exception ex) { +      String p = messages.getString(BKUGUIFacade.ERR_DISPLAY_HASHDATA); +      viewer.setText(MessageFormat.format(p, ex.getMessage())); +    } + +    JScrollPane scrollPane = new JScrollPane(viewer); +//    scrollPane.setPreferredSize(new Dimension(400, 300)); +    scrollPane.setPreferredSize(viewer.getPreferredSize()); +    scrollPane.setAlignmentX(LEFT_ALIGNMENT); + +    JLabel viewerTitle = new JLabel(); +    viewerTitle.setText(messages.getString(BKUGUIFacade.TITLE_HASHDATA)); +    viewerTitle.setFont(viewerTitle.getFont().deriveFont(viewerTitle.getFont().getStyle() | java.awt.Font.BOLD)); +    viewerTitle.setLabelFor(viewer); +     +    JLabel helpLabel = new JLabel(); +    helpListener.setHelpTopic(BKUGUIFacade.HELP_HASHDATAVIEWER); +    helpLabel.setIcon(new ImageIcon(getClass().getResource(BKUGUIFacade.HELP_IMG)));  +    helpLabel.addMouseListener(helpListener); +    helpLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); +         +    JPanel viewerPanel = new JPanel(); +    GroupLayout viewerPanelLayout = new GroupLayout(viewerPanel); +    viewerPanel.setLayout(viewerPanelLayout); + +    viewerPanelLayout.setHorizontalGroup( +     viewerPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +      .addGroup(viewerPanelLayout.createSequentialGroup() +        .addComponent(viewerTitle) +        .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +        .addComponent(helpLabel)) +      .addComponent(scrollPane)); //, 0, 0, Short.MAX_VALUE)); + +    viewerPanelLayout.setVerticalGroup( +      viewerPanelLayout.createSequentialGroup() +        .addGroup(viewerPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +          .addComponent(viewerTitle) +          .addComponent(helpLabel)) +        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +        .addComponent(scrollPane)); //, 0, 0, Short.MAX_VALUE)); +     +//    viewerPanel.setLayout(new BoxLayout(viewerPanel, BoxLayout.PAGE_AXIS)); +//    JLabel title = new JLabel(messages.getString(BKUGUIFacade.TITLE_HASHDATA)); +//    title.setLabelFor(viewer); +//    viewerPanel.add(title); +//    viewerPanel.add(Box.createRigidArea(new Dimension(0, 5))); +//    viewerPanel.add(scrollPane); +//    viewerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); +     +    return viewerPanel; +  } + +  private JPanel createButtonPanel(ResourceBundle messages, ActionListener saveListener, String saveCommand) { +    JButton closeButton = new JButton(); +    closeButton.setText(messages.getString(BKUGUIFacade.BUTTON_CLOSE)); +    closeButton.addActionListener(this); + +    JButton saveButton = new JButton(); +    saveButton.setText(messages.getString(BKUGUIFacade.BUTTON_SAVE)); +    saveButton.setActionCommand(saveCommand); +    saveButton.addActionListener(saveListener); + +    int buttonSize = closeButton.getPreferredSize().width; +    if (saveButton.getPreferredSize().width > buttonSize) { +      buttonSize = saveButton.getPreferredSize().width; +    } + +    JPanel buttonPanel = new JPanel(); +    GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +    buttonPanel.setLayout(buttonPanelLayout); + +    buttonPanelLayout.setHorizontalGroup( +            buttonPanelLayout.createSequentialGroup().addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(saveButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(closeButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +    buttonPanelLayout.setVerticalGroup( +            buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(saveButton).addComponent(closeButton)); + +    return buttonPanel; +  } + +  @Override +  public void actionPerformed(ActionEvent e) { +//    if ("close".equals(e.getActionCommand())) { +    HashDataViewer.dialog.setVisible(false); +//    HashDataViewer.dialog.dispose(); +  } + +  @Override +  public void windowOpened(WindowEvent e) { +    log.debug("WINDOW OPENED"); +  } + +  @Override +  public void windowClosing(WindowEvent e) { +    log.debug("WINDOW CLOSING"); +  } + +  @Override +  public void windowClosed(WindowEvent e) { +    log.debug("WINDOW CLOSED"); +  } + +  @Override +  public void windowIconified(WindowEvent e) { +    log.debug("WINDOW ICONIFIED"); +  } + +  @Override +  public void windowDeiconified(WindowEvent e) { +  } + +  @Override +  public void windowActivated(WindowEvent e) { +    log.debug("WINDOW ACTIVATED"); +  } + +  @Override +  public void windowDeactivated(WindowEvent e) { +    log.debug("WINDOW DEACTIVATED"); +  } + +   +   +  +   +   +   +} diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java index f2a8466b..583dae0f 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java @@ -882,14 +882,25 @@ public class SimpleGUI implements BKUGUIFacade {      }      @Override -    public void showHashDataInputDialog(final List<HashDataInput> signedReferences, final ActionListener okListener, final String okCommand) { +    public void showHashDataInputDialog(final List<HashDataInput> signedReferences, boolean standalone, final ActionListener okListener, final String okCommand) {        if (signedReferences == null) {          showErrorDialog(messages.getString(ERR_NO_HASHDATA), new Object[] {"No SignedReferences provided"}, okListener, okCommand);        }        if (signedReferences.size() == 1) { - +         +        if (standalone) { +          ActionListener saveHashDataListener = new ActionListener() { + +              @Override +              public void actionPerformed(ActionEvent e) { +                  showSaveHashDataInputDialog(signedReferences, okListener, okCommand); +              } +          }; +          showHashDataViewer(signedReferences, saveHashDataListener, "save"); +           +        } else {            if ("text/plain".equals(signedReferences.get(0).getMimeType())) {              ActionListener saveHashDataListener = new ActionListener() { @@ -910,7 +921,7 @@ public class SimpleGUI implements BKUGUIFacade {            } else {              showSaveHashDataInputDialog(signedReferences, okListener, okCommand);            } -           +        }        } else {          final HashDataTableModel tableModel = new HashDataTableModel(signedReferences); @@ -926,6 +937,27 @@ public class SimpleGUI implements BKUGUIFacade {        }      } +    /** +     * TODO  +     * @param hashDataText +     * @param saveListener +     * @param saveCommand +     */ +    private void showHashDataViewer(final List<HashDataInput> signedReferences, final ActionListener saveListener, final String saveCommand) { +      log.debug("scheduling plaintext hashdatainput dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show plaintext hashdatainput dialog"); +       +          HashDataViewer.showDialog(contentPane, signedReferences, messages, saveListener, saveCommand, helpListener); +        } +      }); +    } +          private void showPlainTextHashDataInputDialog(final String hashDataText, final ActionListener saveListener, final String saveCommand, final ActionListener cancelListener, final String cancelCommand) {        log.debug("scheduling plaintext hashdatainput dialog"); diff --git a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties index 2dc03491..c47242b2 100644 --- a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties +++ b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties @@ -25,6 +25,7 @@ title.hashdata=<html>Signaturdaten</html>  windowtitle.save=Signaturdaten speichern  windowtitle.savedir=Signaturdaten in Verzeichnis speichern  windowtitle.overwrite=Datei \u00FCberschreiben? +windowtitle.viewer=Signaturedaten  message.wait=<html>Bitte warten...</html>  message.insertcard=<html>Bitte die B\u00FCrgerkarte in den Kartenleser stecken</html>  message.enterpin=<html>{0} eingeben</html> @@ -40,6 +41,7 @@ button.cancel=Abbrechen  button.back=Zur\u00FCck  button.sign=Signieren  button.save=Speichern... +button.close=Schlie\u00DFen  mimetype.desc.xml=XML-Dateien (.xml)  mimetype.desc.html=HTML-Dateien (.html, .htm)  mimetype.desc.xhtml=XHTML-Dateien (.xhtml) diff --git a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties index 3b8ac1bc..c7cc9084 100644 --- a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties +++ b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties @@ -25,6 +25,7 @@ title.hashdata=<html>Signature data</html>  windowtitle.save=Save signature data  windowtitle.savedir=Save signature data to directory  windowtitle.overwrite=Overwrite file? +windowtitle.viewer=Signature data  message.wait=<html>Please wait...</html>  message.insertcard=<html>Please insert your citizen-card into the reader</html>  message.enterpin=<html>Enter {0}</html> @@ -40,6 +41,7 @@ button.cancel=Cancel  button.back=Back  button.sign=Sign  button.save=Save... +button.close=Close  mimetype.desc.xml=XML-files (.xml)  mimetype.desc.html=HTML-files (.html, .htm)  mimetype.desc.xhtml=XHTML-files (.xhtml) diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/gui/LocalHelpListener.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/gui/LocalHelpListener.java index 2251a474..e32c9c3d 100644 --- a/BKULocal/src/main/java/at/gv/egiz/bku/local/gui/LocalHelpListener.java +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/gui/LocalHelpListener.java @@ -25,7 +25,6 @@ import java.util.Locale;  /**   * - * @deprecated see AppletHelpListener   * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */  public class LocalHelpListener extends AbstractHelpListener { diff --git a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/LocalSignRequestHandler.java b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/LocalSignRequestHandler.java index 19a56502..19e6a657 100644 --- a/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/LocalSignRequestHandler.java +++ b/BKULocal/src/main/java/at/gv/egiz/bku/local/stal/LocalSignRequestHandler.java @@ -53,7 +53,7 @@ public class LocalSignRequestHandler extends SignRequestHandler {     */    @SuppressWarnings("unchecked")    @Override -  public STALResponse handleRequest(STALRequest request) { +  public STALResponse handleRequest(STALRequest request) throws InterruptedException {      if (request instanceof SignRequest) {        SignRequest signReq = (SignRequest) request;        hashDataInputs = signReq.getHashDataInput(); @@ -109,7 +109,7 @@ public class LocalSignRequestHandler extends SignRequestHandler {        log.error("dsig:SignedInfo does not contain a data reference");        throw new Exception("dsig:SignedInfo does not contain a data reference");      } -    gui.showHashDataInputDialog(selectedHashDataInputs, this, "ok"); +    gui.showHashDataInputDialog(selectedHashDataInputs, false, this, "ok");    }    private ByteArrayHashDataInput getByteArrayHashDataInput(HashDataInput hashDataInput) throws IOException { diff --git a/BKUOnline/src/main/webapp/HTTP-ohne.html b/BKUOnline/src/main/webapp/HTTP-ohne.html index 47c059f2..112a1d92 100644 --- a/BKUOnline/src/main/webapp/HTTP-ohne.html +++ b/BKUOnline/src/main/webapp/HTTP-ohne.html @@ -99,8 +99,9 @@ legend {  </p>  <p>  	<label for="appletHashDataDisplay">HashData Display</label>  -	<input type="radio" name="appletHashDataDisplay" value="external" checked="checked">external -	<input type="radio" name="appletHashDataDisplay" value="internal">internal +    <input type="radio" name="appletHashDataDisplay" value="frame" checked="checked">Frame +    <input type="radio" name="appletHashDataDisplay" value="browser">Browser +	<input type="radio" name="appletHashDataDisplay" value="internal">Applet  </p>  <!--  diff --git a/BKUOnline/src/main/webapp/appletPage.jsp b/BKUOnline/src/main/webapp/appletPage.jsp index 55b84231..51ab0006 100644 --- a/BKUOnline/src/main/webapp/appletPage.jsp +++ b/BKUOnline/src/main/webapp/appletPage.jsp @@ -50,11 +50,11 @@  			height :<%=height%>  		};  		var parameters = { -            GuiStyle : '<%=guiStyle%>', +                        GuiStyle : '<%=guiStyle%>',  			Background : '<%=backgroundImg%>',  			WSDL_URL :'../stal?wsdl',                          HelpURL : '../help/', -                        HashDataDisplay : <%=hashDataDisplay%>, +                        HashDataDisplay : '<%=hashDataDisplay%>',                          HashDataURL : '../hashDataInput',  			SessionID : '<%=session.getId()%>',  			RedirectURL : '../bkuResult' | 
