View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.uip;
21  
22  import org.waarp.common.crypto.Blowfish;
23  import org.waarp.common.crypto.Des;
24  import org.waarp.common.exception.CryptoException;
25  import org.waarp.common.logging.SysErrLogger;
26  
27  import javax.swing.AbstractAction;
28  import javax.swing.BorderFactory;
29  import javax.swing.GroupLayout;
30  import javax.swing.JButton;
31  import javax.swing.JDialog;
32  import javax.swing.JFileChooser;
33  import javax.swing.JFrame;
34  import javax.swing.JMenu;
35  import javax.swing.JMenuBar;
36  import javax.swing.JMenuItem;
37  import javax.swing.JPanel;
38  import javax.swing.JPasswordField;
39  import javax.swing.JSeparator;
40  import javax.swing.JTextField;
41  import javax.swing.JTextPane;
42  import javax.swing.LayoutStyle;
43  import javax.swing.SwingUtilities;
44  import javax.swing.WindowConstants;
45  import javax.swing.border.BevelBorder;
46  import javax.swing.filechooser.FileNameExtensionFilter;
47  import java.awt.Color;
48  import java.awt.Dimension;
49  import java.awt.event.ActionEvent;
50  import java.awt.event.FocusAdapter;
51  import java.awt.event.FocusEvent;
52  import java.awt.event.WindowAdapter;
53  import java.awt.event.WindowEvent;
54  import java.io.File;
55  import java.io.IOException;
56  import java.util.Locale;
57  
58  /**
59   * GUI for GoldenGate Password Management for GoldenGate products.
60   */
61  public class WaarpUiPassword extends JFrame {
62  
63    /**
64     *
65     */
66    private static final long serialVersionUID = -4276191288898099362L;
67    protected WaarpUiPassword myself;
68    private JMenuItem helpMenuItem;
69    private JMenu jMenu5;
70    private AbstractAction saveAsKeyAction;
71    private AbstractAction saveKeyAction;
72    private AbstractAction newKeyAction;
73    private AbstractAction openKeyAction;
74    private AbstractAction loadPswdAction;
75    private AbstractAction exitAction;
76    private JPanel jPanel1;
77    private JTextField jTextFieldPasswordFile;
78    private JPasswordField jPasswordField;
79    private JTextField jPasswordFieldTxt;
80    private JTextField jTextFieldCryptedPassword;
81    private JTextField jTextFieldKeyFile;
82    private JMenuItem savePasswordMenuItem;
83    private AbstractAction helpAction;
84    private AbstractAction savePaswdAction;
85    private JMenuItem loadPasswordMenuItem;
86    private JMenu jMenuPassword;
87    private JMenuItem exitMenuItem;
88    private JSeparator jSeparator2;
89    private JMenuItem saveAsMenuItem;
90    private JMenuItem saveMenuItem;
91    private JMenuItem openFileMenuItem;
92    private JMenuItem newFileMenuItem;
93    private JMenu jMenu3;
94    private JMenuBar jMenuBar1;
95  
96    private final JFileChooser chooserKeyFile;
97    private transient final FileNameExtensionFilter filterKey;
98    private final JFileChooser chooserPwdFile;
99    private transient final FileNameExtensionFilter filterPwdKey;
100 
101   private AbstractAction closeHelpAction;
102   private JTextPane jTextPaneHelp;
103   private JButton jButtonHelp;
104   private JDialog jDialogHelp;
105   private transient WaarpPassword waarpPassword;
106   boolean passwordModified;
107   boolean extended;
108 
109   /**
110    * Auto-generated main method to display this JFrame
111    */
112   public static void main(final String[] args) {
113     if (!WaarpPassword.loadOptions(args)) {
114       // Bad options
115       System.exit(2);//NOSONAR
116     }
117     SwingUtilities.invokeLater(new Runnable() {
118       @Override
119       public void run() {
120         final WaarpUiPassword inst = new WaarpUiPassword();
121         inst.setLocationRelativeTo(null);
122         inst.setVisible(true);
123       }
124     });
125   }
126 
127   protected WaarpUiPassword(final boolean extended_ignore) throws Exception {
128     extended = true;
129     chooserKeyFile = new JFileChooser();
130     filterKey = new FileNameExtensionFilter(
131         "DES or Blowfish Key (" + Des.EXTENSION + ", " + Blowfish.EXTENSION +
132         ')', Des.EXTENSION, Blowfish.EXTENSION);
133     chooserKeyFile.setFileFilter(filterKey);
134     chooserKeyFile.setFileSelectionMode(JFileChooser.FILES_ONLY);
135 
136     chooserPwdFile = new JFileChooser();
137     filterPwdKey = new FileNameExtensionFilter(
138         "GoldenGate Password Files (" + WaarpPassword.GGPEXTENSION + ')',
139         WaarpPassword.GGPEXTENSION);
140     chooserPwdFile.setFileFilter(filterPwdKey);
141     chooserPwdFile.setFileSelectionMode(JFileChooser.FILES_ONLY);
142 
143     waarpPassword = new WaarpPassword();
144 
145     initGUI();
146     initFromGgPassword();
147   }
148 
149   public WaarpUiPassword() {
150     myself = this;
151     chooserKeyFile = new JFileChooser();
152     filterKey = new FileNameExtensionFilter(
153         "DES or Blowfish Key (" + Des.EXTENSION + ", " + Blowfish.EXTENSION +
154         ')', Des.EXTENSION, Blowfish.EXTENSION);
155     chooserKeyFile.setFileFilter(filterKey);
156     chooserKeyFile.setFileSelectionMode(JFileChooser.FILES_ONLY);
157 
158     chooserPwdFile = new JFileChooser();
159     filterPwdKey = new FileNameExtensionFilter(
160         "GoldenGate Password Files (" + WaarpPassword.GGPEXTENSION + ')',
161         WaarpPassword.GGPEXTENSION);
162     chooserPwdFile.setFileFilter(filterPwdKey);
163     chooserPwdFile.setFileSelectionMode(JFileChooser.FILES_ONLY);
164 
165     try {
166       waarpPassword = new WaarpPassword();
167     } catch (final Exception e) {
168       SysErrLogger.FAKE_LOGGER.syserr(e);
169       System.exit(3);//NOSONAR
170     }
171 
172     initGUI();
173     initFromGgPassword();
174   }
175 
176   private void initFromGgPassword() {
177     final File keyFile = waarpPassword.getKeyFile();
178     if (keyFile != null) {
179       jTextFieldKeyFile.setText(keyFile.getAbsolutePath());
180       enableMenuWithKey();
181     }
182     final File pFile = waarpPassword.getPasswordFile();
183     if (pFile != null) {
184       jTextFieldPasswordFile.setText(pFile.getAbsolutePath());
185     }
186     String clpwd = waarpPassword.getClearPassword();
187     if (clpwd != null) {
188       setUncryptedPassword(clpwd);
189       clpwd = waarpPassword.getCryptedPassword();
190       jTextFieldCryptedPassword.setText(clpwd);
191     }
192   }
193 
194   public void exit(final ActionEvent evt) {
195     if (passwordModified) {
196       getSavePaswdAction().actionPerformed(evt);
197     }
198     if (extended) {
199       myself.dispose();
200     } else {
201       System.exit(1);//NOSONAR
202     }
203   }
204 
205   private void initGUI() {
206     try {
207       final GroupLayout thisLayout = new GroupLayout(getContentPane());
208       getContentPane().setLayout(thisLayout);
209       addWindowListener(new WindowAdapter() {
210         @Override
211         public void windowClosing(final WindowEvent evt) {
212           myself.exit(null);
213         }
214 
215         @Override
216         public void windowClosed(final WindowEvent evt) {
217           myself.exit(null);
218         }
219       });
220       setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
221       setTitle("Waarp Password GUI");
222       setLocale(new Locale("en", "GB"));
223       {
224         jTextFieldKeyFile = new JTextField();
225         jTextFieldKeyFile.setText("Key File");
226         jTextFieldKeyFile.setEditable(false);
227         jTextFieldKeyFile.setBorder(BorderFactory.createCompoundBorder(
228             BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(0, 0, 0)),
229             BorderFactory.createCompoundBorder(null, null)));
230       }
231       {
232         jPanel1 = new JPanel();
233         final GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
234         jPanel1.setLayout(jPanel1Layout);
235         jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
236         {
237           jTextFieldPasswordFile = new JTextField();
238           jTextFieldPasswordFile.setText("Password File");
239           jTextFieldPasswordFile.setEditable(false);
240           jTextFieldPasswordFile.setBorder(BorderFactory.createCompoundBorder(
241               BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(0, 0, 0)),
242               BorderFactory.createCompoundBorder(null, null)));
243         }
244         {
245           if (WaarpPassword.clearPasswordView) {
246             jPasswordFieldTxt = new JTextField();
247             jPasswordFieldTxt.addFocusListener(new FocusAdapter() {
248               @Override
249               public void focusLost(final FocusEvent evt) {
250                 final String paswd = jPasswordFieldTxt.getText();
251                 if (!paswd.equals(waarpPassword.getClearPassword())) {
252                   try {
253                     waarpPassword.setClearPassword(paswd);
254                   } catch (final Exception e) {
255                     SysErrLogger.FAKE_LOGGER.syserr(e);
256                   }
257                   jTextFieldCryptedPassword.setText(
258                       waarpPassword.getCryptedPassword());
259                   passwordModified = true;
260                 }
261               }
262             });
263           } else {
264             jPasswordField = new JPasswordField();
265             jPasswordField.addFocusListener(new FocusAdapter() {
266               @Override
267               public void focusLost(final FocusEvent evt) {
268                 final String paswd = new String(jPasswordField.getPassword());
269                 if (!paswd.equals(waarpPassword.getClearPassword())) {
270                   try {
271                     waarpPassword.setClearPassword(paswd);
272                   } catch (final Exception e) {
273                     SysErrLogger.FAKE_LOGGER.syserr(e);
274                   }
275                   jTextFieldCryptedPassword.setText(
276                       waarpPassword.getCryptedPassword());
277                   passwordModified = true;
278                 }
279               }
280             });
281           }
282         }
283         {
284           jTextFieldCryptedPassword = new JTextField();
285           jTextFieldCryptedPassword.addFocusListener(new FocusAdapter() {
286             @Override
287             public void focusLost(final FocusEvent evt) {
288               final String paswd = jTextFieldCryptedPassword.getText();
289               if (!paswd.equals(waarpPassword.getCryptedPassword())) {
290                 try {
291                   waarpPassword.setCryptedPassword(paswd);
292                 } catch (final Exception e1) {
293                   SysErrLogger.FAKE_LOGGER.syserr(e1);
294                 }
295                 setUncryptedPassword(waarpPassword.getClearPassword());
296                 jTextFieldCryptedPassword.setText(
297                     waarpPassword.getCryptedPassword());
298                 passwordModified = true;
299               }
300             }
301           });
302         }
303         if (WaarpPassword.clearPasswordView) {
304           jPanel1Layout.setHorizontalGroup(
305               jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(
306                                jPanel1Layout.createParallelGroup().addGroup(
307                                                 jPanel1Layout.createSequentialGroup()
308                                                              .addComponent(jTextFieldPasswordFile,
309                                                                            GroupLayout.PREFERRED_SIZE,
310                                                                            340,
311                                                                            GroupLayout.PREFERRED_SIZE)
312                                                              .addGap(0, 0, Short.MAX_VALUE))
313                                             .addComponent(jPasswordFieldTxt,
314                                                           GroupLayout.Alignment.LEADING, 0,
315                                                           341, Short.MAX_VALUE)
316                                             .addComponent(jTextFieldCryptedPassword,
317                                                           GroupLayout.Alignment.LEADING, 0,
318                                                           338, Short.MAX_VALUE))
319                            .addContainerGap());
320           jPanel1Layout.setVerticalGroup(
321               jPanel1Layout.createSequentialGroup().addContainerGap()
322                            .addComponent(jTextFieldPasswordFile,
323                                          GroupLayout.PREFERRED_SIZE, 28,
324                                          GroupLayout.PREFERRED_SIZE).addGap(18)
325                            .addComponent(jPasswordFieldTxt,
326                                          GroupLayout.PREFERRED_SIZE, 26,
327                                          GroupLayout.PREFERRED_SIZE)
328                            .addPreferredGap(
329                                LayoutStyle.ComponentPlacement.UNRELATED, 1,
330                                Short.MAX_VALUE)
331                            .addComponent(jTextFieldCryptedPassword,
332                                          GroupLayout.PREFERRED_SIZE, 28,
333                                          GroupLayout.PREFERRED_SIZE)
334                            .addContainerGap());
335         } else {
336           jPanel1Layout.setHorizontalGroup(
337               jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(
338                                jPanel1Layout.createParallelGroup().addGroup(
339                                                 jPanel1Layout.createSequentialGroup()
340                                                              .addComponent(jTextFieldPasswordFile,
341                                                                            GroupLayout.PREFERRED_SIZE,
342                                                                            340,
343                                                                            GroupLayout.PREFERRED_SIZE)
344                                                              .addGap(0, 0, Short.MAX_VALUE))
345                                             .addComponent(jPasswordField,
346                                                           GroupLayout.Alignment.LEADING, 0,
347                                                           341, Short.MAX_VALUE)
348                                             .addComponent(jTextFieldCryptedPassword,
349                                                           GroupLayout.Alignment.LEADING, 0,
350                                                           338, Short.MAX_VALUE))
351                            .addContainerGap());
352           jPanel1Layout.setVerticalGroup(
353               jPanel1Layout.createSequentialGroup().addContainerGap()
354                            .addComponent(jTextFieldPasswordFile,
355                                          GroupLayout.PREFERRED_SIZE, 28,
356                                          GroupLayout.PREFERRED_SIZE).addGap(18)
357                            .addComponent(jPasswordField,
358                                          GroupLayout.PREFERRED_SIZE, 26,
359                                          GroupLayout.PREFERRED_SIZE)
360                            .addPreferredGap(
361                                LayoutStyle.ComponentPlacement.UNRELATED, 1,
362                                Short.MAX_VALUE)
363                            .addComponent(jTextFieldCryptedPassword,
364                                          GroupLayout.PREFERRED_SIZE, 28,
365                                          GroupLayout.PREFERRED_SIZE)
366                            .addContainerGap());
367         }
368       }
369       thisLayout.setVerticalGroup(
370           thisLayout.createSequentialGroup().addContainerGap()
371                     .addComponent(jTextFieldKeyFile, GroupLayout.PREFERRED_SIZE,
372                                   28, GroupLayout.PREFERRED_SIZE).addGap(21)
373                     .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, 143,
374                                   GroupLayout.PREFERRED_SIZE)
375                     .addContainerGap(31, Short.MAX_VALUE));
376       thisLayout.setHorizontalGroup(
377           thisLayout.createSequentialGroup().addContainerGap().addGroup(
378               thisLayout.createParallelGroup()
379                         .addComponent(jPanel1, GroupLayout.Alignment.LEADING, 0,
380                                       366, Short.MAX_VALUE)
381                         .addGroup(GroupLayout.Alignment.LEADING,
382                                   thisLayout.createSequentialGroup().addGap(7)
383                                             .addComponent(jTextFieldKeyFile, 0,
384                                                           353, Short.MAX_VALUE)
385                                             .addGap(6))).addGap(6));
386       setSize(400, 300);
387       {
388         jMenuBar1 = new JMenuBar();
389         setJMenuBar(jMenuBar1);
390         {
391           jMenu3 = new JMenu();
392           jMenuBar1.add(jMenu3);
393           jMenu3.setText("File");
394           {
395             openFileMenuItem = new JMenuItem();
396             jMenu3.add(openFileMenuItem);
397             openFileMenuItem.setText("Open Key");
398             openFileMenuItem.setAction(getOpenKeyAction());
399           }
400           {
401             newFileMenuItem = new JMenuItem();
402             jMenu3.add(newFileMenuItem);
403             newFileMenuItem.setText("New Key");
404             newFileMenuItem.setAction(getNewKeyAction());
405           }
406           {
407             saveMenuItem = new JMenuItem();
408             jMenu3.add(saveMenuItem);
409             saveMenuItem.setText("Save Key");
410             saveMenuItem.setAction(getSaveKeyAction());
411             saveMenuItem.setEnabled(false);
412           }
413           {
414             saveAsMenuItem = new JMenuItem();
415             jMenu3.add(saveAsMenuItem);
416             saveAsMenuItem.setText("Save Key As ...");
417             saveAsMenuItem.setAction(getSaveAsKeyAction());
418             saveAsMenuItem.setEnabled(false);
419           }
420           {
421             jSeparator2 = new JSeparator();
422             jMenu3.add(jSeparator2);
423           }
424           {
425             exitMenuItem = new JMenuItem();
426             jMenu3.add(exitMenuItem);
427             exitMenuItem.setText("Exit");
428             exitMenuItem.setAction(getExitAction());
429           }
430         }
431         {
432           jMenuPassword = new JMenu();
433           jMenuBar1.add(jMenuPassword);
434           jMenuPassword.setText("Password");
435           jMenuPassword.setEnabled(false);
436           {
437             loadPasswordMenuItem = new JMenuItem();
438             jMenuPassword.add(loadPasswordMenuItem);
439             loadPasswordMenuItem.setText("Load");
440             loadPasswordMenuItem.setAction(getLoadPswdAction());
441           }
442           {
443             savePasswordMenuItem = new JMenuItem();
444             jMenuPassword.add(savePasswordMenuItem);
445             savePasswordMenuItem.setText("Save");
446             savePasswordMenuItem.setAction(getSavePaswdAction());
447           }
448         }
449         {
450           jMenu5 = new JMenu();
451           jMenuBar1.add(jMenu5);
452           jMenu5.setText("Help");
453           {
454             helpMenuItem = new JMenuItem();
455             jMenu5.add(helpMenuItem);
456             helpMenuItem.setText("Help");
457             helpMenuItem.setAction(getHelpAction());
458           }
459         }
460       }
461     } catch (final Exception e) {
462       SysErrLogger.FAKE_LOGGER.syserr(e);
463     }
464   }
465 
466   private AbstractAction getExitAction() {
467     if (exitAction == null) {
468       exitAction = new AbstractAction("Exit", null) {
469         /**
470          *
471          */
472         private static final long serialVersionUID = 7484447837851868127L;
473 
474         @Override
475         public void actionPerformed(final ActionEvent evt) {
476           myself.exit(evt);
477         }
478       };
479     }
480     return exitAction;
481   }
482 
483   private String getUncryptedPassword() {
484     if (WaarpPassword.clearPasswordView) {
485       return jPasswordFieldTxt.getText();
486     } else {
487       return new String(jPasswordField.getPassword());
488     }
489   }
490 
491   private void setUncryptedPassword(final String passwd) {
492     if (WaarpPassword.clearPasswordView) {
493       jPasswordFieldTxt.setText(passwd);
494     } else {
495       jPasswordField.setText(passwd);
496     }
497   }
498 
499   private void updateCryptedPassword() {
500     try {
501       waarpPassword.setClearPassword(getUncryptedPassword());
502     } catch (final Exception e) {
503       SysErrLogger.FAKE_LOGGER.syserr(e);
504     }
505     jTextFieldCryptedPassword.setText(waarpPassword.getCryptedPassword());
506     passwordModified = true;
507   }
508 
509   private void enableMenuWithKey() {
510     saveAsMenuItem.setEnabled(true);
511     saveMenuItem.setEnabled(true);
512     jMenuPassword.setEnabled(true);
513   }
514 
515   private AbstractAction getOpenKeyAction() {
516     if (openKeyAction == null) {
517       openKeyAction = new AbstractAction("Open Key", null) {
518         /**
519          *
520          */
521         private static final long serialVersionUID = -3840578648343599999L;
522 
523         @Override
524         public void actionPerformed(final ActionEvent evt) {
525           jTextFieldPasswordFile.setText("");
526           jTextFieldCryptedPassword.setText("");
527           chooserKeyFile.setDialogType(JFileChooser.OPEN_DIALOG);
528           final int response = chooserKeyFile.showOpenDialog(rootPane);
529           if (response == JFileChooser.APPROVE_OPTION) {
530             final File file = chooserKeyFile.getSelectedFile();
531             jTextFieldKeyFile.setText(file.getAbsolutePath());
532             try {
533               waarpPassword.loadKey(file);
534               updateCryptedPassword();
535               enableMenuWithKey();
536             } catch (final CryptoException e) {
537               SysErrLogger.FAKE_LOGGER.syserr(e);
538             }
539           }
540         }
541       };
542     }
543     return openKeyAction;
544   }
545 
546   private AbstractAction getNewKeyAction() {
547     if (newKeyAction == null) {
548       newKeyAction = new AbstractAction("New Key", null) {
549         /**
550          *
551          */
552         private static final long serialVersionUID = 10107370851157816L;
553 
554         @Override
555         public void actionPerformed(final ActionEvent evt) {
556           try {
557             waarpPassword.createNewKey();
558           } catch (final Exception e) {
559             SysErrLogger.FAKE_LOGGER.syserr(e);
560           }
561           updateCryptedPassword();
562           enableMenuWithKey();
563         }
564       };
565     }
566     return newKeyAction;
567   }
568 
569   private AbstractAction getSaveKeyAction() {
570     if (saveKeyAction == null) {
571       saveKeyAction = new AbstractAction("Save Key", null) {
572         /**
573          *
574          */
575         private static final long serialVersionUID = 4400661431842092244L;
576 
577         @Override
578         public void actionPerformed(final ActionEvent evt) {
579           try {
580             waarpPassword.saveKey(null);
581           } catch (final CryptoException e) {
582             SysErrLogger.FAKE_LOGGER.syserr(e);
583           }
584           passwordModified = false;
585         }
586       };
587     }
588     return saveKeyAction;
589   }
590 
591   private AbstractAction getSaveAsKeyAction() {
592     if (saveAsKeyAction == null) {
593       saveAsKeyAction = new AbstractAction("Save Key As...", null) {
594         /**
595          *
596          */
597         private static final long serialVersionUID = 565842888109816432L;
598 
599         @Override
600         public void actionPerformed(final ActionEvent evt) {
601           chooserKeyFile.setDialogType(JFileChooser.SAVE_DIALOG);
602           final int response = chooserKeyFile.showSaveDialog(rootPane);
603           if (response == JFileChooser.APPROVE_OPTION) {
604             File file = chooserKeyFile.getSelectedFile();
605             if (!filterKey.accept(file)) {
606               if (WaarpPassword.desModel) {
607                 file = new File(file.getAbsoluteFile() + "." + Des.EXTENSION);
608               } else {
609                 file =
610                     new File(file.getAbsoluteFile() + "." + Blowfish.EXTENSION);
611               }
612             }
613             jTextFieldKeyFile.setText(file.getAbsolutePath());
614             try {
615               waarpPassword.saveKey(file);
616             } catch (final CryptoException e) {
617               SysErrLogger.FAKE_LOGGER.syserr(e);
618             }
619             passwordModified = false;
620           }
621         }
622       };
623     }
624     return saveAsKeyAction;
625   }
626 
627   private AbstractAction getLoadPswdAction() {
628     if (loadPswdAction == null) {
629       loadPswdAction = new AbstractAction("Load", null) {
630         /**
631          *
632          */
633         private static final long serialVersionUID = -3100726446117809610L;
634 
635         @Override
636         public void actionPerformed(final ActionEvent evt) {
637           chooserPwdFile.setDialogType(JFileChooser.OPEN_DIALOG);
638           final int response = chooserPwdFile.showOpenDialog(rootPane);
639           if (response == JFileChooser.APPROVE_OPTION) {
640             final File file = chooserPwdFile.getSelectedFile();
641             jTextFieldPasswordFile.setText(file.getAbsolutePath());
642             waarpPassword.setPasswordFile(file);
643             try {
644               waarpPassword.loadPasswordFile();
645             } catch (final CryptoException e) {
646               SysErrLogger.FAKE_LOGGER.syserr(e);
647             } catch (final Exception e) {
648               SysErrLogger.FAKE_LOGGER.syserr(e);
649             }
650             setUncryptedPassword(waarpPassword.getClearPassword());
651             jTextFieldCryptedPassword.setText(
652                 waarpPassword.getCryptedPassword());
653             passwordModified = false;
654           }
655         }
656       };
657     }
658     return loadPswdAction;
659   }
660 
661   private AbstractAction getSavePaswdAction() {
662     if (savePaswdAction == null) {
663       savePaswdAction = new AbstractAction("Save", null) {
664         /**
665          *
666          */
667         private static final long serialVersionUID = -5712120697650940845L;
668 
669         @Override
670         public void actionPerformed(final ActionEvent evt) {
671           chooserPwdFile.setDialogType(JFileChooser.SAVE_DIALOG);
672           final int response = chooserPwdFile.showSaveDialog(rootPane);
673           if (response == JFileChooser.APPROVE_OPTION) {
674             File file = chooserPwdFile.getSelectedFile();
675             if (!filterPwdKey.accept(file)) {
676               file = new File(
677                   file.getAbsoluteFile() + "." + WaarpPassword.GGPEXTENSION);
678             }
679             jTextFieldPasswordFile.setText(file.getAbsolutePath());
680             waarpPassword.setPasswordFile(file);
681             try {
682               waarpPassword.savePasswordFile();
683             } catch (final IOException e) {
684               SysErrLogger.FAKE_LOGGER.syserr(e);
685             }
686             passwordModified = false;
687           }
688         }
689       };
690     }
691     return savePaswdAction;
692   }
693 
694   private AbstractAction getHelpAction() {
695     if (helpAction == null) {
696       helpAction = new AbstractAction("Help", null) {
697         /**
698          *
699          */
700         private static final long serialVersionUID = -8528091873190483826L;
701 
702         @Override
703         public void actionPerformed(final ActionEvent evt) {
704           getJDialogHelp().setVisible(true);
705         }
706       };
707     }
708     return helpAction;
709   }
710 
711   private JDialog getJDialogHelp() {
712     if (jDialogHelp == null) {
713       jDialogHelp = new JDialog(this);
714       final GroupLayout jDialogHelpLayout =
715           new GroupLayout(jDialogHelp.getContentPane());
716       jDialogHelp.getContentPane().setLayout(jDialogHelpLayout);
717       jDialogHelp.getContentPane().setBackground(new Color(255, 255, 255));
718       jDialogHelp.setPreferredSize(new Dimension(670, 479));
719       jDialogHelp.setSize(670, 479);
720       jDialogHelpLayout.setHorizontalGroup(
721           jDialogHelpLayout.createSequentialGroup().addContainerGap(27, 27)
722                            .addGroup(jDialogHelpLayout.createParallelGroup()
723                                                       .addComponent(
724                                                           getJTextPaneHelp(),
725                                                           GroupLayout.Alignment.LEADING,
726                                                           0, 604,
727                                                           Short.MAX_VALUE)
728                                                       .addGroup(
729                                                           GroupLayout.Alignment.LEADING,
730                                                           jDialogHelpLayout.createSequentialGroup()
731                                                                            .addGap(
732                                                                                254)
733                                                                            .addComponent(
734                                                                                getJButtonHelp(),
735                                                                                GroupLayout.PREFERRED_SIZE,
736                                                                                111,
737                                                                                GroupLayout.PREFERRED_SIZE)
738                                                                            .addGap(
739                                                                                0,
740                                                                                239,
741                                                                                Short.MAX_VALUE)))
742                            .addContainerGap(23, 23));
743       jDialogHelpLayout.setVerticalGroup(
744           jDialogHelpLayout.createSequentialGroup().addContainerGap()
745                            .addComponent(getJTextPaneHelp(), 0, 395,
746                                          Short.MAX_VALUE)
747                            .addComponent(getJButtonHelp(),
748                                          GroupLayout.PREFERRED_SIZE,
749                                          GroupLayout.PREFERRED_SIZE,
750                                          GroupLayout.PREFERRED_SIZE)
751                            .addContainerGap());
752     }
753     return jDialogHelp;
754   }
755 
756   private JButton getJButtonHelp() {
757     if (jButtonHelp == null) {
758       jButtonHelp = new JButton();
759       jButtonHelp.setText("OK");
760       jButtonHelp.setAction(getCloseHelpAction());
761     }
762     return jButtonHelp;
763   }
764 
765   private JTextPane getJTextPaneHelp() {
766     if (jTextPaneHelp == null) {
767       jTextPaneHelp = new JTextPane();
768       jTextPaneHelp.setText("                                            " +
769                             "                            GoldenGate GUI Password Tool\r\n\r\n" +
770                             "A) Key for crypto support\r\n\r\n" +
771                             "* First you need to open a Key File (Open) or to create a " +
772                             "New Key File (New Key) and to save it (Save Key As...)\r\n" +
773                             "* You can at any moment save the Key File to a new " +
774                             "Key File (Save Key As...)\r\n\r\n" +
775                             "B) Password with Crypto Key\r\n" +
776                             "* Then you need to get a Password:\r\n" +
777                             "1) Enter a password in the Password field\r\n" +
778                             "2) Load a password from a Password file (compatible with " +
779                             "the current Key) (Load)\r\n" +
780                             "* Then you need to save this password (encrypted) to " +
781                             "a File (Save)\r\n\r\n" + "C) " +
782                             WaarpPassword.HELPOPTIONS);
783       jTextPaneHelp.setEditable(false);
784       jTextPaneHelp.setBackground(new Color(255, 255, 255));
785     }
786     return jTextPaneHelp;
787   }
788 
789   private AbstractAction getCloseHelpAction() {
790     if (closeHelpAction == null) {
791       closeHelpAction = new AbstractAction("Close", null) {
792         /**
793          *
794          */
795         private static final long serialVersionUID = -2310092372166868386L;
796 
797         @Override
798         public void actionPerformed(final ActionEvent evt) {
799           getJDialogHelp().dispose();
800         }
801       };
802     }
803     return closeHelpAction;
804   }
805 
806 }