diff options
24 files changed, 919 insertions, 797 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 8e88c012..db88c037 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 @@ -195,7 +195,8 @@ 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 AppletHashDataDisplay(stalPort, sessionId)); +      AppletHashDataDisplay handler = new AppletHashDataDisplay(stalPort, sessionId, AppletHashDataDisplay.DISPLAY.applet); +      addRequestHandler(SignRequest.class, handler);      } else if (BKUApplet.HASHDATA_DISPLAY_BROWSER.equals(hashDataDisplayStyle)) {        URL hashDataURL = params.getURLParameter(BKUApplet.HASHDATA_URL, sessionId);        log.debug("register SignRequestHandler for HashDataURL " + hashDataURL); @@ -203,7 +204,8 @@ public class AppletBKUWorker extends AbstractBKUWorker implements Runnable {      } 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)); +      AppletHashDataDisplay handler = new AppletHashDataDisplay(stalPort, sessionId, AppletHashDataDisplay.DISPLAY.frame); +      addRequestHandler(SignRequest.class, handler);      }    }  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java index b77485d9..29a60f1d 100644 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/AppletHashDataDisplay.java @@ -14,9 +14,9 @@   * 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.gui.BKUGUIFacade;  import java.security.DigestException;  import java.security.MessageDigest;  import java.util.ArrayList; @@ -30,39 +30,69 @@ import org.apache.commons.logging.LogFactory;  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.DigestMethodType;  import at.gv.egiz.stal.signedinfo.ReferenceType; +import java.security.NoSuchAlgorithmException;  /** - * A SignRequesthandler displaying hashdata inputs in the applet  - * (only plaintext data is displayed, other hashdata inputs may be saved to disk). + * A SignRequesthandler that obtains hashdata inputs from a STAL webservice and + * displays these either within the applet or in a separate frame. + * The internal viewer displays plaintext data only, other mimetypes can be saved to disk. + * The standalone (frame) viewer displays all mimetypes. + *  + * (This class depends on STALService and therefore is not part of BKUCommonGUI.)   *    * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */  public class AppletHashDataDisplay extends SignRequestHandler { +  public static enum DISPLAY { +    applet, frame +  }    private static final Log log = LogFactory.getLog(AppletHashDataDisplay.class); -  STALPortType stalPort; -  String sessId; +  protected STALPortType stalPort; +  protected String sessId; +  protected DISPLAY display; -    public AppletHashDataDisplay(STALPortType stalPort, String sessId) { +  public AppletHashDataDisplay(STALPortType stalPort, String sessId, DISPLAY display) {      if (stalPort == null || sessId == null) {        throw new NullPointerException("STAL port must not be null");      }      this.sessId = sessId;      this.stalPort = stalPort; +    this.display = display;    }    @Override -  public void displayHashDataInputs(List<ReferenceType> signedReferences) throws Exception { -   +  public void displayHashDataInputs(List<ReferenceType> signedReferences) throws DigestException, Exception { + +    List<GetHashDataInputResponseType.Reference> hdi = getHashDataInput(signedReferences); +    List<HashDataInput> verifiedHashDataInputs = verifyHashDataInput(signedReferences, hdi); + +    if (verifiedHashDataInputs.size() > 1) { +      gui.showHashDataInputDialog(verifiedHashDataInputs, false, this, "ok"); +    } else if (verifiedHashDataInputs.size() == 1) { +      gui.showHashDataInputDialog(verifiedHashDataInputs, display==DISPLAY.frame, this, "ok"); +    } else { +      throw new Exception("No signature data (apart from any QualifyingProperties or a Manifest)"); +    } +  } + +  /** +   * Get all hashdata inputs that contain an ID attribute but 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>(); +//    HashMap<String, ReferenceType> idSignedRefMap = new HashMap<String, ReferenceType>();      for (ReferenceType signedRef : signedReferences) {        //don't get Manifest, QualifyingProperties, ...        if (signedRef.getType() == null) { @@ -71,97 +101,116 @@ public class AppletHashDataDisplay extends SignRequestHandler {            if (log.isTraceEnabled()) {              log.trace("requesting hashdata input for reference " + signedRefId);            } -          idSignedRefMap.put(signedRefId, signedRef); +//          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"); +          throw new Exception("Cannot resolve signature data for dsig:Reference without Id attribute");          }        }      }      if (log.isDebugEnabled()) { -      log.debug("Calling GetHashDataInput for " + request.getReference().size() + " references in session " + sessId); +      log.debug("WebService call GetHashDataInput for " + request.getReference().size() + " references in session " + sessId);      }      GetHashDataInputResponseType response = stalPort.getHashDataInput(request); -    ArrayList<HashDataInput> hashDataInputs = new ArrayList<HashDataInput>(); - -    //hashdata inputs returned from service -    HashMap<String, GetHashDataInputResponseType.Reference> idRefMap = new HashMap<String, GetHashDataInputResponseType.Reference>(); -    for (GetHashDataInputResponseType.Reference reference : response.getReference()) { -      String id = reference.getID(); -      byte[] hdi = reference.getValue(); -      if (hdi == null) { -        throw new Exception("Did not receive hashdata input for reference " + id); +    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>(); + +    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"); +        } + +        // usually, there is just one item here +        GetHashDataInputResponseType.Reference hashDataInput = null; +        for (GetHashDataInputResponseType.Reference hdi : hashDataInputs) { +          if (signedRefId.equals(hdi.getID())) { +            hashDataInput = hdi; +            break; +          } +        } +        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 HASHDATA VERIFICATION"); +        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));        } -      idRefMap.put(id, reference);      } -    for (String signedRefId : idSignedRefMap.keySet()) { -      log.info("validating hashdata input for reference " + signedRefId); -       -      GetHashDataInputResponseType.Reference reference = idRefMap.get(signedRefId); -      if (reference == null) { -        throw new Exception("No hashdata input for reference " + signedRefId + " returned by service"); -      } -       -//    } -//     -//    for (GetHashDataInputResponseType.Reference reference : response.getReference()) { -// -//      String id = reference.getID(); -      byte[] hdi = reference.getValue(); -      String mimeType = reference.getMimeType(); -      String encoding = reference.getEncoding(); - -      if (hdi == null) { -        throw new Exception("No hashdata input provided for reference " + signedRefId); -      } -      if (log.isDebugEnabled()) { -        log.debug("Got HashDataInput " + signedRefId + " (" + mimeType + ";" + encoding + ")"); -      } +    return verifiedHashDataInputs; +  } -      ReferenceType dsigRef = idSignedRefMap.get(signedRefId); -      DigestMethodType dm = dsigRef.getDigestMethod(); -       -      if (dm == null) { -        throw new Exception("Failed to verify digest value for reference " + signedRefId + ": no digest algorithm"); -      } -      String mdAlg = dm.getAlgorithm(); -      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 Exception("Failed to verify digest value for reference " + signedRefId + ": unsupported digest algorithm " + mdAlg); -      } -      MessageDigest md = MessageDigest.getInstance(mdAlg); -      byte[] hdiDigest = md.digest(hdi); -      if (log.isDebugEnabled()) -        log.debug("Comparing digest values... ");  -      if (!Arrays.equals(hdiDigest, dsigRef.getDigestValue())) { -        log.error("digest values differ: " + new String(hdiDigest) + ", " + new String(dsigRef.getDigestValue())); -        throw new DigestException("Bad digest value for reference " + signedRefId + ": " + new String(dsigRef.getDigestValue())); -      } -      hashDataInputs.add(new ByteArrayHashDataInput(hdi, signedRefId, mimeType, encoding)); +  //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);      } -     -    gui.showHashDataInputDialog(hashDataInputs, false, this, "ok"); + +    MessageDigest md = MessageDigest.getInstance(mdAlg); +    return md.digest(hashDataInput);    }  } 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 9d640dee..b4407b22 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 @@ -16,6 +16,7 @@   */  package at.gv.egiz.bku.online.applet; +import at.gv.egiz.bku.gui.AbstractHelpListener;  import java.net.MalformedURLException;  import java.net.URL;  import java.util.Locale; @@ -85,10 +86,11 @@ public class BKUApplet extends JApplet implements AppletParameterProvider {      String locale = getAppletParameter(LOCALE_PARAM_KEY);      String guiStyle = getAppletParameter(GUI_STYLE);      URL backgroundImgURL = null; -    AppletHelpListener helpListener = null; +    AbstractHelpListener helpListener = null;      try {        URL helpURL = getURLParameter(HELP_URL); //, getAppletParameter(SESSION_ID)); -      helpListener = new AppletHelpListener(getAppletContext(), helpURL, getLocale()); +//      helpListener = new BrowserHelpListener(getAppletContext(), helpURL, getLocale()); +      helpListener = new DefaultHelpListener(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/AppletHelpListener.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/BrowserHelpListener.java index 5d199872..265acca0 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/BrowserHelpListener.java @@ -26,11 +26,11 @@ import java.util.Locale;   *    * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */ -public class AppletHelpListener extends AbstractHelpListener { +public class BrowserHelpListener extends AbstractHelpListener {    protected AppletContext ctx; -  public AppletHelpListener(AppletContext ctx, URL helpURL, Locale locale) { +  public BrowserHelpListener(AppletContext ctx, URL helpURL, Locale locale) {      super(helpURL, locale);      if (ctx == null) {        throw new RuntimeException("no applet context provided"); @@ -39,7 +39,7 @@ public class AppletHelpListener extends AbstractHelpListener {    }    @Override -  public void showDocument(URL helpDocument) throws Exception { +  public void showDocument(URL helpDocument, String helpTopic) throws Exception {      ctx.showDocument(helpDocument, "_blank");    }  } diff --git a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/DefaultHelpListener.java b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/DefaultHelpListener.java new file mode 100644 index 00000000..9876ef7e --- /dev/null +++ b/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/DefaultHelpListener.java @@ -0,0 +1,77 @@ +/* + * 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.gui.AbstractHelpListener; +import at.gv.egiz.bku.gui.ViewerDialog; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Locale; +import javax.swing.SwingUtilities; + +/** + * This class depends on BKU utils, and therefore is not part of BKUCommonGUI + *  + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class DefaultHelpListener extends AbstractHelpListener { + +  public DefaultHelpListener(URL helpURL, Locale locale) { +    super(helpURL, locale); +  } + +  @Override +  public void showDocument(URL helpURL, final String helpTopic) throws Exception { +    log.debug("open connection " + helpURL); +    URLConnection conn = helpURL.openConnection(); +     +    log.debug("show help document " + conn.getContentType()); // + ";" + conn.getContentEncoding()); +     +//    Charset cs; +//    if (conn.getContentEncoding() == null) { +//      cs = Charset.forName("UTF-8"); +//    } else { +//      try { +//        cs = Charset.forName(conn.getContentEncoding()); +//      } catch (Exception ex) { +//        log.debug("charset " + conn.getContentEncoding() + " not supported, assuming UTF-8: " + ex.getMessage()); +//        cs = Charset.forName("UTF-8"); +//      }   +//    } +     +//    InputStreamReader isr = new InputStreamReader(conn.getInputStream(), cs); +//    final Reader content = new BufferedReader(isr); +    final InputStream content = conn.getInputStream(); +    final String mimeType = conn.getContentType(); +       +    log.debug("schedule help dialog"); +     +    SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show help dialog"); +           +          ViewerDialog.showHelp(null, helpTopic, content, mimeType, messages); +       +        } +      }); +//    gui.showHelpDialog(helpDocument.getStream(), mimetype, encoding); +  } +} 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 deleted file mode 100644 index 1f0eda90..00000000 --- a/BKUApplet/src/main/java/at/gv/egiz/bku/online/applet/JDialogHashDataDisplay.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2008 Federal Chancellery Austria and - * Graz University of Technology - *  - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *  - *     http://www.apache.org/licenses/LICENSE-2.0 - *  - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package at.gv.egiz.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/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java index a249a376..f46f5227 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java @@ -14,7 +14,6 @@   * See the License for the specific language governing permissions and   * limitations under the License.   */ -  package at.gv.egiz.bku.gui;  import java.awt.event.ActionEvent; @@ -22,19 +21,24 @@ import java.awt.event.ActionListener;  import java.net.MalformedURLException;  import java.net.URL;  import java.util.Locale; +import java.util.ResourceBundle;  import org.apache.commons.logging.Log;  import org.apache.commons.logging.LogFactory;  /** - * + * Implement the showDocument(URL) method to provide an actual HelpListener. + * This class does not keep a GUI reference and subclasses should not interfere with the GUI. + * Therefore, any errors occurring in showDocument() should be handled/displayed within + * showDocument() and exceptions thrown from showDocument() are logged, not displayed in the GUI. + *    * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>   */  public abstract class AbstractHelpListener implements ActionListener {    protected final static Log log = LogFactory.getLog(AbstractHelpListener.class); -//  protected String helpURLBase;    protected URL baseURL;    protected Locale locale; +  protected ResourceBundle messages;    public AbstractHelpListener(URL baseURL, Locale locale) {      if (baseURL == null || "".equals(baseURL)) { @@ -42,6 +46,11 @@ public abstract class AbstractHelpListener implements ActionListener {      }      this.baseURL = baseURL;      this.locale = locale; +    if (locale != null) { +      messages = ResourceBundle.getBundle(BKUGUIFacade.MESSAGES_BUNDLE, locale); +    } else { +      messages = ResourceBundle.getBundle(BKUGUIFacade.MESSAGES_BUNDLE); +    }    }    @Override @@ -49,30 +58,36 @@ public abstract class AbstractHelpListener implements ActionListener {      log.debug("received help action: " + e.getActionCommand());      URL helpURL = constructHelpURL(baseURL, e.getActionCommand());      try { -      showDocument(helpURL); +      showDocument(helpURL, e.getActionCommand());      } catch (Exception ex) {        log.error("could not display help document " + helpURL + ": " + ex.getMessage());      }    } -   -  private URL constructHelpURL(URL baseURL, String helpItem) { + +  private URL constructHelpURL(URL baseURL, String helpTopic) {      URL helpURL = baseURL;      log.trace("constructing help URL: " + helpURL);      try {        if (locale != null) {          helpURL = new URL(helpURL, locale.toString() + "/");          log.trace("constructing help URL: " + helpURL); -      }  -      if (helpItem != null && !"".equals(helpItem)) { -        helpURL = new URL(helpURL, helpItem + ".html"); +      } +      if (helpTopic != null && !"".equals(helpTopic)) { +        helpURL = new URL(helpURL, helpTopic + ".html");          log.trace("constructing help URL: " + helpURL);        }      } catch (MalformedURLException ex) { -      log.error("Failed to construct help URL for help item " + helpItem + ": " + ex.getMessage()); +      log.error("Failed to construct help URL for help item " + helpTopic + ": " + ex.getMessage());      }      return helpURL;    } -   -  public abstract void showDocument(URL helpDocument) throws Exception; -   + +  /** +   * Errors from HelpListeners should not (are not) displayed in the applet,  +   * but should rather be in the HelpListener specific way. +   * Therefore, implementations SHOULD NOT throw exceptions (these are only logged). +   * @param helpDocument +   * @throws java.lang.Exception +   */ +  public abstract void showDocument(URL helpDocument, String helpTopic) throws Exception;  } 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 38638b5d..2daf3300 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 @@ -1,20 +1,19 @@  /* -* 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. -*/ - + * 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; @@ -27,7 +26,7 @@ import java.util.List;  import java.util.Locale;  public interface BKUGUIFacade { -   +    public static final String ERR_UNKNOWN = "error.unknown";    public static final String ERR_SERVICE_UNREACHABLE = "error.ws.unreachable";    public static final String ERR_NO_PCSC = "error.pcsc"; @@ -38,92 +37,108 @@ public interface BKUGUIFacade {    public static final String ERR_INVALID_HASH = "error.invalid.hash";    public static final String ERR_CARD_LOCKED = "error.card.locked";    public static final String ERR_CARD_NOTACTIVATED = "error.card.notactivated"; +  public static final String ERR_VIEWER = "error.viewer"; -    public static final String MESSAGES_BUNDLE = "at/gv/egiz/bku/gui/Messages"; -    public static final String DEFAULT_BACKGROUND = "/images/BackgroundChipperling.png"; -    public static final String HELP_IMG = "/images/help.png"; -    public static final String HASHDATA_FONT = "Monospaced"; -    public static final Color ERROR_COLOR = Color.RED; -    public static final Color HYPERLINK_COLOR = Color.BLUE; -    public static final String TITLE_WELCOME = "title.welcome"; -    public static final String TITLE_INSERTCARD = "title.insertcard"; -    public static final String TITLE_CARD_NOT_SUPPORTED = "title.cardnotsupported"; -    public static final String TITLE_CARDPIN = "title.cardpin"; -    public static final String TITLE_SIGN = "title.sign"; -    public static final String TITLE_ERROR = "title.error"; -    public static final String TITLE_RETRY = "title.retry"; -    public static final String TITLE_WAIT = "title.wait"; -    public static final String TITLE_HASHDATA = "title.hashdata"; -    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"; -    public static final String MESSAGE_HASHDATALINK = "message.hashdatalink"; -    public static final String MESSAGE_HASHDATA = "message.hashdata"; -    public static final String MESSAGE_HASHDATALIST = "message.hashdatalist"; -    public static final String MESSAGE_RETRIES = "message.retries"; -    public static final String MESSAGE_OVERWRITE = "message.overwrite"; -    public static final String LABEL_PIN = "label.pin"; -    public static final String LABEL_PINSIZE = "label.pinsize"; +  public static final String MESSAGES_BUNDLE = "at/gv/egiz/bku/gui/Messages"; +  public static final String DEFAULT_BACKGROUND = "/images/BackgroundChipperling.png"; +  public static final String HELP_IMG = "/images/help.png"; +  public static final String HASHDATA_FONT = "Monospaced"; +  public static final Color ERROR_COLOR = Color.RED; +  public static final Color HYPERLINK_COLOR = Color.BLUE; +  public static final String TITLE_WELCOME = "title.welcome"; +  public static final String TITLE_INSERTCARD = "title.insertcard"; +  public static final String TITLE_CARD_NOT_SUPPORTED = "title.cardnotsupported"; +  public static final String TITLE_CARDPIN = "title.cardpin"; +  public static final String TITLE_SIGN = "title.sign"; +  public static final String TITLE_ERROR = "title.error"; +  public static final String TITLE_RETRY = "title.retry"; +  public static final String TITLE_WAIT = "title.wait"; +  public static final String TITLE_HASHDATA = "title.hashdata"; +  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 WINDOWTITLE_HELP = "windowtitle.help"; +  public static final String MESSAGE_WAIT = "message.wait"; +  public static final String MESSAGE_INSERTCARD = "message.insertcard"; +  public static final String MESSAGE_ENTERPIN = "message.enterpin"; +  public static final String MESSAGE_HASHDATALINK = "message.hashdatalink"; +  public static final String MESSAGE_HASHDATA = "message.hashdata"; +  public static final String MESSAGE_HASHDATALIST = "message.hashdatalist"; +  public static final String MESSAGE_RETRIES = "message.retries"; +  public static final String MESSAGE_OVERWRITE = "message.overwrite"; +  public static final String MESSAGE_HELP = "message.help"; +  public static final String LABEL_PIN = "label.pin"; +  public static final String LABEL_PINSIZE = "label.pinsize";  //    public static final String ERROR_NO_HASHDATA = "error.no.hashdata"; -    public static final String HELP_WELCOME = "help.welcome"; -    public static final String HELP_WAIT = "help.wait"; -    public static final String HELP_CARDNOTSUPPORTED = "help.cardnotsupported"; -    public static final String HELP_INSERTCARD = "help.insertcard"; -    public static final String HELP_CARDPIN = "help.cardpin"; -    public static final String HELP_SIGNPIN = "help.signpin"; -    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"; -     -     -    public void init(Container contentPane, Locale locale, URL background, ActionListener helpListener); -     -    /** -     *  -     * @return the locale of the message bundle (what if no message bundle could be loaded for the requested locale?) -     */ -    public Locale getLocale(); -     -    public void showWelcomeDialog(); -     -    /** -     *  -     * @param waitMessage if null, a simple 'wait' text is displayed -     */ -    public void showWaitDialog(String waitMessage); - -    public void showInsertCardDialog(ActionListener cancelListener, String actionCommand); -     -    public void showCardNotSupportedDialog(ActionListener cancelListener, String actionCommand); -     -    public void showCardPINDialog(PINSpec pinSpec, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand); -     -    public void showCardPINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand); -     -    public void showSignaturePINDialog(PINSpec pinSpec, ActionListener signListener, String signCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand); -     -    public void showSignaturePINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand); -     -    public char[] getPin(); -     -    public void showHashDataInputDialog(List<HashDataInput> signedReferences, boolean standalone, ActionListener okListener, String actionCommand); -     +  public static final String HELP_WELCOME = "help.welcome"; +  public static final String HELP_WAIT = "help.wait"; +  public static final String HELP_CARDNOTSUPPORTED = "help.cardnotsupported"; +  public static final String HELP_INSERTCARD = "help.insertcard"; +  public static final String HELP_CARDPIN = "help.cardpin"; +  public static final String HELP_SIGNPIN = "help.signpin"; +  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"; + +  public void init(Container contentPane, Locale locale, URL background, ActionListener helpListener); + +  /** +   *  +   * @return the locale of the message bundle (what if no message bundle could be loaded for the requested locale?) +   */ +  public Locale getLocale(); + +  public void showWelcomeDialog(); + +  /** +   *  +   * @param waitMessage if null, a simple 'wait' text is displayed +   */ +  public void showWaitDialog(String waitMessage); + +  public void showInsertCardDialog(ActionListener cancelListener, String actionCommand); + +  public void showCardNotSupportedDialog(ActionListener cancelListener, String actionCommand); + +  public void showCardPINDialog(PINSpec pinSpec, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand); + +  public void showCardPINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand); + +  public void showSignaturePINDialog(PINSpec pinSpec, ActionListener signListener, String signCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand); + +  public void showSignaturePINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand); + +  public char[] getPin(); + +  /** +   * TODO move to HashDataDisplay implementations +   * @param signedReferences +   * @param externalDisplay +   * @param okListener +   * @param okCommand +   */ +  public void showHashDataInputDialog(List<HashDataInput> signedReferences, boolean externalDisplay, ActionListener okListener, String okCommand); + +  /** +   * TODO pull out from BKUGUIFacade. (or make this strictly an applet internal version) +   * Problem: if standalone flag is provided, we also need the actionlistener.. +   * @param helpDocument +   * @param mimeType +   * @param encoding +   */ +//  public void showHelpDialog(InputStream helpDocument, String mimeType, String encoding); //, boolean standalone); //, ActionListener okListener, String okCommand);  +  //    public void showPlainTextHashDataInputDialog(String text, ActionListener saveListener, String saveCommand, ActionListener cancelListener, String cancelCommand); -     -    public void showErrorDialog(String errorMsgKey, Object[] errorMsgParams, ActionListener okListener, String actionCommand); -     -    public void showErrorDialog(String errorMsgKey, Object[] errorMsgParams); +  public void showErrorDialog(String errorMsgKey, Object[] errorMsgParams, ActionListener okListener, String actionCommand); + +  public void showErrorDialog(String errorMsgKey, Object[] errorMsgParams);  } diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java index aea85523..e8566fa6 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java @@ -64,13 +64,5 @@ class HashDataTableModel extends DefaultTableModel {        }      }      return selection; -  }//        public List<String> getSelectedReferenceIds() { -//            ArrayList<String> selection = new ArrayList<String>(); -//            for (Object row : dataVector) { -//                if ((Boolean) ((Vector) row).elementAt(1)) { -//                    selection.add((String) ((Vector) row).elementAt(0)); -//                } -//            } -//            return selection; -//        } +  }  }
\ No newline at end of file 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 deleted file mode 100644 index 3db06e19..00000000 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataViewer.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright 2008 Federal Chancellery Austria and - * Graz University of Technology - *  - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *  - *     http://www.apache.org/licenses/LICENSE-2.0 - *  - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package at.gv.egiz.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/HyperLinkRenderer.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperLinkRenderer.java new file mode 100644 index 00000000..d9606177 --- /dev/null +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperLinkRenderer.java @@ -0,0 +1,47 @@ +/* + * 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.Color; +import java.awt.Component; +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.TableCellRenderer; + +/** + *  + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class HyperLinkRenderer extends JLabel implements TableCellRenderer { + +  @Override +  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { +    HashDataInput hdi = (HashDataInput) value; +    setText(hdi.getReferenceId() + " (" + hdi.getMimeType() + ")"); +    setBackground(Color.CYAN); +    return this; +  } +         +//        extends DefaultTableCellRenderer { +// +//  @Override +//  public void setValue(Object value) { +//    HashDataInput hdi = (HashDataInput) value; +//    setText(hdi.getReferenceId() + " (" + hdi.getMimeType() + ")"); +//  } +} 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 583dae0f..6250dd0e 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 @@ -83,7 +83,7 @@ public class SimpleGUI implements BKUGUIFacade {      protected int buttonSize; -    private static final int CHECKBOX_WIDTH = new JCheckBox().getPreferredSize().width; +//    private static final int CHECKBOX_WIDTH = new JCheckBox().getPreferredSize().width;      /**       * @param contentPane @@ -924,16 +924,17 @@ public class SimpleGUI implements BKUGUIFacade {          }        } else { -        final HashDataTableModel tableModel = new HashDataTableModel(signedReferences); - -        ActionListener saveHashDataListener = new ActionListener() { - -            @Override -            public void actionPerformed(ActionEvent e) { -              showSaveHashDataInputDialog(tableModel.getSelectedHashData(), okListener, okCommand); -            } -        }; -        showMultipleHashDataInputDialog(tableModel, okListener, okCommand, saveHashDataListener, "save"); +        SimpleHashDataTableModel tableModel = new SimpleHashDataTableModel(signedReferences); +//        final HashDataTableModel tableModel = new HashDataTableModel(signedReferences); +// +//        ActionListener saveHashDataListener = new ActionListener() { +// +//            @Override +//            public void actionPerformed(ActionEvent e) { +//              showSaveHashDataInputDialog(tableModel.getSelectedHashData(), okListener, okCommand); +//            } +//        }; +        showMultipleHashDataInputDialog(tableModel, okListener, okCommand);        }      } @@ -953,7 +954,7 @@ public class SimpleGUI implements BKUGUIFacade {            log.debug("show plaintext hashdatainput dialog"); -          HashDataViewer.showDialog(contentPane, signedReferences, messages, saveListener, saveCommand, helpListener); +          ViewerDialog.showHashDataInput(contentPane, signedReferences, messages, saveListener, saveCommand, helpListener);          }        });      } @@ -1052,7 +1053,8 @@ public class SimpleGUI implements BKUGUIFacade {        });      } -    private void showMultipleHashDataInputDialog(final TableModel signedReferences, final ActionListener cancelListener, final String cancelCommand, final ActionListener saveListener, final String saveCommand) { +    private void showMultipleHashDataInputDialog(final TableModel signedReferences, final ActionListener cancelListener, final String cancelCommand) { +//      , final ActionListener saveListener, final String saveCommand        log.debug("scheduling multiple hashdatainput dialog"); @@ -1076,13 +1078,14 @@ public class SimpleGUI implements BKUGUIFacade {            refIdLabel.setText(MessageFormat.format(refIdLabelPattern, new Object[]{signedReferences.getRowCount()}));            JTable hashDataTable = new JTable(); +          hashDataTable.setDefaultRenderer(HashDataInput.class, new HyperLinkRenderer());            hashDataTable.setModel(signedReferences);            hashDataTable.setTableHeader(null);    //        hashDataTable.setShowVerticalLines(false);    //        hashDataTable.setRowSelectionAllowed(false); -          TableColumn selectCol = hashDataTable.getColumnModel().getColumn(1); -          selectCol.setMinWidth(CHECKBOX_WIDTH); -          selectCol.setMaxWidth(CHECKBOX_WIDTH); +//          TableColumn selectCol = hashDataTable.getColumnModel().getColumn(1); +//          selectCol.setMinWidth(CHECKBOX_WIDTH); +//          selectCol.setMaxWidth(CHECKBOX_WIDTH);  //          hashDataTable.setPreferredScrollableViewportSize(mainPanel.getPreferredSize()); diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleHashDataTableModel.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleHashDataTableModel.java new file mode 100644 index 00000000..463dbe81 --- /dev/null +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleHashDataTableModel.java @@ -0,0 +1,60 @@ +/* + * 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.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; +import javax.swing.table.DefaultTableModel; + +/** + * + * @author clemens + */ +class SimpleHashDataTableModel extends DefaultTableModel { + +  protected List<HashDataInput> signedReferences; +   +  protected Class[] types = new Class[]{ +    java.lang.String.class +  }; + +  public SimpleHashDataTableModel(List<HashDataInput> signedReferences) { +    super(0, 1); +    this.signedReferences = signedReferences; +    for (HashDataInput hashDataInput : signedReferences) { +       +//      String desc = hashDataInput.getReferenceId() + " (" + hashDataInput.getMimeType() + ")"; +      addRow(new Object[]{hashDataInput}); +    } +  } + +  @Override +  public Class getColumnClass(int columnIndex) { +    return types[columnIndex]; +  } + +  @Override +  public boolean isCellEditable(int rowIndex, int columnIndex) { +    if (columnIndex == 1) +      return true; +    return false; +  } +}
\ No newline at end of file diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerDialog.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerDialog.java new file mode 100644 index 00000000..cd04ad98 --- /dev/null +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerDialog.java @@ -0,0 +1,354 @@ +/* + * 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.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +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 javax.swing.text.html.HTMLDocument; +import javax.swing.text.html.HTMLEditorKit; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class ViewerDialog extends JDialog +        implements ActionListener { + +  public static final String PLAINTEXT_FONT = "Monospaced"; +  protected static final Log log = LogFactory.getLog(ViewerDialog.class); +//  private ViewerDialog dialog; +   +  protected ResourceBundle messages; +   +  /** +   *  +   * @param frameComp +   * @param signedReferences currently, only one hashdata input (the first in the list) is displayed +   * @param messages +   * @param saveListener +   * @param saveCommand +   * @param helpListener +   */ +  public static void showHashDataInput(Component frameComp, +          List<HashDataInput> hashDataInputs, +          ResourceBundle messages, +          ActionListener saveListener, +          String saveCommand, +          HelpMouseListener helpListener) { +     +    Frame frame = null; +    if (frameComp != null) { +      JOptionPane.getFrameForComponent(frameComp); +    } +    ViewerDialog viewer = new ViewerDialog(frame,  +            messages, +            hashDataInputs,  +            saveListener,  +            saveCommand,  +            helpListener); +    viewer.setVisible(true); +  } + +  public static void showHelp(Component frameComp, +          String helpTopic, +//          Reader helpDocument, +          InputStream helpDocument, +          String mimeType, +          ResourceBundle messages) { +     +    Frame frame = null; +    if (frameComp != null) { +      JOptionPane.getFrameForComponent(frameComp); +    } +    ViewerDialog viewer = new ViewerDialog(frame, messages, helpTopic, helpDocument, mimeType); +    viewer.setVisible(true); +  } + +  /** +   * TODO make encoding aware! +   * @param frame +   * @param title +   * @param messages +   * @param hashDataInputs +   * @param saveListener +   * @param saveCommand +   * @param helpListener +   */ +  private ViewerDialog(Frame frame, +          ResourceBundle messages, +          List<HashDataInput> hashDataInputs, +          ActionListener saveListener, +          String saveCommand, +          HelpMouseListener helpListener) { +    super(frame, messages.getString(BKUGUIFacade.WINDOWTITLE_VIEWER), true); +    this.messages = messages; + +    HashDataInput hashData = hashDataInputs.get(0); +     +//    Charset cs; +//    if (hashData.getEncoding() == null) { +//      cs = Charset.forName("UTF-8"); +//    } else { +//      try { +//        cs = Charset.forName(hashData.getEncoding()); +//      } catch (Exception ex) { +//        log.debug("charset " + hashData.getEncoding() + " not supported, assuming UTF-8: " + ex.getMessage()); +//        cs = Charset.forName("UTF-8"); +//      }   +//    } +     +//    InputStreamReader isr = new InputStreamReader(hashData.getHashDataInput(), cs); +//    Reader content = new BufferedReader(isr); +    InputStream content = hashData.getHashDataInput(); +    String mimeType = hashData.getMimeType(); +    String encoding = hashData.getEncoding(); +       +    JPanel hashDataPanel = createViewerPanel(messages.getString(BKUGUIFacade.MESSAGE_HASHDATA), content, mimeType, encoding, helpListener); +    JPanel buttonPanel = createButtonPanel(saveListener, saveCommand); +    initContentPane(new Dimension(600, 400), hashDataPanel, buttonPanel); + +    pack(); +    if (frame != null) { +      setLocationRelativeTo(frame); +    } else { +      setLocationByPlatform(true); +    } +  } + +  private ViewerDialog(Frame frame, +          ResourceBundle messages, +          String helpTopic, +//          Reader helpDocument, +          InputStream helpDocument, +          String mimeType) { +    super(frame, messages.getString(BKUGUIFacade.WINDOWTITLE_HELP), true); +    this.messages = messages; +     +    String p = messages.getString(BKUGUIFacade.MESSAGE_HELP); +    String helpItem = messages.getString(helpTopic); +    String viewerLabel = MessageFormat.format(p, new Object[] {helpItem}); +     +    JPanel helpPanel = createViewerPanel(viewerLabel, helpDocument, mimeType, null, null); +    JPanel buttonPanel = createButtonPanel(); +     +    initContentPane(new Dimension(600, 400), helpPanel, buttonPanel); +    pack(); +    if (frame != null) { +      setLocationRelativeTo(frame); +    } else { +      setLocationByPlatform(true); +    } +  } +   +  private void initContentPane(Dimension preferredSize, JPanel viewerPanel, JPanel buttonPanel) { +    Container contentPane = getContentPane(); +    contentPane.setPreferredSize(preferredSize); + +    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, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +              .addContainerGap()); +  } + +  /** +   *  +   * @param messages +   * @param content +   * @param mimeType defaults to text/plain if null  +   * @param encoding must be null if document contains charset declaration (e.g. HTML page), otherwise the parser crashes +   * @param helpListener may be null +   * @return +   */ +  private JPanel createViewerPanel(String viewerLabelText, InputStream content, String mimeType, String encoding, HelpMouseListener helpListener) { +    log.debug("viewer dialog: " + mimeType); + +    if (mimeType == null) { +      mimeType = "text/plain"; +    } else if ("application/xhtml+xml".equals(mimeType)) { +      mimeType = "text/html"; +    } + +    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(); +//    document.putProperty("IgnoreCharsetDirective", new Boolean(true)); +     +    try { +      if (encoding != null) { +        BufferedReader contentReader = new BufferedReader(new InputStreamReader(content, encoding)); +        viewer.read(contentReader, document); +        contentReader.close(); +      } else { +        // charset declaration in content +        viewer.read(content, document); +        content.close(); +      } +    } catch (Exception ex) { +      log.error(ex.getMessage(), ex); +      String p = messages.getString(BKUGUIFacade.ERR_VIEWER); +      viewer.setText(MessageFormat.format(p, ex.getMessage())); +    } + +    JScrollPane scrollPane = new JScrollPane(viewer); +    scrollPane.setPreferredSize(viewer.getPreferredSize()); +    scrollPane.setAlignmentX(LEFT_ALIGNMENT); +    viewer.setCaretPosition(0); + +    JLabel viewerLabel = new JLabel(); +    viewerLabel.setText(viewerLabelText); +    viewerLabel.setFont(viewerLabel.getFont().deriveFont(viewerLabel.getFont().getStyle() | java.awt.Font.BOLD)); +    viewerLabel.setLabelFor(viewer); + +    JPanel viewerPanel = new JPanel(); +    GroupLayout viewerPanelLayout = new GroupLayout(viewerPanel); +    viewerPanel.setLayout(viewerPanelLayout); + +    if (helpListener != null) { +      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)); +      viewerPanelLayout.setHorizontalGroup( +            viewerPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(viewerPanelLayout.createSequentialGroup().addComponent(viewerLabel).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(viewerLabel) +                .addComponent(helpLabel)) +              .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +              .addComponent(scrollPane));  +    } else { +      viewerPanelLayout.setHorizontalGroup( +            viewerPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +              .addComponent(viewerLabel) +              .addComponent(scrollPane));  +      viewerPanelLayout.setVerticalGroup( +            viewerPanelLayout.createSequentialGroup() +              .addComponent(viewerLabel) +              .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +              .addComponent(scrollPane));  + +    } +     +    return viewerPanel; +  } + +  private JPanel createButtonPanel() { +    JButton closeButton = new JButton(); +    closeButton.setText(messages.getString(BKUGUIFacade.BUTTON_CLOSE)); +    closeButton.addActionListener(this); + +    JPanel buttonPanel = new JPanel(); +    GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +    buttonPanel.setLayout(buttonPanelLayout); + +    buttonPanelLayout.setHorizontalGroup( +            buttonPanelLayout.createSequentialGroup() +              .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +              .addComponent(closeButton)); +    buttonPanelLayout.setVerticalGroup( +            buttonPanelLayout.createSequentialGroup() +              .addComponent(closeButton)); +    return buttonPanel; +  } +   +  private JPanel createButtonPanel(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())) { +//    ViewerDialog.dialog.setVisible(false); +//    HashDataViewer.dialog.dispose(); +    this.setVisible(false); +  } +} 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 c47242b2..ba20471d 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 @@ -26,14 +26,17 @@ windowtitle.save=Signaturdaten speichern  windowtitle.savedir=Signaturdaten in Verzeichnis speichern  windowtitle.overwrite=Datei \u00FCberschreiben?  windowtitle.viewer=Signaturedaten +windowtitle.help=Hilfe  message.wait=<html>Bitte warten...</html>  message.insertcard=<html>Bitte die B\u00FCrgerkarte in den Kartenleser stecken</html>  message.enterpin=<html>{0} eingeben</html>  message.hashdatalink=<html><a href=\"anzeige\">Signaturdaten anzeigen</a></html> -message.hashdata=<html>Signaturdaten:</html>  +message.hashdata=<html>Dies ist eine Voransicht des zu signierenden Inhaltes. F\u00FCr Details siehe Hilfe.</html>  +#verwenden sie bitte die von ihrem System zur Verf\u00FCgung gestellte {0} Anwendung.   message.hashdatalist=<html>{0} Signaturdaten:</html>  message.retries=<html>Noch {0} Versuch(e)</html>  message.overwrite=<html>M\u00F6chten Sie das existierende Dokument {0} \u00FCberschreiben?</html> +message.help=<html>Hilfe zu {0}</html>  label.pin=<html>{0}:</html>  label.pinsize=<html>({0} stellig)</html>  button.ok=OK @@ -62,4 +65,17 @@ error.cardterminal=<html>Es konnte kein Smartcard-Leser gefunden werden</html>  error.unknown=<html>Leider trat ein Fehler auf: {0}</html>  error.test=<html>Fehler1 {0} - Fehler2 {1}</html>  error.card.locked=<html>B\u00FCrgerkarte ist gesperrt</html> -error.card.notactivated=<html>B\u00FCrgerkartenfunktion ist nicht aktiviert</html>
\ No newline at end of file +error.card.notactivated=<html>B\u00FCrgerkartenfunktion ist nicht aktiviert</html> +error.viewer=Der Inhalt kann nicht dargestellt werden: {0} + +# Help Topics +help.welcome=Startseite +help.wait=Bitte Warten Bildschirm +help.cardnotsupported=Nicht unterst\u00FCtzte B\u00FCrgerkarte +help.insertcard=Keine B\u00FCrgerkarte im Kartenleser +help.cardpin=Pineingabe +help.signpin=Signatur-Pineingabe +help.retry=Falscher Pin +help.hashdata=Signierte Inhalte +help.hashdatalist=Signierte Inhalte +help.hashdataviewer=Anzeige signierter Inhalte
\ No newline at end of file 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 c7cc9084..edc5371d 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 @@ -26,6 +26,7 @@ windowtitle.save=Save signature data  windowtitle.savedir=Save signature data to directory  windowtitle.overwrite=Overwrite file?  windowtitle.viewer=Signature data +windowtitle.help=Help  message.wait=<html>Please wait...</html>  message.insertcard=<html>Please insert your citizen-card into the reader</html>  message.enterpin=<html>Enter {0}</html> @@ -34,6 +35,7 @@ message.hashdata=<html>Signature data:</html>  message.hashdatalist=<html>{0} signature data objects:</html>  message.retries=<html>{0} tries left</html>  message.overwrite=<html>Overwrite {0}?</html> +message.help=<html>Help topic {0}</html>  label.pin=<html>{0}:</html>  label.pinsize=<html>({0} digits)</html>  button.ok=OK @@ -61,4 +63,17 @@ error.cardterminal=<html>Could not find smartcard reader</html>  error.unknown=<html>An error occured: {0}</html>  error.test=<html>Error1 {0} - Error2 {1}</html>  error.card.locked=<html>Citizen-card is locked</html> -error.card.notactivated=<html>Citizen-card not activated</html>
\ No newline at end of file +error.card.notactivated=<html>Citizen-card not activated</html> +error.viewer=Failed to display contents: {0} + +# Help Topics +help.welcome=Welcome page +help.wait=Wait screen +help.cardnotsupported=Unsupported citizen card +help.insertcard=No citizen card found +help.cardpin=Pin entry +help.signpin=Signature pin entry +help.retry=Wrong Pin +help.hashdata=Signed contents +help.hashdatalist=Signed contents +help.hashdataviewer=Display of signed contents
\ No newline at end of file diff --git a/BKUCommonGUI/src/main/resources/images/help.png b/BKUCommonGUI/src/main/resources/images/help.pngBinary files differ index 4ed65a97..5d6da3bf 100644 --- a/BKUCommonGUI/src/main/resources/images/help.png +++ b/BKUCommonGUI/src/main/resources/images/help.png diff --git a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java index c366cb76..af1368e5 100644 --- a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java +++ b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java @@ -176,7 +176,7 @@ public class BKUGUIWorker implements Runnable {  //                    signedRefs.add(signedRef4);  //                    signedRefs.add(signedRef4);  //                    signedRefs = Collections.singletonList(signedRef1); -        gui.showHashDataInputDialog(signedRefs, returnListener, "return"); +        gui.showHashDataInputDialog(signedRefs, true, returnListener, "return");        }      }; diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java index 7faad548..05a3f5e5 100644 --- a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java +++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALServiceImpl.java @@ -64,10 +64,14 @@ public class STALServiceImpl implements STALPortType {    protected static final Log log = LogFactory.getLog(STALServiceImpl.class);    static { +          if (log.isTraceEnabled()) {        log.trace("enabling webservice communication dump");        System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); +    } else { +      System.setProperty("com.sun.xml.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace", "false");      } +        }    @Resource @@ -291,8 +295,8 @@ public class STALServiceImpl implements STALPortType {            throw new GetHashDataInputFault(msg, faultInfo);          }        } else { -        String msg = "Failed to get STAL for session " + sessionId; -        log.error(msg); +        String msg = "Session timeout"; //Failed to get STAL for session " + sessionId; +        log.error(msg + " " + sessionId);          GetHashDataInputFaultType faultInfo = new GetHashDataInputFaultType();          faultInfo.setErrorCode(1);          faultInfo.setErrorMessage(msg); diff --git a/BKUOnline/src/test/java/at/gv/egiz/bku/online/conf/SSLConfigTest.java b/BKUOnline/src/test/java/at/gv/egiz/bku/online/conf/SSLConfigTest.java index 612480b2..eefaf5b6 100644 --- a/BKUOnline/src/test/java/at/gv/egiz/bku/online/conf/SSLConfigTest.java +++ b/BKUOnline/src/test/java/at/gv/egiz/bku/online/conf/SSLConfigTest.java @@ -11,6 +11,7 @@ import org.junit.Test;  import org.springframework.context.ApplicationContext;
  import org.springframework.context.support.ClassPathXmlApplicationContext;
 +@Ignore
  public class SSLConfigTest {
  	private SpringConfigurator cfg;
 @@ -21,7 +22,7 @@ public class SSLConfigTest {  		ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  	}
 -	
 +
  	@Ignore
  	@Test
  	public void testConnect() throws Exception {
 diff --git a/STALService/pom.xml b/STALService/pom.xml index e9c573f1..db126b3c 100644 --- a/STALService/pom.xml +++ b/STALService/pom.xml @@ -18,10 +18,10 @@              <artifactId>STAL</artifactId>              <version>1.0-SNAPSHOT</version>          </dependency> -        <dependency> +        <!--dependency>          	<groupId>at.gv.egiz</groupId>          	<artifactId>utils</artifactId>          	<version>1.0-SNAPSHOT</version> -        </dependency> +        </dependency-->      </dependencies>  </project>
\ No newline at end of file diff --git a/STALService/src/main/java/at/gv/egiz/stal/util/HashDataInputProxy.java b/STALService/src/main/java/at/gv/egiz/stal/util/HashDataInputProxy.java deleted file mode 100644 index 01d207d2..00000000 --- a/STALService/src/main/java/at/gv/egiz/stal/util/HashDataInputProxy.java +++ /dev/null @@ -1,67 +0,0 @@ -package at.gv.egiz.stal.util;
 -
 -import java.io.ByteArrayInputStream;
 -import java.io.ByteArrayOutputStream;
 -import java.io.IOException;
 -import java.io.InputStream;
 -
 -import org.apache.commons.logging.Log;
 -import org.apache.commons.logging.LogFactory;
 -
 -import at.gv.egiz.bku.utils.StreamUtil;
 -import at.gv.egiz.stal.HashDataInput;
 -
 -/**
 - * Enables multiple read requests.
 - * @deprecated use at.gv.egiz.stal.impl.ByteArrayHashDataInput
 - */
 -public class HashDataInputProxy implements HashDataInput {
 -
 -  private static Log log = LogFactory.getLog(HashDataInputProxy.class);
 -
 -  private HashDataInput delegate;
 -  private byte[] hashInput;
 -
 -  /**
 -   * 
 -   * @param delegate
 -   *          != null
 -   */
 -  public HashDataInputProxy(HashDataInput delegate) {
 -    if (delegate == null) {
 -      throw new NullPointerException("Constructor argument must not be null");
 -    }
 -    this.delegate = delegate;
 -  }
 -
 -  @Override
 -  public String getEncoding() {
 -    return delegate.getEncoding();
 -  }
 -
 -  @Override
 -  public InputStream getHashDataInput() {
 -    if (hashInput == null) {
 -      ByteArrayOutputStream os = new ByteArrayOutputStream();
 -      try {
 -        StreamUtil.copyStream(delegate.getHashDataInput(), os);
 -        hashInput = os.toByteArray();
 -      } catch (IOException e) {
 -        log.error("Cannot access hashdatainput stream", e);
 -        hashInput = new byte[0];
 -      }
 -    }
 -    return new ByteArrayInputStream(hashInput);
 -  }
 -
 -  @Override
 -  public String getMimeType() {
 -    return delegate.getMimeType();
 -  }
 -
 -  @Override
 -  public String getReferenceId() {
 -    return delegate.getReferenceId();
 -  }
 -
 -}
 diff --git a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/HashDataInputDisplay.java b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/HashDataInputDisplay.java index f79a2027..59700d4a 100644 --- a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/HashDataInputDisplay.java +++ b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/HashDataInputDisplay.java @@ -1,6 +1,18 @@  /* - * To change this template, choose Tools | Templates - * and open the template in the editor. + * 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.smccstal; @@ -14,7 +26,11 @@ import java.util.List;   */  public interface HashDataInputDisplay { +    /** +   * TODO: (see AbstractHelpListener) +   *  +   *      * Displays the hashdata inputs for all provided dsig:SignedReferences.     * Implementations may verify the digest value if necessary.      * (LocalSignRequestHandler operates on DataObjectHashDataInput,  diff --git a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/SignRequestHandler.java b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/SignRequestHandler.java index 6c30a68a..77ee45b6 100644 --- a/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/SignRequestHandler.java +++ b/smccSTAL/src/main/java/at/gv/egiz/bku/smccstal/SignRequestHandler.java @@ -192,7 +192,7 @@ public abstract class SignRequestHandler extends AbstractRequestHandler implemen -  class STALPinProvider implements PINProvider, ActionListener { +  class STALPinProvider implements PINProvider {      protected SignedInfoType signedInfo;      protected List<HashDataInput> hashDataInputs; @@ -230,10 +230,10 @@ public abstract class SignRequestHandler extends AbstractRequestHandler implemen              displayHashDataInputs(signedInfo.getReference());            } catch (DigestException ex) {               log.error("Bad digest value: " + ex.getMessage()); -            gui.showErrorDialog(BKUGUIFacade.ERR_INVALID_HASH, new Object[] {ex.getMessage()}); +            gui.showErrorDialog(BKUGUIFacade.ERR_INVALID_HASH, new Object[] {ex.getMessage()}, SignRequestHandler.this, "error");            } catch (Exception ex) {              log.error("Could not display hashdata inputs: " + ex.getMessage()); -            gui.showErrorDialog(BKUGUIFacade.ERR_DISPLAY_HASHDATA, new Object[] {ex.getMessage()}, SignRequestHandler.this, "ok"); +            gui.showErrorDialog(BKUGUIFacade.ERR_DISPLAY_HASHDATA, new Object[] {ex.getMessage()}, SignRequestHandler.this, "error");            }          // OLD HASHDATA DISPLAY (in applet),  @@ -261,13 +261,15 @@ public abstract class SignRequestHandler extends AbstractRequestHandler implemen          return new String(gui.getPin());        } else if (actionCommand.equals("ok")) {          showSignaturePINDialog(spec, retries); +      } else if (actionCommand.equals("error")) { +        return null;        }      } while (true);    } -    @Override -    public void actionPerformed(ActionEvent e) { -      throw new UnsupportedOperationException("Not supported yet."); -    } +//    @Override +//    public void actionPerformed(ActionEvent e) { +//      throw new UnsupportedOperationException("Not supported yet."); +//    }    }  } | 
