package org.eparapher.rcp.wizards; import org.apache.log4j.Logger; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.PlatformUI; import org.eparapher.core.EParapherManager; import org.eparapher.core.crypto.EPKeystoreManager; import org.eparapher.core.crypto.keystore.FileKeystore; import org.eparapher.core.crypto.keystore.HardwareKeyStore; import org.eparapher.core.interfaces.IUserKeystore; public class PinOrPassphraseWizard extends Wizard { private static final long WAIT_AFTER_BAD_SECRET = 4000; private static Logger log = Logger.getLogger(PinOrPassphraseWizard.class); private PinOrPassphraseWizardPage one; private IUserKeystore userks; private boolean isPrivateKey; private boolean isNewSecret; private int attempt = 1; private String secret = ""; private String pkalias = ""; /** * * @param m_is_new_passphrase true if defining a new secret, false if it's an existing secret input * @param misPK true if it's a private key secret, false if it's a keystore secret * @param m_pk_alias_name the alias string */ public PinOrPassphraseWizard(boolean m_is_new_passphrase, boolean misPK, String m_pk_alias_name) { super(); userks = EPKeystoreManager.getInstance().getUserkeystore(); isPrivateKey = misPK; isNewSecret = m_is_new_passphrase; pkalias = m_pk_alias_name; if (userks instanceof FileKeystore) setWindowTitle("Keystore passphrase"); if (userks instanceof HardwareKeyStore) setWindowTitle("PKCS#11 PIN Code"); setNeedsProgressMonitor(false); } public void addPages() { one = new PinOrPassphraseWizardPage(isNewSecret, isPrivateKey, pkalias); addPage(one); } public String getSecret() { return secret; } public boolean performFinish() { attempt++; String errorMessage = ""; if (!isNewSecret) { if(one.getSecret().equalsIgnoreCase("")) { errorMessage = "Empty Field. Please enter somerthing or cancel. (attempt n°"+attempt+")"; } else { //one.privateKeySecretText.setEditable(false); if (isPrivateKey) { if (userks.loadPrivateKey(one.getSecret())) { this.secret = one.getSecret(); return true; } else { errorMessage = "Invalid passphrase. Please try again. (attempt n°"+attempt+")"; waitonerror(); //one.privateKeySecretText.setEditable(true); } } else { if (userks.loadKeyStore(one.getSecret())) { EParapherManager.getInstance().getUI().refreshCertificateList(); this.secret = one.getSecret(); return true; } else { errorMessage = "Invalid passphrase. Please try again. (attempt n°"+attempt+")"; waitonerror(); } } } } else { this.secret = one.getSecret(); return true; } one.setErrorMessage(errorMessage); one.setEmptySecretField(); //one.setPageComplete(false); return false; } private void waitonerror() { try { log.debug("Wait on bad secret..."); this.getShell().setVisible(false); Thread.sleep(WAIT_AFTER_BAD_SECRET); this.getShell().setVisible(true); } catch (InterruptedException e) { log.warn("Error on waiting after bad secret",e); } } public String askForSecret() { WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), this); if ( dialog.open() != Window.OK ) { secret=null; if (isPrivateKey) { if (isNewSecret) log.info("Private key passphrase definition has been cancelled for " + pkalias); else log.info("Private key passphrase has been cancelled for " + pkalias); } else { if (isNewSecret) log.info("Keystore passphrase definition has been cancelled"); else log.info("Keystore passphrase has been cancelled"); } return null; } return this.getSecret(); } }