View Javadoc

1   package org.eparapher.rcp.wizards;
2   
3   import org.apache.log4j.Logger;
4   import org.eclipse.jface.window.Window;
5   import org.eclipse.jface.wizard.Wizard;
6   import org.eclipse.jface.wizard.WizardDialog;
7   import org.eclipse.ui.PlatformUI;
8   import org.eparapher.core.EParapherManager;
9   import org.eparapher.core.crypto.EPKeystoreManager;
10  import org.eparapher.core.crypto.keystore.FileKeystore;
11  import org.eparapher.core.crypto.keystore.HardwareKeyStore;
12  import org.eparapher.core.crypto.keystore.IUserKeystore;
13  
14  public class PinOrPassphraseWizard extends Wizard {
15  
16  	private static final long WAIT_AFTER_BAD_SECRET = 4000;
17  
18  	private static Logger log = Logger.getLogger(PinOrPassphraseWizard.class);
19  	
20  	private PinOrPassphraseWizardPage one;
21  	private IUserKeystore userks;
22  	private boolean isPrivateKey;
23  	private boolean isNewSecret;
24  	private int attempt = 1;
25  	private String secret = "";
26  	private String pkalias = "";
27  	
28  	/**
29  	 * 
30  	 * @param m_is_new_passphrase true if defining a new secret, false if it's an existing secret input
31  	 * @param misPK            true if it's a private key secret, false if it's a keystore secret
32  	 * @param m_pk_alias_name         the alias string
33  	 */
34  	public PinOrPassphraseWizard(boolean m_is_new_passphrase, boolean misPK, String m_pk_alias_name) {
35  		super();
36  		userks = EPKeystoreManager.getInstance().getUserkeystore();
37  		isPrivateKey = misPK;
38  		isNewSecret = m_is_new_passphrase;
39  		pkalias = m_pk_alias_name;
40  		if (userks instanceof FileKeystore)
41  			setWindowTitle("Keystore passphrase");
42  		if (userks instanceof HardwareKeyStore)
43  			setWindowTitle("PKCS#11 PIN Code");
44  		setNeedsProgressMonitor(false);
45  	}
46  
47  	public void addPages() {
48  		one = new PinOrPassphraseWizardPage(isNewSecret, isPrivateKey, pkalias);
49  		addPage(one);
50  	}
51  	
52  	public String getSecret() {
53  		return secret;
54  	}
55  	
56  	public boolean performFinish() {
57  		attempt++;
58  		String errorMessage = "";
59  		if (!isNewSecret) {
60  			if(one.getSecret().equalsIgnoreCase("")) {
61  				errorMessage = "Empty Field. Please enter somerthing or cancel. (attempt n°"+attempt+")";
62  			} else	{
63  				if (isPrivateKey) {
64  					if (userks.loadPrivateKey(one.getSecret())) {
65  						this.secret = one.getSecret();
66  						return true;
67  					} else {
68  						errorMessage = "Invalid passphrase. Please try again. (attempt n°"+attempt+")";
69  						waitonerror();
70  					}
71  				} else {
72  					if (userks.loadKeyStore(one.getSecret())) {
73  						EParapherManager.getInstance().getUI().refreshCertificateList();
74  						this.secret = one.getSecret();
75  						return true;
76  					} else {
77  						errorMessage = "Invalid passphrase. Please try again. (attempt n°"+attempt+")";
78  						waitonerror();
79  					}
80  				}
81  			}
82  		} else {
83  			this.secret = one.getSecret();
84  			return true;
85  		}
86  		one.setErrorMessage(errorMessage);
87  		one.setEmptySecretField();
88  		//one.setPageComplete(false);
89  
90  		return false;
91  	}
92  
93  	private void waitonerror() {
94  		try {
95  			log.debug("Wait on bad secret...");
96  			this.getShell().setVisible(false);
97  			Thread.sleep(WAIT_AFTER_BAD_SECRET);
98  			this.getShell().setVisible(true);
99  		} catch (InterruptedException e) {
100 			log.warn("Error on waiting after bad secret",e);
101 		}
102 	}
103 
104 	public String askForSecret() {
105 		WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), this);
106 		if ( dialog.open() != Window.OK ) {
107 			secret=null;
108 			if (isPrivateKey) {
109 				if (isNewSecret)
110 					log.info("Private key passphrase definition has been cancelled for " + pkalias);
111 				else
112 					log.info("Private key passphrase has been cancelled for " + pkalias);
113 			} else {
114 				if (isNewSecret)
115 					log.info("Keystore passphrase definition has been cancelled");
116 				else
117 					log.info("Keystore passphrase has been cancelled");
118 			}
119 			return null;
120 		}
121 		return this.getSecret();
122 	}
123 
124 }