/*
* File : AuthenticatorWindow.java
* Created : 25-Nov-2003
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.ui.swt.auth;
/**
* @author parg
*
*/
import java.util.Arrays;
import org.eclipse.swt.*;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.components.shell.ShellFactory;
import org.gudy.azureus2.ui.swt.mainwindow.Colors;
import org.gudy.azureus2.ui.swt.mainwindow.SWTThread;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import com.aelitis.azureus.core.security.CryptoManagerFactory;
import com.aelitis.azureus.core.security.CryptoManagerPasswordHandler;
public class
CryptoWindow
implements CryptoManagerPasswordHandler
{
private static final int DAY = 60*60*24;
public
CryptoWindow()
{
CryptoManagerFactory.getSingleton().addPasswordHandler( this );
}
public int
getHandlerType()
{
return( HANDLER_TYPE_USER );
}
public passwordDetails
getPassword(
final int handler_type,
final int action_type,
final boolean last_pw_incorrect,
final String reason )
{
final Display display = SWTThread.getInstance().getDisplay();
if ( display.isDisposed()){
return( null );
}
final cryptoDialog[] dialog = new cryptoDialog[1];
final AESemaphore sem = new AESemaphore("CryptoWindowSem");
try{
if ( display.getThread() == Thread.currentThread()){
dialog[0] = new cryptoDialog( sem, display, handler_type, action_type, last_pw_incorrect, reason );
while ( !( display.isDisposed() || sem.isReleasedForever())){
if ( !display.readAndDispatch()){
display.sleep();
}
}
if ( display.isDisposed()){
return( null );
}
}else{
display.asyncExec(
new Runnable()
{
public void
run()
{
dialog[0] = new cryptoDialog( sem, display, handler_type, action_type, last_pw_incorrect, reason );
}
});
}
}catch( Throwable e ){
Debug.printStackTrace( e );
return( null );
}
sem.reserve();
final char[] pw = dialog[0].getPassword();
final int persist_for = dialog[0].getPersistForSeconds();
if ( pw == null ){
return( null );
}
return(
new passwordDetails()
{
public char[]
getPassword()
{
return( pw );
}
public int
getPersistForSeconds()
{
return( persist_for );
}
});
}
public void
passwordOK(
int handler_type,
passwordDetails details)
{
}
protected class
cryptoDialog
{
private AESemaphore sem;
private Shell shell;
private char[] password;
private char[] password2;
private int persist_for_secs;
private boolean verify_password;
protected
cryptoDialog(
AESemaphore _sem,
Display display,
int handler_type,
int action_type,
boolean last_pw_incorrect,
String reason )
{
sem = _sem;
if ( display.isDisposed()){
sem.releaseForever();
return;
}
shell = ShellFactory.createMainShell(SWT.DIALOG_TRIM
| SWT.APPLICATION_MODAL);
Utils.setShellIcon(shell);
Messages.setLanguageText(shell, "security.crypto.title");
GridLayout layout = new GridLayout();
layout.numColumns = 3;
shell.setLayout (layout);
GridData gridData;
if ( action_type == CryptoManagerPasswordHandler.ACTION_ENCRYPT ){
Label reason_label = new Label(shell,SWT.WRAP);
Messages.setLanguageText(reason_label, "security.crypto.encrypt");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
gridData.widthHint = 300;
reason_label.setLayoutData(gridData);
}else{
Label decrypt_label = new Label(shell,SWT.WRAP);
Messages.setLanguageText(decrypt_label, "security.crypto.decrypt");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
gridData.widthHint = 300;
decrypt_label.setLayoutData(gridData);
// reason
Label reason_label = new Label(shell,SWT.NULL);
Messages.setLanguageText(reason_label, "security.crypto.reason");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
reason_label.setLayoutData(gridData);
Label reason_value = new Label(shell,SWT.NULL);
reason_value.setText(reason.replaceAll("&", "&&"));
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 2;
reason_value.setLayoutData(gridData);
// new Label(shell,SWT.NULL);
if ( last_pw_incorrect ){
Label pw_wrong_label = new Label(shell,SWT.WRAP);
Messages.setLanguageText(pw_wrong_label, "security.crypto.badpw");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
pw_wrong_label.setLayoutData(gridData);
pw_wrong_label.setForeground( Colors.red );
}
}
// password
Label password_label = new Label(shell,SWT.NULL);
Messages.setLanguageText(password_label, "security.crypto.password");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
password_label.setLayoutData(gridData);
final Text password_value = new Text(shell,SWT.BORDER);
password_value.setEchoChar('*');
password_value.setText("");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
password_value.setLayoutData(gridData);
password_value.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
password = password_value.getText().toCharArray();
}});
new Label(shell,SWT.NULL);
if ( action_type == CryptoManagerPasswordHandler.ACTION_ENCRYPT ){
// password
verify_password = true;
Label password2_label = new Label(shell,SWT.NULL);
Messages.setLanguageText(password2_label, "security.crypto.password2");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
password2_label.setLayoutData(gridData);
final Text password2_value = new Text(shell,SWT.BORDER);
password2_value.setEchoChar('*');
password2_value.setText("");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
password2_value.setLayoutData(gridData);
password2_value.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
password2 = password2_value.getText().toCharArray();
}});
new Label(shell,SWT.NULL);
}
// persist
Label strength_label = new Label(shell,SWT.NULL);
Messages.setLanguageText(strength_label, "security.crypto.persist_for");
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
strength_label.setLayoutData(gridData);
String[] duration_keys = { "dont_save", "session", "day", "week", "30days", "forever" };
final int[] duration_secs = { 0, -1, DAY, DAY*7, DAY*30, Integer.MAX_VALUE };
final Combo durations_combo = new Combo(shell, SWT.SINGLE | SWT.READ_ONLY);
for (int i=0;i<duration_keys.length;i++){
String text = MessageText.getString( "security.crypto.persist_for." + duration_keys[i] );
durations_combo.add( text );
}
durations_combo.select(4);
persist_for_secs = duration_secs[4];
durations_combo.addListener(
SWT.Selection,
new Listener()
{
public void
handleEvent(
Event e )
{
persist_for_secs = duration_secs[ durations_combo.getSelectionIndex()];
}
});
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 1;
durations_combo.setLayoutData(gridData);
new Label(shell,SWT.NULL);
// wiki
final Label linkLabel = new Label(shell, SWT.NULL);
linkLabel.setText(MessageText.getString("ConfigView.label.please.visit.here"));
linkLabel.setData("http://wiki.vuze.com/w/Public_Private_Keys");
linkLabel.setCursor(display.getSystemCursor(SWT.CURSOR_HAND));
linkLabel.setForeground(Colors.blue);
gridData = new GridData();
gridData.horizontalSpan = 3;
linkLabel.setLayoutData(gridData);
linkLabel.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
Utils.launch((String) ((Label) arg0.widget).getData());
}
public void mouseDown(MouseEvent arg0) {
Utils.launch((String) ((Label) arg0.widget).getData());
}
});
// line
Label labelSeparator = new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
labelSeparator.setLayoutData(gridData);
// buttons
new Label(shell,SWT.NULL);
Button bOk = new Button(shell,SWT.PUSH);
Messages.setLanguageText(bOk, "Button.ok");
gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_END | GridData.HORIZONTAL_ALIGN_FILL);
gridData.grabExcessHorizontalSpace = true;
gridData.widthHint = 70;
bOk.setLayoutData(gridData);
bOk.addListener(SWT.Selection,new Listener() {
public void handleEvent(Event e) {
close(true);
}
});
Button bCancel = new Button(shell,SWT.PUSH);
Messages.setLanguageText(bCancel, "Button.cancel");
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
gridData.grabExcessHorizontalSpace = false;
gridData.widthHint = 70;
bCancel.setLayoutData(gridData);
bCancel.addListener(SWT.Selection,new Listener() {
public void handleEvent(Event e) {
close(false);
}
});
shell.setDefaultButton( bOk );
shell.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event e) {
if ( e.character == SWT.ESC){
close( false );
}
}
});
shell.pack ();
Utils.centreWindow( shell );
shell.open();
}
protected void
close(
boolean ok )
{
try{
if ( ok ){
if ( password == null ){
password = new char[0];
}
if ( password2 == null ){
password2 = new char[0];
}
if ( verify_password ){
if ( !Arrays.equals( password, password2 )){
MessageBox mb = new MessageBox( shell,SWT.ICON_ERROR | SWT.OK );
mb.setText(MessageText.getString("security.crypto.password.mismatch.title"));
mb.setMessage( MessageText.getString("security.crypto.password.mismatch"));
mb.open();
return;
}
}
}else{
password = null;
}
shell.dispose();
}finally{
sem.releaseForever();
}
}
protected char[]
getPassword()
{
return( password );
}
protected int
getPersistForSeconds()
{
return( persist_for_secs );
}
}
}