/** * Copyright (C) 2008 Progress Software, Inc. All rights reserved. * http://fusesource.com * * The software in this package is published under the terms of the AGPL license * a copy of which has been included with this distribution in the license.txt file. */ package org.fusesource.cloudmix.agent.security; import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; /** * Password provider that pops up a Swing dialog. */ public class DialogPasswordProvider implements PasswordProvider { private static final String DEFAULT_TITLE = "Depot Authentication Required"; private static final long DEFAULT_TIMEOUT = Long.MAX_VALUE; JPasswordField password; boolean visible = true; private boolean status = true; private JFrame frame; private String title = DEFAULT_TITLE; private String username; private boolean finished; private long timeout = DEFAULT_TIMEOUT; public DialogPasswordProvider() { } public void setTitle(String t) { title = t; } public void setUsername(String u) { username = u; } public void setTimeout(long secs) { timeout = secs; } public char[] getPassword() { if (waitForCompletion()) { return password.getPassword(); } return null; } private void init() { frame = new JFrame(title); JLabel prompt = new JLabel(getPrompt()); password = new JPasswordField(20); password.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finished(true); } }); JButton ok = new JButton("OK"); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finished(true); } }); JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { finished(false); } }); Container pane = frame.getContentPane(); GridLayout layout = new GridLayout(3, 1); pane.setLayout(layout); pane.add(prompt); JPanel passwordPanel = new JPanel(); passwordPanel.add(password); pane.add(passwordPanel); JPanel panel = new JPanel(); panel.add(ok); panel.add(cancel); pane.add(panel); Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension size = toolkit.getScreenSize(); frame.setLocation((int)(size.getWidth() - frame.getWidth()) / 2, (int)(size.getHeight() - frame .getHeight()) / 2); frame.pack(); frame.setVisible(visible); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { finished(false); } }); } private String getPrompt() { if (username != null) { return "Enter password for Depot user '" + username + "'"; } return "Enter password for Depot"; } private synchronized boolean waitForCompletion() { try { finished = false; init(); for (int i = 0; !finished && i < timeout; i++) { wait(1000); } if (!finished) { finished(false); } } catch (InterruptedException e) { return false; } return status; } synchronized void finished(boolean s) { status = s; frame.dispose(); finished = true; notify(); } }