/* (non-Javadoc)
   * @see org.eclipse.sequoyah.tfm.sign.core.extension.security.ISecurityManagement#importSignedCert(java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
   */
  public boolean importSignedCert(String certFile, IProgressMonitor monitor) throws SignException {

    boolean cmdSuccessful = true;
    initializeKeytool();

    String[] cmdArgs =
        keytool.generateImportSignedCertCmd(
            certFile, aliaskey, ksPasswrd, ksType, ksLocation, ksPasswrd, getConsoleEncoding());
    Process p = keytool.execute(cmdArgs);

    BufferedReader cmdOutputStream = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String cmdOutput;
    try {
      while ((cmdOutput = cmdOutputStream.readLine()) != null) {

        if (cmdOutput.indexOf("error") >= 0) { // $NON-NLS-1$
          throw new SignException(
              NLS.bind(
                  Messages.SunSecurityManagement_defaultErrorMessage,
                  new String[] {
                    SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), cmdOutput
                  }));
        }
      }
    } catch (IOException ee) {
      throw new SignException(SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), ee);
    }
    return cmdSuccessful;
  }
  /* (non-Javadoc)
   * @see org.eclipse.sequoyah.tfm.sign.core.extension.security.ISecurityManagement#openKeyStore(java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
   */
  public String[] openKeyStore(IPath keyStore, String storePass, IProgressMonitor monitor)
      throws SignException {
    monitor.beginTask(Messages.SunSecurityManagement_Opening_key_store, 100);
    monitor.worked(10);

    initializeKeytool();

    String[] cmdArgs =
        keytool.generateOpenKeyStoreCmd(ksType, keyStore, storePass, getConsoleEncoding());
    Process p = keytool.execute(cmdArgs);

    BufferedReader cmdOutputStream = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String cmdOutput;
    List<String> aliases = new ArrayList<String>();

    try {
      while ((cmdOutput = cmdOutputStream.readLine()) != null) {
        monitor.subTask(cmdOutput);
        monitor.worked(25);

        if (cmdOutput.toLowerCase().indexOf("error") >= 0) { // $NON-NLS-1$
          monitor.done();
          if (cmdOutput.toLowerCase().indexOf("invalid keystore format") >= 0) { // $NON-NLS-1$
            throw new SignException(
                NLS.bind(
                    Messages.SunSecurityManagement_defaultErrorMessage,
                    new String[] {
                      SignErrors.getErrorMessage(SignErrors.SECURITY_BAD_KEY_TYPE), cmdOutput
                    }));
          } else if (cmdOutput.toLowerCase().indexOf("password was incorrect")
              >= 0) { //$NON-NLS-1$
            throw new SignException(
                NLS.bind(
                    Messages.SunSecurityManagement_defaultErrorMessage,
                    new String[] {
                      SignErrors.getErrorMessage(SignErrors.SECURITY_BAD_KEYSTORE_OR_PASSWORD),
                      cmdOutput
                    }));
          } else {
            throw new SignException(
                NLS.bind(
                    Messages.SunSecurityManagement_defaultErrorMessage,
                    new String[] {
                      SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), cmdOutput
                    }));
          }

        } else if (cmdOutput.indexOf(",") >= 0) { // $NON-NLS-1$
          StringTokenizer strtok = new StringTokenizer(cmdOutput, ".,"); // $NON-NLS-1$
          aliases.add(strtok.nextToken());
        }
      }
    } catch (IOException ee) {
      throw new SignException(SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), ee);
    }
    return aliases.toArray(new String[aliases.size()]);
  }
  /* (non-Javadoc)
   * @see org.eclipse.sequoyah.tfm.sign.core.extension.security.ISecurityManagement#getCertificateInfo(org.eclipse.core.runtime.IProgressMonitor)
   */
  public String getCertificateInfo(IProgressMonitor monitor) throws SignException {

    String certInfo = ""; // $NON-NLS-1$

    if ((aliaskey != null) && (aliaskey.length() > 0)) {

      try {
        initializeKeytool();

        String[] cmdArgs =
            keytool.generateDisplayCertifcates(
                aliaskey, ksType, ksLocation, ksPasswrd, getConsoleEncoding());
        Process p = keytool.execute(cmdArgs);

        BufferedReader cmdOutputStream =
            new BufferedReader(new InputStreamReader(p.getInputStream()));
        monitor.worked(20);

        String cmdOutput;

        while ((cmdOutput = cmdOutputStream.readLine()) != null) {

          if (cmdOutput.toLowerCase().indexOf("error") >= 0) { // $NON-NLS-1$
            throw new SignException(
                SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR)
                    + " "
                    + cmdOutput); //$NON-NLS-1$
          } else if (cmdOutput.length() >= 0) {
            certInfo = certInfo + cmdOutput;
          }
        }

      } catch (IOException ee) {
        certInfo = ""; // $NON-NLS-1$
        throw new SignException(SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), ee);
      } catch (Exception e) {
        certInfo = ""; // $NON-NLS-1$
        throw new SignException(SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), e);
      }
    } // if aliaskey

    return certInfo;
  }
  /**
   * Get the Security Management tool from preference store location (@link
   * #securityProviderPrefStore}).
   *
   * @return the path to the keystore tool.
   * @throws SignException when the JRE home directory is not configured correctly.
   */
  private final IPath getSecurityManagementTool() throws SignException {
    IPath securityToolLocation = getToolLocation(null);

    if ((securityToolLocation == null) || (securityToolLocation.isEmpty())) {
      String message =
          MessageFormat.format(
              Messages.SunSecurityManagement_defaultErrorMessage2,
              new Object[] {
                getId(),
                Messages.SunSecurityManagement_Security_tool_not_configured_correctly,
                Messages.SunSecurityManagement_Security_tool_using_features
              });
      throw new SignException(
          SignErrors.getErrorMessage(SignErrors.SECURITY_MANAGER_NOT_CONFIGURED)
              + "\n"
              + //$NON-NLS-1$
              message);
    }
    securityToolLocation = securityToolLocation.append("bin" + File.separator + "keytool");
    return securityToolLocation;
  }
  /* (non-Javadoc)
   * @see org.eclipse.sequoyah.tfm.sign.core.extension.security.ISecurityManagement#createNewKey(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
   */
  public boolean createNewKey(
      String alias,
      String commonName,
      String orgUnit,
      String orgName,
      String localityName,
      String stateName,
      String country,
      IProgressMonitor monitor)
      throws SignException {

    monitor.beginTask(Messages.SunSecurityManagement_Creating_key_alias, 100);

    boolean cmdSuccessful = true;
    initializeKeytool();

    X500DName dName = new X500DName(commonName, orgUnit, orgName, localityName, stateName, country);

    String[] cmdArgs =
        keytool.generateNewKeyCmd(
            dName,
            "RSA",
            "SHA1withRSA",
            ksCertfValidity,
            alias,
            ksPasswrd,
            ksType,
            ksLocation,
            ksPasswrd,
            getConsoleEncoding()); //$NON-NLS-1$ //$NON-NLS-2$

    Process p = keytool.execute(cmdArgs);
    monitor.worked(30);

    BufferedReader cmdOutputStream = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String cmdOutput;
    try {
      while ((cmdOutput = cmdOutputStream.readLine()) != null) {
        monitor.worked(40);
        if (cmdOutput.toLowerCase().indexOf("error") >= 0) { // $NON-NLS-1$

          monitor.done();
          if (cmdOutput.toLowerCase().indexOf("alias <" + alias + "> already exists")
              >= 0) { //$NON-NLS-1$ //$NON-NLS-2$
            throw new SignException(
                NLS.bind(
                    Messages.SunSecurityManagement_defaultErrorMessage,
                    new String[] {
                      SignErrors.getErrorMessage(SignErrors.SECURITY_ALIAS_DUPLICATE), cmdOutput
                    }));
          } else {
            throw new SignException(
                NLS.bind(
                    Messages.SunSecurityManagement_defaultErrorMessage,
                    new String[] {
                      SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), cmdOutput
                    }));
          }
        }
      }
    } catch (IOException ee) {
      throw new SignException(SignErrors.getErrorMessage(SignErrors.GENERIC_SECURITY_ERROR), ee);
    }
    monitor.worked(100);
    monitor.done();

    return cmdSuccessful;
  }