package delegate;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import model.Application;
import model.DefaultKey3Location;
import model.PasswordCracker;
import org.apache.log4j.Logger;
public class MainFrame extends JFrame implements ProgressDisplay {
private static final long serialVersionUID = 1L;
private final static Logger logger = Logger
.getLogger(MainFrame.class);
private final static File DEFAULT_WORDLIST = new File("wordlist.txt");
private final static String TITLE_IMAGE = "/logohc.png";
private final JTextField key3Path = new JTextField(25);
private final JTextField wordlistPath = new JTextField(25);
private final JButton key3PathButton = new JButton("...");
private final JButton wordlistPathButton = new JButton("...");
private final JButton recoverButton = new JButton("recover password");
private final JButton cancel = new JButton("cancel");
private final JLabel output = new JLabel(
"If checkbox is set or no wordlist given, a bruteforce attack up to"
+ " wordlength " + PasswordCracker.MAX_WORDLENGTH
+ " will be tried.");
private final JCheckBox bruteforce = new JCheckBox("generate words");
private BufferedImage titleImg;
private JLabel titleLabel;
private CrackingTask task;
public MainFrame() {
super("MozillaRecovery 0.4.1");
initGUI();
initListener();
}
protected void enableButtons(boolean b) {
recoverButton.setEnabled(b);
key3PathButton.setEnabled(b);
wordlistPathButton.setEnabled(b);
cancel.setEnabled(!b);
}
private void recoverPasswords() {
if (wordlistValueSet() && keyPathValueSet() && !bruteforce.isSelected()) {
task = new WordlistWorker(this, key3Path.getText(),
wordlistPath.getText());
output.setText("Initializing wordlist attack. Parsing key3.db ...");
task.execute();
enableButtons(false);
} else if (keyPathValueSet()) {
task = new BruteforceWorker(this, key3Path.getText());
output.setText("Initializing bruteforce attack. Parsing key3.db ...");
task.execute();
enableButtons(false);
} else {
output.setText("Please enter a valid path for key3.db");
}
}
private boolean keyPathValueSet() {
return key3Path.getText() != null && !key3Path.getText().equals("");
}
private boolean wordlistValueSet() {
return wordlistPath.getText() != null
&& !wordlistPath.getText().equals("");
}
private String getFileNameFromUser() {
File userdir = new File(System.getProperty("user.dir"));
JFileChooser fc = new JFileChooser(userdir);
int state = fc.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
return file.getAbsolutePath();
}
return null;
}
private void initGUI() {
setSize(650, 300);
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setResizable(false);
enableButtons(true);
wordlistPath.setEditable(false);
key3Path.setEditable(false);
DefaultKey3Location loc = new DefaultKey3Location();
String path = loc.findLocation(Application.FIREFOX);
if (path == null) {
path = loc.findLocation(Application.THUNDERBIRD);
}
key3Path.setText(path == null ? "" : path);
if (DEFAULT_WORDLIST.exists()) {
wordlistPath.setText(DEFAULT_WORDLIST.getAbsolutePath());
}
try {
titleImg = ImageIO.read(getClass().getResource(TITLE_IMAGE));
titleLabel = new JLabel(new ImageIcon(titleImg));
this.add(titleLabel, BorderLayout.PAGE_START);
} catch (IOException e) {
e.printStackTrace();
logger.error(e.getMessage());
}
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(0, 0, 10, 5);
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
panel.add(new Label("key3.db:"), c);
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 1;
panel.add(key3Path, c);
c.gridx = 2;
c.gridy = 0;
c.gridwidth = 1;
panel.add(key3PathButton, c);
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
panel.add(new Label("wordlist:"), c);
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 1;
panel.add(wordlistPath, c);
c.gridx = 2;
c.gridy = 1;
c.gridwidth = 1;
panel.add(wordlistPathButton, c);
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 1;
panel.add(recoverButton, c);
c.gridx = 1;
c.gridy = 2;
c.gridwidth = 1;
panel.add(bruteforce, c);
c.gridx = 2;
c.gridy = 2;
c.gridwidth = 1;
panel.add(cancel, c);
c.gridx = 0;
c.gridy = 3;
c.gridwidth = 3;
panel.add(output, c);
this.add(panel, BorderLayout.CENTER);
}
private void initListener() {
wordlistPathButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String path = getFileNameFromUser();
if (path != null) {
wordlistPath.setText(path);
}
}
});
key3PathButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String path = getFileNameFromUser();
if (path != null) {
key3Path.setText(path);
}
}
});
recoverButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
recoverPasswords();
}
});
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
task.stop();
enableButtons(true);
}
});
titleLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
AboutFrame frame = new AboutFrame();
frame.setLocationRelativeTo(MainFrame.this);
}
});
}
@Override
public void setNewProgress(long progress) {
output.setText("Passwords tried: " + progress);
}
@Override
public void setResult(String password) {
if (password == null) {
output.setText("Could not find password. Passwords tried: "
+ PasswordCracker.getWordsTried());
} else {
output.setText("Found password: " + password + " Passwords tried: "
+ PasswordCracker.getWordsTried());
}
enableButtons(true);
}
}