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
31
32
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
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 }